Go to the documentation of this file.00001 #ifndef _PYTHONQTCLASSINFO_H
00002 #define _PYTHONQTCLASSINFO_H
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include <QMetaObject>
00037 #include <QMetaMethod>
00038 #include <QHash>
00039 #include <QByteArray>
00040 #include <QList>
00041 #include "PythonQt.h"
00042
00043 class PythonQtSlotInfo;
00044
00045 struct PythonQtMemberInfo {
00046 enum Type {
00047 Invalid, Slot, EnumValue, EnumWrapper, Property, NotFound
00048 };
00049
00050 PythonQtMemberInfo():_type(Invalid),_slot(NULL),_enumWrapper(NULL),_enumValue(0) { }
00051
00052 PythonQtMemberInfo(PythonQtSlotInfo* info) {
00053 _type = Slot;
00054 _slot = info;
00055 _enumValue = NULL;
00056 }
00057
00058 PythonQtMemberInfo(const PythonQtObjectPtr& enumValue) {
00059 _type = EnumValue;
00060 _slot = NULL;
00061 _enumValue = enumValue;
00062 _enumWrapper = NULL;
00063 }
00064
00065 PythonQtMemberInfo(const QMetaProperty& prop) {
00066 _type = Property;
00067 _slot = NULL;
00068 _enumValue = NULL;
00069 _property = prop;
00070 _enumWrapper = NULL;
00071 }
00072
00073 Type _type;
00074
00075
00076 PythonQtSlotInfo* _slot;
00077 PyObject* _enumWrapper;
00078 PythonQtObjectPtr _enumValue;
00079 QMetaProperty _property;
00080 };
00081
00083
00085 class PYTHONQT_EXPORT PythonQtClassInfo {
00086
00087 public:
00088 PythonQtClassInfo();
00089 ~PythonQtClassInfo();
00090
00092 struct ParentClassInfo {
00093 ParentClassInfo(PythonQtClassInfo* parent, int upcastingOffset=0):_parent(parent),_upcastingOffset(upcastingOffset)
00094 {};
00095
00096 PythonQtClassInfo* _parent;
00097 int _upcastingOffset;
00098 };
00099
00100
00102 void setupQObject(const QMetaObject* meta);
00103
00105 void setupCPPObject(const QByteArray& classname);
00106
00108 void setTypeSlots(int typeSlots) { _typeSlots = typeSlots; }
00110 int typeSlots() const { return _typeSlots; }
00111
00113 PythonQtMemberInfo member(const char* member);
00114
00116 PythonQtSlotInfo* constructors();
00117
00119 PythonQtSlotInfo* destructor();
00120
00122 void addConstructor(PythonQtSlotInfo* info);
00123
00125 void setDestructor(PythonQtSlotInfo* info);
00126
00128 void addDecoratorSlot(PythonQtSlotInfo* info);
00129
00131 const char* className();
00132
00134 bool isQObject() { return _isQObject; }
00135
00137 bool isCPPWrapper() { return !_isQObject; }
00138
00140 const QMetaObject* metaObject() { return _meta; }
00141
00143 void setMetaObject(const QMetaObject* meta);
00144
00146 bool inherits(const char* classname);
00147
00149 bool inherits(PythonQtClassInfo* info);
00150
00154 void* castTo(void* ptr, const char* classname);
00155
00157 QString help();
00158
00160 QStringList propertyList();
00161
00163 QStringList memberList(bool metaOnly = false);
00164
00166 int metaTypeId() { return _metaTypeId; }
00167
00169 void setDecoratorProvider(PythonQtQObjectCreatorFunctionCB* cb) { _decoratorProviderCB = cb; _decoratorProvider = NULL; }
00170
00172 QObject* decorator();
00173
00175 void addParentClass(const ParentClassInfo& info) { _parentClasses.append(info); }
00176
00178 bool hasOwnerMethodButNoOwner(void* object);
00179
00181 void setPythonQtClassWrapper(PyObject* obj) { _pythonQtClassWrapper = obj; }
00182
00184 PyObject* pythonQtClassWrapper() { return _pythonQtClassWrapper; }
00185
00187 void setShellSetInstanceWrapperCB(PythonQtShellSetInstanceWrapperCB* cb) {
00188 _shellSetInstanceWrapperCB = cb;
00189 }
00190
00192 PythonQtShellSetInstanceWrapperCB* shellSetInstanceWrapperCB() {
00193 return _shellSetInstanceWrapperCB;
00194 }
00195
00197 void addPolymorphicHandler(PythonQtPolymorphicHandlerCB* cb) { _polymorphicHandlers.append(cb); }
00198
00200 void* castDownIfPossible(void* ptr, PythonQtClassInfo** resultClassInfo);
00201
00203 static PyObject* findEnumWrapper(const QByteArray& name, PythonQtClassInfo* localScope, bool* isLocalEnum = NULL);
00204
00205 private:
00206 void createEnumWrappers();
00207 void createEnumWrappers(const QMetaObject* meta);
00208 PyObject* findEnumWrapper(const char* name);
00209
00211 void clearCachedMembers();
00212
00213 void* recursiveCastDownIfPossible(void* ptr, char** resultClassName);
00214
00215 PythonQtSlotInfo* findDecoratorSlotsFromDecoratorProvider(const char* memberName, PythonQtSlotInfo* inputInfo, bool &found, QHash<QByteArray, PythonQtMemberInfo>& memberCache, int upcastingOffset);
00216 void listDecoratorSlotsFromDecoratorProvider(QStringList& list, bool metaOnly);
00217 PythonQtSlotInfo* recursiveFindDecoratorSlotsFromDecoratorProvider(const char* memberName, PythonQtSlotInfo* inputInfo, bool &found, QHash<QByteArray, PythonQtMemberInfo>& memberCache, int upcastingOffset);
00218
00219 void recursiveCollectClassInfos(QList<PythonQtClassInfo*>& classInfoObjects);
00220 void recursiveCollectDecoratorObjects(QList<QObject*>& decoratorObjects);
00221
00222 bool lookForPropertyAndCache(const char* memberName);
00223 bool lookForMethodAndCache(const char* memberName);
00224 bool lookForEnumAndCache(const QMetaObject* m, const char* memberName);
00225
00226 PythonQtSlotInfo* findDecoratorSlots(const char* memberName, int memberNameLen, PythonQtSlotInfo* tail, bool &found, QHash<QByteArray, PythonQtMemberInfo>& memberCache, int upcastingOffset);
00227 int findCharOffset(const char* sigStart, char someChar);
00228
00229 QHash<QByteArray, PythonQtMemberInfo> _cachedMembers;
00230
00231 PythonQtSlotInfo* _constructors;
00232 PythonQtSlotInfo* _destructor;
00233 QList<PythonQtSlotInfo*> _decoratorSlots;
00234
00235 QList<PythonQtObjectPtr> _enumWrappers;
00236
00237 const QMetaObject* _meta;
00238
00239 QByteArray _wrappedClassName;
00240 QList<ParentClassInfo> _parentClasses;
00241
00242 QList<PythonQtPolymorphicHandlerCB*> _polymorphicHandlers;
00243
00244 QObject* _decoratorProvider;
00245 PythonQtQObjectCreatorFunctionCB* _decoratorProviderCB;
00246
00247 PyObject* _pythonQtClassWrapper;
00248
00249 PythonQtShellSetInstanceWrapperCB* _shellSetInstanceWrapperCB;
00250
00251 int _metaTypeId;
00252 int _typeSlots;
00253
00254 bool _isQObject;
00255 bool _enumsCreated;
00256
00257 };
00258
00259
00260
00261
00262 #endif