• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef BASE_WIN_SCOPED_HANDLE_H_
6 #define BASE_WIN_SCOPED_HANDLE_H_
7 #pragma once
8 
9 #include <windows.h>
10 
11 #include "base/basictypes.h"
12 #include "base/logging.h"
13 
14 namespace base {
15 namespace win {
16 
17 // Used so we always remember to close the handle.
18 // The class interface matches that of ScopedStdioHandle in  addition to an
19 // IsValid() method since invalid handles on windows can be either NULL or
20 // INVALID_HANDLE_VALUE (-1).
21 //
22 // Example:
23 //   ScopedHandle hfile(CreateFile(...));
24 //   if (!hfile.Get())
25 //     ...process error
26 //   ReadFile(hfile.Get(), ...);
27 //
28 // To sqirrel the handle away somewhere else:
29 //   secret_handle_ = hfile.Take();
30 //
31 // To explicitly close the handle:
32 //   hfile.Close();
33 class ScopedHandle {
34  public:
ScopedHandle()35   ScopedHandle() : handle_(NULL) {
36   }
37 
ScopedHandle(HANDLE h)38   explicit ScopedHandle(HANDLE h) : handle_(NULL) {
39     Set(h);
40   }
41 
~ScopedHandle()42   ~ScopedHandle() {
43     Close();
44   }
45 
46   // Use this instead of comparing to INVALID_HANDLE_VALUE to pick up our NULL
47   // usage for errors.
IsValid()48   bool IsValid() const {
49     return handle_ != NULL;
50   }
51 
Set(HANDLE new_handle)52   void Set(HANDLE new_handle) {
53     Close();
54 
55     // Windows is inconsistent about invalid handles, so we always use NULL
56     if (new_handle != INVALID_HANDLE_VALUE)
57       handle_ = new_handle;
58   }
59 
Get()60   HANDLE Get() {
61     return handle_;
62   }
63 
HANDLE()64   operator HANDLE() { return handle_; }
65 
Take()66   HANDLE Take() {
67     // transfers ownership away from this object
68     HANDLE h = handle_;
69     handle_ = NULL;
70     return h;
71   }
72 
Close()73   void Close() {
74     if (handle_) {
75       if (!::CloseHandle(handle_)) {
76         NOTREACHED();
77       }
78       handle_ = NULL;
79     }
80   }
81 
82  private:
83   HANDLE handle_;
84   DISALLOW_COPY_AND_ASSIGN(ScopedHandle);
85 };
86 
87 }  // namespace win
88 }  // namespace base
89 
90 #endif  // BASE_SCOPED_HANDLE_WIN_H_
91