summaryrefslogtreecommitdiffstats
path: root/base/scoped_variant_win.cc
diff options
context:
space:
mode:
authortommi@chromium.org <tommi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-03-25 22:35:45 +0000
committertommi@chromium.org <tommi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-03-25 22:35:45 +0000
commit6e1f48fb52edc5583db8c6deea2f00600bdddb8b (patch)
tree01689bb373f9383c66755b47f1c8b0b846537078 /base/scoped_variant_win.cc
parent003849a2a44f7e8c7ae7a081d7c6bc0c0f9b5a2d (diff)
downloadchromium_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.cc31
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) {