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 "sync/notifier/object_id_invalidation_map.h" 6 7 #include <algorithm> 8 9 #include "base/compiler_specific.h" 10 #include "base/values.h" 11 12 namespace syncer { 13 14 ObjectIdSet ObjectIdInvalidationMapToSet( 15 const ObjectIdInvalidationMap& invalidation_map) { 16 ObjectIdSet ids; 17 for (ObjectIdInvalidationMap::const_iterator it = invalidation_map.begin(); 18 it != invalidation_map.end(); ++it) { 19 ids.insert(it->first); 20 } 21 return ids; 22 } 23 24 ObjectIdInvalidationMap ObjectIdSetToInvalidationMap( 25 const ObjectIdSet& ids, int64 version, const std::string& payload) { 26 ObjectIdInvalidationMap invalidation_map; 27 for (ObjectIdSet::const_iterator it = ids.begin(); it != ids.end(); ++it) { 28 // TODO(dcheng): Do we need to provide a way to set AckHandle? 29 invalidation_map[*it].version = version; 30 invalidation_map[*it].payload = payload; 31 } 32 return invalidation_map; 33 } 34 35 namespace { 36 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 } 57 58 scoped_ptr<base::ListValue> ObjectIdInvalidationMapToValue( 59 const ObjectIdInvalidationMap& invalidation_map) { 60 scoped_ptr<base::ListValue> value(new base::ListValue()); 61 for (ObjectIdInvalidationMap::const_iterator it = invalidation_map.begin(); 62 it != invalidation_map.end(); ++it) { 63 base::DictionaryValue* entry = new base::DictionaryValue(); 64 entry->Set("objectId", ObjectIdToValue(it->first).release()); 65 entry->Set("state", it->second.ToValue().release()); 66 value->Append(entry); 67 } 68 return value.Pass(); 69 } 70 71 bool ObjectIdInvalidationMapFromValue(const base::ListValue& value, 72 ObjectIdInvalidationMap* out) { 73 out->clear(); 74 for (base::ListValue::const_iterator it = value.begin(); 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; 81 if (!(*it)->GetAsDictionary(&entry) || 82 !entry->GetDictionary("objectId", &id_value) || 83 !entry->GetDictionary("state", &invalidation_value) || 84 !ObjectIdFromValue(*id_value, &id) || 85 !invalidation.ResetFromValue(*invalidation_value)) { 86 return false; 87 } 88 ignore_result(out->insert(std::make_pair(id, invalidation))); 89 } 90 return true; 91 } 92 93 ModelTypeInvalidationMap ObjectIdInvalidationMapToModelTypeInvalidationMap( 94 const ObjectIdInvalidationMap& invalidation_map) { 95 ModelTypeInvalidationMap type_invalidation_map; 96 for (ObjectIdInvalidationMap::const_iterator it = invalidation_map.begin(); 97 it != invalidation_map.end(); ++it) { 98 ModelType model_type; 99 if (!ObjectIdToRealModelType(it->first, &model_type)) { 100 DLOG(WARNING) << "Invalid object ID: " 101 << ObjectIdToString(it->first); 102 continue; 103 } 104 type_invalidation_map[model_type] = it->second; 105 } 106 return type_invalidation_map; 107 } 108 109 ObjectIdInvalidationMap ModelTypeInvalidationMapToObjectIdInvalidationMap( 110 const ModelTypeInvalidationMap& invalidation_map) { 111 ObjectIdInvalidationMap id_invalidation_map; 112 for (ModelTypeInvalidationMap::const_iterator it = invalidation_map.begin(); 113 it != invalidation_map.end(); ++it) { 114 invalidation::ObjectId id; 115 if (!RealModelTypeToObjectId(it->first, &id)) { 116 DLOG(WARNING) << "Invalid model type " << it->first; 117 continue; 118 } 119 id_invalidation_map[id] = it->second; 120 } 121 return id_invalidation_map; 122 } 123 124 } // namespace syncer 125