| OLD | NEW |
| 1 /** | 1 /** |
| 2 * \file record.cpp Implementation of Record class. | 2 * \file record.cpp Implementation of Record class. |
| 3 */ | 3 */ |
| 4 | 4 |
| 5 #include "installer-lib.h" | 5 #include "installer-lib.h" |
| 6 #include "record.h" | 6 #include "record.h" |
| 7 #include "msiquery.h" | 7 #include "msiquery.h" |
| 8 | 8 |
| 9 //------------------------------------------------------------------------------
----------- | 9 //------------------------------------------------------------------------------
----------- |
| 10 // Record | 10 // Record |
| 11 //------------------------------------------------------------------------------
----------- | 11 //------------------------------------------------------------------------------
----------- |
| 12 Record::Record( unsigned int nFields ) | 12 Record::Record(unsigned int nFields) |
| 13 { | 13 { |
| 14 handle = MsiCreateRecord( nFields ) ; | 14 handle = MsiCreateRecord(nFields); |
| 15 if ( ! handle ) | 15 if (! handle) |
| 16 { | 16 { |
| 17 throw WindowsApiError( "MsiCreateRecord", 0 ) ; | 17 throw WindowsApiError("MsiCreateRecord", 0); |
| 18 } | 18 } |
| 19 } | 19 } |
| 20 | 20 |
| 21 Record::~Record() | 21 Record::~Record() |
| 22 { | 22 { |
| 23 if ( handle != 0 ) | 23 if (handle != 0) |
| 24 { | 24 { |
| 25 MsiCloseHandle( handle ) ; | 25 MsiCloseHandle(handle); |
| 26 } | 26 } |
| 27 } | 27 } |
| 28 | 28 |
| 29 void Record::OnlyNonNull() | 29 void Record::OnlyNonNull() |
| 30 { | 30 { |
| 31 if ( handle == 0 ) | 31 if (handle == 0) |
| 32 { | 32 { |
| 33 throw std::runtime_error( "Operation only permitted for non-null objects" )
; | 33 throw std::runtime_error("Operation only permitted for non-null objects"); |
| 34 } | 34 } |
| 35 } | 35 } |
| 36 | 36 |
| 37 void Record::AssignString( unsigned int fieldIndex, const char *value ) | 37 void Record::AssignString(unsigned int fieldIndex, const char* value) |
| 38 { | 38 { |
| 39 OnlyNonNull() ; | 39 OnlyNonNull(); |
| 40 MsiRecordSetStringA( handle, fieldIndex, value ) ; | 40 MsiRecordSetStringA(handle, fieldIndex, value); |
| 41 } | 41 } |
| 42 | 42 |
| 43 void Record::AssignString( unsigned int fieldIndex, const wchar_t *value ) | 43 void Record::AssignString(unsigned int fieldIndex, const wchar_t* value) |
| 44 { | 44 { |
| 45 OnlyNonNull() ; | 45 OnlyNonNull(); |
| 46 MsiRecordSetStringW( handle, fieldIndex, value ) ; | 46 MsiRecordSetStringW(handle, fieldIndex, value); |
| 47 } | 47 } |
| 48 | 48 |
| 49 /** | 49 /** |
| 50 * \par Implementation | 50 * \par Implementation |
| 51 * - MSDN [MsiRecordGetString](http://msdn.microsoft.com/en-us/library/aa37036
8%28v=vs.85%29.aspx) | 51 * - MSDN [MsiRecordGetString](http://msdn.microsoft.com/en-us/library/aa37036
8%28v=vs.85%29.aspx) |
| 52 */ | 52 */ |
| 53 std::wstring Record::ValueString( unsigned int fieldIndex ) | 53 std::wstring Record::ValueString(unsigned int fieldIndex) |
| 54 { | 54 { |
| 55 static wchar_t initialBuffer[ 1024 ] = L"" ; | 55 static wchar_t initialBuffer[1024] = L""; |
| 56 DWORD length = 1023 ; // one less than the buffer length to hold a terminating
null character | 56 DWORD length = 1023 ; // one less than the buffer length to hold a terminating
null character |
| 57 UINT x = MsiRecordGetStringW( handle, fieldIndex, initialBuffer, & length ) ; | 57 UINT x = MsiRecordGetStringW(handle, fieldIndex, initialBuffer, & length); |
| 58 if ( x == ERROR_SUCCESS ) | 58 if (x == ERROR_SUCCESS) |
| 59 { | 59 { |
| 60 return std::wstring( initialBuffer ) ; | 60 return std::wstring(initialBuffer); |
| 61 } | 61 } |
| 62 if ( x == ERROR_MORE_DATA ) | 62 if (x == ERROR_MORE_DATA) |
| 63 { | 63 { |
| 64 // Future: handle longer strings. | 64 // Future: handle longer strings. |
| 65 /* | 65 /* |
| 66 * The present custom action only uses this function for strings that appear
in dialog boxes. | 66 * The present custom action only uses this function for strings that appear
in dialog boxes. |
| 67 * A thousand characters is about a dozen lines of text, which is far more th
an enough. | 67 * A thousand characters is about a dozen lines of text, which is far more th
an enough. |
| 68 */ | 68 */ |
| 69 throw NotYetSupported( "retrieving string values longer than 1023 from a rec
ord" ) ; | 69 throw NotYetSupported("retrieving string values longer than 1023 from a reco
rd"); |
| 70 } | 70 } |
| 71 throw WindowsApiError( "MsiRecordGetStringW", x ) ; | 71 throw WindowsApiError("MsiRecordGetStringW", x); |
| 72 } | 72 } |
| 73 | 73 |
| 74 size_t Record::NumberOfFields() const | 74 size_t Record::NumberOfFields() const |
| 75 { | 75 { |
| 76 unsigned int x = MsiRecordGetFieldCount( handle ) ; | 76 unsigned int x = MsiRecordGetFieldCount(handle); |
| 77 if ( x == 0xFFFFFFFF ) | 77 if (x == 0xFFFFFFFF) |
| 78 { | 78 { |
| 79 throw WindowsApiError( "MsiRecordGetFieldCount", x, "invalid handle" ) ; | 79 throw WindowsApiError("MsiRecordGetFieldCount", x, "invalid handle"); |
| 80 } | 80 } |
| 81 return x ; | 81 return x; |
| 82 } | 82 } |
| OLD | NEW |