]> git.proxmox.com Git - mirror_edk2.git/blame - AppPkg/Applications/Python/Python-2.7.2/Python/mactoolboxglue.c
EmbeddedPkg: Extend NvVarStoreFormattedLib LIBRARY_CLASS
[mirror_edk2.git] / AppPkg / Applications / Python / Python-2.7.2 / Python / mactoolboxglue.c
CommitLineData
4710c53d 1/***********************************************************\r
2Copyright 1991-1997 by Stichting Mathematisch Centrum, Amsterdam,\r
3The Netherlands.\r
4\r
5 All Rights Reserved\r
6\r
7Permission to use, copy, modify, and distribute this software and its\r
8documentation for any purpose and without fee is hereby granted,\r
9provided that the above copyright notice appear in all copies and that\r
10both that copyright notice and this permission notice appear in\r
11supporting documentation, and that the names of Stichting Mathematisch\r
12Centrum or CWI not be used in advertising or publicity pertaining to\r
13distribution of the software without specific, written prior permission.\r
14\r
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO\r
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\r
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE\r
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT\r
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\r
22\r
23******************************************************************/\r
24\r
25\r
26#include "Python.h"\r
27#include "pymactoolbox.h"\r
28#include <arpa/inet.h> /* for ntohl, htonl */\r
29\r
30\r
31/* Like strerror() but for Mac OS error numbers */\r
32char *\r
33PyMac_StrError(int err)\r
34{\r
35 static char buf[256];\r
36 PyObject *m;\r
37 PyObject *rv;\r
38\r
39 m = PyImport_ImportModuleNoBlock("MacOS");\r
40 if (!m) {\r
41 if (Py_VerboseFlag)\r
42 PyErr_Print();\r
43 PyErr_Clear();\r
44 rv = NULL;\r
45 }\r
46 else {\r
47 rv = PyObject_CallMethod(m, "GetErrorString", "i", err);\r
48 if (!rv)\r
49 PyErr_Clear();\r
50 }\r
51 if (!rv) {\r
52 buf[0] = '\0';\r
53 }\r
54 else {\r
55 char *input = PyString_AsString(rv);\r
56 if (!input) {\r
57 PyErr_Clear();\r
58 buf[0] = '\0';\r
59 } else {\r
60 strncpy(buf, input, sizeof(buf) - 1);\r
61 buf[sizeof(buf) - 1] = '\0';\r
62 }\r
63 Py_DECREF(rv);\r
64 }\r
65 Py_XDECREF(m);\r
66 return buf;\r
67}\r
68\r
69/* Exception object shared by all Mac specific modules for Mac OS errors */\r
70PyObject *PyMac_OSErrException;\r
71\r
72/* Initialize and return PyMac_OSErrException */\r
73PyObject *\r
74PyMac_GetOSErrException(void)\r
75{\r
76 if (PyMac_OSErrException == NULL)\r
77 PyMac_OSErrException = PyErr_NewException("MacOS.Error", NULL, NULL);\r
78 return PyMac_OSErrException;\r
79}\r
80\r
81/* Set a MAC-specific error from errno, and return NULL; return None if no error */\r
82PyObject *\r
83PyErr_Mac(PyObject *eobj, int err)\r
84{\r
85 char *msg;\r
86 PyObject *v;\r
87\r
88 if (err == 0 && !PyErr_Occurred()) {\r
89 Py_INCREF(Py_None);\r
90 return Py_None;\r
91 }\r
92 if (err == -1 && PyErr_Occurred())\r
93 return NULL;\r
94 msg = PyMac_StrError(err);\r
95 v = Py_BuildValue("(is)", err, msg);\r
96 PyErr_SetObject(eobj, v);\r
97 Py_DECREF(v);\r
98 return NULL;\r
99}\r
100\r
101/* Call PyErr_Mac with PyMac_OSErrException */\r
102PyObject *\r
103PyMac_Error(OSErr err)\r
104{\r
105 return PyErr_Mac(PyMac_GetOSErrException(), err);\r
106}\r
107\r
108\r
109#ifndef __LP64__\r
110OSErr\r
111PyMac_GetFullPathname(FSSpec *fss, char *path, int len)\r
112{\r
113 PyObject *fs, *exc;\r
114 PyObject *rv = NULL;\r
115 char *input;\r
116 OSErr err = noErr;\r
117\r
118 *path = '\0';\r
119\r
120 fs = PyMac_BuildFSSpec(fss);\r
121 if (!fs)\r
122 goto error;\r
123\r
124 rv = PyObject_CallMethod(fs, "as_pathname", "");\r
125 if (!rv)\r
126 goto error;\r
127\r
128 input = PyString_AsString(rv);\r
129 if (!input)\r
130 goto error;\r
131\r
132 strncpy(path, input, len - 1);\r
133 path[len - 1] = '\0';\r
134\r
135 Py_XDECREF(rv);\r
136 Py_XDECREF(fs);\r
137 return err;\r
138\r
139 error:\r
140 exc = PyErr_Occurred();\r
141 if (exc && PyErr_GivenExceptionMatches(exc,\r
142 PyMac_GetOSErrException())) {\r
143 PyObject *args = PyObject_GetAttrString(exc, "args");\r
144 if (args) {\r
145 char *ignore;\r
146 PyArg_ParseTuple(args, "is", &err, &ignore);\r
147 Py_XDECREF(args);\r
148 }\r
149 }\r
150 if (err == noErr)\r
151 err = -1;\r
152 PyErr_Clear();\r
153 Py_XDECREF(rv);\r
154 Py_XDECREF(fs);\r
155 return err;\r
156}\r
157#endif /* !__LP64__ */\r
158\r
159/* Convert a 4-char string object argument to an OSType value */\r
160int\r
161PyMac_GetOSType(PyObject *v, OSType *pr)\r
162{\r
163 uint32_t tmp;\r
164 if (!PyString_Check(v) || PyString_Size(v) != 4) {\r
165 PyErr_SetString(PyExc_TypeError,\r
166 "OSType arg must be string of 4 chars");\r
167 return 0;\r
168 }\r
169 memcpy((char *)&tmp, PyString_AsString(v), 4);\r
170 *pr = (OSType)ntohl(tmp);\r
171 return 1;\r
172}\r
173\r
174/* Convert an OSType value to a 4-char string object */\r
175PyObject *\r
176PyMac_BuildOSType(OSType t)\r
177{\r
178 uint32_t tmp = htonl((uint32_t)t);\r
179 return PyString_FromStringAndSize((char *)&tmp, 4);\r
180}\r
181\r
182/* Convert an NumVersion value to a 4-element tuple */\r
183PyObject *\r
184PyMac_BuildNumVersion(NumVersion t)\r
185{\r
186 return Py_BuildValue("(hhhh)", t.majorRev, t.minorAndBugRev, t.stage, t.nonRelRev);\r
187}\r
188\r
189\r
190/* Convert a Python string object to a Str255 */\r
191int\r
192PyMac_GetStr255(PyObject *v, Str255 pbuf)\r
193{\r
194 int len;\r
195 if (!PyString_Check(v) || (len = PyString_Size(v)) > 255) {\r
196 PyErr_SetString(PyExc_TypeError,\r
197 "Str255 arg must be string of at most 255 chars");\r
198 return 0;\r
199 }\r
200 pbuf[0] = len;\r
201 memcpy((char *)(pbuf+1), PyString_AsString(v), len);\r
202 return 1;\r
203}\r
204\r
205/* Convert a Str255 to a Python string object */\r
206PyObject *\r
207PyMac_BuildStr255(Str255 s)\r
208{\r
209 if ( s == NULL ) {\r
210 PyErr_SetString(PyExc_SystemError, "Str255 pointer is NULL");\r
211 return NULL;\r
212 }\r
213 return PyString_FromStringAndSize((char *)&s[1], (int)s[0]);\r
214}\r
215\r
216PyObject *\r
217PyMac_BuildOptStr255(Str255 s)\r
218{\r
219 if ( s == NULL ) {\r
220 Py_INCREF(Py_None);\r
221 return Py_None;\r
222 }\r
223 return PyString_FromStringAndSize((char *)&s[1], (int)s[0]);\r
224}\r
225\r
226\r
227\r
228/* Convert a Python object to a Rect.\r
229 The object must be a (left, top, right, bottom) tuple.\r
230 (This differs from the order in the struct but is consistent with\r
231 the arguments to SetRect(), and also with STDWIN). */\r
232int\r
233PyMac_GetRect(PyObject *v, Rect *r)\r
234{\r
235 return PyArg_Parse(v, "(hhhh)", &r->left, &r->top, &r->right, &r->bottom);\r
236}\r
237\r
238/* Convert a Rect to a Python object */\r
239PyObject *\r
240PyMac_BuildRect(Rect *r)\r
241{\r
242 return Py_BuildValue("(hhhh)", r->left, r->top, r->right, r->bottom);\r
243}\r
244\r
245\r
246/* Convert a Python object to a Point.\r
247 The object must be a (h, v) tuple.\r
248 (This differs from the order in the struct but is consistent with\r
249 the arguments to SetPoint(), and also with STDWIN). */\r
250int\r
251PyMac_GetPoint(PyObject *v, Point *p)\r
252{\r
253 return PyArg_Parse(v, "(hh)", &p->h, &p->v);\r
254}\r
255\r
256/* Convert a Point to a Python object */\r
257PyObject *\r
258PyMac_BuildPoint(Point p)\r
259{\r
260 return Py_BuildValue("(hh)", p.h, p.v);\r
261}\r
262\r
263\r
264/* Convert a Python object to an EventRecord.\r
265 The object must be a (what, message, when, (v, h), modifiers) tuple. */\r
266int\r
267PyMac_GetEventRecord(PyObject *v, EventRecord *e)\r
268{\r
269 return PyArg_Parse(v, "(Hkk(hh)H)",\r
270 &e->what,\r
271 &e->message,\r
272 &e->when,\r
273 &e->where.h,\r
274 &e->where.v,\r
275 &e->modifiers);\r
276}\r
277\r
278/* Convert a Rect to an EventRecord object */\r
279PyObject *\r
280PyMac_BuildEventRecord(EventRecord *e)\r
281{\r
282 return Py_BuildValue("(hll(hh)h)",\r
283 e->what,\r
284 e->message,\r
285 e->when,\r
286 e->where.h,\r
287 e->where.v,\r
288 e->modifiers);\r
289}\r
290\r
291/* Convert Python object to Fixed */\r
292int\r
293PyMac_GetFixed(PyObject *v, Fixed *f)\r
294{\r
295 double d;\r
296\r
297 if( !PyArg_Parse(v, "d", &d))\r
298 return 0;\r
299 *f = (Fixed)(d * 0x10000);\r
300 return 1;\r
301}\r
302\r
303/* Convert a Fixed to a Python object */\r
304PyObject *\r
305PyMac_BuildFixed(Fixed f)\r
306{\r
307 double d;\r
308\r
309 d = f;\r
310 d = d / 0x10000;\r
311 return Py_BuildValue("d", d);\r
312}\r
313\r
314/* Convert wide to/from Python int or (hi, lo) tuple. XXXX Should use Python longs */\r
315int\r
316PyMac_Getwide(PyObject *v, wide *rv)\r
317{\r
318 if (PyInt_Check(v)) {\r
319 rv->hi = 0;\r
320 rv->lo = PyInt_AsLong(v);\r
321 if( rv->lo & 0x80000000 )\r
322 rv->hi = -1;\r
323 return 1;\r
324 }\r
325 return PyArg_Parse(v, "(kk)", &rv->hi, &rv->lo);\r
326}\r
327\r
328\r
329PyObject *\r
330PyMac_Buildwide(wide *w)\r
331{\r
332 if ( (w->hi == 0 && (w->lo & 0x80000000) == 0) ||\r
333 (w->hi == -1 && (w->lo & 0x80000000) ) )\r
334 return PyInt_FromLong(w->lo);\r
335 return Py_BuildValue("(ll)", w->hi, w->lo);\r
336}\r
337\r
338#ifdef USE_TOOLBOX_OBJECT_GLUE\r
339/*\r
340** Glue together the toolbox objects.\r
341**\r
342** Because toolbox modules interdepend on each other, they use each others\r
343** object types, on MacOSX/MachO this leads to the situation that they\r
344** cannot be dynamically loaded (or they would all have to be lumped into\r
345** a single .so, but this would be bad for extensibility).\r
346**\r
347** This file defines wrappers for all the _New and _Convert functions,\r
348** which are the Py_BuildValue and PyArg_ParseTuple helpers. The wrappers\r
349** check an indirection function pointer, and if it isn't filled in yet\r
350** they import the appropriate module, whose init routine should fill in\r
351** the pointer.\r
352*/\r
353\r
354#define GLUE_NEW(object, routinename, module) \\r
355PyObject *(*PyMacGluePtr_##routinename)(object); \\r
356\\r
357PyObject *routinename(object cobj) { \\r
358 if (!PyMacGluePtr_##routinename) { \\r
359 if (!PyImport_ImportModule(module)) return NULL; \\r
360 if (!PyMacGluePtr_##routinename) { \\r
361 PyErr_SetString(PyExc_ImportError, "Module did not provide routine: " module ": " #routinename); \\r
362 return NULL; \\r
363 } \\r
364 } \\r
365 return (*PyMacGluePtr_##routinename)(cobj); \\r
366}\r
367\r
368#define GLUE_CONVERT(object, routinename, module) \\r
369int (*PyMacGluePtr_##routinename)(PyObject *, object *); \\r
370\\r
371int routinename(PyObject *pyobj, object *cobj) { \\r
372 if (!PyMacGluePtr_##routinename) { \\r
373 if (!PyImport_ImportModule(module)) return 0; \\r
374 if (!PyMacGluePtr_##routinename) { \\r
375 PyErr_SetString(PyExc_ImportError, "Module did not provide routine: " module ": " #routinename); \\r
376 return 0; \\r
377 } \\r
378 } \\r
379 return (*PyMacGluePtr_##routinename)(pyobj, cobj); \\r
380}\r
381\r
382GLUE_NEW(FSSpec *, PyMac_BuildFSSpec, "Carbon.File")\r
383GLUE_CONVERT(FSSpec, PyMac_GetFSSpec, "Carbon.File")\r
384GLUE_NEW(FSRef *, PyMac_BuildFSRef, "Carbon.File")\r
385GLUE_CONVERT(FSRef, PyMac_GetFSRef, "Carbon.File")\r
386\r
387GLUE_NEW(AppleEvent *, AEDesc_New, "Carbon.AE") /* XXXX Why by address? */\r
388GLUE_NEW(AppleEvent *, AEDesc_NewBorrowed, "Carbon.AE")\r
389GLUE_CONVERT(AppleEvent, AEDesc_Convert, "Carbon.AE")\r
390\r
391GLUE_NEW(Component, CmpObj_New, "Carbon.Cm")\r
392GLUE_CONVERT(Component, CmpObj_Convert, "Carbon.Cm")\r
393GLUE_NEW(ComponentInstance, CmpInstObj_New, "Carbon.Cm")\r
394GLUE_CONVERT(ComponentInstance, CmpInstObj_Convert, "Carbon.Cm")\r
395\r
396GLUE_NEW(ControlHandle, CtlObj_New, "Carbon.Ctl")\r
397GLUE_CONVERT(ControlHandle, CtlObj_Convert, "Carbon.Ctl")\r
398\r
399GLUE_NEW(DialogPtr, DlgObj_New, "Carbon.Dlg")\r
400GLUE_CONVERT(DialogPtr, DlgObj_Convert, "Carbon.Dlg")\r
401GLUE_NEW(DialogPtr, DlgObj_WhichDialog, "Carbon.Dlg")\r
402\r
403GLUE_NEW(DragReference, DragObj_New, "Carbon.Drag")\r
404GLUE_CONVERT(DragReference, DragObj_Convert, "Carbon.Drag")\r
405\r
406GLUE_NEW(ListHandle, ListObj_New, "Carbon.List")\r
407GLUE_CONVERT(ListHandle, ListObj_Convert, "Carbon.List")\r
408\r
409GLUE_NEW(MenuHandle, MenuObj_New, "Carbon.Menu")\r
410GLUE_CONVERT(MenuHandle, MenuObj_Convert, "Carbon.Menu")\r
411\r
412GLUE_NEW(GrafPtr, GrafObj_New, "Carbon.Qd")\r
413GLUE_CONVERT(GrafPtr, GrafObj_Convert, "Carbon.Qd")\r
414GLUE_NEW(BitMapPtr, BMObj_New, "Carbon.Qd")\r
415GLUE_CONVERT(BitMapPtr, BMObj_Convert, "Carbon.Qd")\r
416GLUE_NEW(RGBColor *, QdRGB_New, "Carbon.Qd") /* XXXX Why? */\r
417GLUE_CONVERT(RGBColor, QdRGB_Convert, "Carbon.Qd")\r
418\r
419GLUE_NEW(GWorldPtr, GWorldObj_New, "Carbon.Qdoffs")\r
420GLUE_CONVERT(GWorldPtr, GWorldObj_Convert, "Carbon.Qdoffs")\r
421\r
422#ifndef __LP64__\r
423GLUE_NEW(Track, TrackObj_New, "Carbon.Qt")\r
424GLUE_CONVERT(Track, TrackObj_Convert, "Carbon.Qt")\r
425GLUE_NEW(Movie, MovieObj_New, "Carbon.Qt")\r
426GLUE_CONVERT(Movie, MovieObj_Convert, "Carbon.Qt")\r
427GLUE_NEW(MovieController, MovieCtlObj_New, "Carbon.Qt")\r
428GLUE_CONVERT(MovieController, MovieCtlObj_Convert, "Carbon.Qt")\r
429GLUE_NEW(TimeBase, TimeBaseObj_New, "Carbon.Qt")\r
430GLUE_CONVERT(TimeBase, TimeBaseObj_Convert, "Carbon.Qt")\r
431GLUE_NEW(UserData, UserDataObj_New, "Carbon.Qt")\r
432GLUE_CONVERT(UserData, UserDataObj_Convert, "Carbon.Qt")\r
433GLUE_NEW(Media, MediaObj_New, "Carbon.Qt")\r
434GLUE_CONVERT(Media, MediaObj_Convert, "Carbon.Qt")\r
435#endif /* !__LP64__ */\r
436\r
437GLUE_NEW(Handle, ResObj_New, "Carbon.Res")\r
438GLUE_CONVERT(Handle, ResObj_Convert, "Carbon.Res")\r
439GLUE_NEW(Handle, OptResObj_New, "Carbon.Res")\r
440GLUE_CONVERT(Handle, OptResObj_Convert, "Carbon.Res")\r
441\r
442GLUE_NEW(TEHandle, TEObj_New, "Carbon.TE")\r
443GLUE_CONVERT(TEHandle, TEObj_Convert, "Carbon.TE")\r
444\r
445GLUE_NEW(WindowPtr, WinObj_New, "Carbon.Win")\r
446GLUE_CONVERT(WindowPtr, WinObj_Convert, "Carbon.Win")\r
447GLUE_NEW(WindowPtr, WinObj_WhichWindow, "Carbon.Win")\r
448\r
449GLUE_CONVERT(CFTypeRef, CFObj_Convert, "Carbon.CF")\r
450GLUE_NEW(CFTypeRef, CFObj_New, "Carbon.CF")\r
451\r
452GLUE_CONVERT(CFTypeRef, CFTypeRefObj_Convert, "Carbon.CF")\r
453GLUE_NEW(CFTypeRef, CFTypeRefObj_New, "Carbon.CF")\r
454\r
455GLUE_CONVERT(CFStringRef, CFStringRefObj_Convert, "Carbon.CF")\r
456GLUE_NEW(CFStringRef, CFStringRefObj_New, "Carbon.CF")\r
457GLUE_CONVERT(CFMutableStringRef, CFMutableStringRefObj_Convert, "Carbon.CF")\r
458GLUE_NEW(CFMutableStringRef, CFMutableStringRefObj_New, "Carbon.CF")\r
459\r
460GLUE_CONVERT(CFArrayRef, CFArrayRefObj_Convert, "Carbon.CF")\r
461GLUE_NEW(CFArrayRef, CFArrayRefObj_New, "Carbon.CF")\r
462GLUE_CONVERT(CFMutableArrayRef, CFMutableArrayRefObj_Convert, "Carbon.CF")\r
463GLUE_NEW(CFMutableArrayRef, CFMutableArrayRefObj_New, "Carbon.CF")\r
464\r
465GLUE_CONVERT(CFDictionaryRef, CFDictionaryRefObj_Convert, "Carbon.CF")\r
466GLUE_NEW(CFDictionaryRef, CFDictionaryRefObj_New, "Carbon.CF")\r
467GLUE_CONVERT(CFMutableDictionaryRef, CFMutableDictionaryRefObj_Convert, "Carbon.CF")\r
468GLUE_NEW(CFMutableDictionaryRef, CFMutableDictionaryRefObj_New, "Carbon.CF")\r
469\r
470GLUE_CONVERT(CFURLRef, CFURLRefObj_Convert, "Carbon.CF")\r
471GLUE_CONVERT(CFURLRef, OptionalCFURLRefObj_Convert, "Carbon.CF")\r
472GLUE_NEW(CFURLRef, CFURLRefObj_New, "Carbon.CF")\r
473\r
474#endif /* USE_TOOLBOX_OBJECT_GLUE */\r