blob: 8c428cdad6686c70b14f5ad1e6a16aa84ba019a2 [file] [log] [blame]
Fred Drakeb6e54ad2000-06-30 20:31:39 +00001import _winreg
Fred Drake69218172000-06-29 16:53:06 +00002import sys
3import exceptions
4import array
5from types import *
6import string
7
8class RegType:
9 def __init__( self, msname, friendlyname ):
10 self.msname=msname
11 self.friendlyname=friendlyname
Fred Drakeb6e54ad2000-06-30 20:31:39 +000012 self.intval=getattr( _winreg, msname )
Fred Drake69218172000-06-29 16:53:06 +000013
14 def __repr__( self ):
15 return "<RegType %d: %s %s>" % \
16 (self.intval, self.msname, self.friendlyname )
17
18_typeConstants={
Fred Drakeb6e54ad2000-06-30 20:31:39 +000019 _winreg.REG_NONE:
Fred Drake69218172000-06-29 16:53:06 +000020 RegType( "REG_NONE", "None" ),
Fred Drakeb6e54ad2000-06-30 20:31:39 +000021 _winreg.REG_SZ:
Fred Drake69218172000-06-29 16:53:06 +000022 RegType( "REG_SZ", "String" ),
Fred Drakeb6e54ad2000-06-30 20:31:39 +000023 _winreg.REG_EXPAND_SZ:
Fred Drake69218172000-06-29 16:53:06 +000024 RegType("REG_EXPAND_SZ", "Expandable Template String" ),
Fred Drakeb6e54ad2000-06-30 20:31:39 +000025 _winreg.REG_BINARY:
Fred Drake69218172000-06-29 16:53:06 +000026 RegType("REG_BINARY", "Binary Data"),
Fred Drakeb6e54ad2000-06-30 20:31:39 +000027 _winreg.REG_DWORD :
Fred Drake69218172000-06-29 16:53:06 +000028 RegType("REG_DWORD", "Integer" ),
Fred Drakeb6e54ad2000-06-30 20:31:39 +000029# _winreg.REG_DWORD_LITTLE_ENDIAN :
Fred Drake69218172000-06-29 16:53:06 +000030# RegType("REG_DWORD_LITTLE_ENDIAN", "Integer"),
Fred Drakeb6e54ad2000-06-30 20:31:39 +000031 _winreg.REG_DWORD_BIG_ENDIAN :
Fred Drake69218172000-06-29 16:53:06 +000032 RegType("REG_DWORD_BIG_ENDIAN", "Big Endian Integer"),
Fred Drakeb6e54ad2000-06-30 20:31:39 +000033 _winreg.REG_LINK :
Fred Drake69218172000-06-29 16:53:06 +000034 RegType("REG_LINK", "Link"),
Fred Drakeb6e54ad2000-06-30 20:31:39 +000035 _winreg.REG_MULTI_SZ :
Fred Drake69218172000-06-29 16:53:06 +000036 RegType("REG_MULTI_SZ", "List of Strings"),
Fred Drakeb6e54ad2000-06-30 20:31:39 +000037 _winreg.REG_RESOURCE_LIST :
Fred Drake69218172000-06-29 16:53:06 +000038 RegType("REG_RESOURCE_LIST", "Resource List"),
Fred Drakeb6e54ad2000-06-30 20:31:39 +000039 _winreg.REG_FULL_RESOURCE_DESCRIPTOR :
Fred Drake69218172000-06-29 16:53:06 +000040 RegType( "REG_FULL_RESOURCE_DESCRIPTOR",
41 "Full Resource Descriptor" ),
Fred Drakeb6e54ad2000-06-30 20:31:39 +000042 _winreg.REG_RESOURCE_REQUIREMENTS_LIST:
Fred Drake69218172000-06-29 16:53:06 +000043 RegType( "REG_RESOURCE_REQUIREMENTS_LIST",
44 "Resource Requirements List" )
45}
46
47regtypes={}
48for constant in _typeConstants.values():
49 regtypes[constant.msname]=constant
50
51class _DictBase:
52 def __init__( self, key ):
53 self.key=key
54
55 def clear( self ):
56 keys=list( self.keys() )
57 map( self.__delitem__, keys )
58
59 def get( self, item, defaultVal=None ):
60 try:
61 return self.__getitem__( item )
62 except (IndexError, EnvironmentError, WindowsError):
63 return defaultVal
64
65 def has_key( self, item ):
66 try:
67 self.__getitem__( item )
68 return 1
69 except (IndexError, EnvironmentError, WindowsError):
70 return 0
71
72 def keys( self ):
73 keys=[]
74 try:
75 for i in xrange( 0, sys.maxint ):
76 keyname = self._nameFromNum( i )
77 keys.append( keyname )
78 except (IndexError, EnvironmentError, WindowsError):
79 pass
80 return keys
81
82 def values( self ):
83 values=[] # map() doesn't use the IndexError semantics...
84 for i in self:
85 values.append( i )
86 return values
87
88 def items( self ):
89 return map( None, self.keys(), self.values() )
90
91 def __len__( self ):
92 return len( self.keys() )
93
94def _getName( item, nameFromNum ):
95 if type( item ) == IntType:
96 try:
97 keyname = nameFromNum( item )
98 except (WindowsError, EnvironmentError):
99 raise IndexError, item
100
101 elif type( item )==StringType:
102 keyname=item
103 else:
104 raise exceptions.TypeError, \
105 "Requires integer index or string key name"
106 return keyname
107
108
109class RegValuesDict( _DictBase ):
110 def _nameFromNum( self, i ):
111 return self.key._nameFromNum( i )
112
113 def __getitem__( self, item ):
114 return self.key.getValueNameDataAndType( item )
115
116 def __setitem__( self, name, val):
117 if type( val )==TupleType:
118 data, datatype=val
119 assert isinstance( datatype, RegType )
120 self.key.setValue( name, data, datatype )
121 else:
122 self.key.setValue( name, val )
123
124 def __delitem__( self, item ):
125 valname=_getName( item, self._nameFromNum )
126 self.key.deleteValue( valname )
127
128
129class RegKeysDict( _DictBase ):
130 def _nameFromNum( self, item ):
Fred Drakeb6e54ad2000-06-30 20:31:39 +0000131 return _winreg.EnumKey( self.key.handle, item )
Fred Drake69218172000-06-29 16:53:06 +0000132
133 def __getitem__( self, item ):
134 keyname=_getName( item, self._nameFromNum )
135 return self.key.openSubkey( keyname )
136
137 def __delitem__( self, item ):
138 keyname=_getName( item, self._nameFromNum )
139 self.key.deleteSubkey( keyname )
140
141def openKey( keyname, samFlags=None ):
142 lst=string.split( keyname, "\\", 1 )
143 if len( lst )==2:
144 hivename,path=lst
145 return hives[hivename].openSubkey( path )
146 else:
147 hivename=lst[0]
148 return hives[hivename]
149
150def createKey( keyname ):
151 lst=string.split( keyname, "\\", 1 )
152 assert len( lst )==2
153 hivename,path=lst
154 return hives[hivename].createSubkey( path )
155
156def deleteKey( keyname ):
157 lst=string.split( keyname, "\\", 1 )
158 assert len( lst )==2
159 hivename,path=lst
160 return hives[hivename].deleteSubkey( path )
161
162
163class RegKey:
164 def _nameFromNum( self, item ):
Fred Drakeb6e54ad2000-06-30 20:31:39 +0000165 (name,data,datatype)=_winreg.EnumValue( self.handle, item )
Fred Drake69218172000-06-29 16:53:06 +0000166 return name
167
168 def __nonzero__(self):
169 if self.handle:
170 return 1
171 else:
172 return 0
173
174 def __cmp__ (self, other ):
175 if hasattr( other, "handle" ) and hasattr( other, "name" ):
176 return cmp( self.name, other.name )
177 else:
178 return cmp( self.handle, other )
179
180 def __init__( self, name, handle=None ):
181 self.name=name
182 self.handle=handle
183
184 def __repr__( self ):
185 return "<Windows RegKey: %s>"% self.name
186
187 def close(self ):
Fred Drakeb6e54ad2000-06-30 20:31:39 +0000188 return _winreg.CloseKey( self.handle )
Fred Drake69218172000-06-29 16:53:06 +0000189
190 def getSubkeyNames( self ):
191 return self.getSubkeys().keys()
192
193 def getValueNames( self ):
194 return self.getValues().keys()
195
196 def deleteSubkey( self, subkey ):
Fred Drakeb6e54ad2000-06-30 20:31:39 +0000197 return _winreg.DeleteKey( self.handle, subkey )
Fred Drake69218172000-06-29 16:53:06 +0000198
199 def deleteValue( self, valname ):
Fred Drakeb6e54ad2000-06-30 20:31:39 +0000200 return _winreg.DeleteValue( self.handle, valname )
Fred Drake69218172000-06-29 16:53:06 +0000201
202 def createSubkey( self, keyname ):
Fred Drakeb6e54ad2000-06-30 20:31:39 +0000203 handle=_winreg.CreateKey( self.handle, keyname )
Fred Drake69218172000-06-29 16:53:06 +0000204 return RegKey( self.name+"\\"+keyname, handle)
205
206 def openSubkey( self, keyname, samFlags=None ):
207 if samFlags:
Fred Drakeb6e54ad2000-06-30 20:31:39 +0000208 handle=_winreg.OpenKey( self.handle, keyname, 0, samFlags )
Fred Drake69218172000-06-29 16:53:06 +0000209 else:
Fred Drakeb6e54ad2000-06-30 20:31:39 +0000210 handle=_winreg.OpenKey( self.handle, keyname, 0 )
Fred Drake69218172000-06-29 16:53:06 +0000211 return RegKey( self.name+"\\"+keyname, handle )
212
213 def getSubkeys( self ):
214 return RegKeysDict( self )
215
216 def getValues( self ):
217 return RegValuesDict( self )
218
219 def getValueNameDataAndType( self, valname ):
220 try:
221 if type( valname )==IntType:
Fred Drakeb6e54ad2000-06-30 20:31:39 +0000222 (valname,data,datatype)=_winreg.EnumValue( self.handle, valname )
Fred Drake69218172000-06-29 16:53:06 +0000223 else:
224 keyname=_getName( valname, self._nameFromNum )
Fred Drakeb6e54ad2000-06-30 20:31:39 +0000225 (data,datatype)=_winreg.QueryValueEx( self.handle, keyname )
Fred Drake69218172000-06-29 16:53:06 +0000226 except (WindowsError, EnvironmentError):
227 raise IndexError, valname
228
Fred Drakeb6e54ad2000-06-30 20:31:39 +0000229 if datatype==_winreg.REG_BINARY:
Fred Drake69218172000-06-29 16:53:06 +0000230 # use arrays for binary data
231 data=array.array( 'c', data )
232
233 return (valname, data, _typeConstants[datatype] )
234
235 def getValueData( self, valname ):
236 name, data, type=self.getValueNameDataAndType( valname )
237 return data
238
239 def setValue( self, valname, data, regtype=None ):
240 if regtype:
241 typeint=regtype.intval
242 else:
243 if type( data )==StringType:
Fred Drakeb6e54ad2000-06-30 20:31:39 +0000244 typeint=_winreg.REG_SZ
Fred Drake69218172000-06-29 16:53:06 +0000245 elif type( data )==IntType:
Fred Drakeb6e54ad2000-06-30 20:31:39 +0000246 typeint=_winreg.REG_DWORD
Fred Drake69218172000-06-29 16:53:06 +0000247 elif type( data )==array.ArrayType:
Fred Drakeb6e54ad2000-06-30 20:31:39 +0000248 typeint=_winreg.REG_BINARY
Fred Drake69218172000-06-29 16:53:06 +0000249 data=data.tostring()
Fred Drakeb6e54ad2000-06-30 20:31:39 +0000250 _winreg.SetValueEx( self.handle, valname, 0, typeint, data )
Fred Drake69218172000-06-29 16:53:06 +0000251
252 def flush(self ):
Fred Drakeb6e54ad2000-06-30 20:31:39 +0000253 _winreg.FlushKey( self.keyobbj )
Fred Drake69218172000-06-29 16:53:06 +0000254
255 def save( self, filename ):
Fred Drakeb6e54ad2000-06-30 20:31:39 +0000256 _winreg.SaveKey( self.keyobj, filename )
Fred Drake69218172000-06-29 16:53:06 +0000257
258 def load( self, subkey, filename ):
Fred Drakeb6e54ad2000-06-30 20:31:39 +0000259 return _winreg.RegLoadKey( self.handle, subkey, filename )
Fred Drake69218172000-06-29 16:53:06 +0000260
261
262class RemoteKey( RegKey ):
263 def __init__( self, machine, topLevelKey ):
264 assert topLevelKey in _hivenames
Fred Drakeb6e54ad2000-06-30 20:31:39 +0000265 self.handle = _winreg.ConnectRegistry( machine, parentKey )
Fred Drake69218172000-06-29 16:53:06 +0000266 self.name=r"\\%s\%s" % (machine, topLevelKey )
267
268_hivenames = ["HKEY_CLASSES_ROOT","HKEY_CURRENT_USER","HKEY_LOCAL_MACHINE",
269 "HKEY_USERS","HKEY_CURRENT_CONFIG","HKEY_DYN_DATA",
270 "HKEY_PERFORMANCE_DATA"]
271hives={}
272for name in _hivenames:
Fred Drakeb6e54ad2000-06-30 20:31:39 +0000273 hives[name]=RegKey( name, getattr( _winreg, name ) )
Fred Drake69218172000-06-29 16:53:06 +0000274hives["HKLM"]=hives["HKEY_LOCAL_MACHINE"]
275hives["HKCR"]=hives["HKEY_CLASSES_ROOT"]
276hives["HKCU"]=hives["HKEY_CURRENT_USER"]
277
278_flagnames = ["KEY_ALL_ACCESS","KEY_CREATE_LINK", "KEY_CREATE_SUB_KEY",
279 "KEY_ENUMERATE_SUB_KEYS", "KEY_EXECUTE", "KEY_NOTIFY",
280 "KEY_QUERY_VALUE", "KEY_READ", "KEY_SET_VALUE"]
281flags={}
282for name in _flagnames:
Fred Drakeb6e54ad2000-06-30 20:31:39 +0000283 flags[name]=getattr( _winreg, name )
Fred Drake69218172000-06-29 16:53:06 +0000284
285_RegNotifyChangeKeyValueOptions=[ "REG_NOTIFY_CHANGE_ATTRIBUTES",
286 "REG_NOTIFY_CHANGE_SECURITY", "REG_NOTIFY_CHANGE_LAST_SET",
287 "REG_NOTIFY_CHANGE_NAME", "REG_LEGAL_CHANGE_FILTER" ]
288
289_RegRestoreKeyOptions=["REG_WHOLE_HIVE_VOLATILE",
290 "REG_NO_LAZY_FLUSH",
291 "REG_OPTION_VOLATILE",
292 "REG_REFRESH_HIVE",
293 "REG_OPTION_NON_VOLATILE",
294 "REG_OPTION_BACKUP_RESTORE" ]
295
296_RegCreateKeyExOptions=[
297 "REG_LEGAL_OPTION",
298 "REG_OPTION_RESERVED",
299 "REG_OPTION_VOLATILE",
300 "REG_OPTION_NON_VOLATILE",
301 "REG_OPTION_BACKUP_RESTORE",
302 "REG_CREATED_NEW_KEY",
303 "REG_OPENED_EXISTING_KEY",
304 "REG_OPTION_CREATE_LINK"]
305
306def test():
307 import testreg
308
309#unusednames=_RegNotifyChangeKeyValueOptions+_RegRestoreKeyOptions+_RegCreateKeyExOptions
310
311#typeConstantNames=map( lambda x: x.msname, typeConstants.values() )
312
313#allnames=_hivenames+_flagnames+typeConstantNames+unusednames
Fred Drakeb6e54ad2000-06-30 20:31:39 +0000314#winregnames=_winreg.__dict__.keys()
Fred Drake69218172000-06-29 16:53:06 +0000315#for name in winregnames:
316# if name not in allnames:
317# print name
318