summaryrefslogtreecommitdiffstats
path: root/Mac/Tools/IDE/MacPrefs.py
blob: 716c828c33c8a1f534237a6cf1b15181cf93e350 (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 macfs
import marshal
import types

from MACFS import kOnSystemDisk

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'))
		fss = macfs.FSSpec(macfs.FSRef(self.__path))
		fss.SetCreatorType(self.__creator, 'pref')
	
	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.
	vrefnum, dirid = macfs.FindFolder(kOnSystemDisk, 'pref', 0)
	prefsfolder_fss = macfs.FSSpec((vrefnum, dirid, ''))
	prefsfolder = macfs.FSRef(prefsfolder_fss).as_fsspec().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