\section{\module{msilib} ---
         Read and write Microsoft Installer files}

\declaremodule{standard}{msilib}
  \platform{Windows}
\modulesynopsis{Creation of Microsoft Installer files, and CAB files.}
\moduleauthor{Martin v. L\"owis}{martin@v.loewis.de}
\sectionauthor{Martin v. L\"owis}{martin@v.loewis.de}

\index{msi}

\versionadded{2.5}

The \module{msilib} supports the creation of Microsoft Installer
(\code{.msi}) files.  Because these files often contain an embedded
``cabinet'' file (\code{.cab}), it also exposes an API to create
CAB files. Support for reading \code{.cab} files is currently not
implemented; read support for the \code{.msi} database is possible.

This package aims to provide complete access to all tables in an
\code{.msi} file, therefore, it is a fairly low-level API. Two
primary applications of this package are the \module{distutils}
command \code{bdist_msi}, and the creation of Python installer
package itself (although that currently uses a different version
of \code{msilib}).

The package contents can be roughly split into four parts:
low-level CAB routines, low-level MSI routines, higher-level
MSI routines, and standard table structures.

\begin{funcdesc}{FCICreate}{cabname, files}
  Create a new CAB file named \var{cabname}. \var{files} must
  be a list of tuples, each containing the name of the file on
  disk, and the name of the file inside the CAB file.

  The files are added to the CAB file in the order they appear
  in the list. All files are added into a single CAB file,
  using the MSZIP compression algorithm.

  Callbacks to Python for the various steps of MSI creation
  are currently not exposed.
\end{funcdesc}

\begin{funcdesc}{UUIDCreate}{}
  Return the string representation of a new unique identifier.
  This wraps the Windows API functions \cfunction{UuidCreate} and
  \cfunction{UuidToString}.
\end{funcdesc}

\begin{funcdesc}{OpenDatabase}{path, persist}
  Return a new database object by calling MsiOpenDatabase.  
  \var{path} is the file name of the
  MSI file; \var{persist} can be one of the constants 
  \code{MSIDBOPEN_CREATEDIRECT}, \code{MSIDBOPEN_CREATE},
  \code{MSIDBOPEN_DIRECT}, \code{MSIDBOPEN_READONLY}, or
  \code{MSIDBOPEN_TRANSACT}, and may include the flag
  \code{MSIDBOPEN_PATCHFILE}. See the Microsoft documentation for
  the meaning of these flags; depending on the flags,
  an existing database is opened, or a new one created.
\end{funcdesc}

\begin{funcdesc}{CreateRecord}{count}
  Return a new record object by calling \cfunction{MSICreateRecord}.
  \var{count} is the number of fields of the record.
\end{funcdesc}

\begin{funcdesc}{init_database}{name, schema, ProductName, ProductCode, ProductVersion, Manufacturer}
  Create and return a new database \var{name}, initialize it 
  with \var{schema},  and set the properties \var{ProductName},
  \var{ProductCode}, \var{ProductVersion}, and \var{Manufacturer}.

  \var{schema} must be a module object containing \code{tables} and
  \code{_Validation_records} attributes; typically,
  \module{msilib.schema} should be used.

  The database will contain just the schema and the validation
  records when this function returns.
\end{funcdesc}

\begin{funcdesc}{add_data}{database, records}
  Add all \var{records} to \var{database}.  \var{records} should
  be a list of tuples, each one containing all fields of a record
  according to the schema of the table.  For optional fields,
  \code{None} can be passed.

  Field values can be int or long numbers, strings, or instances
  of the Binary class.
\end{funcdesc}

\begin{classdesc}{Binary}{filename}
  Represents entries in the Binary table; inserting such
  an object using \function{add_data} reads the file named
  \var{filename} into the table.
\end{classdesc}

\begin{funcdesc}{add_tables}{database, module}
  Add all table content from \var{module} to \var{database}.
  \var{module} must contain an attribute \var{tables}
  listing all tables for which content should be added,
  and one attribute per table that has the actual content.

  This is typically used to install the sequence tables.
\end{funcdesc}

\begin{funcdesc}{add_stream}{database, name, path}
  Add the file \var{path} into the \code{_Stream} table
  of \var{database}, with the stream name \var{name}.
\end{funcdesc}

\begin{funcdesc}{gen_uuid}{}
  Return a new UUID, in the format that MSI typically
  requires (i.e. in curly braces, and with all hexdigits
  in upper-case).
\end{funcdesc}

\begin{seealso}
  \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devnotes/winprog/fcicreate.asp]{FCICreateFile}{}
  \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/rpc/rpc/uuidcreate.asp]{UuidCreate}{}
  \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/rpc/rpc/uuidtostring.asp]{UuidToString}{}
\end{seealso}

\subsection{Database Objects\label{database-objects}}

\begin{methoddesc}{OpenView}{sql}
  Return a view object, by calling \cfunction{MSIDatabaseOpenView}.
  \var{sql} is the SQL statement to execute.
\end{methoddesc}

\begin{methoddesc}{Commit}{}
  Commit the changes pending in the current transaction,
  by calling \cfunction{MSIDatabaseCommit}.
\end{methoddesc}

\begin{methoddesc}{GetSummaryInformation}{count}
  Return a new summary information object, by calling
  \cfunction{MsiGetSummaryInformation}.  \var{count} is the maximum number of
  updated values.
\end{methoddesc}

\begin{seealso}
  \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msiopenview.asp]{MSIOpenView}{}
  \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msidatabasecommit.asp]{MSIDatabaseCommit}{}
  \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msigetsummaryinformation.asp]{MSIGetSummaryInformation}{}
\end{seealso}

\subsection{View Objects\label{view-objects}}

\begin{methoddesc}{Execute}{\optional{params=None}}
  Execute the SQL query of the view, through \cfunction{MSIViewExecute}.
  \var{params} is an optional record describing actual values
  of the parameter tokens in the query.
\end{methoddesc}

\begin{methoddesc}{GetColumnInfo}{kind}
  Return a record describing the columns of the view, through
  calling \cfunction{MsiViewGetColumnInfo}. \var{kind} can be either
  \code{MSICOLINFO_NAMES} or \code{MSICOLINFO_TYPES}.
\end{methoddesc}

\begin{methoddesc}{Fetch}{}
  Return a result record of the query, through calling
  \cfunction{MsiViewFetch}.
\end{methoddesc}

\begin{methoddesc}{Modify}{kind, data}
  Modify the view, by calling \cfunction{MsiViewModify}. \var{kind}
  can be one of  \code{MSIMODIFY_SEEK}, \code{MSIMODIFY_REFRESH},
  \code{MSIMODIFY_INSERT}, \code{MSIMODIFY_UPDATE}, \code{MSIMODIFY_ASSIGN},
  \code{MSIMODIFY_REPLACE}, \code{MSIMODIFY_MERGE}, \code{MSIMODIFY_DELETE},
  \code{MSIMODIFY_INSERT_TEMPORARY}, \code{MSIMODIFY_VALIDATE},
  \code{MSIMODIFY_VALIDATE_NEW}, \code{MSIMODIFY_VALIDATE_FIELD}, or
  \code{MSIMODIFY_VALIDATE_DELETE}.

  \var{data} must be a record describing the new data.
\end{methoddesc}

\begin{methoddesc}{Close}{}
  Close the view, through \cfunction{MsiViewClose}.
\end{methoddesc}

\begin{seealso}
  \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msiviewexecute.asp]{MsiViewExecute}{}
  \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msiviewgetcolumninfo.asp]{MSIViewGetColumnInfo}{}
  \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msiviewfetch.asp]{MsiViewFetch}{}
  \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msiviewmodify.asp]{MsiViewModify}{}
  \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msiviewclose.asp]{MsiViewClose}{}
\end{seealso}

\subsection{Summary Information Objects\label{summary-objects}}

\begin{methoddesc}{GetProperty}{field}
  Return a property of the summary, through \cfunction{MsiSummaryInfoGetProperty}.
  \var{field} is the name of the property, and can be one of the
  constants
  \code{PID_CODEPAGE}, \code{PID_TITLE}, \code{PID_SUBJECT},
  \code{PID_AUTHOR}, \code{PID_KEYWORDS}, \code{PID_COMMENTS},
  \code{PID_TEMPLATE}, \code{PID_LASTAUTHOR}, \code{PID_REVNUMBER},
  \code{PID_LASTPRINTED}, \code{PID_CREATE_DTM}, \code{PID_LASTSAVE_DTM},
  \code{PID_PAGECOUNT}, \code{PID_WORDCOUNT}, \code{PID_CHARCOUNT},
  \code{PID_APPNAME}, or \code{PID_SECURITY}.
\end{methoddesc}

\begin{methoddesc}{GetPropertyCount}{}
  Return the number of summary properties, through
  \cfunction{MsiSummaryInfoGetPropertyCount}.
\end{methoddesc}

\begin{methoddesc}{SetProperty}{field, value}
  Set a property through \cfunction{MsiSummaryInfoSetProperty}. \var{field}
  can have the same values as in \method{GetProperty}, \var{value}
  is the new value of the property. Possible value types are integer
  and string.
\end{methoddesc}

\begin{methoddesc}{Persist}{}
  Write the modified properties to the summary information stream,
  using \cfunction{MsiSummaryInfoPersist}.
\end{methoddesc}

\begin{seealso}
  \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msisummaryinfogetproperty.asp]{MsiSummaryInfoGetProperty}{}
  \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msisummaryinfogetpropertycount.asp]{MsiSummaryInfoGetPropertyCount}{}
  \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msisummaryinfosetproperty.asp]{MsiSummaryInfoSetProperty}{}
  \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msisummaryinfopersist.asp]{MsiSummaryInfoPersist}{}
\end{seealso}

\subsection{Record Objects\label{record-objects}}

\begin{methoddesc}{GetFieldCount}{}
  Return the number of fields of the record, through \cfunction{MsiRecordGetFieldCount}.
\end{methoddesc}

\begin{methoddesc}{SetString}{field, value}
  Set \var{field} to \var{value} through \cfunction{MsiRecordSetString}.
  \var{field} must be an integer; \var{value} a string.
\end{methoddesc}

\begin{methoddesc}{SetStream}{field, value}
  Set \var{field} to the contents of the file named \var{value},
  through \cfunction{MsiRecordSetStream}.
  \var{field} must be an integer; \var{value} a string.
\end{methoddesc}

\begin{methoddesc}{SetInteger}{field, value}
  Set \var{field} to \var{value} through \cfunction{MsiRecordSetInteger}.
  Both \var{field} and \var{value} must be an integer.
\end{methoddesc}

\begin{methoddesc}{ClearData}{}
  Set all fields of the record to 0, through \cfunction{MsiRecordClearData}.
\end{methoddesc}

\begin{seealso}
  \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msirecordgetfieldcount.asp]{MsiRecordGetFieldCount}{}
  \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msirecordsetstring.asp]{MsiRecordSetString}{}
  \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msirecordsetstream.asp]{MsiRecordSetStream}{}
  \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msirecordsetinteger.asp]{MsiRecordSetInteger}{}
  \seetitle[http://msdn.microsoft.com/library/default.asp?url=/library/en-us/msi/setup/msirecordclear.asp]{MsiRecordClear}{}
\end{seealso}

\subsection{Errors\label{msi-errors}}

All wrappers around MSI functions raise \exception{MsiError};
the string inside the exception will contain more detail.

\subsection{CAB Objects\label{cab}}

\begin{classdesc}{CAB}{name}
  The class \class{CAB} represents a CAB file. During MSI construction,
  files will be added simultaneously to the \code{Files} table, and
  to a CAB file. Then, when all files have been added, the CAB file
  can be written, then added to the MSI file.

  \var{name} is the name of the CAB file in the MSI file.
\end{classdesc}

\begin{methoddesc}[CAB]{append}{full, logical}
  Add the file with the pathname \var{full} to the CAB file,
  under the name \var{logical}. If there is already a file
  named \var{logical}, a new file name is created.

  Return the index of the file in the CAB file, and the
  new name of the file inside the CAB file.
\end{methoddesc}

\begin{methoddesc}[CAB]{append}{database}
  Generate a CAB file, add it as a stream to the MSI file,
  put it into the \code{Media} table, and remove the generated
  file from the disk.
\end{methoddesc}

\subsection{Directory Objects\label{msi-directory}}

\begin{classdesc}{Directory}{database, cab, basedir, physical, 
                  logical, default, component, \optional{componentflags}}
  Create a new directory in the Directory table. There is a current
  component at each point in time for the directory, which is either
  explicitly created through \method{start_component}, or implicitly when files
  are added for the first time. Files are added into the current
  component, and into the cab file.  To create a directory, a base
  directory object needs to be specified (can be \code{None}), the path to
  the physical directory, and a logical directory name.  \var{default}
  specifies the DefaultDir slot in the directory table. \var{componentflags}
  specifies the default flags that new components get.
\end{classdesc}

\begin{methoddesc}[Directory]{start_component}{\optional{component\optional{,
      feature\optional{, flags\optional{, keyfile\optional{, uuid}}}}}}
  Add an entry to the Component table, and make this component the
  current component for this directory. If no component name is given, the
  directory name is used. If no \var{feature} is given, the current feature
  is used. If no \var{flags} are given, the directory's default flags are
  used. If no \var{keyfile} is given, the KeyPath is left null in the
  Component table.
\end{methoddesc}

\begin{methoddesc}[Directory]{add_file}{file\optional{, src\optional{,
      version\optional{, language}}}}
  Add a file to the current component of the directory, starting a new
  one if there is no current component. By default, the file name
  in the source and the file table will be identical. If the \var{src} file
  is specified, it is interpreted relative to the current
  directory. Optionally, a \var{version} and a \var{language} can be specified for
  the entry in the File table.
\end{methoddesc}

\begin{methoddesc}[Directory]{glob}{pattern\optional{, exclude}}
  Add a list of files to the current component as specified in the glob
  pattern. Individual files can be excluded in the \var{exclude} list.
\end{methoddesc}

\begin{methoddesc}[Directory]{remove_pyc}{}
  Remove \code{.pyc}/\code{.pyo} files on uninstall.
\end{methoddesc}

\begin{seealso}
  \seetitle[http://msdn.microsoft.com/library/en-us/msi/setup/directory_table.asp]{Directory Table}{}
  \seetitle[http://msdn.microsoft.com/library/en-us/msi/setup/file_table.asp]{File Table}{}
  \seetitle[http://msdn.microsoft.com/library/en-us/msi/setup/component_table.asp]{Component Table}{}
  \seetitle[http://msdn.microsoft.com/library/en-us/msi/setup/featurecomponents_table.asp]{FeatureComponents Table}{}
\end{seealso}


\subsection{Features\label{features}}

\begin{classdesc}{Feature}{database, id, title, desc, display\optional{,
    level=1\optional{, parent\optional\{, directory\optional{, 
    attributes=0}}}}

  Add a new record to the \code{Feature} table, using the values
  \var{id}, \var{parent.id}, \var{title}, \var{desc}, \var{display},
  \var{level}, \var{directory}, and \var{attributes}. The resulting
  feature object can be passed to the \method{start_component} method
  of \class{Directory}.
\end{classdesc}

\begin{methoddesc}[Feature]{set_current}{}
  Make this feature the current feature of \module{msilib}.
  New components are automatically added to the default feature,
  unless a feature is explicitly specified.
\end{methoddesc}

\begin{seealso}
  \seetitle[http://msdn.microsoft.com/library/en-us/msi/setup/feature_table.asp]{Feature Table}{}
\end{seealso}

\subsection{GUI classes\label{msi-gui}}

\module{msilib} provides several classes that wrap the GUI tables in
an MSI database. However, no standard user interface is provided; use
\module{bdist_msi} to create MSI files with a user-interface for
installing Python packages.

\begin{classdesc}{Control}{dlg, name}
  Base class of the dialog controls. \var{dlg} is the dialog object
  the control belongs to, and \var{name} is the control's name.
\end{classdesc}

\begin{methoddesc}[Control]{event}{event, argument\optional{, 
   condition = ``1''\optional{, ordering}}}

  Make an entry into the \code{ControlEvent} table for this control.
\end{methoddesc}

\begin{methoddesc}[Control]{mapping}{event, attribute}
  Make an entry into the \code{EventMapping} table for this control.
\end{methoddesc}

\begin{methoddesc}[Control]{condition}{action, condition}
  Make an entry into the \code{ControlCondition} table for this control.
\end{methoddesc}


\begin{classdesc}{RadioButtonGroup}{dlg, name, property}
  Create a radio button control named \var{name}. \var{property}
  is the installer property that gets set when a radio button
  is selected.
\end{classdesc}

\begin{methoddesc}[RadioButtonGroup]{add}{name, x, y, width, height, text
                                          \optional{, value}}
  Add a radio button named \var{name} to the group, at the
  coordinates \var{x}, \var{y}, \var{width}, \var{height}, and
  with the label \var{text}. If \var{value} is omitted, it
  defaults to \var{name}.
\end{methoddesc}
           
\begin{classdesc}{Dialog}{db, name, x, y, w, h, attr, title, first, 
    default, cancel}
  Return a new \class{Dialog} object. An entry in the \code{Dialog} table
  is made, with the specified coordinates, dialog attributes, title,
  name of the first, default, and cancel controls.
\end{classdesc}

\begin{methoddesc}[Dialog]{control}{name, type, x, y, width, height, 
                  attributes, property, text, control_next, help}
  Return a new \class{Control} object. An entry in the \code{Control} table
  is made with the specified parameters.

  This is a generic method; for specific types, specialized methods
  are provided.
\end{methoddesc}


\begin{methoddesc}[Dialog]{text}{name, x, y, width, height, attributes, text}
  Add and return a \code{Text} control.
\end{methoddesc}

\begin{methoddesc}[Dialog]{bitmap}{name, x, y, width, height, text}
  Add and return a \code{Bitmap} control.
\end{methoddesc}

\begin{methoddesc}[Dialog]{line}{name, x, y, width, height}
  Add and return a \code{Line} control.
\end{methoddesc}

\begin{methoddesc}[Dialog]{pushbutton}{name, x, y, width, height, attributes, 
                                 text, next_control}
  Add and return a \code{PushButton} control.
\end{methoddesc}

\begin{methoddesc}[Dialog]{radiogroup}{name, x, y, width, height, 
                                 attributes, property, text, next_control}
  Add and return a \code{RadioButtonGroup} control.
\end{methoddesc}

\begin{methoddesc}[Dialog]{checkbox}{name, x, y, width, height, 
                                 attributes, property, text, next_control}
  Add and return a \code{CheckBox} control.
\end{methoddesc}

\begin{seealso}
  \seetitle[http://msdn.microsoft.com/library/en-us/msi/setup/dialog_table.asp]{Dialog Table}{}
  \seetitle[http://msdn.microsoft.com/library/en-us/msi/setup/control_table.asp]{Control Table}{}
  \seetitle[http://msdn.microsoft.com/library/en-us/msi/setup/controls.asp]{Control Types}{}
  \seetitle[http://msdn.microsoft.com/library/en-us/msi/setup/controlcondition_table.asp]{ControlCondition Table}{}
  \seetitle[http://msdn.microsoft.com/library/en-us/msi/setup/controlevent_table.asp]{ControlEvent Table}{}
  \seetitle[http://msdn.microsoft.com/library/en-us/msi/setup/eventmapping_table.asp]{EventMapping Table}{}
  \seetitle[http://msdn.microsoft.com/library/en-us/msi/setup/radiobutton_table.asp]{RadioButton Table}{}
\end{seealso}

\subsection{Precomputed tables\label{msi-tables}}

\module{msilib} provides a few subpackages that contain
only schema and table definitions. Currently, these definitions
are based on MSI version 2.0.

\begin{datadesc}{schema}
  This is the standard MSI schema for MSI 2.0, with the
  \var{tables} variable providing a list of table definitions,
  and \var{_Validation_records} providing the data for
  MSI validation.
\end{datadesc}

\begin{datadesc}{sequence}
  This module contains table contents for the standard sequence
  tables: \var{AdminExecuteSequence}, \var{AdminUISequence},
  \var{AdvtExecuteSequence}, \var{InstallExecuteSequence}, and
  \var{InstallUISequence}.
\end{datadesc}

\begin{datadesc}{text}
  This module contains definitions for the UIText and ActionText
  tables, for the standard installer actions.
\end{datadesc}
