ยปCore Development>Code coverage>Lib/plat-mac/ic.py

Python code coverage for Lib/plat-mac/ic.py

#countcontent
1n/a"""IC wrapper module, based on Internet Config 1.3"""
2n/a
3n/afrom warnings import warnpy3k
4n/awarnpy3k("In 3.x, the ic module is removed.", stacklevel=2)
5n/a
6n/aimport icglue
7n/aimport string
8n/aimport sys
9n/aimport os
10n/afrom Carbon import Res
11n/aimport Carbon.File
12n/aimport macostools
13n/a
14n/aerror=icglue.error
15n/a
16n/a# From ictypes.h:
17n/aicPrefNotFoundErr = -666 # preference not found (duh!)
18n/aicPermErr = -667 # cannot set preference
19n/aicPrefDataErr = -668 # problem with preference data
20n/aicInternalErr = -669 # hmm, this is not good
21n/aicTruncatedErr = -670 # more data was present than was returned
22n/aicNoMoreWritersErr = -671 # you cannot begin a write session because someone else is already doing it */
23n/aicNothingToOverrideErr = -672 # no component for the override component to capture
24n/aicNoURLErr = -673 # no URL found
25n/aicConfigNotFoundErr = -674 # no configuration was found
26n/aicConfigInappropriateErr = -675 # incorrect manufacturer code
27n/a
28n/aICattr_no_change = -1
29n/a
30n/aicNoPerm = 0
31n/aicReadOnlyPerm = 1
32n/aicReadWritePerm = 2
33n/a# End of ictypes.h
34n/a
35n/aclass ICOpaqueData:
36n/a """An unparseable IC entry"""
37n/a def __init__(self, data):
38n/a self.data = data
39n/a
40n/a def __repr__(self):
41n/a return "ICOpaqueData(%r)"%(self.data,)
42n/a
43n/a_ICOpaqueDataType=type(ICOpaqueData(''))
44n/a
45n/adef _decode_default(data, key):
46n/a if len(data) == 0:
47n/a return data
48n/a if ord(data[0]) == len(data)-1:
49n/a # Assume Pstring
50n/a return data[1:]
51n/a return ICOpaqueData(data)
52n/a
53n/a
54n/adef _decode_multistr(data, key):
55n/a numstr = ord(data[0]) << 8 | ord(data[1])
56n/a rv = []
57n/a ptr = 2
58n/a for i in range(numstr):
59n/a strlen = ord(data[ptr])
60n/a str = data[ptr+1:ptr+strlen+1]
61n/a rv.append(str)
62n/a ptr = ptr + strlen + 1
63n/a return rv
64n/a
65n/adef _decode_fontrecord(data, key):
66n/a size = ord(data[0]) << 8 | ord(data[1])
67n/a face = ord(data[2])
68n/a namelen = ord(data[4])
69n/a return size, face, data[5:5+namelen]
70n/a
71n/adef _decode_boolean(data, key):
72n/a return ord(data[0])
73n/a
74n/adef _decode_text(data, key):
75n/a return data
76n/a
77n/adef _decode_charset(data, key):
78n/a return data[:256], data[256:]
79n/a
80n/adef _decode_appspec(data, key):
81n/a namelen = ord(data[4])
82n/a return data[0:4], data[5:5+namelen]
83n/a
84n/adef _code_default(data, key):
85n/a return chr(len(data)) + data
86n/a
87n/adef _code_multistr(data, key):
88n/a numstr = len(data)
89n/a rv = chr((numstr>>8) & 0xff) + chr(numstr & 0xff)
90n/a for i in data:
91n/a rv = rv + _code_default(i)
92n/a return rv
93n/a
94n/adef _code_fontrecord(data, key):
95n/a size, face, name = data
96n/a return chr((size>>8) & 0xff) + chr(size & 0xff) + chr(face & 0xff) + \
97n/a chr(0) + _code_default(name)
98n/a
99n/adef _code_boolean(data, key):
100n/a print 'XXXX boolean:', repr(data)
101n/a return chr(data)
102n/a
103n/adef _code_text(data, key):
104n/a return data
105n/a
106n/adef _code_charset(data, key):
107n/a return data[0] + data[1]
108n/a
109n/adef _code_appspec(data, key):
110n/a return data[0] + _code_default(data[1])
111n/a
112n/a_decoder_table = {
113n/a "ArchieAll" : (_decode_multistr , _code_multistr),
114n/a "UMichAll" : (_decode_multistr , _code_multistr),
115n/a "InfoMacAll" : (_decode_multistr , _code_multistr),
116n/a "ListFont" : (_decode_fontrecord , _code_fontrecord),
117n/a "ScreenFont" : (_decode_fontrecord , _code_fontrecord),
118n/a "PrinterFont" : (_decode_fontrecord , _code_fontrecord),
119n/a# "DownloadFolder" : (_decode_filespec , _code_filespec),
120n/a "Signature": (_decode_text , _code_text),
121n/a "Plan" : (_decode_text , _code_text),
122n/a "MailHeaders" : (_decode_text , _code_text),
123n/a "NewsHeaders" : (_decode_text , _code_text),
124n/a# "Mapping"
125n/a "CharacterSet" : (_decode_charset , _code_charset),
126n/a "Helper\245" : (_decode_appspec , _code_appspec),
127n/a# "Services" : (_decode_services, ????),
128n/a "NewMailFlashIcon" : (_decode_boolean , _code_boolean),
129n/a "NewMailDialog" : (_decode_boolean , _code_boolean),
130n/a "NewMailPlaySound" : (_decode_boolean , _code_boolean),
131n/a# "WebBackgroundColor" : _decode_color,
132n/a "NoProxyDomains" : (_decode_multistr , _code_multistr),
133n/a "UseHTTPProxy" : (_decode_boolean , _code_boolean),
134n/a "UseGopherProxy": (_decode_boolean , _code_boolean),
135n/a "UseFTPProxy" : (_decode_boolean , _code_boolean),
136n/a "UsePassiveFTP" : (_decode_boolean , _code_boolean),
137n/a}
138n/a
139n/adef _decode(data, key):
140n/a if '\245' in key:
141n/a key2 = key[:string.index(key, '\245')+1]
142n/a else:
143n/a key2 = key
144n/a if key2 in _decoder_table:
145n/a decoder = _decoder_table[key2][0]
146n/a else:
147n/a decoder = _decode_default
148n/a return decoder(data, key)
149n/a
150n/adef _code(data, key):
151n/a if type(data) == _ICOpaqueDataType:
152n/a return data.data
153n/a if '\245' in key:
154n/a key2 = key[:string.index(key, '\245')+1]
155n/a else:
156n/a key2 = key
157n/a if key2 in _decoder_table:
158n/a coder = _decoder_table[key2][1]
159n/a else:
160n/a coder = _code_default
161n/a return coder(data, key)
162n/a
163n/aclass IC:
164n/a def __init__(self, signature='Pyth', ic=None):
165n/a if ic:
166n/a self.ic = ic
167n/a else:
168n/a self.ic = icglue.ICStart(signature)
169n/a if hasattr(self.ic, 'ICFindConfigFile'):
170n/a self.ic.ICFindConfigFile()
171n/a self.h = Res.Resource('')
172n/a
173n/a def keys(self):
174n/a rv = []
175n/a self.ic.ICBegin(icReadOnlyPerm)
176n/a num = self.ic.ICCountPref()
177n/a for i in range(num):
178n/a rv.append(self.ic.ICGetIndPref(i+1))
179n/a self.ic.ICEnd()
180n/a return rv
181n/a
182n/a def has_key(self, key):
183n/a return self.__contains__(key)
184n/a
185n/a def __contains__(self, key):
186n/a try:
187n/a dummy = self.ic.ICFindPrefHandle(key, self.h)
188n/a except icglue.error:
189n/a return 0
190n/a return 1
191n/a
192n/a def __getitem__(self, key):
193n/a attr = self.ic.ICFindPrefHandle(key, self.h)
194n/a return _decode(self.h.data, key)
195n/a
196n/a def __setitem__(self, key, value):
197n/a value = _code(value, key)
198n/a self.ic.ICSetPref(key, ICattr_no_change, value)
199n/a
200n/a def launchurl(self, url, hint=""):
201n/a # Work around a bug in ICLaunchURL: file:/foo does
202n/a # not work but file:///foo does.
203n/a if url[:6] == 'file:/' and url[6] != '/':
204n/a url = 'file:///' + url[6:]
205n/a self.ic.ICLaunchURL(hint, url, 0, len(url))
206n/a
207n/a def parseurl(self, data, start=None, end=None, hint=""):
208n/a if start is None:
209n/a selStart = 0
210n/a selEnd = len(data)
211n/a else:
212n/a selStart = selEnd = start
213n/a if end is not None:
214n/a selEnd = end
215n/a selStart, selEnd = self.ic.ICParseURL(hint, data, selStart, selEnd, self.h)
216n/a return self.h.data, selStart, selEnd
217n/a
218n/a def mapfile(self, file):
219n/a if type(file) != type(''):
220n/a file = file.as_tuple()[2]
221n/a return self.ic.ICMapFilename(file)
222n/a
223n/a def maptypecreator(self, type, creator, filename=""):
224n/a return self.ic.ICMapTypeCreator(type, creator, filename)
225n/a
226n/a def settypecreator(self, file):
227n/a file = Carbon.File.pathname(file)
228n/a record = self.mapfile(os.path.split(file)[1])
229n/a MacOS.SetCreatorAndType(file, record[2], record[1])
230n/a macostools.touched(fss)
231n/a
232n/a# Convenience routines
233n/a_dft_ic = None
234n/a
235n/adef launchurl(url, hint=""):
236n/a global _dft_ic
237n/a if _dft_ic is None: _dft_ic = IC()
238n/a return _dft_ic.launchurl(url, hint)
239n/a
240n/adef parseurl(data, start=None, end=None, hint=""):
241n/a global _dft_ic
242n/a if _dft_ic is None: _dft_ic = IC()
243n/a return _dft_ic.parseurl(data, start, end, hint)
244n/a
245n/adef mapfile(filename):
246n/a global _dft_ic
247n/a if _dft_ic is None: _dft_ic = IC()
248n/a return _dft_ic.mapfile(filename)
249n/a
250n/adef maptypecreator(type, creator, filename=""):
251n/a global _dft_ic
252n/a if _dft_ic is None: _dft_ic = IC()
253n/a return _dft_ic.maptypecreator(type, creator, filename)
254n/a
255n/adef settypecreator(file):
256n/a global _dft_ic
257n/a if _dft_ic is None: _dft_ic = IC()
258n/a return _dft_ic.settypecreator(file)
259n/a
260n/adef _test():
261n/a ic = IC()
262n/a for k in ic.keys():
263n/a try:
264n/a v = ic[k]
265n/a except error:
266n/a v = '????'
267n/a print k, '\t', v
268n/a sys.exit(1)
269n/a
270n/aif __name__ == '__main__':
271n/a _test()