policy_map.h revision f2477e01787aa58f445919b809d89e252beef54f
1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 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) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#ifndef COMPONENTS_POLICY_CORE_COMMON_POLICY_MAP_H_ 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define COMPONENTS_POLICY_CORE_COMMON_POLICY_MAP_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/external_data_fetcher.h" 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/policy_types.h" 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/policy_export.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace policy { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A mapping of policy names to policy values for a given policy namespace. 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class POLICY_EXPORT PolicyMap { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Each policy maps to an Entry which keeps the policy value as well as other 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // relevant data about the policy. 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) struct POLICY_EXPORT Entry { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyLevel level; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyScope scope; 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::Value* value; 297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ExternalDataFetcher* external_data_fetcher; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Entry() 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : level(POLICY_LEVEL_RECOMMENDED), 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scope(POLICY_SCOPE_USER), 347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch value(NULL), 357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch external_data_fetcher(NULL) {} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if |this| has higher priority than |other|. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_higher_priority_than(const Entry& other) const; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if |this| equals |other|. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Equals(const Entry& other) const; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::map<std::string, Entry> PolicyMapType; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef PolicyMapType::const_iterator const_iterator; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyMap(); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~PolicyMap(); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a weak reference to the entry currently stored for key |policy|, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // or NULL if not found. Ownership is retained by the PolicyMap. 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Entry* Get(const std::string& policy) const; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a weak reference to the value currently stored for key |policy|, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // or NULL if not found. Ownership is retained by the PolicyMap. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is equivalent to Get(policy)->value, when it doesn't return NULL. 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::Value* GetValue(const std::string& policy) const; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Takes ownership of |value| and |external_data_fetcher|. Overwrites any 607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // existing information stored in the map for the key |policy|. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Set(const std::string& policy, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyLevel level, 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyScope scope, 647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Value* value, 657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ExternalDataFetcher* external_data_fetcher); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Erase the given |policy|, if it exists in this map. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Erase(const std::string& policy); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Swaps the internal representation of |this| with |other|. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Swap(PolicyMap* other); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |this| becomes a copy of |other|. Any existing policies are dropped. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CopyFrom(const PolicyMap& other); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns a copy of |this|. 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<PolicyMap> DeepCopy() const; 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Merges policies from |other| into |this|. Existing policies are only 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // overridden by those in |other| if they have a higher priority, as defined 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // by Entry::has_higher_priority_than(). If a policy is contained in both 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // maps with the same priority, the current value in |this| is preserved. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void MergeFrom(const PolicyMap& other); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Loads the values in |policies| into this PolicyMap. All policies loaded 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will have |level| and |scope| in their entries. Existing entries are 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // replaced. 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void LoadFrom(const base::DictionaryValue* policies, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyLevel level, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyScope scope); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Compares this value map against |other| and stores all key names that have 937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // different values or reference different external data in |differing_keys|. 947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // This includes keys that are present only in one of the maps. 957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // |differing_keys| is not cleared before the keys are added. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetDifferingKeys(const PolicyMap& other, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<std::string>* differing_keys) const; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removes all policies that don't have the specified |level|. This is a 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // temporary helper method, until mandatory and recommended levels are served 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // by a single provider. 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(joaodasilva): Remove this. http://crbug.com/108999 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void FilterLevel(PolicyLevel level); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Equals(const PolicyMap& other) const; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool empty() const; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t size() const; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_iterator begin() const; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const_iterator end() const; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Clear(); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper function for Equals(). 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool MapEntryEquals(const PolicyMapType::value_type& a, 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const PolicyMapType::value_type& b); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PolicyMapType map_; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(PolicyMap); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace policy 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif // COMPONENTS_POLICY_CORE_COMMON_POLICY_MAP_H_ 126