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

Unified 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.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: installer/src/installer-lib/record.cpp
===================================================================
--- a/installer/src/installer-lib/record.cpp
+++ b/installer/src/installer-lib/record.cpp
@@ -9,7 +9,6 @@
// Record
//-----------------------------------------------------------------------------------------
Record::Record( unsigned int n_fields )
- : n_fields( n_fields )
{
_handle = MsiCreateRecord( n_fields ) ;
if ( ! _handle )
@@ -20,11 +19,59 @@
Record::~Record()
{
- MsiCloseHandle( _handle ) ;
+ if ( _handle != 0 )
+ {
+ MsiCloseHandle( _handle ) ;
+ }
}
-void
-Record::assign_string( unsigned int field_index, std::wstring value )
+void Record::only_non_null()
{
- MsiRecordSetString( _handle, field_index, value.c_str() ) ;
+ 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[ 256 ] = L"" ;
+ DWORD length = 255 ; // 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.
+ throw std::runtime_error( "Record strings longer than 255 not supported yet" ) ;
+ }
+ throw std::runtime_error( "Error retrieving string from record" ) ;
+}
+
+size_t Record::n_fields() const
+{
+ unsigned int x = MsiRecordGetFieldCount( _handle ) ;
+ 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
+ {
+ throw std::runtime_error( "Invalid handle" ) ;
+ }
+ return x ;
}

Powered by Google App Engine
This is Rietveld