| Index: src/plugin/COM_Value.cpp |
| =================================================================== |
| new file mode 100644 |
| --- /dev/null |
| +++ b/src/plugin/COM_Value.cpp |
| @@ -0,0 +1,64 @@ |
| +/** |
| + * \file COM_Value.cpp Support for the values used in COM and Automation. |
| + */ |
| +#include "COM_Value.h" |
| +#include <stdexcept> |
| + |
| +using namespace AdblockPlus::COM; |
| + |
| +/* |
| + * MSDN SysAllocStringLen function http://msdn.microsoft.com/en-us/library/windows/desktop/ms221639%28v=vs.85%29.aspx |
| + */ |
| +BSTR_Argument::BSTR_Argument( const std::wstring& s ) |
|
Eric
2014/07/30 14:14:42
If you initialize something in the constructor ini
|
| +{ |
| + auto length = s.length(); |
| + if ( length == 0 ) |
| + { |
| + /* |
| + * BSTR makes no distinction between null pointers and non-null pointers to the empty string. |
| + * In order to detect allocation failure reliably, we simply don't allocate empty strings. |
| + * Compare with the default constructor. |
| + */ |
| + bstr = nullptr; |
|
sergei
2014/07/28 09:18:26
The comment should be in the header near the ctr,
Eric
2014/07/29 16:59:27
This is an implementation detail, not some basic p
|
| + return; |
| + } |
| + // Assert length >= 1 |
| + bstr = SysAllocStringLen( s.c_str(), length ); |
| + /* |
| + * Since the string is non-empty, |
| + * if the return value of SysAllocStringLen is null it means that it had an allocation failure. |
| + */ |
| + if ( !bstr ) |
| + { |
| + throw std::bad_alloc(); |
| + } |
| +} |
| + |
| +/* |
| + * MSDN SysFreeString function http://msdn.microsoft.com/en-us/library/windows/desktop/ms221481%28v=vs.85%29.aspx |
| + */ |
| +BSTR_Argument::~BSTR_Argument() |
| +{ |
| + // There's no need to check for null; SysFreeString already handles that case. |
| + SysFreeString( bstr ); |
| +} |
| + |
| +BSTR* BSTR_Argument::operator&() |
| +{ |
| + // Assign the empty string, if not already empty. |
|
sergei
2014/07/28 09:18:26
I don't like the changing of the value when the ad
Eric
2014/07/29 16:59:27
Directly assigning to internal members of smart po
|
| + if ( bstr ) |
| + { |
| + SysFreeString( bstr ); |
| + bstr = nullptr; |
| + } |
| + return &bstr; |
| +} |
| + |
| +BSTR_Argument::operator std::wstring() const |
| +{ |
| + if ( !bstr ) |
| + { |
| + return std::wstring(); |
| + } |
| + return std::wstring( bstr, SysStringLen( bstr ) ); |
| +} |