blob: 07a2e4766ac66e94f1bb5cfb11e3e2379bce2639 [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 Jansene79dc762000-06-02 21:35:07 +000034#include <Events.h>
Jack Jansenee23d6e1995-01-27 14:43:25 +000035
Guido van Rossum2d167031994-09-16 10:54:21 +000036static PyObject *MacOS_Error; /* Exception MacOS.Error */
37
Guido van Rossume6d9ccc1995-02-21 21:01:05 +000038#ifdef MPW
Guido van Rossum9fed1831995-02-18 15:02:02 +000039#define bufferIsSmall -607 /*error returns from Post and Accept */
40#endif
41
Jack Jansen76a05891996-02-29 16:11:32 +000042static PyObject *ErrorObject;
43
44/* ----------------------------------------------------- */
45
46/* Declarations for objects of type Resource fork */
47
48typedef struct {
49 PyObject_HEAD
50 short fRefNum;
51 int isclosed;
52} rfobject;
53
54staticforward PyTypeObject Rftype;
55
56
57
58/* ---------------------------------------------------------------- */
59
60static void
61do_close(self)
62 rfobject *self;
63{
64 if (self->isclosed ) return;
65 (void)FSClose(self->fRefNum);
66 self->isclosed = 1;
67}
68
69static char rf_read__doc__[] =
70"Read data from resource fork"
71;
72
73static PyObject *
74rf_read(self, args)
75 rfobject *self;
76 PyObject *args;
77{
78 long n;
79 PyObject *v;
80 OSErr err;
81
82 if (self->isclosed) {
83 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
84 return NULL;
85 }
86
87 if (!PyArg_ParseTuple(args, "l", &n))
88 return NULL;
89
90 v = PyString_FromStringAndSize((char *)NULL, n);
91 if (v == NULL)
92 return NULL;
93
94 err = FSRead(self->fRefNum, &n, PyString_AsString(v));
95 if (err && err != eofErr) {
96 PyMac_Error(err);
97 Py_DECREF(v);
98 return NULL;
99 }
100 _PyString_Resize(&v, n);
101 return v;
102}
103
104
105static char rf_write__doc__[] =
106"Write to resource fork"
107;
108
109static PyObject *
110rf_write(self, args)
111 rfobject *self;
112 PyObject *args;
113{
114 char *buffer;
115 long size;
116 OSErr err;
117
118 if (self->isclosed) {
119 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
120 return NULL;
121 }
Jack Janseneeccca91997-05-07 15:46:31 +0000122 if (!PyArg_ParseTuple(args, "s#", &buffer, &size))
Jack Jansen76a05891996-02-29 16:11:32 +0000123 return NULL;
124 err = FSWrite(self->fRefNum, &size, buffer);
125 if (err) {
126 PyMac_Error(err);
127 return NULL;
128 }
129 Py_INCREF(Py_None);
130 return Py_None;
131}
132
133
134static char rf_seek__doc__[] =
135"Set file position"
136;
137
138static PyObject *
139rf_seek(self, args)
140 rfobject *self;
141 PyObject *args;
142{
143 long amount, pos;
144 int whence = SEEK_SET;
145 long eof;
146 OSErr err;
147
148 if (self->isclosed) {
149 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
150 return NULL;
151 }
152 if (!PyArg_ParseTuple(args, "l|i", &amount, &whence))
153 return NULL;
154
155 if ( err = GetEOF(self->fRefNum, &eof))
156 goto ioerr;
157
158 switch (whence) {
159 case SEEK_CUR:
160 if (err = GetFPos(self->fRefNum, &pos))
161 goto ioerr;
162 break;
163 case SEEK_END:
164 pos = eof;
165 break;
166 case SEEK_SET:
167 pos = 0;
168 break;
169 default:
170 PyErr_BadArgument();
171 return NULL;
172 }
173
174 pos += amount;
175
176 /* Don't bother implementing seek past EOF */
177 if (pos > eof || pos < 0) {
178 PyErr_BadArgument();
179 return NULL;
180 }
181
182 if ( err = SetFPos(self->fRefNum, fsFromStart, pos) ) {
183ioerr:
184 PyMac_Error(err);
185 return NULL;
186 }
187 Py_INCREF(Py_None);
188 return Py_None;
189}
190
191
192static char rf_tell__doc__[] =
193"Get file position"
194;
195
196static PyObject *
197rf_tell(self, args)
198 rfobject *self;
199 PyObject *args;
200{
201 long where;
202 OSErr err;
203
204 if (self->isclosed) {
205 PyErr_SetString(PyExc_ValueError, "Operation on closed file");
206 return NULL;
207 }
208 if (!PyArg_ParseTuple(args, ""))
209 return NULL;
210 if ( err = GetFPos(self->fRefNum, &where) ) {
211 PyMac_Error(err);
212 return NULL;
213 }
214 return PyInt_FromLong(where);
215}
216
217static char rf_close__doc__[] =
218"Close resource fork"
219;
220
221static PyObject *
222rf_close(self, args)
223 rfobject *self;
224 PyObject *args;
225{
Jack Jansen76a05891996-02-29 16:11:32 +0000226 if (!PyArg_ParseTuple(args, ""))
227 return NULL;
228 do_close(self);
229 Py_INCREF(Py_None);
230 return Py_None;
231}
232
233
234static struct PyMethodDef rf_methods[] = {
235 {"read", rf_read, 1, rf_read__doc__},
236 {"write", rf_write, 1, rf_write__doc__},
237 {"seek", rf_seek, 1, rf_seek__doc__},
238 {"tell", rf_tell, 1, rf_tell__doc__},
239 {"close", rf_close, 1, rf_close__doc__},
240
241 {NULL, NULL} /* sentinel */
242};
243
244/* ---------- */
245
246
247static rfobject *
248newrfobject()
249{
250 rfobject *self;
251
252 self = PyObject_NEW(rfobject, &Rftype);
253 if (self == NULL)
254 return NULL;
255 self->isclosed = 1;
256 return self;
257}
258
259
260static void
261rf_dealloc(self)
262 rfobject *self;
263{
264 do_close(self);
265 PyMem_DEL(self);
266}
267
268static PyObject *
269rf_getattr(self, name)
270 rfobject *self;
271 char *name;
272{
273 return Py_FindMethod(rf_methods, (PyObject *)self, name);
274}
275
276static char Rftype__doc__[] =
277"Resource fork file object"
278;
279
280static PyTypeObject Rftype = {
281 PyObject_HEAD_INIT(&PyType_Type)
282 0, /*ob_size*/
Jack Jansena755e681997-09-20 17:40:22 +0000283 "ResourceFork", /*tp_name*/
Jack Jansen76a05891996-02-29 16:11:32 +0000284 sizeof(rfobject), /*tp_basicsize*/
285 0, /*tp_itemsize*/
286 /* methods */
287 (destructor)rf_dealloc, /*tp_dealloc*/
288 (printfunc)0, /*tp_print*/
289 (getattrfunc)rf_getattr, /*tp_getattr*/
290 (setattrfunc)0, /*tp_setattr*/
291 (cmpfunc)0, /*tp_compare*/
292 (reprfunc)0, /*tp_repr*/
293 0, /*tp_as_number*/
294 0, /*tp_as_sequence*/
295 0, /*tp_as_mapping*/
296 (hashfunc)0, /*tp_hash*/
297 (ternaryfunc)0, /*tp_call*/
298 (reprfunc)0, /*tp_str*/
299
300 /* Space for future expansion */
301 0L,0L,0L,0L,
302 Rftype__doc__ /* Documentation string */
303};
304
305/* End of code for Resource fork objects */
306/* -------------------------------------------------------- */
Guido van Rossum2d167031994-09-16 10:54:21 +0000307
308/*----------------------------------------------------------------------*/
Guido van Rossume791c2e1995-01-09 13:20:04 +0000309/* Miscellaneous File System Operations */
310
Jack Jansen120a1051997-06-03 15:29:41 +0000311static char getcrtp_doc[] = "Obsolete, use macfs module";
312
Guido van Rossume791c2e1995-01-09 13:20:04 +0000313static PyObject *
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000314MacOS_GetCreatorAndType(PyObject *self, PyObject *args)
Guido van Rossume791c2e1995-01-09 13:20:04 +0000315{
Jack Jansene79dc762000-06-02 21:35:07 +0000316 FSSpec fss;
Guido van Rossume791c2e1995-01-09 13:20:04 +0000317 FInfo info;
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000318 PyObject *creator, *type, *res;
Guido van Rossume791c2e1995-01-09 13:20:04 +0000319 OSErr err;
320
Jack Jansene79dc762000-06-02 21:35:07 +0000321 if (!PyArg_ParseTuple(args, "O&", PyMac_GetFSSpec, &fss))
Guido van Rossume791c2e1995-01-09 13:20:04 +0000322 return NULL;
Jack Jansene79dc762000-06-02 21:35:07 +0000323 if ((err = FSpGetFInfo(&fss, &info)) != noErr)
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000324 return PyErr_Mac(MacOS_Error, err);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000325 creator = PyString_FromStringAndSize((char *)&info.fdCreator, 4);
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000326 type = PyString_FromStringAndSize((char *)&info.fdType, 4);
327 res = Py_BuildValue("OO", creator, type);
Guido van Rossumfffb8bb1995-01-12 12:37:24 +0000328 Py_DECREF(creator);
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000329 Py_DECREF(type);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000330 return res;
331}
332
Jack Jansen120a1051997-06-03 15:29:41 +0000333static char setcrtp_doc[] = "Obsolete, use macfs module";
334
Guido van Rossume791c2e1995-01-09 13:20:04 +0000335static PyObject *
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000336MacOS_SetCreatorAndType(PyObject *self, PyObject *args)
Guido van Rossume791c2e1995-01-09 13:20:04 +0000337{
Jack Jansene79dc762000-06-02 21:35:07 +0000338 FSSpec fss;
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000339 ResType creator, type;
Guido van Rossume791c2e1995-01-09 13:20:04 +0000340 FInfo info;
341 OSErr err;
342
343 if (!PyArg_ParseTuple(args, "O&O&O&",
Jack Jansene79dc762000-06-02 21:35:07 +0000344 PyMac_GetFSSpec, &fss, PyMac_GetOSType, &creator, PyMac_GetOSType, &type))
Guido van Rossume791c2e1995-01-09 13:20:04 +0000345 return NULL;
Jack Jansene79dc762000-06-02 21:35:07 +0000346 if ((err = FSpGetFInfo(&fss, &info)) != noErr)
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000347 return PyErr_Mac(MacOS_Error, err);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000348 info.fdCreator = creator;
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000349 info.fdType = type;
Jack Jansene79dc762000-06-02 21:35:07 +0000350 if ((err = FSpSetFInfo(&fss, &info)) != noErr)
Guido van Rossumb7e79e51995-01-22 18:42:12 +0000351 return PyErr_Mac(MacOS_Error, err);
Guido van Rossume791c2e1995-01-09 13:20:04 +0000352 Py_INCREF(Py_None);
353 return Py_None;
354}
355
356/*----------------------------------------------------------------------*/
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000357/* STDWIN High Level Event interface */
358
359#include <EPPC.h>
360#include <Events.h>
361
Jack Jansene79dc762000-06-02 21:35:07 +0000362#ifndef TARGET_API_MAC_CARBON
Jack Jansen120a1051997-06-03 15:29:41 +0000363static char accepthle_doc[] = "Get arguments of pending high-level event";
364
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000365static PyObject *
366MacOS_AcceptHighLevelEvent(self, args)
367 PyObject *self;
368 PyObject *args;
369{
370 TargetID sender;
371 unsigned long refcon;
372 Ptr buf;
373 unsigned long len;
374 OSErr err;
375 PyObject *res;
376
377 buf = NULL;
378 len = 0;
379 err = AcceptHighLevelEvent(&sender, &refcon, buf, &len);
380 if (err == bufferIsSmall) {
381 buf = malloc(len);
382 if (buf == NULL)
383 return PyErr_NoMemory();
384 err = AcceptHighLevelEvent(&sender, &refcon, buf, &len);
385 if (err != noErr) {
386 free(buf);
387 return PyErr_Mac(MacOS_Error, (int)err);
388 }
389 }
390 else if (err != noErr)
391 return PyErr_Mac(MacOS_Error, (int)err);
392 res = Py_BuildValue("s#ls#",
393 (char *)&sender, (int)(sizeof sender), refcon, (char *)buf, (int)len);
394 free(buf);
395 return res;
396}
Jack Jansene79dc762000-06-02 21:35:07 +0000397#endif
Jack Jansen120a1051997-06-03 15:29:41 +0000398static char schedparams_doc[] = "Set/return mainloop interrupt check flag, etc";
399
Jack Jansene8e8ae01995-01-26 16:36:45 +0000400/*
Jack Jansen120a1051997-06-03 15:29:41 +0000401** Set scheduler parameters
Jack Jansene8e8ae01995-01-26 16:36:45 +0000402*/
403static PyObject *
Jack Jansen120a1051997-06-03 15:29:41 +0000404MacOS_SchedParams(PyObject *self, PyObject *args)
Jack Jansene8e8ae01995-01-26 16:36:45 +0000405{
Jack Jansen120a1051997-06-03 15:29:41 +0000406 PyMacSchedParams old, new;
Jack Jansene8e8ae01995-01-26 16:36:45 +0000407
Jack Jansen120a1051997-06-03 15:29:41 +0000408 PyMac_GetSchedParams(&old);
409 new = old;
410 if (!PyArg_ParseTuple(args, "|iiidd", &new.check_interrupt, &new.process_events,
411 &new.besocial, &new.check_interval, &new.bg_yield))
Jack Jansene8e8ae01995-01-26 16:36:45 +0000412 return NULL;
Jack Jansen120a1051997-06-03 15:29:41 +0000413 PyMac_SetSchedParams(&new);
414 return Py_BuildValue("iiidd", old.check_interrupt, old.process_events,
415 old.besocial, old.check_interval, old.bg_yield);
Jack Jansene8e8ae01995-01-26 16:36:45 +0000416}
417
Jack Jansen120a1051997-06-03 15:29:41 +0000418static char appswitch_doc[] = "Obsolete, use SchedParams";
419
420/* Obsolete, for backward compatability */
Jack Jansenee23d6e1995-01-27 14:43:25 +0000421static PyObject *
422MacOS_EnableAppswitch(PyObject *self, PyObject *args)
423{
Jack Jansen120a1051997-06-03 15:29:41 +0000424 int new, old;
425 PyMacSchedParams schp;
Jack Jansenee23d6e1995-01-27 14:43:25 +0000426
Guido van Rossume7134aa1995-02-26 10:20:53 +0000427 if (!PyArg_ParseTuple(args, "i", &new))
Jack Jansenee23d6e1995-01-27 14:43:25 +0000428 return NULL;
Jack Jansen120a1051997-06-03 15:29:41 +0000429 PyMac_GetSchedParams(&schp);
430 if ( schp.process_events )
431 old = 1;
432 else if ( schp.check_interrupt )
Jack Jansen120a1051997-06-03 15:29:41 +0000433 old = 0;
Jack Jansen2e871e41997-09-08 13:23:19 +0000434 else
435 old = -1;
Jack Jansen120a1051997-06-03 15:29:41 +0000436 if ( new > 0 ) {
437 schp.process_events = mDownMask|keyDownMask|osMask;
438 schp.check_interrupt = 1;
Jack Jansen2e871e41997-09-08 13:23:19 +0000439 } else if ( new == 0 ) {
Jack Jansen120a1051997-06-03 15:29:41 +0000440 schp.process_events = 0;
441 schp.check_interrupt = 1;
442 } else {
443 schp.process_events = 0;
444 schp.check_interrupt = 0;
445 }
446 PyMac_SetSchedParams(&schp);
Guido van Rossume7134aa1995-02-26 10:20:53 +0000447 return Py_BuildValue("i", old);
Jack Jansenee23d6e1995-01-27 14:43:25 +0000448}
449
Jack Jansen883765e1997-06-20 16:19:38 +0000450static char setevh_doc[] = "Set python event handler to be called in mainloop";
451
452static PyObject *
453MacOS_SetEventHandler(self, args)
454 PyObject *self;
455 PyObject *args;
456{
457 PyObject *evh = NULL;
458
459 if (!PyArg_ParseTuple(args, "|O", &evh))
460 return NULL;
461 if (evh == Py_None)
462 evh = NULL;
463 if ( evh && !PyCallable_Check(evh) ) {
464 PyErr_SetString(PyExc_ValueError, "SetEventHandler argument must be callable");
465 return NULL;
466 }
467 if ( !PyMac_SetEventHandler(evh) )
468 return NULL;
469 Py_INCREF(Py_None);
470 return Py_None;
471}
472
Jack Jansen120a1051997-06-03 15:29:41 +0000473static char handleev_doc[] = "Pass event to other interested parties like sioux";
Jack Jansena76382a1995-02-02 14:25:56 +0000474
475static PyObject *
476MacOS_HandleEvent(PyObject *self, PyObject *args)
477{
478 EventRecord ev;
479
480 if (!PyArg_ParseTuple(args, "O&", PyMac_GetEventRecord, &ev))
481 return NULL;
Jack Jansen883765e1997-06-20 16:19:38 +0000482 PyMac_HandleEventIntern(&ev);
Jack Jansena76382a1995-02-02 14:25:56 +0000483 Py_INCREF(Py_None);
484 return Py_None;
485}
486
Jack Jansen120a1051997-06-03 15:29:41 +0000487static char geterr_doc[] = "Convert OSErr number to string";
488
Jack Jansen829f88c1995-07-17 11:36:01 +0000489static PyObject *
490MacOS_GetErrorString(PyObject *self, PyObject *args)
491{
492 int errn;
493
494 if (!PyArg_ParseTuple(args, "i", &errn))
495 return NULL;
496 return Py_BuildValue("s", PyMac_StrError(errn));
497}
498
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000499static char splash_doc[] = "Open a splash-screen dialog by resource-id (0=close)";
500
501static PyObject *
502MacOS_splash(PyObject *self, PyObject *args)
503{
Jack Jansendf34cf11996-09-15 22:12:00 +0000504 int resid = -1;
Jack Jansen450ae9f1997-05-13 15:41:48 +0000505 static DialogPtr curdialog = NULL;
Jack Jansen2e871e41997-09-08 13:23:19 +0000506 DialogPtr olddialog;
Jack Jansen04df9d51996-09-23 15:49:43 +0000507 WindowRef theWindow;
508 CGrafPtr thePort;
Jack Jansene79dc762000-06-02 21:35:07 +0000509#if 0
Jack Jansen04df9d51996-09-23 15:49:43 +0000510 short xpos, ypos, width, height, swidth, sheight;
Jack Jansene79dc762000-06-02 21:35:07 +0000511#endif
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000512
Jack Jansendf34cf11996-09-15 22:12:00 +0000513 if (!PyArg_ParseTuple(args, "|i", &resid))
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000514 return NULL;
Jack Jansen2e871e41997-09-08 13:23:19 +0000515 olddialog = curdialog;
Jack Jansencbe6a531998-02-20 15:59:59 +0000516 curdialog = NULL;
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000517
Jack Jansendf34cf11996-09-15 22:12:00 +0000518 if ( resid != -1 ) {
519 curdialog = GetNewDialog(resid, NULL, (WindowPtr)-1);
Jack Jansen04df9d51996-09-23 15:49:43 +0000520 if ( curdialog ) {
521 theWindow = GetDialogWindow(curdialog);
522 thePort = GetWindowPort(theWindow);
Jack Jansene79dc762000-06-02 21:35:07 +0000523#if 0
Jack Jansen04df9d51996-09-23 15:49:43 +0000524 width = thePort->portRect.right - thePort->portRect.left;
525 height = thePort->portRect.bottom - thePort->portRect.top;
526 swidth = qd.screenBits.bounds.right - qd.screenBits.bounds.left;
527 sheight = qd.screenBits.bounds.bottom - qd.screenBits.bounds.top - LMGetMBarHeight();
528 xpos = (swidth-width)/2;
529 ypos = (sheight-height)/5 + LMGetMBarHeight();
530 MoveWindow(theWindow, xpos, ypos, 0);
531 ShowWindow(theWindow);
Jack Jansene79dc762000-06-02 21:35:07 +0000532#endif
Jack Jansendf34cf11996-09-15 22:12:00 +0000533 DrawDialog(curdialog);
Jack Jansen04df9d51996-09-23 15:49:43 +0000534 }
Jack Jansendf34cf11996-09-15 22:12:00 +0000535 }
Jack Jansen2e871e41997-09-08 13:23:19 +0000536 if (olddialog)
537 DisposeDialog(olddialog);
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000538 Py_INCREF(Py_None);
539 return Py_None;
540}
541
Jack Janseneb76b841996-09-30 14:43:22 +0000542static char DebugStr_doc[] = "Switch to low-level debugger with a message";
543
544static PyObject *
545MacOS_DebugStr(PyObject *self, PyObject *args)
546{
547 Str255 message;
548 PyObject *object = 0;
549
550 if (!PyArg_ParseTuple(args, "O&|O", PyMac_GetStr255, message, &object))
551 return NULL;
552 DebugStr(message);
553 Py_INCREF(Py_None);
554 return Py_None;
555}
Jack Jansenab7fcdd1996-05-20 11:32:00 +0000556
Jack Jansen2e871e41997-09-08 13:23:19 +0000557static char SysBeep_doc[] = "BEEEEEP!!!";
558
559static PyObject *
560MacOS_SysBeep(PyObject *self, PyObject *args)
561{
562 int duration = 6;
563
564 if (!PyArg_ParseTuple(args, "|i", &duration))
565 return NULL;
566 SysBeep(duration);
567 Py_INCREF(Py_None);
568 return Py_None;
569}
570
Jack Jansen898ac1b1997-09-01 15:38:12 +0000571static char GetTicks_doc[] = "Return number of ticks since bootup";
572
573static PyObject *
574MacOS_GetTicks(PyObject *self, PyObject *args)
575{
Jack Jansene79dc762000-06-02 21:35:07 +0000576 return Py_BuildValue("i", (int)TickCount());
Jack Jansen898ac1b1997-09-01 15:38:12 +0000577}
578
Jack Jansen76a05891996-02-29 16:11:32 +0000579static char openrf_doc[] = "Open resource fork of a file";
580
581static PyObject *
582MacOS_openrf(PyObject *self, PyObject *args)
583{
584 OSErr err;
585 char *mode = "r";
586 FSSpec fss;
587 SignedByte permission = 1;
588 rfobject *fp;
589
590 if (!PyArg_ParseTuple(args, "O&|s", PyMac_GetFSSpec, &fss, &mode))
591 return NULL;
592 while (*mode) {
593 switch (*mode++) {
594 case '*': break;
595 case 'r': permission = 1; break;
596 case 'w': permission = 2; break;
597 case 'b': break;
598 default:
599 PyErr_BadArgument();
600 return NULL;
601 }
602 }
603
604 if ( (fp = newrfobject()) == NULL )
605 return NULL;
606
607 err = HOpenRF(fss.vRefNum, fss.parID, fss.name, permission, &fp->fRefNum);
608
609 if ( err == fnfErr ) {
610 /* In stead of doing complicated things here to get creator/type
611 ** correct we let the standard i/o library handle it
612 */
613 FILE *tfp;
614 char pathname[257];
615
Jack Jansen84fb1fa1996-11-09 18:46:57 +0000616 if ( err=PyMac_GetFullPath(&fss, pathname) ) {
Jack Jansen76a05891996-02-29 16:11:32 +0000617 PyMac_Error(err);
618 Py_DECREF(fp);
619 return NULL;
620 }
621
622 if ( (tfp = fopen(pathname, "w")) == NULL ) {
623 PyMac_Error(fnfErr); /* What else... */
624 Py_DECREF(fp);
625 return NULL;
626 }
627 fclose(tfp);
628 err = HOpenRF(fss.vRefNum, fss.parID, fss.name, permission, &fp->fRefNum);
629 }
630 if ( err ) {
631 Py_DECREF(fp);
632 PyMac_Error(err);
633 return NULL;
634 }
635 fp->isclosed = 0;
636 return (PyObject *)fp;
637}
638
Jack Jansen957d07a2000-02-21 11:07:37 +0000639static char FreeMem_doc[] = "Return the total amount of free space in the heap";
640
641static PyObject *
642MacOS_FreeMem(PyObject *self, PyObject *args)
643{
644 long rv;
645
646 if (!PyArg_ParseTuple(args, ""))
647 return NULL;
648 rv = FreeMem();
649 return Py_BuildValue("l", rv);
650}
651
652static char MaxBlock_doc[] = "Return the largest contiguous block of free space in the heap";
653
654static PyObject *
655MacOS_MaxBlock(PyObject *self, PyObject *args)
656{
657 long rv;
658
659 if (!PyArg_ParseTuple(args, ""))
660 return NULL;
661 rv = MaxBlock();
662 return Py_BuildValue("l", rv);
663}
664
665static char CompactMem_doc[] = "(wanted size)->actual largest block after compacting";
666
667static PyObject *
668MacOS_CompactMem(PyObject *self, PyObject *args)
669{
670 long value;
671 long rv;
672
673 if (!PyArg_ParseTuple(args, "l", &value))
674 return NULL;
675 rv = CompactMem(value);
676 return Py_BuildValue("l", rv);
677}
678
Guido van Rossum2d167031994-09-16 10:54:21 +0000679static PyMethodDef MacOS_Methods[] = {
Jack Jansene79dc762000-06-02 21:35:07 +0000680#ifndef TARGET_API_MAC_CARBON
Jack Jansen120a1051997-06-03 15:29:41 +0000681 {"AcceptHighLevelEvent", MacOS_AcceptHighLevelEvent, 1, accepthle_doc},
Jack Jansene79dc762000-06-02 21:35:07 +0000682#endif
Jack Jansen120a1051997-06-03 15:29:41 +0000683 {"GetCreatorAndType", MacOS_GetCreatorAndType, 1, getcrtp_doc},
684 {"SetCreatorAndType", MacOS_SetCreatorAndType, 1, setcrtp_doc},
Jack Jansen120a1051997-06-03 15:29:41 +0000685 {"SchedParams", MacOS_SchedParams, 1, schedparams_doc},
686 {"EnableAppswitch", MacOS_EnableAppswitch, 1, appswitch_doc},
Jack Jansen883765e1997-06-20 16:19:38 +0000687 {"SetEventHandler", MacOS_SetEventHandler, 1, setevh_doc},
Jack Jansen120a1051997-06-03 15:29:41 +0000688 {"HandleEvent", MacOS_HandleEvent, 1, handleev_doc},
689 {"GetErrorString", MacOS_GetErrorString, 1, geterr_doc},
690 {"openrf", MacOS_openrf, 1, openrf_doc},
691 {"splash", MacOS_splash, 1, splash_doc},
692 {"DebugStr", MacOS_DebugStr, 1, DebugStr_doc},
Jack Jansen898ac1b1997-09-01 15:38:12 +0000693 {"GetTicks", MacOS_GetTicks, 1, GetTicks_doc},
Jack Jansen2e871e41997-09-08 13:23:19 +0000694 {"SysBeep", MacOS_SysBeep, 1, SysBeep_doc},
Jack Jansen957d07a2000-02-21 11:07:37 +0000695 {"FreeMem", MacOS_FreeMem, 1, FreeMem_doc},
696 {"MaxBlock", MacOS_MaxBlock, 1, MaxBlock_doc},
697 {"CompactMem", MacOS_CompactMem, 1, CompactMem_doc},
Guido van Rossumf74d4e21995-01-18 23:58:07 +0000698 {NULL, NULL} /* Sentinel */
Guido van Rossum2d167031994-09-16 10:54:21 +0000699};
700
701
702void
Jack Jansend6741631998-07-01 15:48:54 +0000703initMacOS()
Guido van Rossum2d167031994-09-16 10:54:21 +0000704{
705 PyObject *m, *d;
706
707 m = Py_InitModule("MacOS", MacOS_Methods);
708 d = PyModule_GetDict(m);
709
710 /* Initialize MacOS.Error exception */
Guido van Rossumbf068b11995-01-25 23:09:20 +0000711 MacOS_Error = PyMac_GetOSErrException();
Guido van Rossume433c971994-09-29 10:02:56 +0000712 if (MacOS_Error == NULL || PyDict_SetItemString(d, "Error", MacOS_Error) != 0)
Guido van Rossum2d167031994-09-16 10:54:21 +0000713 Py_FatalError("can't define MacOS.Error");
Jack Jansena755e681997-09-20 17:40:22 +0000714 Rftype.ob_type = &PyType_Type;
715 Py_INCREF(&Rftype);
716 if (PyDict_SetItemString(d, "ResourceForkType", (PyObject *)&Rftype) != 0)
717 Py_FatalError("can't define MacOS.ResourceForkType");
Jack Jansenf73bab71997-04-03 14:51:03 +0000718 /*
719 ** This is a hack: the following constant added to the id() of a string
720 ** object gives you the address of the data. Unfortunately, it is needed for
721 ** some of the image and sound processing interfaces on the mac:-(
722 */
723 {
724 PyStringObject *p = 0;
725 long off = (long)&(p->ob_sval[0]);
726
727 if( PyDict_SetItemString(d, "string_id_to_buffer", Py_BuildValue("i", off)) != 0)
728 Py_FatalError("Can't define MacOS.string_id_to_buffer");
729 }
Jack Jansen8f5725a1999-12-07 23:08:10 +0000730 if (PyDict_SetItemString(d, "AppearanceCompliant",
731 Py_BuildValue("i", PyMac_AppearanceCompliant)) != 0)
732 Py_FatalError("can't define MacOS.AppearanceCompliant");
Guido van Rossum2d167031994-09-16 10:54:21 +0000733}
Guido van Rossume7134aa1995-02-26 10:20:53 +0000734