Commit 4e566ab9 authored by Jack Jansen's avatar Jack Jansen

Implemented minimal FSRef support, plus conversion between FSRefs, FSSpecs and...

Implemented minimal FSRef support, plus conversion between FSRefs, FSSpecs and pathnames where applicable.

PyMac_GetFSSpec and PyMac_BuildFSSpec have moved to macfsmodule from macglue.

These mods are untested on OSX.
parent 2d96f11d
......@@ -106,9 +106,6 @@ int PyMac_GetStr255(PyObject *, Str255); /* argument parser for Str255 */
PyObject *PyMac_BuildStr255(Str255); /* Convert Str255 to PyObject */
PyObject *PyMac_BuildOptStr255(Str255); /* Convert Str255 to PyObject, NULL to None */
int PyMac_GetFSSpec(PyObject *, FSSpec *); /* argument parser for FSSpec */
PyObject *PyMac_BuildFSSpec(FSSpec *); /* Convert FSSpec to PyObject */
int PyMac_GetRect(PyObject *, Rect *); /* argument parser for Rect */
PyObject *PyMac_BuildRect(Rect *); /* Convert Rect to PyObject */
......@@ -129,6 +126,14 @@ void PyMac_Initialize(void); /* Initialize function for embedding Python */
short PyMac_OpenPrefFile(void); /* From macgetpath.c, open and return preference file */
#endif
/* from macfsmodule.c: */
int PyMac_GetFSSpec(PyObject *, FSSpec *); /* argument parser for FSSpec */
PyObject *PyMac_BuildFSSpec(FSSpec *); /* Convert FSSpec to PyObject */
int PyMac_GetFSRef(PyObject *, FSRef *); /* argument parser for FSRef */
PyObject *PyMac_BuildFSRef(FSRef *); /* Convert FSRef to PyObject */
/* From macfiletype.c: */
long PyMac_getfiletype(char *); /* Get file type */
......
......@@ -38,8 +38,6 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include "getapplbycreator.h"
/* Should this be in macglue.h? */
extern FSSpec *mfs_GetFSSpecFSSpec(PyObject *);
static PyObject *ErrorObject;
......@@ -67,6 +65,18 @@ staticforward PyTypeObject Mfsstype;
#define is_mfssobject(v) ((v)->ob_type == &Mfsstype)
/* ---------------------------------------------------------------- */
/* Declarations for objects of type FSRef */
typedef struct {
PyObject_HEAD
FSRef fsref;
} mfsrobject;
staticforward PyTypeObject Mfsrtype;
#define is_mfsrobject(v) ((v)->ob_type == &Mfsrtype)
/* ---------------------------------------------------------------- */
/* Declarations for objects of type FInfo */
......@@ -81,7 +91,8 @@ staticforward PyTypeObject Mfsitype;
#define is_mfsiobject(v) ((v)->ob_type == &Mfsitype)
mfssobject *newmfssobject(FSSpec *fss); /* Forward */
staticforward mfssobject *newmfssobject(FSSpec *fss); /* Forward */
staticforward mfsrobject *newmfsrobject(FSRef *fsr); /* Forward */
/* ---------------------------------------------------------------- */
......@@ -336,15 +347,56 @@ static PyTypeObject Mfsitype = {
/*
** Helper routine for other modules: return an FSSpec * if the
** object is a python fsspec object, else NULL
** 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.
*/
FSSpec *
mfs_GetFSSpecFSSpec(PyObject *self)
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)
{
if ( is_mfssobject(self) )
return &((mfssobject *)self)->fsspec;
return NULL;
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;
}
/*
......@@ -467,6 +519,24 @@ mfss_NewAliasMinimal(self, args)
return (PyObject *)newmfsaobject(alias);
}
static PyObject *
mfss_FSpMakeFSRef(self, args)
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(self, args)
......@@ -596,6 +666,8 @@ mfss_SetDates(self, args)
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},
......@@ -695,6 +767,112 @@ statichere PyTypeObject Mfsstype = {
/* End of code for FSSpec objects */
/* -------------------------------------------------------- */
static PyObject *
mfsr_as_fsspec(self, args)
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 struct PyMethodDef mfsr_methods[] = {
{"as_fsspec", (PyCFunction)mfsr_as_fsspec, 1},
#if 0
{"as_pathname", (PyCFunction)mfss_as_pathname, 1},
{"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(self, name)
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(fsr)
FSRef *fsr;
{
mfsrobject *self;
self = PyObject_NEW(mfsrobject, &Mfsrtype);
if (self == NULL)
return NULL;
self->fsref = *fsr;
return self;
}
static int
mfsr_compare(v, w)
mfsrobject *v, *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(self)
mfsrobject *self;
{
PyMem_DEL(self);
}
statichere PyTypeObject Mfsrtype = {
PyObject_HEAD_INIT(&PyType_Type)
0, /*ob_size*/
"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(self, args)
PyObject *self; /* Not used */
......@@ -819,6 +997,18 @@ mfs_FSSpec(self, args)
return (PyObject *)newmfssobject(&fss);
}
static PyObject *
mfs_FSRef(self, args)
PyObject *self; /* Not used */
PyObject *args;
{
FSRef fsr;
if (!PyArg_ParseTuple(args, "O&", PyMac_GetFSRef, &fsr))
return NULL;
return (PyObject *)newmfsrobject(&fsr);
}
static PyObject *
mfs_RawFSSpec(self, args)
PyObject *self; /* Not used */
......@@ -963,6 +1153,7 @@ static struct PyMethodDef mfs_methods[] = {
{"SetFolder", mfs_SetFolder, 1},
#endif
{"FSSpec", mfs_FSSpec, 1},
{"FSRef", mfs_FSRef, 1},
{"RawFSSpec", mfs_RawFSSpec, 1},
{"RawAlias", mfs_RawAlias, 1},
{"FindFolder", mfs_FindFolder, 1},
......@@ -973,6 +1164,79 @@ static struct PyMethodDef mfs_methods[] = {
{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)
{
OSErr err;
/* 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) ) {
PyErr_SetString(PyExc_NotImplementedError, "Cannot create an FSRef from a pathname on this platform");
return 0;
}
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) ) {
/* It's a pathname */
if( !PyArg_Parse(v, "O&", PyMac_GetStr255, &path) )
return 0;
refnum = 0; /* XXXX Should get CurWD here?? */
parid = 0;
} 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);
}
/* Initialization function for the module (*must* be called initmacfs) */
......
......@@ -130,10 +130,6 @@ extern pascal unsigned char *PLstrrchr(unsigned char *, unsigned char);
** with the python errors.h. */
#define fnfErr -43
/* Declared in macfsmodule.c: */
extern FSSpec *mfs_GetFSSpecFSSpec(PyObject *);
extern PyObject *newmfssobject(FSSpec *);
/* Interrupt code variables: */
static int interrupted; /* Set to true when cmd-. seen */
static RETSIGTYPE intcatcher(int);
......@@ -1044,63 +1040,6 @@ PyMac_BuildOptStr255(Str255 s)
}
/*
** Convert a Python object to an FSSpec.
** The object may either be a full pathname or a triple
** (vrefnum, dirid, path).
** NOTE: This routine will fail on pre-sys7 machines.
** The caller is responsible for not calling this routine
** in those cases (which is fine, since everyone calling
** this is probably sys7 dependent anyway).
*/
int
PyMac_GetFSSpec(PyObject *v, FSSpec *fs)
{
Str255 path;
short refnum;
long parid;
OSErr err;
FSSpec *fs2;
#if !TARGET_API_MAC_OSX
/* XXX This #if is temporary */
/* first check whether it already is an FSSpec */
fs2 = mfs_GetFSSpecFSSpec(v);
if ( fs2 ) {
(void)FSMakeFSSpec(fs2->vRefNum, fs2->parID, fs2->name, fs);
return 1;
}
#endif
if ( PyString_Check(v) ) {
/* It's a pathname */
if( !PyArg_Parse(v, "O&", PyMac_GetStr255, &path) )
return 0;
refnum = 0; /* XXXX Should get CurWD here?? */
parid = 0;
} else {
if( !PyArg_Parse(v, "(hlO&); FSSpec should be 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)
{
#if TARGET_API_MAC_OSX
PyErr_SetString(PyExc_NotImplementedError, "FSSpec not yet done for OSX");
return NULL;
#else
return newmfssobject(v);
#endif
}
/* Convert a Python object to a Rect.
The object must be a (left, top, right, bottom) tuple.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment