blob: 4d41f255788ad73516ddd1813690c3da9a7ccd17 [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 Jansend5d5f461995-08-14 12:22:56 +0000655mfs_PromptGetFile(self, args)
656 object *self; /* Not used */
657 object *args;
658{
659 SFTypeList list;
660 short numtypes;
661 StandardFileReply reply;
662 char *prompt = NULL;
663
664 list[0] = list[1] = list[2] = list[3] = 0;
665 numtypes = 0;
666 if (!newgetargs(args, "s|O&O&O&O&", &prompt, PyMac_GetOSType, &list[0],
667 PyMac_GetOSType, &list[1], PyMac_GetOSType, &list[2],
668 PyMac_GetOSType, &list[3]) )
669 return NULL;
670 while ( numtypes < 4 && list[numtypes] ) {
671 numtypes++;
672 }
673 if ( numtypes == 0 )
674 numtypes = -1;
675 PyMac_PromptGetFile(numtypes, list, &reply, prompt);
676 return mkvalue("(Oi)", newmfssobject(&reply.sfFile), reply.sfGood);
677}
678
679static object *
Jack Jansen17ba43f1995-01-26 16:22:07 +0000680mfs_StandardPutFile(self, args)
681 object *self; /* Not used */
682 object *args;
683{
684 Str255 prompt, dft;
685 StandardFileReply reply;
686
687 dft[0] = 0;
688 if (!newgetargs(args, "O&|O&", PyMac_GetStr255, &prompt, PyMac_GetStr255, &dft) )
689 return NULL;
690 StandardPutFile(prompt, dft, &reply);
691 return mkvalue("(Oi)",newmfssobject(&reply.sfFile), reply.sfGood);
692}
693
694static object *
695mfs_FSSpec(self, args)
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000696 object *self; /* Not used */
697 object *args;
698{
699 FSSpec fss;
700
Guido van Rossum9aa3d131995-01-21 13:46:04 +0000701 if (!newgetargs(args, "O&", PyMac_GetFSSpec, &fss))
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000702 return NULL;
Jack Jansen17ba43f1995-01-26 16:22:07 +0000703 return (object *)newmfssobject(&fss);
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000704}
705
Jack Jansenc889b761995-02-13 12:00:46 +0000706static object *
707mfs_RawFSSpec(self, args)
708 object *self; /* Not used */
709 object *args;
710{
711 FSSpec *fssp;
712 int size;
713
714 if (!newgetargs(args, "s#", &fssp, &size))
715 return NULL;
716 if ( size != sizeof(FSSpec) ) {
717 PyErr_SetString(PyExc_TypeError, "Incorrect size for FSSpec record");
718 return NULL;
719 }
720 return (object *)newmfssobject(fssp);
721}
722
723static object *
724mfs_RawAlias(self, args)
725 object *self; /* Not used */
726 object *args;
727{
728 char *dataptr;
729 Handle h;
730 int size;
731
732 if (!newgetargs(args, "s#", &dataptr, &size))
733 return NULL;
734 h = NewHandle(size);
735 if ( h == NULL ) {
736 PyErr_NoMemory();
737 return NULL;
738 }
739 HLock(h);
740 memcpy((char *)*h, dataptr, size);
741 HUnlock(h);
742 return (object *)newmfsaobject((AliasHandle)h);
743}
744
Jack Jansen81f51c71995-02-20 15:45:25 +0000745static object *
746mfs_GetDirectory(self, args)
747 object *self; /* Not used */
748 object *args;
749{
750 FSSpec fsdir;
751 int ok;
Jack Jansend5d5f461995-08-14 12:22:56 +0000752 char *prompt = NULL;
Jack Jansen81f51c71995-02-20 15:45:25 +0000753
Jack Jansend5d5f461995-08-14 12:22:56 +0000754 if (!newgetargs(args, "|s", &prompt) )
Jack Jansen81f51c71995-02-20 15:45:25 +0000755 return NULL;
756
Jack Jansend5d5f461995-08-14 12:22:56 +0000757 ok = PyMac_GetDirectory(&fsdir, prompt);
Jack Jansen81f51c71995-02-20 15:45:25 +0000758 return mkvalue("(Oi)", newmfssobject(&fsdir), ok);
759}
760
Jack Jansen2c673621995-06-18 20:05:14 +0000761static object *
762mfs_FindFolder(self, args)
763 object *self; /* Not used */
764 object *args;
765{
766 OSErr err;
767 short where;
768 OSType which;
769 int create;
770 short refnum;
771 long dirid;
772
773 if (!newgetargs(args, "hO&i", &where, PyMac_GetOSType, &which, &create) )
774 return NULL;
775 err = FindFolder(where, which, (Boolean)create, &refnum, &dirid);
776 if ( err ) {
777 PyErr_Mac(ErrorObject, err);
778 return NULL;
779 }
780 return mkvalue("(ii)", refnum, dirid);
781}
782
Jack Jansen3d185931995-08-07 14:04:10 +0000783static object *
784mfs_FInfo(self, args)
785 object *self;
786 object *args;
787{
788 return (object *)newmfsiobject();
789}
790
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000791/* List of methods defined in the module */
792
793static struct methodlist mfs_methods[] = {
Jack Jansen17ba43f1995-01-26 16:22:07 +0000794 {"ResolveAliasFile", mfs_ResolveAliasFile, 1},
795 {"StandardGetFile", mfs_StandardGetFile, 1},
Jack Jansend5d5f461995-08-14 12:22:56 +0000796 {"PromptGetFile", mfs_PromptGetFile, 1},
Jack Jansen17ba43f1995-01-26 16:22:07 +0000797 {"StandardPutFile", mfs_StandardPutFile, 1},
Jack Jansen81f51c71995-02-20 15:45:25 +0000798 {"GetDirectory", mfs_GetDirectory, 1},
Jack Jansen17ba43f1995-01-26 16:22:07 +0000799 {"FSSpec", mfs_FSSpec, 1},
Jack Jansenc889b761995-02-13 12:00:46 +0000800 {"RawFSSpec", mfs_RawFSSpec, 1},
801 {"RawAlias", mfs_RawAlias, 1},
Jack Jansen2c673621995-06-18 20:05:14 +0000802 {"FindFolder", mfs_FindFolder, 1},
Jack Jansen3d185931995-08-07 14:04:10 +0000803 {"FInfo", mfs_FInfo, 1},
Jack Jansen84fa5ec1995-01-18 14:04:40 +0000804
805 {NULL, NULL} /* sentinel */
806};
807
808
809/* Initialization function for the module (*must* be called initmacfs) */
810
811void
812initmacfs()
813{
814 object *m, *d;
815
816 /* Create the module and add the functions */
817 m = initmodule("macfs", mfs_methods);
818
819 /* Add some symbolic constants to the module */
820 d = getmoduledict(m);
821 ErrorObject = newstringobject("macfs.error");
822 dictinsert(d, "error", ErrorObject);
823
824 /* XXXX Add constants here */
825
826 /* Check for errors */
827 if (err_occurred())
828 fatal("can't initialize module macfs");
829}