| Index: installer/src/installer-lib/record.cpp | 
| =================================================================== | 
| --- a/installer/src/installer-lib/record.cpp | 
| +++ b/installer/src/installer-lib/record.cpp | 
| @@ -5,78 +5,78 @@ | 
| #include "installer-lib.h" | 
| #include "record.h" | 
| #include "msiquery.h" | 
| - | 
| -//----------------------------------------------------------------------------------------- | 
| -// Record | 
| -//----------------------------------------------------------------------------------------- | 
| -Record::Record( unsigned int n_fields ) | 
| -{ | 
| -  _handle = MsiCreateRecord( n_fields ) ; | 
| -  if ( ! _handle ) | 
| -  { | 
| -    throw windows_api_error( "MsiCreateRecord", 0 ) ; | 
| -  } | 
| -} | 
| - | 
| -Record::~Record() | 
| -{ | 
| -  if ( _handle != 0 ) | 
| -  { | 
| -    MsiCloseHandle( _handle ) ; | 
| -  } | 
| -} | 
| - | 
| -void Record::only_non_null() | 
| -{ | 
| -  if ( _handle == 0 ) | 
| -  { | 
| -    throw std::runtime_error( "Operation only permitted for non-null objects" ) ; | 
| -  } | 
| -} | 
| - | 
| -void Record::assign_string( unsigned int field_index, const char *value ) | 
| -{ | 
| -  only_non_null() ; | 
| -  MsiRecordSetStringA( _handle, field_index, value ) ; | 
| -} | 
| - | 
| -void Record::assign_string( unsigned int field_index, const wchar_t *value ) | 
| -{ | 
| -  only_non_null() ; | 
| -  MsiRecordSetStringW( _handle, field_index, value ) ; | 
| -} | 
| - | 
| -/** | 
| -* \par Implementation | 
| -*    - MSDN [MsiRecordGetString](http://msdn.microsoft.com/en-us/library/aa370368%28v=vs.85%29.aspx) | 
| -*/ | 
| -std::wstring Record::value_string( unsigned int field_index ) | 
| -{ | 
| -  static wchar_t initial_buffer[ 1024 ] = L"" ; | 
| -  DWORD length = 1023 ; // one less than the buffer length to hold a terminating null character | 
| -  UINT x = MsiRecordGetStringW( _handle, field_index, initial_buffer, & length ) ; | 
| -  if ( x == ERROR_SUCCESS ) | 
| -  { | 
| -    return std::wstring( initial_buffer ) ; | 
| -  } | 
| -  if ( x == ERROR_MORE_DATA ) | 
| -  { | 
| -    // Future: handle longer strings. | 
| -    /* | 
| -    * The present custom action only uses this function for strings that appear in dialog boxes. | 
| -    * A thousand characters is about a dozen lines of text, which is far more than enough. | 
| -    */ | 
| -    throw not_yet_supported( "retrieving string values longer than 1023 from a record" ) ; | 
| -  } | 
| -  throw windows_api_error( "MsiRecordGetStringW", x ) ; | 
| -} | 
| - | 
| -size_t Record::n_fields() const | 
| -{ | 
| -  unsigned int x = MsiRecordGetFieldCount( _handle ) ; | 
| -  if ( x == 0xFFFFFFFF ) | 
| -  { | 
| -    throw windows_api_error( "MsiRecordGetFieldCount", x, "invalid handle" ) ; | 
| -  } | 
| -  return x ; | 
| + | 
| +//----------------------------------------------------------------------------------------- | 
| +// Record | 
| +//----------------------------------------------------------------------------------------- | 
| +Record::Record( unsigned int nFields ) | 
| +{ | 
| +  handle = MsiCreateRecord( nFields ) ; | 
| +  if ( ! handle ) | 
| +  { | 
| +    throw WindowsApiError( "MsiCreateRecord", 0 ) ; | 
| +  } | 
| +} | 
| + | 
| +Record::~Record() | 
| +{ | 
| +  if ( handle != 0 ) | 
| +  { | 
| +    MsiCloseHandle( handle ) ; | 
| +  } | 
| +} | 
| + | 
| +void Record::OnlyNonNull() | 
| +{ | 
| +  if ( handle == 0 ) | 
| +  { | 
| +    throw std::runtime_error( "Operation only permitted for non-null objects" ) ; | 
| +  } | 
| +} | 
| + | 
| +void Record::AssignString( unsigned int fieldIndex, const char *value ) | 
| +{ | 
| +  OnlyNonNull() ; | 
| +  MsiRecordSetStringA( handle, fieldIndex, value ) ; | 
| +} | 
| + | 
| +void Record::AssignString( unsigned int fieldIndex, const wchar_t *value ) | 
| +{ | 
| +  OnlyNonNull() ; | 
| +  MsiRecordSetStringW( handle, fieldIndex, value ) ; | 
| +} | 
| + | 
| +/** | 
| +* \par Implementation | 
| +*    - MSDN [MsiRecordGetString](http://msdn.microsoft.com/en-us/library/aa370368%28v=vs.85%29.aspx) | 
| +*/ | 
| +std::wstring Record::ValueString( unsigned int fieldIndex ) | 
| +{ | 
| +  static wchar_t initialBuffer[ 1024 ] = L"" ; | 
| +  DWORD length = 1023 ; // one less than the buffer length to hold a terminating null character | 
| +  UINT x = MsiRecordGetStringW( handle, fieldIndex, initialBuffer, & length ) ; | 
| +  if ( x == ERROR_SUCCESS ) | 
| +  { | 
| +    return std::wstring( initialBuffer ) ; | 
| +  } | 
| +  if ( x == ERROR_MORE_DATA ) | 
| +  { | 
| +    // Future: handle longer strings. | 
| +    /* | 
| +    * The present custom action only uses this function for strings that appear in dialog boxes. | 
| +    * A thousand characters is about a dozen lines of text, which is far more than enough. | 
| +    */ | 
| +    throw NotYetSupported( "retrieving string values longer than 1023 from a record" ) ; | 
| +  } | 
| +  throw WindowsApiError( "MsiRecordGetStringW", x ) ; | 
| +} | 
| + | 
| +size_t Record::NumberOfFields() const | 
| +{ | 
| +  unsigned int x = MsiRecordGetFieldCount( handle ) ; | 
| +  if ( x == 0xFFFFFFFF ) | 
| +  { | 
| +    throw WindowsApiError( "MsiRecordGetFieldCount", x, "invalid handle" ) ; | 
| +  } | 
| +  return x ; | 
| } | 
|  |