summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoragl@chromium.org <agl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2008-11-18 17:47:08 +0000
committeragl@chromium.org <agl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2008-11-18 17:47:08 +0000
commit717a63d05d675240b77b0cc6eb5acbdf1840e112 (patch)
treef1985e55623f1c88172f06d39cabd3f657410700
parent3a9eb83a621e991d593b9d02d377db75a0272f29 (diff)
downloadchromium_src-717a63d05d675240b77b0cc6eb5acbdf1840e112.zip
chromium_src-717a63d05d675240b77b0cc6eb5acbdf1840e112.tar.gz
chromium_src-717a63d05d675240b77b0cc6eb5acbdf1840e112.tar.bz2
Add scoped stdio handles.
Since file_util uses stdio handles, we'll need this. Specifically, _ph has a review out at the moment which requires them. Review URL: http://codereview.chromium.org/11422 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@5612 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--base/scoped_handle.h203
-rw-r--r--base/scoped_handle_win.h209
2 files changed, 232 insertions, 180 deletions
diff --git a/base/scoped_handle.h b/base/scoped_handle.h
index 8ed568d..616a37d 100644
--- a/base/scoped_handle.h
+++ b/base/scoped_handle.h
@@ -2,208 +2,51 @@
// 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>
+#ifndef BASE_SCOPED_HANDLE_FIXME_H__
+#define BASE_SCOPED_HANDLE_FIXME_H__
#include "base/basictypes.h"
-#include "base/logging.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);
- }
+#if defined(OS_WIN)
+#include "base/scoped_handle_win.h"
+#endif
- ~ScopedHandle() {
- Close();
- }
+class ScopedStdioHandle {
+ public:
+ ScopedStdioHandle()
+ : handle_(NULL) { }
- // Use this instead of comparing to INVALID_HANDLE_VALUE to pick up our NULL
- // usage for errors.
- bool IsValid() const {
- return handle_ != NULL;
- }
+ explicit ScopedStdioHandle(FILE* handle)
+ : handle_(handle) { }
- void Set(HANDLE new_handle) {
+ ~ScopedStdioHandle() {
Close();
-
- // Windows is inconsistent about invalid handles, so we always use NULL
- if (new_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_) {
- if (!::CloseHandle(handle_)) {
- NOTREACHED();
- }
+ fclose(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:
- ScopedHDC() : hdc_(NULL) { }
- explicit ScopedHDC(HDC h) : hdc_(h) { }
-
- ~ScopedHDC() {
- Close();
- }
-
- HDC Get() {
- return hdc_;
- }
+ FILE* get() const { return handle_; }
- void Set(HDC h) {
- Close();
- hdc_ = h;
- }
-
- operator HDC() { return hdc_; }
-
- private:
- void Close() {
- if (hdc_)
- DeleteDC(hdc_);
+ FILE* Take() {
+ FILE* temp = handle_;
+ handle_ = NULL;
+ return temp;
}
- HDC hdc_;
- DISALLOW_EVIL_CONSTRUCTORS(ScopedHDC);
-};
-
-// Like ScopedHandle but for GDI objects.
-template<class T>
-class ScopedGDIObject {
- public:
- ScopedGDIObject() : object_(NULL) {}
- explicit ScopedGDIObject(T object) : object_(object) {}
-
- ~ScopedGDIObject() {
+ void Set(FILE* newhandle) {
Close();
- }
-
- T Get() {
- return object_;
- }
-
- void Set(T object) {
- if (object_ && object != object_)
- Close();
- object_ = object;
- }
-
- ScopedGDIObject& operator=(T object) {
- Set(object);
- return *this;
- }
-
- operator T() { return object_; }
-
- private:
- void Close() {
- if (object_)
- DeleteObject(object_);
- }
-
- T object_;
- DISALLOW_COPY_AND_ASSIGN(ScopedGDIObject);
-};
-
-// Typedefs for some common use cases.
-typedef ScopedGDIObject<HBITMAP> ScopedBitmap;
-typedef ScopedGDIObject<HRGN> ScopedHRGN;
-typedef ScopedGDIObject<HFONT> ScopedHFONT;
-
-
-// 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_;
+ handle_ = newhandle;
}
private:
- HGLOBAL glob_;
+ FILE* handle_;
- T* data_;
-
- DISALLOW_EVIL_CONSTRUCTORS(ScopedHGlobal);
+ DISALLOW_EVIL_CONSTRUCTORS(ScopedStdioHandle);
};
-#endif // BASE_SCOPED_HANDLE_H__
-
+#endif // BASE_SCOPED_HANDLE_FIXME_H__
diff --git a/base/scoped_handle_win.h b/base/scoped_handle_win.h
new file mode 100644
index 0000000..8ed568d
--- /dev/null
+++ b/base/scoped_handle_win.h
@@ -0,0 +1,209 @@
+// 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"
+#include "base/logging.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 (new_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_) {
+ if (!::CloseHandle(handle_)) {
+ NOTREACHED();
+ }
+ 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:
+ ScopedHDC() : hdc_(NULL) { }
+ explicit ScopedHDC(HDC h) : hdc_(h) { }
+
+ ~ScopedHDC() {
+ Close();
+ }
+
+ HDC Get() {
+ return hdc_;
+ }
+
+ void Set(HDC h) {
+ Close();
+ hdc_ = h;
+ }
+
+ operator HDC() { return hdc_; }
+
+ private:
+ void Close() {
+ if (hdc_)
+ DeleteDC(hdc_);
+ }
+
+ HDC hdc_;
+ DISALLOW_EVIL_CONSTRUCTORS(ScopedHDC);
+};
+
+// Like ScopedHandle but for GDI objects.
+template<class T>
+class ScopedGDIObject {
+ public:
+ ScopedGDIObject() : object_(NULL) {}
+ explicit ScopedGDIObject(T object) : object_(object) {}
+
+ ~ScopedGDIObject() {
+ Close();
+ }
+
+ T Get() {
+ return object_;
+ }
+
+ void Set(T object) {
+ if (object_ && object != object_)
+ Close();
+ object_ = object;
+ }
+
+ ScopedGDIObject& operator=(T object) {
+ Set(object);
+ return *this;
+ }
+
+ operator T() { return object_; }
+
+ private:
+ void Close() {
+ if (object_)
+ DeleteObject(object_);
+ }
+
+ T object_;
+ DISALLOW_COPY_AND_ASSIGN(ScopedGDIObject);
+};
+
+// Typedefs for some common use cases.
+typedef ScopedGDIObject<HBITMAP> ScopedBitmap;
+typedef ScopedGDIObject<HRGN> ScopedHRGN;
+typedef ScopedGDIObject<HFONT> ScopedHFONT;
+
+
+// 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__
+