Added 'description' class attribute to every command class (to help the
[python/dscho.git] / Mac / Modules / Nav.c
blob452baa118887f6f166a03759d627dcb8d93c85eb
1 /***********************************************************
2 Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3 The Netherlands.
5 All Rights Reserved
7 Permission to use, copy, modify, and distribute this software and its
8 documentation for any purpose and without fee is hereby granted,
9 provided that the above copyright notice appear in all copies and that
10 both that copyright notice and this permission notice appear in
11 supporting documentation, and that the names of Stichting Mathematisch
12 Centrum or CWI or Corporation for National Research Initiatives or
13 CNRI not be used in advertising or publicity pertaining to
14 distribution of the software without specific, written prior
15 permission.
17 While CWI is the initial source for this software, a modified version
18 is made available by the Corporation for National Research Initiatives
19 (CNRI) at the Internet address ftp://ftp.python.org.
21 STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22 REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23 MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24 CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25 DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26 PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27 TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28 PERFORMANCE OF THIS SOFTWARE.
30 ******************************************************************/
32 #include "Python.h"
33 #include "macglue.h"
34 #include <Navigation.h>
36 /* Exported by AEModule.c: */
37 extern PyObject *AEDesc_New(AppleEvent *);
38 extern int AEDesc_Convert(PyObject *, AppleEvent *);
39 /* Exported by Resmodule.c */
40 extern PyObject *ResObj_New(Handle);
41 extern PyObject *OptResObj_New(Handle);
42 extern int ResObj_Convert(PyObject *, Handle *);
44 static PyObject *ErrorObject;
46 static NavEventUPP my_eventProcUPP;
47 static NavPreviewUPP my_previewProcUPP;
48 static NavObjectFilterUPP my_filterProcUPP;
50 /* Callback functions */
51 static pascal void
52 my_eventProc(NavEventCallbackMessage callBackSelector,
53 NavCBRecPtr callBackParms,
54 NavCallBackUserData callbackUD)
56 PyObject *dict = (PyObject *)callbackUD;
57 PyObject *pyfunc;
58 PyObject *rv;
60 if (!dict) return;
61 if ( (pyfunc = PyDict_GetItemString(dict, "eventProc")) == NULL ) {
62 PyErr_Clear();
63 return;
65 if ( pyfunc == Py_None ) {
66 /* Special case: give update events to the Python event handling code */
67 if ( callBackSelector == kNavCBEvent &&
68 callBackParms->eventData.eventDataParms.event->what == updateEvt)
69 PyMac_HandleEvent(callBackParms->eventData.eventDataParms.event);
70 /* Ignore others */
71 return;
73 rv = PyObject_CallFunction(pyfunc, "ls#", (long)callBackSelector,
74 (void *)callBackParms, sizeof(NavCBRec));
75 if ( rv )
76 Py_DECREF(rv);
77 else {
78 fprintf(stderr, "Nav: exception in eventProc callback\n");
79 PyErr_Clear();
83 static pascal Boolean
84 my_previewProc(NavCBRecPtr callBackParms,
85 NavCallBackUserData callbackUD)
87 PyObject *dict = (PyObject *)callbackUD;
88 PyObject *pyfunc;
89 PyObject *rv;
90 Boolean c_rv = false;
92 if (!dict) return;
93 if ( (pyfunc = PyDict_GetItemString(dict, "previewProc")) == NULL ) {
94 PyErr_Clear();
95 return;
97 rv = PyObject_CallFunction(pyfunc, "s#", (void *)callBackParms, sizeof(NavCBRec));
98 if ( rv ) {
99 c_rv = PyObject_IsTrue(rv);
100 Py_DECREF(rv);
101 } else {
102 fprintf(stderr, "Nav: exception in previewProc callback\n");
103 PyErr_Clear();
105 return c_rv;
108 static pascal Boolean
109 my_filterProc(AEDesc *theItem, void *info,
110 NavCallBackUserData callbackUD,
111 NavFilterModes filterMode)
113 PyObject *dict = (PyObject *)callbackUD;
114 PyObject *pyfunc;
115 PyObject *rv;
116 Boolean c_rv = false;
118 if (!dict) return;
119 if ( (pyfunc = PyDict_GetItemString(dict, "filterProc")) == NULL ) {
120 PyErr_Clear();
121 return;
123 rv = PyObject_CallFunction(pyfunc, "O&s#h",
124 AEDesc_New, theItem, info, sizeof(NavFileOrFolderInfo), (short)filterMode);
125 if ( rv ) {
126 c_rv = PyObject_IsTrue(rv);
127 Py_DECREF(rv);
128 } else {
129 fprintf(stderr, "Nav: exception in filterProc callback\n");
130 PyErr_Clear();
132 return c_rv;
135 /* ----------------------------------------------------- */
136 static int
137 filldialogoptions(PyObject *d,
138 AEDesc **defaultLocationP,
139 NavDialogOptions *opt,
140 NavEventUPP *eventProcP,
141 NavPreviewUPP *previewProcP,
142 NavObjectFilterUPP *filterProcP,
143 NavTypeListHandle *typeListP,
144 OSType *fileTypeP,
145 OSType *fileCreatorP)
147 int pos = 0;
148 PyObject *key, *value;
149 char *keystr;
150 AEDesc *defaultLocation_storage;
152 NavGetDefaultDialogOptions(opt);
154 while ( PyDict_Next(d, &pos, &key, &value) ) {
155 if ( !key || !value || !PyString_Check(key) ) {
156 PyErr_SetString(ErrorObject, "DialogOption has non-string key");
157 return 0;
159 keystr = PyString_AsString(key);
160 if( strcmp(keystr, "defaultLocation") == 0 ) {
161 if ( (defaultLocation_storage = PyMem_NEW(AEDesc, 1)) == NULL ) {
162 PyErr_NoMemory();
163 return 0;
165 if ( !PyArg_Parse(value, "O&", AEDesc_Convert, defaultLocation_storage) ) {
166 PyMem_DEL(defaultLocation_storage);
167 return 0;
169 *defaultLocationP = defaultLocation_storage;
170 } else if( strcmp(keystr, "version") == 0 ) {
171 if ( !PyArg_Parse(value, "h", &opt->version) )
172 return 0;
173 } else if( strcmp(keystr, "dialogOptionFlags") == 0 ) {
174 if ( !PyArg_Parse(value, "l", &opt->dialogOptionFlags) )
175 return 0;
176 } else if( strcmp(keystr, "location") == 0 ) {
177 if ( !PyArg_Parse(value, "O&", PyMac_GetPoint, &opt->location) )
178 return 0;
179 } else if( strcmp(keystr, "clientName") == 0 ) {
180 if ( !PyArg_Parse(value, "O&", PyMac_GetStr255, &opt->clientName) )
181 return 0;
182 } else if( strcmp(keystr, "windowTitle") == 0 ) {
183 if ( !PyArg_Parse(value, "O&", PyMac_GetStr255, &opt->windowTitle) )
184 return 0;
185 } else if( strcmp(keystr, "actionButtonLabel") == 0 ) {
186 if ( !PyArg_Parse(value, "O&", PyMac_GetStr255, &opt->actionButtonLabel) )
187 return 0;
188 } else if( strcmp(keystr, "cancelButtonLabel") == 0 ) {
189 if ( !PyArg_Parse(value, "O&", PyMac_GetStr255, &opt->cancelButtonLabel) )
190 return 0;
191 } else if( strcmp(keystr, "savedFileName") == 0 ) {
192 if ( !PyArg_Parse(value, "O&", PyMac_GetStr255, &opt->savedFileName) )
193 return 0;
194 } else if( strcmp(keystr, "message") == 0 ) {
195 if ( !PyArg_Parse(value, "O&", PyMac_GetStr255, &opt->message) )
196 return 0;
197 } else if( strcmp(keystr, "preferenceKey") == 0 ) {
198 if ( !PyArg_Parse(value, "O&", PyMac_GetOSType, &opt->preferenceKey) )
199 return 0;
200 } else if( strcmp(keystr, "popupExtension") == 0 ) {
201 if ( !PyArg_Parse(value, "O&", ResObj_Convert, &opt->popupExtension) )
202 return 0;
203 } else if( eventProcP && strcmp(keystr, "eventProc") == 0 ) {
204 *eventProcP = my_eventProcUPP;
205 } else if( previewProcP && strcmp(keystr, "previewProc") == 0 ) {
206 PyErr_SetString(ErrorObject, "No callbacks implemented yet");
207 return 0;
208 } else if( filterProcP && strcmp(keystr, "filterProc") == 0 ) {
209 PyErr_SetString(ErrorObject, "No callbacks implemented yet");
210 return 0;
211 } else if( typeListP && strcmp(keystr, "typeList") == 0 ) {
212 if ( !PyArg_Parse(value, "O&", ResObj_Convert, typeListP) )
213 return 0;
214 } else if( fileTypeP && strcmp(keystr, "fileType") == 0 ) {
215 if ( !PyArg_Parse(value, "O&", PyMac_GetOSType, fileTypeP) )
216 return 0;
217 } else if( fileCreatorP && strcmp(keystr, "fileCreator") == 0 ) {
218 if ( !PyArg_Parse(value, "O&", PyMac_GetOSType, fileCreatorP) )
219 return 0;
220 } else {
221 PyErr_Format(ErrorObject, "Unknown DialogOption key: %s", keystr);
222 return 0;
225 return 1;
228 /* ----------------------------------------------------- */
230 /* Declarations for objects of type NavReplyRecord */
232 typedef struct {
233 PyObject_HEAD
234 NavReplyRecord itself;
235 } navrrobject;
237 staticforward PyTypeObject Navrrtype;
241 /* ---------------------------------------------------------------- */
243 static char nav_NavTranslateFile__doc__[] =
244 "(NavTranslationOptions)->None"
247 static PyObject *
248 nav_NavTranslateFile(self, args)
249 navrrobject *self;
250 PyObject *args;
252 NavTranslationOptions howToTranslate;
253 OSErr err;
255 if (!PyArg_ParseTuple(args, "l", &howToTranslate))
256 return NULL;
257 err = NavTranslateFile(&self->itself, howToTranslate);
258 if ( err ) {
259 PyErr_Mac(ErrorObject, err);
260 return NULL;
262 Py_INCREF(Py_None);
263 return Py_None;
266 static char nav_NavCompleteSave__doc__[] =
267 "(NavTranslationOptions)->None"
270 static PyObject *
271 nav_NavCompleteSave(self, args)
272 navrrobject *self;
273 PyObject *args;
275 NavTranslationOptions howToTranslate;
276 OSErr err;
278 if (!PyArg_ParseTuple(args, "l", &howToTranslate))
279 return NULL;
280 err = NavCompleteSave(&self->itself, howToTranslate);
281 if ( err ) {
282 PyErr_Mac(ErrorObject, err);
283 return NULL;
285 Py_INCREF(Py_None);
286 return Py_None;
290 static struct PyMethodDef navrr_methods[] = {
291 {"NavTranslateFile", (PyCFunction)nav_NavTranslateFile, METH_VARARGS, nav_NavTranslateFile__doc__},
292 {"NavCompleteSave", (PyCFunction)nav_NavCompleteSave, METH_VARARGS, nav_NavCompleteSave__doc__},
294 {NULL, NULL} /* sentinel */
297 /* ---------- */
300 static navrrobject *
301 newnavrrobject(NavReplyRecord *itself)
303 navrrobject *self;
305 self = PyObject_NEW(navrrobject, &Navrrtype);
306 if (self == NULL)
307 return NULL;
308 self->itself = *itself;
309 return self;
313 static void
314 navrr_dealloc(self)
315 navrrobject *self;
317 NavDisposeReply(&self->itself);
318 PyMem_DEL(self);
321 static PyObject *
322 navrr_getattr(self, name)
323 navrrobject *self;
324 char *name;
326 if( strcmp(name, "__members__") == 0 )
327 return Py_BuildValue("sssssss", "version", "validRecord", "replacing",
328 "isStationery", "translationNeeded", "selection", "fileTranslation");
329 if( strcmp(name, "version") == 0 )
330 return Py_BuildValue("h", self->itself.version);
331 if( strcmp(name, "validRecord") == 0 )
332 return Py_BuildValue("l", (long)self->itself.validRecord);
333 if( strcmp(name, "replacing") == 0 )
334 return Py_BuildValue("l", (long)self->itself.replacing);
335 if( strcmp(name, "isStationery") == 0 )
336 return Py_BuildValue("l", (long)self->itself.isStationery);
337 if( strcmp(name, "translationNeeded") == 0 )
338 return Py_BuildValue("l", (long)self->itself.translationNeeded);
339 if( strcmp(name, "selection") == 0 ) {
340 SInt32 i, count;
341 OSErr err;
342 PyObject *rv, *rvitem;
343 AEDesc desc;
345 if (err=AECountItems(&self->itself.selection, &count)) {
346 PyErr_Mac(ErrorObject, err);
347 return NULL;
349 if ( (rv=PyList_New(count)) == NULL )
350 return NULL;
351 for(i=0; i<count; i++) {
352 desc.dataHandle = NULL;
353 if (err=AEGetNthDesc(&self->itself.selection, i+1, typeFSS, NULL, &desc)) {
354 Py_DECREF(rv);
355 PyErr_Mac(ErrorObject, err);
356 return NULL;
358 rvitem = PyMac_BuildFSSpec((FSSpec *)*desc.dataHandle);
359 PyList_SetItem(rv, i, rvitem);
360 AEDisposeDesc(&desc);
362 return rv;
364 if( strcmp(name, "fileTranslation") == 0 )
365 return ResObj_New((Handle)self->itself.fileTranslation);
368 return Py_FindMethod(navrr_methods, (PyObject *)self, name);
371 static int
372 navrr_setattr(self, name, v)
373 navrrobject *self;
374 char *name;
375 PyObject *v;
377 /* Set attribute 'name' to value 'v'. v==NULL means delete */
379 /* XXXX Add your own setattr code here */
380 return -1;
383 static char Navrrtype__doc__[] =
384 "Record containing result of a Nav file selection call. Use dir() for member names."
387 static PyTypeObject Navrrtype = {
388 PyObject_HEAD_INIT(&PyType_Type)
389 0, /*ob_size*/
390 "NavReplyRecord", /*tp_name*/
391 sizeof(navrrobject), /*tp_basicsize*/
392 0, /*tp_itemsize*/
393 /* methods */
394 (destructor)navrr_dealloc, /*tp_dealloc*/
395 (printfunc)0, /*tp_print*/
396 (getattrfunc)navrr_getattr, /*tp_getattr*/
397 (setattrfunc)navrr_setattr, /*tp_setattr*/
398 (cmpfunc)0, /*tp_compare*/
399 (reprfunc)0, /*tp_repr*/
400 0, /*tp_as_number*/
401 0, /*tp_as_sequence*/
402 0, /*tp_as_mapping*/
403 (hashfunc)0, /*tp_hash*/
404 (ternaryfunc)0, /*tp_call*/
405 (reprfunc)0, /*tp_str*/
407 /* Space for future expansion */
408 0L,0L,0L,0L,
409 Navrrtype__doc__ /* Documentation string */
412 /* End of code for NavReplyRecord objects */
414 /* ----------------------------------------------------- */
416 static char nav_NavGetFile__doc__[] =
417 "(DialogOptions dict or kwargs+defaultLocation,eventProc,previewProc,filterProc,typeList) -> NavReplyRecord"
420 static PyObject *
421 nav_NavGetFile(self, args, kw)
422 PyObject *self; /* Not used */
423 PyObject *args;
424 PyObject *kw;
426 PyObject *dict;
427 AEDesc *defaultLocation = NULL;
428 NavReplyRecord reply;
429 NavDialogOptions dialogOptions;
430 NavEventUPP eventProc = NULL;
431 NavPreviewUPP previewProc = NULL;
432 NavObjectFilterUPP filterProc = NULL;
433 NavTypeListHandle typeList = NULL;
434 OSErr err;
436 if ( kw ) {
437 if (!PyArg_ParseTuple(args, ""))
438 return NULL;
439 dict = kw;
440 } else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
441 return NULL;
442 if (!filldialogoptions(dict, &defaultLocation, &dialogOptions, &eventProc, &previewProc, &filterProc, &typeList, NULL, NULL))
443 return NULL;
444 err = NavGetFile(defaultLocation, &reply, &dialogOptions,
445 eventProc, previewProc, filterProc, typeList, (void *)dict);
446 PyMem_XDEL(defaultLocation);
447 if ( err ) {
448 PyErr_Mac(ErrorObject, err);
449 return NULL;
451 return (PyObject *)newnavrrobject(&reply);
454 static char nav_NavPutFile__doc__[] =
455 "(DialogOptions dict or kwargs+defaultLocation,eventProc,fileCreator,fileType) -> NavReplyRecord"
458 static PyObject *
459 nav_NavPutFile(self, args, kw)
460 PyObject *self; /* Not used */
461 PyObject *args;
462 PyObject *kw;
464 PyObject *dict;
465 AEDesc *defaultLocation = NULL;
466 NavReplyRecord reply;
467 NavDialogOptions dialogOptions;
468 NavEventUPP eventProc = NULL;
469 OSType fileType;
470 OSType fileCreator;
471 OSErr err;
473 if ( kw ) {
474 if (!PyArg_ParseTuple(args, ""))
475 return NULL;
476 dict = kw;
477 } else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
478 return NULL;
479 if (!filldialogoptions(dict, &defaultLocation, &dialogOptions, &eventProc, NULL, NULL, NULL, &fileType, &fileCreator))
480 return NULL;
481 err = NavPutFile(defaultLocation, &reply, &dialogOptions,
482 eventProc, fileType, fileCreator, (void *)dict);
483 PyMem_XDEL(defaultLocation);
484 if ( err ) {
485 PyErr_Mac(ErrorObject, err);
486 return NULL;
488 return (PyObject *)newnavrrobject(&reply);
491 static char nav_NavAskSaveChanges__doc__[] =
492 "(NavAskSaveChangesAction, DialogOptions dict or kwargs+eventProc) -> NavAskSaveChangesResult"
496 static PyObject *
497 nav_NavAskSaveChanges(self, args, kw)
498 PyObject *self; /* Not used */
499 PyObject *args;
500 PyObject *kw;
502 PyObject *dict;
503 NavDialogOptions dialogOptions;
504 NavAskSaveChangesAction action;
505 NavAskSaveChangesResult reply;
506 NavEventUPP eventProc = NULL;
507 OSErr err;
509 if ( kw ) {
510 if (!PyArg_ParseTuple(args, "l", &action))
511 return NULL;
512 dict = kw;
513 } else if (!PyArg_ParseTuple(args, "lO!", &action, &PyDict_Type, &dict))
514 return NULL;
515 if (!filldialogoptions(dict, NULL, &dialogOptions, &eventProc, NULL, NULL, NULL, NULL, NULL))
516 return NULL;
517 err = NavAskSaveChanges(&dialogOptions, action, &reply, eventProc, (void *)dict);
518 if ( err ) {
519 PyErr_Mac(ErrorObject, err);
520 return NULL;
522 return Py_BuildValue("l", (long)reply);
525 static char nav_NavCustomAskSaveChanges__doc__[] =
526 "(DialogOptions dict or kwargs+eventProc) -> NavAskSaveChangesResult"
529 static PyObject *
530 nav_NavCustomAskSaveChanges(self, args, kw)
531 PyObject *self; /* Not used */
532 PyObject *args;
533 PyObject *kw;
535 PyObject *dict;
536 NavDialogOptions dialogOptions;
537 NavAskSaveChangesResult reply;
538 NavEventUPP eventProc = NULL;
539 OSErr err;
541 if ( kw ) {
542 if (!PyArg_ParseTuple(args, ""))
543 return NULL;
544 dict = kw;
545 } else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
546 return NULL;
547 if (!filldialogoptions(dict, NULL, &dialogOptions, &eventProc, NULL, NULL, NULL, NULL, NULL))
548 return NULL;
549 err = NavCustomAskSaveChanges(&dialogOptions, &reply, eventProc, (void *)dict);
550 if ( err ) {
551 PyErr_Mac(ErrorObject, err);
552 return NULL;
554 return Py_BuildValue("l", (long)reply);
557 static char nav_NavAskDiscardChanges__doc__[] =
558 "(DialogOptions dict or kwargs+eventProc) -> NavAskSaveChangesResult"
561 static PyObject *
562 nav_NavAskDiscardChanges(self, args, kw)
563 PyObject *self; /* Not used */
564 PyObject *args;
565 PyObject *kw;
567 PyObject *dict;
568 NavDialogOptions dialogOptions;
569 NavAskSaveChangesResult reply;
570 NavEventUPP eventProc = NULL;
571 OSErr err;
573 if ( kw ) {
574 if (!PyArg_ParseTuple(args, ""))
575 return NULL;
576 dict = kw;
577 } else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
578 return NULL;
579 if (!filldialogoptions(dict, NULL, &dialogOptions, &eventProc, NULL, NULL, NULL, NULL, NULL))
580 return NULL;
581 err = NavAskDiscardChanges(&dialogOptions, &reply, eventProc, (void *)dict);
582 if ( err ) {
583 PyErr_Mac(ErrorObject, err);
584 return NULL;
586 return Py_BuildValue("l", (long)reply);
589 static char nav_NavChooseFile__doc__[] =
590 "(DialogOptions dict or kwargs+defaultLocation,eventProc,previewProc,filterProc,typeList) -> NavReplyRecord"
593 static PyObject *
594 nav_NavChooseFile(self, args, kw)
595 PyObject *self; /* Not used */
596 PyObject *args;
597 PyObject *kw;
599 PyObject *dict;
600 AEDesc *defaultLocation = NULL;
601 NavReplyRecord reply;
602 NavDialogOptions dialogOptions;
603 NavEventUPP eventProc = NULL;
604 NavPreviewUPP previewProc = NULL;
605 NavObjectFilterUPP filterProc = NULL;
606 NavTypeListHandle typeList = NULL;
607 OSErr err;
609 if ( kw ) {
610 if (!PyArg_ParseTuple(args, ""))
611 return NULL;
612 dict = kw;
613 } else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
614 return NULL;
615 if (!filldialogoptions(dict, &defaultLocation, &dialogOptions, &eventProc, &previewProc, &filterProc, &typeList, NULL, NULL))
616 return NULL;
617 err = NavChooseFile(defaultLocation, &reply, &dialogOptions,
618 eventProc, previewProc, filterProc, typeList, (void *)dict);
619 PyMem_XDEL(defaultLocation);
620 if ( err ) {
621 PyErr_Mac(ErrorObject, err);
622 return NULL;
624 return (PyObject *)newnavrrobject(&reply);
627 static char nav_NavChooseFolder__doc__[] =
628 "(DialogOptions dict or kwargs+defaultLocation,eventProc,filterProc) -> NavReplyRecord"
631 static PyObject *
632 nav_NavChooseFolder(self, args, kw)
633 PyObject *self; /* Not used */
634 PyObject *args;
635 PyObject *kw;
637 PyObject *dict;
638 AEDesc *defaultLocation = NULL;
639 NavReplyRecord reply;
640 NavDialogOptions dialogOptions;
641 NavEventUPP eventProc = NULL;
642 NavObjectFilterUPP filterProc = NULL;
643 OSErr err;
645 if ( kw ) {
646 if (!PyArg_ParseTuple(args, ""))
647 return NULL;
648 dict = kw;
649 } else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
650 return NULL;
651 if (!filldialogoptions(dict, &defaultLocation, &dialogOptions, &eventProc, NULL, &filterProc, NULL, NULL, NULL))
652 return NULL;
653 err = NavChooseFolder(defaultLocation, &reply, &dialogOptions,
654 eventProc, filterProc, (void *)dict);
655 PyMem_XDEL(defaultLocation);
656 if ( err ) {
657 PyErr_Mac(ErrorObject, err);
658 return NULL;
660 return (PyObject *)newnavrrobject(&reply);
663 static char nav_NavChooseVolume__doc__[] =
664 "(DialogOptions dict or kwargs+defaultLocation,eventProc,filterProc) -> NavReplyRecord"
667 static PyObject *
668 nav_NavChooseVolume(self, args, kw)
669 PyObject *self; /* Not used */
670 PyObject *args;
671 PyObject *kw;
673 PyObject *dict;
674 AEDesc *defaultLocation = NULL;
675 NavReplyRecord reply;
676 NavDialogOptions dialogOptions;
677 NavEventUPP eventProc = NULL;
678 NavObjectFilterUPP filterProc = NULL;
679 OSErr err;
681 if ( kw ) {
682 if (!PyArg_ParseTuple(args, ""))
683 return NULL;
684 dict = kw;
685 } else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
686 return NULL;
687 if (!filldialogoptions(dict, &defaultLocation, &dialogOptions, &eventProc, NULL, &filterProc, NULL, NULL, NULL))
688 return NULL;
689 err = NavChooseVolume(defaultLocation, &reply, &dialogOptions,
690 eventProc, filterProc, (void *)dict);
691 PyMem_XDEL(defaultLocation);
692 if ( err ) {
693 PyErr_Mac(ErrorObject, err);
694 return NULL;
696 return (PyObject *)newnavrrobject(&reply);
699 static char nav_NavChooseObject__doc__[] =
700 "(DialogOptions dict or kwargs+defaultLocation,eventProc,filterProc) -> NavReplyRecord"
703 static PyObject *
704 nav_NavChooseObject(self, args, kw)
705 PyObject *self; /* Not used */
706 PyObject *args;
707 PyObject *kw;
709 PyObject *dict;
710 AEDesc *defaultLocation = NULL;
711 NavReplyRecord reply;
712 NavDialogOptions dialogOptions;
713 NavEventUPP eventProc = NULL;
714 NavObjectFilterUPP filterProc = NULL;
715 OSErr err;
717 if ( kw ) {
718 if (!PyArg_ParseTuple(args, ""))
719 return NULL;
720 dict = kw;
721 } else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
722 return NULL;
723 if (!filldialogoptions(dict, &defaultLocation, &dialogOptions, &eventProc, NULL, &filterProc, NULL, NULL, NULL))
724 return NULL;
725 err = NavChooseObject(defaultLocation, &reply, &dialogOptions,
726 eventProc, filterProc, (void *)dict);
727 PyMem_XDEL(defaultLocation);
728 if ( err ) {
729 PyErr_Mac(ErrorObject, err);
730 return NULL;
732 return (PyObject *)newnavrrobject(&reply);
735 static char nav_NavNewFolder__doc__[] =
736 "(DialogOptions dict or kwargs+defaultLocation,eventProc) -> NavReplyRecord"
739 static PyObject *
740 nav_NavNewFolder(self, args, kw)
741 PyObject *self; /* Not used */
742 PyObject *args;
743 PyObject *kw;
745 PyObject *dict;
746 AEDesc *defaultLocation = NULL;
747 NavReplyRecord reply;
748 NavDialogOptions dialogOptions;
749 NavEventUPP eventProc = NULL;
750 OSErr err;
752 if ( kw ) {
753 if (!PyArg_ParseTuple(args, ""))
754 return NULL;
755 dict = kw;
756 } else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
757 return NULL;
758 if (!filldialogoptions(dict, &defaultLocation, &dialogOptions, &eventProc, NULL, NULL, NULL, NULL, NULL))
759 return NULL;
760 err = NavNewFolder(defaultLocation, &reply, &dialogOptions, eventProc, (void *)dict);
761 PyMem_XDEL(defaultLocation);
762 if ( err ) {
763 PyErr_Mac(ErrorObject, err);
764 return NULL;
766 return (PyObject *)newnavrrobject(&reply);
769 #if 0
770 XXXX I don't know what to do with the void * argument
771 static char nav_NavCustomControl__doc__[] =
776 static PyObject *
777 nav_NavCustomControl(self, args)
778 PyObject *self; /* Not used */
779 PyObject *args;
782 if (!PyArg_ParseTuple(args, ""))
783 return NULL;
784 Py_INCREF(Py_None);
785 return Py_None;
787 #endif
789 static char nav_NavServicesCanRun__doc__[] =
790 "()->int"
793 static PyObject *
794 nav_NavServicesCanRun(self, args)
795 PyObject *self; /* Not used */
796 PyObject *args;
798 Boolean rv;
799 if (!PyArg_ParseTuple(args, ""))
800 return NULL;
801 rv = NavServicesCanRun();
802 return Py_BuildValue("l", (long)rv);
805 static char nav_NavServicesAvailable__doc__[] =
806 "()->int"
809 static PyObject *
810 nav_NavServicesAvailable(self, args)
811 PyObject *self; /* Not used */
812 PyObject *args;
814 Boolean rv;
816 if (!PyArg_ParseTuple(args, ""))
817 return NULL;
818 rv = NavServicesAvailable();
819 return Py_BuildValue("l", (long)rv);
821 /* XX */
822 static char nav_NavLoad__doc__[] =
823 "()->None"
826 static PyObject *
827 nav_NavLoad(self, args)
828 PyObject *self; /* Not used */
829 PyObject *args;
832 if (!PyArg_ParseTuple(args, ""))
833 return NULL;
834 NavLoad();
835 Py_INCREF(Py_None);
836 return Py_None;
839 static char nav_NavUnload__doc__[] =
840 "()->None"
843 static PyObject *
844 nav_NavUnload(self, args)
845 PyObject *self; /* Not used */
846 PyObject *args;
849 if (!PyArg_ParseTuple(args, ""))
850 return NULL;
851 NavUnload();
852 Py_INCREF(Py_None);
853 return Py_None;
856 static char nav_NavLibraryVersion__doc__[] =
857 "()->int"
860 static PyObject *
861 nav_NavLibraryVersion(self, args)
862 PyObject *self; /* Not used */
863 PyObject *args;
865 UInt32 rv;
867 if (!PyArg_ParseTuple(args, ""))
868 return NULL;
869 rv = NavLibraryVersion();
870 return Py_BuildValue("l", (long)rv);
873 static char nav_NavGetDefaultDialogOptions__doc__[] =
874 "()->dict\nPass dict or keyword args with same names to other calls."
877 static PyObject *
878 nav_NavGetDefaultDialogOptions(self, args)
879 PyObject *self; /* Not used */
880 PyObject *args;
882 NavDialogOptions dialogOptions;
883 OSErr err;
885 err = NavGetDefaultDialogOptions(&dialogOptions);
886 if ( err ) {
887 PyErr_Mac(ErrorObject, err);
888 return NULL;
890 return Py_BuildValue("{s:h,s:l,s:O&,s:O&,s:O&,s:O&,s:O&,s:O&,s:O&,s:O&,s:O&}",
891 "version", dialogOptions.version,
892 "dialogOptionFlags", dialogOptions.dialogOptionFlags,
893 "location", PyMac_BuildPoint, dialogOptions.location,
894 "clientName", PyMac_BuildStr255, &dialogOptions.clientName,
895 "windowTitle", PyMac_BuildStr255, &dialogOptions.windowTitle,
896 "actionButtonLabel", PyMac_BuildStr255, &dialogOptions.actionButtonLabel,
897 "cancelButtonLabel", PyMac_BuildStr255, &dialogOptions.cancelButtonLabel,
898 "savedFileName", PyMac_BuildStr255, &dialogOptions.savedFileName,
899 "message", PyMac_BuildStr255, &dialogOptions.message,
900 "preferenceKey", PyMac_BuildOSType, dialogOptions.preferenceKey,
901 "popupExtension", OptResObj_New, dialogOptions.popupExtension);
904 /* List of methods defined in the module */
906 static struct PyMethodDef nav_methods[] = {
907 {"NavGetFile", (PyCFunction)nav_NavGetFile, METH_VARARGS|METH_KEYWORDS, nav_NavGetFile__doc__},
908 {"NavPutFile", (PyCFunction)nav_NavPutFile, METH_VARARGS|METH_KEYWORDS, nav_NavPutFile__doc__},
909 {"NavAskSaveChanges", (PyCFunction)nav_NavAskSaveChanges, METH_VARARGS|METH_KEYWORDS, nav_NavAskSaveChanges__doc__},
910 {"NavCustomAskSaveChanges", (PyCFunction)nav_NavCustomAskSaveChanges, METH_VARARGS|METH_KEYWORDS, nav_NavCustomAskSaveChanges__doc__},
911 {"NavAskDiscardChanges", (PyCFunction)nav_NavAskDiscardChanges, METH_VARARGS|METH_KEYWORDS, nav_NavAskDiscardChanges__doc__},
912 {"NavChooseFile", (PyCFunction)nav_NavChooseFile, METH_VARARGS|METH_KEYWORDS, nav_NavChooseFile__doc__},
913 {"NavChooseFolder", (PyCFunction)nav_NavChooseFolder, METH_VARARGS|METH_KEYWORDS, nav_NavChooseFolder__doc__},
914 {"NavChooseVolume", (PyCFunction)nav_NavChooseVolume, METH_VARARGS|METH_KEYWORDS, nav_NavChooseVolume__doc__},
915 {"NavChooseObject", (PyCFunction)nav_NavChooseObject, METH_VARARGS|METH_KEYWORDS, nav_NavChooseObject__doc__},
916 {"NavNewFolder", (PyCFunction)nav_NavNewFolder, METH_VARARGS|METH_KEYWORDS, nav_NavNewFolder__doc__},
917 #if 0
918 {"NavCustomControl", (PyCFunction)nav_NavCustomControl, METH_VARARGS, nav_NavCustomControl__doc__},
919 #endif
920 {"NavServicesCanRun", (PyCFunction)nav_NavServicesCanRun, METH_VARARGS, nav_NavServicesCanRun__doc__},
921 {"NavServicesAvailable", (PyCFunction)nav_NavServicesAvailable, METH_VARARGS, nav_NavServicesAvailable__doc__},
922 {"NavLoad", (PyCFunction)nav_NavLoad, METH_VARARGS, nav_NavLoad__doc__},
923 {"NavUnload", (PyCFunction)nav_NavUnload, METH_VARARGS, nav_NavUnload__doc__},
924 {"NavLibraryVersion", (PyCFunction)nav_NavLibraryVersion, METH_VARARGS, nav_NavLibraryVersion__doc__},
925 {"NavGetDefaultDialogOptions", (PyCFunction)nav_NavGetDefaultDialogOptions, METH_VARARGS, nav_NavGetDefaultDialogOptions__doc__},
926 {NULL, (PyCFunction)NULL, 0, NULL} /* sentinel */
930 /* Initialization function for the module (*must* be called initNav) */
932 static char Nav_module_documentation[] =
933 "Interface to Navigation Services\n"
934 "Most calls accept a NavDialogOptions dictionary or keywords with the same names, pass {}\n"
935 "if you want the default options.\n"
936 "Use NavGetDefaultDialogOptions() to find out common option names.\n"
937 "See individual docstrings for additional keyword args/dictentries supported by each call.\n"
938 "Pass None as eventProc to get movable-modal dialogs that process updates through the standard Python mechanism."
941 void
942 initNav()
944 PyObject *m, *d;
946 /* Create the module and add the functions */
947 m = Py_InitModule4("Nav", nav_methods,
948 Nav_module_documentation,
949 (PyObject*)NULL,PYTHON_API_VERSION);
951 /* Add some symbolic constants to the module */
952 d = PyModule_GetDict(m);
953 ErrorObject = PyString_FromString("Nav.error");
954 PyDict_SetItemString(d, "error", ErrorObject);
956 /* XXXX Add constants here */
958 /* Set UPPs */
959 my_eventProcUPP = NewNavEventProc(my_eventProc);
960 my_previewProcUPP = NewNavPreviewProc(my_previewProc);
961 my_filterProcUPP = NewNavObjectFilterProc(my_filterProc);
963 /* Check for errors */
964 if (PyErr_Occurred())
965 Py_FatalError("can't initialize module Nav");