Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(501)

Side by Side Diff: base/scoped_variant_win.cc

Issue 42569: Adding a Set() method for copying a variant over to the ScopedVariant.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « base/scoped_variant_win.h ('k') | base/scoped_variant_win_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/scoped_variant_win.h" 5 #include "base/scoped_variant_win.h"
6 #include "base/logging.h" 6 #include "base/logging.h"
7 7
8 // Global, const instance of an empty variant. 8 // Global, const instance of an empty variant.
9 const VARIANT ScopedVariant::kEmptyVariant = { VT_EMPTY }; 9 const VARIANT ScopedVariant::kEmptyVariant = { VT_EMPTY };
10 10
(...skipping 10 matching lines...) Expand all
21 ScopedVariant::ScopedVariant(const wchar_t* str, UINT length) { 21 ScopedVariant::ScopedVariant(const wchar_t* str, UINT length) {
22 var_.vt = VT_BSTR; 22 var_.vt = VT_BSTR;
23 var_.bstrVal = ::SysAllocStringLen(str, length); 23 var_.bstrVal = ::SysAllocStringLen(str, length);
24 } 24 }
25 25
26 ScopedVariant::ScopedVariant(int value, VARTYPE vt) { 26 ScopedVariant::ScopedVariant(int value, VARTYPE vt) {
27 var_.vt = vt; 27 var_.vt = vt;
28 var_.lVal = value; 28 var_.lVal = value;
29 } 29 }
30 30
31 ScopedVariant::ScopedVariant(IDispatch* dispatch) {
32 var_.vt = VT_EMPTY;
33 Set(dispatch);
34 }
35
36 ScopedVariant::ScopedVariant(IUnknown* unknown) {
37 var_.vt = VT_EMPTY;
38 Set(unknown);
39 }
40
41 ScopedVariant::ScopedVariant(const VARIANT& var) {
42 var_.vt = VT_EMPTY;
43 Set(var);
44 }
45
31 void ScopedVariant::Reset(const VARIANT& var) { 46 void ScopedVariant::Reset(const VARIANT& var) {
32 if (&var != &var_) { 47 if (&var != &var_) {
33 ::VariantClear(&var_); 48 ::VariantClear(&var_);
34 var_ = var; 49 var_ = var;
35 } 50 }
36 } 51 }
37 52
38 VARIANT ScopedVariant::Release() { 53 VARIANT ScopedVariant::Release() {
39 VARIANT var = var_; 54 VARIANT var = var_;
40 var_.vt = VT_EMPTY; 55 var_.vt = VT_EMPTY;
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 DCHECK(!IsLeakableVarType(var_.vt)) << "leaking variant: " << var_.vt; 195 DCHECK(!IsLeakableVarType(var_.vt)) << "leaking variant: " << var_.vt;
181 if (SUCCEEDED(::SafeArrayGetVartype(array, &var_.vt))) { 196 if (SUCCEEDED(::SafeArrayGetVartype(array, &var_.vt))) {
182 var_.vt |= VT_ARRAY; 197 var_.vt |= VT_ARRAY;
183 var_.parray = array; 198 var_.parray = array;
184 } else { 199 } else {
185 DCHECK(array == NULL) << "Unable to determine safearray vartype"; 200 DCHECK(array == NULL) << "Unable to determine safearray vartype";
186 var_.vt = VT_EMPTY; 201 var_.vt = VT_EMPTY;
187 } 202 }
188 } 203 }
189 204
205 void ScopedVariant::Set(const VARIANT& var) {
206 DCHECK(!IsLeakableVarType(var_.vt)) << "leaking variant: " << var_.vt;
207 if (FAILED(::VariantCopy(&var_, &var))) {
208 DLOG(ERROR) << "VariantCopy failed";
209 var_.vt = VT_EMPTY;
210 }
211 }
212
213 ScopedVariant& ScopedVariant::operator=(const VARIANT& var) {
214 if (&var != &var_) {
215 VariantClear(&var_);
216 Set(var);
217 }
218 return *this;
219 }
220
190 bool ScopedVariant::IsLeakableVarType(VARTYPE vt) { 221 bool ScopedVariant::IsLeakableVarType(VARTYPE vt) {
191 bool leakable = false; 222 bool leakable = false;
192 switch (vt & VT_TYPEMASK) { 223 switch (vt & VT_TYPEMASK) {
193 case VT_BSTR: 224 case VT_BSTR:
194 case VT_DISPATCH: 225 case VT_DISPATCH:
195 // we treat VT_VARIANT as leakable to err on the safe side. 226 // we treat VT_VARIANT as leakable to err on the safe side.
196 case VT_VARIANT: 227 case VT_VARIANT:
197 case VT_UNKNOWN: 228 case VT_UNKNOWN:
198 case VT_SAFEARRAY: 229 case VT_SAFEARRAY:
199 230
(...skipping 19 matching lines...) Expand all
219 leakable = true; 250 leakable = true;
220 break; 251 break;
221 } 252 }
222 253
223 if (!leakable && (vt & VT_ARRAY) != 0) { 254 if (!leakable && (vt & VT_ARRAY) != 0) {
224 leakable = true; 255 leakable = true;
225 } 256 }
226 257
227 return leakable; 258 return leakable;
228 } 259 }
OLDNEW
« no previous file with comments | « base/scoped_variant_win.h ('k') | base/scoped_variant_win_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698