Guido van Rossum | 17448e2 | 1995-01-30 11:53:55 +0000 | [diff] [blame] | 1 | # This script will generate the AppleEvents interface for Python. |
| 2 | # It uses the "bgen" package to generate C code. |
| 3 | # It execs the file aegen.py which contain the function definitions |
| 4 | # (aegen.py was generated by aescan.py, scanning the <AppleEvents.h> header file). |
| 5 | |
| 6 | |
| 7 | from macsupport import * |
| 8 | |
| 9 | |
| 10 | AEArrayType = Type("AEArrayType", "c") |
| 11 | AESendMode = Type("AESendMode", "l") |
| 12 | AESendPriority = Type("AESendPriority", "h") |
| 13 | AEInteractAllowed = Type("AEInteractAllowed", "b") |
Jack Jansen | 21f9687 | 1998-02-20 16:02:09 +0000 | [diff] [blame] | 14 | AEReturnID = Type("AEReturnID", "h") |
Jack Jansen | def77e5 | 2000-03-14 23:29:08 +0000 | [diff] [blame] | 15 | AETransactionID = Type("AETransactionID", "l") |
Jack Jansen | 21f9687 | 1998-02-20 16:02:09 +0000 | [diff] [blame] | 16 | |
Guido van Rossum | 17448e2 | 1995-01-30 11:53:55 +0000 | [diff] [blame] | 17 | |
| 18 | |
| 19 | AEEventClass = OSTypeType('AEEventClass') |
| 20 | AEEventID = OSTypeType('AEEventID') |
| 21 | AEKeyword = OSTypeType('AEKeyword') |
| 22 | DescType = OSTypeType('DescType') |
| 23 | |
| 24 | |
| 25 | AEDesc = OpaqueType('AEDesc') |
| 26 | AEDesc_ptr = OpaqueType('AEDesc') |
| 27 | |
| 28 | AEAddressDesc = OpaqueType('AEAddressDesc', 'AEDesc') |
| 29 | AEAddressDesc_ptr = OpaqueType('AEAddressDesc', 'AEDesc') |
| 30 | |
| 31 | AEDescList = OpaqueType('AEDescList', 'AEDesc') |
| 32 | AEDescList_ptr = OpaqueType('AEDescList', 'AEDesc') |
| 33 | |
| 34 | AERecord = OpaqueType('AERecord', 'AEDesc') |
| 35 | AERecord_ptr = OpaqueType('AERecord', 'AEDesc') |
| 36 | |
| 37 | AppleEvent = OpaqueType('AppleEvent', 'AEDesc') |
| 38 | AppleEvent_ptr = OpaqueType('AppleEvent', 'AEDesc') |
| 39 | |
| 40 | |
| 41 | class EHType(Type): |
| 42 | def __init__(self, name = 'EventHandler', format = ''): |
| 43 | Type.__init__(self, name, format) |
| 44 | def declare(self, name): |
Guido van Rossum | b19a645 | 1995-02-05 16:58:33 +0000 | [diff] [blame] | 45 | Output("AEEventHandlerUPP %s__proc__ = upp_GenericEventHandler;", name) |
Guido van Rossum | 17448e2 | 1995-01-30 11:53:55 +0000 | [diff] [blame] | 46 | Output("PyObject *%s;", name) |
| 47 | def getargsFormat(self): |
| 48 | return "O" |
| 49 | def getargsArgs(self, name): |
| 50 | return "&%s" % name |
| 51 | def passInput(self, name): |
| 52 | return "%s__proc__, (long)%s" % (name, name) |
| 53 | def passOutput(self, name): |
| 54 | return "&%s__proc__, (long *)&%s" % (name, name) |
| 55 | def mkvalueFormat(self): |
| 56 | return "O" |
| 57 | def mkvalueArgs(self, name): |
| 58 | return name |
Guido van Rossum | b19a645 | 1995-02-05 16:58:33 +0000 | [diff] [blame] | 59 | def cleanup(self, name): |
| 60 | Output("Py_INCREF(%s); /* XXX leak, but needed */", name) |
Guido van Rossum | 17448e2 | 1995-01-30 11:53:55 +0000 | [diff] [blame] | 61 | |
| 62 | class EHNoRefConType(EHType): |
| 63 | def passInput(self, name): |
Guido van Rossum | b19a645 | 1995-02-05 16:58:33 +0000 | [diff] [blame] | 64 | return "upp_GenericEventHandler" |
Guido van Rossum | 17448e2 | 1995-01-30 11:53:55 +0000 | [diff] [blame] | 65 | |
| 66 | EventHandler = EHType() |
| 67 | EventHandlerNoRefCon = EHNoRefConType() |
| 68 | |
| 69 | |
Guido van Rossum | b19a645 | 1995-02-05 16:58:33 +0000 | [diff] [blame] | 70 | IdleProcPtr = FakeType("upp_AEIdleProc") |
Jack Jansen | c7cfb95 | 1995-06-05 22:34:12 +0000 | [diff] [blame] | 71 | AEIdleUPP = IdleProcPtr |
Guido van Rossum | b19a645 | 1995-02-05 16:58:33 +0000 | [diff] [blame] | 72 | EventFilterProcPtr = FakeType("(AEFilterUPP)0") |
Jack Jansen | c7cfb95 | 1995-06-05 22:34:12 +0000 | [diff] [blame] | 73 | AEFilterUPP = EventFilterProcPtr |
Guido van Rossum | 17448e2 | 1995-01-30 11:53:55 +0000 | [diff] [blame] | 74 | NMRecPtr = FakeType("(NMRecPtr)0") |
Guido van Rossum | b19a645 | 1995-02-05 16:58:33 +0000 | [diff] [blame] | 75 | EventHandlerProcPtr = FakeType("upp_GenericEventHandler") |
Jack Jansen | c7cfb95 | 1995-06-05 22:34:12 +0000 | [diff] [blame] | 76 | AEEventHandlerUPP = EventHandlerProcPtr |
Guido van Rossum | 17448e2 | 1995-01-30 11:53:55 +0000 | [diff] [blame] | 77 | AlwaysFalse = FakeType("0") |
| 78 | |
| 79 | |
| 80 | AEFunction = OSErrFunctionGenerator |
| 81 | AEMethod = OSErrMethodGenerator |
| 82 | |
| 83 | |
| 84 | includestuff = includestuff + """ |
Jack Jansen | fa77e1a | 2001-05-22 21:56:42 +0000 | [diff] [blame] | 85 | #ifdef WITHOUT_FRAMEWORKS |
Guido van Rossum | 17448e2 | 1995-01-30 11:53:55 +0000 | [diff] [blame] | 86 | #include <AppleEvents.h> |
Jack Jansen | f7d5aa6 | 2000-12-10 23:43:49 +0000 | [diff] [blame] | 87 | #include <AEObjects.h> |
Jack Jansen | fa77e1a | 2001-05-22 21:56:42 +0000 | [diff] [blame] | 88 | #else |
| 89 | #include <Carbon/Carbon.h> |
| 90 | #endif |
Guido van Rossum | 17448e2 | 1995-01-30 11:53:55 +0000 | [diff] [blame] | 91 | |
Jack Jansen | 0e04eec | 2001-05-17 21:58:34 +0000 | [diff] [blame] | 92 | #ifdef USE_TOOLBOX_OBJECT_GLUE |
| 93 | extern PyObject *_AEDesc_New(AEDesc *); |
| 94 | extern int _AEDesc_Convert(PyObject *, AEDesc *); |
| 95 | |
| 96 | #define AEDesc_New _AEDesc_New |
| 97 | #define AEDesc_Convert _AEDesc_Convert |
| 98 | #endif |
| 99 | |
Guido van Rossum | 17448e2 | 1995-01-30 11:53:55 +0000 | [diff] [blame] | 100 | static pascal OSErr GenericEventHandler(); /* Forward */ |
| 101 | |
Guido van Rossum | b19a645 | 1995-02-05 16:58:33 +0000 | [diff] [blame] | 102 | AEEventHandlerUPP upp_GenericEventHandler; |
| 103 | |
Guido van Rossum | 17448e2 | 1995-01-30 11:53:55 +0000 | [diff] [blame] | 104 | static pascal Boolean AEIdleProc(EventRecord *theEvent, long *sleepTime, RgnHandle *mouseRgn) |
| 105 | { |
Jack Jansen | 3757523 | 1997-06-20 16:19:14 +0000 | [diff] [blame] | 106 | if ( PyOS_InterruptOccurred() ) |
| 107 | return 1; |
| 108 | if ( PyMac_HandleEvent(theEvent) < 0 ) { |
Jack Jansen | deff89c | 1998-10-12 20:53:15 +0000 | [diff] [blame] | 109 | PySys_WriteStderr("Exception in user event handler during AE processing\\n"); |
Jack Jansen | 3757523 | 1997-06-20 16:19:14 +0000 | [diff] [blame] | 110 | PyErr_Clear(); |
| 111 | } |
Guido van Rossum | b19a645 | 1995-02-05 16:58:33 +0000 | [diff] [blame] | 112 | return 0; |
Guido van Rossum | 17448e2 | 1995-01-30 11:53:55 +0000 | [diff] [blame] | 113 | } |
Guido van Rossum | b19a645 | 1995-02-05 16:58:33 +0000 | [diff] [blame] | 114 | |
| 115 | AEIdleUPP upp_AEIdleProc; |
Guido van Rossum | 17448e2 | 1995-01-30 11:53:55 +0000 | [diff] [blame] | 116 | """ |
| 117 | |
| 118 | finalstuff = finalstuff + """ |
Jack Jansen | ff75c21 | 2001-06-20 20:53:38 +0000 | [diff] [blame^] | 119 | #if UNIVERSAL_INTERFACES_VERSION >= 0x0340 |
| 120 | typedef long refcontype; |
| 121 | #else |
| 122 | typedef unsigned long refcontype; |
| 123 | #endif |
| 124 | |
Guido van Rossum | 17448e2 | 1995-01-30 11:53:55 +0000 | [diff] [blame] | 125 | static pascal OSErr |
Jack Jansen | ff75c21 | 2001-06-20 20:53:38 +0000 | [diff] [blame^] | 126 | GenericEventHandler(const AppleEvent *request, AppleEvent *reply, refcontype refcon) |
Guido van Rossum | 17448e2 | 1995-01-30 11:53:55 +0000 | [diff] [blame] | 127 | { |
| 128 | PyObject *handler = (PyObject *)refcon; |
| 129 | AEDescObject *requestObject, *replyObject; |
| 130 | PyObject *args, *res; |
Jack Jansen | 9d8b96c | 2000-07-14 22:16:45 +0000 | [diff] [blame] | 131 | if ((requestObject = (AEDescObject *)AEDesc_New((AppleEvent *)request)) == NULL) { |
Guido van Rossum | 17448e2 | 1995-01-30 11:53:55 +0000 | [diff] [blame] | 132 | return -1; |
| 133 | } |
| 134 | if ((replyObject = (AEDescObject *)AEDesc_New(reply)) == NULL) { |
| 135 | Py_DECREF(requestObject); |
| 136 | return -1; |
| 137 | } |
| 138 | if ((args = Py_BuildValue("OO", requestObject, replyObject)) == NULL) { |
| 139 | Py_DECREF(requestObject); |
| 140 | Py_DECREF(replyObject); |
| 141 | return -1; |
| 142 | } |
| 143 | res = PyEval_CallObject(handler, args); |
| 144 | requestObject->ob_itself.descriptorType = 'null'; |
| 145 | requestObject->ob_itself.dataHandle = NULL; |
| 146 | replyObject->ob_itself.descriptorType = 'null'; |
| 147 | replyObject->ob_itself.dataHandle = NULL; |
| 148 | Py_DECREF(args); |
| 149 | if (res == NULL) |
| 150 | return -1; |
| 151 | Py_DECREF(res); |
| 152 | return noErr; |
| 153 | } |
| 154 | """ |
| 155 | |
Guido van Rossum | b19a645 | 1995-02-05 16:58:33 +0000 | [diff] [blame] | 156 | initstuff = initstuff + """ |
Jack Jansen | fa77e1a | 2001-05-22 21:56:42 +0000 | [diff] [blame] | 157 | upp_AEIdleProc = NewAEIdleUPP(AEIdleProc); |
Jack Jansen | ff75c21 | 2001-06-20 20:53:38 +0000 | [diff] [blame^] | 158 | #if UNIVERSAL_INTERFACES_VERSION >= 0x0340 |
| 159 | upp_GenericEventHandler = NewAEEventHandlerUPP(&GenericEventHandler); |
| 160 | #else |
Jack Jansen | fa77e1a | 2001-05-22 21:56:42 +0000 | [diff] [blame] | 161 | upp_GenericEventHandler = NewAEEventHandlerUPP(GenericEventHandler); |
Jack Jansen | ff75c21 | 2001-06-20 20:53:38 +0000 | [diff] [blame^] | 162 | #endif |
Jack Jansen | fa77e1a | 2001-05-22 21:56:42 +0000 | [diff] [blame] | 163 | PyMac_INIT_TOOLBOX_OBJECT_NEW(AEDesc *, AEDesc_New); |
| 164 | PyMac_INIT_TOOLBOX_OBJECT_CONVERT(AEDesc, AEDesc_Convert); |
Guido van Rossum | b19a645 | 1995-02-05 16:58:33 +0000 | [diff] [blame] | 165 | """ |
| 166 | |
Guido van Rossum | 17448e2 | 1995-01-30 11:53:55 +0000 | [diff] [blame] | 167 | module = MacModule('AE', 'AE', includestuff, finalstuff, initstuff) |
| 168 | |
Jack Jansen | f69633e | 1997-08-15 14:31:13 +0000 | [diff] [blame] | 169 | class AEDescDefinition(GlobalObjectDefinition): |
Guido van Rossum | 17448e2 | 1995-01-30 11:53:55 +0000 | [diff] [blame] | 170 | |
| 171 | def __init__(self, name, prefix = None, itselftype = None): |
Jack Jansen | f69633e | 1997-08-15 14:31:13 +0000 | [diff] [blame] | 172 | GlobalObjectDefinition.__init__(self, name, prefix or name, itselftype or name) |
Guido van Rossum | 17448e2 | 1995-01-30 11:53:55 +0000 | [diff] [blame] | 173 | self.argref = "*" |
| 174 | |
| 175 | def outputFreeIt(self, name): |
| 176 | Output("AEDisposeDesc(&%s);", name) |
| 177 | |
| 178 | def outputGetattrHook(self): |
| 179 | Output(""" |
| 180 | if (strcmp(name, "type") == 0) |
| 181 | return PyMac_BuildOSType(self->ob_itself.descriptorType); |
| 182 | if (strcmp(name, "data") == 0) { |
| 183 | PyObject *res; |
Jack Jansen | 74a1e63 | 2000-07-14 22:37:27 +0000 | [diff] [blame] | 184 | #if !TARGET_API_MAC_CARBON |
Guido van Rossum | 17448e2 | 1995-01-30 11:53:55 +0000 | [diff] [blame] | 185 | char state; |
| 186 | state = HGetState(self->ob_itself.dataHandle); |
| 187 | HLock(self->ob_itself.dataHandle); |
| 188 | res = PyString_FromStringAndSize( |
| 189 | *self->ob_itself.dataHandle, |
| 190 | GetHandleSize(self->ob_itself.dataHandle)); |
| 191 | HUnlock(self->ob_itself.dataHandle); |
| 192 | HSetState(self->ob_itself.dataHandle, state); |
Jack Jansen | e79dc76 | 2000-06-02 21:35:07 +0000 | [diff] [blame] | 193 | #else |
| 194 | Size size; |
| 195 | char *ptr; |
| 196 | OSErr err; |
| 197 | |
| 198 | size = AEGetDescDataSize(&self->ob_itself); |
| 199 | if ( (res = PyString_FromStringAndSize(NULL, size)) == NULL ) |
| 200 | return NULL; |
| 201 | if ( (ptr = PyString_AsString(res)) == NULL ) |
| 202 | return NULL; |
| 203 | if ( (err=AEGetDescData(&self->ob_itself, ptr, size)) < 0 ) |
| 204 | return PyMac_Error(err); |
| 205 | #endif |
Guido van Rossum | 17448e2 | 1995-01-30 11:53:55 +0000 | [diff] [blame] | 206 | return res; |
| 207 | } |
| 208 | if (strcmp(name, "__members__") == 0) |
| 209 | return Py_BuildValue("[ss]", "data", "type"); |
| 210 | """) |
| 211 | |
| 212 | |
Jack Jansen | f69633e | 1997-08-15 14:31:13 +0000 | [diff] [blame] | 213 | aedescobject = AEDescDefinition('AEDesc') |
Guido van Rossum | 17448e2 | 1995-01-30 11:53:55 +0000 | [diff] [blame] | 214 | module.addobject(aedescobject) |
| 215 | |
| 216 | functions = [] |
| 217 | aedescmethods = [] |
| 218 | |
| 219 | execfile('aegen.py') |
Jack Jansen | 8ed8130 | 2000-12-12 22:09:11 +0000 | [diff] [blame] | 220 | ##execfile('aedatamodelgen.py') |
Guido van Rossum | 17448e2 | 1995-01-30 11:53:55 +0000 | [diff] [blame] | 221 | |
| 222 | for f in functions: module.add(f) |
| 223 | for f in aedescmethods: aedescobject.add(f) |
| 224 | |
| 225 | SetOutputFileName('AEmodule.c') |
| 226 | module.generate() |