blob: d82496bfd403aaeedd023dd7da07673ecc70921f [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")
15AETransactionID = Type("AETransactionID", "h")
16
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 + """
85#include <AppleEvents.h>
86
Guido van Rossum3075b321995-02-14 09:48:02 +000087#ifndef HAVE_UNIVERSAL_HEADERS
Guido van Rossumb19a6451995-02-05 16:58:33 +000088#define AEIdleProcPtr IdleProcPtr
Guido van Rossum17448e21995-01-30 11:53:55 +000089#define AEFilterProcPtr EventFilterProcPtr
90#define AEEventHandlerProcPtr EventHandlerProcPtr
91#endif
92
Guido van Rossum3075b321995-02-14 09:48:02 +000093#ifndef HAVE_UNIVERSAL_HEADERS
94/* I'm trying to setup the code here so that is easily automated,
Guido van Rossumb19a6451995-02-05 16:58:33 +000095** as follows:
96** - Use the UPP in the source
97** - for pre-universal headers, #define each UPP as the corresponding ProcPtr
98** - for each routine we pass we declare a upp_xxx that
99** we initialize to the correct value in the init routine.
100*/
101#define AEIdleUPP AEIdleProcPtr
102#define AEFilterUPP AEFilterProcPtr
103#define AEEventHandlerUPP AEEventHandlerProcPtr
104#define NewAEIdleProc(x) (x)
105#define NewAEFilterProc(x) (x)
106#define NewAEEventHandlerProc(x) (x)
107#endif
108
Guido van Rossum17448e21995-01-30 11:53:55 +0000109static pascal OSErr GenericEventHandler(); /* Forward */
110
Guido van Rossumb19a6451995-02-05 16:58:33 +0000111AEEventHandlerUPP upp_GenericEventHandler;
112
Guido van Rossum17448e21995-01-30 11:53:55 +0000113static pascal Boolean AEIdleProc(EventRecord *theEvent, long *sleepTime, RgnHandle *mouseRgn)
114{
Jack Jansen37575231997-06-20 16:19:14 +0000115 if ( PyOS_InterruptOccurred() )
116 return 1;
117 if ( PyMac_HandleEvent(theEvent) < 0 ) {
Jack Jansendeff89c1998-10-12 20:53:15 +0000118 PySys_WriteStderr("Exception in user event handler during AE processing\\n");
Jack Jansen37575231997-06-20 16:19:14 +0000119 PyErr_Clear();
120 }
Guido van Rossumb19a6451995-02-05 16:58:33 +0000121 return 0;
Guido van Rossum17448e21995-01-30 11:53:55 +0000122}
Guido van Rossumb19a6451995-02-05 16:58:33 +0000123
124AEIdleUPP upp_AEIdleProc;
Guido van Rossum17448e21995-01-30 11:53:55 +0000125"""
126
127finalstuff = finalstuff + """
128static pascal OSErr
Guido van Rossum97842951995-02-19 15:59:49 +0000129GenericEventHandler(AppleEvent *request, AppleEvent *reply, long refcon)
Guido van Rossum17448e21995-01-30 11:53:55 +0000130{
131 PyObject *handler = (PyObject *)refcon;
132 AEDescObject *requestObject, *replyObject;
133 PyObject *args, *res;
134 if ((requestObject = (AEDescObject *)AEDesc_New(request)) == NULL) {
135 return -1;
136 }
137 if ((replyObject = (AEDescObject *)AEDesc_New(reply)) == NULL) {
138 Py_DECREF(requestObject);
139 return -1;
140 }
141 if ((args = Py_BuildValue("OO", requestObject, replyObject)) == NULL) {
142 Py_DECREF(requestObject);
143 Py_DECREF(replyObject);
144 return -1;
145 }
146 res = PyEval_CallObject(handler, args);
147 requestObject->ob_itself.descriptorType = 'null';
148 requestObject->ob_itself.dataHandle = NULL;
149 replyObject->ob_itself.descriptorType = 'null';
150 replyObject->ob_itself.dataHandle = NULL;
151 Py_DECREF(args);
152 if (res == NULL)
153 return -1;
154 Py_DECREF(res);
155 return noErr;
156}
157"""
158
Guido van Rossumb19a6451995-02-05 16:58:33 +0000159initstuff = initstuff + """
160 upp_AEIdleProc = NewAEIdleProc(AEIdleProc);
161 upp_GenericEventHandler = NewAEEventHandlerProc(GenericEventHandler);
162"""
163
Guido van Rossum17448e21995-01-30 11:53:55 +0000164module = MacModule('AE', 'AE', includestuff, finalstuff, initstuff)
165
Jack Jansenf69633e1997-08-15 14:31:13 +0000166class AEDescDefinition(GlobalObjectDefinition):
Guido van Rossum17448e21995-01-30 11:53:55 +0000167
168 def __init__(self, name, prefix = None, itselftype = None):
Jack Jansenf69633e1997-08-15 14:31:13 +0000169 GlobalObjectDefinition.__init__(self, name, prefix or name, itselftype or name)
Guido van Rossum17448e21995-01-30 11:53:55 +0000170 self.argref = "*"
171
172 def outputFreeIt(self, name):
173 Output("AEDisposeDesc(&%s);", name)
174
175 def outputGetattrHook(self):
176 Output("""
177if (strcmp(name, "type") == 0)
178 return PyMac_BuildOSType(self->ob_itself.descriptorType);
179if (strcmp(name, "data") == 0) {
180 PyObject *res;
181 char state;
182 state = HGetState(self->ob_itself.dataHandle);
183 HLock(self->ob_itself.dataHandle);
184 res = PyString_FromStringAndSize(
185 *self->ob_itself.dataHandle,
186 GetHandleSize(self->ob_itself.dataHandle));
187 HUnlock(self->ob_itself.dataHandle);
188 HSetState(self->ob_itself.dataHandle, state);
189 return res;
190}
191if (strcmp(name, "__members__") == 0)
192 return Py_BuildValue("[ss]", "data", "type");
193""")
194
195
Jack Jansenf69633e1997-08-15 14:31:13 +0000196aedescobject = AEDescDefinition('AEDesc')
Guido van Rossum17448e21995-01-30 11:53:55 +0000197module.addobject(aedescobject)
198
199functions = []
200aedescmethods = []
201
202execfile('aegen.py')
Jack Jansen21f96871998-02-20 16:02:09 +0000203execfile('aedatamodelgen.py')
Guido van Rossum17448e21995-01-30 11:53:55 +0000204
205for f in functions: module.add(f)
206for f in aedescmethods: aedescobject.add(f)
207
208SetOutputFileName('AEmodule.c')
209module.generate()