Commit e9956c49 authored by Paul Prescod's avatar Paul Prescod

Added docstrings

parent 4547bea3
"""
Windows registry support.
openKey( keyname )
open existing key object
>>> key=openKey( r"HKLM\HARDWARE\DESCRIPTION\System" )
createKey( keyname )
create a key if it doesn't already exist
>>> key=createKey( r"HKLM\SOFTWARE\Python\Test" )
deleteKey( keyname )
delete a key if it exists
Note: deleteKey may not be recursive on all platforms.
>>> key=createKey( r"HKLM\SOFTWARE\Python\Test" )
RemoteKey( machine, top_level_key ):
open a key on another machine.
You can use the returned key as a basis for opens, creates and deletes
on the other machine.
>>> key=RemoteKey( "somemachine", "HKLM" )
For information on the key API, open a key and look at its docstring.
"""
import _winreg import _winreg
import sys import sys
import exceptions import exceptions
...@@ -6,12 +37,14 @@ from types import * ...@@ -6,12 +37,14 @@ from types import *
import string import string
class RegType: class RegType:
"Represents one of the types that can go into the registry"
def __init__( self, msname, friendlyname ): def __init__( self, msname, friendlyname ):
self.msname=msname self.msname=msname
self.friendlyname=friendlyname self.friendlyname=friendlyname
self.intval=getattr( _winreg, msname ) self.intval=getattr( _winreg, msname )
def __repr__( self ): def __repr__( self ):
"Return a useful representation of the type object"
return "<RegType %d: %s %s>" % \ return "<RegType %d: %s %s>" % \
(self.intval, self.msname, self.friendlyname ) (self.intval, self.msname, self.friendlyname )
...@@ -49,20 +82,24 @@ for constant in _typeConstants.values(): ...@@ -49,20 +82,24 @@ for constant in _typeConstants.values():
regtypes[constant.msname]=constant regtypes[constant.msname]=constant
class _DictBase: class _DictBase:
"Base class for dictionary-type objects"
def __init__( self, key ): def __init__( self, key ):
self.key=key self.key=key
def clear( self ): def clear( self ):
"Clear the list of keys/data values, as in dictionaries"
keys=list( self.keys() ) keys=list( self.keys() )
map( self.__delitem__, keys ) map( self.__delitem__, keys )
def get( self, item, defaultVal=None ): def get( self, item, defaultVal=None ):
"Get a key/value by name or index"
try: try:
return self.__getitem__( item ) return self.__getitem__( item )
except (IndexError, EnvironmentError, WindowsError): except (IndexError, EnvironmentError, WindowsError):
return defaultVal return defaultVal
def has_key( self, item ): def has_key( self, item ):
"Check if a key/data value with a particular name exists"
try: try:
self.__getitem__( item ) self.__getitem__( item )
return 1 return 1
...@@ -70,6 +107,7 @@ class _DictBase: ...@@ -70,6 +107,7 @@ class _DictBase:
return 0 return 0
def keys( self ): def keys( self ):
"Get a list of key/data value names"
keys=[] keys=[]
try: try:
for i in xrange( 0, sys.maxint ): for i in xrange( 0, sys.maxint ):
...@@ -80,18 +118,21 @@ class _DictBase: ...@@ -80,18 +118,21 @@ class _DictBase:
return keys return keys
def values( self ): def values( self ):
"Get a list of key objects or data values"
values=[] # map() doesn't use the IndexError semantics... values=[] # map() doesn't use the IndexError semantics...
for i in self: for i in self:
values.append( i ) values.append( i )
return values return values
def items( self ): def items( self ):
"Get pairs of keyname/key object or valuename/value data"
return map( None, self.keys(), self.values() ) return map( None, self.keys(), self.values() )
def __len__( self ): def __len__( self ):
return len( self.keys() ) return len( self.keys() )
def _getName( item, nameFromNum ): def _getName( item, nameFromNum ):
"Helper function -- don't use it directly"
if type( item ) == IntType: if type( item ) == IntType:
try: try:
keyname = nameFromNum( item ) keyname = nameFromNum( item )
...@@ -107,6 +148,7 @@ def _getName( item, nameFromNum ): ...@@ -107,6 +148,7 @@ def _getName( item, nameFromNum ):
class RegValuesDict( _DictBase ): class RegValuesDict( _DictBase ):
"A dictionary of registry data values"
def _nameFromNum( self, i ): def _nameFromNum( self, i ):
return self.key._nameFromNum( i ) return self.key._nameFromNum( i )
...@@ -124,9 +166,9 @@ class RegValuesDict( _DictBase ): ...@@ -124,9 +166,9 @@ class RegValuesDict( _DictBase ):
def __delitem__( self, item ): def __delitem__( self, item ):
valname=_getName( item, self._nameFromNum ) valname=_getName( item, self._nameFromNum )
self.key.deleteValue( valname ) self.key.deleteValue( valname )
class RegKeysDict( _DictBase ): class RegKeysDict( _DictBase ):
"A dictionary of registry keys"
def _nameFromNum( self, item ): def _nameFromNum( self, item ):
return _winreg.EnumKey( self.key.handle, item ) return _winreg.EnumKey( self.key.handle, item )
...@@ -139,6 +181,7 @@ class RegKeysDict( _DictBase ): ...@@ -139,6 +181,7 @@ class RegKeysDict( _DictBase ):
self.key.deleteSubkey( keyname ) self.key.deleteSubkey( keyname )
def openKey( keyname, samFlags=None ): def openKey( keyname, samFlags=None ):
"Open a key by name"
lst=string.split( keyname, "\\", 1 ) lst=string.split( keyname, "\\", 1 )
if len( lst )==2: if len( lst )==2:
hivename,path=lst hivename,path=lst
...@@ -161,49 +204,61 @@ def deleteKey( keyname ): ...@@ -161,49 +204,61 @@ def deleteKey( keyname ):
class RegKey: class RegKey:
"A registry key object"
def __init__( self, name, handle=None ):
self.name=name
self.handle=handle
def _nameFromNum( self, item ): def _nameFromNum( self, item ):
"internal"
(name,data,datatype)=_winreg.EnumValue( self.handle, item ) (name,data,datatype)=_winreg.EnumValue( self.handle, item )
return name return name
def __nonzero__(self): def __nonzero__(self):
"Is the key open?"
if self.handle: if self.handle:
return 1 return 1
else: else:
return 0 return 0
def __cmp__ (self, other ): def __cmp__ (self, other ):
"Compare two keys for equality"
if hasattr( other, "handle" ) and hasattr( other, "name" ): if hasattr( other, "handle" ) and hasattr( other, "name" ):
return cmp( self.name, other.name ) return cmp( self.name, other.name )
else: else:
return cmp( self.handle, other ) return cmp( self.handle, other )
def __init__( self, name, handle=None ):
self.name=name
self.handle=handle
def __repr__( self ): def __repr__( self ):
return "<Windows RegKey: %s>"% self.name return "<Windows RegKey: %s>"% self.name
def close(self ): def close(self ):
"Close the key"
return _winreg.CloseKey( self.handle ) return _winreg.CloseKey( self.handle )
def getSubkeyNames( self ): def getSubkeyNames( self ):
"Get a list of subkey names"
return self.getSubkeys().keys() return self.getSubkeys().keys()
def getValueNames( self ): def getValueNames( self ):
"Get a list of value names"
return self.getValues().keys() return self.getValues().keys()
def deleteSubkey( self, subkey ): def deleteSubkey( self, subkey ):
"Delete a subkey by name"
return _winreg.DeleteKey( self.handle, subkey ) return _winreg.DeleteKey( self.handle, subkey )
def deleteValue( self, valname ): def deleteValue( self, valname ):
"Delete a value by name"
return _winreg.DeleteValue( self.handle, valname ) return _winreg.DeleteValue( self.handle, valname )
def createSubkey( self, keyname ): def createSubkey( self, keyname ):
"Create a subkey by name"
handle=_winreg.CreateKey( self.handle, keyname ) handle=_winreg.CreateKey( self.handle, keyname )
return RegKey( self.name+"\\"+keyname, handle) return RegKey( self.name+"\\"+keyname, handle)
def openSubkey( self, keyname, samFlags=None ): def openSubkey( self, keyname, samFlags=None ):
"Open a named subkey"
if samFlags: if samFlags:
handle=_winreg.OpenKey( self.handle, keyname, 0, samFlags ) handle=_winreg.OpenKey( self.handle, keyname, 0, samFlags )
else: else:
...@@ -211,12 +266,15 @@ class RegKey: ...@@ -211,12 +266,15 @@ class RegKey:
return RegKey( self.name+"\\"+keyname, handle ) return RegKey( self.name+"\\"+keyname, handle )
def getSubkeys( self ): def getSubkeys( self ):
"Get a dictionary-like mapping of subkeys"
return RegKeysDict( self ) return RegKeysDict( self )
def getValues( self ): def getValues( self ):
"Get a dictionary-like mapping of data values"
return RegValuesDict( self ) return RegValuesDict( self )
def getValueNameDataAndType( self, valname ): def getValueNameDataAndType( self, valname ):
"Get a data value's name, data and type all at one time"
try: try:
if type( valname )==IntType: if type( valname )==IntType:
(valname,data,datatype)=_winreg.EnumValue( self.handle, valname ) (valname,data,datatype)=_winreg.EnumValue( self.handle, valname )
...@@ -233,10 +291,12 @@ class RegKey: ...@@ -233,10 +291,12 @@ class RegKey:
return (valname, data, _typeConstants[datatype] ) return (valname, data, _typeConstants[datatype] )
def getValueData( self, valname ): def getValueData( self, valname ):
"Get a data value's data."
name, data, type=self.getValueNameDataAndType( valname ) name, data, type=self.getValueNameDataAndType( valname )
return data return data
def setValue( self, valname, data, regtype=None ): def setValue( self, valname, data, regtype=None ):
"Set a data value's data (and optionally type)"
if regtype: if regtype:
typeint=regtype.intval typeint=regtype.intval
else: else:
...@@ -250,16 +310,22 @@ class RegKey: ...@@ -250,16 +310,22 @@ class RegKey:
_winreg.SetValueEx( self.handle, valname, 0, typeint, data ) _winreg.SetValueEx( self.handle, valname, 0, typeint, data )
def flush(self ): def flush(self ):
"Make sure that all changes are written to the registry. "
"Only use this if you know what you are doing. "
"It isn't usually needed."
_winreg.FlushKey( self.keyobbj ) _winreg.FlushKey( self.keyobbj )
def save( self, filename ): def save( self, filename ):
"Save a key to a filename"
_winreg.SaveKey( self.keyobj, filename ) _winreg.SaveKey( self.keyobj, filename )
def load( self, subkey, filename ): def load( self, subkey, filename ):
"Load a key from a filename"
return _winreg.RegLoadKey( self.handle, subkey, filename ) return _winreg.RegLoadKey( self.handle, subkey, filename )
class RemoteKey( RegKey ): class RemoteKey( RegKey ):
"Open a key on a remote machine"
def __init__( self, machine, topLevelKey ): def __init__( self, machine, topLevelKey ):
assert topLevelKey in _hivenames assert topLevelKey in _hivenames
self.handle = _winreg.ConnectRegistry( machine, parentKey ) self.handle = _winreg.ConnectRegistry( machine, parentKey )
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment