1 """IC wrapper module, based on Internet Config 1.3"""
3 from warnings
import warnpy3k
4 warnpy3k("In 3.x, the ic module is removed.", stacklevel
=2)
10 from Carbon
import Res
17 icPrefNotFoundErr
= -666 # preference not found (duh!)
18 icPermErr
= -667 # cannot set preference
19 icPrefDataErr
= -668 # problem with preference data
20 icInternalErr
= -669 # hmm, this is not good
21 icTruncatedErr
= -670 # more data was present than was returned
22 icNoMoreWritersErr
= -671 # you cannot begin a write session because someone else is already doing it */
23 icNothingToOverrideErr
= -672 # no component for the override component to capture
24 icNoURLErr
= -673 # no URL found
25 icConfigNotFoundErr
= -674 # no configuration was found
26 icConfigInappropriateErr
= -675 # incorrect manufacturer code
36 """An unparseable IC entry"""
37 def __init__(self
, data
):
41 return "ICOpaqueData(%r)"%(self
.data
,)
43 _ICOpaqueDataType
=type(ICOpaqueData(''))
45 def _decode_default(data
, key
):
48 if ord(data
[0]) == len(data
)-1:
51 return ICOpaqueData(data
)
54 def _decode_multistr(data
, key
):
55 numstr
= ord(data
[0]) << 8 |
ord(data
[1])
58 for i
in range(numstr
):
59 strlen
= ord(data
[ptr
])
60 str = data
[ptr
+1:ptr
+strlen
+1]
62 ptr
= ptr
+ strlen
+ 1
65 def _decode_fontrecord(data
, key
):
66 size
= ord(data
[0]) << 8 |
ord(data
[1])
68 namelen
= ord(data
[4])
69 return size
, face
, data
[5:5+namelen
]
71 def _decode_boolean(data
, key
):
74 def _decode_text(data
, key
):
77 def _decode_charset(data
, key
):
78 return data
[:256], data
[256:]
80 def _decode_appspec(data
, key
):
81 namelen
= ord(data
[4])
82 return data
[0:4], data
[5:5+namelen
]
84 def _code_default(data
, key
):
85 return chr(len(data
)) + data
87 def _code_multistr(data
, key
):
89 rv
= chr((numstr
>>8) & 0xff) + chr(numstr
& 0xff)
91 rv
= rv
+ _code_default(i
)
94 def _code_fontrecord(data
, key
):
95 size
, face
, name
= data
96 return chr((size
>>8) & 0xff) + chr(size
& 0xff) + chr(face
& 0xff) + \
97 chr(0) + _code_default(name
)
99 def _code_boolean(data
, key
):
100 print 'XXXX boolean:', repr(data
)
103 def _code_text(data
, key
):
106 def _code_charset(data
, key
):
107 return data
[0] + data
[1]
109 def _code_appspec(data
, key
):
110 return data
[0] + _code_default(data
[1])
113 "ArchieAll" : (_decode_multistr
, _code_multistr
),
114 "UMichAll" : (_decode_multistr
, _code_multistr
),
115 "InfoMacAll" : (_decode_multistr
, _code_multistr
),
116 "ListFont" : (_decode_fontrecord
, _code_fontrecord
),
117 "ScreenFont" : (_decode_fontrecord
, _code_fontrecord
),
118 "PrinterFont" : (_decode_fontrecord
, _code_fontrecord
),
119 # "DownloadFolder" : (_decode_filespec , _code_filespec),
120 "Signature": (_decode_text
, _code_text
),
121 "Plan" : (_decode_text
, _code_text
),
122 "MailHeaders" : (_decode_text
, _code_text
),
123 "NewsHeaders" : (_decode_text
, _code_text
),
125 "CharacterSet" : (_decode_charset
, _code_charset
),
126 "Helper\245" : (_decode_appspec
, _code_appspec
),
127 # "Services" : (_decode_services, ????),
128 "NewMailFlashIcon" : (_decode_boolean
, _code_boolean
),
129 "NewMailDialog" : (_decode_boolean
, _code_boolean
),
130 "NewMailPlaySound" : (_decode_boolean
, _code_boolean
),
131 # "WebBackgroundColor" : _decode_color,
132 "NoProxyDomains" : (_decode_multistr
, _code_multistr
),
133 "UseHTTPProxy" : (_decode_boolean
, _code_boolean
),
134 "UseGopherProxy": (_decode_boolean
, _code_boolean
),
135 "UseFTPProxy" : (_decode_boolean
, _code_boolean
),
136 "UsePassiveFTP" : (_decode_boolean
, _code_boolean
),
139 def _decode(data
, key
):
141 key2
= key
[:string
.index(key
, '\245')+1]
144 if _decoder_table
.has_key(key2
):
145 decoder
= _decoder_table
[key2
][0]
147 decoder
= _decode_default
148 return decoder(data
, key
)
150 def _code(data
, key
):
151 if type(data
) == _ICOpaqueDataType
:
154 key2
= key
[:string
.index(key
, '\245')+1]
157 if _decoder_table
.has_key(key2
):
158 coder
= _decoder_table
[key2
][1]
160 coder
= _code_default
161 return coder(data
, key
)
164 def __init__(self
, signature
='Pyth', ic
=None):
168 self
.ic
= icglue
.ICStart(signature
)
169 if hasattr(self
.ic
, 'ICFindConfigFile'):
170 self
.ic
.ICFindConfigFile()
171 self
.h
= Res
.Resource('')
175 self
.ic
.ICBegin(icReadOnlyPerm
)
176 num
= self
.ic
.ICCountPref()
178 rv
.append(self
.ic
.ICGetIndPref(i
+1))
182 def has_key(self
, key
):
183 return self
.__contains
__(key
)
185 def __contains__(self
, key
):
187 dummy
= self
.ic
.ICFindPrefHandle(key
, self
.h
)
192 def __getitem__(self
, key
):
193 attr
= self
.ic
.ICFindPrefHandle(key
, self
.h
)
194 return _decode(self
.h
.data
, key
)
196 def __setitem__(self
, key
, value
):
197 value
= _code(value
, key
)
198 self
.ic
.ICSetPref(key
, ICattr_no_change
, value
)
200 def launchurl(self
, url
, hint
=""):
201 # Work around a bug in ICLaunchURL: file:/foo does
202 # not work but file:///foo does.
203 if url
[:6] == 'file:/' and url
[6] != '/':
204 url
= 'file:///' + url
[6:]
205 self
.ic
.ICLaunchURL(hint
, url
, 0, len(url
))
207 def parseurl(self
, data
, start
=None, end
=None, hint
=""):
212 selStart
= selEnd
= start
215 selStart
, selEnd
= self
.ic
.ICParseURL(hint
, data
, selStart
, selEnd
, self
.h
)
216 return self
.h
.data
, selStart
, selEnd
218 def mapfile(self
, file):
219 if type(file) != type(''):
220 file = file.as_tuple()[2]
221 return self
.ic
.ICMapFilename(file)
223 def maptypecreator(self
, type, creator
, filename
=""):
224 return self
.ic
.ICMapTypeCreator(type, creator
, filename
)
226 def settypecreator(self
, file):
227 file = Carbon
.File
.pathname(file)
228 record
= self
.mapfile(os
.path
.split(file)[1])
229 MacOS
.SetCreatorAndType(file, record
[2], record
[1])
230 macostools
.touched(fss
)
232 # Convenience routines
235 def launchurl(url
, hint
=""):
237 if _dft_ic
is None: _dft_ic
= IC()
238 return _dft_ic
.launchurl(url
, hint
)
240 def parseurl(data
, start
=None, end
=None, hint
=""):
242 if _dft_ic
is None: _dft_ic
= IC()
243 return _dft_ic
.parseurl(data
, start
, end
, hint
)
245 def mapfile(filename
):
247 if _dft_ic
is None: _dft_ic
= IC()
248 return _dft_ic
.mapfile(filename
)
250 def maptypecreator(type, creator
, filename
=""):
252 if _dft_ic
is None: _dft_ic
= IC()
253 return _dft_ic
.maptypecreator(type, creator
, filename
)
255 def settypecreator(file):
257 if _dft_ic
is None: _dft_ic
= IC()
258 return _dft_ic
.settypecreator(file)
270 if __name__
== '__main__':