mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			108 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import macfs
 | 
						|
import marshal
 | 
						|
import types
 | 
						|
 | 
						|
kOnSystemDisk = 0x8000
 | 
						|
 | 
						|
 | 
						|
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:
 | 
						|
			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(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 = prefsfolder_fss.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
 |