| Index: installer/src/installer-lib/session.cpp | 
| =================================================================== | 
| new file mode 100644 | 
| --- /dev/null | 
| +++ b/installer/src/installer-lib/session.cpp | 
| @@ -0,0 +1,53 @@ | 
| +/** | 
| + * \file session.cpp Implementation of Session class. | 
| + */ | 
| + | 
| +#include "session.h" | 
| +#include "property.h" | 
| +#include "msiquery.h" | 
| + | 
| +//----------------------------------------------------------------------------------------- | 
| +// Session | 
| +//----------------------------------------------------------------------------------------- | 
| +Session::Session( MSIHANDLE handle, std::wstring name ) | 
| +  : handle( handle ), | 
| +  log_prefix( name + L": " ) | 
| +{ | 
| +  log( L"Entering 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. | 
| + */ | 
| +Session::~Session() | 
| +{ | 
| +  log( L"Exiting custom action" ) ; | 
| +} | 
| + | 
| +/** | 
| + * \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." ) ; | 
| +  } | 
| +} | 
| + | 
| +Immediate_Session::Immediate_Session( MSIHANDLE handle, std::wstring name ) | 
| +  : Session( handle, name ) | 
| +{ | 
| +} | 
|  |