| // Copyright (c) 2013 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. |
| |
| #ifndef BASE_WIN_SCOPED_PROPVARIANT_H_ |
| #define BASE_WIN_SCOPED_PROPVARIANT_H_ |
| |
| #include <propidl.h> |
| |
| #include "base/logging.h" |
| #include "base/macros.h" |
| |
| namespace base { |
| namespace win { |
| |
| // A PROPVARIANT that is automatically initialized and cleared upon respective |
| // construction and destruction of this class. |
| class ScopedPropVariant { |
| public: |
| ScopedPropVariant() { PropVariantInit(&pv_); } |
| |
| ~ScopedPropVariant() { Reset(); } |
| |
| // Returns a pointer to the underlying PROPVARIANT for use as an out param in |
| // a function call. |
| PROPVARIANT* Receive() { |
| DCHECK_EQ(pv_.vt, VT_EMPTY); |
| return &pv_; |
| } |
| |
| // Clears the instance to prepare it for re-use (e.g., via Receive). |
| void Reset() { |
| if (pv_.vt != VT_EMPTY) { |
| HRESULT result = PropVariantClear(&pv_); |
| DCHECK_EQ(result, S_OK); |
| } |
| } |
| |
| const PROPVARIANT& get() const { return pv_; } |
| const PROPVARIANT* ptr() const { return &pv_; } |
| |
| private: |
| PROPVARIANT pv_; |
| |
| // Comparison operators for ScopedPropVariant are not supported at this point. |
| bool operator==(const ScopedPropVariant&) const; |
| bool operator!=(const ScopedPropVariant&) const; |
| DISALLOW_COPY_AND_ASSIGN(ScopedPropVariant); |
| }; |
| |
| } // namespace win |
| } // namespace base |
| |
| #endif // BASE_WIN_SCOPED_PROPVARIANT_H_ |