0
0
mirror of https://github.com/python/cpython.git synced 2024-11-28 08:20:55 +01:00
cpython/Mac/Modules/ae/aesupport.py

169 lines
4.4 KiB
Python
Raw Normal View History

# This script will generate the AppleEvents interface for Python.
# It uses the "bgen" package to generate C code.
# It execs the file aegen.py which contain the function definitions
# (aegen.py was generated by aescan.py, scanning the <AppleEvents.h> header file).
from macsupport import *
AEArrayType = Type("AEArrayType", "c")
AESendMode = Type("AESendMode", "l")
AESendPriority = Type("AESendPriority", "h")
AEInteractAllowed = Type("AEInteractAllowed", "b")
AEEventClass = OSTypeType('AEEventClass')
AEEventID = OSTypeType('AEEventID')
AEKeyword = OSTypeType('AEKeyword')
DescType = OSTypeType('DescType')
AEDesc = OpaqueType('AEDesc')
AEDesc_ptr = OpaqueType('AEDesc')
AEAddressDesc = OpaqueType('AEAddressDesc', 'AEDesc')
AEAddressDesc_ptr = OpaqueType('AEAddressDesc', 'AEDesc')
AEDescList = OpaqueType('AEDescList', 'AEDesc')
AEDescList_ptr = OpaqueType('AEDescList', 'AEDesc')
AERecord = OpaqueType('AERecord', 'AEDesc')
AERecord_ptr = OpaqueType('AERecord', 'AEDesc')
AppleEvent = OpaqueType('AppleEvent', 'AEDesc')
AppleEvent_ptr = OpaqueType('AppleEvent', 'AEDesc')
class EHType(Type):
def __init__(self, name = 'EventHandler', format = ''):
Type.__init__(self, name, format)
def declare(self, name):
Output("AEEventHandlerProcPtr %s__proc__ = GenericEventHandler;", name)
Output("PyObject *%s;", name)
def getargsFormat(self):
return "O"
def getargsArgs(self, name):
return "&%s" % name
def passInput(self, name):
return "%s__proc__, (long)%s" % (name, name)
def passOutput(self, name):
return "&%s__proc__, (long *)&%s" % (name, name)
def mkvalueFormat(self):
return "O"
def mkvalueArgs(self, name):
return name
class EHNoRefConType(EHType):
def passInput(self, name):
return "GenericEventHandler"
EventHandler = EHType()
EventHandlerNoRefCon = EHNoRefConType()
IdleProcPtr = FakeType("AEIdleProc")
EventFilterProcPtr = FakeType("(AEFilterProcPtr)0")
NMRecPtr = FakeType("(NMRecPtr)0")
EventHandlerProcPtr = FakeType("GenericEventHandler")
AlwaysFalse = FakeType("0")
AEFunction = OSErrFunctionGenerator
AEMethod = OSErrMethodGenerator
includestuff = includestuff + """
#include <AppleEvents.h>
#ifdef THINK_C
#define AEFilterProcPtr EventFilterProcPtr
#define AEEventHandlerProcPtr EventHandlerProcPtr
#endif
static pascal OSErr GenericEventHandler(); /* Forward */
static pascal Boolean AEIdleProc(EventRecord *theEvent, long *sleepTime, RgnHandle *mouseRgn)
{
return !PyMac_Idle();
}
"""
finalstuff = finalstuff + """
static pascal OSErr
GenericEventHandler(const AppleEvent *request, AppleEvent *reply, long refcon)
{
PyObject *handler = (PyObject *)refcon;
AEDescObject *requestObject, *replyObject;
PyObject *args, *res;
if ((requestObject = (AEDescObject *)AEDesc_New(request)) == NULL) {
return -1;
}
if ((replyObject = (AEDescObject *)AEDesc_New(reply)) == NULL) {
Py_DECREF(requestObject);
return -1;
}
if ((args = Py_BuildValue("OO", requestObject, replyObject)) == NULL) {
Py_DECREF(requestObject);
Py_DECREF(replyObject);
return -1;
}
res = PyEval_CallObject(handler, args);
requestObject->ob_itself.descriptorType = 'null';
requestObject->ob_itself.dataHandle = NULL;
replyObject->ob_itself.descriptorType = 'null';
replyObject->ob_itself.dataHandle = NULL;
Py_DECREF(args);
if (res == NULL)
return -1;
Py_DECREF(res);
return noErr;
}
"""
module = MacModule('AE', 'AE', includestuff, finalstuff, initstuff)
class AEDescDefiniton(ObjectDefinition):
def __init__(self, name, prefix = None, itselftype = None):
ObjectDefinition.__init__(self, name, prefix or name, itselftype or name)
self.argref = "*"
def outputFreeIt(self, name):
Output("AEDisposeDesc(&%s);", name)
def outputGetattrHook(self):
Output("""
if (strcmp(name, "type") == 0)
return PyMac_BuildOSType(self->ob_itself.descriptorType);
if (strcmp(name, "data") == 0) {
PyObject *res;
char state;
state = HGetState(self->ob_itself.dataHandle);
HLock(self->ob_itself.dataHandle);
res = PyString_FromStringAndSize(
*self->ob_itself.dataHandle,
GetHandleSize(self->ob_itself.dataHandle));
HUnlock(self->ob_itself.dataHandle);
HSetState(self->ob_itself.dataHandle, state);
return res;
}
if (strcmp(name, "__members__") == 0)
return Py_BuildValue("[ss]", "data", "type");
""")
aedescobject = AEDescDefiniton('AEDesc')
module.addobject(aedescobject)
functions = []
aedescmethods = []
execfile('aegen.py')
for f in functions: module.add(f)
for f in aedescmethods: aedescobject.add(f)
SetOutputFileName('AEmodule.c')
module.generate()