summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTannin <devnull@localhost>2015-04-08 18:52:43 +0200
committerTannin <devnull@localhost>2015-04-08 18:52:43 +0200
commit8cca47454a5205752b8d633d064a775862d509bd (patch)
treecd2bd84b0aace63c9598e8a7fed11421a8c768fb /src
parenta818688d3f29c87c5d67b3123e3a95d3f21aed40 (diff)
if overwriting the ModOrganizer.ini file fails, another attempt to store
settings is made, writing to the ini file directly.
Diffstat (limited to 'src')
-rw-r--r--src/organizercore.cpp104
-rw-r--r--src/organizercore.h4
2 files changed, 65 insertions, 43 deletions
diff --git a/src/organizercore.cpp b/src/organizercore.cpp
index 5a92bbd7..0d58d9f8 100644
--- a/src/organizercore.cpp
+++ b/src/organizercore.cpp
@@ -177,58 +177,76 @@ OrganizerCore::~OrganizerCore()
delete m_DirectoryStructure;
}
-void OrganizerCore::storeSettings()
+QString OrganizerCore::commitSettings(const QString &iniFile)
{
- QString iniFile = qApp->property("dataPath").toString() + "/" + QString::fromStdWString(AppConfig::iniFileName());
- shellCopy(iniFile, iniFile + ".new", true, qApp->activeWindow());
-
- QSettings::Status result = QSettings::NoError;
- {
- QSettings settings(iniFile + ".new", QSettings::IniFormat);
- if (m_UserInterface != nullptr) {
- m_UserInterface->storeSettings(settings);
+ if (!shellRename(iniFile + ".new", iniFile, true, qApp->activeWindow())) {
+ DWORD err = ::GetLastError();
+ // make a second attempt using qt functions but if that fails print the error from the first attempt
+ if (!renameFile(iniFile + ".new", iniFile)) {
+ return windowsErrorString(err);
}
- if (m_CurrentProfile != nullptr) {
- settings.setValue("selected_profile", m_CurrentProfile->name().toUtf8().constData());
- }
- settings.setValue("ask_for_nexuspw", m_AskForNexusPW);
+ }
+ return QString();
+}
- settings.remove("customExecutables");
- settings.beginWriteArray("customExecutables");
- std::vector<Executable>::const_iterator current, end;
- m_ExecutablesList.getExecutables(current, end);
- int count = 0;
- for (; current != end; ++current) {
- const Executable &item = *current;
- settings.setArrayIndex(count++);
- settings.setValue("title", item.m_Title);
- settings.setValue("custom", item.m_Custom);
- settings.setValue("toolbar", item.m_Toolbar);
- if (item.m_Custom) {
- settings.setValue("binary", item.m_BinaryInfo.absoluteFilePath());
- settings.setValue("arguments", item.m_Arguments);
- settings.setValue("workingDirectory", item.m_WorkingDirectory);
- settings.setValue("closeOnStart", item.m_CloseMO == ExecutableInfo::CloseMOStyle::DEFAULT_CLOSE);
- settings.setValue("steamAppID", item.m_SteamAppID);
- }
+QSettings::Status OrganizerCore::storeSettings(const QString &fileName)
+{
+ QSettings settings(fileName, QSettings::IniFormat);
+ if (m_UserInterface != nullptr) {
+ m_UserInterface->storeSettings(settings);
+ }
+ if (m_CurrentProfile != nullptr) {
+ settings.setValue("selected_profile", m_CurrentProfile->name().toUtf8().constData());
+ }
+ settings.setValue("ask_for_nexuspw", m_AskForNexusPW);
+
+ settings.remove("customExecutables");
+ settings.beginWriteArray("customExecutables");
+ std::vector<Executable>::const_iterator current, end;
+ m_ExecutablesList.getExecutables(current, end);
+ int count = 0;
+ for (; current != end; ++current) {
+ const Executable &item = *current;
+ settings.setArrayIndex(count++);
+ settings.setValue("title", item.m_Title);
+ settings.setValue("custom", item.m_Custom);
+ settings.setValue("toolbar", item.m_Toolbar);
+ if (item.m_Custom) {
+ settings.setValue("binary", item.m_BinaryInfo.absoluteFilePath());
+ settings.setValue("arguments", item.m_Arguments);
+ settings.setValue("workingDirectory", item.m_WorkingDirectory);
+ settings.setValue("closeOnStart", item.m_CloseMO == ExecutableInfo::CloseMOStyle::DEFAULT_CLOSE);
+ settings.setValue("steamAppID", item.m_SteamAppID);
}
- settings.endArray();
+ }
+ settings.endArray();
+
+ FileDialogMemory::save(settings);
- FileDialogMemory::save(settings);
+ settings.sync();
+ return settings.status();
+}
- settings.sync();
- result = settings.status();
+void OrganizerCore::storeSettings()
+{
+ QString iniFile = qApp->property("dataPath").toString() + "/" + QString::fromStdWString(AppConfig::iniFileName());
+ if (!shellCopy(iniFile, iniFile + ".new", true, qApp->activeWindow())) {
+ QMessageBox::critical(qApp->activeWindow(), tr("Failed to write settings"),
+ tr("An error occured trying to update MO settings to %1: %2").arg(
+ iniFile, windowsErrorString(::GetLastError())));
+ return;
}
+
+ QSettings::Status result = storeSettings(iniFile + ".new");
+
if (result == QSettings::NoError) {
- if (!shellRename(iniFile + ".new", iniFile, true, qApp->activeWindow())) {
- DWORD err = ::GetLastError();
- // make a second attempt using qt functions but if that fails print the error from the first attempt
- if (!renameFile(iniFile + ".new", iniFile)) {
- QMessageBox::critical(qApp->activeWindow(), tr("Failed to write settings"),
- tr("An error occured trying to write back MO settings to %1: %2").arg(iniFile + ".new", windowsErrorString(err)));
- }
+ QString errMsg = commitSettings(iniFile);
+ if (!errMsg.isEmpty()) {
+ qWarning("settings file not writable, may be locked by another application, trying direct write");
+ result = storeSettings(iniFile);
}
- } else {
+ }
+ if (result != QSettings::NoError) {
QString reason = result == QSettings::AccessError ? tr("File is write protected")
: result == QSettings::FormatError ? tr("Invalid file format (probably a bug)")
: tr("Unknown error %1").arg(result);
diff --git a/src/organizercore.h b/src/organizercore.h
index 503bf3b9..ae3b3579 100644
--- a/src/organizercore.h
+++ b/src/organizercore.h
@@ -198,6 +198,10 @@ private:
void storeSettings();
+ QSettings::Status storeSettings(const QString &fileName);
+
+ QString commitSettings(const QString &iniFile);
+
bool queryLogin(QString &username, QString &password);
void updateModActiveState(int index, bool active);