annotate Modules/_scproxy.c @ 67467:abe201dfd3dc 3.1

Merged revisions 87861,87863 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r87861 | antoine.pitrou | 2011-01-08 11:23:29 +0100 (sam., 08 janv. 2011) | 3 lines Fix test_ssl after r87849 ........ r87863 | antoine.pitrou | 2011-01-08 11:28:11 +0100 (sam., 08 janv. 2011) | 3 lines Add EHOSTUNREACH ('No route to host') to the errnos trapped by transient_internet(). ........
author Antoine Pitrou <solipsis@pitrou.net>
date Sat, 08 Jan 2011 10:31:09 +0000
parents 9da13e560a3a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
1 /*
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
2 * Helper method for urllib to fetch the proxy configuration settings
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
3 * using the SystemConfiguration framework.
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
4 */
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
5 #include <Python.h>
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
6 #include <SystemConfiguration/SystemConfiguration.h>
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
7
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
8 static int32_t
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
9 cfnum_to_int32(CFNumberRef num)
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
10 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
11 int32_t result;
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
12
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
13 CFNumberGetValue(num, kCFNumberSInt32Type, &result);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
14 return result;
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
15 }
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
16
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
17 static PyObject*
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
18 cfstring_to_pystring(CFStringRef ref)
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
19 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
20 const char* s;
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
21
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
22 s = CFStringGetCStringPtr(ref, kCFStringEncodingUTF8);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
23 if (s) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
24 return PyUnicode_DecodeUTF8(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
25 s, strlen(s), NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
26
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
27 } else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
28 CFIndex len = CFStringGetLength(ref);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
29 Boolean ok;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
30 PyObject* result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
31 char* buf;
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
32
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
33 buf = PyMem_Malloc(len*4);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
34 if (buf == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
35 PyErr_NoMemory();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
36 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
37 }
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
38
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
39 ok = CFStringGetCString(ref,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
40 buf, len * 4,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
41 kCFStringEncodingUTF8);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
42 if (!ok) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
43 PyMem_Free(buf);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
44 return NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
45 } else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
46 result = PyUnicode_DecodeUTF8(
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
47 buf, strlen(buf), NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
48 PyMem_Free(buf);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
49 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
50 return result;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
51 }
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
52 }
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
53
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
54
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
55 static PyObject*
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
56 get_proxy_settings(PyObject* mod __attribute__((__unused__)))
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
57 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
58 CFDictionaryRef proxyDict = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
59 CFNumberRef aNum = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
60 CFArrayRef anArray = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
61 PyObject* result = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
62 PyObject* v;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
63 int r;
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
64
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
65 proxyDict = SCDynamicStoreCopyProxies(NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
66 if (!proxyDict) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
67 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
68 return Py_None;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
69 }
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
70
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
71 result = PyDict_New();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
72 if (result == NULL) goto error;
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
73
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
74 if (&kSCPropNetProxiesExcludeSimpleHostnames != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
75 aNum = CFDictionaryGetValue(proxyDict,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
76 kSCPropNetProxiesExcludeSimpleHostnames);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
77 if (aNum == NULL) {
62550
eee257928300 Merged revisions 82281 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 61467
diff changeset
78 v = PyBool_FromLong(0);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
79 } else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
80 v = PyBool_FromLong(cfnum_to_int32(aNum));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
81 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
82 } else {
64978
9da13e560a3a Merged revisions 85062 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 62550
diff changeset
83 v = PyBool_FromLong(0);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
84 }
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
85
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
86 if (v == NULL) goto error;
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
87
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
88 r = PyDict_SetItemString(result, "exclude_simple", v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
89 Py_DECREF(v); v = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
90 if (r == -1) goto error;
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
91
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
92 anArray = CFDictionaryGetValue(proxyDict,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
93 kSCPropNetProxiesExceptionsList);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
94 if (anArray != NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
95 CFIndex len = CFArrayGetCount(anArray);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
96 CFIndex i;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
97 v = PyTuple_New(len);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
98 if (v == NULL) goto error;
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
99
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
100 r = PyDict_SetItemString(result, "exceptions", v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
101 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
102 if (r == -1) goto error;
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
103
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
104 for (i = 0; i < len; i++) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
105 CFStringRef aString = NULL;
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
106
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
107 aString = CFArrayGetValueAtIndex(anArray, i);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
108 if (aString == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
109 PyTuple_SetItem(v, i, Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
110 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
111 } else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
112 PyObject* t = cfstring_to_pystring(aString);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
113 if (!t) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
114 PyTuple_SetItem(v, i, Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
115 Py_INCREF(Py_None);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
116 } else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
117 PyTuple_SetItem(v, i, t);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
118 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
119 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
120 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
121 }
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
122
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
123 CFRelease(proxyDict);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
124 return result;
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
125
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
126 error:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
127 if (proxyDict) CFRelease(proxyDict);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
128 Py_XDECREF(result);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
129 return NULL;
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
130 }
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
131
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
132 static int
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
133 set_proxy(PyObject* proxies, char* proto, CFDictionaryRef proxyDict,
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
134 CFStringRef enabledKey,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
135 CFStringRef hostKey, CFStringRef portKey)
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
136 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
137 CFNumberRef aNum;
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
138
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
139 aNum = CFDictionaryGetValue(proxyDict, enabledKey);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
140 if (aNum && cfnum_to_int32(aNum)) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
141 CFStringRef hostString;
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
142
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
143 hostString = CFDictionaryGetValue(proxyDict, hostKey);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
144 aNum = CFDictionaryGetValue(proxyDict, portKey);
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
145
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
146 if (hostString) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
147 int r;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
148 PyObject* h = cfstring_to_pystring(hostString);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
149 PyObject* v;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
150 if (h) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
151 if (aNum) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
152 int32_t port = cfnum_to_int32(aNum);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
153 v = PyUnicode_FromFormat("http://%U:%ld",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
154 h, (long)port);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
155 } else {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
156 v = PyUnicode_FromFormat("http://%U", h);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
157 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
158 Py_DECREF(h);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
159 if (!v) return -1;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
160 r = PyDict_SetItemString(proxies, proto,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
161 v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
162 Py_DECREF(v);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
163 return r;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
164 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
165 }
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
166
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
167 }
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
168 return 0;
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
169 }
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
170
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
171
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
172
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
173 static PyObject*
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
174 get_proxies(PyObject* mod __attribute__((__unused__)))
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
175 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
176 PyObject* result = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
177 int r;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
178 CFDictionaryRef proxyDict = NULL;
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
179
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
180 proxyDict = SCDynamicStoreCopyProxies(NULL);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
181 if (proxyDict == NULL) {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
182 return PyDict_New();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
183 }
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
184
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
185 result = PyDict_New();
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
186 if (result == NULL) goto error;
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
187
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
188 r = set_proxy(result, "http", proxyDict,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
189 kSCPropNetProxiesHTTPEnable,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
190 kSCPropNetProxiesHTTPProxy,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
191 kSCPropNetProxiesHTTPPort);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
192 if (r == -1) goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
193 r = set_proxy(result, "https", proxyDict,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
194 kSCPropNetProxiesHTTPSEnable,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
195 kSCPropNetProxiesHTTPSProxy,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
196 kSCPropNetProxiesHTTPSPort);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
197 if (r == -1) goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
198 r = set_proxy(result, "ftp", proxyDict,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
199 kSCPropNetProxiesFTPEnable,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
200 kSCPropNetProxiesFTPProxy,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
201 kSCPropNetProxiesFTPPort);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
202 if (r == -1) goto error;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
203 r = set_proxy(result, "gopher", proxyDict,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
204 kSCPropNetProxiesGopherEnable,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
205 kSCPropNetProxiesGopherProxy,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
206 kSCPropNetProxiesGopherPort);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
207 if (r == -1) goto error;
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
208
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
209 CFRelease(proxyDict);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
210 return result;
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
211 error:
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
212 if (proxyDict) CFRelease(proxyDict);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
213 Py_XDECREF(result);
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
214 return NULL;
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
215 }
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
216
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
217 static PyMethodDef mod_methods[] = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
218 {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
219 "_get_proxy_settings",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
220 (PyCFunction)get_proxy_settings,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
221 METH_NOARGS,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
222 NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
223 },
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
224 {
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
225 "_get_proxies",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
226 (PyCFunction)get_proxies,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
227 METH_NOARGS,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
228 NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
229 },
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
230 { 0, 0, 0, 0 }
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
231 };
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
232
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
233
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
234
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
235 static struct PyModuleDef mod_module = {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
236 PyModuleDef_HEAD_INIT,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
237 "_scproxy",
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
238 NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
239 -1,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
240 mod_methods,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
241 NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
242 NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
243 NULL,
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
244 NULL
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
245 };
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
246
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
247
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
248 #ifdef __cplusplus
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
249 extern "C" {
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
250 #endif
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
251
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
252 PyObject*
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
253 PyInit__scproxy(void)
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
254 {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60706
diff changeset
255 return PyModule_Create(&mod_module);
60706
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
256 }
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
257
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
258 #ifdef __cplusplus
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
259 }
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
260 #endif
485c3f09a09b Merged revisions 80198 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents:
diff changeset
261