diff --git a/src/proxy/proxyPython.pro b/src/proxy/proxyPython.pro
index d05ed71..ac09fc5 100644
--- a/src/proxy/proxyPython.pro
+++ b/src/proxy/proxyPython.pro
@@ -22,6 +22,9 @@ CONFIG(release, debug|release) {
DEFINES += PROXYPYTHON_LIBRARY
+# suppress a few warnings caused by boost vs vc++ paranoia
+DEFINES += _SCL_SECURE_NO_WARNINGS
+
SOURCES += proxypython.cpp
HEADERS += proxypython.h \
resource.h
@@ -44,6 +47,6 @@ WINPWD ~= s,/,$$QMAKE_DIR_SEP,g
//QMAKE_POST_LINK += SET VS90COMNTOOLS=%VS100COMNTOOLS% $$escape_expand(\\n)
-QMAKE_POST_LINK += copy $$(PYTHONPATH)\\lib\\site-packages\\sip.pyd $$quote($$DSTDIR)\\plugins\\data\\ $$escape_expand(\\n)
-QMAKE_POST_LINK += copy $$(PYTHONPATH)\\lib\\site-packages\\PyQt4\\QtCore.pyd $$quote($$DSTDIR)\\plugins\\data\\PyQt4\\ $$escape_expand(\\n)
-QMAKE_POST_LINK += copy $$(PYTHONPATH)\\lib\\site-packages\\PyQt4\\QtGui.pyd $$quote($$DSTDIR)\\plugins\\data\\PyQt4\\ $$escape_expand(\\n)
+//QMAKE_POST_LINK += copy $$(PYTHONPATH)\\lib\\site-packages\\sip.pyd $$quote($$DSTDIR)\\plugins\\data\\ $$escape_expand(\\n)
+//QMAKE_POST_LINK += copy $$(PYTHONPATH)\\lib\\site-packages\\PyQt4\\QtCore.pyd $$quote($$DSTDIR)\\plugins\\data\\PyQt4\\ $$escape_expand(\\n)
+//QMAKE_POST_LINK += copy $$(PYTHONPATH)\\lib\\site-packages\\PyQt4\\QtGui.pyd $$quote($$DSTDIR)\\plugins\\data\\PyQt4\\ $$escape_expand(\\n)
diff --git a/src/proxy/proxypython.cpp b/src/proxy/proxypython.cpp
index 74ec327..831cefe 100644
--- a/src/proxy/proxypython.cpp
+++ b/src/proxy/proxypython.cpp
@@ -1,11 +1,24 @@
-#pragma warning( push )
-#pragma warning( disable : 4100 ) // a lot of unreferenced formal parameters from boost libraries
-#pragma warning( disable : 4996 ) // strncpy claimed to be unsafe
+/*
+Copyright (C) 2013 Sebastian Herbord. All rights reserved.
+
+This file is part of python proxy plugin for MO
+
+python proxy plugin is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Python proxy plugin is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with python proxy plugin. If not, see .
+*/
+
#include "proxypython.h"
-
-#pragma warning( pop )
-
#include
#include
#include
@@ -34,8 +47,6 @@ HMODULE GetOwnModuleHandle()
QString ExtractResource(WORD resourceID, const QString &szFilename)
{
- bool success = false;
-
HMODULE mod = GetOwnModuleHandle();
HRSRC hResource = FindResourceW(mod, MAKEINTRESOURCE(resourceID), L"BINARY");
diff --git a/src/proxy/proxypython.h b/src/proxy/proxypython.h
index 1b4da36..cc7501d 100644
--- a/src/proxy/proxypython.h
+++ b/src/proxy/proxypython.h
@@ -1,3 +1,22 @@
+/*
+Copyright (C) 2013 Sebastian Herbord. All rights reserved.
+
+This file is part of python proxy plugin for MO
+
+python proxy plugin is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Python proxy plugin is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with python proxy plugin. If not, see .
+*/
+
#ifndef PROXYPYTHON_H
#define PROXYPYTHON_H
diff --git a/src/runner/pythonRunner.pro b/src/runner/pythonRunner.pro
index 8a64c7d..eefc48a 100644
--- a/src/runner/pythonRunner.pro
+++ b/src/runner/pythonRunner.pro
@@ -12,6 +12,9 @@ CONFIG += warn_on
DEFINES += PYTHONRUNNER_LIBRARY
+# suppress a few warnings caused by boost vs vc++ paranoia
+DEFINES += _SCL_SECURE_NO_WARNINGS
+
SOURCES += pythonrunner.cpp \
gilock.cpp \
error.cpp \
diff --git a/src/runner/pythonrunner.cpp b/src/runner/pythonrunner.cpp
index 556e0b3..18a2e13 100644
--- a/src/runner/pythonrunner.cpp
+++ b/src/runner/pythonrunner.cpp
@@ -11,6 +11,7 @@
#include
#include
#include
+#include
// sip and qt slots seems to conflict
#include
@@ -36,15 +37,15 @@ public:
private:
+ void initPath(boost::python::object &moduleNamespace);
+
+private:
std::map m_PythonObjects;
const MOBase::IOrganizer *m_MOInfo;
char *m_PythonHome;
};
-
-
-
IPythonRunner *CreatePythonRunner(const MOBase::IOrganizer *moInfo, const QString &pythonDir)
{
PythonRunner *result = new PythonRunner(moInfo);
@@ -581,6 +582,7 @@ BOOST_PYTHON_MODULE(mobase)
.def("pluginList", bpy::pure_virtual(&IOrganizer::pluginList), bpy::return_value_policy())
.def("startApplication", bpy::pure_virtual(&IOrganizer::startApplication), bpy::return_value_policy())
.def("onAboutToRun", bpy::pure_virtual(&IOrganizer::onAboutToRun))
+ .def("refreshModList", bpy::pure_virtual(&IOrganizer::refreshModList))
;
bpy::class_("ModRepositoryBridge")
@@ -636,6 +638,7 @@ PythonRunner::PythonRunner(const MOBase::IOrganizer *moInfo)
static char* argv0 = "ModOrganizer.exe";
+
bool PythonRunner::initPython(const QString &pythonPath)
{
try {
@@ -649,21 +652,25 @@ bool PythonRunner::initPython(const QString &pythonPath)
Py_SetProgramName(argv0);
PyImport_AppendInittab("mobase", &initmobase);
-
+ Py_OptimizeFlag = 2;
+ Py_NoSiteFlag = 1;
Py_InitializeEx(0);
+
if (!Py_IsInitialized()) {
return false;
}
PySys_SetArgv(0, &argv0);
- bpy::object main_module = bpy::import("__main__");
- bpy::object main_namespace = main_module.attr("__dict__");
- main_namespace["cStringIO"] = bpy::import("cStringIO");
- main_namespace["sys"] = bpy::import("sys");
+ bpy::object mainModule = bpy::import("__main__");
+ bpy::object mainNamespace = mainModule.attr("__dict__");
+ mainNamespace["sys"] = bpy::import("sys");
+ initPath(mainNamespace);
+ bpy::import("site");
+ mainNamespace["cStringIO"] = bpy::import("cStringIO");
bpy::exec("s_ErrIO = cStringIO.StringIO()\n"
"sys.stderr = s_ErrIO",
- main_namespace);
+ mainNamespace);
return true;
} catch (const bpy::error_already_set&) {
qDebug("failed to init python");
@@ -693,26 +700,41 @@ bool handled_exec_file(bpy::str filename, bpy::object globals = bpy::object(), b
} while (false)
+void PythonRunner::initPath(bpy::object &moduleNamespace)
+{
+ static QString paths[] = {
+ m_MOInfo->pluginDataPath(),
+ QCoreApplication::applicationDirPath(),
+ QCoreApplication::applicationDirPath() + "/python27.zip",
+ QCoreApplication::applicationDirPath() + "/python27.zip/Lib",
+ QCoreApplication::applicationDirPath() + "/python27.zip/DLLs",
+ QCoreApplication::applicationDirPath() + "/python27.zip/Lib/site-packages",
+ };
+
+ for (int i = 0; i < sizeof(paths) / sizeof(QString); ++i) {
+ QString expr = QString("sys.path.insert(%1, \"%2\")").arg(i).arg(paths[i]);
+ bpy::eval(expr.toUtf8().constData(), moduleNamespace);
+ }
+}
+
+
QObject *PythonRunner::instantiate(const QString &pluginName)
{
try {
GILock lock;
- bpy::object main_module = bpy::import("__main__");
- bpy::object main_namespace = main_module.attr("__dict__");
+ bpy::object mainModule = bpy::import("__main__");
+ bpy::object moduleNamespace = mainModule.attr("__dict__");
- bpy::object mobase_module((bpy::handle<>(PyImport_ImportModule("mobase"))));
- main_namespace["sys"] = bpy::import("sys");
- main_namespace["mobase"] = mobase_module;
- QString appendDataPath = QString("sys.path.insert(0, \"%1\")").arg(m_MOInfo->pluginDataPath());
-
- bpy::eval(appendDataPath.toUtf8().constData(), main_namespace);
+ bpy::object sys = bpy::import("sys");
+ moduleNamespace["sys"] = sys;
+ moduleNamespace["mobase"] = bpy::import("mobase");
std::string temp = ToString(pluginName);
- if (handled_exec_file(temp.c_str(), main_namespace)) {
+ if (handled_exec_file(temp.c_str(), moduleNamespace)) {
reportPythonError();
return NULL;
}
- m_PythonObjects[pluginName] = main_namespace["createPlugin"]();
+ m_PythonObjects[pluginName] = moduleNamespace["createPlugin"]();
bpy::object pluginObj = m_PythonObjects[pluginName];
TRY_PLUGIN_TYPE(IPluginInstallerCustom, pluginObj);
diff --git a/src/runner/uibasewrappers.h b/src/runner/uibasewrappers.h
index c1c5e50..6b1bd41 100644
--- a/src/runner/uibasewrappers.h
+++ b/src/runner/uibasewrappers.h
@@ -142,7 +142,7 @@ struct IOrganizerWrapper: MOBase::IOrganizer, boost::python::wrapper &filter) const { return this->get_override("findFiles")(path, filter); }
virtual HANDLE startApplication(const QString &executable, const QStringList &args = QStringList(), const QString &cwd = "", const QString &profile = "") { return this->get_override("startApplication")(executable, args, cwd, profile); }
virtual bool onAboutToRun(const std::function &func) { return this->get_override("onAboutToRun")(func); }
-
+ virtual void refreshModList(bool saveChanges = true) { this->get_override("refreshModList")(saveChanges); }
};
struct IDownloadManagerWrapper: MOBase::IDownloadManager, boost::python::wrapper