| // Copyright 2012 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_MAC_SCOPED_CFFILEDESCRIPTORREF_H_ | 
 | #define BASE_MAC_SCOPED_CFFILEDESCRIPTORREF_H_ | 
 |  | 
 | #include <CoreFoundation/CoreFoundation.h> | 
 |  | 
 | #include "base/compiler_specific.h" | 
 | #include "base/macros.h" | 
 |  | 
 | namespace base { | 
 | namespace mac { | 
 |  | 
 | // ScopedCFFileDescriptorRef is designed after ScopedCFTypeRef<>. On | 
 | // destruction, it will invalidate the file descriptor. | 
 | // ScopedCFFileDescriptorRef (unlike ScopedCFTypeRef<>) does not support RETAIN | 
 | // semantics, copying, or assignment, as doing so would increase the chances | 
 | // that a file descriptor is invalidated while still in use. | 
 | class ScopedCFFileDescriptorRef { | 
 |  public: | 
 |   explicit ScopedCFFileDescriptorRef(CFFileDescriptorRef fdref = NULL) | 
 |       : fdref_(fdref) { | 
 |   } | 
 |  | 
 |   ~ScopedCFFileDescriptorRef() { | 
 |     if (fdref_) { | 
 |       CFFileDescriptorInvalidate(fdref_); | 
 |       CFRelease(fdref_); | 
 |     } | 
 |   } | 
 |  | 
 |   void reset(CFFileDescriptorRef fdref = NULL) { | 
 |     if (fdref_ == fdref) | 
 |       return; | 
 |     if (fdref_) { | 
 |       CFFileDescriptorInvalidate(fdref_); | 
 |       CFRelease(fdref_); | 
 |     } | 
 |     fdref_ = fdref; | 
 |   } | 
 |  | 
 |   bool operator==(CFFileDescriptorRef that) const { | 
 |     return fdref_ == that; | 
 |   } | 
 |  | 
 |   bool operator!=(CFFileDescriptorRef that) const { | 
 |     return fdref_ != that; | 
 |   } | 
 |  | 
 |   operator CFFileDescriptorRef() const { | 
 |     return fdref_; | 
 |   } | 
 |  | 
 |   CFFileDescriptorRef get() const { | 
 |     return fdref_; | 
 |   } | 
 |  | 
 |   CFFileDescriptorRef release() WARN_UNUSED_RESULT { | 
 |     CFFileDescriptorRef temp = fdref_; | 
 |     fdref_ = NULL; | 
 |     return temp; | 
 |   } | 
 |  | 
 |  private: | 
 |   CFFileDescriptorRef fdref_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(ScopedCFFileDescriptorRef); | 
 | }; | 
 |  | 
 | }  // namespace mac | 
 | }  // namespace base | 
 |  | 
 | #endif  // BASE_MAC_SCOPED_CFFILEDESCRIPTORREF_H_ |