OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/pref_value_store.h" | 5 #include "chrome/browser/pref_value_store.h" |
| 6 #include "chrome/common/notification_service.h" |
6 | 7 |
7 PrefValueStore::PrefValueStore(PrefStore* managed_prefs, | 8 PrefValueStore::PrefValueStore(PrefStore* managed_prefs, |
8 PrefStore* extension_prefs, | 9 PrefStore* extension_prefs, |
9 PrefStore* command_line_prefs, | 10 PrefStore* command_line_prefs, |
10 PrefStore* user_prefs, | 11 PrefStore* user_prefs, |
11 PrefStore* recommended_prefs) { | 12 PrefStore* recommended_prefs) { |
12 pref_stores_[MANAGED].reset(managed_prefs); | 13 pref_stores_[MANAGED].reset(managed_prefs); |
13 pref_stores_[EXTENSION].reset(extension_prefs); | 14 pref_stores_[EXTENSION].reset(extension_prefs); |
14 pref_stores_[COMMAND_LINE].reset(command_line_prefs); | 15 pref_stores_[COMMAND_LINE].reset(command_line_prefs); |
15 pref_stores_[USER].reset(user_prefs); | 16 pref_stores_[USER].reset(user_prefs); |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 bool PrefValueStore::PrefValueFromUserStore(const wchar_t* name) { | 107 bool PrefValueStore::PrefValueFromUserStore(const wchar_t* name) { |
107 return ControllingPrefStoreForPref(name) == USER; | 108 return ControllingPrefStoreForPref(name) == USER; |
108 } | 109 } |
109 | 110 |
110 bool PrefValueStore::PrefValueUserModifiable(const wchar_t* name) { | 111 bool PrefValueStore::PrefValueUserModifiable(const wchar_t* name) { |
111 PrefStoreType effective_store = ControllingPrefStoreForPref(name); | 112 PrefStoreType effective_store = ControllingPrefStoreForPref(name); |
112 return effective_store >= USER || effective_store == INVALID; | 113 return effective_store >= USER || effective_store == INVALID; |
113 } | 114 } |
114 | 115 |
115 bool PrefValueStore::PrefValueInStore(const wchar_t* name, PrefStoreType type) { | 116 bool PrefValueStore::PrefValueInStore(const wchar_t* name, PrefStoreType type) { |
116 if (pref_stores_[type].get() == NULL) { | 117 if (!pref_stores_[type].get()) { |
117 // No store of that type set, so this pref can't be in it. | 118 // No store of that type set, so this pref can't be in it. |
118 return false; | 119 return false; |
119 } | 120 } |
120 Value* tmp_value; | 121 Value* tmp_value; |
121 return pref_stores_[type]->prefs()->Get(name, &tmp_value); | 122 return pref_stores_[type]->prefs()->Get(name, &tmp_value); |
122 } | 123 } |
123 | 124 |
124 PrefValueStore::PrefStoreType PrefValueStore::ControllingPrefStoreForPref( | 125 PrefValueStore::PrefStoreType PrefValueStore::ControllingPrefStoreForPref( |
125 const wchar_t* name) { | 126 const wchar_t* name) { |
126 for (int i = 0; i <= PREF_STORE_TYPE_MAX; ++i) { | 127 for (int i = 0; i <= PREF_STORE_TYPE_MAX; ++i) { |
127 if (PrefValueInStore(name, static_cast<PrefStoreType>(i))) | 128 if (PrefValueInStore(name, static_cast<PrefStoreType>(i))) |
128 return static_cast<PrefStoreType>(i); | 129 return static_cast<PrefStoreType>(i); |
129 } | 130 } |
130 return INVALID; | 131 return INVALID; |
131 } | 132 } |
| 133 |
| 134 void PrefValueStore::RefreshPolicyPrefsCompletion( |
| 135 PrefStore* new_managed_pref_store, |
| 136 PrefStore* new_recommended_pref_store, |
| 137 AfterRefreshCallback callback) { |
| 138 |
| 139 DictionaryValue* managed_prefs_before(pref_stores_[MANAGED]->prefs()); |
| 140 DictionaryValue* managed_prefs_after(new_managed_pref_store->prefs()); |
| 141 DictionaryValue* recommended_prefs_before(pref_stores_[RECOMMENDED]->prefs()); |
| 142 DictionaryValue* recommended_prefs_after(new_recommended_pref_store->prefs()); |
| 143 |
| 144 std::vector<std::string> changed_managed_paths; |
| 145 managed_prefs_before->GetDifferingPaths(managed_prefs_after, |
| 146 &changed_managed_paths); |
| 147 |
| 148 std::vector<std::string> changed_recommended_paths; |
| 149 recommended_prefs_before->GetDifferingPaths(recommended_prefs_after, |
| 150 &changed_recommended_paths); |
| 151 |
| 152 std::vector<std::string> changed_paths(changed_managed_paths.size() + |
| 153 changed_recommended_paths.size()); |
| 154 std::vector<std::string>::iterator last_insert = |
| 155 std::merge(changed_managed_paths.begin(), |
| 156 changed_managed_paths.end(), |
| 157 changed_recommended_paths.begin(), |
| 158 changed_recommended_paths.end(), |
| 159 changed_paths.begin()); |
| 160 changed_paths.resize(last_insert - changed_paths.begin()); |
| 161 |
| 162 pref_stores_[MANAGED].reset(new_managed_pref_store); |
| 163 pref_stores_[RECOMMENDED].reset(new_recommended_pref_store); |
| 164 callback->Run(changed_paths); |
| 165 } |
| 166 |
| 167 void PrefValueStore::RefreshPolicyPrefsOnFileThread( |
| 168 ChromeThread::ID calling_thread_id, |
| 169 PrefStore* new_managed_pref_store, |
| 170 PrefStore* new_recommended_pref_store, |
| 171 AfterRefreshCallback callback) { |
| 172 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE)); |
| 173 scoped_ptr<PrefStore> managed_pref_store(new_managed_pref_store); |
| 174 scoped_ptr<PrefStore> recommended_pref_store(new_recommended_pref_store); |
| 175 |
| 176 PrefStore::PrefReadError read_error = new_managed_pref_store->ReadPrefs(); |
| 177 if (read_error != PrefStore::PREF_READ_ERROR_NONE) { |
| 178 LOG(ERROR) << "refresh of managed policy failed: PrefReadError = " |
| 179 << read_error; |
| 180 return; |
| 181 } |
| 182 |
| 183 read_error = new_recommended_pref_store->ReadPrefs(); |
| 184 if (read_error != PrefStore::PREF_READ_ERROR_NONE) { |
| 185 LOG(ERROR) << "refresh of recommended policy failed: PrefReadError = " |
| 186 << read_error; |
| 187 return; |
| 188 } |
| 189 |
| 190 ChromeThread::PostTask( |
| 191 calling_thread_id, FROM_HERE, |
| 192 NewRunnableMethod(this, |
| 193 &PrefValueStore::RefreshPolicyPrefsCompletion, |
| 194 managed_pref_store.release(), |
| 195 recommended_pref_store.release(), |
| 196 callback)); |
| 197 } |
| 198 |
| 199 void PrefValueStore::RefreshPolicyPrefs( |
| 200 PrefStore* new_managed_pref_store, |
| 201 PrefStore* new_recommended_pref_store, |
| 202 AfterRefreshCallback callback) { |
| 203 ChromeThread::ID current_thread_id; |
| 204 CHECK(ChromeThread::GetCurrentThreadIdentifier(¤t_thread_id)); |
| 205 ChromeThread::PostTask( |
| 206 ChromeThread::FILE, FROM_HERE, |
| 207 NewRunnableMethod(this, |
| 208 &PrefValueStore::RefreshPolicyPrefsOnFileThread, |
| 209 current_thread_id, |
| 210 new_managed_pref_store, |
| 211 new_recommended_pref_store, |
| 212 callback)); |
| 213 } |
OLD | NEW |