• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# This script will generate the Resources interface for Python.
2# It uses the "bgen" package to generate C code.
3# It execs the file resgen.py which contain the function definitions
4# (resgen.py was generated by resscan.py, scanning the <Resources.h> header file).
5
6from macsupport import *
7
8class ResMixIn:
9
10    def checkit(self):
11        if self.returntype.__class__ != OSErrType:
12            OutLbrace()
13            Output("OSErr _err = ResError();")
14            Output("if (_err != noErr) return PyMac_Error(_err);")
15            OutRbrace()
16        FunctionGenerator.checkit(self) # XXX
17
18class ResFunction(ResMixIn, OSErrWeakLinkFunctionGenerator): pass
19class ResMethod(ResMixIn, OSErrWeakLinkMethodGenerator): pass
20
21RsrcChainLocation = Type("RsrcChainLocation", "h")
22FSCatalogInfoBitmap = FakeType("0") # Type("FSCatalogInfoBitmap", "l")
23FSCatalogInfo_ptr = FakeType("(FSCatalogInfo *)0")
24
25# includestuff etc. are imported from macsupport
26
27includestuff = includestuff + """
28#include <Carbon/Carbon.h>
29
30#ifdef USE_TOOLBOX_OBJECT_GLUE
31extern PyObject *_ResObj_New(Handle);
32extern int _ResObj_Convert(PyObject *, Handle *);
33extern PyObject *_OptResObj_New(Handle);
34extern int _OptResObj_Convert(PyObject *, Handle *);
35#define ResObj_New _ResObj_New
36#define ResObj_Convert _ResObj_Convert
37#define OptResObj_New _OptResObj_New
38#define OptResObj_Convert _OptResObj_Convert
39#endif
40
41/* Function to dispose a resource, with a "normal" calling sequence */
42static void
43PyMac_AutoDisposeHandle(Handle h)
44{
45        DisposeHandle(h);
46}
47"""
48
49finalstuff = finalstuff + """
50
51/* Alternative version of ResObj_New, which returns None for null argument */
52PyObject *OptResObj_New(Handle itself)
53{
54        if (itself == NULL) {
55                Py_INCREF(Py_None);
56                return Py_None;
57        }
58        return ResObj_New(itself);
59}
60
61int OptResObj_Convert(PyObject *v, Handle *p_itself)
62{
63        PyObject *tmp;
64
65        if ( v == Py_None ) {
66                *p_itself = NULL;
67                return 1;
68        }
69        if (ResObj_Check(v))
70        {
71                *p_itself = ((ResourceObject *)v)->ob_itself;
72                return 1;
73        }
74        /* If it isn't a resource yet see whether it is convertible */
75        if ( (tmp=PyObject_CallMethod(v, "as_Resource", "")) ) {
76                *p_itself = ((ResourceObject *)tmp)->ob_itself;
77                Py_DECREF(tmp);
78                return 1;
79        }
80        PyErr_Clear();
81        PyErr_SetString(PyExc_TypeError, "Resource required");
82        return 0;
83}
84"""
85
86initstuff = initstuff + """
87        PyMac_INIT_TOOLBOX_OBJECT_NEW(Handle, ResObj_New);
88        PyMac_INIT_TOOLBOX_OBJECT_CONVERT(Handle, ResObj_Convert);
89        PyMac_INIT_TOOLBOX_OBJECT_NEW(Handle, OptResObj_New);
90        PyMac_INIT_TOOLBOX_OBJECT_CONVERT(Handle, OptResObj_Convert);
91"""
92
93module = MacModule('_Res', 'Res', includestuff, finalstuff, initstuff)
94
95class ResDefinition(PEP253Mixin, GlobalObjectDefinition):
96    getsetlist = [
97            ('data',
98            """
99            PyObject *res;
100            char state;
101
102            state = HGetState(self->ob_itself);
103            HLock(self->ob_itself);
104            res = PyString_FromStringAndSize(
105                    *self->ob_itself,
106                    GetHandleSize(self->ob_itself));
107            HUnlock(self->ob_itself);
108            HSetState(self->ob_itself, state);
109            return res;
110            """,
111            """
112            char *data;
113            long size;
114
115            if ( v == NULL )
116                    return -1;
117            if ( !PyString_Check(v) )
118                    return -1;
119            size = PyString_Size(v);
120            data = PyString_AsString(v);
121            /* XXXX Do I need the GetState/SetState calls? */
122            SetHandleSize(self->ob_itself, size);
123            if ( MemError())
124                    return -1;
125            HLock(self->ob_itself);
126            memcpy((char *)*self->ob_itself, data, size);
127            HUnlock(self->ob_itself);
128            /* XXXX Should I do the Changed call immediately? */
129            return 0;
130            """,
131            'The resource data'
132            ), (
133            'size',
134            'return PyInt_FromLong(GetHandleSize(self->ob_itself));',
135            None,
136            'The length of the resource data'
137            )]
138
139    def outputCheckNewArg(self):
140        Output("if (itself == NULL) return PyMac_Error(resNotFound);")
141
142    def outputCheckConvertArg(self):
143        # if it isn't a resource we may be able to coerce it
144        Output("if (!%s_Check(v))", self.prefix)
145        OutLbrace()
146        Output("PyObject *tmp;")
147        Output('if ( (tmp=PyObject_CallMethod(v, "as_Resource", "")) )')
148        OutLbrace()
149        Output("*p_itself = ((ResourceObject *)tmp)->ob_itself;")
150        Output("Py_DECREF(tmp);")
151        Output("return 1;")
152        OutRbrace()
153        Output("PyErr_Clear();")
154        OutRbrace()
155
156    def outputStructMembers(self):
157        GlobalObjectDefinition.outputStructMembers(self)
158        Output("void (*ob_freeit)(%s ptr);", self.itselftype)
159
160    def outputInitStructMembers(self):
161        GlobalObjectDefinition.outputInitStructMembers(self)
162        Output("it->ob_freeit = NULL;")
163
164    def outputCleanupStructMembers(self):
165        Output("if (self->ob_freeit && self->ob_itself)")
166        OutLbrace()
167        Output("self->ob_freeit(self->ob_itself);")
168        OutRbrace()
169        Output("self->ob_itself = NULL;")
170
171    def output_tp_newBody(self):
172        Output("PyObject *self;")
173        Output
174        Output("if ((self = type->tp_alloc(type, 0)) == NULL) return NULL;")
175        Output("((%s *)self)->ob_itself = NULL;", self.objecttype)
176        Output("((%s *)self)->ob_freeit = NULL;", self.objecttype)
177        Output("return self;")
178
179    def output_tp_initBody(self):
180        Output("char *srcdata = NULL;")
181        Output("int srclen = 0;")
182        Output("%s itself;", self.itselftype);
183        Output("char *kw[] = {\"itself\", 0};")
184        Output()
185        Output("if (PyArg_ParseTupleAndKeywords(_args, _kwds, \"O&\", kw, %s_Convert, &itself))",
186                self.prefix);
187        OutLbrace()
188        Output("((%s *)_self)->ob_itself = itself;", self.objecttype)
189        Output("return 0;")
190        OutRbrace()
191        Output("PyErr_Clear();")
192        Output("if (!PyArg_ParseTupleAndKeywords(_args, _kwds, \"|s#\", kw, &srcdata, &srclen)) return -1;")
193        Output("if ((itself = NewHandle(srclen)) == NULL)")
194        OutLbrace()
195        Output("PyErr_NoMemory();")
196        Output("return 0;")
197        OutRbrace()
198        Output("((%s *)_self)->ob_itself = itself;", self.objecttype)
199# XXXX          Output("((%s *)self)->ob_freeit = PyMac_AutoDisposeHandle;")
200        Output("if (srclen && srcdata)")
201        OutLbrace()
202        Output("HLock(itself);")
203        Output("memcpy(*itself, srcdata, srclen);")
204        Output("HUnlock(itself);")
205        OutRbrace()
206        Output("return 0;")
207
208resobject = ResDefinition('Resource', 'ResObj', 'Handle')
209module.addobject(resobject)
210
211functions = []
212resmethods = []
213
214execfile('resgen.py')
215execfile('resedit.py')
216
217for f in functions: module.add(f)
218for f in resmethods: resobject.add(f)
219
220SetOutputFileName('_Resmodule.c')
221module.generate()
222