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