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

Side by Side Diff: chrome/browser/policy/cloud_policy_provider_impl.cc

Issue 7147015: Move user cloud policy to BrowserProcess (was 6979011) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase + address comments Created 9 years, 6 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2011 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 #include "chrome/browser/policy/cloud_policy_provider_impl.h"
6
7 #include <set>
8
9 #include "base/values.h"
10 #include "chrome/browser/policy/configuration_policy_pref_store.h"
11 #include "chrome/browser/policy/policy_notifier.h"
Joao da Silva 2011/06/29 11:36:17 Nit: policy_notifier.h not needed.
gfeher 2011/06/29 12:53:07 Done.
12
13 namespace policy {
14
15 CloudPolicyProviderImpl::CloudPolicyProviderImpl(
16 const ConfigurationPolicyProvider::PolicyDefinitionList* policy_list,
17 CloudPolicyCacheBase::PolicyLevel level)
18 : CloudPolicyProvider(policy_list),
19 level_(level) {}
20
21 CloudPolicyProviderImpl::~CloudPolicyProviderImpl() {
22 for (ListType::iterator i = caches_.begin(); i != caches_.end(); ++i)
23 (*i)->RemoveObserver(this);
24
25 FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer,
26 observer_list_, OnProviderGoingAway());
27 }
28
29 bool CloudPolicyProviderImpl::Provide(
30 ConfigurationPolicyStoreInterface* store) {
31 ApplyPolicyMap(&combined_, store);
32 return true;
33 }
34
35 bool CloudPolicyProviderImpl::IsInitializationComplete() const {
36 for (ListType::const_iterator i = caches_.begin(); i != caches_.end(); ++i) {
37 if (!(*i)->IsReady()) {
38 return false;
39 }
40 }
41 return true;
42 }
43
44 void CloudPolicyProviderImpl::AddObserver(
45 ConfigurationPolicyProvider::Observer* observer) {
46 observer_list_.AddObserver(observer);
47 }
48
49 void CloudPolicyProviderImpl::RemoveObserver(
50 ConfigurationPolicyProvider::Observer* observer) {
51 observer_list_.RemoveObserver(observer);
52 }
53
54 void CloudPolicyProviderImpl::OnCacheUpdate(CloudPolicyCacheBase* cache) {
55 RecombineCachesAndMaybeTriggerUpdate();
56 }
57
58 void CloudPolicyProviderImpl::OnCacheGoingAway(CloudPolicyCacheBase* cache) {
59 cache->RemoveObserver(this);
60 for (ListType::iterator i = caches_.begin(); i != caches_.end(); ++i) {
61 if (*i == cache) {
62 caches_.erase(i);
63 break;
64 }
65 }
66
67 RecombineCachesAndMaybeTriggerUpdate();
68 }
69
70 void CloudPolicyProviderImpl::AppendCache(CloudPolicyCacheBase* cache) {
71 cache->AddObserver(this);
72 caches_.push_back(cache);
73 RecombineCachesAndMaybeTriggerUpdate();
74 }
75
76 void CloudPolicyProviderImpl::PrependCache(CloudPolicyCacheBase* cache) {
77 cache->AddObserver(this);
78 caches_.insert(caches_.begin(), cache);
79 RecombineCachesAndMaybeTriggerUpdate();
80 }
81
82 // static
83 void CloudPolicyProviderImpl::CombineTwoPolicyMaps(const PolicyMap& base,
84 const PolicyMap& overlay,
85 PolicyMap* out_map) {
86 bool added_proxy_policy = false;
87 out_map->Clear();
88
89 for (PolicyMap::const_iterator i = base.begin(); i != base.end(); ++i) {
90 out_map->Set(i->first, i->second->DeepCopy());
91 added_proxy_policy = added_proxy_policy ||
92 ConfigurationPolicyPrefStore::IsProxyPolicy(i->first);
93 }
94
95 // Add every entry of |overlay| which has not been added by |base|. Only add
96 // proxy policies if none of them was added by |base|.
97 for (PolicyMap::const_iterator i = overlay.begin(); i != overlay.end(); ++i) {
98 if (ConfigurationPolicyPrefStore::IsProxyPolicy(i->first)) {
99 if (!added_proxy_policy) {
100 out_map->Set(i->first, i->second->DeepCopy());
101 }
102 } else if (!out_map->Get(i->first)) {
103 out_map->Set(i->first, i->second->DeepCopy());
104 }
105 }
106 }
107
108 void CloudPolicyProviderImpl::RecombineCachesAndMaybeTriggerUpdate() {
109 PolicyMap newly_combined;
110 for (ListType::iterator i = caches_.begin(); i != caches_.end(); ++i) {
111 if (!(*i)->IsReady())
112 continue;
113 PolicyMap tmp_map;
114 CombineTwoPolicyMaps(newly_combined, *(*i)->policy(level_), &tmp_map);
115 newly_combined.Swap(&tmp_map);
116 }
117 if (newly_combined.Equals(combined_))
118 return;
119
120 // Trigger a notification if there was a change.
121 combined_.Swap(&newly_combined);
122 FOR_EACH_OBSERVER(ConfigurationPolicyProvider::Observer,
123 observer_list_, OnUpdatePolicy());
124 }
125
126 } // namespace policy
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698