Index: installer/src/installer-lib/session.h |
=================================================================== |
new file mode 100644 |
--- /dev/null |
+++ b/installer/src/installer-lib/session.h |
@@ -0,0 +1,170 @@ |
+/** |
+ * \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" |
Wladimir Palant
2013/10/29 08:49:26
You should forward-declare the classes instead of
Eric
2013/10/29 14:00:58
"record.h" I think is some dead code I forgot to r
|
+ |
+#include <string> |
+#include "windows.h" |
+#include "msi.h" |
+ |
+//----------------------------------------------------------------------------------------- |
+// 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. |
+ */ |
+ void log( std::wstring 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. |
+ */ |
+ Session( MSIHANDLE handle, std::wstring name ) ; |
+ |
+protected: |
+ /** |
+ * Handle for the Windows Installer session. |
+ */ |
+ MSIHANDLE handle ; |
+ |
+private: |
+ /** |
+ * Prefix for log messages. Contains the name of the custom action. |
+ */ |
+ std::wstring log_prefix ; |
+ |
+ /** |
+ * Private copy constructor is declared but not defined. |
+ */ |
+ Session( const Session & ) ; |
+ |
+ /** |
+ * Private assignment operator is declared but not defined. |
+ */ |
+ Session & operator=( const Session & ) ; |
+ |
+ /** |
+ * The Property class requires access to the session handle. |
+ */ |
+ friend Property::Property( Session & session, std::wstring name ) ; |
Wladimir Palant
2013/10/29 08:49:26
The main purpose of this class is holding the sess
Eric
2013/10/29 14:00:58
Well, it's a design goal of mine to hide the handl
Wladimir Palant
2013/10/29 15:06:38
Lifetime management is easily solved - either you
|
+}; |
+ |
+//----------------------------------------------------------------------------------------- |
+// Immediate_Session |
+//----------------------------------------------------------------------------------------- |
+/** |
+ * 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 Immediate_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. |
+ */ |
+ Immediate_Session( MSIHANDLE handle, std::wstring name ) ; |
+ |
+private: |
+ /* |
+ * Allow helper function for Installation_Database constructor to have access to the handle. |
+ */ |
+ friend MSIHANDLE get_active_database( Immediate_Session & 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 ) ; |
+}; |
Wladimir Palant
2013/10/29 08:49:26
As with the Database object, I'm not a fan of the
|
+ |
+ |
+//----------------------------------------------------------------------------------------- |
+// 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 |