Home | History | Annotate | Download | only in win
      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:
     35   ScopedHandle() : handle_(NULL) {
     36   }
     37 
     38   explicit ScopedHandle(HANDLE h) : handle_(NULL) {
     39     Set(h);
     40   }
     41 
     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.
     48   bool IsValid() const {
     49     return handle_ != NULL;
     50   }
     51 
     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 
     60   HANDLE Get() {
     61     return handle_;
     62   }
     63 
     64   operator HANDLE() { return handle_; }
     65 
     66   HANDLE Take() {
     67     // transfers ownership away from this object
     68     HANDLE h = handle_;
     69     handle_ = NULL;
     70     return h;
     71   }
     72 
     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