summaryrefslogtreecommitdiff
path: root/src/profile.cpp
diff options
context:
space:
mode:
authorTannin <devnull@localhost>2014-04-05 15:36:42 +0200
committerTannin <devnull@localhost>2014-04-05 15:36:42 +0200
commitcabed9b268c9f095d5e3b98a6797b0bcdcd38b1f (patch)
tree454b03b0c5664e90fe586e7b39603e34a526d35b /src/profile.cpp
parent98e5e57a845541acddf519a81957261f58008cb9 (diff)
parentc017f4a0d50b67a44e276bd5ae8929ed3990c62c (diff)
Merge with branch1.1
Diffstat (limited to 'src/profile.cpp')
-rw-r--r--src/profile.cpp84
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());