Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2237)

Unified Diff: chrome/browser/policy/policy_map.cc

Issue 9111022: Removed ConfigurationPolicyType and extended PolicyMap. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebased Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/policy/policy_map.h ('k') | chrome/browser/policy/policy_map_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/policy/policy_map.cc
diff --git a/chrome/browser/policy/policy_map.cc b/chrome/browser/policy/policy_map.cc
index 7cc81b672aeb4d1095cdb0bc7768b573e6237bbe..35261e9c5efd4727ac6a8c95c4cffd3f07d32ce1 100644
--- a/chrome/browser/policy/policy_map.cc
+++ b/chrome/browser/policy/policy_map.cc
@@ -11,6 +11,20 @@
namespace policy {
+bool PolicyMap::Entry::has_higher_priority_than(
+ const PolicyMap::Entry& other) const {
+ if (level == other.level)
+ return scope > other.scope;
+ else
+ return level > other.level;
+}
+
+bool PolicyMap::Entry::Equals(const PolicyMap::Entry& other) const {
+ return level == other.level &&
+ scope == other.scope &&
+ Value::Equals(value, other.value);
+}
+
PolicyMap::PolicyMap() {
}
@@ -18,21 +32,32 @@ PolicyMap::~PolicyMap() {
Clear();
}
-const Value* PolicyMap::Get(ConfigurationPolicyType policy) const {
+const PolicyMap::Entry* PolicyMap::Get(const std::string& policy) const {
+ PolicyMapType::const_iterator entry = map_.find(policy);
+ return entry == map_.end() ? NULL : &entry->second;
+}
+
+const Value* PolicyMap::GetValue(const std::string& policy) const {
PolicyMapType::const_iterator entry = map_.find(policy);
- return entry == map_.end() ? NULL : entry->second;
+ return entry == map_.end() ? NULL : entry->second.value;
}
-void PolicyMap::Set(ConfigurationPolicyType policy, Value* value) {
- std::swap(map_[policy], value);
- delete value;
+void PolicyMap::Set(const std::string& policy,
+ PolicyLevel level,
+ PolicyScope scope,
+ Value* value) {
+ Entry& entry = map_[policy];
+ delete entry.value;
+ entry.level = level;
+ entry.scope = scope;
+ entry.value = value;
}
-void PolicyMap::Erase(ConfigurationPolicyType policy) {
- const const_iterator entry = map_.find(policy);
- if (entry != map_.end()) {
- delete entry->second;
- map_.erase(entry->first);
+void PolicyMap::Erase(const std::string& policy) {
+ PolicyMapType::iterator it = map_.find(policy);
+ if (it != map_.end()) {
+ delete it->second.value;
+ map_.erase(it);
}
}
@@ -42,32 +67,76 @@ void PolicyMap::Swap(PolicyMap* other) {
void PolicyMap::CopyFrom(const PolicyMap& other) {
Clear();
- for (const_iterator i = other.begin(); i != other.end(); ++i) {
- Set(i->first, i->second->DeepCopy());
+ for (const_iterator it = other.begin(); it != other.end(); ++it) {
+ const Entry& entry = it->second;
+ Set(it->first, entry.level, entry.scope, entry.value->DeepCopy());
}
}
void PolicyMap::MergeFrom(const PolicyMap& other) {
- for (const_iterator i = other.begin(); i != other.end(); ++i) {
- if (!Get(i->first))
- Set(i->first, i->second->DeepCopy());
+ for (const_iterator it = other.begin(); it != other.end(); ++it) {
+ const Entry* entry = Get(it->first);
+ if (!entry || it->second.has_higher_priority_than(*entry)) {
+ Set(it->first, it->second.level, it->second.scope,
+ it->second.value->DeepCopy());
+ }
}
}
void PolicyMap::LoadFrom(
const DictionaryValue* policies,
- const PolicyDefinitionList* list) {
+ const PolicyDefinitionList* list,
+ PolicyLevel level,
+ PolicyScope scope) {
const PolicyDefinitionList::Entry* entry;
for (entry = list->begin; entry != list->end; ++entry) {
Value* value;
if (policies->Get(entry->name, &value))
- Set(entry->policy_type, value->DeepCopy());
+ Set(entry->name, level, scope, value->DeepCopy());
+ }
+}
+
+void PolicyMap::GetDifferingKeys(const PolicyMap& other,
+ std::set<std::string>* differing_keys) const {
+ // Walk over the maps in lockstep, adding everything that is different.
+ const_iterator iter_this(begin());
+ const_iterator iter_other(other.begin());
+ while (iter_this != end() && iter_other != other.end()) {
+ const int diff = iter_this->first.compare(iter_other->first);
+ if (diff == 0) {
+ if (!iter_this->second.Equals(iter_other->second))
+ differing_keys->insert(iter_this->first);
+ ++iter_this;
+ ++iter_other;
+ } else if (diff < 0) {
+ differing_keys->insert(iter_this->first);
+ ++iter_this;
+ } else {
+ differing_keys->insert(iter_other->first);
+ ++iter_other;
+ }
+ }
+
+ // Add the remaining entries.
+ for ( ; iter_this != end(); ++iter_this)
+ differing_keys->insert(iter_this->first);
+ for ( ; iter_other != other.end(); ++iter_other)
+ differing_keys->insert(iter_other->first);
+}
+
+void PolicyMap::FilterLevel(PolicyLevel level) {
+ PolicyMapType::iterator iter(map_.begin());
+ while (iter != map_.end()) {
+ if (iter->second.level != level)
+ map_.erase(iter++);
+ else
+ ++iter;
}
}
bool PolicyMap::Equals(const PolicyMap& other) const {
- return other.map_.size() == map_.size() &&
- std::equal(map_.begin(), map_.end(), other.map_.begin(), MapEntryEquals);
+ return other.size() == size() &&
+ std::equal(begin(), end(), other.begin(), MapEntryEquals);
}
bool PolicyMap::empty() const {
@@ -87,13 +156,15 @@ PolicyMap::const_iterator PolicyMap::end() const {
}
void PolicyMap::Clear() {
- STLDeleteValues(&map_);
+ for (PolicyMapType::iterator it = map_.begin(); it != map_.end(); ++it)
+ delete it->second.value;
+ map_.clear();
}
// static
bool PolicyMap::MapEntryEquals(const PolicyMap::PolicyMapType::value_type& a,
const PolicyMap::PolicyMapType::value_type& b) {
- return a.first == b.first && Value::Equals(a.second, b.second);
+ return a.first == b.first && a.second.Equals(b.second);
}
} // namespace policy
« no previous file with comments | « chrome/browser/policy/policy_map.h ('k') | chrome/browser/policy/policy_map_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698