1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2009 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#ifndef CHROME_BROWSER_COCOA_SCOPED_AUTHORIZATIONREF_H_
672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#define CHROME_BROWSER_COCOA_SCOPED_AUTHORIZATIONREF_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <Security/Authorization.h>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/compiler_specific.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// scoped_AuthorizationRef maintains ownership of an AuthorizationRef.  It is
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// patterned after the scoped_ptr interface.
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass scoped_AuthorizationRef {
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit scoped_AuthorizationRef(AuthorizationRef authorization = NULL)
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      : authorization_(authorization) {
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ~scoped_AuthorizationRef() {
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (authorization_) {
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      AuthorizationFree(authorization_, kAuthorizationFlagDestroyRights);
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void reset(AuthorizationRef authorization = NULL) {
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (authorization_ != authorization) {
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      if (authorization_) {
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        AuthorizationFree(authorization_, kAuthorizationFlagDestroyRights);
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      }
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      authorization_ = authorization;
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool operator==(AuthorizationRef that) const {
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return authorization_ == that;
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool operator!=(AuthorizationRef that) const {
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return authorization_ != that;
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  operator AuthorizationRef() const {
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return authorization_;
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AuthorizationRef* operator&() {
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return &authorization_;
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AuthorizationRef get() const {
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return authorization_;
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void swap(scoped_AuthorizationRef& that) {
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AuthorizationRef temp = that.authorization_;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    that.authorization_ = authorization_;
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    authorization_ = temp;
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // scoped_AuthorizationRef::release() is like scoped_ptr<>::release.  It is
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NOT a wrapper for AuthorizationFree().  To force a
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // scoped_AuthorizationRef object to call AuthorizationFree(), use
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // scoped_AuthorizaitonRef::reset().
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AuthorizationRef release() WARN_UNUSED_RESULT {
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AuthorizationRef temp = authorization_;
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    authorization_ = NULL;
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return temp;
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AuthorizationRef authorization_;
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(scoped_AuthorizationRef);
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif  // CHROME_BROWSER_COCOA_SCOPED_AUTHORIZATIONREF_H_
81