OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 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 "components/sync/driver/sync_prefs.h" | |
6 | |
7 #include "base/base64.h" | |
8 #include "base/logging.h" | |
9 #include "base/strings/string_number_conversions.h" | |
10 #include "base/values.h" | |
11 #include "components/pref_registry/pref_registry_syncable.h" | |
12 #include "components/prefs/pref_service.h" | |
13 #include "components/sync/driver/pref_names.h" | |
14 | |
15 namespace syncer { | |
16 | |
17 SyncPrefObserver::~SyncPrefObserver() {} | |
18 | |
19 SyncPrefs::SyncPrefs(PrefService* pref_service) : pref_service_(pref_service) { | |
20 DCHECK(pref_service); | |
21 RegisterPrefGroups(); | |
22 // Watch the preference that indicates sync is managed so we can take | |
23 // appropriate action. | |
24 pref_sync_managed_.Init( | |
25 prefs::kSyncManaged, pref_service_, | |
26 base::Bind(&SyncPrefs::OnSyncManagedPrefChanged, base::Unretained(this))); | |
27 } | |
28 | |
29 SyncPrefs::SyncPrefs() : pref_service_(NULL) {} | |
30 | |
31 SyncPrefs::~SyncPrefs() { | |
32 DCHECK(CalledOnValidThread()); | |
33 } | |
34 | |
35 // static | |
36 void SyncPrefs::RegisterProfilePrefs( | |
37 user_prefs::PrefRegistrySyncable* registry) { | |
38 registry->RegisterBooleanPref(prefs::kSyncFirstSetupComplete, false); | |
39 registry->RegisterBooleanPref(prefs::kSyncSuppressStart, false); | |
40 registry->RegisterInt64Pref(prefs::kSyncLastSyncedTime, 0); | |
41 registry->RegisterInt64Pref(prefs::kSyncLastPollTime, 0); | |
42 registry->RegisterInt64Pref(prefs::kSyncFirstSyncTime, 0); | |
43 | |
44 // All datatypes are on by default, but this gets set explicitly | |
45 // when you configure sync (when turning it on), in | |
46 // ProfileSyncService::OnUserChoseDatatypes. | |
47 registry->RegisterBooleanPref(prefs::kSyncKeepEverythingSynced, true); | |
48 | |
49 ModelTypeSet user_types = UserTypes(); | |
50 | |
51 // Include proxy types as well, as they can be individually selected, | |
52 // although they don't have sync representations. | |
53 user_types.PutAll(ProxyTypes()); | |
54 | |
55 // Treat bookmarks and device info specially. | |
56 RegisterDataTypePreferredPref(registry, BOOKMARKS, true); | |
57 RegisterDataTypePreferredPref(registry, DEVICE_INFO, true); | |
58 user_types.Remove(BOOKMARKS); | |
59 user_types.Remove(DEVICE_INFO); | |
60 | |
61 // All types are set to off by default, which forces a configuration to | |
62 // explicitly enable them. GetPreferredTypes() will ensure that any new | |
63 // implicit types are enabled when their pref group is, or via | |
64 // KeepEverythingSynced. | |
65 for (ModelTypeSet::Iterator it = user_types.First(); it.Good(); it.Inc()) { | |
66 RegisterDataTypePreferredPref(registry, it.Get(), false); | |
67 } | |
68 | |
69 registry->RegisterBooleanPref(prefs::kSyncManaged, false); | |
70 registry->RegisterStringPref(prefs::kSyncEncryptionBootstrapToken, | |
71 std::string()); | |
72 registry->RegisterStringPref(prefs::kSyncKeystoreEncryptionBootstrapToken, | |
73 std::string()); | |
74 #if defined(OS_CHROMEOS) | |
75 registry->RegisterStringPref(prefs::kSyncSpareBootstrapToken, ""); | |
76 #endif | |
77 | |
78 registry->RegisterBooleanPref(prefs::kSyncHasAuthError, false); | |
79 registry->RegisterStringPref(prefs::kSyncSessionsGUID, std::string()); | |
80 registry->RegisterBooleanPref(prefs::kSyncPassphrasePrompted, false); | |
81 registry->RegisterIntegerPref(prefs::kSyncMemoryPressureWarningCount, -1); | |
82 registry->RegisterBooleanPref(prefs::kSyncShutdownCleanly, false); | |
83 registry->RegisterDictionaryPref(prefs::kSyncInvalidationVersions); | |
84 registry->RegisterStringPref(prefs::kSyncLastRunVersion, std::string()); | |
85 registry->RegisterBooleanPref( | |
86 prefs::kSyncPassphraseEncryptionTransitionInProgress, false); | |
87 registry->RegisterStringPref(prefs::kSyncNigoriStateForPassphraseTransition, | |
88 std::string()); | |
89 } | |
90 | |
91 void SyncPrefs::AddSyncPrefObserver(SyncPrefObserver* sync_pref_observer) { | |
92 DCHECK(CalledOnValidThread()); | |
93 sync_pref_observers_.AddObserver(sync_pref_observer); | |
94 } | |
95 | |
96 void SyncPrefs::RemoveSyncPrefObserver(SyncPrefObserver* sync_pref_observer) { | |
97 DCHECK(CalledOnValidThread()); | |
98 sync_pref_observers_.RemoveObserver(sync_pref_observer); | |
99 } | |
100 | |
101 void SyncPrefs::ClearPreferences() { | |
102 DCHECK(CalledOnValidThread()); | |
103 pref_service_->ClearPref(prefs::kSyncLastSyncedTime); | |
104 pref_service_->ClearPref(prefs::kSyncLastPollTime); | |
105 pref_service_->ClearPref(prefs::kSyncFirstSetupComplete); | |
106 pref_service_->ClearPref(prefs::kSyncEncryptionBootstrapToken); | |
107 pref_service_->ClearPref(prefs::kSyncKeystoreEncryptionBootstrapToken); | |
108 pref_service_->ClearPref(prefs::kSyncPassphrasePrompted); | |
109 pref_service_->ClearPref(prefs::kSyncMemoryPressureWarningCount); | |
110 pref_service_->ClearPref(prefs::kSyncShutdownCleanly); | |
111 pref_service_->ClearPref(prefs::kSyncInvalidationVersions); | |
112 pref_service_->ClearPref(prefs::kSyncLastRunVersion); | |
113 pref_service_->ClearPref( | |
114 prefs::kSyncPassphraseEncryptionTransitionInProgress); | |
115 pref_service_->ClearPref(prefs::kSyncNigoriStateForPassphraseTransition); | |
116 | |
117 // TODO(nick): The current behavior does not clear | |
118 // e.g. prefs::kSyncBookmarks. Is that really what we want? | |
119 } | |
120 | |
121 bool SyncPrefs::IsFirstSetupComplete() const { | |
122 DCHECK(CalledOnValidThread()); | |
123 return pref_service_->GetBoolean(prefs::kSyncFirstSetupComplete); | |
124 } | |
125 | |
126 void SyncPrefs::SetFirstSetupComplete() { | |
127 DCHECK(CalledOnValidThread()); | |
128 pref_service_->SetBoolean(prefs::kSyncFirstSetupComplete, true); | |
129 } | |
130 | |
131 bool SyncPrefs::SyncHasAuthError() const { | |
132 DCHECK(CalledOnValidThread()); | |
133 return pref_service_->GetBoolean(prefs::kSyncHasAuthError); | |
134 } | |
135 | |
136 void SyncPrefs::SetSyncAuthError(bool error) { | |
137 DCHECK(CalledOnValidThread()); | |
138 pref_service_->SetBoolean(prefs::kSyncHasAuthError, error); | |
139 } | |
140 | |
141 bool SyncPrefs::IsSyncRequested() const { | |
142 DCHECK(CalledOnValidThread()); | |
143 // IsSyncRequested is the inverse of the old SuppressStart pref. | |
144 // Since renaming a pref value is hard, here we still use the old one. | |
145 return !pref_service_->GetBoolean(prefs::kSyncSuppressStart); | |
146 } | |
147 | |
148 void SyncPrefs::SetSyncRequested(bool is_requested) { | |
149 DCHECK(CalledOnValidThread()); | |
150 // See IsSyncRequested for why we use this pref and !is_requested. | |
151 pref_service_->SetBoolean(prefs::kSyncSuppressStart, !is_requested); | |
152 } | |
153 | |
154 base::Time SyncPrefs::GetLastSyncedTime() const { | |
155 DCHECK(CalledOnValidThread()); | |
156 return base::Time::FromInternalValue( | |
157 pref_service_->GetInt64(prefs::kSyncLastSyncedTime)); | |
158 } | |
159 | |
160 void SyncPrefs::SetLastSyncedTime(base::Time time) { | |
161 DCHECK(CalledOnValidThread()); | |
162 pref_service_->SetInt64(prefs::kSyncLastSyncedTime, time.ToInternalValue()); | |
163 } | |
164 | |
165 base::Time SyncPrefs::GetLastPollTime() const { | |
166 DCHECK(CalledOnValidThread()); | |
167 return base::Time::FromInternalValue( | |
168 pref_service_->GetInt64(prefs::kSyncLastSyncedTime)); | |
169 } | |
170 | |
171 void SyncPrefs::SetLastPollTime(base::Time time) { | |
172 DCHECK(CalledOnValidThread()); | |
173 pref_service_->SetInt64(prefs::kSyncLastPollTime, time.ToInternalValue()); | |
174 } | |
175 | |
176 bool SyncPrefs::HasKeepEverythingSynced() const { | |
177 DCHECK(CalledOnValidThread()); | |
178 return pref_service_->GetBoolean(prefs::kSyncKeepEverythingSynced); | |
179 } | |
180 | |
181 void SyncPrefs::SetKeepEverythingSynced(bool keep_everything_synced) { | |
182 DCHECK(CalledOnValidThread()); | |
183 pref_service_->SetBoolean(prefs::kSyncKeepEverythingSynced, | |
184 keep_everything_synced); | |
185 } | |
186 | |
187 ModelTypeSet SyncPrefs::GetPreferredDataTypes( | |
188 ModelTypeSet registered_types) const { | |
189 DCHECK(CalledOnValidThread()); | |
190 | |
191 if (pref_service_->GetBoolean(prefs::kSyncKeepEverythingSynced)) { | |
192 return registered_types; | |
193 } | |
194 | |
195 ModelTypeSet preferred_types; | |
196 for (ModelTypeSet::Iterator it = registered_types.First(); it.Good(); | |
197 it.Inc()) { | |
198 if (GetDataTypePreferred(it.Get())) { | |
199 preferred_types.Put(it.Get()); | |
200 } | |
201 } | |
202 return ResolvePrefGroups(registered_types, preferred_types); | |
203 } | |
204 | |
205 void SyncPrefs::SetPreferredDataTypes(ModelTypeSet registered_types, | |
206 ModelTypeSet preferred_types) { | |
207 DCHECK(CalledOnValidThread()); | |
208 preferred_types = ResolvePrefGroups(registered_types, preferred_types); | |
209 DCHECK(registered_types.HasAll(preferred_types)); | |
210 for (ModelTypeSet::Iterator i = registered_types.First(); i.Good(); i.Inc()) { | |
211 SetDataTypePreferred(i.Get(), preferred_types.Has(i.Get())); | |
212 } | |
213 } | |
214 | |
215 bool SyncPrefs::IsManaged() const { | |
216 DCHECK(CalledOnValidThread()); | |
217 return pref_service_->GetBoolean(prefs::kSyncManaged); | |
218 } | |
219 | |
220 std::string SyncPrefs::GetEncryptionBootstrapToken() const { | |
221 DCHECK(CalledOnValidThread()); | |
222 return pref_service_->GetString(prefs::kSyncEncryptionBootstrapToken); | |
223 } | |
224 | |
225 void SyncPrefs::SetEncryptionBootstrapToken(const std::string& token) { | |
226 DCHECK(CalledOnValidThread()); | |
227 pref_service_->SetString(prefs::kSyncEncryptionBootstrapToken, token); | |
228 } | |
229 | |
230 std::string SyncPrefs::GetKeystoreEncryptionBootstrapToken() const { | |
231 DCHECK(CalledOnValidThread()); | |
232 return pref_service_->GetString(prefs::kSyncKeystoreEncryptionBootstrapToken); | |
233 } | |
234 | |
235 void SyncPrefs::SetKeystoreEncryptionBootstrapToken(const std::string& token) { | |
236 DCHECK(CalledOnValidThread()); | |
237 pref_service_->SetString(prefs::kSyncKeystoreEncryptionBootstrapToken, token); | |
238 } | |
239 | |
240 std::string SyncPrefs::GetSyncSessionsGUID() const { | |
241 DCHECK(CalledOnValidThread()); | |
242 return pref_service_->GetString(prefs::kSyncSessionsGUID); | |
243 } | |
244 | |
245 void SyncPrefs::SetSyncSessionsGUID(const std::string& guid) { | |
246 DCHECK(CalledOnValidThread()); | |
247 pref_service_->SetString(prefs::kSyncSessionsGUID, guid); | |
248 } | |
249 | |
250 // static | |
251 const char* SyncPrefs::GetPrefNameForDataType(ModelType data_type) { | |
252 switch (data_type) { | |
253 case BOOKMARKS: | |
254 return prefs::kSyncBookmarks; | |
255 case PASSWORDS: | |
256 return prefs::kSyncPasswords; | |
257 case PREFERENCES: | |
258 return prefs::kSyncPreferences; | |
259 case AUTOFILL: | |
260 return prefs::kSyncAutofill; | |
261 case AUTOFILL_PROFILE: | |
262 return prefs::kSyncAutofillProfile; | |
263 case AUTOFILL_WALLET_DATA: | |
264 return prefs::kSyncAutofillWallet; | |
265 case AUTOFILL_WALLET_METADATA: | |
266 return prefs::kSyncAutofillWalletMetadata; | |
267 case THEMES: | |
268 return prefs::kSyncThemes; | |
269 case TYPED_URLS: | |
270 return prefs::kSyncTypedUrls; | |
271 case EXTENSION_SETTINGS: | |
272 return prefs::kSyncExtensionSettings; | |
273 case EXTENSIONS: | |
274 return prefs::kSyncExtensions; | |
275 case APP_LIST: | |
276 return prefs::kSyncAppList; | |
277 case APP_SETTINGS: | |
278 return prefs::kSyncAppSettings; | |
279 case APPS: | |
280 return prefs::kSyncApps; | |
281 case SEARCH_ENGINES: | |
282 return prefs::kSyncSearchEngines; | |
283 case SESSIONS: | |
284 return prefs::kSyncSessions; | |
285 case APP_NOTIFICATIONS: | |
286 return prefs::kSyncAppNotifications; | |
287 case HISTORY_DELETE_DIRECTIVES: | |
288 return prefs::kSyncHistoryDeleteDirectives; | |
289 case SYNCED_NOTIFICATIONS: | |
290 return prefs::kSyncSyncedNotifications; | |
291 case SYNCED_NOTIFICATION_APP_INFO: | |
292 return prefs::kSyncSyncedNotificationAppInfo; | |
293 case DICTIONARY: | |
294 return prefs::kSyncDictionary; | |
295 case FAVICON_IMAGES: | |
296 return prefs::kSyncFaviconImages; | |
297 case FAVICON_TRACKING: | |
298 return prefs::kSyncFaviconTracking; | |
299 case SUPERVISED_USER_SETTINGS: | |
300 return prefs::kSyncSupervisedUserSettings; | |
301 case PROXY_TABS: | |
302 return prefs::kSyncTabs; | |
303 case PRIORITY_PREFERENCES: | |
304 return prefs::kSyncPriorityPreferences; | |
305 case SUPERVISED_USERS: | |
306 return prefs::kSyncSupervisedUsers; | |
307 case ARTICLES: | |
308 return prefs::kSyncArticles; | |
309 case SUPERVISED_USER_SHARED_SETTINGS: | |
310 return prefs::kSyncSupervisedUserSharedSettings; | |
311 case SUPERVISED_USER_WHITELISTS: | |
312 return prefs::kSyncSupervisedUserWhitelists; | |
313 case DEVICE_INFO: | |
314 return prefs::kSyncDeviceInfo; | |
315 case WIFI_CREDENTIALS: | |
316 return prefs::kSyncWifiCredentials; | |
317 case ARC_PACKAGE: | |
318 return prefs::kSyncArcPackage; | |
319 case PRINTERS: | |
320 return prefs::kSyncPrinters; | |
321 case READING_LIST: | |
322 return prefs::kSyncReadingList; | |
323 default: | |
324 break; | |
325 } | |
326 NOTREACHED() << "Type is " << data_type; | |
327 return NULL; | |
328 } | |
329 | |
330 #if defined(OS_CHROMEOS) | |
331 std::string SyncPrefs::GetSpareBootstrapToken() const { | |
332 DCHECK(CalledOnValidThread()); | |
333 return pref_service_->GetString(prefs::kSyncSpareBootstrapToken); | |
334 } | |
335 | |
336 void SyncPrefs::SetSpareBootstrapToken(const std::string& token) { | |
337 DCHECK(CalledOnValidThread()); | |
338 pref_service_->SetString(prefs::kSyncSpareBootstrapToken, token); | |
339 } | |
340 #endif | |
341 | |
342 void SyncPrefs::OnSyncManagedPrefChanged() { | |
343 DCHECK(CalledOnValidThread()); | |
344 FOR_EACH_OBSERVER(SyncPrefObserver, sync_pref_observers_, | |
345 OnSyncManagedPrefChange(*pref_sync_managed_)); | |
346 } | |
347 | |
348 void SyncPrefs::SetManagedForTest(bool is_managed) { | |
349 DCHECK(CalledOnValidThread()); | |
350 pref_service_->SetBoolean(prefs::kSyncManaged, is_managed); | |
351 } | |
352 | |
353 void SyncPrefs::RegisterPrefGroups() { | |
354 pref_groups_[APPS].Put(APP_NOTIFICATIONS); | |
355 pref_groups_[APPS].Put(APP_SETTINGS); | |
356 pref_groups_[APPS].Put(APP_LIST); | |
357 pref_groups_[APPS].Put(ARC_PACKAGE); | |
358 pref_groups_[APPS].Put(READING_LIST); | |
359 | |
360 pref_groups_[AUTOFILL].Put(AUTOFILL_PROFILE); | |
361 pref_groups_[AUTOFILL].Put(AUTOFILL_WALLET_DATA); | |
362 pref_groups_[AUTOFILL].Put(AUTOFILL_WALLET_METADATA); | |
363 | |
364 pref_groups_[EXTENSIONS].Put(EXTENSION_SETTINGS); | |
365 | |
366 pref_groups_[PREFERENCES].Put(DICTIONARY); | |
367 pref_groups_[PREFERENCES].Put(PRIORITY_PREFERENCES); | |
368 pref_groups_[PREFERENCES].Put(SEARCH_ENGINES); | |
369 | |
370 pref_groups_[TYPED_URLS].Put(HISTORY_DELETE_DIRECTIVES); | |
371 pref_groups_[TYPED_URLS].Put(SESSIONS); | |
372 pref_groups_[TYPED_URLS].Put(FAVICON_IMAGES); | |
373 pref_groups_[TYPED_URLS].Put(FAVICON_TRACKING); | |
374 | |
375 pref_groups_[PROXY_TABS].Put(SESSIONS); | |
376 pref_groups_[PROXY_TABS].Put(FAVICON_IMAGES); | |
377 pref_groups_[PROXY_TABS].Put(FAVICON_TRACKING); | |
378 | |
379 // TODO(zea): put favicons in the bookmarks group as well once it handles | |
380 // those favicons. | |
381 } | |
382 | |
383 // static | |
384 void SyncPrefs::RegisterDataTypePreferredPref( | |
385 user_prefs::PrefRegistrySyncable* registry, | |
386 ModelType type, | |
387 bool is_preferred) { | |
388 const char* pref_name = GetPrefNameForDataType(type); | |
389 if (!pref_name) { | |
390 NOTREACHED(); | |
391 return; | |
392 } | |
393 registry->RegisterBooleanPref(pref_name, is_preferred); | |
394 } | |
395 | |
396 bool SyncPrefs::GetDataTypePreferred(ModelType type) const { | |
397 DCHECK(CalledOnValidThread()); | |
398 const char* pref_name = GetPrefNameForDataType(type); | |
399 if (!pref_name) { | |
400 NOTREACHED(); | |
401 return false; | |
402 } | |
403 | |
404 // Device info is always enabled. | |
405 if (pref_name == prefs::kSyncDeviceInfo) | |
406 return true; | |
407 | |
408 if (type == PROXY_TABS && | |
409 pref_service_->GetUserPrefValue(pref_name) == NULL && | |
410 pref_service_->IsUserModifiablePreference(pref_name)) { | |
411 // If there is no tab sync preference yet (i.e. newly enabled type), | |
412 // default to the session sync preference value. | |
413 pref_name = GetPrefNameForDataType(SESSIONS); | |
414 } | |
415 | |
416 return pref_service_->GetBoolean(pref_name); | |
417 } | |
418 | |
419 void SyncPrefs::SetDataTypePreferred(ModelType type, bool is_preferred) { | |
420 DCHECK(CalledOnValidThread()); | |
421 const char* pref_name = GetPrefNameForDataType(type); | |
422 if (!pref_name) { | |
423 NOTREACHED(); | |
424 return; | |
425 } | |
426 | |
427 // Device info is always preferred. | |
428 if (type == DEVICE_INFO) | |
429 return; | |
430 | |
431 pref_service_->SetBoolean(pref_name, is_preferred); | |
432 } | |
433 | |
434 ModelTypeSet SyncPrefs::ResolvePrefGroups(ModelTypeSet registered_types, | |
435 ModelTypeSet types) const { | |
436 ModelTypeSet types_with_groups = types; | |
437 for (PrefGroupsMap::const_iterator i = pref_groups_.begin(); | |
438 i != pref_groups_.end(); ++i) { | |
439 if (types.Has(i->first)) | |
440 types_with_groups.PutAll(i->second); | |
441 } | |
442 types_with_groups.RetainAll(registered_types); | |
443 return types_with_groups; | |
444 } | |
445 | |
446 base::Time SyncPrefs::GetFirstSyncTime() const { | |
447 return base::Time::FromInternalValue( | |
448 pref_service_->GetInt64(prefs::kSyncFirstSyncTime)); | |
449 } | |
450 | |
451 void SyncPrefs::SetFirstSyncTime(base::Time time) { | |
452 pref_service_->SetInt64(prefs::kSyncFirstSyncTime, time.ToInternalValue()); | |
453 } | |
454 | |
455 void SyncPrefs::ClearFirstSyncTime() { | |
456 pref_service_->ClearPref(prefs::kSyncFirstSyncTime); | |
457 } | |
458 | |
459 bool SyncPrefs::IsPassphrasePrompted() const { | |
460 return pref_service_->GetBoolean(prefs::kSyncPassphrasePrompted); | |
461 } | |
462 | |
463 void SyncPrefs::SetPassphrasePrompted(bool value) { | |
464 pref_service_->SetBoolean(prefs::kSyncPassphrasePrompted, value); | |
465 } | |
466 | |
467 int SyncPrefs::GetMemoryPressureWarningCount() const { | |
468 return pref_service_->GetInteger(prefs::kSyncMemoryPressureWarningCount); | |
469 } | |
470 | |
471 void SyncPrefs::SetMemoryPressureWarningCount(int value) { | |
472 pref_service_->SetInteger(prefs::kSyncMemoryPressureWarningCount, value); | |
473 } | |
474 | |
475 bool SyncPrefs::DidSyncShutdownCleanly() const { | |
476 return pref_service_->GetBoolean(prefs::kSyncShutdownCleanly); | |
477 } | |
478 | |
479 void SyncPrefs::SetCleanShutdown(bool value) { | |
480 pref_service_->SetBoolean(prefs::kSyncShutdownCleanly, value); | |
481 } | |
482 | |
483 void SyncPrefs::GetInvalidationVersions( | |
484 std::map<ModelType, int64_t>* invalidation_versions) const { | |
485 const base::DictionaryValue* invalidation_dictionary = | |
486 pref_service_->GetDictionary(prefs::kSyncInvalidationVersions); | |
487 ModelTypeSet protocol_types = ProtocolTypes(); | |
488 for (auto iter = protocol_types.First(); iter.Good(); iter.Inc()) { | |
489 std::string key = ModelTypeToString(iter.Get()); | |
490 std::string version_str; | |
491 if (!invalidation_dictionary->GetString(key, &version_str)) | |
492 continue; | |
493 int64_t version = 0; | |
494 if (!base::StringToInt64(version_str, &version)) | |
495 continue; | |
496 (*invalidation_versions)[iter.Get()] = version; | |
497 } | |
498 } | |
499 | |
500 void SyncPrefs::UpdateInvalidationVersions( | |
501 const std::map<ModelType, int64_t>& invalidation_versions) { | |
502 std::unique_ptr<base::DictionaryValue> invalidation_dictionary( | |
503 new base::DictionaryValue()); | |
504 for (const auto& map_iter : invalidation_versions) { | |
505 std::string version_str = base::Int64ToString(map_iter.second); | |
506 invalidation_dictionary->SetString(ModelTypeToString(map_iter.first), | |
507 version_str); | |
508 } | |
509 pref_service_->Set(prefs::kSyncInvalidationVersions, | |
510 *invalidation_dictionary); | |
511 } | |
512 | |
513 std::string SyncPrefs::GetLastRunVersion() const { | |
514 return pref_service_->GetString(prefs::kSyncLastRunVersion); | |
515 } | |
516 | |
517 void SyncPrefs::SetLastRunVersion(const std::string& current_version) { | |
518 pref_service_->SetString(prefs::kSyncLastRunVersion, current_version); | |
519 } | |
520 | |
521 void SyncPrefs::SetPassphraseEncryptionTransitionInProgress(bool value) { | |
522 pref_service_->SetBoolean( | |
523 prefs::kSyncPassphraseEncryptionTransitionInProgress, value); | |
524 } | |
525 | |
526 bool SyncPrefs::GetPassphraseEncryptionTransitionInProgress() const { | |
527 return pref_service_->GetBoolean( | |
528 prefs::kSyncPassphraseEncryptionTransitionInProgress); | |
529 } | |
530 | |
531 void SyncPrefs::SetSavedNigoriStateForPassphraseEncryptionTransition( | |
532 const SyncEncryptionHandler::NigoriState& nigori_state) { | |
533 std::string encoded; | |
534 base::Base64Encode(nigori_state.nigori_specifics.SerializeAsString(), | |
535 &encoded); | |
536 pref_service_->SetString(prefs::kSyncNigoriStateForPassphraseTransition, | |
537 encoded); | |
538 } | |
539 | |
540 std::unique_ptr<SyncEncryptionHandler::NigoriState> | |
541 SyncPrefs::GetSavedNigoriStateForPassphraseEncryptionTransition() const { | |
542 const std::string encoded = | |
543 pref_service_->GetString(prefs::kSyncNigoriStateForPassphraseTransition); | |
544 std::string decoded; | |
545 if (!base::Base64Decode(encoded, &decoded)) | |
546 return std::unique_ptr<SyncEncryptionHandler::NigoriState>(); | |
547 | |
548 std::unique_ptr<SyncEncryptionHandler::NigoriState> result( | |
549 new SyncEncryptionHandler::NigoriState()); | |
550 if (!result->nigori_specifics.ParseFromString(decoded)) | |
551 return std::unique_ptr<SyncEncryptionHandler::NigoriState>(); | |
552 return result; | |
553 } | |
554 | |
555 } // namespace syncer | |
OLD | NEW |