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// An UpdateApplicator is used to iterate over a number of unapplied updates, 6// applying them to the client using the given syncer session. 7// 8// UpdateApplicator might resemble an iterator, but it actually keeps retrying 9// failed updates until no remaining updates can be successfully applied. 10 11#ifndef SYNC_ENGINE_UPDATE_APPLICATOR_H_ 12#define SYNC_ENGINE_UPDATE_APPLICATOR_H_ 13 14#include <vector> 15 16#include "base/basictypes.h" 17#include "base/port.h" 18#include "sync/internal_api/public/engine/model_safe_worker.h" 19#include "sync/syncable/syncable_id.h" 20#include "sync/sessions/status_controller.h" 21 22namespace syncer { 23 24namespace sessions { 25class StatusController; 26} 27 28namespace syncable { 29class WriteTransaction; 30class Entry; 31} 32 33class ConflictResolver; 34class Cryptographer; 35 36class UpdateApplicator { 37 public: 38 UpdateApplicator(Cryptographer* cryptographer, 39 const ModelSafeRoutingInfo& routes, 40 ModelSafeGroup group_filter); 41 ~UpdateApplicator(); 42 43 // Attempt to apply the specified updates. 44 void AttemptApplications(syncable::WriteTransaction* trans, 45 const std::vector<int64>& handles); 46 47 int updates_applied() { 48 return updates_applied_; 49 } 50 51 int encryption_conflicts() { 52 return encryption_conflicts_; 53 } 54 55 int hierarchy_conflicts() { 56 return hierarchy_conflicts_; 57 } 58 59 const std::set<syncable::Id>& simple_conflict_ids() { 60 return simple_conflict_ids_; 61 } 62 63 private: 64 // If true, AttemptOneApplication will skip over |entry| and return true. 65 bool SkipUpdate(const syncable::Entry& entry); 66 67 // Used to decrypt sensitive sync nodes. 68 Cryptographer* cryptographer_; 69 70 ModelSafeGroup group_filter_; 71 72 const ModelSafeRoutingInfo routing_info_; 73 74 DISALLOW_COPY_AND_ASSIGN(UpdateApplicator); 75 76 int updates_applied_; 77 int encryption_conflicts_; 78 int hierarchy_conflicts_; 79 std::set<syncable::Id> simple_conflict_ids_; 80}; 81 82} // namespace syncer 83 84#endif // SYNC_ENGINE_UPDATE_APPLICATOR_H_ 85