blob: 70c9c95f1c8ee5923ee2b51b11c49bd37e5c1593 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/invalidation/public/topic_invalidation_map.h"
#include <stddef.h>
#include "base/json/json_string_value_serializer.h"
#include "components/invalidation/public/object_id_invalidation_map.h"
namespace syncer {
TopicInvalidationMap::TopicInvalidationMap() {}
TopicInvalidationMap::TopicInvalidationMap(const TopicInvalidationMap& other) =
default;
TopicInvalidationMap::~TopicInvalidationMap() {}
TopicSet TopicInvalidationMap::GetTopics() const {
TopicSet ret;
for (const auto& topic_and_invalidation_set : map_)
ret.insert(topic_and_invalidation_set.first);
return ret;
}
bool TopicInvalidationMap::Empty() const {
return map_.empty();
}
void TopicInvalidationMap::Insert(const Invalidation& invalidation) {
map_[invalidation.object_id().name()].Insert(invalidation);
}
TopicInvalidationMap TopicInvalidationMap::GetSubsetWithTopics(
const Topics& topics) const {
TopicToListMap new_map;
for (const auto& topic : topics) {
auto lookup = map_.find(topic.first);
if (lookup != map_.end()) {
new_map[topic.first] = lookup->second;
}
}
return TopicInvalidationMap(new_map);
}
const SingleObjectInvalidationSet& TopicInvalidationMap::ForTopic(
Topic topic) const {
auto lookup = map_.find(topic);
DCHECK(lookup != map_.end());
DCHECK(!lookup->second.IsEmpty());
return lookup->second;
}
void TopicInvalidationMap::GetAllInvalidations(
std::vector<syncer::Invalidation>* out) const {
for (auto it = map_.begin(); it != map_.end(); ++it) {
out->insert(out->begin(), it->second.begin(), it->second.end());
}
}
void TopicInvalidationMap::AcknowledgeAll() const {
for (auto it1 = map_.begin(); it1 != map_.end(); ++it1) {
for (auto it2 = it1->second.begin(); it2 != it1->second.end(); ++it2) {
it2->Acknowledge();
}
}
}
bool TopicInvalidationMap::operator==(const TopicInvalidationMap& other) const {
return map_ == other.map_;
}
std::unique_ptr<base::ListValue> TopicInvalidationMap::ToValue() const {
std::unique_ptr<base::ListValue> value(new base::ListValue());
for (auto it1 = map_.begin(); it1 != map_.end(); ++it1) {
for (auto it2 = it1->second.begin(); it2 != it1->second.end(); ++it2) {
value->Append(it2->ToValue());
}
}
return value;
}
bool TopicInvalidationMap::ResetFromValue(const base::ListValue& value) {
map_.clear();
for (size_t i = 0; i < value.GetSize(); ++i) {
const base::DictionaryValue* dict;
if (!value.GetDictionary(i, &dict)) {
return false;
}
std::unique_ptr<Invalidation> invalidation =
Invalidation::InitFromValue(*dict);
if (!invalidation) {
return false;
}
Insert(*invalidation);
}
return true;
}
std::string TopicInvalidationMap::ToString() const {
std::string output;
JSONStringValueSerializer serializer(&output);
serializer.set_pretty_print(true);
serializer.Serialize(*ToValue());
return output;
}
TopicInvalidationMap::TopicInvalidationMap(const TopicToListMap& map)
: map_(map) {}
TopicInvalidationMap ConvertObjectIdInvalidationMapToTopicInvalidationMap(
ObjectIdInvalidationMap object_ids_map) {
TopicInvalidationMap topics_map;
std::vector<Invalidation> invalidations;
object_ids_map.GetAllInvalidations(&invalidations);
for (const auto& invalidation : invalidations) {
topics_map.Insert(invalidation);
}
return topics_map;
}
ObjectIdInvalidationMap ConvertTopicInvalidationMapToObjectIdInvalidationMap(
const TopicInvalidationMap& topics_map) {
ObjectIdInvalidationMap object_ids_map;
std::vector<Invalidation> invalidations;
topics_map.GetAllInvalidations(&invalidations);
for (const auto& invalidation : invalidations) {
object_ids_map.Insert(invalidation);
}
return object_ids_map;
}
} // namespace syncer