|  | // Copyright (c) 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_AUTHORIZATIONREF_H_ | 
|  | #define BASE_MAC_SCOPED_AUTHORIZATIONREF_H_ | 
|  |  | 
|  | #include <Security/Authorization.h> | 
|  |  | 
|  | #include "base/compiler_specific.h" | 
|  | #include "base/macros.h" | 
|  |  | 
|  | // ScopedAuthorizationRef maintains ownership of an AuthorizationRef.  It is | 
|  | // patterned after the unique_ptr interface. | 
|  |  | 
|  | namespace base { | 
|  | namespace mac { | 
|  |  | 
|  | class ScopedAuthorizationRef { | 
|  | public: | 
|  | explicit ScopedAuthorizationRef(AuthorizationRef authorization = NULL) | 
|  | : authorization_(authorization) { | 
|  | } | 
|  |  | 
|  | ~ScopedAuthorizationRef() { | 
|  | if (authorization_) { | 
|  | AuthorizationFree(authorization_, kAuthorizationFlagDestroyRights); | 
|  | } | 
|  | } | 
|  |  | 
|  | void reset(AuthorizationRef authorization = NULL) { | 
|  | if (authorization_ != authorization) { | 
|  | if (authorization_) { | 
|  | AuthorizationFree(authorization_, kAuthorizationFlagDestroyRights); | 
|  | } | 
|  | authorization_ = authorization; | 
|  | } | 
|  | } | 
|  |  | 
|  | bool operator==(AuthorizationRef that) const { | 
|  | return authorization_ == that; | 
|  | } | 
|  |  | 
|  | bool operator!=(AuthorizationRef that) const { | 
|  | return authorization_ != that; | 
|  | } | 
|  |  | 
|  | operator AuthorizationRef() const { | 
|  | return authorization_; | 
|  | } | 
|  |  | 
|  | AuthorizationRef* get_pointer() { return &authorization_; } | 
|  |  | 
|  | AuthorizationRef get() const { | 
|  | return authorization_; | 
|  | } | 
|  |  | 
|  | void swap(ScopedAuthorizationRef& that) { | 
|  | AuthorizationRef temp = that.authorization_; | 
|  | that.authorization_ = authorization_; | 
|  | authorization_ = temp; | 
|  | } | 
|  |  | 
|  | // ScopedAuthorizationRef::release() is like std::unique_ptr<>::release. It is | 
|  | // NOT a wrapper for AuthorizationFree(). To force a ScopedAuthorizationRef | 
|  | // object to call AuthorizationFree(), use ScopedAuthorizationRef::reset(). | 
|  | AuthorizationRef release() WARN_UNUSED_RESULT { | 
|  | AuthorizationRef temp = authorization_; | 
|  | authorization_ = NULL; | 
|  | return temp; | 
|  | } | 
|  |  | 
|  | private: | 
|  | AuthorizationRef authorization_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(ScopedAuthorizationRef); | 
|  | }; | 
|  |  | 
|  | }  // namespace mac | 
|  | }  // namespace base | 
|  |  | 
|  | #endif  // BASE_MAC_SCOPED_AUTHORIZATIONREF_H_ |