Home | History | Annotate | Download | only in ae
      1 
      2 /* =========================== Module _AE =========================== */
      3 
      4 #include "Python.h"
      5 
      6 
      7 
      8 #include "pymactoolbox.h"
      9 
     10 #ifndef HAVE_OSX105_SDK
     11 typedef SInt32 SRefCon;
     12 #endif
     13 
     14 /* Macro to test whether a weak-loaded CFM function exists */
     15 #define PyMac_PRECHECK(rtn) do { if ( &rtn == NULL )  {\
     16     PyErr_SetString(PyExc_NotImplementedError, \
     17     "Not available in this shared library/OS version"); \
     18     return NULL; \
     19     }} while(0)
     20 
     21 
     22 #include <Carbon/Carbon.h>
     23 
     24 #ifdef USE_TOOLBOX_OBJECT_GLUE
     25 extern PyObject *_AEDesc_New(AEDesc *);
     26 extern int _AEDesc_Convert(PyObject *, AEDesc *);
     27 
     28 #define AEDesc_New _AEDesc_New
     29 #define AEDesc_NewBorrowed _AEDesc_NewBorrowed
     30 #define AEDesc_Convert _AEDesc_Convert
     31 #endif
     32 
     33 typedef long refcontype;
     34 
     35 static pascal OSErr GenericEventHandler(const AppleEvent *request, AppleEvent *reply, refcontype refcon); /* Forward */
     36 
     37 AEEventHandlerUPP upp_GenericEventHandler;
     38 
     39 static pascal Boolean AEIdleProc(EventRecord *theEvent, long *sleepTime, RgnHandle *mouseRgn)
     40 {
     41     if ( PyOS_InterruptOccurred() )
     42         return 1;
     43     return 0;
     44 }
     45 
     46 AEIdleUPP upp_AEIdleProc;
     47 
     48 static PyObject *AE_Error;
     49 
     50 /* ----------------------- Object type AEDesc ----------------------- */
     51 
     52 PyTypeObject AEDesc_Type;
     53 
     54 #define AEDesc_Check(x) ((x)->ob_type == &AEDesc_Type || PyObject_TypeCheck((x), &AEDesc_Type))
     55 
     56 typedef struct AEDescObject {
     57     PyObject_HEAD
     58     AEDesc ob_itself;
     59     int ob_owned;
     60 } AEDescObject;
     61 
     62 PyObject *AEDesc_New(AEDesc *itself)
     63 {
     64     AEDescObject *it;
     65     it = PyObject_NEW(AEDescObject, &AEDesc_Type);
     66     if (it == NULL) return NULL;
     67     it->ob_itself = *itself;
     68     it->ob_owned = 1;
     69     return (PyObject *)it;
     70 }
     71 
     72 int AEDesc_Convert(PyObject *v, AEDesc *p_itself)
     73 {
     74     if (!AEDesc_Check(v))
     75     {
     76         PyErr_SetString(PyExc_TypeError, "AEDesc required");
     77         return 0;
     78     }
     79     *p_itself = ((AEDescObject *)v)->ob_itself;
     80     return 1;
     81 }
     82 
     83 static void AEDesc_dealloc(AEDescObject *self)
     84 {
     85     if (self->ob_owned) AEDisposeDesc(&self->ob_itself);
     86     self->ob_type->tp_free((PyObject *)self);
     87 }
     88 
     89 static PyObject *AEDesc_AECoerceDesc(AEDescObject *_self, PyObject *_args)
     90 {
     91     PyObject *_res = NULL;
     92     OSErr _err;
     93     DescType toType;
     94     AEDesc result;
     95 #ifndef AECoerceDesc
     96     PyMac_PRECHECK(AECoerceDesc);
     97 #endif
     98     if (!PyArg_ParseTuple(_args, "O&",
     99                           PyMac_GetOSType, &toType))
    100         return NULL;
    101     _err = AECoerceDesc(&_self->ob_itself,
    102                         toType,
    103                         &result);
    104     if (_err != noErr) return PyMac_Error(_err);
    105     _res = Py_BuildValue("O&",
    106                          AEDesc_New, &result);
    107     return _res;
    108 }
    109 
    110 static PyObject *AEDesc_AEDuplicateDesc(AEDescObject *_self, PyObject *_args)
    111 {
    112     PyObject *_res = NULL;
    113     OSErr _err;
    114     AEDesc result;
    115 #ifndef AEDuplicateDesc
    116     PyMac_PRECHECK(AEDuplicateDesc);
    117 #endif
    118     if (!PyArg_ParseTuple(_args, ""))
    119         return NULL;
    120     _err = AEDuplicateDesc(&_self->ob_itself,
    121                            &result);
    122     if (_err != noErr) return PyMac_Error(_err);
    123     _res = Py_BuildValue("O&",
    124                          AEDesc_New, &result);
    125     return _res;
    126 }
    127 
    128 static PyObject *AEDesc_AECountItems(AEDescObject *_self, PyObject *_args)
    129 {
    130     PyObject *_res = NULL;
    131     OSErr _err;
    132     long theCount;
    133 #ifndef AECountItems
    134     PyMac_PRECHECK(AECountItems);
    135 #endif
    136     if (!PyArg_ParseTuple(_args, ""))
    137         return NULL;
    138     _err = AECountItems(&_self->ob_itself,
    139                         &theCount);
    140     if (_err != noErr) return PyMac_Error(_err);
    141     _res = Py_BuildValue("l",
    142                          theCount);
    143     return _res;
    144 }
    145 
    146 static PyObject *AEDesc_AEPutPtr(AEDescObject *_self, PyObject *_args)
    147 {
    148     PyObject *_res = NULL;
    149     OSErr _err;
    150     long index;
    151     DescType typeCode;
    152     char *dataPtr__in__;
    153     long dataPtr__len__;
    154     int dataPtr__in_len__;
    155 #ifndef AEPutPtr
    156     PyMac_PRECHECK(AEPutPtr);
    157 #endif
    158     if (!PyArg_ParseTuple(_args, "lO&s#",
    159                           &index,
    160                           PyMac_GetOSType, &typeCode,
    161                           &dataPtr__in__, &dataPtr__in_len__))
    162         return NULL;
    163     dataPtr__len__ = dataPtr__in_len__;
    164     _err = AEPutPtr(&_self->ob_itself,
    165                     index,
    166                     typeCode,
    167                     dataPtr__in__, dataPtr__len__);
    168     if (_err != noErr) return PyMac_Error(_err);
    169     Py_INCREF(Py_None);
    170     _res = Py_None;
    171     return _res;
    172 }
    173 
    174 static PyObject *AEDesc_AEPutDesc(AEDescObject *_self, PyObject *_args)
    175 {
    176     PyObject *_res = NULL;
    177     OSErr _err;
    178     long index;
    179     AEDesc theAEDesc;
    180 #ifndef AEPutDesc
    181     PyMac_PRECHECK(AEPutDesc);
    182 #endif
    183     if (!PyArg_ParseTuple(_args, "lO&",
    184                           &index,
    185                           AEDesc_Convert, &theAEDesc))
    186         return NULL;
    187     _err = AEPutDesc(&_self->ob_itself,
    188                      index,
    189                      &theAEDesc);
    190     if (_err != noErr) return PyMac_Error(_err);
    191     Py_INCREF(Py_None);
    192     _res = Py_None;
    193     return _res;
    194 }
    195 
    196 static PyObject *AEDesc_AEGetNthPtr(AEDescObject *_self, PyObject *_args)
    197 {
    198     PyObject *_res = NULL;
    199     OSErr _err;
    200     long index;
    201     DescType desiredType;
    202     AEKeyword theAEKeyword;
    203     DescType typeCode;
    204     char *dataPtr__out__;
    205     long dataPtr__len__;
    206     int dataPtr__in_len__;
    207 #ifndef AEGetNthPtr
    208     PyMac_PRECHECK(AEGetNthPtr);
    209 #endif
    210     if (!PyArg_ParseTuple(_args, "lO&i",
    211                           &index,
    212                           PyMac_GetOSType, &desiredType,
    213                           &dataPtr__in_len__))
    214         return NULL;
    215     if ((dataPtr__out__ = malloc(dataPtr__in_len__)) == NULL)
    216     {
    217         PyErr_NoMemory();
    218         goto dataPtr__error__;
    219     }
    220     dataPtr__len__ = dataPtr__in_len__;
    221     _err = AEGetNthPtr(&_self->ob_itself,
    222                        index,
    223                        desiredType,
    224                        &theAEKeyword,
    225                        &typeCode,
    226                        dataPtr__out__, dataPtr__len__, &dataPtr__len__);
    227     if (_err != noErr) return PyMac_Error(_err);
    228     _res = Py_BuildValue("O&O&s#",
    229                          PyMac_BuildOSType, theAEKeyword,
    230                          PyMac_BuildOSType, typeCode,
    231                          dataPtr__out__, (int)dataPtr__len__);
    232     free(dataPtr__out__);
    233  dataPtr__error__: ;
    234     return _res;
    235 }
    236 
    237 static PyObject *AEDesc_AEGetNthDesc(AEDescObject *_self, PyObject *_args)
    238 {
    239     PyObject *_res = NULL;
    240     OSErr _err;
    241     long index;
    242     DescType desiredType;
    243     AEKeyword theAEKeyword;
    244     AEDesc result;
    245 #ifndef AEGetNthDesc
    246     PyMac_PRECHECK(AEGetNthDesc);
    247 #endif
    248     if (!PyArg_ParseTuple(_args, "lO&",
    249                           &index,
    250                           PyMac_GetOSType, &desiredType))
    251         return NULL;
    252     _err = AEGetNthDesc(&_self->ob_itself,
    253                         index,
    254                         desiredType,
    255                         &theAEKeyword,
    256                         &result);
    257     if (_err != noErr) return PyMac_Error(_err);
    258     _res = Py_BuildValue("O&O&",
    259                          PyMac_BuildOSType, theAEKeyword,
    260                          AEDesc_New, &result);
    261     return _res;
    262 }
    263 
    264 static PyObject *AEDesc_AESizeOfNthItem(AEDescObject *_self, PyObject *_args)
    265 {
    266     PyObject *_res = NULL;
    267     OSErr _err;
    268     long index;
    269     DescType typeCode;
    270     Size dataSize;
    271 #ifndef AESizeOfNthItem
    272     PyMac_PRECHECK(AESizeOfNthItem);
    273 #endif
    274     if (!PyArg_ParseTuple(_args, "l",
    275                           &index))
    276         return NULL;
    277     _err = AESizeOfNthItem(&_self->ob_itself,
    278                            index,
    279                            &typeCode,
    280                            &dataSize);
    281     if (_err != noErr) return PyMac_Error(_err);
    282     _res = Py_BuildValue("O&l",
    283                          PyMac_BuildOSType, typeCode,
    284                          dataSize);
    285     return _res;
    286 }
    287 
    288 static PyObject *AEDesc_AEDeleteItem(AEDescObject *_self, PyObject *_args)
    289 {
    290     PyObject *_res = NULL;
    291     OSErr _err;
    292     long index;
    293 #ifndef AEDeleteItem
    294     PyMac_PRECHECK(AEDeleteItem);
    295 #endif
    296     if (!PyArg_ParseTuple(_args, "l",
    297                           &index))
    298         return NULL;
    299     _err = AEDeleteItem(&_self->ob_itself,
    300                         index);
    301     if (_err != noErr) return PyMac_Error(_err);
    302     Py_INCREF(Py_None);
    303     _res = Py_None;
    304     return _res;
    305 }
    306 
    307 static PyObject *AEDesc_AEPutParamPtr(AEDescObject *_self, PyObject *_args)
    308 {
    309     PyObject *_res = NULL;
    310     OSErr _err;
    311     AEKeyword theAEKeyword;
    312     DescType typeCode;
    313     char *dataPtr__in__;
    314     long dataPtr__len__;
    315     int dataPtr__in_len__;
    316 #ifndef AEPutParamPtr
    317     PyMac_PRECHECK(AEPutParamPtr);
    318 #endif
    319     if (!PyArg_ParseTuple(_args, "O&O&s#",
    320                           PyMac_GetOSType, &theAEKeyword,
    321                           PyMac_GetOSType, &typeCode,
    322                           &dataPtr__in__, &dataPtr__in_len__))
    323         return NULL;
    324     dataPtr__len__ = dataPtr__in_len__;
    325     _err = AEPutParamPtr(&_self->ob_itself,
    326                          theAEKeyword,
    327                          typeCode,
    328                          dataPtr__in__, dataPtr__len__);
    329     if (_err != noErr) return PyMac_Error(_err);
    330     Py_INCREF(Py_None);
    331     _res = Py_None;
    332     return _res;
    333 }
    334 
    335 static PyObject *AEDesc_AEPutParamDesc(AEDescObject *_self, PyObject *_args)
    336 {
    337     PyObject *_res = NULL;
    338     OSErr _err;
    339     AEKeyword theAEKeyword;
    340     AEDesc theAEDesc;
    341 #ifndef AEPutParamDesc
    342     PyMac_PRECHECK(AEPutParamDesc);
    343 #endif
    344     if (!PyArg_ParseTuple(_args, "O&O&",
    345                           PyMac_GetOSType, &theAEKeyword,
    346                           AEDesc_Convert, &theAEDesc))
    347         return NULL;
    348     _err = AEPutParamDesc(&_self->ob_itself,
    349                           theAEKeyword,
    350                           &theAEDesc);
    351     if (_err != noErr) return PyMac_Error(_err);
    352     Py_INCREF(Py_None);
    353     _res = Py_None;
    354     return _res;
    355 }
    356 
    357 static PyObject *AEDesc_AEGetParamPtr(AEDescObject *_self, PyObject *_args)
    358 {
    359     PyObject *_res = NULL;
    360     OSErr _err;
    361     AEKeyword theAEKeyword;
    362     DescType desiredType;
    363     DescType typeCode;
    364     char *dataPtr__out__;
    365     long dataPtr__len__;
    366     int dataPtr__in_len__;
    367 #ifndef AEGetParamPtr
    368     PyMac_PRECHECK(AEGetParamPtr);
    369 #endif
    370     if (!PyArg_ParseTuple(_args, "O&O&i",
    371                           PyMac_GetOSType, &theAEKeyword,
    372                           PyMac_GetOSType, &desiredType,
    373                           &dataPtr__in_len__))
    374         return NULL;
    375     if ((dataPtr__out__ = malloc(dataPtr__in_len__)) == NULL)
    376     {
    377         PyErr_NoMemory();
    378         goto dataPtr__error__;
    379     }
    380     dataPtr__len__ = dataPtr__in_len__;
    381     _err = AEGetParamPtr(&_self->ob_itself,
    382                          theAEKeyword,
    383                          desiredType,
    384                          &typeCode,
    385                          dataPtr__out__, dataPtr__len__, &dataPtr__len__);
    386     if (_err != noErr) return PyMac_Error(_err);
    387     _res = Py_BuildValue("O&s#",
    388                          PyMac_BuildOSType, typeCode,
    389                          dataPtr__out__, (int)dataPtr__len__);
    390     free(dataPtr__out__);
    391  dataPtr__error__: ;
    392     return _res;
    393 }
    394 
    395 static PyObject *AEDesc_AEGetParamDesc(AEDescObject *_self, PyObject *_args)
    396 {
    397     PyObject *_res = NULL;
    398     OSErr _err;
    399     AEKeyword theAEKeyword;
    400     DescType desiredType;
    401     AEDesc result;
    402 #ifndef AEGetParamDesc
    403     PyMac_PRECHECK(AEGetParamDesc);
    404 #endif
    405     if (!PyArg_ParseTuple(_args, "O&O&",
    406                           PyMac_GetOSType, &theAEKeyword,
    407                           PyMac_GetOSType, &desiredType))
    408         return NULL;
    409     _err = AEGetParamDesc(&_self->ob_itself,
    410                           theAEKeyword,
    411                           desiredType,
    412                           &result);
    413     if (_err != noErr) return PyMac_Error(_err);
    414     _res = Py_BuildValue("O&",
    415                          AEDesc_New, &result);
    416     return _res;
    417 }
    418 
    419 static PyObject *AEDesc_AESizeOfParam(AEDescObject *_self, PyObject *_args)
    420 {
    421     PyObject *_res = NULL;
    422     OSErr _err;
    423     AEKeyword theAEKeyword;
    424     DescType typeCode;
    425     Size dataSize;
    426 #ifndef AESizeOfParam
    427     PyMac_PRECHECK(AESizeOfParam);
    428 #endif
    429     if (!PyArg_ParseTuple(_args, "O&",
    430                           PyMac_GetOSType, &theAEKeyword))
    431         return NULL;
    432     _err = AESizeOfParam(&_self->ob_itself,
    433                          theAEKeyword,
    434                          &typeCode,
    435                          &dataSize);
    436     if (_err != noErr) return PyMac_Error(_err);
    437     _res = Py_BuildValue("O&l",
    438                          PyMac_BuildOSType, typeCode,
    439                          dataSize);
    440     return _res;
    441 }
    442 
    443 static PyObject *AEDesc_AEDeleteParam(AEDescObject *_self, PyObject *_args)
    444 {
    445     PyObject *_res = NULL;
    446     OSErr _err;
    447     AEKeyword theAEKeyword;
    448 #ifndef AEDeleteParam
    449     PyMac_PRECHECK(AEDeleteParam);
    450 #endif
    451     if (!PyArg_ParseTuple(_args, "O&",
    452                           PyMac_GetOSType, &theAEKeyword))
    453         return NULL;
    454     _err = AEDeleteParam(&_self->ob_itself,
    455                          theAEKeyword);
    456     if (_err != noErr) return PyMac_Error(_err);
    457     Py_INCREF(Py_None);
    458     _res = Py_None;
    459     return _res;
    460 }
    461 
    462 static PyObject *AEDesc_AEGetAttributePtr(AEDescObject *_self, PyObject *_args)
    463 {
    464     PyObject *_res = NULL;
    465     OSErr _err;
    466     AEKeyword theAEKeyword;
    467     DescType desiredType;
    468     DescType typeCode;
    469     char *dataPtr__out__;
    470     long dataPtr__len__;
    471     int dataPtr__in_len__;
    472 #ifndef AEGetAttributePtr
    473     PyMac_PRECHECK(AEGetAttributePtr);
    474 #endif
    475     if (!PyArg_ParseTuple(_args, "O&O&i",
    476                           PyMac_GetOSType, &theAEKeyword,
    477                           PyMac_GetOSType, &desiredType,
    478                           &dataPtr__in_len__))
    479         return NULL;
    480     if ((dataPtr__out__ = malloc(dataPtr__in_len__)) == NULL)
    481     {
    482         PyErr_NoMemory();
    483         goto dataPtr__error__;
    484     }
    485     dataPtr__len__ = dataPtr__in_len__;
    486     _err = AEGetAttributePtr(&_self->ob_itself,
    487                              theAEKeyword,
    488                              desiredType,
    489                              &typeCode,
    490                              dataPtr__out__, dataPtr__len__, &dataPtr__len__);
    491     if (_err != noErr) return PyMac_Error(_err);
    492     _res = Py_BuildValue("O&s#",
    493                          PyMac_BuildOSType, typeCode,
    494                          dataPtr__out__, (int)dataPtr__len__);
    495     free(dataPtr__out__);
    496  dataPtr__error__: ;
    497     return _res;
    498 }
    499 
    500 static PyObject *AEDesc_AEGetAttributeDesc(AEDescObject *_self, PyObject *_args)
    501 {
    502     PyObject *_res = NULL;
    503     OSErr _err;
    504     AEKeyword theAEKeyword;
    505     DescType desiredType;
    506     AEDesc result;
    507 #ifndef AEGetAttributeDesc
    508     PyMac_PRECHECK(AEGetAttributeDesc);
    509 #endif
    510     if (!PyArg_ParseTuple(_args, "O&O&",
    511                           PyMac_GetOSType, &theAEKeyword,
    512                           PyMac_GetOSType, &desiredType))
    513         return NULL;
    514     _err = AEGetAttributeDesc(&_self->ob_itself,
    515                               theAEKeyword,
    516                               desiredType,
    517                               &result);
    518     if (_err != noErr) return PyMac_Error(_err);
    519     _res = Py_BuildValue("O&",
    520                          AEDesc_New, &result);
    521     return _res;
    522 }
    523 
    524 static PyObject *AEDesc_AESizeOfAttribute(AEDescObject *_self, PyObject *_args)
    525 {
    526     PyObject *_res = NULL;
    527     OSErr _err;
    528     AEKeyword theAEKeyword;
    529     DescType typeCode;
    530     Size dataSize;
    531 #ifndef AESizeOfAttribute
    532     PyMac_PRECHECK(AESizeOfAttribute);
    533 #endif
    534     if (!PyArg_ParseTuple(_args, "O&",
    535                           PyMac_GetOSType, &theAEKeyword))
    536         return NULL;
    537     _err = AESizeOfAttribute(&_self->ob_itself,
    538                              theAEKeyword,
    539                              &typeCode,
    540                              &dataSize);
    541     if (_err != noErr) return PyMac_Error(_err);
    542     _res = Py_BuildValue("O&l",
    543                          PyMac_BuildOSType, typeCode,
    544                          dataSize);
    545     return _res;
    546 }
    547 
    548 static PyObject *AEDesc_AEPutAttributePtr(AEDescObject *_self, PyObject *_args)
    549 {
    550     PyObject *_res = NULL;
    551     OSErr _err;
    552     AEKeyword theAEKeyword;
    553     DescType typeCode;
    554     char *dataPtr__in__;
    555     long dataPtr__len__;
    556     int dataPtr__in_len__;
    557 #ifndef AEPutAttributePtr
    558     PyMac_PRECHECK(AEPutAttributePtr);
    559 #endif
    560     if (!PyArg_ParseTuple(_args, "O&O&s#",
    561                           PyMac_GetOSType, &theAEKeyword,
    562                           PyMac_GetOSType, &typeCode,
    563                           &dataPtr__in__, &dataPtr__in_len__))
    564         return NULL;
    565     dataPtr__len__ = dataPtr__in_len__;
    566     _err = AEPutAttributePtr(&_self->ob_itself,
    567                              theAEKeyword,
    568                              typeCode,
    569                              dataPtr__in__, dataPtr__len__);
    570     if (_err != noErr) return PyMac_Error(_err);
    571     Py_INCREF(Py_None);
    572     _res = Py_None;
    573     return _res;
    574 }
    575 
    576 static PyObject *AEDesc_AEPutAttributeDesc(AEDescObject *_self, PyObject *_args)
    577 {
    578     PyObject *_res = NULL;
    579     OSErr _err;
    580     AEKeyword theAEKeyword;
    581     AEDesc theAEDesc;
    582 #ifndef AEPutAttributeDesc
    583     PyMac_PRECHECK(AEPutAttributeDesc);
    584 #endif
    585     if (!PyArg_ParseTuple(_args, "O&O&",
    586                           PyMac_GetOSType, &theAEKeyword,
    587                           AEDesc_Convert, &theAEDesc))
    588         return NULL;
    589     _err = AEPutAttributeDesc(&_self->ob_itself,
    590                               theAEKeyword,
    591                               &theAEDesc);
    592     if (_err != noErr) return PyMac_Error(_err);
    593     Py_INCREF(Py_None);
    594     _res = Py_None;
    595     return _res;
    596 }
    597 
    598 static PyObject *AEDesc_AEGetDescDataSize(AEDescObject *_self, PyObject *_args)
    599 {
    600     PyObject *_res = NULL;
    601     Size _rv;
    602 #ifndef AEGetDescDataSize
    603     PyMac_PRECHECK(AEGetDescDataSize);
    604 #endif
    605     if (!PyArg_ParseTuple(_args, ""))
    606         return NULL;
    607     _rv = AEGetDescDataSize(&_self->ob_itself);
    608     _res = Py_BuildValue("l",
    609                          _rv);
    610     return _res;
    611 }
    612 
    613 static PyObject *AEDesc_AESend(AEDescObject *_self, PyObject *_args)
    614 {
    615     PyObject *_res = NULL;
    616     OSErr _err;
    617     AppleEvent reply;
    618     AESendMode sendMode;
    619     AESendPriority sendPriority;
    620     long timeOutInTicks;
    621 #ifndef AESend
    622     PyMac_PRECHECK(AESend);
    623 #endif
    624     if (!PyArg_ParseTuple(_args, "lhl",
    625                           &sendMode,
    626                           &sendPriority,
    627                           &timeOutInTicks))
    628         return NULL;
    629     _err = AESend(&_self->ob_itself,
    630                   &reply,
    631                   sendMode,
    632                   sendPriority,
    633                   timeOutInTicks,
    634                   upp_AEIdleProc,
    635                   (AEFilterUPP)0);
    636     if (_err != noErr) return PyMac_Error(_err);
    637     _res = Py_BuildValue("O&",
    638                          AEDesc_New, &reply);
    639     return _res;
    640 }
    641 
    642 static PyObject *AEDesc_AEResetTimer(AEDescObject *_self, PyObject *_args)
    643 {
    644     PyObject *_res = NULL;
    645     OSErr _err;
    646 #ifndef AEResetTimer
    647     PyMac_PRECHECK(AEResetTimer);
    648 #endif
    649     if (!PyArg_ParseTuple(_args, ""))
    650         return NULL;
    651     _err = AEResetTimer(&_self->ob_itself);
    652     if (_err != noErr) return PyMac_Error(_err);
    653     Py_INCREF(Py_None);
    654     _res = Py_None;
    655     return _res;
    656 }
    657 
    658 static PyObject *AEDesc_AESuspendTheCurrentEvent(AEDescObject *_self, PyObject *_args)
    659 {
    660     PyObject *_res = NULL;
    661     OSErr _err;
    662 #ifndef AESuspendTheCurrentEvent
    663     PyMac_PRECHECK(AESuspendTheCurrentEvent);
    664 #endif
    665     if (!PyArg_ParseTuple(_args, ""))
    666         return NULL;
    667     _err = AESuspendTheCurrentEvent(&_self->ob_itself);
    668     if (_err != noErr) return PyMac_Error(_err);
    669     Py_INCREF(Py_None);
    670     _res = Py_None;
    671     return _res;
    672 }
    673 
    674 static PyObject *AEDesc_AEResumeTheCurrentEvent(AEDescObject *_self, PyObject *_args)
    675 {
    676     PyObject *_res = NULL;
    677     OSErr _err;
    678     AppleEvent reply;
    679     AEEventHandlerUPP dispatcher__proc__ = upp_GenericEventHandler;
    680     PyObject *dispatcher;
    681 #ifndef AEResumeTheCurrentEvent
    682     PyMac_PRECHECK(AEResumeTheCurrentEvent);
    683 #endif
    684     if (!PyArg_ParseTuple(_args, "O&O",
    685                           AEDesc_Convert, &reply,
    686                           &dispatcher))
    687         return NULL;
    688     _err = AEResumeTheCurrentEvent(&_self->ob_itself,
    689                                    &reply,
    690                                    dispatcher__proc__,
    691                                    (SRefCon)dispatcher);
    692     if (_err != noErr) return PyMac_Error(_err);
    693     Py_INCREF(Py_None);
    694     _res = Py_None;
    695     Py_INCREF(dispatcher); /* XXX leak, but needed */
    696     return _res;
    697 }
    698 
    699 static PyObject *AEDesc_AEGetTheCurrentEvent(AEDescObject *_self, PyObject *_args)
    700 {
    701     PyObject *_res = NULL;
    702     OSErr _err;
    703 #ifndef AEGetTheCurrentEvent
    704     PyMac_PRECHECK(AEGetTheCurrentEvent);
    705 #endif
    706     if (!PyArg_ParseTuple(_args, ""))
    707         return NULL;
    708     _err = AEGetTheCurrentEvent(&_self->ob_itself);
    709     if (_err != noErr) return PyMac_Error(_err);
    710     Py_INCREF(Py_None);
    711     _res = Py_None;
    712     return _res;
    713 }
    714 
    715 static PyObject *AEDesc_AESetTheCurrentEvent(AEDescObject *_self, PyObject *_args)
    716 {
    717     PyObject *_res = NULL;
    718     OSErr _err;
    719 #ifndef AESetTheCurrentEvent
    720     PyMac_PRECHECK(AESetTheCurrentEvent);
    721 #endif
    722     if (!PyArg_ParseTuple(_args, ""))
    723         return NULL;
    724     _err = AESetTheCurrentEvent(&_self->ob_itself);
    725     if (_err != noErr) return PyMac_Error(_err);
    726     Py_INCREF(Py_None);
    727     _res = Py_None;
    728     return _res;
    729 }
    730 
    731 static PyObject *AEDesc_AEResolve(AEDescObject *_self, PyObject *_args)
    732 {
    733     PyObject *_res = NULL;
    734     OSErr _err;
    735     short callbackFlags;
    736     AEDesc theToken;
    737 #ifndef AEResolve
    738     PyMac_PRECHECK(AEResolve);
    739 #endif
    740     if (!PyArg_ParseTuple(_args, "h",
    741                           &callbackFlags))
    742         return NULL;
    743     _err = AEResolve(&_self->ob_itself,
    744                      callbackFlags,
    745                      &theToken);
    746     if (_err != noErr) return PyMac_Error(_err);
    747     _res = Py_BuildValue("O&",
    748                          AEDesc_New, &theToken);
    749     return _res;
    750 }
    751 
    752 static PyObject *AEDesc_AutoDispose(AEDescObject *_self, PyObject *_args)
    753 {
    754     PyObject *_res = NULL;
    755 
    756     int onoff, old;
    757     if (!PyArg_ParseTuple(_args, "i", &onoff))
    758         return NULL;
    759     old = _self->ob_owned;
    760     _self->ob_owned = onoff;
    761     _res = Py_BuildValue("i", old);
    762     return _res;
    763 
    764 }
    765 
    766 static PyMethodDef AEDesc_methods[] = {
    767     {"AECoerceDesc", (PyCFunction)AEDesc_AECoerceDesc, 1,
    768      PyDoc_STR("(DescType toType) -> (AEDesc result)")},
    769     {"AEDuplicateDesc", (PyCFunction)AEDesc_AEDuplicateDesc, 1,
    770      PyDoc_STR("() -> (AEDesc result)")},
    771     {"AECountItems", (PyCFunction)AEDesc_AECountItems, 1,
    772      PyDoc_STR("() -> (long theCount)")},
    773     {"AEPutPtr", (PyCFunction)AEDesc_AEPutPtr, 1,
    774      PyDoc_STR("(long index, DescType typeCode, Buffer dataPtr) -> None")},
    775     {"AEPutDesc", (PyCFunction)AEDesc_AEPutDesc, 1,
    776      PyDoc_STR("(long index, AEDesc theAEDesc) -> None")},
    777     {"AEGetNthPtr", (PyCFunction)AEDesc_AEGetNthPtr, 1,
    778      PyDoc_STR("(long index, DescType desiredType, Buffer dataPtr) -> (AEKeyword theAEKeyword, DescType typeCode, Buffer dataPtr)")},
    779     {"AEGetNthDesc", (PyCFunction)AEDesc_AEGetNthDesc, 1,
    780      PyDoc_STR("(long index, DescType desiredType) -> (AEKeyword theAEKeyword, AEDesc result)")},
    781     {"AESizeOfNthItem", (PyCFunction)AEDesc_AESizeOfNthItem, 1,
    782      PyDoc_STR("(long index) -> (DescType typeCode, Size dataSize)")},
    783     {"AEDeleteItem", (PyCFunction)AEDesc_AEDeleteItem, 1,
    784      PyDoc_STR("(long index) -> None")},
    785     {"AEPutParamPtr", (PyCFunction)AEDesc_AEPutParamPtr, 1,
    786      PyDoc_STR("(AEKeyword theAEKeyword, DescType typeCode, Buffer dataPtr) -> None")},
    787     {"AEPutParamDesc", (PyCFunction)AEDesc_AEPutParamDesc, 1,
    788      PyDoc_STR("(AEKeyword theAEKeyword, AEDesc theAEDesc) -> None")},
    789     {"AEGetParamPtr", (PyCFunction)AEDesc_AEGetParamPtr, 1,
    790      PyDoc_STR("(AEKeyword theAEKeyword, DescType desiredType, Buffer dataPtr) -> (DescType typeCode, Buffer dataPtr)")},
    791     {"AEGetParamDesc", (PyCFunction)AEDesc_AEGetParamDesc, 1,
    792      PyDoc_STR("(AEKeyword theAEKeyword, DescType desiredType) -> (AEDesc result)")},
    793     {"AESizeOfParam", (PyCFunction)AEDesc_AESizeOfParam, 1,
    794      PyDoc_STR("(AEKeyword theAEKeyword) -> (DescType typeCode, Size dataSize)")},
    795     {"AEDeleteParam", (PyCFunction)AEDesc_AEDeleteParam, 1,
    796      PyDoc_STR("(AEKeyword theAEKeyword) -> None")},
    797     {"AEGetAttributePtr", (PyCFunction)AEDesc_AEGetAttributePtr, 1,
    798      PyDoc_STR("(AEKeyword theAEKeyword, DescType desiredType, Buffer dataPtr) -> (DescType typeCode, Buffer dataPtr)")},
    799     {"AEGetAttributeDesc", (PyCFunction)AEDesc_AEGetAttributeDesc, 1,
    800      PyDoc_STR("(AEKeyword theAEKeyword, DescType desiredType) -> (AEDesc result)")},
    801     {"AESizeOfAttribute", (PyCFunction)AEDesc_AESizeOfAttribute, 1,
    802      PyDoc_STR("(AEKeyword theAEKeyword) -> (DescType typeCode, Size dataSize)")},
    803     {"AEPutAttributePtr", (PyCFunction)AEDesc_AEPutAttributePtr, 1,
    804      PyDoc_STR("(AEKeyword theAEKeyword, DescType typeCode, Buffer dataPtr) -> None")},
    805     {"AEPutAttributeDesc", (PyCFunction)AEDesc_AEPutAttributeDesc, 1,
    806      PyDoc_STR("(AEKeyword theAEKeyword, AEDesc theAEDesc) -> None")},
    807     {"AEGetDescDataSize", (PyCFunction)AEDesc_AEGetDescDataSize, 1,
    808      PyDoc_STR("() -> (Size _rv)")},
    809     {"AESend", (PyCFunction)AEDesc_AESend, 1,
    810      PyDoc_STR("(AESendMode sendMode, AESendPriority sendPriority, long timeOutInTicks) -> (AppleEvent reply)")},
    811     {"AEResetTimer", (PyCFunction)AEDesc_AEResetTimer, 1,
    812      PyDoc_STR("() -> None")},
    813     {"AESuspendTheCurrentEvent", (PyCFunction)AEDesc_AESuspendTheCurrentEvent, 1,
    814      PyDoc_STR("() -> None")},
    815     {"AEResumeTheCurrentEvent", (PyCFunction)AEDesc_AEResumeTheCurrentEvent, 1,
    816      PyDoc_STR("(AppleEvent reply, EventHandler dispatcher) -> None")},
    817     {"AEGetTheCurrentEvent", (PyCFunction)AEDesc_AEGetTheCurrentEvent, 1,
    818      PyDoc_STR("() -> None")},
    819     {"AESetTheCurrentEvent", (PyCFunction)AEDesc_AESetTheCurrentEvent, 1,
    820      PyDoc_STR("() -> None")},
    821     {"AEResolve", (PyCFunction)AEDesc_AEResolve, 1,
    822      PyDoc_STR("(short callbackFlags) -> (AEDesc theToken)")},
    823     {"AutoDispose", (PyCFunction)AEDesc_AutoDispose, 1,
    824      PyDoc_STR("(int)->int. Automatically AEDisposeDesc the object on Python object cleanup")},
    825     {NULL, NULL, 0}
    826 };
    827 
    828 static PyObject *AEDesc_get_type(AEDescObject *self, void *closure)
    829 {
    830     return PyMac_BuildOSType(self->ob_itself.descriptorType);
    831 }
    832 
    833 #define AEDesc_set_type NULL
    834 
    835 static PyObject *AEDesc_get_data(AEDescObject *self, void *closure)
    836 {
    837     PyObject *res;
    838     Size size;
    839     char *ptr;
    840     OSErr err;
    841 
    842     size = AEGetDescDataSize(&self->ob_itself);
    843     if ( (res = PyString_FromStringAndSize(NULL, size)) == NULL )
    844         return NULL;
    845     if ( (ptr = PyString_AsString(res)) == NULL )
    846         return NULL;
    847     if ( (err=AEGetDescData(&self->ob_itself, ptr, size)) < 0 )
    848         return PyMac_Error(err);
    849     return res;
    850 }
    851 
    852 #define AEDesc_set_data NULL
    853 
    854 static PyGetSetDef AEDesc_getsetlist[] = {
    855     {"type", (getter)AEDesc_get_type, (setter)AEDesc_set_type, "Type of this AEDesc"},
    856     {"data", (getter)AEDesc_get_data, (setter)AEDesc_set_data, "The raw data in this AEDesc"},
    857     {NULL, NULL, NULL, NULL},
    858 };
    859 
    860 
    861 #define AEDesc_compare NULL
    862 
    863 #define AEDesc_repr NULL
    864 
    865 #define AEDesc_hash NULL
    866 #define AEDesc_tp_init 0
    867 
    868 #define AEDesc_tp_alloc PyType_GenericAlloc
    869 
    870 static PyObject *AEDesc_tp_new(PyTypeObject *type, PyObject *_args, PyObject *_kwds)
    871 {
    872     PyObject *_self;
    873     AEDesc itself;
    874     char *kw[] = {"itself", 0};
    875 
    876     if (!PyArg_ParseTupleAndKeywords(_args, _kwds, "O&", kw, AEDesc_Convert, &itself)) return NULL;
    877     if ((_self = type->tp_alloc(type, 0)) == NULL) return NULL;
    878     ((AEDescObject *)_self)->ob_itself = itself;
    879     return _self;
    880 }
    881 
    882 #define AEDesc_tp_free PyObject_Del
    883 
    884 
    885 PyTypeObject AEDesc_Type = {
    886     PyObject_HEAD_INIT(NULL)
    887     0, /*ob_size*/
    888     "_AE.AEDesc", /*tp_name*/
    889     sizeof(AEDescObject), /*tp_basicsize*/
    890     0, /*tp_itemsize*/
    891     /* methods */
    892     (destructor) AEDesc_dealloc, /*tp_dealloc*/
    893     0, /*tp_print*/
    894     (getattrfunc)0, /*tp_getattr*/
    895     (setattrfunc)0, /*tp_setattr*/
    896     (cmpfunc) AEDesc_compare, /*tp_compare*/
    897     (reprfunc) AEDesc_repr, /*tp_repr*/
    898     (PyNumberMethods *)0, /* tp_as_number */
    899     (PySequenceMethods *)0, /* tp_as_sequence */
    900     (PyMappingMethods *)0, /* tp_as_mapping */
    901     (hashfunc) AEDesc_hash, /*tp_hash*/
    902     0, /*tp_call*/
    903     0, /*tp_str*/
    904     PyObject_GenericGetAttr, /*tp_getattro*/
    905     PyObject_GenericSetAttr, /*tp_setattro */
    906     0, /*tp_as_buffer*/
    907     Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, /* tp_flags */
    908     0, /*tp_doc*/
    909     0, /*tp_traverse*/
    910     0, /*tp_clear*/
    911     0, /*tp_richcompare*/
    912     0, /*tp_weaklistoffset*/
    913     0, /*tp_iter*/
    914     0, /*tp_iternext*/
    915     AEDesc_methods, /* tp_methods */
    916     0, /*tp_members*/
    917     AEDesc_getsetlist, /*tp_getset*/
    918     0, /*tp_base*/
    919     0, /*tp_dict*/
    920     0, /*tp_descr_get*/
    921     0, /*tp_descr_set*/
    922     0, /*tp_dictoffset*/
    923     AEDesc_tp_init, /* tp_init */
    924     AEDesc_tp_alloc, /* tp_alloc */
    925     AEDesc_tp_new, /* tp_new */
    926     AEDesc_tp_free, /* tp_free */
    927 };
    928 
    929 /* --------------------- End object type AEDesc --------------------- */
    930 
    931 
    932 static PyObject *AE_AECoercePtr(PyObject *_self, PyObject *_args)
    933 {
    934     PyObject *_res = NULL;
    935     OSErr _err;
    936     DescType typeCode;
    937     char *dataPtr__in__;
    938     long dataPtr__len__;
    939     int dataPtr__in_len__;
    940     DescType toType;
    941     AEDesc result;
    942 #ifndef AECoercePtr
    943     PyMac_PRECHECK(AECoercePtr);
    944 #endif
    945     if (!PyArg_ParseTuple(_args, "O&s#O&",
    946                           PyMac_GetOSType, &typeCode,
    947                           &dataPtr__in__, &dataPtr__in_len__,
    948                           PyMac_GetOSType, &toType))
    949         return NULL;
    950     dataPtr__len__ = dataPtr__in_len__;
    951     _err = AECoercePtr(typeCode,
    952                        dataPtr__in__, dataPtr__len__,
    953                        toType,
    954                        &result);
    955     if (_err != noErr) return PyMac_Error(_err);
    956     _res = Py_BuildValue("O&",
    957                          AEDesc_New, &result);
    958     return _res;
    959 }
    960 
    961 static PyObject *AE_AECreateDesc(PyObject *_self, PyObject *_args)
    962 {
    963     PyObject *_res = NULL;
    964     OSErr _err;
    965     DescType typeCode;
    966     char *dataPtr__in__;
    967     long dataPtr__len__;
    968     int dataPtr__in_len__;
    969     AEDesc result;
    970 #ifndef AECreateDesc
    971     PyMac_PRECHECK(AECreateDesc);
    972 #endif
    973     if (!PyArg_ParseTuple(_args, "O&s#",
    974                           PyMac_GetOSType, &typeCode,
    975                           &dataPtr__in__, &dataPtr__in_len__))
    976         return NULL;
    977     dataPtr__len__ = dataPtr__in_len__;
    978     _err = AECreateDesc(typeCode,
    979                         dataPtr__in__, dataPtr__len__,
    980                         &result);
    981     if (_err != noErr) return PyMac_Error(_err);
    982     _res = Py_BuildValue("O&",
    983                          AEDesc_New, &result);
    984     return _res;
    985 }
    986 
    987 static PyObject *AE_AECreateList(PyObject *_self, PyObject *_args)
    988 {
    989     PyObject *_res = NULL;
    990     OSErr _err;
    991     char *factoringPtr__in__;
    992     long factoringPtr__len__;
    993     int factoringPtr__in_len__;
    994     Boolean isRecord;
    995     AEDescList resultList;
    996 #ifndef AECreateList
    997     PyMac_PRECHECK(AECreateList);
    998 #endif
    999     if (!PyArg_ParseTuple(_args, "s#b",
   1000                           &factoringPtr__in__, &factoringPtr__in_len__,
   1001                           &isRecord))
   1002         return NULL;
   1003     factoringPtr__len__ = factoringPtr__in_len__;
   1004     _err = AECreateList(factoringPtr__in__, factoringPtr__len__,
   1005                         isRecord,
   1006                         &resultList);
   1007     if (_err != noErr) return PyMac_Error(_err);
   1008     _res = Py_BuildValue("O&",
   1009                          AEDesc_New, &resultList);
   1010     return _res;
   1011 }
   1012 
   1013 static PyObject *AE_AECreateAppleEvent(PyObject *_self, PyObject *_args)
   1014 {
   1015     PyObject *_res = NULL;
   1016     OSErr _err;
   1017     AEEventClass theAEEventClass;
   1018     AEEventID theAEEventID;
   1019     AEAddressDesc target;
   1020     AEReturnID returnID;
   1021     AETransactionID transactionID;
   1022     AppleEvent result;
   1023 #ifndef AECreateAppleEvent
   1024     PyMac_PRECHECK(AECreateAppleEvent);
   1025 #endif
   1026     if (!PyArg_ParseTuple(_args, "O&O&O&hl",
   1027                           PyMac_GetOSType, &theAEEventClass,
   1028                           PyMac_GetOSType, &theAEEventID,
   1029                           AEDesc_Convert, &target,
   1030                           &returnID,
   1031                           &transactionID))
   1032         return NULL;
   1033     _err = AECreateAppleEvent(theAEEventClass,
   1034                               theAEEventID,
   1035                               &target,
   1036                               returnID,
   1037                               transactionID,
   1038                               &result);
   1039     if (_err != noErr) return PyMac_Error(_err);
   1040     _res = Py_BuildValue("O&",
   1041                          AEDesc_New, &result);
   1042     return _res;
   1043 }
   1044 
   1045 static PyObject *AE_AEReplaceDescData(PyObject *_self, PyObject *_args)
   1046 {
   1047     PyObject *_res = NULL;
   1048     OSErr _err;
   1049     DescType typeCode;
   1050     char *dataPtr__in__;
   1051     long dataPtr__len__;
   1052     int dataPtr__in_len__;
   1053     AEDesc theAEDesc;
   1054 #ifndef AEReplaceDescData
   1055     PyMac_PRECHECK(AEReplaceDescData);
   1056 #endif
   1057     if (!PyArg_ParseTuple(_args, "O&s#",
   1058                           PyMac_GetOSType, &typeCode,
   1059                           &dataPtr__in__, &dataPtr__in_len__))
   1060         return NULL;
   1061     dataPtr__len__ = dataPtr__in_len__;
   1062     _err = AEReplaceDescData(typeCode,
   1063                              dataPtr__in__, dataPtr__len__,
   1064                              &theAEDesc);
   1065     if (_err != noErr) return PyMac_Error(_err);
   1066     _res = Py_BuildValue("O&",
   1067                          AEDesc_New, &theAEDesc);
   1068     return _res;
   1069 }
   1070 
   1071 static PyObject *AE_AEProcessAppleEvent(PyObject *_self, PyObject *_args)
   1072 {
   1073     PyObject *_res = NULL;
   1074     OSErr _err;
   1075     EventRecord theEventRecord;
   1076 #ifndef AEProcessAppleEvent
   1077     PyMac_PRECHECK(AEProcessAppleEvent);
   1078 #endif
   1079     if (!PyArg_ParseTuple(_args, "O&",
   1080                           PyMac_GetEventRecord, &theEventRecord))
   1081         return NULL;
   1082     _err = AEProcessAppleEvent(&theEventRecord);
   1083     if (_err != noErr) return PyMac_Error(_err);
   1084     Py_INCREF(Py_None);
   1085     _res = Py_None;
   1086     return _res;
   1087 }
   1088 
   1089 static PyObject *AE_AEGetInteractionAllowed(PyObject *_self, PyObject *_args)
   1090 {
   1091     PyObject *_res = NULL;
   1092     OSErr _err;
   1093     AEInteractAllowed level;
   1094 #ifndef AEGetInteractionAllowed
   1095     PyMac_PRECHECK(AEGetInteractionAllowed);
   1096 #endif
   1097     if (!PyArg_ParseTuple(_args, ""))
   1098         return NULL;
   1099     _err = AEGetInteractionAllowed(&level);
   1100     if (_err != noErr) return PyMac_Error(_err);
   1101     _res = Py_BuildValue("b",
   1102                          level);
   1103     return _res;
   1104 }
   1105 
   1106 static PyObject *AE_AESetInteractionAllowed(PyObject *_self, PyObject *_args)
   1107 {
   1108     PyObject *_res = NULL;
   1109     OSErr _err;
   1110     AEInteractAllowed level;
   1111 #ifndef AESetInteractionAllowed
   1112     PyMac_PRECHECK(AESetInteractionAllowed);
   1113 #endif
   1114     if (!PyArg_ParseTuple(_args, "b",
   1115                           &level))
   1116         return NULL;
   1117     _err = AESetInteractionAllowed(level);
   1118     if (_err != noErr) return PyMac_Error(_err);
   1119     Py_INCREF(Py_None);
   1120     _res = Py_None;
   1121     return _res;
   1122 }
   1123 
   1124 static PyObject *AE_AEInteractWithUser(PyObject *_self, PyObject *_args)
   1125 {
   1126     PyObject *_res = NULL;
   1127     OSErr _err;
   1128     long timeOutInTicks;
   1129 #ifndef AEInteractWithUser
   1130     PyMac_PRECHECK(AEInteractWithUser);
   1131 #endif
   1132     if (!PyArg_ParseTuple(_args, "l",
   1133                           &timeOutInTicks))
   1134         return NULL;
   1135     _err = AEInteractWithUser(timeOutInTicks,
   1136                               (NMRecPtr)0,
   1137                               upp_AEIdleProc);
   1138     if (_err != noErr) return PyMac_Error(_err);
   1139     Py_INCREF(Py_None);
   1140     _res = Py_None;
   1141     return _res;
   1142 }
   1143 
   1144 static PyObject *AE_AEInstallEventHandler(PyObject *_self, PyObject *_args)
   1145 {
   1146     PyObject *_res = NULL;
   1147     OSErr _err;
   1148     AEEventClass theAEEventClass;
   1149     AEEventID theAEEventID;
   1150     AEEventHandlerUPP handler__proc__ = upp_GenericEventHandler;
   1151     PyObject *handler;
   1152 #ifndef AEInstallEventHandler
   1153     PyMac_PRECHECK(AEInstallEventHandler);
   1154 #endif
   1155     if (!PyArg_ParseTuple(_args, "O&O&O",
   1156                           PyMac_GetOSType, &theAEEventClass,
   1157                           PyMac_GetOSType, &theAEEventID,
   1158                           &handler))
   1159         return NULL;
   1160     _err = AEInstallEventHandler(theAEEventClass,
   1161                                  theAEEventID,
   1162                                  handler__proc__, (SRefCon)handler,
   1163                                  0);
   1164     if (_err != noErr) return PyMac_Error(_err);
   1165     Py_INCREF(Py_None);
   1166     _res = Py_None;
   1167     Py_INCREF(handler); /* XXX leak, but needed */
   1168     return _res;
   1169 }
   1170 
   1171 static PyObject *AE_AERemoveEventHandler(PyObject *_self, PyObject *_args)
   1172 {
   1173     PyObject *_res = NULL;
   1174     OSErr _err;
   1175     AEEventClass theAEEventClass;
   1176     AEEventID theAEEventID;
   1177 #ifndef AERemoveEventHandler
   1178     PyMac_PRECHECK(AERemoveEventHandler);
   1179 #endif
   1180     if (!PyArg_ParseTuple(_args, "O&O&",
   1181                           PyMac_GetOSType, &theAEEventClass,
   1182                           PyMac_GetOSType, &theAEEventID))
   1183         return NULL;
   1184     _err = AERemoveEventHandler(theAEEventClass,
   1185                                 theAEEventID,
   1186                                 upp_GenericEventHandler,
   1187                                 0);
   1188     if (_err != noErr) return PyMac_Error(_err);
   1189     Py_INCREF(Py_None);
   1190     _res = Py_None;
   1191     return _res;
   1192 }
   1193 
   1194 static PyObject *AE_AEGetEventHandler(PyObject *_self, PyObject *_args)
   1195 {
   1196     PyObject *_res = NULL;
   1197     OSErr _err;
   1198     AEEventClass theAEEventClass;
   1199     AEEventID theAEEventID;
   1200     AEEventHandlerUPP handler__proc__ = upp_GenericEventHandler;
   1201     PyObject *handler;
   1202 #ifndef AEGetEventHandler
   1203     PyMac_PRECHECK(AEGetEventHandler);
   1204 #endif
   1205     if (!PyArg_ParseTuple(_args, "O&O&",
   1206                           PyMac_GetOSType, &theAEEventClass,
   1207                           PyMac_GetOSType, &theAEEventID))
   1208         return NULL;
   1209     _err = AEGetEventHandler(theAEEventClass,
   1210                              theAEEventID,
   1211                              &handler__proc__, (SRefCon *)&handler,
   1212                              0);
   1213     if (_err != noErr) return PyMac_Error(_err);
   1214     _res = Py_BuildValue("O",
   1215                          handler);
   1216     Py_INCREF(handler); /* XXX leak, but needed */
   1217     return _res;
   1218 }
   1219 
   1220 static PyObject *AE_AEInstallSpecialHandler(PyObject *_self, PyObject *_args)
   1221 {
   1222     PyObject *_res = NULL;
   1223     OSErr _err;
   1224     AEKeyword functionClass;
   1225 #ifndef AEInstallSpecialHandler
   1226     PyMac_PRECHECK(AEInstallSpecialHandler);
   1227 #endif
   1228     if (!PyArg_ParseTuple(_args, "O&",
   1229                           PyMac_GetOSType, &functionClass))
   1230         return NULL;
   1231     _err = AEInstallSpecialHandler(functionClass,
   1232                                    upp_GenericEventHandler,
   1233                                    0);
   1234     if (_err != noErr) return PyMac_Error(_err);
   1235     Py_INCREF(Py_None);
   1236     _res = Py_None;
   1237     return _res;
   1238 }
   1239 
   1240 static PyObject *AE_AERemoveSpecialHandler(PyObject *_self, PyObject *_args)
   1241 {
   1242     PyObject *_res = NULL;
   1243     OSErr _err;
   1244     AEKeyword functionClass;
   1245 #ifndef AERemoveSpecialHandler
   1246     PyMac_PRECHECK(AERemoveSpecialHandler);
   1247 #endif
   1248     if (!PyArg_ParseTuple(_args, "O&",
   1249                           PyMac_GetOSType, &functionClass))
   1250         return NULL;
   1251     _err = AERemoveSpecialHandler(functionClass,
   1252                                   upp_GenericEventHandler,
   1253                                   0);
   1254     if (_err != noErr) return PyMac_Error(_err);
   1255     Py_INCREF(Py_None);
   1256     _res = Py_None;
   1257     return _res;
   1258 }
   1259 
   1260 static PyObject *AE_AEManagerInfo(PyObject *_self, PyObject *_args)
   1261 {
   1262     PyObject *_res = NULL;
   1263     OSErr _err;
   1264     AEKeyword keyWord;
   1265     long result;
   1266 #ifndef AEManagerInfo
   1267     PyMac_PRECHECK(AEManagerInfo);
   1268 #endif
   1269     if (!PyArg_ParseTuple(_args, "O&",
   1270                           PyMac_GetOSType, &keyWord))
   1271         return NULL;
   1272     _err = AEManagerInfo(keyWord,
   1273                          &result);
   1274     if (_err != noErr) return PyMac_Error(_err);
   1275     _res = Py_BuildValue("l",
   1276                          result);
   1277     return _res;
   1278 }
   1279 
   1280 static PyObject *AE_AEObjectInit(PyObject *_self, PyObject *_args)
   1281 {
   1282     PyObject *_res = NULL;
   1283     OSErr _err;
   1284 #ifndef AEObjectInit
   1285     PyMac_PRECHECK(AEObjectInit);
   1286 #endif
   1287     if (!PyArg_ParseTuple(_args, ""))
   1288         return NULL;
   1289     _err = AEObjectInit();
   1290     if (_err != noErr) return PyMac_Error(_err);
   1291     Py_INCREF(Py_None);
   1292     _res = Py_None;
   1293     return _res;
   1294 }
   1295 
   1296 static PyObject *AE_AEDisposeToken(PyObject *_self, PyObject *_args)
   1297 {
   1298     PyObject *_res = NULL;
   1299     OSErr _err;
   1300     AEDesc theToken;
   1301 #ifndef AEDisposeToken
   1302     PyMac_PRECHECK(AEDisposeToken);
   1303 #endif
   1304     if (!PyArg_ParseTuple(_args, ""))
   1305         return NULL;
   1306     _err = AEDisposeToken(&theToken);
   1307     if (_err != noErr) return PyMac_Error(_err);
   1308     _res = Py_BuildValue("O&",
   1309                          AEDesc_New, &theToken);
   1310     return _res;
   1311 }
   1312 
   1313 static PyObject *AE_AECallObjectAccessor(PyObject *_self, PyObject *_args)
   1314 {
   1315     PyObject *_res = NULL;
   1316     OSErr _err;
   1317     DescType desiredClass;
   1318     AEDesc containerToken;
   1319     DescType containerClass;
   1320     DescType keyForm;
   1321     AEDesc keyData;
   1322     AEDesc token;
   1323 #ifndef AECallObjectAccessor
   1324     PyMac_PRECHECK(AECallObjectAccessor);
   1325 #endif
   1326     if (!PyArg_ParseTuple(_args, "O&O&O&O&O&",
   1327                           PyMac_GetOSType, &desiredClass,
   1328                           AEDesc_Convert, &containerToken,
   1329                           PyMac_GetOSType, &containerClass,
   1330                           PyMac_GetOSType, &keyForm,
   1331                           AEDesc_Convert, &keyData))
   1332         return NULL;
   1333     _err = AECallObjectAccessor(desiredClass,
   1334                                 &containerToken,
   1335                                 containerClass,
   1336                                 keyForm,
   1337                                 &keyData,
   1338                                 &token);
   1339     if (_err != noErr) return PyMac_Error(_err);
   1340     _res = Py_BuildValue("O&",
   1341                          AEDesc_New, &token);
   1342     return _res;
   1343 }
   1344 
   1345 static PyMethodDef AE_methods[] = {
   1346     {"AECoercePtr", (PyCFunction)AE_AECoercePtr, 1,
   1347      PyDoc_STR("(DescType typeCode, Buffer dataPtr, DescType toType) -> (AEDesc result)")},
   1348     {"AECreateDesc", (PyCFunction)AE_AECreateDesc, 1,
   1349      PyDoc_STR("(DescType typeCode, Buffer dataPtr) -> (AEDesc result)")},
   1350     {"AECreateList", (PyCFunction)AE_AECreateList, 1,
   1351      PyDoc_STR("(Buffer factoringPtr, Boolean isRecord) -> (AEDescList resultList)")},
   1352     {"AECreateAppleEvent", (PyCFunction)AE_AECreateAppleEvent, 1,
   1353      PyDoc_STR("(AEEventClass theAEEventClass, AEEventID theAEEventID, AEAddressDesc target, AEReturnID returnID, AETransactionID transactionID) -> (AppleEvent result)")},
   1354     {"AEReplaceDescData", (PyCFunction)AE_AEReplaceDescData, 1,
   1355      PyDoc_STR("(DescType typeCode, Buffer dataPtr) -> (AEDesc theAEDesc)")},
   1356     {"AEProcessAppleEvent", (PyCFunction)AE_AEProcessAppleEvent, 1,
   1357      PyDoc_STR("(EventRecord theEventRecord) -> None")},
   1358     {"AEGetInteractionAllowed", (PyCFunction)AE_AEGetInteractionAllowed, 1,
   1359      PyDoc_STR("() -> (AEInteractAllowed level)")},
   1360     {"AESetInteractionAllowed", (PyCFunction)AE_AESetInteractionAllowed, 1,
   1361      PyDoc_STR("(AEInteractAllowed level) -> None")},
   1362     {"AEInteractWithUser", (PyCFunction)AE_AEInteractWithUser, 1,
   1363      PyDoc_STR("(long timeOutInTicks) -> None")},
   1364     {"AEInstallEventHandler", (PyCFunction)AE_AEInstallEventHandler, 1,
   1365      PyDoc_STR("(AEEventClass theAEEventClass, AEEventID theAEEventID, EventHandler handler) -> None")},
   1366     {"AERemoveEventHandler", (PyCFunction)AE_AERemoveEventHandler, 1,
   1367      PyDoc_STR("(AEEventClass theAEEventClass, AEEventID theAEEventID) -> None")},
   1368     {"AEGetEventHandler", (PyCFunction)AE_AEGetEventHandler, 1,
   1369      PyDoc_STR("(AEEventClass theAEEventClass, AEEventID theAEEventID) -> (EventHandler handler)")},
   1370     {"AEInstallSpecialHandler", (PyCFunction)AE_AEInstallSpecialHandler, 1,
   1371      PyDoc_STR("(AEKeyword functionClass) -> None")},
   1372     {"AERemoveSpecialHandler", (PyCFunction)AE_AERemoveSpecialHandler, 1,
   1373      PyDoc_STR("(AEKeyword functionClass) -> None")},
   1374     {"AEManagerInfo", (PyCFunction)AE_AEManagerInfo, 1,
   1375      PyDoc_STR("(AEKeyword keyWord) -> (long result)")},
   1376     {"AEObjectInit", (PyCFunction)AE_AEObjectInit, 1,
   1377      PyDoc_STR("() -> None")},
   1378     {"AEDisposeToken", (PyCFunction)AE_AEDisposeToken, 1,
   1379      PyDoc_STR("() -> (AEDesc theToken)")},
   1380     {"AECallObjectAccessor", (PyCFunction)AE_AECallObjectAccessor, 1,
   1381      PyDoc_STR("(DescType desiredClass, AEDesc containerToken, DescType containerClass, DescType keyForm, AEDesc keyData) -> (AEDesc token)")},
   1382     {NULL, NULL, 0}
   1383 };
   1384 
   1385 
   1386 
   1387 static pascal OSErr
   1388 GenericEventHandler(const AppleEvent *request, AppleEvent *reply, refcontype refcon)
   1389 {
   1390     PyObject *handler = (PyObject *)refcon;
   1391     AEDescObject *requestObject, *replyObject;
   1392     PyObject *args, *res;
   1393     if ((requestObject = (AEDescObject *)AEDesc_New((AppleEvent *)request)) == NULL) {
   1394         return -1;
   1395     }
   1396     if ((replyObject = (AEDescObject *)AEDesc_New(reply)) == NULL) {
   1397         Py_DECREF(requestObject);
   1398         return -1;
   1399     }
   1400     if ((args = Py_BuildValue("OO", requestObject, replyObject)) == NULL) {
   1401         Py_DECREF(requestObject);
   1402         Py_DECREF(replyObject);
   1403         return -1;
   1404     }
   1405     res = PyEval_CallObject(handler, args);
   1406     requestObject->ob_itself.descriptorType = 'null';
   1407     requestObject->ob_itself.dataHandle = NULL;
   1408     replyObject->ob_itself.descriptorType = 'null';
   1409     replyObject->ob_itself.dataHandle = NULL;
   1410     Py_DECREF(args);
   1411     if (res == NULL) {
   1412         PySys_WriteStderr("Exception in AE event handler function\n");
   1413         PyErr_Print();
   1414         return -1;
   1415     }
   1416     Py_DECREF(res);
   1417     return noErr;
   1418 }
   1419 
   1420 PyObject *AEDesc_NewBorrowed(AEDesc *itself)
   1421 {
   1422     PyObject *it;
   1423 
   1424     it = AEDesc_New(itself);
   1425     if (it)
   1426         ((AEDescObject *)it)->ob_owned = 0;
   1427     return (PyObject *)it;
   1428 }
   1429 
   1430 
   1431 
   1432 void init_AE(void)
   1433 {
   1434     PyObject *m;
   1435     PyObject *d;
   1436 
   1437     upp_AEIdleProc = NewAEIdleUPP(AEIdleProc);
   1438     upp_GenericEventHandler = NewAEEventHandlerUPP(GenericEventHandler);
   1439     PyMac_INIT_TOOLBOX_OBJECT_NEW(AEDesc *, AEDesc_New);
   1440     PyMac_INIT_TOOLBOX_OBJECT_NEW(AEDesc *, AEDesc_NewBorrowed);
   1441     PyMac_INIT_TOOLBOX_OBJECT_CONVERT(AEDesc, AEDesc_Convert);
   1442 
   1443     m = Py_InitModule("_AE", AE_methods);
   1444     d = PyModule_GetDict(m);
   1445     AE_Error = PyMac_GetOSErrException();
   1446     if (AE_Error == NULL ||
   1447         PyDict_SetItemString(d, "Error", AE_Error) != 0)
   1448         return;
   1449     AEDesc_Type.ob_type = &PyType_Type;
   1450     if (PyType_Ready(&AEDesc_Type) < 0) return;
   1451     Py_INCREF(&AEDesc_Type);
   1452     PyModule_AddObject(m, "AEDesc", (PyObject *)&AEDesc_Type);
   1453     /* Backward-compatible name */
   1454     Py_INCREF(&AEDesc_Type);
   1455     PyModule_AddObject(m, "AEDescType", (PyObject *)&AEDesc_Type);
   1456 }
   1457 
   1458 /* ========================= End module _AE ========================= */
   1459 
   1460