| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |