1 /***********************************************************
2 Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
7 Permission to use, copy, modify, and distribute this software and its
8 documentation for any purpose and without fee is hereby granted,
9 provided that the above copyright notice appear in all copies and that
10 both that copyright notice and this permission notice appear in
11 supporting documentation, and that the names of Stichting Mathematisch
12 Centrum or CWI not be used in advertising or publicity pertaining to
13 distribution of the software without specific, written prior permission.
15 STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16 THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17 FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18 FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21 OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23 ******************************************************************/
25 #include "allobjects.h"
26 #include "modsupport.h" /* For getargs() etc. */
31 #include <StandardFile.h>
34 #include "nfullpath.h"
37 #define FileFilterUPP FileFilterProcPtr
40 static object
*ErrorObject
;
42 /* ----------------------------------------------------- */
43 /* Declarations for objects of type Alias */
50 staticforward typeobject Mfsatype
;
52 #define is_mfsaobject(v) ((v)->ob_type == &Mfsatype)
54 /* ---------------------------------------------------------------- */
55 /* Declarations for objects of type FSSpec */
62 staticforward typeobject Mfsstype
;
64 #define is_mfssobject(v) ((v)->ob_type == &Mfsstype)
67 mfssobject
*newmfssobject(FSSpec
*fss
); /* Forward */
69 /* ---------------------------------------------------------------- */
72 mfsa_Resolve(self
, args
)
76 FSSpec from
, *fromp
, result
;
81 if (!newgetargs(args
, "|O&", PyMac_GetFSSpec
, &from
))
87 err
= ResolveAlias(fromp
, self
->alias
, &result
, &changed
);
89 PyErr_Mac(ErrorObject
, err
);
92 return mkvalue("(Oi)", newmfssobject(&result
), (int)changed
);
96 mfsa_GetInfo(self
, args
)
104 if (!newgetargs(args
, "i", &i
))
106 err
= GetAliasInfo(self
->alias
, (AliasInfoType
)i
, value
);
108 PyErr_Mac(ErrorObject
, err
);
111 return newsizedstringobject((char *)&value
[1], value
[0]);
115 mfsa_Update(self
, args
)
119 FSSpec target
, fromfile
, *fromfilep
;
123 fromfile
.name
[0] = 0;
124 if (!newgetargs(args
, "O&|O&", PyMac_GetFSSpec
, &target
,
125 PyMac_GetFSSpec
, &fromfile
))
127 if ( fromfile
.name
[0] )
128 fromfilep
= &fromfile
;
131 err
= UpdateAlias(fromfilep
, &target
, self
->alias
, &changed
);
133 PyErr_Mac(ErrorObject
, err
);
136 return mkvalue("i", (int)changed
);
139 static struct methodlist mfsa_methods
[] = {
140 {"Resolve", (method
)mfsa_Resolve
, 1},
141 {"GetInfo", (method
)mfsa_GetInfo
, 1},
142 {"Update", (method
)mfsa_Update
, 1},
144 {NULL
, NULL
} /* sentinel */
150 mfsa_getattr(self
, name
)
154 if ( strcmp(name
, "data") == 0 ) {
158 size
= GetHandleSize((Handle
)self
->alias
);
159 HLock((Handle
)self
->alias
);
160 rv
= PyString_FromStringAndSize(*(Handle
)self
->alias
, size
);
161 HUnlock((Handle
)self
->alias
);
164 return findmethod(mfsa_methods
, (object
*)self
, name
);
173 self
= NEWOBJ(mfsaobject
, &Mfsatype
);
187 should we
do something here
?
194 statichere typeobject Mfsatype
= {
195 OB_HEAD_INIT(&Typetype
)
198 sizeof(mfsaobject
), /*tp_basicsize*/
201 (destructor
)mfsa_dealloc
, /*tp_dealloc*/
202 (printfunc
)0, /*tp_print*/
203 (getattrfunc
)mfsa_getattr
, /*tp_getattr*/
204 (setattrfunc
)0, /*tp_setattr*/
205 (cmpfunc
)0, /*tp_compare*/
206 (reprfunc
)0, /*tp_repr*/
208 0, /*tp_as_sequence*/
210 (hashfunc
)0, /*tp_hash*/
213 /* End of code for Alias objects */
214 /* -------------------------------------------------------- */
217 ** Helper routine for other modules: return an FSSpec * if the
218 ** object is a python fsspec object, else NULL
221 mfs_GetFSSpecFSSpec(self
)
224 if ( is_mfssobject(self
) )
225 return &((mfssobject
*)self
)->fsspec
;
230 mfss_as_pathname(self
, args
)
237 if (!newgetargs(args
, ""))
239 err
= nfullpath(&self
->fsspec
, strbuf
);
241 PyErr_Mac(ErrorObject
, err
);
244 return newstringobject(strbuf
);
248 mfss_as_tuple(self
, args
)
252 if (!newgetargs(args
, ""))
254 return Py_BuildValue("(iis#)", self
->fsspec
.vRefNum
, self
->fsspec
.parID
,
255 &self
->fsspec
.name
[1], self
->fsspec
.name
[0]);
259 mfss_NewAlias(self
, args
)
268 if (!newgetargs(args
, "|O&", PyMac_GetFSSpec
, &src
))
274 err
= NewAlias(srcp
, &self
->fsspec
, &alias
);
276 PyErr_Mac(ErrorObject
, err
);
280 return (object
*)newmfsaobject(alias
);
284 mfss_NewAliasMinimal(self
, args
)
291 if (!newgetargs(args
, ""))
293 err
= NewAliasMinimal(&self
->fsspec
, &alias
);
295 PyErr_Mac(ErrorObject
, err
);
298 return (object
*)newmfsaobject(alias
);
301 /* XXXX These routines should be replaced with a complete interface to *FInfo */
303 mfss_GetCreatorType(self
, args
)
310 if (!newgetargs(args
, ""))
312 err
= FSpGetFInfo(&self
->fsspec
, &info
);
314 PyErr_Mac(ErrorObject
, err
);
317 return Py_BuildValue("(O&O&)",
318 PyMac_BuildOSType
, info
.fdCreator
, PyMac_BuildOSType
, info
.fdType
);
322 mfss_SetCreatorType(self
, args
)
327 OSType creator
, type
;
330 if (!newgetargs(args
, "O&O&", PyMac_GetOSType
, &creator
, PyMac_GetOSType
, &type
))
332 err
= FSpGetFInfo(&self
->fsspec
, &info
);
334 PyErr_Mac(ErrorObject
, err
);
338 info
.fdCreator
= creator
;
339 err
= FSpSetFInfo(&self
->fsspec
, &info
);
341 PyErr_Mac(ErrorObject
, err
);
348 static struct methodlist mfss_methods
[] = {
349 {"as_pathname", (method
)mfss_as_pathname
, 1},
350 {"as_tuple", (method
)mfss_as_tuple
, 1},
351 {"NewAlias", (method
)mfss_NewAlias
, 1},
352 {"NewAliasMinimal", (method
)mfss_NewAliasMinimal
, 1},
353 {"GetCreatorType", (method
)mfss_GetCreatorType
, 1},
354 {"SetCreatorType", (method
)mfss_SetCreatorType
, 1},
356 {NULL
, NULL
} /* sentinel */
362 mfss_getattr(self
, name
)
366 if ( strcmp(name
, "data") == 0)
367 return PyString_FromStringAndSize((char *)&self
->fsspec
, sizeof(FSSpec
));
368 return findmethod(mfss_methods
, (object
*)self
, name
);
377 self
= NEWOBJ(mfssobject
, &Mfsstype
);
397 sprintf(buf
, "FSSpec((%d, %d, '%.*s'))",
398 self
->fsspec
.vRefNum
,
400 self
->fsspec
.name
[0], self
->fsspec
.name
+1);
401 return newstringobject(buf
);
411 if ( v
->fsspec
.vRefNum
< w
->fsspec
.vRefNum
) return -1;
412 if ( v
->fsspec
.vRefNum
> w
->fsspec
.vRefNum
) return 1;
413 if ( v
->fsspec
.parID
< w
->fsspec
.parID
) return -1;
414 if ( v
->fsspec
.parID
> w
->fsspec
.parID
) return 1;
415 minlen
= v
->fsspec
.name
[0];
416 if ( w
->fsspec
.name
[0] < minlen
) minlen
= w
->fsspec
.name
[0];
417 res
= strncmp((char *)v
->fsspec
.name
+1, (char *)w
->fsspec
.name
+1, minlen
);
418 if ( res
) return res
;
419 if ( v
->fsspec
.name
[0] < w
->fsspec
.name
[0] ) return -1;
420 if ( v
->fsspec
.name
[0] > w
->fsspec
.name
[0] ) return 1;
424 statichere typeobject Mfsstype
= {
425 OB_HEAD_INIT(&Typetype
)
427 "FSSpec", /*tp_name*/
428 sizeof(mfssobject
), /*tp_basicsize*/
431 (destructor
)mfss_dealloc
, /*tp_dealloc*/
432 (printfunc
)0, /*tp_print*/
433 (getattrfunc
)mfss_getattr
, /*tp_getattr*/
434 (setattrfunc
)0, /*tp_setattr*/
435 (cmpfunc
)mfss_compare
, /*tp_compare*/
436 (reprfunc
)mfss_repr
, /*tp_repr*/
438 0, /*tp_as_sequence*/
440 (hashfunc
)0, /*tp_hash*/
443 /* End of code for FSSpec objects */
444 /* -------------------------------------------------------- */
447 mfs_ResolveAliasFile(self
, args
)
448 object
*self
; /* Not used */
452 Boolean chain
= 1, isfolder
, wasaliased
;
455 if (!newgetargs(args
, "O&|i", PyMac_GetFSSpec
, &fss
, &chain
))
457 err
= ResolveAliasFile(&fss
, chain
, &isfolder
, &wasaliased
);
459 PyErr_Mac(ErrorObject
, err
);
462 return mkvalue("Oii", newmfssobject(&fss
), (int)isfolder
, (int)wasaliased
);
466 mfs_StandardGetFile(self
, args
)
467 object
*self
; /* Not used */
472 StandardFileReply reply
;
474 list
[0] = list
[1] = list
[2] = list
[3] = 0;
476 if (!newgetargs(args
, "|O&O&O&O&", PyMac_GetOSType
, &list
[0],
477 PyMac_GetOSType
, &list
[1], PyMac_GetOSType
, &list
[2],
478 PyMac_GetOSType
, &list
[3]) )
480 while ( numtypes
< 4 && list
[numtypes
] ) {
483 StandardGetFile((FileFilterUPP
)0, numtypes
, list
, &reply
);
484 return mkvalue("(Oi)", newmfssobject(&reply
.sfFile
), reply
.sfGood
);
488 mfs_StandardPutFile(self
, args
)
489 object
*self
; /* Not used */
493 StandardFileReply reply
;
496 if (!newgetargs(args
, "O&|O&", PyMac_GetStr255
, &prompt
, PyMac_GetStr255
, &dft
) )
498 StandardPutFile(prompt
, dft
, &reply
);
499 return mkvalue("(Oi)",newmfssobject(&reply
.sfFile
), reply
.sfGood
);
503 mfs_FSSpec(self
, args
)
504 object
*self
; /* Not used */
509 if (!newgetargs(args
, "O&", PyMac_GetFSSpec
, &fss
))
511 return (object
*)newmfssobject(&fss
);
515 mfs_RawFSSpec(self
, args
)
516 object
*self
; /* Not used */
522 if (!newgetargs(args
, "s#", &fssp
, &size
))
524 if ( size
!= sizeof(FSSpec
) ) {
525 PyErr_SetString(PyExc_TypeError
, "Incorrect size for FSSpec record");
528 return (object
*)newmfssobject(fssp
);
532 mfs_RawAlias(self
, args
)
533 object
*self
; /* Not used */
540 if (!newgetargs(args
, "s#", &dataptr
, &size
))
548 memcpy((char *)*h
, dataptr
, size
);
550 return (object
*)newmfsaobject((AliasHandle
)h
);
554 mfs_GetDirectory(self
, args
)
555 object
*self
; /* Not used */
561 if (!newgetargs(args
, "") )
564 ok
= PyMac_GetDirectory(&fsdir
);
565 return mkvalue("(Oi)", newmfssobject(&fsdir
), ok
);
568 /* List of methods defined in the module */
570 static struct methodlist mfs_methods
[] = {
571 {"ResolveAliasFile", mfs_ResolveAliasFile
, 1},
572 {"StandardGetFile", mfs_StandardGetFile
, 1},
573 {"StandardPutFile", mfs_StandardPutFile
, 1},
574 {"GetDirectory", mfs_GetDirectory
, 1},
575 {"FSSpec", mfs_FSSpec
, 1},
576 {"RawFSSpec", mfs_RawFSSpec
, 1},
577 {"RawAlias", mfs_RawAlias
, 1},
579 {NULL
, NULL
} /* sentinel */
583 /* Initialization function for the module (*must* be called initmacfs) */
590 /* Create the module and add the functions */
591 m
= initmodule("macfs", mfs_methods
);
593 /* Add some symbolic constants to the module */
594 d
= getmoduledict(m
);
595 ErrorObject
= newstringobject("macfs.error");
596 dictinsert(d
, "error", ErrorObject
);
598 /* XXXX Add constants here */
600 /* Check for errors */
602 fatal("can't initialize module macfs");