diff options
author | Jack Jansen <jack.jansen@cwi.nl> | 2002-12-19 23:27:58 (GMT) |
---|---|---|
committer | Jack Jansen <jack.jansen@cwi.nl> | 2002-12-19 23:27:58 (GMT) |
commit | 6810f92d4df90e358751b697d1c7a978c007fae0 (patch) | |
tree | 32e002b8230de46d7ec883e6e7cc8ae0099ff0d2 /Mac | |
parent | e87663306a989afea3a2ed3e245a6190fd9e1fa9 (diff) | |
download | cpython-6810f92d4df90e358751b697d1c7a978c007fae0.zip cpython-6810f92d4df90e358751b697d1c7a978c007fae0.tar.gz cpython-6810f92d4df90e358751b697d1c7a978c007fae0.tar.bz2 |
The extension module macfs has been replaced by a pure Python version.
Diffstat (limited to 'Mac')
-rw-r--r-- | Mac/Modules/macfsmodule.c | 1192 |
1 files changed, 0 insertions, 1192 deletions
diff --git a/Mac/Modules/macfsmodule.c b/Mac/Modules/macfsmodule.c deleted file mode 100644 index eaa8164..0000000 --- a/Mac/Modules/macfsmodule.c +++ /dev/null @@ -1,1192 +0,0 @@ -/*********************************************************** -Copyright 1991-1997 by Stichting Mathematisch Centrum, Amsterdam, -The Netherlands. - - All Rights Reserved - -Permission to use, copy, modify, and distribute this software and its -documentation for any purpose and without fee is hereby granted, -provided that the above copyright notice appear in all copies and that -both that copyright notice and this permission notice appear in -supporting documentation, and that the names of Stichting Mathematisch -Centrum or CWI not be used in advertising or publicity pertaining to -distribution of the software without specific, written prior permission. - -STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO -THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE -FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT -OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -******************************************************************/ - -#include "Python.h" -#include "macglue.h" -#include "pymactoolbox.h" - -#ifdef WITHOUT_FRAMEWORKS -#include <Memory.h> -#include <Files.h> -#include <Folders.h> -#include <StandardFile.h> -#include <Aliases.h> -#include <LowMem.h> -#else -#include <Carbon/Carbon.h> -#endif - -#include "getapplbycreator.h" - -/* -** The next define uses PBGetCatInfoSync for GetFInfo, allowing you -** to get FInfo for folders. This works on OSX, but it may result -** in problems on OS9, hence the define (for the time being). -*/ -#define USE_CATINFO_FOR_FINFO - -#ifndef TARGET_API_MAC_OSX -#include "pythonresources.h" -extern PyMac_PrefRecord PyMac_options; -#endif - -#ifdef USE_TOOLBOX_OBJECT_GLUE -extern int _PyMac_GetFSSpec(PyObject *, FSSpec *); -extern PyObject *_PyMac_BuildFSSpec(FSSpec *); -extern int _PyMac_GetFSRef(PyObject *, FSRef *); -extern PyObject *_PyMac_BuildFSRef(FSRef *); -#define PyMac_GetFSSpec _PyMac_GetFSSpec -#define PyMac_BuildFSSpec _PyMac_BuildFSSpec -#define PyMac_GetFSRef _PyMac_GetFSRef -#define PyMac_BuildFSRef _PyMac_BuildFSRef -#endif -static PyObject *ErrorObject; - -#ifdef TARGET_API_MAC_OSX -#define PATHNAMELEN 1024 -#else -#define PATHNAMELEN 256 -#endif - -/* ----------------------------------------------------- */ -/* Declarations for objects of type Alias */ - -typedef struct { - PyObject_HEAD - AliasHandle alias; -} mfsaobject; - -static PyTypeObject Mfsatype; - -#define is_mfsaobject(v) ((v)->ob_type == &Mfsatype) - -/* ---------------------------------------------------------------- */ -/* Declarations for objects of type FSSpec */ - -typedef struct { - PyObject_HEAD - FSSpec fsspec; -} mfssobject; - -static PyTypeObject Mfsstype; - -#define is_mfssobject(v) ((v)->ob_type == &Mfsstype) - -/* ---------------------------------------------------------------- */ -/* Declarations for objects of type FSRef */ - -typedef struct { - PyObject_HEAD - FSRef fsref; -} mfsrobject; - -static PyTypeObject Mfsrtype; - -#define is_mfsrobject(v) ((v)->ob_type == &Mfsrtype) - - -/* ---------------------------------------------------------------- */ -/* Declarations for objects of type FInfo */ - -typedef struct { - PyObject_HEAD - FInfo finfo; -} mfsiobject; - -static PyTypeObject Mfsitype; - -#define is_mfsiobject(v) ((v)->ob_type == &Mfsitype) - - -static mfssobject *newmfssobject(FSSpec *fss); /* Forward */ -static mfsrobject *newmfsrobject(FSRef *fsr); /* Forward */ - -/* ---------------------------------------------------------------- */ - -static PyObject * -mfsa_Resolve(mfsaobject *self, PyObject *args) -{ - FSSpec from, *fromp, result; - Boolean changed; - OSErr err; - - from.name[0] = 0; - if (!PyArg_ParseTuple(args, "|O&", PyMac_GetFSSpec, &from)) - return NULL; - if (from.name[0] ) - fromp = &from; - else - fromp = NULL; - err = ResolveAlias(fromp, self->alias, &result, &changed); - if ( err && err != fnfErr ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - return Py_BuildValue("(Oi)", newmfssobject(&result), (int)changed); -} - -static PyObject * -mfsa_GetInfo(mfsaobject *self, PyObject *args) -{ - Str63 value; - int i; - OSErr err; - - if (!PyArg_ParseTuple(args, "i", &i)) - return NULL; - err = GetAliasInfo(self->alias, (AliasInfoType)i, value); - if ( err ) { - PyErr_Mac(ErrorObject, err); - return 0; - } - return PyString_FromStringAndSize((char *)&value[1], value[0]); -} - -static PyObject * -mfsa_Update(mfsaobject *self, PyObject *args) -{ - FSSpec target, fromfile, *fromfilep; - OSErr err; - Boolean changed; - - fromfile.name[0] = 0; - if (!PyArg_ParseTuple(args, "O&|O&", PyMac_GetFSSpec, &target, - PyMac_GetFSSpec, &fromfile)) - return NULL; - if ( fromfile.name[0] ) - fromfilep = &fromfile; - else - fromfilep = NULL; - err = UpdateAlias(fromfilep, &target, self->alias, &changed); - if ( err ) { - PyErr_Mac(ErrorObject, err); - return 0; - } - return Py_BuildValue("i", (int)changed); -} - -static struct PyMethodDef mfsa_methods[] = { - {"Resolve", (PyCFunction)mfsa_Resolve, 1}, - {"GetInfo", (PyCFunction)mfsa_GetInfo, 1}, - {"Update", (PyCFunction)mfsa_Update, 1}, - - {NULL, NULL} /* sentinel */ -}; - -/* ---------- */ - -static PyObject * -mfsa_getattr(mfsaobject *self, char *name) -{ - if ( strcmp(name, "data") == 0 ) { - int size; - PyObject *rv; - - size = GetHandleSize((Handle)self->alias); - HLock((Handle)self->alias); - rv = PyString_FromStringAndSize(*(Handle)self->alias, size); - HUnlock((Handle)self->alias); - return rv; - } - return Py_FindMethod(mfsa_methods, (PyObject *)self, name); -} - -static mfsaobject * -newmfsaobject(AliasHandle alias) -{ - mfsaobject *self; - - self = PyObject_NEW(mfsaobject, &Mfsatype); - if (self == NULL) - return NULL; - self->alias = alias; - return self; -} - - -static void -mfsa_dealloc(mfsaobject *self) -{ -#if 0 - if ( self->alias ) { - should we do something here? - } -#endif - - PyObject_DEL(self); -} - -statichere PyTypeObject Mfsatype = { - PyObject_HEAD_INIT(&PyType_Type) - 0, /*ob_size*/ - "macfs.Alias", /*tp_name*/ - sizeof(mfsaobject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)mfsa_dealloc, /*tp_dealloc*/ - (printfunc)0, /*tp_print*/ - (getattrfunc)mfsa_getattr, /*tp_getattr*/ - (setattrfunc)0, /*tp_setattr*/ - (cmpfunc)0, /*tp_compare*/ - (reprfunc)0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - (hashfunc)0, /*tp_hash*/ -}; - -/* End of code for Alias objects */ -/* -------------------------------------------------------- */ - -/* ---------------------------------------------------------------- */ - -static struct PyMethodDef mfsi_methods[] = { - - {NULL, NULL} /* sentinel */ -}; - -/* ---------- */ - -static mfsiobject * -newmfsiobject(void) -{ - mfsiobject *self; - - self = PyObject_NEW(mfsiobject, &Mfsitype); - if (self == NULL) - return NULL; - memset((char *)&self->finfo, '\0', sizeof(self->finfo)); - return self; -} - -static void -mfsi_dealloc(mfsiobject *self) -{ - PyObject_DEL(self); -} - -static PyObject * -mfsi_getattr(mfsiobject *self, char *name) -{ - if ( strcmp(name, "Type") == 0 ) - return PyMac_BuildOSType(self->finfo.fdType); - else if ( strcmp(name, "Creator") == 0 ) - return PyMac_BuildOSType(self->finfo.fdCreator); - else if ( strcmp(name, "Flags") == 0 ) - return Py_BuildValue("i", (int)self->finfo.fdFlags); - else if ( strcmp(name, "Location") == 0 ) - return PyMac_BuildPoint(self->finfo.fdLocation); - else if ( strcmp(name, "Fldr") == 0 ) - return Py_BuildValue("i", (int)self->finfo.fdFldr); - else if ( strcmp(name, "__members__") == 0 ) - return Py_BuildValue("[sssss]", "Type", "Creator", "Flags", "Location", "Fldr"); - else - return Py_FindMethod(mfsi_methods, (PyObject *)self, name); -} - - -static int -mfsi_setattr(mfsiobject *self, char *name, PyObject *v) -{ - int rv; - int i; - - if ( v == NULL ) { - PyErr_SetString(PyExc_AttributeError, "Cannot delete attribute"); - return -1; - } - if ( strcmp(name, "Type") == 0 ) - rv = PyMac_GetOSType(v, &self->finfo.fdType); - else if ( strcmp(name, "Creator") == 0 ) - rv = PyMac_GetOSType(v, &self->finfo.fdCreator); - else if ( strcmp(name, "Flags") == 0 ) { - rv = PyArg_Parse(v, "i", &i); - self->finfo.fdFlags = (short)i; - } else if ( strcmp(name, "Location") == 0 ) - rv = PyMac_GetPoint(v, &self->finfo.fdLocation); - else if ( strcmp(name, "Fldr") == 0 ) { - rv = PyArg_Parse(v, "i", &i); - self->finfo.fdFldr = (short)i; - } else { - PyErr_SetString(PyExc_AttributeError, "No such attribute"); - return -1; - } - if (rv) - return 0; - return -1; -} - - -static PyTypeObject Mfsitype = { - PyObject_HEAD_INIT(&PyType_Type) - 0, /*ob_size*/ - "macfs.FInfo", /*tp_name*/ - sizeof(mfsiobject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)mfsi_dealloc, /*tp_dealloc*/ - (printfunc)0, /*tp_print*/ - (getattrfunc)mfsi_getattr, /*tp_getattr*/ - (setattrfunc)mfsi_setattr, /*tp_setattr*/ - (cmpfunc)0, /*tp_compare*/ - (reprfunc)0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - (hashfunc)0, /*tp_hash*/ -}; - -/* End of code for FInfo object objects */ -/* -------------------------------------------------------- */ - - -/* -** Helper routines for the FSRef and FSSpec creators in macglue.c -** They return an FSSpec/FSRef if the Python object encapsulating -** either is passed. They return a boolean success indicator. -** Note that they do not set an exception on failure, they're only -** helper routines. -*/ -static int -_mfs_GetFSSpecFromFSSpec(PyObject *self, FSSpec *fssp) -{ - if ( is_mfssobject(self) ) { - *fssp = ((mfssobject *)self)->fsspec; - return 1; - } - return 0; -} - -/* Return an FSSpec if this is an FSref */ -static int -_mfs_GetFSSpecFromFSRef(PyObject *self, FSSpec *fssp) -{ - static FSRef *fsrp; - - if ( is_mfsrobject(self) ) { - fsrp = &((mfsrobject *)self)->fsref; - if ( FSGetCatalogInfo(&((mfsrobject *)self)->fsref, kFSCatInfoNone, NULL, NULL, fssp, NULL) == noErr ) - return 1; - } - return 0; -} - -/* Return an FSRef if this is an FSRef */ -static int -_mfs_GetFSRefFromFSRef(PyObject *self, FSRef *fsrp) -{ - if ( is_mfsrobject(self) ) { - *fsrp = ((mfsrobject *)self)->fsref; - return 1; - } - return 0; -} - -/* Return an FSRef if this is an FSSpec */ -static int -_mfs_GetFSRefFromFSSpec(PyObject *self, FSRef *fsrp) -{ - if ( is_mfssobject(self) ) { - if ( FSpMakeFSRef(&((mfssobject *)self)->fsspec, fsrp) == noErr ) - return 1; - } - return 0; -} - -/* -** Two generally useful routines -*/ -static OSErr -PyMac_GetFileDates(FSSpec *fss, unsigned long *crdat, unsigned long *mddat, - unsigned long *bkdat) -{ - CInfoPBRec pb; - OSErr error; - - pb.dirInfo.ioNamePtr = fss->name; - pb.dirInfo.ioFDirIndex = 0; - pb.dirInfo.ioVRefNum = fss->vRefNum; - pb.dirInfo.ioDrDirID = fss->parID; - error = PBGetCatInfoSync(&pb); - if ( error ) return error; - *crdat = pb.hFileInfo.ioFlCrDat; - *mddat = pb.hFileInfo.ioFlMdDat; - *bkdat = pb.hFileInfo.ioFlBkDat; - return 0; -} - -static OSErr -PyMac_SetFileDates(FSSpec *fss, unsigned long crdat, unsigned long mddat, - unsigned long bkdat) -{ - CInfoPBRec pb; - OSErr error; - - pb.dirInfo.ioNamePtr = fss->name; - pb.dirInfo.ioFDirIndex = 0; - pb.dirInfo.ioVRefNum = fss->vRefNum; - pb.dirInfo.ioDrDirID = fss->parID; - error = PBGetCatInfoSync(&pb); - if ( error ) return error; - pb.dirInfo.ioNamePtr = fss->name; - pb.dirInfo.ioFDirIndex = 0; - pb.dirInfo.ioVRefNum = fss->vRefNum; - pb.dirInfo.ioDrDirID = fss->parID; - pb.hFileInfo.ioFlCrDat = crdat; - pb.hFileInfo.ioFlMdDat = mddat; - pb.hFileInfo.ioFlBkDat = bkdat; - error = PBSetCatInfoSync(&pb); - return error; -} - -static PyObject * -mfss_as_pathname(mfssobject *self, PyObject *args) -{ - char strbuf[PATHNAMELEN]; - OSErr err; - - if (!PyArg_ParseTuple(args, "")) - return NULL; - err = PyMac_GetFullPathname(&self->fsspec, strbuf, PATHNAMELEN); - if ( err ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - return PyString_FromString(strbuf); -} - -static PyObject * -mfss_as_tuple(mfssobject *self, PyObject *args) -{ - if (!PyArg_ParseTuple(args, "")) - return NULL; - return Py_BuildValue("(iis#)", self->fsspec.vRefNum, self->fsspec.parID, - &self->fsspec.name[1], self->fsspec.name[0]); -} - -static PyObject * -mfss_NewAlias(mfssobject *self, PyObject *args) -{ - FSSpec src, *srcp; - OSErr err; - AliasHandle alias; - - src.name[0] = 0; - if (!PyArg_ParseTuple(args, "|O&", PyMac_GetFSSpec, &src)) - return NULL; - if ( src.name[0] ) - srcp = &src; - else - srcp = NULL; - err = NewAlias(srcp, &self->fsspec, &alias); - if ( err ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - - return (PyObject *)newmfsaobject(alias); -} - -static PyObject * -mfss_NewAliasMinimal(mfssobject *self, PyObject *args) -{ - OSErr err; - AliasHandle alias; - - if (!PyArg_ParseTuple(args, "")) - return NULL; - err = NewAliasMinimal(&self->fsspec, &alias); - if ( err ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - return (PyObject *)newmfsaobject(alias); -} - -static PyObject * -mfss_FSpMakeFSRef(mfssobject *self, PyObject *args) -{ - OSErr err; - FSRef fsref; - - if (!PyArg_ParseTuple(args, "")) - return NULL; - err = FSpMakeFSRef(&self->fsspec, &fsref); - if ( err ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - return (PyObject *)newmfsrobject(&fsref); -} - -/* XXXX These routines should be replaced by a wrapper to the *FInfo routines */ -static PyObject * -mfss_GetCreatorType(mfssobject *self, PyObject *args) -{ - OSErr err; - FInfo info; - - if (!PyArg_ParseTuple(args, "")) - return NULL; - err = FSpGetFInfo(&self->fsspec, &info); - if ( err ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - return Py_BuildValue("(O&O&)", - PyMac_BuildOSType, info.fdCreator, PyMac_BuildOSType, info.fdType); -} - -static PyObject * -mfss_SetCreatorType(mfssobject *self, PyObject *args) -{ - OSErr err; - OSType creator, type; - FInfo info; - - if (!PyArg_ParseTuple(args, "O&O&", PyMac_GetOSType, &creator, PyMac_GetOSType, &type)) - return NULL; - err = FSpGetFInfo(&self->fsspec, &info); - if ( err ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - info.fdType = type; - info.fdCreator = creator; - err = FSpSetFInfo(&self->fsspec, &info); - if ( err ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -mfss_GetFInfo(mfssobject *self, PyObject *args) -{ - OSErr err; - mfsiobject *fip; - CInfoPBRec pb; - FSSpec* fss = &self->fsspec; - - if (!PyArg_ParseTuple(args, "")) - return NULL; - if ( (fip=newmfsiobject()) == NULL ) - return NULL; -#ifdef USE_CATINFO_FOR_FINFO - pb.dirInfo.ioNamePtr = fss->name; - pb.dirInfo.ioFDirIndex = 0; - pb.dirInfo.ioVRefNum = fss->vRefNum; - pb.dirInfo.ioDrDirID = fss->parID; - err = PBGetCatInfoSync(&pb); - if ( err ) { - PyErr_Mac(ErrorObject, err); - Py_DECREF(fip); - return NULL; - } - memcpy(&fip->finfo, &pb.hFileInfo.ioFlFndrInfo, sizeof(FileInfo)); -#else - err = FSpGetFInfo(&self->fsspec, &fip->finfo); - if ( err ) { - PyErr_Mac(ErrorObject, err); - Py_DECREF(fip); - return NULL; - } -#endif - return (PyObject *)fip; -} - -static PyObject * -mfss_SetFInfo(mfssobject *self, PyObject *args) -{ - OSErr err; - mfsiobject *fip; - - if (!PyArg_ParseTuple(args, "O!", &Mfsitype, &fip)) - return NULL; - err = FSpSetFInfo(&self->fsspec, &fip->finfo); - if ( err ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - Py_INCREF(Py_None); - return Py_None; -} - -static PyObject * -mfss_GetDates(mfssobject *self, PyObject *args) -{ - OSErr err; - unsigned long crdat, mddat, bkdat; - - if (!PyArg_ParseTuple(args, "")) - return NULL; - err = PyMac_GetFileDates(&self->fsspec, &crdat, &mddat, &bkdat); - if ( err ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - return Py_BuildValue("ddd", (double)crdat, (double)mddat, (double)bkdat); -} - -static PyObject * -mfss_SetDates(mfssobject *self, PyObject *args) -{ - OSErr err; - double crdat, mddat, bkdat; - - if (!PyArg_ParseTuple(args, "ddd", &crdat, &mddat, &bkdat)) - return NULL; - err = PyMac_SetFileDates(&self->fsspec, (unsigned long)crdat, - (unsigned long)mddat, (unsigned long)bkdat); - if ( err ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - Py_INCREF(Py_None); - return Py_None; -} - -static struct PyMethodDef mfss_methods[] = { - {"as_pathname", (PyCFunction)mfss_as_pathname, 1}, - {"as_tuple", (PyCFunction)mfss_as_tuple, 1}, - {"as_fsref", (PyCFunction)mfss_FSpMakeFSRef, 1}, - {"FSpMakeFSRef", (PyCFunction)mfss_FSpMakeFSRef, 1}, - {"NewAlias", (PyCFunction)mfss_NewAlias, 1}, - {"NewAliasMinimal", (PyCFunction)mfss_NewAliasMinimal, 1}, - {"GetCreatorType", (PyCFunction)mfss_GetCreatorType, 1}, - {"SetCreatorType", (PyCFunction)mfss_SetCreatorType, 1}, - {"GetFInfo", (PyCFunction)mfss_GetFInfo, 1}, - {"SetFInfo", (PyCFunction)mfss_SetFInfo, 1}, - {"GetDates", (PyCFunction)mfss_GetDates, 1}, - {"SetDates", (PyCFunction)mfss_SetDates, 1}, - - {NULL, NULL} /* sentinel */ -}; - -/* ---------- */ - -static PyObject * -mfss_getattr(mfssobject *self, char *name) -{ - if ( strcmp(name, "data") == 0) - return PyString_FromStringAndSize((char *)&self->fsspec, sizeof(FSSpec)); - return Py_FindMethod(mfss_methods, (PyObject *)self, name); -} - -mfssobject * -newmfssobject(FSSpec *fss) -{ - mfssobject *self; - - self = PyObject_NEW(mfssobject, &Mfsstype); - if (self == NULL) - return NULL; - self->fsspec = *fss; - return self; -} - -static void -mfss_dealloc(mfssobject *self) -{ - PyObject_DEL(self); -} - -static PyObject * -mfss_repr(mfssobject *self) -{ - char buf[512]; - - PyOS_snprintf(buf, sizeof(buf), "FSSpec((%d, %ld, '%.*s'))", - self->fsspec.vRefNum, - self->fsspec.parID, - self->fsspec.name[0], self->fsspec.name+1); - return PyString_FromString(buf); -} - -static int -mfss_compare(mfssobject *v, mfssobject *w) -{ - int minlen; - int res; - - if ( v->fsspec.vRefNum < w->fsspec.vRefNum ) return -1; - if ( v->fsspec.vRefNum > w->fsspec.vRefNum ) return 1; - if ( v->fsspec.parID < w->fsspec.parID ) return -1; - if ( v->fsspec.parID > w->fsspec.parID ) return 1; - minlen = v->fsspec.name[0]; - if ( w->fsspec.name[0] < minlen ) minlen = w->fsspec.name[0]; - res = strncmp((char *)v->fsspec.name+1, (char *)w->fsspec.name+1, minlen); - if ( res ) return res; - if ( v->fsspec.name[0] < w->fsspec.name[0] ) return -1; - if ( v->fsspec.name[0] > w->fsspec.name[0] ) return 1; - return res; -} - -statichere PyTypeObject Mfsstype = { - PyObject_HEAD_INIT(&PyType_Type) - 0, /*ob_size*/ - "macfs.FSSpec", /*tp_name*/ - sizeof(mfssobject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)mfss_dealloc, /*tp_dealloc*/ - (printfunc)0, /*tp_print*/ - (getattrfunc)mfss_getattr, /*tp_getattr*/ - (setattrfunc)0, /*tp_setattr*/ - (cmpfunc)mfss_compare, /*tp_compare*/ - (reprfunc)mfss_repr, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - (hashfunc)0, /*tp_hash*/ -}; - -/* End of code for FSSpec objects */ -/* -------------------------------------------------------- */ -static PyObject * -mfsr_as_fsspec(mfsrobject *self, PyObject *args) -{ - OSErr err; - FSSpec fss; - - if (!PyArg_ParseTuple(args, "")) - return NULL; - err = FSGetCatalogInfo(&self->fsref, kFSCatInfoNone, NULL, NULL, &fss, NULL); - if ( err ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - Py_INCREF(Py_None); - return (PyObject *)newmfssobject(&fss); -} - -static PyObject * -mfsr_as_pathname(mfsrobject *self, PyObject *args) -{ - unsigned char strbuf[PATHNAMELEN]; - OSStatus err; - - if (!PyArg_ParseTuple(args, "")) - return NULL; - err = FSRefMakePath(&self->fsref, strbuf, PATHNAMELEN); - if ( err ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - return PyString_FromString((char *)strbuf); -} - -static struct PyMethodDef mfsr_methods[] = { - {"as_fsspec", (PyCFunction)mfsr_as_fsspec, 1}, - {"as_pathname", (PyCFunction)mfsr_as_pathname, 1}, -#if 0 - {"as_tuple", (PyCFunction)mfss_as_tuple, 1}, - {"NewAlias", (PyCFunction)mfss_NewAlias, 1}, - {"NewAliasMinimal", (PyCFunction)mfss_NewAliasMinimal, 1}, - {"GetCreatorType", (PyCFunction)mfss_GetCreatorType, 1}, - {"SetCreatorType", (PyCFunction)mfss_SetCreatorType, 1}, - {"GetFInfo", (PyCFunction)mfss_GetFInfo, 1}, - {"SetFInfo", (PyCFunction)mfss_SetFInfo, 1}, - {"GetDates", (PyCFunction)mfss_GetDates, 1}, - {"SetDates", (PyCFunction)mfss_SetDates, 1}, -#endif - - {NULL, NULL} /* sentinel */ -}; - -/* ---------- */ - -static PyObject * -mfsr_getattr(mfsrobject *self, char *name) -{ - if ( strcmp(name, "data") == 0) - return PyString_FromStringAndSize((char *)&self->fsref, sizeof(FSRef)); - return Py_FindMethod(mfsr_methods, (PyObject *)self, name); -} - -mfsrobject * -newmfsrobject(FSRef *fsr) -{ - mfsrobject *self; - - self = PyObject_NEW(mfsrobject, &Mfsrtype); - if (self == NULL) - return NULL; - self->fsref = *fsr; - return self; -} - -static int -mfsr_compare(mfsrobject *v, mfsrobject *w) -{ - OSErr err; - - if ( v == w ) return 0; - err = FSCompareFSRefs(&v->fsref, &w->fsref); - if ( err == 0 ) - return 0; - if (v < w ) - return -1; - return 1; -} - -static void -mfsr_dealloc(mfsrobject *self) -{ - PyObject_DEL(self); -} - -statichere PyTypeObject Mfsrtype = { - PyObject_HEAD_INIT(&PyType_Type) - 0, /*ob_size*/ - "macfs.FSRef", /*tp_name*/ - sizeof(mfsrobject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - /* methods */ - (destructor)mfsr_dealloc, /*tp_dealloc*/ - (printfunc)0, /*tp_print*/ - (getattrfunc)mfsr_getattr, /*tp_getattr*/ - (setattrfunc)0, /*tp_setattr*/ - (cmpfunc)mfsr_compare, /*tp_compare*/ - (reprfunc)0, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - (hashfunc)0, /*tp_hash*/ -}; - -/* End of code for FSRef objects */ -/* -------------------------------------------------------- */ - -static PyObject * -mfs_ResolveAliasFile(PyObject *self, PyObject *args) -{ - FSSpec fss; - Boolean chain = 1, isfolder, wasaliased; - OSErr err; - - if (!PyArg_ParseTuple(args, "O&|i", PyMac_GetFSSpec, &fss, &chain)) - return NULL; - err = ResolveAliasFile(&fss, chain, &isfolder, &wasaliased); - if ( err ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - return Py_BuildValue("Oii", newmfssobject(&fss), (int)isfolder, (int)wasaliased); -} - -static PyObject * -mfs_FSSpec(PyObject *self, PyObject *args) -{ - FSSpec fss; - - if (!PyArg_ParseTuple(args, "O&", PyMac_GetFSSpec, &fss)) - return NULL; - return (PyObject *)newmfssobject(&fss); -} - -static PyObject * -mfs_FSRef(PyObject *self, PyObject *args) -{ - FSRef fsr; - - if (!PyArg_ParseTuple(args, "O&", PyMac_GetFSRef, &fsr)) - return NULL; - return (PyObject *)newmfsrobject(&fsr); -} - -static PyObject * -mfs_RawFSSpec(PyObject *self, PyObject *args) -{ - FSSpec *fssp; - int size; - - if (!PyArg_ParseTuple(args, "s#", &fssp, &size)) - return NULL; - if ( size != sizeof(FSSpec) ) { - PyErr_SetString(PyExc_TypeError, "Incorrect size for FSSpec record"); - return NULL; - } - return (PyObject *)newmfssobject(fssp); -} - -static PyObject * -mfs_RawAlias(PyObject *self, PyObject *args) -{ - char *dataptr; - Handle h; - int size; - - if (!PyArg_ParseTuple(args, "s#", &dataptr, &size)) - return NULL; - h = NewHandle(size); - if ( h == NULL ) { - PyErr_NoMemory(); - return NULL; - } - HLock(h); - memcpy((char *)*h, dataptr, size); - HUnlock(h); - return (PyObject *)newmfsaobject((AliasHandle)h); -} - -static PyObject * -mfs_FindFolder(PyObject *self, PyObject *args) -{ - OSErr err; - short where; - OSType which; - int create; - short refnum; - long dirid; - - if (!PyArg_ParseTuple(args, "hO&i", &where, PyMac_GetOSType, &which, &create) ) - return NULL; - err = FindFolder(where, which, (Boolean)create, &refnum, &dirid); - if ( err ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - return Py_BuildValue("(ii)", refnum, dirid); -} - -static PyObject * -mfs_FindApplication(PyObject *self, PyObject *args) -{ - OSErr err; - OSType which; - FSSpec fss; - - if (!PyArg_ParseTuple(args, "O&", PyMac_GetOSType, &which) ) - return NULL; - err = FindApplicationFromCreator(which, &fss); - if ( err ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - return (PyObject *)newmfssobject(&fss); -} - -static PyObject * -mfs_FInfo(PyObject *self, PyObject *args) -{ - return (PyObject *)newmfsiobject(); -} - -static PyObject * -mfs_NewAliasMinimalFromFullPath(PyObject *self, PyObject *args) -{ - OSErr err; - char *fullpath; - int fullpathlen; - AliasHandle alias; - Str32 zonename; - Str31 servername; - - if (!PyArg_ParseTuple(args, "s#", &fullpath, &fullpathlen) ) - return NULL; - zonename[0] = 0; - servername[0] = 0; - err = NewAliasMinimalFromFullPath(fullpathlen, (Ptr)fullpath, zonename, - servername, &alias); - if ( err ) { - PyErr_Mac(ErrorObject, err); - return NULL; - } - return (PyObject *)newmfsaobject(alias); -} - - -/* List of methods defined in the module */ - -static struct PyMethodDef mfs_methods[] = { - {"ResolveAliasFile", mfs_ResolveAliasFile, 1}, - {"FSSpec", mfs_FSSpec, 1}, - {"FSRef", mfs_FSRef, 1}, - {"RawFSSpec", mfs_RawFSSpec, 1}, - {"RawAlias", mfs_RawAlias, 1}, - {"FindFolder", mfs_FindFolder, 1}, - {"FindApplication", mfs_FindApplication, 1}, - {"FInfo", mfs_FInfo, 1}, - {"NewAliasMinimalFromFullPath", mfs_NewAliasMinimalFromFullPath, 1}, - - {NULL, NULL} /* sentinel */ -}; - -/* -** Convert a Python object to an FSSpec. -** The object may either be a full pathname, an FSSpec, an FSRef or a triple -** (vrefnum, dirid, path). -*/ -int -PyMac_GetFSRef(PyObject *v, FSRef *fsr) -{ - /* If it's an FSRef we're also okay. */ - if (_mfs_GetFSRefFromFSRef(v, fsr)) - return 1; - /* first check whether it already is an FSSpec */ - if ( _mfs_GetFSRefFromFSSpec(v, fsr) ) - return 1; - if ( PyString_Check(v) ) { -#if TARGET_API_MAC_OSX - OSStatus err; - if ( (err=FSPathMakeRef(PyString_AsString(v), fsr, NULL)) ) { - PyErr_Mac(ErrorObject, err); - return 0; - } - return 1; -#else - PyErr_SetString(PyExc_NotImplementedError, "Cannot create an FSRef from a pathname on this platform"); - return 0; -#endif - } - PyErr_SetString(PyExc_TypeError, "FSRef argument should be existing FSRef, FSSpec or (OSX only) pathname"); - return 0; -} - -/* Convert FSSpec to PyObject */ -PyObject *PyMac_BuildFSRef(FSRef *v) -{ - return (PyObject *)newmfsrobject(v); -} - -/* -** Convert a Python object to an FSRef. -** The object may either be a full pathname (OSX only), an FSSpec or an FSRef. -*/ -int -PyMac_GetFSSpec(PyObject *v, FSSpec *fs) -{ - Str255 path; - short refnum; - long parid; - OSErr err; - - /* first check whether it already is an FSSpec */ - if ( _mfs_GetFSSpecFromFSSpec(v, fs) ) - return 1; - /* If it's an FSRef we're also okay. */ - if (_mfs_GetFSSpecFromFSRef(v, fs)) - return 1; - if ( PyString_Check(v) ) { -#if TARGET_API_MAC_OSX - FSRef fsr; - - if ( !PyMac_GetFSRef(v, &fsr) ) - return 0; - if ( FSGetCatalogInfo(&fsr, kFSCatInfoNone, NULL, NULL, fs, NULL) == noErr ) - return 1; - return 0; -#else - /* It's a pathname */ - if( !PyArg_Parse(v, "O&", PyMac_GetStr255, &path) ) - return 0; - refnum = 0; /* XXXX Should get CurWD here?? */ - parid = 0; -#endif - } else { - if( !PyArg_Parse(v, "(hlO&); FSSpec should be FSSpec, FSRef, fullpath or (vrefnum,dirid,path)", - &refnum, &parid, PyMac_GetStr255, &path)) { - return 0; - } - } - err = FSMakeFSSpec(refnum, parid, path, fs); - if ( err && err != fnfErr ) { - PyMac_Error(err); - return 0; - } - return 1; -} - -/* Convert FSSpec to PyObject */ -PyObject *PyMac_BuildFSSpec(FSSpec *v) -{ - return (PyObject *)newmfssobject(v); -} - - -/* -** Import the macfsn module, which will override the Standard File -** calls in the macfs builtin module by Navigation Services versions, -** if available on this machine. -*/ -static void -PyMac_InstallNavServicesForSF(void) -{ -#ifndef TARGET_API_MAC_OSX - if ( !PyMac_options.nonavservice ) { -#endif - PyObject *m = PyImport_ImportModule("macfsn"); - - if ( m == NULL ) { - PySys_WriteStderr("'import macfsn' failed; "); - if (Py_VerboseFlag) { - PySys_WriteStderr("traceback:\n"); - PyErr_Print(); - } - else { - PySys_WriteStderr("use -v for traceback\n"); - } - PyErr_Clear(); - } -#ifndef TARGET_API_MAC_OSX - } -#endif -} - - -/* Initialization function for the module (*must* be called initmacfs) */ - -void -initmacfs(void) -{ - PyObject *m, *d; - - PyMac_INIT_TOOLBOX_OBJECT_CONVERT(FSSpec, PyMac_GetFSSpec); - PyMac_INIT_TOOLBOX_OBJECT_CONVERT(FSRef, PyMac_GetFSRef); - PyMac_INIT_TOOLBOX_OBJECT_NEW(FSSpec *, PyMac_BuildFSSpec); - PyMac_INIT_TOOLBOX_OBJECT_NEW(FSRef *, PyMac_BuildFSRef); - - /* Create the module and add the functions */ - m = Py_InitModule("macfs", mfs_methods); - - /* Add some symbolic constants to the module */ - d = PyModule_GetDict(m); - ErrorObject = PyMac_GetOSErrException(); - PyDict_SetItemString(d, "error", ErrorObject); - - Mfsatype.ob_type = &PyType_Type; - Py_INCREF(&Mfsatype); - PyDict_SetItemString(d, "AliasType", (PyObject *)&Mfsatype); - Mfsstype.ob_type = &PyType_Type; - Py_INCREF(&Mfsstype); - PyDict_SetItemString(d, "FSSpecType", (PyObject *)&Mfsstype); - Mfsitype.ob_type = &PyType_Type; - Py_INCREF(&Mfsitype); - PyDict_SetItemString(d, "FInfoType", (PyObject *)&Mfsitype); - - PyMac_InstallNavServicesForSF(); -} |