Index: installer/src/installer-lib/session.cpp |
=================================================================== |
--- a/installer/src/installer-lib/session.cpp |
+++ b/installer/src/installer-lib/session.cpp |
@@ -5,49 +5,98 @@ |
#include "session.h" |
#include "property.h" |
#include "msiquery.h" |
+ |
+// Temporary for debugging |
+#include <sstream> |
Oleksandr
2014/03/12 19:26:04
Not needed anymore, is it?
Eric
2014/03/17 12:26:46
It's used in Session::write_message.
|
+ |
+ |
+//----------------------------------------------------------------------------------------- |
+// Message |
+//----------------------------------------------------------------------------------------- |
+Message::Message( std::string message, INSTALLMESSAGE message_type ) |
+ : r( 1 ), message_type( message_type ) |
+{ |
+ r.assign_string( 0, message ) ; |
+} |
+ |
+Message::Message( std::wstring message, INSTALLMESSAGE message_type ) |
+ : r( 1 ), message_type( message_type ) |
+{ |
+ r.assign_string( 0, message ) ; |
+} |
//----------------------------------------------------------------------------------------- |
// Session |
//----------------------------------------------------------------------------------------- |
-Session::Session( MSIHANDLE handle, std::wstring name ) |
+Session::Session( MSIHANDLE handle, std::string name ) |
: handle( handle ), |
- log_prefix( name + L": " ) |
+ log_prefix( name + ": " ) |
{ |
- log( L"Entering custom action" ) ; |
+ log_prefix_w.assign( name.begin(), name.end() ) ; |
+ log_prefix_w += L": " ; |
+ log_noexcept( "Entering custom action" ) ; |
+} |
+ |
+Session::~Session() |
+{ |
+ log_noexcept( "Exiting custom action" ) ; |
} |
/** |
- * \par Implementation Notes |
- * The session handle doesn't need to be closed. |
- * It's provided as an argument to the custom action at the outset, and we do not manage its life cycle. |
+ * A message for the installation log. |
+ * |
+ * Writing to the installation log uses MsiProcessMessage just like interactive dialog boxes do. |
+ * |
+ * This class is not exposed outside this compilation unit because everything it can do is already exposed by the log functions. |
*/ |
-Session::~Session() |
+struct Log_Message |
+ : public Message |
{ |
- log( L"Exiting custom action" ) ; |
+ Log_Message ( std::wstring message ) |
+ : Message( message, INSTALLMESSAGE_INFO ) |
+ {} |
+ |
+ Log_Message ( std::string message ) |
+ : Message( message, INSTALLMESSAGE_INFO ) |
+ {} |
+} ; |
+ |
+void Session::log( std::string message ) |
+{ |
+ write_message( Log_Message( log_prefix + message ) ) ; |
} |
-/** |
- * \par Implementation Notes |
- * To write to the installation log, we use a call to MsiProcessMessage with message type INSTALLMESSAGE_INFO. |
- * The text to be written needs to go in a "record" (yes, a database record) that acts as an argument vector. |
- * For the message type we're using, we need only a record with a single field. |
- * |
- * \sa MSDN "MsiProcessMessage function" |
- * http://msdn.microsoft.com/en-us/library/windows/desktop/aa370354%28v=vs.85%29.aspx |
- * MsiProcessMessage is mostly for user interaction with message boxes, but it's also the access to the installation log. |
- */ |
void Session::log( std::wstring message ) |
{ |
- Record r = Record( 1 ); |
- r.assign_string( 0, log_prefix + message ); |
- int e = MsiProcessMessage( handle, INSTALLMESSAGE_INFO, r.handle() ) ; |
- if ( e != IDOK ) |
- { |
- throw std::runtime_error( "Did not succeed writing to log." ) ; |
- } |
+ write_message( Log_Message( log_prefix_w + message ) ) ; |
} |
-Immediate_Session::Immediate_Session( MSIHANDLE handle, std::wstring name ) |
+void Session::log_noexcept( std::string message ) |
+{ |
+ write_message_noexcept( Log_Message( log_prefix + message ) ) ; |
+} |
+ |
+int Session::write_message( Message & m ) |
+{ |
+ int x = write_message_noexcept( m ) ; |
+ if ( x == -1 ) |
+ { |
+ DWORD z = ::GetLastError(); |
+ std::ostringstream s ; |
+ s << "Error writing message. err = 0x" << std::hex << z ; |
+ throw std::runtime_error( s.str() ) ; |
+ } |
+ return x ; |
+} |
+ |
+int Session::write_message_noexcept( Message & m ) |
+{ |
+ return MsiProcessMessage( handle, m.message_type, m.r.handle() ) ; |
+} |
+ |
+//----------------------------------------------------------------------------------------- |
+// Immediate_Session |
+//----------------------------------------------------------------------------------------- |
+Immediate_Session::Immediate_Session( MSIHANDLE handle, std::string name ) |
: Session( handle, name ) |
-{ |
-} |
+{} |