Just van Rossum | 40f9b7b | 1999-01-30 22:39:17 +0000 | [diff] [blame] | 1 | import marshal |
| 2 | import types |
Jack Jansen | e7ee17c | 2003-02-06 22:32:35 +0000 | [diff] [blame] | 3 | from Carbon import Folder |
| 4 | from Carbon import Folders |
Just van Rossum | 40f9b7b | 1999-01-30 22:39:17 +0000 | [diff] [blame] | 5 | |
| 6 | class PrefObject: |
| 7 | |
| 8 | def __init__(self, dict = None): |
| 9 | if dict == None: |
| 10 | self._prefsdict = {} |
| 11 | else: |
| 12 | self._prefsdict = dict |
| 13 | |
| 14 | def __len__(self): |
| 15 | return len(self._prefsdict) |
| 16 | |
| 17 | def __delattr__(self, attr): |
| 18 | if self._prefsdict.has_key(attr): |
| 19 | del self._prefsdict[attr] |
| 20 | else: |
| 21 | raise AttributeError, 'delete non-existing instance attribute' |
| 22 | |
| 23 | def __getattr__(self, attr): |
| 24 | if attr == '__members__': |
| 25 | keys = self._prefsdict.keys() |
| 26 | keys.sort() |
| 27 | return keys |
| 28 | try: |
| 29 | return self._prefsdict[attr] |
| 30 | except KeyError: |
| 31 | raise AttributeError, attr |
| 32 | |
| 33 | def __setattr__(self, attr, value): |
| 34 | if attr[0] <> '_': |
| 35 | self._prefsdict[attr] = value |
| 36 | else: |
| 37 | self.__dict__[attr] = value |
| 38 | |
| 39 | def getprefsdict(self): |
| 40 | return self._prefsdict |
| 41 | |
| 42 | |
| 43 | class PrefFile(PrefObject): |
| 44 | |
| 45 | def __init__(self, path, creator = 'Pyth'): |
| 46 | # Find the preferences folder and our prefs file, create if needed. |
| 47 | self.__path = path |
| 48 | self.__creator = creator |
| 49 | self._prefsdict = {} |
| 50 | try: |
| 51 | prefdict = marshal.load(open(self.__path, 'rb')) |
Just van Rossum | 924e18e | 2001-07-05 07:03:16 +0000 | [diff] [blame] | 52 | except (IOError, ValueError): |
| 53 | # file not found, or currupt marshal data |
Just van Rossum | 40f9b7b | 1999-01-30 22:39:17 +0000 | [diff] [blame] | 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')) |
Jack Jansen | 19ac481 | 2002-12-13 23:32:51 +0000 | [diff] [blame] | 72 | try: |
Jack Jansen | e7ee17c | 2003-02-06 22:32:35 +0000 | [diff] [blame] | 73 | MacOS.SetCreatorAndType(self.__path, self.__creator, 'pref') |
Jack Jansen | 19ac481 | 2002-12-13 23:32:51 +0000 | [diff] [blame] | 74 | except: |
| 75 | pass |
Just van Rossum | 40f9b7b | 1999-01-30 22:39:17 +0000 | [diff] [blame] | 76 | |
| 77 | def __getattr__(self, attr): |
| 78 | if attr == '__members__': |
| 79 | keys = self._prefsdict.keys() |
| 80 | keys.sort() |
| 81 | return keys |
| 82 | try: |
| 83 | return self._prefsdict[attr] |
| 84 | except KeyError: |
| 85 | if attr[0] <> '_': |
| 86 | self._prefsdict[attr] = PrefObject() |
| 87 | return self._prefsdict[attr] |
| 88 | else: |
| 89 | raise AttributeError, attr |
| 90 | |
| 91 | |
| 92 | _prefscache = {} |
| 93 | |
| 94 | def GetPrefs(prefname, creator = 'Pyth'): |
| 95 | import macostools, os |
| 96 | if _prefscache.has_key(prefname): |
| 97 | return _prefscache[prefname] |
| 98 | # Find the preferences folder and our prefs file, create if needed. |
Jack Jansen | e7ee17c | 2003-02-06 22:32:35 +0000 | [diff] [blame] | 99 | fsr = Folder.FSFindFolder(Folders.kOnSystemDisk, 'pref', 1) |
| 100 | prefsfolder = fsr.as_pathname() |
Just van Rossum | 40f9b7b | 1999-01-30 22:39:17 +0000 | [diff] [blame] | 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 |