blob: 49f072b21118eb5659363a8af921783ea28a0bdd [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")
14
15
16AEEventClass = OSTypeType('AEEventClass')
17AEEventID = OSTypeType('AEEventID')
18AEKeyword = OSTypeType('AEKeyword')
19DescType = OSTypeType('DescType')
20
21
22AEDesc = OpaqueType('AEDesc')
23AEDesc_ptr = OpaqueType('AEDesc')
24
25AEAddressDesc = OpaqueType('AEAddressDesc', 'AEDesc')
26AEAddressDesc_ptr = OpaqueType('AEAddressDesc', 'AEDesc')
27
28AEDescList = OpaqueType('AEDescList', 'AEDesc')
29AEDescList_ptr = OpaqueType('AEDescList', 'AEDesc')
30
31AERecord = OpaqueType('AERecord', 'AEDesc')
32AERecord_ptr = OpaqueType('AERecord', 'AEDesc')
33
34AppleEvent = OpaqueType('AppleEvent', 'AEDesc')
35AppleEvent_ptr = OpaqueType('AppleEvent', 'AEDesc')
36
37
38class EHType(Type):
39 def __init__(self, name = 'EventHandler', format = ''):
40 Type.__init__(self, name, format)
41 def declare(self, name):
42 Output("AEEventHandlerProcPtr %s__proc__ = GenericEventHandler;", name)
43 Output("PyObject *%s;", name)
44 def getargsFormat(self):
45 return "O"
46 def getargsArgs(self, name):
47 return "&%s" % name
48 def passInput(self, name):
49 return "%s__proc__, (long)%s" % (name, name)
50 def passOutput(self, name):
51 return "&%s__proc__, (long *)&%s" % (name, name)
52 def mkvalueFormat(self):
53 return "O"
54 def mkvalueArgs(self, name):
55 return name
56
57class EHNoRefConType(EHType):
58 def passInput(self, name):
59 return "GenericEventHandler"
60
61EventHandler = EHType()
62EventHandlerNoRefCon = EHNoRefConType()
63
64
65IdleProcPtr = FakeType("AEIdleProc")
66EventFilterProcPtr = FakeType("(AEFilterProcPtr)0")
67NMRecPtr = FakeType("(NMRecPtr)0")
68EventHandlerProcPtr = FakeType("GenericEventHandler")
69AlwaysFalse = FakeType("0")
70
71
72AEFunction = OSErrFunctionGenerator
73AEMethod = OSErrMethodGenerator
74
75
76includestuff = includestuff + """
77#include <AppleEvents.h>
78
79#ifdef THINK_C
80#define AEFilterProcPtr EventFilterProcPtr
81#define AEEventHandlerProcPtr EventHandlerProcPtr
82#endif
83
84static pascal OSErr GenericEventHandler(); /* Forward */
85
86static pascal Boolean AEIdleProc(EventRecord *theEvent, long *sleepTime, RgnHandle *mouseRgn)
87{
88 return !PyMac_Idle();
89}
90"""
91
92finalstuff = finalstuff + """
93static pascal OSErr
94GenericEventHandler(const AppleEvent *request, AppleEvent *reply, long refcon)
95{
96 PyObject *handler = (PyObject *)refcon;
97 AEDescObject *requestObject, *replyObject;
98 PyObject *args, *res;
99 if ((requestObject = (AEDescObject *)AEDesc_New(request)) == NULL) {
100 return -1;
101 }
102 if ((replyObject = (AEDescObject *)AEDesc_New(reply)) == NULL) {
103 Py_DECREF(requestObject);
104 return -1;
105 }
106 if ((args = Py_BuildValue("OO", requestObject, replyObject)) == NULL) {
107 Py_DECREF(requestObject);
108 Py_DECREF(replyObject);
109 return -1;
110 }
111 res = PyEval_CallObject(handler, args);
112 requestObject->ob_itself.descriptorType = 'null';
113 requestObject->ob_itself.dataHandle = NULL;
114 replyObject->ob_itself.descriptorType = 'null';
115 replyObject->ob_itself.dataHandle = NULL;
116 Py_DECREF(args);
117 if (res == NULL)
118 return -1;
119 Py_DECREF(res);
120 return noErr;
121}
122"""
123
124module = MacModule('AE', 'AE', includestuff, finalstuff, initstuff)
125
126class AEDescDefiniton(ObjectDefinition):
127
128 def __init__(self, name, prefix = None, itselftype = None):
129 ObjectDefinition.__init__(self, name, prefix or name, itselftype or name)
130 self.argref = "*"
131
132 def outputFreeIt(self, name):
133 Output("AEDisposeDesc(&%s);", name)
134
135 def outputGetattrHook(self):
136 Output("""
137if (strcmp(name, "type") == 0)
138 return PyMac_BuildOSType(self->ob_itself.descriptorType);
139if (strcmp(name, "data") == 0) {
140 PyObject *res;
141 char state;
142 state = HGetState(self->ob_itself.dataHandle);
143 HLock(self->ob_itself.dataHandle);
144 res = PyString_FromStringAndSize(
145 *self->ob_itself.dataHandle,
146 GetHandleSize(self->ob_itself.dataHandle));
147 HUnlock(self->ob_itself.dataHandle);
148 HSetState(self->ob_itself.dataHandle, state);
149 return res;
150}
151if (strcmp(name, "__members__") == 0)
152 return Py_BuildValue("[ss]", "data", "type");
153""")
154
155
156aedescobject = AEDescDefiniton('AEDesc')
157module.addobject(aedescobject)
158
159functions = []
160aedescmethods = []
161
162execfile('aegen.py')
163
164for f in functions: module.add(f)
165for f in aedescmethods: aedescobject.add(f)
166
167SetOutputFileName('AEmodule.c')
168module.generate()