]>
Commit | Line | Data |
---|---|---|
4710c53d | 1 | /***********************************************************\r |
2 | Copyright 1991-1997 by Stichting Mathematisch Centrum, Amsterdam,\r | |
3 | The Netherlands.\r | |
4 | \r | |
5 | All Rights Reserved\r | |
6 | \r | |
7 | Permission to use, copy, modify, and distribute this software and its\r | |
8 | documentation for any purpose and without fee is hereby granted,\r | |
9 | provided that the above copyright notice appear in all copies and that\r | |
10 | both that copyright notice and this permission notice appear in\r | |
11 | supporting documentation, and that the names of Stichting Mathematisch\r | |
12 | Centrum or CWI not be used in advertising or publicity pertaining to\r | |
13 | distribution of the software without specific, written prior permission.\r | |
14 | \r | |
15 | STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO\r | |
16 | THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\r | |
17 | FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE\r | |
18 | FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\r | |
19 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\r | |
20 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT\r | |
21 | OF 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 | |
32 | char *\r | |
33 | PyMac_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 | |
70 | PyObject *PyMac_OSErrException;\r | |
71 | \r | |
72 | /* Initialize and return PyMac_OSErrException */\r | |
73 | PyObject *\r | |
74 | PyMac_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 | |
82 | PyObject *\r | |
83 | PyErr_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 | |
102 | PyObject *\r | |
103 | PyMac_Error(OSErr err)\r | |
104 | {\r | |
105 | return PyErr_Mac(PyMac_GetOSErrException(), err);\r | |
106 | }\r | |
107 | \r | |
108 | \r | |
109 | #ifndef __LP64__\r | |
110 | OSErr\r | |
111 | PyMac_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 | |
160 | int\r | |
161 | PyMac_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 | |
175 | PyObject *\r | |
176 | PyMac_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 | |
183 | PyObject *\r | |
184 | PyMac_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 | |
191 | int\r | |
192 | PyMac_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 | |
206 | PyObject *\r | |
207 | PyMac_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 | |
216 | PyObject *\r | |
217 | PyMac_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 | |
232 | int\r | |
233 | PyMac_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 | |
239 | PyObject *\r | |
240 | PyMac_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 | |
250 | int\r | |
251 | PyMac_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 | |
257 | PyObject *\r | |
258 | PyMac_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 | |
266 | int\r | |
267 | PyMac_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 | |
279 | PyObject *\r | |
280 | PyMac_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 | |
292 | int\r | |
293 | PyMac_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 | |
304 | PyObject *\r | |
305 | PyMac_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 | |
315 | int\r | |
316 | PyMac_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 | |
329 | PyObject *\r | |
330 | PyMac_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 | |
355 | PyObject *(*PyMacGluePtr_##routinename)(object); \\r | |
356 | \\r | |
357 | PyObject *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 | |
369 | int (*PyMacGluePtr_##routinename)(PyObject *, object *); \\r | |
370 | \\r | |
371 | int 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 | |
382 | GLUE_NEW(FSSpec *, PyMac_BuildFSSpec, "Carbon.File")\r | |
383 | GLUE_CONVERT(FSSpec, PyMac_GetFSSpec, "Carbon.File")\r | |
384 | GLUE_NEW(FSRef *, PyMac_BuildFSRef, "Carbon.File")\r | |
385 | GLUE_CONVERT(FSRef, PyMac_GetFSRef, "Carbon.File")\r | |
386 | \r | |
387 | GLUE_NEW(AppleEvent *, AEDesc_New, "Carbon.AE") /* XXXX Why by address? */\r | |
388 | GLUE_NEW(AppleEvent *, AEDesc_NewBorrowed, "Carbon.AE")\r | |
389 | GLUE_CONVERT(AppleEvent, AEDesc_Convert, "Carbon.AE")\r | |
390 | \r | |
391 | GLUE_NEW(Component, CmpObj_New, "Carbon.Cm")\r | |
392 | GLUE_CONVERT(Component, CmpObj_Convert, "Carbon.Cm")\r | |
393 | GLUE_NEW(ComponentInstance, CmpInstObj_New, "Carbon.Cm")\r | |
394 | GLUE_CONVERT(ComponentInstance, CmpInstObj_Convert, "Carbon.Cm")\r | |
395 | \r | |
396 | GLUE_NEW(ControlHandle, CtlObj_New, "Carbon.Ctl")\r | |
397 | GLUE_CONVERT(ControlHandle, CtlObj_Convert, "Carbon.Ctl")\r | |
398 | \r | |
399 | GLUE_NEW(DialogPtr, DlgObj_New, "Carbon.Dlg")\r | |
400 | GLUE_CONVERT(DialogPtr, DlgObj_Convert, "Carbon.Dlg")\r | |
401 | GLUE_NEW(DialogPtr, DlgObj_WhichDialog, "Carbon.Dlg")\r | |
402 | \r | |
403 | GLUE_NEW(DragReference, DragObj_New, "Carbon.Drag")\r | |
404 | GLUE_CONVERT(DragReference, DragObj_Convert, "Carbon.Drag")\r | |
405 | \r | |
406 | GLUE_NEW(ListHandle, ListObj_New, "Carbon.List")\r | |
407 | GLUE_CONVERT(ListHandle, ListObj_Convert, "Carbon.List")\r | |
408 | \r | |
409 | GLUE_NEW(MenuHandle, MenuObj_New, "Carbon.Menu")\r | |
410 | GLUE_CONVERT(MenuHandle, MenuObj_Convert, "Carbon.Menu")\r | |
411 | \r | |
412 | GLUE_NEW(GrafPtr, GrafObj_New, "Carbon.Qd")\r | |
413 | GLUE_CONVERT(GrafPtr, GrafObj_Convert, "Carbon.Qd")\r | |
414 | GLUE_NEW(BitMapPtr, BMObj_New, "Carbon.Qd")\r | |
415 | GLUE_CONVERT(BitMapPtr, BMObj_Convert, "Carbon.Qd")\r | |
416 | GLUE_NEW(RGBColor *, QdRGB_New, "Carbon.Qd") /* XXXX Why? */\r | |
417 | GLUE_CONVERT(RGBColor, QdRGB_Convert, "Carbon.Qd")\r | |
418 | \r | |
419 | GLUE_NEW(GWorldPtr, GWorldObj_New, "Carbon.Qdoffs")\r | |
420 | GLUE_CONVERT(GWorldPtr, GWorldObj_Convert, "Carbon.Qdoffs")\r | |
421 | \r | |
422 | #ifndef __LP64__\r | |
423 | GLUE_NEW(Track, TrackObj_New, "Carbon.Qt")\r | |
424 | GLUE_CONVERT(Track, TrackObj_Convert, "Carbon.Qt")\r | |
425 | GLUE_NEW(Movie, MovieObj_New, "Carbon.Qt")\r | |
426 | GLUE_CONVERT(Movie, MovieObj_Convert, "Carbon.Qt")\r | |
427 | GLUE_NEW(MovieController, MovieCtlObj_New, "Carbon.Qt")\r | |
428 | GLUE_CONVERT(MovieController, MovieCtlObj_Convert, "Carbon.Qt")\r | |
429 | GLUE_NEW(TimeBase, TimeBaseObj_New, "Carbon.Qt")\r | |
430 | GLUE_CONVERT(TimeBase, TimeBaseObj_Convert, "Carbon.Qt")\r | |
431 | GLUE_NEW(UserData, UserDataObj_New, "Carbon.Qt")\r | |
432 | GLUE_CONVERT(UserData, UserDataObj_Convert, "Carbon.Qt")\r | |
433 | GLUE_NEW(Media, MediaObj_New, "Carbon.Qt")\r | |
434 | GLUE_CONVERT(Media, MediaObj_Convert, "Carbon.Qt")\r | |
435 | #endif /* !__LP64__ */\r | |
436 | \r | |
437 | GLUE_NEW(Handle, ResObj_New, "Carbon.Res")\r | |
438 | GLUE_CONVERT(Handle, ResObj_Convert, "Carbon.Res")\r | |
439 | GLUE_NEW(Handle, OptResObj_New, "Carbon.Res")\r | |
440 | GLUE_CONVERT(Handle, OptResObj_Convert, "Carbon.Res")\r | |
441 | \r | |
442 | GLUE_NEW(TEHandle, TEObj_New, "Carbon.TE")\r | |
443 | GLUE_CONVERT(TEHandle, TEObj_Convert, "Carbon.TE")\r | |
444 | \r | |
445 | GLUE_NEW(WindowPtr, WinObj_New, "Carbon.Win")\r | |
446 | GLUE_CONVERT(WindowPtr, WinObj_Convert, "Carbon.Win")\r | |
447 | GLUE_NEW(WindowPtr, WinObj_WhichWindow, "Carbon.Win")\r | |
448 | \r | |
449 | GLUE_CONVERT(CFTypeRef, CFObj_Convert, "Carbon.CF")\r | |
450 | GLUE_NEW(CFTypeRef, CFObj_New, "Carbon.CF")\r | |
451 | \r | |
452 | GLUE_CONVERT(CFTypeRef, CFTypeRefObj_Convert, "Carbon.CF")\r | |
453 | GLUE_NEW(CFTypeRef, CFTypeRefObj_New, "Carbon.CF")\r | |
454 | \r | |
455 | GLUE_CONVERT(CFStringRef, CFStringRefObj_Convert, "Carbon.CF")\r | |
456 | GLUE_NEW(CFStringRef, CFStringRefObj_New, "Carbon.CF")\r | |
457 | GLUE_CONVERT(CFMutableStringRef, CFMutableStringRefObj_Convert, "Carbon.CF")\r | |
458 | GLUE_NEW(CFMutableStringRef, CFMutableStringRefObj_New, "Carbon.CF")\r | |
459 | \r | |
460 | GLUE_CONVERT(CFArrayRef, CFArrayRefObj_Convert, "Carbon.CF")\r | |
461 | GLUE_NEW(CFArrayRef, CFArrayRefObj_New, "Carbon.CF")\r | |
462 | GLUE_CONVERT(CFMutableArrayRef, CFMutableArrayRefObj_Convert, "Carbon.CF")\r | |
463 | GLUE_NEW(CFMutableArrayRef, CFMutableArrayRefObj_New, "Carbon.CF")\r | |
464 | \r | |
465 | GLUE_CONVERT(CFDictionaryRef, CFDictionaryRefObj_Convert, "Carbon.CF")\r | |
466 | GLUE_NEW(CFDictionaryRef, CFDictionaryRefObj_New, "Carbon.CF")\r | |
467 | GLUE_CONVERT(CFMutableDictionaryRef, CFMutableDictionaryRefObj_Convert, "Carbon.CF")\r | |
468 | GLUE_NEW(CFMutableDictionaryRef, CFMutableDictionaryRefObj_New, "Carbon.CF")\r | |
469 | \r | |
470 | GLUE_CONVERT(CFURLRef, CFURLRefObj_Convert, "Carbon.CF")\r | |
471 | GLUE_CONVERT(CFURLRef, OptionalCFURLRefObj_Convert, "Carbon.CF")\r | |
472 | GLUE_NEW(CFURLRef, CFURLRefObj_New, "Carbon.CF")\r | |
473 | \r | |
474 | #endif /* USE_TOOLBOX_OBJECT_GLUE */\r |