1// Copyright 2012 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_MAC_SCOPED_CFFILEDESCRIPTORREF_H_ 6#define BASE_MAC_SCOPED_CFFILEDESCRIPTORREF_H_ 7 8#include <CoreFoundation/CoreFoundation.h> 9 10#include "base/basictypes.h" 11#include "base/compiler_specific.h" 12 13namespace base { 14namespace mac { 15 16// ScopedCFFileDescriptorRef is designed after ScopedCFTypeRef<>. On 17// destruction, it will invalidate the file descriptor. 18// ScopedCFFileDescriptorRef (unlike ScopedCFTypeRef<>) does not support RETAIN 19// semantics, copying, or assignment, as doing so would increase the chances 20// that a file descriptor is invalidated while still in use. 21class ScopedCFFileDescriptorRef { 22 public: 23 explicit ScopedCFFileDescriptorRef(CFFileDescriptorRef fdref = NULL) 24 : fdref_(fdref) { 25 } 26 27 ~ScopedCFFileDescriptorRef() { 28 if (fdref_) { 29 CFFileDescriptorInvalidate(fdref_); 30 CFRelease(fdref_); 31 } 32 } 33 34 void reset(CFFileDescriptorRef fdref = NULL) { 35 if (fdref_ == fdref) 36 return; 37 if (fdref_) { 38 CFFileDescriptorInvalidate(fdref_); 39 CFRelease(fdref_); 40 } 41 fdref_ = fdref; 42 } 43 44 bool operator==(CFFileDescriptorRef that) const { 45 return fdref_ == that; 46 } 47 48 bool operator!=(CFFileDescriptorRef that) const { 49 return fdref_ != that; 50 } 51 52 operator CFFileDescriptorRef() const { 53 return fdref_; 54 } 55 56 CFFileDescriptorRef get() const { 57 return fdref_; 58 } 59 60 CFFileDescriptorRef release() WARN_UNUSED_RESULT { 61 CFFileDescriptorRef temp = fdref_; 62 fdref_ = NULL; 63 return temp; 64 } 65 66 private: 67 CFFileDescriptorRef fdref_; 68 69 DISALLOW_COPY_AND_ASSIGN(ScopedCFFileDescriptorRef); 70}; 71 72} // namespace mac 73} // namespace base 74 75#endif // BASE_MAC_SCOPED_CFFILEDESCRIPTORREF_H_ 76