1// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef BASE_WIN_SCOPED_PROPVARIANT_H_
6#define BASE_WIN_SCOPED_PROPVARIANT_H_
7
8#include <propidl.h>
9
10#include "base/logging.h"
11#include "base/macros.h"
12
13namespace base {
14namespace win {
15
16// A PROPVARIANT that is automatically initialized and cleared upon respective
17// construction and destruction of this class.
18class ScopedPropVariant {
19 public:
20  ScopedPropVariant() {
21    PropVariantInit(&pv_);
22  }
23
24  ~ScopedPropVariant() {
25    Reset();
26  }
27
28  // Returns a pointer to the underlying PROPVARIANT for use as an out param in
29  // a function call.
30  PROPVARIANT* Receive() {
31    DCHECK_EQ(pv_.vt, VT_EMPTY);
32    return &pv_;
33  }
34
35  // Clears the instance to prepare it for re-use (e.g., via Receive).
36  void Reset() {
37    if (pv_.vt != VT_EMPTY) {
38      HRESULT result = PropVariantClear(&pv_);
39      DCHECK_EQ(result, S_OK);
40    }
41  }
42
43  const PROPVARIANT& get() const { return pv_; }
44  const PROPVARIANT* ptr() const { return &pv_; }
45
46 private:
47  PROPVARIANT pv_;
48
49  // Comparison operators for ScopedPropVariant are not supported at this point.
50  bool operator==(const ScopedPropVariant&) const;
51  bool operator!=(const ScopedPropVariant&) const;
52  DISALLOW_COPY_AND_ASSIGN(ScopedPropVariant);
53};
54
55}  // namespace win
56}  // namespace base
57
58#endif  // BASE_WIN_SCOPED_PROPVARIANT_H_
59