/***********************************************************
Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
The Netherlands.

                        All Rights Reserved

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in
supporting documentation, and that the names of Stichting Mathematisch
Centrum or CWI or Corporation for National Research Initiatives or
CNRI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior
permission.

While CWI is the initial source for this software, a modified version
is made available by the Corporation for National Research Initiatives
(CNRI) at the Internet address ftp://ftp.python.org.

STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.

******************************************************************/

#include "Python.h"
#include "macglue.h"
#include "pymactoolbox.h"
#ifdef WITHOUT_FRAMEWORKS
#include <Navigation.h>
#else
#include <Carbon/Carbon.h>
#endif

static PyObject *ErrorObject;

static NavEventUPP my_eventProcUPP;
static NavPreviewUPP my_previewProcUPP;
static NavObjectFilterUPP my_filterProcUPP;

/* Callback functions */
static pascal void
my_eventProc(NavEventCallbackMessage callBackSelector,
			 NavCBRecPtr callBackParms,
			 NavCallBackUserData callbackUD)
{
	PyObject *dict = (PyObject *)callbackUD;
	PyObject *pyfunc;
	PyObject *rv;
	
	if (!dict) return;
	if ( (pyfunc = PyDict_GetItemString(dict, "eventProc")) == NULL ) {
		PyErr_Clear();
		return;
	}
	if ( pyfunc == Py_None ) {
#if !TARGET_API_MAC_OSX
		/* Special case: give update events to the Python event handling code */
		if ( callBackSelector == kNavCBEvent && 
				callBackParms->eventData.eventDataParms.event->what == updateEvt)
			PyMac_HandleEvent(callBackParms->eventData.eventDataParms.event);
		/* Ignore others */
#endif
		return;
	}
	rv = PyObject_CallFunction(pyfunc, "ls#", (long)callBackSelector,
			(void *)callBackParms, sizeof(NavCBRec));
	if ( rv )
		Py_DECREF(rv);
	else {
		fprintf(stderr, "Nav: exception in eventProc callback\n");
		PyErr_Clear();
	}
}

static pascal Boolean
my_previewProc(NavCBRecPtr callBackParms,
			   NavCallBackUserData callbackUD)
{
	PyObject *dict = (PyObject *)callbackUD;
	PyObject *pyfunc;
	PyObject *rv;
	Boolean c_rv = false;
	
	if (!dict) return false;
	if ( (pyfunc = PyDict_GetItemString(dict, "previewProc")) == NULL ) {
		PyErr_Clear();
		return false;
	}
	rv = PyObject_CallFunction(pyfunc, "s#", (void *)callBackParms, sizeof(NavCBRec));
	if ( rv ) {
		c_rv = PyObject_IsTrue(rv);
		Py_DECREF(rv);
	} else {
		fprintf(stderr, "Nav: exception in previewProc callback\n");
		PyErr_Clear();
	}
	return c_rv;
}

static pascal Boolean
my_filterProc(AEDesc *theItem, void *info,
			  NavCallBackUserData callbackUD,
			  NavFilterModes filterMode)
{
	PyObject *dict = (PyObject *)callbackUD;
	PyObject *pyfunc;
	PyObject *rv;
	Boolean c_rv = false;
	
	if (!dict) return false;
	if ( (pyfunc = PyDict_GetItemString(dict, "filterProc")) == NULL ) {
		PyErr_Clear();
		return false;
	}
	rv = PyObject_CallFunction(pyfunc, "O&s#h",
		AEDesc_New, theItem, info, sizeof(NavFileOrFolderInfo), (short)filterMode);
	if ( rv ) {
		c_rv = PyObject_IsTrue(rv);
		Py_DECREF(rv);
	} else {
		fprintf(stderr, "Nav: exception in filterProc callback\n");
		PyErr_Clear();
	}
	return c_rv;
}

/* ----------------------------------------------------- */
static int
filldialogoptions(PyObject *d,
		AEDesc **defaultLocationP,
		NavDialogOptions *opt,
		NavEventUPP *eventProcP,
		NavPreviewUPP *previewProcP,
		NavObjectFilterUPP *filterProcP,
		NavTypeListHandle *typeListP,
		OSType *fileTypeP,
		OSType *fileCreatorP)
{
	int pos = 0;
	PyObject *key, *value;
	char *keystr;
	AEDesc *defaultLocation_storage;
	
	NavGetDefaultDialogOptions(opt);

	while ( PyDict_Next(d, &pos, &key, &value) ) {
		if ( !key || !value || !PyString_Check(key) ) {
			PyErr_SetString(ErrorObject, "DialogOption has non-string key");
			return 0;
		}
		keystr = PyString_AsString(key);
		if( strcmp(keystr, "defaultLocation") == 0 ) {
			if ( (defaultLocation_storage = PyMem_NEW(AEDesc, 1)) == NULL ) {
				PyErr_NoMemory();
				return 0;
			}
			if ( !PyArg_Parse(value, "O&", AEDesc_Convert, defaultLocation_storage) ) {
				PyMem_DEL(defaultLocation_storage);
				return 0;
			}
			*defaultLocationP = defaultLocation_storage;
		} else if( strcmp(keystr, "version") == 0 ) {
			if ( !PyArg_Parse(value, "h", &opt->version) )
				return 0;
		} else if( strcmp(keystr, "dialogOptionFlags") == 0 ) {
			if ( !PyArg_Parse(value, "l", &opt->dialogOptionFlags) )
				return 0;
		} else if( strcmp(keystr, "location") == 0 ) {
			if ( !PyArg_Parse(value, "O&", PyMac_GetPoint, &opt->location) )
				return 0;
		} else if( strcmp(keystr, "clientName") == 0 ) {
			if ( !PyArg_Parse(value, "O&", PyMac_GetStr255, &opt->clientName) )
				return 0;
		} else if( strcmp(keystr, "windowTitle") == 0 ) {
			if ( !PyArg_Parse(value, "O&", PyMac_GetStr255, &opt->windowTitle) )
				return 0;
		} else if( strcmp(keystr, "actionButtonLabel") == 0 ) {
			if ( !PyArg_Parse(value, "O&", PyMac_GetStr255, &opt->actionButtonLabel) )
				return 0;
		} else if( strcmp(keystr, "cancelButtonLabel") == 0 ) {
			if ( !PyArg_Parse(value, "O&", PyMac_GetStr255, &opt->cancelButtonLabel) )
				return 0;
		} else if( strcmp(keystr, "savedFileName") == 0 ) {
			if ( !PyArg_Parse(value, "O&", PyMac_GetStr255, &opt->savedFileName) )
				return 0;
		} else if( strcmp(keystr, "message") == 0 ) {
			if ( !PyArg_Parse(value, "O&", PyMac_GetStr255, &opt->message) )
				return 0;
		} else if( strcmp(keystr, "preferenceKey") == 0 ) {
			if ( !PyArg_Parse(value, "O&", PyMac_GetOSType, &opt->preferenceKey) )
				return 0;
		} else if( strcmp(keystr, "popupExtension") == 0 ) {
			if ( !PyArg_Parse(value, "O&", ResObj_Convert, &opt->popupExtension) )
				return 0;
		} else if( eventProcP && strcmp(keystr, "eventProc") == 0 ) {
			*eventProcP = my_eventProcUPP;
		} else if( previewProcP && strcmp(keystr, "previewProc") == 0 ) {
			PyErr_SetString(ErrorObject, "No callbacks implemented yet");
			return 0;
		} else if( filterProcP && strcmp(keystr, "filterProc") == 0 ) {
			PyErr_SetString(ErrorObject, "No callbacks implemented yet");
			return 0;
		} else if( typeListP && strcmp(keystr, "typeList") == 0 ) {
			if ( !PyArg_Parse(value, "O&", ResObj_Convert, typeListP) )
				return 0;
		} else if( fileTypeP && strcmp(keystr, "fileType") == 0 ) {
			if ( !PyArg_Parse(value, "O&", PyMac_GetOSType, fileTypeP) )
				return 0;
		} else if( fileCreatorP && strcmp(keystr, "fileCreator") == 0 ) {
			if ( !PyArg_Parse(value, "O&", PyMac_GetOSType, fileCreatorP) )
				return 0;
		} else {
			PyErr_Format(ErrorObject, "Unknown DialogOption key: %s", keystr);
			return 0;
		}
	}
	return 1;
}

/* ----------------------------------------------------- */

/* Declarations for objects of type NavReplyRecord */

typedef struct {
	PyObject_HEAD
	NavReplyRecord itself;
} navrrobject;

static PyTypeObject Navrrtype;



/* ---------------------------------------------------------------- */

static char nav_NavTranslateFile__doc__[] =
"(NavTranslationOptions)->None"
;

static PyObject *
nav_NavTranslateFile(navrrobject *self, PyObject *args)
{
	NavTranslationOptions howToTranslate;
	OSErr err;

	if (!PyArg_ParseTuple(args, "l", &howToTranslate))
		return NULL;
	err = NavTranslateFile(&self->itself, howToTranslate);
	if ( err ) {
		PyErr_Mac(ErrorObject, err);
		return NULL;
	}
	Py_INCREF(Py_None);
	return Py_None;
}

static char nav_NavCompleteSave__doc__[] =
"(NavTranslationOptions)->None"
;

static PyObject *
nav_NavCompleteSave(navrrobject *self, PyObject *args)
{
	NavTranslationOptions howToTranslate;
	OSErr err;

	if (!PyArg_ParseTuple(args, "l", &howToTranslate))
		return NULL;
	err = NavCompleteSave(&self->itself, howToTranslate);
	if ( err ) {
		PyErr_Mac(ErrorObject, err);
		return NULL;
	}
	Py_INCREF(Py_None);
	return Py_None;
}


static struct PyMethodDef navrr_methods[] = {
 {"NavTranslateFile",	(PyCFunction)nav_NavTranslateFile,	METH_VARARGS,	nav_NavTranslateFile__doc__},
 {"NavCompleteSave",	(PyCFunction)nav_NavCompleteSave,	METH_VARARGS,	nav_NavCompleteSave__doc__},
	
	{NULL,		NULL}		/* sentinel */
};

/* ---------- */


static navrrobject *
newnavrrobject(NavReplyRecord *itself)
{
	navrrobject *self;
	
	self = PyObject_NEW(navrrobject, &Navrrtype);
	if (self == NULL)
		return NULL;
	self->itself = *itself;
	return self;
}


static void
navrr_dealloc(navrrobject *self)
{
	NavDisposeReply(&self->itself);
	PyObject_DEL(self);
}

static PyObject *
navrr_getattr(navrrobject *self, char *name)
{
	FSSpec fss;
	FSRef fsr;
	
	if( strcmp(name, "__members__") == 0 )
		return Py_BuildValue("ssssssssss", "version", "validRecord", "replacing",
			"isStationery", "translationNeeded", "selection", "selection_fsr",
			"fileTranslation", "keyScript", "saveFileName");
	if( strcmp(name, "version") == 0 )
		return Py_BuildValue("h", self->itself.version);
	if( strcmp(name, "validRecord") == 0 )
		return Py_BuildValue("l", (long)self->itself.validRecord);
	if( strcmp(name, "replacing") == 0 )
		return Py_BuildValue("l", (long)self->itself.replacing);
	if( strcmp(name, "isStationery") == 0 )
		return Py_BuildValue("l", (long)self->itself.isStationery);
	if( strcmp(name, "translationNeeded") == 0 )
		return Py_BuildValue("l", (long)self->itself.translationNeeded);
	if( strcmp(name, "selection") == 0 ) {
		SInt32 i, count;
		OSErr err;
		PyObject *rv, *rvitem;
		AEDesc desc;
		
		if (err=AECountItems(&self->itself.selection, &count)) {
			PyErr_Mac(ErrorObject, err);
			return NULL;
		}
		if ( (rv=PyList_New(count)) == NULL )
			return NULL;
		for(i=0; i<count; i++) {
			desc.dataHandle = NULL;
			if (err=AEGetNthDesc(&self->itself.selection, i+1, typeFSS, NULL, &desc)) {
				Py_DECREF(rv);
				PyErr_Mac(ErrorObject, err);
				return NULL;
			}
#if TARGET_API_MAC_CARBON
			if (err=AEGetDescData(&desc, &fss, sizeof(FSSpec))) {
				Py_DECREF(rv);
				PyErr_Mac(ErrorObject, err);
				return NULL;
			}
#else
			memcpy((void *)&fss, (void *)*desc.dataHandle, sizeof(FSSpec));
#endif
			rvitem = PyMac_BuildFSSpec(&fss);
			PyList_SetItem(rv, i, rvitem);
			AEDisposeDesc(&desc);
		}
		return rv;
	}
	if( strcmp(name, "selection_fsr") == 0 ) {
		SInt32 i, count;
		OSErr err;
		PyObject *rv, *rvitem;
		AEDesc desc;
		
		if (err=AECountItems(&self->itself.selection, &count)) {
			PyErr_Mac(ErrorObject, err);
			return NULL;
		}
		if ( (rv=PyList_New(count)) == NULL )
			return NULL;
		for(i=0; i<count; i++) {
			desc.dataHandle = NULL;
			if (err=AEGetNthDesc(&self->itself.selection, i+1, typeFSRef, NULL, &desc)) {
				Py_DECREF(rv);
				PyErr_Mac(ErrorObject, err);
				return NULL;
			}
			if (err=AEGetDescData(&desc, &fsr, sizeof(FSRef))) {
				Py_DECREF(rv);
				PyErr_Mac(ErrorObject, err);
				return NULL;
			}
			rvitem = PyMac_BuildFSRef(&fsr);
			PyList_SetItem(rv, i, rvitem);
			AEDisposeDesc(&desc);
		}
		return rv;
	}
	if( strcmp(name, "fileTranslation") == 0 )
		return ResObj_New((Handle)self->itself.fileTranslation);
	if( strcmp(name, "keyScript") == 0 )
		return Py_BuildValue("h", (short)self->itself.keyScript);
	if( strcmp(name, "saveFileName") == 0 )
		return Py_BuildValue("O&", CFStringRefObj_New, self->itself.saveFileName);


	return Py_FindMethod(navrr_methods, (PyObject *)self, name);
}

static int
navrr_setattr(navrrobject *self, char *name, PyObject *v)
{
	/* Set attribute 'name' to value 'v'. v==NULL means delete */
	
	/* XXXX Add your own setattr code here */
	return -1;
}

static char Navrrtype__doc__[] = 
"Record containing result of a Nav file selection call. Use dir() for member names."
;

static PyTypeObject Navrrtype = {
	PyObject_HEAD_INIT(&PyType_Type)
	0,				/*ob_size*/
	"Nav.NavReplyRecord",			/*tp_name*/
	sizeof(navrrobject),		/*tp_basicsize*/
	0,				/*tp_itemsize*/
	/* methods */
	(destructor)navrr_dealloc,	/*tp_dealloc*/
	(printfunc)0,		/*tp_print*/
	(getattrfunc)navrr_getattr,	/*tp_getattr*/
	(setattrfunc)navrr_setattr,	/*tp_setattr*/
	(cmpfunc)0,		/*tp_compare*/
	(reprfunc)0,		/*tp_repr*/
	0,			/*tp_as_number*/
	0,		/*tp_as_sequence*/
	0,		/*tp_as_mapping*/
	(hashfunc)0,		/*tp_hash*/
	(ternaryfunc)0,		/*tp_call*/
	(reprfunc)0,		/*tp_str*/

	/* Space for future expansion */
	0L,0L,0L,0L,
	Navrrtype__doc__ /* Documentation string */
};

/* End of code for NavReplyRecord objects */
		
/* ----------------------------------------------------- */

static char nav_NavGetFile__doc__[] =
"(DialogOptions dict or kwargs+defaultLocation,eventProc,previewProc,filterProc,typeList) -> NavReplyRecord"
;

static PyObject *
nav_NavGetFile(PyObject *self, PyObject *args, PyObject *kw)
{
	PyObject *dict;
	AEDesc	*defaultLocation = NULL;
	NavReplyRecord reply;
	NavDialogOptions dialogOptions;
	NavEventUPP eventProc = NULL;
	NavPreviewUPP previewProc = NULL;
	NavObjectFilterUPP filterProc = NULL;
	NavTypeListHandle typeList = NULL;
	OSErr err;

	if ( kw && PyObject_IsTrue(kw) ) {
		if (!PyArg_ParseTuple(args, ";either keyword arguments or dictionary expected"))
			return NULL;
		dict = kw;
	} else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
		return NULL;
	if (!filldialogoptions(dict, &defaultLocation, &dialogOptions, &eventProc, &previewProc, &filterProc, &typeList, NULL, NULL))
		return NULL;
	err = NavGetFile(defaultLocation, &reply, &dialogOptions,
			eventProc, previewProc, filterProc, typeList, (void *)dict);
	PyMem_DEL(defaultLocation);
	if ( err ) {
		PyErr_Mac(ErrorObject, err);
		return NULL;
	}
	return (PyObject *)newnavrrobject(&reply);
}

static char nav_NavPutFile__doc__[] =
"(DialogOptions dict or kwargs+defaultLocation,eventProc,fileCreator,fileType) -> NavReplyRecord"
;

static PyObject *
nav_NavPutFile(PyObject *self, PyObject *args, PyObject *kw)
{
	PyObject *dict;
	AEDesc	*defaultLocation = NULL;
	NavReplyRecord reply;
	NavDialogOptions dialogOptions;
	NavEventUPP eventProc = NULL;
	OSType fileType;
	OSType fileCreator;
	OSErr err;

	if ( kw && PyObject_IsTrue(kw) ) {
		if (!PyArg_ParseTuple(args, ";either keyword arguments or dictionary expected"))
			return NULL;
		dict = kw;
	} else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
		return NULL;
	if (!filldialogoptions(dict, &defaultLocation, &dialogOptions, &eventProc, NULL, NULL, NULL, &fileType, &fileCreator))
		return NULL;
	err = NavPutFile(defaultLocation, &reply, &dialogOptions,
			eventProc, fileType, fileCreator, (void *)dict);
	PyMem_DEL(defaultLocation);
	if ( err ) {
		PyErr_Mac(ErrorObject, err);
		return NULL;
	}
	return (PyObject *)newnavrrobject(&reply);
}

static char nav_NavAskSaveChanges__doc__[] =
"(NavAskSaveChangesAction, DialogOptions dict or kwargs+eventProc) -> NavAskSaveChangesResult"

;

static PyObject *
nav_NavAskSaveChanges(PyObject *self, PyObject *args, PyObject *kw)
{
	PyObject *dict;
	NavDialogOptions dialogOptions;
	NavAskSaveChangesAction action;
	NavAskSaveChangesResult reply;
	NavEventUPP eventProc = NULL;
	OSErr err;

	if ( kw && PyObject_IsTrue(kw) ) {
		if (!PyArg_ParseTuple(args, "l", &action))
			return NULL;
		dict = kw;
	} else if (!PyArg_ParseTuple(args, "lO!", &action, &PyDict_Type, &dict))
		return NULL;
	if (!filldialogoptions(dict, NULL, &dialogOptions, &eventProc, NULL, NULL, NULL, NULL, NULL))
		return NULL;
	err = NavAskSaveChanges(&dialogOptions, action, &reply, eventProc, (void *)dict);
	if ( err ) {
		PyErr_Mac(ErrorObject, err);
		return NULL;
	}
	return Py_BuildValue("l", (long)reply);
}

static char nav_NavCustomAskSaveChanges__doc__[] =
"(DialogOptions dict or kwargs+eventProc) -> NavAskSaveChangesResult"
;

static PyObject *
nav_NavCustomAskSaveChanges(PyObject *self, PyObject *args, PyObject *kw)
{
	PyObject *dict;
	NavDialogOptions dialogOptions;
	NavAskSaveChangesResult reply;
	NavEventUPP eventProc = NULL;
	OSErr err;

	if ( kw && PyObject_IsTrue(kw) ) {
		if (!PyArg_ParseTuple(args, ";either keyword arguments or dictionary expected"))
			return NULL;
		dict = kw;
	} else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
		return NULL;
	if (!filldialogoptions(dict, NULL, &dialogOptions, &eventProc, NULL, NULL, NULL, NULL, NULL))
		return NULL;
	err = NavCustomAskSaveChanges(&dialogOptions, &reply, eventProc, (void *)dict);
	if ( err ) {
		PyErr_Mac(ErrorObject, err);
		return NULL;
	}
	return Py_BuildValue("l", (long)reply);
}

static char nav_NavAskDiscardChanges__doc__[] =
"(DialogOptions dict or kwargs+eventProc) -> NavAskSaveChangesResult"
;

static PyObject *
nav_NavAskDiscardChanges(PyObject *self, PyObject *args, PyObject *kw)
{
	PyObject *dict;
	NavDialogOptions dialogOptions;
	NavAskSaveChangesResult reply;
	NavEventUPP eventProc = NULL;
	OSErr err;

	if ( kw && PyObject_IsTrue(kw) ) {
		if (!PyArg_ParseTuple(args, ";either keyword arguments or dictionary expected"))
			return NULL;
		dict = kw;
	} else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
		return NULL;
	if (!filldialogoptions(dict, NULL, &dialogOptions, &eventProc, NULL, NULL, NULL, NULL, NULL))
		return NULL;
	err = NavAskDiscardChanges(&dialogOptions, &reply, eventProc, (void *)dict);
	if ( err ) {
		PyErr_Mac(ErrorObject, err);
		return NULL;
	}
	return Py_BuildValue("l", (long)reply);
}

static char nav_NavChooseFile__doc__[] =
"(DialogOptions dict or kwargs+defaultLocation,eventProc,previewProc,filterProc,typeList) -> NavReplyRecord"
;

static PyObject *
nav_NavChooseFile(PyObject *self, PyObject *args, PyObject *kw)
{
	PyObject *dict;
	AEDesc	*defaultLocation = NULL;
	NavReplyRecord reply;
	NavDialogOptions dialogOptions;
	NavEventUPP eventProc = NULL;
	NavPreviewUPP previewProc = NULL;
	NavObjectFilterUPP filterProc = NULL;
	NavTypeListHandle typeList = NULL;
	OSErr err;

	if ( kw && PyObject_IsTrue(kw) ) {
		if (!PyArg_ParseTuple(args, ";either keyword arguments or dictionary expected"))
			return NULL;
		dict = kw;
	} else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
		return NULL;
	if (!filldialogoptions(dict, &defaultLocation, &dialogOptions, &eventProc, &previewProc, &filterProc, &typeList, NULL, NULL))
		return NULL;
	err = NavChooseFile(defaultLocation, &reply, &dialogOptions,
			eventProc, previewProc, filterProc, typeList, (void *)dict);
	PyMem_DEL(defaultLocation);
	if ( err ) {
		PyErr_Mac(ErrorObject, err);
		return NULL;
	}
	return (PyObject *)newnavrrobject(&reply);
}

static char nav_NavChooseFolder__doc__[] =
"(DialogOptions dict or kwargs+defaultLocation,eventProc,filterProc) -> NavReplyRecord"
;

static PyObject *
nav_NavChooseFolder(PyObject *self, PyObject *args, PyObject *kw)
{
	PyObject *dict;
	AEDesc	*defaultLocation = NULL;
	NavReplyRecord reply;
	NavDialogOptions dialogOptions;
	NavEventUPP eventProc = NULL;
	NavObjectFilterUPP filterProc = NULL;
	OSErr err;

	if ( kw && PyObject_IsTrue(kw) ) {
		if (!PyArg_ParseTuple(args, ";either keyword arguments or dictionary expected"))
			return NULL;
		dict = kw;
	} else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
		return NULL;
	if (!filldialogoptions(dict, &defaultLocation, &dialogOptions, &eventProc, NULL, &filterProc, NULL, NULL, NULL))
		return NULL;
	err = NavChooseFolder(defaultLocation, &reply, &dialogOptions,
			eventProc, filterProc, (void *)dict);
	PyMem_DEL(defaultLocation);
	if ( err ) {
		PyErr_Mac(ErrorObject, err);
		return NULL;
	}
	return (PyObject *)newnavrrobject(&reply);
}

static char nav_NavChooseVolume__doc__[] =
"(DialogOptions dict or kwargs+defaultLocation,eventProc,filterProc) -> NavReplyRecord"
;

static PyObject *
nav_NavChooseVolume(PyObject *self, PyObject *args, PyObject *kw)
{
	PyObject *dict;
	AEDesc	*defaultLocation = NULL;
	NavReplyRecord reply;
	NavDialogOptions dialogOptions;
	NavEventUPP eventProc = NULL;
	NavObjectFilterUPP filterProc = NULL;
	OSErr err;

	if ( kw && PyObject_IsTrue(kw) ) {
		if (!PyArg_ParseTuple(args, ";either keyword arguments or dictionary expected"))
			return NULL;
		dict = kw;
	} else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
		return NULL;
	if (!filldialogoptions(dict, &defaultLocation, &dialogOptions, &eventProc, NULL, &filterProc, NULL, NULL, NULL))
		return NULL;
	err = NavChooseVolume(defaultLocation, &reply, &dialogOptions,
			eventProc, filterProc, (void *)dict);
	PyMem_DEL(defaultLocation);
	if ( err ) {
		PyErr_Mac(ErrorObject, err);
		return NULL;
	}
	return (PyObject *)newnavrrobject(&reply);
}

static char nav_NavChooseObject__doc__[] =
"(DialogOptions dict or kwargs+defaultLocation,eventProc,filterProc) -> NavReplyRecord"
;

static PyObject *
nav_NavChooseObject(PyObject *self, PyObject *args, PyObject *kw)
{
	PyObject *dict;
	AEDesc	*defaultLocation = NULL;
	NavReplyRecord reply;
	NavDialogOptions dialogOptions;
	NavEventUPP eventProc = NULL;
	NavObjectFilterUPP filterProc = NULL;
	OSErr err;

	if ( kw && PyObject_IsTrue(kw) ) {
		if (!PyArg_ParseTuple(args, ";either keyword arguments or dictionary expected"))
			return NULL;
		dict = kw;
	} else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
		return NULL;
	if (!filldialogoptions(dict, &defaultLocation, &dialogOptions, &eventProc, NULL, &filterProc, NULL, NULL, NULL))
		return NULL;
	err = NavChooseObject(defaultLocation, &reply, &dialogOptions,
			eventProc, filterProc, (void *)dict);
	PyMem_DEL(defaultLocation);
	if ( err ) {
		PyErr_Mac(ErrorObject, err);
		return NULL;
	}
	return (PyObject *)newnavrrobject(&reply);
}

static char nav_NavNewFolder__doc__[] =
"(DialogOptions dict or kwargs+defaultLocation,eventProc) -> NavReplyRecord"
;

static PyObject *
nav_NavNewFolder(PyObject *self, PyObject *args, PyObject *kw)
{
	PyObject *dict;
	AEDesc	*defaultLocation = NULL;
	NavReplyRecord reply;
	NavDialogOptions dialogOptions;
	NavEventUPP eventProc = NULL;
	OSErr err;

	if ( kw && PyObject_IsTrue(kw) ) {
		if (!PyArg_ParseTuple(args, ";either keyword arguments or dictionary expected"))
			return NULL;
		dict = kw;
	} else if (!PyArg_ParseTuple(args, "O!", &PyDict_Type, &dict))
		return NULL;
	if (!filldialogoptions(dict, &defaultLocation, &dialogOptions, &eventProc, NULL, NULL, NULL, NULL, NULL))
		return NULL;
	err = NavNewFolder(defaultLocation, &reply, &dialogOptions, eventProc, (void *)dict);
	PyMem_DEL(defaultLocation);
	if ( err ) {
		PyErr_Mac(ErrorObject, err);
		return NULL;
	}
	return (PyObject *)newnavrrobject(&reply);
}

#if 0
/* XXXX I don't know what to do with the void * argument */
static char nav_NavCustomControl__doc__[] =
""
;


static PyObject *
nav_NavCustomControl(PyObject *self, PyObject *args)
{

	if (!PyArg_ParseTuple(args, ""))
		return NULL;
	Py_INCREF(Py_None);
	return Py_None;
}
#endif

static char nav_NavServicesCanRun__doc__[] =
"()->int"
;

static PyObject *
nav_NavServicesCanRun(PyObject *self, PyObject *args)
{
	Boolean rv;
	if (!PyArg_ParseTuple(args, ""))
		return NULL;
	rv = NavServicesCanRun();
	return Py_BuildValue("l", (long)rv);
}

static char nav_NavServicesAvailable__doc__[] =
"()->int"
;

static PyObject *
nav_NavServicesAvailable(PyObject *self, PyObject *args)
{
	Boolean rv;
	
	if (!PyArg_ParseTuple(args, ""))
		return NULL;
	rv = NavServicesAvailable();
	return Py_BuildValue("l", (long)rv);
}
/* XX */
static char nav_NavLoad__doc__[] =
"()->None"
;

static PyObject *
nav_NavLoad(PyObject *self, PyObject *args)
{

	if (!PyArg_ParseTuple(args, ""))
		return NULL;
	NavLoad();
	Py_INCREF(Py_None);
	return Py_None;
}

static char nav_NavUnload__doc__[] =
"()->None"
;

static PyObject *
nav_NavUnload(PyObject *self, PyObject *args)
{

	if (!PyArg_ParseTuple(args, ""))
		return NULL;
	NavUnload();
	Py_INCREF(Py_None);
	return Py_None;
}

static char nav_NavLibraryVersion__doc__[] =
"()->int"
;

static PyObject *
nav_NavLibraryVersion(PyObject *self, PyObject *args)
{
	UInt32 rv;
	
	if (!PyArg_ParseTuple(args, ""))
		return NULL;
	rv = NavLibraryVersion();
	return Py_BuildValue("l", (long)rv);
}

static char nav_NavGetDefaultDialogOptions__doc__[] =
"()->dict\nPass dict or keyword args with same names to other calls."
;

static PyObject *
nav_NavGetDefaultDialogOptions(PyObject *self, PyObject *args)
{
	NavDialogOptions dialogOptions;
	OSErr err;
	
	err = NavGetDefaultDialogOptions(&dialogOptions);
	if ( err ) {
		PyErr_Mac(ErrorObject, err);
		return NULL;
	}
	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&}",
		"version", dialogOptions.version,
		"dialogOptionFlags", dialogOptions.dialogOptionFlags,
		"location", PyMac_BuildPoint, dialogOptions.location,
		"clientName", PyMac_BuildStr255, &dialogOptions.clientName,
		"windowTitle", PyMac_BuildStr255, &dialogOptions.windowTitle,
		"actionButtonLabel", PyMac_BuildStr255, &dialogOptions.actionButtonLabel,
		"cancelButtonLabel", PyMac_BuildStr255, &dialogOptions.cancelButtonLabel,
		"savedFileName", PyMac_BuildStr255, &dialogOptions.savedFileName,
		"message", PyMac_BuildStr255, &dialogOptions.message,
		"preferenceKey", PyMac_BuildOSType, dialogOptions.preferenceKey,
		"popupExtension", OptResObj_New, dialogOptions.popupExtension);
}

/* List of methods defined in the module */

static struct PyMethodDef nav_methods[] = {
	{"NavGetFile",	(PyCFunction)nav_NavGetFile,	METH_VARARGS|METH_KEYWORDS,	nav_NavGetFile__doc__},
 {"NavPutFile",	(PyCFunction)nav_NavPutFile,	METH_VARARGS|METH_KEYWORDS,	nav_NavPutFile__doc__},
 {"NavAskSaveChanges",	(PyCFunction)nav_NavAskSaveChanges,	METH_VARARGS|METH_KEYWORDS,	nav_NavAskSaveChanges__doc__},
 {"NavCustomAskSaveChanges",	(PyCFunction)nav_NavCustomAskSaveChanges,	METH_VARARGS|METH_KEYWORDS,	nav_NavCustomAskSaveChanges__doc__},
 {"NavAskDiscardChanges",	(PyCFunction)nav_NavAskDiscardChanges,	METH_VARARGS|METH_KEYWORDS,	nav_NavAskDiscardChanges__doc__},
 {"NavChooseFile",	(PyCFunction)nav_NavChooseFile,	METH_VARARGS|METH_KEYWORDS,	nav_NavChooseFile__doc__},
 {"NavChooseFolder",	(PyCFunction)nav_NavChooseFolder,	METH_VARARGS|METH_KEYWORDS,	nav_NavChooseFolder__doc__},
 {"NavChooseVolume",	(PyCFunction)nav_NavChooseVolume,	METH_VARARGS|METH_KEYWORDS,	nav_NavChooseVolume__doc__},
 {"NavChooseObject",	(PyCFunction)nav_NavChooseObject,	METH_VARARGS|METH_KEYWORDS,	nav_NavChooseObject__doc__},
 {"NavNewFolder",	(PyCFunction)nav_NavNewFolder,	METH_VARARGS|METH_KEYWORDS,	nav_NavNewFolder__doc__},
#if 0
 {"NavCustomControl",	(PyCFunction)nav_NavCustomControl,	METH_VARARGS,	nav_NavCustomControl__doc__},
#endif
 {"NavServicesCanRun",	(PyCFunction)nav_NavServicesCanRun,	METH_VARARGS,	nav_NavServicesCanRun__doc__},
 {"NavServicesAvailable",	(PyCFunction)nav_NavServicesAvailable,	METH_VARARGS,	nav_NavServicesAvailable__doc__},
 {"NavLoad",	(PyCFunction)nav_NavLoad,	METH_VARARGS,	nav_NavLoad__doc__},
 {"NavUnload",	(PyCFunction)nav_NavUnload,	METH_VARARGS,	nav_NavUnload__doc__},
 {"NavLibraryVersion",	(PyCFunction)nav_NavLibraryVersion,	METH_VARARGS,	nav_NavLibraryVersion__doc__},
 {"NavGetDefaultDialogOptions",	(PyCFunction)nav_NavGetDefaultDialogOptions,	METH_VARARGS,	nav_NavGetDefaultDialogOptions__doc__},
	{NULL,	 (PyCFunction)NULL, 0, NULL}		/* sentinel */
};


/* Initialization function for the module (*must* be called initNav) */

static char Nav_module_documentation[] = 
"Interface to Navigation Services\n"
"Most calls accept a NavDialogOptions dictionary or keywords with the same names, pass {}\n"
"if you want the default options.\n"
"Use NavGetDefaultDialogOptions() to find out common option names.\n"
"See individual docstrings for additional keyword args/dictentries supported by each call.\n"
"Pass None as eventProc to get movable-modal dialogs that process updates through the standard Python mechanism."
;

void
initNav(void)
{
	PyObject *m, *d;

	/* Test that we have NavServices */
	if ( !NavServicesAvailable() ) {
		PyErr_SetString(PyExc_ImportError, "Navigation Services not available");
		return;
	}
	/* Create the module and add the functions */
	m = Py_InitModule4("Nav", nav_methods,
		Nav_module_documentation,
		(PyObject*)NULL,PYTHON_API_VERSION);

	/* Add some symbolic constants to the module */
	d = PyModule_GetDict(m);
	ErrorObject = PyString_FromString("Nav.error");
	PyDict_SetItemString(d, "error", ErrorObject);

	/* XXXX Add constants here */
	
	/* Set UPPs */
	my_eventProcUPP = NewNavEventUPP(my_eventProc);
	my_previewProcUPP = NewNavPreviewUPP(my_previewProc);
	my_filterProcUPP = NewNavObjectFilterUPP(my_filterProc);
	
}

