diff options
Diffstat (limited to 'src/profile.cpp')
| -rw-r--r-- | src/profile.cpp | 84 |
1 files changed, 49 insertions, 35 deletions
diff --git a/src/profile.cpp b/src/profile.cpp index a6d8f49d..42358b7d 100644 --- a/src/profile.cpp +++ b/src/profile.cpp @@ -23,6 +23,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. #include "windows_error.h" #include "dummybsa.h" #include "modinfo.h" +#include "safewritefile.h" #include <utility.h> #include <util.h> #include <error_report.h> @@ -30,6 +31,8 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>. #include <QMessageBox> #include <QApplication> #include <QSettings> +#include <QTemporaryFile> + #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <shlobj.h> @@ -90,7 +93,7 @@ Profile::Profile(const QDir& directory) GameInfo::instance().repairProfile(ToWString(m_Directory.absolutePath())); if (!QFile::exists(getIniFileName())) { - reportError(QObject::tr("\"%1\" is missing").arg(getIniFileName())); + reportError(QObject::tr("\"%1\" is missing or inaccessible").arg(getIniFileName())); } refreshModStatus(); } @@ -146,38 +149,39 @@ void Profile::writeModlistNow(bool onlyOnTimer) const if (!m_Directory.exists()) return; #pragma message("right now, this is doing unnecessary saves. Need a flag that says that mod priority, enabled-state or name of a mod has changed") - QString fileName = getModlistFileName(); - QFile file(fileName); - if (!file.open(QIODevice::WriteOnly)) { - reportError(tr("failed to open \"%1\" for writing").arg(fileName)); - return; - } + try { + QString fileName = getModlistFileName(); + SafeWriteFile file(fileName); - file.resize(0); - file.write(QString("# This file was automatically generated by Mod Organizer.\r\n").toUtf8()); - if (m_ModStatus.empty()) { - return; - } + file->write(QString("# This file was automatically generated by Mod Organizer.\r\n").toUtf8()); + if (m_ModStatus.empty()) { + return; + } - for (int i = m_ModStatus.size() - 1; i >= 0; --i) { - // the priority order was inverted on load so it has to be inverted again - unsigned int index = m_ModIndexByPriority[i]; - if (index != UINT_MAX) { - ModInfo::Ptr modInfo = ModInfo::getByIndex(index); - if (modInfo->getFixedPriority() == INT_MIN) { - if (m_ModStatus[index].m_Enabled) { - file.write("+"); - } else { - file.write("-"); + for (int i = m_ModStatus.size() - 1; i >= 0; --i) { + // the priority order was inverted on load so it has to be inverted again + unsigned int index = m_ModIndexByPriority[i]; + if (index != UINT_MAX) { + ModInfo::Ptr modInfo = ModInfo::getByIndex(index); + if (modInfo->getFixedPriority() == INT_MIN) { + if (m_ModStatus[index].m_Enabled) { + file->write("+"); + } else { + file->write("-"); + } + file->write(modInfo->name().toUtf8()); + file->write("\r\n"); } - file.write(modInfo->name().toUtf8()); - file.write("\r\n"); } } - } - file.close(); - qDebug("%s saved", QDir::toNativeSeparators(fileName).toUtf8().constData()); + file.commit(); + + qDebug("%s saved", QDir::toNativeSeparators(fileName).toUtf8().constData()); + } catch (const std::exception &e) { + reportError(tr("failed to write mod list: %1").arg(e.what())); + return; + } } @@ -185,7 +189,7 @@ void Profile::createTweakedIniFile() { QString tweakedIni = m_Directory.absoluteFilePath("initweaks.ini"); - if (QFile::exists(tweakedIni) && !shellDelete(QStringList(tweakedIni))) { + if (QFile::exists(tweakedIni) && !shellDeleteQuiet(tweakedIni)) { reportError(tr("failed to update tweaked ini file, wrong settings may be used: %1").arg(windowsErrorString(::GetLastError()))); return; } @@ -197,6 +201,7 @@ void Profile::createTweakedIniFile() } } + mergeTweak(getProfileTweaks(), tweakedIni); bool error = false; if (!::WritePrivateProfileStringW(L"Archive", L"bInvalidateOlderFiles", L"1", ToWString(tweakedIni).c_str())) { @@ -218,6 +223,7 @@ void Profile::createTweakedIniFile() if (error) { reportError(tr("failed to create tweaked ini: %1").arg(getCurrentErrorStringA().c_str())); } + qDebug("%s saved", qPrintable(QDir::toNativeSeparators(tweakedIni))); } @@ -225,7 +231,7 @@ void Profile::refreshModStatus() { QFile file(getModlistFileName()); if (!file.exists()) { - throw MyException(QObject::tr("failed to find \"%1\"").arg(getModlistFileName())); + throw MyException(tr("\"%1\" is missing or inaccessible").arg(getModlistFileName())); } bool modStatusModified = false; @@ -331,6 +337,7 @@ void Profile::updateIndices() for (unsigned int i = 0; i < m_ModStatus.size(); ++i) { int priority = m_ModStatus[i].m_Priority; if (priority < 0) { + // don't assign this to mapping at all, it's probably the overwrite mod continue; } else if (priority >= static_cast<int>(m_ModIndexByPriority.size())) { qCritical("invalid priority %d for mod", priority); @@ -418,7 +425,7 @@ int Profile::getModPriority(unsigned int index) const void Profile::setModPriority(unsigned int index, int &newPriority) { - if (m_ModStatus[index].m_Overwrite) { + if (m_ModStatus.at(index).m_Overwrite) { // can't change priority of the overwrite return; } @@ -426,24 +433,25 @@ void Profile::setModPriority(unsigned int index, int &newPriority) int newPriorityTemp = (std::max)(0, (std::min<int>)(m_ModStatus.size() - 1, newPriority)); // don't try to place below overwrite - while (m_ModStatus[m_ModIndexByPriority[newPriorityTemp]].m_Overwrite) { + while ((m_ModIndexByPriority.at(newPriorityTemp) >= m_ModStatus.size()) || + m_ModStatus.at(m_ModIndexByPriority.at(newPriorityTemp)).m_Overwrite) { --newPriorityTemp; } - int oldPriority = m_ModStatus[index].m_Priority; + int oldPriority = m_ModStatus.at(index).m_Priority; if (newPriorityTemp > oldPriority) { // priority is higher than the old, so the gap we left is in lower priorities for (int i = oldPriority + 1; i <= newPriorityTemp; ++i) { - --m_ModStatus[m_ModIndexByPriority[i]].m_Priority; + --m_ModStatus.at(m_ModIndexByPriority.at(i)).m_Priority; } } else { for (int i = newPriorityTemp; i < oldPriority; ++i) { - ++m_ModStatus[m_ModIndexByPriority[i]].m_Priority; + ++m_ModStatus.at(m_ModIndexByPriority.at(i)).m_Priority; } ++newPriority; } - m_ModStatus[index].m_Priority = newPriorityTemp; + m_ModStatus.at(index).m_Priority = newPriorityTemp; updateIndices(); writeModlist(); @@ -733,6 +741,12 @@ QString Profile::getIniFileName() const return m_Directory.absoluteFilePath(ToQString(primaryIniFile)); } +QString Profile::getProfileTweaks() const +{ + return QDir::cleanPath(m_Directory.absoluteFilePath(ToQString(AppConfig::profileTweakIni()))); +} + + QString Profile::getPath() const { return QDir::cleanPath(m_Directory.absolutePath()); |
