1 /////////////////////////////////////////////////////////////////////////////
 
   7 // Created:     13-Sept-2003
 
   9 // Copyright:   (c) 2003 by Total Control Software
 
  10 // Licence:     wxWindows license
 
  11 /////////////////////////////////////////////////////////////////////////////
 
  16 //---------------------------------------------------------------------------
 
  18 #ifndef wxPyUSE_EXPORT
 
  19 // Helper functions for dealing with SWIG objects and such.  These are
 
  20 // located here so they know about the SWIG types and functions declared
 
  21 // in the wrapper code.
 
  23 #include <wx/hashmap.h>
 
  24 WX_DECLARE_STRING_HASH_MAP( swig_type_info*, wxPyTypeInfoHashMap );
 
  27 // Maintains a hashmap of className to swig_type_info pointers.  Given the
 
  28 // name of a class either looks up the type info in the cache, or scans the
 
  29 // SWIG tables for it.
 
  30 extern PyObject* wxPyPtrTypeMap; 
 
  32 swig_type_info* wxPyFindSwigType(const wxChar* className) {
 
  34     static wxPyTypeInfoHashMap* typeInfoCache = NULL;
 
  36     if (typeInfoCache == NULL)
 
  37         typeInfoCache = new wxPyTypeInfoHashMap;
 
  39     wxString name(className);
 
  40     swig_type_info* swigType = (*typeInfoCache)[name];
 
  43         // it wasn't in the cache, so look it up from SWIG
 
  44         name.Append(wxT(" *"));
 
  45         swigType = SWIG_TypeQuery(name.mb_str());
 
  47         // if it still wasn't found, try looking for a mapped name
 
  52             if ((item = PyDict_GetItemString(wxPyPtrTypeMap,
 
  53                                (char*)(const char*)name.mbc_str())) != NULL) {
 
  54                 name = wxString(PyString_AsString(item), *wxConvCurrent);
 
  55                 name.Append(wxT(" *"));
 
  56                 swigType = SWIG_TypeQuery(name.mb_str());
 
  60             // and add it to the map if found
 
  61             (*typeInfoCache)[className] = swigType;
 
  68 // Check if a class name is a type known to SWIG
 
  69 bool wxPyCheckSwigType(const wxChar* className) {
 
  71     swig_type_info* swigType = wxPyFindSwigType(className);
 
  72     return swigType != NULL;
 
  76 // Given a pointer to a C++ object and a class name, construct a Python proxy
 
  78 PyObject* wxPyConstructObject(void* ptr,
 
  79                               const wxChar* className,
 
  82     swig_type_info* swigType = wxPyFindSwigType(className);
 
  83     wxCHECK_MSG(swigType != NULL, NULL, wxT("Unknown type in wxPyConstructObject"));
 
  85     return SWIG_Python_NewPointerObj(ptr, swigType, setThisOwn);
 
  89 // Extract a pointer to the wrapped C++ object from a Python proxy object.
 
  90 // Ensures that the proxy object is of the specified (or derived) type.  If
 
  91 // not able to perform the conversion then a Python exception is set and the
 
  92 // error should be handled properly in the caller.  Returns True on success.
 
  93 bool wxPyConvertSwigPtr(PyObject* obj, void **ptr,
 
  94                         const wxChar* className) {
 
  96     swig_type_info* swigType = wxPyFindSwigType(className);
 
  97     wxCHECK_MSG(swigType != NULL, false, wxT("Unknown type in wxPyConvertSwigPtr"));
 
  99     return SWIG_Python_ConvertPtr(obj, ptr, swigType, SWIG_POINTER_EXCEPTION) != -1;
 
 105 #if SWIG_VERSION < 0x010328
 
 107 // Make a SWIGified pointer object suitable for a .this attribute
 
 108 PyObject* wxPyMakeSwigPtr(void* ptr, const wxChar* className) {
 
 110     PyObject* robj = NULL;
 
 112     swig_type_info* swigType = wxPyFindSwigType(className);
 
 113     wxCHECK_MSG(swigType != NULL, NULL, wxT("Unknown type in wxPyMakeSwigPtr"));
 
 115 #ifdef SWIG_COBJECT_TYPES
 
 116     robj = PySwigObject_FromVoidPtrAndDesc((void *) ptr, (char *)swigType->name);
 
 120         robj = SWIG_PackVoidPtr(result, ptr, swigType->name, sizeof(result)) ?
 
 121             PyString_FromString(result) : 0;
 
 128 #else // SWIG_VERSION >= 1.3.28
 
 130 // Make a SWIGified pointer object suitable for a .this attribute
 
 131 PyObject* wxPyMakeSwigPtr(void* ptr, const wxChar* className) {
 
 133     PyObject* robj = NULL;
 
 135     swig_type_info* swigType = wxPyFindSwigType(className);
 
 136     wxCHECK_MSG(swigType != NULL, NULL, wxT("Unknown type in wxPyMakeSwigPtr"));
 
 138     robj = PySwigObject_New(ptr, swigType, 0);
 
 147 // Python's PyInstance_Check does not return True for instances of new-style
 
 148 // classes.  This should get close enough for both new and old classes but I
 
 149 // should re-evaluate the need for doing instance checks...
 
 150 bool wxPyInstance_Check(PyObject* obj) {
 
 151     return PyObject_HasAttrString(obj, "__class__") != 0;
 
 155 // This one checks if the object is an instance of a SWIG proxy class (it has
 
 156 // a .this attribute, and the .this attribute is a PySwigObject.)
 
 157 bool wxPySwigInstance_Check(PyObject* obj) {
 
 158     static PyObject* this_str = NULL;
 
 159     if (this_str == NULL)
 
 160         this_str = PyString_FromString("this");
 
 162     PyObject* this_attr = PyObject_GetAttr(obj, this_str);
 
 164         bool retval = (PySwigObject_Check(this_attr) != 0);
 
 165         Py_DECREF(this_attr);
 
 174 // Export a C API in a struct.  Other modules will be able to load this from
 
 175 // the wx._core_ module and will then have safe access to these functions,
 
 176 // even if they are located in another shared library.
 
 177 static wxPyCoreAPI API = {
 
 184     wxPyBeginAllowThreads,
 
 186     wxPyBeginBlockThreads,
 
 200     wxBitmap_LIST_helper,
 
 201     wxString_LIST_helper,
 
 202     wxAcceleratorEntry_LIST_helper,
 
 211     wxPySimple_typecheck,
 
 214     wxPyCBH_setCallbackInfo,
 
 215     wxPyCBH_findCallback,
 
 216     wxPyCBH_callCallback,
 
 217     wxPyCBH_callCallbackObj,
 
 225     wxArrayString2PyList_helper,
 
 226     wxArrayInt2PyList_helper,
 
 230     wxPyOORClientData_dtor,
 
 232     wxPyCBInputStream_create,
 
 233     wxPyCBInputStream_copy,
 
 236     wxPySwigInstance_Check,
 
 249 #ifndef wxPyUSE_EXPORT
 
 250     // Make our API structure a CObject so other modules can import it
 
 252     PyObject* cobj = PyCObject_FromVoidPtr(&API, NULL);
 
 253     PyDict_SetItemString(d,"_wxPyCoreAPI", cobj);
 
 258 //---------------------------------------------------------------------------