policy_map.h revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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
3// found in the LICENSE file.
4
5#ifndef COMPONENTS_POLICY_CORE_COMMON_POLICY_MAP_H_
6#define COMPONENTS_POLICY_CORE_COMMON_POLICY_MAP_H_
7
8#include <map>
9#include <set>
10#include <string>
11
12#include "base/memory/scoped_ptr.h"
13#include "base/values.h"
14#include "components/policy/core/common/external_data_fetcher.h"
15#include "components/policy/core/common/policy_types.h"
16#include "components/policy/policy_export.h"
17
18namespace policy {
19
20// A mapping of policy names to policy values for a given policy namespace.
21class POLICY_EXPORT PolicyMap {
22 public:
23  // Each policy maps to an Entry which keeps the policy value as well as other
24  // relevant data about the policy.
25  struct POLICY_EXPORT Entry {
26    PolicyLevel level;
27    PolicyScope scope;
28    base::Value* value;
29    ExternalDataFetcher* external_data_fetcher;
30
31    Entry();
32
33    // Deletes all members owned by |this|.
34    void DeleteOwnedMembers();
35
36    // Returns a copy of |this|.
37    scoped_ptr<Entry> DeepCopy() const;
38
39    // Returns true if |this| has higher priority than |other|.
40    bool has_higher_priority_than(const Entry& other) const;
41
42    // Returns true if |this| equals |other|.
43    bool Equals(const Entry& other) const;
44  };
45
46  typedef std::map<std::string, Entry> PolicyMapType;
47  typedef PolicyMapType::const_iterator const_iterator;
48
49  PolicyMap();
50  virtual ~PolicyMap();
51
52  // Returns a weak reference to the entry currently stored for key |policy|,
53  // or NULL if not found. Ownership is retained by the PolicyMap.
54  const Entry* Get(const std::string& policy) const;
55
56  // Returns a weak reference to the value currently stored for key |policy|,
57  // or NULL if not found. Ownership is retained by the PolicyMap.
58  // This is equivalent to Get(policy)->value, when it doesn't return NULL.
59  const base::Value* GetValue(const std::string& policy) const;
60
61  // Takes ownership of |value| and |external_data_fetcher|. Overwrites any
62  // existing information stored in the map for the key |policy|.
63  void Set(const std::string& policy,
64           PolicyLevel level,
65           PolicyScope scope,
66           base::Value* value,
67           ExternalDataFetcher* external_data_fetcher);
68
69  // Erase the given |policy|, if it exists in this map.
70  void Erase(const std::string& policy);
71
72  // Swaps the internal representation of |this| with |other|.
73  void Swap(PolicyMap* other);
74
75  // |this| becomes a copy of |other|. Any existing policies are dropped.
76  void CopyFrom(const PolicyMap& other);
77
78  // Returns a copy of |this|.
79  scoped_ptr<PolicyMap> DeepCopy() const;
80
81  // Merges policies from |other| into |this|. Existing policies are only
82  // overridden by those in |other| if they have a higher priority, as defined
83  // by Entry::has_higher_priority_than(). If a policy is contained in both
84  // maps with the same priority, the current value in |this| is preserved.
85  void MergeFrom(const PolicyMap& other);
86
87  // Loads the values in |policies| into this PolicyMap. All policies loaded
88  // will have |level| and |scope| in their entries. Existing entries are
89  // replaced.
90  void LoadFrom(const base::DictionaryValue* policies,
91                PolicyLevel level,
92                PolicyScope scope);
93
94  // Compares this value map against |other| and stores all key names that have
95  // different values or reference different external data in |differing_keys|.
96  // This includes keys that are present only in one of the maps.
97  // |differing_keys| is not cleared before the keys are added.
98  void GetDifferingKeys(const PolicyMap& other,
99                        std::set<std::string>* differing_keys) const;
100
101  // Removes all policies that don't have the specified |level|. This is a
102  // temporary helper method, until mandatory and recommended levels are served
103  // by a single provider.
104  // TODO(joaodasilva): Remove this. http://crbug.com/108999
105  void FilterLevel(PolicyLevel level);
106
107  bool Equals(const PolicyMap& other) const;
108  bool empty() const;
109  size_t size() const;
110
111  const_iterator begin() const;
112  const_iterator end() const;
113  void Clear();
114
115 private:
116  // Helper function for Equals().
117  static bool MapEntryEquals(const PolicyMapType::value_type& a,
118                             const PolicyMapType::value_type& b);
119
120  PolicyMapType map_;
121
122  DISALLOW_COPY_AND_ASSIGN(PolicyMap);
123};
124
125}  // namespace policy
126
127#endif  // COMPONENTS_POLICY_CORE_COMMON_POLICY_MAP_H_
128