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_Python_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_Python_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;
 
 103 // Make a SWIGified pointer object suitable for a .this attribute
 
 104 PyObject* wxPyMakeSwigPtr(void* ptr, const wxChar* className) {
 
 106     PyObject* robj = NULL;
 
 108     swig_type_info* swigType = wxPyFindSwigType(className);
 
 109     wxCHECK_MSG(swigType != NULL, NULL, wxT("Unknown type in wxPyConvertSwigPtr"));
 
 111 #ifdef SWIG_COBJECT_TYPES
 
 112     robj = PyCObject_FromVoidPtrAndDesc((void *) ptr, (char *) swigType->name, NULL);
 
 118         r = SWIG_Python_PackData(r, &ptr, sizeof(void *));
 
 119         strcpy(r, swigType->name);
 
 120         robj = PyString_FromString(result);
 
 130 // Export a C API in a struct.  Other modules will be able to load this from
 
 131 // the wx._core_ module and will then have safe access to these functions,
 
 132 // even if they are located in another shared library.
 
 133 static wxPyCoreAPI API = {
 
 135     (p_SWIG_Python_TypeRegister_t)SWIG_Python_TypeRegister,
 
 136     (p_SWIG_Python_TypeCheck_t)SWIG_Python_TypeCheck,
 
 137     (p_SWIG_Python_TypeCast_t)SWIG_Python_TypeCast,
 
 138     (p_SWIG_Python_TypeDynamicCast_t)SWIG_Python_TypeDynamicCast,
 
 139     (p_SWIG_Python_TypeName_t)SWIG_Python_TypeName,
 
 140     (p_SWIG_Python_TypePrettyName_t)SWIG_Python_TypePrettyName,
 
 141     (p_SWIG_Python_TypeQuery_t)SWIG_Python_TypeQuery,
 
 142     (p_SWIG_Python_TypeClientData_t)SWIG_Python_TypeClientData,
 
 143     (p_SWIG_Python_newvarlink_t)SWIG_Python_newvarlink,
 
 144     (p_SWIG_Python_addvarlink_t)SWIG_Python_addvarlink,
 
 145     (p_SWIG_Python_ConvertPtr_t)SWIG_Python_ConvertPtr,
 
 146     (p_SWIG_Python_ConvertPacked_t)SWIG_Python_ConvertPacked,
 
 147     (p_SWIG_Python_PackData_t)SWIG_Python_PackData,
 
 148     (p_SWIG_Python_UnpackData_t)SWIG_Python_UnpackData,
 
 149     (p_SWIG_Python_NewPointerObj_t)SWIG_Python_NewPointerObj,
 
 150     (p_SWIG_Python_NewPackedObj_t)SWIG_Python_NewPackedObj,
 
 151     (p_SWIG_Python_InstallConstants_t)SWIG_Python_InstallConstants,
 
 152     (p_SWIG_Python_MustGetPtr_t)SWIG_Python_MustGetPtr,
 
 159     wxPyBeginAllowThreads,
 
 161     wxPyBeginBlockThreads,
 
 175     wxBitmap_LIST_helper,
 
 176     wxString_LIST_helper,
 
 177     wxAcceleratorEntry_LIST_helper,
 
 186     wxPySimple_typecheck,
 
 189     wxPyCBH_setCallbackInfo,
 
 190     wxPyCBH_findCallback,
 
 191     wxPyCBH_callCallback,
 
 192     wxPyCBH_callCallbackObj,
 
 200     wxArrayString2PyList_helper,
 
 201     wxArrayInt2PyList_helper,
 
 205     wxPyOORClientData_dtor,
 
 207     wxPyCBInputStream_create,
 
 210     wxPySwigInstance_Check,
 
 223 #ifndef wxPyUSE_EXPORT
 
 224     // Make our API structure a CObject so other modules can import it
 
 226     PyObject* cobj = PyCObject_FromVoidPtr(&API, NULL);
 
 227     PyDict_SetItemString(d,"_wxPyCoreAPI", cobj);
 
 232 //---------------------------------------------------------------------------