blob: 1717d39e4aceb707acb09fb91268b5198392f0f7 [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 )
Jack Jansen120a1051997-06-03 15:29:41 +0000485 old = 0;
Jack Jansen2e871e41997-09-08 13:23:19 +0000486 else
487 old = -1;
Jack Jansen120a1051997-06-03 15:29:41 +0000488 if ( new > 0 ) {
489 schp.process_events = mDownMask|keyDownMask|osMask;
490 schp.check_interrupt = 1;
Jack Jansen2e871e41997-09-08 13:23:19 +0000491 } else if ( new == 0 ) {
Jack Jansen120a1051997-06-03 15:29:41 +0000492 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 Jansen883765e1997-06-20 16:19:38 +0000502static char setevh_doc[] = "Set python event handler to be called in mainloop";
503
504static PyObject *
505MacOS_SetEventHandler(self, args)
506 PyObject *self;
507 PyObject *args;
508{
509 PyObject *evh = NULL;
510
511 if (!PyArg_ParseTuple(args, "|O", &evh))
512 return NULL;
513 if (evh == Py_None)
514 evh = NULL;
515 if ( evh && !PyCallable_Check(evh) ) {
516 PyErr_SetString(PyExc_ValueError, "SetEventHandler argument must be callable");
517 return NULL;
518 }
519 if ( !PyMac_SetEventHandler(evh) )
520 return NULL;
521 Py_INCREF(Py_None);
522 return Py_None;
523}
524
Jack Jansen120a1051997-06-03 15:29:41 +0000525static char handleev_doc[] = "Pass event to other interested parties like sioux";
Jack Jansena76382a1995-02-02 14:25:56 +0000526
527static PyObject *
528MacOS_HandleEvent(PyObject *self, PyObject *args)
529{
530 EventRecord ev;
531
532 if (!PyArg_ParseTuple(args, "O&", PyMac_GetEventRecord, &ev))
533 return NULL;
Jack Jansen883765e1997-06-20 16:19:38 +0000534 PyMac_HandleEventIntern(&ev);
Jack Jansena76382a1995-02-02 14:25:56 +0000535 Py_INCREF(Py_None);
536 return Py_None;
537}
538
Jack Jansen120a1051997-06-03 15:29:41 +0000539static char geterr_doc[] = "Convert OSErr number to string";
540
Jack Jansen829f88c1995-07-17 11:36:01 +0000541static PyObject *
542MacOS_GetErrorString(PyObject *self, PyObject *args)
543{
544 int errn;
545
546 if (!PyArg_ParseTuple(args, "i", &errn))
547 return NULL;
548 return Py_BuildValue("s", PyMac_StrError(errn));
549}
550
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000551static char splash_doc[] = "Open a splash-screen dialog by resource-id (0=close)";
552
553static PyObject *
554MacOS_splash(PyObject *self, PyObject *args)
555{
Jack Jansendf34cf11996-09-15 22:12:00 +0000556 int resid = -1;
Jack Jansen450ae9f1997-05-13 15:41:48 +0000557 static DialogPtr curdialog = NULL;
Jack Jansen2e871e41997-09-08 13:23:19 +0000558 DialogPtr olddialog;
Jack Jansen04df9d51996-09-23 15:49:43 +0000559 WindowRef theWindow;
560 CGrafPtr thePort;
Jack Jansen04df9d51996-09-23 15:49:43 +0000561 short xpos, ypos, width, height, swidth, sheight;
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000562
Jack Jansendf34cf11996-09-15 22:12:00 +0000563 if (!PyArg_ParseTuple(args, "|i", &resid))
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000564 return NULL;
Jack Jansen2e871e41997-09-08 13:23:19 +0000565 olddialog = curdialog;
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000566
Jack Jansendf34cf11996-09-15 22:12:00 +0000567 if ( resid != -1 ) {
568 curdialog = GetNewDialog(resid, NULL, (WindowPtr)-1);
Jack Jansen04df9d51996-09-23 15:49:43 +0000569 if ( curdialog ) {
570 theWindow = GetDialogWindow(curdialog);
571 thePort = GetWindowPort(theWindow);
572 width = thePort->portRect.right - thePort->portRect.left;
573 height = thePort->portRect.bottom - thePort->portRect.top;
574 swidth = qd.screenBits.bounds.right - qd.screenBits.bounds.left;
575 sheight = qd.screenBits.bounds.bottom - qd.screenBits.bounds.top - LMGetMBarHeight();
576 xpos = (swidth-width)/2;
577 ypos = (sheight-height)/5 + LMGetMBarHeight();
578 MoveWindow(theWindow, xpos, ypos, 0);
579 ShowWindow(theWindow);
Jack Jansendf34cf11996-09-15 22:12:00 +0000580 DrawDialog(curdialog);
Jack Jansen04df9d51996-09-23 15:49:43 +0000581 }
Jack Jansendf34cf11996-09-15 22:12:00 +0000582 }
Jack Jansen2e871e41997-09-08 13:23:19 +0000583 if (olddialog)
584 DisposeDialog(olddialog);
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000585 Py_INCREF(Py_None);
586 return Py_None;
587}
588
Jack Janseneb76b841996-09-30 14:43:22 +0000589static char DebugStr_doc[] = "Switch to low-level debugger with a message";
590
591static PyObject *
592MacOS_DebugStr(PyObject *self, PyObject *args)
593{
594 Str255 message;
595 PyObject *object = 0;
596
597 if (!PyArg_ParseTuple(args, "O&|O", PyMac_GetStr255, message, &object))
598 return NULL;
599 DebugStr(message);
600 Py_INCREF(Py_None);
601 return Py_None;
602}
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000603
Jack Jansen2e871e41997-09-08 13:23:19 +0000604static char SysBeep_doc[] = "BEEEEEP!!!";
605
606static PyObject *
607MacOS_SysBeep(PyObject *self, PyObject *args)
608{
609 int duration = 6;
610
611 if (!PyArg_ParseTuple(args, "|i", &duration))
612 return NULL;
613 SysBeep(duration);
614 Py_INCREF(Py_None);
615 return Py_None;
616}
617
Jack Jansen898ac1b1997-09-01 15:38:12 +0000618static char GetTicks_doc[] = "Return number of ticks since bootup";
619
620static PyObject *
621MacOS_GetTicks(PyObject *self, PyObject *args)
622{
623 return Py_BuildValue("i", (int)LMGetTicks());
624}
625
Jack Jansen76a05891996-02-29 16:11:32 +0000626static char openrf_doc[] = "Open resource fork of a file";
627
628static PyObject *
629MacOS_openrf(PyObject *self, PyObject *args)
630{
631 OSErr err;
632 char *mode = "r";
633 FSSpec fss;
634 SignedByte permission = 1;
635 rfobject *fp;
636
637 if (!PyArg_ParseTuple(args, "O&|s", PyMac_GetFSSpec, &fss, &mode))
638 return NULL;
639 while (*mode) {
640 switch (*mode++) {
641 case '*': break;
642 case 'r': permission = 1; break;
643 case 'w': permission = 2; break;
644 case 'b': break;
645 default:
646 PyErr_BadArgument();
647 return NULL;
648 }
649 }
650
651 if ( (fp = newrfobject()) == NULL )
652 return NULL;
653
654 err = HOpenRF(fss.vRefNum, fss.parID, fss.name, permission, &fp->fRefNum);
655
656 if ( err == fnfErr ) {
657 /* In stead of doing complicated things here to get creator/type
658 ** correct we let the standard i/o library handle it
659 */
660 FILE *tfp;
661 char pathname[257];
662
Jack Jansen84fb1fa1996-11-09 18:46:57 +0000663 if ( err=PyMac_GetFullPath(&fss, pathname) ) {
Jack Jansen76a05891996-02-29 16:11:32 +0000664 PyMac_Error(err);
665 Py_DECREF(fp);
666 return NULL;
667 }
668
669 if ( (tfp = fopen(pathname, "w")) == NULL ) {
670 PyMac_Error(fnfErr); /* What else... */
671 Py_DECREF(fp);
672 return NULL;
673 }
674 fclose(tfp);
675 err = HOpenRF(fss.vRefNum, fss.parID, fss.name, permission, &fp->fRefNum);
676 }
677 if ( err ) {
678 Py_DECREF(fp);
679 PyMac_Error(err);
680 return NULL;
681 }
682 fp->isclosed = 0;
683 return (PyObject *)fp;
684}
685
Guido van Rossum2d167031994-09-16 10:54:21 +0000686static PyMethodDef MacOS_Methods[] = {
Jack Jansen120a1051997-06-03 15:29:41 +0000687 {"AcceptHighLevelEvent", MacOS_AcceptHighLevelEvent, 1, accepthle_doc},
688 {"GetCreatorAndType", MacOS_GetCreatorAndType, 1, getcrtp_doc},
689 {"SetCreatorAndType", MacOS_SetCreatorAndType, 1, setcrtp_doc},
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000690#ifdef USE_STDWIN
691 {"SetHighLevelEventHandler", MacOS_SetHighLevelEventHandler, 1},
692#endif
Jack Jansen120a1051997-06-03 15:29:41 +0000693 {"SchedParams", MacOS_SchedParams, 1, schedparams_doc},
694 {"EnableAppswitch", MacOS_EnableAppswitch, 1, appswitch_doc},
Jack Jansen883765e1997-06-20 16:19:38 +0000695 {"SetEventHandler", MacOS_SetEventHandler, 1, setevh_doc},
Jack Jansen120a1051997-06-03 15:29:41 +0000696 {"HandleEvent", MacOS_HandleEvent, 1, handleev_doc},
697 {"GetErrorString", MacOS_GetErrorString, 1, geterr_doc},
698 {"openrf", MacOS_openrf, 1, openrf_doc},
699 {"splash", MacOS_splash, 1, splash_doc},
700 {"DebugStr", MacOS_DebugStr, 1, DebugStr_doc},
Jack Jansen898ac1b1997-09-01 15:38:12 +0000701 {"GetTicks", MacOS_GetTicks, 1, GetTicks_doc},
Jack Jansen2e871e41997-09-08 13:23:19 +0000702 {"SysBeep", MacOS_SysBeep, 1, SysBeep_doc},
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000703 {NULL, NULL} /* Sentinel */
Guido van Rossum2d167031994-09-16 10:54:21 +0000704};
705
706
707void
708MacOS_Init()
709{
710 PyObject *m, *d;
711
712 m = Py_InitModule("MacOS", MacOS_Methods);
713 d = PyModule_GetDict(m);
714
715 /* Initialize MacOS.Error exception */
Guido van Rossumbf068b11995-01-25 23:09:20 +0000716 MacOS_Error = PyMac_GetOSErrException();
Guido van Rossume433c971994-09-29 10:02:56 +0000717 if (MacOS_Error == NULL || PyDict_SetItemString(d, "Error", MacOS_Error) != 0)
Guido van Rossum2d167031994-09-16 10:54:21 +0000718 Py_FatalError("can't define MacOS.Error");
Jack Jansenf73bab71997-04-03 14:51:03 +0000719 /*
720 ** This is a hack: the following constant added to the id() of a string
721 ** object gives you the address of the data. Unfortunately, it is needed for
722 ** some of the image and sound processing interfaces on the mac:-(
723 */
724 {
725 PyStringObject *p = 0;
726 long off = (long)&(p->ob_sval[0]);
727
728 if( PyDict_SetItemString(d, "string_id_to_buffer", Py_BuildValue("i", off)) != 0)
729 Py_FatalError("Can't define MacOS.string_id_to_buffer");
730 }
Guido van Rossum2d167031994-09-16 10:54:21 +0000731}
Guido van Rossume7134aa1995-02-26 10:20:53 +0000732