Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: installer/src/installer-lib/session.cpp

Issue 5675960980471808: Updated installer with custom action (Closed)
Patch Set: Created March 8, 2014, 5:06 a.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
OLDNEW
1 /** 1 /**
2 * \file session.cpp Implementation of Session class. 2 * \file session.cpp Implementation of Session class.
3 */ 3 */
4 4
5 #include "session.h" 5 #include "session.h"
6 #include "property.h" 6 #include "property.h"
7 #include "msiquery.h" 7 #include "msiquery.h"
8 8
9 // Temporary for debugging
10 #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.
11
12
13 //------------------------------------------------------------------------------ -----------
14 // Message
15 //------------------------------------------------------------------------------ -----------
16 Message::Message( std::string message, INSTALLMESSAGE message_type )
17 : r( 1 ), message_type( message_type )
18 {
19 r.assign_string( 0, message ) ;
20 }
21
22 Message::Message( std::wstring message, INSTALLMESSAGE message_type )
23 : r( 1 ), message_type( message_type )
24 {
25 r.assign_string( 0, message ) ;
26 }
27
9 //------------------------------------------------------------------------------ ----------- 28 //------------------------------------------------------------------------------ -----------
10 // Session 29 // Session
11 //------------------------------------------------------------------------------ ----------- 30 //------------------------------------------------------------------------------ -----------
12 Session::Session( MSIHANDLE handle, std::wstring name ) 31 Session::Session( MSIHANDLE handle, std::string name )
13 : handle( handle ), 32 : handle( handle ),
14 log_prefix( name + L": " ) 33 log_prefix( name + ": " )
15 { 34 {
16 log( L"Entering custom action" ) ; 35 log_prefix_w.assign( name.begin(), name.end() ) ;
36 log_prefix_w += L": " ;
37 log_noexcept( "Entering custom action" ) ;
38 }
39
40 Session::~Session()
41 {
42 log_noexcept( "Exiting custom action" ) ;
17 } 43 }
18 44
19 /** 45 /**
20 * \par Implementation Notes 46 * A message for the installation log.
21 * The session handle doesn't need to be closed. 47 *
22 * It's provided as an argument to the custom action at the outset, and we do not manage its life cycle. 48 * Writing to the installation log uses MsiProcessMessage just like interactive dialog boxes do.
49 *
50 * This class is not exposed outside this compilation unit because everything it can do is already exposed by the log functions.
23 */ 51 */
24 Session::~Session() 52 struct Log_Message
53 : public Message
25 { 54 {
26 log( L"Exiting custom action" ) ; 55 Log_Message ( std::wstring message )
56 : Message( message, INSTALLMESSAGE_INFO )
57 {}
58
59 Log_Message ( std::string message )
60 : Message( message, INSTALLMESSAGE_INFO )
61 {}
62 } ;
63
64 void Session::log( std::string message )
65 {
66 write_message( Log_Message( log_prefix + message ) ) ;
27 } 67 }
28 68
29 /**
30 * \par Implementation Notes
31 * To write to the installation log, we use a call to MsiProcessMessage with message type INSTALLMESSAGE_INFO.
32 * The text to be written needs to go in a "record" (yes, a database record) that acts as an argument vector.
33 * For the message type we're using, we need only a record with a single fiel d.
34 *
35 * \sa MSDN "MsiProcessMessage function"
36 * http://msdn.microsoft.com/en-us/library/windows/desktop/aa370354%28v=vs.85 %29.aspx
37 * MsiProcessMessage is mostly for user interaction with message boxes, but i t's also the access to the installation log.
38 */
39 void Session::log( std::wstring message ) 69 void Session::log( std::wstring message )
40 { 70 {
41 Record r = Record( 1 ); 71 write_message( Log_Message( log_prefix_w + message ) ) ;
42 r.assign_string( 0, log_prefix + message );
43 int e = MsiProcessMessage( handle, INSTALLMESSAGE_INFO, r.handle() ) ;
44 if ( e != IDOK )
45 {
46 throw std::runtime_error( "Did not succeed writing to log." ) ;
47 }
48 } 72 }
49 73
50 Immediate_Session::Immediate_Session( MSIHANDLE handle, std::wstring name ) 74 void Session::log_noexcept( std::string message )
75 {
76 write_message_noexcept( Log_Message( log_prefix + message ) ) ;
77 }
78
79 int Session::write_message( Message & m )
80 {
81 int x = write_message_noexcept( m ) ;
82 if ( x == -1 )
83 {
84 DWORD z = ::GetLastError();
85 std::ostringstream s ;
86 s << "Error writing message. err = 0x" << std::hex << z ;
87 throw std::runtime_error( s.str() ) ;
88 }
89 return x ;
90 }
91
92 int Session::write_message_noexcept( Message & m )
93 {
94 return MsiProcessMessage( handle, m.message_type, m.r.handle() ) ;
95 }
96
97 //------------------------------------------------------------------------------ -----------
98 // Immediate_Session
99 //------------------------------------------------------------------------------ -----------
100 Immediate_Session::Immediate_Session( MSIHANDLE handle, std::string name )
51 : Session( handle, name ) 101 : Session( handle, name )
52 { 102 {}
53 }
OLDNEW

Powered by Google App Engine
This is Rietveld