| Index: installer/src/installer-lib/session.h |
| =================================================================== |
| --- a/installer/src/installer-lib/session.h |
| +++ b/installer/src/installer-lib/session.h |
| @@ -2,253 +2,253 @@ |
| * \file session.h The "install session" is the context for all custom installation behavior. |
| */ |
| -#ifndef SESSION_H |
| -#define SESSION_H |
| - |
| -#include "property.h" |
| -#include "record.h" |
| - |
| -#include <string> |
| -#include "windows.h" |
| -#include "msi.h" |
| - |
| -//----------------------------------------------------------------------------------------- |
| -// Message |
| -//----------------------------------------------------------------------------------------- |
| -/** |
| -* Wrapper class for arguments to MsiProcessMessage. |
| -* |
| -* The "user interface" for custom actions includes both interactive dialog boxes as well as the installation log. |
| -* All of them use the same call, MsiProcessMessage. |
| -* This class encapsulates its arguments. |
| -* |
| -* \sa |
| -* * MSDN [MsiProcessMessage function](http://msdn.microsoft.com/en-us/library/windows/desktop/aa370354%28v=vs.85%29.aspx) |
| -* * MSDN [Sending Messages to Windows Installer Using MsiProcessMessage](http://msdn.microsoft.com/en-us/library/windows/desktop/aa371614%28v=vs.85%29.aspx) |
| -*/ |
| -class Message |
| -{ |
| -protected: |
| - /** |
| - * The flags used by MsiProcessMessage as the box type. |
| - */ |
| - INSTALLMESSAGE message_type ; |
| - |
| - /** |
| - * The record argument to MsiProcessMessage |
| - */ |
| - Record r ; |
| - |
| - Message( std::string message, INSTALLMESSAGE message_type ) ; |
| - |
| - Message( std::wstring message, INSTALLMESSAGE message_type ) ; |
| - |
| - /** |
| - * This class is a helper for Session, mustering all the arguments for MsiProcessMessage except for the session handle. |
| - */ |
| - friend Session ; |
| -} ; |
| - |
| -//----------------------------------------------------------------------------------------- |
| -// Session |
| -//----------------------------------------------------------------------------------------- |
| -/** |
| -* A Windows Installer session |
| -* |
| -* Always instantiate an instance of this class at the start of each custom action. |
| -* Copy and assignment are disabled, so session objects are always passed by reference. |
| -* |
| -* This class is the base for both immediate and deferred custom actions. |
| -* Immediate custom actions always have an installer database associated with them; deferred actions never do. |
| -* Both immediate and deferred actions may be executed synchronously or asynchronously; this class is silent about any difference. |
| -* |
| -* \par Notes |
| -* This class is patterned after WcaInitialize/WcaFinalize of the WiX custom action library. |
| -* There are two things that class does that this one does not. |
| -* - Extract the file version information from the DLL using GetModuleFileName* and GetFileVersionInfo* system calls. |
| -* - Set a "global atom" (a Windows system object) to store the logging state, later to be accessed by deferred actions. |
| -*/ |
| -class Session { |
| -public: |
| - /** |
| - * Destructor. |
| - */ |
| - ~Session() ; |
| - |
| - /** |
| - * Write a message to the installation log, regular string version. |
| - */ |
| - void Log( std::string message ) ; |
| - |
| - /** |
| - * Write a message to the installation log, wide string version. |
| - */ |
| - void Log( std::wstring message ) ; |
| - |
| - /** |
| - * Write a message to the installation log without raising an exception. |
| - * |
| - * Use this function only in the three circumstances when an exception cannot be caught by an entry point catch-all. |
| - * First and second, there's the constructor and destructor of a Session instance. |
| - * These log entry into and exit from the custom action, respectively. |
| - * Third, there's the top level catch-blocks of the CA. |
| - * The scope of the Session object cannot be within the try-block in order for it to be in scope for the catch-block. |
| - * The session must be in scope in the catch-block to allow logging error messages. |
| - * In all other cases, use the exception mechanism. |
| - */ |
| - void LogNoexcept( std::string message ) ; |
| - |
| - /** |
| - * Write to a MessageBox dialog. |
| - */ |
| - int WriteMessage( Message & ) ; |
| - |
| -protected: |
| - /** |
| - * Ordinary constructor is protected; public constructors are all in subclasses. |
| - * The MSI system uses a single handle type for all types of sessions. This handle is here in this base class. |
| - * |
| - * \param[in] handle |
| - * Handle for the Windows Installer session provided as an argument to a custom action. |
| - * \param[in] name |
| - * The name of the custom action, used for logging. |
| - * This string must be ASCII characters only, so that its wide-character version displays identically. |
| - */ |
| - Session( MSIHANDLE handle, std::string name ) ; |
| - |
| - /** |
| - * Handle for the Windows Installer session. |
| - * |
| - * The life cycle of the session handle is not the responsibility of the base class. |
| - * In an interactive session, the handle is provided as an argument to the custom action entry point, and we do not manage its life cycle. |
| - * In an offline session, the handle is created in the (subclass) constructor. |
| - */ |
| - MSIHANDLE handle ; |
| - |
| -private: |
| - /** |
| - * Prefix for log messages, regular string. Contains the name of the custom action. |
| - */ |
| - std::string log_prefix ; |
| - |
| - /** |
| - * Prefix for log messages, wide string. Contains the name of the custom action. |
| - */ |
| - std::wstring log_prefix_w ; |
| - |
| - /** |
| - * Private copy constructor is declared but not defined. |
| - * |
| - * C++11: declare with <b>= delete</b>. |
| - */ |
| - Session( const Session & ) ; |
| - |
| - /** |
| - * Write a message with MsiProcessMessage and throw no exceptions. |
| - * |
| - * This is declared private because there are very few cases in which no-exception behavior is required. |
| - * |
| - * C++11: declare with **noexcept**. |
| - */ |
| - int write_message_noexcept( Message & m ) ; |
| - |
| - /** |
| - * Private assignment operator is declared but not defined. |
| - * |
| - * C++11: declare with <b>= delete</b>. |
| - */ |
| - Session & operator=( const Session & ) ; |
| - |
| - /** |
| - * The Property class requires access to the session handle. |
| - */ |
| - friend Property::Property( Session & session, std::wstring name ) ; |
| -}; |
| - |
| -//----------------------------------------------------------------------------------------- |
| -// ImmediateSession |
| -//----------------------------------------------------------------------------------------- |
| -/** |
| -* Session for immediate custom actions. |
| -* |
| -* Access to the installer database is by passing a reference to a class of this subtype to a Database constructor. |
| -*/ |
| -class ImmediateSession : public Session |
| -{ |
| -public: |
| - /** |
| - * Ordinary constructor. |
| - * |
| - * \param[in] handle |
| - * Handle for the Windows Installer session provided as an argument to a custom action. |
| - * \param[in] name |
| - * The name of the custom action, used for logging. |
| - * |
| - * **noexcept** declaration to be added for C++11. |
| - */ |
| - ImmediateSession( MSIHANDLE handle, std::string name ) ; |
| - |
| -private: |
| - /* |
| - * Allow helper function for Installation_Database constructor to have access to the handle. |
| - */ |
| - friend msi_handle get_active_database( ImmediateSession & session ) ; |
| -}; |
| - |
| - |
| -//----------------------------------------------------------------------------------------- |
| -// Deferred_Session |
| -//----------------------------------------------------------------------------------------- |
| -/** |
| -* Session for deferred custom actions. |
| -* |
| -* There's much less context information easily available from a deferred custom action. |
| -* |
| -* /sa MDSN "Deferred Execution Custom Actions" |
| -* http://msdn.microsoft.com/en-us/library/windows/desktop/aa368268%28v=vs.85%29.aspx |
| -* for general information. |
| -* |
| -* /sa MSDN "Obtaining Context Information for Deferred Execution Custom Actions" |
| -* http://msdn.microsoft.com/en-us/library/windows/desktop/aa370543%28v=vs.85%29.aspx |
| -* lists the API calls available. |
| -*/ |
| -class Deferred_Session : public Session |
| -{ |
| -public: |
| - /** |
| - * Ordinary constructor. |
| - * |
| - * \param[in] handle |
| - * Handle for the Windows Installer session provided as an argument to a custom action. |
| - * \param[in] name |
| - * The name of the custom action, used for logging. |
| - */ |
| - Deferred_Session( MSIHANDLE handle, std::wstring name ) ; |
| -}; |
| - |
| - |
| -//----------------------------------------------------------------------------------------- |
| -// Commit_Session |
| -//----------------------------------------------------------------------------------------- |
| -/** |
| -* The session for a commit custom action. NOT IMPLEMENTED. |
| -* |
| -* \sa MSDN "Commit Custom Actions" http://msdn.microsoft.com/en-us/library/windows/desktop/aa367991%28v=vs.85%29.aspx |
| -*/ |
| -class Commit_Session |
| -{ |
| -}; |
| - |
| -//----------------------------------------------------------------------------------------- |
| -// Rollback_Session |
| -//----------------------------------------------------------------------------------------- |
| -/** |
| -* The session for a rollback custom action. NOT IMPLEMENTED. |
| -* |
| -* \sa MSDN "Rollback Custom Actions" http://msdn.microsoft.com/en-us/library/windows/desktop/aa371369%28v=vs.85%29.aspx |
| -*/ |
| -class Rollback_Session |
| -{ |
| -}; |
| - |
| -#endif |
| +#ifndef SESSION_H |
| +#define SESSION_H |
| + |
| +#include "property.h" |
| +#include "record.h" |
| + |
| +#include <string> |
| +#include "windows.h" |
| +#include "msi.h" |
| + |
| +//----------------------------------------------------------------------------------------- |
| +// Message |
| +//----------------------------------------------------------------------------------------- |
| +/** |
| + * Wrapper class for arguments to MsiProcessMessage. |
| + * |
| + * The "user interface" for custom actions includes both interactive dialog boxes as well as the installation log. |
| + * All of them use the same call, MsiProcessMessage. |
| + * This class encapsulates its arguments. |
| + * |
| + * \sa |
| + * * MSDN [MsiProcessMessage function](http://msdn.microsoft.com/en-us/library/windows/desktop/aa370354%28v=vs.85%29.aspx) |
| + * * MSDN [Sending Messages to Windows Installer Using MsiProcessMessage](http://msdn.microsoft.com/en-us/library/windows/desktop/aa371614%28v=vs.85%29.aspx) |
| + */ |
| +class Message |
| +{ |
| +protected: |
| + /** |
| + * The flags used by MsiProcessMessage as the box type. |
| + */ |
| + INSTALLMESSAGE MessageTypeCode ; |
| + |
| + /** |
| + * The record argument to MsiProcessMessage |
| + */ |
| + Record r ; |
| + |
| + Message( std::string message, INSTALLMESSAGE MessageTypeCode ) ; |
| + |
| + Message( std::wstring message, INSTALLMESSAGE MessageTypeCode ) ; |
| + |
| + /** |
| + * This class is a helper for Session, mustering all the arguments for MsiProcessMessage except for the session handle. |
| + */ |
| + friend Session ; |
| +} ; |
| + |
| +//----------------------------------------------------------------------------------------- |
| +// Session |
| +//----------------------------------------------------------------------------------------- |
| +/** |
| +* A Windows Installer session |
| +* |
| +* Always instantiate an instance of this class at the start of each custom action. |
| +* Copy and assignment are disabled, so session objects are always passed by reference. |
| +* |
| +* This class is the base for both immediate and deferred custom actions. |
| +* Immediate custom actions always have an installer database associated with them; deferred actions never do. |
| +* Both immediate and deferred actions may be executed synchronously or asynchronously; this class is silent about any difference. |
| +* |
| +* \par Notes |
| +* This class is patterned after WcaInitialize/WcaFinalize of the WiX custom action library. |
| +* There are two things that class does that this one does not. |
| +* - Extract the file version information from the DLL using GetModuleFileName* and GetFileVersionInfo* system calls. |
| +* - Set a "global atom" (a Windows system object) to store the logging state, later to be accessed by deferred actions. |
| +*/ |
| +class Session { |
| +public: |
| + /** |
| + * Destructor. |
| + */ |
| + ~Session() ; |
| + |
| + /** |
| + * Write a message to the installation log, regular string version. |
| + */ |
| + void Log( std::string message ) ; |
| + |
| + /** |
| + * Write a message to the installation log, wide string version. |
| + */ |
| + void Log( std::wstring message ) ; |
| + |
| + /** |
| + * Write a message to the installation log without raising an exception. |
| + * |
| + * Use this function only in the three circumstances when an exception cannot be caught by an entry point catch-all. |
| + * First and second, there's the constructor and destructor of a Session instance. |
| + * These log entry into and exit from the custom action, respectively. |
| + * Third, there's the top level catch-blocks of the CA. |
| + * The scope of the Session object cannot be within the try-block in order for it to be in scope for the catch-block. |
| + * The session must be in scope in the catch-block to allow logging error messages. |
| + * In all other cases, use the exception mechanism. |
| + */ |
| + void LogNoexcept( std::string message ) ; |
| + |
| + /** |
| + * Write to a MessageBox dialog. |
| + */ |
| + int WriteMessage( Message & ) ; |
| + |
| +protected: |
| + /** |
| + * Ordinary constructor is protected; public constructors are all in subclasses. |
| + * The MSI system uses a single handle type for all types of sessions. This handle is here in this base class. |
| + * |
| + * \param[in] handle |
| + * Handle for the Windows Installer session provided as an argument to a custom action. |
| + * \param[in] name |
| + * The name of the custom action, used for logging. |
| + * This string must be ASCII characters only, so that its wide-character version displays identically. |
| + */ |
| + Session( MSIHANDLE handle, std::string name ) ; |
| + |
| + /** |
| + * Handle for the Windows Installer session. |
| + * |
| + * The life cycle of the session handle is not the responsibility of the base class. |
| + * In an interactive session, the handle is provided as an argument to the custom action entry point, and we do not manage its life cycle. |
| + * In an offline session, the handle is created in the (subclass) constructor. |
| + */ |
| + MSIHANDLE handle ; |
| + |
| +private: |
| + /** |
| + * Prefix for log messages, regular string. Contains the name of the custom action. |
| + */ |
| + std::string logPrefix ; |
| + |
| + /** |
| + * Prefix for log messages, wide string. Contains the name of the custom action. |
| + */ |
| + std::wstring logPrefixW ; |
| + |
| + /** |
| + * Private copy constructor is declared but not defined. |
| + * |
| + * C++11: declare with <b>= delete</b>. |
| + */ |
| + Session( const Session & ) ; |
| + |
| + /** |
| + * Write a message with MsiProcessMessage and throw no exceptions. |
| + * |
| + * This is declared private because there are very few cases in which no-exception behavior is required. |
| + * |
| + * C++11: declare with **noexcept**. |
| + */ |
| + int WriteMessageNoexcept( Message & m ) ; |
| + |
| + /** |
| + * Private assignment operator is declared but not defined. |
| + * |
| + * C++11: declare with <b>= delete</b>. |
| + */ |
| + Session & operator=( const Session & ) ; |
| + |
| + /** |
| + * The Property class requires access to the session handle. |
| + */ |
| + friend Property::Property( Session & session, std::wstring name ) ; |
| +}; |
| + |
| +//----------------------------------------------------------------------------------------- |
| +// ImmediateSession |
| +//----------------------------------------------------------------------------------------- |
| +/** |
| +* Session for immediate custom actions. |
| +* |
| +* Access to the installer database is by passing a reference to a class of this subtype to a Database constructor. |
| +*/ |
| +class ImmediateSession : public Session |
| +{ |
| +public: |
| + /** |
| + * Ordinary constructor. |
| + * |
| + * \param[in] handle |
| + * Handle for the Windows Installer session provided as an argument to a custom action. |
| + * \param[in] name |
| + * The name of the custom action, used for logging. |
| + * |
| + * **noexcept** declaration to be added for C++11. |
| + */ |
| + ImmediateSession( MSIHANDLE handle, std::string name ) ; |
| + |
| +private: |
| + /* |
| + * Allow helper function for InstallationDatabase constructor to have access to the handle. |
| + */ |
| + friend MsiHandle GetActiveDatabase( ImmediateSession & session ) ; |
| +}; |
| + |
| + |
| +//----------------------------------------------------------------------------------------- |
| +// DeferredSession |
| +//----------------------------------------------------------------------------------------- |
| +/** |
| +* Session for deferred custom actions. |
| +* |
| +* There's much less context information easily available from a deferred custom action. |
| +* |
| +* /sa MDSN "Deferred Execution Custom Actions" |
| +* http://msdn.microsoft.com/en-us/library/windows/desktop/aa368268%28v=vs.85%29.aspx |
| +* for general information. |
| +* |
| +* /sa MSDN "Obtaining Context Information for Deferred Execution Custom Actions" |
| +* http://msdn.microsoft.com/en-us/library/windows/desktop/aa370543%28v=vs.85%29.aspx |
| +* lists the API calls available. |
| +*/ |
| +class DeferredSession : public Session |
| +{ |
| +public: |
| + /** |
| + * Ordinary constructor. |
| + * |
| + * \param[in] handle |
| + * Handle for the Windows Installer session provided as an argument to a custom action. |
| + * \param[in] name |
| + * The name of the custom action, used for logging. |
| + */ |
| + DeferredSession( MSIHANDLE handle, std::wstring name ) ; |
| +}; |
| + |
| + |
| +//----------------------------------------------------------------------------------------- |
| +// CommitSession |
| +//----------------------------------------------------------------------------------------- |
| +/** |
| +* The session for a commit custom action. NOT IMPLEMENTED. |
| +* |
| +* \sa MSDN "Commit Custom Actions" http://msdn.microsoft.com/en-us/library/windows/desktop/aa367991%28v=vs.85%29.aspx |
| +*/ |
| +class CommitSession |
| +{ |
| +}; |
| + |
| +//----------------------------------------------------------------------------------------- |
| +// RollbackSession |
| +//----------------------------------------------------------------------------------------- |
| +/** |
| +* The session for a rollback custom action. NOT IMPLEMENTED. |
| +* |
| +* \sa MSDN "Rollback Custom Actions" http://msdn.microsoft.com/en-us/library/windows/desktop/aa371369%28v=vs.85%29.aspx |
| +*/ |
| +class RollbackSession |
| +{ |
| +}; |
| + |
| +#endif |