blob: b4c4034151de1552cfcabbaa07da119c4c00443d [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 Jansen120a1051997-06-03 15:29:41 +0000403static char schedparams_doc[] = "Set/return mainloop interrupt check flag, etc";
404
Jack Jansene8e8ae01995-01-26 16:36:45 +0000405/*
Jack Jansen120a1051997-06-03 15:29:41 +0000406** Set scheduler parameters
Jack Jansene8e8ae01995-01-26 16:36:45 +0000407*/
408static PyObject *
Jack Jansen120a1051997-06-03 15:29:41 +0000409MacOS_SchedParams(PyObject *self, PyObject *args)
Jack Jansene8e8ae01995-01-26 16:36:45 +0000410{
Jack Jansen120a1051997-06-03 15:29:41 +0000411 PyMacSchedParams old, new;
Jack Jansene8e8ae01995-01-26 16:36:45 +0000412
Jack Jansen120a1051997-06-03 15:29:41 +0000413 PyMac_GetSchedParams(&old);
414 new = old;
415 if (!PyArg_ParseTuple(args, "|iiidd", &new.check_interrupt, &new.process_events,
416 &new.besocial, &new.check_interval, &new.bg_yield))
Jack Jansene8e8ae01995-01-26 16:36:45 +0000417 return NULL;
Jack Jansen120a1051997-06-03 15:29:41 +0000418 PyMac_SetSchedParams(&new);
419 return Py_BuildValue("iiidd", old.check_interrupt, old.process_events,
420 old.besocial, old.check_interval, old.bg_yield);
Jack Jansene8e8ae01995-01-26 16:36:45 +0000421}
422
Jack Jansen120a1051997-06-03 15:29:41 +0000423static char appswitch_doc[] = "Obsolete, use SchedParams";
424
425/* Obsolete, for backward compatability */
Jack Jansenee23d6e1995-01-27 14:43:25 +0000426static PyObject *
427MacOS_EnableAppswitch(PyObject *self, PyObject *args)
428{
Jack Jansen120a1051997-06-03 15:29:41 +0000429 int new, old;
430 PyMacSchedParams schp;
Jack Jansenee23d6e1995-01-27 14:43:25 +0000431
Guido van Rossume7134aa1995-02-26 10:20:53 +0000432 if (!PyArg_ParseTuple(args, "i", &new))
Jack Jansenee23d6e1995-01-27 14:43:25 +0000433 return NULL;
Jack Jansen120a1051997-06-03 15:29:41 +0000434 PyMac_GetSchedParams(&schp);
435 if ( schp.process_events )
436 old = 1;
437 else if ( schp.check_interrupt )
Jack Jansen120a1051997-06-03 15:29:41 +0000438 old = 0;
Jack Jansen2e871e41997-09-08 13:23:19 +0000439 else
440 old = -1;
Jack Jansen120a1051997-06-03 15:29:41 +0000441 if ( new > 0 ) {
442 schp.process_events = mDownMask|keyDownMask|osMask;
443 schp.check_interrupt = 1;
Jack Jansen2e871e41997-09-08 13:23:19 +0000444 } else if ( new == 0 ) {
Jack Jansen120a1051997-06-03 15:29:41 +0000445 schp.process_events = 0;
446 schp.check_interrupt = 1;
447 } else {
448 schp.process_events = 0;
449 schp.check_interrupt = 0;
450 }
451 PyMac_SetSchedParams(&schp);
Guido van Rossume7134aa1995-02-26 10:20:53 +0000452 return Py_BuildValue("i", old);
Jack Jansenee23d6e1995-01-27 14:43:25 +0000453}
454
Jack Jansen883765e1997-06-20 16:19:38 +0000455static char setevh_doc[] = "Set python event handler to be called in mainloop";
456
457static PyObject *
458MacOS_SetEventHandler(self, args)
459 PyObject *self;
460 PyObject *args;
461{
462 PyObject *evh = NULL;
463
464 if (!PyArg_ParseTuple(args, "|O", &evh))
465 return NULL;
466 if (evh == Py_None)
467 evh = NULL;
468 if ( evh && !PyCallable_Check(evh) ) {
469 PyErr_SetString(PyExc_ValueError, "SetEventHandler argument must be callable");
470 return NULL;
471 }
472 if ( !PyMac_SetEventHandler(evh) )
473 return NULL;
474 Py_INCREF(Py_None);
475 return Py_None;
476}
477
Jack Jansen120a1051997-06-03 15:29:41 +0000478static char handleev_doc[] = "Pass event to other interested parties like sioux";
Jack Jansena76382a1995-02-02 14:25:56 +0000479
480static PyObject *
481MacOS_HandleEvent(PyObject *self, PyObject *args)
482{
483 EventRecord ev;
484
485 if (!PyArg_ParseTuple(args, "O&", PyMac_GetEventRecord, &ev))
486 return NULL;
Jack Jansen883765e1997-06-20 16:19:38 +0000487 PyMac_HandleEventIntern(&ev);
Jack Jansena76382a1995-02-02 14:25:56 +0000488 Py_INCREF(Py_None);
489 return Py_None;
490}
491
Jack Jansen120a1051997-06-03 15:29:41 +0000492static char geterr_doc[] = "Convert OSErr number to string";
493
Jack Jansen829f88c1995-07-17 11:36:01 +0000494static PyObject *
495MacOS_GetErrorString(PyObject *self, PyObject *args)
496{
497 int errn;
498
499 if (!PyArg_ParseTuple(args, "i", &errn))
500 return NULL;
501 return Py_BuildValue("s", PyMac_StrError(errn));
502}
503
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000504static char splash_doc[] = "Open a splash-screen dialog by resource-id (0=close)";
505
506static PyObject *
507MacOS_splash(PyObject *self, PyObject *args)
508{
Jack Jansendf34cf11996-09-15 22:12:00 +0000509 int resid = -1;
Jack Jansen450ae9f1997-05-13 15:41:48 +0000510 static DialogPtr curdialog = NULL;
Jack Jansen2e871e41997-09-08 13:23:19 +0000511 DialogPtr olddialog;
Jack Jansen04df9d51996-09-23 15:49:43 +0000512 WindowRef theWindow;
513 CGrafPtr thePort;
Jack Jansene79dc762000-06-02 21:35:07 +0000514#if 0
Jack Jansen04df9d51996-09-23 15:49:43 +0000515 short xpos, ypos, width, height, swidth, sheight;
Jack Jansene79dc762000-06-02 21:35:07 +0000516#endif
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000517
Jack Jansendf34cf11996-09-15 22:12:00 +0000518 if (!PyArg_ParseTuple(args, "|i", &resid))
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000519 return NULL;
Jack Jansen2e871e41997-09-08 13:23:19 +0000520 olddialog = curdialog;
Jack Jansencbe6a531998-02-20 15:59:59 +0000521 curdialog = NULL;
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000522
Jack Jansendf34cf11996-09-15 22:12:00 +0000523 if ( resid != -1 ) {
524 curdialog = GetNewDialog(resid, NULL, (WindowPtr)-1);
Jack Jansen04df9d51996-09-23 15:49:43 +0000525 if ( curdialog ) {
526 theWindow = GetDialogWindow(curdialog);
527 thePort = GetWindowPort(theWindow);
Jack Jansene79dc762000-06-02 21:35:07 +0000528#if 0
Jack Jansen04df9d51996-09-23 15:49:43 +0000529 width = thePort->portRect.right - thePort->portRect.left;
530 height = thePort->portRect.bottom - thePort->portRect.top;
531 swidth = qd.screenBits.bounds.right - qd.screenBits.bounds.left;
532 sheight = qd.screenBits.bounds.bottom - qd.screenBits.bounds.top - LMGetMBarHeight();
533 xpos = (swidth-width)/2;
534 ypos = (sheight-height)/5 + LMGetMBarHeight();
535 MoveWindow(theWindow, xpos, ypos, 0);
536 ShowWindow(theWindow);
Jack Jansene79dc762000-06-02 21:35:07 +0000537#endif
Jack Jansendf34cf11996-09-15 22:12:00 +0000538 DrawDialog(curdialog);
Jack Jansen04df9d51996-09-23 15:49:43 +0000539 }
Jack Jansendf34cf11996-09-15 22:12:00 +0000540 }
Jack Jansen2e871e41997-09-08 13:23:19 +0000541 if (olddialog)
542 DisposeDialog(olddialog);
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000543 Py_INCREF(Py_None);
544 return Py_None;
545}
546
Jack Janseneb76b841996-09-30 14:43:22 +0000547static char DebugStr_doc[] = "Switch to low-level debugger with a message";
548
549static PyObject *
550MacOS_DebugStr(PyObject *self, PyObject *args)
551{
552 Str255 message;
553 PyObject *object = 0;
554
555 if (!PyArg_ParseTuple(args, "O&|O", PyMac_GetStr255, message, &object))
556 return NULL;
557 DebugStr(message);
558 Py_INCREF(Py_None);
559 return Py_None;
560}
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000561
Jack Jansen2e871e41997-09-08 13:23:19 +0000562static char SysBeep_doc[] = "BEEEEEP!!!";
563
564static PyObject *
565MacOS_SysBeep(PyObject *self, PyObject *args)
566{
567 int duration = 6;
568
569 if (!PyArg_ParseTuple(args, "|i", &duration))
570 return NULL;
571 SysBeep(duration);
572 Py_INCREF(Py_None);
573 return Py_None;
574}
575
Jack Jansen898ac1b1997-09-01 15:38:12 +0000576static char GetTicks_doc[] = "Return number of ticks since bootup";
577
578static PyObject *
579MacOS_GetTicks(PyObject *self, PyObject *args)
580{
Jack Jansene79dc762000-06-02 21:35:07 +0000581 return Py_BuildValue("i", (int)TickCount());
Jack Jansen898ac1b1997-09-01 15:38:12 +0000582}
583
Jack Jansen76a05891996-02-29 16:11:32 +0000584static char openrf_doc[] = "Open resource fork of a file";
585
586static PyObject *
587MacOS_openrf(PyObject *self, PyObject *args)
588{
589 OSErr err;
590 char *mode = "r";
591 FSSpec fss;
592 SignedByte permission = 1;
593 rfobject *fp;
594
595 if (!PyArg_ParseTuple(args, "O&|s", PyMac_GetFSSpec, &fss, &mode))
596 return NULL;
597 while (*mode) {
598 switch (*mode++) {
599 case '*': break;
600 case 'r': permission = 1; break;
601 case 'w': permission = 2; break;
602 case 'b': break;
603 default:
604 PyErr_BadArgument();
605 return NULL;
606 }
607 }
608
609 if ( (fp = newrfobject()) == NULL )
610 return NULL;
611
612 err = HOpenRF(fss.vRefNum, fss.parID, fss.name, permission, &fp->fRefNum);
613
614 if ( err == fnfErr ) {
615 /* In stead of doing complicated things here to get creator/type
616 ** correct we let the standard i/o library handle it
617 */
618 FILE *tfp;
619 char pathname[257];
620
Jack Jansen84fb1fa1996-11-09 18:46:57 +0000621 if ( err=PyMac_GetFullPath(&fss, pathname) ) {
Jack Jansen76a05891996-02-29 16:11:32 +0000622 PyMac_Error(err);
623 Py_DECREF(fp);
624 return NULL;
625 }
626
627 if ( (tfp = fopen(pathname, "w")) == NULL ) {
628 PyMac_Error(fnfErr); /* What else... */
629 Py_DECREF(fp);
630 return NULL;
631 }
632 fclose(tfp);
633 err = HOpenRF(fss.vRefNum, fss.parID, fss.name, permission, &fp->fRefNum);
634 }
635 if ( err ) {
636 Py_DECREF(fp);
637 PyMac_Error(err);
638 return NULL;
639 }
640 fp->isclosed = 0;
641 return (PyObject *)fp;
642}
643
Jack Jansen957d07a2000-02-21 11:07:37 +0000644static char FreeMem_doc[] = "Return the total amount of free space in the heap";
645
646static PyObject *
647MacOS_FreeMem(PyObject *self, PyObject *args)
648{
649 long rv;
650
651 if (!PyArg_ParseTuple(args, ""))
652 return NULL;
653 rv = FreeMem();
654 return Py_BuildValue("l", rv);
655}
656
657static char MaxBlock_doc[] = "Return the largest contiguous block of free space in the heap";
658
659static PyObject *
660MacOS_MaxBlock(PyObject *self, PyObject *args)
661{
662 long rv;
663
664 if (!PyArg_ParseTuple(args, ""))
665 return NULL;
666 rv = MaxBlock();
667 return Py_BuildValue("l", rv);
668}
669
670static char CompactMem_doc[] = "(wanted size)->actual largest block after compacting";
671
672static PyObject *
673MacOS_CompactMem(PyObject *self, PyObject *args)
674{
675 long value;
676 long rv;
677
678 if (!PyArg_ParseTuple(args, "l", &value))
679 return NULL;
680 rv = CompactMem(value);
681 return Py_BuildValue("l", rv);
682}
683
Jack Jansenb19c6672000-10-12 21:24:05 +0000684static char KeepConsole_doc[] = "(flag) Keep console open 0:never, 1:on output 2:on error, 3:always";
685
686static PyObject *
687MacOS_KeepConsole(PyObject *self, PyObject *args)
688{
689 int value;
690
691 if (!PyArg_ParseTuple(args, "i", &value))
692 return NULL;
693 PyMac_options.keep_console = value;
694 Py_INCREF(Py_None);
695 return Py_None;
696}
697
Jack Jansen8413b472000-10-19 22:02:16 +0000698static char OutputSeen_doc[] = "Call to reset the 'unseen output' flag for the keep-console-open option";
699
700static PyObject *
701MacOS_OutputSeen(PyObject *self, PyObject *args)
702{
703 if (!PyArg_ParseTuple(args, ""))
704 return NULL;
705 PyMac_OutputSeen();
706 Py_INCREF(Py_None);
707 return Py_None;
708}
709
Guido van Rossum2d167031994-09-16 10:54:21 +0000710static PyMethodDef MacOS_Methods[] = {
Jack Jansen6e68a7e2001-05-12 21:31:34 +0000711#if TARGET_API_MAC_OS8
Jack Jansen120a1051997-06-03 15:29:41 +0000712 {"AcceptHighLevelEvent", MacOS_AcceptHighLevelEvent, 1, accepthle_doc},
Jack Jansene79dc762000-06-02 21:35:07 +0000713#endif
Jack Jansen120a1051997-06-03 15:29:41 +0000714 {"GetCreatorAndType", MacOS_GetCreatorAndType, 1, getcrtp_doc},
715 {"SetCreatorAndType", MacOS_SetCreatorAndType, 1, setcrtp_doc},
Jack Jansen120a1051997-06-03 15:29:41 +0000716 {"SchedParams", MacOS_SchedParams, 1, schedparams_doc},
717 {"EnableAppswitch", MacOS_EnableAppswitch, 1, appswitch_doc},
Jack Jansen883765e1997-06-20 16:19:38 +0000718 {"SetEventHandler", MacOS_SetEventHandler, 1, setevh_doc},
Jack Jansen120a1051997-06-03 15:29:41 +0000719 {"HandleEvent", MacOS_HandleEvent, 1, handleev_doc},
720 {"GetErrorString", MacOS_GetErrorString, 1, geterr_doc},
721 {"openrf", MacOS_openrf, 1, openrf_doc},
722 {"splash", MacOS_splash, 1, splash_doc},
723 {"DebugStr", MacOS_DebugStr, 1, DebugStr_doc},
Jack Jansen898ac1b1997-09-01 15:38:12 +0000724 {"GetTicks", MacOS_GetTicks, 1, GetTicks_doc},
Jack Jansen2e871e41997-09-08 13:23:19 +0000725 {"SysBeep", MacOS_SysBeep, 1, SysBeep_doc},
Jack Jansen957d07a2000-02-21 11:07:37 +0000726 {"FreeMem", MacOS_FreeMem, 1, FreeMem_doc},
727 {"MaxBlock", MacOS_MaxBlock, 1, MaxBlock_doc},
728 {"CompactMem", MacOS_CompactMem, 1, CompactMem_doc},
Jack Jansenb19c6672000-10-12 21:24:05 +0000729 {"KeepConsole", MacOS_KeepConsole, 1, KeepConsole_doc},
Jack Jansen8413b472000-10-19 22:02:16 +0000730 {"OutputSeen", MacOS_OutputSeen, 1, OutputSeen_doc},
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000731 {NULL, NULL} /* Sentinel */
Guido van Rossum2d167031994-09-16 10:54:21 +0000732};
733
734
735void
Jack Jansend6741631998-07-01 15:48:54 +0000736initMacOS()
Guido van Rossum2d167031994-09-16 10:54:21 +0000737{
738 PyObject *m, *d;
739
740 m = Py_InitModule("MacOS", MacOS_Methods);
741 d = PyModule_GetDict(m);
742
743 /* Initialize MacOS.Error exception */
Guido van Rossumbf068b11995-01-25 23:09:20 +0000744 MacOS_Error = PyMac_GetOSErrException();
Guido van Rossume433c971994-09-29 10:02:56 +0000745 if (MacOS_Error == NULL || PyDict_SetItemString(d, "Error", MacOS_Error) != 0)
Jack Jansenfa1e27d2000-09-08 10:21:44 +0000746 return;
Jack Jansena755e681997-09-20 17:40:22 +0000747 Rftype.ob_type = &PyType_Type;
748 Py_INCREF(&Rftype);
749 if (PyDict_SetItemString(d, "ResourceForkType", (PyObject *)&Rftype) != 0)
Jack Jansenfa1e27d2000-09-08 10:21:44 +0000750 return;
Jack Jansenf73bab71997-04-03 14:51:03 +0000751 /*
752 ** This is a hack: the following constant added to the id() of a string
753 ** object gives you the address of the data. Unfortunately, it is needed for
754 ** some of the image and sound processing interfaces on the mac:-(
755 */
756 {
757 PyStringObject *p = 0;
758 long off = (long)&(p->ob_sval[0]);
759
760 if( PyDict_SetItemString(d, "string_id_to_buffer", Py_BuildValue("i", off)) != 0)
Jack Jansenfa1e27d2000-09-08 10:21:44 +0000761 return;
Jack Jansenf73bab71997-04-03 14:51:03 +0000762 }
Jack Jansen8f5725a1999-12-07 23:08:10 +0000763 if (PyDict_SetItemString(d, "AppearanceCompliant",
764 Py_BuildValue("i", PyMac_AppearanceCompliant)) != 0)
Jack Jansenfa1e27d2000-09-08 10:21:44 +0000765 return;
Jack Jansen193509b2001-01-23 22:38:23 +0000766#if TARGET_API_MAC_CARBON
Jack Jansen193509b2001-01-23 22:38:23 +0000767#define PY_RUNTIMEMODEL "carbon"
Jack Jansen6e68a7e2001-05-12 21:31:34 +0000768#elif TARGET_API_MAC_OS8
Jack Jansen193509b2001-01-23 22:38:23 +0000769#define PY_RUNTIMEMODEL "ppc"
Jack Jansen6e68a7e2001-05-12 21:31:34 +0000770#elif TARGET_API_MAC_OSX
771#define PY_RUNTIMEMODEL "macho"
772#else
773#error "None of the TARGET_API_MAC_XXX I know about is set"
Jack Jansen193509b2001-01-23 22:38:23 +0000774#endif
775 if (PyDict_SetItemString(d, "runtimemodel",
776 Py_BuildValue("s", PY_RUNTIMEMODEL)) != 0)
777 return;
Guido van Rossum2d167031994-09-16 10:54:21 +0000778}
Guido van Rossume7134aa1995-02-26 10:20:53 +0000779