blob: f8888fcf34f59d52a12712c6e62333d18680cab6 [file] [log] [blame]
Just van Rossum40f9b7b1999-01-30 22:39:17 +00001import macfs
2import marshal
3import types
4
Jack Jansenfffec052001-03-15 14:33:24 +00005from MACFS import kOnSystemDisk
Just van Rossum40f9b7b1999-01-30 22:39:17 +00006
7class PrefObject:
8
9 def __init__(self, dict = None):
10 if dict == None:
11 self._prefsdict = {}
12 else:
13 self._prefsdict = dict
14
15 def __len__(self):
16 return len(self._prefsdict)
17
18 def __delattr__(self, attr):
19 if self._prefsdict.has_key(attr):
20 del self._prefsdict[attr]
21 else:
22 raise AttributeError, 'delete non-existing instance attribute'
23
24 def __getattr__(self, attr):
25 if attr == '__members__':
26 keys = self._prefsdict.keys()
27 keys.sort()
28 return keys
29 try:
30 return self._prefsdict[attr]
31 except KeyError:
32 raise AttributeError, attr
33
34 def __setattr__(self, attr, value):
35 if attr[0] <> '_':
36 self._prefsdict[attr] = value
37 else:
38 self.__dict__[attr] = value
39
40 def getprefsdict(self):
41 return self._prefsdict
42
43
44class PrefFile(PrefObject):
45
46 def __init__(self, path, creator = 'Pyth'):
47 # Find the preferences folder and our prefs file, create if needed.
48 self.__path = path
49 self.__creator = creator
50 self._prefsdict = {}
51 try:
52 prefdict = marshal.load(open(self.__path, 'rb'))
53 except IOError:
54 pass
55 else:
56 for key, value in prefdict.items():
57 if type(value) == types.DictType:
58 self._prefsdict[key] = PrefObject(value)
59 else:
60 self._prefsdict[key] = value
61
62 def save(self):
63 prefdict = {}
64 for key, value in self._prefsdict.items():
65 if type(value) == types.InstanceType:
66 prefdict[key] = value.getprefsdict()
67 if not prefdict[key]:
68 del prefdict[key]
69 else:
70 prefdict[key] = value
71 marshal.dump(prefdict, open(self.__path, 'wb'))
72 fss = macfs.FSSpec(self.__path)
73 fss.SetCreatorType(self.__creator, 'pref')
74
75 def __getattr__(self, attr):
76 if attr == '__members__':
77 keys = self._prefsdict.keys()
78 keys.sort()
79 return keys
80 try:
81 return self._prefsdict[attr]
82 except KeyError:
83 if attr[0] <> '_':
84 self._prefsdict[attr] = PrefObject()
85 return self._prefsdict[attr]
86 else:
87 raise AttributeError, attr
88
89
90_prefscache = {}
91
92def GetPrefs(prefname, creator = 'Pyth'):
93 import macostools, os
94 if _prefscache.has_key(prefname):
95 return _prefscache[prefname]
96 # Find the preferences folder and our prefs file, create if needed.
97 vrefnum, dirid = macfs.FindFolder(kOnSystemDisk, 'pref', 0)
98 prefsfolder_fss = macfs.FSSpec((vrefnum, dirid, ''))
99 prefsfolder = prefsfolder_fss.as_pathname()
100 path = os.path.join(prefsfolder, prefname)
101 head, tail = os.path.split(path)
102 # make sure the folder(s) exist
103 macostools.mkdirs(head)
104
105 preffile = PrefFile(path, creator)
106 _prefscache[prefname] = preffile
107 return preffile