| Index: installer/src/installer-lib/property.cpp | 
| =================================================================== | 
| --- a/installer/src/installer-lib/property.cpp | 
| +++ b/installer/src/installer-lib/property.cpp | 
| @@ -4,66 +4,66 @@ | 
|  | 
| #include "installer-lib.h" | 
| #include "property.h" | 
| -#include "session.h" | 
| +#include "session.h" | 
| #include <msiquery.h> | 
| -#include <memory> | 
| - | 
| -//----------------------------------------------------------------------------------------- | 
| -// Property | 
| -//----------------------------------------------------------------------------------------- | 
| -Property::Property( Session & session, std::wstring name ) | 
| -  // VSE 2012 shows an IntelliSense error here. Ignore it. The compiler properly sees the 'friend' declaration. | 
| -  : handle( session.handle ), name( name ) | 
| -{} | 
| - | 
| -/** | 
| -* \par Implementation | 
| -* The center of the implementation is the <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/aa370134%28v=vs.85%29.aspx">MsiGetProperty function</a>. | 
| -*/ | 
| -Property::operator std::wstring() const | 
| -{ | 
| -  /* | 
| -  * The first call gets the size, but also the actual value if it's short enough. | 
| -  * A second call, if necessary, allocates a sufficiently-long buffer and then gets the full value. | 
| -  * We use only a modest fixed-size buffer for the first step, because we handle arbitrary-length property values in a second step. | 
| -  */ | 
| -  // This buffer allocates on the stack, so we don't want it too large; 64 characters is enough for most properties anyway. | 
| -  WCHAR buffer1[ 64 ] = { L'\0' } ; | 
| -  DWORD length = sizeof( buffer1 ) / sizeof( WCHAR ) ; | 
| -  UINT x = MsiGetPropertyW( handle, name.c_str(), buffer1, & length ) ; | 
| -  switch ( x ) | 
| -  { | 
| -  case ERROR_SUCCESS: | 
| -    // This call might succeed, which means the return value was short enough to fit into the buffer. | 
| -    return std::wstring( buffer1, length ) ; | 
| -  case ERROR_MORE_DATA: | 
| -    // Do nothing yet. | 
| -    break ; | 
| -  default: | 
| -    throw windows_api_error( "MsiGetPropertyW", x, "fixed buffer" ) ; | 
| -  } | 
| -  // Assert we received ERROR_MORE_DATA | 
| -  // unique_ptr handles deallocation transparently | 
| -  std::unique_ptr< WCHAR[] > buffer2( new WCHAR[ length ] ) ; | 
| -  x = MsiGetPropertyW( handle, name.c_str(), buffer2.get(), & length ) ; | 
| -  switch ( x ) | 
| -  { | 
| -  case ERROR_SUCCESS: | 
| -    return std::wstring( buffer2.get(), length ) ; | 
| -  default: | 
| -    throw windows_api_error( "MsiGetPropertyW", x, "allocated buffer" ) ; | 
| -  } | 
| -} | 
| - | 
| -/** | 
| -* \par Implementation | 
| -* The center of the implementation is the <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/aa370391%28v=vs.85%29.aspx">MsiSetProperty function</a>. | 
| -*/ | 
| -void Property::operator=( const std::wstring & value ) | 
| -{ | 
| -  UINT x = MsiSetPropertyW( handle, name.c_str(), value.c_str() ) ; | 
| -  if ( x != ERROR_SUCCESS ) | 
| -  { | 
| -    throw windows_api_error( "MsiSetPropertyW", x ) ; | 
| -  } | 
| -} | 
| +#include <memory> | 
| + | 
| +//----------------------------------------------------------------------------------------- | 
| +// Property | 
| +//----------------------------------------------------------------------------------------- | 
| +Property::Property( Session & session, std::wstring name ) | 
| +  // VSE 2012 shows an IntelliSense error here. Ignore it. The compiler properly sees the 'friend' declaration. | 
| +  : handle( session.handle ), name( name ) | 
| +{} | 
| + | 
| +/** | 
| +* \par Implementation | 
| +* The center of the implementation is the <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/aa370134%28v=vs.85%29.aspx">MsiGetProperty function</a>. | 
| +*/ | 
| +Property::operator std::wstring() const | 
| +{ | 
| +  /* | 
| +  * The first call gets the size, but also the actual value if it's short enough. | 
| +  * A second call, if necessary, allocates a sufficiently-long buffer and then gets the full value. | 
| +  * We use only a modest fixed-size buffer for the first step, because we handle arbitrary-length property values in a second step. | 
| +  */ | 
| +  // This buffer allocates on the stack, so we don't want it too large; 64 characters is enough for most properties anyway. | 
| +  WCHAR buffer1[ 64 ] = { L'\0' } ; | 
| +  DWORD length = sizeof( buffer1 ) / sizeof( WCHAR ) ; | 
| +  UINT x = MsiGetPropertyW( handle, name.c_str(), buffer1, & length ) ; | 
| +  switch ( x ) | 
| +  { | 
| +  case ERROR_SUCCESS: | 
| +    // This call might succeed, which means the return value was short enough to fit into the buffer. | 
| +    return std::wstring( buffer1, length ) ; | 
| +  case ERROR_MORE_DATA: | 
| +    // Do nothing yet. | 
| +    break ; | 
| +  default: | 
| +    throw WindowsApiError( "MsiGetPropertyW", x, "fixed buffer" ) ; | 
| +  } | 
| +  // Assert we received ERROR_MORE_DATA | 
| +  // unique_ptr handles deallocation transparently | 
| +  std::unique_ptr< WCHAR[] > buffer2( new WCHAR[ length ] ) ; | 
| +  x = MsiGetPropertyW( handle, name.c_str(), buffer2.get(), & length ) ; | 
| +  switch ( x ) | 
| +  { | 
| +  case ERROR_SUCCESS: | 
| +    return std::wstring( buffer2.get(), length ) ; | 
| +  default: | 
| +    throw WindowsApiError( "MsiGetPropertyW", x, "allocated buffer" ) ; | 
| +  } | 
| +} | 
| + | 
| +/** | 
| +* \par Implementation | 
| +* The center of the implementation is the <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/aa370391%28v=vs.85%29.aspx">MsiSetProperty function</a>. | 
| +*/ | 
| +void Property::operator=( const std::wstring & value ) | 
| +{ | 
| +  UINT x = MsiSetPropertyW( handle, name.c_str(), value.c_str() ) ; | 
| +  if ( x != ERROR_SUCCESS ) | 
| +  { | 
| +    throw WindowsApiError( "MsiSetPropertyW", x ) ; | 
| +  } | 
| +} | 
|  |