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