ยปCore Development>Code coverage>Mac/Modules/file/filesupport.py

Python code coverage for Mac/Modules/file/filesupport.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# XXXX TO DO:
7n/a# - Implement correct missing FSSpec handling for Alias methods
8n/a# - Implement FInfo
9n/a#
10n/a# WARNING WARNING WARNING
11n/a# The file _Filemodule.c was modified manually, don't run this script
12n/a# unless you really know what you're doing.
13n/a
14n/aimport sys
15n/asys.exit(42)
16n/a
17n/aimport string
18n/a
19n/a# Declarations that change for each manager
20n/a#MACHEADERFILE = 'Files.h' # The Apple header file
21n/aMODNAME = '_File' # The name of the module
22n/aLONGMODNAME = 'Carbon.File' # The "normal" external name of the module
23n/a
24n/a# The following is *usually* unchanged but may still require tuning
25n/aMODPREFIX = 'File' # The prefix for module-wide routines
26n/aINPUTFILE = string.lower(MODPREFIX) + 'gen.py' # The file generated by the scanner
27n/aOUTPUTFILE = MODNAME + "module.c" # The file generated by this program
28n/a
29n/afrom macsupport import *
30n/a
31n/a# Various integers:
32n/aSInt64 = Type("SInt64", "L")
33n/aUInt64 = Type("UInt64", "L")
34n/aFNMessage = Type("FNMessage", "l")
35n/aFSAllocationFlags = Type("FSAllocationFlags", "H")
36n/aFSCatalogInfoBitmap = Type("FSCatalogInfoBitmap", "l")
37n/aFSIteratorFlags = Type("FSIteratorFlags", "l")
38n/aFSVolumeRefNum = Type("FSVolumeRefNum", "h")
39n/aAliasInfoType = Type("AliasInfoType", "h")
40n/a
41n/a# Various types of strings:
42n/a#class UniCharCountBuffer(InputOnlyType):
43n/a# pass
44n/aclass VarReverseInputBufferType(ReverseInputBufferMixin, VarInputBufferType):
45n/a pass
46n/aFullPathName = VarReverseInputBufferType()
47n/aConstStr31Param = OpaqueArrayType("Str31", "PyMac_BuildStr255", "PyMac_GetStr255")
48n/aConstStr32Param = OpaqueArrayType("Str32", "PyMac_BuildStr255", "PyMac_GetStr255")
49n/aConstStr63Param = OpaqueArrayType("Str63", "PyMac_BuildStr255", "PyMac_GetStr255")
50n/aStr63 = OpaqueArrayType("Str63", "PyMac_BuildStr255", "PyMac_GetStr255")
51n/a
52n/aHFSUniStr255 = OpaqueType("HFSUniStr255", "PyMac_BuildHFSUniStr255", "PyMac_GetHFSUniStr255")
53n/aUInt8_ptr = InputOnlyType("UInt8 *", "s")
54n/a
55n/a# Other types:
56n/aclass OptionalFSxxxType(OpaqueByValueType):
57n/a def declare(self, name):
58n/a Output("%s %s__buf__;", self.typeName, name)
59n/a Output("%s *%s = &%s__buf__;", self.typeName, name, name)
60n/a
61n/aclass FSCatalogInfoAndBitmapType(InputOnlyType):
62n/a
63n/a def __init__(self):
64n/a InputOnlyType.__init__(self, "BUG", "BUG")
65n/a
66n/a def declare(self, name):
67n/a Output("PyObject *%s__object = NULL;", name)
68n/a Output("FSCatalogInfoBitmap %s__bitmap = 0;", name)
69n/a Output("FSCatalogInfo %s;", name)
70n/a
71n/a def getargsFormat(self):
72n/a return "lO"
73n/a
74n/a def getargsArgs(self, name):
75n/a return "%s__bitmap, %s__object"%(name, name)
76n/a
77n/a def getargsCheck(self, name):
78n/a Output("if (!convert_FSCatalogInfo(%s__object, %s__bitmap, &%s)) return NULL;", name, name, name)
79n/a
80n/a def passInput(self, name):
81n/a return "%s__bitmap, &%s"% (name, name)
82n/a
83n/a def passOutput(self, name):
84n/a return "%s__bitmap, &%s"% (name, name)
85n/a
86n/a def mkvalueFormat(self):
87n/a return "O"
88n/a
89n/a def mkvalueArgs(self, name):
90n/a return "%s__object" % (name)
91n/a
92n/a def xxxxmkvalueCheck(self, name):
93n/a Output("if ((%s__object = new_FSCatalogInfo(%s__bitmap, &%s)) == NULL) return NULL;", name, name)
94n/a
95n/aclass FSCatalogInfoAndBitmap_inType(FSCatalogInfoAndBitmapType, InputOnlyMixIn):
96n/a
97n/a def xxxxmkvalueCheck(self, name):
98n/a pass
99n/a
100n/aclass FSCatalogInfoAndBitmap_outType(FSCatalogInfoAndBitmapType):
101n/a
102n/a def getargsFormat(self):
103n/a return "l"
104n/a
105n/a def getargsArgs(self, name):
106n/a return "%s__bitmap" % name
107n/a
108n/a def getargsCheck(self, name):
109n/a pass
110n/a
111n/aFInfo = OpaqueType("FInfo", "FInfo")
112n/aFInfo_ptr = OpaqueType("FInfo", "FInfo")
113n/aAliasHandle = OpaqueByValueType("AliasHandle", "Alias")
114n/aFSSpec = OpaqueType("FSSpec", "FSSpec")
115n/aFSSpec_ptr = OpaqueType("FSSpec", "FSSpec")
116n/aOptFSSpecPtr = OptionalFSxxxType("FSSpec", "BUG", "myPyMac_GetOptFSSpecPtr")
117n/aFSRef = OpaqueType("FSRef", "FSRef")
118n/aFSRef_ptr = OpaqueType("FSRef", "FSRef")
119n/aOptFSRefPtr = OptionalFSxxxType("FSRef", "BUG", "myPyMac_GetOptFSRefPtr")
120n/aFSCatalogInfo = OpaqueType("FSCatalogInfo", "FSCatalogInfo")
121n/aFSCatalogInfo_ptr = OpaqueType("FSCatalogInfo", "FSCatalogInfo")
122n/a
123n/a# To be done:
124n/a#CatPositionRec
125n/a#FSCatalogInfo
126n/a#FSForkInfo
127n/a#FSIterator
128n/a#FSVolumeInfo
129n/a#FSSpecArrayPtr
130n/a
131n/aincludestuff = includestuff + """
132n/a#include <Carbon/Carbon.h>
133n/a
134n/a#ifdef USE_TOOLBOX_OBJECT_GLUE
135n/aextern int _PyMac_GetFSSpec(PyObject *v, FSSpec *spec);
136n/aextern int _PyMac_GetFSRef(PyObject *v, FSRef *fsr);
137n/aextern PyObject *_PyMac_BuildFSSpec(FSSpec *spec);
138n/aextern PyObject *_PyMac_BuildFSRef(FSRef *spec);
139n/a
140n/a#define PyMac_GetFSSpec _PyMac_GetFSSpec
141n/a#define PyMac_GetFSRef _PyMac_GetFSRef
142n/a#define PyMac_BuildFSSpec _PyMac_BuildFSSpec
143n/a#define PyMac_BuildFSRef _PyMac_BuildFSRef
144n/a#else
145n/aextern int PyMac_GetFSSpec(PyObject *v, FSSpec *spec);
146n/aextern int PyMac_GetFSRef(PyObject *v, FSRef *fsr);
147n/aextern PyObject *PyMac_BuildFSSpec(FSSpec *spec);
148n/aextern PyObject *PyMac_BuildFSRef(FSRef *spec);
149n/a#endif
150n/a
151n/a/* Forward declarations */
152n/astatic PyObject *FInfo_New(FInfo *itself);
153n/astatic PyObject *FSRef_New(FSRef *itself);
154n/astatic PyObject *FSSpec_New(FSSpec *itself);
155n/astatic PyObject *Alias_New(AliasHandle itself);
156n/astatic int FInfo_Convert(PyObject *v, FInfo *p_itself);
157n/a#define FSRef_Convert PyMac_GetFSRef
158n/a#define FSSpec_Convert PyMac_GetFSSpec
159n/astatic int Alias_Convert(PyObject *v, AliasHandle *p_itself);
160n/a
161n/a/*
162n/a** UTCDateTime records
163n/a*/
164n/astatic int
165n/aUTCDateTime_Convert(PyObject *v, UTCDateTime *ptr)
166n/a{
167n/a return PyArg_Parse(v, "(HlH)", &ptr->highSeconds, &ptr->lowSeconds, &ptr->fraction);
168n/a}
169n/a
170n/astatic PyObject *
171n/aUTCDateTime_New(UTCDateTime *ptr)
172n/a{
173n/a return Py_BuildValue("(HlH)", ptr->highSeconds, ptr->lowSeconds, ptr->fraction);
174n/a}
175n/a
176n/a/*
177n/a** Optional fsspec and fsref pointers. None will pass NULL
178n/a*/
179n/astatic int
180n/amyPyMac_GetOptFSSpecPtr(PyObject *v, FSSpec **spec)
181n/a{
182n/a if (v == Py_None) {
183n/a *spec = NULL;
184n/a return 1;
185n/a }
186n/a return PyMac_GetFSSpec(v, *spec);
187n/a}
188n/a
189n/astatic int
190n/amyPyMac_GetOptFSRefPtr(PyObject *v, FSRef **ref)
191n/a{
192n/a if (v == Py_None) {
193n/a *ref = NULL;
194n/a return 1;
195n/a }
196n/a return PyMac_GetFSRef(v, *ref);
197n/a}
198n/a
199n/a/*
200n/a** Parse/generate objsect
201n/a*/
202n/astatic PyObject *
203n/aPyMac_BuildHFSUniStr255(HFSUniStr255 *itself)
204n/a{
205n/a
206n/a return Py_BuildValue("u#", itself->unicode, itself->length);
207n/a}
208n/a
209n/a#ifndef __LP64__
210n/a/*
211n/a** Get pathname for a given FSSpec
212n/a*/
213n/astatic OSErr
214n/a_PyMac_GetFullPathname(FSSpec *fss, char *path, int len)
215n/a{
216n/a FSRef fsr;
217n/a OSErr err;
218n/a
219n/a *path = '\0';
220n/a err = FSpMakeFSRef(fss, &fsr);
221n/a if (err == fnfErr) {
222n/a /* FSSpecs can point to non-existing files, fsrefs can't. */
223n/a FSSpec fss2;
224n/a int tocopy;
225n/a
226n/a err = FSMakeFSSpec(fss->vRefNum, fss->parID, "", &fss2);
227n/a if (err)
228n/a return err;
229n/a err = FSpMakeFSRef(&fss2, &fsr);
230n/a if (err)
231n/a return err;
232n/a err = (OSErr)FSRefMakePath(&fsr, path, len-1);
233n/a if (err)
234n/a return err;
235n/a /* This part is not 100% safe: we append the filename part, but
236n/a ** I'm not sure that we don't run afoul of the various 8bit
237n/a ** encodings here. Will have to look this up at some point...
238n/a */
239n/a strcat(path, "/");
240n/a tocopy = fss->name[0];
241n/a if ((strlen(path) + tocopy) >= len)
242n/a tocopy = len - strlen(path) - 1;
243n/a if (tocopy > 0)
244n/a strncat(path, fss->name+1, tocopy);
245n/a }
246n/a else {
247n/a if (err)
248n/a return err;
249n/a err = (OSErr)FSRefMakePath(&fsr, path, len);
250n/a if (err)
251n/a return err;
252n/a }
253n/a return 0;
254n/a}
255n/a#endif /* !__LP64__ */
256n/a
257n/a"""
258n/a
259n/afinalstuff = finalstuff + """
260n/a
261n/a#ifndef __LP64__
262n/aint
263n/aPyMac_GetFSSpec(PyObject *v, FSSpec *spec)
264n/a{
265n/a Str255 path;
266n/a short refnum;
267n/a long parid;
268n/a OSErr err;
269n/a FSRef fsr;
270n/a
271n/a if (FSSpec_Check(v)) {
272n/a *spec = ((FSSpecObject *)v)->ob_itself;
273n/a return 1;
274n/a }
275n/a
276n/a if (PyArg_Parse(v, "(hlO&)",
277n/a &refnum, &parid, PyMac_GetStr255, &path)) {
278n/a err = FSMakeFSSpec(refnum, parid, path, spec);
279n/a if ( err && err != fnfErr ) {
280n/a PyMac_Error(err);
281n/a return 0;
282n/a }
283n/a return 1;
284n/a }
285n/a PyErr_Clear();
286n/a /* Otherwise we try to go via an FSRef. On OSX we go all the way,
287n/a ** on OS9 we accept only a real FSRef object
288n/a */
289n/a if ( PyMac_GetFSRef(v, &fsr) ) {
290n/a err = FSGetCatalogInfo(&fsr, kFSCatInfoNone, NULL, NULL, spec, NULL);
291n/a if (err != noErr) {
292n/a PyMac_Error(err);
293n/a return 0;
294n/a }
295n/a return 1;
296n/a }
297n/a return 0;
298n/a}
299n/a
300n/a#endif /* !__LP64__ */
301n/a
302n/aint
303n/aPyMac_GetFSRef(PyObject *v, FSRef *fsr)
304n/a{
305n/a OSStatus err;
306n/a FSSpec fss;
307n/a
308n/a if (FSRef_Check(v)) {
309n/a *fsr = ((FSRefObject *)v)->ob_itself;
310n/a return 1;
311n/a }
312n/a
313n/a /* On OSX we now try a pathname */
314n/a if ( PyString_Check(v) || PyUnicode_Check(v)) {
315n/a char *path = NULL;
316n/a if (!PyArg_Parse(v, "et", Py_FileSystemDefaultEncoding, &path))
317n/a return 0;
318n/a if ( (err=FSPathMakeRef(path, fsr, NULL)) )
319n/a PyMac_Error(err);
320n/a PyMem_Free(path);
321n/a return !err;
322n/a }
323n/a /* XXXX Should try unicode here too */
324n/a /* Otherwise we try to go via an FSSpec */
325n/a#ifndef __LP64__
326n/a if (FSSpec_Check(v)) {
327n/a fss = ((FSSpecObject *)v)->ob_itself;
328n/a if ((err=FSpMakeFSRef(&fss, fsr)) == 0)
329n/a return 1;
330n/a PyMac_Error(err);
331n/a return 0;
332n/a }
333n/a PyErr_SetString(PyExc_TypeError, "FSRef, FSSpec or pathname required");
334n/a#else /* __LP64__ */
335n/a PyErr_SetString(PyExc_TypeError, "FSRef or pathname required");
336n/a#endif /* __LP64__ */
337n/a return 0;
338n/a}
339n/a
340n/a#ifndef __LP64__
341n/aextern PyObject *
342n/aPyMac_BuildFSSpec(FSSpec *spec)
343n/a{
344n/a return FSSpec_New(spec);
345n/a}
346n/a#endif /* __LP64__ */
347n/a
348n/aextern PyObject *
349n/aPyMac_BuildFSRef(FSRef *spec)
350n/a{
351n/a return FSRef_New(spec);
352n/a}
353n/a"""
354n/a
355n/ainitstuff = initstuff + """
356n/a#ifndef __LP64__
357n/aPyMac_INIT_TOOLBOX_OBJECT_NEW(FSSpec *, PyMac_BuildFSSpec);
358n/aPyMac_INIT_TOOLBOX_OBJECT_CONVERT(FSSpec, PyMac_GetFSSpec);
359n/a#endif /* !__LP64__*/
360n/aPyMac_INIT_TOOLBOX_OBJECT_NEW(FSRef *, PyMac_BuildFSRef);
361n/aPyMac_INIT_TOOLBOX_OBJECT_CONVERT(FSRef, PyMac_GetFSRef);
362n/a"""
363n/a
364n/aexecfile(string.lower(MODPREFIX) + 'typetest.py')
365n/a
366n/a# Our object types:
367n/aclass FSCatalogInfoDefinition(PEP253Mixin, ObjectDefinition):
368n/a getsetlist = [
369n/a ("nodeFlags",
370n/a "return Py_BuildValue(\"H\", self->ob_itself.nodeFlags);",
371n/a "return PyArg_Parse(v, \"H\", &self->ob_itself.nodeFlags)-1;",
372n/a None
373n/a ),
374n/a ("volume",
375n/a "return Py_BuildValue(\"h\", self->ob_itself.volume);",
376n/a "return PyArg_Parse(v, \"h\", &self->ob_itself.volume)-1;",
377n/a None
378n/a ),
379n/a ("parentDirID",
380n/a "return Py_BuildValue(\"l\", self->ob_itself.parentDirID);",
381n/a "return PyArg_Parse(v, \"l\", &self->ob_itself.parentDirID)-1;",
382n/a None
383n/a ),
384n/a ("nodeID",
385n/a "return Py_BuildValue(\"l\", self->ob_itself.nodeID);",
386n/a "return PyArg_Parse(v, \"l\", &self->ob_itself.nodeID)-1;",
387n/a None
388n/a ),
389n/a ("createDate",
390n/a "return Py_BuildValue(\"O&\", UTCDateTime_New, &self->ob_itself.createDate);",
391n/a "return PyArg_Parse(v, \"O&\", UTCDateTime_Convert, &self->ob_itself.createDate)-1;",
392n/a None
393n/a ),
394n/a ("contentModDate",
395n/a "return Py_BuildValue(\"O&\", UTCDateTime_New, &self->ob_itself.contentModDate);",
396n/a "return PyArg_Parse(v, \"O&\", UTCDateTime_Convert, &self->ob_itself.contentModDate)-1;",
397n/a None
398n/a ),
399n/a ("attributeModDate",
400n/a "return Py_BuildValue(\"O&\", UTCDateTime_New, &self->ob_itself.attributeModDate);",
401n/a "return PyArg_Parse(v, \"O&\", UTCDateTime_Convert, &self->ob_itself.attributeModDate)-1;",
402n/a None
403n/a ),
404n/a ("accessDate",
405n/a "return Py_BuildValue(\"O&\", UTCDateTime_New, &self->ob_itself.accessDate);",
406n/a "return PyArg_Parse(v, \"O&\", UTCDateTime_Convert, &self->ob_itself.accessDate)-1;",
407n/a None
408n/a ),
409n/a ("backupDate",
410n/a "return Py_BuildValue(\"O&\", UTCDateTime_New, &self->ob_itself.backupDate);",
411n/a "return PyArg_Parse(v, \"O&\", UTCDateTime_Convert, &self->ob_itself.backupDate)-1;",
412n/a None
413n/a ),
414n/a ("permissions",
415n/a "return Py_BuildValue(\"(llll)\", self->ob_itself.permissions[0], self->ob_itself.permissions[1], self->ob_itself.permissions[2], self->ob_itself.permissions[3]);",
416n/a "return PyArg_Parse(v, \"(llll)\", &self->ob_itself.permissions[0], &self->ob_itself.permissions[1], &self->ob_itself.permissions[2], &self->ob_itself.permissions[3])-1;",
417n/a None
418n/a ),
419n/a # XXXX FinderInfo TBD
420n/a # XXXX FinderXInfo TBD
421n/a ("valence",
422n/a "return Py_BuildValue(\"l\", self->ob_itself.valence);",
423n/a "return PyArg_Parse(v, \"l\", &self->ob_itself.valence)-1;",
424n/a None
425n/a ),
426n/a ("dataLogicalSize",
427n/a "return Py_BuildValue(\"l\", self->ob_itself.dataLogicalSize);",
428n/a "return PyArg_Parse(v, \"l\", &self->ob_itself.dataLogicalSize)-1;",
429n/a None
430n/a ),
431n/a ("dataPhysicalSize",
432n/a "return Py_BuildValue(\"l\", self->ob_itself.dataPhysicalSize);",
433n/a "return PyArg_Parse(v, \"l\", &self->ob_itself.dataPhysicalSize)-1;",
434n/a None
435n/a ),
436n/a ("rsrcLogicalSize",
437n/a "return Py_BuildValue(\"l\", self->ob_itself.rsrcLogicalSize);",
438n/a "return PyArg_Parse(v, \"l\", &self->ob_itself.rsrcLogicalSize)-1;",
439n/a None
440n/a ),
441n/a ("rsrcPhysicalSize",
442n/a "return Py_BuildValue(\"l\", self->ob_itself.rsrcPhysicalSize);",
443n/a "return PyArg_Parse(v, \"l\", &self->ob_itself.rsrcPhysicalSize)-1;",
444n/a None
445n/a ),
446n/a ("sharingFlags",
447n/a "return Py_BuildValue(\"l\", self->ob_itself.sharingFlags);",
448n/a "return PyArg_Parse(v, \"l\", &self->ob_itself.sharingFlags)-1;",
449n/a None
450n/a ),
451n/a ("userPrivileges",
452n/a "return Py_BuildValue(\"b\", self->ob_itself.userPrivileges);",
453n/a "return PyArg_Parse(v, \"b\", &self->ob_itself.userPrivileges)-1;",
454n/a None
455n/a ),
456n/a ]
457n/a # The same info, but in a different form
458n/a INITFORMAT = "HhllO&O&O&O&O&llllllb"
459n/a INITARGS = """&((FSCatalogInfoObject *)_self)->ob_itself.nodeFlags,
460n/a &((FSCatalogInfoObject *)_self)->ob_itself.volume,
461n/a &((FSCatalogInfoObject *)_self)->ob_itself.parentDirID,
462n/a &((FSCatalogInfoObject *)_self)->ob_itself.nodeID,
463n/a UTCDateTime_Convert, &((FSCatalogInfoObject *)_self)->ob_itself.createDate,
464n/a UTCDateTime_Convert, &((FSCatalogInfoObject *)_self)->ob_itself.contentModDate,
465n/a UTCDateTime_Convert, &((FSCatalogInfoObject *)_self)->ob_itself.attributeModDate,
466n/a UTCDateTime_Convert, &((FSCatalogInfoObject *)_self)->ob_itself.accessDate,
467n/a UTCDateTime_Convert, &((FSCatalogInfoObject *)_self)->ob_itself.backupDate,
468n/a &((FSCatalogInfoObject *)_self)->ob_itself.valence,
469n/a &((FSCatalogInfoObject *)_self)->ob_itself.dataLogicalSize,
470n/a &((FSCatalogInfoObject *)_self)->ob_itself.dataPhysicalSize,
471n/a &((FSCatalogInfoObject *)_self)->ob_itself.rsrcLogicalSize,
472n/a &((FSCatalogInfoObject *)_self)->ob_itself.rsrcPhysicalSize,
473n/a &((FSCatalogInfoObject *)_self)->ob_itself.sharingFlags,
474n/a &((FSCatalogInfoObject *)_self)->ob_itself.userPrivileges"""
475n/a INITNAMES = """
476n/a "nodeFlags",
477n/a "volume",
478n/a "parentDirID",
479n/a "nodeID",
480n/a "createDate",
481n/a "contentModDate",
482n/a "atributeModDate",
483n/a "accessDate",
484n/a "backupDate",
485n/a "valence",
486n/a "dataLogicalSize",
487n/a "dataPhysicalSize",
488n/a "rsrcLogicalSize",
489n/a "rsrcPhysicalSize",
490n/a "sharingFlags",
491n/a "userPrivileges"
492n/a """
493n/a
494n/a def __init__(self, name, prefix, itselftype):
495n/a ObjectDefinition.__init__(self, name, prefix, itselftype)
496n/a self.argref = "*" # Store FSSpecs, but pass them by address
497n/a
498n/a def outputCheckNewArg(self):
499n/a Output("if (itself == NULL) { Py_INCREF(Py_None); return Py_None; }")
500n/a
501n/a def output_tp_newBody(self):
502n/a Output("PyObject *self;");
503n/a Output()
504n/a Output("if ((self = type->tp_alloc(type, 0)) == NULL) return NULL;")
505n/a Output("memset(&((%s *)self)->ob_itself, 0, sizeof(%s));",
506n/a self.objecttype, self.itselftype)
507n/a Output("return self;")
508n/a
509n/a def output_tp_initBody(self):
510n/a Output("static char *kw[] = {%s, 0};", self.INITNAMES)
511n/a Output()
512n/a Output("if (!PyArg_ParseTupleAndKeywords(_args, _kwds, \"|%s\", kw, %s))",
513n/a self.INITFORMAT, self.INITARGS)
514n/a OutLbrace()
515n/a Output("return -1;")
516n/a OutRbrace()
517n/a Output("return 0;")
518n/a
519n/aclass FInfoDefinition(PEP253Mixin, ObjectDefinition):
520n/a getsetlist = [
521n/a ("Type",
522n/a "return Py_BuildValue(\"O&\", PyMac_BuildOSType, self->ob_itself.fdType);",
523n/a "return PyArg_Parse(v, \"O&\", PyMac_GetOSType, &self->ob_itself.fdType)-1;",
524n/a "4-char file type"
525n/a ),
526n/a ("Creator",
527n/a "return Py_BuildValue(\"O&\", PyMac_BuildOSType, self->ob_itself.fdCreator);",
528n/a "return PyArg_Parse(v, \"O&\", PyMac_GetOSType, &self->ob_itself.fdCreator)-1;",
529n/a "4-char file creator"
530n/a ),
531n/a ("Flags",
532n/a "return Py_BuildValue(\"H\", self->ob_itself.fdFlags);",
533n/a "return PyArg_Parse(v, \"H\", &self->ob_itself.fdFlags)-1;",
534n/a "Finder flag bits"
535n/a ),
536n/a ("Location",
537n/a "return Py_BuildValue(\"O&\", PyMac_BuildPoint, self->ob_itself.fdLocation);",
538n/a "return PyArg_Parse(v, \"O&\", PyMac_GetPoint, &self->ob_itself.fdLocation)-1;",
539n/a "(x, y) location of the file's icon in its parent finder window"
540n/a ),
541n/a ("Fldr",
542n/a "return Py_BuildValue(\"h\", self->ob_itself.fdFldr);",
543n/a "return PyArg_Parse(v, \"h\", &self->ob_itself.fdFldr)-1;",
544n/a "Original folder, for 'put away'"
545n/a ),
546n/a
547n/a ]
548n/a
549n/a def __init__(self, name, prefix, itselftype):
550n/a ObjectDefinition.__init__(self, name, prefix, itselftype)
551n/a self.argref = "*" # Store FSSpecs, but pass them by address
552n/a
553n/a def outputCheckNewArg(self):
554n/a Output("if (itself == NULL) return PyMac_Error(resNotFound);")
555n/a
556n/a def output_tp_newBody(self):
557n/a Output("PyObject *self;");
558n/a Output()
559n/a Output("if ((self = type->tp_alloc(type, 0)) == NULL) return NULL;")
560n/a Output("memset(&((%s *)self)->ob_itself, 0, sizeof(%s));",
561n/a self.objecttype, self.itselftype)
562n/a Output("return self;")
563n/a
564n/a def output_tp_initBody(self):
565n/a Output("%s *itself = NULL;", self.itselftype)
566n/a Output("static char *kw[] = {\"itself\", 0};")
567n/a Output()
568n/a Output("if (PyArg_ParseTupleAndKeywords(_args, _kwds, \"|O&\", kw, FInfo_Convert, &itself))")
569n/a OutLbrace()
570n/a Output("if (itself) memcpy(&((%s *)_self)->ob_itself, itself, sizeof(%s));",
571n/a self.objecttype, self.itselftype)
572n/a Output("return 0;")
573n/a OutRbrace()
574n/a Output("return -1;")
575n/a
576n/aclass FSSpecDefinition(PEP253Mixin, ObjectDefinition):
577n/a getsetlist = [
578n/a ("data",
579n/a "return PyString_FromStringAndSize((char *)&self->ob_itself, sizeof(self->ob_itself));",
580n/a None,
581n/a "Raw data of the FSSpec object"
582n/a )
583n/a ]
584n/a
585n/a def __init__(self, name, prefix, itselftype):
586n/a ObjectDefinition.__init__(self, name, prefix, itselftype)
587n/a self.argref = "*" # Store FSSpecs, but pass them by address
588n/a
589n/a def outputCheckNewArg(self):
590n/a Output("if (itself == NULL) return PyMac_Error(resNotFound);")
591n/a
592n/a # We do Convert ourselves (with PyMac_GetFSxxx)
593n/a def outputConvert(self):
594n/a pass
595n/a
596n/a def output_tp_newBody(self):
597n/a Output("PyObject *self;");
598n/a Output()
599n/a Output("if ((self = type->tp_alloc(type, 0)) == NULL) return NULL;")
600n/a Output("memset(&((%s *)self)->ob_itself, 0, sizeof(%s));",
601n/a self.objecttype, self.itselftype)
602n/a Output("return self;")
603n/a
604n/a def output_tp_initBody(self):
605n/a Output("PyObject *v = NULL;")
606n/a Output("char *rawdata = NULL;")
607n/a Output("int rawdatalen = 0;")
608n/a Output("static char *kw[] = {\"itself\", \"rawdata\", 0};")
609n/a Output()
610n/a Output("if (!PyArg_ParseTupleAndKeywords(_args, _kwds, \"|Os#\", kw, &v, &rawdata, &rawdatalen))")
611n/a Output("return -1;")
612n/a Output("if (v && rawdata)")
613n/a OutLbrace()
614n/a Output("PyErr_SetString(PyExc_TypeError, \"Only one of itself or rawdata may be specified\");")
615n/a Output("return -1;")
616n/a OutRbrace()
617n/a Output("if (!v && !rawdata)")
618n/a OutLbrace()
619n/a Output("PyErr_SetString(PyExc_TypeError, \"One of itself or rawdata must be specified\");")
620n/a Output("return -1;")
621n/a OutRbrace()
622n/a Output("if (rawdata)")
623n/a OutLbrace()
624n/a Output("if (rawdatalen != sizeof(%s))", self.itselftype)
625n/a OutLbrace()
626n/a Output("PyErr_SetString(PyExc_TypeError, \"%s rawdata incorrect size\");",
627n/a self.itselftype)
628n/a Output("return -1;")
629n/a OutRbrace()
630n/a Output("memcpy(&((%s *)_self)->ob_itself, rawdata, rawdatalen);", self.objecttype)
631n/a Output("return 0;")
632n/a OutRbrace()
633n/a Output("if (PyMac_GetFSSpec(v, &((%s *)_self)->ob_itself)) return 0;", self.objecttype)
634n/a Output("return -1;")
635n/a
636n/a def outputRepr(self):
637n/a Output()
638n/a Output("static PyObject * %s_repr(%s *self)", self.prefix, self.objecttype)
639n/a OutLbrace()
640n/a Output("char buf[512];")
641n/a Output("""PyOS_snprintf(buf, sizeof(buf), \"%%s((%%d, %%ld, '%%.*s'))\",
642n/a self->ob_type->tp_name,
643n/a self->ob_itself.vRefNum,
644n/a self->ob_itself.parID,
645n/a self->ob_itself.name[0], self->ob_itself.name+1);""")
646n/a Output("return PyString_FromString(buf);")
647n/a OutRbrace()
648n/a
649n/aclass FSRefDefinition(PEP253Mixin, ObjectDefinition):
650n/a getsetlist = [
651n/a ("data",
652n/a "return PyString_FromStringAndSize((char *)&self->ob_itself, sizeof(self->ob_itself));",
653n/a None,
654n/a "Raw data of the FSRef object"
655n/a )
656n/a ]
657n/a
658n/a def __init__(self, name, prefix, itselftype):
659n/a ObjectDefinition.__init__(self, name, prefix, itselftype)
660n/a self.argref = "*" # Store FSRefs, but pass them by address
661n/a
662n/a def outputCheckNewArg(self):
663n/a Output("if (itself == NULL) return PyMac_Error(resNotFound);")
664n/a
665n/a # We do Convert ourselves (with PyMac_GetFSxxx)
666n/a def outputConvert(self):
667n/a pass
668n/a
669n/a def output_tp_newBody(self):
670n/a Output("PyObject *self;");
671n/a Output()
672n/a Output("if ((self = type->tp_alloc(type, 0)) == NULL) return NULL;")
673n/a Output("memset(&((%s *)self)->ob_itself, 0, sizeof(%s));",
674n/a self.objecttype, self.itselftype)
675n/a Output("return self;")
676n/a
677n/a def output_tp_initBody(self):
678n/a Output("PyObject *v = NULL;")
679n/a Output("char *rawdata = NULL;")
680n/a Output("int rawdatalen = 0;")
681n/a Output("static char *kw[] = {\"itself\", \"rawdata\", 0};")
682n/a Output()
683n/a Output("if (!PyArg_ParseTupleAndKeywords(_args, _kwds, \"|Os#\", kw, &v, &rawdata, &rawdatalen))")
684n/a Output("return -1;")
685n/a Output("if (v && rawdata)")
686n/a OutLbrace()
687n/a Output("PyErr_SetString(PyExc_TypeError, \"Only one of itself or rawdata may be specified\");")
688n/a Output("return -1;")
689n/a OutRbrace()
690n/a Output("if (!v && !rawdata)")
691n/a OutLbrace()
692n/a Output("PyErr_SetString(PyExc_TypeError, \"One of itself or rawdata must be specified\");")
693n/a Output("return -1;")
694n/a OutRbrace()
695n/a Output("if (rawdata)")
696n/a OutLbrace()
697n/a Output("if (rawdatalen != sizeof(%s))", self.itselftype)
698n/a OutLbrace()
699n/a Output("PyErr_SetString(PyExc_TypeError, \"%s rawdata incorrect size\");",
700n/a self.itselftype)
701n/a Output("return -1;")
702n/a OutRbrace()
703n/a Output("memcpy(&((%s *)_self)->ob_itself, rawdata, rawdatalen);", self.objecttype)
704n/a Output("return 0;")
705n/a OutRbrace()
706n/a Output("if (PyMac_GetFSRef(v, &((%s *)_self)->ob_itself)) return 0;", self.objecttype)
707n/a Output("return -1;")
708n/a
709n/aclass AliasDefinition(PEP253Mixin, ObjectDefinition):
710n/a # XXXX Should inherit from resource?
711n/a getsetlist = [
712n/a ("data",
713n/a """int size;
714n/a PyObject *rv;
715n/a
716n/a size = GetHandleSize((Handle)self->ob_itself);
717n/a HLock((Handle)self->ob_itself);
718n/a rv = PyString_FromStringAndSize(*(Handle)self->ob_itself, size);
719n/a HUnlock((Handle)self->ob_itself);
720n/a return rv;
721n/a """,
722n/a None,
723n/a "Raw data of the alias object"
724n/a )
725n/a ]
726n/a
727n/a def outputCheckNewArg(self):
728n/a Output("if (itself == NULL) return PyMac_Error(resNotFound);")
729n/a
730n/a def outputStructMembers(self):
731n/a ObjectDefinition.outputStructMembers(self)
732n/a Output("void (*ob_freeit)(%s ptr);", self.itselftype)
733n/a
734n/a def outputInitStructMembers(self):
735n/a ObjectDefinition.outputInitStructMembers(self)
736n/a Output("it->ob_freeit = NULL;")
737n/a
738n/a def outputCleanupStructMembers(self):
739n/a Output("if (self->ob_freeit && self->ob_itself)")
740n/a OutLbrace()
741n/a Output("self->ob_freeit(self->ob_itself);")
742n/a OutRbrace()
743n/a Output("self->ob_itself = NULL;")
744n/a
745n/a def output_tp_newBody(self):
746n/a Output("PyObject *self;");
747n/a Output()
748n/a Output("if ((self = type->tp_alloc(type, 0)) == NULL) return NULL;")
749n/a Output("((%s *)self)->ob_itself = NULL;", self.objecttype)
750n/a Output("return self;")
751n/a
752n/a def output_tp_initBody(self):
753n/a Output("%s itself = NULL;", self.itselftype)
754n/a Output("char *rawdata = NULL;")
755n/a Output("int rawdatalen = 0;")
756n/a Output("Handle h;")
757n/a Output("static char *kw[] = {\"itself\", \"rawdata\", 0};")
758n/a Output()
759n/a Output("if (!PyArg_ParseTupleAndKeywords(_args, _kwds, \"|O&s#\", kw, %s_Convert, &itself, &rawdata, &rawdatalen))",
760n/a self.prefix)
761n/a Output("return -1;")
762n/a Output("if (itself && rawdata)")
763n/a OutLbrace()
764n/a Output("PyErr_SetString(PyExc_TypeError, \"Only one of itself or rawdata may be specified\");")
765n/a Output("return -1;")
766n/a OutRbrace()
767n/a Output("if (!itself && !rawdata)")
768n/a OutLbrace()
769n/a Output("PyErr_SetString(PyExc_TypeError, \"One of itself or rawdata must be specified\");")
770n/a Output("return -1;")
771n/a OutRbrace()
772n/a Output("if (rawdata)")
773n/a OutLbrace()
774n/a Output("if ((h = NewHandle(rawdatalen)) == NULL)")
775n/a OutLbrace()
776n/a Output("PyErr_NoMemory();")
777n/a Output("return -1;")
778n/a OutRbrace()
779n/a Output("HLock(h);")
780n/a Output("memcpy((char *)*h, rawdata, rawdatalen);")
781n/a Output("HUnlock(h);")
782n/a Output("((%s *)_self)->ob_itself = (%s)h;", self.objecttype, self.itselftype)
783n/a Output("return 0;")
784n/a OutRbrace()
785n/a Output("((%s *)_self)->ob_itself = itself;", self.objecttype)
786n/a Output("return 0;")
787n/a
788n/a# Alias methods come in two flavors: those with the alias as arg1 and
789n/a# those with the alias as arg 2.
790n/aclass Arg2MethodGenerator(OSErrMethodGenerator):
791n/a """Similar to MethodGenerator, but has self as second argument"""
792n/a
793n/a def parseArgumentList(self, args):
794n/a args0, arg1, argsrest = args[:1], args[1], args[2:]
795n/a t0, n0, m0 = arg1
796n/a args = args0 + argsrest
797n/a if m0 != InMode:
798n/a raise ValueError, "method's 'self' must be 'InMode'"
799n/a self.itself = Variable(t0, "_self->ob_itself", SelfMode)
800n/a FunctionGenerator.parseArgumentList(self, args)
801n/a self.argumentList.insert(2, self.itself)
802n/a
803n/a# From here on it's basically all boiler plate...
804n/a
805n/a# Create the generator groups and link them
806n/amodule = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff,
807n/a longname=LONGMODNAME)
808n/a
809n/afscataloginfoobject = FSCatalogInfoDefinition('FSCatalogInfo', 'FSCatalogInfo', 'FSCatalogInfo')
810n/afinfoobject = FInfoDefinition('FInfo', 'FInfo', 'FInfo')
811n/aaliasobject = AliasDefinition('Alias', 'Alias', 'AliasHandle')
812n/afsspecobject = FSSpecDefinition('FSSpec', 'FSSpec', 'FSSpec')
813n/afsrefobject = FSRefDefinition('FSRef', 'FSRef', 'FSRef')
814n/a
815n/amodule.addobject(fscataloginfoobject)
816n/amodule.addobject(finfoobject)
817n/amodule.addobject(aliasobject)
818n/amodule.addobject(fsspecobject)
819n/amodule.addobject(fsrefobject)
820n/a
821n/a# Create the generator classes used to populate the lists
822n/aFunction = OSErrFunctionGenerator
823n/aMethod = OSErrMethodGenerator
824n/a
825n/a# Create and populate the lists
826n/afunctions = []
827n/aalias_methods = []
828n/afsref_methods = []
829n/afsspec_methods = []
830n/aexecfile(INPUTFILE)
831n/a
832n/a# Manual generators:
833n/aFSRefMakePath_body = """
834n/aOSStatus _err;
835n/a#define MAXPATHNAME 1024
836n/aUInt8 path[MAXPATHNAME];
837n/aUInt32 maxPathSize = MAXPATHNAME;
838n/a
839n/aif (!PyArg_ParseTuple(_args, ""))
840n/a return NULL;
841n/a_err = FSRefMakePath(&_self->ob_itself,
842n/a path,
843n/a maxPathSize);
844n/aif (_err != noErr) return PyMac_Error(_err);
845n/a_res = Py_BuildValue("s", path);
846n/areturn _res;
847n/a"""
848n/af = ManualGenerator("FSRefMakePath", FSRefMakePath_body)
849n/af.docstring = lambda: "() -> string"
850n/afsref_methods.append(f)
851n/a
852n/aFSRef_as_pathname_body = """
853n/aif (!PyArg_ParseTuple(_args, ""))
854n/a return NULL;
855n/a_res = FSRef_FSRefMakePath(_self, _args);
856n/areturn _res;
857n/a"""
858n/af = ManualGenerator("as_pathname", FSRef_as_pathname_body)
859n/af.docstring = lambda: "() -> string"
860n/afsref_methods.append(f)
861n/a
862n/aFSSpec_as_pathname_body = """
863n/achar strbuf[1024];
864n/aOSErr err;
865n/a
866n/aif (!PyArg_ParseTuple(_args, ""))
867n/a return NULL;
868n/aerr = _PyMac_GetFullPathname(&_self->ob_itself, strbuf, sizeof(strbuf));
869n/aif ( err ) {
870n/a PyMac_Error(err);
871n/a return NULL;
872n/a}
873n/a_res = PyString_FromString(strbuf);
874n/areturn _res;
875n/a"""
876n/af = ManualGenerator("as_pathname", FSSpec_as_pathname_body)
877n/af.docstring = lambda: "() -> string"
878n/afsspec_methods.append(f)
879n/a
880n/aFSSpec_as_tuple_body = """
881n/aif (!PyArg_ParseTuple(_args, ""))
882n/a return NULL;
883n/a_res = Py_BuildValue("(iis#)", _self->ob_itself.vRefNum, _self->ob_itself.parID,
884n/a &_self->ob_itself.name[1], _self->ob_itself.name[0]);
885n/areturn _res;
886n/a"""
887n/af = ManualGenerator("as_tuple", FSSpec_as_tuple_body)
888n/af.docstring = lambda: "() -> (vRefNum, dirID, name)"
889n/afsspec_methods.append(f)
890n/a
891n/apathname_body = """
892n/aPyObject *obj;
893n/a
894n/aif (!PyArg_ParseTuple(_args, "O", &obj))
895n/a return NULL;
896n/aif (PyString_Check(obj)) {
897n/a Py_INCREF(obj);
898n/a return obj;
899n/a}
900n/aif (PyUnicode_Check(obj))
901n/a return PyUnicode_AsEncodedString(obj, "utf8", "strict");
902n/a_res = PyObject_CallMethod(obj, "as_pathname", NULL);
903n/areturn _res;
904n/a"""
905n/af = ManualGenerator("pathname", pathname_body)
906n/af.docstring = lambda: "(str|unicode|FSSpec|FSref) -> pathname"
907n/afunctions.append(f)
908n/a
909n/a# add the populated lists to the generator groups
910n/a# (in a different wordl the scan program would generate this)
911n/afor f in functions: module.add(f)
912n/afor f in alias_methods: aliasobject.add(f)
913n/afor f in fsspec_methods: fsspecobject.add(f)
914n/afor f in fsref_methods: fsrefobject.add(f)
915n/a
916n/a# generate output (open the output file as late as possible)
917n/aSetOutputFileName(OUTPUTFILE)
918n/amodule.generate()