/* ========================= Module _Launch ========================= */ #include "Python.h" #include "pymactoolbox.h" /* Macro to test whether a weak-loaded CFM function exists */ #define PyMac_PRECHECK(rtn) do { if ( &rtn == NULL ) {\ PyErr_SetString(PyExc_NotImplementedError, \ "Not available in this shared library/OS version"); \ return NULL; \ }} while(0) #if PY_VERSION_HEX < 0x02040000 PyObject *PyMac_GetOSErrException(void); #endif #include <ApplicationServices/ApplicationServices.h> /* ** Optional CFStringRef. None will pass NULL */ static int OptCFStringRefObj_Convert(PyObject *v, CFStringRef *spec) { if (v == Py_None) { *spec = NULL; return 1; } return CFStringRefObj_Convert(v, spec); } PyObject * OptCFStringRefObj_New(CFStringRef it) { if (it == NULL) { Py_INCREF(Py_None); return Py_None; } return CFStringRefObj_New(it); } /* ** Convert LSItemInfoRecord to Python. */ PyObject * LSItemInfoRecord_New(LSItemInfoRecord *it) { #ifndef __LP64__ return Py_BuildValue("{s:is:O&s:O&s:O&s:O&s:i}", "flags", it->flags, "filetype", PyMac_BuildOSType, it->filetype, "creator", PyMac_BuildOSType, it->creator, "extension", OptCFStringRefObj_New, it->extension, "iconFileName", OptCFStringRefObj_New, it->iconFileName, "kindID", it->kindID); #else return Py_BuildValue("{s:is:O&s:O&s:O&}", "flags", it->flags, "filetype", PyMac_BuildOSType, it->filetype, "creator", PyMac_BuildOSType, it->creator, "extension", OptCFStringRefObj_New, it->extension); #endif } static PyObject *Launch_Error; static PyObject *Launch_LSCopyItemInfoForRef(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; OSStatus _err; FSRef inItemRef; LSRequestedInfo inWhichInfo; LSItemInfoRecord outItemInfo; if (!PyArg_ParseTuple(_args, "O&l", PyMac_GetFSRef, &inItemRef, &inWhichInfo)) return NULL; _err = LSCopyItemInfoForRef(&inItemRef, inWhichInfo, &outItemInfo); if (_err != noErr) return PyMac_Error(_err); _res = Py_BuildValue("O&", LSItemInfoRecord_New, &outItemInfo); return _res; } static PyObject *Launch_LSCopyItemInfoForURL(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; OSStatus _err; CFURLRef inURL; LSRequestedInfo inWhichInfo; LSItemInfoRecord outItemInfo; if (!PyArg_ParseTuple(_args, "O&l", CFURLRefObj_Convert, &inURL, &inWhichInfo)) return NULL; _err = LSCopyItemInfoForURL(inURL, inWhichInfo, &outItemInfo); if (_err != noErr) return PyMac_Error(_err); _res = Py_BuildValue("O&", LSItemInfoRecord_New, &outItemInfo); return _res; } static PyObject *Launch_LSGetExtensionInfo(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; OSStatus _err; UniChar *inNameLen__in__; UniCharCount inNameLen__len__; int inNameLen__in_len__; UniCharCount outExtStartIndex; if (!PyArg_ParseTuple(_args, "u#", &inNameLen__in__, &inNameLen__in_len__)) return NULL; inNameLen__len__ = inNameLen__in_len__; _err = LSGetExtensionInfo(inNameLen__len__, inNameLen__in__, &outExtStartIndex); if (_err != noErr) return PyMac_Error(_err); _res = Py_BuildValue("l", outExtStartIndex); return _res; } static PyObject *Launch_LSCopyDisplayNameForRef(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; OSStatus _err; FSRef inRef; CFStringRef outDisplayName; if (!PyArg_ParseTuple(_args, "O&", PyMac_GetFSRef, &inRef)) return NULL; _err = LSCopyDisplayNameForRef(&inRef, &outDisplayName); if (_err != noErr) return PyMac_Error(_err); _res = Py_BuildValue("O&", CFStringRefObj_New, outDisplayName); return _res; } static PyObject *Launch_LSCopyDisplayNameForURL(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; OSStatus _err; CFURLRef inURL; CFStringRef outDisplayName; if (!PyArg_ParseTuple(_args, "O&", CFURLRefObj_Convert, &inURL)) return NULL; _err = LSCopyDisplayNameForURL(inURL, &outDisplayName); if (_err != noErr) return PyMac_Error(_err); _res = Py_BuildValue("O&", CFStringRefObj_New, outDisplayName); return _res; } static PyObject *Launch_LSSetExtensionHiddenForRef(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; OSStatus _err; FSRef inRef; Boolean inHide; if (!PyArg_ParseTuple(_args, "O&b", PyMac_GetFSRef, &inRef, &inHide)) return NULL; _err = LSSetExtensionHiddenForRef(&inRef, inHide); if (_err != noErr) return PyMac_Error(_err); Py_INCREF(Py_None); _res = Py_None; return _res; } static PyObject *Launch_LSSetExtensionHiddenForURL(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; OSStatus _err; CFURLRef inURL; Boolean inHide; if (!PyArg_ParseTuple(_args, "O&b", CFURLRefObj_Convert, &inURL, &inHide)) return NULL; _err = LSSetExtensionHiddenForURL(inURL, inHide); if (_err != noErr) return PyMac_Error(_err); Py_INCREF(Py_None); _res = Py_None; return _res; } static PyObject *Launch_LSCopyKindStringForRef(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; OSStatus _err; FSRef inFSRef; CFStringRef outKindString; if (!PyArg_ParseTuple(_args, "O&", PyMac_GetFSRef, &inFSRef)) return NULL; _err = LSCopyKindStringForRef(&inFSRef, &outKindString); if (_err != noErr) return PyMac_Error(_err); _res = Py_BuildValue("O&", CFStringRefObj_New, outKindString); return _res; } static PyObject *Launch_LSCopyKindStringForURL(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; OSStatus _err; CFURLRef inURL; CFStringRef outKindString; if (!PyArg_ParseTuple(_args, "O&", CFURLRefObj_Convert, &inURL)) return NULL; _err = LSCopyKindStringForURL(inURL, &outKindString); if (_err != noErr) return PyMac_Error(_err); _res = Py_BuildValue("O&", CFStringRefObj_New, outKindString); return _res; } static PyObject *Launch_LSGetApplicationForItem(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; OSStatus _err; FSRef inItemRef; LSRolesMask inRoleMask; FSRef outAppRef; CFURLRef outAppURL; if (!PyArg_ParseTuple(_args, "O&l", PyMac_GetFSRef, &inItemRef, &inRoleMask)) return NULL; _err = LSGetApplicationForItem(&inItemRef, inRoleMask, &outAppRef, &outAppURL); if (_err != noErr) return PyMac_Error(_err); _res = Py_BuildValue("O&O&", PyMac_BuildFSRef, &outAppRef, CFURLRefObj_New, outAppURL); return _res; } static PyObject *Launch_LSGetApplicationForInfo(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; OSStatus _err; OSType inType; OSType inCreator; CFStringRef inExtension; LSRolesMask inRoleMask; FSRef outAppRef; CFURLRef outAppURL; if (!PyArg_ParseTuple(_args, "O&O&O&l", PyMac_GetOSType, &inType, PyMac_GetOSType, &inCreator, OptCFStringRefObj_Convert, &inExtension, &inRoleMask)) return NULL; _err = LSGetApplicationForInfo(inType, inCreator, inExtension, inRoleMask, &outAppRef, &outAppURL); if (_err != noErr) return PyMac_Error(_err); _res = Py_BuildValue("O&O&", PyMac_BuildFSRef, &outAppRef, CFURLRefObj_New, outAppURL); return _res; } static PyObject *Launch_LSGetApplicationForURL(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; OSStatus _err; CFURLRef inURL; LSRolesMask inRoleMask; FSRef outAppRef; CFURLRef outAppURL; if (!PyArg_ParseTuple(_args, "O&l", CFURLRefObj_Convert, &inURL, &inRoleMask)) return NULL; _err = LSGetApplicationForURL(inURL, inRoleMask, &outAppRef, &outAppURL); if (_err != noErr) return PyMac_Error(_err); _res = Py_BuildValue("O&O&", PyMac_BuildFSRef, &outAppRef, CFURLRefObj_New, outAppURL); return _res; } static PyObject *Launch_LSFindApplicationForInfo(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; OSStatus _err; OSType inCreator; CFStringRef inBundleID; CFStringRef inName; FSRef outAppRef; CFURLRef outAppURL; if (!PyArg_ParseTuple(_args, "O&O&O&", PyMac_GetOSType, &inCreator, OptCFStringRefObj_Convert, &inBundleID, OptCFStringRefObj_Convert, &inName)) return NULL; _err = LSFindApplicationForInfo(inCreator, inBundleID, inName, &outAppRef, &outAppURL); if (_err != noErr) return PyMac_Error(_err); _res = Py_BuildValue("O&O&", PyMac_BuildFSRef, &outAppRef, CFURLRefObj_New, outAppURL); return _res; } static PyObject *Launch_LSCanRefAcceptItem(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; OSStatus _err; FSRef inItemFSRef; FSRef inTargetRef; LSRolesMask inRoleMask; LSAcceptanceFlags inFlags; Boolean outAcceptsItem; if (!PyArg_ParseTuple(_args, "O&O&ll", PyMac_GetFSRef, &inItemFSRef, PyMac_GetFSRef, &inTargetRef, &inRoleMask, &inFlags)) return NULL; _err = LSCanRefAcceptItem(&inItemFSRef, &inTargetRef, inRoleMask, inFlags, &outAcceptsItem); if (_err != noErr) return PyMac_Error(_err); _res = Py_BuildValue("b", outAcceptsItem); return _res; } static PyObject *Launch_LSCanURLAcceptURL(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; OSStatus _err; CFURLRef inItemURL; CFURLRef inTargetURL; LSRolesMask inRoleMask; LSAcceptanceFlags inFlags; Boolean outAcceptsItem; if (!PyArg_ParseTuple(_args, "O&O&ll", CFURLRefObj_Convert, &inItemURL, CFURLRefObj_Convert, &inTargetURL, &inRoleMask, &inFlags)) return NULL; _err = LSCanURLAcceptURL(inItemURL, inTargetURL, inRoleMask, inFlags, &outAcceptsItem); if (_err != noErr) return PyMac_Error(_err); _res = Py_BuildValue("b", outAcceptsItem); return _res; } static PyObject *Launch_LSOpenFSRef(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; OSStatus _err; FSRef inRef; FSRef outLaunchedRef; if (!PyArg_ParseTuple(_args, "O&", PyMac_GetFSRef, &inRef)) return NULL; _err = LSOpenFSRef(&inRef, &outLaunchedRef); if (_err != noErr) return PyMac_Error(_err); _res = Py_BuildValue("O&", PyMac_BuildFSRef, &outLaunchedRef); return _res; } static PyObject *Launch_LSOpenCFURLRef(PyObject *_self, PyObject *_args) { PyObject *_res = NULL; OSStatus _err; CFURLRef inURL; CFURLRef outLaunchedURL; if (!PyArg_ParseTuple(_args, "O&", CFURLRefObj_Convert, &inURL)) return NULL; _err = LSOpenCFURLRef(inURL, &outLaunchedURL); if (_err != noErr) return PyMac_Error(_err); _res = Py_BuildValue("O&", CFURLRefObj_New, outLaunchedURL); return _res; } static PyMethodDef Launch_methods[] = { {"LSCopyItemInfoForRef", (PyCFunction)Launch_LSCopyItemInfoForRef, 1, PyDoc_STR("(FSRef inItemRef, LSRequestedInfo inWhichInfo) -> (LSItemInfoRecord outItemInfo)")}, {"LSCopyItemInfoForURL", (PyCFunction)Launch_LSCopyItemInfoForURL, 1, PyDoc_STR("(CFURLRef inURL, LSRequestedInfo inWhichInfo) -> (LSItemInfoRecord outItemInfo)")}, {"LSGetExtensionInfo", (PyCFunction)Launch_LSGetExtensionInfo, 1, PyDoc_STR("(Buffer inNameLen) -> (UniCharCount outExtStartIndex)")}, {"LSCopyDisplayNameForRef", (PyCFunction)Launch_LSCopyDisplayNameForRef, 1, PyDoc_STR("(FSRef inRef) -> (CFStringRef outDisplayName)")}, {"LSCopyDisplayNameForURL", (PyCFunction)Launch_LSCopyDisplayNameForURL, 1, PyDoc_STR("(CFURLRef inURL) -> (CFStringRef outDisplayName)")}, {"LSSetExtensionHiddenForRef", (PyCFunction)Launch_LSSetExtensionHiddenForRef, 1, PyDoc_STR("(FSRef inRef, Boolean inHide) -> None")}, {"LSSetExtensionHiddenForURL", (PyCFunction)Launch_LSSetExtensionHiddenForURL, 1, PyDoc_STR("(CFURLRef inURL, Boolean inHide) -> None")}, {"LSCopyKindStringForRef", (PyCFunction)Launch_LSCopyKindStringForRef, 1, PyDoc_STR("(FSRef inFSRef) -> (CFStringRef outKindString)")}, {"LSCopyKindStringForURL", (PyCFunction)Launch_LSCopyKindStringForURL, 1, PyDoc_STR("(CFURLRef inURL) -> (CFStringRef outKindString)")}, {"LSGetApplicationForItem", (PyCFunction)Launch_LSGetApplicationForItem, 1, PyDoc_STR("(FSRef inItemRef, LSRolesMask inRoleMask) -> (FSRef outAppRef, CFURLRef outAppURL)")}, {"LSGetApplicationForInfo", (PyCFunction)Launch_LSGetApplicationForInfo, 1, PyDoc_STR("(OSType inType, OSType inCreator, CFStringRef inExtension, LSRolesMask inRoleMask) -> (FSRef outAppRef, CFURLRef outAppURL)")}, {"LSGetApplicationForURL", (PyCFunction)Launch_LSGetApplicationForURL, 1, PyDoc_STR("(CFURLRef inURL, LSRolesMask inRoleMask) -> (FSRef outAppRef, CFURLRef outAppURL)")}, {"LSFindApplicationForInfo", (PyCFunction)Launch_LSFindApplicationForInfo, 1, PyDoc_STR("(OSType inCreator, CFStringRef inBundleID, CFStringRef inName) -> (FSRef outAppRef, CFURLRef outAppURL)")}, {"LSCanRefAcceptItem", (PyCFunction)Launch_LSCanRefAcceptItem, 1, PyDoc_STR("(FSRef inItemFSRef, FSRef inTargetRef, LSRolesMask inRoleMask, LSAcceptanceFlags inFlags) -> (Boolean outAcceptsItem)")}, {"LSCanURLAcceptURL", (PyCFunction)Launch_LSCanURLAcceptURL, 1, PyDoc_STR("(CFURLRef inItemURL, CFURLRef inTargetURL, LSRolesMask inRoleMask, LSAcceptanceFlags inFlags) -> (Boolean outAcceptsItem)")}, {"LSOpenFSRef", (PyCFunction)Launch_LSOpenFSRef, 1, PyDoc_STR("(FSRef inRef) -> (FSRef outLaunchedRef)")}, {"LSOpenCFURLRef", (PyCFunction)Launch_LSOpenCFURLRef, 1, PyDoc_STR("(CFURLRef inURL) -> (CFURLRef outLaunchedURL)")}, {NULL, NULL, 0} }; void init_Launch(void) { PyObject *m; PyObject *d; m = Py_InitModule("_Launch", Launch_methods); d = PyModule_GetDict(m); Launch_Error = PyMac_GetOSErrException(); if (Launch_Error == NULL || PyDict_SetItemString(d, "Error", Launch_Error) != 0) return; } /* ======================= End module _Launch ======================= */