summaryrefslogtreecommitdiffstats
path: root/Mac/Tools/IDE/MacPrefs.py
blob: 3cf91532e50c040ff9f5cb5af368ca5e9bbfb411 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import marshal
import types
from Carbon import Folder
from Carbon import Folders

class PrefObject:

    def __init__(self, dict = None):
        if dict == None:
            self._prefsdict = {}
        else:
            self._prefsdict = dict

    def __len__(self):
        return len(self._prefsdict)

    def __delattr__(self, attr):
        if self._prefsdict.has_key(attr):
            del self._prefsdict[attr]
        else:
            raise AttributeError, 'delete non-existing instance attribute'

    def __getattr__(self, attr):
        if attr == '__members__':
            keys = self._prefsdict.keys()
            keys.sort()
            return keys
        try:
            return self._prefsdict[attr]
        except KeyError:
            raise AttributeError, attr

    def __setattr__(self, attr, value):
        if attr[0] <> '_':
            self._prefsdict[attr] = value
        else:
            self.__dict__[attr] = value

    def getprefsdict(self):
        return self._prefsdict


class PrefFile(PrefObject):

    def __init__(self, path, creator = 'Pyth'):
        # Find the preferences folder and our prefs file, create if needed.
        self.__path = path
        self.__creator = creator
        self._prefsdict = {}
        try:
            prefdict = marshal.load(open(self.__path, 'rb'))
        except (IOError, ValueError):
            # file not found, or currupt marshal data
            pass
        else:
            for key, value in prefdict.items():
                if type(value) == types.DictType:
                    self._prefsdict[key] = PrefObject(value)
                else:
                    self._prefsdict[key] = value

    def save(self):
        prefdict = {}
        for key, value in self._prefsdict.items():
            if type(value) == types.InstanceType:
                prefdict[key] = value.getprefsdict()
                if not prefdict[key]:
                    del prefdict[key]
            else:
                prefdict[key] = value
        marshal.dump(prefdict, open(self.__path, 'wb'))
        try:
            MacOS.SetCreatorAndType(self.__path, self.__creator, 'pref')
        except:
            pass

    def __getattr__(self, attr):
        if attr == '__members__':
            keys = self._prefsdict.keys()
            keys.sort()
            return keys
        try:
            return self._prefsdict[attr]
        except KeyError:
            if attr[0] <> '_':
                self._prefsdict[attr] = PrefObject()
                return self._prefsdict[attr]
            else:
                raise AttributeError, attr


_prefscache = {}

def GetPrefs(prefname, creator = 'Pyth'):
    import macostools, os
    if _prefscache.has_key(prefname):
        return _prefscache[prefname]
    # Find the preferences folder and our prefs file, create if needed.
    fsr = Folder.FSFindFolder(Folders.kOnSystemDisk, 'pref', 1)
    prefsfolder = fsr.as_pathname()
    path = os.path.join(prefsfolder, prefname)
    head, tail = os.path.split(path)
    # make sure the folder(s) exist
    macostools.mkdirs(head)

    preffile = PrefFile(path, creator)
    _prefscache[prefname] = preffile
    return preffile