From 349fb638ffe0fba316d0452c2568083c87be15ba 2011-11-14 10:14:50 From: florianlink Date: 2011-11-14 10:14:50 Subject: [PATCH] merged contributions from https://github.com/commontk/PythonQt/compare/svn-mirror...patched changed polymorphichandler char** to const char** git-svn-id: svn://svn.code.sf.net/p/pythonqt/code/trunk@202 ea8d5007-eb21-0410-b261-ccb3ea6e24a9 --- diff --git a/src/PythonQt.h b/src/PythonQt.h index 9944ae5..a015d8e 100644 --- a/src/PythonQt.h +++ b/src/PythonQt.h @@ -68,7 +68,7 @@ class PythonQtQFileImporter; typedef void PythonQtQObjectWrappedCB(QObject* object); typedef void PythonQtQObjectNoLongerWrappedCB(QObject* object); -typedef void* PythonQtPolymorphicHandlerCB(const void *ptr, char **class_name); +typedef void* PythonQtPolymorphicHandlerCB(const void *ptr, const char **class_name); typedef void PythonQtShellSetInstanceWrapperCB(void* object, PythonQtInstanceWrapper* wrapper); diff --git a/src/PythonQtClassInfo.cpp b/src/PythonQtClassInfo.cpp index 287f95f..691b440 100644 --- a/src/PythonQtClassInfo.cpp +++ b/src/PythonQtClassInfo.cpp @@ -159,7 +159,7 @@ PythonQtSlotInfo* PythonQtClassInfo::recursiveFindDecoratorSlotsFromDecoratorPro PythonQtSlotInfo* PythonQtClassInfo::findDecoratorSlotsFromDecoratorProvider(const char* memberName, PythonQtSlotInfo* tail, bool &found, QHash& memberCache, int upcastingOffset) { QObject* decoratorProvider = decorator(); - int memberNameLen = strlen(memberName); + int memberNameLen = static_cast(strlen(memberName)); if (decoratorProvider) { //qDebug()<< "looking " << decoratorProvider->metaObject()->className() << " " << memberName << " " << upcastingOffset; const QMetaObject* meta = decoratorProvider->metaObject(); @@ -212,7 +212,7 @@ PythonQtSlotInfo* PythonQtClassInfo::findDecoratorSlotsFromDecoratorProvider(con bool PythonQtClassInfo::lookForMethodAndCache(const char* memberName) { bool found = false; - int memberNameLen = strlen(memberName); + int memberNameLen = static_cast(strlen(memberName)); PythonQtSlotInfo* tail = NULL; if (_meta) { int numMethods = _meta->methodCount(); @@ -730,7 +730,7 @@ bool PythonQtClassInfo::hasOwnerMethodButNoOwner(void* object) } } -void* PythonQtClassInfo::recursiveCastDownIfPossible(void* ptr, char** resultClassName) +void* PythonQtClassInfo::recursiveCastDownIfPossible(void* ptr, const char** resultClassName) { if (!_polymorphicHandlers.isEmpty()) { foreach(PythonQtPolymorphicHandlerCB* cb, _polymorphicHandlers) { @@ -753,7 +753,7 @@ void* PythonQtClassInfo::recursiveCastDownIfPossible(void* ptr, char** resultCla void* PythonQtClassInfo::castDownIfPossible(void* ptr, PythonQtClassInfo** resultClassInfo) { - char* className; + const char* className; // this would do downcasting recursively... // void* resultPtr = recursiveCastDownIfPossible(ptr, &className); diff --git a/src/PythonQtClassInfo.h b/src/PythonQtClassInfo.h index 72e032a..e8d532e 100644 --- a/src/PythonQtClassInfo.h +++ b/src/PythonQtClassInfo.h @@ -213,7 +213,7 @@ private: //! clear all cached members void clearCachedMembers(); - void* recursiveCastDownIfPossible(void* ptr, char** resultClassName); + void* recursiveCastDownIfPossible(void* ptr, const char** resultClassName); PythonQtSlotInfo* findDecoratorSlotsFromDecoratorProvider(const char* memberName, PythonQtSlotInfo* inputInfo, bool &found, QHash& memberCache, int upcastingOffset); void listDecoratorSlotsFromDecoratorProvider(QStringList& list, bool metaOnly); diff --git a/src/PythonQtCppWrapperFactory.h b/src/PythonQtCppWrapperFactory.h index 6d1b3e2..ff9cdbd 100644 --- a/src/PythonQtCppWrapperFactory.h +++ b/src/PythonQtCppWrapperFactory.h @@ -59,3 +59,4 @@ public: }; #endif + diff --git a/src/PythonQtImportFileInterface.h b/src/PythonQtImportFileInterface.h index f89bb46..b3871e9 100644 --- a/src/PythonQtImportFileInterface.h +++ b/src/PythonQtImportFileInterface.h @@ -73,3 +73,4 @@ public: }; #endif + diff --git a/src/PythonQtMethodInfo.cpp b/src/PythonQtMethodInfo.cpp index dfa248d..dddcca9 100644 --- a/src/PythonQtMethodInfo.cpp +++ b/src/PythonQtMethodInfo.cpp @@ -288,14 +288,14 @@ QString PythonQtSlotInfo::fullSignature() if (_type == ClassDecorator) { if (sig.startsWith("new_")) { - sig = sig.mid(strlen("new_")); + sig = sig.mid(4); isConstructor = true; } else if (sig.startsWith("delete_")) { - sig = sig.mid(strlen("delete_")); + sig = sig.mid(7); isDestructor = true; } else if(sig.startsWith("static_")) { isStatic = true; - sig = sig.mid(strlen("static_")); + sig = sig.mid(7); int idx = sig.indexOf("_"); if (idx>=0) { sig = sig.mid(idx+1); diff --git a/src/PythonQtPythonInclude.h b/src/PythonQtPythonInclude.h new file mode 100644 index 0000000..6f3b5d8 --- /dev/null +++ b/src/PythonQtPythonInclude.h @@ -0,0 +1,55 @@ +/* + * + * Copyright (C) 2011 MeVis Medical Solutions AG All Rights Reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * Further, this software is distributed without any warranty that it is + * free of the rightful claim of any third person regarding infringement + * or the like. Any license provided herein, whether implied or + * otherwise, applies only to this software file. Patent licenses, if + * any, provided herein do not apply to combinations of this program with + * other software, or any other product whatsoever. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Contact information: MeVis Medical Solutions AG, Universitaetsallee 29, + * 28359 Bremen, Germany or: + * + * http://www.mevis.de + * + */ + +#ifndef __PythonQtPythonInclude_h +#define __PythonQtPythonInclude_h + +// Undefine macros that Python.h defines to avoid redefinition warning. +#undef _POSIX_C_SOURCE +#undef _POSIX_THREADS +#undef _XOPEN_SOURCE + +// If PYTHONQT_USE_RELEASE_PYTHON_FALLBACK is enabled, try to link +// release Python DLL if it is available by undefining _DEBUG while +// including Python.h +#if defined(PYTHONQT_USE_RELEASE_PYTHON_FALLBACK) && defined(_DEBUG) +#undef _DEBUG +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#define _CRT_NOFORCE_MANIFEST 1 +#endif +#include +#define _DEBUG +#else +#include +#endif + +#endif diff --git a/src/PythonQtStdIn.cpp b/src/PythonQtStdIn.cpp new file mode 100644 index 0000000..653e2e6 --- /dev/null +++ b/src/PythonQtStdIn.cpp @@ -0,0 +1,114 @@ +/* + * + * Copyright (C) 2011 MeVis Medical Solutions AG All Rights Reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * Further, this software is distributed without any warranty that it is + * free of the rightful claim of any third person regarding infringement + * or the like. Any license provided herein, whether implied or + * otherwise, applies only to this software file. Patent licenses, if + * any, provided herein do not apply to combinations of this program with + * other software, or any other product whatsoever. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Contact information: MeVis Medical Solutions AG, Universitaetsallee 29, + * 28359 Bremen, Germany or: + * + * http://www.mevis.de + * + */ + +//---------------------------------------------------------------------------------- +/*! +// \file PythonQtStdIn.cpp +// \author Jean-Christophe Fillion-Robin +// \author Last changed by $Author: jcfr $ +// \date 2011 +*/ +//---------------------------------------------------------------------------------- + +#include "PythonQtStdIn.h" + +static PyObject *PythonQtStdInRedirect_new(PyTypeObject *type, PyObject * /*args*/, PyObject * /*kwds*/) +{ + PythonQtStdInRedirect *self; + self = (PythonQtStdInRedirect *)type->tp_alloc(type, 0); + self->_cb = NULL; + self->_callData = NULL; + + return (PyObject *)self; +} + +static PyObject *PythonQtStdInRedirect_readline(PyObject * self, PyObject * args) +{ + PythonQtStdInRedirect* s = (PythonQtStdInRedirect*)self; + QString string; + if (s->_cb) { + string = (*s->_cb)(s->_callData); + } + return Py_BuildValue(const_cast("s"), const_cast(string.toAscii().data())); +} + +static PyMethodDef PythonQtStdInRedirect_methods[] = { + {"readline", (PyCFunction)PythonQtStdInRedirect_readline, METH_VARARGS, + "read input line"}, + {NULL, NULL, 0 , NULL} /* sentinel */ +}; + +static PyMemberDef PythonQtStdInRedirect_members[] = { + {NULL} /* Sentinel */ +}; + +PyTypeObject PythonQtStdInRedirectType = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "PythonQtStdInRedirect", /*tp_name*/ + sizeof(PythonQtStdInRedirect), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + 0, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ + "PythonQtStdInRedirect", /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + PythonQtStdInRedirect_methods, /* tp_methods */ + PythonQtStdInRedirect_members, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + PythonQtStdInRedirect_new, /* tp_new */ +}; diff --git a/src/PythonQtStdIn.h b/src/PythonQtStdIn.h new file mode 100644 index 0000000..8377e0d --- /dev/null +++ b/src/PythonQtStdIn.h @@ -0,0 +1,63 @@ +#ifndef _PYTHONQTSTDIN_H +#define _PYTHONQTSTDIN_H + +/* + * + * Copyright (C) 2011 MeVis Medical Solutions AG All Rights Reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * Further, this software is distributed without any warranty that it is + * free of the rightful claim of any third person regarding infringement + * or the like. Any license provided herein, whether implied or + * otherwise, applies only to this software file. Patent licenses, if + * any, provided herein do not apply to combinations of this program with + * other software, or any other product whatsoever. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Contact information: MeVis Medical Solutions AG, Universitaetsallee 29, + * 28359 Bremen, Germany or: + * + * http://www.mevis.de + * + */ + +//---------------------------------------------------------------------------------- +/*! +// \file PythonQtStdIn.h +// \author Jean-Christophe Fillion-Robin +// \author Last changed by $Author: jcfr $ +// \date 2011 +*/ +//---------------------------------------------------------------------------------- + + +#include "PythonQtPythonInclude.h" +#include "structmember.h" +#include + +//! declares the type of the stdout redirection class +extern PyTypeObject PythonQtStdInRedirectType; + +//! declares the callback that is called from the write() function +typedef QString PythonQtInputChangedCB(void* callData); + +//! declares the stdin redirection class +typedef struct { + PyObject_HEAD + PythonQtInputChangedCB* _cb; + void * _callData; +} PythonQtStdInRedirect; + +#endif diff --git a/src/src.pri b/src/src.pri index a19fe17..dbf0a18 100644 --- a/src/src.pri +++ b/src/src.pri @@ -7,6 +7,7 @@ HEADERS += \ $$PWD/PythonQtImporter.h \ $$PWD/PythonQtObjectPtr.h \ $$PWD/PythonQtSlot.h \ + $$PWD/PythonQtStdIn.h \ $$PWD/PythonQtStdOut.h \ $$PWD/PythonQtMisc.h \ $$PWD/PythonQtMethodInfo.h \ @@ -28,6 +29,7 @@ SOURCES += \ $$PWD/PythonQtClassInfo.cpp \ $$PWD/PythonQtImporter.cpp \ $$PWD/PythonQtObjectPtr.cpp \ + $$PWD/PythonQtStdIn.cpp \ $$PWD/PythonQtStdOut.cpp \ $$PWD/PythonQtSlot.cpp \ $$PWD/PythonQtMisc.cpp \