|
1 /*********************************************************** |
|
2 Copyright 1991-1997 by Stichting Mathematisch Centrum, Amsterdam, |
|
3 The Netherlands. |
|
4 |
|
5 All Rights Reserved |
|
6 |
|
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. |
|
16 |
|
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. |
|
20 |
|
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. |
|
29 |
|
30 ******************************************************************/ |
|
31 |
|
32 #include "Python.h" |
|
33 #include "pymactoolbox.h" |
|
34 |
|
35 extern int ResObj_Convert(PyObject *, Handle *); /* From Resmodule.c */ |
|
36 |
|
37 #include <Carbon/Carbon.h> |
|
38 |
|
39 static PyObject *ErrorObject; |
|
40 |
|
41 /* ----------------------------------------------------- */ |
|
42 |
|
43 /* Declarations for objects of type ic_instance */ |
|
44 |
|
45 typedef struct { |
|
46 PyObject_HEAD |
|
47 ICInstance inst; |
|
48 } iciobject; |
|
49 |
|
50 static PyTypeObject Icitype; |
|
51 |
|
52 |
|
53 |
|
54 /* ---------------------------------------------------------------- */ |
|
55 |
|
56 |
|
57 static char ici_ICGetSeed__doc__[] = |
|
58 "()->int; Returns int that changes when configuration does" |
|
59 ; |
|
60 |
|
61 static PyObject * |
|
62 ici_ICGetSeed(iciobject *self, PyObject *args) |
|
63 { |
|
64 OSStatus err; |
|
65 long seed; |
|
66 |
|
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); |
|
72 } |
|
73 |
|
74 |
|
75 static char ici_ICBegin__doc__[] = |
|
76 "(perm)->None; Lock config file for read/write" |
|
77 ; |
|
78 |
|
79 static PyObject * |
|
80 ici_ICBegin(iciobject *self, PyObject *args) |
|
81 { |
|
82 OSStatus err; |
|
83 int perm; |
|
84 |
|
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; |
|
91 } |
|
92 |
|
93 |
|
94 static char ici_ICFindPrefHandle__doc__[] = |
|
95 "(key, handle)->attrs; Lookup key, store result in handle, return attributes" |
|
96 ; |
|
97 |
|
98 static PyObject * |
|
99 ici_ICFindPrefHandle(iciobject *self, PyObject *args) |
|
100 { |
|
101 OSStatus err; |
|
102 Str255 key; |
|
103 ICAttr attr; |
|
104 Handle h; |
|
105 |
|
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); |
|
111 } |
|
112 |
|
113 |
|
114 static char ici_ICSetPref__doc__[] = |
|
115 "(key, attr, data)->None; Set preference key to data with attributes" |
|
116 ; |
|
117 |
|
118 static PyObject * |
|
119 ici_ICSetPref(iciobject *self, PyObject *args) |
|
120 { |
|
121 OSStatus err; |
|
122 Str255 key; |
|
123 int attr; |
|
124 char *data; |
|
125 int datalen; |
|
126 |
|
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; |
|
135 } |
|
136 |
|
137 |
|
138 static char ici_ICCountPref__doc__[] = |
|
139 "()->int; Return number of preferences" |
|
140 ; |
|
141 |
|
142 static PyObject * |
|
143 ici_ICCountPref(iciobject *self, PyObject *args) |
|
144 { |
|
145 OSStatus err; |
|
146 long count; |
|
147 |
|
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); |
|
153 } |
|
154 |
|
155 |
|
156 static char ici_ICGetIndPref__doc__[] = |
|
157 "(num)->key; Return key of preference with given index" |
|
158 ; |
|
159 |
|
160 static PyObject * |
|
161 ici_ICGetIndPref(iciobject *self, PyObject *args) |
|
162 { |
|
163 OSStatus err; |
|
164 long num; |
|
165 Str255 key; |
|
166 |
|
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); |
|
172 } |
|
173 |
|
174 |
|
175 static char ici_ICDeletePref__doc__[] = |
|
176 "(key)->None; Delete preference" |
|
177 ; |
|
178 |
|
179 static PyObject * |
|
180 ici_ICDeletePref(iciobject *self, PyObject *args) |
|
181 { |
|
182 OSStatus err; |
|
183 Str255 key; |
|
184 |
|
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; |
|
191 } |
|
192 |
|
193 |
|
194 static char ici_ICEnd__doc__[] = |
|
195 "()->None; Unlock file after ICBegin call" |
|
196 ; |
|
197 |
|
198 static PyObject * |
|
199 ici_ICEnd(iciobject *self, PyObject *args) |
|
200 { |
|
201 OSStatus err; |
|
202 |
|
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; |
|
209 } |
|
210 |
|
211 |
|
212 static char ici_ICEditPreferences__doc__[] = |
|
213 "(key)->None; Ask user to edit preferences, staring with key" |
|
214 ; |
|
215 |
|
216 static PyObject * |
|
217 ici_ICEditPreferences(iciobject *self, PyObject *args) |
|
218 { |
|
219 OSStatus err; |
|
220 Str255 key; |
|
221 |
|
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; |
|
228 } |
|
229 |
|
230 |
|
231 static char ici_ICParseURL__doc__[] = |
|
232 "(hint, data, selStart, selEnd, handle)->selStart, selEnd; Find an URL, return in handle" |
|
233 ; |
|
234 |
|
235 static PyObject * |
|
236 ici_ICParseURL(iciobject *self, PyObject *args) |
|
237 { |
|
238 OSStatus err; |
|
239 Str255 hint; |
|
240 char *data; |
|
241 int datalen; |
|
242 long selStart, selEnd; |
|
243 Handle h; |
|
244 |
|
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); |
|
252 } |
|
253 |
|
254 |
|
255 static char ici_ICLaunchURL__doc__[] = |
|
256 "(hint, data, selStart, selEnd)->None; Find an URL and launch the correct app" |
|
257 ; |
|
258 |
|
259 static PyObject * |
|
260 ici_ICLaunchURL(iciobject *self, PyObject *args) |
|
261 { |
|
262 OSStatus err; |
|
263 Str255 hint; |
|
264 char *data; |
|
265 int datalen; |
|
266 long selStart, selEnd; |
|
267 |
|
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); |
|
275 } |
|
276 |
|
277 |
|
278 static char ici_ICMapFilename__doc__[] = |
|
279 "(filename)->mapinfo; Get filemap info for given filename" |
|
280 ; |
|
281 |
|
282 static PyObject * |
|
283 ici_ICMapFilename(iciobject *self, PyObject *args) |
|
284 { |
|
285 OSStatus err; |
|
286 Str255 filename; |
|
287 ICMapEntry entry; |
|
288 |
|
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); |
|
303 } |
|
304 |
|
305 |
|
306 static char ici_ICMapTypeCreator__doc__[] = |
|
307 "(type, creator, filename)->mapinfo; Get filemap info for given tp/cr/filename" |
|
308 ; |
|
309 |
|
310 static PyObject * |
|
311 ici_ICMapTypeCreator(iciobject *self, PyObject *args) |
|
312 { |
|
313 OSStatus err; |
|
314 OSType type, creator; |
|
315 Str255 filename; |
|
316 ICMapEntry entry; |
|
317 |
|
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); |
|
335 } |
|
336 |
|
337 |
|
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__}, |
|
352 |
|
353 {NULL, NULL} /* sentinel */ |
|
354 }; |
|
355 |
|
356 /* ---------- */ |
|
357 |
|
358 |
|
359 static iciobject * |
|
360 newiciobject(OSType creator) |
|
361 { |
|
362 iciobject *self; |
|
363 OSStatus err; |
|
364 |
|
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; |
|
372 } |
|
373 return self; |
|
374 } |
|
375 |
|
376 |
|
377 static void |
|
378 ici_dealloc(iciobject *self) |
|
379 { |
|
380 (void)ICStop(self->inst); |
|
381 PyObject_DEL(self); |
|
382 } |
|
383 |
|
384 static PyObject * |
|
385 ici_getattr(iciobject *self, char *name) |
|
386 { |
|
387 return Py_FindMethod(ici_methods, (PyObject *)self, name); |
|
388 } |
|
389 |
|
390 static char Icitype__doc__[] = |
|
391 "Internet Config instance" |
|
392 ; |
|
393 |
|
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*/ |
|
413 |
|
414 /* Space for future expansion */ |
|
415 0L,0L,0L,0L, |
|
416 Icitype__doc__ /* Documentation string */ |
|
417 }; |
|
418 |
|
419 /* End of code for ic_instance objects */ |
|
420 /* -------------------------------------------------------- */ |
|
421 |
|
422 |
|
423 static char ic_ICStart__doc__[] = |
|
424 "(OSType)->ic_instance; Create an Internet Config instance" |
|
425 ; |
|
426 |
|
427 static PyObject * |
|
428 ic_ICStart(PyObject *self, PyObject *args) |
|
429 { |
|
430 OSType creator; |
|
431 |
|
432 if (!PyArg_ParseTuple(args, "O&", PyMac_GetOSType, &creator)) |
|
433 return NULL; |
|
434 return (PyObject *)newiciobject(creator); |
|
435 } |
|
436 |
|
437 /* List of methods defined in the module */ |
|
438 |
|
439 static struct PyMethodDef ic_methods[] = { |
|
440 {"ICStart", (PyCFunction)ic_ICStart, METH_VARARGS, ic_ICStart__doc__}, |
|
441 |
|
442 {NULL, (PyCFunction)NULL, 0, NULL} /* sentinel */ |
|
443 }; |
|
444 |
|
445 |
|
446 /* Initialization function for the module (*must* be called initicglue) */ |
|
447 |
|
448 static char icglue_module_documentation[] = |
|
449 "Implements low-level Internet Config interface" |
|
450 ; |
|
451 |
|
452 void |
|
453 initicglue(void) |
|
454 { |
|
455 PyObject *m, *d; |
|
456 |
|
457 if (PyErr_WarnPy3k("In 3.x, icglue is removed.", 1)) |
|
458 return; |
|
459 |
|
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); |
|
464 |
|
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; |
|
471 |
|
472 /* XXXX Add constants here */ |
|
473 |
|
474 /* Check for errors */ |
|
475 if (PyErr_Occurred()) |
|
476 Py_FatalError("can't initialize module icglue"); |
|
477 } |
|
478 |