summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTannin <devnull@localhost>2013-10-11 23:03:49 +0200
committerTannin <devnull@localhost>2013-10-11 23:03:49 +0200
commit382226bb46541f07e62ce689cfeaf395aa673a44 (patch)
tree97e35547f78524c6291906ce19c94699436b39b0
parentcffd9eb4e21f0ddcddca68d8eb0f1c80c8ac6ae1 (diff)
- added new plugin to test if fnis needs to be run
- some functionality to the plugin interface to enable them to search for files&directories in the virtual FS (rudimentary atm) - functionality for plugins to react to application being started from MO - broken ESPs are no longer reported as popup windows but only in the log file - bugfix: plugins couldn't store persistent data if they had no user-editable settings
-rw-r--r--src/main.cpp2
-rw-r--r--src/mainwindow.cpp87
-rw-r--r--src/mainwindow.h10
-rw-r--r--src/organizer.pro4
-rw-r--r--src/pluginlist.cpp2
-rw-r--r--src/settings.cpp1
-rw-r--r--src/shared/directoryentry.cpp6
-rw-r--r--src/shared/directoryentry.h1
8 files changed, 103 insertions, 10 deletions
diff --git a/src/main.cpp b/src/main.cpp
index c4431ac4..49c7b3c0 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -466,7 +466,7 @@ int main(int argc, char *argv[])
arguments.removeFirst(); // remove application name (ModOrganizer.exe)
arguments.removeFirst(); // remove binary name
// pass the remaining parameters to the binary
- mainWindow.spawnProgram(exeName, arguments.join(" "), selectedProfileName, QDir());
+ mainWindow.startApplication(exeName, arguments, QString(), selectedProfileName);
return 0;
}
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index 1ea35d74..1ee4b66e 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -1276,10 +1276,15 @@ HANDLE MainWindow::spawnBinaryDirect(const QFileInfo &binary, const QString &arg
QCoreApplication::processEvents();
}
- return startBinary(binary, arguments, profileName, m_Settings.logLevel(), currentDirectory, true);
+ if (m_AboutToRun(binary.absoluteFilePath())) {
+ return startBinary(binary, arguments, profileName, m_Settings.logLevel(), currentDirectory, true);
+ } else {
+ qDebug("start of \"%s\" canceled by plugin", qPrintable(binary.absoluteFilePath()));
+ return INVALID_HANDLE_VALUE;
+ }
}
-
+/*
void MainWindow::spawnProgram(const QString &fileName, const QString &argumentsArg,
const QString &profileName, const QDir &currentDirectory)
{
@@ -1299,7 +1304,7 @@ void MainWindow::spawnProgram(const QString &fileName, const QString &argumentsA
}
spawnBinaryDirect(binary, arguments, profileName, currentDirectory, steamAppID);
}
-
+*/
void MainWindow::spawnBinary(const QFileInfo &binary, const QString &arguments, const QDir &currentDirectory, bool closeAfterStart, const QString &steamAppID)
{
@@ -1895,7 +1900,6 @@ void MainWindow::activateProxy(bool activate)
busyDialog.hide();
}
-
void MainWindow::readSettings()
{
QSettings settings(ToQString(GameInfo::instance().getIniFilename()), QSettings::IniFormat);
@@ -2053,11 +2057,86 @@ QString MainWindow::resolvePath(const QString &fileName) const
}
}
+QStringList MainWindow::listDirectories(const QString &directoryName) const
+{
+ QStringList result;
+ DirectoryEntry *dir = m_DirectoryStructure->findSubDirectoryRecursive(ToWString(directoryName));
+ if (dir != NULL) {
+ std::vector<DirectoryEntry*>::iterator current, end;
+ dir->getSubDirectories(current, end);
+ for (; current != end; ++current) {
+ result.append(ToQString((*current)->getName()));
+ }
+ }
+ return result;
+}
+
+QStringList MainWindow::findFiles(const QString &path, const std::function<bool(const QString&)> &filter) const
+{
+ QStringList result;
+ DirectoryEntry *dir = m_DirectoryStructure->findSubDirectoryRecursive(ToWString(path));
+ if (dir != NULL) {
+ std::vector<FileEntry::Ptr> files = dir->getFiles();
+ foreach (FileEntry::Ptr file, files) {
+ if (filter(ToQString(file->getName()))) {
+ result.append(ToQString(file->getFullPath()));
+ }
+ }
+ } else {
+ qWarning("directory %s not found", qPrintable(path));
+ }
+ return result;
+}
+
IDownloadManager *MainWindow::downloadManager()
{
return &m_DownloadManager;
}
+HANDLE MainWindow::startApplication(const QString &executable, const QStringList &args, const QString &cwd, const QString &profile)
+{
+ QFileInfo binary;
+ QString arguments = args.join(" ");
+ QString currentDirectory = cwd;
+ QString profileName = (profile.length() > 0) ? profile : m_CurrentProfile->getName();
+ QString steamAppID;
+ if (executable.contains('\\') || executable.contains('/')) {
+ // file path
+ binary = QFileInfo(executable);
+ if (binary.isRelative()) {
+ // relative path, should be relative to game directory
+ binary = QFileInfo(QDir::fromNativeSeparators(ToQString(GameInfo::instance().getGameDirectory())) + "/" + executable);
+ }
+ if (cwd.length() == 0) {
+ currentDirectory = binary.absolutePath();
+ }
+ } else {
+ // only a file name, search executables list
+ try {
+ const Executable &exe = m_ExecutablesList.find(executable);
+ steamAppID = exe.m_SteamAppID;
+ if (arguments == "") {
+ arguments = exe.m_Arguments;
+ }
+ binary = exe.m_BinaryInfo;
+ if (cwd.length() == 0) {
+ currentDirectory = exe.m_WorkingDirectory;
+ }
+ } catch (const std::runtime_error&) {
+ qWarning("\"%s\" not set up as executable", executable.toUtf8().constData());
+ return INVALID_HANDLE_VALUE;
+ }
+ }
+
+ return spawnBinaryDirect(binary, arguments, profileName, currentDirectory, steamAppID);
+}
+
+bool MainWindow::onAboutToRun(const boost::function<bool (const QString &)> &func)
+{
+ auto conn = m_AboutToRun.connect(func);
+ return conn.connected();
+}
+
std::vector<unsigned int> MainWindow::activeProblems() const
{
std::vector<unsigned int> problems;
diff --git a/src/mainwindow.h b/src/mainwindow.h
index dfec5f49..6992861b 100644
--- a/src/mainwindow.h
+++ b/src/mainwindow.h
@@ -89,8 +89,8 @@ public:
void createFirstProfile();
- void spawnProgram(const QString &fileName, const QString &argumentsArg,
- const QString &profileName, const QDir &currentDirectory);
+/* void spawnProgram(const QString &fileName, const QString &argumentsArg,
+ const QString &profileName, const QDir &currentDirectory);*/
void loadPlugins();
@@ -111,7 +111,11 @@ public:
virtual QString pluginDataPath() const;
virtual void installMod(const QString &fileName);
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;
virtual MOBase::IDownloadManager *downloadManager();
+ virtual HANDLE startApplication(const QString &executable, const QStringList &args = QStringList(), const QString &cwd = "", const QString &profile = "");
+ virtual bool onAboutToRun(const boost::function<bool(const QString&)> &func);
virtual std::vector<unsigned int> activeProblems() const;
virtual QString shortDescription(unsigned int key) const;
@@ -320,6 +324,8 @@ private:
QFile m_PluginsCheck;
+ SignalAboutToRunApplication m_AboutToRun;
+
private slots:
void showMessage(const QString &message);
diff --git a/src/organizer.pro b/src/organizer.pro
index a9353361..c817f2da 100644
--- a/src/organizer.pro
+++ b/src/organizer.pro
@@ -199,8 +199,8 @@ CONFIG(debug, debug|release) {
QMAKE_LFLAGS += /DEBUG
}
-QMAKE_CXXFLAGS_WARN_ON -= -W3
-QMAKE_CXXFLAGS_WARN_ON += -W4
+#QMAKE_CXXFLAGS_WARN_ON -= -W3
+#QMAKE_CXXFLAGS_WARN_ON += -W4
QMAKE_CXXFLAGS += -wd4127 -wd4512 -wd4189
CONFIG += embed_manifest_exe
diff --git a/src/pluginlist.cpp b/src/pluginlist.cpp
index e730d3f4..55f8a39e 100644
--- a/src/pluginlist.cpp
+++ b/src/pluginlist.cpp
@@ -953,7 +953,7 @@ PluginList::ESPInfo::ESPInfo(const QString &name, bool enabled, FILETIME time, c
m_Masters.insert(QString(iter->c_str()));
}
} catch (const std::exception &e) {
- reportError(tr("failed to parse esp file %1: %2").arg(fullPath).arg(e.what()));
+ qCritical("failed to parse esp file %s: %s", qPrintable(fullPath), e.what());
m_IsMaster = false;
}
}
diff --git a/src/settings.cpp b/src/settings.cpp
index 42a8d693..4f301b0c 100644
--- a/src/settings.cpp
+++ b/src/settings.cpp
@@ -105,6 +105,7 @@ bool Settings::pluginBlacklisted(const QString &fileName) const
void Settings::registerPlugin(IPlugin *plugin)
{
m_Plugins.push_back(plugin);
+ m_PluginSettings.insert(plugin->name(), QMap<QString, QVariant>());
foreach (const PluginSetting &setting, plugin->settings()) {
QVariant temp = m_Settings.value("Plugins/" + plugin->name() + "/" + setting.key, setting.defaultValue);
if (!temp.convert(setting.defaultValue.type())) {
diff --git a/src/shared/directoryentry.cpp b/src/shared/directoryentry.cpp
index 8380181f..b3a12498 100644
--- a/src/shared/directoryentry.cpp
+++ b/src/shared/directoryentry.cpp
@@ -746,6 +746,12 @@ DirectoryEntry *DirectoryEntry::findSubDirectory(const std::wstring &name) const
}
+DirectoryEntry *DirectoryEntry::findSubDirectoryRecursive(const std::wstring &path)
+{
+ return getSubDirectoryRecursive(path, false, -1);
+}
+
+
const FileEntry::Ptr DirectoryEntry::findFile(const std::wstring &name)
{
auto iter = m_Files.find(name);
diff --git a/src/shared/directoryentry.h b/src/shared/directoryentry.h
index 498ebfe1..1ad9816c 100644
--- a/src/shared/directoryentry.h
+++ b/src/shared/directoryentry.h
@@ -227,6 +227,7 @@ public:
}
DirectoryEntry *findSubDirectory(const std::wstring &name) const;
+ DirectoryEntry *findSubDirectoryRecursive(const std::wstring &path);
/** retrieve a file in this directory by name.
* @param name name of the file