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