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

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

Issue 6202981292703744: Whole installer (Closed)
Patch Set: Created June 24, 2014, 7:27 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 "installer-lib.h"
5 #include "session.h" 6 #include "session.h"
6 #include "property.h" 7 #include "property.h"
7 #include "msiquery.h" 8 #include "msiquery.h"
8 9
9 //------------------------------------------------------------------------------ ----------- 10 //------------------------------------------------------------------------------ -----------
11 // Message
12 //------------------------------------------------------------------------------ -----------
13 Message::Message( std::string message, INSTALLMESSAGE message_type )
14 : r( 1 ), message_type( message_type )
15 {
16 r.assign_string( 0, message ) ;
17 }
18
19 Message::Message( std::wstring message, INSTALLMESSAGE message_type )
20 : r( 1 ), message_type( message_type )
21 {
22 r.assign_string( 0, message ) ;
23 }
24
25 //------------------------------------------------------------------------------ -----------
10 // Session 26 // Session
11 //------------------------------------------------------------------------------ ----------- 27 //------------------------------------------------------------------------------ -----------
12 Session::Session( MSIHANDLE handle, std::wstring name ) 28 Session::Session( MSIHANDLE handle, std::string name )
13 : handle( handle ), 29 : handle( handle ),
14 log_prefix( name + L": " ) 30 log_prefix( name + ": " )
15 { 31 {
16 log( L"Entering custom action" ) ; 32 log_prefix_w.assign( name.begin(), name.end() ) ;
33 log_prefix_w += L": " ;
34 log_noexcept( "Entering custom action" ) ;
35 }
36
37 Session::~Session()
38 {
39 log_noexcept( "Exiting custom action" ) ;
17 } 40 }
18 41
19 /** 42 /**
20 * \par Implementation Notes 43 * A message for the installation log.
21 * The session handle doesn't need to be closed. 44 *
22 * It's provided as an argument to the custom action at the outset, and we do not manage its life cycle. 45 * Writing to the installation log uses MsiProcessMessage just like interactive d ialog boxes do.
23 */ 46 *
24 Session::~Session() 47 * This class is not exposed outside this compilation unit because everything it can do is already exposed by the log functions.
48 */
49 struct Log_Message
50 : public Message
25 { 51 {
26 log( L"Exiting custom action" ) ; 52 Log_Message ( std::wstring message )
53 : Message( message, INSTALLMESSAGE_INFO )
54 {}
55
56 Log_Message ( std::string message )
57 : Message( message, INSTALLMESSAGE_INFO )
58 {}
59 } ;
60
61 void Session::log( std::string message )
62 {
63 write_message( Log_Message( log_prefix + message ) ) ;
27 } 64 }
28 65
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 ) 66 void Session::log( std::wstring message )
40 { 67 {
41 Record r = Record( 1 ); 68 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 } 69 }
49 70
50 Immediate_Session::Immediate_Session( MSIHANDLE handle, std::wstring name ) 71 void Session::log_noexcept( std::string message )
72 {
73 write_message_noexcept( Log_Message( log_prefix + message ) ) ;
74 }
75
76 int Session::write_message( Message & m )
77 {
78 int x = write_message_noexcept( m ) ;
79 if ( x == -1 )
80 {
81 throw windows_api_error( "MsiProcessMessage", x, "attempt to write to log fi le" ) ;
82 }
83 return x ;
84 }
85
86 int Session::write_message_noexcept( Message & m )
87 {
88 return MsiProcessMessage( handle, m.message_type, m.r.handle() ) ;
89 }
90
91 //------------------------------------------------------------------------------ -----------
92 // Immediate_Session
93 //------------------------------------------------------------------------------ -----------
94 Immediate_Session::Immediate_Session( MSIHANDLE handle, std::string name )
51 : Session( handle, name ) 95 : Session( handle, name )
52 { 96 {}
53 }
OLDNEW

Powered by Google App Engine
This is Rietveld