blob: a17300dec5208dcc3b889924d88f24b9a9f2f51f [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 Jansencbe6a531998-02-20 15:59:59 +000033#include <Sound.h>
Jack Jansenee23d6e1995-01-27 14:43:25 +000034
Guido van Rossum2d167031994-09-16 10:54:21 +000035static PyObject *MacOS_Error; /* Exception MacOS.Error */
36
Guido van Rossume6d9ccc1995-02-21 21:01:05 +000037#ifdef MPW
Guido van Rossum9fed1831995-02-18 15:02:02 +000038#define bufferIsSmall -607 /*error returns from Post and Accept */
39#endif
40
Jack Jansen76a05891996-02-29 16:11:32 +000041static PyObject *ErrorObject;
42
43/* ----------------------------------------------------- */
44
45/* Declarations for objects of type Resource fork */
46
47typedef struct {
48 PyObject_HEAD
49 short fRefNum;
50 int isclosed;
51} rfobject;
52
53staticforward PyTypeObject Rftype;
54
55
56
57/* ---------------------------------------------------------------- */
58
59static void
60do_close(self)
61 rfobject *self;
62{
63 if (self->isclosed ) return;
64 (void)FSClose(self->fRefNum);
65 self->isclosed = 1;
66}
67
68static char rf_read__doc__[] =
69"Read data from resource fork"
70;
71
72static PyObject *
73rf_read(self, args)
74 rfobject *self;
75 PyObject *args;
76{
77 long n;
78 PyObject *v;
79 OSErr err;
80
81 if (self->isclosed) {
82 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
83 return NULL;
84 }
85
86 if (!PyArg_ParseTuple(args, "l", &n))
87 return NULL;
88
89 v = PyString_FromStringAndSize((char *)NULL, n);
90 if (v == NULL)
91 return NULL;
92
93 err = FSRead(self->fRefNum, &n, PyString_AsString(v));
94 if (err && err != eofErr) {
95 PyMac_Error(err);
96 Py_DECREF(v);
97 return NULL;
98 }
99 _PyString_Resize(&v, n);
100 return v;
101}
102
103
104static char rf_write__doc__[] =
105"Write to resource fork"
106;
107
108static PyObject *
109rf_write(self, args)
110 rfobject *self;
111 PyObject *args;
112{
113 char *buffer;
114 long size;
115 OSErr err;
116
117 if (self->isclosed) {
118 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
119 return NULL;
120 }
Jack Janseneeccca91997-05-07 15:46:31 +0000121 if (!PyArg_ParseTuple(args, "s#", &buffer, &size))
Jack Jansen76a05891996-02-29 16:11:32 +0000122 return NULL;
123 err = FSWrite(self->fRefNum, &size, buffer);
124 if (err) {
125 PyMac_Error(err);
126 return NULL;
127 }
128 Py_INCREF(Py_None);
129 return Py_None;
130}
131
132
133static char rf_seek__doc__[] =
134"Set file position"
135;
136
137static PyObject *
138rf_seek(self, args)
139 rfobject *self;
140 PyObject *args;
141{
142 long amount, pos;
143 int whence = SEEK_SET;
144 long eof;
145 OSErr err;
146
147 if (self->isclosed) {
148 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
149 return NULL;
150 }
151 if (!PyArg_ParseTuple(args, "l|i", &amount, &whence))
152 return NULL;
153
154 if ( err = GetEOF(self->fRefNum, &eof))
155 goto ioerr;
156
157 switch (whence) {
158 case SEEK_CUR:
159 if (err = GetFPos(self->fRefNum, &pos))
160 goto ioerr;
161 break;
162 case SEEK_END:
163 pos = eof;
164 break;
165 case SEEK_SET:
166 pos = 0;
167 break;
168 default:
169 PyErr_BadArgument();
170 return NULL;
171 }
172
173 pos += amount;
174
175 /* Don't bother implementing seek past EOF */
176 if (pos > eof || pos < 0) {
177 PyErr_BadArgument();
178 return NULL;
179 }
180
181 if ( err = SetFPos(self->fRefNum, fsFromStart, pos) ) {
182ioerr:
183 PyMac_Error(err);
184 return NULL;
185 }
186 Py_INCREF(Py_None);
187 return Py_None;
188}
189
190
191static char rf_tell__doc__[] =
192"Get file position"
193;
194
195static PyObject *
196rf_tell(self, args)
197 rfobject *self;
198 PyObject *args;
199{
200 long where;
201 OSErr err;
202
203 if (self->isclosed) {
204 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
205 return NULL;
206 }
207 if (!PyArg_ParseTuple(args, ""))
208 return NULL;
209 if ( err = GetFPos(self->fRefNum, &where) ) {
210 PyMac_Error(err);
211 return NULL;
212 }
213 return PyInt_FromLong(where);
214}
215
216static char rf_close__doc__[] =
217"Close resource fork"
218;
219
220static PyObject *
221rf_close(self, args)
222 rfobject *self;
223 PyObject *args;
224{
Jack Jansen76a05891996-02-29 16:11:32 +0000225 if (!PyArg_ParseTuple(args, ""))
226 return NULL;
227 do_close(self);
228 Py_INCREF(Py_None);
229 return Py_None;
230}
231
232
233static struct PyMethodDef rf_methods[] = {
234 {"read", rf_read, 1, rf_read__doc__},
235 {"write", rf_write, 1, rf_write__doc__},
236 {"seek", rf_seek, 1, rf_seek__doc__},
237 {"tell", rf_tell, 1, rf_tell__doc__},
238 {"close", rf_close, 1, rf_close__doc__},
239
240 {NULL, NULL} /* sentinel */
241};
242
243/* ---------- */
244
245
246static rfobject *
247newrfobject()
248{
249 rfobject *self;
250
251 self = PyObject_NEW(rfobject, &Rftype);
252 if (self == NULL)
253 return NULL;
254 self->isclosed = 1;
255 return self;
256}
257
258
259static void
260rf_dealloc(self)
261 rfobject *self;
262{
263 do_close(self);
264 PyMem_DEL(self);
265}
266
267static PyObject *
268rf_getattr(self, name)
269 rfobject *self;
270 char *name;
271{
272 return Py_FindMethod(rf_methods, (PyObject *)self, name);
273}
274
275static char Rftype__doc__[] =
276"Resource fork file object"
277;
278
279static PyTypeObject Rftype = {
280 PyObject_HEAD_INIT(&PyType_Type)
281 0, /*ob_size*/
Jack Jansena755e681997-09-20 17:40:22 +0000282 "ResourceFork", /*tp_name*/
Jack Jansen76a05891996-02-29 16:11:32 +0000283 sizeof(rfobject), /*tp_basicsize*/
284 0, /*tp_itemsize*/
285 /* methods */
286 (destructor)rf_dealloc, /*tp_dealloc*/
287 (printfunc)0, /*tp_print*/
288 (getattrfunc)rf_getattr, /*tp_getattr*/
289 (setattrfunc)0, /*tp_setattr*/
290 (cmpfunc)0, /*tp_compare*/
291 (reprfunc)0, /*tp_repr*/
292 0, /*tp_as_number*/
293 0, /*tp_as_sequence*/
294 0, /*tp_as_mapping*/
295 (hashfunc)0, /*tp_hash*/
296 (ternaryfunc)0, /*tp_call*/
297 (reprfunc)0, /*tp_str*/
298
299 /* Space for future expansion */
300 0L,0L,0L,0L,
301 Rftype__doc__ /* Documentation string */
302};
303
304/* End of code for Resource fork objects */
305/* -------------------------------------------------------- */
Guido van Rossum2d167031994-09-16 10:54:21 +0000306
307/*----------------------------------------------------------------------*/
Guido van Rossume791c2e1995-01-09 13:20:04 +0000308/* Miscellaneous File System Operations */
309
Jack Jansen120a1051997-06-03 15:29:41 +0000310static char getcrtp_doc[] = "Obsolete, use macfs module";
311
Guido van Rossume791c2e1995-01-09 13:20:04 +0000312static PyObject *
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000313MacOS_GetCreatorAndType(PyObject *self, PyObject *args)
Guido van Rossume791c2e1995-01-09 13:20:04 +0000314{
315 Str255 name;
316 FInfo info;
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000317 PyObject *creator, *type, *res;
Guido van Rossume791c2e1995-01-09 13:20:04 +0000318 OSErr err;
319
Guido van Rossum9aa3d131995-01-21 13:46:04 +0000320 if (!PyArg_ParseTuple(args, "O&", PyMac_GetStr255, &name))
Guido van Rossume791c2e1995-01-09 13:20:04 +0000321 return NULL;
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000322 if ((err = GetFInfo(name, 0, &info)) != noErr)
323 return PyErr_Mac(MacOS_Error, err);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000324 creator = PyString_FromStringAndSize((char *)&info.fdCreator, 4);
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000325 type = PyString_FromStringAndSize((char *)&info.fdType, 4);
326 res = Py_BuildValue("OO", creator, type);
Guido van Rossumfffb8bb1995-01-12 12:37:24 +0000327 Py_DECREF(creator);
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000328 Py_DECREF(type);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000329 return res;
330}
331
Jack Jansen120a1051997-06-03 15:29:41 +0000332static char setcrtp_doc[] = "Obsolete, use macfs module";
333
Guido van Rossume791c2e1995-01-09 13:20:04 +0000334static PyObject *
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000335MacOS_SetCreatorAndType(PyObject *self, PyObject *args)
Guido van Rossume791c2e1995-01-09 13:20:04 +0000336{
337 Str255 name;
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000338 ResType creator, type;
Guido van Rossume791c2e1995-01-09 13:20:04 +0000339 FInfo info;
340 OSErr err;
341
342 if (!PyArg_ParseTuple(args, "O&O&O&",
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000343 PyMac_GetStr255, &name, PyMac_GetOSType, &creator, PyMac_GetOSType, &type))
Guido van Rossume791c2e1995-01-09 13:20:04 +0000344 return NULL;
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000345 if ((err = GetFInfo(name, 0, &info)) != noErr)
346 return PyErr_Mac(MacOS_Error, err);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000347 info.fdCreator = creator;
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000348 info.fdType = type;
349 if ((err = SetFInfo(name, 0, &info)) != noErr)
350 return PyErr_Mac(MacOS_Error, err);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000351 Py_INCREF(Py_None);
352 return Py_None;
353}
354
355/*----------------------------------------------------------------------*/
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000356/* STDWIN High Level Event interface */
357
358#include <EPPC.h>
359#include <Events.h>
360
361#ifdef USE_STDWIN
362
363extern void (*_w_high_level_event_proc)(EventRecord *);
364
365static PyObject *MacOS_HighLevelEventHandler = NULL;
366
367static void
Guido van Rossumbf068b11995-01-25 23:09:20 +0000368MacOS_HighLevelEventProc(EventRecord *e)
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000369{
370 if (MacOS_HighLevelEventHandler != NULL) {
Guido van Rossumbf068b11995-01-25 23:09:20 +0000371 PyObject *args = PyMac_BuildEventRecord(e);
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000372 PyObject *res;
373 if (args == NULL)
374 res = NULL;
375 else {
376 res = PyEval_CallObject(MacOS_HighLevelEventHandler, args);
377 Py_DECREF(args);
378 }
379 if (res == NULL) {
380 fprintf(stderr, "Exception in MacOS_HighLevelEventProc:\n");
381 PyErr_Print();
382 }
383 else
384 Py_DECREF(res);
385 }
386}
387
Jack Jansene8e8ae01995-01-26 16:36:45 +0000388/* XXXX Need to come here from PyMac_DoYield too... */
389
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000390static PyObject *
391MacOS_SetHighLevelEventHandler(self, args)
392 PyObject *self;
393 PyObject *args;
394{
395 PyObject *previous = MacOS_HighLevelEventHandler;
396 PyObject *next = NULL;
397 if (!PyArg_ParseTuple(args, "|O", &next))
398 return NULL;
399 if (next == Py_None)
400 next = NULL;
401 Py_INCREF(next);
402 MacOS_HighLevelEventHandler = next;
403 if (next == NULL)
404 _w_high_level_event_proc = NULL;
405 else
406 _w_high_level_event_proc = MacOS_HighLevelEventProc;
407 if (previous == NULL) {
408 Py_INCREF(Py_None);
409 previous = Py_None;
410 }
411 return previous;
412}
413
414#endif /* USE_STDWIN */
415
Jack Jansen120a1051997-06-03 15:29:41 +0000416static char accepthle_doc[] = "Get arguments of pending high-level event";
417
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000418static PyObject *
419MacOS_AcceptHighLevelEvent(self, args)
420 PyObject *self;
421 PyObject *args;
422{
423 TargetID sender;
424 unsigned long refcon;
425 Ptr buf;
426 unsigned long len;
427 OSErr err;
428 PyObject *res;
429
430 buf = NULL;
431 len = 0;
432 err = AcceptHighLevelEvent(&sender, &refcon, buf, &len);
433 if (err == bufferIsSmall) {
434 buf = malloc(len);
435 if (buf == NULL)
436 return PyErr_NoMemory();
437 err = AcceptHighLevelEvent(&sender, &refcon, buf, &len);
438 if (err != noErr) {
439 free(buf);
440 return PyErr_Mac(MacOS_Error, (int)err);
441 }
442 }
443 else if (err != noErr)
444 return PyErr_Mac(MacOS_Error, (int)err);
445 res = Py_BuildValue("s#ls#",
446 (char *)&sender, (int)(sizeof sender), refcon, (char *)buf, (int)len);
447 free(buf);
448 return res;
449}
450
Jack Jansen120a1051997-06-03 15:29:41 +0000451static char schedparams_doc[] = "Set/return mainloop interrupt check flag, etc";
452
Jack Jansene8e8ae01995-01-26 16:36:45 +0000453/*
Jack Jansen120a1051997-06-03 15:29:41 +0000454** Set scheduler parameters
Jack Jansene8e8ae01995-01-26 16:36:45 +0000455*/
456static PyObject *
Jack Jansen120a1051997-06-03 15:29:41 +0000457MacOS_SchedParams(PyObject *self, PyObject *args)
Jack Jansene8e8ae01995-01-26 16:36:45 +0000458{
Jack Jansen120a1051997-06-03 15:29:41 +0000459 PyMacSchedParams old, new;
Jack Jansene8e8ae01995-01-26 16:36:45 +0000460
Jack Jansen120a1051997-06-03 15:29:41 +0000461 PyMac_GetSchedParams(&old);
462 new = old;
463 if (!PyArg_ParseTuple(args, "|iiidd", &new.check_interrupt, &new.process_events,
464 &new.besocial, &new.check_interval, &new.bg_yield))
Jack Jansene8e8ae01995-01-26 16:36:45 +0000465 return NULL;
Jack Jansen120a1051997-06-03 15:29:41 +0000466 PyMac_SetSchedParams(&new);
467 return Py_BuildValue("iiidd", old.check_interrupt, old.process_events,
468 old.besocial, old.check_interval, old.bg_yield);
Jack Jansene8e8ae01995-01-26 16:36:45 +0000469}
470
Jack Jansen120a1051997-06-03 15:29:41 +0000471static char appswitch_doc[] = "Obsolete, use SchedParams";
472
473/* Obsolete, for backward compatability */
Jack Jansenee23d6e1995-01-27 14:43:25 +0000474static PyObject *
475MacOS_EnableAppswitch(PyObject *self, PyObject *args)
476{
Jack Jansen120a1051997-06-03 15:29:41 +0000477 int new, old;
478 PyMacSchedParams schp;
Jack Jansenee23d6e1995-01-27 14:43:25 +0000479
Guido van Rossume7134aa1995-02-26 10:20:53 +0000480 if (!PyArg_ParseTuple(args, "i", &new))
Jack Jansenee23d6e1995-01-27 14:43:25 +0000481 return NULL;
Jack Jansen120a1051997-06-03 15:29:41 +0000482 PyMac_GetSchedParams(&schp);
483 if ( schp.process_events )
484 old = 1;
485 else if ( schp.check_interrupt )
Jack Jansen120a1051997-06-03 15:29:41 +0000486 old = 0;
Jack Jansen2e871e41997-09-08 13:23:19 +0000487 else
488 old = -1;
Jack Jansen120a1051997-06-03 15:29:41 +0000489 if ( new > 0 ) {
490 schp.process_events = mDownMask|keyDownMask|osMask;
491 schp.check_interrupt = 1;
Jack Jansen2e871e41997-09-08 13:23:19 +0000492 } else if ( new == 0 ) {
Jack Jansen120a1051997-06-03 15:29:41 +0000493 schp.process_events = 0;
494 schp.check_interrupt = 1;
495 } else {
496 schp.process_events = 0;
497 schp.check_interrupt = 0;
498 }
499 PyMac_SetSchedParams(&schp);
Guido van Rossume7134aa1995-02-26 10:20:53 +0000500 return Py_BuildValue("i", old);
Jack Jansenee23d6e1995-01-27 14:43:25 +0000501}
502
Jack Jansen883765e1997-06-20 16:19:38 +0000503static char setevh_doc[] = "Set python event handler to be called in mainloop";
504
505static PyObject *
506MacOS_SetEventHandler(self, args)
507 PyObject *self;
508 PyObject *args;
509{
510 PyObject *evh = NULL;
511
512 if (!PyArg_ParseTuple(args, "|O", &evh))
513 return NULL;
514 if (evh == Py_None)
515 evh = NULL;
516 if ( evh && !PyCallable_Check(evh) ) {
517 PyErr_SetString(PyExc_ValueError, "SetEventHandler argument must be callable");
518 return NULL;
519 }
520 if ( !PyMac_SetEventHandler(evh) )
521 return NULL;
522 Py_INCREF(Py_None);
523 return Py_None;
524}
525
Jack Jansen120a1051997-06-03 15:29:41 +0000526static char handleev_doc[] = "Pass event to other interested parties like sioux";
Jack Jansena76382a1995-02-02 14:25:56 +0000527
528static PyObject *
529MacOS_HandleEvent(PyObject *self, PyObject *args)
530{
531 EventRecord ev;
532
533 if (!PyArg_ParseTuple(args, "O&", PyMac_GetEventRecord, &ev))
534 return NULL;
Jack Jansen883765e1997-06-20 16:19:38 +0000535 PyMac_HandleEventIntern(&ev);
Jack Jansena76382a1995-02-02 14:25:56 +0000536 Py_INCREF(Py_None);
537 return Py_None;
538}
539
Jack Jansen120a1051997-06-03 15:29:41 +0000540static char geterr_doc[] = "Convert OSErr number to string";
541
Jack Jansen829f88c1995-07-17 11:36:01 +0000542static PyObject *
543MacOS_GetErrorString(PyObject *self, PyObject *args)
544{
545 int errn;
546
547 if (!PyArg_ParseTuple(args, "i", &errn))
548 return NULL;
549 return Py_BuildValue("s", PyMac_StrError(errn));
550}
551
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000552static char splash_doc[] = "Open a splash-screen dialog by resource-id (0=close)";
553
554static PyObject *
555MacOS_splash(PyObject *self, PyObject *args)
556{
Jack Jansendf34cf11996-09-15 22:12:00 +0000557 int resid = -1;
Jack Jansen450ae9f1997-05-13 15:41:48 +0000558 static DialogPtr curdialog = NULL;
Jack Jansen2e871e41997-09-08 13:23:19 +0000559 DialogPtr olddialog;
Jack Jansen04df9d51996-09-23 15:49:43 +0000560 WindowRef theWindow;
561 CGrafPtr thePort;
Jack Jansen04df9d51996-09-23 15:49:43 +0000562 short xpos, ypos, width, height, swidth, sheight;
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000563
Jack Jansendf34cf11996-09-15 22:12:00 +0000564 if (!PyArg_ParseTuple(args, "|i", &resid))
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000565 return NULL;
Jack Jansen2e871e41997-09-08 13:23:19 +0000566 olddialog = curdialog;
Jack Jansencbe6a531998-02-20 15:59:59 +0000567 curdialog = NULL;
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000568
Jack Jansendf34cf11996-09-15 22:12:00 +0000569 if ( resid != -1 ) {
570 curdialog = GetNewDialog(resid, NULL, (WindowPtr)-1);
Jack Jansen04df9d51996-09-23 15:49:43 +0000571 if ( curdialog ) {
572 theWindow = GetDialogWindow(curdialog);
573 thePort = GetWindowPort(theWindow);
574 width = thePort->portRect.right - thePort->portRect.left;
575 height = thePort->portRect.bottom - thePort->portRect.top;
576 swidth = qd.screenBits.bounds.right - qd.screenBits.bounds.left;
577 sheight = qd.screenBits.bounds.bottom - qd.screenBits.bounds.top - LMGetMBarHeight();
578 xpos = (swidth-width)/2;
579 ypos = (sheight-height)/5 + LMGetMBarHeight();
580 MoveWindow(theWindow, xpos, ypos, 0);
581 ShowWindow(theWindow);
Jack Jansendf34cf11996-09-15 22:12:00 +0000582 DrawDialog(curdialog);
Jack Jansen04df9d51996-09-23 15:49:43 +0000583 }
Jack Jansendf34cf11996-09-15 22:12:00 +0000584 }
Jack Jansen2e871e41997-09-08 13:23:19 +0000585 if (olddialog)
586 DisposeDialog(olddialog);
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000587 Py_INCREF(Py_None);
588 return Py_None;
589}
590
Jack Janseneb76b841996-09-30 14:43:22 +0000591static char DebugStr_doc[] = "Switch to low-level debugger with a message";
592
593static PyObject *
594MacOS_DebugStr(PyObject *self, PyObject *args)
595{
596 Str255 message;
597 PyObject *object = 0;
598
599 if (!PyArg_ParseTuple(args, "O&|O", PyMac_GetStr255, message, &object))
600 return NULL;
601 DebugStr(message);
602 Py_INCREF(Py_None);
603 return Py_None;
604}
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000605
Jack Jansen2e871e41997-09-08 13:23:19 +0000606static char SysBeep_doc[] = "BEEEEEP!!!";
607
608static PyObject *
609MacOS_SysBeep(PyObject *self, PyObject *args)
610{
611 int duration = 6;
612
613 if (!PyArg_ParseTuple(args, "|i", &duration))
614 return NULL;
615 SysBeep(duration);
616 Py_INCREF(Py_None);
617 return Py_None;
618}
619
Jack Jansen898ac1b1997-09-01 15:38:12 +0000620static char GetTicks_doc[] = "Return number of ticks since bootup";
621
622static PyObject *
623MacOS_GetTicks(PyObject *self, PyObject *args)
624{
625 return Py_BuildValue("i", (int)LMGetTicks());
626}
627
Jack Jansen76a05891996-02-29 16:11:32 +0000628static char openrf_doc[] = "Open resource fork of a file";
629
630static PyObject *
631MacOS_openrf(PyObject *self, PyObject *args)
632{
633 OSErr err;
634 char *mode = "r";
635 FSSpec fss;
636 SignedByte permission = 1;
637 rfobject *fp;
638
639 if (!PyArg_ParseTuple(args, "O&|s", PyMac_GetFSSpec, &fss, &mode))
640 return NULL;
641 while (*mode) {
642 switch (*mode++) {
643 case '*': break;
644 case 'r': permission = 1; break;
645 case 'w': permission = 2; break;
646 case 'b': break;
647 default:
648 PyErr_BadArgument();
649 return NULL;
650 }
651 }
652
653 if ( (fp = newrfobject()) == NULL )
654 return NULL;
655
656 err = HOpenRF(fss.vRefNum, fss.parID, fss.name, permission, &fp->fRefNum);
657
658 if ( err == fnfErr ) {
659 /* In stead of doing complicated things here to get creator/type
660 ** correct we let the standard i/o library handle it
661 */
662 FILE *tfp;
663 char pathname[257];
664
Jack Jansen84fb1fa1996-11-09 18:46:57 +0000665 if ( err=PyMac_GetFullPath(&fss, pathname) ) {
Jack Jansen76a05891996-02-29 16:11:32 +0000666 PyMac_Error(err);
667 Py_DECREF(fp);
668 return NULL;
669 }
670
671 if ( (tfp = fopen(pathname, "w")) == NULL ) {
672 PyMac_Error(fnfErr); /* What else... */
673 Py_DECREF(fp);
674 return NULL;
675 }
676 fclose(tfp);
677 err = HOpenRF(fss.vRefNum, fss.parID, fss.name, permission, &fp->fRefNum);
678 }
679 if ( err ) {
680 Py_DECREF(fp);
681 PyMac_Error(err);
682 return NULL;
683 }
684 fp->isclosed = 0;
685 return (PyObject *)fp;
686}
687
Guido van Rossum2d167031994-09-16 10:54:21 +0000688static PyMethodDef MacOS_Methods[] = {
Jack Jansen120a1051997-06-03 15:29:41 +0000689 {"AcceptHighLevelEvent", MacOS_AcceptHighLevelEvent, 1, accepthle_doc},
690 {"GetCreatorAndType", MacOS_GetCreatorAndType, 1, getcrtp_doc},
691 {"SetCreatorAndType", MacOS_SetCreatorAndType, 1, setcrtp_doc},
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000692#ifdef USE_STDWIN
693 {"SetHighLevelEventHandler", MacOS_SetHighLevelEventHandler, 1},
694#endif
Jack Jansen120a1051997-06-03 15:29:41 +0000695 {"SchedParams", MacOS_SchedParams, 1, schedparams_doc},
696 {"EnableAppswitch", MacOS_EnableAppswitch, 1, appswitch_doc},
Jack Jansen883765e1997-06-20 16:19:38 +0000697 {"SetEventHandler", MacOS_SetEventHandler, 1, setevh_doc},
Jack Jansen120a1051997-06-03 15:29:41 +0000698 {"HandleEvent", MacOS_HandleEvent, 1, handleev_doc},
699 {"GetErrorString", MacOS_GetErrorString, 1, geterr_doc},
700 {"openrf", MacOS_openrf, 1, openrf_doc},
701 {"splash", MacOS_splash, 1, splash_doc},
702 {"DebugStr", MacOS_DebugStr, 1, DebugStr_doc},
Jack Jansen898ac1b1997-09-01 15:38:12 +0000703 {"GetTicks", MacOS_GetTicks, 1, GetTicks_doc},
Jack Jansen2e871e41997-09-08 13:23:19 +0000704 {"SysBeep", MacOS_SysBeep, 1, SysBeep_doc},
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000705 {NULL, NULL} /* Sentinel */
Guido van Rossum2d167031994-09-16 10:54:21 +0000706};
707
708
709void
710MacOS_Init()
711{
712 PyObject *m, *d;
713
714 m = Py_InitModule("MacOS", MacOS_Methods);
715 d = PyModule_GetDict(m);
716
717 /* Initialize MacOS.Error exception */
Guido van Rossumbf068b11995-01-25 23:09:20 +0000718 MacOS_Error = PyMac_GetOSErrException();
Guido van Rossume433c971994-09-29 10:02:56 +0000719 if (MacOS_Error == NULL || PyDict_SetItemString(d, "Error", MacOS_Error) != 0)
Guido van Rossum2d167031994-09-16 10:54:21 +0000720 Py_FatalError("can't define MacOS.Error");
Jack Jansena755e681997-09-20 17:40:22 +0000721 Rftype.ob_type = &PyType_Type;
722 Py_INCREF(&Rftype);
723 if (PyDict_SetItemString(d, "ResourceForkType", (PyObject *)&Rftype) != 0)
724 Py_FatalError("can't define MacOS.ResourceForkType");
Jack Jansenf73bab71997-04-03 14:51:03 +0000725 /*
726 ** This is a hack: the following constant added to the id() of a string
727 ** object gives you the address of the data. Unfortunately, it is needed for
728 ** some of the image and sound processing interfaces on the mac:-(
729 */
730 {
731 PyStringObject *p = 0;
732 long off = (long)&(p->ob_sval[0]);
733
734 if( PyDict_SetItemString(d, "string_id_to_buffer", Py_BuildValue("i", off)) != 0)
735 Py_FatalError("Can't define MacOS.string_id_to_buffer");
736 }
Guido van Rossum2d167031994-09-16 10:54:21 +0000737}
Guido van Rossume7134aa1995-02-26 10:20:53 +0000738