blob: c99aa4bb9d640cb0063cb02f0da73e3307d3825a [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"
Jack Jansenb19c6672000-10-12 21:24:05 +000029#include "pythonresources.h"
Guido van Rossum2d167031994-09-16 10:54:21 +000030
Jack Jansen6143d532001-05-19 12:34:59 +000031#ifdef WITHOUT_FRAMEWORKS
Jack Jansenee23d6e1995-01-27 14:43:25 +000032#include <Windows.h>
Jack Jansen76a05891996-02-29 16:11:32 +000033#include <Files.h>
Jack Janseneb76b841996-09-30 14:43:22 +000034#include <LowMem.h>
Jack Jansencbe6a531998-02-20 15:59:59 +000035#include <Sound.h>
Jack Jansene79dc762000-06-02 21:35:07 +000036#include <Events.h>
Jack Jansen6143d532001-05-19 12:34:59 +000037#else
38#include <Carbon/Carbon.h>
39#endif
Jack Jansenee23d6e1995-01-27 14:43:25 +000040
Guido van Rossum2d167031994-09-16 10:54:21 +000041static PyObject *MacOS_Error; /* Exception MacOS.Error */
42
Guido van Rossume6d9ccc1995-02-21 21:01:05 +000043#ifdef MPW
Guido van Rossum9fed1831995-02-18 15:02:02 +000044#define bufferIsSmall -607 /*error returns from Post and Accept */
45#endif
46
Jack Jansen76a05891996-02-29 16:11:32 +000047static PyObject *ErrorObject;
48
49/* ----------------------------------------------------- */
50
51/* Declarations for objects of type Resource fork */
52
53typedef struct {
54 PyObject_HEAD
55 short fRefNum;
56 int isclosed;
57} rfobject;
58
59staticforward PyTypeObject Rftype;
60
61
62
63/* ---------------------------------------------------------------- */
64
65static void
66do_close(self)
67 rfobject *self;
68{
69 if (self->isclosed ) return;
70 (void)FSClose(self->fRefNum);
71 self->isclosed = 1;
72}
73
74static char rf_read__doc__[] =
75"Read data from resource fork"
76;
77
78static PyObject *
79rf_read(self, args)
80 rfobject *self;
81 PyObject *args;
82{
83 long n;
84 PyObject *v;
85 OSErr err;
86
87 if (self->isclosed) {
88 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
89 return NULL;
90 }
91
92 if (!PyArg_ParseTuple(args, "l", &n))
93 return NULL;
94
95 v = PyString_FromStringAndSize((char *)NULL, n);
96 if (v == NULL)
97 return NULL;
98
99 err = FSRead(self->fRefNum, &n, PyString_AsString(v));
100 if (err && err != eofErr) {
101 PyMac_Error(err);
102 Py_DECREF(v);
103 return NULL;
104 }
105 _PyString_Resize(&v, n);
106 return v;
107}
108
109
110static char rf_write__doc__[] =
111"Write to resource fork"
112;
113
114static PyObject *
115rf_write(self, args)
116 rfobject *self;
117 PyObject *args;
118{
119 char *buffer;
120 long size;
121 OSErr err;
122
123 if (self->isclosed) {
124 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
125 return NULL;
126 }
Jack Janseneeccca91997-05-07 15:46:31 +0000127 if (!PyArg_ParseTuple(args, "s#", &buffer, &size))
Jack Jansen76a05891996-02-29 16:11:32 +0000128 return NULL;
129 err = FSWrite(self->fRefNum, &size, buffer);
130 if (err) {
131 PyMac_Error(err);
132 return NULL;
133 }
134 Py_INCREF(Py_None);
135 return Py_None;
136}
137
138
139static char rf_seek__doc__[] =
140"Set file position"
141;
142
143static PyObject *
144rf_seek(self, args)
145 rfobject *self;
146 PyObject *args;
147{
148 long amount, pos;
149 int whence = SEEK_SET;
150 long eof;
151 OSErr err;
152
153 if (self->isclosed) {
154 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
155 return NULL;
156 }
157 if (!PyArg_ParseTuple(args, "l|i", &amount, &whence))
158 return NULL;
159
160 if ( err = GetEOF(self->fRefNum, &eof))
161 goto ioerr;
162
163 switch (whence) {
164 case SEEK_CUR:
165 if (err = GetFPos(self->fRefNum, &pos))
166 goto ioerr;
167 break;
168 case SEEK_END:
169 pos = eof;
170 break;
171 case SEEK_SET:
172 pos = 0;
173 break;
174 default:
175 PyErr_BadArgument();
176 return NULL;
177 }
178
179 pos += amount;
180
181 /* Don't bother implementing seek past EOF */
182 if (pos > eof || pos < 0) {
183 PyErr_BadArgument();
184 return NULL;
185 }
186
187 if ( err = SetFPos(self->fRefNum, fsFromStart, pos) ) {
188ioerr:
189 PyMac_Error(err);
190 return NULL;
191 }
192 Py_INCREF(Py_None);
193 return Py_None;
194}
195
196
197static char rf_tell__doc__[] =
198"Get file position"
199;
200
201static PyObject *
202rf_tell(self, args)
203 rfobject *self;
204 PyObject *args;
205{
206 long where;
207 OSErr err;
208
209 if (self->isclosed) {
210 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
211 return NULL;
212 }
213 if (!PyArg_ParseTuple(args, ""))
214 return NULL;
215 if ( err = GetFPos(self->fRefNum, &where) ) {
216 PyMac_Error(err);
217 return NULL;
218 }
219 return PyInt_FromLong(where);
220}
221
222static char rf_close__doc__[] =
223"Close resource fork"
224;
225
226static PyObject *
227rf_close(self, args)
228 rfobject *self;
229 PyObject *args;
230{
Jack Jansen76a05891996-02-29 16:11:32 +0000231 if (!PyArg_ParseTuple(args, ""))
232 return NULL;
233 do_close(self);
234 Py_INCREF(Py_None);
235 return Py_None;
236}
237
238
239static struct PyMethodDef rf_methods[] = {
240 {"read", rf_read, 1, rf_read__doc__},
241 {"write", rf_write, 1, rf_write__doc__},
242 {"seek", rf_seek, 1, rf_seek__doc__},
243 {"tell", rf_tell, 1, rf_tell__doc__},
244 {"close", rf_close, 1, rf_close__doc__},
245
246 {NULL, NULL} /* sentinel */
247};
248
249/* ---------- */
250
251
252static rfobject *
253newrfobject()
254{
255 rfobject *self;
256
257 self = PyObject_NEW(rfobject, &Rftype);
258 if (self == NULL)
259 return NULL;
260 self->isclosed = 1;
261 return self;
262}
263
264
265static void
266rf_dealloc(self)
267 rfobject *self;
268{
269 do_close(self);
270 PyMem_DEL(self);
271}
272
273static PyObject *
274rf_getattr(self, name)
275 rfobject *self;
276 char *name;
277{
278 return Py_FindMethod(rf_methods, (PyObject *)self, name);
279}
280
281static char Rftype__doc__[] =
282"Resource fork file object"
283;
284
285static PyTypeObject Rftype = {
286 PyObject_HEAD_INIT(&PyType_Type)
287 0, /*ob_size*/
Jack Jansena755e681997-09-20 17:40:22 +0000288 "ResourceFork", /*tp_name*/
Jack Jansen76a05891996-02-29 16:11:32 +0000289 sizeof(rfobject), /*tp_basicsize*/
290 0, /*tp_itemsize*/
291 /* methods */
292 (destructor)rf_dealloc, /*tp_dealloc*/
293 (printfunc)0, /*tp_print*/
294 (getattrfunc)rf_getattr, /*tp_getattr*/
295 (setattrfunc)0, /*tp_setattr*/
296 (cmpfunc)0, /*tp_compare*/
297 (reprfunc)0, /*tp_repr*/
298 0, /*tp_as_number*/
299 0, /*tp_as_sequence*/
300 0, /*tp_as_mapping*/
301 (hashfunc)0, /*tp_hash*/
302 (ternaryfunc)0, /*tp_call*/
303 (reprfunc)0, /*tp_str*/
304
305 /* Space for future expansion */
306 0L,0L,0L,0L,
307 Rftype__doc__ /* Documentation string */
308};
309
310/* End of code for Resource fork objects */
311/* -------------------------------------------------------- */
Guido van Rossum2d167031994-09-16 10:54:21 +0000312
313/*----------------------------------------------------------------------*/
Guido van Rossume791c2e1995-01-09 13:20:04 +0000314/* Miscellaneous File System Operations */
315
Jack Jansen120a1051997-06-03 15:29:41 +0000316static char getcrtp_doc[] = "Obsolete, use macfs module";
317
Guido van Rossume791c2e1995-01-09 13:20:04 +0000318static PyObject *
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000319MacOS_GetCreatorAndType(PyObject *self, PyObject *args)
Guido van Rossume791c2e1995-01-09 13:20:04 +0000320{
Jack Jansene79dc762000-06-02 21:35:07 +0000321 FSSpec fss;
Guido van Rossume791c2e1995-01-09 13:20:04 +0000322 FInfo info;
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000323 PyObject *creator, *type, *res;
Guido van Rossume791c2e1995-01-09 13:20:04 +0000324 OSErr err;
325
Jack Jansene79dc762000-06-02 21:35:07 +0000326 if (!PyArg_ParseTuple(args, "O&", PyMac_GetFSSpec, &fss))
Guido van Rossume791c2e1995-01-09 13:20:04 +0000327 return NULL;
Jack Jansene79dc762000-06-02 21:35:07 +0000328 if ((err = FSpGetFInfo(&fss, &info)) != noErr)
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000329 return PyErr_Mac(MacOS_Error, err);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000330 creator = PyString_FromStringAndSize((char *)&info.fdCreator, 4);
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000331 type = PyString_FromStringAndSize((char *)&info.fdType, 4);
332 res = Py_BuildValue("OO", creator, type);
Guido van Rossumfffb8bb1995-01-12 12:37:24 +0000333 Py_DECREF(creator);
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000334 Py_DECREF(type);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000335 return res;
336}
337
Jack Jansen120a1051997-06-03 15:29:41 +0000338static char setcrtp_doc[] = "Obsolete, use macfs module";
339
Guido van Rossume791c2e1995-01-09 13:20:04 +0000340static PyObject *
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000341MacOS_SetCreatorAndType(PyObject *self, PyObject *args)
Guido van Rossume791c2e1995-01-09 13:20:04 +0000342{
Jack Jansene79dc762000-06-02 21:35:07 +0000343 FSSpec fss;
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000344 ResType creator, type;
Guido van Rossume791c2e1995-01-09 13:20:04 +0000345 FInfo info;
346 OSErr err;
347
348 if (!PyArg_ParseTuple(args, "O&O&O&",
Jack Jansene79dc762000-06-02 21:35:07 +0000349 PyMac_GetFSSpec, &fss, PyMac_GetOSType, &creator, PyMac_GetOSType, &type))
Guido van Rossume791c2e1995-01-09 13:20:04 +0000350 return NULL;
Jack Jansene79dc762000-06-02 21:35:07 +0000351 if ((err = FSpGetFInfo(&fss, &info)) != noErr)
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000352 return PyErr_Mac(MacOS_Error, err);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000353 info.fdCreator = creator;
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000354 info.fdType = type;
Jack Jansene79dc762000-06-02 21:35:07 +0000355 if ((err = FSpSetFInfo(&fss, &info)) != noErr)
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000356 return PyErr_Mac(MacOS_Error, err);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000357 Py_INCREF(Py_None);
358 return Py_None;
359}
360
Jack Jansen6143d532001-05-19 12:34:59 +0000361#if TARGET_API_MAC_OS8
Guido van Rossume791c2e1995-01-09 13:20:04 +0000362/*----------------------------------------------------------------------*/
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000363/* STDWIN High Level Event interface */
364
365#include <EPPC.h>
366#include <Events.h>
367
Jack Jansen120a1051997-06-03 15:29:41 +0000368static char accepthle_doc[] = "Get arguments of pending high-level event";
369
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000370static PyObject *
371MacOS_AcceptHighLevelEvent(self, args)
372 PyObject *self;
373 PyObject *args;
374{
375 TargetID sender;
376 unsigned long refcon;
377 Ptr buf;
378 unsigned long len;
379 OSErr err;
380 PyObject *res;
381
382 buf = NULL;
383 len = 0;
384 err = AcceptHighLevelEvent(&sender, &refcon, buf, &len);
385 if (err == bufferIsSmall) {
386 buf = malloc(len);
387 if (buf == NULL)
388 return PyErr_NoMemory();
389 err = AcceptHighLevelEvent(&sender, &refcon, buf, &len);
390 if (err != noErr) {
391 free(buf);
392 return PyErr_Mac(MacOS_Error, (int)err);
393 }
394 }
395 else if (err != noErr)
396 return PyErr_Mac(MacOS_Error, (int)err);
397 res = Py_BuildValue("s#ls#",
398 (char *)&sender, (int)(sizeof sender), refcon, (char *)buf, (int)len);
399 free(buf);
400 return res;
401}
Jack Jansene79dc762000-06-02 21:35:07 +0000402#endif
Jack Jansenf3163302001-05-19 12:50:05 +0000403
404#if !TARGET_API_MAC_OSX
Jack Jansen120a1051997-06-03 15:29:41 +0000405static char schedparams_doc[] = "Set/return mainloop interrupt check flag, etc";
406
Jack Jansene8e8ae01995-01-26 16:36:45 +0000407/*
Jack Jansen120a1051997-06-03 15:29:41 +0000408** Set scheduler parameters
Jack Jansene8e8ae01995-01-26 16:36:45 +0000409*/
410static PyObject *
Jack Jansen120a1051997-06-03 15:29:41 +0000411MacOS_SchedParams(PyObject *self, PyObject *args)
Jack Jansene8e8ae01995-01-26 16:36:45 +0000412{
Jack Jansen120a1051997-06-03 15:29:41 +0000413 PyMacSchedParams old, new;
Jack Jansene8e8ae01995-01-26 16:36:45 +0000414
Jack Jansen120a1051997-06-03 15:29:41 +0000415 PyMac_GetSchedParams(&old);
416 new = old;
417 if (!PyArg_ParseTuple(args, "|iiidd", &new.check_interrupt, &new.process_events,
418 &new.besocial, &new.check_interval, &new.bg_yield))
Jack Jansene8e8ae01995-01-26 16:36:45 +0000419 return NULL;
Jack Jansen120a1051997-06-03 15:29:41 +0000420 PyMac_SetSchedParams(&new);
421 return Py_BuildValue("iiidd", old.check_interrupt, old.process_events,
422 old.besocial, old.check_interval, old.bg_yield);
Jack Jansene8e8ae01995-01-26 16:36:45 +0000423}
424
Jack Jansen120a1051997-06-03 15:29:41 +0000425static char appswitch_doc[] = "Obsolete, use SchedParams";
426
427/* Obsolete, for backward compatability */
Jack Jansenee23d6e1995-01-27 14:43:25 +0000428static PyObject *
429MacOS_EnableAppswitch(PyObject *self, PyObject *args)
430{
Jack Jansen120a1051997-06-03 15:29:41 +0000431 int new, old;
432 PyMacSchedParams schp;
Jack Jansenee23d6e1995-01-27 14:43:25 +0000433
Guido van Rossume7134aa1995-02-26 10:20:53 +0000434 if (!PyArg_ParseTuple(args, "i", &new))
Jack Jansenee23d6e1995-01-27 14:43:25 +0000435 return NULL;
Jack Jansen120a1051997-06-03 15:29:41 +0000436 PyMac_GetSchedParams(&schp);
437 if ( schp.process_events )
438 old = 1;
439 else if ( schp.check_interrupt )
Jack Jansen120a1051997-06-03 15:29:41 +0000440 old = 0;
Jack Jansen2e871e41997-09-08 13:23:19 +0000441 else
442 old = -1;
Jack Jansen120a1051997-06-03 15:29:41 +0000443 if ( new > 0 ) {
444 schp.process_events = mDownMask|keyDownMask|osMask;
445 schp.check_interrupt = 1;
Jack Jansen2e871e41997-09-08 13:23:19 +0000446 } else if ( new == 0 ) {
Jack Jansen120a1051997-06-03 15:29:41 +0000447 schp.process_events = 0;
448 schp.check_interrupt = 1;
449 } else {
450 schp.process_events = 0;
451 schp.check_interrupt = 0;
452 }
453 PyMac_SetSchedParams(&schp);
Guido van Rossume7134aa1995-02-26 10:20:53 +0000454 return Py_BuildValue("i", old);
Jack Jansenee23d6e1995-01-27 14:43:25 +0000455}
456
Jack Jansen883765e1997-06-20 16:19:38 +0000457static char setevh_doc[] = "Set python event handler to be called in mainloop";
458
459static PyObject *
460MacOS_SetEventHandler(self, args)
461 PyObject *self;
462 PyObject *args;
463{
464 PyObject *evh = NULL;
465
466 if (!PyArg_ParseTuple(args, "|O", &evh))
467 return NULL;
468 if (evh == Py_None)
469 evh = NULL;
470 if ( evh && !PyCallable_Check(evh) ) {
471 PyErr_SetString(PyExc_ValueError, "SetEventHandler argument must be callable");
472 return NULL;
473 }
474 if ( !PyMac_SetEventHandler(evh) )
475 return NULL;
476 Py_INCREF(Py_None);
477 return Py_None;
478}
479
Jack Jansen120a1051997-06-03 15:29:41 +0000480static char handleev_doc[] = "Pass event to other interested parties like sioux";
Jack Jansena76382a1995-02-02 14:25:56 +0000481
482static PyObject *
483MacOS_HandleEvent(PyObject *self, PyObject *args)
484{
485 EventRecord ev;
486
487 if (!PyArg_ParseTuple(args, "O&", PyMac_GetEventRecord, &ev))
488 return NULL;
Jack Jansen883765e1997-06-20 16:19:38 +0000489 PyMac_HandleEventIntern(&ev);
Jack Jansena76382a1995-02-02 14:25:56 +0000490 Py_INCREF(Py_None);
491 return Py_None;
492}
Jack Jansenf3163302001-05-19 12:50:05 +0000493#endif /* !TARGET_API_MAC_OSX */
Jack Jansena76382a1995-02-02 14:25:56 +0000494
Jack Jansen120a1051997-06-03 15:29:41 +0000495static char geterr_doc[] = "Convert OSErr number to string";
496
Jack Jansen829f88c1995-07-17 11:36:01 +0000497static PyObject *
498MacOS_GetErrorString(PyObject *self, PyObject *args)
499{
500 int errn;
501
502 if (!PyArg_ParseTuple(args, "i", &errn))
503 return NULL;
504 return Py_BuildValue("s", PyMac_StrError(errn));
505}
506
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000507static char splash_doc[] = "Open a splash-screen dialog by resource-id (0=close)";
508
509static PyObject *
510MacOS_splash(PyObject *self, PyObject *args)
511{
Jack Jansendf34cf11996-09-15 22:12:00 +0000512 int resid = -1;
Jack Jansen450ae9f1997-05-13 15:41:48 +0000513 static DialogPtr curdialog = NULL;
Jack Jansen2e871e41997-09-08 13:23:19 +0000514 DialogPtr olddialog;
Jack Jansen04df9d51996-09-23 15:49:43 +0000515 WindowRef theWindow;
516 CGrafPtr thePort;
Jack Jansene79dc762000-06-02 21:35:07 +0000517#if 0
Jack Jansen04df9d51996-09-23 15:49:43 +0000518 short xpos, ypos, width, height, swidth, sheight;
Jack Jansene79dc762000-06-02 21:35:07 +0000519#endif
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000520
Jack Jansendf34cf11996-09-15 22:12:00 +0000521 if (!PyArg_ParseTuple(args, "|i", &resid))
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000522 return NULL;
Jack Jansen2e871e41997-09-08 13:23:19 +0000523 olddialog = curdialog;
Jack Jansencbe6a531998-02-20 15:59:59 +0000524 curdialog = NULL;
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000525
Jack Jansendf34cf11996-09-15 22:12:00 +0000526 if ( resid != -1 ) {
527 curdialog = GetNewDialog(resid, NULL, (WindowPtr)-1);
Jack Jansen04df9d51996-09-23 15:49:43 +0000528 if ( curdialog ) {
529 theWindow = GetDialogWindow(curdialog);
530 thePort = GetWindowPort(theWindow);
Jack Jansene79dc762000-06-02 21:35:07 +0000531#if 0
Jack Jansen04df9d51996-09-23 15:49:43 +0000532 width = thePort->portRect.right - thePort->portRect.left;
533 height = thePort->portRect.bottom - thePort->portRect.top;
534 swidth = qd.screenBits.bounds.right - qd.screenBits.bounds.left;
535 sheight = qd.screenBits.bounds.bottom - qd.screenBits.bounds.top - LMGetMBarHeight();
536 xpos = (swidth-width)/2;
537 ypos = (sheight-height)/5 + LMGetMBarHeight();
538 MoveWindow(theWindow, xpos, ypos, 0);
539 ShowWindow(theWindow);
Jack Jansene79dc762000-06-02 21:35:07 +0000540#endif
Jack Jansendf34cf11996-09-15 22:12:00 +0000541 DrawDialog(curdialog);
Jack Jansen04df9d51996-09-23 15:49:43 +0000542 }
Jack Jansendf34cf11996-09-15 22:12:00 +0000543 }
Jack Jansen2e871e41997-09-08 13:23:19 +0000544 if (olddialog)
545 DisposeDialog(olddialog);
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000546 Py_INCREF(Py_None);
547 return Py_None;
548}
549
Jack Janseneb76b841996-09-30 14:43:22 +0000550static char DebugStr_doc[] = "Switch to low-level debugger with a message";
551
552static PyObject *
553MacOS_DebugStr(PyObject *self, PyObject *args)
554{
555 Str255 message;
556 PyObject *object = 0;
557
558 if (!PyArg_ParseTuple(args, "O&|O", PyMac_GetStr255, message, &object))
559 return NULL;
560 DebugStr(message);
561 Py_INCREF(Py_None);
562 return Py_None;
563}
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000564
Jack Jansen2e871e41997-09-08 13:23:19 +0000565static char SysBeep_doc[] = "BEEEEEP!!!";
566
567static PyObject *
568MacOS_SysBeep(PyObject *self, PyObject *args)
569{
570 int duration = 6;
571
572 if (!PyArg_ParseTuple(args, "|i", &duration))
573 return NULL;
574 SysBeep(duration);
575 Py_INCREF(Py_None);
576 return Py_None;
577}
578
Jack Jansen898ac1b1997-09-01 15:38:12 +0000579static char GetTicks_doc[] = "Return number of ticks since bootup";
580
581static PyObject *
582MacOS_GetTicks(PyObject *self, PyObject *args)
583{
Jack Jansene79dc762000-06-02 21:35:07 +0000584 return Py_BuildValue("i", (int)TickCount());
Jack Jansen898ac1b1997-09-01 15:38:12 +0000585}
586
Jack Jansen76a05891996-02-29 16:11:32 +0000587static char openrf_doc[] = "Open resource fork of a file";
588
589static PyObject *
590MacOS_openrf(PyObject *self, PyObject *args)
591{
592 OSErr err;
593 char *mode = "r";
594 FSSpec fss;
595 SignedByte permission = 1;
596 rfobject *fp;
597
598 if (!PyArg_ParseTuple(args, "O&|s", PyMac_GetFSSpec, &fss, &mode))
599 return NULL;
600 while (*mode) {
601 switch (*mode++) {
602 case '*': break;
603 case 'r': permission = 1; break;
604 case 'w': permission = 2; break;
605 case 'b': break;
606 default:
607 PyErr_BadArgument();
608 return NULL;
609 }
610 }
611
612 if ( (fp = newrfobject()) == NULL )
613 return NULL;
614
615 err = HOpenRF(fss.vRefNum, fss.parID, fss.name, permission, &fp->fRefNum);
616
617 if ( err == fnfErr ) {
618 /* In stead of doing complicated things here to get creator/type
619 ** correct we let the standard i/o library handle it
620 */
621 FILE *tfp;
622 char pathname[257];
623
Jack Jansen84fb1fa1996-11-09 18:46:57 +0000624 if ( err=PyMac_GetFullPath(&fss, pathname) ) {
Jack Jansen76a05891996-02-29 16:11:32 +0000625 PyMac_Error(err);
626 Py_DECREF(fp);
627 return NULL;
628 }
629
630 if ( (tfp = fopen(pathname, "w")) == NULL ) {
631 PyMac_Error(fnfErr); /* What else... */
632 Py_DECREF(fp);
633 return NULL;
634 }
635 fclose(tfp);
636 err = HOpenRF(fss.vRefNum, fss.parID, fss.name, permission, &fp->fRefNum);
637 }
638 if ( err ) {
639 Py_DECREF(fp);
640 PyMac_Error(err);
641 return NULL;
642 }
643 fp->isclosed = 0;
644 return (PyObject *)fp;
645}
646
Jack Jansenf3163302001-05-19 12:50:05 +0000647#if !TARGET_API_MAC_OSX
Jack Jansen957d07a2000-02-21 11:07:37 +0000648static char FreeMem_doc[] = "Return the total amount of free space in the heap";
649
650static PyObject *
651MacOS_FreeMem(PyObject *self, PyObject *args)
652{
653 long rv;
654
655 if (!PyArg_ParseTuple(args, ""))
656 return NULL;
657 rv = FreeMem();
658 return Py_BuildValue("l", rv);
659}
660
661static char MaxBlock_doc[] = "Return the largest contiguous block of free space in the heap";
662
663static PyObject *
664MacOS_MaxBlock(PyObject *self, PyObject *args)
665{
666 long rv;
667
668 if (!PyArg_ParseTuple(args, ""))
669 return NULL;
670 rv = MaxBlock();
671 return Py_BuildValue("l", rv);
672}
673
674static char CompactMem_doc[] = "(wanted size)->actual largest block after compacting";
675
676static PyObject *
677MacOS_CompactMem(PyObject *self, PyObject *args)
678{
679 long value;
680 long rv;
681
682 if (!PyArg_ParseTuple(args, "l", &value))
683 return NULL;
684 rv = CompactMem(value);
685 return Py_BuildValue("l", rv);
686}
687
Jack Jansenb19c6672000-10-12 21:24:05 +0000688static char KeepConsole_doc[] = "(flag) Keep console open 0:never, 1:on output 2:on error, 3:always";
689
690static PyObject *
691MacOS_KeepConsole(PyObject *self, PyObject *args)
692{
693 int value;
694
695 if (!PyArg_ParseTuple(args, "i", &value))
696 return NULL;
697 PyMac_options.keep_console = value;
698 Py_INCREF(Py_None);
699 return Py_None;
700}
701
Jack Jansen8413b472000-10-19 22:02:16 +0000702static char OutputSeen_doc[] = "Call to reset the 'unseen output' flag for the keep-console-open option";
703
704static PyObject *
705MacOS_OutputSeen(PyObject *self, PyObject *args)
706{
707 if (!PyArg_ParseTuple(args, ""))
708 return NULL;
709 PyMac_OutputSeen();
710 Py_INCREF(Py_None);
711 return Py_None;
712}
Jack Jansenf3163302001-05-19 12:50:05 +0000713#endif /* !TARGET_API_MAC_OSX */
Jack Jansen8413b472000-10-19 22:02:16 +0000714
Guido van Rossum2d167031994-09-16 10:54:21 +0000715static PyMethodDef MacOS_Methods[] = {
Jack Jansen6e68a7e2001-05-12 21:31:34 +0000716#if TARGET_API_MAC_OS8
Jack Jansen120a1051997-06-03 15:29:41 +0000717 {"AcceptHighLevelEvent", MacOS_AcceptHighLevelEvent, 1, accepthle_doc},
Jack Jansene79dc762000-06-02 21:35:07 +0000718#endif
Jack Jansen120a1051997-06-03 15:29:41 +0000719 {"GetCreatorAndType", MacOS_GetCreatorAndType, 1, getcrtp_doc},
720 {"SetCreatorAndType", MacOS_SetCreatorAndType, 1, setcrtp_doc},
Jack Jansenf3163302001-05-19 12:50:05 +0000721#if !TARGET_API_MAC_OSX
Jack Jansen120a1051997-06-03 15:29:41 +0000722 {"SchedParams", MacOS_SchedParams, 1, schedparams_doc},
723 {"EnableAppswitch", MacOS_EnableAppswitch, 1, appswitch_doc},
Jack Jansen883765e1997-06-20 16:19:38 +0000724 {"SetEventHandler", MacOS_SetEventHandler, 1, setevh_doc},
Jack Jansen120a1051997-06-03 15:29:41 +0000725 {"HandleEvent", MacOS_HandleEvent, 1, handleev_doc},
Jack Jansenf3163302001-05-19 12:50:05 +0000726#endif
Jack Jansen120a1051997-06-03 15:29:41 +0000727 {"GetErrorString", MacOS_GetErrorString, 1, geterr_doc},
728 {"openrf", MacOS_openrf, 1, openrf_doc},
729 {"splash", MacOS_splash, 1, splash_doc},
730 {"DebugStr", MacOS_DebugStr, 1, DebugStr_doc},
Jack Jansen898ac1b1997-09-01 15:38:12 +0000731 {"GetTicks", MacOS_GetTicks, 1, GetTicks_doc},
Jack Jansen2e871e41997-09-08 13:23:19 +0000732 {"SysBeep", MacOS_SysBeep, 1, SysBeep_doc},
Jack Jansenf3163302001-05-19 12:50:05 +0000733#if !TARGET_API_MAC_OSX
Jack Jansen957d07a2000-02-21 11:07:37 +0000734 {"FreeMem", MacOS_FreeMem, 1, FreeMem_doc},
735 {"MaxBlock", MacOS_MaxBlock, 1, MaxBlock_doc},
736 {"CompactMem", MacOS_CompactMem, 1, CompactMem_doc},
Jack Jansenb19c6672000-10-12 21:24:05 +0000737 {"KeepConsole", MacOS_KeepConsole, 1, KeepConsole_doc},
Jack Jansen8413b472000-10-19 22:02:16 +0000738 {"OutputSeen", MacOS_OutputSeen, 1, OutputSeen_doc},
Jack Jansenf3163302001-05-19 12:50:05 +0000739#endif
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000740 {NULL, NULL} /* Sentinel */
Guido van Rossum2d167031994-09-16 10:54:21 +0000741};
742
743
744void
Jack Jansend6741631998-07-01 15:48:54 +0000745initMacOS()
Guido van Rossum2d167031994-09-16 10:54:21 +0000746{
747 PyObject *m, *d;
748
749 m = Py_InitModule("MacOS", MacOS_Methods);
750 d = PyModule_GetDict(m);
751
752 /* Initialize MacOS.Error exception */
Guido van Rossumbf068b11995-01-25 23:09:20 +0000753 MacOS_Error = PyMac_GetOSErrException();
Guido van Rossume433c971994-09-29 10:02:56 +0000754 if (MacOS_Error == NULL || PyDict_SetItemString(d, "Error", MacOS_Error) != 0)
Jack Jansenfa1e27d2000-09-08 10:21:44 +0000755 return;
Jack Jansena755e681997-09-20 17:40:22 +0000756 Rftype.ob_type = &PyType_Type;
757 Py_INCREF(&Rftype);
758 if (PyDict_SetItemString(d, "ResourceForkType", (PyObject *)&Rftype) != 0)
Jack Jansenfa1e27d2000-09-08 10:21:44 +0000759 return;
Jack Jansenf73bab71997-04-03 14:51:03 +0000760 /*
761 ** This is a hack: the following constant added to the id() of a string
762 ** object gives you the address of the data. Unfortunately, it is needed for
763 ** some of the image and sound processing interfaces on the mac:-(
764 */
765 {
766 PyStringObject *p = 0;
767 long off = (long)&(p->ob_sval[0]);
768
769 if( PyDict_SetItemString(d, "string_id_to_buffer", Py_BuildValue("i", off)) != 0)
Jack Jansenfa1e27d2000-09-08 10:21:44 +0000770 return;
Jack Jansenf73bab71997-04-03 14:51:03 +0000771 }
Jack Jansen8f5725a1999-12-07 23:08:10 +0000772 if (PyDict_SetItemString(d, "AppearanceCompliant",
773 Py_BuildValue("i", PyMac_AppearanceCompliant)) != 0)
Jack Jansenfa1e27d2000-09-08 10:21:44 +0000774 return;
Jack Jansenf3163302001-05-19 12:50:05 +0000775#if TARGET_API_MAC_OSX
776#define PY_RUNTIMEMODEL "macho"
Jack Jansen6e68a7e2001-05-12 21:31:34 +0000777#elif TARGET_API_MAC_OS8
Jack Jansen193509b2001-01-23 22:38:23 +0000778#define PY_RUNTIMEMODEL "ppc"
Jack Jansenf3163302001-05-19 12:50:05 +0000779#elif TARGET_API_MAC_CARBON
780#define PY_RUNTIMEMODEL "carbon"
Jack Jansen6e68a7e2001-05-12 21:31:34 +0000781#else
782#error "None of the TARGET_API_MAC_XXX I know about is set"
Jack Jansen193509b2001-01-23 22:38:23 +0000783#endif
784 if (PyDict_SetItemString(d, "runtimemodel",
785 Py_BuildValue("s", PY_RUNTIMEMODEL)) != 0)
786 return;
Guido van Rossum2d167031994-09-16 10:54:21 +0000787}
Guido van Rossume7134aa1995-02-26 10:20:53 +0000788