14b76ba3280634886356782c0ecc66ac08895826aJack Jansen"""IC wrapper module, based on Internet Config 1.3"""
24b76ba3280634886356782c0ecc66ac08895826aJack Jansen
3236819310db3fe6f2fb22d48b780fa6ec253b6c7Benjamin Petersonfrom warnings import warnpy3k
4a6864e0d9f1fc06c50db36ed913ac48a3d2ddde5Benjamin Petersonwarnpy3k("In 3.x, the ic module is removed.", stacklevel=2)
5236819310db3fe6f2fb22d48b780fa6ec253b6c7Benjamin Peterson
64b76ba3280634886356782c0ecc66ac08895826aJack Jansenimport icglue
74b76ba3280634886356782c0ecc66ac08895826aJack Jansenimport string
84b76ba3280634886356782c0ecc66ac08895826aJack Jansenimport sys
9cf0b2e8e28680dcf35d73ff9e4ba6719ca8e7cd8Jack Jansenimport os
105a6fdcd3718927109592c6df692fe24a8fdaee31Jack Jansenfrom Carbon import Res
11cf0b2e8e28680dcf35d73ff9e4ba6719ca8e7cd8Jack Jansenimport Carbon.File
124b76ba3280634886356782c0ecc66ac08895826aJack Jansenimport macostools
134b76ba3280634886356782c0ecc66ac08895826aJack Jansen
144b76ba3280634886356782c0ecc66ac08895826aJack Jansenerror=icglue.error
154b76ba3280634886356782c0ecc66ac08895826aJack Jansen
164b76ba3280634886356782c0ecc66ac08895826aJack Jansen# From ictypes.h:
170ae3220736f9b71820b01aee1f540d0afcceb9a6Jack JansenicPrefNotFoundErr = -666        # preference not found (duh!)
180ae3220736f9b71820b01aee1f540d0afcceb9a6Jack JansenicPermErr = -667                # cannot set preference
190ae3220736f9b71820b01aee1f540d0afcceb9a6Jack JansenicPrefDataErr = -668            # problem with preference data
200ae3220736f9b71820b01aee1f540d0afcceb9a6Jack JansenicInternalErr = -669            # hmm, this is not good
210ae3220736f9b71820b01aee1f540d0afcceb9a6Jack JansenicTruncatedErr = -670           # more data was present than was returned
220ae3220736f9b71820b01aee1f540d0afcceb9a6Jack JansenicNoMoreWritersErr = -671       # you cannot begin a write session because someone else is already doing it */
230ae3220736f9b71820b01aee1f540d0afcceb9a6Jack JansenicNothingToOverrideErr = -672   # no component for the override component to capture
240ae3220736f9b71820b01aee1f540d0afcceb9a6Jack JansenicNoURLErr = -673               # no URL found
250ae3220736f9b71820b01aee1f540d0afcceb9a6Jack JansenicConfigNotFoundErr = -674      # no configuration was found
260ae3220736f9b71820b01aee1f540d0afcceb9a6Jack JansenicConfigInappropriateErr = -675 # incorrect manufacturer code
274b76ba3280634886356782c0ecc66ac08895826aJack Jansen
284b76ba3280634886356782c0ecc66ac08895826aJack JansenICattr_no_change = -1
294b76ba3280634886356782c0ecc66ac08895826aJack Jansen
304b76ba3280634886356782c0ecc66ac08895826aJack JansenicNoPerm = 0
314b76ba3280634886356782c0ecc66ac08895826aJack JansenicReadOnlyPerm = 1
324b76ba3280634886356782c0ecc66ac08895826aJack JansenicReadWritePerm = 2
334b76ba3280634886356782c0ecc66ac08895826aJack Jansen# End of ictypes.h
344b76ba3280634886356782c0ecc66ac08895826aJack Jansen
358dc797d1f888b3ebfb1af5fdb97c1a4fc11026cbJack Jansenclass ICOpaqueData:
360ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    """An unparseable IC entry"""
370ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    def __init__(self, data):
380ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        self.data = data
398dc797d1f888b3ebfb1af5fdb97c1a4fc11026cbJack Jansen
400ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    def __repr__(self):
4170a6b49821a3226f55e9716f32d802d06640cb89Walter Dörwald        return "ICOpaqueData(%r)"%(self.data,)
428dc797d1f888b3ebfb1af5fdb97c1a4fc11026cbJack Jansen
438dc797d1f888b3ebfb1af5fdb97c1a4fc11026cbJack Jansen_ICOpaqueDataType=type(ICOpaqueData(''))
44182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
454b76ba3280634886356782c0ecc66ac08895826aJack Jansendef _decode_default(data, key):
460ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    if len(data) == 0:
470ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        return data
480ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    if ord(data[0]) == len(data)-1:
490ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        # Assume Pstring
500ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        return data[1:]
510ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    return ICOpaqueData(data)
52182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
53182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
544b76ba3280634886356782c0ecc66ac08895826aJack Jansendef _decode_multistr(data, key):
550ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    numstr = ord(data[0]) << 8 | ord(data[1])
560ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    rv = []
570ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    ptr = 2
580ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    for i in range(numstr):
590ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        strlen = ord(data[ptr])
600ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        str = data[ptr+1:ptr+strlen+1]
610ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        rv.append(str)
620ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        ptr = ptr + strlen + 1
630ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    return rv
64182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
654b76ba3280634886356782c0ecc66ac08895826aJack Jansendef _decode_fontrecord(data, key):
660ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    size = ord(data[0]) << 8 | ord(data[1])
670ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    face = ord(data[2])
680ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    namelen = ord(data[4])
690ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    return size, face, data[5:5+namelen]
70182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
714b76ba3280634886356782c0ecc66ac08895826aJack Jansendef _decode_boolean(data, key):
720ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    return ord(data[0])
73182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
744b76ba3280634886356782c0ecc66ac08895826aJack Jansendef _decode_text(data, key):
750ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    return data
76182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
774b76ba3280634886356782c0ecc66ac08895826aJack Jansendef _decode_charset(data, key):
780ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    return data[:256], data[256:]
79182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
804b76ba3280634886356782c0ecc66ac08895826aJack Jansendef _decode_appspec(data, key):
810ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    namelen = ord(data[4])
820ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    return data[0:4], data[5:5+namelen]
834b76ba3280634886356782c0ecc66ac08895826aJack Jansen
844b76ba3280634886356782c0ecc66ac08895826aJack Jansendef _code_default(data, key):
850ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    return chr(len(data)) + data
86182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
874b76ba3280634886356782c0ecc66ac08895826aJack Jansendef _code_multistr(data, key):
880ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    numstr = len(data)
890ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    rv = chr((numstr>>8) & 0xff) + chr(numstr & 0xff)
900ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    for i in data:
910ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        rv = rv + _code_default(i)
920ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    return rv
93182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
944b76ba3280634886356782c0ecc66ac08895826aJack Jansendef _code_fontrecord(data, key):
950ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    size, face, name = data
960ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    return chr((size>>8) & 0xff) + chr(size & 0xff) + chr(face & 0xff) + \
970ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        chr(0) + _code_default(name)
98182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
994b76ba3280634886356782c0ecc66ac08895826aJack Jansendef _code_boolean(data, key):
10070a6b49821a3226f55e9716f32d802d06640cb89Walter Dörwald    print 'XXXX boolean:', repr(data)
1010ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    return chr(data)
102182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
1034b76ba3280634886356782c0ecc66ac08895826aJack Jansendef _code_text(data, key):
1040ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    return data
105182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
1064b76ba3280634886356782c0ecc66ac08895826aJack Jansendef _code_charset(data, key):
1070ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    return data[0] + data[1]
108182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
1094b76ba3280634886356782c0ecc66ac08895826aJack Jansendef _code_appspec(data, key):
1100ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    return data[0] + _code_default(data[1])
111182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
1124b76ba3280634886356782c0ecc66ac08895826aJack Jansen_decoder_table = {
1130ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    "ArchieAll" : (_decode_multistr , _code_multistr),
1140ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    "UMichAll" : (_decode_multistr , _code_multistr),
1150ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    "InfoMacAll" : (_decode_multistr , _code_multistr),
1160ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    "ListFont" : (_decode_fontrecord , _code_fontrecord),
1170ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    "ScreenFont" : (_decode_fontrecord , _code_fontrecord),
1180ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    "PrinterFont" : (_decode_fontrecord , _code_fontrecord),
1190ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen#   "DownloadFolder" : (_decode_filespec , _code_filespec),
1200ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    "Signature": (_decode_text , _code_text),
1210ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    "Plan" : (_decode_text , _code_text),
1220ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    "MailHeaders" : (_decode_text , _code_text),
1230ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    "NewsHeaders" : (_decode_text , _code_text),
124182b5aca27d376b08a2904bed42b751496f932f3Tim Peters#   "Mapping"
1250ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    "CharacterSet" : (_decode_charset , _code_charset),
1260ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    "Helper\245" : (_decode_appspec , _code_appspec),
1270ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen#   "Services" : (_decode_services, ????),
1280ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    "NewMailFlashIcon" : (_decode_boolean , _code_boolean),
1290ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    "NewMailDialog" : (_decode_boolean , _code_boolean),
1300ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    "NewMailPlaySound" : (_decode_boolean , _code_boolean),
1310ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen#   "WebBackgroundColor" : _decode_color,
1320ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    "NoProxyDomains" : (_decode_multistr , _code_multistr),
1330ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    "UseHTTPProxy" : (_decode_boolean , _code_boolean),
1340ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    "UseGopherProxy": (_decode_boolean , _code_boolean),
1350ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    "UseFTPProxy" : (_decode_boolean , _code_boolean),
1360ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    "UsePassiveFTP" : (_decode_boolean , _code_boolean),
1374b76ba3280634886356782c0ecc66ac08895826aJack Jansen}
1384b76ba3280634886356782c0ecc66ac08895826aJack Jansen
1394b76ba3280634886356782c0ecc66ac08895826aJack Jansendef _decode(data, key):
1400ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    if '\245' in key:
1410ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        key2 = key[:string.index(key, '\245')+1]
1420ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    else:
1430ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        key2 = key
144a3a505076efc19ec23669370778c5fa22d030ffaMark Dickinson    if key2 in _decoder_table:
1450ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        decoder = _decoder_table[key2][0]
1460ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    else:
1470ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        decoder = _decode_default
1480ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    return decoder(data, key)
1494b76ba3280634886356782c0ecc66ac08895826aJack Jansen
1504b76ba3280634886356782c0ecc66ac08895826aJack Jansendef _code(data, key):
1510ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    if type(data) == _ICOpaqueDataType:
1520ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        return data.data
1530ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    if '\245' in key:
1540ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        key2 = key[:string.index(key, '\245')+1]
1550ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    else:
1560ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        key2 = key
157a3a505076efc19ec23669370778c5fa22d030ffaMark Dickinson    if key2 in _decoder_table:
1580ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        coder = _decoder_table[key2][1]
1590ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    else:
1600ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        coder = _code_default
1610ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    return coder(data, key)
162182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
1634b76ba3280634886356782c0ecc66ac08895826aJack Jansenclass IC:
1640ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    def __init__(self, signature='Pyth', ic=None):
1650ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        if ic:
1660ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen            self.ic = ic
1670ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        else:
1680ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen            self.ic = icglue.ICStart(signature)
1690ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen            if hasattr(self.ic, 'ICFindConfigFile'):
1700ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen                self.ic.ICFindConfigFile()
1710ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        self.h = Res.Resource('')
172182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
1730ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    def keys(self):
1740ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        rv = []
1750ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        self.ic.ICBegin(icReadOnlyPerm)
1760ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        num = self.ic.ICCountPref()
1770ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        for i in range(num):
1780ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen            rv.append(self.ic.ICGetIndPref(i+1))
1790ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        self.ic.ICEnd()
1800ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        return rv
181182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
1820ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    def has_key(self, key):
1830ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        return self.__contains__(key)
184182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
1850ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    def __contains__(self, key):
1860ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        try:
1870ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen            dummy = self.ic.ICFindPrefHandle(key, self.h)
1880ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        except icglue.error:
1890ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen            return 0
1900ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        return 1
191182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
1920ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    def __getitem__(self, key):
1930ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        attr = self.ic.ICFindPrefHandle(key, self.h)
1940ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        return _decode(self.h.data, key)
195182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
1960ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    def __setitem__(self, key, value):
1970ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        value = _code(value, key)
1980ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        self.ic.ICSetPref(key, ICattr_no_change, value)
199182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
2000ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    def launchurl(self, url, hint=""):
2010ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        # Work around a bug in ICLaunchURL: file:/foo does
2020ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        # not work but file:///foo does.
2030ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        if url[:6] == 'file:/' and url[6] != '/':
2040ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen            url = 'file:///' + url[6:]
2050ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        self.ic.ICLaunchURL(hint, url, 0, len(url))
206182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
2070ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    def parseurl(self, data, start=None, end=None, hint=""):
2085b63acd31e0e40c1a9a9e9762905b0054ff37994Benjamin Peterson        if start is None:
2090ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen            selStart = 0
2100ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen            selEnd = len(data)
2110ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        else:
2120ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen            selStart = selEnd = start
2135b63acd31e0e40c1a9a9e9762905b0054ff37994Benjamin Peterson        if end is not None:
2140ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen            selEnd = end
2150ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        selStart, selEnd = self.ic.ICParseURL(hint, data, selStart, selEnd, self.h)
2160ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        return self.h.data, selStart, selEnd
217182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
2180ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    def mapfile(self, file):
2190ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        if type(file) != type(''):
2200ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen            file = file.as_tuple()[2]
2210ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        return self.ic.ICMapFilename(file)
222182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
2230ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    def maptypecreator(self, type, creator, filename=""):
2240ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        return self.ic.ICMapTypeCreator(type, creator, filename)
225182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
2260ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    def settypecreator(self, file):
2270ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        file = Carbon.File.pathname(file)
2280ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        record = self.mapfile(os.path.split(file)[1])
2290ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        MacOS.SetCreatorAndType(file, record[2], record[1])
2300ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        macostools.touched(fss)
231182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
2324b76ba3280634886356782c0ecc66ac08895826aJack Jansen# Convenience routines
2334b76ba3280634886356782c0ecc66ac08895826aJack Jansen_dft_ic = None
2344b76ba3280634886356782c0ecc66ac08895826aJack Jansen
2354b76ba3280634886356782c0ecc66ac08895826aJack Jansendef launchurl(url, hint=""):
2360ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    global _dft_ic
2375b63acd31e0e40c1a9a9e9762905b0054ff37994Benjamin Peterson    if _dft_ic is None: _dft_ic = IC()
2380ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    return _dft_ic.launchurl(url, hint)
239182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
2404b76ba3280634886356782c0ecc66ac08895826aJack Jansendef parseurl(data, start=None, end=None, hint=""):
2410ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    global _dft_ic
2425b63acd31e0e40c1a9a9e9762905b0054ff37994Benjamin Peterson    if _dft_ic is None: _dft_ic = IC()
2430ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    return _dft_ic.parseurl(data, start, end, hint)
244182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
2454b76ba3280634886356782c0ecc66ac08895826aJack Jansendef mapfile(filename):
2460ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    global _dft_ic
2475b63acd31e0e40c1a9a9e9762905b0054ff37994Benjamin Peterson    if _dft_ic is None: _dft_ic = IC()
2480ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    return _dft_ic.mapfile(filename)
249182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
2504b76ba3280634886356782c0ecc66ac08895826aJack Jansendef maptypecreator(type, creator, filename=""):
2510ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    global _dft_ic
2525b63acd31e0e40c1a9a9e9762905b0054ff37994Benjamin Peterson    if _dft_ic is None: _dft_ic = IC()
2530ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    return _dft_ic.maptypecreator(type, creator, filename)
254182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
2554b76ba3280634886356782c0ecc66ac08895826aJack Jansendef settypecreator(file):
2560ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    global _dft_ic
2575b63acd31e0e40c1a9a9e9762905b0054ff37994Benjamin Peterson    if _dft_ic is None: _dft_ic = IC()
2580ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    return _dft_ic.settypecreator(file)
259182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
2604b76ba3280634886356782c0ecc66ac08895826aJack Jansendef _test():
2610ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    ic = IC()
2620ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    for k in ic.keys():
2630ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        try:
2640ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen            v = ic[k]
2650ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        except error:
2660ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen            v = '????'
2670ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen        print k, '\t', v
2680ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    sys.exit(1)
269182b5aca27d376b08a2904bed42b751496f932f3Tim Peters
2704b76ba3280634886356782c0ecc66ac08895826aJack Jansenif __name__ == '__main__':
2710ae3220736f9b71820b01aee1f540d0afcceb9a6Jack Jansen    _test()
272