// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // An UpdateApplicator is used to iterate over a number of unapplied updates, // applying them to the client using the given syncer session. // // UpdateApplicator might resemble an iterator, but it actually keeps retrying // failed updates until no remaining updates can be successfully applied. #ifndef CHROME_BROWSER_SYNC_ENGINE_UPDATE_APPLICATOR_H_ #define CHROME_BROWSER_SYNC_ENGINE_UPDATE_APPLICATOR_H_ #pragma once #include <vector> #include "base/basictypes.h" #include "base/port.h" #include "chrome/browser/sync/engine/model_safe_worker.h" #include "chrome/browser/sync/syncable/syncable.h" namespace browser_sync { namespace sessions { class ConflictProgress; class UpdateProgress; } class ConflictResolver; class Cryptographer; class UpdateApplicator { public: typedef syncable::Directory::UnappliedUpdateMetaHandles::iterator UpdateIterator; UpdateApplicator(ConflictResolver* resolver, Cryptographer* cryptographer, const UpdateIterator& begin, const UpdateIterator& end, const ModelSafeRoutingInfo& routes, ModelSafeGroup group_filter); ~UpdateApplicator(); // returns true if there's more we can do. bool AttemptOneApplication(syncable::WriteTransaction* trans); // return true if we've applied all updates. bool AllUpdatesApplied() const; // This class does not automatically save its progress into the // SyncSession -- to get that to happen, call this method after update // application is finished (i.e., when AttemptOneAllocation stops returning // true). void SaveProgressIntoSessionState( sessions::ConflictProgress* conflict_progress, sessions::UpdateProgress* update_progress); private: // If true, AttemptOneApplication will skip over |entry| and return true. bool SkipUpdate(const syncable::Entry& entry); // Adjusts the UpdateIterator members to move ahead by one update. void Advance(); // Used to resolve conflicts when trying to apply updates. ConflictResolver* const resolver_; // Used to decrypt sensitive sync nodes. Cryptographer* cryptographer_; UpdateIterator const begin_; UpdateIterator end_; UpdateIterator pointer_; ModelSafeGroup group_filter_; bool progress_; const ModelSafeRoutingInfo routing_info_; // Track the result of the various items. std::vector<syncable::Id> conflicting_ids_; std::vector<syncable::Id> successful_ids_; DISALLOW_COPY_AND_ASSIGN(UpdateApplicator); }; } // namespace browser_sync #endif // CHROME_BROWSER_SYNC_ENGINE_UPDATE_APPLICATOR_H_