summaryrefslogtreecommitdiff
path: root/src/profile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/profile.cpp')
-rw-r--r--src/profile.cpp63
1 files changed, 33 insertions, 30 deletions
diff --git a/src/profile.cpp b/src/profile.cpp
index 418a4426..dd6814fd 100644
--- a/src/profile.cpp
+++ b/src/profile.cpp
@@ -28,6 +28,7 @@ along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
#include <util.h>
#include <error_report.h>
#include <appconfig.h>
+#include <iplugingame.h>
#include <QMessageBox>
#include <QApplication>
#include <QSettings>
@@ -42,7 +43,7 @@ using namespace MOBase;
using namespace MOShared;
Profile::Profile()
- : m_SaveTimer(NULL)
+ : m_SaveTimer(nullptr)
{
initTimer();
}
@@ -55,11 +56,11 @@ void Profile::touchFile(QString fileName)
}
}
-Profile::Profile(const QString &name, bool useDefaultSettings)
- : m_SaveTimer(NULL)
+Profile::Profile(const QString &name, IPluginGame *gamePlugin, bool useDefaultSettings)
+ : m_SaveTimer(nullptr)
{
initTimer();
- QString profilesDir = QDir::fromNativeSeparators(ToQString(GameInfo::instance().getProfilesDir()));
+ QString profilesDir = qApp->property("dataPath").toString() + "/" + ToQString(AppConfig::profilesPath());
QDir profileBase(profilesDir);
QString fixedName = name;
@@ -78,7 +79,15 @@ Profile::Profile(const QString &name, bool useDefaultSettings)
touchFile("modlist.txt");
touchFile("archives.txt");
- GameInfo::instance().createProfile(ToWString(fullPath), useDefaultSettings);
+ IPluginGame::ProfileSettings settings = IPluginGame::CONFIGURATION
+ | IPluginGame::MODS
+ | IPluginGame::SAVEGAMES;
+
+ if (useDefaultSettings) {
+ settings |= IPluginGame::PREFER_DEFAULTS;
+ }
+
+ gamePlugin->initializeProfile(fullPath, settings);
} catch (...) {
// clean up in case of an error
shellDelete(QStringList(profileBase.absoluteFilePath(fixedName)));
@@ -88,15 +97,21 @@ Profile::Profile(const QString &name, bool useDefaultSettings)
}
-Profile::Profile(const QDir& directory)
- : m_Directory(directory), m_SaveTimer(NULL)
+Profile::Profile(const QDir &directory, IPluginGame *gamePlugin)
+ : m_Directory(directory), m_SaveTimer(nullptr)
{
+ assert(gamePlugin != nullptr);
initTimer();
+
if (!QFile::exists(m_Directory.filePath("modlist.txt"))) {
qWarning("missing modlist.txt in %s", qPrintable(directory.path()));
+ touchFile(m_Directory.filePath("modlist.txt"));
}
- GameInfo::instance().repairProfile(ToWString(m_Directory.absolutePath()));
+ IPluginGame::ProfileSettings settings = IPluginGame::CONFIGURATION
+ | IPluginGame::MODS
+ | IPluginGame::SAVEGAMES;
+ gamePlugin->initializeProfile(directory, settings);
if (!QFile::exists(getIniFileName())) {
reportError(QObject::tr("\"%1\" is missing or inaccessible").arg(getIniFileName()));
@@ -106,7 +121,7 @@ Profile::Profile(const QDir& directory)
Profile::Profile(const Profile& reference)
- : m_Directory(reference.m_Directory), m_SaveTimer(NULL)
+ : m_Directory(reference.m_Directory), m_SaveTimer(nullptr)
{
initTimer();
refreshModStatus();
@@ -391,7 +406,7 @@ std::vector<std::tuple<QString, QString, int> > Profile::getActiveMods()
iter != m_ModIndexByPriority.end(); ++iter) {
if ((*iter != UINT_MAX) && m_ModStatus[*iter].m_Enabled) {
ModInfo::Ptr modInfo = ModInfo::getByIndex(*iter);
- result.push_back(std::make_tuple(modInfo->name(), modInfo->absolutePath(), m_ModStatus[*iter].m_Priority));
+ result.push_back(std::make_tuple(modInfo->internalName(), modInfo->absolutePath(), m_ModStatus[*iter].m_Priority));
}
}
@@ -493,29 +508,18 @@ void Profile::setModPriority(unsigned int index, int &newPriority)
writeModlist();
}
-
-Profile Profile::createFrom(const QString &name, const Profile &reference)
+Profile *Profile::createPtrFrom(const QString &name, const Profile &reference, MOBase::IPluginGame *gamePlugin)
{
- QString profileDirectory = QDir::fromNativeSeparators(ToQString(GameInfo::instance().getProfilesDir())).append("/").append(name);
+ QString profileDirectory = qApp->property("dataPath").toString() + "/" + QString::fromStdWString(AppConfig::profilesPath()) + "/" + name;
reference.copyFilesTo(profileDirectory);
- return Profile(QDir(profileDirectory));
+ return new Profile(QDir(profileDirectory), gamePlugin);
}
-
-Profile *Profile::createPtrFrom(const QString &name, const Profile &reference)
-{
- QString profileDirectory = QDir::fromNativeSeparators(ToQString(GameInfo::instance().getProfilesDir())).append("/").append(name);
- reference.copyFilesTo(profileDirectory);
- return new Profile(QDir(profileDirectory));
-}
-
-
void Profile::copyFilesTo(QString &target) const
{
copyDir(m_Directory.absolutePath(), target, false);
}
-
std::vector<std::wstring> Profile::splitDZString(const wchar_t *buffer) const
{
std::vector<std::wstring> result;
@@ -529,7 +533,6 @@ std::vector<std::wstring> Profile::splitDZString(const wchar_t *buffer) const
return result;
}
-
void Profile::mergeTweak(const QString &tweakName, const QString &tweakedIni) const
{
static const int bufferSize = 32768;
@@ -555,7 +558,7 @@ void Profile::mergeTweak(const QString &tweakName, const QString &tweakedIni) co
for (std::vector<std::wstring>::iterator iter = sections.begin();
iter != sections.end(); ++iter) {
// retrieve the names of all keys
- size = ::GetPrivateProfileStringW(iter->c_str(), NULL, NULL, buffer.data(),
+ size = ::GetPrivateProfileStringW(iter->c_str(), nullptr, nullptr, buffer.data(),
bufferSize, tweakNameW.c_str());
if (size == bufferSize - 2) {
throw MyException(QString("Buffer too small. Please report this as a bug. "
@@ -568,7 +571,7 @@ void Profile::mergeTweak(const QString &tweakName, const QString &tweakedIni) co
keyIter != keys.end(); ++keyIter) {
//TODO this treats everything as strings but how could I differentiate the type?
::GetPrivateProfileStringW(iter->c_str(), keyIter->c_str(),
- NULL, buffer.data(), bufferSize, ToWString(tweakName).c_str());
+ nullptr, buffer.data(), bufferSize, ToWString(tweakName).c_str());
::WritePrivateProfileStringW(iter->c_str(), keyIter->c_str(),
buffer.data(), tweakedIniW.c_str());
}
@@ -588,7 +591,7 @@ void Profile::mergeTweaks(ModInfo::Ptr modInfo, const QString &tweakedIni) const
bool Profile::invalidationActive(bool *supported) const
{
if (GameInfo::instance().requiresBSAInvalidation()) {
- if (supported != NULL) {
+ if (supported != nullptr) {
*supported = true;
}
wchar_t buffer[1024];
@@ -599,7 +602,7 @@ bool Profile::invalidationActive(bool *supported) const
if (::GetPrivateProfileStringW(L"Archive", GameInfo::instance().archiveListKey().c_str(),
L"", buffer, 1024, iniFileName.c_str()) == 0) {
if (errno != 0x02) {
- if (supported != NULL) {
+ if (supported != nullptr) {
*supported = false;
}
return false;
@@ -788,7 +791,7 @@ QString Profile::getPath() const
void Profile::rename(const QString &newName)
{
- QDir profileDir(QDir::fromNativeSeparators(ToQString(GameInfo::instance().getProfilesDir())));
+ QDir profileDir(qApp->property("dataPath").toString() + "/" + QString::fromStdWString(AppConfig::profilesPath()));
profileDir.rename(getName(), newName);
m_Directory = profileDir.absoluteFilePath(newName);
}