text: // 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_
  