| 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 ) ; |
| + } |
| +} |