blob: 03580b078a593d57c45c5181c2e10442ba82f17a [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{
263 object *rv;
264
265 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
351static object *
352mfss_as_pathname(self, args)
353 mfssobject *self;
354 object *args;
355{
356 char strbuf[257];
357 OSErr err;
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000358
359 if (!newgetargs(args, ""))
360 return NULL;
Jack Jansen17ba43f1995-01-26 16:22:07 +0000361 err = nfullpath(&self->fsspec, strbuf);
362 if ( err ) {
363 PyErr_Mac(ErrorObject, err);
364 return NULL;
365 }
366 return newstringobject(strbuf);
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000367}
368
369static object *
Jack Jansen17ba43f1995-01-26 16:22:07 +0000370mfss_as_tuple(self, args)
371 mfssobject *self;
372 object *args;
373{
374 if (!newgetargs(args, ""))
375 return NULL;
376 return Py_BuildValue("(iis#)", self->fsspec.vRefNum, self->fsspec.parID,
377 &self->fsspec.name[1], self->fsspec.name[0]);
378}
379
380static object *
381mfss_NewAlias(self, args)
382 mfssobject *self;
383 object *args;
384{
385 FSSpec src, *srcp;
386 OSErr err;
387 AliasHandle alias;
388
389 src.name[0] = 0;
390 if (!newgetargs(args, "|O&", PyMac_GetFSSpec, &src))
391 return NULL;
392 if ( src.name[0] )
393 srcp = &src;
394 else
395 srcp = NULL;
396 err = NewAlias(srcp, &self->fsspec, &alias);
397 if ( err ) {
398 PyErr_Mac(ErrorObject, err);
399 return NULL;
400 }
401
402 return (object *)newmfsaobject(alias);
403}
404
405static object *
406mfss_NewAliasMinimal(self, args)
407 mfssobject *self;
408 object *args;
409{
410 OSErr err;
411 AliasHandle alias;
412
413 if (!newgetargs(args, ""))
414 return NULL;
415 err = NewAliasMinimal(&self->fsspec, &alias);
416 if ( err ) {
417 PyErr_Mac(ErrorObject, err);
418 return NULL;
419 }
420 return (object *)newmfsaobject(alias);
421}
422
Jack Jansen3d185931995-08-07 14:04:10 +0000423/* XXXX These routines should be replaced by a wrapper to the *FInfo routines */
Jack Jansen8828fcf1995-02-02 14:23:52 +0000424static object *
425mfss_GetCreatorType(self, args)
426 mfssobject *self;
427 object *args;
428{
429 OSErr err;
430 FInfo info;
431
432 if (!newgetargs(args, ""))
433 return NULL;
434 err = FSpGetFInfo(&self->fsspec, &info);
435 if ( err ) {
436 PyErr_Mac(ErrorObject, err);
437 return NULL;
438 }
439 return Py_BuildValue("(O&O&)",
440 PyMac_BuildOSType, info.fdCreator, PyMac_BuildOSType, info.fdType);
441}
442
443static object *
444mfss_SetCreatorType(self, args)
445 mfssobject *self;
446 object *args;
447{
448 OSErr err;
449 OSType creator, type;
450 FInfo info;
451
452 if (!newgetargs(args, "O&O&", PyMac_GetOSType, &creator, PyMac_GetOSType, &type))
453 return NULL;
454 err = FSpGetFInfo(&self->fsspec, &info);
455 if ( err ) {
456 PyErr_Mac(ErrorObject, err);
457 return NULL;
458 }
459 info.fdType = type;
460 info.fdCreator = creator;
461 err = FSpSetFInfo(&self->fsspec, &info);
462 if ( err ) {
463 PyErr_Mac(ErrorObject, err);
464 return NULL;
465 }
466 INCREF(None);
467 return None;
468}
469
Jack Jansen3d185931995-08-07 14:04:10 +0000470static object *
471mfss_GetFInfo(self, args)
472 mfssobject *self;
473 object *args;
474{
475 OSErr err;
476 mfsiobject *fip;
477
478
479 if (!newgetargs(args, ""))
480 return NULL;
481 if ( (fip=newmfsiobject()) == NULL )
482 return NULL;
483 err = FSpGetFInfo(&self->fsspec, &fip->finfo);
484 if ( err ) {
485 PyErr_Mac(ErrorObject, err);
486 DECREF(fip);
487 return NULL;
488 }
489 return (object *)fip;
490}
491
492static object *
493mfss_SetFInfo(self, args)
494 mfssobject *self;
495 object *args;
496{
497 OSErr err;
498 mfsiobject *fip;
499
500 if (!newgetargs(args, "O!", &Mfsitype, &fip))
501 return NULL;
502 err = FSpSetFInfo(&self->fsspec, &fip->finfo);
503 if ( err ) {
504 PyErr_Mac(ErrorObject, err);
505 return NULL;
506 }
507 INCREF(None);
508 return None;
509}
510
Jack Jansen17ba43f1995-01-26 16:22:07 +0000511static struct methodlist mfss_methods[] = {
Guido van Rossumefd97671995-01-26 22:56:16 +0000512 {"as_pathname", (method)mfss_as_pathname, 1},
513 {"as_tuple", (method)mfss_as_tuple, 1},
514 {"NewAlias", (method)mfss_NewAlias, 1},
515 {"NewAliasMinimal", (method)mfss_NewAliasMinimal, 1},
Jack Jansen8828fcf1995-02-02 14:23:52 +0000516 {"GetCreatorType", (method)mfss_GetCreatorType, 1},
517 {"SetCreatorType", (method)mfss_SetCreatorType, 1},
Jack Jansen3d185931995-08-07 14:04:10 +0000518 {"GetFInfo", (method)mfss_GetFInfo, 1},
519 {"SetFInfo", (method)mfss_SetFInfo, 1},
Jack Jansen17ba43f1995-01-26 16:22:07 +0000520
521 {NULL, NULL} /* sentinel */
522};
523
524/* ---------- */
525
526static object *
527mfss_getattr(self, name)
528 mfssobject *self;
529 char *name;
530{
Jack Jansenc889b761995-02-13 12:00:46 +0000531 if ( strcmp(name, "data") == 0)
532 return PyString_FromStringAndSize((char *)&self->fsspec, sizeof(FSSpec));
Jack Jansen17ba43f1995-01-26 16:22:07 +0000533 return findmethod(mfss_methods, (object *)self, name);
534}
535
536mfssobject *
537newmfssobject(fss)
538 FSSpec *fss;
539{
540 mfssobject *self;
541
542 self = NEWOBJ(mfssobject, &Mfsstype);
543 if (self == NULL)
544 return NULL;
545 self->fsspec = *fss;
546 return self;
547}
548
549static void
550mfss_dealloc(self)
551 mfssobject *self;
552{
553 DEL(self);
554}
555
556static object *
557mfss_repr(self)
558 mfssobject *self;
559{
560 char buf[512];
561
Guido van Rossumf45b53b1995-02-20 23:43:29 +0000562 sprintf(buf, "FSSpec((%d, %d, '%.*s'))",
563 self->fsspec.vRefNum,
564 self->fsspec.parID,
565 self->fsspec.name[0], self->fsspec.name+1);
Jack Jansen17ba43f1995-01-26 16:22:07 +0000566 return newstringobject(buf);
567}
568
569static int
570mfss_compare(v, w)
571 mfssobject *v, *w;
572{
573 int minlen;
574 int res;
575
576 if ( v->fsspec.vRefNum < w->fsspec.vRefNum ) return -1;
577 if ( v->fsspec.vRefNum > w->fsspec.vRefNum ) return 1;
578 if ( v->fsspec.parID < w->fsspec.parID ) return -1;
579 if ( v->fsspec.parID > w->fsspec.parID ) return 1;
580 minlen = v->fsspec.name[0];
581 if ( w->fsspec.name[0] < minlen ) minlen = w->fsspec.name[0];
582 res = strncmp((char *)v->fsspec.name+1, (char *)w->fsspec.name+1, minlen);
583 if ( res ) return res;
584 if ( v->fsspec.name[0] < w->fsspec.name[0] ) return -1;
585 if ( v->fsspec.name[0] > w->fsspec.name[0] ) return 1;
586 return res;
587}
588
Guido van Rossumf45b53b1995-02-20 23:43:29 +0000589statichere typeobject Mfsstype = {
Jack Jansen17ba43f1995-01-26 16:22:07 +0000590 OB_HEAD_INIT(&Typetype)
591 0, /*ob_size*/
592 "FSSpec", /*tp_name*/
593 sizeof(mfssobject), /*tp_basicsize*/
594 0, /*tp_itemsize*/
595 /* methods */
596 (destructor)mfss_dealloc, /*tp_dealloc*/
597 (printfunc)0, /*tp_print*/
598 (getattrfunc)mfss_getattr, /*tp_getattr*/
599 (setattrfunc)0, /*tp_setattr*/
600 (cmpfunc)mfss_compare, /*tp_compare*/
601 (reprfunc)mfss_repr, /*tp_repr*/
602 0, /*tp_as_number*/
603 0, /*tp_as_sequence*/
604 0, /*tp_as_mapping*/
605 (hashfunc)0, /*tp_hash*/
606};
607
608/* End of code for FSSpec objects */
609/* -------------------------------------------------------- */
610
611static object *
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000612mfs_ResolveAliasFile(self, args)
613 object *self; /* Not used */
614 object *args;
615{
Jack Jansen17ba43f1995-01-26 16:22:07 +0000616 FSSpec fss;
617 Boolean chain = 1, isfolder, wasaliased;
618 OSErr err;
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000619
Jack Jansen17ba43f1995-01-26 16:22:07 +0000620 if (!newgetargs(args, "O&|i", PyMac_GetFSSpec, &fss, &chain))
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000621 return NULL;
Jack Jansen17ba43f1995-01-26 16:22:07 +0000622 err = ResolveAliasFile(&fss, chain, &isfolder, &wasaliased);
623 if ( err ) {
624 PyErr_Mac(ErrorObject, err);
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000625 return NULL;
Jack Jansen17ba43f1995-01-26 16:22:07 +0000626 }
627 return mkvalue("Oii", newmfssobject(&fss), (int)isfolder, (int)wasaliased);
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000628}
629
630static object *
631mfs_StandardGetFile(self, args)
632 object *self; /* Not used */
633 object *args;
634{
Guido van Rossumb2f524a1995-01-30 08:56:06 +0000635 SFTypeList list;
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000636 short numtypes;
637 StandardFileReply reply;
638
639 list[0] = list[1] = list[2] = list[3] = 0;
640 numtypes = 0;
Guido van Rossumb2f524a1995-01-30 08:56:06 +0000641 if (!newgetargs(args, "|O&O&O&O&", PyMac_GetOSType, &list[0],
Jack Jansen17ba43f1995-01-26 16:22:07 +0000642 PyMac_GetOSType, &list[1], PyMac_GetOSType, &list[2],
643 PyMac_GetOSType, &list[3]) )
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000644 return NULL;
Guido van Rossumb2f524a1995-01-30 08:56:06 +0000645 while ( numtypes < 4 && list[numtypes] ) {
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000646 numtypes++;
647 }
Jack Jansenc2632861995-06-03 21:15:50 +0000648 if ( numtypes == 0 )
649 numtypes = -1;
Guido van Rossumb2f524a1995-01-30 08:56:06 +0000650 StandardGetFile((FileFilterUPP)0, numtypes, list, &reply);
Jack Jansen17ba43f1995-01-26 16:22:07 +0000651 return mkvalue("(Oi)", newmfssobject(&reply.sfFile), reply.sfGood);
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000652}
653
654static object *
Jack Jansen17ba43f1995-01-26 16:22:07 +0000655mfs_StandardPutFile(self, args)
656 object *self; /* Not used */
657 object *args;
658{
659 Str255 prompt, dft;
660 StandardFileReply reply;
661
662 dft[0] = 0;
663 if (!newgetargs(args, "O&|O&", PyMac_GetStr255, &prompt, PyMac_GetStr255, &dft) )
664 return NULL;
665 StandardPutFile(prompt, dft, &reply);
666 return mkvalue("(Oi)",newmfssobject(&reply.sfFile), reply.sfGood);
667}
668
669static object *
670mfs_FSSpec(self, args)
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000671 object *self; /* Not used */
672 object *args;
673{
674 FSSpec fss;
675
Guido van Rossum9aa3d131995-01-21 13:46:04 +0000676 if (!newgetargs(args, "O&", PyMac_GetFSSpec, &fss))
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000677 return NULL;
Jack Jansen17ba43f1995-01-26 16:22:07 +0000678 return (object *)newmfssobject(&fss);
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000679}
680
Jack Jansenc889b761995-02-13 12:00:46 +0000681static object *
682mfs_RawFSSpec(self, args)
683 object *self; /* Not used */
684 object *args;
685{
686 FSSpec *fssp;
687 int size;
688
689 if (!newgetargs(args, "s#", &fssp, &size))
690 return NULL;
691 if ( size != sizeof(FSSpec) ) {
692 PyErr_SetString(PyExc_TypeError, "Incorrect size for FSSpec record");
693 return NULL;
694 }
695 return (object *)newmfssobject(fssp);
696}
697
698static object *
699mfs_RawAlias(self, args)
700 object *self; /* Not used */
701 object *args;
702{
703 char *dataptr;
704 Handle h;
705 int size;
706
707 if (!newgetargs(args, "s#", &dataptr, &size))
708 return NULL;
709 h = NewHandle(size);
710 if ( h == NULL ) {
711 PyErr_NoMemory();
712 return NULL;
713 }
714 HLock(h);
715 memcpy((char *)*h, dataptr, size);
716 HUnlock(h);
717 return (object *)newmfsaobject((AliasHandle)h);
718}
719
Jack Jansen81f51c71995-02-20 15:45:25 +0000720static object *
721mfs_GetDirectory(self, args)
722 object *self; /* Not used */
723 object *args;
724{
725 FSSpec fsdir;
726 int ok;
727
728 if (!newgetargs(args, "") )
729 return NULL;
730
731 ok = PyMac_GetDirectory(&fsdir);
732 return mkvalue("(Oi)", newmfssobject(&fsdir), ok);
733}
734
Jack Jansen2c673621995-06-18 20:05:14 +0000735static object *
736mfs_FindFolder(self, args)
737 object *self; /* Not used */
738 object *args;
739{
740 OSErr err;
741 short where;
742 OSType which;
743 int create;
744 short refnum;
745 long dirid;
746
747 if (!newgetargs(args, "hO&i", &where, PyMac_GetOSType, &which, &create) )
748 return NULL;
749 err = FindFolder(where, which, (Boolean)create, &refnum, &dirid);
750 if ( err ) {
751 PyErr_Mac(ErrorObject, err);
752 return NULL;
753 }
754 return mkvalue("(ii)", refnum, dirid);
755}
756
Jack Jansen3d185931995-08-07 14:04:10 +0000757static object *
758mfs_FInfo(self, args)
759 object *self;
760 object *args;
761{
762 return (object *)newmfsiobject();
763}
764
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000765/* List of methods defined in the module */
766
767static struct methodlist mfs_methods[] = {
Jack Jansen17ba43f1995-01-26 16:22:07 +0000768 {"ResolveAliasFile", mfs_ResolveAliasFile, 1},
769 {"StandardGetFile", mfs_StandardGetFile, 1},
770 {"StandardPutFile", mfs_StandardPutFile, 1},
Jack Jansen81f51c71995-02-20 15:45:25 +0000771 {"GetDirectory", mfs_GetDirectory, 1},
Jack Jansen17ba43f1995-01-26 16:22:07 +0000772 {"FSSpec", mfs_FSSpec, 1},
Jack Jansenc889b761995-02-13 12:00:46 +0000773 {"RawFSSpec", mfs_RawFSSpec, 1},
774 {"RawAlias", mfs_RawAlias, 1},
Jack Jansen2c673621995-06-18 20:05:14 +0000775 {"FindFolder", mfs_FindFolder, 1},
Jack Jansen3d185931995-08-07 14:04:10 +0000776 {"FInfo", mfs_FInfo, 1},
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000777
778 {NULL, NULL} /* sentinel */
779};
780
781
782/* Initialization function for the module (*must* be called initmacfs) */
783
784void
785initmacfs()
786{
787 object *m, *d;
788
789 /* Create the module and add the functions */
790 m = initmodule("macfs", mfs_methods);
791
792 /* Add some symbolic constants to the module */
793 d = getmoduledict(m);
794 ErrorObject = newstringobject("macfs.error");
795 dictinsert(d, "error", ErrorObject);
796
797 /* XXXX Add constants here */
798
799 /* Check for errors */
800 if (err_occurred())
801 fatal("can't initialize module macfs");
802}