| Index: installer/src/installer-lib/record.h | 
| =================================================================== | 
| --- a/installer/src/installer-lib/record.h | 
| +++ b/installer/src/installer-lib/record.h | 
| @@ -2,245 +2,245 @@ | 
| * \file record.h Definition of Record class. | 
| */ | 
|  | 
| -#ifndef RECORD_H | 
| -#define RECORD_H | 
| - | 
| -#include <string> | 
| - | 
| -#include <Windows.h> | 
| -#include <Msi.h> | 
| - | 
| -#include "handle.h" | 
| - | 
| -// Forward | 
| -class View ; | 
| - | 
| -/** | 
| -* An abstract record entity. | 
| -* It represents both records in the installation database and as argument vectors for API functions. | 
| -* | 
| -* The ordinary constructor creates a free-standing record. | 
| -* It takes only the number of fields in the created record. | 
| -* The fields of the record are dynamically typed according to how they're assigned. | 
| -* Other constructors will be required to encapsulate records that are bound to databases. | 
| -* | 
| -* This class has exclusive-ownership semantics for the API handle to the record. | 
| -* Every constructor has a postcondition that the _handle member points to an open record. | 
| -* The destructor closes the record. | 
| -* The copy constructor syntax is used as a move constructor (since no C++11 yet). | 
| -* Analogously, copy assignment has move semantics. | 
| -* | 
| -* \par Invariant | 
| -*   - _handle is not null implies _handle points to a record open in the Windows Installer subsystem | 
| -* | 
| -* \sa http://msdn.microsoft.com/en-us/library/windows/desktop/aa372881%28v=vs.85%29.aspx | 
| -*    Windows Installer on MSDN: "Working with Records" | 
| -*/ | 
| -class Record { | 
| -  /** | 
| -  * | 
| -  */ | 
| -  typedef handle< MSIHANDLE, Special_Null, MSI_Generic_Destruction > record_handle_type ; | 
| - | 
| -  /** | 
| -  * The handle for the record as a Windows Installer resource. | 
| -  */ | 
| -  MSIHANDLE _handle ; | 
| - | 
| -  /** | 
| -  * Construct a record from its handle as returned by some MSI call. | 
| -  */ | 
| -  Record( msi_handle handle ) | 
| -    : _handle( handle ) | 
| -  {} | 
| - | 
| -  /** | 
| -  * Internal validation guard for operations that require a non-null handle. | 
| -  * | 
| -  * \post | 
| -  *   - if _handle is zero, throw an exception | 
| -  *   - if _handle is non-zero, nothing | 
| -  */ | 
| -  void only_non_null() ; | 
| - | 
| -  /** | 
| -  * Proxy class used to implement move semantics, prior to use of C++11. | 
| -  * | 
| -  * /sa | 
| -  *   - Wikibooks [More C++ Idioms/Move Constructor](http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Move_Constructor) | 
| -  */ | 
| -  struct Proxy_Record | 
| -  { | 
| -    MSIHANDLE _handle ; | 
| - | 
| -    Proxy_Record( MSIHANDLE handle ) | 
| -      : _handle( handle ) | 
| -    {} | 
| -  } ; | 
| - | 
| -  /** | 
| -  * Tag class for null record constructor | 
| -  */ | 
| -  class null_t {} ; | 
| - | 
| -  /** | 
| -  * Null record constructor. | 
| -  * | 
| -  * The null record constructor avoids the ordinary check that an external handle not be zero. | 
| -  * It's declared private so that only friends can instantiate them. | 
| -  */ | 
| -  Record( null_t ) | 
| -    : _handle( 0 ) | 
| -  {} | 
| - | 
| -  /** | 
| -  * View class needs access to constructor-from-handle. | 
| -  */ | 
| -  friend class View ; | 
| - | 
| -public: | 
| -  /** | 
| -  * Ordinary constructor creates a free-standing record. | 
| -  * Use this for creating argument vectors. | 
| -  * | 
| -  * \post _handle points to a record obtained from MsiCreateRecord | 
| -  * | 
| -  * \param[in] n_fields | 
| -  *    Number of fields in the created record. | 
| -  */ | 
| -  Record( unsigned int n_fields ) ; | 
| - | 
| -  /** | 
| -  * Destructor | 
| -  */ | 
| -  ~Record() ; | 
| - | 
| -  /** | 
| -  * Copy constructor syntax used as a move constructor. | 
| -  */ | 
| -  Record( Record & r ) | 
| -    : _handle( r._handle ) | 
| -  { | 
| -    r._handle = 0 ; | 
| -  } | 
| - | 
| -  /** | 
| -  * Proxy move constructor. | 
| -  */ | 
| -  Record( Proxy_Record r ) | 
| -    : _handle( r._handle ) | 
| -  { | 
| -    r._handle = 0 ; | 
| -  } | 
| - | 
| -  /** | 
| -  * Copy assignment syntax has move assignment semantics. | 
| -  */ | 
| -  Record & operator=( Record & r ) | 
| -  { | 
| -    this -> ~Record() ; | 
| -    _handle = r._handle ; | 
| -    r._handle = 0 ; | 
| -    return * this ; | 
| -  } | 
| - | 
| -  /** | 
| -  * Proxy move assignment. | 
| -  */ | 
| -  Record & operator=( Proxy_Record pr ) | 
| -  { | 
| -    this -> ~Record() ; | 
| -    _handle = pr._handle ; | 
| -    pr._handle = 0 ; | 
| -    return * this ; | 
| -  } | 
| - | 
| -  /** | 
| -  * Proxy conversion operator | 
| -  */ | 
| -  operator Proxy_Record() | 
| -  { | 
| -    Proxy_Record pr( _handle ) ; | 
| -    _handle = 0 ; | 
| -    return pr ; | 
| -  } | 
| - | 
| -  /** | 
| -  * Two records are equal exactly when their handles are equal. | 
| -  */ | 
| -  inline bool operator==( const Record & x ) const | 
| -  { | 
| -    return _handle == x._handle ; | 
| -  } | 
| - | 
| -  /** | 
| -  * Standard inequality operator defined by negating the equality operator. | 
| -  */ | 
| -  inline bool operator!=( const Record & x ) const | 
| -  { | 
| -    return ! operator==( x ) ; | 
| -  } | 
| - | 
| -  /** | 
| -  * Assign a string to a record, (regular) character pointer. | 
| -  * | 
| -  * \param[in] field_index | 
| -  *    Index into the record as a vector of fields | 
| -  * \param[in] value | 
| -  *    String to write into the field | 
| -  */ | 
| -  void assign_string( unsigned int field_index, const char *value ) ; | 
| - | 
| -  /** | 
| -  * Assign a string to a record, regular string version. | 
| -  * | 
| -  * \param[in] field_index | 
| -  *    Index into the record as a vector of fields | 
| -  * \param[in] value | 
| -  *    String to write into the field | 
| -  */ | 
| -  void assign_string( unsigned int field_index, const std::string value ) | 
| -  { | 
| -    assign_string( field_index, value.c_str() ); | 
| -  } | 
| - | 
| -  /** | 
| -  * Assign a string to a record, wide character pointer version. | 
| -  * | 
| -  * \param[in] field_index | 
| -  *    Index into the record as a vector of fields | 
| -  * \param[in] value | 
| -  *    String to write into the field | 
| -  */ | 
| -  void assign_string( unsigned int field_index, const wchar_t *value ) ; | 
| - | 
| -  /** | 
| -  * Assign a string to a record, wide string version. | 
| -  * | 
| -  * \param[in] field_index | 
| -  *    Index into the record as a vector of fields | 
| -  * \param[in] value | 
| -  *    String to write into the field | 
| -  */ | 
| -  void assign_string( unsigned int field_index, const std::wstring value ) | 
| -  { | 
| -    assign_string( field_index, value.c_str() ); | 
| -  } | 
| - | 
| -  /** | 
| -  * Retrieve a wide string value from a record | 
| -  */ | 
| -  std::wstring value_string( unsigned int field_index ) ; | 
| - | 
| -  /** | 
| -  * The number of fields in the record. | 
| -  */ | 
| -  size_t n_fields() const ; | 
| - | 
| -  /** | 
| -  * Handle accessor. | 
| -  */ | 
| -  MSIHANDLE handle() { return _handle ; } | 
| -}; | 
| - | 
| -#endif | 
| +#ifndef RECORD_H | 
| +#define RECORD_H | 
| + | 
| +#include <string> | 
| + | 
| +#include <Windows.h> | 
| +#include <Msi.h> | 
| + | 
| +#include "handle.h" | 
| + | 
| +// Forward | 
| +class View ; | 
| + | 
| +/** | 
| +* An abstract record entity. | 
| +* It represents both records in the installation database and as argument vectors for API functions. | 
| +* | 
| +* The ordinary constructor creates a free-standing record. | 
| +* It takes only the number of fields in the created record. | 
| +* The fields of the record are dynamically typed according to how they're assigned. | 
| +* Other constructors will be required to encapsulate records that are bound to databases. | 
| +* | 
| +* This class has exclusive-ownership semantics for the API handle to the record. | 
| +* Every constructor has a postcondition that the handle member points to an open record. | 
| +* The destructor closes the record. | 
| +* The copy constructor syntax is used as a move constructor (since no C++11 yet). | 
| +* Analogously, copy assignment has move semantics. | 
| +* | 
| +* \par Invariant | 
| +*   - handle is not null implies handle points to a record open in the Windows Installer subsystem | 
| +* | 
| +* \sa http://msdn.microsoft.com/en-us/library/windows/desktop/aa372881%28v=vs.85%29.aspx | 
| +*    Windows Installer on MSDN: "Working with Records" | 
| +*/ | 
| +class Record { | 
| +  /** | 
| +  * | 
| +  */ | 
| +  typedef Handle< MSIHANDLE, SpecialNull, GenericMsiDestruction > RecordHandleType ; | 
| + | 
| +  /** | 
| +  * The handle for the record as a Windows Installer resource. | 
| +  */ | 
| +  MSIHANDLE handle ; | 
| + | 
| +  /** | 
| +  * Construct a record from its handle as returned by some MSI call. | 
| +  */ | 
| +  Record( MsiHandle handle ) | 
| +    : handle( handle ) | 
| +  {} | 
| + | 
| +  /** | 
| +  * Internal validation guard for operations that require a non-null handle. | 
| +  * | 
| +  * \post | 
| +  *   - if handle is zero, throw an exception | 
| +  *   - if handle is non-zero, nothing | 
| +  */ | 
| +  void OnlyNonNull() ; | 
| + | 
| +  /** | 
| +  * Proxy class used to implement move semantics, prior to use of C++11. | 
| +  * | 
| +  * /sa | 
| +  *   - Wikibooks [More C++ Idioms/Move Constructor](http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Move_Constructor) | 
| +  */ | 
| +  struct ProxyRecord | 
| +  { | 
| +    MSIHANDLE handle ; | 
| + | 
| +    ProxyRecord( MSIHANDLE handle ) | 
| +      : handle( handle ) | 
| +    {} | 
| +  } ; | 
| + | 
| +  /** | 
| +  * Tag class for null record constructor | 
| +  */ | 
| +  class NullType {} ; | 
| + | 
| +  /** | 
| +  * Null record constructor. | 
| +  * | 
| +  * The null record constructor avoids the ordinary check that an external handle not be zero. | 
| +  * It's declared private so that only friends can instantiate them. | 
| +  */ | 
| +  Record( NullType ) | 
| +    : handle( 0 ) | 
| +  {} | 
| + | 
| +  /** | 
| +  * View class needs access to constructor-from-handle. | 
| +  */ | 
| +  friend class View ; | 
| + | 
| +public: | 
| +  /** | 
| +  * Ordinary constructor creates a free-standing record. | 
| +  * Use this for creating argument vectors. | 
| +  * | 
| +  * \post handle points to a record obtained from MsiCreateRecord | 
| +  * | 
| +  * \param[in] nFields | 
| +  *    Number of fields in the created record. | 
| +  */ | 
| +  Record( unsigned int nFields ) ; | 
| + | 
| +  /** | 
| +  * Destructor | 
| +  */ | 
| +  ~Record() ; | 
| + | 
| +  /** | 
| +  * Copy constructor syntax used as a move constructor. | 
| +  */ | 
| +  Record( Record & r ) | 
| +    : handle( r.handle ) | 
| +  { | 
| +    r.handle = 0 ; | 
| +  } | 
| + | 
| +  /** | 
| +  * Proxy move constructor. | 
| +  */ | 
| +  Record( ProxyRecord r ) | 
| +    : handle( r.handle ) | 
| +  { | 
| +    r.handle = 0 ; | 
| +  } | 
| + | 
| +  /** | 
| +  * Copy assignment syntax has move assignment semantics. | 
| +  */ | 
| +  Record & operator=( Record & r ) | 
| +  { | 
| +    this -> ~Record() ; | 
| +    handle = r.handle ; | 
| +    r.handle = 0 ; | 
| +    return * this ; | 
| +  } | 
| + | 
| +  /** | 
| +  * Proxy move assignment. | 
| +  */ | 
| +  Record & operator=( ProxyRecord pr ) | 
| +  { | 
| +    this -> ~Record() ; | 
| +    handle = pr.handle ; | 
| +    pr.handle = 0 ; | 
| +    return * this ; | 
| +  } | 
| + | 
| +  /** | 
| +  * Proxy conversion operator | 
| +  */ | 
| +  operator ProxyRecord() | 
| +  { | 
| +    ProxyRecord pr( handle ) ; | 
| +    handle = 0 ; | 
| +    return pr ; | 
| +  } | 
| + | 
| +  /** | 
| +  * Two records are equal exactly when their handles are equal. | 
| +  */ | 
| +  inline bool operator==( const Record & x ) const | 
| +  { | 
| +    return handle == x.handle ; | 
| +  } | 
| + | 
| +  /** | 
| +  * Standard inequality operator defined by negating the equality operator. | 
| +  */ | 
| +  inline bool operator!=( const Record & x ) const | 
| +  { | 
| +    return ! operator==( x ) ; | 
| +  } | 
| + | 
| +  /** | 
| +  * Assign a string to a record, (regular) character pointer. | 
| +  * | 
| +  * \param[in] fieldIndex | 
| +  *    Index into the record as a vector of fields | 
| +  * \param[in] value | 
| +  *    String to write into the field | 
| +  */ | 
| +  void AssignString( unsigned int fieldIndex, const char *value ) ; | 
| + | 
| +  /** | 
| +  * Assign a string to a record, regular string version. | 
| +  * | 
| +  * \param[in] fieldIndex | 
| +  *    Index into the record as a vector of fields | 
| +  * \param[in] value | 
| +  *    String to write into the field | 
| +  */ | 
| +  void AssignString(unsigned int fieldIndex, const std::string value) | 
| +  { | 
| +    AssignString(fieldIndex, value.c_str()); | 
| +  } | 
| + | 
| +  /** | 
| +  * Assign a string to a record, wide character pointer version. | 
| +  * | 
| +  * \param[in] fieldIndex | 
| +  *    Index into the record as a vector of fields | 
| +  * \param[in] value | 
| +  *    String to write into the field | 
| +  */ | 
| +  void AssignString(unsigned int fieldIndex, const wchar_t *value) ; | 
| + | 
| +  /** | 
| +  * Assign a string to a record, wide string version. | 
| +  * | 
| +  * \param[in] fieldIndex | 
| +  *    Index into the record as a vector of fields | 
| +  * \param[in] value | 
| +  *    String to write into the field | 
| +  */ | 
| +  void AssignString( unsigned int fieldIndex, const std::wstring value) | 
| +  { | 
| +    AssignString(fieldIndex, value.c_str()); | 
| +  } | 
| + | 
| +  /** | 
| +  * Retrieve a wide string value from a record | 
| +  */ | 
| +  std::wstring ValueString( unsigned int fieldIndex) ; | 
| + | 
| +  /** | 
| +  * The number of fields in the record. | 
| +  */ | 
| +  size_t NumberOfFields() const ; | 
| + | 
| +  /** | 
| +  * Handle accessor. | 
| +  */ | 
| +  MSIHANDLE Handle() { return handle ; } | 
| +}; | 
| + | 
| +#endif | 
|  |