| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/policy/core/common/policy_map.h" | 5 #include "components/policy/core/common/policy_map.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/callback.h" | 9 #include "base/callback.h" |
| 10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
| 11 #include "base/stl_util.h" | 11 #include "base/stl_util.h" |
| 12 | 12 |
| 13 namespace policy { | 13 namespace policy { |
| 14 | 14 |
| 15 PolicyMap::Entry::Entry() | 15 PolicyMap::Entry::Entry() |
| 16 : level(POLICY_LEVEL_RECOMMENDED), | 16 : level(POLICY_LEVEL_RECOMMENDED), scope(POLICY_SCOPE_USER) {} |
| 17 scope(POLICY_SCOPE_USER), | |
| 18 value(NULL), | |
| 19 external_data_fetcher(NULL) {} | |
| 20 | 17 |
| 21 void PolicyMap::Entry::DeleteOwnedMembers() { | 18 PolicyMap::Entry::~Entry() = default; |
| 22 delete value; | |
| 23 value = NULL; | |
| 24 delete external_data_fetcher; | |
| 25 external_data_fetcher = NULL; | |
| 26 } | |
| 27 | 19 |
| 28 std::unique_ptr<PolicyMap::Entry> PolicyMap::Entry::DeepCopy() const { | 20 PolicyMap::Entry::Entry(Entry&&) = default; |
| 29 std::unique_ptr<Entry> copy(new Entry); | 21 |
| 30 copy->level = level; | 22 PolicyMap::Entry& PolicyMap::Entry::operator=(Entry&&) = default; |
| 31 copy->scope = scope; | 23 |
| 32 copy->source = source; | 24 PolicyMap::Entry PolicyMap::Entry::DeepCopy() const { |
| 25 Entry copy; |
| 26 copy.level = level; |
| 27 copy.scope = scope; |
| 28 copy.source = source; |
| 33 if (value) | 29 if (value) |
| 34 copy->value = value->DeepCopy(); | 30 copy.value = value->CreateDeepCopy(); |
| 35 if (external_data_fetcher) { | 31 if (external_data_fetcher) { |
| 36 copy->external_data_fetcher = | 32 copy.external_data_fetcher.reset( |
| 37 new ExternalDataFetcher(*external_data_fetcher); | 33 new ExternalDataFetcher(*external_data_fetcher)); |
| 38 } | 34 } |
| 39 return copy; | 35 return copy; |
| 40 } | 36 } |
| 41 | 37 |
| 42 bool PolicyMap::Entry::has_higher_priority_than( | 38 bool PolicyMap::Entry::has_higher_priority_than( |
| 43 const PolicyMap::Entry& other) const { | 39 const PolicyMap::Entry& other) const { |
| 44 if (level == other.level) | 40 if (level == other.level) |
| 45 return scope > other.scope; | 41 return scope > other.scope; |
| 46 else | 42 else |
| 47 return level > other.level; | 43 return level > other.level; |
| 48 } | 44 } |
| 49 | 45 |
| 50 bool PolicyMap::Entry::Equals(const PolicyMap::Entry& other) const { | 46 bool PolicyMap::Entry::Equals(const PolicyMap::Entry& other) const { |
| 51 return level == other.level && | 47 return level == other.level && scope == other.scope && |
| 52 scope == other.scope && | |
| 53 source == other.source && // Necessary for PolicyUIHandler observers. | 48 source == other.source && // Necessary for PolicyUIHandler observers. |
| 54 // They have to update when sources change. | 49 // They have to update when sources change. |
| 55 base::Value::Equals(value, other.value) && | 50 base::Value::Equals(value.get(), other.value.get()) && |
| 56 ExternalDataFetcher::Equals(external_data_fetcher, | 51 ExternalDataFetcher::Equals(external_data_fetcher.get(), |
| 57 other.external_data_fetcher); | 52 other.external_data_fetcher.get()); |
| 58 } | 53 } |
| 59 | 54 |
| 60 PolicyMap::PolicyMap() { | 55 PolicyMap::PolicyMap() { |
| 61 } | 56 } |
| 62 | 57 |
| 63 PolicyMap::~PolicyMap() { | 58 PolicyMap::~PolicyMap() { |
| 64 Clear(); | 59 Clear(); |
| 65 } | 60 } |
| 66 | 61 |
| 67 const PolicyMap::Entry* PolicyMap::Get(const std::string& policy) const { | 62 const PolicyMap::Entry* PolicyMap::Get(const std::string& policy) const { |
| 68 PolicyMapType::const_iterator entry = map_.find(policy); | 63 PolicyMapType::const_iterator entry = map_.find(policy); |
| 69 return entry == map_.end() ? NULL : &entry->second; | 64 return entry == map_.end() ? nullptr : &entry->second; |
| 70 } | 65 } |
| 71 | 66 |
| 72 const base::Value* PolicyMap::GetValue(const std::string& policy) const { | 67 const base::Value* PolicyMap::GetValue(const std::string& policy) const { |
| 73 PolicyMapType::const_iterator entry = map_.find(policy); | 68 PolicyMapType::const_iterator entry = map_.find(policy); |
| 74 return entry == map_.end() ? NULL : entry->second.value; | 69 return entry == map_.end() ? nullptr : entry->second.value.get(); |
| 75 } | 70 } |
| 76 | 71 |
| 77 void PolicyMap::Set(const std::string& policy, | 72 void PolicyMap::Set( |
| 78 PolicyLevel level, | 73 const std::string& policy, |
| 79 PolicyScope scope, | 74 PolicyLevel level, |
| 80 PolicySource source, | 75 PolicyScope scope, |
| 81 base::Value* value, | 76 PolicySource source, |
| 82 ExternalDataFetcher* external_data_fetcher) { | 77 std::unique_ptr<base::Value> value, |
| 83 Entry& entry = map_[policy]; | 78 std::unique_ptr<ExternalDataFetcher> external_data_fetcher) { |
| 84 entry.DeleteOwnedMembers(); | 79 Entry entry; |
| 85 entry.level = level; | 80 entry.level = level; |
| 86 entry.scope = scope; | 81 entry.scope = scope; |
| 87 entry.source = source; | 82 entry.source = source; |
| 88 entry.value = value; | 83 entry.value = std::move(value); |
| 89 entry.external_data_fetcher = external_data_fetcher; | 84 entry.external_data_fetcher = std::move(external_data_fetcher); |
| 85 Set(policy, std::move(entry)); |
| 86 } |
| 87 |
| 88 void PolicyMap::Set(const std::string& policy, Entry entry) { |
| 89 map_[policy] = std::move(entry); |
| 90 } | 90 } |
| 91 | 91 |
| 92 void PolicyMap::Erase(const std::string& policy) { | 92 void PolicyMap::Erase(const std::string& policy) { |
| 93 PolicyMapType::iterator it = map_.find(policy); | 93 map_.erase(policy); |
| 94 if (it != map_.end()) { | |
| 95 it->second.DeleteOwnedMembers(); | |
| 96 map_.erase(it); | |
| 97 } | |
| 98 } | 94 } |
| 99 | 95 |
| 100 void PolicyMap::Swap(PolicyMap* other) { | 96 void PolicyMap::Swap(PolicyMap* other) { |
| 101 map_.swap(other->map_); | 97 map_.swap(other->map_); |
| 102 } | 98 } |
| 103 | 99 |
| 104 void PolicyMap::CopyFrom(const PolicyMap& other) { | 100 void PolicyMap::CopyFrom(const PolicyMap& other) { |
| 105 Clear(); | 101 Clear(); |
| 106 for (const_iterator it = other.begin(); it != other.end(); ++it) { | 102 for (const auto& it : other) |
| 107 const Entry& entry = it->second; | 103 Set(it.first, it.second.DeepCopy()); |
| 108 Set(it->first, entry.level, entry.scope, entry.source, | 104 } |
| 109 entry.value->DeepCopy(), | 105 |
| 110 entry.external_data_fetcher | 106 std::unique_ptr<PolicyMap> PolicyMap::DeepCopy() const { |
| 111 ? new ExternalDataFetcher(*entry.external_data_fetcher) | 107 std::unique_ptr<PolicyMap> copy(new PolicyMap()); |
| 112 : nullptr); | 108 copy->CopyFrom(*this); |
| 109 return copy; |
| 110 } |
| 111 |
| 112 void PolicyMap::MergeFrom(const PolicyMap& other) { |
| 113 for (const auto& it : other) { |
| 114 const Entry* entry = Get(it.first); |
| 115 if (!entry || it.second.has_higher_priority_than(*entry)) |
| 116 Set(it.first, it.second.DeepCopy()); |
| 113 } | 117 } |
| 114 } | 118 } |
| 115 | 119 |
| 116 std::unique_ptr<PolicyMap> PolicyMap::DeepCopy() const { | |
| 117 PolicyMap* copy = new PolicyMap(); | |
| 118 copy->CopyFrom(*this); | |
| 119 return base::WrapUnique(copy); | |
| 120 } | |
| 121 | |
| 122 void PolicyMap::MergeFrom(const PolicyMap& other) { | |
| 123 for (const_iterator it = other.begin(); it != other.end(); ++it) { | |
| 124 const Entry* entry = Get(it->first); | |
| 125 if (!entry || it->second.has_higher_priority_than(*entry)) { | |
| 126 Set(it->first, it->second.level, it->second.scope, it->second.source, | |
| 127 it->second.value->DeepCopy(), | |
| 128 it->second.external_data_fetcher | |
| 129 ? new ExternalDataFetcher( | |
| 130 *it->second.external_data_fetcher) | |
| 131 : nullptr); | |
| 132 } | |
| 133 } | |
| 134 } | |
| 135 | |
| 136 void PolicyMap::LoadFrom( | 120 void PolicyMap::LoadFrom( |
| 137 const base::DictionaryValue* policies, | 121 const base::DictionaryValue* policies, |
| 138 PolicyLevel level, | 122 PolicyLevel level, |
| 139 PolicyScope scope, | 123 PolicyScope scope, |
| 140 PolicySource source) { | 124 PolicySource source) { |
| 141 for (base::DictionaryValue::Iterator it(*policies); | 125 for (base::DictionaryValue::Iterator it(*policies); |
| 142 !it.IsAtEnd(); it.Advance()) { | 126 !it.IsAtEnd(); it.Advance()) { |
| 143 Set(it.key(), level, scope, source, it.value().DeepCopy(), nullptr); | 127 Set(it.key(), level, scope, source, it.value().CreateDeepCopy(), nullptr); |
| 144 } | 128 } |
| 145 } | 129 } |
| 146 | 130 |
| 147 void PolicyMap::GetDifferingKeys(const PolicyMap& other, | 131 void PolicyMap::GetDifferingKeys(const PolicyMap& other, |
| 148 std::set<std::string>* differing_keys) const { | 132 std::set<std::string>* differing_keys) const { |
| 149 // Walk over the maps in lockstep, adding everything that is different. | 133 // Walk over the maps in lockstep, adding everything that is different. |
| 150 const_iterator iter_this(begin()); | 134 const_iterator iter_this(begin()); |
| 151 const_iterator iter_other(other.begin()); | 135 const_iterator iter_other(other.begin()); |
| 152 while (iter_this != end() && iter_other != other.end()) { | 136 while (iter_this != end() && iter_other != other.end()) { |
| 153 const int diff = iter_this->first.compare(iter_other->first); | 137 const int diff = iter_this->first.compare(iter_other->first); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 169 for ( ; iter_this != end(); ++iter_this) | 153 for ( ; iter_this != end(); ++iter_this) |
| 170 differing_keys->insert(iter_this->first); | 154 differing_keys->insert(iter_this->first); |
| 171 for ( ; iter_other != other.end(); ++iter_other) | 155 for ( ; iter_other != other.end(); ++iter_other) |
| 172 differing_keys->insert(iter_other->first); | 156 differing_keys->insert(iter_other->first); |
| 173 } | 157 } |
| 174 | 158 |
| 175 void PolicyMap::FilterLevel(PolicyLevel level) { | 159 void PolicyMap::FilterLevel(PolicyLevel level) { |
| 176 PolicyMapType::iterator iter(map_.begin()); | 160 PolicyMapType::iterator iter(map_.begin()); |
| 177 while (iter != map_.end()) { | 161 while (iter != map_.end()) { |
| 178 if (iter->second.level != level) { | 162 if (iter->second.level != level) { |
| 179 iter->second.DeleteOwnedMembers(); | |
| 180 map_.erase(iter++); | 163 map_.erase(iter++); |
| 181 } else { | 164 } else { |
| 182 ++iter; | 165 ++iter; |
| 183 } | 166 } |
| 184 } | 167 } |
| 185 } | 168 } |
| 186 | 169 |
| 187 bool PolicyMap::Equals(const PolicyMap& other) const { | 170 bool PolicyMap::Equals(const PolicyMap& other) const { |
| 188 return other.size() == size() && | 171 return other.size() == size() && |
| 189 std::equal(begin(), end(), other.begin(), MapEntryEquals); | 172 std::equal(begin(), end(), other.begin(), MapEntryEquals); |
| 190 } | 173 } |
| 191 | 174 |
| 192 bool PolicyMap::empty() const { | 175 bool PolicyMap::empty() const { |
| 193 return map_.empty(); | 176 return map_.empty(); |
| 194 } | 177 } |
| 195 | 178 |
| 196 size_t PolicyMap::size() const { | 179 size_t PolicyMap::size() const { |
| 197 return map_.size(); | 180 return map_.size(); |
| 198 } | 181 } |
| 199 | 182 |
| 200 PolicyMap::const_iterator PolicyMap::begin() const { | 183 PolicyMap::const_iterator PolicyMap::begin() const { |
| 201 return map_.begin(); | 184 return map_.begin(); |
| 202 } | 185 } |
| 203 | 186 |
| 204 PolicyMap::const_iterator PolicyMap::end() const { | 187 PolicyMap::const_iterator PolicyMap::end() const { |
| 205 return map_.end(); | 188 return map_.end(); |
| 206 } | 189 } |
| 207 | 190 |
| 208 void PolicyMap::Clear() { | 191 void PolicyMap::Clear() { |
| 209 for (PolicyMapType::iterator it = map_.begin(); it != map_.end(); ++it) | |
| 210 it->second.DeleteOwnedMembers(); | |
| 211 map_.clear(); | 192 map_.clear(); |
| 212 } | 193 } |
| 213 | 194 |
| 214 // static | 195 // static |
| 215 bool PolicyMap::MapEntryEquals(const PolicyMap::PolicyMapType::value_type& a, | 196 bool PolicyMap::MapEntryEquals(const PolicyMap::PolicyMapType::value_type& a, |
| 216 const PolicyMap::PolicyMapType::value_type& b) { | 197 const PolicyMap::PolicyMapType::value_type& b) { |
| 217 return a.first == b.first && a.second.Equals(b.second); | 198 return a.first == b.first && a.second.Equals(b.second); |
| 218 } | 199 } |
| 219 | 200 |
| 220 } // namespace policy | 201 } // namespace policy |
| OLD | NEW |