diff options
author | Jack Jansen <jack.jansen@cwi.nl> | 2003-12-02 23:01:43 (GMT) |
---|---|---|
committer | Jack Jansen <jack.jansen@cwi.nl> | 2003-12-02 23:01:43 (GMT) |
commit | 7d0a609e6f43b82f3aeeefcb0574f3c1e4b09ad4 (patch) | |
tree | 61c5b06d9c0ae14ef1b7f9062e7f3b2c483ff315 /Mac | |
parent | 148eb6a6b663df6f949b9eebc1f2b2a97ac11e5c (diff) | |
download | cpython-7d0a609e6f43b82f3aeeefcb0574f3c1e4b09ad4.zip cpython-7d0a609e6f43b82f3aeeefcb0574f3c1e4b09ad4.tar.gz cpython-7d0a609e6f43b82f3aeeefcb0574f3c1e4b09ad4.tar.bz2 |
An interface to the LaunchServices API.
Diffstat (limited to 'Mac')
-rw-r--r-- | Mac/Modules/launch/_Launchmodule.c | 401 | ||||
-rw-r--r-- | Mac/Modules/launch/launchscan.py | 71 | ||||
-rw-r--r-- | Mac/Modules/launch/launchsupport.py | 111 |
3 files changed, 583 insertions, 0 deletions
diff --git a/Mac/Modules/launch/_Launchmodule.c b/Mac/Modules/launch/_Launchmodule.c new file mode 100644 index 0000000..165e45c --- /dev/null +++ b/Mac/Modules/launch/_Launchmodule.c @@ -0,0 +1,401 @@ + +/* ========================= 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) + + +#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) +{ + 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); +} + +static PyObject *Launch_Error; + +static PyObject *Launch_LSInit(PyObject *_self, PyObject *_args) +{ + PyObject *_res = NULL; + OSStatus _err; + LSInitializeFlags inFlags; + if (!PyArg_ParseTuple(_args, "l", + &inFlags)) + return NULL; + _err = LSInit(inFlags); + if (_err != noErr) return PyMac_Error(_err); + Py_INCREF(Py_None); + _res = Py_None; + return _res; +} + +static PyObject *Launch_LSTerm(PyObject *_self, PyObject *_args) +{ + PyObject *_res = NULL; + OSStatus _err; + if (!PyArg_ParseTuple(_args, "")) + return NULL; + _err = LSTerm(); + if (_err != noErr) return PyMac_Error(_err); + Py_INCREF(Py_None); + _res = Py_None; + return _res; +} + +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_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[] = { + {"LSInit", (PyCFunction)Launch_LSInit, 1, + PyDoc_STR("(LSInitializeFlags inFlags) -> None")}, + {"LSTerm", (PyCFunction)Launch_LSTerm, 1, + PyDoc_STR("() -> None")}, + {"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)")}, + {"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 ======================= */ + diff --git a/Mac/Modules/launch/launchscan.py b/Mac/Modules/launch/launchscan.py new file mode 100644 index 0000000..8dd6dfd --- /dev/null +++ b/Mac/Modules/launch/launchscan.py @@ -0,0 +1,71 @@ +# Scan an Apple header file, generating a Python file of generator calls. + +import sys +import os +from bgenlocations import TOOLBOXDIR, BGENDIR +sys.path.append(BGENDIR) +from scantools import Scanner + +LONG = "LaunchServices" +SHORT = "launch" +OBJECT = "NOTUSED" + +def main(): + input = LONG + ".h" + output = SHORT + "gen.py" + defsoutput = TOOLBOXDIR + LONG + ".py" + scanner = MyScanner(input, output, defsoutput) + scanner.scan() + scanner.close() + scanner.gentypetest(SHORT+"typetest.py") + print "=== Testing definitions output code ===" + execfile(defsoutput, {}, {}) + print "=== Done scanning and generating, now importing the generated code... ===" + exec "import " + SHORT + "support" + print "=== Done. It's up to you to compile it now! ===" + +class MyScanner(Scanner): + + def destination(self, type, name, arglist): + classname = "Function" + listname = "functions" + if arglist: + t, n, m = arglist[0] + # This is non-functional today + if t == OBJECT and m == "InMode": + classname = "Method" + listname = "methods" + return classname, listname + + def writeinitialdefs(self): + self.defsfile.write("def FOUR_CHAR_CODE(x): return x\n") + self.defsfile.write("kLSRequestAllInfo = -1\n") + self.defsfile.write("kLSRolesAll = -1\n") + + def makeblacklistnames(self): + return [ + "kLSRequestAllInfo", + "kLSRolesAll", + ] + + def makeblacklisttypes(self): + return [ + "LSLaunchFSRefSpec_ptr", + "LSLaunchURLSpec_ptr", + ] + + def makerepairinstructions(self): + return [ + # LSGetApplicationForInfo + ([('CFStringRef', 'inExtension', 'InMode')], + [('OptCFStringRef', 'inExtension', 'InMode')]), + + # LSFindApplicationForInfo + ([('CFStringRef', 'inBundleID', 'InMode')], + [('OptCFStringRef', 'inBundleID', 'InMode')]), + ([('CFStringRef', 'inName', 'InMode')], + [('OptCFStringRef', 'inName', 'InMode')]), + ] + +if __name__ == "__main__": + main() diff --git a/Mac/Modules/launch/launchsupport.py b/Mac/Modules/launch/launchsupport.py new file mode 100644 index 0000000..066d3c6 --- /dev/null +++ b/Mac/Modules/launch/launchsupport.py @@ -0,0 +1,111 @@ +# This script generates a Python interface for an Apple Macintosh Manager. +# It uses the "bgen" package to generate C code. +# The function specifications are generated by scanning the mamager's header file, +# using the "scantools" package (customized for this particular manager). + +import string + +# Declarations that change for each manager +MODNAME = '_Launch' # The name of the module +OBJECTNAME = 'UNUSED' # The basic name of the objects used here +KIND = 'Record' # Usually 'Ptr' or 'Handle' + +# The following is *usually* unchanged but may still require tuning +MODPREFIX = 'Launch' # The prefix for module-wide routines +OBJECTTYPE = OBJECTNAME + KIND # The C type used to represent them +OBJECTPREFIX = MODPREFIX + 'Obj' # The prefix for object methods +INPUTFILE = string.lower(MODPREFIX) + 'gen.py' # The file generated by the scanner +OUTPUTFILE = MODNAME + "module.c" # The file generated by this program + +from macsupport import * + +# Create the type objects +LSAcceptanceFlags = Type("LSAcceptanceFlags", "l") +LSInitializeFlags = Type("LSInitializeFlags", "l") +LSRequestedInfo = Type("LSRequestedInfo", "l") +LSRolesMask = Type("LSRolesMask", "l") +OptCFStringRef = OpaqueByValueType("CFStringRef", "OptCFStringRefObj") +LSItemInfoRecord = OpaqueType("LSItemInfoRecord", "LSItemInfoRecord") +#MenuRef = OpaqueByValueType("MenuRef", "MenuObj") +#MenuItemIndex = Type("MenuItemIndex", "H") + +#WindowPeek = OpaqueByValueType("WindowPeek", OBJECTPREFIX) + +#RgnHandle = FakeType("(RgnHandle)0") +# XXXX Should be next, but this will break a lot of code... +# RgnHandle = OpaqueByValueType("RgnHandle", "OptResObj") + +#KeyMap = ArrayOutputBufferType("KeyMap") +##MacOSEventKind = Type("MacOSEventKind", "h") # Old-style +##MacOSEventMask = Type("MacOSEventMask", "h") # Old-style +#EventMask = Type("EventMask", "H") +#EventKind = Type("EventKind", "H") + +includestuff = includestuff + """ +#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) +{ + 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); +} +""" + +# From here on it's basically all boiler plate... +execfile(string.lower(MODPREFIX) + 'typetest.py') + +# Create the generator groups and link them +module = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff) +##object = MyObjectDefinition(OBJECTNAME, OBJECTPREFIX, OBJECTTYPE) +##module.addobject(object) + +# Create the generator classes used to populate the lists +Function = OSErrFunctionGenerator +##Method = OSErrMethodGenerator + +# Create and populate the lists +functions = [] +##methods = [] +execfile(INPUTFILE) + +# add the populated lists to the generator groups +# (in a different wordl the scan program would generate this) +for f in functions: module.add(f) +##for f in methods: object.add(f) + +# generate output (open the output file as late as possible) +SetOutputFileName(OUTPUTFILE) +module.generate() + |