summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTannin <devnull@localhost>2015-01-03 16:18:38 +0100
committerTannin <devnull@localhost>2015-01-03 16:18:38 +0100
commitf5c56efeb3f362378459fdc1ddbf1fc71a2351f8 (patch)
tree547ec4c2d3a401c5a93827adae689905de13e603 /src
parenta16e25380f088dc310fbed24d2dcef603357e99a (diff)
re-integrated changes missing from the merge
Diffstat (limited to 'src')
-rw-r--r--src/mainwindow.cpp2
-rw-r--r--src/organizercore.cpp66
-rw-r--r--src/organizercore.h2
3 files changed, 46 insertions, 24 deletions
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index eaa58db1..5d9b12a9 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -2243,7 +2243,7 @@ void MainWindow::reinstallMod_clicked()
fullInstallationFile = m_OrganizerCore.downloadManager()->getOutputDirectory() + "/" + installationFile;
}
if (QFile::exists(fullInstallationFile)) {
- installMod(fullInstallationFile, modInfo->name());
+ m_OrganizerCore.installMod(fullInstallationFile, modInfo->name());
} else {
QMessageBox::information(this, tr("Failed"), tr("Installation file no longer exists"));
}
diff --git a/src/organizercore.cpp b/src/organizercore.cpp
index 68989c8c..1e787670 100644
--- a/src/organizercore.cpp
+++ b/src/organizercore.cpp
@@ -76,15 +76,25 @@ static std::wstring getProcessName(DWORD processId)
}
}
-static bool testForSteam()
+bool MainWindow::testForSteam()
{
- DWORD processIDs[1024];
+ size_t currentSize = 1024;
+ std::unique_ptr<DWORD[]> processIDs;
DWORD bytesReturned;
- if (!::EnumProcesses(processIDs, sizeof(processIDs), &bytesReturned)) {
- qWarning("failed to determine if steam is running");
- return true;
+ bool success = false;
+ while (!success) {
+ processIDs.reset(new DWORD[currentSize]);
+ if (!::EnumProcesses(processIDs.get(), currentSize * sizeof(DWORD), &bytesReturned)) {
+ qWarning("failed to determine if steam is running");
+ return true;
+ }
+ if (bytesReturned == (currentSize * sizeof(DWORD))) {
+ // maximum size used, list probably truncated
+ currentSize *= 2;
+ } else {
+ success = true;
+ }
}
-
TCHAR processName[MAX_PATH];
for (unsigned int i = 0; i < bytesReturned / sizeof(DWORD); ++i) {
memset(processName, '\0', sizeof(TCHAR) * MAX_PATH);
@@ -96,13 +106,15 @@ static bool testForSteam()
DWORD ignore;
// first module in a process is always the binary
- if (::EnumProcessModules(process, &module, sizeof(HMODULE) * 1, &ignore)) {
+ if (EnumProcessModules(process, &module, sizeof(HMODULE) * 1, &ignore)) {
::GetModuleBaseName(process, module, processName, MAX_PATH);
if ((_tcsicmp(processName, TEXT("steam.exe")) == 0) ||
(_tcsicmp(processName, TEXT("steamservice.exe")) == 0)) {
return true;
}
}
+ } else {
+ qDebug("can't open process %lu: %lu", processIDs[i], ::GetLastError());
}
}
}
@@ -224,16 +236,16 @@ void OrganizerCore::storeSettings()
int count = 0;
for (; current != end; ++current) {
const Executable &item = *current;
- if (item.m_Custom || item.m_Toolbar) {
- settings.setArrayIndex(count++);
+ 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("title", item.m_Title);
settings.setValue("arguments", item.m_Arguments);
settings.setValue("workingDirectory", item.m_WorkingDirectory);
- settings.setValue("closeOnStart", item.m_CloseMO == ExecutableInfo::CloseMOStyle::DEFAULT_CLOSE);
+ settings.setValue("closeOnStart", item.m_CloseMO == DEFAULT_CLOSE);
settings.setValue("steamAppID", item.m_SteamAppID);
- settings.setValue("custom", item.m_Custom);
- settings.setValue("toolbar", item.m_Toolbar);
}
}
settings.endArray();
@@ -484,21 +496,28 @@ MOBase::IModInterface *OrganizerCore::getMod(const QString &name)
MOBase::IModInterface *OrganizerCore::createMod(GuessedValue<QString> &name)
{
- if (!m_InstallationManager.testOverwrite(name)) {
- return NULL;
+ bool merge = false;
+ if (!m_InstallationManager.testOverwrite(name, &merge)) {
+ return nullptr;
}
m_InstallationManager.setModsDirectory(m_Settings.getModDirectory());
QString targetDirectory = QDir::fromNativeSeparators(m_Settings.getModDirectory()).append("/").append(name);
- QSettings settingsFile(targetDirectory.mid(0).append("/meta.ini"), QSettings::IniFormat);
+ QSettings settingsFile(targetDirectory + "/meta.ini", QSettings::IniFormat);
+
+ if (!merge) {
+ settingsFile.setValue("modid", 0);
+ settingsFile.setValue("version", "");
+ settingsFile.setValue("newestVersion", "");
+ settingsFile.setValue("category", 0);
+ settingsFile.setValue("installationFile", "");
+
+ settingsFile.beginWriteArray("installedFiles", 0);
+ settingsFile.endArray();
+ }
- settingsFile.setValue("modid", 0);
- settingsFile.setValue("version", "");
- settingsFile.setValue("newestVersion", "");
- settingsFile.setValue("category", 0);
- settingsFile.setValue("installationFile", "");
return ModInfo::createFrom(QDir(targetDirectory), &m_DirectoryStructure).data();
}
@@ -543,7 +562,7 @@ QString OrganizerCore::pluginDataPath() const
return pluginPath + "/data";
}
-MOBase::IModInterface *OrganizerCore::installMod(const QString &fileName)
+MOBase::IModInterface *OrganizerCore::installMod(const QString &fileName, const QString &initModName)
{
if (m_CurrentProfile == nullptr) {
return nullptr;
@@ -551,6 +570,9 @@ MOBase::IModInterface *OrganizerCore::installMod(const QString &fileName)
bool hasIniTweaks = false;
GuessedValue<QString> modName;
+ if (!initModName.isEmpty()) {
+ modName.update(initModName, GUESS_USER);
+ }
m_CurrentProfile->writeModlistNow();
m_InstallationManager.setModsDirectory(m_Settings.getModDirectory());
if (m_InstallationManager.install(fileName, modName, hasIniTweaks)) {
diff --git a/src/organizercore.h b/src/organizercore.h
index b362a002..ad63dc51 100644
--- a/src/organizercore.h
+++ b/src/organizercore.h
@@ -134,7 +134,7 @@ public:
virtual QVariant persistent(const QString &pluginName, const QString &key, const QVariant &def) const;
virtual void setPersistent(const QString &pluginName, const QString &key, const QVariant &value, bool sync);
virtual QString pluginDataPath() const;
- virtual MOBase::IModInterface *installMod(const QString &fileName);
+ virtual MOBase::IModInterface *installMod(const QString &fileName, const QString &initModName);
virtual QString resolvePath(const QString &fileName) const;
virtual QStringList listDirectories(const QString &directoryName) const;
virtual QStringList findFiles(const QString &path, const std::function<bool (const QString &)> &filter) const;