blob: 69725cccc870c795c91f1aa9c8fc96096d4d905f [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>
34
35#include "nfullpath.h"
36
Guido van Rossuma42960c1995-01-19 00:03:47 +000037#ifdef THINK_C
38#define FileFilterUPP FileFilterProcPtr
39#endif
40
Jack Jansen84fa5ec1995-01-18 14:04:40 +000041static object *ErrorObject;
42
43/* ----------------------------------------------------- */
Jack Jansen17ba43f1995-01-26 16:22:07 +000044/* Declarations for objects of type Alias */
45
46typedef struct {
47 OB_HEAD
48 AliasHandle alias;
49} mfsaobject;
50
51staticforward typeobject Mfsatype;
52
53#define is_mfsaobject(v) ((v)->ob_type == &Mfsatype)
54
55/* ---------------------------------------------------------------- */
56/* Declarations for objects of type FSSpec */
57
58typedef struct {
59 OB_HEAD
60 FSSpec fsspec;
61} mfssobject;
62
63staticforward typeobject Mfsstype;
64
65#define is_mfssobject(v) ((v)->ob_type == &Mfsstype)
66
Guido van Rossumefd97671995-01-26 22:56:16 +000067
Jack Jansen3d185931995-08-07 14:04:10 +000068/* ---------------------------------------------------------------- */
69/* Declarations for objects of type FInfo */
70
71typedef struct {
72 OB_HEAD
73 FInfo finfo;
74} mfsiobject;
75
76staticforward typeobject Mfsitype;
77
78#define is_mfsiobject(v) ((v)->ob_type == &Mfsitype)
79
80
Guido van Rossumefd97671995-01-26 22:56:16 +000081mfssobject *newmfssobject(FSSpec *fss); /* Forward */
82
Jack Jansen17ba43f1995-01-26 16:22:07 +000083/* ---------------------------------------------------------------- */
Jack Jansen84fa5ec1995-01-18 14:04:40 +000084
85static object *
Jack Jansen17ba43f1995-01-26 16:22:07 +000086mfsa_Resolve(self, args)
87 mfsaobject *self;
Jack Jansen84fa5ec1995-01-18 14:04:40 +000088 object *args;
89{
Jack Jansen17ba43f1995-01-26 16:22:07 +000090 FSSpec from, *fromp, result;
91 Boolean changed;
92 OSErr err;
Jack Jansen84fa5ec1995-01-18 14:04:40 +000093
Jack Jansen17ba43f1995-01-26 16:22:07 +000094 from.name[0] = 0;
95 if (!newgetargs(args, "|O&", PyMac_GetFSSpec, &from))
Jack Jansen84fa5ec1995-01-18 14:04:40 +000096 return NULL;
Jack Jansen17ba43f1995-01-26 16:22:07 +000097 if (from.name[0] )
98 fromp = &from;
99 else
100 fromp = NULL;
101 err = ResolveAlias(fromp, self->alias, &result, &changed);
102 if ( err ) {
103 PyErr_Mac(ErrorObject, err);
104 return NULL;
105 }
106 return mkvalue("(Oi)", newmfssobject(&result), (int)changed);
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000107}
108
109static object *
Jack Jansen17ba43f1995-01-26 16:22:07 +0000110mfsa_GetInfo(self, args)
111 mfsaobject *self;
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000112 object *args;
113{
Jack Jansen17ba43f1995-01-26 16:22:07 +0000114 Str63 value;
115 int i;
116 OSErr err;
117
118 if (!newgetargs(args, "i", &i))
119 return NULL;
120 err = GetAliasInfo(self->alias, (AliasInfoType)i, value);
121 if ( err ) {
122 PyErr_Mac(ErrorObject, err);
123 return 0;
124 }
125 return newsizedstringobject((char *)&value[1], value[0]);
126}
127
128static object *
129mfsa_Update(self, args)
130 mfsaobject *self;
131 object *args;
132{
133 FSSpec target, fromfile, *fromfilep;
134 OSErr err;
135 Boolean changed;
136
137 fromfile.name[0] = 0;
138 if (!newgetargs(args, "O&|O&", PyMac_GetFSSpec, &target,
139 PyMac_GetFSSpec, &fromfile))
140 return NULL;
141 if ( fromfile.name[0] )
142 fromfilep = &fromfile;
143 else
144 fromfilep = NULL;
145 err = UpdateAlias(fromfilep, &target, self->alias, &changed);
146 if ( err ) {
147 PyErr_Mac(ErrorObject, err);
148 return 0;
149 }
150 return mkvalue("i", (int)changed);
151}
152
153static struct methodlist mfsa_methods[] = {
Guido van Rossumefd97671995-01-26 22:56:16 +0000154 {"Resolve", (method)mfsa_Resolve, 1},
155 {"GetInfo", (method)mfsa_GetInfo, 1},
156 {"Update", (method)mfsa_Update, 1},
Jack Jansen17ba43f1995-01-26 16:22:07 +0000157
158 {NULL, NULL} /* sentinel */
159};
160
161/* ---------- */
162
163static object *
164mfsa_getattr(self, name)
165 mfsaobject *self;
166 char *name;
167{
Jack Jansenc889b761995-02-13 12:00:46 +0000168 if ( strcmp(name, "data") == 0 ) {
169 int size;
170 PyObject *rv;
171
172 size = GetHandleSize((Handle)self->alias);
173 HLock((Handle)self->alias);
174 rv = PyString_FromStringAndSize(*(Handle)self->alias, size);
175 HUnlock((Handle)self->alias);
176 return rv;
177 }
Jack Jansen17ba43f1995-01-26 16:22:07 +0000178 return findmethod(mfsa_methods, (object *)self, name);
179}
180
181mfsaobject *
182newmfsaobject(alias)
183 AliasHandle alias;
184{
185 mfsaobject *self;
186
187 self = NEWOBJ(mfsaobject, &Mfsatype);
188 if (self == NULL)
189 return NULL;
190 self->alias = alias;
191 return self;
192}
193
194
195static void
196mfsa_dealloc(self)
197 mfsaobject *self;
198{
199#if 0
200 if ( self->alias ) {
201 should we do something here?
202 }
203#endif
204
205 DEL(self);
206}
207
Guido van Rossumf45b53b1995-02-20 23:43:29 +0000208statichere typeobject Mfsatype = {
Jack Jansen17ba43f1995-01-26 16:22:07 +0000209 OB_HEAD_INIT(&Typetype)
210 0, /*ob_size*/
211 "Alias", /*tp_name*/
212 sizeof(mfsaobject), /*tp_basicsize*/
213 0, /*tp_itemsize*/
214 /* methods */
215 (destructor)mfsa_dealloc, /*tp_dealloc*/
Guido van Rossumf45b53b1995-02-20 23:43:29 +0000216 (printfunc)0, /*tp_print*/
Jack Jansen17ba43f1995-01-26 16:22:07 +0000217 (getattrfunc)mfsa_getattr, /*tp_getattr*/
Guido van Rossumf45b53b1995-02-20 23:43:29 +0000218 (setattrfunc)0, /*tp_setattr*/
219 (cmpfunc)0, /*tp_compare*/
220 (reprfunc)0, /*tp_repr*/
221 0, /*tp_as_number*/
222 0, /*tp_as_sequence*/
223 0, /*tp_as_mapping*/
224 (hashfunc)0, /*tp_hash*/
Jack Jansen17ba43f1995-01-26 16:22:07 +0000225};
226
227/* End of code for Alias objects */
228/* -------------------------------------------------------- */
229
Jack Jansen3d185931995-08-07 14:04:10 +0000230/* ---------------------------------------------------------------- */
231
232static struct methodlist mfsi_methods[] = {
233
234 {NULL, NULL} /* sentinel */
235};
236
237/* ---------- */
238
239static mfsiobject *
240newmfsiobject()
241{
242 mfsiobject *self;
243
244 self = NEWOBJ(mfsiobject, &Mfsitype);
245 if (self == NULL)
246 return NULL;
247 memset((char *)&self->finfo, '\0', sizeof(self->finfo));
248 return self;
249}
250
251static void
252mfsi_dealloc(self)
253 mfsiobject *self;
254{
255 DEL(self);
256}
257
258static object *
259mfsi_getattr(self, name)
260 mfsiobject *self;
261 char *name;
262{
Jack Jansen3d185931995-08-07 14:04:10 +0000263 if ( strcmp(name, "Type") == 0 )
264 return PyMac_BuildOSType(self->finfo.fdType);
265 else if ( strcmp(name, "Creator") == 0 )
266 return PyMac_BuildOSType(self->finfo.fdCreator);
267 else if ( strcmp(name, "Flags") == 0 )
268 return Py_BuildValue("i", (int)self->finfo.fdFlags);
269 else if ( strcmp(name, "Location") == 0 )
270 return PyMac_BuildPoint(self->finfo.fdLocation);
271 else if ( strcmp(name, "Fldr") == 0 )
272 return Py_BuildValue("i", (int)self->finfo.fdFldr);
273 else
274 return findmethod(mfsi_methods, (object *)self, name);
275}
276
277
278static int
279mfsi_setattr(self, name, v)
280 mfsiobject *self;
281 char *name;
282 object *v;
283{
284 int rv;
285 int i;
286
287 if ( v == NULL ) {
288 err_setstr(AttributeError, "Cannot delete attribute");
289 return -1;
290 }
291 if ( strcmp(name, "Type") == 0 )
292 rv = PyMac_GetOSType(v, &self->finfo.fdType);
293 else if ( strcmp(name, "Creator") == 0 )
294 rv = PyMac_GetOSType(v, &self->finfo.fdCreator);
295 else if ( strcmp(name, "Flags") == 0 ) {
296 rv = PyArg_Parse(v, "i", &i);
297 self->finfo.fdFlags = (short)i;
298 } else if ( strcmp(name, "Location") == 0 )
299 rv = PyMac_GetPoint(v, &self->finfo.fdLocation);
300 else if ( strcmp(name, "Fldr") == 0 ) {
301 rv = PyArg_Parse(v, "i", &i);
302 self->finfo.fdFldr = (short)i;
303 } else {
304 err_setstr(AttributeError, "No such attribute");
305 return -1;
306 }
307 if (rv)
308 return 0;
309 return -1;
310}
311
312
313static typeobject Mfsitype = {
314 OB_HEAD_INIT(&Typetype)
315 0, /*ob_size*/
316 "FInfo object", /*tp_name*/
317 sizeof(mfsiobject), /*tp_basicsize*/
318 0, /*tp_itemsize*/
319 /* methods */
320 (destructor)mfsi_dealloc, /*tp_dealloc*/
321 (printfunc)0, /*tp_print*/
322 (getattrfunc)mfsi_getattr, /*tp_getattr*/
323 (setattrfunc)mfsi_setattr, /*tp_setattr*/
324 (cmpfunc)0, /*tp_compare*/
325 (reprfunc)0, /*tp_repr*/
326 0, /*tp_as_number*/
327 0, /*tp_as_sequence*/
328 0, /*tp_as_mapping*/
329 (hashfunc)0, /*tp_hash*/
330};
331
332/* End of code for FInfo object objects */
333/* -------------------------------------------------------- */
334
335
Jack Jansen17ba43f1995-01-26 16:22:07 +0000336/*
337** Helper routine for other modules: return an FSSpec * if the
338** object is a python fsspec object, else NULL
339*/
340FSSpec *
341mfs_GetFSSpecFSSpec(self)
342 object *self;
343{
344 if ( is_mfssobject(self) )
345 return &((mfssobject *)self)->fsspec;
346 return NULL;
347}
348
349static object *
350mfss_as_pathname(self, args)
351 mfssobject *self;
352 object *args;
353{
354 char strbuf[257];
355 OSErr err;
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000356
357 if (!newgetargs(args, ""))
358 return NULL;
Jack Jansen17ba43f1995-01-26 16:22:07 +0000359 err = nfullpath(&self->fsspec, strbuf);
360 if ( err ) {
361 PyErr_Mac(ErrorObject, err);
362 return NULL;
363 }
364 return newstringobject(strbuf);
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000365}
366
367static object *
Jack Jansen17ba43f1995-01-26 16:22:07 +0000368mfss_as_tuple(self, args)
369 mfssobject *self;
370 object *args;
371{
372 if (!newgetargs(args, ""))
373 return NULL;
374 return Py_BuildValue("(iis#)", self->fsspec.vRefNum, self->fsspec.parID,
375 &self->fsspec.name[1], self->fsspec.name[0]);
376}
377
378static object *
379mfss_NewAlias(self, args)
380 mfssobject *self;
381 object *args;
382{
383 FSSpec src, *srcp;
384 OSErr err;
385 AliasHandle alias;
386
387 src.name[0] = 0;
388 if (!newgetargs(args, "|O&", PyMac_GetFSSpec, &src))
389 return NULL;
390 if ( src.name[0] )
391 srcp = &src;
392 else
393 srcp = NULL;
394 err = NewAlias(srcp, &self->fsspec, &alias);
395 if ( err ) {
396 PyErr_Mac(ErrorObject, err);
397 return NULL;
398 }
399
400 return (object *)newmfsaobject(alias);
401}
402
403static object *
404mfss_NewAliasMinimal(self, args)
405 mfssobject *self;
406 object *args;
407{
408 OSErr err;
409 AliasHandle alias;
410
411 if (!newgetargs(args, ""))
412 return NULL;
413 err = NewAliasMinimal(&self->fsspec, &alias);
414 if ( err ) {
415 PyErr_Mac(ErrorObject, err);
416 return NULL;
417 }
418 return (object *)newmfsaobject(alias);
419}
420
Jack Jansen3d185931995-08-07 14:04:10 +0000421/* XXXX These routines should be replaced by a wrapper to the *FInfo routines */
Jack Jansen8828fcf1995-02-02 14:23:52 +0000422static object *
423mfss_GetCreatorType(self, args)
424 mfssobject *self;
425 object *args;
426{
427 OSErr err;
428 FInfo info;
429
430 if (!newgetargs(args, ""))
431 return NULL;
432 err = FSpGetFInfo(&self->fsspec, &info);
433 if ( err ) {
434 PyErr_Mac(ErrorObject, err);
435 return NULL;
436 }
437 return Py_BuildValue("(O&O&)",
438 PyMac_BuildOSType, info.fdCreator, PyMac_BuildOSType, info.fdType);
439}
440
441static object *
442mfss_SetCreatorType(self, args)
443 mfssobject *self;
444 object *args;
445{
446 OSErr err;
447 OSType creator, type;
448 FInfo info;
449
450 if (!newgetargs(args, "O&O&", PyMac_GetOSType, &creator, PyMac_GetOSType, &type))
451 return NULL;
452 err = FSpGetFInfo(&self->fsspec, &info);
453 if ( err ) {
454 PyErr_Mac(ErrorObject, err);
455 return NULL;
456 }
457 info.fdType = type;
458 info.fdCreator = creator;
459 err = FSpSetFInfo(&self->fsspec, &info);
460 if ( err ) {
461 PyErr_Mac(ErrorObject, err);
462 return NULL;
463 }
464 INCREF(None);
465 return None;
466}
467
Jack Jansen3d185931995-08-07 14:04:10 +0000468static object *
469mfss_GetFInfo(self, args)
470 mfssobject *self;
471 object *args;
472{
473 OSErr err;
474 mfsiobject *fip;
475
476
477 if (!newgetargs(args, ""))
478 return NULL;
479 if ( (fip=newmfsiobject()) == NULL )
480 return NULL;
481 err = FSpGetFInfo(&self->fsspec, &fip->finfo);
482 if ( err ) {
483 PyErr_Mac(ErrorObject, err);
484 DECREF(fip);
485 return NULL;
486 }
487 return (object *)fip;
488}
489
490static object *
491mfss_SetFInfo(self, args)
492 mfssobject *self;
493 object *args;
494{
495 OSErr err;
496 mfsiobject *fip;
497
498 if (!newgetargs(args, "O!", &Mfsitype, &fip))
499 return NULL;
500 err = FSpSetFInfo(&self->fsspec, &fip->finfo);
501 if ( err ) {
502 PyErr_Mac(ErrorObject, err);
503 return NULL;
504 }
505 INCREF(None);
506 return None;
507}
508
Jack Jansen17ba43f1995-01-26 16:22:07 +0000509static struct methodlist mfss_methods[] = {
Guido van Rossumefd97671995-01-26 22:56:16 +0000510 {"as_pathname", (method)mfss_as_pathname, 1},
511 {"as_tuple", (method)mfss_as_tuple, 1},
512 {"NewAlias", (method)mfss_NewAlias, 1},
513 {"NewAliasMinimal", (method)mfss_NewAliasMinimal, 1},
Jack Jansen8828fcf1995-02-02 14:23:52 +0000514 {"GetCreatorType", (method)mfss_GetCreatorType, 1},
515 {"SetCreatorType", (method)mfss_SetCreatorType, 1},
Jack Jansen3d185931995-08-07 14:04:10 +0000516 {"GetFInfo", (method)mfss_GetFInfo, 1},
517 {"SetFInfo", (method)mfss_SetFInfo, 1},
Jack Jansen17ba43f1995-01-26 16:22:07 +0000518
519 {NULL, NULL} /* sentinel */
520};
521
522/* ---------- */
523
524static object *
525mfss_getattr(self, name)
526 mfssobject *self;
527 char *name;
528{
Jack Jansenc889b761995-02-13 12:00:46 +0000529 if ( strcmp(name, "data") == 0)
530 return PyString_FromStringAndSize((char *)&self->fsspec, sizeof(FSSpec));
Jack Jansen17ba43f1995-01-26 16:22:07 +0000531 return findmethod(mfss_methods, (object *)self, name);
532}
533
534mfssobject *
535newmfssobject(fss)
536 FSSpec *fss;
537{
538 mfssobject *self;
539
540 self = NEWOBJ(mfssobject, &Mfsstype);
541 if (self == NULL)
542 return NULL;
543 self->fsspec = *fss;
544 return self;
545}
546
547static void
548mfss_dealloc(self)
549 mfssobject *self;
550{
551 DEL(self);
552}
553
554static object *
555mfss_repr(self)
556 mfssobject *self;
557{
558 char buf[512];
559
Guido van Rossumf45b53b1995-02-20 23:43:29 +0000560 sprintf(buf, "FSSpec((%d, %d, '%.*s'))",
561 self->fsspec.vRefNum,
562 self->fsspec.parID,
563 self->fsspec.name[0], self->fsspec.name+1);
Jack Jansen17ba43f1995-01-26 16:22:07 +0000564 return newstringobject(buf);
565}
566
567static int
568mfss_compare(v, w)
569 mfssobject *v, *w;
570{
571 int minlen;
572 int res;
573
574 if ( v->fsspec.vRefNum < w->fsspec.vRefNum ) return -1;
575 if ( v->fsspec.vRefNum > w->fsspec.vRefNum ) return 1;
576 if ( v->fsspec.parID < w->fsspec.parID ) return -1;
577 if ( v->fsspec.parID > w->fsspec.parID ) return 1;
578 minlen = v->fsspec.name[0];
579 if ( w->fsspec.name[0] < minlen ) minlen = w->fsspec.name[0];
580 res = strncmp((char *)v->fsspec.name+1, (char *)w->fsspec.name+1, minlen);
581 if ( res ) return res;
582 if ( v->fsspec.name[0] < w->fsspec.name[0] ) return -1;
583 if ( v->fsspec.name[0] > w->fsspec.name[0] ) return 1;
584 return res;
585}
586
Guido van Rossumf45b53b1995-02-20 23:43:29 +0000587statichere typeobject Mfsstype = {
Jack Jansen17ba43f1995-01-26 16:22:07 +0000588 OB_HEAD_INIT(&Typetype)
589 0, /*ob_size*/
590 "FSSpec", /*tp_name*/
591 sizeof(mfssobject), /*tp_basicsize*/
592 0, /*tp_itemsize*/
593 /* methods */
594 (destructor)mfss_dealloc, /*tp_dealloc*/
595 (printfunc)0, /*tp_print*/
596 (getattrfunc)mfss_getattr, /*tp_getattr*/
597 (setattrfunc)0, /*tp_setattr*/
598 (cmpfunc)mfss_compare, /*tp_compare*/
599 (reprfunc)mfss_repr, /*tp_repr*/
600 0, /*tp_as_number*/
601 0, /*tp_as_sequence*/
602 0, /*tp_as_mapping*/
603 (hashfunc)0, /*tp_hash*/
604};
605
606/* End of code for FSSpec objects */
607/* -------------------------------------------------------- */
608
609static object *
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000610mfs_ResolveAliasFile(self, args)
611 object *self; /* Not used */
612 object *args;
613{
Jack Jansen17ba43f1995-01-26 16:22:07 +0000614 FSSpec fss;
615 Boolean chain = 1, isfolder, wasaliased;
616 OSErr err;
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000617
Jack Jansen17ba43f1995-01-26 16:22:07 +0000618 if (!newgetargs(args, "O&|i", PyMac_GetFSSpec, &fss, &chain))
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000619 return NULL;
Jack Jansen17ba43f1995-01-26 16:22:07 +0000620 err = ResolveAliasFile(&fss, chain, &isfolder, &wasaliased);
621 if ( err ) {
622 PyErr_Mac(ErrorObject, err);
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000623 return NULL;
Jack Jansen17ba43f1995-01-26 16:22:07 +0000624 }
625 return mkvalue("Oii", newmfssobject(&fss), (int)isfolder, (int)wasaliased);
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000626}
627
628static object *
629mfs_StandardGetFile(self, args)
630 object *self; /* Not used */
631 object *args;
632{
Guido van Rossumb2f524a1995-01-30 08:56:06 +0000633 SFTypeList list;
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000634 short numtypes;
635 StandardFileReply reply;
636
637 list[0] = list[1] = list[2] = list[3] = 0;
638 numtypes = 0;
Guido van Rossumb2f524a1995-01-30 08:56:06 +0000639 if (!newgetargs(args, "|O&O&O&O&", PyMac_GetOSType, &list[0],
Jack Jansen17ba43f1995-01-26 16:22:07 +0000640 PyMac_GetOSType, &list[1], PyMac_GetOSType, &list[2],
641 PyMac_GetOSType, &list[3]) )
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000642 return NULL;
Guido van Rossumb2f524a1995-01-30 08:56:06 +0000643 while ( numtypes < 4 && list[numtypes] ) {
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000644 numtypes++;
645 }
Jack Jansenc2632861995-06-03 21:15:50 +0000646 if ( numtypes == 0 )
647 numtypes = -1;
Guido van Rossumb2f524a1995-01-30 08:56:06 +0000648 StandardGetFile((FileFilterUPP)0, numtypes, list, &reply);
Jack Jansen17ba43f1995-01-26 16:22:07 +0000649 return mkvalue("(Oi)", newmfssobject(&reply.sfFile), reply.sfGood);
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000650}
651
652static object *
Jack Jansend5d5f461995-08-14 12:22:56 +0000653mfs_PromptGetFile(self, args)
654 object *self; /* Not used */
655 object *args;
656{
657 SFTypeList list;
658 short numtypes;
659 StandardFileReply reply;
660 char *prompt = NULL;
661
662 list[0] = list[1] = list[2] = list[3] = 0;
663 numtypes = 0;
664 if (!newgetargs(args, "s|O&O&O&O&", &prompt, PyMac_GetOSType, &list[0],
665 PyMac_GetOSType, &list[1], PyMac_GetOSType, &list[2],
666 PyMac_GetOSType, &list[3]) )
667 return NULL;
668 while ( numtypes < 4 && list[numtypes] ) {
669 numtypes++;
670 }
671 if ( numtypes == 0 )
672 numtypes = -1;
673 PyMac_PromptGetFile(numtypes, list, &reply, prompt);
674 return mkvalue("(Oi)", newmfssobject(&reply.sfFile), reply.sfGood);
675}
676
677static object *
Jack Jansen17ba43f1995-01-26 16:22:07 +0000678mfs_StandardPutFile(self, args)
679 object *self; /* Not used */
680 object *args;
681{
682 Str255 prompt, dft;
683 StandardFileReply reply;
684
685 dft[0] = 0;
686 if (!newgetargs(args, "O&|O&", PyMac_GetStr255, &prompt, PyMac_GetStr255, &dft) )
687 return NULL;
688 StandardPutFile(prompt, dft, &reply);
689 return mkvalue("(Oi)",newmfssobject(&reply.sfFile), reply.sfGood);
690}
691
692static object *
693mfs_FSSpec(self, args)
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000694 object *self; /* Not used */
695 object *args;
696{
697 FSSpec fss;
698
Guido van Rossum9aa3d131995-01-21 13:46:04 +0000699 if (!newgetargs(args, "O&", PyMac_GetFSSpec, &fss))
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000700 return NULL;
Jack Jansen17ba43f1995-01-26 16:22:07 +0000701 return (object *)newmfssobject(&fss);
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000702}
703
Jack Jansenc889b761995-02-13 12:00:46 +0000704static object *
705mfs_RawFSSpec(self, args)
706 object *self; /* Not used */
707 object *args;
708{
709 FSSpec *fssp;
710 int size;
711
712 if (!newgetargs(args, "s#", &fssp, &size))
713 return NULL;
714 if ( size != sizeof(FSSpec) ) {
715 PyErr_SetString(PyExc_TypeError, "Incorrect size for FSSpec record");
716 return NULL;
717 }
718 return (object *)newmfssobject(fssp);
719}
720
721static object *
722mfs_RawAlias(self, args)
723 object *self; /* Not used */
724 object *args;
725{
726 char *dataptr;
727 Handle h;
728 int size;
729
730 if (!newgetargs(args, "s#", &dataptr, &size))
731 return NULL;
732 h = NewHandle(size);
733 if ( h == NULL ) {
734 PyErr_NoMemory();
735 return NULL;
736 }
737 HLock(h);
738 memcpy((char *)*h, dataptr, size);
739 HUnlock(h);
740 return (object *)newmfsaobject((AliasHandle)h);
741}
742
Jack Jansen81f51c71995-02-20 15:45:25 +0000743static object *
744mfs_GetDirectory(self, args)
745 object *self; /* Not used */
746 object *args;
747{
748 FSSpec fsdir;
749 int ok;
Jack Jansend5d5f461995-08-14 12:22:56 +0000750 char *prompt = NULL;
Jack Jansen81f51c71995-02-20 15:45:25 +0000751
Jack Jansend5d5f461995-08-14 12:22:56 +0000752 if (!newgetargs(args, "|s", &prompt) )
Jack Jansen81f51c71995-02-20 15:45:25 +0000753 return NULL;
754
Jack Jansend5d5f461995-08-14 12:22:56 +0000755 ok = PyMac_GetDirectory(&fsdir, prompt);
Jack Jansen81f51c71995-02-20 15:45:25 +0000756 return mkvalue("(Oi)", newmfssobject(&fsdir), ok);
757}
758
Jack Jansen2c673621995-06-18 20:05:14 +0000759static object *
760mfs_FindFolder(self, args)
761 object *self; /* Not used */
762 object *args;
763{
764 OSErr err;
765 short where;
766 OSType which;
767 int create;
768 short refnum;
769 long dirid;
770
771 if (!newgetargs(args, "hO&i", &where, PyMac_GetOSType, &which, &create) )
772 return NULL;
773 err = FindFolder(where, which, (Boolean)create, &refnum, &dirid);
774 if ( err ) {
775 PyErr_Mac(ErrorObject, err);
776 return NULL;
777 }
778 return mkvalue("(ii)", refnum, dirid);
779}
780
Jack Jansen3d185931995-08-07 14:04:10 +0000781static object *
782mfs_FInfo(self, args)
783 object *self;
784 object *args;
785{
786 return (object *)newmfsiobject();
787}
788
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000789/* List of methods defined in the module */
790
791static struct methodlist mfs_methods[] = {
Jack Jansen17ba43f1995-01-26 16:22:07 +0000792 {"ResolveAliasFile", mfs_ResolveAliasFile, 1},
793 {"StandardGetFile", mfs_StandardGetFile, 1},
Jack Jansend5d5f461995-08-14 12:22:56 +0000794 {"PromptGetFile", mfs_PromptGetFile, 1},
Jack Jansen17ba43f1995-01-26 16:22:07 +0000795 {"StandardPutFile", mfs_StandardPutFile, 1},
Jack Jansen81f51c71995-02-20 15:45:25 +0000796 {"GetDirectory", mfs_GetDirectory, 1},
Jack Jansen17ba43f1995-01-26 16:22:07 +0000797 {"FSSpec", mfs_FSSpec, 1},
Jack Jansenc889b761995-02-13 12:00:46 +0000798 {"RawFSSpec", mfs_RawFSSpec, 1},
799 {"RawAlias", mfs_RawAlias, 1},
Jack Jansen2c673621995-06-18 20:05:14 +0000800 {"FindFolder", mfs_FindFolder, 1},
Jack Jansen3d185931995-08-07 14:04:10 +0000801 {"FInfo", mfs_FInfo, 1},
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000802
803 {NULL, NULL} /* sentinel */
804};
805
806
807/* Initialization function for the module (*must* be called initmacfs) */
808
809void
810initmacfs()
811{
812 object *m, *d;
813
814 /* Create the module and add the functions */
815 m = initmodule("macfs", mfs_methods);
816
817 /* Add some symbolic constants to the module */
818 d = getmoduledict(m);
819 ErrorObject = newstringobject("macfs.error");
820 dictinsert(d, "error", ErrorObject);
821
822 /* XXXX Add constants here */
823
824 /* Check for errors */
825 if (err_occurred())
826 fatal("can't initialize module macfs");
827}