blob: 91e63ebcd711c76f42481b74d9d6907c1bcfad23 [file] [log] [blame]
Jack Jansen84fa5ec1995-01-18 14:04:40 +00001/***********************************************************
Guido van Rossumefd97671995-01-26 22:56:16 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Jack Jansen84fa5ec1995-01-18 14:04:40 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
25#include "allobjects.h"
26#include "modsupport.h" /* For getargs() etc. */
27#include "macglue.h"
28
Guido van Rossumbecdbec1995-02-14 01:27:24 +000029#include <Memory.h>
Jack Jansen84fa5ec1995-01-18 14:04:40 +000030#include <Files.h>
Jack Jansen2c673621995-06-18 20:05:14 +000031#include <Folders.h>
Jack Jansen84fa5ec1995-01-18 14:04:40 +000032#include <StandardFile.h>
33#include <Aliases.h>
Jack Jansend99d2831996-07-22 15:26:01 +000034#include <LowMem.h>
Jack Jansen84fa5ec1995-01-18 14:04:40 +000035
36#include "nfullpath.h"
Jack Jansen924ca851996-09-20 15:25:16 +000037#include "getapplbycreator.h"
Jack Jansen84fa5ec1995-01-18 14:04:40 +000038
Guido van Rossuma42960c1995-01-19 00:03:47 +000039#ifdef THINK_C
40#define FileFilterUPP FileFilterProcPtr
41#endif
42
Jack Jansen84fa5ec1995-01-18 14:04:40 +000043static object *ErrorObject;
44
45/* ----------------------------------------------------- */
Jack Jansen17ba43f1995-01-26 16:22:07 +000046/* Declarations for objects of type Alias */
47
48typedef struct {
49 OB_HEAD
50 AliasHandle alias;
51} mfsaobject;
52
53staticforward typeobject Mfsatype;
54
55#define is_mfsaobject(v) ((v)->ob_type == &Mfsatype)
56
57/* ---------------------------------------------------------------- */
58/* Declarations for objects of type FSSpec */
59
60typedef struct {
61 OB_HEAD
62 FSSpec fsspec;
63} mfssobject;
64
65staticforward typeobject Mfsstype;
66
67#define is_mfssobject(v) ((v)->ob_type == &Mfsstype)
68
Guido van Rossumefd97671995-01-26 22:56:16 +000069
Jack Jansen3d185931995-08-07 14:04:10 +000070/* ---------------------------------------------------------------- */
71/* Declarations for objects of type FInfo */
72
73typedef struct {
74 OB_HEAD
75 FInfo finfo;
76} mfsiobject;
77
78staticforward typeobject Mfsitype;
79
80#define is_mfsiobject(v) ((v)->ob_type == &Mfsitype)
81
82
Guido van Rossumefd97671995-01-26 22:56:16 +000083mfssobject *newmfssobject(FSSpec *fss); /* Forward */
84
Jack Jansen17ba43f1995-01-26 16:22:07 +000085/* ---------------------------------------------------------------- */
Jack Jansen84fa5ec1995-01-18 14:04:40 +000086
87static object *
Jack Jansen17ba43f1995-01-26 16:22:07 +000088mfsa_Resolve(self, args)
89 mfsaobject *self;
Jack Jansen84fa5ec1995-01-18 14:04:40 +000090 object *args;
91{
Jack Jansen17ba43f1995-01-26 16:22:07 +000092 FSSpec from, *fromp, result;
93 Boolean changed;
94 OSErr err;
Jack Jansen84fa5ec1995-01-18 14:04:40 +000095
Jack Jansen17ba43f1995-01-26 16:22:07 +000096 from.name[0] = 0;
97 if (!newgetargs(args, "|O&", PyMac_GetFSSpec, &from))
Jack Jansen84fa5ec1995-01-18 14:04:40 +000098 return NULL;
Jack Jansen17ba43f1995-01-26 16:22:07 +000099 if (from.name[0] )
100 fromp = &from;
101 else
102 fromp = NULL;
103 err = ResolveAlias(fromp, self->alias, &result, &changed);
104 if ( err ) {
105 PyErr_Mac(ErrorObject, err);
106 return NULL;
107 }
108 return mkvalue("(Oi)", newmfssobject(&result), (int)changed);
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000109}
110
111static object *
Jack Jansen17ba43f1995-01-26 16:22:07 +0000112mfsa_GetInfo(self, args)
113 mfsaobject *self;
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000114 object *args;
115{
Jack Jansen17ba43f1995-01-26 16:22:07 +0000116 Str63 value;
117 int i;
118 OSErr err;
119
120 if (!newgetargs(args, "i", &i))
121 return NULL;
122 err = GetAliasInfo(self->alias, (AliasInfoType)i, value);
123 if ( err ) {
124 PyErr_Mac(ErrorObject, err);
125 return 0;
126 }
127 return newsizedstringobject((char *)&value[1], value[0]);
128}
129
130static object *
131mfsa_Update(self, args)
132 mfsaobject *self;
133 object *args;
134{
135 FSSpec target, fromfile, *fromfilep;
136 OSErr err;
137 Boolean changed;
138
139 fromfile.name[0] = 0;
140 if (!newgetargs(args, "O&|O&", PyMac_GetFSSpec, &target,
141 PyMac_GetFSSpec, &fromfile))
142 return NULL;
143 if ( fromfile.name[0] )
144 fromfilep = &fromfile;
145 else
146 fromfilep = NULL;
147 err = UpdateAlias(fromfilep, &target, self->alias, &changed);
148 if ( err ) {
149 PyErr_Mac(ErrorObject, err);
150 return 0;
151 }
152 return mkvalue("i", (int)changed);
153}
154
155static struct methodlist mfsa_methods[] = {
Guido van Rossumefd97671995-01-26 22:56:16 +0000156 {"Resolve", (method)mfsa_Resolve, 1},
157 {"GetInfo", (method)mfsa_GetInfo, 1},
158 {"Update", (method)mfsa_Update, 1},
Jack Jansen17ba43f1995-01-26 16:22:07 +0000159
160 {NULL, NULL} /* sentinel */
161};
162
163/* ---------- */
164
165static object *
166mfsa_getattr(self, name)
167 mfsaobject *self;
168 char *name;
169{
Jack Jansenc889b761995-02-13 12:00:46 +0000170 if ( strcmp(name, "data") == 0 ) {
171 int size;
172 PyObject *rv;
173
174 size = GetHandleSize((Handle)self->alias);
175 HLock((Handle)self->alias);
176 rv = PyString_FromStringAndSize(*(Handle)self->alias, size);
177 HUnlock((Handle)self->alias);
178 return rv;
179 }
Jack Jansen17ba43f1995-01-26 16:22:07 +0000180 return findmethod(mfsa_methods, (object *)self, name);
181}
182
183mfsaobject *
184newmfsaobject(alias)
185 AliasHandle alias;
186{
187 mfsaobject *self;
188
189 self = NEWOBJ(mfsaobject, &Mfsatype);
190 if (self == NULL)
191 return NULL;
192 self->alias = alias;
193 return self;
194}
195
196
197static void
198mfsa_dealloc(self)
199 mfsaobject *self;
200{
201#if 0
202 if ( self->alias ) {
203 should we do something here?
204 }
205#endif
206
207 DEL(self);
208}
209
Guido van Rossumf45b53b1995-02-20 23:43:29 +0000210statichere typeobject Mfsatype = {
Jack Jansen17ba43f1995-01-26 16:22:07 +0000211 OB_HEAD_INIT(&Typetype)
212 0, /*ob_size*/
213 "Alias", /*tp_name*/
214 sizeof(mfsaobject), /*tp_basicsize*/
215 0, /*tp_itemsize*/
216 /* methods */
217 (destructor)mfsa_dealloc, /*tp_dealloc*/
Guido van Rossumf45b53b1995-02-20 23:43:29 +0000218 (printfunc)0, /*tp_print*/
Jack Jansen17ba43f1995-01-26 16:22:07 +0000219 (getattrfunc)mfsa_getattr, /*tp_getattr*/
Guido van Rossumf45b53b1995-02-20 23:43:29 +0000220 (setattrfunc)0, /*tp_setattr*/
221 (cmpfunc)0, /*tp_compare*/
222 (reprfunc)0, /*tp_repr*/
223 0, /*tp_as_number*/
224 0, /*tp_as_sequence*/
225 0, /*tp_as_mapping*/
226 (hashfunc)0, /*tp_hash*/
Jack Jansen17ba43f1995-01-26 16:22:07 +0000227};
228
229/* End of code for Alias objects */
230/* -------------------------------------------------------- */
231
Jack Jansen3d185931995-08-07 14:04:10 +0000232/* ---------------------------------------------------------------- */
233
234static struct methodlist mfsi_methods[] = {
235
236 {NULL, NULL} /* sentinel */
237};
238
239/* ---------- */
240
241static mfsiobject *
242newmfsiobject()
243{
244 mfsiobject *self;
245
246 self = NEWOBJ(mfsiobject, &Mfsitype);
247 if (self == NULL)
248 return NULL;
249 memset((char *)&self->finfo, '\0', sizeof(self->finfo));
250 return self;
251}
252
253static void
254mfsi_dealloc(self)
255 mfsiobject *self;
256{
257 DEL(self);
258}
259
260static object *
261mfsi_getattr(self, name)
262 mfsiobject *self;
263 char *name;
264{
Jack Jansen3d185931995-08-07 14:04:10 +0000265 if ( strcmp(name, "Type") == 0 )
266 return PyMac_BuildOSType(self->finfo.fdType);
267 else if ( strcmp(name, "Creator") == 0 )
268 return PyMac_BuildOSType(self->finfo.fdCreator);
269 else if ( strcmp(name, "Flags") == 0 )
270 return Py_BuildValue("i", (int)self->finfo.fdFlags);
271 else if ( strcmp(name, "Location") == 0 )
272 return PyMac_BuildPoint(self->finfo.fdLocation);
273 else if ( strcmp(name, "Fldr") == 0 )
274 return Py_BuildValue("i", (int)self->finfo.fdFldr);
275 else
276 return findmethod(mfsi_methods, (object *)self, name);
277}
278
279
280static int
281mfsi_setattr(self, name, v)
282 mfsiobject *self;
283 char *name;
284 object *v;
285{
286 int rv;
287 int i;
288
289 if ( v == NULL ) {
290 err_setstr(AttributeError, "Cannot delete attribute");
291 return -1;
292 }
293 if ( strcmp(name, "Type") == 0 )
294 rv = PyMac_GetOSType(v, &self->finfo.fdType);
295 else if ( strcmp(name, "Creator") == 0 )
296 rv = PyMac_GetOSType(v, &self->finfo.fdCreator);
297 else if ( strcmp(name, "Flags") == 0 ) {
298 rv = PyArg_Parse(v, "i", &i);
299 self->finfo.fdFlags = (short)i;
300 } else if ( strcmp(name, "Location") == 0 )
301 rv = PyMac_GetPoint(v, &self->finfo.fdLocation);
302 else if ( strcmp(name, "Fldr") == 0 ) {
303 rv = PyArg_Parse(v, "i", &i);
304 self->finfo.fdFldr = (short)i;
305 } else {
306 err_setstr(AttributeError, "No such attribute");
307 return -1;
308 }
309 if (rv)
310 return 0;
311 return -1;
312}
313
314
315static typeobject Mfsitype = {
316 OB_HEAD_INIT(&Typetype)
317 0, /*ob_size*/
318 "FInfo object", /*tp_name*/
319 sizeof(mfsiobject), /*tp_basicsize*/
320 0, /*tp_itemsize*/
321 /* methods */
322 (destructor)mfsi_dealloc, /*tp_dealloc*/
323 (printfunc)0, /*tp_print*/
324 (getattrfunc)mfsi_getattr, /*tp_getattr*/
325 (setattrfunc)mfsi_setattr, /*tp_setattr*/
326 (cmpfunc)0, /*tp_compare*/
327 (reprfunc)0, /*tp_repr*/
328 0, /*tp_as_number*/
329 0, /*tp_as_sequence*/
330 0, /*tp_as_mapping*/
331 (hashfunc)0, /*tp_hash*/
332};
333
334/* End of code for FInfo object objects */
335/* -------------------------------------------------------- */
336
337
Jack Jansen17ba43f1995-01-26 16:22:07 +0000338/*
339** Helper routine for other modules: return an FSSpec * if the
340** object is a python fsspec object, else NULL
341*/
342FSSpec *
343mfs_GetFSSpecFSSpec(self)
344 object *self;
345{
346 if ( is_mfssobject(self) )
347 return &((mfssobject *)self)->fsspec;
348 return NULL;
349}
350
Jack Jansen0bdf9791996-09-15 22:11:25 +0000351/*
352** Two generally useful routines
353*/
354static OSErr
355PyMac_GetFileDates(fss, crdat, mddat, bkdat)
356 FSSpec *fss;
357 unsigned long *crdat, *mddat, *bkdat;
358{
359 CInfoPBRec pb;
360 OSErr error;
361
362 pb.dirInfo.ioNamePtr = fss->name;
363 pb.dirInfo.ioFDirIndex = 0;
364 pb.dirInfo.ioVRefNum = fss->vRefNum;
365 pb.dirInfo.ioDrDirID = fss->parID;
366 error = PBGetCatInfoSync(&pb);
367 if ( error ) return error;
368 *crdat = pb.hFileInfo.ioFlCrDat;
369 *mddat = pb.hFileInfo.ioFlMdDat;
370 *bkdat = pb.hFileInfo.ioFlBkDat;
371 return 0;
372}
373
374static OSErr
375PyMac_SetFileDates(fss, crdat, mddat, bkdat)
376 FSSpec *fss;
377 unsigned long crdat, mddat, bkdat;
378{
379 CInfoPBRec pb;
380 OSErr error;
381
382 pb.dirInfo.ioNamePtr = fss->name;
383 pb.dirInfo.ioFDirIndex = 0;
384 pb.dirInfo.ioVRefNum = fss->vRefNum;
385 pb.dirInfo.ioDrDirID = fss->parID;
386 error = PBGetCatInfoSync(&pb);
387 if ( error ) return error;
388 pb.dirInfo.ioNamePtr = fss->name;
389 pb.dirInfo.ioFDirIndex = 0;
390 pb.dirInfo.ioVRefNum = fss->vRefNum;
391 pb.dirInfo.ioDrDirID = fss->parID;
392 pb.hFileInfo.ioFlCrDat = crdat;
393 pb.hFileInfo.ioFlMdDat = mddat;
394 pb.hFileInfo.ioFlBkDat = bkdat;
395 error = PBSetCatInfoSync(&pb);
396 return error;
397}
398
Jack Jansen17ba43f1995-01-26 16:22:07 +0000399static object *
400mfss_as_pathname(self, args)
401 mfssobject *self;
402 object *args;
403{
404 char strbuf[257];
405 OSErr err;
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000406
407 if (!newgetargs(args, ""))
408 return NULL;
Jack Jansen17ba43f1995-01-26 16:22:07 +0000409 err = nfullpath(&self->fsspec, strbuf);
410 if ( err ) {
411 PyErr_Mac(ErrorObject, err);
412 return NULL;
413 }
414 return newstringobject(strbuf);
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000415}
416
417static object *
Jack Jansen17ba43f1995-01-26 16:22:07 +0000418mfss_as_tuple(self, args)
419 mfssobject *self;
420 object *args;
421{
422 if (!newgetargs(args, ""))
423 return NULL;
424 return Py_BuildValue("(iis#)", self->fsspec.vRefNum, self->fsspec.parID,
425 &self->fsspec.name[1], self->fsspec.name[0]);
426}
427
428static object *
429mfss_NewAlias(self, args)
430 mfssobject *self;
431 object *args;
432{
433 FSSpec src, *srcp;
434 OSErr err;
435 AliasHandle alias;
436
437 src.name[0] = 0;
438 if (!newgetargs(args, "|O&", PyMac_GetFSSpec, &src))
439 return NULL;
440 if ( src.name[0] )
441 srcp = &src;
442 else
443 srcp = NULL;
444 err = NewAlias(srcp, &self->fsspec, &alias);
445 if ( err ) {
446 PyErr_Mac(ErrorObject, err);
447 return NULL;
448 }
449
450 return (object *)newmfsaobject(alias);
451}
452
453static object *
454mfss_NewAliasMinimal(self, args)
455 mfssobject *self;
456 object *args;
457{
458 OSErr err;
459 AliasHandle alias;
460
461 if (!newgetargs(args, ""))
462 return NULL;
463 err = NewAliasMinimal(&self->fsspec, &alias);
464 if ( err ) {
465 PyErr_Mac(ErrorObject, err);
466 return NULL;
467 }
468 return (object *)newmfsaobject(alias);
469}
470
Jack Jansen3d185931995-08-07 14:04:10 +0000471/* XXXX These routines should be replaced by a wrapper to the *FInfo routines */
Jack Jansen8828fcf1995-02-02 14:23:52 +0000472static object *
473mfss_GetCreatorType(self, args)
474 mfssobject *self;
475 object *args;
476{
477 OSErr err;
478 FInfo info;
479
480 if (!newgetargs(args, ""))
481 return NULL;
482 err = FSpGetFInfo(&self->fsspec, &info);
483 if ( err ) {
484 PyErr_Mac(ErrorObject, err);
485 return NULL;
486 }
487 return Py_BuildValue("(O&O&)",
488 PyMac_BuildOSType, info.fdCreator, PyMac_BuildOSType, info.fdType);
489}
490
491static object *
492mfss_SetCreatorType(self, args)
493 mfssobject *self;
494 object *args;
495{
496 OSErr err;
497 OSType creator, type;
498 FInfo info;
499
500 if (!newgetargs(args, "O&O&", PyMac_GetOSType, &creator, PyMac_GetOSType, &type))
501 return NULL;
502 err = FSpGetFInfo(&self->fsspec, &info);
503 if ( err ) {
504 PyErr_Mac(ErrorObject, err);
505 return NULL;
506 }
507 info.fdType = type;
508 info.fdCreator = creator;
509 err = FSpSetFInfo(&self->fsspec, &info);
510 if ( err ) {
511 PyErr_Mac(ErrorObject, err);
512 return NULL;
513 }
514 INCREF(None);
515 return None;
516}
517
Jack Jansen3d185931995-08-07 14:04:10 +0000518static object *
519mfss_GetFInfo(self, args)
520 mfssobject *self;
521 object *args;
522{
523 OSErr err;
524 mfsiobject *fip;
525
526
527 if (!newgetargs(args, ""))
528 return NULL;
529 if ( (fip=newmfsiobject()) == NULL )
530 return NULL;
531 err = FSpGetFInfo(&self->fsspec, &fip->finfo);
532 if ( err ) {
533 PyErr_Mac(ErrorObject, err);
534 DECREF(fip);
535 return NULL;
536 }
537 return (object *)fip;
538}
539
540static object *
541mfss_SetFInfo(self, args)
542 mfssobject *self;
543 object *args;
544{
545 OSErr err;
546 mfsiobject *fip;
547
548 if (!newgetargs(args, "O!", &Mfsitype, &fip))
549 return NULL;
550 err = FSpSetFInfo(&self->fsspec, &fip->finfo);
551 if ( err ) {
552 PyErr_Mac(ErrorObject, err);
553 return NULL;
554 }
555 INCREF(None);
556 return None;
557}
558
Jack Jansen0bdf9791996-09-15 22:11:25 +0000559static object *
560mfss_GetDates(self, args)
561 mfssobject *self;
562 object *args;
563{
564 OSErr err;
565 unsigned long crdat, mddat, bkdat;
566
567 if (!newgetargs(args, ""))
568 return NULL;
569 err = PyMac_GetFileDates(&self->fsspec, &crdat, &mddat, &bkdat);
570 if ( err ) {
571 PyErr_Mac(ErrorObject, err);
572 return NULL;
573 }
574 return mkvalue("ddd", (double)crdat, (double)mddat, (double)bkdat);
575}
576
577static object *
578mfss_SetDates(self, args)
579 mfssobject *self;
580 object *args;
581{
582 OSErr err;
583 double crdat, mddat, bkdat;
584
585 if (!newgetargs(args, "ddd", &crdat, &mddat, &bkdat))
586 return NULL;
587 err = PyMac_SetFileDates(&self->fsspec, (unsigned long)crdat,
588 (unsigned long)mddat, (unsigned long)bkdat);
589 if ( err ) {
590 PyErr_Mac(ErrorObject, err);
591 return NULL;
592 }
593 INCREF(None);
594 return None;
595}
596
Jack Jansen17ba43f1995-01-26 16:22:07 +0000597static struct methodlist mfss_methods[] = {
Guido van Rossumefd97671995-01-26 22:56:16 +0000598 {"as_pathname", (method)mfss_as_pathname, 1},
599 {"as_tuple", (method)mfss_as_tuple, 1},
600 {"NewAlias", (method)mfss_NewAlias, 1},
601 {"NewAliasMinimal", (method)mfss_NewAliasMinimal, 1},
Jack Jansen8828fcf1995-02-02 14:23:52 +0000602 {"GetCreatorType", (method)mfss_GetCreatorType, 1},
603 {"SetCreatorType", (method)mfss_SetCreatorType, 1},
Jack Jansen3d185931995-08-07 14:04:10 +0000604 {"GetFInfo", (method)mfss_GetFInfo, 1},
605 {"SetFInfo", (method)mfss_SetFInfo, 1},
Jack Jansen0bdf9791996-09-15 22:11:25 +0000606 {"GetDates", (method)mfss_GetDates, 1},
607 {"SetDates", (method)mfss_SetDates, 1},
Jack Jansen17ba43f1995-01-26 16:22:07 +0000608
609 {NULL, NULL} /* sentinel */
610};
611
612/* ---------- */
613
614static object *
615mfss_getattr(self, name)
616 mfssobject *self;
617 char *name;
618{
Jack Jansenc889b761995-02-13 12:00:46 +0000619 if ( strcmp(name, "data") == 0)
620 return PyString_FromStringAndSize((char *)&self->fsspec, sizeof(FSSpec));
Jack Jansen17ba43f1995-01-26 16:22:07 +0000621 return findmethod(mfss_methods, (object *)self, name);
622}
623
624mfssobject *
625newmfssobject(fss)
626 FSSpec *fss;
627{
628 mfssobject *self;
629
630 self = NEWOBJ(mfssobject, &Mfsstype);
631 if (self == NULL)
632 return NULL;
633 self->fsspec = *fss;
634 return self;
635}
636
637static void
638mfss_dealloc(self)
639 mfssobject *self;
640{
641 DEL(self);
642}
643
644static object *
645mfss_repr(self)
646 mfssobject *self;
647{
648 char buf[512];
649
Guido van Rossumf45b53b1995-02-20 23:43:29 +0000650 sprintf(buf, "FSSpec((%d, %d, '%.*s'))",
651 self->fsspec.vRefNum,
652 self->fsspec.parID,
653 self->fsspec.name[0], self->fsspec.name+1);
Jack Jansen17ba43f1995-01-26 16:22:07 +0000654 return newstringobject(buf);
655}
656
657static int
658mfss_compare(v, w)
659 mfssobject *v, *w;
660{
661 int minlen;
662 int res;
663
664 if ( v->fsspec.vRefNum < w->fsspec.vRefNum ) return -1;
665 if ( v->fsspec.vRefNum > w->fsspec.vRefNum ) return 1;
666 if ( v->fsspec.parID < w->fsspec.parID ) return -1;
667 if ( v->fsspec.parID > w->fsspec.parID ) return 1;
668 minlen = v->fsspec.name[0];
669 if ( w->fsspec.name[0] < minlen ) minlen = w->fsspec.name[0];
670 res = strncmp((char *)v->fsspec.name+1, (char *)w->fsspec.name+1, minlen);
671 if ( res ) return res;
672 if ( v->fsspec.name[0] < w->fsspec.name[0] ) return -1;
673 if ( v->fsspec.name[0] > w->fsspec.name[0] ) return 1;
674 return res;
675}
676
Guido van Rossumf45b53b1995-02-20 23:43:29 +0000677statichere typeobject Mfsstype = {
Jack Jansen17ba43f1995-01-26 16:22:07 +0000678 OB_HEAD_INIT(&Typetype)
679 0, /*ob_size*/
680 "FSSpec", /*tp_name*/
681 sizeof(mfssobject), /*tp_basicsize*/
682 0, /*tp_itemsize*/
683 /* methods */
684 (destructor)mfss_dealloc, /*tp_dealloc*/
685 (printfunc)0, /*tp_print*/
686 (getattrfunc)mfss_getattr, /*tp_getattr*/
687 (setattrfunc)0, /*tp_setattr*/
688 (cmpfunc)mfss_compare, /*tp_compare*/
689 (reprfunc)mfss_repr, /*tp_repr*/
690 0, /*tp_as_number*/
691 0, /*tp_as_sequence*/
692 0, /*tp_as_mapping*/
693 (hashfunc)0, /*tp_hash*/
694};
695
696/* End of code for FSSpec objects */
697/* -------------------------------------------------------- */
698
699static object *
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000700mfs_ResolveAliasFile(self, args)
701 object *self; /* Not used */
702 object *args;
703{
Jack Jansen17ba43f1995-01-26 16:22:07 +0000704 FSSpec fss;
705 Boolean chain = 1, isfolder, wasaliased;
706 OSErr err;
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000707
Jack Jansen17ba43f1995-01-26 16:22:07 +0000708 if (!newgetargs(args, "O&|i", PyMac_GetFSSpec, &fss, &chain))
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000709 return NULL;
Jack Jansen17ba43f1995-01-26 16:22:07 +0000710 err = ResolveAliasFile(&fss, chain, &isfolder, &wasaliased);
711 if ( err ) {
712 PyErr_Mac(ErrorObject, err);
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000713 return NULL;
Jack Jansen17ba43f1995-01-26 16:22:07 +0000714 }
715 return mkvalue("Oii", newmfssobject(&fss), (int)isfolder, (int)wasaliased);
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000716}
717
718static object *
719mfs_StandardGetFile(self, args)
720 object *self; /* Not used */
721 object *args;
722{
Guido van Rossumb2f524a1995-01-30 08:56:06 +0000723 SFTypeList list;
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000724 short numtypes;
725 StandardFileReply reply;
726
727 list[0] = list[1] = list[2] = list[3] = 0;
728 numtypes = 0;
Guido van Rossumb2f524a1995-01-30 08:56:06 +0000729 if (!newgetargs(args, "|O&O&O&O&", PyMac_GetOSType, &list[0],
Jack Jansen17ba43f1995-01-26 16:22:07 +0000730 PyMac_GetOSType, &list[1], PyMac_GetOSType, &list[2],
731 PyMac_GetOSType, &list[3]) )
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000732 return NULL;
Guido van Rossumb2f524a1995-01-30 08:56:06 +0000733 while ( numtypes < 4 && list[numtypes] ) {
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000734 numtypes++;
735 }
Jack Jansenc2632861995-06-03 21:15:50 +0000736 if ( numtypes == 0 )
737 numtypes = -1;
Guido van Rossumb2f524a1995-01-30 08:56:06 +0000738 StandardGetFile((FileFilterUPP)0, numtypes, list, &reply);
Jack Jansen17ba43f1995-01-26 16:22:07 +0000739 return mkvalue("(Oi)", newmfssobject(&reply.sfFile), reply.sfGood);
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000740}
741
742static object *
Jack Jansend5d5f461995-08-14 12:22:56 +0000743mfs_PromptGetFile(self, args)
744 object *self; /* Not used */
745 object *args;
746{
747 SFTypeList list;
748 short numtypes;
749 StandardFileReply reply;
750 char *prompt = NULL;
751
752 list[0] = list[1] = list[2] = list[3] = 0;
753 numtypes = 0;
754 if (!newgetargs(args, "s|O&O&O&O&", &prompt, PyMac_GetOSType, &list[0],
755 PyMac_GetOSType, &list[1], PyMac_GetOSType, &list[2],
756 PyMac_GetOSType, &list[3]) )
757 return NULL;
758 while ( numtypes < 4 && list[numtypes] ) {
759 numtypes++;
760 }
761 if ( numtypes == 0 )
762 numtypes = -1;
763 PyMac_PromptGetFile(numtypes, list, &reply, prompt);
764 return mkvalue("(Oi)", newmfssobject(&reply.sfFile), reply.sfGood);
765}
766
767static object *
Jack Jansen17ba43f1995-01-26 16:22:07 +0000768mfs_StandardPutFile(self, args)
769 object *self; /* Not used */
770 object *args;
771{
772 Str255 prompt, dft;
773 StandardFileReply reply;
774
775 dft[0] = 0;
776 if (!newgetargs(args, "O&|O&", PyMac_GetStr255, &prompt, PyMac_GetStr255, &dft) )
777 return NULL;
778 StandardPutFile(prompt, dft, &reply);
779 return mkvalue("(Oi)",newmfssobject(&reply.sfFile), reply.sfGood);
780}
781
Jack Jansend99d2831996-07-22 15:26:01 +0000782/*
783** Set initial directory for file dialogs */
784static object *
785mfs_SetFolder(self, args)
786 object *self;
787 object *args;
788{
789 FSSpec spec;
790 FSSpec ospec;
791 short orefnum;
792 long oparid;
793
794 /* Get old values */
795 orefnum = -LMGetSFSaveDisk();
796 oparid = LMGetCurDirStore();
797 (void)FSMakeFSSpec(orefnum, oparid, "\pplaceholder", &ospec);
798
799 /* Go to working directory by default */
800 (void)FSMakeFSSpec(0, 0, "\p:placeholder", &spec);
801 if (!newgetargs(args, "|O&", PyMac_GetFSSpec, &spec))
802 return NULL;
803 /* Set standard-file working directory */
804 LMSetSFSaveDisk(-spec.vRefNum);
805 LMSetCurDirStore(spec.parID);
806 return (object *)newmfssobject(&ospec);
807}
808
Jack Jansen17ba43f1995-01-26 16:22:07 +0000809static object *
810mfs_FSSpec(self, args)
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000811 object *self; /* Not used */
812 object *args;
813{
814 FSSpec fss;
815
Guido van Rossum9aa3d131995-01-21 13:46:04 +0000816 if (!newgetargs(args, "O&", PyMac_GetFSSpec, &fss))
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000817 return NULL;
Jack Jansen17ba43f1995-01-26 16:22:07 +0000818 return (object *)newmfssobject(&fss);
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000819}
820
Jack Jansenc889b761995-02-13 12:00:46 +0000821static object *
822mfs_RawFSSpec(self, args)
823 object *self; /* Not used */
824 object *args;
825{
826 FSSpec *fssp;
827 int size;
828
829 if (!newgetargs(args, "s#", &fssp, &size))
830 return NULL;
831 if ( size != sizeof(FSSpec) ) {
832 PyErr_SetString(PyExc_TypeError, "Incorrect size for FSSpec record");
833 return NULL;
834 }
835 return (object *)newmfssobject(fssp);
836}
837
838static object *
839mfs_RawAlias(self, args)
840 object *self; /* Not used */
841 object *args;
842{
843 char *dataptr;
844 Handle h;
845 int size;
846
847 if (!newgetargs(args, "s#", &dataptr, &size))
848 return NULL;
849 h = NewHandle(size);
850 if ( h == NULL ) {
851 PyErr_NoMemory();
852 return NULL;
853 }
854 HLock(h);
855 memcpy((char *)*h, dataptr, size);
856 HUnlock(h);
857 return (object *)newmfsaobject((AliasHandle)h);
858}
859
Jack Jansen81f51c71995-02-20 15:45:25 +0000860static object *
861mfs_GetDirectory(self, args)
862 object *self; /* Not used */
863 object *args;
864{
865 FSSpec fsdir;
866 int ok;
Jack Jansend5d5f461995-08-14 12:22:56 +0000867 char *prompt = NULL;
Jack Jansen81f51c71995-02-20 15:45:25 +0000868
Jack Jansend5d5f461995-08-14 12:22:56 +0000869 if (!newgetargs(args, "|s", &prompt) )
Jack Jansen81f51c71995-02-20 15:45:25 +0000870 return NULL;
871
Jack Jansend5d5f461995-08-14 12:22:56 +0000872 ok = PyMac_GetDirectory(&fsdir, prompt);
Jack Jansen81f51c71995-02-20 15:45:25 +0000873 return mkvalue("(Oi)", newmfssobject(&fsdir), ok);
874}
875
Jack Jansen2c673621995-06-18 20:05:14 +0000876static object *
877mfs_FindFolder(self, args)
878 object *self; /* Not used */
879 object *args;
880{
881 OSErr err;
882 short where;
883 OSType which;
884 int create;
885 short refnum;
886 long dirid;
887
888 if (!newgetargs(args, "hO&i", &where, PyMac_GetOSType, &which, &create) )
889 return NULL;
890 err = FindFolder(where, which, (Boolean)create, &refnum, &dirid);
891 if ( err ) {
892 PyErr_Mac(ErrorObject, err);
893 return NULL;
894 }
895 return mkvalue("(ii)", refnum, dirid);
896}
897
Jack Jansen3d185931995-08-07 14:04:10 +0000898static object *
Jack Jansen924ca851996-09-20 15:25:16 +0000899mfs_FindApplication(self, args)
900 object *self; /* Not used */
901 object *args;
902{
903 OSErr err;
904 OSType which;
905 FSSpec fss;
906
907 if (!newgetargs(args, "O&", PyMac_GetOSType, &which) )
908 return NULL;
909 err = FindApplicationFromCreator(which, &fss);
910 if ( err ) {
911 PyErr_Mac(ErrorObject, err);
912 return NULL;
913 }
914 return (object *)newmfssobject(&fss);
915}
916
917static object *
Jack Jansen3d185931995-08-07 14:04:10 +0000918mfs_FInfo(self, args)
919 object *self;
920 object *args;
921{
922 return (object *)newmfsiobject();
923}
924
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000925/* List of methods defined in the module */
926
927static struct methodlist mfs_methods[] = {
Jack Jansen17ba43f1995-01-26 16:22:07 +0000928 {"ResolveAliasFile", mfs_ResolveAliasFile, 1},
929 {"StandardGetFile", mfs_StandardGetFile, 1},
Jack Jansend5d5f461995-08-14 12:22:56 +0000930 {"PromptGetFile", mfs_PromptGetFile, 1},
Jack Jansen17ba43f1995-01-26 16:22:07 +0000931 {"StandardPutFile", mfs_StandardPutFile, 1},
Jack Jansen81f51c71995-02-20 15:45:25 +0000932 {"GetDirectory", mfs_GetDirectory, 1},
Jack Jansend99d2831996-07-22 15:26:01 +0000933 {"SetFolder", mfs_SetFolder, 1},
Jack Jansen17ba43f1995-01-26 16:22:07 +0000934 {"FSSpec", mfs_FSSpec, 1},
Jack Jansenc889b761995-02-13 12:00:46 +0000935 {"RawFSSpec", mfs_RawFSSpec, 1},
936 {"RawAlias", mfs_RawAlias, 1},
Jack Jansen2c673621995-06-18 20:05:14 +0000937 {"FindFolder", mfs_FindFolder, 1},
Jack Jansen924ca851996-09-20 15:25:16 +0000938 {"FindApplication", mfs_FindApplication, 1},
Jack Jansen3d185931995-08-07 14:04:10 +0000939 {"FInfo", mfs_FInfo, 1},
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000940
941 {NULL, NULL} /* sentinel */
942};
943
944
945/* Initialization function for the module (*must* be called initmacfs) */
946
947void
948initmacfs()
949{
950 object *m, *d;
951
952 /* Create the module and add the functions */
953 m = initmodule("macfs", mfs_methods);
954
955 /* Add some symbolic constants to the module */
956 d = getmoduledict(m);
957 ErrorObject = newstringobject("macfs.error");
958 dictinsert(d, "error", ErrorObject);
959
960 /* XXXX Add constants here */
961
962 /* Check for errors */
963 if (err_occurred())
964 fatal("can't initialize module macfs");
965}