Try to avoid loading a corrupted configuration file. Also log errors encountered while saving/loading the configuration. Closes #3503.

This commit is contained in:
sledgehammer999 2015-09-14 02:23:13 +03:00
parent 80de35c5ee
commit 6b4aad8a83

View file

@ -32,6 +32,7 @@
#include "preferences.h" #include "preferences.h"
#include "qinisettings.h" #include "qinisettings.h"
#include "logger.h"
#include <QCryptographicHash> #include <QCryptographicHash>
#include <QPair> #include <QPair>
@ -67,12 +68,12 @@ Preferences::Preferences()
QStringList keys = settings_new->allKeys(); QStringList keys = settings_new->allKeys();
bool use_new = false; bool use_new = false;
// This means that the PC closed either due to power outage // This means that the PC closed either due to power outage
// or because the disk was full. In any case the settings weren't transfered // or because the disk was full. In any case the settings weren't transfered
// in their final position. So assume that qbittorrent_new.ini/qbittorrent_new.conf // in their final position. So assume that qbittorrent_new.ini/qbittorrent_new.conf
// contains the most recent settings. // contains the most recent settings.
if (!keys.isEmpty()) { if (!keys.isEmpty()) {
Logger::instance()->addMessage(tr("Detected unclean program exit. Using fallback file to restore settings."), Log::WARNING);
use_new = true; use_new = true;
dirty = true; dirty = true;
} }
@ -100,7 +101,9 @@ Preferences::Preferences()
//Ensures sync to disk before we attempt to manipulate the files from save(). //Ensures sync to disk before we attempt to manipulate the files from save().
delete settings; delete settings;
#ifndef Q_OS_MAC #ifndef Q_OS_MAC
QString new_path = settings_new->fileName();
delete settings_new; delete settings_new;
fsutils::forceRemove(new_path);
if (use_new) if (use_new)
save(); save();
@ -134,7 +137,7 @@ void Preferences::drop()
void Preferences::save() void Preferences::save()
{ {
QReadLocker locker(&lock); QWriteLocker locker(&lock);
if (!dirty) if (!dirty)
return; return;
@ -158,11 +161,19 @@ void Preferences::save()
#ifndef Q_OS_MAC #ifndef Q_OS_MAC
settings->sync(); // Important to get error status settings->sync(); // Important to get error status
if (settings->status() == QSettings::AccessError) { QString new_path = settings->fileName();
QSettings::Status status = settings->status();
if (status != QSettings::NoError) {
if (status == QSettings::AccessError)
Logger::instance()->addMessage(tr("An access error occurred while trying to write the configuration file."), Log::CRITICAL);
else
Logger::instance()->addMessage(tr("A format error occurred while trying to write the configuration file."), Log::CRITICAL);
delete settings; delete settings;
fsutils::forceRemove(new_path);
return; return;
} }
QString new_path = settings->fileName();
delete settings; delete settings;
QString final_path = new_path; QString final_path = new_path;
int index = final_path.lastIndexOf("_new", -1, Qt::CaseInsensitive); int index = final_path.lastIndexOf("_new", -1, Qt::CaseInsensitive);