]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/python/contrib/Mac/Modules/launch/_Launchmodule.c
Inital import
[l4.git] / l4 / pkg / python / contrib / Mac / Modules / launch / _Launchmodule.c
1
2 /* ========================= Module _Launch ========================= */
3
4 #include "Python.h"
5
6
7
8 #include "pymactoolbox.h"
9
10 /* Macro to test whether a weak-loaded CFM function exists */
11 #define PyMac_PRECHECK(rtn) do { if ( &rtn == NULL )  {\
12         PyErr_SetString(PyExc_NotImplementedError, \
13         "Not available in this shared library/OS version"); \
14         return NULL; \
15     }} while(0)
16
17
18 #if PY_VERSION_HEX < 0x02040000
19 PyObject *PyMac_GetOSErrException(void);
20 #endif
21
22 #include <ApplicationServices/ApplicationServices.h>
23
24 /*
25 ** Optional CFStringRef. None will pass NULL
26 */
27 static int
28 OptCFStringRefObj_Convert(PyObject *v, CFStringRef *spec)
29 {
30         if (v == Py_None) {
31                 *spec = NULL;
32                 return 1;
33         }
34         return CFStringRefObj_Convert(v, spec);
35 }
36
37 PyObject *
38 OptCFStringRefObj_New(CFStringRef it)
39 {
40         if (it == NULL) {
41                 Py_INCREF(Py_None);
42                 return Py_None;
43         }
44         return CFStringRefObj_New(it);
45 }
46
47 /*
48 ** Convert LSItemInfoRecord to Python.
49 */
50 PyObject *
51 LSItemInfoRecord_New(LSItemInfoRecord *it)
52 {
53 #ifndef __LP64__
54         return Py_BuildValue("{s:is:O&s:O&s:O&s:O&s:i}",
55                 "flags", it->flags,
56                 "filetype", PyMac_BuildOSType, it->filetype,
57                 "creator", PyMac_BuildOSType, it->creator,
58                 "extension", OptCFStringRefObj_New, it->extension,
59                 "iconFileName", OptCFStringRefObj_New, it->iconFileName,
60                 "kindID", it->kindID);
61 #else
62         return Py_BuildValue("{s:is:O&s:O&s:O&}",
63                 "flags", it->flags,
64                 "filetype", PyMac_BuildOSType, it->filetype,
65                 "creator", PyMac_BuildOSType, it->creator,
66                 "extension", OptCFStringRefObj_New, it->extension);
67 #endif
68 }
69
70 static PyObject *Launch_Error;
71
72 static PyObject *Launch_LSCopyItemInfoForRef(PyObject *_self, PyObject *_args)
73 {
74         PyObject *_res = NULL;
75         OSStatus _err;
76         FSRef inItemRef;
77         LSRequestedInfo inWhichInfo;
78         LSItemInfoRecord outItemInfo;
79         if (!PyArg_ParseTuple(_args, "O&l",
80                               PyMac_GetFSRef, &inItemRef,
81                               &inWhichInfo))
82                 return NULL;
83         _err = LSCopyItemInfoForRef(&inItemRef,
84                                     inWhichInfo,
85                                     &outItemInfo);
86         if (_err != noErr) return PyMac_Error(_err);
87         _res = Py_BuildValue("O&",
88                              LSItemInfoRecord_New, &outItemInfo);
89         return _res;
90 }
91
92 static PyObject *Launch_LSCopyItemInfoForURL(PyObject *_self, PyObject *_args)
93 {
94         PyObject *_res = NULL;
95         OSStatus _err;
96         CFURLRef inURL;
97         LSRequestedInfo inWhichInfo;
98         LSItemInfoRecord outItemInfo;
99         if (!PyArg_ParseTuple(_args, "O&l",
100                               CFURLRefObj_Convert, &inURL,
101                               &inWhichInfo))
102                 return NULL;
103         _err = LSCopyItemInfoForURL(inURL,
104                                     inWhichInfo,
105                                     &outItemInfo);
106         if (_err != noErr) return PyMac_Error(_err);
107         _res = Py_BuildValue("O&",
108                              LSItemInfoRecord_New, &outItemInfo);
109         return _res;
110 }
111
112 static PyObject *Launch_LSGetExtensionInfo(PyObject *_self, PyObject *_args)
113 {
114         PyObject *_res = NULL;
115         OSStatus _err;
116         UniChar *inNameLen__in__;
117         UniCharCount inNameLen__len__;
118         int inNameLen__in_len__;
119         UniCharCount outExtStartIndex;
120         if (!PyArg_ParseTuple(_args, "u#",
121                               &inNameLen__in__, &inNameLen__in_len__))
122                 return NULL;
123         inNameLen__len__ = inNameLen__in_len__;
124         _err = LSGetExtensionInfo(inNameLen__len__, inNameLen__in__,
125                                   &outExtStartIndex);
126         if (_err != noErr) return PyMac_Error(_err);
127         _res = Py_BuildValue("l",
128                              outExtStartIndex);
129         return _res;
130 }
131
132 static PyObject *Launch_LSCopyDisplayNameForRef(PyObject *_self, PyObject *_args)
133 {
134         PyObject *_res = NULL;
135         OSStatus _err;
136         FSRef inRef;
137         CFStringRef outDisplayName;
138         if (!PyArg_ParseTuple(_args, "O&",
139                               PyMac_GetFSRef, &inRef))
140                 return NULL;
141         _err = LSCopyDisplayNameForRef(&inRef,
142                                        &outDisplayName);
143         if (_err != noErr) return PyMac_Error(_err);
144         _res = Py_BuildValue("O&",
145                              CFStringRefObj_New, outDisplayName);
146         return _res;
147 }
148
149 static PyObject *Launch_LSCopyDisplayNameForURL(PyObject *_self, PyObject *_args)
150 {
151         PyObject *_res = NULL;
152         OSStatus _err;
153         CFURLRef inURL;
154         CFStringRef outDisplayName;
155         if (!PyArg_ParseTuple(_args, "O&",
156                               CFURLRefObj_Convert, &inURL))
157                 return NULL;
158         _err = LSCopyDisplayNameForURL(inURL,
159                                        &outDisplayName);
160         if (_err != noErr) return PyMac_Error(_err);
161         _res = Py_BuildValue("O&",
162                              CFStringRefObj_New, outDisplayName);
163         return _res;
164 }
165
166 static PyObject *Launch_LSSetExtensionHiddenForRef(PyObject *_self, PyObject *_args)
167 {
168         PyObject *_res = NULL;
169         OSStatus _err;
170         FSRef inRef;
171         Boolean inHide;
172         if (!PyArg_ParseTuple(_args, "O&b",
173                               PyMac_GetFSRef, &inRef,
174                               &inHide))
175                 return NULL;
176         _err = LSSetExtensionHiddenForRef(&inRef,
177                                           inHide);
178         if (_err != noErr) return PyMac_Error(_err);
179         Py_INCREF(Py_None);
180         _res = Py_None;
181         return _res;
182 }
183
184 static PyObject *Launch_LSSetExtensionHiddenForURL(PyObject *_self, PyObject *_args)
185 {
186         PyObject *_res = NULL;
187         OSStatus _err;
188         CFURLRef inURL;
189         Boolean inHide;
190         if (!PyArg_ParseTuple(_args, "O&b",
191                               CFURLRefObj_Convert, &inURL,
192                               &inHide))
193                 return NULL;
194         _err = LSSetExtensionHiddenForURL(inURL,
195                                           inHide);
196         if (_err != noErr) return PyMac_Error(_err);
197         Py_INCREF(Py_None);
198         _res = Py_None;
199         return _res;
200 }
201
202 static PyObject *Launch_LSCopyKindStringForRef(PyObject *_self, PyObject *_args)
203 {
204         PyObject *_res = NULL;
205         OSStatus _err;
206         FSRef inFSRef;
207         CFStringRef outKindString;
208         if (!PyArg_ParseTuple(_args, "O&",
209                               PyMac_GetFSRef, &inFSRef))
210                 return NULL;
211         _err = LSCopyKindStringForRef(&inFSRef,
212                                       &outKindString);
213         if (_err != noErr) return PyMac_Error(_err);
214         _res = Py_BuildValue("O&",
215                              CFStringRefObj_New, outKindString);
216         return _res;
217 }
218
219 static PyObject *Launch_LSCopyKindStringForURL(PyObject *_self, PyObject *_args)
220 {
221         PyObject *_res = NULL;
222         OSStatus _err;
223         CFURLRef inURL;
224         CFStringRef outKindString;
225         if (!PyArg_ParseTuple(_args, "O&",
226                               CFURLRefObj_Convert, &inURL))
227                 return NULL;
228         _err = LSCopyKindStringForURL(inURL,
229                                       &outKindString);
230         if (_err != noErr) return PyMac_Error(_err);
231         _res = Py_BuildValue("O&",
232                              CFStringRefObj_New, outKindString);
233         return _res;
234 }
235
236 static PyObject *Launch_LSGetApplicationForItem(PyObject *_self, PyObject *_args)
237 {
238         PyObject *_res = NULL;
239         OSStatus _err;
240         FSRef inItemRef;
241         LSRolesMask inRoleMask;
242         FSRef outAppRef;
243         CFURLRef outAppURL;
244         if (!PyArg_ParseTuple(_args, "O&l",
245                               PyMac_GetFSRef, &inItemRef,
246                               &inRoleMask))
247                 return NULL;
248         _err = LSGetApplicationForItem(&inItemRef,
249                                        inRoleMask,
250                                        &outAppRef,
251                                        &outAppURL);
252         if (_err != noErr) return PyMac_Error(_err);
253         _res = Py_BuildValue("O&O&",
254                              PyMac_BuildFSRef, &outAppRef,
255                              CFURLRefObj_New, outAppURL);
256         return _res;
257 }
258
259 static PyObject *Launch_LSGetApplicationForInfo(PyObject *_self, PyObject *_args)
260 {
261         PyObject *_res = NULL;
262         OSStatus _err;
263         OSType inType;
264         OSType inCreator;
265         CFStringRef inExtension;
266         LSRolesMask inRoleMask;
267         FSRef outAppRef;
268         CFURLRef outAppURL;
269         if (!PyArg_ParseTuple(_args, "O&O&O&l",
270                               PyMac_GetOSType, &inType,
271                               PyMac_GetOSType, &inCreator,
272                               OptCFStringRefObj_Convert, &inExtension,
273                               &inRoleMask))
274                 return NULL;
275         _err = LSGetApplicationForInfo(inType,
276                                        inCreator,
277                                        inExtension,
278                                        inRoleMask,
279                                        &outAppRef,
280                                        &outAppURL);
281         if (_err != noErr) return PyMac_Error(_err);
282         _res = Py_BuildValue("O&O&",
283                              PyMac_BuildFSRef, &outAppRef,
284                              CFURLRefObj_New, outAppURL);
285         return _res;
286 }
287
288 static PyObject *Launch_LSGetApplicationForURL(PyObject *_self, PyObject *_args)
289 {
290         PyObject *_res = NULL;
291         OSStatus _err;
292         CFURLRef inURL;
293         LSRolesMask inRoleMask;
294         FSRef outAppRef;
295         CFURLRef outAppURL;
296         if (!PyArg_ParseTuple(_args, "O&l",
297                               CFURLRefObj_Convert, &inURL,
298                               &inRoleMask))
299                 return NULL;
300         _err = LSGetApplicationForURL(inURL,
301                                       inRoleMask,
302                                       &outAppRef,
303                                       &outAppURL);
304         if (_err != noErr) return PyMac_Error(_err);
305         _res = Py_BuildValue("O&O&",
306                              PyMac_BuildFSRef, &outAppRef,
307                              CFURLRefObj_New, outAppURL);
308         return _res;
309 }
310
311 static PyObject *Launch_LSFindApplicationForInfo(PyObject *_self, PyObject *_args)
312 {
313         PyObject *_res = NULL;
314         OSStatus _err;
315         OSType inCreator;
316         CFStringRef inBundleID;
317         CFStringRef inName;
318         FSRef outAppRef;
319         CFURLRef outAppURL;
320         if (!PyArg_ParseTuple(_args, "O&O&O&",
321                               PyMac_GetOSType, &inCreator,
322                               OptCFStringRefObj_Convert, &inBundleID,
323                               OptCFStringRefObj_Convert, &inName))
324                 return NULL;
325         _err = LSFindApplicationForInfo(inCreator,
326                                         inBundleID,
327                                         inName,
328                                         &outAppRef,
329                                         &outAppURL);
330         if (_err != noErr) return PyMac_Error(_err);
331         _res = Py_BuildValue("O&O&",
332                              PyMac_BuildFSRef, &outAppRef,
333                              CFURLRefObj_New, outAppURL);
334         return _res;
335 }
336
337 static PyObject *Launch_LSCanRefAcceptItem(PyObject *_self, PyObject *_args)
338 {
339         PyObject *_res = NULL;
340         OSStatus _err;
341         FSRef inItemFSRef;
342         FSRef inTargetRef;
343         LSRolesMask inRoleMask;
344         LSAcceptanceFlags inFlags;
345         Boolean outAcceptsItem;
346         if (!PyArg_ParseTuple(_args, "O&O&ll",
347                               PyMac_GetFSRef, &inItemFSRef,
348                               PyMac_GetFSRef, &inTargetRef,
349                               &inRoleMask,
350                               &inFlags))
351                 return NULL;
352         _err = LSCanRefAcceptItem(&inItemFSRef,
353                                   &inTargetRef,
354                                   inRoleMask,
355                                   inFlags,
356                                   &outAcceptsItem);
357         if (_err != noErr) return PyMac_Error(_err);
358         _res = Py_BuildValue("b",
359                              outAcceptsItem);
360         return _res;
361 }
362
363 static PyObject *Launch_LSCanURLAcceptURL(PyObject *_self, PyObject *_args)
364 {
365         PyObject *_res = NULL;
366         OSStatus _err;
367         CFURLRef inItemURL;
368         CFURLRef inTargetURL;
369         LSRolesMask inRoleMask;
370         LSAcceptanceFlags inFlags;
371         Boolean outAcceptsItem;
372         if (!PyArg_ParseTuple(_args, "O&O&ll",
373                               CFURLRefObj_Convert, &inItemURL,
374                               CFURLRefObj_Convert, &inTargetURL,
375                               &inRoleMask,
376                               &inFlags))
377                 return NULL;
378         _err = LSCanURLAcceptURL(inItemURL,
379                                  inTargetURL,
380                                  inRoleMask,
381                                  inFlags,
382                                  &outAcceptsItem);
383         if (_err != noErr) return PyMac_Error(_err);
384         _res = Py_BuildValue("b",
385                              outAcceptsItem);
386         return _res;
387 }
388
389 static PyObject *Launch_LSOpenFSRef(PyObject *_self, PyObject *_args)
390 {
391         PyObject *_res = NULL;
392         OSStatus _err;
393         FSRef inRef;
394         FSRef outLaunchedRef;
395         if (!PyArg_ParseTuple(_args, "O&",
396                               PyMac_GetFSRef, &inRef))
397                 return NULL;
398         _err = LSOpenFSRef(&inRef,
399                            &outLaunchedRef);
400         if (_err != noErr) return PyMac_Error(_err);
401         _res = Py_BuildValue("O&",
402                              PyMac_BuildFSRef, &outLaunchedRef);
403         return _res;
404 }
405
406 static PyObject *Launch_LSOpenCFURLRef(PyObject *_self, PyObject *_args)
407 {
408         PyObject *_res = NULL;
409         OSStatus _err;
410         CFURLRef inURL;
411         CFURLRef outLaunchedURL;
412         if (!PyArg_ParseTuple(_args, "O&",
413                               CFURLRefObj_Convert, &inURL))
414                 return NULL;
415         _err = LSOpenCFURLRef(inURL,
416                               &outLaunchedURL);
417         if (_err != noErr) return PyMac_Error(_err);
418         _res = Py_BuildValue("O&",
419                              CFURLRefObj_New, outLaunchedURL);
420         return _res;
421 }
422
423 static PyMethodDef Launch_methods[] = {
424         {"LSCopyItemInfoForRef", (PyCFunction)Launch_LSCopyItemInfoForRef, 1,
425          PyDoc_STR("(FSRef inItemRef, LSRequestedInfo inWhichInfo) -> (LSItemInfoRecord outItemInfo)")},
426         {"LSCopyItemInfoForURL", (PyCFunction)Launch_LSCopyItemInfoForURL, 1,
427          PyDoc_STR("(CFURLRef inURL, LSRequestedInfo inWhichInfo) -> (LSItemInfoRecord outItemInfo)")},
428         {"LSGetExtensionInfo", (PyCFunction)Launch_LSGetExtensionInfo, 1,
429          PyDoc_STR("(Buffer inNameLen) -> (UniCharCount outExtStartIndex)")},
430         {"LSCopyDisplayNameForRef", (PyCFunction)Launch_LSCopyDisplayNameForRef, 1,
431          PyDoc_STR("(FSRef inRef) -> (CFStringRef outDisplayName)")},
432         {"LSCopyDisplayNameForURL", (PyCFunction)Launch_LSCopyDisplayNameForURL, 1,
433          PyDoc_STR("(CFURLRef inURL) -> (CFStringRef outDisplayName)")},
434         {"LSSetExtensionHiddenForRef", (PyCFunction)Launch_LSSetExtensionHiddenForRef, 1,
435          PyDoc_STR("(FSRef inRef, Boolean inHide) -> None")},
436         {"LSSetExtensionHiddenForURL", (PyCFunction)Launch_LSSetExtensionHiddenForURL, 1,
437          PyDoc_STR("(CFURLRef inURL, Boolean inHide) -> None")},
438         {"LSCopyKindStringForRef", (PyCFunction)Launch_LSCopyKindStringForRef, 1,
439          PyDoc_STR("(FSRef inFSRef) -> (CFStringRef outKindString)")},
440         {"LSCopyKindStringForURL", (PyCFunction)Launch_LSCopyKindStringForURL, 1,
441          PyDoc_STR("(CFURLRef inURL) -> (CFStringRef outKindString)")},
442         {"LSGetApplicationForItem", (PyCFunction)Launch_LSGetApplicationForItem, 1,
443          PyDoc_STR("(FSRef inItemRef, LSRolesMask inRoleMask) -> (FSRef outAppRef, CFURLRef outAppURL)")},
444         {"LSGetApplicationForInfo", (PyCFunction)Launch_LSGetApplicationForInfo, 1,
445          PyDoc_STR("(OSType inType, OSType inCreator, CFStringRef inExtension, LSRolesMask inRoleMask) -> (FSRef outAppRef, CFURLRef outAppURL)")},
446         {"LSGetApplicationForURL", (PyCFunction)Launch_LSGetApplicationForURL, 1,
447          PyDoc_STR("(CFURLRef inURL, LSRolesMask inRoleMask) -> (FSRef outAppRef, CFURLRef outAppURL)")},
448         {"LSFindApplicationForInfo", (PyCFunction)Launch_LSFindApplicationForInfo, 1,
449          PyDoc_STR("(OSType inCreator, CFStringRef inBundleID, CFStringRef inName) -> (FSRef outAppRef, CFURLRef outAppURL)")},
450         {"LSCanRefAcceptItem", (PyCFunction)Launch_LSCanRefAcceptItem, 1,
451          PyDoc_STR("(FSRef inItemFSRef, FSRef inTargetRef, LSRolesMask inRoleMask, LSAcceptanceFlags inFlags) -> (Boolean outAcceptsItem)")},
452         {"LSCanURLAcceptURL", (PyCFunction)Launch_LSCanURLAcceptURL, 1,
453          PyDoc_STR("(CFURLRef inItemURL, CFURLRef inTargetURL, LSRolesMask inRoleMask, LSAcceptanceFlags inFlags) -> (Boolean outAcceptsItem)")},
454         {"LSOpenFSRef", (PyCFunction)Launch_LSOpenFSRef, 1,
455          PyDoc_STR("(FSRef inRef) -> (FSRef outLaunchedRef)")},
456         {"LSOpenCFURLRef", (PyCFunction)Launch_LSOpenCFURLRef, 1,
457          PyDoc_STR("(CFURLRef inURL) -> (CFURLRef outLaunchedURL)")},
458         {NULL, NULL, 0}
459 };
460
461
462
463
464 void init_Launch(void)
465 {
466         PyObject *m;
467         PyObject *d;
468
469
470
471
472         m = Py_InitModule("_Launch", Launch_methods);
473         d = PyModule_GetDict(m);
474         Launch_Error = PyMac_GetOSErrException();
475         if (Launch_Error == NULL ||
476             PyDict_SetItemString(d, "Error", Launch_Error) != 0)
477                 return;
478 }
479
480 /* ======================= End module _Launch ======================= */
481