Avoid signed overflow in some xrange calculations, and extend
[python.git] / Mac / Modules / launch / _Launchmodule.c
blobfa21eced81d1cf3154615e61c9748816f7225ac3
2 /* ========================= Module _Launch ========================= */
4 #include "Python.h"
8 #include "pymactoolbox.h"
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)
18 #if PY_VERSION_HEX < 0x02040000
19 PyObject *PyMac_GetOSErrException(void);
20 #endif
22 #include <ApplicationServices/ApplicationServices.h>
25 ** Optional CFStringRef. None will pass NULL
27 static int
28 OptCFStringRefObj_Convert(PyObject *v, CFStringRef *spec)
30 if (v == Py_None) {
31 *spec = NULL;
32 return 1;
34 return CFStringRefObj_Convert(v, spec);
37 PyObject *
38 OptCFStringRefObj_New(CFStringRef it)
40 if (it == NULL) {
41 Py_INCREF(Py_None);
42 return Py_None;
44 return CFStringRefObj_New(it);
48 ** Convert LSItemInfoRecord to Python.
50 PyObject *
51 LSItemInfoRecord_New(LSItemInfoRecord *it)
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
70 static PyObject *Launch_Error;
72 static PyObject *Launch_LSCopyItemInfoForRef(PyObject *_self, PyObject *_args)
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;
92 static PyObject *Launch_LSCopyItemInfoForURL(PyObject *_self, PyObject *_args)
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;
112 static PyObject *Launch_LSGetExtensionInfo(PyObject *_self, PyObject *_args)
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;
132 static PyObject *Launch_LSCopyDisplayNameForRef(PyObject *_self, PyObject *_args)
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;
149 static PyObject *Launch_LSCopyDisplayNameForURL(PyObject *_self, PyObject *_args)
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;
166 static PyObject *Launch_LSSetExtensionHiddenForRef(PyObject *_self, PyObject *_args)
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;
184 static PyObject *Launch_LSSetExtensionHiddenForURL(PyObject *_self, PyObject *_args)
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;
202 static PyObject *Launch_LSCopyKindStringForRef(PyObject *_self, PyObject *_args)
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;
219 static PyObject *Launch_LSCopyKindStringForURL(PyObject *_self, PyObject *_args)
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;
236 static PyObject *Launch_LSGetApplicationForItem(PyObject *_self, PyObject *_args)
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;
259 static PyObject *Launch_LSGetApplicationForInfo(PyObject *_self, PyObject *_args)
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;
288 static PyObject *Launch_LSGetApplicationForURL(PyObject *_self, PyObject *_args)
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;
311 static PyObject *Launch_LSFindApplicationForInfo(PyObject *_self, PyObject *_args)
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;
337 static PyObject *Launch_LSCanRefAcceptItem(PyObject *_self, PyObject *_args)
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;
363 static PyObject *Launch_LSCanURLAcceptURL(PyObject *_self, PyObject *_args)
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;
389 static PyObject *Launch_LSOpenFSRef(PyObject *_self, PyObject *_args)
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;
406 static PyObject *Launch_LSOpenCFURLRef(PyObject *_self, PyObject *_args)
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;
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}
464 void init_Launch(void)
466 PyObject *m;
467 PyObject *d;
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;
480 /* ======================= End module _Launch ======================= */