##// END OF EJS Templates
- removed warnings...
florianlink -
r8:f65f3e118cc5
parent child
Show More
@@ -0,0 +1,80
1 /*
2 *
3 * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved.
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * Further, this software is distributed without any warranty that it is
16 * free of the rightful claim of any third person regarding infringement
17 * or the like. Any license provided herein, whether implied or
18 * otherwise, applies only to this software file. Patent licenses, if
19 * any, provided herein do not apply to combinations of this program with
20 * other software, or any other product whatsoever.
21 *
22 * You should have received a copy of the GNU Lesser General Public
23 * License along with this library; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25 *
26 * Contact information: MeVis Research GmbH, Universitaetsallee 29,
27 * 28359 Bremen, Germany or:
28 *
29 * http://www.mevis.de
30 *
31 */
32
33 //----------------------------------------------------------------------------------
34 /*!
35 // \file PythonQtQFileImporter.h
36 // \author Florian Link
37 // \author Last changed by $Author: florian $
38 // \date 2009-03
39 */
40 //----------------------------------------------------------------------------------
41
42 #include <QFile>
43 #include <QFileInfo>
44
45 #include "PythonQtQFileImporter.h"
46
47 PythonQtQFileImporter::PythonQtQFileImporter() {
48 }
49
50 PythonQtQFileImporter::~PythonQtQFileImporter() {
51 }
52
53 QByteArray PythonQtQFileImporter::readFileAsBytes (const QString &filename) {
54 QFile f(filename);
55 if (f.open(QIODevice::ReadOnly)) {
56 return f.readAll();
57 } else {
58 return QByteArray();
59 }
60 }
61
62 QByteArray PythonQtQFileImporter::readSourceFile (const QString &filename, bool &ok) {
63 QFile f(filename);
64 if (f.open(QIODevice::ReadOnly | QIODevice::Text)) {
65 ok = true;
66 return f.readAll();
67 } else {
68 ok = false;
69 return QByteArray();
70 }
71 }
72
73 bool PythonQtQFileImporter::exists (const QString &filename) {
74 return QFile::exists(filename);
75 }
76
77 QDateTime PythonQtQFileImporter::lastModifiedDate (const QString &filename) {
78 QFileInfo fi(filename);
79 return fi.lastModified();
80 }
@@ -0,0 +1,63
1 #ifndef _PYTHONQTQFILEIMPORTER_H
2 #define _PYTHONQTQFILEIMPORTER_H
3
4 /*
5 *
6 * Copyright (C) 2006 MeVis Research GmbH All Rights Reserved.
7 *
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * Further, this software is distributed without any warranty that it is
19 * free of the rightful claim of any third person regarding infringement
20 * or the like. Any license provided herein, whether implied or
21 * otherwise, applies only to this software file. Patent licenses, if
22 * any, provided herein do not apply to combinations of this program with
23 * other software, or any other product whatsoever.
24 *
25 * You should have received a copy of the GNU Lesser General Public
26 * License along with this library; if not, write to the Free Software
27 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
28 *
29 * Contact information: MeVis Research GmbH, Universitaetsallee 29,
30 * 28359 Bremen, Germany or:
31 *
32 * http://www.mevis.de
33 *
34 */
35
36 //----------------------------------------------------------------------------------
37 /*!
38 // \file PythonQtQFileImporter.h
39 // \author Florian Link
40 // \author Last changed by $Author: florian $
41 // \date 2009-03
42 */
43 //----------------------------------------------------------------------------------
44
45 #include <PythonQtImportFileInterface.h>
46
47 //! default importer implementation using QFile to load python code
48 class PythonQtQFileImporter : public PythonQtImportFileInterface {
49 public:
50 PythonQtQFileImporter();
51 ~PythonQtQFileImporter();
52
53 QByteArray readFileAsBytes (const QString &filename);
54
55 QByteArray readSourceFile (const QString &filename, bool &ok);
56
57 bool exists (const QString &filename);
58
59 QDateTime lastModifiedDate (const QString &filename);
60
61 };
62
63 #endif
@@ -1,6 +1,5
1 #include <PythonQt.h>
1 #include <PythonQt.h>
2 #include <QtGui>
2 #include <QtGui>
3 #include "QFileImportInterface.h"
4
3
5 int main (int argc, char* argv[]) {
4 int main (int argc, char* argv[]) {
6 QApplication app(argc, argv);
5 QApplication app(argc, argv);
@@ -19,11 +18,10 int main (int argc, char* argv[]) {
19 Q_ASSERT(fn.toString() == QString("t.mp3"));
18 Q_ASSERT(fn.toString() == QString("t.mp3"));
20 // tag goes out of scope, reference count decremented.
19 // tag goes out of scope, reference count decremented.
21 }
20 }
22 qDebug() << "test1";
23 /*
24 {
21 {
25 // Allow the python system path to recognize QFile paths in the sys.path
22 // Allow the python system path to recognize QFile paths in the sys.path
26 QFileImportInterface qfii;
23 //QFileImportInterface qfii;
24 PythonQt::self()->setImporter(NULL);
27 // append the Qt resource root directory to the sys.path
25 // append the Qt resource root directory to the sys.path
28 mainModule.evalScript("sys.path.append(':')\n");
26 mainModule.evalScript("sys.path.append(':')\n");
29 mainModule.evalScript("import eyed3tagger\n");
27 mainModule.evalScript("import eyed3tagger\n");
@@ -33,7 +31,6 int main (int argc, char* argv[]) {
33 QVariant fn = tag.call("fileName", QVariantList());
31 QVariant fn = tag.call("fileName", QVariantList());
34 Q_ASSERT(fn.toString() == QString("t.mp3"));
32 Q_ASSERT(fn.toString() == QString("t.mp3"));
35 }
33 }
36 qDebug() << "test2"; */
37 { // alternative using import and loading it as a real module from sys.path
34 { // alternative using import and loading it as a real module from sys.path
38 // import sys first
35 // import sys first
39 mainModule.evalScript(QString("sys.path.append('%1')\n").arg(QDir::currentPath()));
36 mainModule.evalScript(QString("sys.path.append('%1')\n").arg(QDir::currentPath()));
@@ -2,10 +2,10 CONFIG += debug
2 VPATH +=
2 VPATH +=
3 INCLUDEPATH += . $$(PYTHONQT_ROOT)/src /usr/include/python2.5
3 INCLUDEPATH += . $$(PYTHONQT_ROOT)/src /usr/include/python2.5
4
4
5 SOURCES += CPPPyWrapperExample.cpp QFileImportInterface.cpp
5 SOURCES += CPPPyWrapperExample.cpp
6 HEADERS += QFileImportInterface.h
7
6
7 mac { CONFIG -= app_bundle }
8
8
9 LIBS += -L$$(PYTHONQT_ROOT)/lib -lPythonQt -lutil
9 LIBS += -L$$(PYTHONQT_ROOT)/lib -lPythonQt_d -lutil
10
10
11 RESOURCES += CPPPyWrapperExample.qrc
11 RESOURCES += CPPPyWrapperExample.qrc
@@ -49,6 +49,7
49 #include "PythonQtCppWrapperFactory.h"
49 #include "PythonQtCppWrapperFactory.h"
50 #include "PythonQtVariants.h"
50 #include "PythonQtVariants.h"
51 #include "PythonQtStdDecorators.h"
51 #include "PythonQtStdDecorators.h"
52 #include "PythonQtQFileImporter.h"
52 #include <pydebug.h>
53 #include <pydebug.h>
53
54
54 PythonQt* PythonQt::_self = NULL;
55 PythonQt* PythonQt::_self = NULL;
@@ -163,6 +164,14 PythonQt::~PythonQt() {
163 }
164 }
164
165
165 PythonQtPrivate::~PythonQtPrivate() {
166 PythonQtPrivate::~PythonQtPrivate() {
167 delete _defaultImporter;
168 _defaultImporter = NULL;
169 {
170 QHashIterator<QByteArray, PythonQtSlotInfo *> i(_knownQtDecoratorSlots);
171 while (i.hasNext()) {
172 delete i.next().value();
173 }
174 }
166 {
175 {
167 QHashIterator<QByteArray, PythonQtClassInfo *> i(_knownQtClasses);
176 QHashIterator<QByteArray, PythonQtClassInfo *> i(_knownQtClasses);
168 while (i.hasNext()) {
177 while (i.hasNext()) {
@@ -184,13 +193,25 PythonQtPrivate::~PythonQtPrivate() {
184 {
193 {
185 QHashIterator<QByteArray, PythonQtSlotInfo *> i(_constructorSlots);
194 QHashIterator<QByteArray, PythonQtSlotInfo *> i(_constructorSlots);
186 while (i.hasNext()) {
195 while (i.hasNext()) {
187 delete i.next().value();
196 PythonQtSlotInfo* cur = i.next().value();
197 while(cur->nextInfo()) {
198 PythonQtSlotInfo* next = cur->nextInfo();
199 delete cur;
200 cur = next;
201 }
202 delete cur;
188 }
203 }
189 }
204 }
190 {
205 {
191 QHashIterator<QByteArray, PythonQtSlotInfo *> i(_destructorSlots);
206 QHashIterator<QByteArray, PythonQtSlotInfo *> i(_destructorSlots);
192 while (i.hasNext()) {
207 while (i.hasNext()) {
193 delete i.next().value();
208 PythonQtSlotInfo* cur = i.next().value();
209 while(cur->nextInfo()) {
210 PythonQtSlotInfo* next = cur->nextInfo();
211 delete cur;
212 cur = next;
213 }
214 delete cur;
194 }
215 }
195 }
216 }
196 PythonQtConv::global_valueStorage.clear();
217 PythonQtConv::global_valueStorage.clear();
@@ -204,7 +225,7 PythonQtPrivate::~PythonQtPrivate() {
204
225
205 PythonQtImportFileInterface* PythonQt::importInterface()
226 PythonQtImportFileInterface* PythonQt::importInterface()
206 {
227 {
207 return _self->_p->_importInterface;
228 return _self->_p->_importInterface?_self->_p->_importInterface:_self->_p->_defaultImporter;
208 }
229 }
209
230
210 void PythonQt::registerClass(const QMetaObject* metaobject)
231 void PythonQt::registerClass(const QMetaObject* metaobject)
@@ -760,12 +781,8 void PythonQt::registerQObjectClassNames(const QStringList& names)
760
781
761 void PythonQt::setImporter(PythonQtImportFileInterface* importInterface)
782 void PythonQt::setImporter(PythonQtImportFileInterface* importInterface)
762 {
783 {
763 static bool first = true;
784 PythonQtImport::init();
764 if (first) {
785 _p->_importInterface = importInterface;
765 first = false;
766 _p->_importInterface = importInterface;
767 PythonQtImport::init();
768 }
769 }
786 }
770
787
771 void PythonQt::setImporterIgnorePaths(const QStringList& paths)
788 void PythonQt::setImporterIgnorePaths(const QStringList& paths)
@@ -797,6 +814,7 const QList<PythonQtConstructorHandler*>& PythonQt::constructorHandlers()
797 PythonQtPrivate::PythonQtPrivate()
814 PythonQtPrivate::PythonQtPrivate()
798 {
815 {
799 _importInterface = NULL;
816 _importInterface = NULL;
817 _defaultImporter = new PythonQtQFileImporter;
800 _noLongerWrappedCB = NULL;
818 _noLongerWrappedCB = NULL;
801 _wrappedCB = NULL;
819 _wrappedCB = NULL;
802 }
820 }
@@ -65,6 +65,7 class PythonQtSignalReceiver;
65 class PythonQtImportFileInterface;
65 class PythonQtImportFileInterface;
66 class PythonQtCppWrapperFactory;
66 class PythonQtCppWrapperFactory;
67 class PythonQtConstructorHandler;
67 class PythonQtConstructorHandler;
68 class PythonQtQFileImporter;
68
69
69 typedef void PythonQtQObjectWrappedCB(QObject* object);
70 typedef void PythonQtQObjectWrappedCB(QObject* object);
70 typedef void PythonQtQObjectNoLongerWrappedCB(QObject* object);
71 typedef void PythonQtQObjectNoLongerWrappedCB(QObject* object);
@@ -278,9 +279,23 public:
278
279
279 //! replace the internal import implementation and use the supplied interface to load files (both py and pyc files)
280 //! replace the internal import implementation and use the supplied interface to load files (both py and pyc files)
280 //! (this method should be called directly after initialization of init() and before calling overwriteSysPath().
281 //! (this method should be called directly after initialization of init() and before calling overwriteSysPath().
281 //! It can only be called once, further calls will be ignored silently. (ownership stays with caller)
282 //! On the first call to this method, it will install a generic PythonQt importer in Pythons "path_hooks".
283 //! This is not reversible, so even setting setImporter(NULL) afterwards will
284 //! keep the custom PythonQt importer with a QFile default import interface.
285 //! Subsequent python import calls will make use of the passed importInterface
286 //! which forwards all import calls to the given \c importInterface.
287 //! Passing NULL will install a default QFile importer.
288 //! (\c importInterface ownership stays with caller)
282 void setImporter(PythonQtImportFileInterface* importInterface);
289 void setImporter(PythonQtImportFileInterface* importInterface);
283
290
291 //! this installs the default QFile importer (which effectively does a setImporter(NULL))
292 //! (without calling setImporter or installDefaultImporter at least once, the default python import
293 //! mechanism is in place)
294 //! the default importer allows to import files from anywhere QFile can read from,
295 //! including the Qt resource system using ":". Keep in mind that you need to extend
296 //! "sys.path" with ":" to be able to import from the Qt resources.
297 void installDefaultImporter() { setImporter(NULL); }
298
284 //! set paths that the importer should ignore
299 //! set paths that the importer should ignore
285 void setImporterIgnorePaths(const QStringList& paths);
300 void setImporterIgnorePaths(const QStringList& paths);
286
301
@@ -442,6 +457,9 private:
442 //! the importer interface (if set)
457 //! the importer interface (if set)
443 PythonQtImportFileInterface* _importInterface;
458 PythonQtImportFileInterface* _importInterface;
444
459
460 //! the default importer
461 PythonQtQFileImporter* _defaultImporter;
462
445 PythonQtQObjectNoLongerWrappedCB* _noLongerWrappedCB;
463 PythonQtQObjectNoLongerWrappedCB* _noLongerWrappedCB;
446 PythonQtQObjectWrappedCB* _wrappedCB;
464 PythonQtQObjectWrappedCB* _wrappedCB;
447
465
@@ -588,7 +588,7 QString PythonQtConv::PyObjGetString(PyObject* val, bool strict, bool& ok) {
588 return r;
588 return r;
589 }
589 }
590
590
591 QByteArray PythonQtConv::PyObjGetBytes(PyObject* val, bool strict, bool& ok) {
591 QByteArray PythonQtConv::PyObjGetBytes(PyObject* val, bool /*strict*/, bool& ok) {
592 QByteArray r;
592 QByteArray r;
593 ok = true;
593 ok = true;
594 if (val->ob_type == &PyString_Type) {
594 if (val->ob_type == &PyString_Type) {
@@ -980,7 +980,7 PyObject* PythonQtConv::ConvertQListWithPointersToPython(QList<void*>* list, con
980 return result;
980 return result;
981 }
981 }
982
982
983 bool PythonQtConv::ConvertPythonListToQListOfType(PyObject* obj, QList<void*>* list, const QByteArray& type, bool strict)
983 bool PythonQtConv::ConvertPythonListToQListOfType(PyObject* obj, QList<void*>* list, const QByteArray& type, bool /*strict*/)
984 {
984 {
985 bool result = false;
985 bool result = false;
986 if (PySequence_Check(obj)) {
986 if (PySequence_Check(obj)) {
@@ -51,7 +51,7
51
51
52 \section Introduction
52 \section Introduction
53
53
54 \b PythonQt is a dynamic Python (http://www.python.org) binding for Qt (http://www.trolltech.com).
54 \b PythonQt is a dynamic Python (http://www.python.org) binding for Qt (http://www.qtsoftware.com).
55 It offers an easy way to embed the Python scripting language into
55 It offers an easy way to embed the Python scripting language into
56 your Qt applications. It makes heavy use of the QMetaObject system and thus requires Qt4.x.
56 your Qt applications. It makes heavy use of the QMetaObject system and thus requires Qt4.x.
57
57
@@ -339,7 +339,7 yourCpp = None
339
339
340 \section Building
340 \section Building
341
341
342 PythonQt requires at least Qt 4.2.2 (or higher) and Python 2.3, 2.4 or 2.5 on Windows, Linux and MacOS X.
342 PythonQt requires at least Qt 4.2.2 (or higher) and Python 2.3, 2.4, 2.5 or 2.6 on Windows, Linux and MacOS X. It has not yet been tested with Python 3.x, but it should only require minor changes.
343 To compile PythonQt, you will need a python developer installation which includes Python's header files and
343 To compile PythonQt, you will need a python developer installation which includes Python's header files and
344 the python2x.[lib | dll | so | dynlib].
344 the python2x.[lib | dll | so | dynlib].
345 The build scripts a currently set to use Python 2.5.
345 The build scripts a currently set to use Python 2.5.
@@ -459,8 +459,4 the python2x.[lib | dll | so | dynlib].
459 \endcode
459 \endcode
460
460
461
461
462 \section TODOs
463
464 - add more information on how to distribute an application that uses PythonQt, including the Python distribution
465
466 */
462 */
@@ -51,6 +51,9
51 class PythonQtImportFileInterface {
51 class PythonQtImportFileInterface {
52
52
53 public:
53 public:
54 // get rid of warnings
55 virtual ~PythonQtImportFileInterface() {}
56
54 //! read the given file as byte array, without doing any linefeed translations
57 //! read the given file as byte array, without doing any linefeed translations
55 virtual QByteArray readFileAsBytes(const QString& filename) = 0;
58 virtual QByteArray readFileAsBytes(const QString& filename) = 0;
56
59
@@ -112,7 +112,7 PythonQtImport::module_info PythonQtImport::getModuleInfo(PythonQtImporter* self
112 /* PythonQtImporter.__init__
112 /* PythonQtImporter.__init__
113 Just store the path argument
113 Just store the path argument
114 */
114 */
115 int PythonQtImporter_init(PythonQtImporter *self, PyObject *args, PyObject *kwds)
115 int PythonQtImporter_init(PythonQtImporter *self, PyObject *args, PyObject * /*kwds*/)
116 {
116 {
117 self->_path = NULL;
117 self->_path = NULL;
118
118
@@ -205,8 +205,11 PythonQtImporter_load_module(PyObject *obj, PyObject *args)
205 }
205 }
206 dict = PyModule_GetDict(mod);
206 dict = PyModule_GetDict(mod);
207
207
208 if (PyDict_SetItemString(dict, "__loader__", (PyObject *)self) != 0)
208 if (PyDict_SetItemString(dict, "__loader__", (PyObject *)self) != 0) {
209 goto error;
209 Py_DECREF(code);
210 Py_DECREF(mod);
211 return NULL;
212 }
210
213
211 if (ispackage) {
214 if (ispackage) {
212 PyObject *pkgpath, *fullpath;
215 PyObject *pkgpath, *fullpath;
@@ -217,33 +220,38 PythonQtImporter_load_module(PyObject *obj, PyObject *args)
217 self->_path->toLatin1().constData(),
220 self->_path->toLatin1().constData(),
218 SEP,
221 SEP,
219 subname.toLatin1().constData());
222 subname.toLatin1().constData());
220 if (fullpath == NULL)
223 if (fullpath == NULL) {
221 goto error;
224 Py_DECREF(code);
225 Py_DECREF(mod);
226 return NULL;
227 }
222
228
223 pkgpath = Py_BuildValue("[O]", fullpath);
229 pkgpath = Py_BuildValue("[O]", fullpath);
224 Py_DECREF(fullpath);
230 Py_DECREF(fullpath);
225 if (pkgpath == NULL)
231 if (pkgpath == NULL) {
226 goto error;
232 Py_DECREF(code);
233 Py_DECREF(mod);
234 return NULL;
235 }
227 err = PyDict_SetItemString(dict, "__path__", pkgpath);
236 err = PyDict_SetItemString(dict, "__path__", pkgpath);
228 Py_DECREF(pkgpath);
237 Py_DECREF(pkgpath);
229 if (err != 0)
238 if (err != 0) {
230 goto error;
239 Py_DECREF(code);
240 Py_DECREF(mod);
241 return NULL;
242 }
231 }
243 }
232 mod = PyImport_ExecCodeModuleEx(fullname, code, (char*)modpath.toLatin1().data());
244 mod = PyImport_ExecCodeModuleEx(fullname, code, (char*)modpath.toLatin1().data());
233 Py_DECREF(code);
245 Py_DECREF(code);
234 if (Py_VerboseFlag)
246 if (Py_VerboseFlag)
235 PySys_WriteStderr("import %s # loaded from %s\n",
247 PySys_WriteStderr("import %s # loaded from %s\n",
236 fullname, modpath);
248 fullname, modpath.toLatin1().constData());
237 return mod;
249 return mod;
238 error:
239 Py_DECREF(code);
240 Py_DECREF(mod);
241 return NULL;
242 }
250 }
243
251
244
252
245 PyObject *
253 PyObject *
246 PythonQtImporter_get_data(PyObject *obj, PyObject *args)
254 PythonQtImporter_get_data(PyObject* /*obj*/, PyObject* /*args*/)
247 {
255 {
248 // EXTRA, NOT YET IMPLEMENTED
256 // EXTRA, NOT YET IMPLEMENTED
249 return NULL;
257 return NULL;
@@ -263,7 +271,7 PythonQtImporter_get_code(PyObject *obj, PyObject *args)
263 }
271 }
264
272
265 PyObject *
273 PyObject *
266 PythonQtImporter_get_source(PyObject *obj, PyObject *args)
274 PythonQtImporter_get_source(PyObject * /*obj*/, PyObject * /*args*/)
267 {
275 {
268 // EXTRA, NOT YET IMPLEMENTED
276 // EXTRA, NOT YET IMPLEMENTED
269 /*
277 /*
@@ -353,7 +361,7 PyMethodDef PythonQtImporter_methods[] = {
353 doc_get_code},
361 doc_get_code},
354 {"get_source", PythonQtImporter_get_source, METH_VARARGS,
362 {"get_source", PythonQtImporter_get_source, METH_VARARGS,
355 doc_get_source},
363 doc_get_source},
356 {NULL, NULL} /* sentinel */
364 {NULL, NULL, 0 , NULL} /* sentinel */
357 };
365 };
358
366
359
367
@@ -579,24 +587,11 PythonQtImport::compileSource(const QString& path, const QByteArray& data)
579 /* Return the code object for the module named by 'fullname' from the
587 /* Return the code object for the module named by 'fullname' from the
580 Zip archive as a new reference. */
588 Zip archive as a new reference. */
581 PyObject *
589 PyObject *
582 PythonQtImport::getCodeFromData(const QString& path, int isbytecode,int ispackage, time_t mtime)
590 PythonQtImport::getCodeFromData(const QString& path, int isbytecode,int /*ispackage*/, time_t mtime)
583 {
591 {
584 bool hasImporter = PythonQt::importInterface()!=NULL;
585
586 PyObject *code;
592 PyObject *code;
587
593
588 QByteArray qdata;
594 QByteArray qdata;
589 if (!hasImporter) {
590 QFile file(path);
591 QIODevice::OpenMode flags = QIODevice::ReadOnly;
592 if (!isbytecode) {
593 flags |= QIODevice::Text;
594 }
595 if (!file.open(flags)) {
596 return NULL;
597 }
598 qdata = file.readAll();
599 } else {
600 if (!isbytecode) {
595 if (!isbytecode) {
601 // mlabDebugConst("MLABPython", "reading source " << path);
596 // mlabDebugConst("MLABPython", "reading source " << path);
602 bool ok;
597 bool ok;
@@ -611,7 +606,6 PythonQtImport::getCodeFromData(const QString& path, int isbytecode,int ispackag
611 } else {
606 } else {
612 qdata = PythonQt::importInterface()->readFileAsBytes(path);
607 qdata = PythonQt::importInterface()->readFileAsBytes(path);
613 }
608 }
614 }
615
609
616 if (isbytecode) {
610 if (isbytecode) {
617 // mlabDebugConst("MLABPython", "reading bytecode " << path);
611 // mlabDebugConst("MLABPython", "reading bytecode " << path);
@@ -623,7 +617,7 PythonQtImport::getCodeFromData(const QString& path, int isbytecode,int ispackag
623 if (code) {
617 if (code) {
624 // save a pyc file if possible
618 // save a pyc file if possible
625 QDateTime time;
619 QDateTime time;
626 time = hasImporter?PythonQt::importInterface()->lastModifiedDate(path):QFileInfo(path).lastModified();
620 time = PythonQt::importInterface()->lastModifiedDate(path);
627 writeCompiledModule((PyCodeObject*)code, path+"c", time.toTime_t());
621 writeCompiledModule((PyCodeObject*)code, path+"c", time.toTime_t());
628 }
622 }
629 }
623 }
@@ -637,16 +631,10 PythonQtImport::getMTimeOfSource(const QString& path)
637 QString path2 = path;
631 QString path2 = path;
638 path2.truncate(path.length()-1);
632 path2.truncate(path.length()-1);
639
633
640 bool hasImporter = PythonQt::importInterface()!=NULL;
634 if (PythonQt::importInterface()->exists(path2)) {
641 if (hasImporter) {
635 mtime = PythonQt::importInterface()->lastModifiedDate(path2).toTime_t();
642 if (PythonQt::importInterface()->exists(path2)) {
643 mtime = PythonQt::importInterface()->lastModifiedDate(path2).toTime_t();
644 }
645 } else {
646 if (QFile::exists(path2)) {
647 mtime = QFileInfo(path2).lastModified().toTime_t();
648 }
649 }
636 }
637
650 return mtime;
638 return mtime;
651 }
639 }
652
640
@@ -708,13 +696,10 QString PythonQtImport::replaceExtension(const QString& str, const QString& ext)
708
696
709 PyObject* PythonQtImport::getCodeFromPyc(const QString& file)
697 PyObject* PythonQtImport::getCodeFromPyc(const QString& file)
710 {
698 {
711 bool hasImporter = PythonQt::importInterface()!=NULL;
712
713 PyObject* code;
699 PyObject* code;
714 const static QString pycStr("pyc");
700 const static QString pycStr("pyc");
715 QString pyc = replaceExtension(file, pycStr);
701 QString pyc = replaceExtension(file, pycStr);
716 if ((hasImporter && PythonQt::importInterface()->exists(pyc)) ||
702 if (PythonQt::importInterface()->exists(pyc)) {
717 (!hasImporter && QFile::exists(pyc))) {
718 time_t mtime = 0;
703 time_t mtime = 0;
719 mtime = getMTimeOfSource(pyc);
704 mtime = getMTimeOfSource(pyc);
720 code = getCodeFromData(pyc, true, false, mtime);
705 code = getCodeFromData(pyc, true, false, mtime);
@@ -732,10 +717,16 PyObject* PythonQtImport::getCodeFromPyc(const QString& file)
732 /* Module init */
717 /* Module init */
733
718
734 PyDoc_STRVAR(mlabimport_doc,
719 PyDoc_STRVAR(mlabimport_doc,
735 "Imports python files into MeVisLab, completely replaces internal python import");
720 "Imports python files into PythonQt, completely replaces internal python import");
736
721
737 void PythonQtImport::init()
722 void PythonQtImport::init()
738 {
723 {
724 static bool first = true;
725 if (!first) {
726 return;
727 }
728 first = false;
729
739 PyObject *mod;
730 PyObject *mod;
740
731
741 if (PyType_Ready(&PythonQtImporter_Type) < 0)
732 if (PyType_Ready(&PythonQtImporter_Type) < 0)
@@ -778,7 +769,7 void PythonQtImport::init()
778 PyObject* classobj = PyDict_GetItemString(PyModule_GetDict(mod), "PythonQtImporter");
769 PyObject* classobj = PyDict_GetItemString(PyModule_GetDict(mod), "PythonQtImporter");
779 PyObject* path_hooks = PySys_GetObject("path_hooks");
770 PyObject* path_hooks = PySys_GetObject("path_hooks");
780 PyList_Append(path_hooks, classobj);
771 PyList_Append(path_hooks, classobj);
781
772
782 #ifndef WIN32
773 #ifndef WIN32
783 // reload the encodings module, because it might fail to custom import requirements (e.g. encryption).
774 // reload the encodings module, because it might fail to custom import requirements (e.g. encryption).
784 PyObject* modules = PyImport_GetModuleDict();
775 PyObject* modules = PyImport_GetModuleDict();
@@ -52,7 +52,7 static void PythonQtMetaObjectWrapper_dealloc(PythonQtMetaObjectWrapper* self)
52 self->ob_type->tp_free((PyObject*)self);
52 self->ob_type->tp_free((PyObject*)self);
53 }
53 }
54
54
55 static PyObject* PythonQtMetaObjectWrapper_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
55 static PyObject* PythonQtMetaObjectWrapper_new(PyTypeObject *type, PyObject * /*args*/, PyObject * /*kwds*/)
56 {
56 {
57 PythonQtMetaObjectWrapper *self;
57 PythonQtMetaObjectWrapper *self;
58
58
@@ -63,7 +63,7 static PyObject* PythonQtMetaObjectWrapper_new(PyTypeObject *type, PyObject *arg
63 return (PyObject *)self;
63 return (PyObject *)self;
64 }
64 }
65
65
66 static int PythonQtMetaObjectWrapper_init(PythonQtMetaObjectWrapper *self, PyObject *args, PyObject *kwds)
66 static int PythonQtMetaObjectWrapper_init(PythonQtMetaObjectWrapper * /*self*/, PyObject * /*args*/, PyObject * /*kwds*/)
67 {
67 {
68 return 0;
68 return 0;
69 }
69 }
@@ -123,7 +123,7 static PyMethodDef PythonQtMetaObjectWrapper_methods[] = {
123 {"help", (PyCFunction)PythonQtMetaObjectWrapper_help, METH_NOARGS,
123 {"help", (PyCFunction)PythonQtMetaObjectWrapper_help, METH_NOARGS,
124 "Shows the help of available methods for this class"
124 "Shows the help of available methods for this class"
125 },
125 },
126 {NULL} /* Sentinel */
126 {NULL, NULL, 0 , NULL} /* Sentinel */
127 };
127 };
128
128
129
129
@@ -70,6 +70,9 typedef struct {
70 // an abstact class for handling construction of objects
70 // an abstact class for handling construction of objects
71 class PythonQtConstructorHandler {
71 class PythonQtConstructorHandler {
72 public:
72 public:
73 //! get rid of warnings
74 virtual ~PythonQtConstructorHandler() {}
75
73 virtual QObject* create(const QMetaObject* meta, PyObject *args, PyObject *kw, QString& error) = 0;
76 virtual QObject* create(const QMetaObject* meta, PyObject *args, PyObject *kw, QString& error) = 0;
74 };
77 };
75
78
@@ -79,6 +79,7 public:
79 foreach(chunk, _chunks) {
79 foreach(chunk, _chunks) {
80 delete[]chunk;
80 delete[]chunk;
81 }
81 }
82 _chunks.clear();
82 }
83 }
83
84
84 //! reset the storage to 0 (without freeing memory, thus caching old entries for reuse)
85 //! reset the storage to 0 (without freeing memory, thus caching old entries for reuse)
@@ -178,7 +178,7 PyObject *PythonQtSlotFunction_Call(PyObject *func, PyObject *args, PyObject *kw
178 }
178 }
179 }
179 }
180
180
181 PyObject *PythonQtSlotFunction_CallImpl(QObject* objectToCall, PythonQtSlotInfo* info, PyObject *args, PyObject *kw, bool isVariantCall, void* firstArg)
181 PyObject *PythonQtSlotFunction_CallImpl(QObject* objectToCall, PythonQtSlotInfo* info, PyObject *args, PyObject * /*kw*/, bool isVariantCall, void* firstArg)
182 {
182 {
183 int argc = PyTuple_Size(args);
183 int argc = PyTuple_Size(args);
184
184
@@ -298,14 +298,14 meth_dealloc(PythonQtSlotFunctionObject *m)
298 }
298 }
299
299
300 static PyObject *
300 static PyObject *
301 meth_get__doc__(PythonQtSlotFunctionObject *m, void *closure)
301 meth_get__doc__(PythonQtSlotFunctionObject * /*m*/, void * /*closure*/)
302 {
302 {
303 Py_INCREF(Py_None);
303 Py_INCREF(Py_None);
304 return Py_None;
304 return Py_None;
305 }
305 }
306
306
307 static PyObject *
307 static PyObject *
308 meth_get__name__(PythonQtSlotFunctionObject *m, void *closure)
308 meth_get__name__(PythonQtSlotFunctionObject *m, void * /*closure*/)
309 {
309 {
310 return PyString_FromString(m->m_ml->metaMethod()->signature());
310 return PyString_FromString(m->m_ml->metaMethod()->signature());
311 }
311 }
@@ -328,7 +328,7 meth_traverse(PythonQtSlotFunctionObject *m, visitproc visit, void *arg)
328 }
328 }
329
329
330 static PyObject *
330 static PyObject *
331 meth_get__self__(PythonQtSlotFunctionObject *m, void *closure)
331 meth_get__self__(PythonQtSlotFunctionObject *m, void * /*closure*/)
332 {
332 {
333 PyObject *self;
333 PyObject *self;
334 if (PyEval_GetRestricted()) {
334 if (PyEval_GetRestricted()) {
@@ -347,13 +347,17 static PyGetSetDef meth_getsets [] = {
347 {"__doc__", (getter)meth_get__doc__, NULL, NULL},
347 {"__doc__", (getter)meth_get__doc__, NULL, NULL},
348 {"__name__", (getter)meth_get__name__, NULL, NULL},
348 {"__name__", (getter)meth_get__name__, NULL, NULL},
349 {"__self__", (getter)meth_get__self__, NULL, NULL},
349 {"__self__", (getter)meth_get__self__, NULL, NULL},
350 {0}
350 {NULL, NULL, NULL,NULL},
351 };
351 };
352
352
353 #if PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION < 6
354 #define PY_WRITE_RESTRICTED WRITE_RESTRICTED
355 #endif
356
353 #define OFF(x) offsetof(PythonQtSlotFunctionObject, x)
357 #define OFF(x) offsetof(PythonQtSlotFunctionObject, x)
354
358
355 static PyMemberDef meth_members[] = {
359 static PyMemberDef meth_members[] = {
356 {"__module__", T_OBJECT, OFF(m_module), WRITE_RESTRICTED},
360 {"__module__", T_OBJECT, OFF(m_module), PY_WRITE_RESTRICTED},
357 {NULL}
361 {NULL}
358 };
362 };
359
363
@@ -41,7 +41,7
41
41
42 #include "PythonQtStdOut.h"
42 #include "PythonQtStdOut.h"
43
43
44 static PyObject *PythonQtStdOutRedirect_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
44 static PyObject *PythonQtStdOutRedirect_new(PyTypeObject *type, PyObject * /*args*/, PyObject * /*kwds*/)
45 {
45 {
46 PythonQtStdOutRedirect *self;
46 PythonQtStdOutRedirect *self;
47 self = (PythonQtStdOutRedirect *)type->tp_alloc(type, 0);
47 self = (PythonQtStdOutRedirect *)type->tp_alloc(type, 0);
@@ -70,7 +70,7 static PyObject *PythonQtStdOutRedirect_write(PyObject *self, PyObject *args)
70 return Py_BuildValue("");
70 return Py_BuildValue("");
71 }
71 }
72
72
73 static PyObject *PythonQtStdOutRedirect_flush(PyObject *self, PyObject *args)
73 static PyObject *PythonQtStdOutRedirect_flush(PyObject * /*self*/, PyObject * /*args*/)
74 {
74 {
75 return Py_BuildValue("");
75 return Py_BuildValue("");
76 }
76 }
@@ -83,7 +83,7 static PyMethodDef PythonQtStdOutRedirect_methods[] = {
83 {"flush", (PyCFunction)PythonQtStdOutRedirect_flush, METH_VARARGS,
83 {"flush", (PyCFunction)PythonQtStdOutRedirect_flush, METH_VARARGS,
84 "flush the output, currently not implemented but needed for logging framework"
84 "flush the output, currently not implemented but needed for logging framework"
85 },
85 },
86 {NULL} /* Sentinel */
86 {NULL, NULL, 0 , NULL} /* sentinel */
87 };
87 };
88
88
89 static PyMemberDef PythonQtStdOutRedirect_members[] = {
89 static PyMemberDef PythonQtStdOutRedirect_members[] = {
@@ -58,7 +58,7 static void PythonQtVariantWrapper_dealloc(PythonQtVariantWrapper* self)
58 self->ob_type->tp_free((PyObject*)self);
58 self->ob_type->tp_free((PyObject*)self);
59 }
59 }
60
60
61 static PyObject* PythonQtVariantWrapper_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
61 static PyObject* PythonQtVariantWrapper_new(PyTypeObject *type, PyObject * /*args*/, PyObject * /*kwds*/)
62 {
62 {
63 PythonQtVariantWrapper *self;
63 PythonQtVariantWrapper *self;
64
64
@@ -70,7 +70,7 static PyObject* PythonQtVariantWrapper_new(PyTypeObject *type, PyObject *args,
70 return (PyObject *)self;
70 return (PyObject *)self;
71 }
71 }
72
72
73 static int PythonQtVariantWrapper_init(PythonQtVariantWrapper *self, PyObject *args, PyObject *kwds)
73 static int PythonQtVariantWrapper_init(PythonQtVariantWrapper * /*self*/, PyObject * /*args*/, PyObject * /*kwds*/)
74 {
74 {
75 return 0;
75 return 0;
76 }
76 }
@@ -93,7 +93,7 static PyMethodDef PythonQtVariantWrapper_methods[] = {
93 {"help", (PyCFunction)PythonQtVariantWrapper_help, METH_NOARGS,
93 {"help", (PyCFunction)PythonQtVariantWrapper_help, METH_NOARGS,
94 "Shows the help of available methods for this class"
94 "Shows the help of available methods for this class"
95 },
95 },
96 {NULL} /* Sentinel */
96 {NULL,NULL,0,NULL} /* Sentinel */
97 };
97 };
98
98
99
99
@@ -91,7 +91,7 static void PythonQtWrapper_dealloc(PythonQtWrapper* self)
91 self->ob_type->tp_free((PyObject*)self);
91 self->ob_type->tp_free((PyObject*)self);
92 }
92 }
93
93
94 static PyObject* PythonQtWrapper_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
94 static PyObject* PythonQtWrapper_new(PyTypeObject *type, PyObject * /*args*/, PyObject * /*kwds*/)
95 {
95 {
96 PythonQtWrapper *self;
96 PythonQtWrapper *self;
97
97
@@ -105,7 +105,7 static PyObject* PythonQtWrapper_new(PyTypeObject *type, PyObject *args, PyObjec
105 return (PyObject *)self;
105 return (PyObject *)self;
106 }
106 }
107
107
108 static int PythonQtWrapper_init(PythonQtWrapper *self, PyObject *args, PyObject *kwds)
108 static int PythonQtWrapper_init(PythonQtWrapper * /*self*/, PyObject * /*args*/, PyObject * /*kwds*/)
109 {
109 {
110 return 0;
110 return 0;
111 }
111 }
@@ -128,7 +128,7 static PyMethodDef PythonQtWrapper_methods[] = {
128 {"help", (PyCFunction)PythonQtWrapper_help, METH_NOARGS,
128 {"help", (PyCFunction)PythonQtWrapper_help, METH_NOARGS,
129 "Shows the help of available methods for this class"
129 "Shows the help of available methods for this class"
130 },
130 },
131 {NULL} /* Sentinel */
131 {NULL, NULL, 0, NULL} /* Sentinel */
132 };
132 };
133
133
134
134
@@ -164,6 +164,9 static PyObject *PythonQtWrapper_getattro(PyObject *obj,PyObject *name)
164 case PythonQtMemberInfo::EnumValue:
164 case PythonQtMemberInfo::EnumValue:
165 return PyInt_FromLong(member._enumValue);
165 return PyInt_FromLong(member._enumValue);
166 break;
166 break;
167 default:
168 // is an invalid type, go on
169 break;
167 }
170 }
168
171
169 // look for the interal methods (className(), help())
172 // look for the interal methods (className(), help())
@@ -18,6 +18,7 HEADERS += \
18 $$PWD/PythonQtCppWrapperFactory.h \
18 $$PWD/PythonQtCppWrapperFactory.h \
19 $$PWD/PythonQtVariants.h \
19 $$PWD/PythonQtVariants.h \
20 $$PWD/PythonQtVariantWrapper.h \
20 $$PWD/PythonQtVariantWrapper.h \
21 $$PWD/PythonQtQFileImporter.h \
21 $$PWD/wrapper/PythonQtWrappedVariants.h \
22 $$PWD/wrapper/PythonQtWrappedVariants.h \
22 $$PWD/gui/PythonQtScriptingConsole.h \
23 $$PWD/gui/PythonQtScriptingConsole.h \
23 $$PWD/PythonQtSystem.h
24 $$PWD/PythonQtSystem.h
@@ -37,6 +38,7 SOURCES += \
37 $$PWD/PythonQtVariants.cpp \
38 $$PWD/PythonQtVariants.cpp \
38 $$PWD/PythonQtVariantWrapper.cpp \
39 $$PWD/PythonQtVariantWrapper.cpp \
39 $$PWD/PythonQtWrapper.cpp \
40 $$PWD/PythonQtWrapper.cpp \
41 $$PWD/PythonQtQFileImporter.cpp \
40 $$PWD/PythonQtMetaObjectWrapper.cpp \
42 $$PWD/PythonQtMetaObjectWrapper.cpp \
41 $$PWD/gui/PythonQtScriptingConsole.cpp
43 $$PWD/gui/PythonQtScriptingConsole.cpp
42
44
1 NO CONTENT: file was removed
NO CONTENT: file was removed
1 NO CONTENT: file was removed
NO CONTENT: file was removed
General Comments 0
You need to be logged in to leave comments. Login now