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

Side by Side Diff: installer/src/installer-lib/record.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 record.cpp Implementation of Session class. 2 * \file record.cpp Implementation of Session class.
3 */ 3 */
4 4
5 #include "record.h" 5 #include "record.h"
6 #include "msiquery.h" 6 #include "msiquery.h"
7 7
8 //------------------------------------------------------------------------------ ----------- 8 //------------------------------------------------------------------------------ -----------
9 // Record 9 // Record
10 //------------------------------------------------------------------------------ ----------- 10 //------------------------------------------------------------------------------ -----------
11 Record::Record( unsigned int n_fields ) 11 Record::Record( unsigned int n_fields )
12 : n_fields( n_fields )
13 { 12 {
14 _handle = MsiCreateRecord( n_fields ) ; 13 _handle = MsiCreateRecord( n_fields ) ;
15 if ( ! _handle ) 14 if ( ! _handle )
16 { 15 {
17 throw std::runtime_error( "Failed to create record" ) ; 16 throw std::runtime_error( "Failed to create record" ) ;
18 } 17 }
19 } 18 }
20 19
21 Record::~Record() 20 Record::~Record()
22 { 21 {
23 MsiCloseHandle( _handle ) ; 22 if ( _handle != 0 )
23 {
24 MsiCloseHandle( _handle ) ;
25 }
24 } 26 }
25 27
26 void 28 void Record::only_non_null()
27 Record::assign_string( unsigned int field_index, std::wstring value )
28 { 29 {
29 MsiRecordSetString( _handle, field_index, value.c_str() ) ; 30 if ( _handle == 0 )
31 {
32 throw std::runtime_error( "Operation only permitted for non-null objects" ) ;
33 }
34 }
35
36 void Record::assign_string( unsigned int field_index, const char *value )
37 {
38 only_non_null() ;
39 MsiRecordSetStringA( _handle, field_index, value ) ;
40 }
41
42 void Record::assign_string( unsigned int field_index, const wchar_t *value )
43 {
44 only_non_null() ;
45 MsiRecordSetStringW( _handle, field_index, value ) ;
46 }
47
48 /**
49 * \par Implementation
50 * - MSDN [MsiRecordGetString](http://msdn.microsoft.com/en-us/library/aa3703 68%28v=vs.85%29.aspx)
51 */
52 std::wstring Record::value_string( unsigned int field_index )
53 {
54 static wchar_t initial_buffer[ 256 ] = L"" ;
55 DWORD length = 255 ; // one less than the buffer length to hold a terminating null character
56 UINT x = MsiRecordGetStringW( _handle, field_index, initial_buffer, & length ) ;
57 if ( x == ERROR_SUCCESS )
58 {
59 return std::wstring( initial_buffer ) ;
60 }
61 if ( x == ERROR_MORE_DATA )
62 {
63 // Future: handle longer strings.
64 throw std::runtime_error( "Record strings longer than 255 not supported yet" ) ;
65 }
66 throw std::runtime_error( "Error retrieving string from record" ) ;
67 }
68
69 size_t Record::n_fields() const
70 {
71 unsigned int x = MsiRecordGetFieldCount( _handle ) ;
72 if ( x == 0xFFFFFFFF )
Oleksandr 2014/03/12 19:26:04 We use INVALID_HANDLE_VALUE pretty much everywhere
Eric 2014/03/17 12:26:46 This is the return value as documented on the MsiR
73 {
74 throw std::runtime_error( "Invalid handle" ) ;
75 }
76 return x ;
30 } 77 }
OLDNEW

Powered by Google App Engine
This is Rietveld