This file is indexed.

/usr/include/PythonQt/PythonQtClassInfo.h is in libpythonqt-dev 3.0-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
#ifndef _PYTHONQTCLASSINFO_H
#define _PYTHONQTCLASSINFO_H

/*
 *
 *  Copyright (C) 2010 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
 *
 */

#include <QMetaObject>
#include <QMetaMethod>
#include <QHash>
#include <QByteArray>
#include <QList>
#include "PythonQt.h"

class PythonQtSlotInfo;

struct PythonQtMemberInfo {
  enum Type {
    Invalid, Slot, Signal, EnumValue, EnumWrapper, Property, NestedClass, NotFound 
  };

  PythonQtMemberInfo():_type(Invalid),_slot(NULL),_pythonType(NULL),_enumValue(0) { }
  
  PythonQtMemberInfo(PythonQtSlotInfo* info);

  PythonQtMemberInfo(const PythonQtObjectPtr& enumValue);

  PythonQtMemberInfo(const QMetaProperty& prop);

  Type              _type;

  // TODO: this could be a union...
  PythonQtSlotInfo* _slot;
  PyObject*         _pythonType;
  PythonQtObjectPtr _enumValue;
  QMetaProperty     _property;
};

//! a class that stores all required information about a Qt object (and an optional associated C++ class name)
/*! for fast lookup of slots when calling the object from Python
*/
class PYTHONQT_EXPORT PythonQtClassInfo {

public:
  PythonQtClassInfo();
  ~PythonQtClassInfo();

  //! store information about parent classes
  struct ParentClassInfo {
    ParentClassInfo(PythonQtClassInfo* parent, int upcastingOffset=0):_parent(parent),_upcastingOffset(upcastingOffset)
    {};

    PythonQtClassInfo* _parent;
    int                _upcastingOffset;
  };


  //! setup as a QObject, taking the meta object as meta information about the QObject
  void setupQObject(const QMetaObject* meta);

  //! setup as a CPP (non-QObject), taking the classname
  void setupCPPObject(const QByteArray& classname);

  //! set the type capabilities
  void setTypeSlots(int typeSlots) { _typeSlots = typeSlots; }
  //! get the type capabilities
  int typeSlots() const { return _typeSlots; }

  //! get the Python method definition for a given slot name (without return type and signature)
  PythonQtMemberInfo member(const char* member);

  //! get access to the constructor slot (which may be overloaded if there are multiple constructors)
  PythonQtSlotInfo* constructors();
  
  //! get access to the destructor slot
  PythonQtSlotInfo* destructor();

  //! add a constructor, ownership is passed to classinfo
  void addConstructor(PythonQtSlotInfo* info);

  //! set a destructor, ownership is passed to classinfo
  void setDestructor(PythonQtSlotInfo* info);

  //! add a decorator slot, ownership is passed to classinfo
  void addDecoratorSlot(PythonQtSlotInfo* info);

  //! add a nested class, so that it can be shown as outer class member
  void addNestedClass(PythonQtClassInfo* info);

  //! get the classname (either of the QObject or of the wrapped CPP object)
  const QByteArray& className() const;

  //! get the unscoped classname (without ParentClass::) for nested classes
  QByteArray unscopedClassName() const;

  //! returns if the QObject
  bool isQObject() { return _isQObject; }

  //! returns if the class is a CPP wrapper
  bool isCPPWrapper() { return !_isQObject; }

  //! get the meta object
  const QMetaObject* metaObject() { return _meta; }

  //! set the meta object, this will reset the caching
  void setMetaObject(const QMetaObject* meta);

  //! returns if this class inherits from the given classname
  bool inherits(const char* classname);
  
  //! returns if this class inherits from the given classinfo
  bool inherits(PythonQtClassInfo* info);

  //! casts the given \c ptr to an object of type \c classname, returns the new pointer
  //! which might be different to \c ptr due to C++ multiple inheritance
  //! (if the cast is not possible or if ptr is NULL, NULL is returned)
  void* castTo(void* ptr, const char* classname);

  //! get help string for the metaobject
  QString help();

  //! get list of all properties (on QObjects only, otherwise the list is empty)
  QStringList propertyList();

  //! get list of all members (excluding properties, which can be listed with propertyList())
  QStringList memberList();

  //! get the meta type id of this class (only valid for isCPPWrapper() == true)
  int metaTypeId() { return _metaTypeId; }

  //! set an additional decorator provider that offers additional decorator slots for this class 
  void setDecoratorProvider(PythonQtQObjectCreatorFunctionCB* cb);

  //! get the decorator qobject instance
  QObject* decorator();
  
  //! add the parent class info of a CPP object
  void addParentClass(const ParentClassInfo& info) { _parentClasses.append(info); }

  //! set the associated PythonQtClassWrapper (which handles instance creation of this type)
  void setPythonQtClassWrapper(PyObject* obj) { _pythonQtClassWrapper = obj; }

  //! get the associated PythonQtClassWrapper (which handles instance creation of this type)
  PyObject* pythonQtClassWrapper() { return _pythonQtClassWrapper; }

  //! set the shell set instance wrapper cb
  void setShellSetInstanceWrapperCB(PythonQtShellSetInstanceWrapperCB* cb) {
    _shellSetInstanceWrapperCB = cb;
  }

  //! get the shell set instance wrapper cb
  PythonQtShellSetInstanceWrapperCB* shellSetInstanceWrapperCB() {
    return _shellSetInstanceWrapperCB;
  }

  //! add a handler for polymorphic downcasting
  void addPolymorphicHandler(PythonQtPolymorphicHandlerCB* cb) { _polymorphicHandlers.append(cb); }

  //! cast the pointer down in the class hierarchy if a polymorphic handler allows to do that
  void* castDownIfPossible(void* ptr, PythonQtClassInfo** resultClassInfo);

  //! returns if the localScope has an enum of that type name or if the enum contains a :: scope, if that class contails the enum
  static PyObject* findEnumWrapper(const QByteArray& name, PythonQtClassInfo* localScope, bool* isLocalEnum = NULL);

  //! clear all members that where cached as "NotFound"
  void clearNotFoundCachedMembers();

  //! get nested classes
  const QList<PythonQtClassInfo*>& nestedClasses() { return _nestedClasses; }

  //! Create a copy of the given C++ object (which is known to be of a derived class), wrapped by Python and owned by PythonQt.
  //! This will downcast if possible and return a copy of the down casted object.
  //! This either requires a copy constructor on the class or it needs to be registered
  //! as a meta type.
  PyObject* copyObject(void* cppObject);

  //! Get the copy constructor for this class
  PythonQtSlotInfo* getCopyConstructor();

  //! Sets reference counting callbacks for this class and all its subclasses
  void setReferenceCounting(PythonQtVoidPtrCB* refCB, PythonQtVoidPtrCB* unrefCB);

  //! Returns the ref counting CB, if there is any
  PythonQtVoidPtrCB* referenceCountingRefCB();
  //! Returns the unref counting CB, if there is any
  PythonQtVoidPtrCB* referenceCountingUnrefCB();

  //! Returns the Python type object for a given property.
  //! (the returned object does not get an extra reference count)
  PyObject* getPythonTypeForProperty(const QString& name);

  //! Returns the class info for given property, if available.
  PythonQtClassInfo* getClassInfoForProperty( const QString& name );

private:
  void updateRefCountingCBs();

  void createEnumWrappers();
  void createEnumWrappers(const QMetaObject* meta);
  PyObject* findEnumWrapper(const char* name);

  //! clear all cached members
  void clearCachedMembers();

  void* recursiveCastDownIfPossible(void* ptr, const char** resultClassName);

  PythonQtSlotInfo* findDecoratorSlotsFromDecoratorProvider(const char* memberName, PythonQtSlotInfo* inputInfo, bool &found, QHash<QByteArray, PythonQtMemberInfo>& memberCache, int upcastingOffset);
  void listDecoratorSlotsFromDecoratorProvider(QStringList& list, bool metaOnly);
  PythonQtSlotInfo* recursiveFindDecoratorSlotsFromDecoratorProvider(const char* memberName, PythonQtSlotInfo* inputInfo, bool &found, QHash<QByteArray, PythonQtMemberInfo>& memberCache, int upcastingOffset);

  void recursiveCollectClassInfos(QList<PythonQtClassInfo*>& classInfoObjects);
  void recursiveCollectDecoratorObjects(QList<QObject*>& decoratorObjects);

  bool lookForPropertyAndCache(const char* memberName);
  bool lookForMethodAndCache(const char* memberName);
  bool lookForEnumAndCache(const QMetaObject* m, const char* memberName);

  PythonQtSlotInfo* findDecoratorSlots(const char* memberName, PythonQtSlotInfo* tail, bool &found, QHash<QByteArray, PythonQtMemberInfo>& memberCache, int upcastingOffset);
  int findCharOffset(const char* sigStart, char someChar);
 
  QHash<QByteArray, PythonQtMemberInfo> _cachedMembers;

  PythonQtSlotInfo*                    _constructors;
  PythonQtSlotInfo*                    _destructor;

  PythonQtVoidPtrCB*                   _refCallback;
  PythonQtVoidPtrCB*                   _unrefCallback;

  QList<PythonQtSlotInfo*>             _decoratorSlots;

  QList<PythonQtObjectPtr>             _enumWrappers;

  const QMetaObject*                   _meta;

  QByteArray                           _wrappedClassName;
  QList<ParentClassInfo>               _parentClasses;

  QList<PythonQtPolymorphicHandlerCB*> _polymorphicHandlers;

  QList<PythonQtClassInfo*>            _nestedClasses;

  QObject*                             _decoratorProvider;
  PythonQtQObjectCreatorFunctionCB*    _decoratorProviderCB;
  
  PyObject*                            _pythonQtClassWrapper;
  
  PythonQtShellSetInstanceWrapperCB*   _shellSetInstanceWrapperCB;
  
  int  _metaTypeId;
  int  _typeSlots;

  bool _isQObject;
  bool _enumsCreated;
  bool _searchPolymorphicHandlerOnParent;
  bool _searchRefCountCB;
  
};

//---------------------------------------------------------------


#endif