ยปCore Development>Code coverage>Mac/Modules/cf/cfsupport.py

Python code coverage for Mac/Modules/cf/cfsupport.py

#countcontent
1n/a# This script generates a Python interface for an Apple Macintosh Manager.
2n/a# It uses the "bgen" package to generate C code.
3n/a# The function specifications are generated by scanning the mamager's header file,
4n/a# using the "scantools" package (customized for this particular manager).
5n/a
6n/a#error missing SetActionFilter
7n/a
8n/aimport string
9n/a
10n/a# Declarations that change for each manager
11n/aMODNAME = '_CF' # The name of the module
12n/a
13n/a# The following is *usually* unchanged but may still require tuning
14n/aMODPREFIX = 'CF' # The prefix for module-wide routines
15n/aINPUTFILE = string.lower(MODPREFIX) + 'gen.py' # The file generated by the scanner
16n/aOUTPUTFILE = MODNAME + "module.c" # The file generated by this program
17n/a
18n/afrom macsupport import *
19n/a
20n/a# Special case generator for the functions that have an AllocatorRef first argument,
21n/a# which we skip anyway, and the object as the second arg.
22n/aclass MethodSkipArg1(MethodGenerator):
23n/a """Similar to MethodGenerator, but has self as last argument"""
24n/a
25n/a def parseArgumentList(self, args):
26n/a if len(args) < 2:
27n/a raise ValueError, "MethodSkipArg1 expects at least 2 args"
28n/a a0, a1, args = args[0], args[1], args[2:]
29n/a t0, n0, m0 = a0
30n/a if t0 != "CFAllocatorRef" and m0 != InMode:
31n/a raise ValueError, "MethodSkipArg1 should have dummy AllocatorRef first arg"
32n/a t1, n1, m1 = a1
33n/a if m1 != InMode:
34n/a raise ValueError, "method's 'self' must be 'InMode'"
35n/a dummy = Variable(t0, n0, m0)
36n/a self.argumentList.append(dummy)
37n/a self.itself = Variable(t1, "_self->ob_itself", SelfMode)
38n/a self.argumentList.append(self.itself)
39n/a FunctionGenerator.parseArgumentList(self, args)
40n/a
41n/a
42n/a# Create the type objects
43n/a
44n/aincludestuff = includestuff + """
45n/a#include <CoreServices/CoreServices.h>
46n/a
47n/a#include "pycfbridge.h"
48n/a
49n/a#ifdef USE_TOOLBOX_OBJECT_GLUE
50n/aextern PyObject *_CFObj_New(CFTypeRef);
51n/aextern int _CFObj_Convert(PyObject *, CFTypeRef *);
52n/a#define CFObj_New _CFObj_New
53n/a#define CFObj_Convert _CFObj_Convert
54n/a
55n/aextern PyObject *_CFTypeRefObj_New(CFTypeRef);
56n/aextern int _CFTypeRefObj_Convert(PyObject *, CFTypeRef *);
57n/a#define CFTypeRefObj_New _CFTypeRefObj_New
58n/a#define CFTypeRefObj_Convert _CFTypeRefObj_Convert
59n/a
60n/aextern PyObject *_CFStringRefObj_New(CFStringRef);
61n/aextern int _CFStringRefObj_Convert(PyObject *, CFStringRef *);
62n/a#define CFStringRefObj_New _CFStringRefObj_New
63n/a#define CFStringRefObj_Convert _CFStringRefObj_Convert
64n/a
65n/aextern PyObject *_CFMutableStringRefObj_New(CFMutableStringRef);
66n/aextern int _CFMutableStringRefObj_Convert(PyObject *, CFMutableStringRef *);
67n/a#define CFMutableStringRefObj_New _CFMutableStringRefObj_New
68n/a#define CFMutableStringRefObj_Convert _CFMutableStringRefObj_Convert
69n/a
70n/aextern PyObject *_CFArrayRefObj_New(CFArrayRef);
71n/aextern int _CFArrayRefObj_Convert(PyObject *, CFArrayRef *);
72n/a#define CFArrayRefObj_New _CFArrayRefObj_New
73n/a#define CFArrayRefObj_Convert _CFArrayRefObj_Convert
74n/a
75n/aextern PyObject *_CFMutableArrayRefObj_New(CFMutableArrayRef);
76n/aextern int _CFMutableArrayRefObj_Convert(PyObject *, CFMutableArrayRef *);
77n/a#define CFMutableArrayRefObj_New _CFMutableArrayRefObj_New
78n/a#define CFMutableArrayRefObj_Convert _CFMutableArrayRefObj_Convert
79n/a
80n/aextern PyObject *_CFDataRefObj_New(CFDataRef);
81n/aextern int _CFDataRefObj_Convert(PyObject *, CFDataRef *);
82n/a#define CFDataRefObj_New _CFDataRefObj_New
83n/a#define CFDataRefObj_Convert _CFDataRefObj_Convert
84n/a
85n/aextern PyObject *_CFMutableDataRefObj_New(CFMutableDataRef);
86n/aextern int _CFMutableDataRefObj_Convert(PyObject *, CFMutableDataRef *);
87n/a#define CFMutableDataRefObj_New _CFMutableDataRefObj_New
88n/a#define CFMutableDataRefObj_Convert _CFMutableDataRefObj_Convert
89n/a
90n/aextern PyObject *_CFDictionaryRefObj_New(CFDictionaryRef);
91n/aextern int _CFDictionaryRefObj_Convert(PyObject *, CFDictionaryRef *);
92n/a#define CFDictionaryRefObj_New _CFDictionaryRefObj_New
93n/a#define CFDictionaryRefObj_Convert _CFDictionaryRefObj_Convert
94n/a
95n/aextern PyObject *_CFMutableDictionaryRefObj_New(CFMutableDictionaryRef);
96n/aextern int _CFMutableDictionaryRefObj_Convert(PyObject *, CFMutableDictionaryRef *);
97n/a#define CFMutableDictionaryRefObj_New _CFMutableDictionaryRefObj_New
98n/a#define CFMutableDictionaryRefObj_Convert _CFMutableDictionaryRefObj_Convert
99n/a
100n/aextern PyObject *_CFURLRefObj_New(CFURLRef);
101n/aextern int _CFURLRefObj_Convert(PyObject *, CFURLRef *);
102n/aextern int _OptionalCFURLRefObj_Convert(PyObject *, CFURLRef *);
103n/a#define CFURLRefObj_New _CFURLRefObj_New
104n/a#define CFURLRefObj_Convert _CFURLRefObj_Convert
105n/a#define OptionalCFURLRefObj_Convert _OptionalCFURLRefObj_Convert
106n/a#endif
107n/a
108n/a/*
109n/a** Parse/generate CFRange records
110n/a*/
111n/aPyObject *CFRange_New(CFRange *itself)
112n/a{
113n/a
114n/a return Py_BuildValue("ll", (long)itself->location, (long)itself->length);
115n/a}
116n/a
117n/aint
118n/aCFRange_Convert(PyObject *v, CFRange *p_itself)
119n/a{
120n/a long location, length;
121n/a
122n/a if( !PyArg_ParseTuple(v, "ll", &location, &length) )
123n/a return 0;
124n/a p_itself->location = (CFIndex)location;
125n/a p_itself->length = (CFIndex)length;
126n/a return 1;
127n/a}
128n/a
129n/a/* Optional CFURL argument or None (passed as NULL) */
130n/aint
131n/aOptionalCFURLRefObj_Convert(PyObject *v, CFURLRef *p_itself)
132n/a{
133n/a if ( v == Py_None ) {
134n/a p_itself = NULL;
135n/a return 1;
136n/a }
137n/a return CFURLRefObj_Convert(v, p_itself);
138n/a}
139n/a"""
140n/a
141n/afinalstuff = finalstuff + """
142n/a
143n/a/* Routines to convert any CF type to/from the corresponding CFxxxObj */
144n/aPyObject *CFObj_New(CFTypeRef itself)
145n/a{
146n/a if (itself == NULL)
147n/a {
148n/a PyErr_SetString(PyExc_RuntimeError, "cannot wrap NULL");
149n/a return NULL;
150n/a }
151n/a if (CFGetTypeID(itself) == CFArrayGetTypeID()) return CFArrayRefObj_New((CFArrayRef)itself);
152n/a if (CFGetTypeID(itself) == CFDictionaryGetTypeID()) return CFDictionaryRefObj_New((CFDictionaryRef)itself);
153n/a if (CFGetTypeID(itself) == CFDataGetTypeID()) return CFDataRefObj_New((CFDataRef)itself);
154n/a if (CFGetTypeID(itself) == CFStringGetTypeID()) return CFStringRefObj_New((CFStringRef)itself);
155n/a if (CFGetTypeID(itself) == CFURLGetTypeID()) return CFURLRefObj_New((CFURLRef)itself);
156n/a /* XXXX Or should we use PyCF_CF2Python here?? */
157n/a return CFTypeRefObj_New(itself);
158n/a}
159n/aint CFObj_Convert(PyObject *v, CFTypeRef *p_itself)
160n/a{
161n/a
162n/a if (v == Py_None) { *p_itself = NULL; return 1; }
163n/a /* Check for other CF objects here */
164n/a
165n/a if (!CFTypeRefObj_Check(v) &&
166n/a !CFArrayRefObj_Check(v) &&
167n/a !CFMutableArrayRefObj_Check(v) &&
168n/a !CFDictionaryRefObj_Check(v) &&
169n/a !CFMutableDictionaryRefObj_Check(v) &&
170n/a !CFDataRefObj_Check(v) &&
171n/a !CFMutableDataRefObj_Check(v) &&
172n/a !CFStringRefObj_Check(v) &&
173n/a !CFMutableStringRefObj_Check(v) &&
174n/a !CFURLRefObj_Check(v) )
175n/a {
176n/a /* XXXX Or should we use PyCF_Python2CF here?? */
177n/a PyErr_SetString(PyExc_TypeError, "CF object required");
178n/a return 0;
179n/a }
180n/a *p_itself = ((CFTypeRefObject *)v)->ob_itself;
181n/a return 1;
182n/a}
183n/a"""
184n/a
185n/ainitstuff = initstuff + """
186n/aPyMac_INIT_TOOLBOX_OBJECT_NEW(CFTypeRef, CFObj_New);
187n/aPyMac_INIT_TOOLBOX_OBJECT_CONVERT(CFTypeRef, CFObj_Convert);
188n/aPyMac_INIT_TOOLBOX_OBJECT_NEW(CFTypeRef, CFTypeRefObj_New);
189n/aPyMac_INIT_TOOLBOX_OBJECT_CONVERT(CFTypeRef, CFTypeRefObj_Convert);
190n/aPyMac_INIT_TOOLBOX_OBJECT_NEW(CFStringRef, CFStringRefObj_New);
191n/aPyMac_INIT_TOOLBOX_OBJECT_CONVERT(CFStringRef, CFStringRefObj_Convert);
192n/aPyMac_INIT_TOOLBOX_OBJECT_NEW(CFMutableStringRef, CFMutableStringRefObj_New);
193n/aPyMac_INIT_TOOLBOX_OBJECT_CONVERT(CFMutableStringRef, CFMutableStringRefObj_Convert);
194n/aPyMac_INIT_TOOLBOX_OBJECT_NEW(CFArrayRef, CFArrayRefObj_New);
195n/aPyMac_INIT_TOOLBOX_OBJECT_CONVERT(CFArrayRef, CFArrayRefObj_Convert);
196n/aPyMac_INIT_TOOLBOX_OBJECT_NEW(CFMutableArrayRef, CFMutableArrayRefObj_New);
197n/aPyMac_INIT_TOOLBOX_OBJECT_CONVERT(CFMutableArrayRef, CFMutableArrayRefObj_Convert);
198n/aPyMac_INIT_TOOLBOX_OBJECT_NEW(CFDictionaryRef, CFDictionaryRefObj_New);
199n/aPyMac_INIT_TOOLBOX_OBJECT_CONVERT(CFDictionaryRef, CFDictionaryRefObj_Convert);
200n/aPyMac_INIT_TOOLBOX_OBJECT_NEW(CFMutableDictionaryRef, CFMutableDictionaryRefObj_New);
201n/aPyMac_INIT_TOOLBOX_OBJECT_CONVERT(CFMutableDictionaryRef, CFMutableDictionaryRefObj_Convert);
202n/aPyMac_INIT_TOOLBOX_OBJECT_NEW(CFURLRef, CFURLRefObj_New);
203n/aPyMac_INIT_TOOLBOX_OBJECT_CONVERT(CFURLRef, CFURLRefObj_Convert);
204n/a"""
205n/a
206n/avariablestuff="""
207n/a#define _STRINGCONST(name) PyModule_AddObject(m, #name, CFStringRefObj_New(name))
208n/a_STRINGCONST(kCFPreferencesAnyApplication);
209n/a_STRINGCONST(kCFPreferencesCurrentApplication);
210n/a_STRINGCONST(kCFPreferencesAnyHost);
211n/a_STRINGCONST(kCFPreferencesCurrentHost);
212n/a_STRINGCONST(kCFPreferencesAnyUser);
213n/a_STRINGCONST(kCFPreferencesCurrentUser);
214n/a
215n/a"""
216n/a
217n/aBoolean = Type("Boolean", "l")
218n/aCFTypeID = Type("CFTypeID", "l") # XXXX a guess, seems better than OSTypeType.
219n/aCFHashCode = Type("CFHashCode", "l")
220n/aCFIndex = Type("CFIndex", "l")
221n/aCFRange = OpaqueByValueType('CFRange', 'CFRange')
222n/aCFOptionFlags = Type("CFOptionFlags", "l")
223n/aCFStringEncoding = Type("CFStringEncoding", "l")
224n/aCFComparisonResult = Type("CFComparisonResult", "l") # a bit dangerous, it's an enum
225n/aCFURLPathStyle = Type("CFURLPathStyle", "l") # a bit dangerous, it's an enum
226n/a
227n/achar_ptr = stringptr
228n/areturn_stringptr = Type("char *", "s") # ONLY FOR RETURN VALUES!!
229n/a
230n/aCFAllocatorRef = FakeType("(CFAllocatorRef)NULL")
231n/aCFArrayCallBacks_ptr = FakeType("&kCFTypeArrayCallBacks")
232n/aCFDictionaryKeyCallBacks_ptr = FakeType("&kCFTypeDictionaryKeyCallBacks")
233n/aCFDictionaryValueCallBacks_ptr = FakeType("&kCFTypeDictionaryValueCallBacks")
234n/a# The real objects
235n/aCFTypeRef = OpaqueByValueType("CFTypeRef", "CFTypeRefObj")
236n/aCFArrayRef = OpaqueByValueType("CFArrayRef", "CFArrayRefObj")
237n/aCFMutableArrayRef = OpaqueByValueType("CFMutableArrayRef", "CFMutableArrayRefObj")
238n/aCFArrayRef = OpaqueByValueType("CFArrayRef", "CFArrayRefObj")
239n/aCFMutableArrayRef = OpaqueByValueType("CFMutableArrayRef", "CFMutableArrayRefObj")
240n/aCFDataRef = OpaqueByValueType("CFDataRef", "CFDataRefObj")
241n/aCFMutableDataRef = OpaqueByValueType("CFMutableDataRef", "CFMutableDataRefObj")
242n/aCFDictionaryRef = OpaqueByValueType("CFDictionaryRef", "CFDictionaryRefObj")
243n/aCFMutableDictionaryRef = OpaqueByValueType("CFMutableDictionaryRef", "CFMutableDictionaryRefObj")
244n/aCFStringRef = OpaqueByValueType("CFStringRef", "CFStringRefObj")
245n/aCFMutableStringRef = OpaqueByValueType("CFMutableStringRef", "CFMutableStringRefObj")
246n/aCFURLRef = OpaqueByValueType("CFURLRef", "CFURLRefObj")
247n/aOptionalCFURLRef = OpaqueByValueType("CFURLRef", "OptionalCFURLRefObj")
248n/a##CFPropertyListRef = OpaqueByValueType("CFPropertyListRef", "CFTypeRefObj")
249n/a# ADD object type here
250n/a
251n/a# Our (opaque) objects
252n/a
253n/aclass MyGlobalObjectDefinition(PEP253Mixin, GlobalObjectDefinition):
254n/a def outputCheckNewArg(self):
255n/a Output('if (itself == NULL)')
256n/a OutLbrace()
257n/a Output('PyErr_SetString(PyExc_RuntimeError, "cannot wrap NULL");')
258n/a Output('return NULL;')
259n/a OutRbrace()
260n/a def outputStructMembers(self):
261n/a GlobalObjectDefinition.outputStructMembers(self)
262n/a Output("void (*ob_freeit)(CFTypeRef ptr);")
263n/a def outputInitStructMembers(self):
264n/a GlobalObjectDefinition.outputInitStructMembers(self)
265n/a## Output("it->ob_freeit = NULL;")
266n/a Output("it->ob_freeit = CFRelease;")
267n/a def outputCheckConvertArg(self):
268n/a Out("""
269n/a if (v == Py_None) { *p_itself = NULL; return 1; }
270n/a /* Check for other CF objects here */
271n/a """)
272n/a def outputCleanupStructMembers(self):
273n/a Output("if (self->ob_freeit && self->ob_itself)")
274n/a OutLbrace()
275n/a Output("self->ob_freeit((CFTypeRef)self->ob_itself);")
276n/a Output("self->ob_itself = NULL;")
277n/a OutRbrace()
278n/a
279n/a def outputCompare(self):
280n/a Output()
281n/a Output("static int %s_compare(%s *self, %s *other)", self.prefix, self.objecttype, self.objecttype)
282n/a OutLbrace()
283n/a Output("/* XXXX Or should we use CFEqual?? */")
284n/a Output("if ( self->ob_itself > other->ob_itself ) return 1;")
285n/a Output("if ( self->ob_itself < other->ob_itself ) return -1;")
286n/a Output("return 0;")
287n/a OutRbrace()
288n/a
289n/a def outputHash(self):
290n/a Output()
291n/a Output("static int %s_hash(%s *self)", self.prefix, self.objecttype)
292n/a OutLbrace()
293n/a Output("/* XXXX Or should we use CFHash?? */")
294n/a Output("return (int)self->ob_itself;")
295n/a OutRbrace()
296n/a
297n/a def outputRepr(self):
298n/a Output()
299n/a Output("static PyObject * %s_repr(%s *self)", self.prefix, self.objecttype)
300n/a OutLbrace()
301n/a Output("char buf[100];")
302n/a Output("""sprintf(buf, "<CFTypeRef type-%%d object at 0x%%8.8x for 0x%%8.8x>", (int)CFGetTypeID(self->ob_itself), (unsigned)self, (unsigned)self->ob_itself);""")
303n/a Output("return PyString_FromString(buf);")
304n/a OutRbrace()
305n/a
306n/a def output_tp_newBody(self):
307n/a Output("PyObject *self;")
308n/a Output
309n/a Output("if ((self = type->tp_alloc(type, 0)) == NULL) return NULL;")
310n/a Output("((%s *)self)->ob_itself = NULL;", self.objecttype)
311n/a Output("((%s *)self)->ob_freeit = CFRelease;", self.objecttype)
312n/a Output("return self;")
313n/a
314n/a def output_tp_initBody(self):
315n/a Output("%s itself;", self.itselftype)
316n/a Output("char *kw[] = {\"itself\", 0};")
317n/a Output()
318n/a Output("if (PyArg_ParseTupleAndKeywords(_args, _kwds, \"O&\", kw, %s_Convert, &itself))",
319n/a self.prefix)
320n/a OutLbrace()
321n/a Output("((%s *)_self)->ob_itself = itself;", self.objecttype)
322n/a Output("return 0;")
323n/a OutRbrace()
324n/a if self.prefix != 'CFTypeRefObj':
325n/a Output()
326n/a Output("/* Any CFTypeRef descendent is allowed as initializer too */")
327n/a Output("if (PyArg_ParseTupleAndKeywords(_args, _kwds, \"O&\", kw, CFTypeRefObj_Convert, &itself))")
328n/a OutLbrace()
329n/a Output("((%s *)_self)->ob_itself = itself;", self.objecttype)
330n/a Output("return 0;")
331n/a OutRbrace()
332n/a Output("return -1;")
333n/a
334n/aclass CFTypeRefObjectDefinition(MyGlobalObjectDefinition):
335n/a pass
336n/a
337n/aclass CFArrayRefObjectDefinition(MyGlobalObjectDefinition):
338n/a basetype = "CFTypeRef_Type"
339n/a
340n/a def outputRepr(self):
341n/a Output()
342n/a Output("static PyObject * %s_repr(%s *self)", self.prefix, self.objecttype)
343n/a OutLbrace()
344n/a Output("char buf[100];")
345n/a Output("""sprintf(buf, "<CFArrayRef object at 0x%%8.8x for 0x%%8.8x>", (unsigned)self, (unsigned)self->ob_itself);""")
346n/a Output("return PyString_FromString(buf);")
347n/a OutRbrace()
348n/a
349n/aclass CFMutableArrayRefObjectDefinition(MyGlobalObjectDefinition):
350n/a basetype = "CFArrayRef_Type"
351n/a
352n/a def outputRepr(self):
353n/a Output()
354n/a Output("static PyObject * %s_repr(%s *self)", self.prefix, self.objecttype)
355n/a OutLbrace()
356n/a Output("char buf[100];")
357n/a Output("""sprintf(buf, "<CFMutableArrayRef object at 0x%%8.8x for 0x%%8.8x>", (unsigned)self, (unsigned)self->ob_itself);""")
358n/a Output("return PyString_FromString(buf);")
359n/a OutRbrace()
360n/a
361n/aclass CFDictionaryRefObjectDefinition(MyGlobalObjectDefinition):
362n/a basetype = "CFTypeRef_Type"
363n/a
364n/a def outputRepr(self):
365n/a Output()
366n/a Output("static PyObject * %s_repr(%s *self)", self.prefix, self.objecttype)
367n/a OutLbrace()
368n/a Output("char buf[100];")
369n/a Output("""sprintf(buf, "<CFDictionaryRef object at 0x%%8.8x for 0x%%8.8x>", (unsigned)self, (unsigned)self->ob_itself);""")
370n/a Output("return PyString_FromString(buf);")
371n/a OutRbrace()
372n/a
373n/aclass CFMutableDictionaryRefObjectDefinition(MyGlobalObjectDefinition):
374n/a basetype = "CFDictionaryRef_Type"
375n/a
376n/a def outputRepr(self):
377n/a Output()
378n/a Output("static PyObject * %s_repr(%s *self)", self.prefix, self.objecttype)
379n/a OutLbrace()
380n/a Output("char buf[100];")
381n/a Output("""sprintf(buf, "<CFMutableDictionaryRef object at 0x%%8.8x for 0x%%8.8x>", (unsigned)self, (unsigned)self->ob_itself);""")
382n/a Output("return PyString_FromString(buf);")
383n/a OutRbrace()
384n/a
385n/aclass CFDataRefObjectDefinition(MyGlobalObjectDefinition):
386n/a basetype = "CFTypeRef_Type"
387n/a
388n/a def outputCheckConvertArg(self):
389n/a Out("""
390n/a if (v == Py_None) { *p_itself = NULL; return 1; }
391n/a if (PyString_Check(v)) {
392n/a char *cStr;
393n/a int cLen;
394n/a if( PyString_AsStringAndSize(v, &cStr, &cLen) < 0 ) return 0;
395n/a *p_itself = CFDataCreate((CFAllocatorRef)NULL, (unsigned char *)cStr, cLen);
396n/a return 1;
397n/a }
398n/a """)
399n/a
400n/a def outputRepr(self):
401n/a Output()
402n/a Output("static PyObject * %s_repr(%s *self)", self.prefix, self.objecttype)
403n/a OutLbrace()
404n/a Output("char buf[100];")
405n/a Output("""sprintf(buf, "<CFDataRef object at 0x%%8.8x for 0x%%8.8x>", (unsigned)self, (unsigned)self->ob_itself);""")
406n/a Output("return PyString_FromString(buf);")
407n/a OutRbrace()
408n/a
409n/aclass CFMutableDataRefObjectDefinition(MyGlobalObjectDefinition):
410n/a basetype = "CFDataRef_Type"
411n/a
412n/a def outputRepr(self):
413n/a Output()
414n/a Output("static PyObject * %s_repr(%s *self)", self.prefix, self.objecttype)
415n/a OutLbrace()
416n/a Output("char buf[100];")
417n/a Output("""sprintf(buf, "<CFMutableDataRef object at 0x%%8.8x for 0x%%8.8x>", (unsigned)self, (unsigned)self->ob_itself);""")
418n/a Output("return PyString_FromString(buf);")
419n/a OutRbrace()
420n/a
421n/aclass CFStringRefObjectDefinition(MyGlobalObjectDefinition):
422n/a basetype = "CFTypeRef_Type"
423n/a
424n/a def outputCheckConvertArg(self):
425n/a Out("""
426n/a if (v == Py_None) { *p_itself = NULL; return 1; }
427n/a if (PyString_Check(v)) {
428n/a char *cStr;
429n/a if (!PyArg_Parse(v, "es", "ascii", &cStr))
430n/a return NULL;
431n/a *p_itself = CFStringCreateWithCString((CFAllocatorRef)NULL, cStr, kCFStringEncodingASCII);
432n/a PyMem_Free(cStr);
433n/a return 1;
434n/a }
435n/a if (PyUnicode_Check(v)) {
436n/a /* We use the CF types here, if Python was configured differently that will give an error */
437n/a CFIndex size = PyUnicode_GetSize(v);
438n/a UniChar *unichars = PyUnicode_AsUnicode(v);
439n/a if (!unichars) return 0;
440n/a *p_itself = CFStringCreateWithCharacters((CFAllocatorRef)NULL, unichars, size);
441n/a return 1;
442n/a }
443n/a
444n/a """)
445n/a
446n/a def outputRepr(self):
447n/a Output()
448n/a Output("static PyObject * %s_repr(%s *self)", self.prefix, self.objecttype)
449n/a OutLbrace()
450n/a Output("char buf[100];")
451n/a Output("""sprintf(buf, "<CFStringRef object at 0x%%8.8x for 0x%%8.8x>", (unsigned)self, (unsigned)self->ob_itself);""")
452n/a Output("return PyString_FromString(buf);")
453n/a OutRbrace()
454n/a
455n/aclass CFMutableStringRefObjectDefinition(CFStringRefObjectDefinition):
456n/a basetype = "CFStringRef_Type"
457n/a
458n/a def outputCheckConvertArg(self):
459n/a # Mutable, don't allow Python strings
460n/a return MyGlobalObjectDefinition.outputCheckConvertArg(self)
461n/a
462n/a def outputRepr(self):
463n/a Output()
464n/a Output("static PyObject * %s_repr(%s *self)", self.prefix, self.objecttype)
465n/a OutLbrace()
466n/a Output("char buf[100];")
467n/a Output("""sprintf(buf, "<CFMutableStringRef object at 0x%%8.8x for 0x%%8.8x>", (unsigned)self, (unsigned)self->ob_itself);""")
468n/a Output("return PyString_FromString(buf);")
469n/a OutRbrace()
470n/a
471n/aclass CFURLRefObjectDefinition(MyGlobalObjectDefinition):
472n/a basetype = "CFTypeRef_Type"
473n/a
474n/a def outputRepr(self):
475n/a Output()
476n/a Output("static PyObject * %s_repr(%s *self)", self.prefix, self.objecttype)
477n/a OutLbrace()
478n/a Output("char buf[100];")
479n/a Output("""sprintf(buf, "<CFURL object at 0x%%8.8x for 0x%%8.8x>", (unsigned)self, (unsigned)self->ob_itself);""")
480n/a Output("return PyString_FromString(buf);")
481n/a OutRbrace()
482n/a
483n/a
484n/a# ADD object class here
485n/a
486n/a# From here on it's basically all boiler plate...
487n/a
488n/a# Create the generator groups and link them
489n/amodule = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff, variablestuff)
490n/aCFTypeRef_object = CFTypeRefObjectDefinition('CFTypeRef', 'CFTypeRefObj', 'CFTypeRef')
491n/aCFArrayRef_object = CFArrayRefObjectDefinition('CFArrayRef', 'CFArrayRefObj', 'CFArrayRef')
492n/aCFMutableArrayRef_object = CFMutableArrayRefObjectDefinition('CFMutableArrayRef', 'CFMutableArrayRefObj', 'CFMutableArrayRef')
493n/aCFDictionaryRef_object = CFDictionaryRefObjectDefinition('CFDictionaryRef', 'CFDictionaryRefObj', 'CFDictionaryRef')
494n/aCFMutableDictionaryRef_object = CFMutableDictionaryRefObjectDefinition('CFMutableDictionaryRef', 'CFMutableDictionaryRefObj', 'CFMutableDictionaryRef')
495n/aCFDataRef_object = CFDataRefObjectDefinition('CFDataRef', 'CFDataRefObj', 'CFDataRef')
496n/aCFMutableDataRef_object = CFMutableDataRefObjectDefinition('CFMutableDataRef', 'CFMutableDataRefObj', 'CFMutableDataRef')
497n/aCFStringRef_object = CFStringRefObjectDefinition('CFStringRef', 'CFStringRefObj', 'CFStringRef')
498n/aCFMutableStringRef_object = CFMutableStringRefObjectDefinition('CFMutableStringRef', 'CFMutableStringRefObj', 'CFMutableStringRef')
499n/aCFURLRef_object = CFURLRefObjectDefinition('CFURLRef', 'CFURLRefObj', 'CFURLRef')
500n/a
501n/a# ADD object here
502n/a
503n/amodule.addobject(CFTypeRef_object)
504n/amodule.addobject(CFArrayRef_object)
505n/amodule.addobject(CFMutableArrayRef_object)
506n/amodule.addobject(CFDictionaryRef_object)
507n/amodule.addobject(CFMutableDictionaryRef_object)
508n/amodule.addobject(CFDataRef_object)
509n/amodule.addobject(CFMutableDataRef_object)
510n/amodule.addobject(CFStringRef_object)
511n/amodule.addobject(CFMutableStringRef_object)
512n/amodule.addobject(CFURLRef_object)
513n/a# ADD addobject call here
514n/a
515n/a# Create the generator classes used to populate the lists
516n/aFunction = OSErrWeakLinkFunctionGenerator
517n/aMethod = OSErrWeakLinkMethodGenerator
518n/a
519n/a# Create and populate the lists
520n/afunctions = []
521n/aCFTypeRef_methods = []
522n/aCFArrayRef_methods = []
523n/aCFMutableArrayRef_methods = []
524n/aCFDictionaryRef_methods = []
525n/aCFMutableDictionaryRef_methods = []
526n/aCFDataRef_methods = []
527n/aCFMutableDataRef_methods = []
528n/aCFStringRef_methods = []
529n/aCFMutableStringRef_methods = []
530n/aCFURLRef_methods = []
531n/a
532n/a# ADD _methods initializer here
533n/aexecfile(INPUTFILE)
534n/a
535n/a
536n/a# add the populated lists to the generator groups
537n/a# (in a different wordl the scan program would generate this)
538n/afor f in functions: module.add(f)
539n/afor f in CFTypeRef_methods: CFTypeRef_object.add(f)
540n/afor f in CFArrayRef_methods: CFArrayRef_object.add(f)
541n/afor f in CFMutableArrayRef_methods: CFMutableArrayRef_object.add(f)
542n/afor f in CFDictionaryRef_methods: CFDictionaryRef_object.add(f)
543n/afor f in CFMutableDictionaryRef_methods: CFMutableDictionaryRef_object.add(f)
544n/afor f in CFDataRef_methods: CFDataRef_object.add(f)
545n/afor f in CFMutableDataRef_methods: CFMutableDataRef_object.add(f)
546n/afor f in CFStringRef_methods: CFStringRef_object.add(f)
547n/afor f in CFMutableStringRef_methods: CFMutableStringRef_object.add(f)
548n/afor f in CFURLRef_methods: CFURLRef_object.add(f)
549n/a
550n/a# Manual generators for getting data out of strings
551n/a
552n/agetasstring_body = """
553n/aint size = CFStringGetLength(_self->ob_itself)+1;
554n/achar *data = malloc(size);
555n/a
556n/aif( data == NULL ) return PyErr_NoMemory();
557n/aif ( CFStringGetCString(_self->ob_itself, data, size, 0) ) {
558n/a _res = (PyObject *)PyString_FromString(data);
559n/a} else {
560n/a PyErr_SetString(PyExc_RuntimeError, "CFStringGetCString could not fit the string");
561n/a _res = NULL;
562n/a}
563n/afree(data);
564n/areturn _res;
565n/a"""
566n/a
567n/af = ManualGenerator("CFStringGetString", getasstring_body);
568n/af.docstring = lambda: "() -> (string _rv)"
569n/aCFStringRef_object.add(f)
570n/a
571n/agetasunicode_body = """
572n/aint size = CFStringGetLength(_self->ob_itself)+1;
573n/aPy_UNICODE *data = malloc(size*sizeof(Py_UNICODE));
574n/aCFRange range;
575n/a
576n/arange.location = 0;
577n/arange.length = size;
578n/aif( data == NULL ) return PyErr_NoMemory();
579n/aCFStringGetCharacters(_self->ob_itself, range, data);
580n/a_res = (PyObject *)PyUnicode_FromUnicode(data, size-1);
581n/afree(data);
582n/areturn _res;
583n/a"""
584n/a
585n/af = ManualGenerator("CFStringGetUnicode", getasunicode_body);
586n/af.docstring = lambda: "() -> (unicode _rv)"
587n/aCFStringRef_object.add(f)
588n/a
589n/a# Get data from CFDataRef
590n/agetasdata_body = """
591n/aint size = CFDataGetLength(_self->ob_itself);
592n/achar *data = (char *)CFDataGetBytePtr(_self->ob_itself);
593n/a
594n/a_res = (PyObject *)PyString_FromStringAndSize(data, size);
595n/areturn _res;
596n/a"""
597n/a
598n/af = ManualGenerator("CFDataGetData", getasdata_body);
599n/af.docstring = lambda: "() -> (string _rv)"
600n/aCFDataRef_object.add(f)
601n/a
602n/a# Manual generator for CFPropertyListCreateFromXMLData because of funny error return
603n/afromxml_body = """
604n/aCFTypeRef _rv;
605n/aCFOptionFlags mutabilityOption;
606n/aCFStringRef errorString;
607n/aif (!PyArg_ParseTuple(_args, "l",
608n/a &mutabilityOption))
609n/a return NULL;
610n/a_rv = CFPropertyListCreateFromXMLData((CFAllocatorRef)NULL,
611n/a _self->ob_itself,
612n/a mutabilityOption,
613n/a &errorString);
614n/aif (errorString)
615n/a CFRelease(errorString);
616n/aif (_rv == NULL) {
617n/a PyErr_SetString(PyExc_RuntimeError, "Parse error in XML data");
618n/a return NULL;
619n/a}
620n/a_res = Py_BuildValue("O&",
621n/a CFTypeRefObj_New, _rv);
622n/areturn _res;
623n/a"""
624n/af = ManualGenerator("CFPropertyListCreateFromXMLData", fromxml_body)
625n/af.docstring = lambda: "(CFOptionFlags mutabilityOption) -> (CFTypeRefObj)"
626n/aCFTypeRef_object.add(f)
627n/a
628n/a# Convert CF objects to Python objects
629n/atoPython_body = """
630n/a_res = PyCF_CF2Python(_self->ob_itself);
631n/areturn _res;
632n/a"""
633n/a
634n/af = ManualGenerator("toPython", toPython_body);
635n/af.docstring = lambda: "() -> (python_object)"
636n/aCFTypeRef_object.add(f)
637n/a
638n/atoCF_body = """
639n/aCFTypeRef rv;
640n/aCFTypeID typeid;
641n/a
642n/aif (!PyArg_ParseTuple(_args, "O&", PyCF_Python2CF, &rv))
643n/a return NULL;
644n/atypeid = CFGetTypeID(rv);
645n/a
646n/aif (typeid == CFStringGetTypeID())
647n/a return Py_BuildValue("O&", CFStringRefObj_New, rv);
648n/aif (typeid == CFArrayGetTypeID())
649n/a return Py_BuildValue("O&", CFArrayRefObj_New, rv);
650n/aif (typeid == CFDictionaryGetTypeID())
651n/a return Py_BuildValue("O&", CFDictionaryRefObj_New, rv);
652n/aif (typeid == CFURLGetTypeID())
653n/a return Py_BuildValue("O&", CFURLRefObj_New, rv);
654n/a
655n/a_res = Py_BuildValue("O&", CFTypeRefObj_New, rv);
656n/areturn _res;
657n/a"""
658n/af = ManualGenerator("toCF", toCF_body);
659n/af.docstring = lambda: "(python_object) -> (CF_object)"
660n/amodule.add(f)
661n/a
662n/a# ADD add forloop here
663n/a
664n/a# generate output (open the output file as late as possible)
665n/aSetOutputFileName(OUTPUTFILE)
666n/amodule.generate()