source: vendor/python/2.5/Mac/Modules/Nav.c

Last change on this file was 3225, checked in by bird, 18 years ago

Python 2.5

File size: 27.7 KB
Line 
1/***********************************************************
2Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
4
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 or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
16
17While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
29
30******************************************************************/
31
32#include "Python.h"
33#include "pymactoolbox.h"
34#include <Carbon/Carbon.h>
35
36static PyObject *ErrorObject;
37
38static NavEventUPP my_eventProcUPP;
39static NavPreviewUPP my_previewProcUPP;
40static NavObjectFilterUPP my_filterProcUPP;
41
42/* Callback functions */
43static pascal void
44my_eventProc(NavEventCallbackMessage callBackSelector,
45 NavCBRecPtr callBackParms,
46 NavCallBackUserData callbackUD)
47{
48 PyObject *dict = (PyObject *)callbackUD;
49 PyObject *pyfunc;
50 PyObject *rv;
51
52 if (!dict) return;
53 if ( (pyfunc = PyDict_GetItemString(dict, "eventProc")) == NULL ) {
54 PyErr_Print();
55 return;
56 }
57 if ( pyfunc == Py_None ) {
58 return;
59 }
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();
67 }
68}
69
70static pascal Boolean
71my_previewProc(NavCBRecPtr callBackParms,
72 NavCallBackUserData callbackUD)
73{
74 PyObject *dict = (PyObject *)callbackUD;
75 PyObject *pyfunc;
76 PyObject *rv;
77 Boolean c_rv = false;
78
79 if (!dict) return false;
80 if ( (pyfunc = PyDict_GetItemString(dict, "previewProc")) == NULL ) {
81 PyErr_Print();
82 return false;
83 }
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();
91 }
92 return c_rv;
93}
94
95static pascal Boolean
96my_filterProc(AEDesc *theItem, void *info,
97 NavCallBackUserData callbackUD,
98 NavFilterModes filterMode)
99{
100 PyObject *dict = (PyObject *)callbackUD;
101 PyObject *pyfunc;
102 PyObject *rv;
103 Boolean c_rv = false;
104
105 if (!dict) return false;
106 if ( (pyfunc = PyDict_GetItemString(dict, "filterProc")) == NULL ) {
107 PyErr_Print();
108 return false;
109 }
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();
118 }
119 return c_rv;
120}
121
122/* ----------------------------------------------------- */
123static int
124filldialogoptions(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)
133{
134 Py_ssize_t pos = 0;
135 PyObject *key, *value;
136 char *keystr;
137 AEDesc *defaultLocation_storage;
138
139 NavGetDefaultDialogOptions(opt);
140
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;
145 }
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;
151 }
152 if ( !PyArg_Parse(value, "O&", AEDesc_Convert, defaultLocation_storage) ) {
153 PyMem_DEL(defaultLocation_storage);
154 return 0;
155 }
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 } else if( strcmp(keystr, "popupExtension") == 0 ) {
188 if ( !PyArg_Parse(value, "O&", ResObj_Convert, &opt->popupExtension) )
189 return 0;
190 } else if( eventProcP && strcmp(keystr, "eventProc") == 0 ) {
191 *eventProcP = my_eventProcUPP;
192 } else if( previewProcP && strcmp(keystr, "previewProc") == 0 ) {
193 *previewProcP = my_previewProcUPP;
194 } else if( filterProcP && strcmp(keystr, "filterProc") == 0 ) {
195 *filterProcP = my_filterProcUPP;
196 } else if( typeListP && strcmp(keystr, "typeList") == 0 ) {
197 if ( !PyArg_Parse(value, "O&", ResObj_Convert, typeListP) )
198 return 0;
199 } else if( fileTypeP && strcmp(keystr, "fileType") == 0 ) {
200 if ( !PyArg_Parse(value, "O&", PyMac_GetOSType, fileTypeP) )
201 return 0;
202 } else if( fileCreatorP && strcmp(keystr, "fileCreator") == 0 ) {
203 if ( !PyArg_Parse(value, "O&", PyMac_GetOSType, fileCreatorP) )
204 return 0;
205 } else {
206 PyErr_Format(ErrorObject, "Unknown DialogOption key: %s", keystr);
207 return 0;
208 }
209 }
210 return 1;
211}
212
213/* ----------------------------------------------------- */
214
215/* Declarations for objects of type NavReplyRecord */
216
217typedef struct {
218 PyObject_HEAD
219 NavReplyRecord itself;
220} navrrobject;
221
222static PyTypeObject Navrrtype;
223
224
225
226/* ---------------------------------------------------------------- */
227
228static char nav_NavTranslateFile__doc__[] =
229"(NavTranslationOptions)->None"
230;
231
232static PyObject *
233nav_NavTranslateFile(navrrobject *self, PyObject *args)
234{
235 NavTranslationOptions howToTranslate;
236 OSErr err;
237
238 if (!PyArg_ParseTuple(args, "k", &howToTranslate))
239 return NULL;
240 err = NavTranslateFile(&self->itself, howToTranslate);
241 if ( err ) {
242 PyErr_Mac(ErrorObject, err);
243 return NULL;
244 }
245 Py_INCREF(Py_None);
246 return Py_None;
247}
248
249static char nav_NavCompleteSave__doc__[] =
250"(NavTranslationOptions)->None"
251;
252
253static PyObject *
254nav_NavCompleteSave(navrrobject *self, PyObject *args)
255{
256 NavTranslationOptions howToTranslate;
257 OSErr err;
258
259 if (!PyArg_ParseTuple(args, "k", &howToTranslate))
260 return NULL;
261 err = NavCompleteSave(&self->itself, howToTranslate);
262 if ( err ) {
263 PyErr_Mac(ErrorObject, err);
264 return NULL;
265 }
266 Py_INCREF(Py_None);
267 return Py_None;
268}
269
270
271static struct PyMethodDef navrr_methods[] = {
272 {"NavTranslateFile", (PyCFunction)nav_NavTranslateFile, METH_VARARGS, nav_NavTranslateFile__doc__},
273 {"NavCompleteSave", (PyCFunction)nav_NavCompleteSave, METH_VARARGS, nav_NavCompleteSave__doc__},
274
275 {NULL, NULL} /* sentinel */
276};
277
278/* ---------- */
279
280
281static navrrobject *
282newnavrrobject(NavReplyRecord *itself)
283{
284 navrrobject *self;
285
286 self = PyObject_NEW(navrrobject, &Navrrtype);
287 if (self == NULL)
288 return NULL;
289 self->itself = *itself;
290 return self;
291}
292
293
294static void
295navrr_dealloc(navrrobject *self)
296{
297 NavDisposeReply(&self->itself);
298 PyObject_DEL(self);
299}
300
301static PyObject *
302navrr_getattr(navrrobject *self, char *name)
303{
304 FSSpec fss;
305 FSRef fsr;
306
307 if( strcmp(name, "__members__") == 0 )
308 return Py_BuildValue("ssssssssss", "version", "validRecord", "replacing",
309 "isStationery", "translationNeeded", "selection", "selection_fsr",
310 "fileTranslation", "keyScript", "saveFileName");
311 if( strcmp(name, "version") == 0 )
312 return Py_BuildValue("h", self->itself.version);
313 if( strcmp(name, "validRecord") == 0 )
314 return Py_BuildValue("l", (long)self->itself.validRecord);
315 if( strcmp(name, "replacing") == 0 )
316 return Py_BuildValue("l", (long)self->itself.replacing);
317 if( strcmp(name, "isStationery") == 0 )
318 return Py_BuildValue("l", (long)self->itself.isStationery);
319 if( strcmp(name, "translationNeeded") == 0 )
320 return Py_BuildValue("l", (long)self->itself.translationNeeded);
321 if( strcmp(name, "selection") == 0 ) {
322 SInt32 i, count;
323 OSErr err;
324 PyObject *rv, *rvitem;
325 AEDesc desc;
326
327 if ((err=AECountItems(&self->itself.selection, &count))) {
328 PyErr_Mac(ErrorObject, err);
329 return NULL;
330 }
331 if ( (rv=PyList_New(count)) == NULL )
332 return NULL;
333 for(i=0; i<count; i++) {
334 desc.dataHandle = NULL;
335 if ((err=AEGetNthDesc(&self->itself.selection, i+1, typeFSS, NULL, &desc))) {
336 Py_DECREF(rv);
337 PyErr_Mac(ErrorObject, err);
338 return NULL;
339 }
340 if ((err=AEGetDescData(&desc, &fss, sizeof(FSSpec)))) {
341 Py_DECREF(rv);
342 PyErr_Mac(ErrorObject, err);
343 return NULL;
344 }
345 rvitem = PyMac_BuildFSSpec(&fss);
346 PyList_SetItem(rv, i, rvitem);
347 AEDisposeDesc(&desc);
348 }
349 return rv;
350 }
351 if( strcmp(name, "selection_fsr") == 0 ) {
352 SInt32 i, count;
353 OSErr err;
354 PyObject *rv, *rvitem;
355 AEDesc desc;
356
357 if ((err=AECountItems(&self->itself.selection, &count))) {
358 PyErr_Mac(ErrorObject, err);
359 return NULL;
360 }
361 if ( (rv=PyList_New(count)) == NULL )
362 return NULL;
363 for(i=0; i<count; i++) {
364 desc.dataHandle = NULL;
365 if ((err=AEGetNthDesc(&self->itself.selection, i+1, typeFSRef, NULL, &desc))) {
366 Py_DECREF(rv);
367 PyErr_Mac(ErrorObject, err);
368 return NULL;
369 }
370 if ((err=AEGetDescData(&desc, &fsr, sizeof(FSRef)))) {
371 Py_DECREF(rv);
372 PyErr_Mac(ErrorObject, err);
373 return NULL;
374 }
375 rvitem = PyMac_BuildFSRef(&fsr);
376 PyList_SetItem(rv, i, rvitem);
377 AEDisposeDesc(&desc);
378 }
379 return rv;
380 }
381 if( strcmp(name, "fileTranslation") == 0 )
382 return ResObj_New((Handle)self->itself.fileTranslation);
383 if( strcmp(name, "keyScript") == 0 )
384 return Py_BuildValue("h", (short)self->itself.keyScript);
385 if( strcmp(name, "saveFileName") == 0 )
386 return Py_BuildValue("O&", CFStringRefObj_New, self->itself.saveFileName);
387
388
389 return Py_FindMethod(navrr_methods, (PyObject *)self, name);
390}
391
392static int
393navrr_setattr(navrrobject *self, char *name, PyObject *v)
394{
395 /* Set attribute 'name' to value 'v'. v==NULL means delete */
396
397 /* XXXX Add your own setattr code here */
398 return -1;
399}
400
401static char Navrrtype__doc__[] =
402"Record containing result of a Nav file selection call. Use dir() for member names."
403;
404
405static PyTypeObject Navrrtype = {
406 PyObject_HEAD_INIT(&PyType_Type)
407 0, /*ob_size*/
408 "Nav.NavReplyRecord", /*tp_name*/
409 sizeof(navrrobject), /*tp_basicsize*/
410 0, /*tp_itemsize*/
411 /* methods */
412 (destructor)navrr_dealloc, /*tp_dealloc*/
413 (printfunc)0, /*tp_print*/
414 (getattrfunc)navrr_getattr, /*tp_getattr*/
415 (setattrfunc)navrr_setattr, /*tp_setattr*/
416 (cmpfunc)0, /*tp_compare*/
417 (reprfunc)0, /*tp_repr*/
418 0, /*tp_as_number*/
419 0, /*tp_as_sequence*/
420 0, /*tp_as_mapping*/
421 (hashfunc)0, /*tp_hash*/
422 (ternaryfunc)0, /*tp_call*/
423 (reprfunc)0, /*tp_str*/
424
425 /* Space for future expansion */
426 0L,0L,0L,0L,
427 Navrrtype__doc__ /* Documentation string */
428};
429
430/* End of code for NavReplyRecord objects */
431
432/* ----------------------------------------------------- */
433
434static char nav_NavGetFile__doc__[] =
435"(DialogOptions dict or kwargs+defaultLocation,eventProc,previewProc,filterProc,typeList) -> NavReplyRecord"
436;
437
438static PyObject *
439nav_NavGetFile(PyObject *self, PyObject *args, PyObject *kw)
440{
441 PyObject *dict;
442 AEDesc *defaultLocation = NULL;
443 NavReplyRecord reply;
444 NavDialogOptions dialogOptions;
445 NavEventUPP eventProc = NULL;
446 NavPreviewUPP previewProc = NULL;
447 NavObjectFilterUPP filterProc = NULL;
448 NavTypeListHandle typeList = NULL;
449 OSErr err;
450
451 if ( kw && PyObject_IsTrue(kw) ) {
452 if (!PyArg_ParseTuple(args, ";either keyword arguments or dictionary expected"))
453 return NULL;
454 dict = kw;
455 } else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
456 return NULL;
457 if (!filldialogoptions(dict, &defaultLocation, &dialogOptions, &eventProc, &previewProc, &filterProc, &typeList, NULL, NULL))
458 return NULL;
459 err = NavGetFile(defaultLocation, &reply, &dialogOptions,
460 eventProc, previewProc, filterProc, typeList, (void *)dict);
461 PyMem_DEL(defaultLocation);
462 if ( err ) {
463 PyErr_Mac(ErrorObject, err);
464 return NULL;
465 }
466 return (PyObject *)newnavrrobject(&reply);
467}
468
469static char nav_NavPutFile__doc__[] =
470"(DialogOptions dict or kwargs+defaultLocation,eventProc,fileCreator,fileType) -> NavReplyRecord"
471;
472
473static PyObject *
474nav_NavPutFile(PyObject *self, PyObject *args, PyObject *kw)
475{
476 PyObject *dict;
477 AEDesc *defaultLocation = NULL;
478 NavReplyRecord reply;
479 NavDialogOptions dialogOptions;
480 NavEventUPP eventProc = NULL;
481 OSType fileType;
482 OSType fileCreator;
483 OSErr err;
484
485 if ( kw && PyObject_IsTrue(kw) ) {
486 if (!PyArg_ParseTuple(args, ";either keyword arguments or dictionary expected"))
487 return NULL;
488 dict = kw;
489 } else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
490 return NULL;
491 if (!filldialogoptions(dict, &defaultLocation, &dialogOptions, &eventProc, NULL, NULL, NULL, &fileType, &fileCreator))
492 return NULL;
493 err = NavPutFile(defaultLocation, &reply, &dialogOptions,
494 eventProc, fileType, fileCreator, (void *)dict);
495 PyMem_DEL(defaultLocation);
496 if ( err ) {
497 PyErr_Mac(ErrorObject, err);
498 return NULL;
499 }
500 return (PyObject *)newnavrrobject(&reply);
501}
502
503static char nav_NavAskSaveChanges__doc__[] =
504"(NavAskSaveChangesAction, DialogOptions dict or kwargs+eventProc) -> NavAskSaveChangesResult"
505
506;
507
508static PyObject *
509nav_NavAskSaveChanges(PyObject *self, PyObject *args, PyObject *kw)
510{
511 PyObject *dict;
512 NavDialogOptions dialogOptions;
513 NavAskSaveChangesAction action;
514 NavAskSaveChangesResult reply;
515 NavEventUPP eventProc = NULL;
516 OSErr err;
517
518 if ( kw && PyObject_IsTrue(kw) ) {
519 if (!PyArg_ParseTuple(args, "k", &action))
520 return NULL;
521 dict = kw;
522 } else if (!PyArg_ParseTuple(args, "lO!", &action, &PyDict_Type, &dict))
523 return NULL;
524 if (!filldialogoptions(dict, NULL, &dialogOptions, &eventProc, NULL, NULL, NULL, NULL, NULL))
525 return NULL;
526 err = NavAskSaveChanges(&dialogOptions, action, &reply, eventProc, (void *)dict);
527 if ( err ) {
528 PyErr_Mac(ErrorObject, err);
529 return NULL;
530 }
531 return Py_BuildValue("l", (long)reply);
532}
533
534static char nav_NavCustomAskSaveChanges__doc__[] =
535"(DialogOptions dict or kwargs+eventProc) -> NavAskSaveChangesResult"
536;
537
538static PyObject *
539nav_NavCustomAskSaveChanges(PyObject *self, PyObject *args, PyObject *kw)
540{
541 PyObject *dict;
542 NavDialogOptions dialogOptions;
543 NavAskSaveChangesResult reply;
544 NavEventUPP eventProc = NULL;
545 OSErr err;
546
547 if ( kw && PyObject_IsTrue(kw) ) {
548 if (!PyArg_ParseTuple(args, ";either keyword arguments or dictionary expected"))
549 return NULL;
550 dict = kw;
551 } else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
552 return NULL;
553 if (!filldialogoptions(dict, NULL, &dialogOptions, &eventProc, NULL, NULL, NULL, NULL, NULL))
554 return NULL;
555 err = NavCustomAskSaveChanges(&dialogOptions, &reply, eventProc, (void *)dict);
556 if ( err ) {
557 PyErr_Mac(ErrorObject, err);
558 return NULL;
559 }
560 return Py_BuildValue("l", (long)reply);
561}
562
563static char nav_NavAskDiscardChanges__doc__[] =
564"(DialogOptions dict or kwargs+eventProc) -> NavAskSaveChangesResult"
565;
566
567static PyObject *
568nav_NavAskDiscardChanges(PyObject *self, PyObject *args, PyObject *kw)
569{
570 PyObject *dict;
571 NavDialogOptions dialogOptions;
572 NavAskSaveChangesResult reply;
573 NavEventUPP eventProc = NULL;
574 OSErr err;
575
576 if ( kw && PyObject_IsTrue(kw) ) {
577 if (!PyArg_ParseTuple(args, ";either keyword arguments or dictionary expected"))
578 return NULL;
579 dict = kw;
580 } else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
581 return NULL;
582 if (!filldialogoptions(dict, NULL, &dialogOptions, &eventProc, NULL, NULL, NULL, NULL, NULL))
583 return NULL;
584 err = NavAskDiscardChanges(&dialogOptions, &reply, eventProc, (void *)dict);
585 if ( err ) {
586 PyErr_Mac(ErrorObject, err);
587 return NULL;
588 }
589 return Py_BuildValue("l", (long)reply);
590}
591
592static char nav_NavChooseFile__doc__[] =
593"(DialogOptions dict or kwargs+defaultLocation,eventProc,previewProc,filterProc,typeList) -> NavReplyRecord"
594;
595
596static PyObject *
597nav_NavChooseFile(PyObject *self, PyObject *args, PyObject *kw)
598{
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;
608
609 if ( kw && PyObject_IsTrue(kw) ) {
610 if (!PyArg_ParseTuple(args, ";either keyword arguments or dictionary expected"))
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_DEL(defaultLocation);
620 if ( err ) {
621 PyErr_Mac(ErrorObject, err);
622 return NULL;
623 }
624 return (PyObject *)newnavrrobject(&reply);
625}
626
627static char nav_NavChooseFolder__doc__[] =
628"(DialogOptions dict or kwargs+defaultLocation,eventProc,filterProc) -> NavReplyRecord"
629;
630
631static PyObject *
632nav_NavChooseFolder(PyObject *self, PyObject *args, PyObject *kw)
633{
634 PyObject *dict;
635 AEDesc *defaultLocation = NULL;
636 NavReplyRecord reply;
637 NavDialogOptions dialogOptions;
638 NavEventUPP eventProc = NULL;
639 NavObjectFilterUPP filterProc = NULL;
640 OSErr err;
641
642 if ( kw && PyObject_IsTrue(kw) ) {
643 if (!PyArg_ParseTuple(args, ";either keyword arguments or dictionary expected"))
644 return NULL;
645 dict = kw;
646 } else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
647 return NULL;
648 if (!filldialogoptions(dict, &defaultLocation, &dialogOptions, &eventProc, NULL, &filterProc, NULL, NULL, NULL))
649 return NULL;
650 err = NavChooseFolder(defaultLocation, &reply, &dialogOptions,
651 eventProc, filterProc, (void *)dict);
652 PyMem_DEL(defaultLocation);
653 if ( err ) {
654 PyErr_Mac(ErrorObject, err);
655 return NULL;
656 }
657 return (PyObject *)newnavrrobject(&reply);
658}
659
660static char nav_NavChooseVolume__doc__[] =
661"(DialogOptions dict or kwargs+defaultLocation,eventProc,filterProc) -> NavReplyRecord"
662;
663
664static PyObject *
665nav_NavChooseVolume(PyObject *self, PyObject *args, PyObject *kw)
666{
667 PyObject *dict;
668 AEDesc *defaultLocation = NULL;
669 NavReplyRecord reply;
670 NavDialogOptions dialogOptions;
671 NavEventUPP eventProc = NULL;
672 NavObjectFilterUPP filterProc = NULL;
673 OSErr err;
674
675 if ( kw && PyObject_IsTrue(kw) ) {
676 if (!PyArg_ParseTuple(args, ";either keyword arguments or dictionary expected"))
677 return NULL;
678 dict = kw;
679 } else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
680 return NULL;
681 if (!filldialogoptions(dict, &defaultLocation, &dialogOptions, &eventProc, NULL, &filterProc, NULL, NULL, NULL))
682 return NULL;
683 err = NavChooseVolume(defaultLocation, &reply, &dialogOptions,
684 eventProc, filterProc, (void *)dict);
685 PyMem_DEL(defaultLocation);
686 if ( err ) {
687 PyErr_Mac(ErrorObject, err);
688 return NULL;
689 }
690 return (PyObject *)newnavrrobject(&reply);
691}
692
693static char nav_NavChooseObject__doc__[] =
694"(DialogOptions dict or kwargs+defaultLocation,eventProc,filterProc) -> NavReplyRecord"
695;
696
697static PyObject *
698nav_NavChooseObject(PyObject *self, PyObject *args, PyObject *kw)
699{
700 PyObject *dict;
701 AEDesc *defaultLocation = NULL;
702 NavReplyRecord reply;
703 NavDialogOptions dialogOptions;
704 NavEventUPP eventProc = NULL;
705 NavObjectFilterUPP filterProc = NULL;
706 OSErr err;
707
708 if ( kw && PyObject_IsTrue(kw) ) {
709 if (!PyArg_ParseTuple(args, ";either keyword arguments or dictionary expected"))
710 return NULL;
711 dict = kw;
712 } else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
713 return NULL;
714 if (!filldialogoptions(dict, &defaultLocation, &dialogOptions, &eventProc, NULL, &filterProc, NULL, NULL, NULL))
715 return NULL;
716 err = NavChooseObject(defaultLocation, &reply, &dialogOptions,
717 eventProc, filterProc, (void *)dict);
718 PyMem_DEL(defaultLocation);
719 if ( err ) {
720 PyErr_Mac(ErrorObject, err);
721 return NULL;
722 }
723 return (PyObject *)newnavrrobject(&reply);
724}
725
726static char nav_NavNewFolder__doc__[] =
727"(DialogOptions dict or kwargs+defaultLocation,eventProc) -> NavReplyRecord"
728;
729
730static PyObject *
731nav_NavNewFolder(PyObject *self, PyObject *args, PyObject *kw)
732{
733 PyObject *dict;
734 AEDesc *defaultLocation = NULL;
735 NavReplyRecord reply;
736 NavDialogOptions dialogOptions;
737 NavEventUPP eventProc = NULL;
738 OSErr err;
739
740 if ( kw && PyObject_IsTrue(kw) ) {
741 if (!PyArg_ParseTuple(args, ";either keyword arguments or dictionary expected"))
742 return NULL;
743 dict = kw;
744 } else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
745 return NULL;
746 if (!filldialogoptions(dict, &defaultLocation, &dialogOptions, &eventProc, NULL, NULL, NULL, NULL, NULL))
747 return NULL;
748 err = NavNewFolder(defaultLocation, &reply, &dialogOptions, eventProc, (void *)dict);
749 PyMem_DEL(defaultLocation);
750 if ( err ) {
751 PyErr_Mac(ErrorObject, err);
752 return NULL;
753 }
754 return (PyObject *)newnavrrobject(&reply);
755}
756
757#if 0
758/* XXXX I don't know what to do with the void * argument */
759static char nav_NavCustomControl__doc__[] =
760""
761;
762
763
764static PyObject *
765nav_NavCustomControl(PyObject *self, PyObject *args)
766{
767
768 if (!PyArg_ParseTuple(args, ""))
769 return NULL;
770 Py_INCREF(Py_None);
771 return Py_None;
772}
773#endif
774
775static char nav_NavServicesCanRun__doc__[] =
776"()->int"
777;
778
779static PyObject *
780nav_NavServicesCanRun(PyObject *self, PyObject *args)
781{
782 Boolean rv;
783 if (!PyArg_ParseTuple(args, ""))
784 return NULL;
785 rv = NavServicesCanRun();
786 return Py_BuildValue("l", (long)rv);
787}
788
789static char nav_NavServicesAvailable__doc__[] =
790"()->int"
791;
792
793static PyObject *
794nav_NavServicesAvailable(PyObject *self, PyObject *args)
795{
796 Boolean rv;
797
798 if (!PyArg_ParseTuple(args, ""))
799 return NULL;
800 rv = NavServicesAvailable();
801 return Py_BuildValue("l", (long)rv);
802}
803/* XX */
804static char nav_NavLoad__doc__[] =
805"()->None"
806;
807
808static PyObject *
809nav_NavLoad(PyObject *self, PyObject *args)
810{
811
812 if (!PyArg_ParseTuple(args, ""))
813 return NULL;
814 NavLoad();
815 Py_INCREF(Py_None);
816 return Py_None;
817}
818
819static char nav_NavUnload__doc__[] =
820"()->None"
821;
822
823static PyObject *
824nav_NavUnload(PyObject *self, PyObject *args)
825{
826
827 if (!PyArg_ParseTuple(args, ""))
828 return NULL;
829 NavUnload();
830 Py_INCREF(Py_None);
831 return Py_None;
832}
833
834static char nav_NavLibraryVersion__doc__[] =
835"()->int"
836;
837
838static PyObject *
839nav_NavLibraryVersion(PyObject *self, PyObject *args)
840{
841 UInt32 rv;
842
843 if (!PyArg_ParseTuple(args, ""))
844 return NULL;
845 rv = NavLibraryVersion();
846 return Py_BuildValue("l", (long)rv);
847}
848
849static char nav_NavGetDefaultDialogOptions__doc__[] =
850"()->dict\nPass dict or keyword args with same names to other calls."
851;
852
853static PyObject *
854nav_NavGetDefaultDialogOptions(PyObject *self, PyObject *args)
855{
856 NavDialogOptions dialogOptions;
857 OSErr err;
858
859 err = NavGetDefaultDialogOptions(&dialogOptions);
860 if ( err ) {
861 PyErr_Mac(ErrorObject, err);
862 return NULL;
863 }
864 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&}",
865 "version", dialogOptions.version,
866 "dialogOptionFlags", dialogOptions.dialogOptionFlags,
867 "location", PyMac_BuildPoint, dialogOptions.location,
868 "clientName", PyMac_BuildStr255, &dialogOptions.clientName,
869 "windowTitle", PyMac_BuildStr255, &dialogOptions.windowTitle,
870 "actionButtonLabel", PyMac_BuildStr255, &dialogOptions.actionButtonLabel,
871 "cancelButtonLabel", PyMac_BuildStr255, &dialogOptions.cancelButtonLabel,
872 "savedFileName", PyMac_BuildStr255, &dialogOptions.savedFileName,
873 "message", PyMac_BuildStr255, &dialogOptions.message,
874 "preferenceKey", PyMac_BuildOSType, dialogOptions.preferenceKey,
875 "popupExtension", OptResObj_New, dialogOptions.popupExtension);
876}
877
878/* List of methods defined in the module */
879
880static struct PyMethodDef nav_methods[] = {
881 {"NavGetFile", (PyCFunction)nav_NavGetFile, METH_VARARGS|METH_KEYWORDS, nav_NavGetFile__doc__},
882 {"NavPutFile", (PyCFunction)nav_NavPutFile, METH_VARARGS|METH_KEYWORDS, nav_NavPutFile__doc__},
883 {"NavAskSaveChanges", (PyCFunction)nav_NavAskSaveChanges, METH_VARARGS|METH_KEYWORDS, nav_NavAskSaveChanges__doc__},
884 {"NavCustomAskSaveChanges", (PyCFunction)nav_NavCustomAskSaveChanges, METH_VARARGS|METH_KEYWORDS, nav_NavCustomAskSaveChanges__doc__},
885 {"NavAskDiscardChanges", (PyCFunction)nav_NavAskDiscardChanges, METH_VARARGS|METH_KEYWORDS, nav_NavAskDiscardChanges__doc__},
886 {"NavChooseFile", (PyCFunction)nav_NavChooseFile, METH_VARARGS|METH_KEYWORDS, nav_NavChooseFile__doc__},
887 {"NavChooseFolder", (PyCFunction)nav_NavChooseFolder, METH_VARARGS|METH_KEYWORDS, nav_NavChooseFolder__doc__},
888 {"NavChooseVolume", (PyCFunction)nav_NavChooseVolume, METH_VARARGS|METH_KEYWORDS, nav_NavChooseVolume__doc__},
889 {"NavChooseObject", (PyCFunction)nav_NavChooseObject, METH_VARARGS|METH_KEYWORDS, nav_NavChooseObject__doc__},
890 {"NavNewFolder", (PyCFunction)nav_NavNewFolder, METH_VARARGS|METH_KEYWORDS, nav_NavNewFolder__doc__},
891#if 0
892 {"NavCustomControl", (PyCFunction)nav_NavCustomControl, METH_VARARGS, nav_NavCustomControl__doc__},
893#endif
894 {"NavServicesCanRun", (PyCFunction)nav_NavServicesCanRun, METH_VARARGS, nav_NavServicesCanRun__doc__},
895 {"NavServicesAvailable", (PyCFunction)nav_NavServicesAvailable, METH_VARARGS, nav_NavServicesAvailable__doc__},
896 {"NavLoad", (PyCFunction)nav_NavLoad, METH_VARARGS, nav_NavLoad__doc__},
897 {"NavUnload", (PyCFunction)nav_NavUnload, METH_VARARGS, nav_NavUnload__doc__},
898 {"NavLibraryVersion", (PyCFunction)nav_NavLibraryVersion, METH_VARARGS, nav_NavLibraryVersion__doc__},
899 {"NavGetDefaultDialogOptions", (PyCFunction)nav_NavGetDefaultDialogOptions, METH_VARARGS, nav_NavGetDefaultDialogOptions__doc__},
900 {NULL, (PyCFunction)NULL, 0, NULL} /* sentinel */
901};
902
903
904/* Initialization function for the module (*must* be called initNav) */
905
906static char Nav_module_documentation[] =
907"Interface to Navigation Services\n"
908"Most calls accept a NavDialogOptions dictionary or keywords with the same names, pass {}\n"
909"if you want the default options.\n"
910"Use NavGetDefaultDialogOptions() to find out common option names.\n"
911"See individual docstrings for additional keyword args/dictentries supported by each call.\n"
912"Pass None as eventProc to get movable-modal dialogs that process updates through the standard Python mechanism."
913;
914
915void
916initNav(void)
917{
918 PyObject *m, *d;
919
920 /* Test that we have NavServices */
921 if ( !NavServicesAvailable() ) {
922 PyErr_SetString(PyExc_ImportError, "Navigation Services not available");
923 return;
924 }
925 /* Create the module and add the functions */
926 m = Py_InitModule4("Nav", nav_methods,
927 Nav_module_documentation,
928 (PyObject*)NULL,PYTHON_API_VERSION);
929
930 /* Add some symbolic constants to the module */
931 d = PyModule_GetDict(m);
932 ErrorObject = PyString_FromString("Nav.error");
933 PyDict_SetItemString(d, "error", ErrorObject);
934
935 /* XXXX Add constants here */
936
937 /* Set UPPs */
938 my_eventProcUPP = NewNavEventUPP(my_eventProc);
939 my_previewProcUPP = NewNavPreviewUPP(my_previewProc);
940 my_filterProcUPP = NewNavObjectFilterUPP(my_filterProc);
941
942}
943
Note: See TracBrowser for help on using the repository browser.