Build the Clang plugin on Windows.
[chromium-blink-merge.git] / components / invalidation / invalidator_storage.cc
blob13ba4b1bf90def24a91c82bba9f7386ea4cd6648
1 // Copyright 2014 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.
5 #include "components/invalidation/invalidator_storage.h"
7 #include <string>
8 #include <utility>
10 #include "base/base64.h"
11 #include "base/basictypes.h"
12 #include "base/logging.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/prefs/pref_registry_simple.h"
15 #include "base/prefs/pref_service.h"
16 #include "base/values.h"
17 #include "components/invalidation/invalidation_prefs.h"
18 #include "components/invalidation/unacked_invalidation_set.h"
19 #include "components/pref_registry/pref_registry_syncable.h"
20 #include "google/cacheinvalidation/types.pb.h"
22 namespace {
24 const char kInvalidatorMaxInvalidationVersions[] =
25 "invalidator.max_invalidation_versions";
27 bool ValueToUnackedInvalidationStorageMap(
28 const base::ListValue& value,
29 syncer::UnackedInvalidationsMap* map) {
30 for (size_t i = 0; i != value.GetSize(); ++i) {
31 invalidation::ObjectId invalid_id;
32 syncer::UnackedInvalidationSet storage(invalid_id);
33 const base::DictionaryValue* dict;
34 if (!value.GetDictionary(i, &dict) || !storage.ResetFromValue(*dict)) {
35 DLOG(WARNING) << "Failed to parse ObjectState at position " << i;
36 return false;
38 map->insert(std::make_pair(storage.object_id(), storage));
40 return true;
43 scoped_ptr<base::ListValue> UnackedInvalidationStorageMapToValue(
44 const syncer::UnackedInvalidationsMap& map) {
45 scoped_ptr<base::ListValue> value(new base::ListValue);
46 for (syncer::UnackedInvalidationsMap::const_iterator it = map.begin();
47 it != map.end(); ++it) {
48 value->Append(it->second.ToValue().release());
50 return value.Pass();
53 } // namespace
55 namespace invalidation {
57 // static
58 void InvalidatorStorage::RegisterProfilePrefs(
59 user_prefs::PrefRegistrySyncable* registry) {
60 registry->RegisterListPref(prefs::kInvalidatorSavedInvalidations,
61 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
62 registry->RegisterStringPref(
63 prefs::kInvalidatorInvalidationState,
64 std::string(),
65 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
66 registry->RegisterStringPref(
67 prefs::kInvalidatorClientId,
68 std::string(),
69 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
71 // This pref is obsolete. We register it so we can clear it.
72 // At some point in the future, it will be safe to remove this.
73 registry->RegisterListPref(kInvalidatorMaxInvalidationVersions,
74 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
77 // static
78 void InvalidatorStorage::RegisterPrefs(PrefRegistrySimple* registry) {
79 registry->RegisterListPref(prefs::kInvalidatorSavedInvalidations);
80 registry->RegisterStringPref(prefs::kInvalidatorInvalidationState,
81 std::string());
82 registry->RegisterStringPref(prefs::kInvalidatorClientId, std::string());
85 InvalidatorStorage::InvalidatorStorage(PrefService* pref_service)
86 : pref_service_(pref_service) {
87 DCHECK(pref_service_);
88 if (pref_service_->FindPreference(kInvalidatorMaxInvalidationVersions))
89 pref_service_->ClearPref(kInvalidatorMaxInvalidationVersions);
92 InvalidatorStorage::~InvalidatorStorage() {
95 void InvalidatorStorage::ClearAndSetNewClientId(const std::string& client_id) {
96 DCHECK(thread_checker_.CalledOnValidThread());
97 Clear(); // We can't reuse our old invalidation state if the ID changes.
98 pref_service_->SetString(prefs::kInvalidatorClientId, client_id);
101 std::string InvalidatorStorage::GetInvalidatorClientId() const {
102 return pref_service_->GetString(prefs::kInvalidatorClientId);
105 void InvalidatorStorage::SetBootstrapData(const std::string& data) {
106 DCHECK(thread_checker_.CalledOnValidThread());
107 std::string base64_data;
108 base::Base64Encode(data, &base64_data);
109 pref_service_->SetString(prefs::kInvalidatorInvalidationState,
110 base64_data);
113 std::string InvalidatorStorage::GetBootstrapData() const {
114 std::string base64_data(
115 pref_service_->GetString(prefs::kInvalidatorInvalidationState));
116 std::string data;
117 base::Base64Decode(base64_data, &data);
118 return data;
121 void InvalidatorStorage::SetSavedInvalidations(
122 const syncer::UnackedInvalidationsMap& map) {
123 scoped_ptr<base::ListValue> value(UnackedInvalidationStorageMapToValue(map));
124 pref_service_->Set(prefs::kInvalidatorSavedInvalidations, *value.get());
127 syncer::UnackedInvalidationsMap
128 InvalidatorStorage::GetSavedInvalidations() const {
129 syncer::UnackedInvalidationsMap map;
130 const base::ListValue* value =
131 pref_service_->GetList(prefs::kInvalidatorSavedInvalidations);
132 if (!ValueToUnackedInvalidationStorageMap(*value, &map)) {
133 return syncer::UnackedInvalidationsMap();
134 } else {
135 return map;
139 void InvalidatorStorage::Clear() {
140 DCHECK(thread_checker_.CalledOnValidThread());
141 pref_service_->ClearPref(prefs::kInvalidatorSavedInvalidations);
142 pref_service_->ClearPref(prefs::kInvalidatorClientId);
143 pref_service_->ClearPref(prefs::kInvalidatorInvalidationState);
146 } // namespace invalidation