summaryrefslogtreecommitdiffstats
path: root/base/scoped_variant_win.cc
diff options
context:
space:
mode:
authorbrettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-16 03:46:05 +0000
committerbrettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-16 03:46:05 +0000
commitce0e7246e92f2da8e6b865dd51ae626f9867ca4f (patch)
tree8181f26fbe349c35ff37a9ae837603c3f11be7f8 /base/scoped_variant_win.cc
parent21e74460f5b7cfe6f622557b20d40eecf3b8e98b (diff)
downloadchromium_src-ce0e7246e92f2da8e6b865dd51ae626f9867ca4f.zip
chromium_src-ce0e7246e92f2da8e6b865dd51ae626f9867ca4f.tar.gz
chromium_src-ce0e7246e92f2da8e6b865dd51ae626f9867ca4f.tar.bz2
Move the windows-specific scoped_* stuff from base to base/win and in the base::win namespace.
This keeps old headers that forward to the new versions and have using declarations that allow the existing code to compile. I fixed all the callers in base to use the new ones, and also the other files I happened to touch. This splits out the stuff from scoped_handle into a few separate files. I just deleted ScopedFindFile since it was only used in one place and it wasn't even really helping there. I removed StackBstr which was a #define and used the "regular" ScopedBstr in the 7 places that used it. This is an optimization to avoid an extra allocation, but none of the callers are remotely performance critical. TEST=it compiles BUG=none Review URL: http://codereview.chromium.org/3781009 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@62843 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'base/scoped_variant_win.cc')
-rw-r--r--base/scoped_variant_win.cc270
1 files changed, 0 insertions, 270 deletions
diff --git a/base/scoped_variant_win.cc b/base/scoped_variant_win.cc
deleted file mode 100644
index dd4bceb..0000000
--- a/base/scoped_variant_win.cc
+++ /dev/null
@@ -1,270 +0,0 @@
-// Copyright (c) 2009 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/scoped_variant_win.h"
-#include "base/logging.h"
-
-// 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 == NULL) << "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;
-}