| 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 |