From 6e1f48fb52edc5583db8c6deea2f00600bdddb8b Mon Sep 17 00:00:00 2001 From: "tommi@chromium.org" Date: Wed, 25 Mar 2009 22:35:45 +0000 Subject: Adding a Set() method for copying (not taking ownership) a variant over to the ScopedVariant and a couple of new constructors for IDispatch and IUnknown. includes tests. Review URL: http://codereview.chromium.org/42569 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@12506 0039d316-1c4b-4281-b951-d872f2087c98 --- base/scoped_variant_win.cc | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'base/scoped_variant_win.cc') diff --git a/base/scoped_variant_win.cc b/base/scoped_variant_win.cc index 5653520..6593a477 100644 --- a/base/scoped_variant_win.cc +++ b/base/scoped_variant_win.cc @@ -28,6 +28,21 @@ ScopedVariant::ScopedVariant(int value, VARTYPE vt) { var_.lVal = value; } +ScopedVariant::ScopedVariant(IDispatch* dispatch) { + var_.vt = VT_EMPTY; + Set(dispatch); +} + +ScopedVariant::ScopedVariant(IUnknown* unknown) { + var_.vt = VT_EMPTY; + Set(unknown); +} + +ScopedVariant::ScopedVariant(const VARIANT& var) { + var_.vt = VT_EMPTY; + Set(var); +} + void ScopedVariant::Reset(const VARIANT& var) { if (&var != &var_) { ::VariantClear(&var_); @@ -187,6 +202,22 @@ void ScopedVariant::Set(SAFEARRAY* array) { } } +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) { -- cgit v1.1