blob: 6dd6de4910c5de20b81d2e980a7bba6b9453c167 [file] [log] [blame]
Guido van Rossum2d167031994-09-16 10:54:21 +00001/***********************************************************
Jack Jansen42218ce1997-01-31 16:15:11 +00002Copyright 1991-1997 by Stichting Mathematisch Centrum, Amsterdam,
Guido van Rossum99546991995-01-08 14:33:34 +00003The Netherlands.
Guido van Rossum2d167031994-09-16 10:54:21 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
25/* Macintosh OS-specific interface */
26
27#include "Python.h"
Jack Jansen97ce3611994-12-14 14:02:24 +000028#include "macglue.h"
Guido van Rossum2d167031994-09-16 10:54:21 +000029
Jack Jansenee23d6e1995-01-27 14:43:25 +000030#include <Windows.h>
Jack Jansen76a05891996-02-29 16:11:32 +000031#include <Files.h>
Jack Janseneb76b841996-09-30 14:43:22 +000032#include <LowMem.h>
Jack Jansenee23d6e1995-01-27 14:43:25 +000033
Guido van Rossum2d167031994-09-16 10:54:21 +000034static PyObject *MacOS_Error; /* Exception MacOS.Error */
35
Guido van Rossume6d9ccc1995-02-21 21:01:05 +000036#ifdef MPW
Guido van Rossum9fed1831995-02-18 15:02:02 +000037#define bufferIsSmall -607 /*error returns from Post and Accept */
38#endif
39
Jack Jansen76a05891996-02-29 16:11:32 +000040static PyObject *ErrorObject;
41
42/* ----------------------------------------------------- */
43
44/* Declarations for objects of type Resource fork */
45
46typedef struct {
47 PyObject_HEAD
48 short fRefNum;
49 int isclosed;
50} rfobject;
51
52staticforward PyTypeObject Rftype;
53
54
55
56/* ---------------------------------------------------------------- */
57
58static void
59do_close(self)
60 rfobject *self;
61{
62 if (self->isclosed ) return;
63 (void)FSClose(self->fRefNum);
64 self->isclosed = 1;
65}
66
67static char rf_read__doc__[] =
68"Read data from resource fork"
69;
70
71static PyObject *
72rf_read(self, args)
73 rfobject *self;
74 PyObject *args;
75{
76 long n;
77 PyObject *v;
78 OSErr err;
79
80 if (self->isclosed) {
81 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
82 return NULL;
83 }
84
85 if (!PyArg_ParseTuple(args, "l", &n))
86 return NULL;
87
88 v = PyString_FromStringAndSize((char *)NULL, n);
89 if (v == NULL)
90 return NULL;
91
92 err = FSRead(self->fRefNum, &n, PyString_AsString(v));
93 if (err && err != eofErr) {
94 PyMac_Error(err);
95 Py_DECREF(v);
96 return NULL;
97 }
98 _PyString_Resize(&v, n);
99 return v;
100}
101
102
103static char rf_write__doc__[] =
104"Write to resource fork"
105;
106
107static PyObject *
108rf_write(self, args)
109 rfobject *self;
110 PyObject *args;
111{
112 char *buffer;
113 long size;
114 OSErr err;
115
116 if (self->isclosed) {
117 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
118 return NULL;
119 }
Jack Janseneeccca91997-05-07 15:46:31 +0000120 if (!PyArg_ParseTuple(args, "s#", &buffer, &size))
Jack Jansen76a05891996-02-29 16:11:32 +0000121 return NULL;
122 err = FSWrite(self->fRefNum, &size, buffer);
123 if (err) {
124 PyMac_Error(err);
125 return NULL;
126 }
127 Py_INCREF(Py_None);
128 return Py_None;
129}
130
131
132static char rf_seek__doc__[] =
133"Set file position"
134;
135
136static PyObject *
137rf_seek(self, args)
138 rfobject *self;
139 PyObject *args;
140{
141 long amount, pos;
142 int whence = SEEK_SET;
143 long eof;
144 OSErr err;
145
146 if (self->isclosed) {
147 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
148 return NULL;
149 }
150 if (!PyArg_ParseTuple(args, "l|i", &amount, &whence))
151 return NULL;
152
153 if ( err = GetEOF(self->fRefNum, &eof))
154 goto ioerr;
155
156 switch (whence) {
157 case SEEK_CUR:
158 if (err = GetFPos(self->fRefNum, &pos))
159 goto ioerr;
160 break;
161 case SEEK_END:
162 pos = eof;
163 break;
164 case SEEK_SET:
165 pos = 0;
166 break;
167 default:
168 PyErr_BadArgument();
169 return NULL;
170 }
171
172 pos += amount;
173
174 /* Don't bother implementing seek past EOF */
175 if (pos > eof || pos < 0) {
176 PyErr_BadArgument();
177 return NULL;
178 }
179
180 if ( err = SetFPos(self->fRefNum, fsFromStart, pos) ) {
181ioerr:
182 PyMac_Error(err);
183 return NULL;
184 }
185 Py_INCREF(Py_None);
186 return Py_None;
187}
188
189
190static char rf_tell__doc__[] =
191"Get file position"
192;
193
194static PyObject *
195rf_tell(self, args)
196 rfobject *self;
197 PyObject *args;
198{
199 long where;
200 OSErr err;
201
202 if (self->isclosed) {
203 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
204 return NULL;
205 }
206 if (!PyArg_ParseTuple(args, ""))
207 return NULL;
208 if ( err = GetFPos(self->fRefNum, &where) ) {
209 PyMac_Error(err);
210 return NULL;
211 }
212 return PyInt_FromLong(where);
213}
214
215static char rf_close__doc__[] =
216"Close resource fork"
217;
218
219static PyObject *
220rf_close(self, args)
221 rfobject *self;
222 PyObject *args;
223{
Jack Jansen76a05891996-02-29 16:11:32 +0000224 if (!PyArg_ParseTuple(args, ""))
225 return NULL;
226 do_close(self);
227 Py_INCREF(Py_None);
228 return Py_None;
229}
230
231
232static struct PyMethodDef rf_methods[] = {
233 {"read", rf_read, 1, rf_read__doc__},
234 {"write", rf_write, 1, rf_write__doc__},
235 {"seek", rf_seek, 1, rf_seek__doc__},
236 {"tell", rf_tell, 1, rf_tell__doc__},
237 {"close", rf_close, 1, rf_close__doc__},
238
239 {NULL, NULL} /* sentinel */
240};
241
242/* ---------- */
243
244
245static rfobject *
246newrfobject()
247{
248 rfobject *self;
249
250 self = PyObject_NEW(rfobject, &Rftype);
251 if (self == NULL)
252 return NULL;
253 self->isclosed = 1;
254 return self;
255}
256
257
258static void
259rf_dealloc(self)
260 rfobject *self;
261{
262 do_close(self);
263 PyMem_DEL(self);
264}
265
266static PyObject *
267rf_getattr(self, name)
268 rfobject *self;
269 char *name;
270{
271 return Py_FindMethod(rf_methods, (PyObject *)self, name);
272}
273
274static char Rftype__doc__[] =
275"Resource fork file object"
276;
277
278static PyTypeObject Rftype = {
279 PyObject_HEAD_INIT(&PyType_Type)
280 0, /*ob_size*/
281 "Resource fork", /*tp_name*/
282 sizeof(rfobject), /*tp_basicsize*/
283 0, /*tp_itemsize*/
284 /* methods */
285 (destructor)rf_dealloc, /*tp_dealloc*/
286 (printfunc)0, /*tp_print*/
287 (getattrfunc)rf_getattr, /*tp_getattr*/
288 (setattrfunc)0, /*tp_setattr*/
289 (cmpfunc)0, /*tp_compare*/
290 (reprfunc)0, /*tp_repr*/
291 0, /*tp_as_number*/
292 0, /*tp_as_sequence*/
293 0, /*tp_as_mapping*/
294 (hashfunc)0, /*tp_hash*/
295 (ternaryfunc)0, /*tp_call*/
296 (reprfunc)0, /*tp_str*/
297
298 /* Space for future expansion */
299 0L,0L,0L,0L,
300 Rftype__doc__ /* Documentation string */
301};
302
303/* End of code for Resource fork objects */
304/* -------------------------------------------------------- */
Guido van Rossum2d167031994-09-16 10:54:21 +0000305
306/*----------------------------------------------------------------------*/
Guido van Rossume791c2e1995-01-09 13:20:04 +0000307/* Miscellaneous File System Operations */
308
Jack Jansen120a1051997-06-03 15:29:41 +0000309static char getcrtp_doc[] = "Obsolete, use macfs module";
310
Guido van Rossume791c2e1995-01-09 13:20:04 +0000311static PyObject *
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000312MacOS_GetCreatorAndType(PyObject *self, PyObject *args)
Guido van Rossume791c2e1995-01-09 13:20:04 +0000313{
314 Str255 name;
315 FInfo info;
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000316 PyObject *creator, *type, *res;
Guido van Rossume791c2e1995-01-09 13:20:04 +0000317 OSErr err;
318
Guido van Rossum9aa3d131995-01-21 13:46:04 +0000319 if (!PyArg_ParseTuple(args, "O&", PyMac_GetStr255, &name))
Guido van Rossume791c2e1995-01-09 13:20:04 +0000320 return NULL;
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000321 if ((err = GetFInfo(name, 0, &info)) != noErr)
322 return PyErr_Mac(MacOS_Error, err);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000323 creator = PyString_FromStringAndSize((char *)&info.fdCreator, 4);
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000324 type = PyString_FromStringAndSize((char *)&info.fdType, 4);
325 res = Py_BuildValue("OO", creator, type);
Guido van Rossumfffb8bb1995-01-12 12:37:24 +0000326 Py_DECREF(creator);
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000327 Py_DECREF(type);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000328 return res;
329}
330
Jack Jansen120a1051997-06-03 15:29:41 +0000331static char setcrtp_doc[] = "Obsolete, use macfs module";
332
Guido van Rossume791c2e1995-01-09 13:20:04 +0000333static PyObject *
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000334MacOS_SetCreatorAndType(PyObject *self, PyObject *args)
Guido van Rossume791c2e1995-01-09 13:20:04 +0000335{
336 Str255 name;
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000337 ResType creator, type;
Guido van Rossume791c2e1995-01-09 13:20:04 +0000338 FInfo info;
339 OSErr err;
340
341 if (!PyArg_ParseTuple(args, "O&O&O&",
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000342 PyMac_GetStr255, &name, PyMac_GetOSType, &creator, PyMac_GetOSType, &type))
Guido van Rossume791c2e1995-01-09 13:20:04 +0000343 return NULL;
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000344 if ((err = GetFInfo(name, 0, &info)) != noErr)
345 return PyErr_Mac(MacOS_Error, err);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000346 info.fdCreator = creator;
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000347 info.fdType = type;
348 if ((err = SetFInfo(name, 0, &info)) != noErr)
349 return PyErr_Mac(MacOS_Error, err);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000350 Py_INCREF(Py_None);
351 return Py_None;
352}
353
354/*----------------------------------------------------------------------*/
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000355/* STDWIN High Level Event interface */
356
357#include <EPPC.h>
358#include <Events.h>
359
360#ifdef USE_STDWIN
361
362extern void (*_w_high_level_event_proc)(EventRecord *);
363
364static PyObject *MacOS_HighLevelEventHandler = NULL;
365
366static void
Guido van Rossumbf068b11995-01-25 23:09:20 +0000367MacOS_HighLevelEventProc(EventRecord *e)
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000368{
369 if (MacOS_HighLevelEventHandler != NULL) {
Guido van Rossumbf068b11995-01-25 23:09:20 +0000370 PyObject *args = PyMac_BuildEventRecord(e);
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000371 PyObject *res;
372 if (args == NULL)
373 res = NULL;
374 else {
375 res = PyEval_CallObject(MacOS_HighLevelEventHandler, args);
376 Py_DECREF(args);
377 }
378 if (res == NULL) {
379 fprintf(stderr, "Exception in MacOS_HighLevelEventProc:\n");
380 PyErr_Print();
381 }
382 else
383 Py_DECREF(res);
384 }
385}
386
Jack Jansene8e8ae01995-01-26 16:36:45 +0000387/* XXXX Need to come here from PyMac_DoYield too... */
388
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000389static PyObject *
390MacOS_SetHighLevelEventHandler(self, args)
391 PyObject *self;
392 PyObject *args;
393{
394 PyObject *previous = MacOS_HighLevelEventHandler;
395 PyObject *next = NULL;
396 if (!PyArg_ParseTuple(args, "|O", &next))
397 return NULL;
398 if (next == Py_None)
399 next = NULL;
400 Py_INCREF(next);
401 MacOS_HighLevelEventHandler = next;
402 if (next == NULL)
403 _w_high_level_event_proc = NULL;
404 else
405 _w_high_level_event_proc = MacOS_HighLevelEventProc;
406 if (previous == NULL) {
407 Py_INCREF(Py_None);
408 previous = Py_None;
409 }
410 return previous;
411}
412
413#endif /* USE_STDWIN */
414
Jack Jansen120a1051997-06-03 15:29:41 +0000415static char accepthle_doc[] = "Get arguments of pending high-level event";
416
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000417static PyObject *
418MacOS_AcceptHighLevelEvent(self, args)
419 PyObject *self;
420 PyObject *args;
421{
422 TargetID sender;
423 unsigned long refcon;
424 Ptr buf;
425 unsigned long len;
426 OSErr err;
427 PyObject *res;
428
429 buf = NULL;
430 len = 0;
431 err = AcceptHighLevelEvent(&sender, &refcon, buf, &len);
432 if (err == bufferIsSmall) {
433 buf = malloc(len);
434 if (buf == NULL)
435 return PyErr_NoMemory();
436 err = AcceptHighLevelEvent(&sender, &refcon, buf, &len);
437 if (err != noErr) {
438 free(buf);
439 return PyErr_Mac(MacOS_Error, (int)err);
440 }
441 }
442 else if (err != noErr)
443 return PyErr_Mac(MacOS_Error, (int)err);
444 res = Py_BuildValue("s#ls#",
445 (char *)&sender, (int)(sizeof sender), refcon, (char *)buf, (int)len);
446 free(buf);
447 return res;
448}
449
Jack Jansen120a1051997-06-03 15:29:41 +0000450static char schedparams_doc[] = "Set/return mainloop interrupt check flag, etc";
451
Jack Jansene8e8ae01995-01-26 16:36:45 +0000452/*
Jack Jansen120a1051997-06-03 15:29:41 +0000453** Set scheduler parameters
Jack Jansene8e8ae01995-01-26 16:36:45 +0000454*/
455static PyObject *
Jack Jansen120a1051997-06-03 15:29:41 +0000456MacOS_SchedParams(PyObject *self, PyObject *args)
Jack Jansene8e8ae01995-01-26 16:36:45 +0000457{
Jack Jansen120a1051997-06-03 15:29:41 +0000458 PyMacSchedParams old, new;
Jack Jansene8e8ae01995-01-26 16:36:45 +0000459
Jack Jansen120a1051997-06-03 15:29:41 +0000460 PyMac_GetSchedParams(&old);
461 new = old;
462 if (!PyArg_ParseTuple(args, "|iiidd", &new.check_interrupt, &new.process_events,
463 &new.besocial, &new.check_interval, &new.bg_yield))
Jack Jansene8e8ae01995-01-26 16:36:45 +0000464 return NULL;
Jack Jansen120a1051997-06-03 15:29:41 +0000465 PyMac_SetSchedParams(&new);
466 return Py_BuildValue("iiidd", old.check_interrupt, old.process_events,
467 old.besocial, old.check_interval, old.bg_yield);
Jack Jansene8e8ae01995-01-26 16:36:45 +0000468}
469
Jack Jansen120a1051997-06-03 15:29:41 +0000470static char appswitch_doc[] = "Obsolete, use SchedParams";
471
472/* Obsolete, for backward compatability */
Jack Jansenee23d6e1995-01-27 14:43:25 +0000473static PyObject *
474MacOS_EnableAppswitch(PyObject *self, PyObject *args)
475{
Jack Jansen120a1051997-06-03 15:29:41 +0000476 int new, old;
477 PyMacSchedParams schp;
Jack Jansenee23d6e1995-01-27 14:43:25 +0000478
Guido van Rossume7134aa1995-02-26 10:20:53 +0000479 if (!PyArg_ParseTuple(args, "i", &new))
Jack Jansenee23d6e1995-01-27 14:43:25 +0000480 return NULL;
Jack Jansen120a1051997-06-03 15:29:41 +0000481 PyMac_GetSchedParams(&schp);
482 if ( schp.process_events )
483 old = 1;
484 else if ( schp.check_interrupt )
485 old = -1;
486 else
487 old = 0;
488 if ( new > 0 ) {
489 schp.process_events = mDownMask|keyDownMask|osMask;
490 schp.check_interrupt = 1;
491 } else if ( new < 0 ) {
492 schp.process_events = 0;
493 schp.check_interrupt = 1;
494 } else {
495 schp.process_events = 0;
496 schp.check_interrupt = 0;
497 }
498 PyMac_SetSchedParams(&schp);
Guido van Rossume7134aa1995-02-26 10:20:53 +0000499 return Py_BuildValue("i", old);
Jack Jansenee23d6e1995-01-27 14:43:25 +0000500}
501
Jack Jansen120a1051997-06-03 15:29:41 +0000502static char handleev_doc[] = "Pass event to other interested parties like sioux";
Jack Jansena76382a1995-02-02 14:25:56 +0000503
504static PyObject *
505MacOS_HandleEvent(PyObject *self, PyObject *args)
506{
507 EventRecord ev;
Jack Jansen120a1051997-06-03 15:29:41 +0000508 static int inhere;
Jack Jansena76382a1995-02-02 14:25:56 +0000509
Jack Jansen120a1051997-06-03 15:29:41 +0000510 /*
511 ** With HandleEvent and SetEventHandler we have a chance of recursive
512 ** calls. We check that here (for lack of a better place)
513 */
514 if ( inhere ) {
515 PyErr_SetString(PyExc_RuntimeError, "Recursive call to MacOS.HandleEvent");
516 return NULL;
517 }
Jack Jansena76382a1995-02-02 14:25:56 +0000518 if (!PyArg_ParseTuple(args, "O&", PyMac_GetEventRecord, &ev))
519 return NULL;
Jack Jansen120a1051997-06-03 15:29:41 +0000520 inhere = 1;
521 PyMac_HandleEvent(&ev, 1);
522 inhere = 0;
Jack Jansena76382a1995-02-02 14:25:56 +0000523 Py_INCREF(Py_None);
524 return Py_None;
525}
526
Jack Jansen120a1051997-06-03 15:29:41 +0000527static char geterr_doc[] = "Convert OSErr number to string";
528
Jack Jansen829f88c1995-07-17 11:36:01 +0000529static PyObject *
530MacOS_GetErrorString(PyObject *self, PyObject *args)
531{
532 int errn;
533
534 if (!PyArg_ParseTuple(args, "i", &errn))
535 return NULL;
536 return Py_BuildValue("s", PyMac_StrError(errn));
537}
538
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000539static char splash_doc[] = "Open a splash-screen dialog by resource-id (0=close)";
540
541static PyObject *
542MacOS_splash(PyObject *self, PyObject *args)
543{
Jack Jansendf34cf11996-09-15 22:12:00 +0000544 int resid = -1;
Jack Jansen450ae9f1997-05-13 15:41:48 +0000545 static DialogPtr curdialog = NULL;
Jack Jansen04df9d51996-09-23 15:49:43 +0000546 WindowRef theWindow;
547 CGrafPtr thePort;
Jack Jansen04df9d51996-09-23 15:49:43 +0000548 short xpos, ypos, width, height, swidth, sheight;
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000549
Jack Jansendf34cf11996-09-15 22:12:00 +0000550 if (!PyArg_ParseTuple(args, "|i", &resid))
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000551 return NULL;
Jack Jansen450ae9f1997-05-13 15:41:48 +0000552 if (curdialog) {
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000553 DisposeDialog(curdialog);
Jack Jansen450ae9f1997-05-13 15:41:48 +0000554 curdialog = NULL;
555 }
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000556
Jack Jansendf34cf11996-09-15 22:12:00 +0000557 if ( resid != -1 ) {
558 curdialog = GetNewDialog(resid, NULL, (WindowPtr)-1);
Jack Jansen04df9d51996-09-23 15:49:43 +0000559 if ( curdialog ) {
560 theWindow = GetDialogWindow(curdialog);
561 thePort = GetWindowPort(theWindow);
562 width = thePort->portRect.right - thePort->portRect.left;
563 height = thePort->portRect.bottom - thePort->portRect.top;
564 swidth = qd.screenBits.bounds.right - qd.screenBits.bounds.left;
565 sheight = qd.screenBits.bounds.bottom - qd.screenBits.bounds.top - LMGetMBarHeight();
566 xpos = (swidth-width)/2;
567 ypos = (sheight-height)/5 + LMGetMBarHeight();
568 MoveWindow(theWindow, xpos, ypos, 0);
569 ShowWindow(theWindow);
Jack Jansendf34cf11996-09-15 22:12:00 +0000570 DrawDialog(curdialog);
Jack Jansen04df9d51996-09-23 15:49:43 +0000571 }
Jack Jansendf34cf11996-09-15 22:12:00 +0000572 }
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000573 Py_INCREF(Py_None);
574 return Py_None;
575}
576
Jack Janseneb76b841996-09-30 14:43:22 +0000577static char DebugStr_doc[] = "Switch to low-level debugger with a message";
578
579static PyObject *
580MacOS_DebugStr(PyObject *self, PyObject *args)
581{
582 Str255 message;
583 PyObject *object = 0;
584
585 if (!PyArg_ParseTuple(args, "O&|O", PyMac_GetStr255, message, &object))
586 return NULL;
587 DebugStr(message);
588 Py_INCREF(Py_None);
589 return Py_None;
590}
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000591
Jack Jansen76a05891996-02-29 16:11:32 +0000592static char openrf_doc[] = "Open resource fork of a file";
593
594static PyObject *
595MacOS_openrf(PyObject *self, PyObject *args)
596{
597 OSErr err;
598 char *mode = "r";
599 FSSpec fss;
600 SignedByte permission = 1;
601 rfobject *fp;
602
603 if (!PyArg_ParseTuple(args, "O&|s", PyMac_GetFSSpec, &fss, &mode))
604 return NULL;
605 while (*mode) {
606 switch (*mode++) {
607 case '*': break;
608 case 'r': permission = 1; break;
609 case 'w': permission = 2; break;
610 case 'b': break;
611 default:
612 PyErr_BadArgument();
613 return NULL;
614 }
615 }
616
617 if ( (fp = newrfobject()) == NULL )
618 return NULL;
619
620 err = HOpenRF(fss.vRefNum, fss.parID, fss.name, permission, &fp->fRefNum);
621
622 if ( err == fnfErr ) {
623 /* In stead of doing complicated things here to get creator/type
624 ** correct we let the standard i/o library handle it
625 */
626 FILE *tfp;
627 char pathname[257];
628
Jack Jansen84fb1fa1996-11-09 18:46:57 +0000629 if ( err=PyMac_GetFullPath(&fss, pathname) ) {
Jack Jansen76a05891996-02-29 16:11:32 +0000630 PyMac_Error(err);
631 Py_DECREF(fp);
632 return NULL;
633 }
634
635 if ( (tfp = fopen(pathname, "w")) == NULL ) {
636 PyMac_Error(fnfErr); /* What else... */
637 Py_DECREF(fp);
638 return NULL;
639 }
640 fclose(tfp);
641 err = HOpenRF(fss.vRefNum, fss.parID, fss.name, permission, &fp->fRefNum);
642 }
643 if ( err ) {
644 Py_DECREF(fp);
645 PyMac_Error(err);
646 return NULL;
647 }
648 fp->isclosed = 0;
649 return (PyObject *)fp;
650}
651
Guido van Rossum2d167031994-09-16 10:54:21 +0000652static PyMethodDef MacOS_Methods[] = {
Jack Jansen120a1051997-06-03 15:29:41 +0000653 {"AcceptHighLevelEvent", MacOS_AcceptHighLevelEvent, 1, accepthle_doc},
654 {"GetCreatorAndType", MacOS_GetCreatorAndType, 1, getcrtp_doc},
655 {"SetCreatorAndType", MacOS_SetCreatorAndType, 1, setcrtp_doc},
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000656#ifdef USE_STDWIN
657 {"SetHighLevelEventHandler", MacOS_SetHighLevelEventHandler, 1},
658#endif
Jack Jansen120a1051997-06-03 15:29:41 +0000659 {"SchedParams", MacOS_SchedParams, 1, schedparams_doc},
660 {"EnableAppswitch", MacOS_EnableAppswitch, 1, appswitch_doc},
661 {"HandleEvent", MacOS_HandleEvent, 1, handleev_doc},
662 {"GetErrorString", MacOS_GetErrorString, 1, geterr_doc},
663 {"openrf", MacOS_openrf, 1, openrf_doc},
664 {"splash", MacOS_splash, 1, splash_doc},
665 {"DebugStr", MacOS_DebugStr, 1, DebugStr_doc},
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000666 {NULL, NULL} /* Sentinel */
Guido van Rossum2d167031994-09-16 10:54:21 +0000667};
668
669
670void
671MacOS_Init()
672{
673 PyObject *m, *d;
674
675 m = Py_InitModule("MacOS", MacOS_Methods);
676 d = PyModule_GetDict(m);
677
678 /* Initialize MacOS.Error exception */
Guido van Rossumbf068b11995-01-25 23:09:20 +0000679 MacOS_Error = PyMac_GetOSErrException();
Guido van Rossume433c971994-09-29 10:02:56 +0000680 if (MacOS_Error == NULL || PyDict_SetItemString(d, "Error", MacOS_Error) != 0)
Guido van Rossum2d167031994-09-16 10:54:21 +0000681 Py_FatalError("can't define MacOS.Error");
Jack Jansenf73bab71997-04-03 14:51:03 +0000682 /*
683 ** This is a hack: the following constant added to the id() of a string
684 ** object gives you the address of the data. Unfortunately, it is needed for
685 ** some of the image and sound processing interfaces on the mac:-(
686 */
687 {
688 PyStringObject *p = 0;
689 long off = (long)&(p->ob_sval[0]);
690
691 if( PyDict_SetItemString(d, "string_id_to_buffer", Py_BuildValue("i", off)) != 0)
692 Py_FatalError("Can't define MacOS.string_id_to_buffer");
693 }
Guido van Rossum2d167031994-09-16 10:54:21 +0000694}
Guido van Rossume7134aa1995-02-26 10:20:53 +0000695