Index: base/win/scoped_variant.cc |
diff --git a/base/win/scoped_variant.cc b/base/win/scoped_variant.cc |
deleted file mode 100644 |
index f57ab93f6c66761b006b305223cad0b9139361d4..0000000000000000000000000000000000000000 |
--- a/base/win/scoped_variant.cc |
+++ /dev/null |
@@ -1,276 +0,0 @@ |
-// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "base/win/scoped_variant.h" |
-#include "base/logging.h" |
- |
-namespace base { |
-namespace win { |
- |
-// Global, const instance of an empty variant. |
-const VARIANT ScopedVariant::kEmptyVariant = { VT_EMPTY }; |
- |
-ScopedVariant::~ScopedVariant() { |
- COMPILE_ASSERT(sizeof(ScopedVariant) == sizeof(VARIANT), ScopedVariantSize); |
- ::VariantClear(&var_); |
-} |
- |
-ScopedVariant::ScopedVariant(const wchar_t* str) { |
- var_.vt = VT_EMPTY; |
- Set(str); |
-} |
- |
-ScopedVariant::ScopedVariant(const wchar_t* str, UINT length) { |
- var_.vt = VT_BSTR; |
- var_.bstrVal = ::SysAllocStringLen(str, length); |
-} |
- |
-ScopedVariant::ScopedVariant(int value, VARTYPE vt) { |
- var_.vt = vt; |
- var_.lVal = value; |
-} |
- |
-ScopedVariant::ScopedVariant(double value, VARTYPE vt) { |
- DCHECK(vt == VT_R8 || vt == VT_DATE); |
- var_.vt = vt; |
- var_.dblVal = value; |
-} |
- |
-ScopedVariant::ScopedVariant(IDispatch* dispatch) { |
- var_.vt = VT_EMPTY; |
- Set(dispatch); |
-} |
- |
-ScopedVariant::ScopedVariant(IUnknown* unknown) { |
- var_.vt = VT_EMPTY; |
- Set(unknown); |
-} |
- |
-ScopedVariant::ScopedVariant(SAFEARRAY* safearray) { |
- var_.vt = VT_EMPTY; |
- Set(safearray); |
-} |
- |
-ScopedVariant::ScopedVariant(const VARIANT& var) { |
- var_.vt = VT_EMPTY; |
- Set(var); |
-} |
- |
-void ScopedVariant::Reset(const VARIANT& var) { |
- if (&var != &var_) { |
- ::VariantClear(&var_); |
- var_ = var; |
- } |
-} |
- |
-VARIANT ScopedVariant::Release() { |
- VARIANT var = var_; |
- var_.vt = VT_EMPTY; |
- return var; |
-} |
- |
-void ScopedVariant::Swap(ScopedVariant& var) { |
- VARIANT tmp = var_; |
- var_ = var.var_; |
- var.var_ = tmp; |
-} |
- |
-VARIANT* ScopedVariant::Receive() { |
- DCHECK(!IsLeakableVarType(var_.vt)) << "variant leak. type: " << var_.vt; |
- return &var_; |
-} |
- |
-VARIANT ScopedVariant::Copy() const { |
- VARIANT ret = { VT_EMPTY }; |
- ::VariantCopy(&ret, &var_); |
- return ret; |
-} |
- |
-int ScopedVariant::Compare(const VARIANT& var, bool ignore_case) const { |
- ULONG flags = ignore_case ? NORM_IGNORECASE : 0; |
- HRESULT hr = ::VarCmp(const_cast<VARIANT*>(&var_), const_cast<VARIANT*>(&var), |
- LOCALE_USER_DEFAULT, flags); |
- int ret = 0; |
- |
- switch (hr) { |
- case VARCMP_LT: |
- ret = -1; |
- break; |
- |
- case VARCMP_GT: |
- case VARCMP_NULL: |
- ret = 1; |
- break; |
- |
- default: |
- // Equal. |
- break; |
- } |
- |
- return ret; |
-} |
- |
-void ScopedVariant::Set(const wchar_t* str) { |
- DCHECK(!IsLeakableVarType(var_.vt)) << "leaking variant: " << var_.vt; |
- var_.vt = VT_BSTR; |
- var_.bstrVal = ::SysAllocString(str); |
-} |
- |
-void ScopedVariant::Set(int8 i8) { |
- DCHECK(!IsLeakableVarType(var_.vt)) << "leaking variant: " << var_.vt; |
- var_.vt = VT_I1; |
- var_.cVal = i8; |
-} |
- |
-void ScopedVariant::Set(uint8 ui8) { |
- DCHECK(!IsLeakableVarType(var_.vt)) << "leaking variant: " << var_.vt; |
- var_.vt = VT_UI1; |
- var_.bVal = ui8; |
-} |
- |
-void ScopedVariant::Set(int16 i16) { |
- DCHECK(!IsLeakableVarType(var_.vt)) << "leaking variant: " << var_.vt; |
- var_.vt = VT_I2; |
- var_.iVal = i16; |
-} |
- |
-void ScopedVariant::Set(uint16 ui16) { |
- DCHECK(!IsLeakableVarType(var_.vt)) << "leaking variant: " << var_.vt; |
- var_.vt = VT_UI2; |
- var_.uiVal = ui16; |
-} |
- |
-void ScopedVariant::Set(int32 i32) { |
- DCHECK(!IsLeakableVarType(var_.vt)) << "leaking variant: " << var_.vt; |
- var_.vt = VT_I4; |
- var_.lVal = i32; |
-} |
- |
-void ScopedVariant::Set(uint32 ui32) { |
- DCHECK(!IsLeakableVarType(var_.vt)) << "leaking variant: " << var_.vt; |
- var_.vt = VT_UI4; |
- var_.ulVal = ui32; |
-} |
- |
-void ScopedVariant::Set(int64 i64) { |
- DCHECK(!IsLeakableVarType(var_.vt)) << "leaking variant: " << var_.vt; |
- var_.vt = VT_I8; |
- var_.llVal = i64; |
-} |
- |
-void ScopedVariant::Set(uint64 ui64) { |
- DCHECK(!IsLeakableVarType(var_.vt)) << "leaking variant: " << var_.vt; |
- var_.vt = VT_UI8; |
- var_.ullVal = ui64; |
-} |
- |
-void ScopedVariant::Set(float r32) { |
- DCHECK(!IsLeakableVarType(var_.vt)) << "leaking variant: " << var_.vt; |
- var_.vt = VT_R4; |
- var_.fltVal = r32; |
-} |
- |
-void ScopedVariant::Set(double r64) { |
- DCHECK(!IsLeakableVarType(var_.vt)) << "leaking variant: " << var_.vt; |
- var_.vt = VT_R8; |
- var_.dblVal = r64; |
-} |
- |
-void ScopedVariant::SetDate(DATE date) { |
- DCHECK(!IsLeakableVarType(var_.vt)) << "leaking variant: " << var_.vt; |
- var_.vt = VT_DATE; |
- var_.date = date; |
-} |
- |
-void ScopedVariant::Set(IDispatch* disp) { |
- DCHECK(!IsLeakableVarType(var_.vt)) << "leaking variant: " << var_.vt; |
- var_.vt = VT_DISPATCH; |
- var_.pdispVal = disp; |
- if (disp) |
- disp->AddRef(); |
-} |
- |
-void ScopedVariant::Set(bool b) { |
- DCHECK(!IsLeakableVarType(var_.vt)) << "leaking variant: " << var_.vt; |
- var_.vt = VT_BOOL; |
- var_.boolVal = b ? VARIANT_TRUE : VARIANT_FALSE; |
-} |
- |
-void ScopedVariant::Set(IUnknown* unk) { |
- DCHECK(!IsLeakableVarType(var_.vt)) << "leaking variant: " << var_.vt; |
- var_.vt = VT_UNKNOWN; |
- var_.punkVal = unk; |
- if (unk) |
- unk->AddRef(); |
-} |
- |
-void ScopedVariant::Set(SAFEARRAY* array) { |
- DCHECK(!IsLeakableVarType(var_.vt)) << "leaking variant: " << var_.vt; |
- if (SUCCEEDED(::SafeArrayGetVartype(array, &var_.vt))) { |
- var_.vt |= VT_ARRAY; |
- var_.parray = array; |
- } else { |
- DCHECK(!array) << "Unable to determine safearray vartype"; |
- var_.vt = VT_EMPTY; |
- } |
-} |
- |
-void ScopedVariant::Set(const VARIANT& var) { |
- DCHECK(!IsLeakableVarType(var_.vt)) << "leaking variant: " << var_.vt; |
- if (FAILED(::VariantCopy(&var_, &var))) { |
- DLOG(ERROR) << "VariantCopy failed"; |
- var_.vt = VT_EMPTY; |
- } |
-} |
- |
-ScopedVariant& ScopedVariant::operator=(const VARIANT& var) { |
- if (&var != &var_) { |
- VariantClear(&var_); |
- Set(var); |
- } |
- return *this; |
-} |
- |
-bool ScopedVariant::IsLeakableVarType(VARTYPE vt) { |
- bool leakable = false; |
- switch (vt & VT_TYPEMASK) { |
- case VT_BSTR: |
- case VT_DISPATCH: |
- // we treat VT_VARIANT as leakable to err on the safe side. |
- case VT_VARIANT: |
- case VT_UNKNOWN: |
- case VT_SAFEARRAY: |
- |
- // very rarely used stuff (if ever): |
- case VT_VOID: |
- case VT_PTR: |
- case VT_CARRAY: |
- case VT_USERDEFINED: |
- case VT_LPSTR: |
- case VT_LPWSTR: |
- case VT_RECORD: |
- case VT_INT_PTR: |
- case VT_UINT_PTR: |
- case VT_FILETIME: |
- case VT_BLOB: |
- case VT_STREAM: |
- case VT_STORAGE: |
- case VT_STREAMED_OBJECT: |
- case VT_STORED_OBJECT: |
- case VT_BLOB_OBJECT: |
- case VT_VERSIONED_STREAM: |
- case VT_BSTR_BLOB: |
- leakable = true; |
- break; |
- } |
- |
- if (!leakable && (vt & VT_ARRAY) != 0) { |
- leakable = true; |
- } |
- |
- return leakable; |
-} |
- |
-} // namespace win |
-} // namespace base |