Home | History | Annotate | Download | only in win
      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:
     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   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.
     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.
     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