2 /* =========================== Module Res =========================== */
9 #include "pymactoolbox.h"
11 #ifdef WITHOUT_FRAMEWORKS
12 #include <Resources.h>
15 #include <Carbon/Carbon.h>
18 #ifdef USE_TOOLBOX_OBJECT_GLUE
19 extern PyObject
*_ResObj_New(Handle
);
20 extern int _ResObj_Convert(PyObject
*, Handle
*);
21 extern PyObject
*_OptResObj_New(Handle
);
22 extern int _OptResObj_Convert(PyObject
*, Handle
*);
23 #define ResObj_New _ResObj_New
24 #define ResObj_Convert _ResObj_Convert
25 #define OptResObj_New _OptResObj_New
26 #define OptResObj_Convert _OptResObj_Convert
29 /* Function to dispose a resource, with a "normal" calling sequence */
31 PyMac_AutoDisposeHandle(Handle h
)
36 static PyObject
*Res_Error
;
38 /* ---------------------- Object type Resource ---------------------- */
40 PyTypeObject Resource_Type
;
42 #define ResObj_Check(x) ((x)->ob_type == &Resource_Type)
44 typedef struct ResourceObject
{
47 void (*ob_freeit
)(Handle ptr
);
50 PyObject
*ResObj_New(Handle itself
)
53 if (itself
== NULL
) return PyMac_Error(resNotFound
);
54 it
= PyObject_NEW(ResourceObject
, &Resource_Type
);
55 if (it
== NULL
) return NULL
;
56 it
->ob_itself
= itself
;
58 return (PyObject
*)it
;
60 ResObj_Convert(PyObject
*v
, Handle
*p_itself
)
65 if ( (tmp
=PyObject_CallMethod(v
, "as_Resource", "")) )
67 *p_itself
= ((ResourceObject
*)tmp
)->ob_itself
;
75 PyErr_SetString(PyExc_TypeError
, "Resource required");
78 *p_itself
= ((ResourceObject
*)v
)->ob_itself
;
82 static void ResObj_dealloc(ResourceObject
*self
)
84 if (self
->ob_freeit
&& self
->ob_itself
)
86 self
->ob_freeit(self
->ob_itself
);
88 self
->ob_itself
= NULL
;
92 static PyObject
*ResObj_HomeResFile(ResourceObject
*_self
, PyObject
*_args
)
94 PyObject
*_res
= NULL
;
96 if (!PyArg_ParseTuple(_args
, ""))
98 _rv
= HomeResFile(_self
->ob_itself
);
100 OSErr _err
= ResError();
101 if (_err
!= noErr
) return PyMac_Error(_err
);
103 _res
= Py_BuildValue("h",
108 static PyObject
*ResObj_MacLoadResource(ResourceObject
*_self
, PyObject
*_args
)
110 PyObject
*_res
= NULL
;
111 if (!PyArg_ParseTuple(_args
, ""))
113 MacLoadResource(_self
->ob_itself
);
115 OSErr _err
= ResError();
116 if (_err
!= noErr
) return PyMac_Error(_err
);
123 static PyObject
*ResObj_ReleaseResource(ResourceObject
*_self
, PyObject
*_args
)
125 PyObject
*_res
= NULL
;
126 if (!PyArg_ParseTuple(_args
, ""))
128 ReleaseResource(_self
->ob_itself
);
130 OSErr _err
= ResError();
131 if (_err
!= noErr
) return PyMac_Error(_err
);
138 static PyObject
*ResObj_DetachResource(ResourceObject
*_self
, PyObject
*_args
)
140 PyObject
*_res
= NULL
;
141 if (!PyArg_ParseTuple(_args
, ""))
143 DetachResource(_self
->ob_itself
);
145 OSErr _err
= ResError();
146 if (_err
!= noErr
) return PyMac_Error(_err
);
153 static PyObject
*ResObj_GetResAttrs(ResourceObject
*_self
, PyObject
*_args
)
155 PyObject
*_res
= NULL
;
157 if (!PyArg_ParseTuple(_args
, ""))
159 _rv
= GetResAttrs(_self
->ob_itself
);
161 OSErr _err
= ResError();
162 if (_err
!= noErr
) return PyMac_Error(_err
);
164 _res
= Py_BuildValue("h",
169 static PyObject
*ResObj_GetResInfo(ResourceObject
*_self
, PyObject
*_args
)
171 PyObject
*_res
= NULL
;
175 if (!PyArg_ParseTuple(_args
, ""))
177 GetResInfo(_self
->ob_itself
,
182 OSErr _err
= ResError();
183 if (_err
!= noErr
) return PyMac_Error(_err
);
185 _res
= Py_BuildValue("hO&O&",
187 PyMac_BuildOSType
, theType
,
188 PyMac_BuildStr255
, name
);
192 static PyObject
*ResObj_SetResInfo(ResourceObject
*_self
, PyObject
*_args
)
194 PyObject
*_res
= NULL
;
197 if (!PyArg_ParseTuple(_args
, "hO&",
199 PyMac_GetStr255
, name
))
201 SetResInfo(_self
->ob_itself
,
205 OSErr _err
= ResError();
206 if (_err
!= noErr
) return PyMac_Error(_err
);
213 static PyObject
*ResObj_AddResource(ResourceObject
*_self
, PyObject
*_args
)
215 PyObject
*_res
= NULL
;
219 if (!PyArg_ParseTuple(_args
, "O&hO&",
220 PyMac_GetOSType
, &theType
,
222 PyMac_GetStr255
, name
))
224 AddResource(_self
->ob_itself
,
229 OSErr _err
= ResError();
230 if (_err
!= noErr
) return PyMac_Error(_err
);
237 static PyObject
*ResObj_GetResourceSizeOnDisk(ResourceObject
*_self
, PyObject
*_args
)
239 PyObject
*_res
= NULL
;
241 if (!PyArg_ParseTuple(_args
, ""))
243 _rv
= GetResourceSizeOnDisk(_self
->ob_itself
);
245 OSErr _err
= ResError();
246 if (_err
!= noErr
) return PyMac_Error(_err
);
248 _res
= Py_BuildValue("l",
253 static PyObject
*ResObj_GetMaxResourceSize(ResourceObject
*_self
, PyObject
*_args
)
255 PyObject
*_res
= NULL
;
257 if (!PyArg_ParseTuple(_args
, ""))
259 _rv
= GetMaxResourceSize(_self
->ob_itself
);
261 OSErr _err
= ResError();
262 if (_err
!= noErr
) return PyMac_Error(_err
);
264 _res
= Py_BuildValue("l",
269 #if TARGET_API_MAC_OS8
271 static PyObject
*ResObj_RsrcMapEntry(ResourceObject
*_self
, PyObject
*_args
)
273 PyObject
*_res
= NULL
;
275 if (!PyArg_ParseTuple(_args
, ""))
277 _rv
= RsrcMapEntry(_self
->ob_itself
);
279 OSErr _err
= ResError();
280 if (_err
!= noErr
) return PyMac_Error(_err
);
282 _res
= Py_BuildValue("l",
288 static PyObject
*ResObj_SetResAttrs(ResourceObject
*_self
, PyObject
*_args
)
290 PyObject
*_res
= NULL
;
292 if (!PyArg_ParseTuple(_args
, "h",
295 SetResAttrs(_self
->ob_itself
,
298 OSErr _err
= ResError();
299 if (_err
!= noErr
) return PyMac_Error(_err
);
306 static PyObject
*ResObj_ChangedResource(ResourceObject
*_self
, PyObject
*_args
)
308 PyObject
*_res
= NULL
;
309 if (!PyArg_ParseTuple(_args
, ""))
311 ChangedResource(_self
->ob_itself
);
313 OSErr _err
= ResError();
314 if (_err
!= noErr
) return PyMac_Error(_err
);
321 static PyObject
*ResObj_RemoveResource(ResourceObject
*_self
, PyObject
*_args
)
323 PyObject
*_res
= NULL
;
324 if (!PyArg_ParseTuple(_args
, ""))
326 RemoveResource(_self
->ob_itself
);
328 OSErr _err
= ResError();
329 if (_err
!= noErr
) return PyMac_Error(_err
);
336 static PyObject
*ResObj_WriteResource(ResourceObject
*_self
, PyObject
*_args
)
338 PyObject
*_res
= NULL
;
339 if (!PyArg_ParseTuple(_args
, ""))
341 WriteResource(_self
->ob_itself
);
343 OSErr _err
= ResError();
344 if (_err
!= noErr
) return PyMac_Error(_err
);
351 static PyObject
*ResObj_SetResourceSize(ResourceObject
*_self
, PyObject
*_args
)
353 PyObject
*_res
= NULL
;
355 if (!PyArg_ParseTuple(_args
, "l",
358 SetResourceSize(_self
->ob_itself
,
361 OSErr _err
= ResError();
362 if (_err
!= noErr
) return PyMac_Error(_err
);
369 static PyObject
*ResObj_GetNextFOND(ResourceObject
*_self
, PyObject
*_args
)
371 PyObject
*_res
= NULL
;
373 if (!PyArg_ParseTuple(_args
, ""))
375 _rv
= GetNextFOND(_self
->ob_itself
);
377 OSErr _err
= ResError();
378 if (_err
!= noErr
) return PyMac_Error(_err
);
380 _res
= Py_BuildValue("O&",
385 static PyObject
*ResObj_as_Control(ResourceObject
*_self
, PyObject
*_args
)
387 PyObject
*_res
= NULL
;
389 return CtlObj_New((ControlHandle
)_self
->ob_itself
);
393 static PyObject
*ResObj_as_Menu(ResourceObject
*_self
, PyObject
*_args
)
395 PyObject
*_res
= NULL
;
397 return MenuObj_New((MenuHandle
)_self
->ob_itself
);
401 static PyObject
*ResObj_LoadResource(ResourceObject
*_self
, PyObject
*_args
)
403 PyObject
*_res
= NULL
;
404 if (!PyArg_ParseTuple(_args
, ""))
406 LoadResource(_self
->ob_itself
);
408 OSErr _err
= ResError();
409 if (_err
!= noErr
) return PyMac_Error(_err
);
416 static PyObject
*ResObj_AutoDispose(ResourceObject
*_self
, PyObject
*_args
)
418 PyObject
*_res
= NULL
;
421 if (!PyArg_ParseTuple(_args
, "i", &onoff
))
423 if ( _self
->ob_freeit
)
426 _self
->ob_freeit
= PyMac_AutoDisposeHandle
;
428 _self
->ob_freeit
= NULL
;
429 return Py_BuildValue("i", old
);
433 static PyMethodDef ResObj_methods
[] = {
434 {"HomeResFile", (PyCFunction
)ResObj_HomeResFile
, 1,
435 "() -> (short _rv)"},
436 {"MacLoadResource", (PyCFunction
)ResObj_MacLoadResource
, 1,
438 {"ReleaseResource", (PyCFunction
)ResObj_ReleaseResource
, 1,
440 {"DetachResource", (PyCFunction
)ResObj_DetachResource
, 1,
442 {"GetResAttrs", (PyCFunction
)ResObj_GetResAttrs
, 1,
443 "() -> (short _rv)"},
444 {"GetResInfo", (PyCFunction
)ResObj_GetResInfo
, 1,
445 "() -> (short theID, ResType theType, Str255 name)"},
446 {"SetResInfo", (PyCFunction
)ResObj_SetResInfo
, 1,
447 "(short theID, Str255 name) -> None"},
448 {"AddResource", (PyCFunction
)ResObj_AddResource
, 1,
449 "(ResType theType, short theID, Str255 name) -> None"},
450 {"GetResourceSizeOnDisk", (PyCFunction
)ResObj_GetResourceSizeOnDisk
, 1,
452 {"GetMaxResourceSize", (PyCFunction
)ResObj_GetMaxResourceSize
, 1,
455 #if TARGET_API_MAC_OS8
456 {"RsrcMapEntry", (PyCFunction
)ResObj_RsrcMapEntry
, 1,
459 {"SetResAttrs", (PyCFunction
)ResObj_SetResAttrs
, 1,
460 "(short attrs) -> None"},
461 {"ChangedResource", (PyCFunction
)ResObj_ChangedResource
, 1,
463 {"RemoveResource", (PyCFunction
)ResObj_RemoveResource
, 1,
465 {"WriteResource", (PyCFunction
)ResObj_WriteResource
, 1,
467 {"SetResourceSize", (PyCFunction
)ResObj_SetResourceSize
, 1,
468 "(long newSize) -> None"},
469 {"GetNextFOND", (PyCFunction
)ResObj_GetNextFOND
, 1,
470 "() -> (Handle _rv)"},
471 {"as_Control", (PyCFunction
)ResObj_as_Control
, 1,
472 "Return this resource/handle as a Control"},
473 {"as_Menu", (PyCFunction
)ResObj_as_Menu
, 1,
474 "Return this resource/handle as a Menu"},
475 {"LoadResource", (PyCFunction
)ResObj_LoadResource
, 1,
477 {"AutoDispose", (PyCFunction
)ResObj_AutoDispose
, 1,
478 "(int)->int. Automatically DisposeHandle the object on Python object cleanup"},
482 PyMethodChain ResObj_chain
= { ResObj_methods
, NULL
};
484 static PyObject
*ResObj_getattr(ResourceObject
*self
, char *name
)
487 if (strcmp(name
, "size") == 0)
488 return PyInt_FromLong(GetHandleSize(self
->ob_itself
));
489 if (strcmp(name
, "data") == 0) {
492 state
= HGetState(self
->ob_itself
);
493 HLock(self
->ob_itself
);
494 res
= PyString_FromStringAndSize(
496 GetHandleSize(self
->ob_itself
));
497 HUnlock(self
->ob_itself
);
498 HSetState(self
->ob_itself
, state
);
501 if (strcmp(name
, "__members__") == 0)
502 return Py_BuildValue("[ss]", "data", "size");
504 return Py_FindMethodInChain(&ResObj_chain
, (PyObject
*)self
, name
);
508 ResObj_setattr(ResourceObject
*self
, char *name
, PyObject
*value
)
513 if (strcmp(name
, "data") != 0 || value
== NULL
)
515 if ( !PyString_Check(value
) )
517 size
= PyString_Size(value
);
518 data
= PyString_AsString(value
);
519 /* XXXX Do I need the GetState/SetState calls? */
520 SetHandleSize(self
->ob_itself
, size
);
523 HLock(self
->ob_itself
);
524 memcpy((char *)*self
->ob_itself
, data
, size
);
525 HUnlock(self
->ob_itself
);
526 /* XXXX Should I do the Changed call immedeately? */
531 #define ResObj_compare NULL
533 #define ResObj_repr NULL
535 #define ResObj_hash NULL
537 PyTypeObject Resource_Type
= {
538 PyObject_HEAD_INIT(&PyType_Type
)
540 "Resource", /*tp_name*/
541 sizeof(ResourceObject
), /*tp_basicsize*/
544 (destructor
) ResObj_dealloc
, /*tp_dealloc*/
546 (getattrfunc
) ResObj_getattr
, /*tp_getattr*/
547 (setattrfunc
) ResObj_setattr
, /*tp_setattr*/
548 (cmpfunc
) ResObj_compare
, /*tp_compare*/
549 (reprfunc
) ResObj_repr
, /*tp_repr*/
550 (PyNumberMethods
*)0, /* tp_as_number */
551 (PySequenceMethods
*)0, /* tp_as_sequence */
552 (PyMappingMethods
*)0, /* tp_as_mapping */
553 (hashfunc
) ResObj_hash
, /*tp_hash*/
556 /* -------------------- End object type Resource -------------------- */
559 #if TARGET_API_MAC_OS8
561 static PyObject
*Res_InitResources(PyObject
*_self
, PyObject
*_args
)
563 PyObject
*_res
= NULL
;
565 if (!PyArg_ParseTuple(_args
, ""))
567 _rv
= InitResources();
569 OSErr _err
= ResError();
570 if (_err
!= noErr
) return PyMac_Error(_err
);
572 _res
= Py_BuildValue("h",
578 #if TARGET_API_MAC_OS8
580 static PyObject
*Res_RsrcZoneInit(PyObject
*_self
, PyObject
*_args
)
582 PyObject
*_res
= NULL
;
583 if (!PyArg_ParseTuple(_args
, ""))
587 OSErr _err
= ResError();
588 if (_err
!= noErr
) return PyMac_Error(_err
);
596 static PyObject
*Res_CloseResFile(PyObject
*_self
, PyObject
*_args
)
598 PyObject
*_res
= NULL
;
600 if (!PyArg_ParseTuple(_args
, "h",
603 CloseResFile(refNum
);
605 OSErr _err
= ResError();
606 if (_err
!= noErr
) return PyMac_Error(_err
);
613 static PyObject
*Res_ResError(PyObject
*_self
, PyObject
*_args
)
615 PyObject
*_res
= NULL
;
617 if (!PyArg_ParseTuple(_args
, ""))
621 OSErr _err
= ResError();
622 if (_err
!= noErr
) return PyMac_Error(_err
);
624 _res
= Py_BuildValue("h",
629 static PyObject
*Res_CurResFile(PyObject
*_self
, PyObject
*_args
)
631 PyObject
*_res
= NULL
;
633 if (!PyArg_ParseTuple(_args
, ""))
637 OSErr _err
= ResError();
638 if (_err
!= noErr
) return PyMac_Error(_err
);
640 _res
= Py_BuildValue("h",
645 #if TARGET_API_MAC_OS8
647 static PyObject
*Res_CreateResFile(PyObject
*_self
, PyObject
*_args
)
649 PyObject
*_res
= NULL
;
651 if (!PyArg_ParseTuple(_args
, "O&",
652 PyMac_GetStr255
, fileName
))
654 CreateResFile(fileName
);
656 OSErr _err
= ResError();
657 if (_err
!= noErr
) return PyMac_Error(_err
);
665 #if TARGET_API_MAC_OS8
667 static PyObject
*Res_OpenResFile(PyObject
*_self
, PyObject
*_args
)
669 PyObject
*_res
= NULL
;
672 if (!PyArg_ParseTuple(_args
, "O&",
673 PyMac_GetStr255
, fileName
))
675 _rv
= OpenResFile(fileName
);
677 OSErr _err
= ResError();
678 if (_err
!= noErr
) return PyMac_Error(_err
);
680 _res
= Py_BuildValue("h",
686 static PyObject
*Res_UseResFile(PyObject
*_self
, PyObject
*_args
)
688 PyObject
*_res
= NULL
;
690 if (!PyArg_ParseTuple(_args
, "h",
695 OSErr _err
= ResError();
696 if (_err
!= noErr
) return PyMac_Error(_err
);
703 static PyObject
*Res_CountTypes(PyObject
*_self
, PyObject
*_args
)
705 PyObject
*_res
= NULL
;
707 if (!PyArg_ParseTuple(_args
, ""))
711 OSErr _err
= ResError();
712 if (_err
!= noErr
) return PyMac_Error(_err
);
714 _res
= Py_BuildValue("h",
719 static PyObject
*Res_Count1Types(PyObject
*_self
, PyObject
*_args
)
721 PyObject
*_res
= NULL
;
723 if (!PyArg_ParseTuple(_args
, ""))
727 OSErr _err
= ResError();
728 if (_err
!= noErr
) return PyMac_Error(_err
);
730 _res
= Py_BuildValue("h",
735 static PyObject
*Res_GetIndType(PyObject
*_self
, PyObject
*_args
)
737 PyObject
*_res
= NULL
;
740 if (!PyArg_ParseTuple(_args
, "h",
746 OSErr _err
= ResError();
747 if (_err
!= noErr
) return PyMac_Error(_err
);
749 _res
= Py_BuildValue("O&",
750 PyMac_BuildOSType
, theType
);
754 static PyObject
*Res_Get1IndType(PyObject
*_self
, PyObject
*_args
)
756 PyObject
*_res
= NULL
;
759 if (!PyArg_ParseTuple(_args
, "h",
762 Get1IndType(&theType
,
765 OSErr _err
= ResError();
766 if (_err
!= noErr
) return PyMac_Error(_err
);
768 _res
= Py_BuildValue("O&",
769 PyMac_BuildOSType
, theType
);
773 static PyObject
*Res_SetResLoad(PyObject
*_self
, PyObject
*_args
)
775 PyObject
*_res
= NULL
;
777 if (!PyArg_ParseTuple(_args
, "b",
782 OSErr _err
= ResError();
783 if (_err
!= noErr
) return PyMac_Error(_err
);
790 static PyObject
*Res_CountResources(PyObject
*_self
, PyObject
*_args
)
792 PyObject
*_res
= NULL
;
795 if (!PyArg_ParseTuple(_args
, "O&",
796 PyMac_GetOSType
, &theType
))
798 _rv
= CountResources(theType
);
800 OSErr _err
= ResError();
801 if (_err
!= noErr
) return PyMac_Error(_err
);
803 _res
= Py_BuildValue("h",
808 static PyObject
*Res_Count1Resources(PyObject
*_self
, PyObject
*_args
)
810 PyObject
*_res
= NULL
;
813 if (!PyArg_ParseTuple(_args
, "O&",
814 PyMac_GetOSType
, &theType
))
816 _rv
= Count1Resources(theType
);
818 OSErr _err
= ResError();
819 if (_err
!= noErr
) return PyMac_Error(_err
);
821 _res
= Py_BuildValue("h",
826 static PyObject
*Res_GetIndResource(PyObject
*_self
, PyObject
*_args
)
828 PyObject
*_res
= NULL
;
832 if (!PyArg_ParseTuple(_args
, "O&h",
833 PyMac_GetOSType
, &theType
,
836 _rv
= GetIndResource(theType
,
839 OSErr _err
= ResError();
840 if (_err
!= noErr
) return PyMac_Error(_err
);
842 _res
= Py_BuildValue("O&",
847 static PyObject
*Res_Get1IndResource(PyObject
*_self
, PyObject
*_args
)
849 PyObject
*_res
= NULL
;
853 if (!PyArg_ParseTuple(_args
, "O&h",
854 PyMac_GetOSType
, &theType
,
857 _rv
= Get1IndResource(theType
,
860 OSErr _err
= ResError();
861 if (_err
!= noErr
) return PyMac_Error(_err
);
863 _res
= Py_BuildValue("O&",
868 static PyObject
*Res_GetResource(PyObject
*_self
, PyObject
*_args
)
870 PyObject
*_res
= NULL
;
874 if (!PyArg_ParseTuple(_args
, "O&h",
875 PyMac_GetOSType
, &theType
,
878 _rv
= GetResource(theType
,
881 OSErr _err
= ResError();
882 if (_err
!= noErr
) return PyMac_Error(_err
);
884 _res
= Py_BuildValue("O&",
889 static PyObject
*Res_Get1Resource(PyObject
*_self
, PyObject
*_args
)
891 PyObject
*_res
= NULL
;
895 if (!PyArg_ParseTuple(_args
, "O&h",
896 PyMac_GetOSType
, &theType
,
899 _rv
= Get1Resource(theType
,
902 OSErr _err
= ResError();
903 if (_err
!= noErr
) return PyMac_Error(_err
);
905 _res
= Py_BuildValue("O&",
910 static PyObject
*Res_GetNamedResource(PyObject
*_self
, PyObject
*_args
)
912 PyObject
*_res
= NULL
;
916 if (!PyArg_ParseTuple(_args
, "O&O&",
917 PyMac_GetOSType
, &theType
,
918 PyMac_GetStr255
, name
))
920 _rv
= GetNamedResource(theType
,
923 OSErr _err
= ResError();
924 if (_err
!= noErr
) return PyMac_Error(_err
);
926 _res
= Py_BuildValue("O&",
931 static PyObject
*Res_Get1NamedResource(PyObject
*_self
, PyObject
*_args
)
933 PyObject
*_res
= NULL
;
937 if (!PyArg_ParseTuple(_args
, "O&O&",
938 PyMac_GetOSType
, &theType
,
939 PyMac_GetStr255
, name
))
941 _rv
= Get1NamedResource(theType
,
944 OSErr _err
= ResError();
945 if (_err
!= noErr
) return PyMac_Error(_err
);
947 _res
= Py_BuildValue("O&",
952 static PyObject
*Res_UniqueID(PyObject
*_self
, PyObject
*_args
)
954 PyObject
*_res
= NULL
;
957 if (!PyArg_ParseTuple(_args
, "O&",
958 PyMac_GetOSType
, &theType
))
960 _rv
= UniqueID(theType
);
962 OSErr _err
= ResError();
963 if (_err
!= noErr
) return PyMac_Error(_err
);
965 _res
= Py_BuildValue("h",
970 static PyObject
*Res_Unique1ID(PyObject
*_self
, PyObject
*_args
)
972 PyObject
*_res
= NULL
;
975 if (!PyArg_ParseTuple(_args
, "O&",
976 PyMac_GetOSType
, &theType
))
978 _rv
= Unique1ID(theType
);
980 OSErr _err
= ResError();
981 if (_err
!= noErr
) return PyMac_Error(_err
);
983 _res
= Py_BuildValue("h",
988 static PyObject
*Res_UpdateResFile(PyObject
*_self
, PyObject
*_args
)
990 PyObject
*_res
= NULL
;
992 if (!PyArg_ParseTuple(_args
, "h",
995 UpdateResFile(refNum
);
997 OSErr _err
= ResError();
998 if (_err
!= noErr
) return PyMac_Error(_err
);
1005 static PyObject
*Res_SetResPurge(PyObject
*_self
, PyObject
*_args
)
1007 PyObject
*_res
= NULL
;
1009 if (!PyArg_ParseTuple(_args
, "b",
1012 SetResPurge(install
);
1014 OSErr _err
= ResError();
1015 if (_err
!= noErr
) return PyMac_Error(_err
);
1022 static PyObject
*Res_GetResFileAttrs(PyObject
*_self
, PyObject
*_args
)
1024 PyObject
*_res
= NULL
;
1027 if (!PyArg_ParseTuple(_args
, "h",
1030 _rv
= GetResFileAttrs(refNum
);
1032 OSErr _err
= ResError();
1033 if (_err
!= noErr
) return PyMac_Error(_err
);
1035 _res
= Py_BuildValue("h",
1040 static PyObject
*Res_SetResFileAttrs(PyObject
*_self
, PyObject
*_args
)
1042 PyObject
*_res
= NULL
;
1045 if (!PyArg_ParseTuple(_args
, "hh",
1049 SetResFileAttrs(refNum
,
1052 OSErr _err
= ResError();
1053 if (_err
!= noErr
) return PyMac_Error(_err
);
1060 static PyObject
*Res_OpenRFPerm(PyObject
*_self
, PyObject
*_args
)
1062 PyObject
*_res
= NULL
;
1066 SignedByte permission
;
1067 if (!PyArg_ParseTuple(_args
, "O&hb",
1068 PyMac_GetStr255
, fileName
,
1072 _rv
= OpenRFPerm(fileName
,
1076 OSErr _err
= ResError();
1077 if (_err
!= noErr
) return PyMac_Error(_err
);
1079 _res
= Py_BuildValue("h",
1084 #if TARGET_API_MAC_OS8
1086 static PyObject
*Res_RGetResource(PyObject
*_self
, PyObject
*_args
)
1088 PyObject
*_res
= NULL
;
1092 if (!PyArg_ParseTuple(_args
, "O&h",
1093 PyMac_GetOSType
, &theType
,
1096 _rv
= RGetResource(theType
,
1099 OSErr _err
= ResError();
1100 if (_err
!= noErr
) return PyMac_Error(_err
);
1102 _res
= Py_BuildValue("O&",
1108 static PyObject
*Res_HOpenResFile(PyObject
*_self
, PyObject
*_args
)
1110 PyObject
*_res
= NULL
;
1115 SignedByte permission
;
1116 if (!PyArg_ParseTuple(_args
, "hlO&b",
1119 PyMac_GetStr255
, fileName
,
1122 _rv
= HOpenResFile(vRefNum
,
1127 OSErr _err
= ResError();
1128 if (_err
!= noErr
) return PyMac_Error(_err
);
1130 _res
= Py_BuildValue("h",
1135 static PyObject
*Res_HCreateResFile(PyObject
*_self
, PyObject
*_args
)
1137 PyObject
*_res
= NULL
;
1141 if (!PyArg_ParseTuple(_args
, "hlO&",
1144 PyMac_GetStr255
, fileName
))
1146 HCreateResFile(vRefNum
,
1150 OSErr _err
= ResError();
1151 if (_err
!= noErr
) return PyMac_Error(_err
);
1158 static PyObject
*Res_FSpOpenResFile(PyObject
*_self
, PyObject
*_args
)
1160 PyObject
*_res
= NULL
;
1163 SignedByte permission
;
1164 if (!PyArg_ParseTuple(_args
, "O&b",
1165 PyMac_GetFSSpec
, &spec
,
1168 _rv
= FSpOpenResFile(&spec
,
1171 OSErr _err
= ResError();
1172 if (_err
!= noErr
) return PyMac_Error(_err
);
1174 _res
= Py_BuildValue("h",
1179 static PyObject
*Res_FSpCreateResFile(PyObject
*_self
, PyObject
*_args
)
1181 PyObject
*_res
= NULL
;
1185 ScriptCode scriptTag
;
1186 if (!PyArg_ParseTuple(_args
, "O&O&O&h",
1187 PyMac_GetFSSpec
, &spec
,
1188 PyMac_GetOSType
, &creator
,
1189 PyMac_GetOSType
, &fileType
,
1192 FSpCreateResFile(&spec
,
1197 OSErr _err
= ResError();
1198 if (_err
!= noErr
) return PyMac_Error(_err
);
1205 #if TARGET_API_MAC_CARBON
1207 static PyObject
*Res_InsertResourceFile(PyObject
*_self
, PyObject
*_args
)
1209 PyObject
*_res
= NULL
;
1212 RsrcChainLocation where
;
1213 if (!PyArg_ParseTuple(_args
, "hh",
1217 _rv
= InsertResourceFile(refNum
,
1220 OSErr _err
= ResError();
1221 if (_err
!= noErr
) return PyMac_Error(_err
);
1223 _res
= Py_BuildValue("h",
1229 #if TARGET_API_MAC_CARBON
1231 static PyObject
*Res_DetachResourceFile(PyObject
*_self
, PyObject
*_args
)
1233 PyObject
*_res
= NULL
;
1236 if (!PyArg_ParseTuple(_args
, "h",
1239 _rv
= DetachResourceFile(refNum
);
1241 OSErr _err
= ResError();
1242 if (_err
!= noErr
) return PyMac_Error(_err
);
1244 _res
= Py_BuildValue("h",
1250 #if TARGET_API_MAC_CARBON
1252 static PyObject
*Res_FSpResourceFileAlreadyOpen(PyObject
*_self
, PyObject
*_args
)
1254 PyObject
*_res
= NULL
;
1256 FSSpec resourceFile
;
1259 if (!PyArg_ParseTuple(_args
, "O&",
1260 PyMac_GetFSSpec
, &resourceFile
))
1262 _rv
= FSpResourceFileAlreadyOpen(&resourceFile
,
1266 OSErr _err
= ResError();
1267 if (_err
!= noErr
) return PyMac_Error(_err
);
1269 _res
= Py_BuildValue("bbh",
1277 #if TARGET_API_MAC_CARBON
1279 static PyObject
*Res_FSpOpenOrphanResFile(PyObject
*_self
, PyObject
*_args
)
1281 PyObject
*_res
= NULL
;
1284 SignedByte permission
;
1286 if (!PyArg_ParseTuple(_args
, "O&b",
1287 PyMac_GetFSSpec
, &spec
,
1290 _rv
= FSpOpenOrphanResFile(&spec
,
1294 OSErr _err
= ResError();
1295 if (_err
!= noErr
) return PyMac_Error(_err
);
1297 _res
= Py_BuildValue("hh",
1304 #if TARGET_API_MAC_CARBON
1306 static PyObject
*Res_GetTopResourceFile(PyObject
*_self
, PyObject
*_args
)
1308 PyObject
*_res
= NULL
;
1311 if (!PyArg_ParseTuple(_args
, ""))
1313 _rv
= GetTopResourceFile(&refNum
);
1315 OSErr _err
= ResError();
1316 if (_err
!= noErr
) return PyMac_Error(_err
);
1318 _res
= Py_BuildValue("hh",
1325 #if TARGET_API_MAC_CARBON
1327 static PyObject
*Res_GetNextResourceFile(PyObject
*_self
, PyObject
*_args
)
1329 PyObject
*_res
= NULL
;
1333 if (!PyArg_ParseTuple(_args
, "h",
1336 _rv
= GetNextResourceFile(curRefNum
,
1339 OSErr _err
= ResError();
1340 if (_err
!= noErr
) return PyMac_Error(_err
);
1342 _res
= Py_BuildValue("hh",
1349 static PyObject
*Res_Resource(PyObject
*_self
, PyObject
*_args
)
1351 PyObject
*_res
= NULL
;
1357 if (!PyArg_ParseTuple(_args
, "s#", &buf
, &len
))
1365 memcpy(*h
, buf
, len
);
1367 return ResObj_New(h
);
1371 static PyObject
*Res_Handle(PyObject
*_self
, PyObject
*_args
)
1373 PyObject
*_res
= NULL
;
1380 if (!PyArg_ParseTuple(_args
, "s#", &buf
, &len
))
1388 memcpy(*h
, buf
, len
);
1390 rv
= (ResourceObject
*)ResObj_New(h
);
1391 rv
->ob_freeit
= PyMac_AutoDisposeHandle
;
1392 return (PyObject
*)rv
;
1396 static PyMethodDef Res_methods
[] = {
1398 #if TARGET_API_MAC_OS8
1399 {"InitResources", (PyCFunction
)Res_InitResources
, 1,
1400 "() -> (short _rv)"},
1403 #if TARGET_API_MAC_OS8
1404 {"RsrcZoneInit", (PyCFunction
)Res_RsrcZoneInit
, 1,
1407 {"CloseResFile", (PyCFunction
)Res_CloseResFile
, 1,
1408 "(short refNum) -> None"},
1409 {"ResError", (PyCFunction
)Res_ResError
, 1,
1410 "() -> (OSErr _rv)"},
1411 {"CurResFile", (PyCFunction
)Res_CurResFile
, 1,
1412 "() -> (short _rv)"},
1414 #if TARGET_API_MAC_OS8
1415 {"CreateResFile", (PyCFunction
)Res_CreateResFile
, 1,
1416 "(Str255 fileName) -> None"},
1419 #if TARGET_API_MAC_OS8
1420 {"OpenResFile", (PyCFunction
)Res_OpenResFile
, 1,
1421 "(Str255 fileName) -> (short _rv)"},
1423 {"UseResFile", (PyCFunction
)Res_UseResFile
, 1,
1424 "(short refNum) -> None"},
1425 {"CountTypes", (PyCFunction
)Res_CountTypes
, 1,
1426 "() -> (short _rv)"},
1427 {"Count1Types", (PyCFunction
)Res_Count1Types
, 1,
1428 "() -> (short _rv)"},
1429 {"GetIndType", (PyCFunction
)Res_GetIndType
, 1,
1430 "(short index) -> (ResType theType)"},
1431 {"Get1IndType", (PyCFunction
)Res_Get1IndType
, 1,
1432 "(short index) -> (ResType theType)"},
1433 {"SetResLoad", (PyCFunction
)Res_SetResLoad
, 1,
1434 "(Boolean load) -> None"},
1435 {"CountResources", (PyCFunction
)Res_CountResources
, 1,
1436 "(ResType theType) -> (short _rv)"},
1437 {"Count1Resources", (PyCFunction
)Res_Count1Resources
, 1,
1438 "(ResType theType) -> (short _rv)"},
1439 {"GetIndResource", (PyCFunction
)Res_GetIndResource
, 1,
1440 "(ResType theType, short index) -> (Handle _rv)"},
1441 {"Get1IndResource", (PyCFunction
)Res_Get1IndResource
, 1,
1442 "(ResType theType, short index) -> (Handle _rv)"},
1443 {"GetResource", (PyCFunction
)Res_GetResource
, 1,
1444 "(ResType theType, short theID) -> (Handle _rv)"},
1445 {"Get1Resource", (PyCFunction
)Res_Get1Resource
, 1,
1446 "(ResType theType, short theID) -> (Handle _rv)"},
1447 {"GetNamedResource", (PyCFunction
)Res_GetNamedResource
, 1,
1448 "(ResType theType, Str255 name) -> (Handle _rv)"},
1449 {"Get1NamedResource", (PyCFunction
)Res_Get1NamedResource
, 1,
1450 "(ResType theType, Str255 name) -> (Handle _rv)"},
1451 {"UniqueID", (PyCFunction
)Res_UniqueID
, 1,
1452 "(ResType theType) -> (short _rv)"},
1453 {"Unique1ID", (PyCFunction
)Res_Unique1ID
, 1,
1454 "(ResType theType) -> (short _rv)"},
1455 {"UpdateResFile", (PyCFunction
)Res_UpdateResFile
, 1,
1456 "(short refNum) -> None"},
1457 {"SetResPurge", (PyCFunction
)Res_SetResPurge
, 1,
1458 "(Boolean install) -> None"},
1459 {"GetResFileAttrs", (PyCFunction
)Res_GetResFileAttrs
, 1,
1460 "(short refNum) -> (short _rv)"},
1461 {"SetResFileAttrs", (PyCFunction
)Res_SetResFileAttrs
, 1,
1462 "(short refNum, short attrs) -> None"},
1463 {"OpenRFPerm", (PyCFunction
)Res_OpenRFPerm
, 1,
1464 "(Str255 fileName, short vRefNum, SignedByte permission) -> (short _rv)"},
1466 #if TARGET_API_MAC_OS8
1467 {"RGetResource", (PyCFunction
)Res_RGetResource
, 1,
1468 "(ResType theType, short theID) -> (Handle _rv)"},
1470 {"HOpenResFile", (PyCFunction
)Res_HOpenResFile
, 1,
1471 "(short vRefNum, long dirID, Str255 fileName, SignedByte permission) -> (short _rv)"},
1472 {"HCreateResFile", (PyCFunction
)Res_HCreateResFile
, 1,
1473 "(short vRefNum, long dirID, Str255 fileName) -> None"},
1474 {"FSpOpenResFile", (PyCFunction
)Res_FSpOpenResFile
, 1,
1475 "(FSSpec spec, SignedByte permission) -> (short _rv)"},
1476 {"FSpCreateResFile", (PyCFunction
)Res_FSpCreateResFile
, 1,
1477 "(FSSpec spec, OSType creator, OSType fileType, ScriptCode scriptTag) -> None"},
1479 #if TARGET_API_MAC_CARBON
1480 {"InsertResourceFile", (PyCFunction
)Res_InsertResourceFile
, 1,
1481 "(SInt16 refNum, RsrcChainLocation where) -> (OSErr _rv)"},
1484 #if TARGET_API_MAC_CARBON
1485 {"DetachResourceFile", (PyCFunction
)Res_DetachResourceFile
, 1,
1486 "(SInt16 refNum) -> (OSErr _rv)"},
1489 #if TARGET_API_MAC_CARBON
1490 {"FSpResourceFileAlreadyOpen", (PyCFunction
)Res_FSpResourceFileAlreadyOpen
, 1,
1491 "(FSSpec resourceFile) -> (Boolean _rv, Boolean inChain, SInt16 refNum)"},
1494 #if TARGET_API_MAC_CARBON
1495 {"FSpOpenOrphanResFile", (PyCFunction
)Res_FSpOpenOrphanResFile
, 1,
1496 "(FSSpec spec, SignedByte permission) -> (OSErr _rv, SInt16 refNum)"},
1499 #if TARGET_API_MAC_CARBON
1500 {"GetTopResourceFile", (PyCFunction
)Res_GetTopResourceFile
, 1,
1501 "() -> (OSErr _rv, SInt16 refNum)"},
1504 #if TARGET_API_MAC_CARBON
1505 {"GetNextResourceFile", (PyCFunction
)Res_GetNextResourceFile
, 1,
1506 "(SInt16 curRefNum) -> (OSErr _rv, SInt16 nextRefNum)"},
1508 {"Resource", (PyCFunction
)Res_Resource
, 1,
1509 "Convert a string to a resource object.\n\nThe created resource object is actually just a handle,\napply AddResource() to write it to a resource file.\nSee also the Handle() docstring.\n"},
1510 {"Handle", (PyCFunction
)Res_Handle
, 1,
1511 "Convert a string to a Handle object.\n\nResource() and Handle() are very similar, but objects created with Handle() are\nby default automatically DisposeHandle()d upon object cleanup. Use AutoDispose()\nto change this.\n"},
1518 /* Alternative version of ResObj_New, which returns None for null argument */
1519 PyObject
*OptResObj_New(Handle itself
)
1521 if (itself
== NULL
) {
1525 return ResObj_New(itself
);
1528 OptResObj_Convert(PyObject
*v
, Handle
*p_itself
)
1532 if ( v
== Py_None
) {
1536 if (ResObj_Check(v
))
1538 *p_itself
= ((ResourceObject
*)v
)->ob_itself
;
1541 /* If it isn't a resource yet see whether it is convertible */
1542 if ( (tmp
=PyObject_CallMethod(v
, "as_Resource", "")) ) {
1543 *p_itself
= ((ResourceObject
*)tmp
)->ob_itself
;
1548 PyErr_SetString(PyExc_TypeError
, "Resource required");
1560 PyMac_INIT_TOOLBOX_OBJECT_NEW(Handle
, ResObj_New
);
1561 PyMac_INIT_TOOLBOX_OBJECT_CONVERT(Handle
, ResObj_Convert
);
1562 PyMac_INIT_TOOLBOX_OBJECT_NEW(Handle
, OptResObj_New
);
1563 PyMac_INIT_TOOLBOX_OBJECT_CONVERT(Handle
, OptResObj_Convert
);
1566 m
= Py_InitModule("Res", Res_methods
);
1567 d
= PyModule_GetDict(m
);
1568 Res_Error
= PyMac_GetOSErrException();
1569 if (Res_Error
== NULL
||
1570 PyDict_SetItemString(d
, "Error", Res_Error
) != 0)
1572 Resource_Type
.ob_type
= &PyType_Type
;
1573 Py_INCREF(&Resource_Type
);
1574 if (PyDict_SetItemString(d
, "ResourceType", (PyObject
*)&Resource_Type
) != 0)
1575 Py_FatalError("can't initialize ResourceType");
1578 /* ========================= End module Res ========================= */