ยปCore Development>Code coverage>Mac/Modules/MacOS.c

Python code coverage for Mac/Modules/MacOS.c

#countcontent
1n/a/***********************************************************
2n/aCopyright 1991-1997 by Stichting Mathematisch Centrum, Amsterdam,
3n/aThe Netherlands.
4n/a
5n/a All Rights Reserved
6n/a
7n/aPermission to use, copy, modify, and distribute this software and its
8n/adocumentation for any purpose and without fee is hereby granted,
9n/aprovided that the above copyright notice appear in all copies and that
10n/aboth that copyright notice and this permission notice appear in
11n/asupporting documentation, and that the names of Stichting Mathematisch
12n/aCentrum or CWI not be used in advertising or publicity pertaining to
13n/adistribution of the software without specific, written prior permission.
14n/a
15n/aSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16n/aTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17n/aFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18n/aFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19n/aWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20n/aACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21n/aOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22n/a
23n/a******************************************************************/
24n/a
25n/a/* Macintosh OS-specific interface */
26n/a
27n/a#include "Python.h"
28n/a#include "pymactoolbox.h"
29n/a
30n/a#include <Carbon/Carbon.h>
31n/a#include <ApplicationServices/ApplicationServices.h>
32n/a
33n/a#include <arpa/inet.h> /* for ntohl, htonl */
34n/a
35n/a
36n/a#ifndef HAVE_OSX105_SDK
37n/atypedef SInt16 FSIORefNum;
38n/a#endif
39n/a
40n/astatic PyObject *MacOS_Error; /* Exception MacOS.Error */
41n/a
42n/a#define PATHNAMELEN 1024
43n/a
44n/a/* ----------------------------------------------------- */
45n/a
46n/a/* Declarations for objects of type Resource fork */
47n/a
48n/atypedef struct {
49n/a PyObject_HEAD
50n/a FSIORefNum fRefNum;
51n/a int isclosed;
52n/a} rfobject;
53n/a
54n/astatic PyTypeObject Rftype;
55n/a
56n/a
57n/a
58n/a/* ---------------------------------------------------------------- */
59n/a
60n/astatic void
61n/ado_close(rfobject *self)
62n/a{
63n/a if (self->isclosed ) return;
64n/a (void)FSCloseFork(self->fRefNum);
65n/a self->isclosed = 1;
66n/a}
67n/a
68n/astatic char rf_read__doc__[] =
69n/a"Read data from resource fork"
70n/a;
71n/a
72n/astatic PyObject *
73n/arf_read(rfobject *self, PyObject *args)
74n/a{
75n/a long n;
76n/a PyObject *v;
77n/a OSErr err;
78n/a ByteCount n2;
79n/a
80n/a if (self->isclosed) {
81n/a PyErr_SetString(PyExc_ValueError, "Operation on closed file");
82n/a return NULL;
83n/a }
84n/a
85n/a if (!PyArg_ParseTuple(args, "l", &n))
86n/a return NULL;
87n/a
88n/a v = PyBytes_FromStringAndSize((char *)NULL, n);
89n/a if (v == NULL)
90n/a return NULL;
91n/a
92n/a err = FSReadFork(self->fRefNum, fsAtMark, 0, n, PyString_AsString(v), &n2);
93n/a if (err && err != eofErr) {
94n/a PyMac_Error(err);
95n/a Py_DECREF(v);
96n/a return NULL;
97n/a }
98n/a _PyString_Resize(&v, n2);
99n/a return v;
100n/a}
101n/a
102n/a
103n/astatic char rf_write__doc__[] =
104n/a"Write to resource fork"
105n/a;
106n/a
107n/astatic PyObject *
108n/arf_write(rfobject *self, PyObject *args)
109n/a{
110n/a char *buffer;
111n/a long size;
112n/a OSErr err;
113n/a
114n/a if (self->isclosed) {
115n/a PyErr_SetString(PyExc_ValueError, "Operation on closed file");
116n/a return NULL;
117n/a }
118n/a if (!PyArg_ParseTuple(args, "s#", &buffer, &size))
119n/a return NULL;
120n/a err = FSWriteFork(self->fRefNum, fsAtMark, 0, size, buffer, NULL);
121n/a if (err) {
122n/a PyMac_Error(err);
123n/a return NULL;
124n/a }
125n/a Py_INCREF(Py_None);
126n/a return Py_None;
127n/a}
128n/a
129n/a
130n/astatic char rf_seek__doc__[] =
131n/a"Set file position"
132n/a;
133n/a
134n/astatic PyObject *
135n/arf_seek(rfobject *self, PyObject *args)
136n/a{
137n/a long amount;
138n/a int whence = SEEK_SET;
139n/a int mode;
140n/a OSErr err;
141n/a
142n/a if (self->isclosed) {
143n/a PyErr_SetString(PyExc_ValueError, "Operation on closed file");
144n/a return NULL;
145n/a }
146n/a if (!PyArg_ParseTuple(args, "l|i", &amount, &whence)) {
147n/a return NULL;
148n/a }
149n/a
150n/a switch (whence) {
151n/a case SEEK_CUR:
152n/a mode = fsFromMark;
153n/a break;
154n/a case SEEK_END:
155n/a mode = fsFromLEOF;
156n/a break;
157n/a case SEEK_SET:
158n/a mode = fsFromStart;
159n/a break;
160n/a default:
161n/a PyErr_BadArgument();
162n/a return NULL;
163n/a }
164n/a
165n/a err = FSSetForkPosition(self->fRefNum, mode, amount);
166n/a if (err != noErr) {
167n/a PyMac_Error(err);
168n/a return NULL;
169n/a }
170n/a Py_INCREF(Py_None);
171n/a return Py_None;
172n/a}
173n/a
174n/a
175n/astatic char rf_tell__doc__[] =
176n/a"Get file position"
177n/a;
178n/a
179n/astatic PyObject *
180n/arf_tell(rfobject *self, PyObject *args)
181n/a{
182n/a long long where;
183n/a OSErr err;
184n/a
185n/a if (self->isclosed) {
186n/a PyErr_SetString(PyExc_ValueError, "Operation on closed file");
187n/a return NULL;
188n/a }
189n/a if (!PyArg_ParseTuple(args, ""))
190n/a return NULL;
191n/a
192n/a err = FSGetForkPosition(self->fRefNum, &where);
193n/a if (err != noErr) {
194n/a PyMac_Error(err);
195n/a return NULL;
196n/a }
197n/a return PyLong_FromLongLong(where);
198n/a}
199n/a
200n/astatic char rf_close__doc__[] =
201n/a"Close resource fork"
202n/a;
203n/a
204n/astatic PyObject *
205n/arf_close(rfobject *self, PyObject *args)
206n/a{
207n/a if (!PyArg_ParseTuple(args, ""))
208n/a return NULL;
209n/a do_close(self);
210n/a Py_INCREF(Py_None);
211n/a return Py_None;
212n/a}
213n/a
214n/a
215n/astatic struct PyMethodDef rf_methods[] = {
216n/a {"read", (PyCFunction)rf_read, 1, rf_read__doc__},
217n/a {"write", (PyCFunction)rf_write, 1, rf_write__doc__},
218n/a {"seek", (PyCFunction)rf_seek, 1, rf_seek__doc__},
219n/a {"tell", (PyCFunction)rf_tell, 1, rf_tell__doc__},
220n/a {"close", (PyCFunction)rf_close, 1, rf_close__doc__},
221n/a
222n/a {NULL, NULL} /* sentinel */
223n/a};
224n/a
225n/a/* ---------- */
226n/a
227n/a
228n/astatic rfobject *
229n/anewrfobject(void)
230n/a{
231n/a rfobject *self;
232n/a
233n/a self = PyObject_NEW(rfobject, &Rftype);
234n/a if (self == NULL)
235n/a return NULL;
236n/a self->isclosed = 1;
237n/a return self;
238n/a}
239n/a
240n/a
241n/astatic void
242n/arf_dealloc(rfobject *self)
243n/a{
244n/a do_close(self);
245n/a PyObject_DEL(self);
246n/a}
247n/a
248n/astatic PyObject *
249n/arf_getattr(rfobject *self, char *name)
250n/a{
251n/a return Py_FindMethod(rf_methods, (PyObject *)self, name);
252n/a}
253n/a
254n/astatic char Rftype__doc__[] =
255n/a"Resource fork file object"
256n/a;
257n/a
258n/astatic PyTypeObject Rftype = {
259n/a PyObject_HEAD_INIT(&PyType_Type)
260n/a 0, /*ob_size*/
261n/a "MacOS.ResourceFork", /*tp_name*/
262n/a sizeof(rfobject), /*tp_basicsize*/
263n/a 0, /*tp_itemsize*/
264n/a /* methods */
265n/a (destructor)rf_dealloc, /*tp_dealloc*/
266n/a (printfunc)0, /*tp_print*/
267n/a (getattrfunc)rf_getattr, /*tp_getattr*/
268n/a (setattrfunc)0, /*tp_setattr*/
269n/a (cmpfunc)0, /*tp_compare*/
270n/a (reprfunc)0, /*tp_repr*/
271n/a 0, /*tp_as_number*/
272n/a 0, /*tp_as_sequence*/
273n/a 0, /*tp_as_mapping*/
274n/a (hashfunc)0, /*tp_hash*/
275n/a (ternaryfunc)0, /*tp_call*/
276n/a (reprfunc)0, /*tp_str*/
277n/a
278n/a /* Space for future expansion */
279n/a 0L,0L,0L,0L,
280n/a Rftype__doc__ /* Documentation string */
281n/a};
282n/a
283n/a
284n/a/* End of code for Resource fork objects */
285n/a/* -------------------------------------------------------- */
286n/a
287n/a/*----------------------------------------------------------------------*/
288n/a/* Miscellaneous File System Operations */
289n/a
290n/astatic char getcrtp_doc[] = "Get MacOS 4-char creator and type for a file";
291n/a
292n/astatic PyObject *
293n/aMacOS_GetCreatorAndType(PyObject *self, PyObject *args)
294n/a{
295n/a PyObject *creator, *type, *res;
296n/a OSErr err;
297n/a FSRef ref;
298n/a FSCatalogInfo cataloginfo;
299n/a FileInfo* finfo;
300n/a
301n/a if (!PyArg_ParseTuple(args, "O&", PyMac_GetFSRef, &ref)) {
302n/a#ifndef __LP64__
303n/a /* This function is documented to take an FSSpec as well,
304n/a * which only works in 32-bit mode.
305n/a */
306n/a PyErr_Clear();
307n/a FSSpec fss;
308n/a FInfo info;
309n/a
310n/a if (!PyArg_ParseTuple(args, "O&", PyMac_GetFSSpec, &fss))
311n/a return NULL;
312n/a
313n/a if ((err = FSpGetFInfo(&fss, &info)) != noErr) {
314n/a return PyErr_Mac(MacOS_Error, err);
315n/a }
316n/a
317n/a info.fdCreator = ntohl(info.fdCreator);
318n/a info.fdType = ntohl(info.fdType);
319n/a
320n/a creator = PyString_FromStringAndSize(
321n/a (char *)&info.fdCreator, 4);
322n/a type = PyString_FromStringAndSize((char *)&info.fdType, 4);
323n/a res = Py_BuildValue("OO", creator, type);
324n/a Py_DECREF(creator);
325n/a Py_DECREF(type);
326n/a return res;
327n/a#else /* __LP64__ */
328n/a return NULL;
329n/a#endif /* __LP64__ */
330n/a }
331n/a
332n/a err = FSGetCatalogInfo(&ref,
333n/a kFSCatInfoFinderInfo|kFSCatInfoNodeFlags, &cataloginfo,
334n/a NULL, NULL, NULL);
335n/a if (err != noErr) {
336n/a PyErr_Mac(MacOS_Error, err);
337n/a return NULL;
338n/a }
339n/a
340n/a if ((cataloginfo.nodeFlags & kFSNodeIsDirectoryMask) != 0) {
341n/a /* Directory: doesn't have type/creator info.
342n/a *
343n/a * The specific error code is for backward compatibility with
344n/a * earlier versions.
345n/a */
346n/a PyErr_Mac(MacOS_Error, fnfErr);
347n/a return NULL;
348n/a
349n/a }
350n/a finfo = (FileInfo*)&(cataloginfo.finderInfo);
351n/a finfo->fileCreator = ntohl(finfo->fileCreator);
352n/a finfo->fileType = ntohl(finfo->fileType);
353n/a creator = PyString_FromStringAndSize((char*)&(finfo->fileCreator), 4);
354n/a type = PyString_FromStringAndSize((char*)&(finfo->fileType), 4);
355n/a
356n/a res = Py_BuildValue("OO", creator, type);
357n/a Py_DECREF(creator);
358n/a Py_DECREF(type);
359n/a return res;
360n/a}
361n/a
362n/astatic char setcrtp_doc[] = "Set MacOS 4-char creator and type for a file";
363n/a
364n/astatic PyObject *
365n/aMacOS_SetCreatorAndType(PyObject *self, PyObject *args)
366n/a{
367n/a ResType creator, type;
368n/a FSRef ref;
369n/a FileInfo* finfo;
370n/a OSErr err;
371n/a FSCatalogInfo cataloginfo;
372n/a
373n/a if (!PyArg_ParseTuple(args, "O&O&O&",
374n/a PyMac_GetFSRef, &ref, PyMac_GetOSType, &creator, PyMac_GetOSType, &type)) {
375n/a#ifndef __LP64__
376n/a /* Try to handle FSSpec arguments, for backward compatibility */
377n/a FSSpec fss;
378n/a FInfo info;
379n/a
380n/a if (!PyArg_ParseTuple(args, "O&O&O&",
381n/a PyMac_GetFSSpec, &fss, PyMac_GetOSType, &creator, PyMac_GetOSType, &type))
382n/a return NULL;
383n/a
384n/a if ((err = FSpGetFInfo(&fss, &info)) != noErr)
385n/a return PyErr_Mac(MacOS_Error, err);
386n/a
387n/a info.fdCreator = creator;
388n/a info.fdType = type;
389n/a
390n/a if ((err = FSpSetFInfo(&fss, &info)) != noErr)
391n/a return PyErr_Mac(MacOS_Error, err);
392n/a Py_INCREF(Py_None);
393n/a return Py_None;
394n/a#else /* __LP64__ */
395n/a return NULL;
396n/a#endif /* __LP64__ */
397n/a }
398n/a
399n/a err = FSGetCatalogInfo(&ref,
400n/a kFSCatInfoFinderInfo|kFSCatInfoNodeFlags, &cataloginfo,
401n/a NULL, NULL, NULL);
402n/a if (err != noErr) {
403n/a PyErr_Mac(MacOS_Error, err);
404n/a return NULL;
405n/a }
406n/a
407n/a if ((cataloginfo.nodeFlags & kFSNodeIsDirectoryMask) != 0) {
408n/a /* Directory: doesn't have type/creator info.
409n/a *
410n/a * The specific error code is for backward compatibility with
411n/a * earlier versions.
412n/a */
413n/a PyErr_Mac(MacOS_Error, fnfErr);
414n/a return NULL;
415n/a
416n/a }
417n/a finfo = (FileInfo*)&(cataloginfo.finderInfo);
418n/a finfo->fileCreator = creator;
419n/a finfo->fileType = type;
420n/a
421n/a err = FSSetCatalogInfo(&ref, kFSCatInfoFinderInfo, &cataloginfo);
422n/a if (err != noErr) {
423n/a PyErr_Mac(MacOS_Error, fnfErr);
424n/a return NULL;
425n/a }
426n/a
427n/a Py_INCREF(Py_None);
428n/a return Py_None;
429n/a}
430n/a
431n/a
432n/astatic char geterr_doc[] = "Convert OSErr number to string";
433n/a
434n/astatic PyObject *
435n/aMacOS_GetErrorString(PyObject *self, PyObject *args)
436n/a{
437n/a int err;
438n/a char buf[256];
439n/a Handle h;
440n/a char *str;
441n/a static int errors_loaded;
442n/a
443n/a if (!PyArg_ParseTuple(args, "i", &err))
444n/a return NULL;
445n/a
446n/a h = GetResource('Estr', err);
447n/a if (!h && !errors_loaded) {
448n/a /*
449n/a ** Attempt to open the resource file containing the
450n/a ** Estr resources. We ignore all errors. We also try
451n/a ** this only once.
452n/a */
453n/a PyObject *m, *rv;
454n/a errors_loaded = 1;
455n/a
456n/a m = PyImport_ImportModuleNoBlock("macresource");
457n/a if (!m) {
458n/a if (Py_VerboseFlag)
459n/a PyErr_Print();
460n/a PyErr_Clear();
461n/a }
462n/a else {
463n/a rv = PyObject_CallMethod(m, "open_error_resource", "");
464n/a if (!rv) {
465n/a if (Py_VerboseFlag)
466n/a PyErr_Print();
467n/a PyErr_Clear();
468n/a }
469n/a else {
470n/a Py_DECREF(rv);
471n/a /* And try again... */
472n/a h = GetResource('Estr', err);
473n/a }
474n/a Py_DECREF(m);
475n/a }
476n/a }
477n/a /*
478n/a ** Whether the code above succeeded or not, we won't try
479n/a ** again.
480n/a */
481n/a errors_loaded = 1;
482n/a
483n/a if (h) {
484n/a HLock(h);
485n/a str = (char *)*h;
486n/a memcpy(buf, str+1, (unsigned char)str[0]);
487n/a buf[(unsigned char)str[0]] = '\0';
488n/a HUnlock(h);
489n/a ReleaseResource(h);
490n/a }
491n/a else {
492n/a PyOS_snprintf(buf, sizeof(buf), "Mac OS error code %d", err);
493n/a }
494n/a
495n/a return Py_BuildValue("s", buf);
496n/a}
497n/a
498n/a
499n/a#ifndef __LP64__
500n/a
501n/astatic char splash_doc[] = "Open a splash-screen dialog by resource-id (0=close)";
502n/a
503n/astatic PyObject *
504n/aMacOS_splash(PyObject *self, PyObject *args)
505n/a{
506n/a int resid = -1;
507n/a static DialogPtr curdialog = NULL;
508n/a DialogPtr olddialog;
509n/a WindowRef theWindow;
510n/a CGrafPtr thePort;
511n/a#if 0
512n/a short xpos, ypos, width, height, swidth, sheight;
513n/a#endif
514n/a
515n/a if (!PyArg_ParseTuple(args, "|i", &resid))
516n/a return NULL;
517n/a olddialog = curdialog;
518n/a curdialog = NULL;
519n/a
520n/a if ( resid != -1 ) {
521n/a curdialog = GetNewDialog(resid, NULL, (WindowPtr)-1);
522n/a if ( curdialog ) {
523n/a theWindow = GetDialogWindow(curdialog);
524n/a thePort = GetWindowPort(theWindow);
525n/a#if 0
526n/a width = thePort->portRect.right - thePort->portRect.left;
527n/a height = thePort->portRect.bottom - thePort->portRect.top;
528n/a swidth = qd.screenBits.bounds.right - qd.screenBits.bounds.left;
529n/a sheight = qd.screenBits.bounds.bottom - qd.screenBits.bounds.top - LMGetMBarHeight();
530n/a xpos = (swidth-width)/2;
531n/a ypos = (sheight-height)/5 + LMGetMBarHeight();
532n/a MoveWindow(theWindow, xpos, ypos, 0);
533n/a ShowWindow(theWindow);
534n/a#endif
535n/a DrawDialog(curdialog);
536n/a }
537n/a }
538n/a if (olddialog)
539n/a DisposeDialog(olddialog);
540n/a Py_INCREF(Py_None);
541n/a return Py_None;
542n/a}
543n/a
544n/astatic char DebugStr_doc[] = "Switch to low-level debugger with a message";
545n/a
546n/astatic PyObject *
547n/aMacOS_DebugStr(PyObject *self, PyObject *args)
548n/a{
549n/a Str255 message;
550n/a PyObject *object = 0;
551n/a
552n/a if (!PyArg_ParseTuple(args, "O&|O", PyMac_GetStr255, message, &object))
553n/a return NULL;
554n/a
555n/a DebugStr(message);
556n/a Py_INCREF(Py_None);
557n/a return Py_None;
558n/a}
559n/a
560n/a
561n/astatic char SysBeep_doc[] = "BEEEEEP!!!";
562n/a
563n/astatic PyObject *
564n/aMacOS_SysBeep(PyObject *self, PyObject *args)
565n/a{
566n/a int duration = 6;
567n/a
568n/a if (!PyArg_ParseTuple(args, "|i", &duration))
569n/a return NULL;
570n/a SysBeep(duration);
571n/a Py_INCREF(Py_None);
572n/a return Py_None;
573n/a}
574n/a
575n/a#endif /* __LP64__ */
576n/a
577n/astatic char WMAvailable_doc[] =
578n/a "True if this process can interact with the display."
579n/a "Will foreground the application on the first call as a side-effect."
580n/a ;
581n/a
582n/astatic PyObject *
583n/aMacOS_WMAvailable(PyObject *self, PyObject *args)
584n/a{
585n/a static PyObject *rv = NULL;
586n/a
587n/a if (!PyArg_ParseTuple(args, ""))
588n/a return NULL;
589n/a if (!rv) {
590n/a ProcessSerialNumber psn;
591n/a
592n/a /*
593n/a ** This is a fairly innocuous call to make if we don't have a window
594n/a ** manager, or if we have no permission to talk to it. It will print
595n/a ** a message on stderr, but at least it won't abort the process.
596n/a ** It appears the function caches the result itself, and it's cheap, so
597n/a ** no need for us to cache.
598n/a */
599n/a#ifdef kCGNullDirectDisplay
600n/a /* On 10.1 CGMainDisplayID() isn't available, and
601n/a ** kCGNullDirectDisplay isn't defined.
602n/a */
603n/a if (CGMainDisplayID() == 0) {
604n/a rv = Py_False;
605n/a } else {
606n/a#else
607n/a {
608n/a#endif
609n/a if (GetCurrentProcess(&psn) < 0 ||
610n/a SetFrontProcess(&psn) < 0) {
611n/a rv = Py_False;
612n/a } else {
613n/a rv = Py_True;
614n/a }
615n/a }
616n/a }
617n/a Py_INCREF(rv);
618n/a return rv;
619n/a}
620n/a
621n/astatic char GetTicks_doc[] = "Return number of ticks since bootup";
622n/a
623n/astatic PyObject *
624n/aMacOS_GetTicks(PyObject *self, PyObject *args)
625n/a{
626n/a return Py_BuildValue("i", (int)TickCount());
627n/a}
628n/a
629n/astatic char openrf_doc[] = "Open resource fork of a file";
630n/a
631n/astatic PyObject *
632n/aMacOS_openrf(PyObject *self, PyObject *args)
633n/a{
634n/a OSErr err;
635n/a char *mode = "r";
636n/a FSRef ref;
637n/a SInt8 permission = fsRdPerm;
638n/a rfobject *fp;
639n/a HFSUniStr255 name;
640n/a
641n/a if (!PyArg_ParseTuple(args, "O&|s", PyMac_GetFSRef, &ref, &mode))
642n/a return NULL;
643n/a while (*mode) {
644n/a switch (*mode++) {
645n/a case '*': break;
646n/a case 'r': permission = fsRdPerm; break;
647n/a case 'w': permission = fsWrPerm; break;
648n/a case 'b': break;
649n/a default:
650n/a PyErr_BadArgument();
651n/a return NULL;
652n/a }
653n/a }
654n/a
655n/a err = FSGetResourceForkName(&name);
656n/a if (err != noErr) {
657n/a PyMac_Error(err);
658n/a return NULL;
659n/a }
660n/a
661n/a if ( (fp = newrfobject()) == NULL )
662n/a return NULL;
663n/a
664n/a
665n/a err = FSOpenFork(&ref, name.length, name.unicode, permission, &fp->fRefNum);
666n/a if (err != noErr) {
667n/a Py_DECREF(fp);
668n/a PyMac_Error(err);
669n/a return NULL;
670n/a }
671n/a fp->isclosed = 0;
672n/a return (PyObject *)fp;
673n/a}
674n/a
675n/a
676n/a
677n/astatic PyMethodDef MacOS_Methods[] = {
678n/a {"GetCreatorAndType", MacOS_GetCreatorAndType, 1, getcrtp_doc},
679n/a {"SetCreatorAndType", MacOS_SetCreatorAndType, 1, setcrtp_doc},
680n/a {"GetErrorString", MacOS_GetErrorString, 1, geterr_doc},
681n/a {"openrf", MacOS_openrf, 1, openrf_doc},
682n/a#ifndef __LP64__
683n/a {"splash", MacOS_splash, 1, splash_doc},
684n/a {"DebugStr", MacOS_DebugStr, 1, DebugStr_doc},
685n/a {"SysBeep", MacOS_SysBeep, 1, SysBeep_doc},
686n/a#endif /* __LP64__ */
687n/a {"GetTicks", MacOS_GetTicks, 1, GetTicks_doc},
688n/a {"WMAvailable", MacOS_WMAvailable, 1, WMAvailable_doc},
689n/a {NULL, NULL} /* Sentinel */
690n/a};
691n/a
692n/a
693n/avoid
694n/ainitMacOS(void)
695n/a{
696n/a PyObject *m, *d;
697n/a
698n/a if (PyErr_WarnPy3k("In 3.x, the MacOS module is removed.", 1))
699n/a return;
700n/a
701n/a m = Py_InitModule("MacOS", MacOS_Methods);
702n/a d = PyModule_GetDict(m);
703n/a
704n/a /* Initialize MacOS.Error exception */
705n/a MacOS_Error = PyMac_GetOSErrException();
706n/a if (MacOS_Error == NULL || PyDict_SetItemString(d, "Error", MacOS_Error) != 0)
707n/a return;
708n/a Rftype.ob_type = &PyType_Type;
709n/a Py_INCREF(&Rftype);
710n/a if (PyDict_SetItemString(d, "ResourceForkType", (PyObject *)&Rftype) != 0)
711n/a return;
712n/a /*
713n/a ** This is a hack: the following constant added to the id() of a string
714n/a ** object gives you the address of the data. Unfortunately, it is needed for
715n/a ** some of the image and sound processing interfaces on the mac:-(
716n/a */
717n/a {
718n/a PyStringObject *p = 0;
719n/a long off = (long)&(p->ob_sval[0]);
720n/a
721n/a if( PyDict_SetItemString(d, "string_id_to_buffer", Py_BuildValue("i", off)) != 0)
722n/a return;
723n/a }
724n/a#define PY_RUNTIMEMODEL "macho"
725n/a if (PyDict_SetItemString(d, "runtimemodel",
726n/a Py_BuildValue("s", PY_RUNTIMEMODEL)) != 0)
727n/a return;
728n/a#if defined(WITH_NEXT_FRAMEWORK)
729n/a#define PY_LINKMODEL "framework"
730n/a#elif defined(Py_ENABLE_SHARED)
731n/a#define PY_LINKMODEL "shared"
732n/a#else
733n/a#define PY_LINKMODEL "static"
734n/a#endif
735n/a if (PyDict_SetItemString(d, "linkmodel",
736n/a Py_BuildValue("s", PY_LINKMODEL)) != 0)
737n/a return;
738n/a
739n/a}