OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "sync/notifier/object_id_invalidation_map.h" | 5 #include "sync/notifier/object_id_invalidation_map.h" |
6 | 6 |
7 #include <algorithm> | 7 #include "base/json/json_string_value_serializer.h" |
8 | |
9 #include "base/compiler_specific.h" | |
10 #include "base/values.h" | |
11 | 8 |
12 namespace syncer { | 9 namespace syncer { |
13 | 10 |
14 ObjectIdSet ObjectIdInvalidationMapToSet( | 11 // static |
15 const ObjectIdInvalidationMap& invalidation_map) { | 12 ObjectIdInvalidationMap ObjectIdInvalidationMap::InvalidateAll( |
16 ObjectIdSet ids; | 13 const ObjectIdSet& ids) { |
17 for (ObjectIdInvalidationMap::const_iterator it = invalidation_map.begin(); | 14 ObjectIdInvalidationMap invalidate_all; |
18 it != invalidation_map.end(); ++it) { | 15 for (ObjectIdSet::const_iterator it = ids.begin(); it != ids.end(); ++it) { |
19 ids.insert(it->first); | 16 invalidate_all.Insert(Invalidation::InitUnknownVersion(*it)); |
20 } | 17 } |
21 return ids; | 18 return invalidate_all; |
22 } | 19 } |
23 | 20 |
24 ObjectIdInvalidationMap ObjectIdSetToInvalidationMap( | 21 ObjectIdInvalidationMap::ObjectIdInvalidationMap() {} |
25 const ObjectIdSet& ids, int64 version, const std::string& payload) { | 22 |
26 ObjectIdInvalidationMap invalidation_map; | 23 ObjectIdInvalidationMap::~ObjectIdInvalidationMap() {} |
27 for (ObjectIdSet::const_iterator it = ids.begin(); it != ids.end(); ++it) { | 24 |
28 // TODO(dcheng): Do we need to provide a way to set AckHandle? | 25 ObjectIdSet ObjectIdInvalidationMap::GetObjectIds() const { |
29 invalidation_map[*it].version = version; | 26 ObjectIdSet ret; |
30 invalidation_map[*it].payload = payload; | 27 for (IdToListMap::const_iterator it = map_.begin(); it != map_.end(); ++it) { |
| 28 ret.insert(it->first); |
31 } | 29 } |
32 return invalidation_map; | 30 return ret; |
33 } | 31 } |
34 | 32 |
35 namespace { | 33 bool ObjectIdInvalidationMap::Empty() const { |
36 | 34 return map_.empty(); |
37 struct ObjectIdInvalidationMapValueEquals { | |
38 bool operator()(const ObjectIdInvalidationMap::value_type& value1, | |
39 const ObjectIdInvalidationMap::value_type& value2) const { | |
40 return | |
41 (value1.first == value2.first) && | |
42 value1.second.Equals(value2.second); | |
43 } | |
44 }; | |
45 | |
46 } // namespace | |
47 | |
48 bool ObjectIdInvalidationMapEquals( | |
49 const ObjectIdInvalidationMap& invalidation_map1, | |
50 const ObjectIdInvalidationMap& invalidation_map2) { | |
51 return | |
52 (invalidation_map1.size() == invalidation_map2.size()) && | |
53 std::equal(invalidation_map1.begin(), invalidation_map1.end(), | |
54 invalidation_map2.begin(), | |
55 ObjectIdInvalidationMapValueEquals()); | |
56 } | 35 } |
57 | 36 |
58 scoped_ptr<base::ListValue> ObjectIdInvalidationMapToValue( | 37 void ObjectIdInvalidationMap::Insert(const Invalidation& invalidation) { |
59 const ObjectIdInvalidationMap& invalidation_map) { | 38 map_[invalidation.GetObjectId()].Insert(invalidation); |
| 39 } |
| 40 |
| 41 ObjectIdInvalidationMap ObjectIdInvalidationMap::WithObjects( |
| 42 const ObjectIdSet& ids) const { |
| 43 IdToListMap new_map; |
| 44 for (ObjectIdSet::const_iterator it = ids.begin(); it != ids.end(); ++it) { |
| 45 IdToListMap::const_iterator lookup = map_.find(*it); |
| 46 if (lookup != map_.end()) { |
| 47 new_map[*it] = lookup->second; |
| 48 } |
| 49 } |
| 50 return ObjectIdInvalidationMap(new_map); |
| 51 } |
| 52 |
| 53 const OrderedInvalidationList& ObjectIdInvalidationMap::ForObject( |
| 54 invalidation::ObjectId id) const { |
| 55 IdToListMap::const_iterator lookup = map_.find(id); |
| 56 DCHECK(lookup != map_.end()); |
| 57 DCHECK(!lookup->second.IsEmpty()); |
| 58 return lookup->second; |
| 59 } |
| 60 |
| 61 void ObjectIdInvalidationMap::GetAllInvalidations( |
| 62 std::vector<syncer::Invalidation>* out) const { |
| 63 for (IdToListMap::const_iterator it = map_.begin(); it != map_.end(); ++it) { |
| 64 out->insert(out->begin(), it->second.begin(), it->second.end()); |
| 65 } |
| 66 } |
| 67 |
| 68 bool ObjectIdInvalidationMap::operator==( |
| 69 const ObjectIdInvalidationMap& other) const { |
| 70 return map_ == other.map_; |
| 71 } |
| 72 |
| 73 scoped_ptr<base::ListValue> ObjectIdInvalidationMap::ToValue() const { |
60 scoped_ptr<base::ListValue> value(new base::ListValue()); | 74 scoped_ptr<base::ListValue> value(new base::ListValue()); |
61 for (ObjectIdInvalidationMap::const_iterator it = invalidation_map.begin(); | 75 for (IdToListMap::const_iterator it1 = map_.begin(); |
62 it != invalidation_map.end(); ++it) { | 76 it1 != map_.end(); ++it1) { |
63 base::DictionaryValue* entry = new base::DictionaryValue(); | 77 for (OrderedInvalidationList::const_iterator it2 = it1->second.begin(); |
64 entry->Set("objectId", ObjectIdToValue(it->first).release()); | 78 it2 != it1->second.end(); ++it2) { |
65 entry->Set("state", it->second.ToValue().release()); | 79 value->Append(it2->ToValue().release()); |
66 value->Append(entry); | 80 } |
67 } | 81 } |
68 return value.Pass(); | 82 return value.Pass(); |
69 } | 83 } |
70 | 84 |
71 bool ObjectIdInvalidationMapFromValue(const base::ListValue& value, | 85 bool ObjectIdInvalidationMap::ResetFromValue(const base::ListValue& value) { |
72 ObjectIdInvalidationMap* out) { | 86 map_.clear(); |
73 out->clear(); | 87 for (size_t i = 0; i < value.GetSize(); ++i) { |
74 for (base::ListValue::const_iterator it = value.begin(); | 88 const DictionaryValue* dict; |
75 it != value.end(); ++it) { | |
76 const base::DictionaryValue* entry = NULL; | |
77 const base::DictionaryValue* id_value = NULL; | |
78 const base::DictionaryValue* invalidation_value = NULL; | |
79 invalidation::ObjectId id; | |
80 Invalidation invalidation; | 89 Invalidation invalidation; |
81 if (!(*it)->GetAsDictionary(&entry) || | 90 if (!value.GetDictionary(i, &dict) |
82 !entry->GetDictionary("objectId", &id_value) || | 91 || !invalidation.ResetFromValue(*dict)) { |
83 !entry->GetDictionary("state", &invalidation_value) || | |
84 !ObjectIdFromValue(*id_value, &id) || | |
85 !invalidation.ResetFromValue(*invalidation_value)) { | |
86 return false; | 92 return false; |
87 } | 93 } |
88 ignore_result(out->insert(std::make_pair(id, invalidation))); | 94 Insert(invalidation); |
89 } | 95 } |
90 return true; | 96 return true; |
91 } | 97 } |
92 | 98 |
| 99 std::string ObjectIdInvalidationMap::ToString() const { |
| 100 std::string output; |
| 101 JSONStringValueSerializer serializer(&output); |
| 102 serializer.set_pretty_print(true); |
| 103 serializer.Serialize(*ToValue().get()); |
| 104 return output; |
| 105 } |
| 106 |
| 107 ObjectIdInvalidationMap::ObjectIdInvalidationMap(const IdToListMap& map) |
| 108 : map_(map) {} |
| 109 |
93 } // namespace syncer | 110 } // namespace syncer |
OLD | NEW |