]>
Commit | Line | Data |
---|---|---|
1 | ///////////////////////////////////////////////////////////////////////////// | |
2 | // Name: _core_api.i | |
3 | // Purpose: | |
4 | // | |
5 | // Author: Robin Dunn | |
6 | // | |
7 | // Created: 13-Sept-2003 | |
8 | // RCS-ID: $Id$ | |
9 | // Copyright: (c) 2003 by Total Control Software | |
10 | // Licence: wxWindows license | |
11 | ///////////////////////////////////////////////////////////////////////////// | |
12 | ||
13 | // Not a %module | |
14 | ||
15 | ||
16 | //--------------------------------------------------------------------------- | |
17 | %{ | |
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. | |
22 | ||
23 | #include <wx/hashmap.h> | |
24 | WX_DECLARE_STRING_HASH_MAP( swig_type_info*, wxPyTypeInfoHashMap ); | |
25 | ||
26 | ||
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; | |
31 | static | |
32 | swig_type_info* wxPyFindSwigType(const wxChar* className) { | |
33 | ||
34 | static wxPyTypeInfoHashMap* typeInfoCache = NULL; | |
35 | ||
36 | if (typeInfoCache == NULL) | |
37 | typeInfoCache = new wxPyTypeInfoHashMap; | |
38 | ||
39 | wxString name(className); | |
40 | swig_type_info* swigType = (*typeInfoCache)[name]; | |
41 | ||
42 | if (! swigType) { | |
43 | // it wasn't in the cache, so look it up from SWIG | |
44 | name.Append(wxT(" *")); | |
45 | swigType = SWIG_TypeQuery(name.mb_str()); | |
46 | ||
47 | // if it still wasn't found, try looking for a mapped name | |
48 | if (!swigType) { | |
49 | PyObject* item; | |
50 | name = className; | |
51 | ||
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()); | |
57 | } | |
58 | } | |
59 | if (swigType) { | |
60 | // and add it to the map if found | |
61 | (*typeInfoCache)[className] = swigType; | |
62 | } | |
63 | } | |
64 | return swigType; | |
65 | } | |
66 | ||
67 | ||
68 | // Check if a class name is a type known to SWIG | |
69 | bool wxPyCheckSwigType(const wxChar* className) { | |
70 | ||
71 | swig_type_info* swigType = wxPyFindSwigType(className); | |
72 | return swigType != NULL; | |
73 | } | |
74 | ||
75 | ||
76 | // Given a pointer to a C++ object and a class name, construct a Python proxy | |
77 | // object for it. | |
78 | PyObject* wxPyConstructObject(void* ptr, | |
79 | const wxChar* className, | |
80 | int setThisOwn) { | |
81 | ||
82 | swig_type_info* swigType = wxPyFindSwigType(className); | |
83 | wxCHECK_MSG(swigType != NULL, NULL, wxT("Unknown type in wxPyConstructObject")); | |
84 | ||
85 | return SWIG_Python_NewPointerObj(ptr, swigType, setThisOwn); | |
86 | } | |
87 | ||
88 | ||
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) { | |
95 | ||
96 | swig_type_info* swigType = wxPyFindSwigType(className); | |
97 | wxCHECK_MSG(swigType != NULL, false, wxT("Unknown type in wxPyConvertSwigPtr")); | |
98 | ||
99 | return SWIG_Python_ConvertPtr(obj, ptr, swigType, SWIG_POINTER_EXCEPTION) != -1; | |
100 | } | |
101 | ||
102 | ||
103 | // Make a SWIGified pointer object suitable for a .this attribute | |
104 | PyObject* wxPyMakeSwigPtr(void* ptr, const wxChar* className) { | |
105 | ||
106 | PyObject* robj = NULL; | |
107 | ||
108 | swig_type_info* swigType = wxPyFindSwigType(className); | |
109 | wxCHECK_MSG(swigType != NULL, NULL, wxT("Unknown type in wxPyConvertSwigPtr")); | |
110 | ||
111 | #ifdef SWIG_COBJECT_TYPES | |
112 | robj = PySwigObject_FromVoidPtrAndDesc((void *) ptr, (char *)swigType->name); | |
113 | #else | |
114 | { | |
115 | char result[1024]; | |
116 | robj = SWIG_PackVoidPtr(result, ptr, swigType->name, sizeof(result)) ? | |
117 | PyString_FromString(result) : 0; | |
118 | } | |
119 | #endif | |
120 | ||
121 | return robj; | |
122 | } | |
123 | ||
124 | ||
125 | ||
126 | ||
127 | // Export a C API in a struct. Other modules will be able to load this from | |
128 | // the wx._core_ module and will then have safe access to these functions, | |
129 | // even if they are located in another shared library. | |
130 | static wxPyCoreAPI API = { | |
131 | ||
132 | wxPyCheckSwigType, | |
133 | wxPyConstructObject, | |
134 | wxPyConvertSwigPtr, | |
135 | wxPyMakeSwigPtr, | |
136 | ||
137 | wxPyBeginAllowThreads, | |
138 | wxPyEndAllowThreads, | |
139 | wxPyBeginBlockThreads, | |
140 | wxPyEndBlockThreads, | |
141 | ||
142 | wxPy_ConvertList, | |
143 | ||
144 | wxString_in_helper, | |
145 | Py2wxString, | |
146 | wx2PyString, | |
147 | ||
148 | byte_LIST_helper, | |
149 | int_LIST_helper, | |
150 | long_LIST_helper, | |
151 | string_LIST_helper, | |
152 | wxPoint_LIST_helper, | |
153 | wxBitmap_LIST_helper, | |
154 | wxString_LIST_helper, | |
155 | wxAcceleratorEntry_LIST_helper, | |
156 | ||
157 | wxSize_helper, | |
158 | wxPoint_helper, | |
159 | wxRealPoint_helper, | |
160 | wxRect_helper, | |
161 | wxColour_helper, | |
162 | wxPoint2D_helper, | |
163 | ||
164 | wxPySimple_typecheck, | |
165 | wxColour_typecheck, | |
166 | ||
167 | wxPyCBH_setCallbackInfo, | |
168 | wxPyCBH_findCallback, | |
169 | wxPyCBH_callCallback, | |
170 | wxPyCBH_callCallbackObj, | |
171 | wxPyCBH_delete, | |
172 | ||
173 | wxPyMake_wxObject, | |
174 | wxPyMake_wxSizer, | |
175 | wxPyPtrTypeMap_Add, | |
176 | wxPy2int_seq_helper, | |
177 | wxPy4int_seq_helper, | |
178 | wxArrayString2PyList_helper, | |
179 | wxArrayInt2PyList_helper, | |
180 | ||
181 | wxPyClientData_dtor, | |
182 | wxPyUserData_dtor, | |
183 | wxPyOORClientData_dtor, | |
184 | ||
185 | wxPyCBInputStream_create, | |
186 | wxPyCBInputStream_copy, | |
187 | ||
188 | wxPyInstance_Check, | |
189 | wxPySwigInstance_Check, | |
190 | ||
191 | wxPyCheckForApp | |
192 | ||
193 | }; | |
194 | ||
195 | #endif | |
196 | %} | |
197 | ||
198 | ||
199 | ||
200 | ||
201 | %init %{ | |
202 | #ifndef wxPyUSE_EXPORT | |
203 | // Make our API structure a CObject so other modules can import it | |
204 | // from this module. | |
205 | PyObject* cobj = PyCObject_FromVoidPtr(&API, NULL); | |
206 | PyDict_SetItemString(d,"_wxPyCoreAPI", cobj); | |
207 | Py_XDECREF(cobj); | |
208 | #endif | |
209 | %} | |
210 | ||
211 | //--------------------------------------------------------------------------- |