blob: eacbee7aee2b662b8c81c3d73d7d1382f5670129 [file] [log] [blame]
Guido van Rossum17448e21995-01-30 11:53:55 +00001# 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
7from macsupport import *
8
9
10AEArrayType = Type("AEArrayType", "c")
11AESendMode = Type("AESendMode", "l")
12AESendPriority = Type("AESendPriority", "h")
13AEInteractAllowed = Type("AEInteractAllowed", "b")
Jack Jansen21f96871998-02-20 16:02:09 +000014AEReturnID = Type("AEReturnID", "h")
Jack Jansendef77e52000-03-14 23:29:08 +000015AETransactionID = Type("AETransactionID", "l")
Jack Jansen21f96871998-02-20 16:02:09 +000016
Guido van Rossum17448e21995-01-30 11:53:55 +000017
18
19AEEventClass = OSTypeType('AEEventClass')
20AEEventID = OSTypeType('AEEventID')
21AEKeyword = OSTypeType('AEKeyword')
22DescType = OSTypeType('DescType')
23
24
25AEDesc = OpaqueType('AEDesc')
26AEDesc_ptr = OpaqueType('AEDesc')
27
28AEAddressDesc = OpaqueType('AEAddressDesc', 'AEDesc')
29AEAddressDesc_ptr = OpaqueType('AEAddressDesc', 'AEDesc')
30
31AEDescList = OpaqueType('AEDescList', 'AEDesc')
32AEDescList_ptr = OpaqueType('AEDescList', 'AEDesc')
33
34AERecord = OpaqueType('AERecord', 'AEDesc')
35AERecord_ptr = OpaqueType('AERecord', 'AEDesc')
36
37AppleEvent = OpaqueType('AppleEvent', 'AEDesc')
38AppleEvent_ptr = OpaqueType('AppleEvent', 'AEDesc')
39
40
41class EHType(Type):
42 def __init__(self, name = 'EventHandler', format = ''):
43 Type.__init__(self, name, format)
44 def declare(self, name):
Guido van Rossumb19a6451995-02-05 16:58:33 +000045 Output("AEEventHandlerUPP %s__proc__ = upp_GenericEventHandler;", name)
Guido van Rossum17448e21995-01-30 11:53:55 +000046 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 Rossumb19a6451995-02-05 16:58:33 +000059 def cleanup(self, name):
60 Output("Py_INCREF(%s); /* XXX leak, but needed */", name)
Guido van Rossum17448e21995-01-30 11:53:55 +000061
62class EHNoRefConType(EHType):
63 def passInput(self, name):
Guido van Rossumb19a6451995-02-05 16:58:33 +000064 return "upp_GenericEventHandler"
Guido van Rossum17448e21995-01-30 11:53:55 +000065
66EventHandler = EHType()
67EventHandlerNoRefCon = EHNoRefConType()
68
69
Guido van Rossumb19a6451995-02-05 16:58:33 +000070IdleProcPtr = FakeType("upp_AEIdleProc")
Jack Jansenc7cfb951995-06-05 22:34:12 +000071AEIdleUPP = IdleProcPtr
Guido van Rossumb19a6451995-02-05 16:58:33 +000072EventFilterProcPtr = FakeType("(AEFilterUPP)0")
Jack Jansenc7cfb951995-06-05 22:34:12 +000073AEFilterUPP = EventFilterProcPtr
Guido van Rossum17448e21995-01-30 11:53:55 +000074NMRecPtr = FakeType("(NMRecPtr)0")
Guido van Rossumb19a6451995-02-05 16:58:33 +000075EventHandlerProcPtr = FakeType("upp_GenericEventHandler")
Jack Jansenc7cfb951995-06-05 22:34:12 +000076AEEventHandlerUPP = EventHandlerProcPtr
Guido van Rossum17448e21995-01-30 11:53:55 +000077AlwaysFalse = FakeType("0")
78
79
80AEFunction = OSErrFunctionGenerator
81AEMethod = OSErrMethodGenerator
82
83
84includestuff = includestuff + """
Jack Jansenfa77e1a2001-05-22 21:56:42 +000085#ifdef WITHOUT_FRAMEWORKS
Guido van Rossum17448e21995-01-30 11:53:55 +000086#include <AppleEvents.h>
Jack Jansenf7d5aa62000-12-10 23:43:49 +000087#include <AEObjects.h>
Jack Jansenfa77e1a2001-05-22 21:56:42 +000088#else
89#include <Carbon/Carbon.h>
90#endif
Guido van Rossum17448e21995-01-30 11:53:55 +000091
Jack Jansen0e04eec2001-05-17 21:58:34 +000092#ifdef USE_TOOLBOX_OBJECT_GLUE
93extern PyObject *_AEDesc_New(AEDesc *);
94extern int _AEDesc_Convert(PyObject *, AEDesc *);
95
96#define AEDesc_New _AEDesc_New
97#define AEDesc_Convert _AEDesc_Convert
98#endif
99
Guido van Rossum17448e21995-01-30 11:53:55 +0000100static pascal OSErr GenericEventHandler(); /* Forward */
101
Guido van Rossumb19a6451995-02-05 16:58:33 +0000102AEEventHandlerUPP upp_GenericEventHandler;
103
Guido van Rossum17448e21995-01-30 11:53:55 +0000104static pascal Boolean AEIdleProc(EventRecord *theEvent, long *sleepTime, RgnHandle *mouseRgn)
105{
Jack Jansen37575231997-06-20 16:19:14 +0000106 if ( PyOS_InterruptOccurred() )
107 return 1;
108 if ( PyMac_HandleEvent(theEvent) < 0 ) {
Jack Jansendeff89c1998-10-12 20:53:15 +0000109 PySys_WriteStderr("Exception in user event handler during AE processing\\n");
Jack Jansen37575231997-06-20 16:19:14 +0000110 PyErr_Clear();
111 }
Guido van Rossumb19a6451995-02-05 16:58:33 +0000112 return 0;
Guido van Rossum17448e21995-01-30 11:53:55 +0000113}
Guido van Rossumb19a6451995-02-05 16:58:33 +0000114
115AEIdleUPP upp_AEIdleProc;
Guido van Rossum17448e21995-01-30 11:53:55 +0000116"""
117
118finalstuff = finalstuff + """
Jack Jansenff75c212001-06-20 20:53:38 +0000119#if UNIVERSAL_INTERFACES_VERSION >= 0x0340
120typedef long refcontype;
121#else
122typedef unsigned long refcontype;
123#endif
124
Guido van Rossum17448e21995-01-30 11:53:55 +0000125static pascal OSErr
Jack Jansenff75c212001-06-20 20:53:38 +0000126GenericEventHandler(const AppleEvent *request, AppleEvent *reply, refcontype refcon)
Guido van Rossum17448e21995-01-30 11:53:55 +0000127{
128 PyObject *handler = (PyObject *)refcon;
129 AEDescObject *requestObject, *replyObject;
130 PyObject *args, *res;
Jack Jansen9d8b96c2000-07-14 22:16:45 +0000131 if ((requestObject = (AEDescObject *)AEDesc_New((AppleEvent *)request)) == NULL) {
Guido van Rossum17448e21995-01-30 11:53:55 +0000132 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 Rossumb19a6451995-02-05 16:58:33 +0000156initstuff = initstuff + """
Jack Jansenfa77e1a2001-05-22 21:56:42 +0000157 upp_AEIdleProc = NewAEIdleUPP(AEIdleProc);
Jack Jansenff75c212001-06-20 20:53:38 +0000158#if UNIVERSAL_INTERFACES_VERSION >= 0x0340
159 upp_GenericEventHandler = NewAEEventHandlerUPP(&GenericEventHandler);
160#else
Jack Jansenfa77e1a2001-05-22 21:56:42 +0000161 upp_GenericEventHandler = NewAEEventHandlerUPP(GenericEventHandler);
Jack Jansenff75c212001-06-20 20:53:38 +0000162#endif
Jack Jansenfa77e1a2001-05-22 21:56:42 +0000163 PyMac_INIT_TOOLBOX_OBJECT_NEW(AEDesc *, AEDesc_New);
164 PyMac_INIT_TOOLBOX_OBJECT_CONVERT(AEDesc, AEDesc_Convert);
Guido van Rossumb19a6451995-02-05 16:58:33 +0000165"""
166
Guido van Rossum17448e21995-01-30 11:53:55 +0000167module = MacModule('AE', 'AE', includestuff, finalstuff, initstuff)
168
Jack Jansenf69633e1997-08-15 14:31:13 +0000169class AEDescDefinition(GlobalObjectDefinition):
Guido van Rossum17448e21995-01-30 11:53:55 +0000170
171 def __init__(self, name, prefix = None, itselftype = None):
Jack Jansenf69633e1997-08-15 14:31:13 +0000172 GlobalObjectDefinition.__init__(self, name, prefix or name, itselftype or name)
Guido van Rossum17448e21995-01-30 11:53:55 +0000173 self.argref = "*"
174
175 def outputFreeIt(self, name):
176 Output("AEDisposeDesc(&%s);", name)
177
178 def outputGetattrHook(self):
179 Output("""
180if (strcmp(name, "type") == 0)
181 return PyMac_BuildOSType(self->ob_itself.descriptorType);
182if (strcmp(name, "data") == 0) {
183 PyObject *res;
Jack Jansen74a1e632000-07-14 22:37:27 +0000184#if !TARGET_API_MAC_CARBON
Guido van Rossum17448e21995-01-30 11:53:55 +0000185 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 Jansene79dc762000-06-02 21:35:07 +0000193#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 Rossum17448e21995-01-30 11:53:55 +0000206 return res;
207}
208if (strcmp(name, "__members__") == 0)
209 return Py_BuildValue("[ss]", "data", "type");
210""")
211
212
Jack Jansenf69633e1997-08-15 14:31:13 +0000213aedescobject = AEDescDefinition('AEDesc')
Guido van Rossum17448e21995-01-30 11:53:55 +0000214module.addobject(aedescobject)
215
216functions = []
217aedescmethods = []
218
219execfile('aegen.py')
Jack Jansen8ed81302000-12-12 22:09:11 +0000220##execfile('aedatamodelgen.py')
Guido van Rossum17448e21995-01-30 11:53:55 +0000221
222for f in functions: module.add(f)
223for f in aedescmethods: aedescobject.add(f)
224
225SetOutputFileName('AEmodule.c')
226module.generate()