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