• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
18 namespace policy {
19 
20 // A mapping of policy names to policy values for a given policy namespace.
21 class 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