Home | History | Annotate | Download | only in scrap
      1 
      2 /* ========================= Module _Scrap ========================== */
      3 
      4 #include "Python.h"
      5 
      6 
      7 #ifndef __LP64__
      8 
      9 #include "pymactoolbox.h"
     10 
     11 /* Macro to test whether a weak-loaded CFM function exists */
     12 #define PyMac_PRECHECK(rtn) do { if ( &rtn == NULL )  {\
     13         PyErr_SetString(PyExc_NotImplementedError, \
     14             "Not available in this shared library/OS version"); \
     15         return NULL; \
     16     }} while(0)
     17 
     18 
     19 #include <Carbon/Carbon.h>
     20 
     21 static PyObject *Scrap_Error;
     22 
     23 /* ----------------------- Object type Scrap ------------------------ */
     24 
     25 PyTypeObject Scrap_Type;
     26 
     27 #define ScrapObj_Check(x) ((x)->ob_type == &Scrap_Type || PyObject_TypeCheck((x), &Scrap_Type))
     28 
     29 typedef struct ScrapObject {
     30     PyObject_HEAD
     31     ScrapRef ob_itself;
     32 } ScrapObject;
     33 
     34 PyObject *ScrapObj_New(ScrapRef itself)
     35 {
     36     ScrapObject *it;
     37     it = PyObject_NEW(ScrapObject, &Scrap_Type);
     38     if (it == NULL) return NULL;
     39     it->ob_itself = itself;
     40     return (PyObject *)it;
     41 }
     42 int ScrapObj_Convert(PyObject *v, ScrapRef *p_itself)
     43 {
     44     if (!ScrapObj_Check(v))
     45     {
     46         PyErr_SetString(PyExc_TypeError, "Scrap required");
     47         return 0;
     48     }
     49     *p_itself = ((ScrapObject *)v)->ob_itself;
     50     return 1;
     51 }
     52 
     53 static void ScrapObj_dealloc(ScrapObject *self)
     54 {
     55     /* Cleanup of self->ob_itself goes here */
     56     self->ob_type->tp_free((PyObject *)self);
     57 }
     58 
     59 static PyObject *ScrapObj_GetScrapFlavorFlags(ScrapObject *_self, PyObject *_args)
     60 {
     61     PyObject *_res = NULL;
     62     OSStatus _err;
     63     ScrapFlavorType flavorType;
     64     ScrapFlavorFlags flavorFlags;
     65     if (!PyArg_ParseTuple(_args, "O&",
     66                           PyMac_GetOSType, &flavorType))
     67         return NULL;
     68     _err = GetScrapFlavorFlags(_self->ob_itself,
     69                                flavorType,
     70                                &flavorFlags);
     71     if (_err != noErr) return PyMac_Error(_err);
     72     _res = Py_BuildValue("l",
     73                          flavorFlags);
     74     return _res;
     75 }
     76 
     77 static PyObject *ScrapObj_GetScrapFlavorSize(ScrapObject *_self, PyObject *_args)
     78 {
     79     PyObject *_res = NULL;
     80     OSStatus _err;
     81     ScrapFlavorType flavorType;
     82     Size byteCount;
     83     if (!PyArg_ParseTuple(_args, "O&",
     84                           PyMac_GetOSType, &flavorType))
     85         return NULL;
     86     _err = GetScrapFlavorSize(_self->ob_itself,
     87                               flavorType,
     88                               &byteCount);
     89     if (_err != noErr) return PyMac_Error(_err);
     90     _res = Py_BuildValue("l",
     91                          byteCount);
     92     return _res;
     93 }
     94 
     95 static PyObject *ScrapObj_GetScrapFlavorData(ScrapObject *_self, PyObject *_args)
     96 {
     97     PyObject *_res = NULL;
     98     OSStatus _err;
     99     ScrapFlavorType flavorType;
    100     Size byteCount;
    101 
    102     if (!PyArg_ParseTuple(_args, "O&",
    103                           PyMac_GetOSType, &flavorType))
    104         return NULL;
    105     _err = GetScrapFlavorSize(_self->ob_itself,
    106                               flavorType,
    107                               &byteCount);
    108     if (_err != noErr) return PyMac_Error(_err);
    109     _res = PyString_FromStringAndSize(NULL, (int)byteCount);
    110     if ( _res == NULL ) return NULL;
    111     _err = GetScrapFlavorData(_self->ob_itself,
    112                               flavorType,
    113                               &byteCount,
    114                               PyString_AS_STRING(_res));
    115     if (_err != noErr) {
    116         Py_XDECREF(_res);
    117         return PyMac_Error(_err);
    118     }
    119     return _res;
    120 }
    121 
    122 static PyObject *ScrapObj_PutScrapFlavor(ScrapObject *_self, PyObject *_args)
    123 {
    124     PyObject *_res = NULL;
    125     OSStatus _err;
    126     ScrapFlavorType flavorType;
    127     ScrapFlavorFlags flavorFlags;
    128     char *flavorData__in__;
    129     int flavorData__in_len__;
    130     if (!PyArg_ParseTuple(_args, "O&Ks#",
    131                           PyMac_GetOSType, &flavorType,
    132                           &flavorFlags,
    133                           &flavorData__in__, &flavorData__in_len__))
    134         return NULL;
    135     _err = PutScrapFlavor(_self->ob_itself,
    136                           flavorType,
    137                           flavorFlags,
    138                           (Size)flavorData__in_len__,
    139                           flavorData__in__);
    140     if (_err != noErr) return PyMac_Error(_err);
    141     Py_INCREF(Py_None);
    142     _res = Py_None;
    143     return _res;
    144 }
    145 
    146 static PyObject *ScrapObj_GetScrapFlavorCount(ScrapObject *_self, PyObject *_args)
    147 {
    148     PyObject *_res = NULL;
    149     OSStatus _err;
    150     UInt32 infoCount;
    151     if (!PyArg_ParseTuple(_args, ""))
    152         return NULL;
    153     _err = GetScrapFlavorCount(_self->ob_itself,
    154                                &infoCount);
    155     if (_err != noErr) return PyMac_Error(_err);
    156     _res = Py_BuildValue("l",
    157                          infoCount);
    158     return _res;
    159 }
    160 
    161 static PyObject *ScrapObj_GetScrapFlavorInfoList(ScrapObject *_self, PyObject *_args)
    162 {
    163     PyObject *_res = NULL;
    164     PyObject *item;
    165     OSStatus _err;
    166     UInt32 infoCount;
    167     ScrapFlavorInfo *infolist = NULL;
    168     int i;
    169 
    170     if (!PyArg_ParseTuple(_args, ""))
    171         return NULL;
    172     _err = GetScrapFlavorCount(_self->ob_itself,
    173                                &infoCount);
    174     if (_err != noErr) return PyMac_Error(_err);
    175     if (infoCount == 0) return Py_BuildValue("[]");
    176 
    177     if ((infolist = (ScrapFlavorInfo *)malloc(infoCount*sizeof(ScrapFlavorInfo))) == NULL )
    178         return PyErr_NoMemory();
    179 
    180     _err = GetScrapFlavorInfoList(_self->ob_itself, &infoCount, infolist);
    181     if (_err != noErr) {
    182         free(infolist);
    183         return NULL;
    184     }
    185     if ((_res = PyList_New(infoCount)) == NULL ) {
    186         free(infolist);
    187         return NULL;
    188     }
    189     for(i=0; i<infoCount; i++) {
    190         item = Py_BuildValue("O&l", PyMac_BuildOSType, infolist[i].flavorType,
    191             infolist[i].flavorFlags);
    192         if ( !item || PyList_SetItem(_res, i, item) < 0 ) {
    193             Py_DECREF(_res);
    194             free(infolist);
    195             return NULL;
    196         }
    197     }
    198     free(infolist);
    199     return _res;
    200 }
    201 
    202 static PyMethodDef ScrapObj_methods[] = {
    203     {"GetScrapFlavorFlags", (PyCFunction)ScrapObj_GetScrapFlavorFlags, 1,
    204      PyDoc_STR("(ScrapFlavorType flavorType) -> (ScrapFlavorFlags flavorFlags)")},
    205     {"GetScrapFlavorSize", (PyCFunction)ScrapObj_GetScrapFlavorSize, 1,
    206      PyDoc_STR("(ScrapFlavorType flavorType) -> (Size byteCount)")},
    207     {"GetScrapFlavorData", (PyCFunction)ScrapObj_GetScrapFlavorData, 1,
    208      PyDoc_STR("(ScrapFlavorType flavorType, Buffer destination) -> (Size byteCount)")},
    209     {"PutScrapFlavor", (PyCFunction)ScrapObj_PutScrapFlavor, 1,
    210      PyDoc_STR("(ScrapFlavorType flavorType, ScrapFlavorFlags flavorFlags, Size flavorSize, Buffer flavorData) -> None")},
    211     {"GetScrapFlavorCount", (PyCFunction)ScrapObj_GetScrapFlavorCount, 1,
    212      PyDoc_STR("() -> (UInt32 infoCount)")},
    213     {"GetScrapFlavorInfoList", (PyCFunction)ScrapObj_GetScrapFlavorInfoList, 1,
    214      PyDoc_STR("() -> ([(ScrapFlavorType, ScrapFlavorInfo), ...])")},
    215     {NULL, NULL, 0}
    216 };
    217 
    218 PyMethodChain ScrapObj_chain = { ScrapObj_methods, NULL };
    219 
    220 static PyObject *ScrapObj_getattr(ScrapObject *self, char *name)
    221 {
    222     return Py_FindMethodInChain(&ScrapObj_chain, (PyObject *)self, name);
    223 }
    224 
    225 #define ScrapObj_setattr NULL
    226 
    227 #define ScrapObj_compare NULL
    228 
    229 #define ScrapObj_repr NULL
    230 
    231 #define ScrapObj_hash NULL
    232 
    233 PyTypeObject Scrap_Type = {
    234     PyObject_HEAD_INIT(NULL)
    235     0, /*ob_size*/
    236     "_Scrap.Scrap", /*tp_name*/
    237     sizeof(ScrapObject), /*tp_basicsize*/
    238     0, /*tp_itemsize*/
    239     /* methods */
    240     (destructor) ScrapObj_dealloc, /*tp_dealloc*/
    241     0, /*tp_print*/
    242     (getattrfunc) ScrapObj_getattr, /*tp_getattr*/
    243     (setattrfunc) ScrapObj_setattr, /*tp_setattr*/
    244     (cmpfunc) ScrapObj_compare, /*tp_compare*/
    245     (reprfunc) ScrapObj_repr, /*tp_repr*/
    246     (PyNumberMethods *)0, /* tp_as_number */
    247     (PySequenceMethods *)0, /* tp_as_sequence */
    248     (PyMappingMethods *)0, /* tp_as_mapping */
    249     (hashfunc) ScrapObj_hash, /*tp_hash*/
    250 };
    251 
    252 /* --------------------- End object type Scrap ---------------------- */
    253 
    254 static PyObject *Scrap_LoadScrap(PyObject *_self, PyObject *_args)
    255 {
    256     PyObject *_res = NULL;
    257     OSStatus _err;
    258     if (!PyArg_ParseTuple(_args, ""))
    259         return NULL;
    260     _err = LoadScrap();
    261     if (_err != noErr) return PyMac_Error(_err);
    262     Py_INCREF(Py_None);
    263     _res = Py_None;
    264     return _res;
    265 }
    266 
    267 static PyObject *Scrap_UnloadScrap(PyObject *_self, PyObject *_args)
    268 {
    269     PyObject *_res = NULL;
    270     OSStatus _err;
    271     if (!PyArg_ParseTuple(_args, ""))
    272         return NULL;
    273     _err = UnloadScrap();
    274     if (_err != noErr) return PyMac_Error(_err);
    275     Py_INCREF(Py_None);
    276     _res = Py_None;
    277     return _res;
    278 }
    279 
    280 static PyObject *Scrap_GetCurrentScrap(PyObject *_self, PyObject *_args)
    281 {
    282     PyObject *_res = NULL;
    283     OSStatus _err;
    284     ScrapRef scrap;
    285     if (!PyArg_ParseTuple(_args, ""))
    286         return NULL;
    287     _err = GetCurrentScrap(&scrap);
    288     if (_err != noErr) return PyMac_Error(_err);
    289     _res = Py_BuildValue("O&",
    290                          ScrapObj_New, scrap);
    291     return _res;
    292 }
    293 
    294 static PyObject *Scrap_ClearCurrentScrap(PyObject *_self, PyObject *_args)
    295 {
    296     PyObject *_res = NULL;
    297     OSStatus _err;
    298     if (!PyArg_ParseTuple(_args, ""))
    299         return NULL;
    300     _err = ClearCurrentScrap();
    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 *Scrap_CallInScrapPromises(PyObject *_self, PyObject *_args)
    308 {
    309     PyObject *_res = NULL;
    310     OSStatus _err;
    311     if (!PyArg_ParseTuple(_args, ""))
    312         return NULL;
    313     _err = CallInScrapPromises();
    314     if (_err != noErr) return PyMac_Error(_err);
    315     Py_INCREF(Py_None);
    316     _res = Py_None;
    317     return _res;
    318 }
    319 #endif /* __LP64__ */
    320 
    321 static PyMethodDef Scrap_methods[] = {
    322 #ifndef __LP64__
    323     {"LoadScrap", (PyCFunction)Scrap_LoadScrap, 1,
    324      PyDoc_STR("() -> None")},
    325     {"UnloadScrap", (PyCFunction)Scrap_UnloadScrap, 1,
    326      PyDoc_STR("() -> None")},
    327     {"GetCurrentScrap", (PyCFunction)Scrap_GetCurrentScrap, 1,
    328      PyDoc_STR("() -> (ScrapRef scrap)")},
    329     {"ClearCurrentScrap", (PyCFunction)Scrap_ClearCurrentScrap, 1,
    330      PyDoc_STR("() -> None")},
    331     {"CallInScrapPromises", (PyCFunction)Scrap_CallInScrapPromises, 1,
    332      PyDoc_STR("() -> None")},
    333 #endif /* __LP64__ */
    334     {NULL, NULL, 0}
    335 };
    336 
    337 
    338 
    339 
    340 void init_Scrap(void)
    341 {
    342     PyObject *m;
    343 #ifndef __LP64__
    344     PyObject *d;
    345 #endif /* __LP64__ */
    346 
    347 
    348 
    349 
    350     m = Py_InitModule("_Scrap", Scrap_methods);
    351 #ifndef __LP64__
    352     d = PyModule_GetDict(m);
    353     Scrap_Error = PyMac_GetOSErrException();
    354     if (Scrap_Error == NULL ||
    355         PyDict_SetItemString(d, "Error", Scrap_Error) != 0)
    356         return;
    357     Scrap_Type.ob_type = &PyType_Type;
    358     Py_INCREF(&Scrap_Type);
    359     if (PyDict_SetItemString(d, "ScrapType", (PyObject *)&Scrap_Type) != 0)
    360         Py_FatalError("can't initialize ScrapType");
    361 #endif /* __LP64__ */
    362 }
    363 
    364 /* ======================= End module _Scrap ======================== */
    365 
    366