Avoid signed overflow in some xrange calculations, and extend
[python.git] / Mac / Modules / icgluemodule.c
blobd995f1619adfa25b59d327b5393eb0bdfd82c5b6
1 /***********************************************************
2 Copyright 1991-1997 by Stichting Mathematisch Centrum, Amsterdam,
3 The Netherlands.
5 All Rights Reserved
7 Permission to use, copy, modify, and distribute this software and its
8 documentation for any purpose and without fee is hereby granted,
9 provided that the above copyright notice appear in all copies and that
10 both that copyright notice and this permission notice appear in
11 supporting documentation, and that the names of Stichting Mathematisch
12 Centrum or CWI or Corporation for National Research Initiatives or
13 CNRI not be used in advertising or publicity pertaining to
14 distribution of the software without specific, written prior
15 permission.
17 While CWI is the initial source for this software, a modified version
18 is made available by the Corporation for National Research Initiatives
19 (CNRI) at the Internet address ftp://ftp.python.org.
21 STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22 REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23 MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24 CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25 DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26 PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27 TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28 PERFORMANCE OF THIS SOFTWARE.
30 ******************************************************************/
32 #include "Python.h"
33 #include "pymactoolbox.h"
35 extern int ResObj_Convert(PyObject *, Handle *); /* From Resmodule.c */
37 #include <Carbon/Carbon.h>
39 static PyObject *ErrorObject;
41 /* ----------------------------------------------------- */
43 /* Declarations for objects of type ic_instance */
45 typedef struct {
46 PyObject_HEAD
47 ICInstance inst;
48 } iciobject;
50 static PyTypeObject Icitype;
54 /* ---------------------------------------------------------------- */
57 static char ici_ICGetSeed__doc__[] =
58 "()->int; Returns int that changes when configuration does"
61 static PyObject *
62 ici_ICGetSeed(iciobject *self, PyObject *args)
64 OSStatus err;
65 long seed;
67 if (!PyArg_ParseTuple(args, ""))
68 return NULL;
69 if ((err=ICGetSeed(self->inst, &seed)) != 0 )
70 return PyMac_Error(err);
71 return Py_BuildValue("i", (int)seed);
75 static char ici_ICBegin__doc__[] =
76 "(perm)->None; Lock config file for read/write"
79 static PyObject *
80 ici_ICBegin(iciobject *self, PyObject *args)
82 OSStatus err;
83 int perm;
85 if (!PyArg_ParseTuple(args, "i", &perm))
86 return NULL;
87 if ((err=ICBegin(self->inst, (ICPerm)perm)) != 0 )
88 return PyMac_Error(err);
89 Py_INCREF(Py_None);
90 return Py_None;
94 static char ici_ICFindPrefHandle__doc__[] =
95 "(key, handle)->attrs; Lookup key, store result in handle, return attributes"
98 static PyObject *
99 ici_ICFindPrefHandle(iciobject *self, PyObject *args)
101 OSStatus err;
102 Str255 key;
103 ICAttr attr;
104 Handle h;
106 if (!PyArg_ParseTuple(args, "O&O&", PyMac_GetStr255, &key, ResObj_Convert, &h))
107 return NULL;
108 if ((err=ICFindPrefHandle(self->inst, key, &attr, h)) != 0 )
109 return PyMac_Error(err);
110 return Py_BuildValue("i", (int)attr);
114 static char ici_ICSetPref__doc__[] =
115 "(key, attr, data)->None; Set preference key to data with attributes"
118 static PyObject *
119 ici_ICSetPref(iciobject *self, PyObject *args)
121 OSStatus err;
122 Str255 key;
123 int attr;
124 char *data;
125 int datalen;
127 if (!PyArg_ParseTuple(args, "O&is#", PyMac_GetStr255, &key, &attr,
128 &data, &datalen))
129 return NULL;
130 if ((err=ICSetPref(self->inst, key, (ICAttr)attr, (Ptr)data,
131 (long)datalen)) != 0)
132 return PyMac_Error(err);
133 Py_INCREF(Py_None);
134 return Py_None;
138 static char ici_ICCountPref__doc__[] =
139 "()->int; Return number of preferences"
142 static PyObject *
143 ici_ICCountPref(iciobject *self, PyObject *args)
145 OSStatus err;
146 long count;
148 if (!PyArg_ParseTuple(args, ""))
149 return NULL;
150 if ((err=ICCountPref(self->inst, &count)) != 0 )
151 return PyMac_Error(err);
152 return Py_BuildValue("i", (int)count);
156 static char ici_ICGetIndPref__doc__[] =
157 "(num)->key; Return key of preference with given index"
160 static PyObject *
161 ici_ICGetIndPref(iciobject *self, PyObject *args)
163 OSStatus err;
164 long num;
165 Str255 key;
167 if (!PyArg_ParseTuple(args, "l", &num))
168 return NULL;
169 if ((err=ICGetIndPref(self->inst, num, key)) != 0 )
170 return PyMac_Error(err);
171 return Py_BuildValue("O&", PyMac_BuildStr255, key);
175 static char ici_ICDeletePref__doc__[] =
176 "(key)->None; Delete preference"
179 static PyObject *
180 ici_ICDeletePref(iciobject *self, PyObject *args)
182 OSStatus err;
183 Str255 key;
185 if (!PyArg_ParseTuple(args, "O&", PyMac_GetStr255, key))
186 return NULL;
187 if ((err=ICDeletePref(self->inst, key)) != 0 )
188 return PyMac_Error(err);
189 Py_INCREF(Py_None);
190 return Py_None;
194 static char ici_ICEnd__doc__[] =
195 "()->None; Unlock file after ICBegin call"
198 static PyObject *
199 ici_ICEnd(iciobject *self, PyObject *args)
201 OSStatus err;
203 if (!PyArg_ParseTuple(args, ""))
204 return NULL;
205 if ((err=ICEnd(self->inst)) != 0 )
206 return PyMac_Error(err);
207 Py_INCREF(Py_None);
208 return Py_None;
212 static char ici_ICEditPreferences__doc__[] =
213 "(key)->None; Ask user to edit preferences, staring with key"
216 static PyObject *
217 ici_ICEditPreferences(iciobject *self, PyObject *args)
219 OSStatus err;
220 Str255 key;
222 if (!PyArg_ParseTuple(args, "O&", PyMac_GetStr255, key))
223 return NULL;
224 if ((err=ICEditPreferences(self->inst, key)) != 0 )
225 return PyMac_Error(err);
226 Py_INCREF(Py_None);
227 return Py_None;
231 static char ici_ICParseURL__doc__[] =
232 "(hint, data, selStart, selEnd, handle)->selStart, selEnd; Find an URL, return in handle"
235 static PyObject *
236 ici_ICParseURL(iciobject *self, PyObject *args)
238 OSStatus err;
239 Str255 hint;
240 char *data;
241 int datalen;
242 long selStart, selEnd;
243 Handle h;
245 if (!PyArg_ParseTuple(args, "O&s#llO&", PyMac_GetStr255, hint, &data, &datalen,
246 &selStart, &selEnd, ResObj_Convert, &h))
247 return NULL;
248 if ((err=ICParseURL(self->inst, hint, (Ptr)data, (long)datalen,
249 &selStart, &selEnd, h)) != 0 )
250 return PyMac_Error(err);
251 return Py_BuildValue("ii", (int)selStart, (int)selEnd);
255 static char ici_ICLaunchURL__doc__[] =
256 "(hint, data, selStart, selEnd)->None; Find an URL and launch the correct app"
259 static PyObject *
260 ici_ICLaunchURL(iciobject *self, PyObject *args)
262 OSStatus err;
263 Str255 hint;
264 char *data;
265 int datalen;
266 long selStart, selEnd;
268 if (!PyArg_ParseTuple(args, "O&s#ll", PyMac_GetStr255, hint, &data, &datalen,
269 &selStart, &selEnd))
270 return NULL;
271 if ((err=ICLaunchURL(self->inst, hint, (Ptr)data, (long)datalen,
272 &selStart, &selEnd)) != 0 )
273 return PyMac_Error(err);
274 return Py_BuildValue("ii", (int)selStart, (int)selEnd);
278 static char ici_ICMapFilename__doc__[] =
279 "(filename)->mapinfo; Get filemap info for given filename"
282 static PyObject *
283 ici_ICMapFilename(iciobject *self, PyObject *args)
285 OSStatus err;
286 Str255 filename;
287 ICMapEntry entry;
289 if (!PyArg_ParseTuple(args, "O&", PyMac_GetStr255, filename))
290 return NULL;
291 if ((err=ICMapFilename(self->inst, filename, &entry)) != 0 )
292 return PyMac_Error(err);
293 return Py_BuildValue("hO&O&O&lO&O&O&O&O&", entry.version,
294 PyMac_BuildOSType, entry.fileType,
295 PyMac_BuildOSType, entry.fileCreator,
296 PyMac_BuildOSType, entry.postCreator,
297 entry.flags,
298 PyMac_BuildStr255, entry.extension,
299 PyMac_BuildStr255, entry.creatorAppName,
300 PyMac_BuildStr255, entry.postAppName,
301 PyMac_BuildStr255, entry.MIMEType,
302 PyMac_BuildStr255, entry.entryName);
306 static char ici_ICMapTypeCreator__doc__[] =
307 "(type, creator, filename)->mapinfo; Get filemap info for given tp/cr/filename"
310 static PyObject *
311 ici_ICMapTypeCreator(iciobject *self, PyObject *args)
313 OSStatus err;
314 OSType type, creator;
315 Str255 filename;
316 ICMapEntry entry;
318 if (!PyArg_ParseTuple(args, "O&O&O&",
319 PyMac_GetOSType, &type,
320 PyMac_GetOSType, &creator,
321 PyMac_GetStr255, filename))
322 return NULL;
323 if ((err=ICMapTypeCreator(self->inst, type, creator, filename, &entry)) != 0 )
324 return PyMac_Error(err);
325 return Py_BuildValue("hO&O&O&lO&O&O&O&O&", entry.version,
326 PyMac_BuildOSType, entry.fileType,
327 PyMac_BuildOSType, entry.fileCreator,
328 PyMac_BuildOSType, entry.postCreator,
329 entry.flags,
330 PyMac_BuildStr255, entry.extension,
331 PyMac_BuildStr255, entry.creatorAppName,
332 PyMac_BuildStr255, entry.postAppName,
333 PyMac_BuildStr255, entry.MIMEType,
334 PyMac_BuildStr255, entry.entryName);
338 static struct PyMethodDef ici_methods[] = {
339 {"ICGetSeed", (PyCFunction)ici_ICGetSeed, METH_VARARGS, ici_ICGetSeed__doc__},
340 {"ICBegin", (PyCFunction)ici_ICBegin, METH_VARARGS, ici_ICBegin__doc__},
341 {"ICFindPrefHandle", (PyCFunction)ici_ICFindPrefHandle, METH_VARARGS, ici_ICFindPrefHandle__doc__},
342 {"ICSetPref", (PyCFunction)ici_ICSetPref, METH_VARARGS, ici_ICSetPref__doc__},
343 {"ICCountPref", (PyCFunction)ici_ICCountPref, METH_VARARGS, ici_ICCountPref__doc__},
344 {"ICGetIndPref", (PyCFunction)ici_ICGetIndPref, METH_VARARGS, ici_ICGetIndPref__doc__},
345 {"ICDeletePref", (PyCFunction)ici_ICDeletePref, METH_VARARGS, ici_ICDeletePref__doc__},
346 {"ICEnd", (PyCFunction)ici_ICEnd, METH_VARARGS, ici_ICEnd__doc__},
347 {"ICEditPreferences", (PyCFunction)ici_ICEditPreferences, METH_VARARGS, ici_ICEditPreferences__doc__},
348 {"ICParseURL", (PyCFunction)ici_ICParseURL, METH_VARARGS, ici_ICParseURL__doc__},
349 {"ICLaunchURL", (PyCFunction)ici_ICLaunchURL, METH_VARARGS, ici_ICLaunchURL__doc__},
350 {"ICMapFilename", (PyCFunction)ici_ICMapFilename, METH_VARARGS, ici_ICMapFilename__doc__},
351 {"ICMapTypeCreator", (PyCFunction)ici_ICMapTypeCreator, METH_VARARGS, ici_ICMapTypeCreator__doc__},
353 {NULL, NULL} /* sentinel */
356 /* ---------- */
359 static iciobject *
360 newiciobject(OSType creator)
362 iciobject *self;
363 OSStatus err;
365 self = PyObject_NEW(iciobject, &Icitype);
366 if (self == NULL)
367 return NULL;
368 if ((err=ICStart(&self->inst, creator)) != 0 ) {
369 (void)PyMac_Error(err);
370 PyObject_DEL(self);
371 return NULL;
373 return self;
377 static void
378 ici_dealloc(iciobject *self)
380 (void)ICStop(self->inst);
381 PyObject_DEL(self);
384 static PyObject *
385 ici_getattr(iciobject *self, char *name)
387 return Py_FindMethod(ici_methods, (PyObject *)self, name);
390 static char Icitype__doc__[] =
391 "Internet Config instance"
394 static PyTypeObject Icitype = {
395 PyObject_HEAD_INIT(&PyType_Type)
396 0, /*ob_size*/
397 "icglue.ic_instance", /*tp_name*/
398 sizeof(iciobject), /*tp_basicsize*/
399 0, /*tp_itemsize*/
400 /* methods */
401 (destructor)ici_dealloc, /*tp_dealloc*/
402 (printfunc)0, /*tp_print*/
403 (getattrfunc)ici_getattr, /*tp_getattr*/
404 (setattrfunc)0, /*tp_setattr*/
405 (cmpfunc)0, /*tp_compare*/
406 (reprfunc)0, /*tp_repr*/
407 0, /*tp_as_number*/
408 0, /*tp_as_sequence*/
409 0, /*tp_as_mapping*/
410 (hashfunc)0, /*tp_hash*/
411 (ternaryfunc)0, /*tp_call*/
412 (reprfunc)0, /*tp_str*/
414 /* Space for future expansion */
415 0L,0L,0L,0L,
416 Icitype__doc__ /* Documentation string */
419 /* End of code for ic_instance objects */
420 /* -------------------------------------------------------- */
423 static char ic_ICStart__doc__[] =
424 "(OSType)->ic_instance; Create an Internet Config instance"
427 static PyObject *
428 ic_ICStart(PyObject *self, PyObject *args)
430 OSType creator;
432 if (!PyArg_ParseTuple(args, "O&", PyMac_GetOSType, &creator))
433 return NULL;
434 return (PyObject *)newiciobject(creator);
437 /* List of methods defined in the module */
439 static struct PyMethodDef ic_methods[] = {
440 {"ICStart", (PyCFunction)ic_ICStart, METH_VARARGS, ic_ICStart__doc__},
442 {NULL, (PyCFunction)NULL, 0, NULL} /* sentinel */
446 /* Initialization function for the module (*must* be called initicglue) */
448 static char icglue_module_documentation[] =
449 "Implements low-level Internet Config interface"
452 void
453 initicglue(void)
455 PyObject *m, *d;
457 if (PyErr_WarnPy3k("In 3.x, icglue is removed.", 1))
458 return;
460 /* Create the module and add the functions */
461 m = Py_InitModule4("icglue", ic_methods,
462 icglue_module_documentation,
463 (PyObject*)NULL,PYTHON_API_VERSION);
465 /* Add some symbolic constants to the module */
466 d = PyModule_GetDict(m);
467 ErrorObject = PyMac_GetOSErrException();
468 if (ErrorObject == NULL ||
469 PyDict_SetItemString(d, "error", ErrorObject) != 0)
470 return;
472 /* XXXX Add constants here */
474 /* Check for errors */
475 if (PyErr_Occurred())
476 Py_FatalError("can't initialize module icglue");