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