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
* get_pointer() { return &authorization_
; }
54 AuthorizationRef
get() const {
55 return authorization_
;
58 void swap(ScopedAuthorizationRef
& that
) {
59 AuthorizationRef temp
= that
.authorization_
;
60 that
.authorization_
= authorization_
;
61 authorization_
= temp
;
64 // ScopedAuthorizationRef::release() is like scoped_ptr<>::release. It is
65 // NOT a wrapper for AuthorizationFree(). To force a
66 // ScopedAuthorizationRef object to call AuthorizationFree(), use
67 // ScopedAuthorizationRef::reset().
68 AuthorizationRef
release() WARN_UNUSED_RESULT
{
69 AuthorizationRef temp
= authorization_
;
70 authorization_
= NULL
;
75 AuthorizationRef authorization_
;
77 DISALLOW_COPY_AND_ASSIGN(ScopedAuthorizationRef
);
83 #endif // BASE_MAC_SCOPED_AUTHORIZATIONREF_H_