]>
Commit | Line | Data |
---|---|---|
d14a1e28 RD |
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. | |
a2c53287 | 22 | |
d14a1e28 | 23 | #include <wx/hashmap.h> |
080b9cbc | 24 | WX_DECLARE_STRING_HASH_MAP( swig_type_info*, wxPyTypeInfoHashMap ); |
d14a1e28 RD |
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(" *")); | |
1b8c7ba6 | 45 | swigType = SWIG_TypeQuery(name.mb_str()); |
d14a1e28 RD |
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(" *")); | |
1b8c7ba6 | 56 | swigType = SWIG_TypeQuery(name.mb_str()); |
d14a1e28 RD |
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 | |
dd9f7fea | 92 | // error should be handled properly in the caller. Returns True on success. |
d14a1e28 RD |
93 | bool wxPyConvertSwigPtr(PyObject* obj, void **ptr, |
94 | const wxChar* className) { | |
95 | ||
96 | swig_type_info* swigType = wxPyFindSwigType(className); | |
a72f4631 | 97 | wxCHECK_MSG(swigType != NULL, false, wxT("Unknown type in wxPyConvertSwigPtr")); |
d14a1e28 RD |
98 | |
99 | return SWIG_Python_ConvertPtr(obj, ptr, swigType, SWIG_POINTER_EXCEPTION) != -1; | |
100 | } | |
101 | ||
b702ab76 RD |
102 | %} |
103 | ||
104 | ||
105 | #if SWIG_VERSION < 0x010328 | |
106 | %{ | |
107 | // Make a SWIGified pointer object suitable for a .this attribute | |
108 | PyObject* wxPyMakeSwigPtr(void* ptr, const wxChar* className) { | |
109 | ||
110 | PyObject* robj = NULL; | |
111 | ||
112 | swig_type_info* swigType = wxPyFindSwigType(className); | |
113 | wxCHECK_MSG(swigType != NULL, NULL, wxT("Unknown type in wxPyMakeSwigPtr")); | |
114 | ||
115 | #ifdef SWIG_COBJECT_TYPES | |
116 | robj = PySwigObject_FromVoidPtrAndDesc((void *) ptr, (char *)swigType->name); | |
117 | #else | |
118 | { | |
119 | char result[1024]; | |
120 | robj = SWIG_PackVoidPtr(result, ptr, swigType->name, sizeof(result)) ? | |
121 | PyString_FromString(result) : 0; | |
122 | } | |
123 | #endif | |
124 | return robj; | |
125 | } | |
126 | %} | |
127 | ||
128 | #else // SWIG_VERSION >= 1.3.28 | |
129 | %{ | |
130 | // Make a SWIGified pointer object suitable for a .this attribute | |
131 | PyObject* wxPyMakeSwigPtr(void* ptr, const wxChar* className) { | |
132 | ||
133 | PyObject* robj = NULL; | |
d14a1e28 | 134 | |
b702ab76 RD |
135 | swig_type_info* swigType = wxPyFindSwigType(className); |
136 | wxCHECK_MSG(swigType != NULL, NULL, wxT("Unknown type in wxPyMakeSwigPtr")); | |
d14a1e28 | 137 | |
b702ab76 RD |
138 | robj = PySwigObject_New(ptr, swigType, 0); |
139 | return robj; | |
140 | } | |
141 | %} | |
142 | #endif | |
d14a1e28 | 143 | |
b702ab76 RD |
144 | |
145 | ||
146 | %{ | |
02b800ce RD |
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; | |
152 | } | |
153 | ||
154 | ||
02b800ce RD |
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"); | |
161 | ||
162 | PyObject* this_attr = PyObject_GetAttr(obj, this_str); | |
163 | if (this_attr) { | |
164 | bool retval = (PySwigObject_Check(this_attr) != 0); | |
165 | Py_DECREF(this_attr); | |
166 | return retval; | |
167 | } | |
168 | ||
169 | PyErr_Clear(); | |
170 | return false; | |
171 | } | |
d14a1e28 RD |
172 | |
173 | ||
174 | // Export a C API in a struct. Other modules will be able to load this from | |
54f9ee45 RD |
175 | // the wx._core_ module and will then have safe access to these functions, |
176 | // even if they are located in another shared library. | |
d14a1e28 RD |
177 | static wxPyCoreAPI API = { |
178 | ||
d14a1e28 RD |
179 | wxPyCheckSwigType, |
180 | wxPyConstructObject, | |
181 | wxPyConvertSwigPtr, | |
182 | wxPyMakeSwigPtr, | |
183 | ||
184 | wxPyBeginAllowThreads, | |
185 | wxPyEndAllowThreads, | |
186 | wxPyBeginBlockThreads, | |
187 | wxPyEndBlockThreads, | |
188 | ||
189 | wxPy_ConvertList, | |
190 | ||
191 | wxString_in_helper, | |
192 | Py2wxString, | |
193 | wx2PyString, | |
194 | ||
195 | byte_LIST_helper, | |
196 | int_LIST_helper, | |
197 | long_LIST_helper, | |
198 | string_LIST_helper, | |
199 | wxPoint_LIST_helper, | |
200 | wxBitmap_LIST_helper, | |
201 | wxString_LIST_helper, | |
202 | wxAcceleratorEntry_LIST_helper, | |
203 | ||
204 | wxSize_helper, | |
205 | wxPoint_helper, | |
206 | wxRealPoint_helper, | |
207 | wxRect_helper, | |
208 | wxColour_helper, | |
209 | wxPoint2D_helper, | |
210 | ||
211 | wxPySimple_typecheck, | |
212 | wxColour_typecheck, | |
213 | ||
214 | wxPyCBH_setCallbackInfo, | |
215 | wxPyCBH_findCallback, | |
216 | wxPyCBH_callCallback, | |
217 | wxPyCBH_callCallbackObj, | |
218 | wxPyCBH_delete, | |
219 | ||
220 | wxPyMake_wxObject, | |
221 | wxPyMake_wxSizer, | |
222 | wxPyPtrTypeMap_Add, | |
223 | wxPy2int_seq_helper, | |
224 | wxPy4int_seq_helper, | |
225 | wxArrayString2PyList_helper, | |
226 | wxArrayInt2PyList_helper, | |
227 | ||
228 | wxPyClientData_dtor, | |
229 | wxPyUserData_dtor, | |
230 | wxPyOORClientData_dtor, | |
231 | ||
232 | wxPyCBInputStream_create, | |
d02ea46c RD |
233 | wxPyCBInputStream_copy, |
234 | ||
d14a1e28 | 235 | wxPyInstance_Check, |
ab1f7d2a RD |
236 | wxPySwigInstance_Check, |
237 | ||
281c54cc | 238 | wxPyCheckForApp, |
d14a1e28 | 239 | |
281c54cc | 240 | wxArrayDouble2PyList_helper, |
debe38c9 RD |
241 | wxPoint2D_LIST_helper, |
242 | wxRect2D_helper, | |
363868e5 RD |
243 | wxPosition_helper, |
244 | ||
d14a1e28 RD |
245 | }; |
246 | ||
247 | #endif | |
248 | %} | |
249 | ||
250 | ||
251 | ||
252 | ||
253 | %init %{ | |
254 | #ifndef wxPyUSE_EXPORT | |
255 | // Make our API structure a CObject so other modules can import it | |
256 | // from this module. | |
257 | PyObject* cobj = PyCObject_FromVoidPtr(&API, NULL); | |
258 | PyDict_SetItemString(d,"_wxPyCoreAPI", cobj); | |
259 | Py_XDECREF(cobj); | |
260 | #endif | |
261 | %} | |
262 | ||
263 | //--------------------------------------------------------------------------- |