|  | // 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/basictypes.h" | 
|  | #include "base/compiler_specific.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_ |