\section{\module{_winreg} --
         Windows registry access}

\declaremodule[-winreg]{extension}{_winreg}
  \platform{Windows}
\modulesynopsis{Routines and objects for manipulating the Windows registry.}
\sectionauthor{Mark Hammond}{MarkH@ActiveState.com}

\versionadded{2.0}

These functions expose the Windows registry API to Python.  Instead of
using an integer as the registry handle, a handle object is used to
ensure that the handles are closed correctly, even if the programmer
neglects to explicitly close them.

This module exposes a very low-level interface to the Windows
registry; it is expected that in the future a new \code{winreg} 
module will be created offering a higher-level interface to the
registry API.

This module offers the following functions:


\begin{funcdesc}{CloseKey}{hkey}
 Closes a previously opened registry key.
 The hkey argument specifies a previously opened key.

 Note that if \var{hkey} is not closed using this method, (or the
 \method{handle.Close()} closed when the \var{hkey} object is 
 destroyed by Python.
\end{funcdesc}


\begin{funcdesc}{ConnectRegistry}{computer_name, key}
  Establishes a connection to a predefined registry handle on 
  another computer, and returns a \dfn{handle object}

 \var{computer_name} is the name of the remote computer, of the 
 form \samp{\e\e computername}.  If \code{None}, the local computer
 is used.
 
 \var{key} is the predefined handle to connect to.

 The return value is the handle of the opened key.
 If the function fails, an \exception{EnvironmentError} exception is 
 raised.
\end{funcdesc}


\begin{funcdesc}{CreateKey}{key, sub_key}
 Creates or opens the specified key, returning a \dfn{handle object}
 
 \var{key} is an already open key, or one of the predefined 
 \constant{HKEY_*} constants.
 
 \var{sub_key} is a string that names the key this method opens 
 or creates.
 
 If \var{key} is one of the predefined keys, \var{sub_key} may 
 be \code{None}. In that case, the handle returned is the same key handle 
 passed in to the function.

 If the key already exists, this function opens the existing key

 The return value is the handle of the opened key.
 If the function fails, an \exception{EnvironmentError} exception is 
 raised.
\end{funcdesc}

\begin{funcdesc}{DeleteKey}{key, sub_key}
 Deletes the specified key.

 \var{key} is an already open key, or any one of the predefined 
 \constant{HKEY_*} constants.
 
 \var{sub_key} is a string that must be a subkey of the key 
 identified by the \var{key} parameter.  This value must not be 
 \code{None}, and the key may not have subkeys.

 \emph{This method can not delete keys with subkeys.}

 If the method succeeds, the entire key, including all of its values,
 is removed.  If the method fails, an \exception{EnvironmentError} 
 exception is raised.
\end{funcdesc}


\begin{funcdesc}{DeleteValue}{key, value}
  Removes a named value from a registry key.
  
 \var{key} is an already open key, or one of the predefined 
 \constant{HKEY_*} constants.
  
 \var{value} is a string that identifies the value to remove.
\end{funcdesc}


\begin{funcdesc}{EnumKey}{key, index}
  Enumerates subkeys of an open registry key, returning a string.

 \var{key} is an already open key, or any one of the predefined 
 \constant{HKEY_*} constants.

 \var{index} is an integer that identifies the index of the key to 
 retrieve.

 The function retrieves the name of one subkey each time it 
 is called.  It is typically called repeatedly until an 
 \exception{EnvironmentError} exception 
 is raised, indicating, no more values are available.
\end{funcdesc}


\begin{funcdesc}{EnumValue}{key, index}
  Enumerates values of an open registry key, returning a tuple.
  
 \var{key} is an already open key, or any one of the predefined 
 \constant{HKEY_*} constants.
 
 \var{index} is an integer that identifies the index of the value 
 to retrieve.
 
 The function retrieves the name of one subkey each time it is 
 called. It is typically called repeatedly, until an 
 \exception{EnvironmentError} exception is raised, indicating 
 no more values.
 
 The result is a tuple of 3 items:

 \begin{tableii}{c|p{3in}}{code}{Index}{Meaning}
   \lineii{0}{A string that identifies the value name}
   \lineii{1}{An object that holds the value data, and whose
              type depends on the underlying registry type}
   \lineii{2}{An integer that identifies the type of the value data}
 \end{tableii}

\end{funcdesc}


\begin{funcdesc}{FlushKey}{key}
  Writes all the attributes of a key to the registry.

 \var{key} is an already open key, or one of the predefined 
 \constant{HKEY_*} constants.

 It is not necessary to call RegFlushKey to change a key.
 Registry changes are flushed to disk by the registry using its lazy 
 flusher.  Registry changes are also flushed to disk at system 
 shutdown.  Unlike \function{CloseKey()}, the \function{FlushKey()} method 
 returns only when all the data has been written to the registry.
 An application should only call \function{FlushKey()} if it requires absolute 
 certainty that registry changes are on disk.
 
 \emph{If you don't know whether a \function{FlushKey()} call is required, it 
 probably isn't.}
 
\end{funcdesc}


\begin{funcdesc}{RegLoadKey}{key, sub_key, file_name}
 Creates a subkey under the specified key and stores registration 
 information from a specified file into that subkey.

 \var{key} is an already open key, or any of the predefined
 \constant{HKEY_*} constants.
 
 \var{sub_key} is a string that identifies the sub_key to load
 
 \var {file_name} is the name of the file to load registry data from.
  This file must have been created with the \function{SaveKey()} function.
  Under the file allocation table (FAT) file system, the filename may not
  have an extension.

 A call to LoadKey() fails if the calling process does not have the
 \constant{SE_RESTORE_PRIVILEGE} privilege. Note that privileges
 are different than permissions - see the Win32 documentation for
 more details.

 If \var{key} is a handle returned by \function{ConnectRegistry()}, 
 then the path specified in \var{fileName} is relative to the 
 remote computer.

 The Win32 documentation implies \var{key} must be in the 
 \constant{HKEY_USER} or \constant{HKEY_LOCAL_MACHINE} tree.
 This may or may not be true.
\end{funcdesc}


\begin{funcdesc}{OpenKey}{key, sub_key\optional{, res\code{ = 0}}\optional{, sam\code{ = \constant{KEY_READ}}}}
  Opens the specified key, returning a \dfn{handle object}

 \var{key} is an already open key, or any one of the predefined
 \constant{HKEY_*} constants.

 \var{sub_key} is a string that identifies the sub_key to open
 
 \var{res} is a reserved integer, and must be zero.  The default is zero.
 
 \var{sam} is an integer that specifies an access mask that describes 
 the desired security access for the key.  Default is \constant{KEY_READ}
 
 The result is a new handle to the specified key
 
 If the function fails, \exception{EnvironmentError} is raised.
\end{funcdesc}


\begin{funcdesc}{OpenKeyEx}{}
  The functionality of \function{OpenKeyEx()} is provided via
  \function{OpenKey()}, by the use of default arguments.
\end{funcdesc}


\begin{funcdesc}{QueryInfoKey}{key}
 Returns information about a key, as a tuple.

 \var{key} is an already open key, or one of the predefined 
 \constant{HKEY_*} constants.

 The result is a tuple of 3 items:

 \begin{tableii}{c|p{3in}}{code}{Index}{Meaning}
   \lineii{0}{An integer giving the number of sub keys this key has.}
   \lineii{1}{An integer giving the number of values this key has.}
   \lineii{2}{A long integer giving when the key was last modified (if
              available) as 100's of nanoseconds since Jan 1, 1600.}
 \end{tableii}
\end{funcdesc}


\begin{funcdesc}{QueryValue}{key, sub_key}
 Retrieves the unnamed value for a key, as a string

 \var{key} is an already open key, or one of the predefined 
 \constant{HKEY_*} constants.

 \var{sub_key} is a string that holds the name of the subkey with which 
 the value is associated.  If this parameter is \code{None} or empty, the 
 function retrieves the value set by the \function{SetValue()} method 
 for the key identified by \var{key}.

 Values in the registry have name, type, and data components. This 
 method retrieves the data for a key's first value that has a NULL name.
 But the underlying API call doesn't return the type, Lame Lame Lame,
 DO NOT USE THIS!!!
\end{funcdesc}


\begin{funcdesc}{QueryValueEx}{key, value_name}
  Retrieves the type and data for a specified value name associated with 
  an open registry key.
  
 \var{key} is an already open key, or one of the predefined 
 \constant{HKEY_*} constants.

 \var{value_name} is a string indicating the value to query.

 The result is a tuple of 2 items:

 \begin{tableii}{c|p{3in}}{code}{Index}{Meaning}
   \lineii{0}{The value of the registry item.}
   \lineii{1}{An integer giving the registry type for this value.}
 \end{tableii}
\end{funcdesc}


\begin{funcdesc}{SaveKey}{key, file_name}
  Saves the specified key, and all its subkeys to the specified file.

 \var{key} is an already open key, or one of the predefined 
 \constant{HKEY_*} constants.

 \var{file_name} is the name of the file to save registry data to.
  This file cannot already exist. If this filename includes an extension,
  it cannot be used on file allocation table (FAT) file systems by the
  \method{LoadKey()}, \method{ReplaceKey()} or 
  \method{RestoreKey()} methods.

 If \var{key} represents a key on a remote computer, the path 
 described by \var{file_name} is relative to the remote computer.
 The caller of this method must possess the \constant{SeBackupPrivilege} 
 security privilege.  Note that privileges are different than permissions 
 - see the Win32 documentation for more details.
 
 This function passes NULL for \var{security_attributes} to the API.
\end{funcdesc}


\begin{funcdesc}{SetValue}{key, sub_key, type, value}
 Associates a value with a specified key.
 
 \var{key} is an already open key, or one of the predefined 
 \constant{HKEY_*} constants.

 \var{sub_key} is a string that names the subkey with which the value 
 is associated.
 
 \var{type} is an integer that specifies the type of the data.
 Currently this must be \constant{REG_SZ}, meaning only strings are
 supported.  Use the \function{SetValueEx()} function for support for
 other data types.
 
 \var{value} is a string that specifies the new value.

 If the key specified by the \var{sub_key} parameter does not exist,
 the SetValue function creates it.

 Value lengths are limited by available memory. Long values (more than
 2048 bytes) should be stored as files with the filenames stored in
 the configuration registry.  This helps the registry perform
 efficiently.

 The key identified by the \var{key} parameter must have been 
 opened with \constant{KEY_SET_VALUE} access.
\end{funcdesc}


\begin{funcdesc}{SetValueEx}{key, value_name, reserved, type, value}
 Stores data in the value field of an open registry key.

 \var{key} is an already open key, or one of the predefined 
 \constant{HKEY_*} constants.

 \var{sub_key} is a string that names the subkey with which the 
 value is associated.

 \var{type} is an integer that specifies the type of the data.  
 This should be one of the following constants defined in this module:

 \begin{tableii}{l|p{3in}}{constant}{Constant}{Meaning}
   \lineii{REG_BINARY}{Binary data in any form.}
   \lineii{REG_DWORD}{A 32-bit number.}
   \lineii{REG_DWORD_LITTLE_ENDIAN}{A 32-bit number in little-endian format.}
   \lineii{REG_DWORD_BIG_ENDIAN}{A 32-bit number in big-endian format.}
   \lineii{REG_EXPAND_SZ}{Null-terminated string containing references
                          to environment variables (\samp{\%PATH\%}).}
   \lineii{REG_LINK}{A Unicode symbolic link.}
   \lineii{REG_MULTI_SZ}{A sequence of null-terminated strings, 
	terminated by two null characters.  (Python handles 
	this termination automatically.)}
   \lineii{REG_NONE}{No defined value type.}
   \lineii{REG_RESOURCE_LIST}{A device-driver resource list.}
   \lineii{REG_SZ}{A null-terminated string.}
 \end{tableii}

 \var{reserved} can be anything - zero is always passed to the 
 API.

 \var{value} is a string that specifies the new value.

 This method can also set additional value and type information for the
 specified key.  The key identified by the key parameter must have been
 opened with \constant{KEY_SET_VALUE} access.

 To open the key, use the \function{CreateKeyEx()} or 
 \function{OpenKey()} methods.

 Value lengths are limited by available memory. Long values (more than
 2048 bytes) should be stored as files with the filenames stored in
 the configuration registry.  This helps the registry perform efficiently.
\end{funcdesc}



\subsection{Registry Handle Objects \label{handle-object}}

 This object wraps a Windows HKEY object, automatically closing it when
 the object is destroyed.  To guarantee cleanup, you can call either
 the \method{Close()} method on the object, or the 
 \function{CloseKey()} function.

 All registry functions in this module return one of these objects.

 All registry functions in this module which accept a handle object 
 also accept an integer, however, use of the handle object is 
 encouraged.
 
 Handle objects provide semantics for \method{__nonzero__()} - thus
\begin{verbatim}
    if handle:
        print "Yes"
\end{verbatim}
 will print \code{Yes} if the handle is currently valid (has not been
 closed or detached).

 The object also support comparison semantics, so handle
 objects will compare true if they both reference the same
 underlying Windows handle value.

 Handle objects can be converted to an integer (eg, using the
 builtin \function{int()} function, in which case the underlying
 Windows handle value is returned.  You can also use the 
 \method{Detach()} method to return the integer handle, and
 also disconnect the Windows handle from the handle object.

\begin{methoddesc}{Close}{}
  Closes the underlying Windows handle.

  If the handle is already closed, no error is raised.
\end{methoddesc}


\begin{methoddesc}{Detach}{}
  Detaches the Windows handle from the handle object.

 The result is an integer (or long on 64 bit Windows) that holds
 the value of the handle before it is detached.  If the
 handle is already detached or closed, this will return zero.

 After calling this function, the handle is effectively invalidated,
 but the handle is not closed.  You would call this function when 
 you need the underlying Win32 handle to exist beyond the lifetime 
 of the handle object.
\end{methoddesc}
