2 # General parser/loaders for preferences files and such
11 Error
= "Preferences.Error"
16 def __init__(self
, data
=None):
21 raise Error
, "No default given"
25 raise Error
, "Cannot save to default value"
27 def delete(self
, deep
=0):
29 print 'Attempt to delete default value'
30 raise Error
, "Cannot delete default value"
32 _defaultdefault
= NullLoader()
35 def __init__(self
, filename
, resid
, resnum
=None, resname
=None, default
=_defaultdefault
):
36 self
.filename
= filename
37 self
.fss
= macfs
.FSSpec(self
.filename
)
40 self
.resname
= resname
41 self
.default
= default
45 oldrh
= Res
.CurResFile()
47 rh
= Res
.FSpOpenResFile(self
.fss
, READ
)
49 self
.data
= self
.default
.load()
53 handle
= Res
.Get1NamedResource(self
.resid
, self
.resname
)
55 handle
= Res
.Get1Resource(self
.resid
, self
.resnum
)
57 self
.data
= self
.default
.load()
60 print 'Loaded', (self
.resid
, self
.resnum
, self
.resname
), 'from', self
.fss
.as_pathname()
61 self
.data
= handle
.data
67 if self
.data
is None or self
.data
!= data
:
68 oldrh
= Res
.CurResFile()
69 rh
= Res
.FSpOpenResFile(self
.fss
, READWRITE
)
71 handle
= Res
.Get1Resource(self
.resid
, self
.resnum
)
73 handle
= Res
.Resource(data
)
74 handle
.AddResource(self
.resid
, self
.resnum
, '')
76 print 'Added', (self
.resid
, self
.resnum
), 'to', self
.fss
.as_pathname()
79 handle
.ChangedResource()
81 print 'Changed', (self
.resid
, self
.resnum
), 'in', self
.fss
.as_pathname()
85 def delete(self
, deep
=0):
87 print 'Deleting in', self
.fss
.as_pathname(), `self
.data`
, deep
88 oldrh
= Res
.CurResFile()
89 rh
= Res
.FSpOpenResFile(self
.fss
, READWRITE
)
91 handle
= Res
.Get1Resource(self
.resid
, self
.resnum
)
94 if debug
: print 'deep in', self
.default
95 self
.default
.delete(1)
97 handle
.RemoveResource()
99 print 'Deleted', (self
.resid
, self
.resnum
), 'from', self
.fss
.as_pathname()
102 Res
.UseResFile(oldrh
)
105 def __init__(self
, resid
, resnum
=None, resname
=None, default
=_defaultdefault
):
108 self
.resname
= resname
109 self
.default
= default
115 handle
= Res
.GetNamedResource(self
.resid
, self
.resname
)
117 handle
= Res
.GetResource(self
.resid
, self
.resnum
)
119 self
.data
= self
.default
.load()
121 self
.data
= handle
.data
124 def save(self
, data
):
125 raise Error
, "Cannot save AnyResLoader preferences"
127 def delete(self
, deep
=0):
128 raise Error
, "Cannot delete AnyResLoader preferences"
131 def __init__(self
, format
, loader
):
136 data
= self
.loader
.load()
137 return struct
.unpack(self
.format
, data
)
139 def save(self
, data
):
140 data
= apply(struct
.pack
, (self
.format
,)+data
)
141 self
.loader
.save(data
)
143 def delete(self
, deep
=0):
144 self
.loader
.delete(deep
)
147 def __init__(self
, loader
):
151 data
= self
.loader
.load()
155 def save(self
, data
):
157 raise Error
, "String too big for pascal-style"
158 self
.loader
.save(chr(len(data
))+data
)
160 def delete(self
, deep
=0):
161 self
.loader
.delete(deep
)
163 class VersionLoader(StructLoader
):
166 data
= self
.loader
.load()
168 print 'Versionloader:', `data`
170 rv
= struct
.unpack(self
.format
, data
)
171 rv
= self
.versioncheck(rv
)
173 except (struct
.error
, Error
):
176 def versioncheck(self
, data
):
180 def __init__(self
, loader
):
184 data
= self
.loader
.load()
185 num
, = struct
.unpack('h', data
[:2])
189 strlen
= ord(data
[0])
190 if strlen
< 0: strlen
= strlen
+ 256
191 str = data
[1:strlen
+1]
192 data
= data
[strlen
+1:]
196 def save(self
, list):
197 rv
= struct
.pack('h', len(list))
199 rv
= rv
+ chr(len(str)) + str
202 def delete(self
, deep
=0):
203 self
.loader
.delete(deep
)
205 def preferencefile(filename
, creator
=None, type=None):
206 create
= creator
!= None and type != None
207 vrefnum
, dirid
= macfs
.FindFolder(MACFS
.kOnSystemDisk
, 'pref', create
)
208 fss
= macfs
.FSSpec((vrefnum
, dirid
, ":Python:" + filename
))
209 oldrf
= Res
.CurResFile()
212 rh
= Res
.FSpOpenResFile(fss
, READ
)
214 Res
.FSpCreateResFile(fss
, creator
, type, MACFS
.smAllScripts
)
217 Res
.UseResFile(oldrf
)