Home | History | Annotate | Download | only in launch
      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 
    482