17db96d56Sopenharmony_ci:mod:`msilib` --- Read and write Microsoft Installer files
27db96d56Sopenharmony_ci==========================================================
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci.. module:: msilib
57db96d56Sopenharmony_ci   :platform: Windows
67db96d56Sopenharmony_ci   :synopsis: Creation of Microsoft Installer files, and CAB files.
77db96d56Sopenharmony_ci   :deprecated:
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ci.. moduleauthor:: Martin v. Löwis <martin@v.loewis.de>
107db96d56Sopenharmony_ci.. sectionauthor:: Martin v. Löwis <martin@v.loewis.de>
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ci**Source code:** :source:`Lib/msilib/__init__.py`
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci.. index:: single: msi
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_ci.. deprecated-removed:: 3.11 3.13
177db96d56Sopenharmony_ci   The :mod:`msilib` module is deprecated
187db96d56Sopenharmony_ci   (see :pep:`PEP 594 <594#msilib>` for details).
197db96d56Sopenharmony_ci
207db96d56Sopenharmony_ci--------------
217db96d56Sopenharmony_ci
227db96d56Sopenharmony_ciThe :mod:`msilib` supports the creation of Microsoft Installer (``.msi``) files.
237db96d56Sopenharmony_ciBecause these files often contain an embedded "cabinet" file (``.cab``), it also
247db96d56Sopenharmony_ciexposes an API to create CAB files. Support for reading ``.cab`` files is
257db96d56Sopenharmony_cicurrently not implemented; read support for the ``.msi`` database is possible.
267db96d56Sopenharmony_ci
277db96d56Sopenharmony_ciThis package aims to provide complete access to all tables in an ``.msi`` file,
287db96d56Sopenharmony_citherefore, it is a fairly low-level API. One primary application of this
297db96d56Sopenharmony_cipackage is the creation of Python installer package itself (although that currently
307db96d56Sopenharmony_ciuses a different version of ``msilib``).
317db96d56Sopenharmony_ci
327db96d56Sopenharmony_ciThe package contents can be roughly split into four parts: low-level CAB
337db96d56Sopenharmony_ciroutines, low-level MSI routines, higher-level MSI routines, and standard table
347db96d56Sopenharmony_cistructures.
357db96d56Sopenharmony_ci
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_ci.. function:: FCICreate(cabname, files)
387db96d56Sopenharmony_ci
397db96d56Sopenharmony_ci   Create a new CAB file named *cabname*. *files* must be a list of tuples, each
407db96d56Sopenharmony_ci   containing the name of the file on disk, and the name of the file inside the CAB
417db96d56Sopenharmony_ci   file.
427db96d56Sopenharmony_ci
437db96d56Sopenharmony_ci   The files are added to the CAB file in the order they appear in the list. All
447db96d56Sopenharmony_ci   files are added into a single CAB file, using the MSZIP compression algorithm.
457db96d56Sopenharmony_ci
467db96d56Sopenharmony_ci   Callbacks to Python for the various steps of MSI creation are currently not
477db96d56Sopenharmony_ci   exposed.
487db96d56Sopenharmony_ci
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_ci.. function:: UuidCreate()
517db96d56Sopenharmony_ci
527db96d56Sopenharmony_ci   Return the string representation of a new unique identifier. This wraps the
537db96d56Sopenharmony_ci   Windows API functions :c:func:`UuidCreate` and :c:func:`UuidToString`.
547db96d56Sopenharmony_ci
557db96d56Sopenharmony_ci
567db96d56Sopenharmony_ci.. function:: OpenDatabase(path, persist)
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ci   Return a new database object by calling MsiOpenDatabase.   *path* is the file
597db96d56Sopenharmony_ci   name of the MSI file; *persist* can be one of the constants
607db96d56Sopenharmony_ci   ``MSIDBOPEN_CREATEDIRECT``, ``MSIDBOPEN_CREATE``, ``MSIDBOPEN_DIRECT``,
617db96d56Sopenharmony_ci   ``MSIDBOPEN_READONLY``, or ``MSIDBOPEN_TRANSACT``, and may include the flag
627db96d56Sopenharmony_ci   ``MSIDBOPEN_PATCHFILE``. See the Microsoft documentation for the meaning of
637db96d56Sopenharmony_ci   these flags; depending on the flags, an existing database is opened, or a new
647db96d56Sopenharmony_ci   one created.
657db96d56Sopenharmony_ci
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_ci.. function:: CreateRecord(count)
687db96d56Sopenharmony_ci
697db96d56Sopenharmony_ci   Return a new record object by calling :c:func:`MSICreateRecord`. *count* is the
707db96d56Sopenharmony_ci   number of fields of the record.
717db96d56Sopenharmony_ci
727db96d56Sopenharmony_ci
737db96d56Sopenharmony_ci.. function:: init_database(name, schema, ProductName, ProductCode, ProductVersion, Manufacturer)
747db96d56Sopenharmony_ci
757db96d56Sopenharmony_ci   Create and return a new database *name*, initialize it with *schema*, and set
767db96d56Sopenharmony_ci   the properties *ProductName*, *ProductCode*, *ProductVersion*, and
777db96d56Sopenharmony_ci   *Manufacturer*.
787db96d56Sopenharmony_ci
797db96d56Sopenharmony_ci   *schema* must be a module object containing ``tables`` and
807db96d56Sopenharmony_ci   ``_Validation_records`` attributes; typically, :mod:`msilib.schema` should be
817db96d56Sopenharmony_ci   used.
827db96d56Sopenharmony_ci
837db96d56Sopenharmony_ci   The database will contain just the schema and the validation records when this
847db96d56Sopenharmony_ci   function returns.
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ci
877db96d56Sopenharmony_ci.. function:: add_data(database, table, records)
887db96d56Sopenharmony_ci
897db96d56Sopenharmony_ci   Add all *records* to the table named *table* in *database*.
907db96d56Sopenharmony_ci
917db96d56Sopenharmony_ci   The *table* argument must be one of the predefined tables in the MSI schema,
927db96d56Sopenharmony_ci   e.g. ``'Feature'``, ``'File'``, ``'Component'``, ``'Dialog'``, ``'Control'``,
937db96d56Sopenharmony_ci   etc.
947db96d56Sopenharmony_ci
957db96d56Sopenharmony_ci   *records* should be a list of tuples, each one containing all fields of a
967db96d56Sopenharmony_ci   record according to the schema of the table.  For optional fields,
977db96d56Sopenharmony_ci   ``None`` can be passed.
987db96d56Sopenharmony_ci
997db96d56Sopenharmony_ci   Field values can be ints, strings, or instances of the Binary class.
1007db96d56Sopenharmony_ci
1017db96d56Sopenharmony_ci
1027db96d56Sopenharmony_ci.. class:: Binary(filename)
1037db96d56Sopenharmony_ci
1047db96d56Sopenharmony_ci   Represents entries in the Binary table; inserting such an object using
1057db96d56Sopenharmony_ci   :func:`add_data` reads the file named *filename* into the table.
1067db96d56Sopenharmony_ci
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_ci.. function:: add_tables(database, module)
1097db96d56Sopenharmony_ci
1107db96d56Sopenharmony_ci   Add all table content from *module* to *database*. *module* must contain an
1117db96d56Sopenharmony_ci   attribute *tables* listing all tables for which content should be added, and one
1127db96d56Sopenharmony_ci   attribute per table that has the actual content.
1137db96d56Sopenharmony_ci
1147db96d56Sopenharmony_ci   This is typically used to install the sequence tables.
1157db96d56Sopenharmony_ci
1167db96d56Sopenharmony_ci
1177db96d56Sopenharmony_ci.. function:: add_stream(database, name, path)
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_ci   Add the file *path* into the ``_Stream`` table of *database*, with the stream
1207db96d56Sopenharmony_ci   name *name*.
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ci
1237db96d56Sopenharmony_ci.. function:: gen_uuid()
1247db96d56Sopenharmony_ci
1257db96d56Sopenharmony_ci   Return a new UUID, in the format that MSI typically requires (i.e. in curly
1267db96d56Sopenharmony_ci   braces, and with all hexdigits in uppercase).
1277db96d56Sopenharmony_ci
1287db96d56Sopenharmony_ci
1297db96d56Sopenharmony_ci.. seealso::
1307db96d56Sopenharmony_ci
1317db96d56Sopenharmony_ci   `FCICreate <https://msdn.microsoft.com/en-us/library/bb432265.aspx>`_
1327db96d56Sopenharmony_ci   `UuidCreate <https://msdn.microsoft.com/en-us/library/windows/desktop/aa379205.aspx>`_
1337db96d56Sopenharmony_ci   `UuidToString <https://msdn.microsoft.com/en-us/library/windows/desktop/aa379352.aspx>`_
1347db96d56Sopenharmony_ci
1357db96d56Sopenharmony_ci.. _database-objects:
1367db96d56Sopenharmony_ci
1377db96d56Sopenharmony_ciDatabase Objects
1387db96d56Sopenharmony_ci----------------
1397db96d56Sopenharmony_ci
1407db96d56Sopenharmony_ci
1417db96d56Sopenharmony_ci.. method:: Database.OpenView(sql)
1427db96d56Sopenharmony_ci
1437db96d56Sopenharmony_ci   Return a view object, by calling :c:func:`MSIDatabaseOpenView`. *sql* is the SQL
1447db96d56Sopenharmony_ci   statement to execute.
1457db96d56Sopenharmony_ci
1467db96d56Sopenharmony_ci
1477db96d56Sopenharmony_ci.. method:: Database.Commit()
1487db96d56Sopenharmony_ci
1497db96d56Sopenharmony_ci   Commit the changes pending in the current transaction, by calling
1507db96d56Sopenharmony_ci   :c:func:`MSIDatabaseCommit`.
1517db96d56Sopenharmony_ci
1527db96d56Sopenharmony_ci
1537db96d56Sopenharmony_ci.. method:: Database.GetSummaryInformation(count)
1547db96d56Sopenharmony_ci
1557db96d56Sopenharmony_ci   Return a new summary information object, by calling
1567db96d56Sopenharmony_ci   :c:func:`MsiGetSummaryInformation`.  *count* is the maximum number of updated
1577db96d56Sopenharmony_ci   values.
1587db96d56Sopenharmony_ci
1597db96d56Sopenharmony_ci.. method:: Database.Close()
1607db96d56Sopenharmony_ci
1617db96d56Sopenharmony_ci   Close the database object, through :c:func:`MsiCloseHandle`.
1627db96d56Sopenharmony_ci
1637db96d56Sopenharmony_ci   .. versionadded:: 3.7
1647db96d56Sopenharmony_ci
1657db96d56Sopenharmony_ci.. seealso::
1667db96d56Sopenharmony_ci
1677db96d56Sopenharmony_ci   `MSIDatabaseOpenView <https://msdn.microsoft.com/en-us/library/windows/desktop/aa370082.aspx>`_
1687db96d56Sopenharmony_ci   `MSIDatabaseCommit <https://msdn.microsoft.com/en-us/library/windows/desktop/aa370075.aspx>`_
1697db96d56Sopenharmony_ci   `MSIGetSummaryInformation <https://msdn.microsoft.com/en-us/library/windows/desktop/aa370301.aspx>`_
1707db96d56Sopenharmony_ci   `MsiCloseHandle <https://msdn.microsoft.com/en-us/library/windows/desktop/aa370067.aspx>`_
1717db96d56Sopenharmony_ci
1727db96d56Sopenharmony_ci.. _view-objects:
1737db96d56Sopenharmony_ci
1747db96d56Sopenharmony_ciView Objects
1757db96d56Sopenharmony_ci------------
1767db96d56Sopenharmony_ci
1777db96d56Sopenharmony_ci
1787db96d56Sopenharmony_ci.. method:: View.Execute(params)
1797db96d56Sopenharmony_ci
1807db96d56Sopenharmony_ci   Execute the SQL query of the view, through :c:func:`MSIViewExecute`. If
1817db96d56Sopenharmony_ci   *params* is not ``None``, it is a record describing actual values of the
1827db96d56Sopenharmony_ci   parameter tokens in the query.
1837db96d56Sopenharmony_ci
1847db96d56Sopenharmony_ci
1857db96d56Sopenharmony_ci.. method:: View.GetColumnInfo(kind)
1867db96d56Sopenharmony_ci
1877db96d56Sopenharmony_ci   Return a record describing the columns of the view, through calling
1887db96d56Sopenharmony_ci   :c:func:`MsiViewGetColumnInfo`. *kind* can be either ``MSICOLINFO_NAMES`` or
1897db96d56Sopenharmony_ci   ``MSICOLINFO_TYPES``.
1907db96d56Sopenharmony_ci
1917db96d56Sopenharmony_ci
1927db96d56Sopenharmony_ci.. method:: View.Fetch()
1937db96d56Sopenharmony_ci
1947db96d56Sopenharmony_ci   Return a result record of the query, through calling :c:func:`MsiViewFetch`.
1957db96d56Sopenharmony_ci
1967db96d56Sopenharmony_ci
1977db96d56Sopenharmony_ci.. method:: View.Modify(kind, data)
1987db96d56Sopenharmony_ci
1997db96d56Sopenharmony_ci   Modify the view, by calling :c:func:`MsiViewModify`. *kind* can be one of
2007db96d56Sopenharmony_ci   ``MSIMODIFY_SEEK``, ``MSIMODIFY_REFRESH``, ``MSIMODIFY_INSERT``,
2017db96d56Sopenharmony_ci   ``MSIMODIFY_UPDATE``, ``MSIMODIFY_ASSIGN``, ``MSIMODIFY_REPLACE``,
2027db96d56Sopenharmony_ci   ``MSIMODIFY_MERGE``, ``MSIMODIFY_DELETE``, ``MSIMODIFY_INSERT_TEMPORARY``,
2037db96d56Sopenharmony_ci   ``MSIMODIFY_VALIDATE``, ``MSIMODIFY_VALIDATE_NEW``,
2047db96d56Sopenharmony_ci   ``MSIMODIFY_VALIDATE_FIELD``, or ``MSIMODIFY_VALIDATE_DELETE``.
2057db96d56Sopenharmony_ci
2067db96d56Sopenharmony_ci   *data* must be a record describing the new data.
2077db96d56Sopenharmony_ci
2087db96d56Sopenharmony_ci
2097db96d56Sopenharmony_ci.. method:: View.Close()
2107db96d56Sopenharmony_ci
2117db96d56Sopenharmony_ci   Close the view, through :c:func:`MsiViewClose`.
2127db96d56Sopenharmony_ci
2137db96d56Sopenharmony_ci
2147db96d56Sopenharmony_ci.. seealso::
2157db96d56Sopenharmony_ci
2167db96d56Sopenharmony_ci   `MsiViewExecute <https://msdn.microsoft.com/en-us/library/windows/desktop/aa370513.aspx>`_
2177db96d56Sopenharmony_ci   `MSIViewGetColumnInfo <https://msdn.microsoft.com/en-us/library/windows/desktop/aa370516.aspx>`_
2187db96d56Sopenharmony_ci   `MsiViewFetch <https://msdn.microsoft.com/en-us/library/windows/desktop/aa370514.aspx>`_
2197db96d56Sopenharmony_ci   `MsiViewModify <https://msdn.microsoft.com/en-us/library/windows/desktop/aa370519.aspx>`_
2207db96d56Sopenharmony_ci   `MsiViewClose <https://msdn.microsoft.com/en-us/library/windows/desktop/aa370510.aspx>`_
2217db96d56Sopenharmony_ci
2227db96d56Sopenharmony_ci.. _summary-objects:
2237db96d56Sopenharmony_ci
2247db96d56Sopenharmony_ciSummary Information Objects
2257db96d56Sopenharmony_ci---------------------------
2267db96d56Sopenharmony_ci
2277db96d56Sopenharmony_ci
2287db96d56Sopenharmony_ci.. method:: SummaryInformation.GetProperty(field)
2297db96d56Sopenharmony_ci
2307db96d56Sopenharmony_ci   Return a property of the summary, through :c:func:`MsiSummaryInfoGetProperty`.
2317db96d56Sopenharmony_ci   *field* is the name of the property, and can be one of the constants
2327db96d56Sopenharmony_ci   ``PID_CODEPAGE``, ``PID_TITLE``, ``PID_SUBJECT``, ``PID_AUTHOR``,
2337db96d56Sopenharmony_ci   ``PID_KEYWORDS``, ``PID_COMMENTS``, ``PID_TEMPLATE``, ``PID_LASTAUTHOR``,
2347db96d56Sopenharmony_ci   ``PID_REVNUMBER``, ``PID_LASTPRINTED``, ``PID_CREATE_DTM``,
2357db96d56Sopenharmony_ci   ``PID_LASTSAVE_DTM``, ``PID_PAGECOUNT``, ``PID_WORDCOUNT``, ``PID_CHARCOUNT``,
2367db96d56Sopenharmony_ci   ``PID_APPNAME``, or ``PID_SECURITY``.
2377db96d56Sopenharmony_ci
2387db96d56Sopenharmony_ci
2397db96d56Sopenharmony_ci.. method:: SummaryInformation.GetPropertyCount()
2407db96d56Sopenharmony_ci
2417db96d56Sopenharmony_ci   Return the number of summary properties, through
2427db96d56Sopenharmony_ci   :c:func:`MsiSummaryInfoGetPropertyCount`.
2437db96d56Sopenharmony_ci
2447db96d56Sopenharmony_ci
2457db96d56Sopenharmony_ci.. method:: SummaryInformation.SetProperty(field, value)
2467db96d56Sopenharmony_ci
2477db96d56Sopenharmony_ci   Set a property through :c:func:`MsiSummaryInfoSetProperty`. *field* can have the
2487db96d56Sopenharmony_ci   same values as in :meth:`GetProperty`, *value* is the new value of the property.
2497db96d56Sopenharmony_ci   Possible value types are integer and string.
2507db96d56Sopenharmony_ci
2517db96d56Sopenharmony_ci
2527db96d56Sopenharmony_ci.. method:: SummaryInformation.Persist()
2537db96d56Sopenharmony_ci
2547db96d56Sopenharmony_ci   Write the modified properties to the summary information stream, using
2557db96d56Sopenharmony_ci   :c:func:`MsiSummaryInfoPersist`.
2567db96d56Sopenharmony_ci
2577db96d56Sopenharmony_ci
2587db96d56Sopenharmony_ci.. seealso::
2597db96d56Sopenharmony_ci
2607db96d56Sopenharmony_ci   `MsiSummaryInfoGetProperty <https://msdn.microsoft.com/en-us/library/windows/desktop/aa370409.aspx>`_
2617db96d56Sopenharmony_ci   `MsiSummaryInfoGetPropertyCount <https://msdn.microsoft.com/en-us/library/windows/desktop/aa370488.aspx>`_
2627db96d56Sopenharmony_ci   `MsiSummaryInfoSetProperty <https://msdn.microsoft.com/en-us/library/windows/desktop/aa370491.aspx>`_
2637db96d56Sopenharmony_ci   `MsiSummaryInfoPersist <https://msdn.microsoft.com/en-us/library/windows/desktop/aa370490.aspx>`_
2647db96d56Sopenharmony_ci
2657db96d56Sopenharmony_ci.. _record-objects:
2667db96d56Sopenharmony_ci
2677db96d56Sopenharmony_ciRecord Objects
2687db96d56Sopenharmony_ci--------------
2697db96d56Sopenharmony_ci
2707db96d56Sopenharmony_ci
2717db96d56Sopenharmony_ci.. method:: Record.GetFieldCount()
2727db96d56Sopenharmony_ci
2737db96d56Sopenharmony_ci   Return the number of fields of the record, through
2747db96d56Sopenharmony_ci   :c:func:`MsiRecordGetFieldCount`.
2757db96d56Sopenharmony_ci
2767db96d56Sopenharmony_ci
2777db96d56Sopenharmony_ci.. method:: Record.GetInteger(field)
2787db96d56Sopenharmony_ci
2797db96d56Sopenharmony_ci   Return the value of *field* as an integer where possible.  *field* must
2807db96d56Sopenharmony_ci   be an integer.
2817db96d56Sopenharmony_ci
2827db96d56Sopenharmony_ci
2837db96d56Sopenharmony_ci.. method:: Record.GetString(field)
2847db96d56Sopenharmony_ci
2857db96d56Sopenharmony_ci   Return the value of *field* as a string where possible.  *field* must
2867db96d56Sopenharmony_ci   be an integer.
2877db96d56Sopenharmony_ci
2887db96d56Sopenharmony_ci
2897db96d56Sopenharmony_ci.. method:: Record.SetString(field, value)
2907db96d56Sopenharmony_ci
2917db96d56Sopenharmony_ci   Set *field* to *value* through :c:func:`MsiRecordSetString`. *field* must be an
2927db96d56Sopenharmony_ci   integer; *value* a string.
2937db96d56Sopenharmony_ci
2947db96d56Sopenharmony_ci
2957db96d56Sopenharmony_ci.. method:: Record.SetStream(field, value)
2967db96d56Sopenharmony_ci
2977db96d56Sopenharmony_ci   Set *field* to the contents of the file named *value*, through
2987db96d56Sopenharmony_ci   :c:func:`MsiRecordSetStream`. *field* must be an integer; *value* a string.
2997db96d56Sopenharmony_ci
3007db96d56Sopenharmony_ci
3017db96d56Sopenharmony_ci.. method:: Record.SetInteger(field, value)
3027db96d56Sopenharmony_ci
3037db96d56Sopenharmony_ci   Set *field* to *value* through :c:func:`MsiRecordSetInteger`. Both *field* and
3047db96d56Sopenharmony_ci   *value* must be an integer.
3057db96d56Sopenharmony_ci
3067db96d56Sopenharmony_ci
3077db96d56Sopenharmony_ci.. method:: Record.ClearData()
3087db96d56Sopenharmony_ci
3097db96d56Sopenharmony_ci   Set all fields of the record to 0, through :c:func:`MsiRecordClearData`.
3107db96d56Sopenharmony_ci
3117db96d56Sopenharmony_ci
3127db96d56Sopenharmony_ci.. seealso::
3137db96d56Sopenharmony_ci
3147db96d56Sopenharmony_ci   `MsiRecordGetFieldCount <https://msdn.microsoft.com/en-us/library/windows/desktop/aa370366.aspx>`_
3157db96d56Sopenharmony_ci   `MsiRecordSetString <https://msdn.microsoft.com/en-us/library/windows/desktop/aa370373.aspx>`_
3167db96d56Sopenharmony_ci   `MsiRecordSetStream <https://msdn.microsoft.com/en-us/library/windows/desktop/aa370372.aspx>`_
3177db96d56Sopenharmony_ci   `MsiRecordSetInteger <https://msdn.microsoft.com/en-us/library/windows/desktop/aa370371.aspx>`_
3187db96d56Sopenharmony_ci   `MsiRecordClearData <https://msdn.microsoft.com/en-us/library/windows/desktop/aa370364.aspx>`_
3197db96d56Sopenharmony_ci
3207db96d56Sopenharmony_ci.. _msi-errors:
3217db96d56Sopenharmony_ci
3227db96d56Sopenharmony_ciErrors
3237db96d56Sopenharmony_ci------
3247db96d56Sopenharmony_ci
3257db96d56Sopenharmony_ciAll wrappers around MSI functions raise :exc:`MSIError`; the string inside the
3267db96d56Sopenharmony_ciexception will contain more detail.
3277db96d56Sopenharmony_ci
3287db96d56Sopenharmony_ci
3297db96d56Sopenharmony_ci.. _cab:
3307db96d56Sopenharmony_ci
3317db96d56Sopenharmony_ciCAB Objects
3327db96d56Sopenharmony_ci-----------
3337db96d56Sopenharmony_ci
3347db96d56Sopenharmony_ci
3357db96d56Sopenharmony_ci.. class:: CAB(name)
3367db96d56Sopenharmony_ci
3377db96d56Sopenharmony_ci   The class :class:`CAB` represents a CAB file. During MSI construction, files
3387db96d56Sopenharmony_ci   will be added simultaneously to the ``Files`` table, and to a CAB file. Then,
3397db96d56Sopenharmony_ci   when all files have been added, the CAB file can be written, then added to the
3407db96d56Sopenharmony_ci   MSI file.
3417db96d56Sopenharmony_ci
3427db96d56Sopenharmony_ci   *name* is the name of the CAB file in the MSI file.
3437db96d56Sopenharmony_ci
3447db96d56Sopenharmony_ci
3457db96d56Sopenharmony_ci   .. method:: append(full, file, logical)
3467db96d56Sopenharmony_ci
3477db96d56Sopenharmony_ci      Add the file with the pathname *full* to the CAB file, under the name
3487db96d56Sopenharmony_ci      *logical*.  If there is already a file named *logical*, a new file name is
3497db96d56Sopenharmony_ci      created.
3507db96d56Sopenharmony_ci
3517db96d56Sopenharmony_ci      Return the index of the file in the CAB file, and the new name of the file
3527db96d56Sopenharmony_ci      inside the CAB file.
3537db96d56Sopenharmony_ci
3547db96d56Sopenharmony_ci
3557db96d56Sopenharmony_ci   .. method:: commit(database)
3567db96d56Sopenharmony_ci
3577db96d56Sopenharmony_ci      Generate a CAB file, add it as a stream to the MSI file, put it into the
3587db96d56Sopenharmony_ci      ``Media`` table, and remove the generated file from the disk.
3597db96d56Sopenharmony_ci
3607db96d56Sopenharmony_ci
3617db96d56Sopenharmony_ci.. _msi-directory:
3627db96d56Sopenharmony_ci
3637db96d56Sopenharmony_ciDirectory Objects
3647db96d56Sopenharmony_ci-----------------
3657db96d56Sopenharmony_ci
3667db96d56Sopenharmony_ci
3677db96d56Sopenharmony_ci.. class:: Directory(database, cab, basedir, physical,  logical, default, [componentflags])
3687db96d56Sopenharmony_ci
3697db96d56Sopenharmony_ci   Create a new directory in the Directory table. There is a current component at
3707db96d56Sopenharmony_ci   each point in time for the directory, which is either explicitly created through
3717db96d56Sopenharmony_ci   :meth:`start_component`, or implicitly when files are added for the first time.
3727db96d56Sopenharmony_ci   Files are added into the current component, and into the cab file.  To create a
3737db96d56Sopenharmony_ci   directory, a base directory object needs to be specified (can be ``None``), the
3747db96d56Sopenharmony_ci   path to the physical directory, and a logical directory name.  *default*
3757db96d56Sopenharmony_ci   specifies the DefaultDir slot in the directory table. *componentflags* specifies
3767db96d56Sopenharmony_ci   the default flags that new components get.
3777db96d56Sopenharmony_ci
3787db96d56Sopenharmony_ci
3797db96d56Sopenharmony_ci   .. method:: start_component(component=None, feature=None, flags=None, keyfile=None, uuid=None)
3807db96d56Sopenharmony_ci
3817db96d56Sopenharmony_ci      Add an entry to the Component table, and make this component the current
3827db96d56Sopenharmony_ci      component for this directory. If no component name is given, the directory
3837db96d56Sopenharmony_ci      name is used. If no *feature* is given, the current feature is used. If no
3847db96d56Sopenharmony_ci      *flags* are given, the directory's default flags are used. If no *keyfile*
3857db96d56Sopenharmony_ci      is given, the KeyPath is left null in the Component table.
3867db96d56Sopenharmony_ci
3877db96d56Sopenharmony_ci
3887db96d56Sopenharmony_ci   .. method:: add_file(file, src=None, version=None, language=None)
3897db96d56Sopenharmony_ci
3907db96d56Sopenharmony_ci      Add a file to the current component of the directory, starting a new one
3917db96d56Sopenharmony_ci      if there is no current component. By default, the file name in the source
3927db96d56Sopenharmony_ci      and the file table will be identical. If the *src* file is specified, it
3937db96d56Sopenharmony_ci      is interpreted relative to the current directory. Optionally, a *version*
3947db96d56Sopenharmony_ci      and a *language* can be specified for the entry in the File table.
3957db96d56Sopenharmony_ci
3967db96d56Sopenharmony_ci
3977db96d56Sopenharmony_ci   .. method:: glob(pattern, exclude=None)
3987db96d56Sopenharmony_ci
3997db96d56Sopenharmony_ci      Add a list of files to the current component as specified in the glob
4007db96d56Sopenharmony_ci      pattern.  Individual files can be excluded in the *exclude* list.
4017db96d56Sopenharmony_ci
4027db96d56Sopenharmony_ci
4037db96d56Sopenharmony_ci   .. method:: remove_pyc()
4047db96d56Sopenharmony_ci
4057db96d56Sopenharmony_ci      Remove ``.pyc`` files on uninstall.
4067db96d56Sopenharmony_ci
4077db96d56Sopenharmony_ci
4087db96d56Sopenharmony_ci.. seealso::
4097db96d56Sopenharmony_ci
4107db96d56Sopenharmony_ci   `Directory Table <https://msdn.microsoft.com/en-us/library/windows/desktop/aa368295.aspx>`_
4117db96d56Sopenharmony_ci   `File Table <https://msdn.microsoft.com/en-us/library/windows/desktop/aa368596.aspx>`_
4127db96d56Sopenharmony_ci   `Component Table <https://msdn.microsoft.com/en-us/library/windows/desktop/aa368007.aspx>`_
4137db96d56Sopenharmony_ci   `FeatureComponents Table <https://msdn.microsoft.com/en-us/library/windows/desktop/aa368579.aspx>`_
4147db96d56Sopenharmony_ci
4157db96d56Sopenharmony_ci.. _features:
4167db96d56Sopenharmony_ci
4177db96d56Sopenharmony_ciFeatures
4187db96d56Sopenharmony_ci--------
4197db96d56Sopenharmony_ci
4207db96d56Sopenharmony_ci
4217db96d56Sopenharmony_ci.. class:: Feature(db, id, title, desc, display, level=1, parent=None, directory=None,  attributes=0)
4227db96d56Sopenharmony_ci
4237db96d56Sopenharmony_ci   Add a new record to the ``Feature`` table, using the values *id*, *parent.id*,
4247db96d56Sopenharmony_ci   *title*, *desc*, *display*, *level*, *directory*, and *attributes*. The
4257db96d56Sopenharmony_ci   resulting feature object can be passed to the :meth:`start_component` method of
4267db96d56Sopenharmony_ci   :class:`Directory`.
4277db96d56Sopenharmony_ci
4287db96d56Sopenharmony_ci
4297db96d56Sopenharmony_ci   .. method:: set_current()
4307db96d56Sopenharmony_ci
4317db96d56Sopenharmony_ci      Make this feature the current feature of :mod:`msilib`. New components are
4327db96d56Sopenharmony_ci      automatically added to the default feature, unless a feature is explicitly
4337db96d56Sopenharmony_ci      specified.
4347db96d56Sopenharmony_ci
4357db96d56Sopenharmony_ci
4367db96d56Sopenharmony_ci.. seealso::
4377db96d56Sopenharmony_ci
4387db96d56Sopenharmony_ci   `Feature Table <https://msdn.microsoft.com/en-us/library/windows/desktop/aa368585.aspx>`_
4397db96d56Sopenharmony_ci
4407db96d56Sopenharmony_ci.. _msi-gui:
4417db96d56Sopenharmony_ci
4427db96d56Sopenharmony_ciGUI classes
4437db96d56Sopenharmony_ci-----------
4447db96d56Sopenharmony_ci
4457db96d56Sopenharmony_ci:mod:`msilib` provides several classes that wrap the GUI tables in an MSI
4467db96d56Sopenharmony_cidatabase. However, no standard user interface is provided.
4477db96d56Sopenharmony_ci
4487db96d56Sopenharmony_ci
4497db96d56Sopenharmony_ci.. class:: Control(dlg, name)
4507db96d56Sopenharmony_ci
4517db96d56Sopenharmony_ci   Base class of the dialog controls. *dlg* is the dialog object the control
4527db96d56Sopenharmony_ci   belongs to, and *name* is the control's name.
4537db96d56Sopenharmony_ci
4547db96d56Sopenharmony_ci
4557db96d56Sopenharmony_ci   .. method:: event(event, argument, condition=1, ordering=None)
4567db96d56Sopenharmony_ci
4577db96d56Sopenharmony_ci      Make an entry into the ``ControlEvent`` table for this control.
4587db96d56Sopenharmony_ci
4597db96d56Sopenharmony_ci
4607db96d56Sopenharmony_ci   .. method:: mapping(event, attribute)
4617db96d56Sopenharmony_ci
4627db96d56Sopenharmony_ci      Make an entry into the ``EventMapping`` table for this control.
4637db96d56Sopenharmony_ci
4647db96d56Sopenharmony_ci
4657db96d56Sopenharmony_ci   .. method:: condition(action, condition)
4667db96d56Sopenharmony_ci
4677db96d56Sopenharmony_ci      Make an entry into the ``ControlCondition`` table for this control.
4687db96d56Sopenharmony_ci
4697db96d56Sopenharmony_ci
4707db96d56Sopenharmony_ci.. class:: RadioButtonGroup(dlg, name, property)
4717db96d56Sopenharmony_ci
4727db96d56Sopenharmony_ci   Create a radio button control named *name*. *property* is the installer property
4737db96d56Sopenharmony_ci   that gets set when a radio button is selected.
4747db96d56Sopenharmony_ci
4757db96d56Sopenharmony_ci
4767db96d56Sopenharmony_ci   .. method:: add(name, x, y, width, height, text, value=None)
4777db96d56Sopenharmony_ci
4787db96d56Sopenharmony_ci      Add a radio button named *name* to the group, at the coordinates *x*, *y*,
4797db96d56Sopenharmony_ci      *width*, *height*, and with the label *text*. If *value* is ``None``, it
4807db96d56Sopenharmony_ci      defaults to *name*.
4817db96d56Sopenharmony_ci
4827db96d56Sopenharmony_ci
4837db96d56Sopenharmony_ci.. class:: Dialog(db, name, x, y, w, h, attr, title, first,  default, cancel)
4847db96d56Sopenharmony_ci
4857db96d56Sopenharmony_ci   Return a new :class:`Dialog` object. An entry in the ``Dialog`` table is made,
4867db96d56Sopenharmony_ci   with the specified coordinates, dialog attributes, title, name of the first,
4877db96d56Sopenharmony_ci   default, and cancel controls.
4887db96d56Sopenharmony_ci
4897db96d56Sopenharmony_ci
4907db96d56Sopenharmony_ci   .. method:: control(name, type, x, y, width, height,  attributes, property, text, control_next, help)
4917db96d56Sopenharmony_ci
4927db96d56Sopenharmony_ci      Return a new :class:`Control` object. An entry in the ``Control`` table is
4937db96d56Sopenharmony_ci      made with the specified parameters.
4947db96d56Sopenharmony_ci
4957db96d56Sopenharmony_ci      This is a generic method; for specific types, specialized methods are
4967db96d56Sopenharmony_ci      provided.
4977db96d56Sopenharmony_ci
4987db96d56Sopenharmony_ci
4997db96d56Sopenharmony_ci   .. method:: text(name, x, y, width, height, attributes, text)
5007db96d56Sopenharmony_ci
5017db96d56Sopenharmony_ci      Add and return a ``Text`` control.
5027db96d56Sopenharmony_ci
5037db96d56Sopenharmony_ci
5047db96d56Sopenharmony_ci   .. method:: bitmap(name, x, y, width, height, text)
5057db96d56Sopenharmony_ci
5067db96d56Sopenharmony_ci      Add and return a ``Bitmap`` control.
5077db96d56Sopenharmony_ci
5087db96d56Sopenharmony_ci
5097db96d56Sopenharmony_ci   .. method:: line(name, x, y, width, height)
5107db96d56Sopenharmony_ci
5117db96d56Sopenharmony_ci      Add and return a ``Line`` control.
5127db96d56Sopenharmony_ci
5137db96d56Sopenharmony_ci
5147db96d56Sopenharmony_ci   .. method:: pushbutton(name, x, y, width, height, attributes,  text, next_control)
5157db96d56Sopenharmony_ci
5167db96d56Sopenharmony_ci      Add and return a ``PushButton`` control.
5177db96d56Sopenharmony_ci
5187db96d56Sopenharmony_ci
5197db96d56Sopenharmony_ci   .. method:: radiogroup(name, x, y, width, height,  attributes, property, text, next_control)
5207db96d56Sopenharmony_ci
5217db96d56Sopenharmony_ci      Add and return a ``RadioButtonGroup`` control.
5227db96d56Sopenharmony_ci
5237db96d56Sopenharmony_ci
5247db96d56Sopenharmony_ci   .. method:: checkbox(name, x, y, width, height,  attributes, property, text, next_control)
5257db96d56Sopenharmony_ci
5267db96d56Sopenharmony_ci      Add and return a ``CheckBox`` control.
5277db96d56Sopenharmony_ci
5287db96d56Sopenharmony_ci
5297db96d56Sopenharmony_ci.. seealso::
5307db96d56Sopenharmony_ci
5317db96d56Sopenharmony_ci   `Dialog Table <https://msdn.microsoft.com/en-us/library/windows/desktop/aa368286.aspx>`_
5327db96d56Sopenharmony_ci   `Control Table <https://msdn.microsoft.com/en-us/library/windows/desktop/aa368044.aspx>`_
5337db96d56Sopenharmony_ci   `Control Types <https://msdn.microsoft.com/en-us/library/windows/desktop/aa368039.aspx>`_
5347db96d56Sopenharmony_ci   `ControlCondition Table <https://msdn.microsoft.com/en-us/library/windows/desktop/aa368035.aspx>`_
5357db96d56Sopenharmony_ci   `ControlEvent Table <https://msdn.microsoft.com/en-us/library/windows/desktop/aa368037.aspx>`_
5367db96d56Sopenharmony_ci   `EventMapping Table <https://msdn.microsoft.com/en-us/library/windows/desktop/aa368559.aspx>`_
5377db96d56Sopenharmony_ci   `RadioButton Table <https://msdn.microsoft.com/en-us/library/windows/desktop/aa370962.aspx>`_
5387db96d56Sopenharmony_ci
5397db96d56Sopenharmony_ci.. _msi-tables:
5407db96d56Sopenharmony_ci
5417db96d56Sopenharmony_ciPrecomputed tables
5427db96d56Sopenharmony_ci------------------
5437db96d56Sopenharmony_ci
5447db96d56Sopenharmony_ci:mod:`msilib` provides a few subpackages that contain only schema and table
5457db96d56Sopenharmony_cidefinitions. Currently, these definitions are based on MSI version 2.0.
5467db96d56Sopenharmony_ci
5477db96d56Sopenharmony_ci
5487db96d56Sopenharmony_ci.. data:: schema
5497db96d56Sopenharmony_ci
5507db96d56Sopenharmony_ci   This is the standard MSI schema for MSI 2.0, with the *tables* variable
5517db96d56Sopenharmony_ci   providing a list of table definitions, and *_Validation_records* providing the
5527db96d56Sopenharmony_ci   data for MSI validation.
5537db96d56Sopenharmony_ci
5547db96d56Sopenharmony_ci
5557db96d56Sopenharmony_ci.. data:: sequence
5567db96d56Sopenharmony_ci
5577db96d56Sopenharmony_ci   This module contains table contents for the standard sequence tables:
5587db96d56Sopenharmony_ci   *AdminExecuteSequence*, *AdminUISequence*, *AdvtExecuteSequence*,
5597db96d56Sopenharmony_ci   *InstallExecuteSequence*, and *InstallUISequence*.
5607db96d56Sopenharmony_ci
5617db96d56Sopenharmony_ci
5627db96d56Sopenharmony_ci.. data:: text
5637db96d56Sopenharmony_ci
5647db96d56Sopenharmony_ci   This module contains definitions for the UIText and ActionText tables, for the
5657db96d56Sopenharmony_ci   standard installer actions.
566