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