Issue #6431: Fix Fraction comparisons with unknown types, and with
[python.git] / Mac / Modules / Nav.c
blobe03a06ea7309e9bf70080d25fbff3c0aea8ce639
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 "pymactoolbox.h"
34 #include <Carbon/Carbon.h>
36 static PyObject *ErrorObject;
38 static NavEventUPP my_eventProcUPP;
39 static NavPreviewUPP my_previewProcUPP;
40 static NavObjectFilterUPP my_filterProcUPP;
42 /* Callback functions */
43 static pascal void
44 my_eventProc(NavEventCallbackMessage callBackSelector,
45 NavCBRecPtr callBackParms,
46 NavCallBackUserData callbackUD)
48 PyObject *dict = (PyObject *)callbackUD;
49 PyObject *pyfunc;
50 PyObject *rv;
52 if (!dict) return;
53 if ( (pyfunc = PyDict_GetItemString(dict, "eventProc")) == NULL ) {
54 PyErr_Print();
55 return;
57 if ( pyfunc == Py_None ) {
58 return;
60 rv = PyObject_CallFunction(pyfunc, "ls#", (long)callBackSelector,
61 (void *)callBackParms, sizeof(NavCBRec));
62 if ( rv )
63 Py_DECREF(rv);
64 else {
65 PySys_WriteStderr("Nav: exception in eventProc callback\n");
66 PyErr_Print();
70 static pascal Boolean
71 my_previewProc(NavCBRecPtr callBackParms,
72 NavCallBackUserData callbackUD)
74 PyObject *dict = (PyObject *)callbackUD;
75 PyObject *pyfunc;
76 PyObject *rv;
77 Boolean c_rv = false;
79 if (!dict) return false;
80 if ( (pyfunc = PyDict_GetItemString(dict, "previewProc")) == NULL ) {
81 PyErr_Print();
82 return false;
84 rv = PyObject_CallFunction(pyfunc, "s#", (void *)callBackParms, sizeof(NavCBRec));
85 if ( rv ) {
86 c_rv = PyObject_IsTrue(rv);
87 Py_DECREF(rv);
88 } else {
89 PySys_WriteStderr("Nav: exception in previewProc callback\n");
90 PyErr_Print();
92 return c_rv;
95 static pascal Boolean
96 my_filterProc(AEDesc *theItem, void *info,
97 NavCallBackUserData callbackUD,
98 NavFilterModes filterMode)
100 PyObject *dict = (PyObject *)callbackUD;
101 PyObject *pyfunc;
102 PyObject *rv;
103 Boolean c_rv = false;
105 if (!dict) return false;
106 if ( (pyfunc = PyDict_GetItemString(dict, "filterProc")) == NULL ) {
107 PyErr_Print();
108 return false;
110 rv = PyObject_CallFunction(pyfunc, "O&s#h",
111 AEDesc_NewBorrowed, theItem, info, sizeof(NavFileOrFolderInfo), (short)filterMode);
112 if ( rv ) {
113 c_rv = PyObject_IsTrue(rv);
114 Py_DECREF(rv);
115 } else {
116 PySys_WriteStderr("Nav: exception in filterProc callback\n");
117 PyErr_Print();
119 return c_rv;
122 /* ----------------------------------------------------- */
123 static int
124 filldialogoptions(PyObject *d,
125 AEDesc **defaultLocationP,
126 NavDialogOptions *opt,
127 NavEventUPP *eventProcP,
128 NavPreviewUPP *previewProcP,
129 NavObjectFilterUPP *filterProcP,
130 NavTypeListHandle *typeListP,
131 OSType *fileTypeP,
132 OSType *fileCreatorP)
134 Py_ssize_t pos = 0;
135 PyObject *key, *value;
136 char *keystr;
137 AEDesc *defaultLocation_storage;
139 NavGetDefaultDialogOptions(opt);
141 while ( PyDict_Next(d, &pos, &key, &value) ) {
142 if ( !key || !value || !PyString_Check(key) ) {
143 PyErr_SetString(ErrorObject, "DialogOption has non-string key");
144 return 0;
146 keystr = PyString_AsString(key);
147 if( strcmp(keystr, "defaultLocation") == 0 ) {
148 if ( (defaultLocation_storage = PyMem_NEW(AEDesc, 1)) == NULL ) {
149 PyErr_NoMemory();
150 return 0;
152 if ( !PyArg_Parse(value, "O&", AEDesc_Convert, defaultLocation_storage) ) {
153 PyMem_DEL(defaultLocation_storage);
154 return 0;
156 *defaultLocationP = defaultLocation_storage;
157 } else if( strcmp(keystr, "version") == 0 ) {
158 if ( !PyArg_Parse(value, "H", &opt->version) )
159 return 0;
160 } else if( strcmp(keystr, "dialogOptionFlags") == 0 ) {
161 if ( !PyArg_Parse(value, "k", &opt->dialogOptionFlags) )
162 return 0;
163 } else if( strcmp(keystr, "location") == 0 ) {
164 if ( !PyArg_Parse(value, "O&", PyMac_GetPoint, &opt->location) )
165 return 0;
166 } else if( strcmp(keystr, "clientName") == 0 ) {
167 if ( !PyArg_Parse(value, "O&", PyMac_GetStr255, &opt->clientName) )
168 return 0;
169 } else if( strcmp(keystr, "windowTitle") == 0 ) {
170 if ( !PyArg_Parse(value, "O&", PyMac_GetStr255, &opt->windowTitle) )
171 return 0;
172 } else if( strcmp(keystr, "actionButtonLabel") == 0 ) {
173 if ( !PyArg_Parse(value, "O&", PyMac_GetStr255, &opt->actionButtonLabel) )
174 return 0;
175 } else if( strcmp(keystr, "cancelButtonLabel") == 0 ) {
176 if ( !PyArg_Parse(value, "O&", PyMac_GetStr255, &opt->cancelButtonLabel) )
177 return 0;
178 } else if( strcmp(keystr, "savedFileName") == 0 ) {
179 if ( !PyArg_Parse(value, "O&", PyMac_GetStr255, &opt->savedFileName) )
180 return 0;
181 } else if( strcmp(keystr, "message") == 0 ) {
182 if ( !PyArg_Parse(value, "O&", PyMac_GetStr255, &opt->message) )
183 return 0;
184 } else if( strcmp(keystr, "preferenceKey") == 0 ) {
185 if ( !PyArg_Parse(value, "O&", PyMac_GetOSType, &opt->preferenceKey) )
186 return 0;
187 #ifndef __LP64__
188 } else if( strcmp(keystr, "popupExtension") == 0 ) {
189 if ( !PyArg_Parse(value, "O&", ResObj_Convert, &opt->popupExtension) )
190 return 0;
191 #endif /* !__LP64__ */
192 } else if( eventProcP && strcmp(keystr, "eventProc") == 0 ) {
193 *eventProcP = my_eventProcUPP;
194 } else if( previewProcP && strcmp(keystr, "previewProc") == 0 ) {
195 *previewProcP = my_previewProcUPP;
196 } else if( filterProcP && strcmp(keystr, "filterProc") == 0 ) {
197 *filterProcP = my_filterProcUPP;
198 #ifndef __LP64__
199 } else if( typeListP && strcmp(keystr, "typeList") == 0 ) {
200 if ( !PyArg_Parse(value, "O&", ResObj_Convert, typeListP) )
201 return 0;
202 #endif /* !__LP64__ */
203 } else if( fileTypeP && strcmp(keystr, "fileType") == 0 ) {
204 if ( !PyArg_Parse(value, "O&", PyMac_GetOSType, fileTypeP) )
205 return 0;
206 } else if( fileCreatorP && strcmp(keystr, "fileCreator") == 0 ) {
207 if ( !PyArg_Parse(value, "O&", PyMac_GetOSType, fileCreatorP) )
208 return 0;
209 } else {
210 PyErr_Format(ErrorObject, "Unknown DialogOption key: %s", keystr);
211 return 0;
214 return 1;
217 /* ----------------------------------------------------- */
219 /* Declarations for objects of type NavReplyRecord */
221 typedef struct {
222 PyObject_HEAD
223 NavReplyRecord itself;
224 } navrrobject;
226 static PyTypeObject Navrrtype;
230 /* ---------------------------------------------------------------- */
232 static char nav_NavTranslateFile__doc__[] =
233 "(NavTranslationOptions)->None"
236 static PyObject *
237 nav_NavTranslateFile(navrrobject *self, PyObject *args)
239 NavTranslationOptions howToTranslate;
240 OSErr err;
242 if (!PyArg_ParseTuple(args, "k", &howToTranslate))
243 return NULL;
244 err = NavTranslateFile(&self->itself, howToTranslate);
245 if ( err ) {
246 PyErr_Mac(ErrorObject, err);
247 return NULL;
249 Py_INCREF(Py_None);
250 return Py_None;
253 static char nav_NavCompleteSave__doc__[] =
254 "(NavTranslationOptions)->None"
257 static PyObject *
258 nav_NavCompleteSave(navrrobject *self, PyObject *args)
260 NavTranslationOptions howToTranslate;
261 OSErr err;
263 if (!PyArg_ParseTuple(args, "k", &howToTranslate))
264 return NULL;
265 err = NavCompleteSave(&self->itself, howToTranslate);
266 if ( err ) {
267 PyErr_Mac(ErrorObject, err);
268 return NULL;
270 Py_INCREF(Py_None);
271 return Py_None;
275 static struct PyMethodDef navrr_methods[] = {
276 {"NavTranslateFile", (PyCFunction)nav_NavTranslateFile, METH_VARARGS, nav_NavTranslateFile__doc__},
277 {"NavCompleteSave", (PyCFunction)nav_NavCompleteSave, METH_VARARGS, nav_NavCompleteSave__doc__},
279 {NULL, NULL} /* sentinel */
282 /* ---------- */
285 static navrrobject *
286 newnavrrobject(NavReplyRecord *itself)
288 navrrobject *self;
290 self = PyObject_NEW(navrrobject, &Navrrtype);
291 if (self == NULL)
292 return NULL;
293 self->itself = *itself;
294 return self;
298 static void
299 navrr_dealloc(navrrobject *self)
301 NavDisposeReply(&self->itself);
302 PyObject_DEL(self);
305 static PyObject *
306 navrr_getattr(navrrobject *self, char *name)
308 FSRef fsr;
309 #ifndef __LP64__
310 FSSpec fss;
311 #endif /* !__LP64__ */
313 if( strcmp(name, "__members__") == 0 )
314 return Py_BuildValue(
315 #ifndef __LP64__
316 "ssssssssss",
317 #else /* __LP64__ */
318 "ssssssssss",
319 #endif /* __LP64__ */
320 "version", "validRecord", "replacing",
321 "isStationery", "translationNeeded",
322 #ifndef __LP64__
323 "selection",
324 #endif /* !__LP64__ */
325 "selection_fsr",
326 "fileTranslation", "keyScript", "saveFileName");
328 if( strcmp(name, "version") == 0 )
329 return Py_BuildValue("h", self->itself.version);
330 if( strcmp(name, "validRecord") == 0 )
331 return Py_BuildValue("l", (long)self->itself.validRecord);
332 if( strcmp(name, "replacing") == 0 )
333 return Py_BuildValue("l", (long)self->itself.replacing);
334 if( strcmp(name, "isStationery") == 0 )
335 return Py_BuildValue("l", (long)self->itself.isStationery);
336 if( strcmp(name, "translationNeeded") == 0 )
337 return Py_BuildValue("l", (long)self->itself.translationNeeded);
338 #ifndef __LP64__
339 if( strcmp(name, "selection") == 0 ) {
340 SInt32 i;
341 long count;
342 OSErr err;
343 PyObject *rv, *rvitem;
344 AEDesc desc;
346 if ((err=AECountItems(&self->itself.selection, &count))) {
347 PyErr_Mac(ErrorObject, err);
348 return NULL;
350 if ( (rv=PyList_New(count)) == NULL )
351 return NULL;
352 for(i=0; i<count; i++) {
353 desc.dataHandle = NULL;
354 if ((err=AEGetNthDesc(&self->itself.selection, i+1, typeFSS, NULL, &desc))) {
355 Py_DECREF(rv);
356 PyErr_Mac(ErrorObject, err);
357 return NULL;
359 if ((err=AEGetDescData(&desc, &fss, sizeof(FSSpec)))) {
360 Py_DECREF(rv);
361 PyErr_Mac(ErrorObject, err);
362 return NULL;
364 rvitem = PyMac_BuildFSSpec(&fss);
365 PyList_SetItem(rv, i, rvitem);
366 AEDisposeDesc(&desc);
368 return rv;
370 #endif /* !__LP64__ */
371 if( strcmp(name, "selection_fsr") == 0 ) {
372 SInt32 i;
373 long count;
374 OSErr err;
375 PyObject *rv, *rvitem;
376 AEDesc desc;
378 if ((err=AECountItems(&self->itself.selection, &count))) {
379 PyErr_Mac(ErrorObject, err);
380 return NULL;
382 if ( (rv=PyList_New(count)) == NULL )
383 return NULL;
384 for(i=0; i<count; i++) {
385 desc.dataHandle = NULL;
386 if ((err=AEGetNthDesc(&self->itself.selection, i+1, typeFSRef, NULL, &desc))) {
387 Py_DECREF(rv);
388 PyErr_Mac(ErrorObject, err);
389 return NULL;
391 if ((err=AEGetDescData(&desc, &fsr, sizeof(FSRef)))) {
392 Py_DECREF(rv);
393 PyErr_Mac(ErrorObject, err);
394 return NULL;
396 rvitem = PyMac_BuildFSRef(&fsr);
397 PyList_SetItem(rv, i, rvitem);
398 AEDisposeDesc(&desc);
400 return rv;
402 #ifndef __LP64__
403 if( strcmp(name, "fileTranslation") == 0 )
404 return ResObj_New((Handle)self->itself.fileTranslation);
405 #endif
406 if( strcmp(name, "keyScript") == 0 )
407 return Py_BuildValue("h", (short)self->itself.keyScript);
408 if( strcmp(name, "saveFileName") == 0 )
409 return Py_BuildValue("O&", CFStringRefObj_New, self->itself.saveFileName);
412 return Py_FindMethod(navrr_methods, (PyObject *)self, name);
415 static int
416 navrr_setattr(navrrobject *self, char *name, PyObject *v)
418 /* Set attribute 'name' to value 'v'. v==NULL means delete */
420 /* XXXX Add your own setattr code here */
421 return -1;
424 static char Navrrtype__doc__[] =
425 "Record containing result of a Nav file selection call. Use dir() for member names."
428 static PyTypeObject Navrrtype = {
429 PyObject_HEAD_INIT(&PyType_Type)
430 0, /*ob_size*/
431 "Nav.NavReplyRecord", /*tp_name*/
432 sizeof(navrrobject), /*tp_basicsize*/
433 0, /*tp_itemsize*/
434 /* methods */
435 (destructor)navrr_dealloc, /*tp_dealloc*/
436 (printfunc)0, /*tp_print*/
437 (getattrfunc)navrr_getattr, /*tp_getattr*/
438 (setattrfunc)navrr_setattr, /*tp_setattr*/
439 (cmpfunc)0, /*tp_compare*/
440 (reprfunc)0, /*tp_repr*/
441 0, /*tp_as_number*/
442 0, /*tp_as_sequence*/
443 0, /*tp_as_mapping*/
444 (hashfunc)0, /*tp_hash*/
445 (ternaryfunc)0, /*tp_call*/
446 (reprfunc)0, /*tp_str*/
448 /* Space for future expansion */
449 0L,0L,0L,0L,
450 Navrrtype__doc__ /* Documentation string */
453 /* End of code for NavReplyRecord objects */
455 /* ----------------------------------------------------- */
457 static char nav_NavGetFile__doc__[] =
458 "(DialogOptions dict or kwargs+defaultLocation,eventProc,previewProc,filterProc,typeList) -> NavReplyRecord"
461 static PyObject *
462 nav_NavGetFile(PyObject *self, PyObject *args, PyObject *kw)
464 PyObject *dict;
465 AEDesc *defaultLocation = NULL;
466 NavReplyRecord reply;
467 NavDialogOptions dialogOptions;
468 NavEventUPP eventProc = NULL;
469 NavPreviewUPP previewProc = NULL;
470 NavObjectFilterUPP filterProc = NULL;
471 NavTypeListHandle typeList = NULL;
472 OSErr err;
474 if ( kw && PyObject_IsTrue(kw) ) {
475 if (!PyArg_ParseTuple(args, ";either keyword arguments or dictionary expected"))
476 return NULL;
477 dict = kw;
478 } else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
479 return NULL;
480 if (!filldialogoptions(dict, &defaultLocation, &dialogOptions, &eventProc, &previewProc, &filterProc, &typeList, NULL, NULL))
481 return NULL;
482 err = NavGetFile(defaultLocation, &reply, &dialogOptions,
483 eventProc, previewProc, filterProc, typeList, (void *)dict);
484 PyMem_DEL(defaultLocation);
485 if ( err ) {
486 PyErr_Mac(ErrorObject, err);
487 return NULL;
489 return (PyObject *)newnavrrobject(&reply);
492 static char nav_NavPutFile__doc__[] =
493 "(DialogOptions dict or kwargs+defaultLocation,eventProc,fileCreator,fileType) -> NavReplyRecord"
496 static PyObject *
497 nav_NavPutFile(PyObject *self, PyObject *args, PyObject *kw)
499 PyObject *dict;
500 AEDesc *defaultLocation = NULL;
501 NavReplyRecord reply;
502 NavDialogOptions dialogOptions;
503 NavEventUPP eventProc = NULL;
504 OSType fileType;
505 OSType fileCreator;
506 OSErr err;
508 if ( kw && PyObject_IsTrue(kw) ) {
509 if (!PyArg_ParseTuple(args, ";either keyword arguments or dictionary expected"))
510 return NULL;
511 dict = kw;
512 } else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
513 return NULL;
514 if (!filldialogoptions(dict, &defaultLocation, &dialogOptions, &eventProc, NULL, NULL, NULL, &fileType, &fileCreator))
515 return NULL;
516 err = NavPutFile(defaultLocation, &reply, &dialogOptions,
517 eventProc, fileType, fileCreator, (void *)dict);
518 PyMem_DEL(defaultLocation);
519 if ( err ) {
520 PyErr_Mac(ErrorObject, err);
521 return NULL;
523 return (PyObject *)newnavrrobject(&reply);
526 static char nav_NavAskSaveChanges__doc__[] =
527 "(NavAskSaveChangesAction, DialogOptions dict or kwargs+eventProc) -> NavAskSaveChangesResult"
531 static PyObject *
532 nav_NavAskSaveChanges(PyObject *self, PyObject *args, PyObject *kw)
534 PyObject *dict;
535 NavDialogOptions dialogOptions;
536 NavAskSaveChangesAction action;
537 NavAskSaveChangesResult reply;
538 NavEventUPP eventProc = NULL;
539 OSErr err;
541 if ( kw && PyObject_IsTrue(kw) ) {
542 if (!PyArg_ParseTuple(args, "k", &action))
543 return NULL;
544 dict = kw;
545 } else if (!PyArg_ParseTuple(args, "lO!", &action, &PyDict_Type, &dict))
546 return NULL;
547 if (!filldialogoptions(dict, NULL, &dialogOptions, &eventProc, NULL, NULL, NULL, NULL, NULL))
548 return NULL;
549 err = NavAskSaveChanges(&dialogOptions, action, &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_NavCustomAskSaveChanges__doc__[] =
558 "(DialogOptions dict or kwargs+eventProc) -> NavAskSaveChangesResult"
561 static PyObject *
562 nav_NavCustomAskSaveChanges(PyObject *self, PyObject *args, PyObject *kw)
564 PyObject *dict;
565 NavDialogOptions dialogOptions;
566 NavAskSaveChangesResult reply;
567 NavEventUPP eventProc = NULL;
568 OSErr err;
570 if ( kw && PyObject_IsTrue(kw) ) {
571 if (!PyArg_ParseTuple(args, ";either keyword arguments or dictionary expected"))
572 return NULL;
573 dict = kw;
574 } else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
575 return NULL;
576 if (!filldialogoptions(dict, NULL, &dialogOptions, &eventProc, NULL, NULL, NULL, NULL, NULL))
577 return NULL;
578 err = NavCustomAskSaveChanges(&dialogOptions, &reply, eventProc, (void *)dict);
579 if ( err ) {
580 PyErr_Mac(ErrorObject, err);
581 return NULL;
583 return Py_BuildValue("l", (long)reply);
586 static char nav_NavAskDiscardChanges__doc__[] =
587 "(DialogOptions dict or kwargs+eventProc) -> NavAskSaveChangesResult"
590 static PyObject *
591 nav_NavAskDiscardChanges(PyObject *self, PyObject *args, PyObject *kw)
593 PyObject *dict;
594 NavDialogOptions dialogOptions;
595 NavAskSaveChangesResult reply;
596 NavEventUPP eventProc = NULL;
597 OSErr err;
599 if ( kw && PyObject_IsTrue(kw) ) {
600 if (!PyArg_ParseTuple(args, ";either keyword arguments or dictionary expected"))
601 return NULL;
602 dict = kw;
603 } else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
604 return NULL;
605 if (!filldialogoptions(dict, NULL, &dialogOptions, &eventProc, NULL, NULL, NULL, NULL, NULL))
606 return NULL;
607 err = NavAskDiscardChanges(&dialogOptions, &reply, eventProc, (void *)dict);
608 if ( err ) {
609 PyErr_Mac(ErrorObject, err);
610 return NULL;
612 return Py_BuildValue("l", (long)reply);
615 static char nav_NavChooseFile__doc__[] =
616 "(DialogOptions dict or kwargs+defaultLocation,eventProc,previewProc,filterProc,typeList) -> NavReplyRecord"
619 static PyObject *
620 nav_NavChooseFile(PyObject *self, PyObject *args, PyObject *kw)
622 PyObject *dict;
623 AEDesc *defaultLocation = NULL;
624 NavReplyRecord reply;
625 NavDialogOptions dialogOptions;
626 NavEventUPP eventProc = NULL;
627 NavPreviewUPP previewProc = NULL;
628 NavObjectFilterUPP filterProc = NULL;
629 NavTypeListHandle typeList = NULL;
630 OSErr err;
632 if ( kw && PyObject_IsTrue(kw) ) {
633 if (!PyArg_ParseTuple(args, ";either keyword arguments or dictionary expected"))
634 return NULL;
635 dict = kw;
636 } else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
637 return NULL;
638 if (!filldialogoptions(dict, &defaultLocation, &dialogOptions, &eventProc, &previewProc, &filterProc, &typeList, NULL, NULL))
639 return NULL;
640 err = NavChooseFile(defaultLocation, &reply, &dialogOptions,
641 eventProc, previewProc, filterProc, typeList, (void *)dict);
642 PyMem_DEL(defaultLocation);
643 if ( err ) {
644 PyErr_Mac(ErrorObject, err);
645 return NULL;
647 return (PyObject *)newnavrrobject(&reply);
650 static char nav_NavChooseFolder__doc__[] =
651 "(DialogOptions dict or kwargs+defaultLocation,eventProc,filterProc) -> NavReplyRecord"
654 static PyObject *
655 nav_NavChooseFolder(PyObject *self, PyObject *args, PyObject *kw)
657 PyObject *dict;
658 AEDesc *defaultLocation = NULL;
659 NavReplyRecord reply;
660 NavDialogOptions dialogOptions;
661 NavEventUPP eventProc = NULL;
662 NavObjectFilterUPP filterProc = NULL;
663 OSErr err;
665 if ( kw && PyObject_IsTrue(kw) ) {
666 if (!PyArg_ParseTuple(args, ";either keyword arguments or dictionary expected"))
667 return NULL;
668 dict = kw;
669 } else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
670 return NULL;
671 if (!filldialogoptions(dict, &defaultLocation, &dialogOptions, &eventProc, NULL, &filterProc, NULL, NULL, NULL))
672 return NULL;
673 err = NavChooseFolder(defaultLocation, &reply, &dialogOptions,
674 eventProc, filterProc, (void *)dict);
675 PyMem_DEL(defaultLocation);
676 if ( err ) {
677 PyErr_Mac(ErrorObject, err);
678 return NULL;
680 return (PyObject *)newnavrrobject(&reply);
683 static char nav_NavChooseVolume__doc__[] =
684 "(DialogOptions dict or kwargs+defaultLocation,eventProc,filterProc) -> NavReplyRecord"
687 static PyObject *
688 nav_NavChooseVolume(PyObject *self, PyObject *args, PyObject *kw)
690 PyObject *dict;
691 AEDesc *defaultLocation = NULL;
692 NavReplyRecord reply;
693 NavDialogOptions dialogOptions;
694 NavEventUPP eventProc = NULL;
695 NavObjectFilterUPP filterProc = NULL;
696 OSErr err;
698 if ( kw && PyObject_IsTrue(kw) ) {
699 if (!PyArg_ParseTuple(args, ";either keyword arguments or dictionary expected"))
700 return NULL;
701 dict = kw;
702 } else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
703 return NULL;
704 if (!filldialogoptions(dict, &defaultLocation, &dialogOptions, &eventProc, NULL, &filterProc, NULL, NULL, NULL))
705 return NULL;
706 err = NavChooseVolume(defaultLocation, &reply, &dialogOptions,
707 eventProc, filterProc, (void *)dict);
708 PyMem_DEL(defaultLocation);
709 if ( err ) {
710 PyErr_Mac(ErrorObject, err);
711 return NULL;
713 return (PyObject *)newnavrrobject(&reply);
716 static char nav_NavChooseObject__doc__[] =
717 "(DialogOptions dict or kwargs+defaultLocation,eventProc,filterProc) -> NavReplyRecord"
720 static PyObject *
721 nav_NavChooseObject(PyObject *self, PyObject *args, PyObject *kw)
723 PyObject *dict;
724 AEDesc *defaultLocation = NULL;
725 NavReplyRecord reply;
726 NavDialogOptions dialogOptions;
727 NavEventUPP eventProc = NULL;
728 NavObjectFilterUPP filterProc = NULL;
729 OSErr err;
731 if ( kw && PyObject_IsTrue(kw) ) {
732 if (!PyArg_ParseTuple(args, ";either keyword arguments or dictionary expected"))
733 return NULL;
734 dict = kw;
735 } else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
736 return NULL;
737 if (!filldialogoptions(dict, &defaultLocation, &dialogOptions, &eventProc, NULL, &filterProc, NULL, NULL, NULL))
738 return NULL;
739 err = NavChooseObject(defaultLocation, &reply, &dialogOptions,
740 eventProc, filterProc, (void *)dict);
741 PyMem_DEL(defaultLocation);
742 if ( err ) {
743 PyErr_Mac(ErrorObject, err);
744 return NULL;
746 return (PyObject *)newnavrrobject(&reply);
749 static char nav_NavNewFolder__doc__[] =
750 "(DialogOptions dict or kwargs+defaultLocation,eventProc) -> NavReplyRecord"
753 static PyObject *
754 nav_NavNewFolder(PyObject *self, PyObject *args, PyObject *kw)
756 PyObject *dict;
757 AEDesc *defaultLocation = NULL;
758 NavReplyRecord reply;
759 NavDialogOptions dialogOptions;
760 NavEventUPP eventProc = NULL;
761 OSErr err;
763 if ( kw && PyObject_IsTrue(kw) ) {
764 if (!PyArg_ParseTuple(args, ";either keyword arguments or dictionary expected"))
765 return NULL;
766 dict = kw;
767 } else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
768 return NULL;
769 if (!filldialogoptions(dict, &defaultLocation, &dialogOptions, &eventProc, NULL, NULL, NULL, NULL, NULL))
770 return NULL;
771 err = NavNewFolder(defaultLocation, &reply, &dialogOptions, eventProc, (void *)dict);
772 PyMem_DEL(defaultLocation);
773 if ( err ) {
774 PyErr_Mac(ErrorObject, err);
775 return NULL;
777 return (PyObject *)newnavrrobject(&reply);
780 #if 0
781 /* XXXX I don't know what to do with the void * argument */
782 static char nav_NavCustomControl__doc__[] =
787 static PyObject *
788 nav_NavCustomControl(PyObject *self, PyObject *args)
791 if (!PyArg_ParseTuple(args, ""))
792 return NULL;
793 Py_INCREF(Py_None);
794 return Py_None;
796 #endif
798 static char nav_NavServicesCanRun__doc__[] =
799 "()->int"
802 static PyObject *
803 nav_NavServicesCanRun(PyObject *self, PyObject *args)
805 Boolean rv;
806 if (!PyArg_ParseTuple(args, ""))
807 return NULL;
808 rv = NavServicesCanRun();
809 return Py_BuildValue("l", (long)rv);
812 static char nav_NavServicesAvailable__doc__[] =
813 "()->int"
816 static PyObject *
817 nav_NavServicesAvailable(PyObject *self, PyObject *args)
819 Boolean rv;
821 if (!PyArg_ParseTuple(args, ""))
822 return NULL;
823 rv = NavServicesAvailable();
824 return Py_BuildValue("l", (long)rv);
826 /* XX */
827 static char nav_NavLoad__doc__[] =
828 "()->None"
831 static PyObject *
832 nav_NavLoad(PyObject *self, PyObject *args)
835 if (!PyArg_ParseTuple(args, ""))
836 return NULL;
837 NavLoad();
838 Py_INCREF(Py_None);
839 return Py_None;
842 static char nav_NavUnload__doc__[] =
843 "()->None"
846 static PyObject *
847 nav_NavUnload(PyObject *self, PyObject *args)
850 if (!PyArg_ParseTuple(args, ""))
851 return NULL;
852 NavUnload();
853 Py_INCREF(Py_None);
854 return Py_None;
857 static char nav_NavLibraryVersion__doc__[] =
858 "()->int"
861 static PyObject *
862 nav_NavLibraryVersion(PyObject *self, PyObject *args)
864 UInt32 rv;
866 if (!PyArg_ParseTuple(args, ""))
867 return NULL;
868 rv = NavLibraryVersion();
869 return Py_BuildValue("l", (long)rv);
872 static char nav_NavGetDefaultDialogOptions__doc__[] =
873 "()->dict\nPass dict or keyword args with same names to other calls."
876 static PyObject *
877 nav_NavGetDefaultDialogOptions(PyObject *self, PyObject *args)
879 NavDialogOptions dialogOptions;
880 OSErr err;
882 err = NavGetDefaultDialogOptions(&dialogOptions);
883 if ( err ) {
884 PyErr_Mac(ErrorObject, err);
885 return NULL;
887 return Py_BuildValue(
888 #ifndef __LP64__
889 "{s:h,s:l,s:O&,s:O&,s:O&,s:O&,s:O&,s:O&,s:O&,s:O&,s:O&}",
890 #else /* __LP64__ */
891 "{s:h,s:l,s:O&,s:O&,s:O&,s:O&,s:O&,s:O&,s:O&,s:O&}",
892 #endif /* __LP64__ */
893 "version", dialogOptions.version,
894 "dialogOptionFlags", dialogOptions.dialogOptionFlags,
895 "location", PyMac_BuildPoint, dialogOptions.location,
896 "clientName", PyMac_BuildStr255, &dialogOptions.clientName,
897 "windowTitle", PyMac_BuildStr255, &dialogOptions.windowTitle,
898 "actionButtonLabel", PyMac_BuildStr255, &dialogOptions.actionButtonLabel,
899 "cancelButtonLabel", PyMac_BuildStr255, &dialogOptions.cancelButtonLabel,
900 "savedFileName", PyMac_BuildStr255, &dialogOptions.savedFileName,
901 "message", PyMac_BuildStr255, &dialogOptions.message,
902 "preferenceKey", PyMac_BuildOSType, dialogOptions.preferenceKey
903 #ifndef __LP64__
904 ,"popupExtension", OptResObj_New, dialogOptions.popupExtension
905 #endif /* __LP64__ */
909 /* List of methods defined in the module */
911 static struct PyMethodDef nav_methods[] = {
912 {"NavGetFile", (PyCFunction)nav_NavGetFile, METH_VARARGS|METH_KEYWORDS, nav_NavGetFile__doc__},
913 {"NavPutFile", (PyCFunction)nav_NavPutFile, METH_VARARGS|METH_KEYWORDS, nav_NavPutFile__doc__},
914 {"NavAskSaveChanges", (PyCFunction)nav_NavAskSaveChanges, METH_VARARGS|METH_KEYWORDS, nav_NavAskSaveChanges__doc__},
915 {"NavCustomAskSaveChanges", (PyCFunction)nav_NavCustomAskSaveChanges, METH_VARARGS|METH_KEYWORDS, nav_NavCustomAskSaveChanges__doc__},
916 {"NavAskDiscardChanges", (PyCFunction)nav_NavAskDiscardChanges, METH_VARARGS|METH_KEYWORDS, nav_NavAskDiscardChanges__doc__},
917 {"NavChooseFile", (PyCFunction)nav_NavChooseFile, METH_VARARGS|METH_KEYWORDS, nav_NavChooseFile__doc__},
918 {"NavChooseFolder", (PyCFunction)nav_NavChooseFolder, METH_VARARGS|METH_KEYWORDS, nav_NavChooseFolder__doc__},
919 {"NavChooseVolume", (PyCFunction)nav_NavChooseVolume, METH_VARARGS|METH_KEYWORDS, nav_NavChooseVolume__doc__},
920 {"NavChooseObject", (PyCFunction)nav_NavChooseObject, METH_VARARGS|METH_KEYWORDS, nav_NavChooseObject__doc__},
921 {"NavNewFolder", (PyCFunction)nav_NavNewFolder, METH_VARARGS|METH_KEYWORDS, nav_NavNewFolder__doc__},
922 #if 0
923 {"NavCustomControl", (PyCFunction)nav_NavCustomControl, METH_VARARGS, nav_NavCustomControl__doc__},
924 #endif
925 {"NavServicesCanRun", (PyCFunction)nav_NavServicesCanRun, METH_VARARGS, nav_NavServicesCanRun__doc__},
926 {"NavServicesAvailable", (PyCFunction)nav_NavServicesAvailable, METH_VARARGS, nav_NavServicesAvailable__doc__},
927 {"NavLoad", (PyCFunction)nav_NavLoad, METH_VARARGS, nav_NavLoad__doc__},
928 {"NavUnload", (PyCFunction)nav_NavUnload, METH_VARARGS, nav_NavUnload__doc__},
929 {"NavLibraryVersion", (PyCFunction)nav_NavLibraryVersion, METH_VARARGS, nav_NavLibraryVersion__doc__},
930 {"NavGetDefaultDialogOptions", (PyCFunction)nav_NavGetDefaultDialogOptions, METH_VARARGS, nav_NavGetDefaultDialogOptions__doc__},
931 {NULL, (PyCFunction)NULL, 0, NULL} /* sentinel */
935 /* Initialization function for the module (*must* be called initNav) */
937 static char Nav_module_documentation[] =
938 "Interface to Navigation Services\n"
939 "Most calls accept a NavDialogOptions dictionary or keywords with the same names, pass {}\n"
940 "if you want the default options.\n"
941 "Use NavGetDefaultDialogOptions() to find out common option names.\n"
942 "See individual docstrings for additional keyword args/dictentries supported by each call.\n"
943 "Pass None as eventProc to get movable-modal dialogs that process updates through the standard Python mechanism."
946 void
947 initNav(void)
949 PyObject *m, *d;
951 if (PyErr_WarnPy3k("In 3.x, Nav is removed.", 1))
952 return;
954 /* Test that we have NavServices */
955 if ( !NavServicesAvailable() ) {
956 PyErr_SetString(PyExc_ImportError, "Navigation Services not available");
957 return;
959 /* Create the module and add the functions */
960 m = Py_InitModule4("Nav", nav_methods,
961 Nav_module_documentation,
962 (PyObject*)NULL,PYTHON_API_VERSION);
964 /* Add some symbolic constants to the module */
965 d = PyModule_GetDict(m);
966 ErrorObject = PyString_FromString("Nav.error");
967 PyDict_SetItemString(d, "error", ErrorObject);
969 /* XXXX Add constants here */
971 /* Set UPPs */
972 my_eventProcUPP = NewNavEventUPP(my_eventProc);
973 my_previewProcUPP = NewNavPreviewUPP(my_previewProc);
974 my_filterProcUPP = NewNavObjectFilterUPP(my_filterProc);