// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef BASE_SCOPED_HANDLE_H__
#define BASE_SCOPED_HANDLE_H__

#include <windows.h>

#include "base/basictypes.h"

// Used so we always remember to close the handle. Example:
//   ScopedHandle hfile(CreateFile(...));
//   if (!hfile.Get())
//     ...process error
//   ReadFile(hfile.Get(), ...);
//
// To sqirrel the handle away somewhere else:
//   secret_handle_ = hfile.Take();
//
// To explicitly close the handle:
//   CloseHandle(hfile.Take());
class ScopedHandle {
 public:
  ScopedHandle() : handle_(NULL) {
  }

  explicit ScopedHandle(HANDLE h) : handle_(NULL) {
    Set(h);
  }

  ~ScopedHandle() {
    Close();
  }

  // Use this instead of comparing to INVALID_HANDLE_VALUE to pick up our NULL
  // usage for errors.
  bool IsValid() const {
    return handle_ != NULL;
  }

  void Set(HANDLE new_handle) {
    Close();

    // Windows is inconsistent about invalid handles, so we always use NULL
    if (handle_ != INVALID_HANDLE_VALUE)
      handle_ = new_handle;
  }

  HANDLE Get() {
    return handle_;
  }

  operator HANDLE() { return handle_; }

  HANDLE Take() {
    // transfers ownership away from this object
    HANDLE h = handle_;
    handle_ = NULL;
    return h;
  }

 private:
  void Close() {
    if (handle_) {
      CloseHandle(handle_);
      handle_ = NULL;
    }
  }

  HANDLE handle_;
  DISALLOW_EVIL_CONSTRUCTORS(ScopedHandle);
};

// Like ScopedHandle, but for HANDLEs returned from FindFile().
class ScopedFindFileHandle {
 public:
  explicit ScopedFindFileHandle(HANDLE handle) : handle_(handle) {
    // Windows is inconsistent about invalid handles, so we always use NULL
    if (handle_ == INVALID_HANDLE_VALUE)
      handle_ = NULL;
  }

  ~ScopedFindFileHandle() {
    if (handle_)
      FindClose(handle_);
  }

  // Use this instead of comparing to INVALID_HANDLE_VALUE to pick up our NULL
  // usage for errors.
  bool IsValid() const { return handle_ != NULL; }

  operator HANDLE() { return handle_; }

 private:
  HANDLE handle_;

  DISALLOW_EVIL_CONSTRUCTORS(ScopedFindFileHandle);
};

// Like ScopedHandle but for HDC.  Only use this on HDCs returned from
// CreateCompatibleDC.  For an HDC returned by GetDC, use ReleaseDC instead.
class ScopedHDC {
 public:
  explicit ScopedHDC(HDC h) : hdc_(h) { }

  ~ScopedHDC() {
    if (hdc_)
      DeleteDC(hdc_);
  }

  operator HDC() { return hdc_; }

 private:
  HDC hdc_;
  DISALLOW_EVIL_CONSTRUCTORS(ScopedHDC);
};

// Like ScopedHandle but for HBITMAP.
class ScopedBitmap {
 public:
  explicit ScopedBitmap(HBITMAP h) : hbitmap_(h) { }

  ~ScopedBitmap() {
    if (hbitmap_)
      DeleteObject(hbitmap_);
  }

  operator HBITMAP() { return hbitmap_; }

 private:
  HBITMAP hbitmap_;
  DISALLOW_EVIL_CONSTRUCTORS(ScopedBitmap);
};

// Like ScopedHandle but for HRGN.
class ScopedHRGN {
 public:
  explicit ScopedHRGN(HRGN h) : hrgn_(h) { }

  ~ScopedHRGN() {
    if (hrgn_)
      DeleteObject(hrgn_);
  }

  operator HRGN() { return hrgn_; }

  ScopedHRGN& operator=(HRGN hrgn) {
    if (hrgn_ && hrgn != hrgn_)
      DeleteObject(hrgn_);
    hrgn_ = hrgn;
    return *this;
  }

 private:
  HRGN hrgn_;
  DISALLOW_EVIL_CONSTRUCTORS(ScopedHRGN);
};

// Like ScopedHandle except for HGLOBAL.
template<class T>
class ScopedHGlobal {
 public:
  explicit ScopedHGlobal(HGLOBAL glob) : glob_(glob) {
    data_ = static_cast<T*>(GlobalLock(glob_));
  }
  ~ScopedHGlobal() {
    GlobalUnlock(glob_);
  }

  T* get() { return data_; }

  size_t Size() const { return GlobalSize(glob_); }

  T* operator->() const  {
    assert(data_ != 0);
    return data_;
  }

 private:
  HGLOBAL glob_;

  T* data_;

  DISALLOW_EVIL_CONSTRUCTORS(ScopedHGlobal);
};

#endif // BASE_SCOPED_HANDLE_H__

