14af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org/* 24af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 34af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org * 44af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org * Use of this source code is governed by a BSD-style license 54af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org * that can be found in the LICENSE file in the root of the source 64af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org * tree. An additional intellectual property rights grant can be found 74af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org * in the file PATENTS. All contributing project authors may 84af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org * be found in the AUTHORS file in the root of the source tree. 94af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org */ 104af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org 114af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org#ifndef WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_SCOPED_GDI_HANDLE_H_ 124af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org#define WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_SCOPED_GDI_HANDLE_H_ 134af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org 144af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org#include <windows.h> 154af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org 1688fbb2d86b33a3886bba1af4d098efa2c19eb1e7henrike@webrtc.org#include "webrtc/base/constructormagic.h" 174af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org#include "webrtc/typedefs.h" 184af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org 194af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.orgnamespace webrtc { 204af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.orgnamespace win { 214af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org 224af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org// Scoper for GDI objects. 234af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.orgtemplate<class T, class Traits> 244af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.orgclass ScopedGDIObject { 254af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org public: 264af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org ScopedGDIObject() : handle_(NULL) {} 274af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org explicit ScopedGDIObject(T object) : handle_(object) {} 284af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org 294af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org ~ScopedGDIObject() { 304af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org Traits::Close(handle_); 314af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org } 324af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org 334af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org T Get() { 344af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org return handle_; 354af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org } 364af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org 374af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org void Set(T object) { 384af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org if (handle_ && object != handle_) 394af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org Traits::Close(handle_); 404af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org handle_ = object; 414af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org } 424af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org 434af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org ScopedGDIObject& operator=(T object) { 444af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org Set(object); 454af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org return *this; 464af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org } 474af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org 484af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org T release() { 494af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org T object = handle_; 504af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org handle_ = NULL; 514af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org return object; 524af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org } 534af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org 544af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org operator T() { return handle_; } 554af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org 564af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org private: 574af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org T handle_; 584af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org 593c089d751ede283e21e186885eaf705c3257ccd2henrikg RTC_DISALLOW_COPY_AND_ASSIGN(ScopedGDIObject); 604af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org}; 614af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org 624af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org// The traits class that uses DeleteObject() to close a handle. 634af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.orgtemplate <typename T> 644af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.orgclass DeleteObjectTraits { 654af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org public: 664af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org // Closes the handle. 674af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org static void Close(T handle) { 684af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org if (handle) 694af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org DeleteObject(handle); 704af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org } 714af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org 724af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org private: 733c089d751ede283e21e186885eaf705c3257ccd2henrikg RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(DeleteObjectTraits); 744af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org}; 754af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org 764af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org// The traits class that uses DestroyCursor() to close a handle. 774af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.orgclass DestroyCursorTraits { 784af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org public: 794af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org // Closes the handle. 804af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org static void Close(HCURSOR handle) { 814af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org if (handle) 824af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org DestroyCursor(handle); 834af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org } 844af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org 854af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org private: 863c089d751ede283e21e186885eaf705c3257ccd2henrikg RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(DestroyCursorTraits); 874af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org}; 884af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org 894af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.orgtypedef ScopedGDIObject<HBITMAP, DeleteObjectTraits<HBITMAP> > ScopedBitmap; 904af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.orgtypedef ScopedGDIObject<HCURSOR, DestroyCursorTraits> ScopedCursor; 914af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org 924af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org} // namespace win 934af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org} // namespace webrtc 944af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org 954af0878e57b54c5800e87de239477df1a45f1033alexeypa@chromium.org#endif // WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_SCOPED_GDI_HANDLE_H_ 96