| Index: sync/notifier/object_id_invalidation_map.cc
|
| diff --git a/sync/notifier/object_id_invalidation_map.cc b/sync/notifier/object_id_invalidation_map.cc
|
| index bde2e4c2457e1b325e8569b1395c5a77e78da1c6..2f7e104aa023282a17f7f2a6d536d851593f7d3e 100644
|
| --- a/sync/notifier/object_id_invalidation_map.cc
|
| +++ b/sync/notifier/object_id_invalidation_map.cc
|
| @@ -1,93 +1,110 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| +// Copyright 2013 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 "sync/notifier/object_id_invalidation_map.h"
|
|
|
| -#include <algorithm>
|
| -
|
| -#include "base/compiler_specific.h"
|
| -#include "base/values.h"
|
| +#include "base/json/json_string_value_serializer.h"
|
|
|
| namespace syncer {
|
|
|
| -ObjectIdSet ObjectIdInvalidationMapToSet(
|
| - const ObjectIdInvalidationMap& invalidation_map) {
|
| - ObjectIdSet ids;
|
| - for (ObjectIdInvalidationMap::const_iterator it = invalidation_map.begin();
|
| - it != invalidation_map.end(); ++it) {
|
| - ids.insert(it->first);
|
| +// static
|
| +ObjectIdInvalidationMap ObjectIdInvalidationMap::InvalidateAll(
|
| + const ObjectIdSet& ids) {
|
| + ObjectIdInvalidationMap invalidate_all;
|
| + for (ObjectIdSet::const_iterator it = ids.begin(); it != ids.end(); ++it) {
|
| + invalidate_all.Insert(Invalidation::InitUnknownVersion(*it));
|
| + }
|
| + return invalidate_all;
|
| +}
|
| +
|
| +ObjectIdInvalidationMap::ObjectIdInvalidationMap() {}
|
| +
|
| +ObjectIdInvalidationMap::~ObjectIdInvalidationMap() {}
|
| +
|
| +ObjectIdSet ObjectIdInvalidationMap::GetObjectIds() const {
|
| + ObjectIdSet ret;
|
| + for (IdToListMap::const_iterator it = map_.begin(); it != map_.end(); ++it) {
|
| + ret.insert(it->first);
|
| }
|
| - return ids;
|
| + return ret;
|
| }
|
|
|
| -ObjectIdInvalidationMap ObjectIdSetToInvalidationMap(
|
| - const ObjectIdSet& ids, int64 version, const std::string& payload) {
|
| - ObjectIdInvalidationMap invalidation_map;
|
| +bool ObjectIdInvalidationMap::Empty() const {
|
| + return map_.empty();
|
| +}
|
| +
|
| +void ObjectIdInvalidationMap::Insert(const Invalidation& invalidation) {
|
| + map_[invalidation.GetObjectId()].Insert(invalidation);
|
| +}
|
| +
|
| +ObjectIdInvalidationMap ObjectIdInvalidationMap::WithObjects(
|
| + const ObjectIdSet& ids) const {
|
| + IdToListMap new_map;
|
| for (ObjectIdSet::const_iterator it = ids.begin(); it != ids.end(); ++it) {
|
| - // TODO(dcheng): Do we need to provide a way to set AckHandle?
|
| - invalidation_map[*it].version = version;
|
| - invalidation_map[*it].payload = payload;
|
| + IdToListMap::const_iterator lookup = map_.find(*it);
|
| + if (lookup != map_.end()) {
|
| + new_map[*it] = lookup->second;
|
| + }
|
| }
|
| - return invalidation_map;
|
| + return ObjectIdInvalidationMap(new_map);
|
| }
|
|
|
| -namespace {
|
| +const OrderedInvalidationList& ObjectIdInvalidationMap::ForObject(
|
| + invalidation::ObjectId id) const {
|
| + IdToListMap::const_iterator lookup = map_.find(id);
|
| + DCHECK(lookup != map_.end());
|
| + DCHECK(!lookup->second.IsEmpty());
|
| + return lookup->second;
|
| +}
|
|
|
| -struct ObjectIdInvalidationMapValueEquals {
|
| - bool operator()(const ObjectIdInvalidationMap::value_type& value1,
|
| - const ObjectIdInvalidationMap::value_type& value2) const {
|
| - return
|
| - (value1.first == value2.first) &&
|
| - value1.second.Equals(value2.second);
|
| +void ObjectIdInvalidationMap::GetAllInvalidations(
|
| + std::vector<syncer::Invalidation>* out) const {
|
| + for (IdToListMap::const_iterator it = map_.begin(); it != map_.end(); ++it) {
|
| + out->insert(out->begin(), it->second.begin(), it->second.end());
|
| }
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -bool ObjectIdInvalidationMapEquals(
|
| - const ObjectIdInvalidationMap& invalidation_map1,
|
| - const ObjectIdInvalidationMap& invalidation_map2) {
|
| - return
|
| - (invalidation_map1.size() == invalidation_map2.size()) &&
|
| - std::equal(invalidation_map1.begin(), invalidation_map1.end(),
|
| - invalidation_map2.begin(),
|
| - ObjectIdInvalidationMapValueEquals());
|
| }
|
|
|
| -scoped_ptr<base::ListValue> ObjectIdInvalidationMapToValue(
|
| - const ObjectIdInvalidationMap& invalidation_map) {
|
| +bool ObjectIdInvalidationMap::operator==(
|
| + const ObjectIdInvalidationMap& other) const {
|
| + return map_ == other.map_;
|
| +}
|
| +
|
| +scoped_ptr<base::ListValue> ObjectIdInvalidationMap::ToValue() const {
|
| scoped_ptr<base::ListValue> value(new base::ListValue());
|
| - for (ObjectIdInvalidationMap::const_iterator it = invalidation_map.begin();
|
| - it != invalidation_map.end(); ++it) {
|
| - base::DictionaryValue* entry = new base::DictionaryValue();
|
| - entry->Set("objectId", ObjectIdToValue(it->first).release());
|
| - entry->Set("state", it->second.ToValue().release());
|
| - value->Append(entry);
|
| + for (IdToListMap::const_iterator it1 = map_.begin();
|
| + it1 != map_.end(); ++it1) {
|
| + for (OrderedInvalidationList::const_iterator it2 = it1->second.begin();
|
| + it2 != it1->second.end(); ++it2) {
|
| + value->Append(it2->ToValue().release());
|
| + }
|
| }
|
| return value.Pass();
|
| }
|
|
|
| -bool ObjectIdInvalidationMapFromValue(const base::ListValue& value,
|
| - ObjectIdInvalidationMap* out) {
|
| - out->clear();
|
| - for (base::ListValue::const_iterator it = value.begin();
|
| - it != value.end(); ++it) {
|
| - const base::DictionaryValue* entry = NULL;
|
| - const base::DictionaryValue* id_value = NULL;
|
| - const base::DictionaryValue* invalidation_value = NULL;
|
| - invalidation::ObjectId id;
|
| +bool ObjectIdInvalidationMap::ResetFromValue(const base::ListValue& value) {
|
| + map_.clear();
|
| + for (size_t i = 0; i < value.GetSize(); ++i) {
|
| + const DictionaryValue* dict;
|
| Invalidation invalidation;
|
| - if (!(*it)->GetAsDictionary(&entry) ||
|
| - !entry->GetDictionary("objectId", &id_value) ||
|
| - !entry->GetDictionary("state", &invalidation_value) ||
|
| - !ObjectIdFromValue(*id_value, &id) ||
|
| - !invalidation.ResetFromValue(*invalidation_value)) {
|
| + if (!value.GetDictionary(i, &dict)
|
| + || !invalidation.ResetFromValue(*dict)) {
|
| return false;
|
| }
|
| - ignore_result(out->insert(std::make_pair(id, invalidation)));
|
| + Insert(invalidation);
|
| }
|
| return true;
|
| }
|
|
|
| +std::string ObjectIdInvalidationMap::ToString() const {
|
| + std::string output;
|
| + JSONStringValueSerializer serializer(&output);
|
| + serializer.set_pretty_print(true);
|
| + serializer.Serialize(*ToValue().get());
|
| + return output;
|
| +}
|
| +
|
| +ObjectIdInvalidationMap::ObjectIdInvalidationMap(const IdToListMap& map)
|
| + : map_(map) {}
|
| +
|
| } // namespace syncer
|
|
|