diff options
author | tommi@chromium.org <tommi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-03-25 22:35:45 +0000 |
---|---|---|
committer | tommi@chromium.org <tommi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-03-25 22:35:45 +0000 |
commit | 6e1f48fb52edc5583db8c6deea2f00600bdddb8b (patch) | |
tree | 01689bb373f9383c66755b47f1c8b0b846537078 /base/scoped_variant_win.cc | |
parent | 003849a2a44f7e8c7ae7a081d7c6bc0c0f9b5a2d (diff) | |
download | chromium_src-6e1f48fb52edc5583db8c6deea2f00600bdddb8b.zip chromium_src-6e1f48fb52edc5583db8c6deea2f00600bdddb8b.tar.gz chromium_src-6e1f48fb52edc5583db8c6deea2f00600bdddb8b.tar.bz2 |
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
Diffstat (limited to 'base/scoped_variant_win.cc')
-rw-r--r-- | base/scoped_variant_win.cc | 31 |
1 files changed, 31 insertions, 0 deletions
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) { |