1 # This script generates a Python interface for an Apple Macintosh Manager.
2 # It uses the "bgen" package to generate C code.
3 # The function specifications are generated by scanning the mamager's header file,
4 # using the "scantools" package (customized for this particular manager).
7 # - Implement correct missing FSSpec handling for Alias methods
12 # Declarations that change for each manager
13 #MACHEADERFILE = 'Files.h' # The Apple header file
14 MODNAME
= '_File' # The name of the module
15 LONGMODNAME
= 'Carbon.File' # The "normal" external name of the module
17 # The following is *usually* unchanged but may still require tuning
18 MODPREFIX
= 'File' # The prefix for module-wide routines
19 INPUTFILE
= string
.lower(MODPREFIX
) + 'gen.py' # The file generated by the scanner
20 OUTPUTFILE
= MODNAME
+ "module.c" # The file generated by this program
22 from macsupport
import *
25 SInt64
= Type("SInt64", "L")
26 UInt64
= Type("UInt64", "L")
27 FNMessage
= Type("FNMessage", "l")
28 FSAllocationFlags
= Type("FSAllocationFlags", "H")
29 FSCatalogInfoBitmap
= Type("FSCatalogInfoBitmap", "l")
30 FSIteratorFlags
= Type("FSIteratorFlags", "l")
31 FSVolumeRefNum
= Type("FSVolumeRefNum", "h")
32 AliasInfoType
= Type("AliasInfoType", "h")
34 # Various types of strings:
35 #class UniCharCountBuffer(InputOnlyType):
37 class VarReverseInputBufferType(ReverseInputBufferMixin
, VarInputBufferType
):
39 FullPathName
= VarReverseInputBufferType()
40 ConstStr31Param
= OpaqueArrayType("Str31", "PyMac_BuildStr255", "PyMac_GetStr255")
41 ConstStr32Param
= OpaqueArrayType("Str32", "PyMac_BuildStr255", "PyMac_GetStr255")
42 ConstStr63Param
= OpaqueArrayType("Str63", "PyMac_BuildStr255", "PyMac_GetStr255")
43 Str63
= OpaqueArrayType("Str63", "PyMac_BuildStr255", "PyMac_GetStr255")
45 HFSUniStr255
= OpaqueType("HFSUniStr255", "PyMac_BuildHFSUniStr255", "PyMac_GetHFSUniStr255")
46 UInt8_ptr
= InputOnlyType("UInt8 *", "s")
49 class OptionalFSxxxType(OpaqueByValueType
):
50 def declare(self
, name
):
51 Output("%s %s__buf__;", self
.typeName
, name
)
52 Output("%s *%s = &%s__buf__;", self
.typeName
, name
, name
)
54 class FSCatalogInfoAndBitmapType(InputOnlyType
):
57 InputOnlyType
.__init
__(self
, "BUG", "BUG")
59 def declare(self
, name
):
60 Output("PyObject *%s__object = NULL;", name
)
61 Output("FSCatalogInfoBitmap %s__bitmap = 0;", name
)
62 Output("FSCatalogInfo %s;", name
)
64 def getargsFormat(self
):
67 def getargsArgs(self
, name
):
68 return "%s__bitmap, %s__object"%(name
, name
)
70 def getargsCheck(self
, name
):
71 Output("if (!convert_FSCatalogInfo(%s__object, %s__bitmap, &%s)) return NULL;", name
, name
, name
)
73 def passInput(self
, name
):
74 return "%s__bitmap, &%s"% (name
, name
)
76 def passOutput(self
, name
):
77 return "%s__bitmap, &%s"% (name
, name
)
79 def mkvalueFormat(self
):
82 def mkvalueArgs(self
, name
):
83 return "%s__object" % (name
)
85 def xxxxmkvalueCheck(self
, name
):
86 Output("if ((%s__object = new_FSCatalogInfo(%s__bitmap, &%s)) == NULL) return NULL;", name
, name
)
88 class FSCatalogInfoAndBitmap_inType(FSCatalogInfoAndBitmapType
, InputOnlyMixIn
):
90 def xxxxmkvalueCheck(self
, name
):
93 class FSCatalogInfoAndBitmap_outType(FSCatalogInfoAndBitmapType
):
95 def getargsFormat(self
):
98 def getargsArgs(self
, name
):
99 return "%s__bitmap" % name
101 def getargsCheck(self
, name
):
104 FInfo
= OpaqueType("FInfo", "FInfo")
105 FInfo_ptr
= OpaqueType("FInfo", "FInfo")
106 AliasHandle
= OpaqueByValueType("AliasHandle", "Alias")
107 FSSpec
= OpaqueType("FSSpec", "FSSpec")
108 FSSpec_ptr
= OpaqueType("FSSpec", "FSSpec")
109 OptFSSpecPtr
= OptionalFSxxxType("FSSpec", "BUG", "myPyMac_GetOptFSSpecPtr")
110 FSRef
= OpaqueType("FSRef", "FSRef")
111 FSRef_ptr
= OpaqueType("FSRef", "FSRef")
112 OptFSRefPtr
= OptionalFSxxxType("FSRef", "BUG", "myPyMac_GetOptFSRefPtr")
113 FSCatalogInfo
= OpaqueType("FSCatalogInfo", "FSCatalogInfo")
114 FSCatalogInfo_ptr
= OpaqueType("FSCatalogInfo", "FSCatalogInfo")
124 includestuff
= includestuff
+ """
125 #ifdef WITHOUT_FRAMEWORKS
128 #include <Carbon/Carbon.h>
131 #ifdef USE_TOOLBOX_OBJECT_GLUE
132 extern int _PyMac_GetFSSpec(PyObject *v, FSSpec *spec);
133 extern int _PyMac_GetFSRef(PyObject *v, FSRef *fsr);
134 extern PyObject *_PyMac_BuildFSSpec(FSSpec *spec);
135 extern PyObject *_PyMac_BuildFSRef(FSRef *spec);
137 #define PyMac_GetFSSpec _PyMac_GetFSSpec
138 #define PyMac_GetFSRef _PyMac_GetFSRef
139 #define PyMac_BuildFSSpec _PyMac_BuildFSSpec
140 #define PyMac_BuildFSRef _PyMac_BuildFSRef
142 extern int PyMac_GetFSSpec(PyObject *v, FSSpec *spec);
143 extern int PyMac_GetFSRef(PyObject *v, FSRef *fsr);
144 extern PyObject *PyMac_BuildFSSpec(FSSpec *spec);
145 extern PyObject *PyMac_BuildFSRef(FSRef *spec);
148 /* Forward declarations */
149 static PyObject *FInfo_New(FInfo *itself);
150 static PyObject *FSRef_New(FSRef *itself);
151 static PyObject *FSSpec_New(FSSpec *itself);
152 static PyObject *Alias_New(AliasHandle itself);
153 static int FInfo_Convert(PyObject *v, FInfo *p_itself);
154 #define FSRef_Convert PyMac_GetFSRef
155 #define FSSpec_Convert PyMac_GetFSSpec
156 static int Alias_Convert(PyObject *v, AliasHandle *p_itself);
159 ** UTCDateTime records
162 UTCDateTime_Convert(PyObject *v, UTCDateTime *ptr)
164 return PyArg_Parse(v, "(HlH)", &ptr->highSeconds, &ptr->lowSeconds, &ptr->fraction);
168 UTCDateTime_New(UTCDateTime *ptr)
170 return Py_BuildValue("(HlH)", ptr->highSeconds, ptr->lowSeconds, ptr->fraction);
174 ** Optional fsspec and fsref pointers. None will pass NULL
177 myPyMac_GetOptFSSpecPtr(PyObject *v, FSSpec **spec)
183 return PyMac_GetFSSpec(v, *spec);
187 myPyMac_GetOptFSRefPtr(PyObject *v, FSRef **ref)
193 return PyMac_GetFSRef(v, *ref);
197 ** Parse/generate objsect
200 PyMac_BuildHFSUniStr255(HFSUniStr255 *itself)
203 return Py_BuildValue("u#", itself->unicode, itself->length);
207 finalstuff
= finalstuff
+ """
209 PyMac_GetFSSpec(PyObject *v, FSSpec *spec)
217 if (FSSpec_Check(v)) {
218 *spec = ((FSSpecObject *)v)->ob_itself;
222 if (PyArg_Parse(v, "(hlO&)",
223 &refnum, &parid, PyMac_GetStr255, &path)) {
224 err = FSMakeFSSpec(refnum, parid, path, spec);
225 if ( err && err != fnfErr ) {
232 #if !TARGET_API_MAC_OSX
233 /* On OS9 we now try a pathname */
234 if ( PyString_Check(v) ) {
235 /* It's a pathname */
236 if( !PyArg_Parse(v, "O&", PyMac_GetStr255, &path) )
238 refnum = 0; /* XXXX Should get CurWD here?? */
240 err = FSMakeFSSpec(refnum, parid, path, spec);
241 if ( err && err != fnfErr ) {
249 /* Otherwise we try to go via an FSRef. On OSX we go all the way,
250 ** on OS9 we accept only a real FSRef object
252 #if TARGET_API_MAC_OSX
253 if ( PyMac_GetFSRef(v, &fsr) ) {
255 if ( PyArg_Parse(v, "O&", FSRef_Convert, &fsr) ) {
257 err = FSGetCatalogInfo(&fsr, kFSCatInfoNone, NULL, NULL, spec, NULL);
264 #if !TARGET_API_MAC_OSX
265 PyErr_SetString(PyExc_TypeError, "FSSpec, FSRef, pathname or (refnum, parid, path) required");
271 PyMac_GetFSRef(PyObject *v, FSRef *fsr)
276 if (FSRef_Check(v)) {
277 *fsr = ((FSRefObject *)v)->ob_itself;
281 #if TARGET_API_MAC_OSX
282 /* On OSX we now try a pathname */
283 if ( PyString_Check(v) ) {
284 if ( (err=FSPathMakeRef(PyString_AsString(v), fsr, NULL)) ) {
290 /* XXXX Should try unicode here too */
292 /* Otherwise we try to go via an FSSpec */
293 #if TARGET_API_MAC_OSX
294 if (FSSpec_Check(v)) {
295 fss = ((FSSpecObject *)v)->ob_itself;
297 if (PyMac_GetFSSpec(v, &fss)) {
299 if ((err=FSpMakeFSRef(&fss, fsr)) == 0)
304 PyErr_SetString(PyExc_TypeError, "FSRef, FSSpec or pathname required");
309 PyMac_BuildFSSpec(FSSpec *spec)
311 return FSSpec_New(spec);
315 PyMac_BuildFSRef(FSRef *spec)
317 return FSRef_New(spec);
321 initstuff
= initstuff
+ """
322 PyMac_INIT_TOOLBOX_OBJECT_NEW(FSSpec *, PyMac_BuildFSSpec);
323 PyMac_INIT_TOOLBOX_OBJECT_NEW(FSRef *, PyMac_BuildFSRef);
324 PyMac_INIT_TOOLBOX_OBJECT_CONVERT(FSSpec, PyMac_GetFSSpec);
325 PyMac_INIT_TOOLBOX_OBJECT_CONVERT(FSRef, PyMac_GetFSRef);
328 execfile(string
.lower(MODPREFIX
) + 'typetest.py')
331 class FSCatalogInfoDefinition(PEP253Mixin
, ObjectDefinition
):
334 "return Py_BuildValue(\"H\", self->ob_itself.nodeFlags);",
335 "return PyArg_Parse(v, \"H\", &self->ob_itself.nodeFlags)-1;",
339 "return Py_BuildValue(\"h\", self->ob_itself.volume);",
340 "return PyArg_Parse(v, \"h\", &self->ob_itself.volume)-1;",
344 "return Py_BuildValue(\"l\", self->ob_itself.parentDirID);",
345 "return PyArg_Parse(v, \"l\", &self->ob_itself.parentDirID)-1;",
349 "return Py_BuildValue(\"l\", self->ob_itself.nodeID);",
350 "return PyArg_Parse(v, \"l\", &self->ob_itself.nodeID)-1;",
354 "return Py_BuildValue(\"O&\", UTCDateTime_New, &self->ob_itself.createDate);",
355 "return PyArg_Parse(v, \"O&\", UTCDateTime_Convert, &self->ob_itself.createDate)-1;",
359 "return Py_BuildValue(\"O&\", UTCDateTime_New, &self->ob_itself.contentModDate);",
360 "return PyArg_Parse(v, \"O&\", UTCDateTime_Convert, &self->ob_itself.contentModDate)-1;",
364 "return Py_BuildValue(\"O&\", UTCDateTime_New, &self->ob_itself.attributeModDate);",
365 "return PyArg_Parse(v, \"O&\", UTCDateTime_Convert, &self->ob_itself.attributeModDate)-1;",
369 "return Py_BuildValue(\"O&\", UTCDateTime_New, &self->ob_itself.accessDate);",
370 "return PyArg_Parse(v, \"O&\", UTCDateTime_Convert, &self->ob_itself.accessDate)-1;",
374 "return Py_BuildValue(\"O&\", UTCDateTime_New, &self->ob_itself.backupDate);",
375 "return PyArg_Parse(v, \"O&\", UTCDateTime_Convert, &self->ob_itself.backupDate)-1;",
379 "return Py_BuildValue(\"(llll)\", self->ob_itself.permissions[0], self->ob_itself.permissions[1], self->ob_itself.permissions[2], self->ob_itself.permissions[3]);",
380 "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;",
383 # XXXX FinderInfo TBD
384 # XXXX FinderXInfo TBD
386 "return Py_BuildValue(\"l\", self->ob_itself.valence);",
387 "return PyArg_Parse(v, \"l\", &self->ob_itself.valence)-1;",
391 "return Py_BuildValue(\"l\", self->ob_itself.dataLogicalSize);",
392 "return PyArg_Parse(v, \"l\", &self->ob_itself.dataLogicalSize)-1;",
396 "return Py_BuildValue(\"l\", self->ob_itself.dataPhysicalSize);",
397 "return PyArg_Parse(v, \"l\", &self->ob_itself.dataPhysicalSize)-1;",
401 "return Py_BuildValue(\"l\", self->ob_itself.rsrcLogicalSize);",
402 "return PyArg_Parse(v, \"l\", &self->ob_itself.rsrcLogicalSize)-1;",
406 "return Py_BuildValue(\"l\", self->ob_itself.rsrcPhysicalSize);",
407 "return PyArg_Parse(v, \"l\", &self->ob_itself.rsrcPhysicalSize)-1;",
411 "return Py_BuildValue(\"l\", self->ob_itself.sharingFlags);",
412 "return PyArg_Parse(v, \"l\", &self->ob_itself.sharingFlags)-1;",
416 "return Py_BuildValue(\"b\", self->ob_itself.userPrivileges);",
417 "return PyArg_Parse(v, \"b\", &self->ob_itself.userPrivileges)-1;",
421 # The same info, but in a different form
422 INITFORMAT
= "HhllO&O&O&O&O&llllllb"
423 INITARGS
= """&((FSCatalogInfoObject *)self)->ob_itself.nodeFlags,
424 &((FSCatalogInfoObject *)self)->ob_itself.volume,
425 &((FSCatalogInfoObject *)self)->ob_itself.parentDirID,
426 &((FSCatalogInfoObject *)self)->ob_itself.nodeID,
427 UTCDateTime_Convert, &((FSCatalogInfoObject *)self)->ob_itself.createDate,
428 UTCDateTime_Convert, &((FSCatalogInfoObject *)self)->ob_itself.contentModDate,
429 UTCDateTime_Convert, &((FSCatalogInfoObject *)self)->ob_itself.attributeModDate,
430 UTCDateTime_Convert, &((FSCatalogInfoObject *)self)->ob_itself.accessDate,
431 UTCDateTime_Convert, &((FSCatalogInfoObject *)self)->ob_itself.backupDate,
432 &((FSCatalogInfoObject *)self)->ob_itself.valence,
433 &((FSCatalogInfoObject *)self)->ob_itself.dataLogicalSize,
434 &((FSCatalogInfoObject *)self)->ob_itself.dataPhysicalSize,
435 &((FSCatalogInfoObject *)self)->ob_itself.rsrcLogicalSize,
436 &((FSCatalogInfoObject *)self)->ob_itself.rsrcPhysicalSize,
437 &((FSCatalogInfoObject *)self)->ob_itself.sharingFlags,
438 &((FSCatalogInfoObject *)self)->ob_itself.userPrivileges"""
458 def __init__(self
, name
, prefix
, itselftype
):
459 ObjectDefinition
.__init
__(self
, name
, prefix
, itselftype
)
460 self
.argref
= "*" # Store FSSpecs, but pass them by address
462 def outputCheckNewArg(self
):
463 Output("if (itself == NULL) return Py_None;")
465 def output_tp_newBody(self
):
466 Output("PyObject *self;");
468 Output("if ((self = type->tp_alloc(type, 0)) == NULL) return NULL;")
469 Output("memset(&((%s *)self)->ob_itself, 0, sizeof(%s));",
470 self
.objecttype
, self
.itselftype
)
471 Output("return self;")
473 def output_tp_initBody(self
):
474 Output("static char *kw[] = {%s, 0};", self
.INITNAMES
)
476 Output("if (!PyArg_ParseTupleAndKeywords(args, kwds, \"|%s\", kw, %s))",
477 self
.INITFORMAT
, self
.INITARGS
)
483 class FInfoDefinition(PEP253Mixin
, ObjectDefinition
):
486 "return Py_BuildValue(\"O&\", PyMac_BuildOSType, self->ob_itself.fdType);",
487 "return PyArg_Parse(v, \"O&\", PyMac_GetOSType, &self->ob_itself.fdType)-1;",
491 "return Py_BuildValue(\"O&\", PyMac_BuildOSType, self->ob_itself.fdCreator);",
492 "return PyArg_Parse(v, \"O&\", PyMac_GetOSType, &self->ob_itself.fdCreator)-1;",
493 "4-char file creator"
496 "return Py_BuildValue(\"H\", self->ob_itself.fdFlags);",
497 "return PyArg_Parse(v, \"H\", &self->ob_itself.fdFlags)-1;",
501 "return Py_BuildValue(\"O&\", PyMac_BuildPoint, self->ob_itself.fdLocation);",
502 "return PyArg_Parse(v, \"O&\", PyMac_GetPoint, &self->ob_itself.fdLocation)-1;",
503 "(x, y) location of the file's icon in its parent finder window"
506 "return Py_BuildValue(\"h\", self->ob_itself.fdFldr);",
507 "return PyArg_Parse(v, \"h\", &self->ob_itself.fdFldr)-1;",
508 "Original folder, for 'put away'"
513 def __init__(self
, name
, prefix
, itselftype
):
514 ObjectDefinition
.__init
__(self
, name
, prefix
, itselftype
)
515 self
.argref
= "*" # Store FSSpecs, but pass them by address
517 def outputCheckNewArg(self
):
518 Output("if (itself == NULL) return PyMac_Error(resNotFound);")
520 def output_tp_newBody(self
):
521 Output("PyObject *self;");
523 Output("if ((self = type->tp_alloc(type, 0)) == NULL) return NULL;")
524 Output("memset(&((%s *)self)->ob_itself, 0, sizeof(%s));",
525 self
.objecttype
, self
.itselftype
)
526 Output("return self;")
528 def output_tp_initBody(self
):
529 Output("%s *itself = NULL;", self
.itselftype
)
530 Output("static char *kw[] = {\"itself\", 0};")
532 Output("if (PyArg_ParseTupleAndKeywords(args, kwds, \"|O&\", kw, FInfo_Convert, &itself))")
534 Output("if (itself) memcpy(&((%s *)self)->ob_itself, itself, sizeof(%s));",
535 self
.objecttype
, self
.itselftype
)
540 class FSSpecDefinition(PEP253Mixin
, ObjectDefinition
):
543 "return PyString_FromStringAndSize((char *)&self->ob_itself, sizeof(self->ob_itself));",
545 "Raw data of the FSSpec object"
549 def __init__(self
, name
, prefix
, itselftype
):
550 ObjectDefinition
.__init
__(self
, name
, prefix
, itselftype
)
551 self
.argref
= "*" # Store FSSpecs, but pass them by address
553 def outputCheckNewArg(self
):
554 Output("if (itself == NULL) return PyMac_Error(resNotFound);")
556 # We do Convert ourselves (with PyMac_GetFSxxx)
557 def outputConvert(self
):
560 def output_tp_newBody(self
):
561 Output("PyObject *self;");
563 Output("if ((self = type->tp_alloc(type, 0)) == NULL) return NULL;")
564 Output("memset(&((%s *)self)->ob_itself, 0, sizeof(%s));",
565 self
.objecttype
, self
.itselftype
)
566 Output("return self;")
568 def output_tp_initBody(self
):
569 Output("PyObject *v = NULL;")
570 Output("char *rawdata = NULL;")
571 Output("int rawdatalen = 0;")
572 Output("static char *kw[] = {\"itself\", \"rawdata\", 0};")
574 Output("if (!PyArg_ParseTupleAndKeywords(args, kwds, \"|Os#\", kw, &v, &rawdata, &rawdatalen))")
576 Output("if (v && rawdata)")
578 Output("PyErr_SetString(PyExc_TypeError, \"Only one of itself or rawdata may be specified\");")
581 Output("if (!v && !rawdata)")
583 Output("PyErr_SetString(PyExc_TypeError, \"One of itself or rawdata must be specified\");")
586 Output("if (rawdata)")
588 Output("if (rawdatalen != sizeof(%s))", self
.itselftype
)
590 Output("PyErr_SetString(PyExc_TypeError, \"%s rawdata incorrect size\");",
594 Output("memcpy(&((%s *)self)->ob_itself, rawdata, rawdatalen);", self
.objecttype
)
597 Output("if (PyMac_GetFSSpec(v, &((%s *)self)->ob_itself)) return 0;", self
.objecttype
)
600 def outputRepr(self
):
602 Output("static PyObject * %s_repr(%s *self)", self
.prefix
, self
.objecttype
)
604 Output("char buf[512];")
605 Output("""PyOS_snprintf(buf, sizeof(buf), \"%%s((%%d, %%ld, '%%.*s'))\",
606 self->ob_type->tp_name,
607 self->ob_itself.vRefNum,
608 self->ob_itself.parID,
609 self->ob_itself.name[0], self->ob_itself.name+1);""")
610 Output("return PyString_FromString(buf);")
613 class FSRefDefinition(PEP253Mixin
, ObjectDefinition
):
616 "return PyString_FromStringAndSize((char *)&self->ob_itself, sizeof(self->ob_itself));",
618 "Raw data of the FSRef object"
622 def __init__(self
, name
, prefix
, itselftype
):
623 ObjectDefinition
.__init
__(self
, name
, prefix
, itselftype
)
624 self
.argref
= "*" # Store FSRefs, but pass them by address
626 def outputCheckNewArg(self
):
627 Output("if (itself == NULL) return PyMac_Error(resNotFound);")
629 # We do Convert ourselves (with PyMac_GetFSxxx)
630 def outputConvert(self
):
633 def output_tp_newBody(self
):
634 Output("PyObject *self;");
636 Output("if ((self = type->tp_alloc(type, 0)) == NULL) return NULL;")
637 Output("memset(&((%s *)self)->ob_itself, 0, sizeof(%s));",
638 self
.objecttype
, self
.itselftype
)
639 Output("return self;")
641 def output_tp_initBody(self
):
642 Output("PyObject *v = NULL;")
643 Output("char *rawdata = NULL;")
644 Output("int rawdatalen = 0;")
645 Output("static char *kw[] = {\"itself\", \"rawdata\", 0};")
647 Output("if (!PyArg_ParseTupleAndKeywords(args, kwds, \"|Os#\", kw, &v, &rawdata, &rawdatalen))")
649 Output("if (v && rawdata)")
651 Output("PyErr_SetString(PyExc_TypeError, \"Only one of itself or rawdata may be specified\");")
654 Output("if (!v && !rawdata)")
656 Output("PyErr_SetString(PyExc_TypeError, \"One of itself or rawdata must be specified\");")
659 Output("if (rawdata)")
661 Output("if (rawdatalen != sizeof(%s))", self
.itselftype
)
663 Output("PyErr_SetString(PyExc_TypeError, \"%s rawdata incorrect size\");",
667 Output("memcpy(&((%s *)self)->ob_itself, rawdata, rawdatalen);", self
.objecttype
)
670 Output("if (PyMac_GetFSRef(v, &((%s *)self)->ob_itself)) return 0;", self
.objecttype
)
673 class AliasDefinition(PEP253Mixin
, ObjectDefinition
):
674 # XXXX Should inherit from resource?
680 size = GetHandleSize((Handle)self->ob_itself);
681 HLock((Handle)self->ob_itself);
682 rv = PyString_FromStringAndSize(*(Handle)self->ob_itself, size);
683 HUnlock((Handle)self->ob_itself);
687 "Raw data of the alias object"
691 def outputCheckNewArg(self
):
692 Output("if (itself == NULL) return PyMac_Error(resNotFound);")
694 def outputStructMembers(self
):
695 ObjectDefinition
.outputStructMembers(self
)
696 Output("void (*ob_freeit)(%s ptr);", self
.itselftype
)
698 def outputInitStructMembers(self
):
699 ObjectDefinition
.outputInitStructMembers(self
)
700 Output("it->ob_freeit = NULL;")
702 def outputCleanupStructMembers(self
):
703 Output("if (self->ob_freeit && self->ob_itself)")
705 Output("self->ob_freeit(self->ob_itself);")
707 Output("self->ob_itself = NULL;")
709 def output_tp_newBody(self
):
710 Output("PyObject *self;");
712 Output("if ((self = type->tp_alloc(type, 0)) == NULL) return NULL;")
713 Output("((%s *)self)->ob_itself = NULL;", self
.objecttype
)
714 Output("return self;")
716 def output_tp_initBody(self
):
717 Output("%s itself = NULL;", self
.itselftype
)
718 Output("char *rawdata = NULL;")
719 Output("int rawdatalen = 0;")
721 Output("static char *kw[] = {\"itself\", \"rawdata\", 0};")
723 Output("if (!PyArg_ParseTupleAndKeywords(args, kwds, \"|O&s#\", kw, %s_Convert, &itself, &rawdata, &rawdatalen))",
726 Output("if (itself && rawdata)")
728 Output("PyErr_SetString(PyExc_TypeError, \"Only one of itself or rawdata may be specified\");")
731 Output("if (!itself && !rawdata)")
733 Output("PyErr_SetString(PyExc_TypeError, \"One of itself or rawdata must be specified\");")
736 Output("if (rawdata)")
738 Output("if ((h = NewHandle(rawdatalen)) == NULL)")
740 Output("PyErr_NoMemory();")
744 Output("memcpy((char *)*h, rawdata, rawdatalen);")
745 Output("HUnlock(h);")
746 Output("((%s *)self)->ob_itself = (%s)h;", self
.objecttype
, self
.itselftype
)
749 Output("((%s *)self)->ob_itself = itself;", self
.objecttype
)
752 # Alias methods come in two flavors: those with the alias as arg1 and
753 # those with the alias as arg 2.
754 class Arg2MethodGenerator(OSErrMethodGenerator
):
755 """Similar to MethodGenerator, but has self as second argument"""
757 def parseArgumentList(self
, args
):
758 args0
, arg1
, argsrest
= args
[:1], args
[1], args
[2:]
760 args
= args0
+ argsrest
762 raise ValueError, "method's 'self' must be 'InMode'"
763 self
.itself
= Variable(t0
, "_self->ob_itself", SelfMode
)
764 FunctionGenerator
.parseArgumentList(self
, args
)
765 self
.argumentList
.insert(2, self
.itself
)
767 # From here on it's basically all boiler plate...
769 # Create the generator groups and link them
770 module
= MacModule(MODNAME
, MODPREFIX
, includestuff
, finalstuff
, initstuff
,
771 longname
=LONGMODNAME
)
773 fscataloginfoobject
= FSCatalogInfoDefinition('FSCatalogInfo', 'FSCatalogInfo', 'FSCatalogInfo')
774 finfoobject
= FInfoDefinition('FInfo', 'FInfo', 'FInfo')
775 aliasobject
= AliasDefinition('Alias', 'Alias', 'AliasHandle')
776 fsspecobject
= FSSpecDefinition('FSSpec', 'FSSpec', 'FSSpec')
777 fsrefobject
= FSRefDefinition('FSRef', 'FSRef', 'FSRef')
779 module
.addobject(fscataloginfoobject
)
780 module
.addobject(finfoobject
)
781 module
.addobject(aliasobject
)
782 module
.addobject(fsspecobject
)
783 module
.addobject(fsrefobject
)
785 # Create the generator classes used to populate the lists
786 Function
= OSErrFunctionGenerator
787 Method
= OSErrMethodGenerator
789 # Create and populate the lists
797 FSRefMakePath_body
= """
799 #define MAXPATHNAME 1024
800 UInt8 path[MAXPATHNAME];
801 UInt32 maxPathSize = MAXPATHNAME;
803 if (!PyArg_ParseTuple(_args, ""))
805 _err = FSRefMakePath(&_self->ob_itself,
808 if (_err != noErr) return PyMac_Error(_err);
809 _res = Py_BuildValue("s", path);
812 f
= ManualGenerator("FSRefMakePath", FSRefMakePath_body
)
813 f
.docstring
= lambda: "() -> string"
814 fsref_methods
.append(f
)
816 FSRef_as_pathname_body
= """
817 #if TARGET_API_MAC_OSX
818 if (!PyArg_ParseTuple(_args, ""))
820 _res = FSRef_FSRefMakePath(_self, _args);
826 if (!PyArg_ParseTuple(_args, ""))
828 if ( !PyMac_GetFSSpec((PyObject *)_self, &fss))
830 err = PyMac_GetFullPathname(&fss, strbuf, sizeof(strbuf));
835 _res = PyString_FromString(strbuf);
839 f
= ManualGenerator("as_pathname", FSRef_as_pathname_body
)
840 f
.docstring
= lambda: "() -> string"
841 fsref_methods
.append(f
)
843 FSSpec_as_pathname_body
= """
847 if (!PyArg_ParseTuple(_args, ""))
849 err = PyMac_GetFullPathname(&_self->ob_itself, strbuf, sizeof(strbuf));
854 _res = PyString_FromString(strbuf);
857 f
= ManualGenerator("as_pathname", FSSpec_as_pathname_body
)
858 f
.docstring
= lambda: "() -> string"
859 fsspec_methods
.append(f
)
861 FSSpec_as_tuple_body
= """
862 if (!PyArg_ParseTuple(_args, ""))
864 _res = Py_BuildValue("(iis#)", _self->ob_itself.vRefNum, _self->ob_itself.parID,
865 &_self->ob_itself.name[1], _self->ob_itself.name[0]);
868 f
= ManualGenerator("as_tuple", FSSpec_as_tuple_body
)
869 f
.docstring
= lambda: "() -> (vRefNum, dirID, name)"
870 fsspec_methods
.append(f
)
875 if (!PyArg_ParseTuple(_args, "O", &obj))
877 if (PyString_Check(obj))
879 if (PyUnicode_Check(obj))
880 return PyUnicode_AsEncodedString(obj, "utf8", "strict");
881 _res = PyObject_CallMethod(obj, "as_pathname", NULL);
884 f
= ManualGenerator("pathname", pathname_body
)
885 f
.docstring
= lambda: "(str|unicode|FSSpec|FSref) -> pathname"
888 # add the populated lists to the generator groups
889 # (in a different wordl the scan program would generate this)
890 for f
in functions
: module
.add(f
)
891 for f
in alias_methods
: aliasobject
.add(f
)
892 for f
in fsspec_methods
: fsspecobject
.add(f
)
893 for f
in fsref_methods
: fsrefobject
.add(f
)
895 # generate output (open the output file as late as possible)
896 SetOutputFileName(OUTPUTFILE
)