1 // Copyright (c) 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_AUTHORIZATIONREF_H_ 6 #define BASE_MAC_SCOPED_AUTHORIZATIONREF_H_ 7 8 #include <Security/Authorization.h> 9 10 #include "base/basictypes.h" 11 #include "base/compiler_specific.h" 12 13 // ScopedAuthorizationRef maintains ownership of an AuthorizationRef. It is 14 // patterned after the scoped_ptr interface. 15 16 namespace base { 17 namespace mac { 18 19 class ScopedAuthorizationRef { 20 public: 21 explicit ScopedAuthorizationRef(AuthorizationRef authorization = NULL) 22 : authorization_(authorization) { 23 } 24 25 ~ScopedAuthorizationRef() { 26 if (authorization_) { 27 AuthorizationFree(authorization_, kAuthorizationFlagDestroyRights); 28 } 29 } 30 31 void reset(AuthorizationRef authorization = NULL) { 32 if (authorization_ != authorization) { 33 if (authorization_) { 34 AuthorizationFree(authorization_, kAuthorizationFlagDestroyRights); 35 } 36 authorization_ = authorization; 37 } 38 } 39 40 bool operator==(AuthorizationRef that) const { 41 return authorization_ == that; 42 } 43 44 bool operator!=(AuthorizationRef that) const { 45 return authorization_ != that; 46 } 47 48 operator AuthorizationRef() const { 49 return authorization_; 50 } 51 52 AuthorizationRef* operator&() { 53 return &authorization_; 54 } 55 56 AuthorizationRef get() const { 57 return authorization_; 58 } 59 60 void swap(ScopedAuthorizationRef& that) { 61 AuthorizationRef temp = that.authorization_; 62 that.authorization_ = authorization_; 63 authorization_ = temp; 64 } 65 66 // ScopedAuthorizationRef::release() is like scoped_ptr<>::release. It is 67 // NOT a wrapper for AuthorizationFree(). To force a 68 // ScopedAuthorizationRef object to call AuthorizationFree(), use 69 // ScopedAuthorizationRef::reset(). 70 AuthorizationRef release() WARN_UNUSED_RESULT { 71 AuthorizationRef temp = authorization_; 72 authorization_ = NULL; 73 return temp; 74 } 75 76 private: 77 AuthorizationRef authorization_; 78 79 DISALLOW_COPY_AND_ASSIGN(ScopedAuthorizationRef); 80 }; 81 82 } // namespace mac 83 } // namespace base 84 85 #endif // BASE_MAC_SCOPED_AUTHORIZATIONREF_H_ 86