2 /* ========================= Module _Scrap ========================== */
9 #include "pymactoolbox.h"
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"); \
19 #include <Carbon/Carbon.h>
21 static PyObject
*Scrap_Error
;
23 /* ----------------------- Object type Scrap ------------------------ */
25 PyTypeObject Scrap_Type
;
27 #define ScrapObj_Check(x) ((x)->ob_type == &Scrap_Type || PyObject_TypeCheck((x), &Scrap_Type))
29 typedef struct ScrapObject
{
34 PyObject
*ScrapObj_New(ScrapRef itself
)
37 it
= PyObject_NEW(ScrapObject
, &Scrap_Type
);
38 if (it
== NULL
) return NULL
;
39 it
->ob_itself
= itself
;
40 return (PyObject
*)it
;
42 int ScrapObj_Convert(PyObject
*v
, ScrapRef
*p_itself
)
44 if (!ScrapObj_Check(v
))
46 PyErr_SetString(PyExc_TypeError
, "Scrap required");
49 *p_itself
= ((ScrapObject
*)v
)->ob_itself
;
53 static void ScrapObj_dealloc(ScrapObject
*self
)
55 /* Cleanup of self->ob_itself goes here */
56 self
->ob_type
->tp_free((PyObject
*)self
);
59 static PyObject
*ScrapObj_GetScrapFlavorFlags(ScrapObject
*_self
, PyObject
*_args
)
61 PyObject
*_res
= NULL
;
63 ScrapFlavorType flavorType
;
64 ScrapFlavorFlags flavorFlags
;
65 if (!PyArg_ParseTuple(_args
, "O&",
66 PyMac_GetOSType
, &flavorType
))
68 _err
= GetScrapFlavorFlags(_self
->ob_itself
,
71 if (_err
!= noErr
) return PyMac_Error(_err
);
72 _res
= Py_BuildValue("l",
77 static PyObject
*ScrapObj_GetScrapFlavorSize(ScrapObject
*_self
, PyObject
*_args
)
79 PyObject
*_res
= NULL
;
81 ScrapFlavorType flavorType
;
83 if (!PyArg_ParseTuple(_args
, "O&",
84 PyMac_GetOSType
, &flavorType
))
86 _err
= GetScrapFlavorSize(_self
->ob_itself
,
89 if (_err
!= noErr
) return PyMac_Error(_err
);
90 _res
= Py_BuildValue("l",
95 static PyObject
*ScrapObj_GetScrapFlavorData(ScrapObject
*_self
, PyObject
*_args
)
97 PyObject
*_res
= NULL
;
99 ScrapFlavorType flavorType
;
102 if (!PyArg_ParseTuple(_args
, "O&",
103 PyMac_GetOSType
, &flavorType
))
105 _err
= GetScrapFlavorSize(_self
->ob_itself
,
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
,
114 PyString_AS_STRING(_res
));
117 return PyMac_Error(_err
);
122 static PyObject
*ScrapObj_PutScrapFlavor(ScrapObject
*_self
, PyObject
*_args
)
124 PyObject
*_res
= NULL
;
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
,
133 &flavorData__in__
, &flavorData__in_len__
))
135 _err
= PutScrapFlavor(_self
->ob_itself
,
138 (Size
)flavorData__in_len__
,
140 if (_err
!= noErr
) return PyMac_Error(_err
);
146 static PyObject
*ScrapObj_GetScrapFlavorCount(ScrapObject
*_self
, PyObject
*_args
)
148 PyObject
*_res
= NULL
;
151 if (!PyArg_ParseTuple(_args
, ""))
153 _err
= GetScrapFlavorCount(_self
->ob_itself
,
155 if (_err
!= noErr
) return PyMac_Error(_err
);
156 _res
= Py_BuildValue("l",
161 static PyObject
*ScrapObj_GetScrapFlavorInfoList(ScrapObject
*_self
, PyObject
*_args
)
163 PyObject
*_res
= NULL
;
167 ScrapFlavorInfo
*infolist
= NULL
;
170 if (!PyArg_ParseTuple(_args
, ""))
172 _err
= GetScrapFlavorCount(_self
->ob_itself
,
174 if (_err
!= noErr
) return PyMac_Error(_err
);
175 if (infoCount
== 0) return Py_BuildValue("[]");
177 if ((infolist
= (ScrapFlavorInfo
*)malloc(infoCount
*sizeof(ScrapFlavorInfo
))) == NULL
)
178 return PyErr_NoMemory();
180 _err
= GetScrapFlavorInfoList(_self
->ob_itself
, &infoCount
, infolist
);
185 if ((_res
= PyList_New(infoCount
)) == NULL
) {
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 ) {
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), ...])")},
218 PyMethodChain ScrapObj_chain
= { ScrapObj_methods
, NULL
};
220 static PyObject
*ScrapObj_getattr(ScrapObject
*self
, char *name
)
222 return Py_FindMethodInChain(&ScrapObj_chain
, (PyObject
*)self
, name
);
225 #define ScrapObj_setattr NULL
227 #define ScrapObj_compare NULL
229 #define ScrapObj_repr NULL
231 #define ScrapObj_hash NULL
233 PyTypeObject Scrap_Type
= {
234 PyObject_HEAD_INIT(NULL
)
236 "_Scrap.Scrap", /*tp_name*/
237 sizeof(ScrapObject
), /*tp_basicsize*/
240 (destructor
) ScrapObj_dealloc
, /*tp_dealloc*/
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*/
252 /* --------------------- End object type Scrap ---------------------- */
254 static PyObject
*Scrap_LoadScrap(PyObject
*_self
, PyObject
*_args
)
256 PyObject
*_res
= NULL
;
258 if (!PyArg_ParseTuple(_args
, ""))
261 if (_err
!= noErr
) return PyMac_Error(_err
);
267 static PyObject
*Scrap_UnloadScrap(PyObject
*_self
, PyObject
*_args
)
269 PyObject
*_res
= NULL
;
271 if (!PyArg_ParseTuple(_args
, ""))
273 _err
= UnloadScrap();
274 if (_err
!= noErr
) return PyMac_Error(_err
);
280 static PyObject
*Scrap_GetCurrentScrap(PyObject
*_self
, PyObject
*_args
)
282 PyObject
*_res
= NULL
;
285 if (!PyArg_ParseTuple(_args
, ""))
287 _err
= GetCurrentScrap(&scrap
);
288 if (_err
!= noErr
) return PyMac_Error(_err
);
289 _res
= Py_BuildValue("O&",
290 ScrapObj_New
, scrap
);
294 static PyObject
*Scrap_ClearCurrentScrap(PyObject
*_self
, PyObject
*_args
)
296 PyObject
*_res
= NULL
;
298 if (!PyArg_ParseTuple(_args
, ""))
300 _err
= ClearCurrentScrap();
301 if (_err
!= noErr
) return PyMac_Error(_err
);
307 static PyObject
*Scrap_CallInScrapPromises(PyObject
*_self
, PyObject
*_args
)
309 PyObject
*_res
= NULL
;
311 if (!PyArg_ParseTuple(_args
, ""))
313 _err
= CallInScrapPromises();
314 if (_err
!= noErr
) return PyMac_Error(_err
);
319 #endif /* __LP64__ */
321 static PyMethodDef Scrap_methods
[] = {
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__ */
340 void init_Scrap(void)
345 #endif /* __LP64__ */
350 m
= Py_InitModule("_Scrap", Scrap_methods
);
352 d
= PyModule_GetDict(m
);
353 Scrap_Error
= PyMac_GetOSErrException();
354 if (Scrap_Error
== NULL
||
355 PyDict_SetItemString(d
, "Error", Scrap_Error
) != 0)
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__ */
364 /* ======================= End module _Scrap ======================== */