/* =========================== Module _AE =========================== */

#include "Python.h"



#include "pymactoolbox.h"

#ifndef HAVE_OSX105_SDK
typedef SInt32 SRefCon;
#endif

/* Macro to test whether a weak-loaded CFM function exists */
#define PyMac_PRECHECK(rtn) do { if ( &rtn == NULL )  {\
    PyErr_SetString(PyExc_NotImplementedError, \
    "Not available in this shared library/OS version"); \
    return NULL; \
    }} while(0)


#include <Carbon/Carbon.h>

#ifdef USE_TOOLBOX_OBJECT_GLUE
extern PyObject *_AEDesc_New(AEDesc *);
extern int _AEDesc_Convert(PyObject *, AEDesc *);

#define AEDesc_New _AEDesc_New
#define AEDesc_NewBorrowed _AEDesc_NewBorrowed
#define AEDesc_Convert _AEDesc_Convert
#endif

typedef long refcontype;

static pascal OSErr GenericEventHandler(const AppleEvent *request, AppleEvent *reply, refcontype refcon); /* Forward */

AEEventHandlerUPP upp_GenericEventHandler;

static pascal Boolean AEIdleProc(EventRecord *theEvent, long *sleepTime, RgnHandle *mouseRgn)
{
    if ( PyOS_InterruptOccurred() )
        return 1;
    return 0;
}

AEIdleUPP upp_AEIdleProc;

static PyObject *AE_Error;

/* ----------------------- Object type AEDesc ----------------------- */

PyTypeObject AEDesc_Type;

#define AEDesc_Check(x) ((x)->ob_type == &AEDesc_Type || PyObject_TypeCheck((x), &AEDesc_Type))

typedef struct AEDescObject {
    PyObject_HEAD
    AEDesc ob_itself;
    int ob_owned;
} AEDescObject;

PyObject *AEDesc_New(AEDesc *itself)
{
    AEDescObject *it;
    it = PyObject_NEW(AEDescObject, &AEDesc_Type);
    if (it == NULL) return NULL;
    it->ob_itself = *itself;
    it->ob_owned = 1;
    return (PyObject *)it;
}

int AEDesc_Convert(PyObject *v, AEDesc *p_itself)
{
    if (!AEDesc_Check(v))
    {
        PyErr_SetString(PyExc_TypeError, "AEDesc required");
        return 0;
    }
    *p_itself = ((AEDescObject *)v)->ob_itself;
    return 1;
}

static void AEDesc_dealloc(AEDescObject *self)
{
    if (self->ob_owned) AEDisposeDesc(&self->ob_itself);
    self->ob_type->tp_free((PyObject *)self);
}

static PyObject *AEDesc_AECoerceDesc(AEDescObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    DescType toType;
    AEDesc result;
#ifndef AECoerceDesc
    PyMac_PRECHECK(AECoerceDesc);
#endif
    if (!PyArg_ParseTuple(_args, "O&",
                          PyMac_GetOSType, &toType))
        return NULL;
    _err = AECoerceDesc(&_self->ob_itself,
                        toType,
                        &result);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("O&",
                         AEDesc_New, &result);
    return _res;
}

static PyObject *AEDesc_AEDuplicateDesc(AEDescObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    AEDesc result;
#ifndef AEDuplicateDesc
    PyMac_PRECHECK(AEDuplicateDesc);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _err = AEDuplicateDesc(&_self->ob_itself,
                           &result);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("O&",
                         AEDesc_New, &result);
    return _res;
}

static PyObject *AEDesc_AECountItems(AEDescObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    long theCount;
#ifndef AECountItems
    PyMac_PRECHECK(AECountItems);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _err = AECountItems(&_self->ob_itself,
                        &theCount);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("l",
                         theCount);
    return _res;
}

static PyObject *AEDesc_AEPutPtr(AEDescObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    long index;
    DescType typeCode;
    char *dataPtr__in__;
    long dataPtr__len__;
    int dataPtr__in_len__;
#ifndef AEPutPtr
    PyMac_PRECHECK(AEPutPtr);
#endif
    if (!PyArg_ParseTuple(_args, "lO&s#",
                          &index,
                          PyMac_GetOSType, &typeCode,
                          &dataPtr__in__, &dataPtr__in_len__))
        return NULL;
    dataPtr__len__ = dataPtr__in_len__;
    _err = AEPutPtr(&_self->ob_itself,
                    index,
                    typeCode,
                    dataPtr__in__, dataPtr__len__);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *AEDesc_AEPutDesc(AEDescObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    long index;
    AEDesc theAEDesc;
#ifndef AEPutDesc
    PyMac_PRECHECK(AEPutDesc);
#endif
    if (!PyArg_ParseTuple(_args, "lO&",
                          &index,
                          AEDesc_Convert, &theAEDesc))
        return NULL;
    _err = AEPutDesc(&_self->ob_itself,
                     index,
                     &theAEDesc);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *AEDesc_AEGetNthPtr(AEDescObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    long index;
    DescType desiredType;
    AEKeyword theAEKeyword;
    DescType typeCode;
    char *dataPtr__out__;
    long dataPtr__len__;
    int dataPtr__in_len__;
#ifndef AEGetNthPtr
    PyMac_PRECHECK(AEGetNthPtr);
#endif
    if (!PyArg_ParseTuple(_args, "lO&i",
                          &index,
                          PyMac_GetOSType, &desiredType,
                          &dataPtr__in_len__))
        return NULL;
    if ((dataPtr__out__ = malloc(dataPtr__in_len__)) == NULL)
    {
        PyErr_NoMemory();
        goto dataPtr__error__;
    }
    dataPtr__len__ = dataPtr__in_len__;
    _err = AEGetNthPtr(&_self->ob_itself,
                       index,
                       desiredType,
                       &theAEKeyword,
                       &typeCode,
                       dataPtr__out__, dataPtr__len__, &dataPtr__len__);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("O&O&s#",
                         PyMac_BuildOSType, theAEKeyword,
                         PyMac_BuildOSType, typeCode,
                         dataPtr__out__, (int)dataPtr__len__);
    free(dataPtr__out__);
 dataPtr__error__: ;
    return _res;
}

static PyObject *AEDesc_AEGetNthDesc(AEDescObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    long index;
    DescType desiredType;
    AEKeyword theAEKeyword;
    AEDesc result;
#ifndef AEGetNthDesc
    PyMac_PRECHECK(AEGetNthDesc);
#endif
    if (!PyArg_ParseTuple(_args, "lO&",
                          &index,
                          PyMac_GetOSType, &desiredType))
        return NULL;
    _err = AEGetNthDesc(&_self->ob_itself,
                        index,
                        desiredType,
                        &theAEKeyword,
                        &result);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("O&O&",
                         PyMac_BuildOSType, theAEKeyword,
                         AEDesc_New, &result);
    return _res;
}

static PyObject *AEDesc_AESizeOfNthItem(AEDescObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    long index;
    DescType typeCode;
    Size dataSize;
#ifndef AESizeOfNthItem
    PyMac_PRECHECK(AESizeOfNthItem);
#endif
    if (!PyArg_ParseTuple(_args, "l",
                          &index))
        return NULL;
    _err = AESizeOfNthItem(&_self->ob_itself,
                           index,
                           &typeCode,
                           &dataSize);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("O&l",
                         PyMac_BuildOSType, typeCode,
                         dataSize);
    return _res;
}

static PyObject *AEDesc_AEDeleteItem(AEDescObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    long index;
#ifndef AEDeleteItem
    PyMac_PRECHECK(AEDeleteItem);
#endif
    if (!PyArg_ParseTuple(_args, "l",
                          &index))
        return NULL;
    _err = AEDeleteItem(&_self->ob_itself,
                        index);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *AEDesc_AEPutParamPtr(AEDescObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    AEKeyword theAEKeyword;
    DescType typeCode;
    char *dataPtr__in__;
    long dataPtr__len__;
    int dataPtr__in_len__;
#ifndef AEPutParamPtr
    PyMac_PRECHECK(AEPutParamPtr);
#endif
    if (!PyArg_ParseTuple(_args, "O&O&s#",
                          PyMac_GetOSType, &theAEKeyword,
                          PyMac_GetOSType, &typeCode,
                          &dataPtr__in__, &dataPtr__in_len__))
        return NULL;
    dataPtr__len__ = dataPtr__in_len__;
    _err = AEPutParamPtr(&_self->ob_itself,
                         theAEKeyword,
                         typeCode,
                         dataPtr__in__, dataPtr__len__);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *AEDesc_AEPutParamDesc(AEDescObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    AEKeyword theAEKeyword;
    AEDesc theAEDesc;
#ifndef AEPutParamDesc
    PyMac_PRECHECK(AEPutParamDesc);
#endif
    if (!PyArg_ParseTuple(_args, "O&O&",
                          PyMac_GetOSType, &theAEKeyword,
                          AEDesc_Convert, &theAEDesc))
        return NULL;
    _err = AEPutParamDesc(&_self->ob_itself,
                          theAEKeyword,
                          &theAEDesc);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *AEDesc_AEGetParamPtr(AEDescObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    AEKeyword theAEKeyword;
    DescType desiredType;
    DescType typeCode;
    char *dataPtr__out__;
    long dataPtr__len__;
    int dataPtr__in_len__;
#ifndef AEGetParamPtr
    PyMac_PRECHECK(AEGetParamPtr);
#endif
    if (!PyArg_ParseTuple(_args, "O&O&i",
                          PyMac_GetOSType, &theAEKeyword,
                          PyMac_GetOSType, &desiredType,
                          &dataPtr__in_len__))
        return NULL;
    if ((dataPtr__out__ = malloc(dataPtr__in_len__)) == NULL)
    {
        PyErr_NoMemory();
        goto dataPtr__error__;
    }
    dataPtr__len__ = dataPtr__in_len__;
    _err = AEGetParamPtr(&_self->ob_itself,
                         theAEKeyword,
                         desiredType,
                         &typeCode,
                         dataPtr__out__, dataPtr__len__, &dataPtr__len__);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("O&s#",
                         PyMac_BuildOSType, typeCode,
                         dataPtr__out__, (int)dataPtr__len__);
    free(dataPtr__out__);
 dataPtr__error__: ;
    return _res;
}

static PyObject *AEDesc_AEGetParamDesc(AEDescObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    AEKeyword theAEKeyword;
    DescType desiredType;
    AEDesc result;
#ifndef AEGetParamDesc
    PyMac_PRECHECK(AEGetParamDesc);
#endif
    if (!PyArg_ParseTuple(_args, "O&O&",
                          PyMac_GetOSType, &theAEKeyword,
                          PyMac_GetOSType, &desiredType))
        return NULL;
    _err = AEGetParamDesc(&_self->ob_itself,
                          theAEKeyword,
                          desiredType,
                          &result);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("O&",
                         AEDesc_New, &result);
    return _res;
}

static PyObject *AEDesc_AESizeOfParam(AEDescObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    AEKeyword theAEKeyword;
    DescType typeCode;
    Size dataSize;
#ifndef AESizeOfParam
    PyMac_PRECHECK(AESizeOfParam);
#endif
    if (!PyArg_ParseTuple(_args, "O&",
                          PyMac_GetOSType, &theAEKeyword))
        return NULL;
    _err = AESizeOfParam(&_self->ob_itself,
                         theAEKeyword,
                         &typeCode,
                         &dataSize);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("O&l",
                         PyMac_BuildOSType, typeCode,
                         dataSize);
    return _res;
}

static PyObject *AEDesc_AEDeleteParam(AEDescObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    AEKeyword theAEKeyword;
#ifndef AEDeleteParam
    PyMac_PRECHECK(AEDeleteParam);
#endif
    if (!PyArg_ParseTuple(_args, "O&",
                          PyMac_GetOSType, &theAEKeyword))
        return NULL;
    _err = AEDeleteParam(&_self->ob_itself,
                         theAEKeyword);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *AEDesc_AEGetAttributePtr(AEDescObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    AEKeyword theAEKeyword;
    DescType desiredType;
    DescType typeCode;
    char *dataPtr__out__;
    long dataPtr__len__;
    int dataPtr__in_len__;
#ifndef AEGetAttributePtr
    PyMac_PRECHECK(AEGetAttributePtr);
#endif
    if (!PyArg_ParseTuple(_args, "O&O&i",
                          PyMac_GetOSType, &theAEKeyword,
                          PyMac_GetOSType, &desiredType,
                          &dataPtr__in_len__))
        return NULL;
    if ((dataPtr__out__ = malloc(dataPtr__in_len__)) == NULL)
    {
        PyErr_NoMemory();
        goto dataPtr__error__;
    }
    dataPtr__len__ = dataPtr__in_len__;
    _err = AEGetAttributePtr(&_self->ob_itself,
                             theAEKeyword,
                             desiredType,
                             &typeCode,
                             dataPtr__out__, dataPtr__len__, &dataPtr__len__);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("O&s#",
                         PyMac_BuildOSType, typeCode,
                         dataPtr__out__, (int)dataPtr__len__);
    free(dataPtr__out__);
 dataPtr__error__: ;
    return _res;
}

static PyObject *AEDesc_AEGetAttributeDesc(AEDescObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    AEKeyword theAEKeyword;
    DescType desiredType;
    AEDesc result;
#ifndef AEGetAttributeDesc
    PyMac_PRECHECK(AEGetAttributeDesc);
#endif
    if (!PyArg_ParseTuple(_args, "O&O&",
                          PyMac_GetOSType, &theAEKeyword,
                          PyMac_GetOSType, &desiredType))
        return NULL;
    _err = AEGetAttributeDesc(&_self->ob_itself,
                              theAEKeyword,
                              desiredType,
                              &result);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("O&",
                         AEDesc_New, &result);
    return _res;
}

static PyObject *AEDesc_AESizeOfAttribute(AEDescObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    AEKeyword theAEKeyword;
    DescType typeCode;
    Size dataSize;
#ifndef AESizeOfAttribute
    PyMac_PRECHECK(AESizeOfAttribute);
#endif
    if (!PyArg_ParseTuple(_args, "O&",
                          PyMac_GetOSType, &theAEKeyword))
        return NULL;
    _err = AESizeOfAttribute(&_self->ob_itself,
                             theAEKeyword,
                             &typeCode,
                             &dataSize);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("O&l",
                         PyMac_BuildOSType, typeCode,
                         dataSize);
    return _res;
}

static PyObject *AEDesc_AEPutAttributePtr(AEDescObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    AEKeyword theAEKeyword;
    DescType typeCode;
    char *dataPtr__in__;
    long dataPtr__len__;
    int dataPtr__in_len__;
#ifndef AEPutAttributePtr
    PyMac_PRECHECK(AEPutAttributePtr);
#endif
    if (!PyArg_ParseTuple(_args, "O&O&s#",
                          PyMac_GetOSType, &theAEKeyword,
                          PyMac_GetOSType, &typeCode,
                          &dataPtr__in__, &dataPtr__in_len__))
        return NULL;
    dataPtr__len__ = dataPtr__in_len__;
    _err = AEPutAttributePtr(&_self->ob_itself,
                             theAEKeyword,
                             typeCode,
                             dataPtr__in__, dataPtr__len__);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *AEDesc_AEPutAttributeDesc(AEDescObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    AEKeyword theAEKeyword;
    AEDesc theAEDesc;
#ifndef AEPutAttributeDesc
    PyMac_PRECHECK(AEPutAttributeDesc);
#endif
    if (!PyArg_ParseTuple(_args, "O&O&",
                          PyMac_GetOSType, &theAEKeyword,
                          AEDesc_Convert, &theAEDesc))
        return NULL;
    _err = AEPutAttributeDesc(&_self->ob_itself,
                              theAEKeyword,
                              &theAEDesc);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *AEDesc_AEGetDescDataSize(AEDescObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    Size _rv;
#ifndef AEGetDescDataSize
    PyMac_PRECHECK(AEGetDescDataSize);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _rv = AEGetDescDataSize(&_self->ob_itself);
    _res = Py_BuildValue("l",
                         _rv);
    return _res;
}

static PyObject *AEDesc_AESend(AEDescObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    AppleEvent reply;
    AESendMode sendMode;
    AESendPriority sendPriority;
    long timeOutInTicks;
#ifndef AESend
    PyMac_PRECHECK(AESend);
#endif
    if (!PyArg_ParseTuple(_args, "lhl",
                          &sendMode,
                          &sendPriority,
                          &timeOutInTicks))
        return NULL;
    _err = AESend(&_self->ob_itself,
                  &reply,
                  sendMode,
                  sendPriority,
                  timeOutInTicks,
                  upp_AEIdleProc,
                  (AEFilterUPP)0);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("O&",
                         AEDesc_New, &reply);
    return _res;
}

static PyObject *AEDesc_AEResetTimer(AEDescObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
#ifndef AEResetTimer
    PyMac_PRECHECK(AEResetTimer);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _err = AEResetTimer(&_self->ob_itself);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *AEDesc_AESuspendTheCurrentEvent(AEDescObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
#ifndef AESuspendTheCurrentEvent
    PyMac_PRECHECK(AESuspendTheCurrentEvent);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _err = AESuspendTheCurrentEvent(&_self->ob_itself);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *AEDesc_AEResumeTheCurrentEvent(AEDescObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    AppleEvent reply;
    AEEventHandlerUPP dispatcher__proc__ = upp_GenericEventHandler;
    PyObject *dispatcher;
#ifndef AEResumeTheCurrentEvent
    PyMac_PRECHECK(AEResumeTheCurrentEvent);
#endif
    if (!PyArg_ParseTuple(_args, "O&O",
                          AEDesc_Convert, &reply,
                          &dispatcher))
        return NULL;
    _err = AEResumeTheCurrentEvent(&_self->ob_itself,
                                   &reply,
                                   dispatcher__proc__,
                                   (SRefCon)dispatcher);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    Py_INCREF(dispatcher); /* XXX leak, but needed */
    return _res;
}

static PyObject *AEDesc_AEGetTheCurrentEvent(AEDescObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
#ifndef AEGetTheCurrentEvent
    PyMac_PRECHECK(AEGetTheCurrentEvent);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _err = AEGetTheCurrentEvent(&_self->ob_itself);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *AEDesc_AESetTheCurrentEvent(AEDescObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
#ifndef AESetTheCurrentEvent
    PyMac_PRECHECK(AESetTheCurrentEvent);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _err = AESetTheCurrentEvent(&_self->ob_itself);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *AEDesc_AEResolve(AEDescObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    short callbackFlags;
    AEDesc theToken;
#ifndef AEResolve
    PyMac_PRECHECK(AEResolve);
#endif
    if (!PyArg_ParseTuple(_args, "h",
                          &callbackFlags))
        return NULL;
    _err = AEResolve(&_self->ob_itself,
                     callbackFlags,
                     &theToken);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("O&",
                         AEDesc_New, &theToken);
    return _res;
}

static PyObject *AEDesc_AutoDispose(AEDescObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;

    int onoff, old;
    if (!PyArg_ParseTuple(_args, "i", &onoff))
        return NULL;
    old = _self->ob_owned;
    _self->ob_owned = onoff;
    _res = Py_BuildValue("i", old);
    return _res;

}

static PyMethodDef AEDesc_methods[] = {
    {"AECoerceDesc", (PyCFunction)AEDesc_AECoerceDesc, 1,
     PyDoc_STR("(DescType toType) -> (AEDesc result)")},
    {"AEDuplicateDesc", (PyCFunction)AEDesc_AEDuplicateDesc, 1,
     PyDoc_STR("() -> (AEDesc result)")},
    {"AECountItems", (PyCFunction)AEDesc_AECountItems, 1,
     PyDoc_STR("() -> (long theCount)")},
    {"AEPutPtr", (PyCFunction)AEDesc_AEPutPtr, 1,
     PyDoc_STR("(long index, DescType typeCode, Buffer dataPtr) -> None")},
    {"AEPutDesc", (PyCFunction)AEDesc_AEPutDesc, 1,
     PyDoc_STR("(long index, AEDesc theAEDesc) -> None")},
    {"AEGetNthPtr", (PyCFunction)AEDesc_AEGetNthPtr, 1,
     PyDoc_STR("(long index, DescType desiredType, Buffer dataPtr) -> (AEKeyword theAEKeyword, DescType typeCode, Buffer dataPtr)")},
    {"AEGetNthDesc", (PyCFunction)AEDesc_AEGetNthDesc, 1,
     PyDoc_STR("(long index, DescType desiredType) -> (AEKeyword theAEKeyword, AEDesc result)")},
    {"AESizeOfNthItem", (PyCFunction)AEDesc_AESizeOfNthItem, 1,
     PyDoc_STR("(long index) -> (DescType typeCode, Size dataSize)")},
    {"AEDeleteItem", (PyCFunction)AEDesc_AEDeleteItem, 1,
     PyDoc_STR("(long index) -> None")},
    {"AEPutParamPtr", (PyCFunction)AEDesc_AEPutParamPtr, 1,
     PyDoc_STR("(AEKeyword theAEKeyword, DescType typeCode, Buffer dataPtr) -> None")},
    {"AEPutParamDesc", (PyCFunction)AEDesc_AEPutParamDesc, 1,
     PyDoc_STR("(AEKeyword theAEKeyword, AEDesc theAEDesc) -> None")},
    {"AEGetParamPtr", (PyCFunction)AEDesc_AEGetParamPtr, 1,
     PyDoc_STR("(AEKeyword theAEKeyword, DescType desiredType, Buffer dataPtr) -> (DescType typeCode, Buffer dataPtr)")},
    {"AEGetParamDesc", (PyCFunction)AEDesc_AEGetParamDesc, 1,
     PyDoc_STR("(AEKeyword theAEKeyword, DescType desiredType) -> (AEDesc result)")},
    {"AESizeOfParam", (PyCFunction)AEDesc_AESizeOfParam, 1,
     PyDoc_STR("(AEKeyword theAEKeyword) -> (DescType typeCode, Size dataSize)")},
    {"AEDeleteParam", (PyCFunction)AEDesc_AEDeleteParam, 1,
     PyDoc_STR("(AEKeyword theAEKeyword) -> None")},
    {"AEGetAttributePtr", (PyCFunction)AEDesc_AEGetAttributePtr, 1,
     PyDoc_STR("(AEKeyword theAEKeyword, DescType desiredType, Buffer dataPtr) -> (DescType typeCode, Buffer dataPtr)")},
    {"AEGetAttributeDesc", (PyCFunction)AEDesc_AEGetAttributeDesc, 1,
     PyDoc_STR("(AEKeyword theAEKeyword, DescType desiredType) -> (AEDesc result)")},
    {"AESizeOfAttribute", (PyCFunction)AEDesc_AESizeOfAttribute, 1,
     PyDoc_STR("(AEKeyword theAEKeyword) -> (DescType typeCode, Size dataSize)")},
    {"AEPutAttributePtr", (PyCFunction)AEDesc_AEPutAttributePtr, 1,
     PyDoc_STR("(AEKeyword theAEKeyword, DescType typeCode, Buffer dataPtr) -> None")},
    {"AEPutAttributeDesc", (PyCFunction)AEDesc_AEPutAttributeDesc, 1,
     PyDoc_STR("(AEKeyword theAEKeyword, AEDesc theAEDesc) -> None")},
    {"AEGetDescDataSize", (PyCFunction)AEDesc_AEGetDescDataSize, 1,
     PyDoc_STR("() -> (Size _rv)")},
    {"AESend", (PyCFunction)AEDesc_AESend, 1,
     PyDoc_STR("(AESendMode sendMode, AESendPriority sendPriority, long timeOutInTicks) -> (AppleEvent reply)")},
    {"AEResetTimer", (PyCFunction)AEDesc_AEResetTimer, 1,
     PyDoc_STR("() -> None")},
    {"AESuspendTheCurrentEvent", (PyCFunction)AEDesc_AESuspendTheCurrentEvent, 1,
     PyDoc_STR("() -> None")},
    {"AEResumeTheCurrentEvent", (PyCFunction)AEDesc_AEResumeTheCurrentEvent, 1,
     PyDoc_STR("(AppleEvent reply, EventHandler dispatcher) -> None")},
    {"AEGetTheCurrentEvent", (PyCFunction)AEDesc_AEGetTheCurrentEvent, 1,
     PyDoc_STR("() -> None")},
    {"AESetTheCurrentEvent", (PyCFunction)AEDesc_AESetTheCurrentEvent, 1,
     PyDoc_STR("() -> None")},
    {"AEResolve", (PyCFunction)AEDesc_AEResolve, 1,
     PyDoc_STR("(short callbackFlags) -> (AEDesc theToken)")},
    {"AutoDispose", (PyCFunction)AEDesc_AutoDispose, 1,
     PyDoc_STR("(int)->int. Automatically AEDisposeDesc the object on Python object cleanup")},
    {NULL, NULL, 0}
};

static PyObject *AEDesc_get_type(AEDescObject *self, void *closure)
{
    return PyMac_BuildOSType(self->ob_itself.descriptorType);
}

#define AEDesc_set_type NULL

static PyObject *AEDesc_get_data(AEDescObject *self, void *closure)
{
    PyObject *res;
    Size size;
    char *ptr;
    OSErr err;

    size = AEGetDescDataSize(&self->ob_itself);
    if ( (res = PyString_FromStringAndSize(NULL, size)) == NULL )
        return NULL;
    if ( (ptr = PyString_AsString(res)) == NULL )
        return NULL;
    if ( (err=AEGetDescData(&self->ob_itself, ptr, size)) < 0 )
        return PyMac_Error(err);
    return res;
}

#define AEDesc_set_data NULL

static PyGetSetDef AEDesc_getsetlist[] = {
    {"type", (getter)AEDesc_get_type, (setter)AEDesc_set_type, "Type of this AEDesc"},
    {"data", (getter)AEDesc_get_data, (setter)AEDesc_set_data, "The raw data in this AEDesc"},
    {NULL, NULL, NULL, NULL},
};


#define AEDesc_compare NULL

#define AEDesc_repr NULL

#define AEDesc_hash NULL
#define AEDesc_tp_init 0

#define AEDesc_tp_alloc PyType_GenericAlloc

static PyObject *AEDesc_tp_new(PyTypeObject *type, PyObject *_args, PyObject *_kwds)
{
    PyObject *_self;
    AEDesc itself;
    char *kw[] = {"itself", 0};

    if (!PyArg_ParseTupleAndKeywords(_args, _kwds, "O&", kw, AEDesc_Convert, &itself)) return NULL;
    if ((_self = type->tp_alloc(type, 0)) == NULL) return NULL;
    ((AEDescObject *)_self)->ob_itself = itself;
    return _self;
}

#define AEDesc_tp_free PyObject_Del


PyTypeObject AEDesc_Type = {
    PyObject_HEAD_INIT(NULL)
    0, /*ob_size*/
    "_AE.AEDesc", /*tp_name*/
    sizeof(AEDescObject), /*tp_basicsize*/
    0, /*tp_itemsize*/
    /* methods */
    (destructor) AEDesc_dealloc, /*tp_dealloc*/
    0, /*tp_print*/
    (getattrfunc)0, /*tp_getattr*/
    (setattrfunc)0, /*tp_setattr*/
    (cmpfunc) AEDesc_compare, /*tp_compare*/
    (reprfunc) AEDesc_repr, /*tp_repr*/
    (PyNumberMethods *)0, /* tp_as_number */
    (PySequenceMethods *)0, /* tp_as_sequence */
    (PyMappingMethods *)0, /* tp_as_mapping */
    (hashfunc) AEDesc_hash, /*tp_hash*/
    0, /*tp_call*/
    0, /*tp_str*/
    PyObject_GenericGetAttr, /*tp_getattro*/
    PyObject_GenericSetAttr, /*tp_setattro */
    0, /*tp_as_buffer*/
    Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */
    0, /*tp_doc*/
    0, /*tp_traverse*/
    0, /*tp_clear*/
    0, /*tp_richcompare*/
    0, /*tp_weaklistoffset*/
    0, /*tp_iter*/
    0, /*tp_iternext*/
    AEDesc_methods, /* tp_methods */
    0, /*tp_members*/
    AEDesc_getsetlist, /*tp_getset*/
    0, /*tp_base*/
    0, /*tp_dict*/
    0, /*tp_descr_get*/
    0, /*tp_descr_set*/
    0, /*tp_dictoffset*/
    AEDesc_tp_init, /* tp_init */
    AEDesc_tp_alloc, /* tp_alloc */
    AEDesc_tp_new, /* tp_new */
    AEDesc_tp_free, /* tp_free */
};

/* --------------------- End object type AEDesc --------------------- */


static PyObject *AE_AECoercePtr(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    DescType typeCode;
    char *dataPtr__in__;
    long dataPtr__len__;
    int dataPtr__in_len__;
    DescType toType;
    AEDesc result;
#ifndef AECoercePtr
    PyMac_PRECHECK(AECoercePtr);
#endif
    if (!PyArg_ParseTuple(_args, "O&s#O&",
                          PyMac_GetOSType, &typeCode,
                          &dataPtr__in__, &dataPtr__in_len__,
                          PyMac_GetOSType, &toType))
        return NULL;
    dataPtr__len__ = dataPtr__in_len__;
    _err = AECoercePtr(typeCode,
                       dataPtr__in__, dataPtr__len__,
                       toType,
                       &result);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("O&",
                         AEDesc_New, &result);
    return _res;
}

static PyObject *AE_AECreateDesc(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    DescType typeCode;
    char *dataPtr__in__;
    long dataPtr__len__;
    int dataPtr__in_len__;
    AEDesc result;
#ifndef AECreateDesc
    PyMac_PRECHECK(AECreateDesc);
#endif
    if (!PyArg_ParseTuple(_args, "O&s#",
                          PyMac_GetOSType, &typeCode,
                          &dataPtr__in__, &dataPtr__in_len__))
        return NULL;
    dataPtr__len__ = dataPtr__in_len__;
    _err = AECreateDesc(typeCode,
                        dataPtr__in__, dataPtr__len__,
                        &result);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("O&",
                         AEDesc_New, &result);
    return _res;
}

static PyObject *AE_AECreateList(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    char *factoringPtr__in__;
    long factoringPtr__len__;
    int factoringPtr__in_len__;
    Boolean isRecord;
    AEDescList resultList;
#ifndef AECreateList
    PyMac_PRECHECK(AECreateList);
#endif
    if (!PyArg_ParseTuple(_args, "s#b",
                          &factoringPtr__in__, &factoringPtr__in_len__,
                          &isRecord))
        return NULL;
    factoringPtr__len__ = factoringPtr__in_len__;
    _err = AECreateList(factoringPtr__in__, factoringPtr__len__,
                        isRecord,
                        &resultList);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("O&",
                         AEDesc_New, &resultList);
    return _res;
}

static PyObject *AE_AECreateAppleEvent(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    AEEventClass theAEEventClass;
    AEEventID theAEEventID;
    AEAddressDesc target;
    AEReturnID returnID;
    AETransactionID transactionID;
    AppleEvent result;
#ifndef AECreateAppleEvent
    PyMac_PRECHECK(AECreateAppleEvent);
#endif
    if (!PyArg_ParseTuple(_args, "O&O&O&hl",
                          PyMac_GetOSType, &theAEEventClass,
                          PyMac_GetOSType, &theAEEventID,
                          AEDesc_Convert, &target,
                          &returnID,
                          &transactionID))
        return NULL;
    _err = AECreateAppleEvent(theAEEventClass,
                              theAEEventID,
                              &target,
                              returnID,
                              transactionID,
                              &result);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("O&",
                         AEDesc_New, &result);
    return _res;
}

static PyObject *AE_AEReplaceDescData(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    DescType typeCode;
    char *dataPtr__in__;
    long dataPtr__len__;
    int dataPtr__in_len__;
    AEDesc theAEDesc;
#ifndef AEReplaceDescData
    PyMac_PRECHECK(AEReplaceDescData);
#endif
    if (!PyArg_ParseTuple(_args, "O&s#",
                          PyMac_GetOSType, &typeCode,
                          &dataPtr__in__, &dataPtr__in_len__))
        return NULL;
    dataPtr__len__ = dataPtr__in_len__;
    _err = AEReplaceDescData(typeCode,
                             dataPtr__in__, dataPtr__len__,
                             &theAEDesc);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("O&",
                         AEDesc_New, &theAEDesc);
    return _res;
}

static PyObject *AE_AEProcessAppleEvent(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    EventRecord theEventRecord;
#ifndef AEProcessAppleEvent
    PyMac_PRECHECK(AEProcessAppleEvent);
#endif
    if (!PyArg_ParseTuple(_args, "O&",
                          PyMac_GetEventRecord, &theEventRecord))
        return NULL;
    _err = AEProcessAppleEvent(&theEventRecord);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *AE_AEGetInteractionAllowed(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    AEInteractAllowed level;
#ifndef AEGetInteractionAllowed
    PyMac_PRECHECK(AEGetInteractionAllowed);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _err = AEGetInteractionAllowed(&level);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("b",
                         level);
    return _res;
}

static PyObject *AE_AESetInteractionAllowed(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    AEInteractAllowed level;
#ifndef AESetInteractionAllowed
    PyMac_PRECHECK(AESetInteractionAllowed);
#endif
    if (!PyArg_ParseTuple(_args, "b",
                          &level))
        return NULL;
    _err = AESetInteractionAllowed(level);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *AE_AEInteractWithUser(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    long timeOutInTicks;
#ifndef AEInteractWithUser
    PyMac_PRECHECK(AEInteractWithUser);
#endif
    if (!PyArg_ParseTuple(_args, "l",
                          &timeOutInTicks))
        return NULL;
    _err = AEInteractWithUser(timeOutInTicks,
                              (NMRecPtr)0,
                              upp_AEIdleProc);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *AE_AEInstallEventHandler(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    AEEventClass theAEEventClass;
    AEEventID theAEEventID;
    AEEventHandlerUPP handler__proc__ = upp_GenericEventHandler;
    PyObject *handler;
#ifndef AEInstallEventHandler
    PyMac_PRECHECK(AEInstallEventHandler);
#endif
    if (!PyArg_ParseTuple(_args, "O&O&O",
                          PyMac_GetOSType, &theAEEventClass,
                          PyMac_GetOSType, &theAEEventID,
                          &handler))
        return NULL;
    _err = AEInstallEventHandler(theAEEventClass,
                                 theAEEventID,
                                 handler__proc__, (SRefCon)handler,
                                 0);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    Py_INCREF(handler); /* XXX leak, but needed */
    return _res;
}

static PyObject *AE_AERemoveEventHandler(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    AEEventClass theAEEventClass;
    AEEventID theAEEventID;
#ifndef AERemoveEventHandler
    PyMac_PRECHECK(AERemoveEventHandler);
#endif
    if (!PyArg_ParseTuple(_args, "O&O&",
                          PyMac_GetOSType, &theAEEventClass,
                          PyMac_GetOSType, &theAEEventID))
        return NULL;
    _err = AERemoveEventHandler(theAEEventClass,
                                theAEEventID,
                                upp_GenericEventHandler,
                                0);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *AE_AEGetEventHandler(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    AEEventClass theAEEventClass;
    AEEventID theAEEventID;
    AEEventHandlerUPP handler__proc__ = upp_GenericEventHandler;
    PyObject *handler;
#ifndef AEGetEventHandler
    PyMac_PRECHECK(AEGetEventHandler);
#endif
    if (!PyArg_ParseTuple(_args, "O&O&",
                          PyMac_GetOSType, &theAEEventClass,
                          PyMac_GetOSType, &theAEEventID))
        return NULL;
    _err = AEGetEventHandler(theAEEventClass,
                             theAEEventID,
                             &handler__proc__, (SRefCon *)&handler,
                             0);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("O",
                         handler);
    Py_INCREF(handler); /* XXX leak, but needed */
    return _res;
}

static PyObject *AE_AEInstallSpecialHandler(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    AEKeyword functionClass;
#ifndef AEInstallSpecialHandler
    PyMac_PRECHECK(AEInstallSpecialHandler);
#endif
    if (!PyArg_ParseTuple(_args, "O&",
                          PyMac_GetOSType, &functionClass))
        return NULL;
    _err = AEInstallSpecialHandler(functionClass,
                                   upp_GenericEventHandler,
                                   0);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *AE_AERemoveSpecialHandler(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    AEKeyword functionClass;
#ifndef AERemoveSpecialHandler
    PyMac_PRECHECK(AERemoveSpecialHandler);
#endif
    if (!PyArg_ParseTuple(_args, "O&",
                          PyMac_GetOSType, &functionClass))
        return NULL;
    _err = AERemoveSpecialHandler(functionClass,
                                  upp_GenericEventHandler,
                                  0);
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *AE_AEManagerInfo(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    AEKeyword keyWord;
    long result;
#ifndef AEManagerInfo
    PyMac_PRECHECK(AEManagerInfo);
#endif
    if (!PyArg_ParseTuple(_args, "O&",
                          PyMac_GetOSType, &keyWord))
        return NULL;
    _err = AEManagerInfo(keyWord,
                         &result);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("l",
                         result);
    return _res;
}

static PyObject *AE_AEObjectInit(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
#ifndef AEObjectInit
    PyMac_PRECHECK(AEObjectInit);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _err = AEObjectInit();
    if (_err != noErr) return PyMac_Error(_err);
    Py_INCREF(Py_None);
    _res = Py_None;
    return _res;
}

static PyObject *AE_AEDisposeToken(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    AEDesc theToken;
#ifndef AEDisposeToken
    PyMac_PRECHECK(AEDisposeToken);
#endif
    if (!PyArg_ParseTuple(_args, ""))
        return NULL;
    _err = AEDisposeToken(&theToken);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("O&",
                         AEDesc_New, &theToken);
    return _res;
}

static PyObject *AE_AECallObjectAccessor(PyObject *_self, PyObject *_args)
{
    PyObject *_res = NULL;
    OSErr _err;
    DescType desiredClass;
    AEDesc containerToken;
    DescType containerClass;
    DescType keyForm;
    AEDesc keyData;
    AEDesc token;
#ifndef AECallObjectAccessor
    PyMac_PRECHECK(AECallObjectAccessor);
#endif
    if (!PyArg_ParseTuple(_args, "O&O&O&O&O&",
                          PyMac_GetOSType, &desiredClass,
                          AEDesc_Convert, &containerToken,
                          PyMac_GetOSType, &containerClass,
                          PyMac_GetOSType, &keyForm,
                          AEDesc_Convert, &keyData))
        return NULL;
    _err = AECallObjectAccessor(desiredClass,
                                &containerToken,
                                containerClass,
                                keyForm,
                                &keyData,
                                &token);
    if (_err != noErr) return PyMac_Error(_err);
    _res = Py_BuildValue("O&",
                         AEDesc_New, &token);
    return _res;
}

static PyMethodDef AE_methods[] = {
    {"AECoercePtr", (PyCFunction)AE_AECoercePtr, 1,
     PyDoc_STR("(DescType typeCode, Buffer dataPtr, DescType toType) -> (AEDesc result)")},
    {"AECreateDesc", (PyCFunction)AE_AECreateDesc, 1,
     PyDoc_STR("(DescType typeCode, Buffer dataPtr) -> (AEDesc result)")},
    {"AECreateList", (PyCFunction)AE_AECreateList, 1,
     PyDoc_STR("(Buffer factoringPtr, Boolean isRecord) -> (AEDescList resultList)")},
    {"AECreateAppleEvent", (PyCFunction)AE_AECreateAppleEvent, 1,
     PyDoc_STR("(AEEventClass theAEEventClass, AEEventID theAEEventID, AEAddressDesc target, AEReturnID returnID, AETransactionID transactionID) -> (AppleEvent result)")},
    {"AEReplaceDescData", (PyCFunction)AE_AEReplaceDescData, 1,
     PyDoc_STR("(DescType typeCode, Buffer dataPtr) -> (AEDesc theAEDesc)")},
    {"AEProcessAppleEvent", (PyCFunction)AE_AEProcessAppleEvent, 1,
     PyDoc_STR("(EventRecord theEventRecord) -> None")},
    {"AEGetInteractionAllowed", (PyCFunction)AE_AEGetInteractionAllowed, 1,
     PyDoc_STR("() -> (AEInteractAllowed level)")},
    {"AESetInteractionAllowed", (PyCFunction)AE_AESetInteractionAllowed, 1,
     PyDoc_STR("(AEInteractAllowed level) -> None")},
    {"AEInteractWithUser", (PyCFunction)AE_AEInteractWithUser, 1,
     PyDoc_STR("(long timeOutInTicks) -> None")},
    {"AEInstallEventHandler", (PyCFunction)AE_AEInstallEventHandler, 1,
     PyDoc_STR("(AEEventClass theAEEventClass, AEEventID theAEEventID, EventHandler handler) -> None")},
    {"AERemoveEventHandler", (PyCFunction)AE_AERemoveEventHandler, 1,
     PyDoc_STR("(AEEventClass theAEEventClass, AEEventID theAEEventID) -> None")},
    {"AEGetEventHandler", (PyCFunction)AE_AEGetEventHandler, 1,
     PyDoc_STR("(AEEventClass theAEEventClass, AEEventID theAEEventID) -> (EventHandler handler)")},
    {"AEInstallSpecialHandler", (PyCFunction)AE_AEInstallSpecialHandler, 1,
     PyDoc_STR("(AEKeyword functionClass) -> None")},
    {"AERemoveSpecialHandler", (PyCFunction)AE_AERemoveSpecialHandler, 1,
     PyDoc_STR("(AEKeyword functionClass) -> None")},
    {"AEManagerInfo", (PyCFunction)AE_AEManagerInfo, 1,
     PyDoc_STR("(AEKeyword keyWord) -> (long result)")},
    {"AEObjectInit", (PyCFunction)AE_AEObjectInit, 1,
     PyDoc_STR("() -> None")},
    {"AEDisposeToken", (PyCFunction)AE_AEDisposeToken, 1,
     PyDoc_STR("() -> (AEDesc theToken)")},
    {"AECallObjectAccessor", (PyCFunction)AE_AECallObjectAccessor, 1,
     PyDoc_STR("(DescType desiredClass, AEDesc containerToken, DescType containerClass, DescType keyForm, AEDesc keyData) -> (AEDesc token)")},
    {NULL, NULL, 0}
};



static pascal OSErr
GenericEventHandler(const AppleEvent *request, AppleEvent *reply, refcontype refcon)
{
    PyObject *handler = (PyObject *)refcon;
    AEDescObject *requestObject, *replyObject;
    PyObject *args, *res;
    if ((requestObject = (AEDescObject *)AEDesc_New((AppleEvent *)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) {
        PySys_WriteStderr("Exception in AE event handler function\n");
        PyErr_Print();
        return -1;
    }
    Py_DECREF(res);
    return noErr;
}

PyObject *AEDesc_NewBorrowed(AEDesc *itself)
{
    PyObject *it;

    it = AEDesc_New(itself);
    if (it)
        ((AEDescObject *)it)->ob_owned = 0;
    return (PyObject *)it;
}



void init_AE(void)
{
    PyObject *m;
    PyObject *d;

    upp_AEIdleProc = NewAEIdleUPP(AEIdleProc);
    upp_GenericEventHandler = NewAEEventHandlerUPP(GenericEventHandler);
    PyMac_INIT_TOOLBOX_OBJECT_NEW(AEDesc *, AEDesc_New);
    PyMac_INIT_TOOLBOX_OBJECT_NEW(AEDesc *, AEDesc_NewBorrowed);
    PyMac_INIT_TOOLBOX_OBJECT_CONVERT(AEDesc, AEDesc_Convert);

    m = Py_InitModule("_AE", AE_methods);
    d = PyModule_GetDict(m);
    AE_Error = PyMac_GetOSErrException();
    if (AE_Error == NULL ||
        PyDict_SetItemString(d, "Error", AE_Error) != 0)
        return;
    AEDesc_Type.ob_type = &PyType_Type;
    if (PyType_Ready(&AEDesc_Type) < 0) return;
    Py_INCREF(&AEDesc_Type);
    PyModule_AddObject(m, "AEDesc", (PyObject *)&AEDesc_Type);
    /* Backward-compatible name */
    Py_INCREF(&AEDesc_Type);
    PyModule_AddObject(m, "AEDescType", (PyObject *)&AEDesc_Type);
}

/* ========================= End module _AE ========================= */