15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef BASE_MAC_SCOPED_AUTHORIZATIONREF_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BASE_MAC_SCOPED_AUTHORIZATIONREF_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <Security/Authorization.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ScopedAuthorizationRef maintains ownership of an AuthorizationRef.  It is
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// patterned after the scoped_ptr interface.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace mac {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScopedAuthorizationRef {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit ScopedAuthorizationRef(AuthorizationRef authorization = NULL)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : authorization_(authorization) {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ScopedAuthorizationRef() {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (authorization_) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AuthorizationFree(authorization_, kAuthorizationFlagDestroyRights);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void reset(AuthorizationRef authorization = NULL) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (authorization_ != authorization) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (authorization_) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        AuthorizationFree(authorization_, kAuthorizationFlagDestroyRights);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      authorization_ = authorization;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator==(AuthorizationRef that) const {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return authorization_ == that;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator!=(AuthorizationRef that) const {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return authorization_ != that;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  operator AuthorizationRef() const {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return authorization_;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AuthorizationRef* operator&() {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return &authorization_;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AuthorizationRef get() const {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return authorization_;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void swap(ScopedAuthorizationRef& that) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AuthorizationRef temp = that.authorization_;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    that.authorization_ = authorization_;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    authorization_ = temp;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ScopedAuthorizationRef::release() is like scoped_ptr<>::release.  It is
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOT a wrapper for AuthorizationFree().  To force a
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ScopedAuthorizationRef object to call AuthorizationFree(), use
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ScopedAuthorizationRef::reset().
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AuthorizationRef release() WARN_UNUSED_RESULT {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    AuthorizationRef temp = authorization_;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    authorization_ = NULL;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return temp;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AuthorizationRef authorization_;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ScopedAuthorizationRef);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace mac
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // BASE_MAC_SCOPED_AUTHORIZATIONREF_H_
86