Another batch of updates...
[python/dscho.git] / Mac / Modules / res / Resmodule.c
blobdd5d75ac5ad1cdb667553b21631350dacd69a6c9
2 /* =========================== Module Res =========================== */
4 #include "Python.h"
8 #define SystemSevenOrLater 1
10 #include "macglue.h"
11 #include <Memory.h>
12 #include <Dialogs.h>
13 #include <Menus.h>
14 #include <Controls.h>
16 extern PyObject *ResObj_New(Handle);
17 extern int ResObj_Convert(PyObject *, Handle *);
18 extern PyObject *OptResObj_New(Handle);
19 extern int OptResObj_Convert(PyObject *, Handle *);
21 extern PyObject *WinObj_New(WindowPtr);
22 extern int WinObj_Convert(PyObject *, WindowPtr *);
23 extern PyTypeObject Window_Type;
24 #define WinObj_Check(x) ((x)->ob_type == &Window_Type)
26 extern PyObject *DlgObj_New(DialogPtr);
27 extern int DlgObj_Convert(PyObject *, DialogPtr *);
28 extern PyTypeObject Dialog_Type;
29 #define DlgObj_Check(x) ((x)->ob_type == &Dialog_Type)
31 extern PyObject *MenuObj_New(MenuHandle);
32 extern int MenuObj_Convert(PyObject *, MenuHandle *);
34 extern PyObject *CtlObj_New(ControlHandle);
35 extern int CtlObj_Convert(PyObject *, ControlHandle *);
37 extern PyObject *GrafObj_New(GrafPtr);
38 extern int GrafObj_Convert(PyObject *, GrafPtr *);
40 extern PyObject *BMObj_New(BitMapPtr);
41 extern int BMObj_Convert(PyObject *, BitMapPtr *);
43 extern PyObject *WinObj_WhichWindow(WindowPtr);
45 #include <Resources.h>
47 #define resNotFound -192 /* Can't include <Errors.h> because of Python's "errors.h" */
49 static PyObject *Res_Error;
51 /* ---------------------- Object type Resource ---------------------- */
53 PyTypeObject Resource_Type;
55 #define ResObj_Check(x) ((x)->ob_type == &Resource_Type)
57 typedef struct ResourceObject {
58 PyObject_HEAD
59 Handle ob_itself;
60 } ResourceObject;
62 PyObject *ResObj_New(itself)
63 Handle itself;
65 ResourceObject *it;
66 if (itself == NULL) return PyMac_Error(resNotFound);
67 it = PyObject_NEW(ResourceObject, &Resource_Type);
68 if (it == NULL) return NULL;
69 it->ob_itself = itself;
70 return (PyObject *)it;
72 ResObj_Convert(v, p_itself)
73 PyObject *v;
74 Handle *p_itself;
76 if (!ResObj_Check(v))
78 PyErr_SetString(PyExc_TypeError, "Resource required");
79 return 0;
81 *p_itself = ((ResourceObject *)v)->ob_itself;
82 return 1;
85 static void ResObj_dealloc(self)
86 ResourceObject *self;
88 /* Cleanup of self->ob_itself goes here */
89 PyMem_DEL(self);
92 static PyObject *ResObj_HomeResFile(_self, _args)
93 ResourceObject *_self;
94 PyObject *_args;
96 PyObject *_res = NULL;
97 short _rv;
98 if (!PyArg_ParseTuple(_args, ""))
99 return NULL;
100 _rv = HomeResFile(_self->ob_itself);
102 OSErr _err = ResError();
103 if (_err != noErr) return PyMac_Error(_err);
105 _res = Py_BuildValue("h",
106 _rv);
107 return _res;
110 static PyObject *ResObj_LoadResource(_self, _args)
111 ResourceObject *_self;
112 PyObject *_args;
114 PyObject *_res = NULL;
115 if (!PyArg_ParseTuple(_args, ""))
116 return NULL;
117 LoadResource(_self->ob_itself);
119 OSErr _err = ResError();
120 if (_err != noErr) return PyMac_Error(_err);
122 Py_INCREF(Py_None);
123 _res = Py_None;
124 return _res;
127 static PyObject *ResObj_ReleaseResource(_self, _args)
128 ResourceObject *_self;
129 PyObject *_args;
131 PyObject *_res = NULL;
132 if (!PyArg_ParseTuple(_args, ""))
133 return NULL;
134 ReleaseResource(_self->ob_itself);
136 OSErr _err = ResError();
137 if (_err != noErr) return PyMac_Error(_err);
139 Py_INCREF(Py_None);
140 _res = Py_None;
141 return _res;
144 static PyObject *ResObj_DetachResource(_self, _args)
145 ResourceObject *_self;
146 PyObject *_args;
148 PyObject *_res = NULL;
149 if (!PyArg_ParseTuple(_args, ""))
150 return NULL;
151 DetachResource(_self->ob_itself);
153 OSErr _err = ResError();
154 if (_err != noErr) return PyMac_Error(_err);
156 Py_INCREF(Py_None);
157 _res = Py_None;
158 return _res;
161 static PyObject *ResObj_GetResAttrs(_self, _args)
162 ResourceObject *_self;
163 PyObject *_args;
165 PyObject *_res = NULL;
166 short _rv;
167 if (!PyArg_ParseTuple(_args, ""))
168 return NULL;
169 _rv = GetResAttrs(_self->ob_itself);
171 OSErr _err = ResError();
172 if (_err != noErr) return PyMac_Error(_err);
174 _res = Py_BuildValue("h",
175 _rv);
176 return _res;
179 static PyObject *ResObj_GetResInfo(_self, _args)
180 ResourceObject *_self;
181 PyObject *_args;
183 PyObject *_res = NULL;
184 short theID;
185 ResType theType;
186 Str255 name;
187 if (!PyArg_ParseTuple(_args, ""))
188 return NULL;
189 GetResInfo(_self->ob_itself,
190 &theID,
191 &theType,
192 name);
194 OSErr _err = ResError();
195 if (_err != noErr) return PyMac_Error(_err);
197 _res = Py_BuildValue("hO&O&",
198 theID,
199 PyMac_BuildOSType, theType,
200 PyMac_BuildStr255, name);
201 return _res;
204 static PyObject *ResObj_SetResInfo(_self, _args)
205 ResourceObject *_self;
206 PyObject *_args;
208 PyObject *_res = NULL;
209 short theID;
210 Str255 name;
211 if (!PyArg_ParseTuple(_args, "hO&",
212 &theID,
213 PyMac_GetStr255, name))
214 return NULL;
215 SetResInfo(_self->ob_itself,
216 theID,
217 name);
219 OSErr _err = ResError();
220 if (_err != noErr) return PyMac_Error(_err);
222 Py_INCREF(Py_None);
223 _res = Py_None;
224 return _res;
227 static PyObject *ResObj_AddResource(_self, _args)
228 ResourceObject *_self;
229 PyObject *_args;
231 PyObject *_res = NULL;
232 ResType theType;
233 short theID;
234 Str255 name;
235 if (!PyArg_ParseTuple(_args, "O&hO&",
236 PyMac_GetOSType, &theType,
237 &theID,
238 PyMac_GetStr255, name))
239 return NULL;
240 AddResource(_self->ob_itself,
241 theType,
242 theID,
243 name);
245 OSErr _err = ResError();
246 if (_err != noErr) return PyMac_Error(_err);
248 Py_INCREF(Py_None);
249 _res = Py_None;
250 return _res;
253 static PyObject *ResObj_GetResourceSizeOnDisk(_self, _args)
254 ResourceObject *_self;
255 PyObject *_args;
257 PyObject *_res = NULL;
258 long _rv;
259 if (!PyArg_ParseTuple(_args, ""))
260 return NULL;
261 _rv = GetResourceSizeOnDisk(_self->ob_itself);
263 OSErr _err = ResError();
264 if (_err != noErr) return PyMac_Error(_err);
266 _res = Py_BuildValue("l",
267 _rv);
268 return _res;
271 static PyObject *ResObj_GetMaxResourceSize(_self, _args)
272 ResourceObject *_self;
273 PyObject *_args;
275 PyObject *_res = NULL;
276 long _rv;
277 if (!PyArg_ParseTuple(_args, ""))
278 return NULL;
279 _rv = GetMaxResourceSize(_self->ob_itself);
281 OSErr _err = ResError();
282 if (_err != noErr) return PyMac_Error(_err);
284 _res = Py_BuildValue("l",
285 _rv);
286 return _res;
289 static PyObject *ResObj_RsrcMapEntry(_self, _args)
290 ResourceObject *_self;
291 PyObject *_args;
293 PyObject *_res = NULL;
294 long _rv;
295 if (!PyArg_ParseTuple(_args, ""))
296 return NULL;
297 _rv = RsrcMapEntry(_self->ob_itself);
299 OSErr _err = ResError();
300 if (_err != noErr) return PyMac_Error(_err);
302 _res = Py_BuildValue("l",
303 _rv);
304 return _res;
307 static PyObject *ResObj_SetResAttrs(_self, _args)
308 ResourceObject *_self;
309 PyObject *_args;
311 PyObject *_res = NULL;
312 short attrs;
313 if (!PyArg_ParseTuple(_args, "h",
314 &attrs))
315 return NULL;
316 SetResAttrs(_self->ob_itself,
317 attrs);
319 OSErr _err = ResError();
320 if (_err != noErr) return PyMac_Error(_err);
322 Py_INCREF(Py_None);
323 _res = Py_None;
324 return _res;
327 static PyObject *ResObj_ChangedResource(_self, _args)
328 ResourceObject *_self;
329 PyObject *_args;
331 PyObject *_res = NULL;
332 if (!PyArg_ParseTuple(_args, ""))
333 return NULL;
334 ChangedResource(_self->ob_itself);
336 OSErr _err = ResError();
337 if (_err != noErr) return PyMac_Error(_err);
339 Py_INCREF(Py_None);
340 _res = Py_None;
341 return _res;
344 static PyObject *ResObj_RemoveResource(_self, _args)
345 ResourceObject *_self;
346 PyObject *_args;
348 PyObject *_res = NULL;
349 if (!PyArg_ParseTuple(_args, ""))
350 return NULL;
351 RemoveResource(_self->ob_itself);
353 OSErr _err = ResError();
354 if (_err != noErr) return PyMac_Error(_err);
356 Py_INCREF(Py_None);
357 _res = Py_None;
358 return _res;
361 static PyObject *ResObj_WriteResource(_self, _args)
362 ResourceObject *_self;
363 PyObject *_args;
365 PyObject *_res = NULL;
366 if (!PyArg_ParseTuple(_args, ""))
367 return NULL;
368 WriteResource(_self->ob_itself);
370 OSErr _err = ResError();
371 if (_err != noErr) return PyMac_Error(_err);
373 Py_INCREF(Py_None);
374 _res = Py_None;
375 return _res;
378 static PyObject *ResObj_SetResourceSize(_self, _args)
379 ResourceObject *_self;
380 PyObject *_args;
382 PyObject *_res = NULL;
383 long newSize;
384 if (!PyArg_ParseTuple(_args, "l",
385 &newSize))
386 return NULL;
387 SetResourceSize(_self->ob_itself,
388 newSize);
390 OSErr _err = ResError();
391 if (_err != noErr) return PyMac_Error(_err);
393 Py_INCREF(Py_None);
394 _res = Py_None;
395 return _res;
398 static PyObject *ResObj_GetNextFOND(_self, _args)
399 ResourceObject *_self;
400 PyObject *_args;
402 PyObject *_res = NULL;
403 Handle _rv;
404 if (!PyArg_ParseTuple(_args, ""))
405 return NULL;
406 _rv = GetNextFOND(_self->ob_itself);
408 OSErr _err = ResError();
409 if (_err != noErr) return PyMac_Error(_err);
411 _res = Py_BuildValue("O&",
412 ResObj_New, _rv);
413 return _res;
416 static PyObject *ResObj_as_Control(_self, _args)
417 ResourceObject *_self;
418 PyObject *_args;
420 PyObject *_res = NULL;
422 return CtlObj_New((ControlHandle)_self->ob_itself);
426 static PyObject *ResObj_as_Menu(_self, _args)
427 ResourceObject *_self;
428 PyObject *_args;
430 PyObject *_res = NULL;
432 return MenuObj_New((MenuHandle)_self->ob_itself);
436 static PyMethodDef ResObj_methods[] = {
437 {"HomeResFile", (PyCFunction)ResObj_HomeResFile, 1,
438 "() -> (short _rv)"},
439 {"LoadResource", (PyCFunction)ResObj_LoadResource, 1,
440 "() -> None"},
441 {"ReleaseResource", (PyCFunction)ResObj_ReleaseResource, 1,
442 "() -> None"},
443 {"DetachResource", (PyCFunction)ResObj_DetachResource, 1,
444 "() -> None"},
445 {"GetResAttrs", (PyCFunction)ResObj_GetResAttrs, 1,
446 "() -> (short _rv)"},
447 {"GetResInfo", (PyCFunction)ResObj_GetResInfo, 1,
448 "() -> (short theID, ResType theType, Str255 name)"},
449 {"SetResInfo", (PyCFunction)ResObj_SetResInfo, 1,
450 "(short theID, Str255 name) -> None"},
451 {"AddResource", (PyCFunction)ResObj_AddResource, 1,
452 "(ResType theType, short theID, Str255 name) -> None"},
453 {"GetResourceSizeOnDisk", (PyCFunction)ResObj_GetResourceSizeOnDisk, 1,
454 "() -> (long _rv)"},
455 {"GetMaxResourceSize", (PyCFunction)ResObj_GetMaxResourceSize, 1,
456 "() -> (long _rv)"},
457 {"RsrcMapEntry", (PyCFunction)ResObj_RsrcMapEntry, 1,
458 "() -> (long _rv)"},
459 {"SetResAttrs", (PyCFunction)ResObj_SetResAttrs, 1,
460 "(short attrs) -> None"},
461 {"ChangedResource", (PyCFunction)ResObj_ChangedResource, 1,
462 "() -> None"},
463 {"RemoveResource", (PyCFunction)ResObj_RemoveResource, 1,
464 "() -> None"},
465 {"WriteResource", (PyCFunction)ResObj_WriteResource, 1,
466 "() -> None"},
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 {NULL, NULL, 0}
478 PyMethodChain ResObj_chain = { ResObj_methods, NULL };
480 static PyObject *ResObj_getattr(self, name)
481 ResourceObject *self;
482 char *name;
485 if (strcmp(name, "size") == 0)
486 return PyInt_FromLong(GetHandleSize(self->ob_itself));
487 if (strcmp(name, "data") == 0) {
488 PyObject *res;
489 char state;
490 state = HGetState(self->ob_itself);
491 HLock(self->ob_itself);
492 res = PyString_FromStringAndSize(
493 *self->ob_itself,
494 GetHandleSize(self->ob_itself));
495 HUnlock(self->ob_itself);
496 HSetState(self->ob_itself, state);
497 return res;
499 if (strcmp(name, "__members__") == 0)
500 return Py_BuildValue("[ss]", "data", "size");
502 return Py_FindMethodInChain(&ResObj_chain, (PyObject *)self, name);
505 static int
506 ResObj_setattr(self, name, value)
507 ResourceObject *self;
508 char *name;
509 PyObject *value;
511 char *data;
512 long size;
514 if (strcmp(name, "data") != 0 || value == NULL )
515 return -1;
516 if ( !PyString_Check(value) )
517 return -1;
518 size = PyString_Size(value);
519 data = PyString_AsString(value);
520 /* XXXX Do I need the GetState/SetState calls? */
521 SetHandleSize(self->ob_itself, size);
522 if ( MemError())
523 return -1;
524 HLock(self->ob_itself);
525 memcpy((char *)*self->ob_itself, data, size);
526 HUnlock(self->ob_itself);
527 /* XXXX Should I do the Changed call immedeately? */
528 return 0;
532 PyTypeObject Resource_Type = {
533 PyObject_HEAD_INIT(&PyType_Type)
534 0, /*ob_size*/
535 "Resource", /*tp_name*/
536 sizeof(ResourceObject), /*tp_basicsize*/
537 0, /*tp_itemsize*/
538 /* methods */
539 (destructor) ResObj_dealloc, /*tp_dealloc*/
540 0, /*tp_print*/
541 (getattrfunc) ResObj_getattr, /*tp_getattr*/
542 (setattrfunc) ResObj_setattr, /*tp_setattr*/
545 /* -------------------- End object type Resource -------------------- */
548 static PyObject *Res_InitResources(_self, _args)
549 PyObject *_self;
550 PyObject *_args;
552 PyObject *_res = NULL;
553 short _rv;
554 if (!PyArg_ParseTuple(_args, ""))
555 return NULL;
556 _rv = InitResources();
558 OSErr _err = ResError();
559 if (_err != noErr) return PyMac_Error(_err);
561 _res = Py_BuildValue("h",
562 _rv);
563 return _res;
566 static PyObject *Res_RsrcZoneInit(_self, _args)
567 PyObject *_self;
568 PyObject *_args;
570 PyObject *_res = NULL;
571 if (!PyArg_ParseTuple(_args, ""))
572 return NULL;
573 RsrcZoneInit();
575 OSErr _err = ResError();
576 if (_err != noErr) return PyMac_Error(_err);
578 Py_INCREF(Py_None);
579 _res = Py_None;
580 return _res;
583 static PyObject *Res_CloseResFile(_self, _args)
584 PyObject *_self;
585 PyObject *_args;
587 PyObject *_res = NULL;
588 short refNum;
589 if (!PyArg_ParseTuple(_args, "h",
590 &refNum))
591 return NULL;
592 CloseResFile(refNum);
594 OSErr _err = ResError();
595 if (_err != noErr) return PyMac_Error(_err);
597 Py_INCREF(Py_None);
598 _res = Py_None;
599 return _res;
602 static PyObject *Res_ResError(_self, _args)
603 PyObject *_self;
604 PyObject *_args;
606 PyObject *_res = NULL;
607 short _rv;
608 if (!PyArg_ParseTuple(_args, ""))
609 return NULL;
610 _rv = ResError();
612 OSErr _err = ResError();
613 if (_err != noErr) return PyMac_Error(_err);
615 _res = Py_BuildValue("h",
616 _rv);
617 return _res;
620 static PyObject *Res_CurResFile(_self, _args)
621 PyObject *_self;
622 PyObject *_args;
624 PyObject *_res = NULL;
625 short _rv;
626 if (!PyArg_ParseTuple(_args, ""))
627 return NULL;
628 _rv = CurResFile();
630 OSErr _err = ResError();
631 if (_err != noErr) return PyMac_Error(_err);
633 _res = Py_BuildValue("h",
634 _rv);
635 return _res;
638 static PyObject *Res_CreateResFile(_self, _args)
639 PyObject *_self;
640 PyObject *_args;
642 PyObject *_res = NULL;
643 Str255 fileName;
644 if (!PyArg_ParseTuple(_args, "O&",
645 PyMac_GetStr255, fileName))
646 return NULL;
647 CreateResFile(fileName);
649 OSErr _err = ResError();
650 if (_err != noErr) return PyMac_Error(_err);
652 Py_INCREF(Py_None);
653 _res = Py_None;
654 return _res;
657 static PyObject *Res_OpenResFile(_self, _args)
658 PyObject *_self;
659 PyObject *_args;
661 PyObject *_res = NULL;
662 short _rv;
663 Str255 fileName;
664 if (!PyArg_ParseTuple(_args, "O&",
665 PyMac_GetStr255, fileName))
666 return NULL;
667 _rv = OpenResFile(fileName);
669 OSErr _err = ResError();
670 if (_err != noErr) return PyMac_Error(_err);
672 _res = Py_BuildValue("h",
673 _rv);
674 return _res;
677 static PyObject *Res_UseResFile(_self, _args)
678 PyObject *_self;
679 PyObject *_args;
681 PyObject *_res = NULL;
682 short refNum;
683 if (!PyArg_ParseTuple(_args, "h",
684 &refNum))
685 return NULL;
686 UseResFile(refNum);
688 OSErr _err = ResError();
689 if (_err != noErr) return PyMac_Error(_err);
691 Py_INCREF(Py_None);
692 _res = Py_None;
693 return _res;
696 static PyObject *Res_CountTypes(_self, _args)
697 PyObject *_self;
698 PyObject *_args;
700 PyObject *_res = NULL;
701 short _rv;
702 if (!PyArg_ParseTuple(_args, ""))
703 return NULL;
704 _rv = CountTypes();
706 OSErr _err = ResError();
707 if (_err != noErr) return PyMac_Error(_err);
709 _res = Py_BuildValue("h",
710 _rv);
711 return _res;
714 static PyObject *Res_Count1Types(_self, _args)
715 PyObject *_self;
716 PyObject *_args;
718 PyObject *_res = NULL;
719 short _rv;
720 if (!PyArg_ParseTuple(_args, ""))
721 return NULL;
722 _rv = Count1Types();
724 OSErr _err = ResError();
725 if (_err != noErr) return PyMac_Error(_err);
727 _res = Py_BuildValue("h",
728 _rv);
729 return _res;
732 static PyObject *Res_GetIndType(_self, _args)
733 PyObject *_self;
734 PyObject *_args;
736 PyObject *_res = NULL;
737 ResType theType;
738 short index;
739 if (!PyArg_ParseTuple(_args, "h",
740 &index))
741 return NULL;
742 GetIndType(&theType,
743 index);
745 OSErr _err = ResError();
746 if (_err != noErr) return PyMac_Error(_err);
748 _res = Py_BuildValue("O&",
749 PyMac_BuildOSType, theType);
750 return _res;
753 static PyObject *Res_Get1IndType(_self, _args)
754 PyObject *_self;
755 PyObject *_args;
757 PyObject *_res = NULL;
758 ResType theType;
759 short index;
760 if (!PyArg_ParseTuple(_args, "h",
761 &index))
762 return NULL;
763 Get1IndType(&theType,
764 index);
766 OSErr _err = ResError();
767 if (_err != noErr) return PyMac_Error(_err);
769 _res = Py_BuildValue("O&",
770 PyMac_BuildOSType, theType);
771 return _res;
774 static PyObject *Res_SetResLoad(_self, _args)
775 PyObject *_self;
776 PyObject *_args;
778 PyObject *_res = NULL;
779 Boolean load;
780 if (!PyArg_ParseTuple(_args, "b",
781 &load))
782 return NULL;
783 SetResLoad(load);
785 OSErr _err = ResError();
786 if (_err != noErr) return PyMac_Error(_err);
788 Py_INCREF(Py_None);
789 _res = Py_None;
790 return _res;
793 static PyObject *Res_CountResources(_self, _args)
794 PyObject *_self;
795 PyObject *_args;
797 PyObject *_res = NULL;
798 short _rv;
799 ResType theType;
800 if (!PyArg_ParseTuple(_args, "O&",
801 PyMac_GetOSType, &theType))
802 return NULL;
803 _rv = CountResources(theType);
805 OSErr _err = ResError();
806 if (_err != noErr) return PyMac_Error(_err);
808 _res = Py_BuildValue("h",
809 _rv);
810 return _res;
813 static PyObject *Res_Count1Resources(_self, _args)
814 PyObject *_self;
815 PyObject *_args;
817 PyObject *_res = NULL;
818 short _rv;
819 ResType theType;
820 if (!PyArg_ParseTuple(_args, "O&",
821 PyMac_GetOSType, &theType))
822 return NULL;
823 _rv = Count1Resources(theType);
825 OSErr _err = ResError();
826 if (_err != noErr) return PyMac_Error(_err);
828 _res = Py_BuildValue("h",
829 _rv);
830 return _res;
833 static PyObject *Res_GetIndResource(_self, _args)
834 PyObject *_self;
835 PyObject *_args;
837 PyObject *_res = NULL;
838 Handle _rv;
839 ResType theType;
840 short index;
841 if (!PyArg_ParseTuple(_args, "O&h",
842 PyMac_GetOSType, &theType,
843 &index))
844 return NULL;
845 _rv = GetIndResource(theType,
846 index);
848 OSErr _err = ResError();
849 if (_err != noErr) return PyMac_Error(_err);
851 _res = Py_BuildValue("O&",
852 ResObj_New, _rv);
853 return _res;
856 static PyObject *Res_Get1IndResource(_self, _args)
857 PyObject *_self;
858 PyObject *_args;
860 PyObject *_res = NULL;
861 Handle _rv;
862 ResType theType;
863 short index;
864 if (!PyArg_ParseTuple(_args, "O&h",
865 PyMac_GetOSType, &theType,
866 &index))
867 return NULL;
868 _rv = Get1IndResource(theType,
869 index);
871 OSErr _err = ResError();
872 if (_err != noErr) return PyMac_Error(_err);
874 _res = Py_BuildValue("O&",
875 ResObj_New, _rv);
876 return _res;
879 static PyObject *Res_GetResource(_self, _args)
880 PyObject *_self;
881 PyObject *_args;
883 PyObject *_res = NULL;
884 Handle _rv;
885 ResType theType;
886 short theID;
887 if (!PyArg_ParseTuple(_args, "O&h",
888 PyMac_GetOSType, &theType,
889 &theID))
890 return NULL;
891 _rv = GetResource(theType,
892 theID);
894 OSErr _err = ResError();
895 if (_err != noErr) return PyMac_Error(_err);
897 _res = Py_BuildValue("O&",
898 ResObj_New, _rv);
899 return _res;
902 static PyObject *Res_Get1Resource(_self, _args)
903 PyObject *_self;
904 PyObject *_args;
906 PyObject *_res = NULL;
907 Handle _rv;
908 ResType theType;
909 short theID;
910 if (!PyArg_ParseTuple(_args, "O&h",
911 PyMac_GetOSType, &theType,
912 &theID))
913 return NULL;
914 _rv = Get1Resource(theType,
915 theID);
917 OSErr _err = ResError();
918 if (_err != noErr) return PyMac_Error(_err);
920 _res = Py_BuildValue("O&",
921 ResObj_New, _rv);
922 return _res;
925 static PyObject *Res_GetNamedResource(_self, _args)
926 PyObject *_self;
927 PyObject *_args;
929 PyObject *_res = NULL;
930 Handle _rv;
931 ResType theType;
932 Str255 name;
933 if (!PyArg_ParseTuple(_args, "O&O&",
934 PyMac_GetOSType, &theType,
935 PyMac_GetStr255, name))
936 return NULL;
937 _rv = GetNamedResource(theType,
938 name);
940 OSErr _err = ResError();
941 if (_err != noErr) return PyMac_Error(_err);
943 _res = Py_BuildValue("O&",
944 ResObj_New, _rv);
945 return _res;
948 static PyObject *Res_Get1NamedResource(_self, _args)
949 PyObject *_self;
950 PyObject *_args;
952 PyObject *_res = NULL;
953 Handle _rv;
954 ResType theType;
955 Str255 name;
956 if (!PyArg_ParseTuple(_args, "O&O&",
957 PyMac_GetOSType, &theType,
958 PyMac_GetStr255, name))
959 return NULL;
960 _rv = Get1NamedResource(theType,
961 name);
963 OSErr _err = ResError();
964 if (_err != noErr) return PyMac_Error(_err);
966 _res = Py_BuildValue("O&",
967 ResObj_New, _rv);
968 return _res;
971 static PyObject *Res_UniqueID(_self, _args)
972 PyObject *_self;
973 PyObject *_args;
975 PyObject *_res = NULL;
976 short _rv;
977 ResType theType;
978 if (!PyArg_ParseTuple(_args, "O&",
979 PyMac_GetOSType, &theType))
980 return NULL;
981 _rv = UniqueID(theType);
983 OSErr _err = ResError();
984 if (_err != noErr) return PyMac_Error(_err);
986 _res = Py_BuildValue("h",
987 _rv);
988 return _res;
991 static PyObject *Res_Unique1ID(_self, _args)
992 PyObject *_self;
993 PyObject *_args;
995 PyObject *_res = NULL;
996 short _rv;
997 ResType theType;
998 if (!PyArg_ParseTuple(_args, "O&",
999 PyMac_GetOSType, &theType))
1000 return NULL;
1001 _rv = Unique1ID(theType);
1003 OSErr _err = ResError();
1004 if (_err != noErr) return PyMac_Error(_err);
1006 _res = Py_BuildValue("h",
1007 _rv);
1008 return _res;
1011 static PyObject *Res_UpdateResFile(_self, _args)
1012 PyObject *_self;
1013 PyObject *_args;
1015 PyObject *_res = NULL;
1016 short refNum;
1017 if (!PyArg_ParseTuple(_args, "h",
1018 &refNum))
1019 return NULL;
1020 UpdateResFile(refNum);
1022 OSErr _err = ResError();
1023 if (_err != noErr) return PyMac_Error(_err);
1025 Py_INCREF(Py_None);
1026 _res = Py_None;
1027 return _res;
1030 static PyObject *Res_SetResPurge(_self, _args)
1031 PyObject *_self;
1032 PyObject *_args;
1034 PyObject *_res = NULL;
1035 Boolean install;
1036 if (!PyArg_ParseTuple(_args, "b",
1037 &install))
1038 return NULL;
1039 SetResPurge(install);
1041 OSErr _err = ResError();
1042 if (_err != noErr) return PyMac_Error(_err);
1044 Py_INCREF(Py_None);
1045 _res = Py_None;
1046 return _res;
1049 static PyObject *Res_GetResFileAttrs(_self, _args)
1050 PyObject *_self;
1051 PyObject *_args;
1053 PyObject *_res = NULL;
1054 short _rv;
1055 short refNum;
1056 if (!PyArg_ParseTuple(_args, "h",
1057 &refNum))
1058 return NULL;
1059 _rv = GetResFileAttrs(refNum);
1061 OSErr _err = ResError();
1062 if (_err != noErr) return PyMac_Error(_err);
1064 _res = Py_BuildValue("h",
1065 _rv);
1066 return _res;
1069 static PyObject *Res_SetResFileAttrs(_self, _args)
1070 PyObject *_self;
1071 PyObject *_args;
1073 PyObject *_res = NULL;
1074 short refNum;
1075 short attrs;
1076 if (!PyArg_ParseTuple(_args, "hh",
1077 &refNum,
1078 &attrs))
1079 return NULL;
1080 SetResFileAttrs(refNum,
1081 attrs);
1083 OSErr _err = ResError();
1084 if (_err != noErr) return PyMac_Error(_err);
1086 Py_INCREF(Py_None);
1087 _res = Py_None;
1088 return _res;
1091 static PyObject *Res_OpenRFPerm(_self, _args)
1092 PyObject *_self;
1093 PyObject *_args;
1095 PyObject *_res = NULL;
1096 short _rv;
1097 Str255 fileName;
1098 short vRefNum;
1099 SignedByte permission;
1100 if (!PyArg_ParseTuple(_args, "O&hb",
1101 PyMac_GetStr255, fileName,
1102 &vRefNum,
1103 &permission))
1104 return NULL;
1105 _rv = OpenRFPerm(fileName,
1106 vRefNum,
1107 permission);
1109 OSErr _err = ResError();
1110 if (_err != noErr) return PyMac_Error(_err);
1112 _res = Py_BuildValue("h",
1113 _rv);
1114 return _res;
1117 static PyObject *Res_RGetResource(_self, _args)
1118 PyObject *_self;
1119 PyObject *_args;
1121 PyObject *_res = NULL;
1122 Handle _rv;
1123 ResType theType;
1124 short theID;
1125 if (!PyArg_ParseTuple(_args, "O&h",
1126 PyMac_GetOSType, &theType,
1127 &theID))
1128 return NULL;
1129 _rv = RGetResource(theType,
1130 theID);
1132 OSErr _err = ResError();
1133 if (_err != noErr) return PyMac_Error(_err);
1135 _res = Py_BuildValue("O&",
1136 ResObj_New, _rv);
1137 return _res;
1140 static PyObject *Res_HOpenResFile(_self, _args)
1141 PyObject *_self;
1142 PyObject *_args;
1144 PyObject *_res = NULL;
1145 short _rv;
1146 short vRefNum;
1147 long dirID;
1148 Str255 fileName;
1149 SignedByte permission;
1150 if (!PyArg_ParseTuple(_args, "hlO&b",
1151 &vRefNum,
1152 &dirID,
1153 PyMac_GetStr255, fileName,
1154 &permission))
1155 return NULL;
1156 _rv = HOpenResFile(vRefNum,
1157 dirID,
1158 fileName,
1159 permission);
1161 OSErr _err = ResError();
1162 if (_err != noErr) return PyMac_Error(_err);
1164 _res = Py_BuildValue("h",
1165 _rv);
1166 return _res;
1169 static PyObject *Res_HCreateResFile(_self, _args)
1170 PyObject *_self;
1171 PyObject *_args;
1173 PyObject *_res = NULL;
1174 short vRefNum;
1175 long dirID;
1176 Str255 fileName;
1177 if (!PyArg_ParseTuple(_args, "hlO&",
1178 &vRefNum,
1179 &dirID,
1180 PyMac_GetStr255, fileName))
1181 return NULL;
1182 HCreateResFile(vRefNum,
1183 dirID,
1184 fileName);
1186 OSErr _err = ResError();
1187 if (_err != noErr) return PyMac_Error(_err);
1189 Py_INCREF(Py_None);
1190 _res = Py_None;
1191 return _res;
1194 static PyObject *Res_FSpOpenResFile(_self, _args)
1195 PyObject *_self;
1196 PyObject *_args;
1198 PyObject *_res = NULL;
1199 short _rv;
1200 FSSpec spec;
1201 SignedByte permission;
1202 if (!PyArg_ParseTuple(_args, "O&b",
1203 PyMac_GetFSSpec, &spec,
1204 &permission))
1205 return NULL;
1206 _rv = FSpOpenResFile(&spec,
1207 permission);
1209 OSErr _err = ResError();
1210 if (_err != noErr) return PyMac_Error(_err);
1212 _res = Py_BuildValue("h",
1213 _rv);
1214 return _res;
1217 static PyObject *Res_FSpCreateResFile(_self, _args)
1218 PyObject *_self;
1219 PyObject *_args;
1221 PyObject *_res = NULL;
1222 FSSpec spec;
1223 OSType creator;
1224 OSType fileType;
1225 ScriptCode scriptTag;
1226 if (!PyArg_ParseTuple(_args, "O&O&O&h",
1227 PyMac_GetFSSpec, &spec,
1228 PyMac_GetOSType, &creator,
1229 PyMac_GetOSType, &fileType,
1230 &scriptTag))
1231 return NULL;
1232 FSpCreateResFile(&spec,
1233 creator,
1234 fileType,
1235 scriptTag);
1237 OSErr _err = ResError();
1238 if (_err != noErr) return PyMac_Error(_err);
1240 Py_INCREF(Py_None);
1241 _res = Py_None;
1242 return _res;
1245 static PyObject *Res_Resource(_self, _args)
1246 PyObject *_self;
1247 PyObject *_args;
1249 PyObject *_res = NULL;
1251 char *buf;
1252 int len;
1253 Handle h;
1255 if (!PyArg_ParseTuple(_args, "s#", &buf, &len))
1256 return NULL;
1257 h = NewHandle(len);
1258 if ( h == NULL ) {
1259 PyErr_NoMemory();
1260 return NULL;
1262 HLock(h);
1263 memcpy(*h, buf, len);
1264 HUnlock(h);
1265 return (PyObject *)ResObj_New(h);
1269 static PyMethodDef Res_methods[] = {
1270 {"InitResources", (PyCFunction)Res_InitResources, 1,
1271 "() -> (short _rv)"},
1272 {"RsrcZoneInit", (PyCFunction)Res_RsrcZoneInit, 1,
1273 "() -> None"},
1274 {"CloseResFile", (PyCFunction)Res_CloseResFile, 1,
1275 "(short refNum) -> None"},
1276 {"ResError", (PyCFunction)Res_ResError, 1,
1277 "() -> (short _rv)"},
1278 {"CurResFile", (PyCFunction)Res_CurResFile, 1,
1279 "() -> (short _rv)"},
1280 {"CreateResFile", (PyCFunction)Res_CreateResFile, 1,
1281 "(Str255 fileName) -> None"},
1282 {"OpenResFile", (PyCFunction)Res_OpenResFile, 1,
1283 "(Str255 fileName) -> (short _rv)"},
1284 {"UseResFile", (PyCFunction)Res_UseResFile, 1,
1285 "(short refNum) -> None"},
1286 {"CountTypes", (PyCFunction)Res_CountTypes, 1,
1287 "() -> (short _rv)"},
1288 {"Count1Types", (PyCFunction)Res_Count1Types, 1,
1289 "() -> (short _rv)"},
1290 {"GetIndType", (PyCFunction)Res_GetIndType, 1,
1291 "(short index) -> (ResType theType)"},
1292 {"Get1IndType", (PyCFunction)Res_Get1IndType, 1,
1293 "(short index) -> (ResType theType)"},
1294 {"SetResLoad", (PyCFunction)Res_SetResLoad, 1,
1295 "(Boolean load) -> None"},
1296 {"CountResources", (PyCFunction)Res_CountResources, 1,
1297 "(ResType theType) -> (short _rv)"},
1298 {"Count1Resources", (PyCFunction)Res_Count1Resources, 1,
1299 "(ResType theType) -> (short _rv)"},
1300 {"GetIndResource", (PyCFunction)Res_GetIndResource, 1,
1301 "(ResType theType, short index) -> (Handle _rv)"},
1302 {"Get1IndResource", (PyCFunction)Res_Get1IndResource, 1,
1303 "(ResType theType, short index) -> (Handle _rv)"},
1304 {"GetResource", (PyCFunction)Res_GetResource, 1,
1305 "(ResType theType, short theID) -> (Handle _rv)"},
1306 {"Get1Resource", (PyCFunction)Res_Get1Resource, 1,
1307 "(ResType theType, short theID) -> (Handle _rv)"},
1308 {"GetNamedResource", (PyCFunction)Res_GetNamedResource, 1,
1309 "(ResType theType, Str255 name) -> (Handle _rv)"},
1310 {"Get1NamedResource", (PyCFunction)Res_Get1NamedResource, 1,
1311 "(ResType theType, Str255 name) -> (Handle _rv)"},
1312 {"UniqueID", (PyCFunction)Res_UniqueID, 1,
1313 "(ResType theType) -> (short _rv)"},
1314 {"Unique1ID", (PyCFunction)Res_Unique1ID, 1,
1315 "(ResType theType) -> (short _rv)"},
1316 {"UpdateResFile", (PyCFunction)Res_UpdateResFile, 1,
1317 "(short refNum) -> None"},
1318 {"SetResPurge", (PyCFunction)Res_SetResPurge, 1,
1319 "(Boolean install) -> None"},
1320 {"GetResFileAttrs", (PyCFunction)Res_GetResFileAttrs, 1,
1321 "(short refNum) -> (short _rv)"},
1322 {"SetResFileAttrs", (PyCFunction)Res_SetResFileAttrs, 1,
1323 "(short refNum, short attrs) -> None"},
1324 {"OpenRFPerm", (PyCFunction)Res_OpenRFPerm, 1,
1325 "(Str255 fileName, short vRefNum, SignedByte permission) -> (short _rv)"},
1326 {"RGetResource", (PyCFunction)Res_RGetResource, 1,
1327 "(ResType theType, short theID) -> (Handle _rv)"},
1328 {"HOpenResFile", (PyCFunction)Res_HOpenResFile, 1,
1329 "(short vRefNum, long dirID, Str255 fileName, SignedByte permission) -> (short _rv)"},
1330 {"HCreateResFile", (PyCFunction)Res_HCreateResFile, 1,
1331 "(short vRefNum, long dirID, Str255 fileName) -> None"},
1332 {"FSpOpenResFile", (PyCFunction)Res_FSpOpenResFile, 1,
1333 "(FSSpec spec, SignedByte permission) -> (short _rv)"},
1334 {"FSpCreateResFile", (PyCFunction)Res_FSpCreateResFile, 1,
1335 "(FSSpec spec, OSType creator, OSType fileType, ScriptCode scriptTag) -> None"},
1336 {"Resource", (PyCFunction)Res_Resource, 1,
1337 "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.\n"},
1338 {NULL, NULL, 0}
1344 /* Alternative version of ResObj_New, which returns None for null argument */
1345 PyObject *OptResObj_New(itself)
1346 Handle itself;
1348 if (itself == NULL) {
1349 Py_INCREF(Py_None);
1350 return Py_None;
1352 return ResObj_New(itself);
1355 OptResObj_Convert(v, p_itself)
1356 PyObject *v;
1357 Handle *p_itself;
1359 if ( v == Py_None ) {
1360 *p_itself = NULL;
1361 return 1;
1363 if (!ResObj_Check(v))
1365 PyErr_SetString(PyExc_TypeError, "Resource required");
1366 return 0;
1368 *p_itself = ((ResourceObject *)v)->ob_itself;
1369 return 1;
1374 void initRes()
1376 PyObject *m;
1377 PyObject *d;
1383 m = Py_InitModule("Res", Res_methods);
1384 d = PyModule_GetDict(m);
1385 Res_Error = PyMac_GetOSErrException();
1386 if (Res_Error == NULL ||
1387 PyDict_SetItemString(d, "Error", Res_Error) != 0)
1388 Py_FatalError("can't initialize Res.Error");
1391 /* ========================= End module Res ========================= */