| 
									
										
										
										
											1994-09-16 10:54:21 +00:00
										 |  |  | /***********************************************************
 | 
					
						
							| 
									
										
										
										
											1997-01-31 16:15:11 +00:00
										 |  |  | Copyright 1991-1997 by Stichting Mathematisch Centrum, Amsterdam, | 
					
						
							| 
									
										
										
										
											1995-01-08 14:33:34 +00:00
										 |  |  | The Netherlands. | 
					
						
							| 
									
										
										
										
											1994-09-16 10:54:21 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |                         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 not be used in advertising or publicity pertaining to | 
					
						
							|  |  |  | distribution of the software without specific, written prior permission. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO | 
					
						
							|  |  |  | THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND | 
					
						
							|  |  |  | FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM 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. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ******************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Macintosh OS-specific interface */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "Python.h"
 | 
					
						
							| 
									
										
										
										
											1994-12-14 14:02:24 +00:00
										 |  |  | #include "macglue.h"
 | 
					
						
							| 
									
										
										
										
											2000-10-12 21:24:05 +00:00
										 |  |  | #include "pythonresources.h"
 | 
					
						
							| 
									
										
										
										
											1994-09-16 10:54:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-05-19 12:34:59 +00:00
										 |  |  | #ifdef WITHOUT_FRAMEWORKS
 | 
					
						
							| 
									
										
										
										
											1995-01-27 14:43:25 +00:00
										 |  |  | #include <Windows.h>
 | 
					
						
							| 
									
										
										
										
											1996-02-29 16:11:32 +00:00
										 |  |  | #include <Files.h>
 | 
					
						
							| 
									
										
										
										
											1996-09-30 14:43:22 +00:00
										 |  |  | #include <LowMem.h>
 | 
					
						
							| 
									
										
										
										
											1998-02-20 15:59:59 +00:00
										 |  |  | #include <Sound.h>
 | 
					
						
							| 
									
										
										
										
											2000-06-02 21:35:07 +00:00
										 |  |  | #include <Events.h>
 | 
					
						
							| 
									
										
										
										
											2001-05-19 12:34:59 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  | #include <Carbon/Carbon.h>
 | 
					
						
							| 
									
										
										
										
											2003-02-21 16:31:11 +00:00
										 |  |  | #include <ApplicationServices/ApplicationServices.h>
 | 
					
						
							| 
									
										
										
										
											2001-05-19 12:34:59 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1995-01-27 14:43:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-09-16 10:54:21 +00:00
										 |  |  | static PyObject *MacOS_Error; /* Exception MacOS.Error */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-09-10 22:00:39 +00:00
										 |  |  | #ifdef TARGET_API_MAC_OSX
 | 
					
						
							|  |  |  | #define PATHNAMELEN 1024
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #define PATHNAMELEN 256
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-02-21 21:01:05 +00:00
										 |  |  | #ifdef MPW
 | 
					
						
							| 
									
										
										
										
											1995-02-18 15:02:02 +00:00
										 |  |  | #define bufferIsSmall -607	/*error returns from Post and Accept */
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-02-29 16:11:32 +00:00
										 |  |  | /* ----------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Declarations for objects of type Resource fork */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct { | 
					
						
							|  |  |  | 	PyObject_HEAD | 
					
						
							|  |  |  | 	short fRefNum; | 
					
						
							|  |  |  | 	int isclosed; | 
					
						
							|  |  |  | } rfobject; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2002-07-17 16:30:39 +00:00
										 |  |  | static PyTypeObject Rftype; | 
					
						
							| 
									
										
										
										
											1996-02-29 16:11:32 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ---------------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2001-08-08 13:46:49 +00:00
										 |  |  | do_close(rfobject *self) | 
					
						
							| 
									
										
										
										
											1996-02-29 16:11:32 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	if (self->isclosed ) return; | 
					
						
							|  |  |  | 	(void)FSClose(self->fRefNum); | 
					
						
							|  |  |  | 	self->isclosed = 1; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static char rf_read__doc__[] =  | 
					
						
							|  |  |  | "Read data from resource fork" | 
					
						
							|  |  |  | ; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2001-08-08 13:46:49 +00:00
										 |  |  | rf_read(rfobject *self, PyObject *args) | 
					
						
							| 
									
										
										
										
											1996-02-29 16:11:32 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	long n; | 
					
						
							|  |  |  | 	PyObject *v; | 
					
						
							|  |  |  | 	OSErr err; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	if (self->isclosed) { | 
					
						
							|  |  |  | 		PyErr_SetString(PyExc_ValueError, "Operation on closed file"); | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	if (!PyArg_ParseTuple(args, "l", &n)) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	v = PyString_FromStringAndSize((char *)NULL, n); | 
					
						
							|  |  |  | 	if (v == NULL) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	err = FSRead(self->fRefNum, &n, PyString_AsString(v)); | 
					
						
							|  |  |  | 	if (err && err != eofErr) { | 
					
						
							|  |  |  | 		PyMac_Error(err); | 
					
						
							|  |  |  | 		Py_DECREF(v); | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	_PyString_Resize(&v, n); | 
					
						
							|  |  |  | 	return v; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static char rf_write__doc__[] =  | 
					
						
							|  |  |  | "Write to resource fork" | 
					
						
							|  |  |  | ; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2001-08-08 13:46:49 +00:00
										 |  |  | rf_write(rfobject *self, PyObject *args) | 
					
						
							| 
									
										
										
										
											1996-02-29 16:11:32 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	char *buffer; | 
					
						
							|  |  |  | 	long size; | 
					
						
							|  |  |  | 	OSErr err; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	if (self->isclosed) { | 
					
						
							|  |  |  | 		PyErr_SetString(PyExc_ValueError, "Operation on closed file"); | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											1997-05-07 15:46:31 +00:00
										 |  |  | 	if (!PyArg_ParseTuple(args, "s#", &buffer, &size)) | 
					
						
							| 
									
										
										
										
											1996-02-29 16:11:32 +00:00
										 |  |  | 		return NULL; | 
					
						
							|  |  |  | 	err = FSWrite(self->fRefNum, &size, buffer); | 
					
						
							|  |  |  | 	if (err) { | 
					
						
							|  |  |  | 		PyMac_Error(err); | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	Py_INCREF(Py_None); | 
					
						
							|  |  |  | 	return Py_None; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static char rf_seek__doc__[] =  | 
					
						
							|  |  |  | "Set file position" | 
					
						
							|  |  |  | ; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2001-08-08 13:46:49 +00:00
										 |  |  | rf_seek(rfobject *self, PyObject *args) | 
					
						
							| 
									
										
										
										
											1996-02-29 16:11:32 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	long amount, pos; | 
					
						
							|  |  |  | 	int whence = SEEK_SET; | 
					
						
							|  |  |  | 	long eof; | 
					
						
							|  |  |  | 	OSErr err; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	if (self->isclosed) { | 
					
						
							|  |  |  | 		PyErr_SetString(PyExc_ValueError, "Operation on closed file"); | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (!PyArg_ParseTuple(args, "l|i", &amount, &whence)) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2001-08-08 13:46:49 +00:00
										 |  |  | 	if ((err = GetEOF(self->fRefNum, &eof))) | 
					
						
							| 
									
										
										
										
											1996-02-29 16:11:32 +00:00
										 |  |  | 		goto ioerr; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	switch (whence) { | 
					
						
							|  |  |  | 	case SEEK_CUR: | 
					
						
							| 
									
										
										
										
											2001-08-08 13:46:49 +00:00
										 |  |  | 		if ((err = GetFPos(self->fRefNum, &pos))) | 
					
						
							| 
									
										
										
										
											1996-02-29 16:11:32 +00:00
										 |  |  | 			goto ioerr;  | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case SEEK_END: | 
					
						
							|  |  |  | 		pos = eof; | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case SEEK_SET: | 
					
						
							|  |  |  | 		pos = 0; | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	default: | 
					
						
							|  |  |  | 		PyErr_BadArgument(); | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	pos += amount; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	/* Don't bother implementing seek past EOF */ | 
					
						
							|  |  |  | 	if (pos > eof || pos < 0) { | 
					
						
							|  |  |  | 		PyErr_BadArgument(); | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2001-08-08 13:46:49 +00:00
										 |  |  | 	if ((err = SetFPos(self->fRefNum, fsFromStart, pos)) ) { | 
					
						
							| 
									
										
										
										
											1996-02-29 16:11:32 +00:00
										 |  |  | ioerr: | 
					
						
							|  |  |  | 		PyMac_Error(err); | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	Py_INCREF(Py_None); | 
					
						
							|  |  |  | 	return Py_None; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static char rf_tell__doc__[] =  | 
					
						
							|  |  |  | "Get file position" | 
					
						
							|  |  |  | ; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2001-08-08 13:46:49 +00:00
										 |  |  | rf_tell(rfobject *self, PyObject *args) | 
					
						
							| 
									
										
										
										
											1996-02-29 16:11:32 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	long where; | 
					
						
							|  |  |  | 	OSErr err; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	if (self->isclosed) { | 
					
						
							|  |  |  | 		PyErr_SetString(PyExc_ValueError, "Operation on closed file"); | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if (!PyArg_ParseTuple(args, "")) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											2001-08-08 13:46:49 +00:00
										 |  |  | 	if ((err = GetFPos(self->fRefNum, &where)) ) { | 
					
						
							| 
									
										
										
										
											1996-02-29 16:11:32 +00:00
										 |  |  | 		PyMac_Error(err); | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return PyInt_FromLong(where); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static char rf_close__doc__[] =  | 
					
						
							|  |  |  | "Close resource fork" | 
					
						
							|  |  |  | ; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2001-08-08 13:46:49 +00:00
										 |  |  | rf_close(rfobject *self, PyObject *args) | 
					
						
							| 
									
										
										
										
											1996-02-29 16:11:32 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	if (!PyArg_ParseTuple(args, "")) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	do_close(self); | 
					
						
							|  |  |  | 	Py_INCREF(Py_None); | 
					
						
							|  |  |  | 	return Py_None; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static struct PyMethodDef rf_methods[] = { | 
					
						
							| 
									
										
										
										
											2001-08-08 13:46:49 +00:00
										 |  |  |  {"read",	(PyCFunction)rf_read,	1,	rf_read__doc__}, | 
					
						
							|  |  |  |  {"write",	(PyCFunction)rf_write,	1,	rf_write__doc__}, | 
					
						
							|  |  |  |  {"seek",	(PyCFunction)rf_seek,	1,	rf_seek__doc__}, | 
					
						
							|  |  |  |  {"tell",	(PyCFunction)rf_tell,	1,	rf_tell__doc__}, | 
					
						
							|  |  |  |  {"close",	(PyCFunction)rf_close,	1,	rf_close__doc__}, | 
					
						
							| 
									
										
										
										
											1996-02-29 16:11:32 +00:00
										 |  |  |   | 
					
						
							|  |  |  | 	{NULL,		NULL}		/* sentinel */ | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* ---------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static rfobject * | 
					
						
							| 
									
										
										
										
											2001-08-08 13:46:49 +00:00
										 |  |  | newrfobject(void) | 
					
						
							| 
									
										
										
										
											1996-02-29 16:11:32 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	rfobject *self; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	self = PyObject_NEW(rfobject, &Rftype); | 
					
						
							|  |  |  | 	if (self == NULL) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	self->isclosed = 1; | 
					
						
							|  |  |  | 	return self; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void | 
					
						
							| 
									
										
										
										
											2001-08-08 13:46:49 +00:00
										 |  |  | rf_dealloc(rfobject *self) | 
					
						
							| 
									
										
										
										
											1996-02-29 16:11:32 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	do_close(self); | 
					
						
							| 
									
										
										
										
											2002-05-22 14:31:48 +00:00
										 |  |  | 	PyObject_DEL(self); | 
					
						
							| 
									
										
										
										
											1996-02-29 16:11:32 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2001-08-08 13:46:49 +00:00
										 |  |  | rf_getattr(rfobject *self, char *name) | 
					
						
							| 
									
										
										
										
											1996-02-29 16:11:32 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	return Py_FindMethod(rf_methods, (PyObject *)self, name); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static char Rftype__doc__[] =  | 
					
						
							|  |  |  | "Resource fork file object" | 
					
						
							|  |  |  | ; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyTypeObject Rftype = { | 
					
						
							|  |  |  | 	PyObject_HEAD_INIT(&PyType_Type) | 
					
						
							|  |  |  | 	0,				/*ob_size*/ | 
					
						
							| 
									
										
										
										
											2001-12-08 18:02:58 +00:00
										 |  |  | 	"MacOS.ResourceFork",		/*tp_name*/ | 
					
						
							| 
									
										
										
										
											1996-02-29 16:11:32 +00:00
										 |  |  | 	sizeof(rfobject),		/*tp_basicsize*/ | 
					
						
							|  |  |  | 	0,				/*tp_itemsize*/ | 
					
						
							|  |  |  | 	/* methods */ | 
					
						
							|  |  |  | 	(destructor)rf_dealloc,	/*tp_dealloc*/ | 
					
						
							|  |  |  | 	(printfunc)0,		/*tp_print*/ | 
					
						
							|  |  |  | 	(getattrfunc)rf_getattr,	/*tp_getattr*/ | 
					
						
							|  |  |  | 	(setattrfunc)0,	/*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, | 
					
						
							|  |  |  | 	Rftype__doc__ /* Documentation string */ | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* End of code for Resource fork objects */ | 
					
						
							|  |  |  | /* -------------------------------------------------------- */ | 
					
						
							| 
									
										
										
										
											1994-09-16 10:54:21 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-09 13:20:04 +00:00
										 |  |  | /*----------------------------------------------------------------------*/ | 
					
						
							|  |  |  | /* Miscellaneous File System Operations */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-06-03 15:29:41 +00:00
										 |  |  | static char getcrtp_doc[] = "Obsolete, use macfs module"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-09 13:20:04 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											1995-01-22 18:42:12 +00:00
										 |  |  | MacOS_GetCreatorAndType(PyObject *self, PyObject *args) | 
					
						
							| 
									
										
										
										
											1995-01-09 13:20:04 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2000-06-02 21:35:07 +00:00
										 |  |  | 	FSSpec fss; | 
					
						
							| 
									
										
										
										
											1995-01-09 13:20:04 +00:00
										 |  |  | 	FInfo info; | 
					
						
							| 
									
										
										
										
											1995-01-22 18:42:12 +00:00
										 |  |  | 	PyObject *creator, *type, *res; | 
					
						
							| 
									
										
										
										
											1995-01-09 13:20:04 +00:00
										 |  |  | 	OSErr err; | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2000-06-02 21:35:07 +00:00
										 |  |  | 	if (!PyArg_ParseTuple(args, "O&", PyMac_GetFSSpec, &fss)) | 
					
						
							| 
									
										
										
										
											1995-01-09 13:20:04 +00:00
										 |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											2000-06-02 21:35:07 +00:00
										 |  |  | 	if ((err = FSpGetFInfo(&fss, &info)) != noErr) | 
					
						
							| 
									
										
										
										
											1995-01-22 18:42:12 +00:00
										 |  |  | 		return PyErr_Mac(MacOS_Error, err); | 
					
						
							| 
									
										
										
										
											1995-01-09 13:20:04 +00:00
										 |  |  | 	creator = PyString_FromStringAndSize((char *)&info.fdCreator, 4); | 
					
						
							| 
									
										
										
										
											1995-01-22 18:42:12 +00:00
										 |  |  | 	type = PyString_FromStringAndSize((char *)&info.fdType, 4); | 
					
						
							|  |  |  | 	res = Py_BuildValue("OO", creator, type); | 
					
						
							| 
									
										
										
										
											1995-01-12 12:37:24 +00:00
										 |  |  | 	Py_DECREF(creator); | 
					
						
							| 
									
										
										
										
											1995-01-22 18:42:12 +00:00
										 |  |  | 	Py_DECREF(type); | 
					
						
							| 
									
										
										
										
											1995-01-09 13:20:04 +00:00
										 |  |  | 	return res; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-06-03 15:29:41 +00:00
										 |  |  | static char setcrtp_doc[] = "Obsolete, use macfs module"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-09 13:20:04 +00:00
										 |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											1995-01-22 18:42:12 +00:00
										 |  |  | MacOS_SetCreatorAndType(PyObject *self, PyObject *args) | 
					
						
							| 
									
										
										
										
											1995-01-09 13:20:04 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2000-06-02 21:35:07 +00:00
										 |  |  | 	FSSpec fss; | 
					
						
							| 
									
										
										
										
											1995-01-22 18:42:12 +00:00
										 |  |  | 	ResType creator, type; | 
					
						
							| 
									
										
										
										
											1995-01-09 13:20:04 +00:00
										 |  |  | 	FInfo info; | 
					
						
							|  |  |  | 	OSErr err; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	if (!PyArg_ParseTuple(args, "O&O&O&", | 
					
						
							| 
									
										
										
										
											2000-06-02 21:35:07 +00:00
										 |  |  | 			PyMac_GetFSSpec, &fss, PyMac_GetOSType, &creator, PyMac_GetOSType, &type)) | 
					
						
							| 
									
										
										
										
											1995-01-09 13:20:04 +00:00
										 |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											2000-06-02 21:35:07 +00:00
										 |  |  | 	if ((err = FSpGetFInfo(&fss, &info)) != noErr) | 
					
						
							| 
									
										
										
										
											1995-01-22 18:42:12 +00:00
										 |  |  | 		return PyErr_Mac(MacOS_Error, err); | 
					
						
							| 
									
										
										
										
											1995-01-09 13:20:04 +00:00
										 |  |  | 	info.fdCreator = creator; | 
					
						
							| 
									
										
										
										
											1995-01-22 18:42:12 +00:00
										 |  |  | 	info.fdType = type; | 
					
						
							| 
									
										
										
										
											2000-06-02 21:35:07 +00:00
										 |  |  | 	if ((err = FSpSetFInfo(&fss, &info)) != noErr) | 
					
						
							| 
									
										
										
										
											1995-01-22 18:42:12 +00:00
										 |  |  | 		return PyErr_Mac(MacOS_Error, err); | 
					
						
							| 
									
										
										
										
											1995-01-09 13:20:04 +00:00
										 |  |  | 	Py_INCREF(Py_None); | 
					
						
							|  |  |  | 	return Py_None; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-05-19 12:50:05 +00:00
										 |  |  | #if !TARGET_API_MAC_OSX
 | 
					
						
							| 
									
										
										
										
											1997-06-03 15:29:41 +00:00
										 |  |  | static char schedparams_doc[] = "Set/return mainloop interrupt check flag, etc"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-01-26 16:36:45 +00:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											1997-06-03 15:29:41 +00:00
										 |  |  | ** Set scheduler parameters | 
					
						
							| 
									
										
										
										
											1995-01-26 16:36:45 +00:00
										 |  |  | */ | 
					
						
							|  |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											1997-06-03 15:29:41 +00:00
										 |  |  | MacOS_SchedParams(PyObject *self, PyObject *args) | 
					
						
							| 
									
										
										
										
											1995-01-26 16:36:45 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											1997-06-03 15:29:41 +00:00
										 |  |  | 	PyMacSchedParams old, new; | 
					
						
							| 
									
										
										
										
											1995-01-26 16:36:45 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											1997-06-03 15:29:41 +00:00
										 |  |  | 	PyMac_GetSchedParams(&old); | 
					
						
							|  |  |  | 	new = old; | 
					
						
							|  |  |  | 	if (!PyArg_ParseTuple(args, "|iiidd", &new.check_interrupt, &new.process_events, | 
					
						
							|  |  |  | 			&new.besocial, &new.check_interval, &new.bg_yield)) | 
					
						
							| 
									
										
										
										
											1995-01-26 16:36:45 +00:00
										 |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											1997-06-03 15:29:41 +00:00
										 |  |  | 	PyMac_SetSchedParams(&new); | 
					
						
							|  |  |  | 	return Py_BuildValue("iiidd", old.check_interrupt, old.process_events, | 
					
						
							|  |  |  | 			old.besocial, old.check_interval, old.bg_yield); | 
					
						
							| 
									
										
										
										
											1995-01-26 16:36:45 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-06-03 15:29:41 +00:00
										 |  |  | static char appswitch_doc[] = "Obsolete, use SchedParams"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Obsolete, for backward compatability */ | 
					
						
							| 
									
										
										
										
											1995-01-27 14:43:25 +00:00
										 |  |  | static PyObject * | 
					
						
							|  |  |  | MacOS_EnableAppswitch(PyObject *self, PyObject *args) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											1997-06-03 15:29:41 +00:00
										 |  |  | 	int new, old; | 
					
						
							|  |  |  | 	PyMacSchedParams schp; | 
					
						
							| 
									
										
										
										
											1995-01-27 14:43:25 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											1995-02-26 10:20:53 +00:00
										 |  |  | 	if (!PyArg_ParseTuple(args, "i", &new)) | 
					
						
							| 
									
										
										
										
											1995-01-27 14:43:25 +00:00
										 |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											1997-06-03 15:29:41 +00:00
										 |  |  | 	PyMac_GetSchedParams(&schp); | 
					
						
							|  |  |  | 	if ( schp.process_events ) | 
					
						
							|  |  |  | 		old = 1; | 
					
						
							|  |  |  | 	else if ( schp.check_interrupt ) | 
					
						
							|  |  |  | 		old = 0; | 
					
						
							| 
									
										
										
										
											1997-09-08 13:23:19 +00:00
										 |  |  | 	else | 
					
						
							|  |  |  | 		old = -1; | 
					
						
							| 
									
										
										
										
											1997-06-03 15:29:41 +00:00
										 |  |  | 	if ( new > 0 ) { | 
					
						
							|  |  |  | 		schp.process_events = mDownMask|keyDownMask|osMask; | 
					
						
							|  |  |  | 		schp.check_interrupt = 1; | 
					
						
							| 
									
										
										
										
											1997-09-08 13:23:19 +00:00
										 |  |  | 	} else if ( new == 0 ) { | 
					
						
							| 
									
										
										
										
											1997-06-03 15:29:41 +00:00
										 |  |  | 		schp.process_events = 0; | 
					
						
							|  |  |  | 		schp.check_interrupt = 1; | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		schp.process_events = 0; | 
					
						
							|  |  |  | 		schp.check_interrupt = 0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	PyMac_SetSchedParams(&schp); | 
					
						
							| 
									
										
										
										
											1995-02-26 10:20:53 +00:00
										 |  |  | 	return Py_BuildValue("i", old); | 
					
						
							| 
									
										
										
										
											1995-01-27 14:43:25 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-06-20 16:19:38 +00:00
										 |  |  | static char setevh_doc[] = "Set python event handler to be called in mainloop"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							| 
									
										
										
										
											2001-08-08 13:46:49 +00:00
										 |  |  | MacOS_SetEventHandler(PyObject *self, PyObject *args) | 
					
						
							| 
									
										
										
										
											1997-06-20 16:19:38 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	PyObject *evh = NULL; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	if (!PyArg_ParseTuple(args, "|O", &evh)) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	if (evh == Py_None) | 
					
						
							|  |  |  | 		evh = NULL; | 
					
						
							|  |  |  | 	if ( evh && !PyCallable_Check(evh) ) { | 
					
						
							|  |  |  | 		PyErr_SetString(PyExc_ValueError, "SetEventHandler argument must be callable"); | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if ( !PyMac_SetEventHandler(evh) ) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	Py_INCREF(Py_None); | 
					
						
							|  |  |  | 	return Py_None; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-06-03 15:29:41 +00:00
										 |  |  | static char handleev_doc[] = "Pass event to other interested parties like sioux"; | 
					
						
							| 
									
										
										
										
											1995-02-02 14:25:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | MacOS_HandleEvent(PyObject *self, PyObject *args) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	EventRecord ev; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	if (!PyArg_ParseTuple(args, "O&", PyMac_GetEventRecord, &ev)) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											1997-06-20 16:19:38 +00:00
										 |  |  | 	PyMac_HandleEventIntern(&ev); | 
					
						
							| 
									
										
										
										
											1995-02-02 14:25:56 +00:00
										 |  |  | 	Py_INCREF(Py_None); | 
					
						
							|  |  |  | 	return Py_None; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2001-05-19 12:50:05 +00:00
										 |  |  | #endif /* !TARGET_API_MAC_OSX */
 | 
					
						
							| 
									
										
										
										
											1995-02-02 14:25:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-06-03 15:29:41 +00:00
										 |  |  | static char geterr_doc[] = "Convert OSErr number to string"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-07-17 11:36:01 +00:00
										 |  |  | static PyObject * | 
					
						
							|  |  |  | MacOS_GetErrorString(PyObject *self, PyObject *args) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int errn; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	if (!PyArg_ParseTuple(args, "i", &errn)) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	return Py_BuildValue("s", PyMac_StrError(errn)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-05-20 11:32:00 +00:00
										 |  |  | static char splash_doc[] = "Open a splash-screen dialog by resource-id (0=close)"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | MacOS_splash(PyObject *self, PyObject *args) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											1996-09-15 22:12:00 +00:00
										 |  |  | 	int resid = -1; | 
					
						
							| 
									
										
										
										
											1997-05-13 15:41:48 +00:00
										 |  |  | 	static DialogPtr curdialog = NULL; | 
					
						
							| 
									
										
										
										
											1997-09-08 13:23:19 +00:00
										 |  |  | 	DialogPtr olddialog; | 
					
						
							| 
									
										
										
										
											1996-09-23 15:49:43 +00:00
										 |  |  | 	WindowRef theWindow; | 
					
						
							|  |  |  | 	CGrafPtr thePort; | 
					
						
							| 
									
										
										
										
											2000-06-02 21:35:07 +00:00
										 |  |  | #if 0
 | 
					
						
							| 
									
										
										
										
											1996-09-23 15:49:43 +00:00
										 |  |  | 	short xpos, ypos, width, height, swidth, sheight; | 
					
						
							| 
									
										
										
										
											2000-06-02 21:35:07 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1996-05-20 11:32:00 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											1996-09-15 22:12:00 +00:00
										 |  |  | 	if (!PyArg_ParseTuple(args, "|i", &resid)) | 
					
						
							| 
									
										
										
										
											1996-05-20 11:32:00 +00:00
										 |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											1997-09-08 13:23:19 +00:00
										 |  |  | 	olddialog = curdialog; | 
					
						
							| 
									
										
										
										
											1998-02-20 15:59:59 +00:00
										 |  |  | 	curdialog = NULL; | 
					
						
							| 
									
										
										
										
											1996-05-20 11:32:00 +00:00
										 |  |  | 		 | 
					
						
							| 
									
										
										
										
											1996-09-15 22:12:00 +00:00
										 |  |  | 	if ( resid != -1 ) { | 
					
						
							|  |  |  | 		curdialog = GetNewDialog(resid, NULL, (WindowPtr)-1); | 
					
						
							| 
									
										
										
										
											1996-09-23 15:49:43 +00:00
										 |  |  | 		if ( curdialog ) { | 
					
						
							|  |  |  | 			theWindow = GetDialogWindow(curdialog); | 
					
						
							|  |  |  | 			thePort = GetWindowPort(theWindow); | 
					
						
							| 
									
										
										
										
											2000-06-02 21:35:07 +00:00
										 |  |  | #if 0
 | 
					
						
							| 
									
										
										
										
											1996-09-23 15:49:43 +00:00
										 |  |  | 			width = thePort->portRect.right - thePort->portRect.left; | 
					
						
							|  |  |  | 			height = thePort->portRect.bottom - thePort->portRect.top; | 
					
						
							|  |  |  | 			swidth = qd.screenBits.bounds.right - qd.screenBits.bounds.left; | 
					
						
							|  |  |  | 			sheight = qd.screenBits.bounds.bottom - qd.screenBits.bounds.top - LMGetMBarHeight(); | 
					
						
							|  |  |  | 			xpos = (swidth-width)/2; | 
					
						
							|  |  |  | 			ypos = (sheight-height)/5 + LMGetMBarHeight(); | 
					
						
							|  |  |  | 			MoveWindow(theWindow, xpos, ypos, 0); | 
					
						
							|  |  |  | 			ShowWindow(theWindow); | 
					
						
							| 
									
										
										
										
											2000-06-02 21:35:07 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1996-09-15 22:12:00 +00:00
										 |  |  | 			DrawDialog(curdialog); | 
					
						
							| 
									
										
										
										
											1996-09-23 15:49:43 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											1996-09-15 22:12:00 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											1997-09-08 13:23:19 +00:00
										 |  |  | 	if (olddialog) | 
					
						
							|  |  |  | 		DisposeDialog(olddialog); | 
					
						
							| 
									
										
										
										
											1996-05-20 11:32:00 +00:00
										 |  |  | 	Py_INCREF(Py_None); | 
					
						
							|  |  |  | 	return Py_None; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-09-30 14:43:22 +00:00
										 |  |  | static char DebugStr_doc[] = "Switch to low-level debugger with a message"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | MacOS_DebugStr(PyObject *self, PyObject *args) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	Str255 message; | 
					
						
							|  |  |  | 	PyObject *object = 0; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	if (!PyArg_ParseTuple(args, "O&|O", PyMac_GetStr255, message, &object)) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	DebugStr(message); | 
					
						
							|  |  |  | 	Py_INCREF(Py_None); | 
					
						
							|  |  |  | 	return Py_None; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											1996-05-20 11:32:00 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-09-08 13:23:19 +00:00
										 |  |  | static char SysBeep_doc[] = "BEEEEEP!!!"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | MacOS_SysBeep(PyObject *self, PyObject *args) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int duration = 6; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	if (!PyArg_ParseTuple(args, "|i", &duration)) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	SysBeep(duration); | 
					
						
							|  |  |  | 	Py_INCREF(Py_None); | 
					
						
							|  |  |  | 	return Py_None; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2003-02-21 16:31:11 +00:00
										 |  |  | static char WMAvailable_doc[] =  | 
					
						
							|  |  |  | 	"True if this process can interact with the display." | 
					
						
							|  |  |  | 	"Will foreground the application on the first call as a side-effect." | 
					
						
							|  |  |  | 	; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | MacOS_WMAvailable(PyObject *self, PyObject *args) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	static PyObject *rv = NULL; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	if (!PyArg_ParseTuple(args, "")) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	if (!rv) { | 
					
						
							|  |  |  | #if TARGET_API_MAC_OSX
 | 
					
						
							|  |  |  | 		ProcessSerialNumber psn; | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		/*
 | 
					
						
							|  |  |  | 		** This is a fairly innocuous call to make if we don't have a window | 
					
						
							|  |  |  | 		** manager, or if we have no permission to talk to it. It will print | 
					
						
							|  |  |  | 		** a message on stderr, but at least it won't abort the process. | 
					
						
							|  |  |  | 		** It appears the function caches the result itself, and it's cheap, so | 
					
						
							|  |  |  | 		** no need for us to cache. | 
					
						
							|  |  |  | 		*/ | 
					
						
							|  |  |  | 		if (CGMainDisplayID() == 0) { | 
					
						
							|  |  |  | 			rv = Py_False; | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			if (GetCurrentProcess(&psn) < 0 || | 
					
						
							|  |  |  | 				SetFrontProcess(&psn) < 0) { | 
					
						
							|  |  |  | 				rv = Py_False; | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				rv = Py_True; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | 		rv = Py_True; | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	Py_INCREF(rv); | 
					
						
							|  |  |  | 	return rv; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1997-09-01 15:38:12 +00:00
										 |  |  | static char GetTicks_doc[] = "Return number of ticks since bootup"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | MacOS_GetTicks(PyObject *self, PyObject *args) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2000-06-02 21:35:07 +00:00
										 |  |  | 	return Py_BuildValue("i", (int)TickCount()); | 
					
						
							| 
									
										
										
										
											1997-09-01 15:38:12 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1996-02-29 16:11:32 +00:00
										 |  |  | static char openrf_doc[] = "Open resource fork of a file"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | MacOS_openrf(PyObject *self, PyObject *args) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	OSErr err; | 
					
						
							|  |  |  | 	char *mode = "r"; | 
					
						
							|  |  |  | 	FSSpec fss; | 
					
						
							|  |  |  | 	SignedByte permission = 1; | 
					
						
							|  |  |  | 	rfobject *fp; | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	if (!PyArg_ParseTuple(args, "O&|s", PyMac_GetFSSpec, &fss, &mode)) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	while (*mode) { | 
					
						
							|  |  |  | 		switch (*mode++) { | 
					
						
							|  |  |  | 		case '*': break; | 
					
						
							|  |  |  | 		case 'r': permission = 1; break; | 
					
						
							|  |  |  | 		case 'w': permission = 2; break; | 
					
						
							|  |  |  | 		case 'b': break; | 
					
						
							|  |  |  | 		default: | 
					
						
							|  |  |  | 			PyErr_BadArgument(); | 
					
						
							|  |  |  | 			return NULL; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	if ( (fp = newrfobject()) == NULL ) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	err = HOpenRF(fss.vRefNum, fss.parID, fss.name, permission, &fp->fRefNum); | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	if ( err == fnfErr ) { | 
					
						
							|  |  |  | 		/* In stead of doing complicated things here to get creator/type
 | 
					
						
							|  |  |  | 		** correct we let the standard i/o library handle it | 
					
						
							|  |  |  | 		*/ | 
					
						
							|  |  |  | 		FILE *tfp; | 
					
						
							| 
									
										
										
										
											2001-09-10 22:00:39 +00:00
										 |  |  | 		char pathname[PATHNAMELEN]; | 
					
						
							| 
									
										
										
										
											1996-02-29 16:11:32 +00:00
										 |  |  | 		 | 
					
						
							| 
									
										
										
										
											2002-12-23 23:16:25 +00:00
										 |  |  | 		if ( (err=PyMac_GetFullPathname(&fss, pathname, PATHNAMELEN)) ) { | 
					
						
							| 
									
										
										
										
											1996-02-29 16:11:32 +00:00
										 |  |  | 			PyMac_Error(err); | 
					
						
							|  |  |  | 			Py_DECREF(fp); | 
					
						
							|  |  |  | 			return NULL; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		if ( (tfp = fopen(pathname, "w")) == NULL ) { | 
					
						
							|  |  |  | 			PyMac_Error(fnfErr); /* What else... */ | 
					
						
							|  |  |  | 			Py_DECREF(fp); | 
					
						
							|  |  |  | 			return NULL; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		fclose(tfp); | 
					
						
							|  |  |  | 		err = HOpenRF(fss.vRefNum, fss.parID, fss.name, permission, &fp->fRefNum); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if ( err ) { | 
					
						
							|  |  |  | 		Py_DECREF(fp); | 
					
						
							|  |  |  | 		PyMac_Error(err); | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	fp->isclosed = 0; | 
					
						
							|  |  |  | 	return (PyObject *)fp; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2001-05-19 12:50:05 +00:00
										 |  |  | #if !TARGET_API_MAC_OSX
 | 
					
						
							| 
									
										
										
										
											2000-02-21 11:07:37 +00:00
										 |  |  | static char FreeMem_doc[] = "Return the total amount of free space in the heap"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | MacOS_FreeMem(PyObject *self, PyObject *args) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	long rv; | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	if (!PyArg_ParseTuple(args, "")) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	rv = FreeMem(); | 
					
						
							|  |  |  | 	return Py_BuildValue("l", rv); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static char MaxBlock_doc[] = "Return the largest contiguous block of free space in the heap"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | MacOS_MaxBlock(PyObject *self, PyObject *args) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	long rv; | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	if (!PyArg_ParseTuple(args, "")) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	rv = MaxBlock(); | 
					
						
							|  |  |  | 	return Py_BuildValue("l", rv); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static char CompactMem_doc[] = "(wanted size)->actual largest block after compacting"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | MacOS_CompactMem(PyObject *self, PyObject *args) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	long value; | 
					
						
							|  |  |  | 	long rv; | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 	if (!PyArg_ParseTuple(args, "l", &value)) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	rv = CompactMem(value); | 
					
						
							|  |  |  | 	return Py_BuildValue("l", rv); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-10-12 21:24:05 +00:00
										 |  |  | static char KeepConsole_doc[] = "(flag) Keep console open 0:never, 1:on output 2:on error, 3:always"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | MacOS_KeepConsole(PyObject *self, PyObject *args) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int value; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	if (!PyArg_ParseTuple(args, "i", &value)) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	PyMac_options.keep_console = value; | 
					
						
							|  |  |  | 	Py_INCREF(Py_None); | 
					
						
							|  |  |  | 	return Py_None; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-10-19 22:02:16 +00:00
										 |  |  | static char OutputSeen_doc[] = "Call to reset the 'unseen output' flag for the keep-console-open option"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject * | 
					
						
							|  |  |  | MacOS_OutputSeen(PyObject *self, PyObject *args) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (!PyArg_ParseTuple(args, "")) | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	PyMac_OutputSeen(); | 
					
						
							|  |  |  | 	Py_INCREF(Py_None); | 
					
						
							|  |  |  | 	return Py_None; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2001-05-19 12:50:05 +00:00
										 |  |  | #endif /* !TARGET_API_MAC_OSX */
 | 
					
						
							| 
									
										
										
										
											2000-10-19 22:02:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-09-16 10:54:21 +00:00
										 |  |  | static PyMethodDef MacOS_Methods[] = { | 
					
						
							| 
									
										
										
										
											1997-06-03 15:29:41 +00:00
										 |  |  | 	{"GetCreatorAndType",		MacOS_GetCreatorAndType, 1,	getcrtp_doc}, | 
					
						
							|  |  |  | 	{"SetCreatorAndType",		MacOS_SetCreatorAndType, 1,	setcrtp_doc}, | 
					
						
							| 
									
										
										
										
											2001-05-19 12:50:05 +00:00
										 |  |  | #if !TARGET_API_MAC_OSX
 | 
					
						
							| 
									
										
										
										
											1997-06-03 15:29:41 +00:00
										 |  |  | 	{"SchedParams",			MacOS_SchedParams,	1,	schedparams_doc}, | 
					
						
							|  |  |  | 	{"EnableAppswitch",		MacOS_EnableAppswitch,	1,	appswitch_doc}, | 
					
						
							| 
									
										
										
										
											1997-06-20 16:19:38 +00:00
										 |  |  | 	{"SetEventHandler",		MacOS_SetEventHandler,	1,	setevh_doc}, | 
					
						
							| 
									
										
										
										
											1997-06-03 15:29:41 +00:00
										 |  |  | 	{"HandleEvent",			MacOS_HandleEvent,	1,	handleev_doc}, | 
					
						
							| 
									
										
										
										
											2001-05-19 12:50:05 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1997-06-03 15:29:41 +00:00
										 |  |  | 	{"GetErrorString",		MacOS_GetErrorString,	1,	geterr_doc}, | 
					
						
							|  |  |  | 	{"openrf",			MacOS_openrf, 		1, 	openrf_doc}, | 
					
						
							|  |  |  | 	{"splash",			MacOS_splash,		1, 	splash_doc}, | 
					
						
							|  |  |  | 	{"DebugStr",			MacOS_DebugStr,		1,	DebugStr_doc}, | 
					
						
							| 
									
										
										
										
											1997-09-01 15:38:12 +00:00
										 |  |  | 	{"GetTicks",			MacOS_GetTicks,		1,	GetTicks_doc}, | 
					
						
							| 
									
										
										
										
											1997-09-08 13:23:19 +00:00
										 |  |  | 	{"SysBeep",			MacOS_SysBeep,		1,	SysBeep_doc}, | 
					
						
							| 
									
										
										
										
											2003-02-21 16:31:11 +00:00
										 |  |  | 	{"WMAvailable",			MacOS_WMAvailable,		1,	WMAvailable_doc}, | 
					
						
							| 
									
										
										
										
											2001-05-19 12:50:05 +00:00
										 |  |  | #if !TARGET_API_MAC_OSX
 | 
					
						
							| 
									
										
										
										
											2000-02-21 11:07:37 +00:00
										 |  |  | 	{"FreeMem",			MacOS_FreeMem,		1,	FreeMem_doc}, | 
					
						
							|  |  |  | 	{"MaxBlock",		MacOS_MaxBlock,		1,	MaxBlock_doc}, | 
					
						
							|  |  |  | 	{"CompactMem",		MacOS_CompactMem,	1,	CompactMem_doc}, | 
					
						
							| 
									
										
										
										
											2000-10-12 21:24:05 +00:00
										 |  |  | 	{"KeepConsole",		MacOS_KeepConsole,	1,	KeepConsole_doc}, | 
					
						
							| 
									
										
										
										
											2000-10-19 22:02:16 +00:00
										 |  |  | 	{"OutputSeen",		MacOS_OutputSeen,	1,	OutputSeen_doc}, | 
					
						
							| 
									
										
										
										
											2001-05-19 12:50:05 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											1995-01-18 23:58:07 +00:00
										 |  |  | 	{NULL,				NULL}		 /* Sentinel */ | 
					
						
							| 
									
										
										
										
											1994-09-16 10:54:21 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void | 
					
						
							| 
									
										
										
										
											2001-08-08 13:46:49 +00:00
										 |  |  | initMacOS(void) | 
					
						
							| 
									
										
										
										
											1994-09-16 10:54:21 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	PyObject *m, *d; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	m = Py_InitModule("MacOS", MacOS_Methods); | 
					
						
							|  |  |  | 	d = PyModule_GetDict(m); | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	/* Initialize MacOS.Error exception */ | 
					
						
							| 
									
										
										
										
											1995-01-25 23:09:20 +00:00
										 |  |  | 	MacOS_Error = PyMac_GetOSErrException(); | 
					
						
							| 
									
										
										
										
											1994-09-29 10:02:56 +00:00
										 |  |  | 	if (MacOS_Error == NULL || PyDict_SetItemString(d, "Error", MacOS_Error) != 0) | 
					
						
							| 
									
										
										
										
											2000-09-08 10:21:44 +00:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											1997-09-20 17:40:22 +00:00
										 |  |  | 	Rftype.ob_type = &PyType_Type; | 
					
						
							|  |  |  | 	Py_INCREF(&Rftype); | 
					
						
							|  |  |  | 	if (PyDict_SetItemString(d, "ResourceForkType", (PyObject *)&Rftype) != 0) | 
					
						
							| 
									
										
										
										
											2000-09-08 10:21:44 +00:00
										 |  |  | 		return; | 
					
						
							| 
									
										
										
										
											1997-04-03 14:51:03 +00:00
										 |  |  | 	/*
 | 
					
						
							|  |  |  | 	** This is a hack: the following constant added to the id() of a string | 
					
						
							|  |  |  | 	** object gives you the address of the data. Unfortunately, it is needed for | 
					
						
							|  |  |  | 	** some of the image and sound processing interfaces on the mac:-( | 
					
						
							|  |  |  | 	*/ | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		PyStringObject *p = 0; | 
					
						
							|  |  |  | 		long off = (long)&(p->ob_sval[0]); | 
					
						
							|  |  |  | 		 | 
					
						
							|  |  |  | 		if( PyDict_SetItemString(d, "string_id_to_buffer", Py_BuildValue("i", off)) != 0) | 
					
						
							| 
									
										
										
										
											2000-09-08 10:21:44 +00:00
										 |  |  | 			return; | 
					
						
							| 
									
										
										
										
											1997-04-03 14:51:03 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2001-05-19 12:50:05 +00:00
										 |  |  | #if TARGET_API_MAC_OSX
 | 
					
						
							|  |  |  | #define PY_RUNTIMEMODEL "macho"
 | 
					
						
							|  |  |  | #elif TARGET_API_MAC_CARBON
 | 
					
						
							|  |  |  | #define PY_RUNTIMEMODEL "carbon"
 | 
					
						
							| 
									
										
										
										
											2001-05-12 21:31:34 +00:00
										 |  |  | #else
 | 
					
						
							|  |  |  | #error "None of the TARGET_API_MAC_XXX I know about is set"
 | 
					
						
							| 
									
										
										
										
											2001-01-23 22:38:23 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 	if (PyDict_SetItemString(d, "runtimemodel",  | 
					
						
							|  |  |  | 				Py_BuildValue("s", PY_RUNTIMEMODEL)) != 0) | 
					
						
							|  |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2003-02-23 23:23:47 +00:00
										 |  |  | #if !TARGET_API_MAC_OSX
 | 
					
						
							|  |  |  | #define PY_LINKMODEL "cfm"
 | 
					
						
							|  |  |  | #elif defined(WITH_NEXT_FRAMEWORK)
 | 
					
						
							|  |  |  | #define PY_LINKMODEL "framework"
 | 
					
						
							|  |  |  | #elif defined(Py_ENABLE_SHARED)
 | 
					
						
							|  |  |  | #define PY_LINKMODEL "shared"
 | 
					
						
							|  |  |  | #else
 | 
					
						
							|  |  |  | #define PY_LINKMODEL "static"
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 	if (PyDict_SetItemString(d, "linkmodel",  | 
					
						
							|  |  |  | 				Py_BuildValue("s", PY_LINKMODEL)) != 0) | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1994-09-16 10:54:21 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											1995-02-26 10:20:53 +00:00
										 |  |  | 
 |