Just van Rossum | 40f9b7b | 1999-01-30 22:39:17 +0000 | [diff] [blame] | 1 | import macfs |
| 2 | import marshal |
| 3 | import types |
| 4 | |
Jack Jansen | fffec05 | 2001-03-15 14:33:24 +0000 | [diff] [blame] | 5 | from MACFS import kOnSystemDisk |
Just van Rossum | 40f9b7b | 1999-01-30 22:39:17 +0000 | [diff] [blame] | 6 | |
| 7 | class 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 | |
| 44 | class 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')) |
Just van Rossum | 924e18e | 2001-07-05 07:03:16 +0000 | [diff] [blame] | 53 | except (IOError, ValueError): |
| 54 | # file not found, or currupt marshal data |
Just van Rossum | 40f9b7b | 1999-01-30 22:39:17 +0000 | [diff] [blame] | 55 | pass |
| 56 | else: |
| 57 | for key, value in prefdict.items(): |
| 58 | if type(value) == types.DictType: |
| 59 | self._prefsdict[key] = PrefObject(value) |
| 60 | else: |
| 61 | self._prefsdict[key] = value |
| 62 | |
| 63 | def save(self): |
| 64 | prefdict = {} |
| 65 | for key, value in self._prefsdict.items(): |
| 66 | if type(value) == types.InstanceType: |
| 67 | prefdict[key] = value.getprefsdict() |
| 68 | if not prefdict[key]: |
| 69 | del prefdict[key] |
| 70 | else: |
| 71 | prefdict[key] = value |
| 72 | marshal.dump(prefdict, open(self.__path, 'wb')) |
| 73 | fss = macfs.FSSpec(self.__path) |
| 74 | fss.SetCreatorType(self.__creator, 'pref') |
| 75 | |
| 76 | def __getattr__(self, attr): |
| 77 | if attr == '__members__': |
| 78 | keys = self._prefsdict.keys() |
| 79 | keys.sort() |
| 80 | return keys |
| 81 | try: |
| 82 | return self._prefsdict[attr] |
| 83 | except KeyError: |
| 84 | if attr[0] <> '_': |
| 85 | self._prefsdict[attr] = PrefObject() |
| 86 | return self._prefsdict[attr] |
| 87 | else: |
| 88 | raise AttributeError, attr |
| 89 | |
| 90 | |
| 91 | _prefscache = {} |
| 92 | |
| 93 | def GetPrefs(prefname, creator = 'Pyth'): |
| 94 | import macostools, os |
| 95 | if _prefscache.has_key(prefname): |
| 96 | return _prefscache[prefname] |
| 97 | # Find the preferences folder and our prefs file, create if needed. |
| 98 | vrefnum, dirid = macfs.FindFolder(kOnSystemDisk, 'pref', 0) |
| 99 | prefsfolder_fss = macfs.FSSpec((vrefnum, dirid, '')) |
| 100 | prefsfolder = prefsfolder_fss.as_pathname() |
| 101 | path = os.path.join(prefsfolder, prefname) |
| 102 | head, tail = os.path.split(path) |
| 103 | # make sure the folder(s) exist |
| 104 | macostools.mkdirs(head) |
| 105 | |
| 106 | preffile = PrefFile(path, creator) |
| 107 | _prefscache[prefname] = preffile |
| 108 | return preffile |