Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: src/plugin/COM_Client.h

Issue 5750789393874944: [IE] First round of ATL removal (Closed)
Patch Set: Created June 20, 2014, 9:22 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1
Oleksandr 2014/06/26 00:48:43 I guess COM_Client.h is not needed?
Eric 2014/06/26 15:13:56 I take it you mean COM_Client.cpp. Right now, all
2 /**
3 * Wrapper for BSTR values returned by COM components.
4 *
5 * The term "values returned" here means "out" parameters to COM interfaces.
6 * A number of IBrowser functions return allocated BSTR values this way,
7 * values that require the caller to free them.
8 * ATL provides CComBSTR for these return values.
9 * CComBSTR, however, implements a number of general purpose string functions,
10 * but the present one does not.
11 *
12 * The sole responsibility of this class is to manage the allocated resource.
13 * The supported pattern of use is exactly two steps:
14 * -# Construct an instance with the BSTR value returned from the COM call
15 * -# Copy the contents to a std::wstring.
16 * There generally no reason even to declare a separate variable of this type,
17 * since the value of the conversion operator can be assigned directly.
18 *
19 * This class does no error checking for null pointer values.
20 * There is, however, no default constructor to initialize one easily.
21 * The only constructor takes a BSTR argument,
22 * so the caller has the opportunity to test the value of the "out" argument.
23 */
24 class Returned_BSTR
Oleksandr 2014/06/26 00:48:43 This multiple classes approach is a bit confusing,
Eric 2014/06/26 15:13:56 The biggest confusion to my eye is the naming. I d
sergei 2014/07/08 11:58:34 I also would like to have only one class. As well
Eric 2014/07/08 17:46:37 Here's the place for the longer rant about address
25 {
26 /**
27 * The underlying BSTR variable.
28 */
29 wchar_t * _bstr ;
30
31 public:
32 /**
33 * Ordinary constructor.
34 */
35 Returned_BSTR( wchar_t * b )
36 : _bstr( b )
37 {}
38
39 ~Returned_BSTR()
40 {
41 ::SysFreeString( _bstr );
42 }
43
44 operator std::wstring()
45 {
46 return std::wstring( _bstr, ::SysStringLen( _bstr ) );
47 }
48 };
49
50 class Invoke_Result
51 {
52 VARIANT & _result;
53
54 public:
55 /**
56 * Ordinary constructor.
57 *
58 * The caller has responsibility for checking that the result pointer argument in Invoke() is not null.
59 * Thus the argument is a reference, not a pointer, to ensure that the caller fulfills its responsibility.
60 */
61 Invoke_Result( VARIANT & result )
62 : _result( result )
63 {}
64
65 void assign_wstring( std::wstring x )
66 {
67 _result.vt = VT_BSTR;
68 _result.bstrVal = SysAllocString( x.c_str() );
69 }
70 };
71
72 inline void invoke_result_wstring( VARIANT & result, std::wstring s )
73 {
74 Invoke_Result ir( result );
75 ir.assign_wstring( s );
76 }
77
78 class BSTR_Argument
79 {
80 BSTR _bstr;
81 public:
82 BSTR_Argument( std::wstring s )
83 : _bstr( SysAllocStringLen( s.c_str(), s.length() ) )
84 {
85 // Preserve invariant that _bstr is not null
86 if ( !_bstr )
87 {
88 // Assert SysAllocStringLen return null, meaning out of memory
89 throw std::bad_alloc();
90 }
91 }
92
93 ~BSTR_Argument()
94 {
95 SysFreeString( _bstr );
96 }
97
98 inline operator BSTR()
99 {
100 return _bstr;
101 }
102 };
103
104 /**
105 * Constructor class for incoming BSTR argument for dispatch entry points.
106 *
107 * The BSTR coming in as arguments from dispatch calls are allocated by the call er.
108 * We don't need to manage the lifetime of these arguments.
109 * Since we are immediately converting to wstring, we don't need to allocate our own BSTR.
110 * Thus, even though the constructor pattern looks like BSTR_Argument,
111 * we don't want the allocate/free behavior of its implementation.
112 */
113 class Incoming_BSTR
114 : public std::wstring
115 {
116 public:
117 Incoming_BSTR( BSTR bstr )
118 : std::wstring( bstr, SysStringLen( bstr ) )
119 {}
120 };
OLDNEW

Powered by Google App Engine
This is Rietveld