1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file. 44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/invalidation/single_object_invalidation_set.h" 64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/values.h" 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/invalidation/invalidation_util.h" 94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace syncer { 114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SingleObjectInvalidationSet::SingleObjectInvalidationSet() {} 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SingleObjectInvalidationSet::~SingleObjectInvalidationSet() {} 154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void SingleObjectInvalidationSet::Insert(const Invalidation& invalidation) { 174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) invalidations_.insert(invalidation); 184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void SingleObjectInvalidationSet::InsertAll( 214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const SingleObjectInvalidationSet& other) { 224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) invalidations_.insert(other.begin(), other.end()); 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)void SingleObjectInvalidationSet::Clear() { 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) invalidations_.clear(); 274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SingleObjectInvalidationSet::Erase(const_iterator it) { 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) invalidations_.erase(*it); 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool SingleObjectInvalidationSet::StartsWithUnknownVersion() const { 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return !invalidations_.empty() && 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) invalidations_.begin()->is_unknown_version(); 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)size_t SingleObjectInvalidationSet::GetSize() const { 394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return invalidations_.size(); 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool SingleObjectInvalidationSet::IsEmpty() const { 434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return invalidations_.empty(); 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace { 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)struct InvalidationComparator { 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool operator()(const Invalidation& inv1, const Invalidation& inv2) { 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return inv1.Equals(inv2); 514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool SingleObjectInvalidationSet::operator==( 574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const SingleObjectInvalidationSet& other) const { 584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return std::equal(invalidations_.begin(), 594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) invalidations_.end(), 604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) other.invalidations_.begin(), 614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) InvalidationComparator()); 624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SingleObjectInvalidationSet::const_iterator 654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SingleObjectInvalidationSet::begin() const { 664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return invalidations_.begin(); 674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SingleObjectInvalidationSet::const_iterator 704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SingleObjectInvalidationSet::end() const { 714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return invalidations_.end(); 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SingleObjectInvalidationSet::const_reverse_iterator 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SingleObjectInvalidationSet::rbegin() const { 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return invalidations_.rbegin(); 774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SingleObjectInvalidationSet::const_reverse_iterator 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)SingleObjectInvalidationSet::rend() const { 814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return invalidations_.rend(); 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const Invalidation& SingleObjectInvalidationSet::back() const { 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return *invalidations_.rbegin(); 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)scoped_ptr<base::ListValue> SingleObjectInvalidationSet::ToValue() const { 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::ListValue> value(new base::ListValue); 904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) for (InvalidationsSet::const_iterator it = invalidations_.begin(); 914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) it != invalidations_.end(); ++it) { 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) value->Append(it->ToValue().release()); 934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return value.Pass(); 954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)bool SingleObjectInvalidationSet::ResetFromValue( 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const base::ListValue& list) { 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) for (size_t i = 0; i < list.GetSize(); ++i) { 1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const base::DictionaryValue* dict; 1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!list.GetDictionary(i, &dict)) { 1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DLOG(WARNING) << "Could not find invalidation at index " << i; 1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return false; 1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<Invalidation> invalidation = Invalidation::InitFromValue(*dict); 1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!invalidation) { 1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DLOG(WARNING) << "Failed to parse invalidation at index " << i; 1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return false; 1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) invalidations_.insert(*invalidation); 1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return true; 1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} 1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace syncer 116