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.
5 #ifndef BASE_MAC_SCOPED_AUTHORIZATIONREF_H_
6 #define BASE_MAC_SCOPED_AUTHORIZATIONREF_H_
8 #include <Security/Authorization.h>
10 #include "base/basictypes.h"
11 #include "base/compiler_specific.h"
13 // ScopedAuthorizationRef maintains ownership of an AuthorizationRef. It is
14 // patterned after the scoped_ptr interface.
19 class ScopedAuthorizationRef
{
21 explicit ScopedAuthorizationRef(AuthorizationRef authorization
= NULL
)
22 : authorization_(authorization
) {
25 ~ScopedAuthorizationRef() {
27 AuthorizationFree(authorization_
, kAuthorizationFlagDestroyRights
);
31 void reset(AuthorizationRef authorization
= NULL
) {
32 if (authorization_
!= authorization
) {
34 AuthorizationFree(authorization_
, kAuthorizationFlagDestroyRights
);
36 authorization_
= authorization
;
40 bool operator==(AuthorizationRef that
) const {
41 return authorization_
== that
;
44 bool operator!=(AuthorizationRef that
) const {
45 return authorization_
!= that
;
48 operator AuthorizationRef() const {
49 return authorization_
;
52 AuthorizationRef
* operator&() {
53 return &authorization_
;
56 AuthorizationRef
get() const {
57 return authorization_
;
60 void swap(ScopedAuthorizationRef
& that
) {
61 AuthorizationRef temp
= that
.authorization_
;
62 that
.authorization_
= authorization_
;
63 authorization_
= temp
;
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
;
77 AuthorizationRef authorization_
;
79 DISALLOW_COPY_AND_ASSIGN(ScopedAuthorizationRef
);
85 #endif // BASE_MAC_SCOPED_AUTHORIZATIONREF_H_