Home | History | Annotate | Download | only in notifier
      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
      3 // found in the LICENSE file.
      4 
      5 #include "sync/notifier/object_id_invalidation_map.h"
      6 
      7 #include "base/json/json_string_value_serializer.h"
      8 
      9 namespace syncer {
     10 
     11 // static
     12 ObjectIdInvalidationMap ObjectIdInvalidationMap::InvalidateAll(
     13     const ObjectIdSet& ids) {
     14   ObjectIdInvalidationMap invalidate_all;
     15   for (ObjectIdSet::const_iterator it = ids.begin(); it != ids.end(); ++it) {
     16     invalidate_all.Insert(Invalidation::InitUnknownVersion(*it));
     17   }
     18   return invalidate_all;
     19 }
     20 
     21 ObjectIdInvalidationMap::ObjectIdInvalidationMap() {}
     22 
     23 ObjectIdInvalidationMap::~ObjectIdInvalidationMap() {}
     24 
     25 ObjectIdSet ObjectIdInvalidationMap::GetObjectIds() const {
     26   ObjectIdSet ret;
     27   for (IdToListMap::const_iterator it = map_.begin(); it != map_.end(); ++it) {
     28     ret.insert(it->first);
     29   }
     30   return ret;
     31 }
     32 
     33 bool ObjectIdInvalidationMap::Empty() const {
     34   return map_.empty();
     35 }
     36 
     37 void ObjectIdInvalidationMap::Insert(const Invalidation& invalidation) {
     38   map_[invalidation.object_id()].Insert(invalidation);
     39 }
     40 
     41 ObjectIdInvalidationMap ObjectIdInvalidationMap::GetSubsetWithObjectIds(
     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 SingleObjectInvalidationSet& 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 void ObjectIdInvalidationMap::AcknowledgeAll() const {
     68   for (IdToListMap::const_iterator it1 = map_.begin();
     69        it1 != map_.end(); ++it1) {
     70     for (SingleObjectInvalidationSet::const_iterator it2 = it1->second.begin();
     71          it2 != it1->second.end(); ++it2) {
     72       it2->Acknowledge();
     73     }
     74   }
     75 }
     76 
     77 bool ObjectIdInvalidationMap::operator==(
     78     const ObjectIdInvalidationMap& other) const {
     79   return map_ == other.map_;
     80 }
     81 
     82 scoped_ptr<base::ListValue> ObjectIdInvalidationMap::ToValue() const {
     83   scoped_ptr<base::ListValue> value(new base::ListValue());
     84   for (IdToListMap::const_iterator it1 = map_.begin();
     85        it1 != map_.end(); ++it1) {
     86     for (SingleObjectInvalidationSet::const_iterator it2 =
     87          it1->second.begin(); it2 != it1->second.end(); ++it2) {
     88       value->Append(it2->ToValue().release());
     89     }
     90   }
     91   return value.Pass();
     92 }
     93 
     94 bool ObjectIdInvalidationMap::ResetFromValue(const base::ListValue& value) {
     95   map_.clear();
     96   for (size_t i = 0; i < value.GetSize(); ++i) {
     97     const base::DictionaryValue* dict;
     98     if (!value.GetDictionary(i, &dict)) {
     99       return false;
    100     }
    101     scoped_ptr<Invalidation> invalidation = Invalidation::InitFromValue(*dict);
    102     if (!invalidation) {
    103       return false;
    104     }
    105     Insert(*invalidation.get());
    106   }
    107   return true;
    108 }
    109 
    110 std::string ObjectIdInvalidationMap::ToString() const {
    111   std::string output;
    112   JSONStringValueSerializer serializer(&output);
    113   serializer.set_pretty_print(true);
    114   serializer.Serialize(*ToValue().get());
    115   return output;
    116 }
    117 
    118 ObjectIdInvalidationMap::ObjectIdInvalidationMap(const IdToListMap& map)
    119   : map_(map) {}
    120 
    121 }  // namespace syncer
    122