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 CHROME_COMMON_EXTENSIONS_PERMISSIONS_API_PERMISSION_SET_H_
6 #define CHROME_COMMON_EXTENSIONS_PERMISSIONS_API_PERMISSION_SET_H_
11 #include "base/memory/linked_ptr.h"
12 #include "chrome/common/extensions/permissions/api_permission.h"
18 namespace extensions
{
22 typedef std::map
<APIPermission::ID
,
23 linked_ptr
<APIPermission
> > APIPermissionMap
;
25 class APIPermissionSet
{
27 class const_iterator
:
28 public std::iterator
<std::input_iterator_tag
, const APIPermission
*> {
30 const_iterator(const APIPermissionMap::const_iterator
& it
);
31 const_iterator(const const_iterator
& ids_it
);
33 const_iterator
& operator++() {
38 const_iterator
operator++(int) {
39 const_iterator
tmp(it_
++);
43 bool operator==(const const_iterator
& rhs
) const {
44 return it_
== rhs
.it_
;
47 bool operator!=(const const_iterator
& rhs
) const {
48 return it_
!= rhs
.it_
;
51 const APIPermission
* operator*() const {
52 return it_
->second
.get();
55 const APIPermission
* operator->() const {
56 return it_
->second
.get();
60 APIPermissionMap::const_iterator it_
;
65 APIPermissionSet(const APIPermissionSet
& set
);
69 const_iterator
begin() const {
70 return const_iterator(map().begin());
73 const_iterator
end() const {
77 const_iterator
find(APIPermission::ID id
) const {
78 return map().find(id
);
81 const APIPermissionMap
& map() const {
85 APIPermissionMap
& map() {
93 size_t count(APIPermission::ID id
) const {
94 return map().count(id
);
101 size_t erase(APIPermission::ID id
) {
102 return map().erase(id
);
105 size_t size() const {
109 APIPermissionSet
& operator=(const APIPermissionSet
& rhs
);
111 bool operator==(const APIPermissionSet
& rhs
) const;
113 bool operator!=(const APIPermissionSet
& rhs
) const {
114 return !operator==(rhs
);
117 void insert(APIPermission::ID id
);
119 // Insert |permission| into the APIPermissionSet. The APIPermissionSet will
120 // take the ownership of |permission|,
121 void insert(APIPermission
* permission
);
123 bool Contains(const APIPermissionSet
& rhs
) const;
125 static void Difference(
126 const APIPermissionSet
& set1
,
127 const APIPermissionSet
& set2
,
128 APIPermissionSet
* set3
);
130 static void Intersection(
131 const APIPermissionSet
& set1
,
132 const APIPermissionSet
& set2
,
133 APIPermissionSet
* set3
);
136 const APIPermissionSet
& set1
,
137 const APIPermissionSet
& set2
,
138 APIPermissionSet
* set3
);
140 // Parses permissions from |permissions_data| and adds the parsed permissions
141 // to |api_permissions|. If |unhandled_permissions| is not NULL the names of
142 // all permissions that couldn't be parsed will be added to this vector.
143 // If |error| is NULL, parsing will continue with the next permission if
144 // invalid data is detected. If |error| is not NULL, it will be set to an
145 // error message and false is returned when an invalid permission is found.
146 static bool ParseFromJSON(
147 const base::ListValue
* permissions_data
,
148 APIPermissionSet
* api_permissions
,
150 std::vector
<std::string
>* unhandled_permissions
);
153 APIPermissionMap map_
;
156 } // namespace extensions
158 #endif // CHROME_COMMON_EXTENSIONS_PERMISSIONS_API_PERMISSION_SET_H_