1/*
2 *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11#ifndef WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_SCOPED_GDI_HANDLE_H_
12#define WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_SCOPED_GDI_HANDLE_H_
13
14#include <windows.h>
15
16#include "webrtc/base/constructormagic.h"
17#include "webrtc/typedefs.h"
18
19namespace webrtc {
20namespace win {
21
22// Scoper for GDI objects.
23template<class T, class Traits>
24class ScopedGDIObject {
25 public:
26  ScopedGDIObject() : handle_(NULL) {}
27  explicit ScopedGDIObject(T object) : handle_(object) {}
28
29  ~ScopedGDIObject() {
30    Traits::Close(handle_);
31  }
32
33  T Get() {
34    return handle_;
35  }
36
37  void Set(T object) {
38    if (handle_ && object != handle_)
39      Traits::Close(handle_);
40    handle_ = object;
41  }
42
43  ScopedGDIObject& operator=(T object) {
44    Set(object);
45    return *this;
46  }
47
48  T release() {
49    T object = handle_;
50    handle_ = NULL;
51    return object;
52  }
53
54  operator T() { return handle_; }
55
56 private:
57  T handle_;
58
59  DISALLOW_COPY_AND_ASSIGN(ScopedGDIObject);
60};
61
62// The traits class that uses DeleteObject() to close a handle.
63template <typename T>
64class DeleteObjectTraits {
65 public:
66  // Closes the handle.
67  static void Close(T handle) {
68    if (handle)
69      DeleteObject(handle);
70  }
71
72 private:
73  DISALLOW_IMPLICIT_CONSTRUCTORS(DeleteObjectTraits);
74};
75
76// The traits class that uses DestroyCursor() to close a handle.
77class DestroyCursorTraits {
78 public:
79  // Closes the handle.
80  static void Close(HCURSOR handle) {
81    if (handle)
82      DestroyCursor(handle);
83  }
84
85 private:
86  DISALLOW_IMPLICIT_CONSTRUCTORS(DestroyCursorTraits);
87};
88
89typedef ScopedGDIObject<HBITMAP, DeleteObjectTraits<HBITMAP> > ScopedBitmap;
90typedef ScopedGDIObject<HCURSOR, DestroyCursorTraits> ScopedCursor;
91
92}  // namespace win
93}  // namespace webrtc
94
95#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_SCOPED_GDI_HANDLE_H_
96