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 
19 namespace webrtc {
20 namespace win {
21 
22 // Scoper for GDI objects.
23 template<class T, class Traits>
24 class ScopedGDIObject {
25  public:
ScopedGDIObject()26   ScopedGDIObject() : handle_(NULL) {}
ScopedGDIObject(T object)27   explicit ScopedGDIObject(T object) : handle_(object) {}
28 
~ScopedGDIObject()29   ~ScopedGDIObject() {
30     Traits::Close(handle_);
31   }
32 
Get()33   T Get() {
34     return handle_;
35   }
36 
Set(T object)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 
release()48   T release() {
49     T object = handle_;
50     handle_ = NULL;
51     return object;
52   }
53 
T()54   operator T() { return handle_; }
55 
56  private:
57   T handle_;
58 
59   RTC_DISALLOW_COPY_AND_ASSIGN(ScopedGDIObject);
60 };
61 
62 // The traits class that uses DeleteObject() to close a handle.
63 template <typename T>
64 class DeleteObjectTraits {
65  public:
66   // Closes the handle.
Close(T handle)67   static void Close(T handle) {
68     if (handle)
69       DeleteObject(handle);
70   }
71 
72  private:
73   RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(DeleteObjectTraits);
74 };
75 
76 // The traits class that uses DestroyCursor() to close a handle.
77 class DestroyCursorTraits {
78  public:
79   // Closes the handle.
Close(HCURSOR handle)80   static void Close(HCURSOR handle) {
81     if (handle)
82       DestroyCursor(handle);
83   }
84 
85  private:
86   RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(DestroyCursorTraits);
87 };
88 
89 typedef ScopedGDIObject<HBITMAP, DeleteObjectTraits<HBITMAP> > ScopedBitmap;
90 typedef ScopedGDIObject<HCURSOR, DestroyCursorTraits> ScopedCursor;
91 
92 }  // namespace win
93 }  // namespace webrtc
94 
95 #endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_SCOPED_GDI_HANDLE_H_
96