• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2010 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 CHROME_BROWSER_SYNC_ENGINE_UPDATE_APPLICATOR_H_
12 #define CHROME_BROWSER_SYNC_ENGINE_UPDATE_APPLICATOR_H_
13 #pragma once
14 
15 #include <vector>
16 
17 #include "base/basictypes.h"
18 #include "base/port.h"
19 #include "chrome/browser/sync/engine/model_safe_worker.h"
20 #include "chrome/browser/sync/syncable/syncable.h"
21 
22 namespace browser_sync {
23 
24 namespace sessions {
25 class ConflictProgress;
26 class UpdateProgress;
27 }
28 
29 class ConflictResolver;
30 class Cryptographer;
31 
32 class UpdateApplicator {
33  public:
34   typedef syncable::Directory::UnappliedUpdateMetaHandles::iterator
35       UpdateIterator;
36 
37   UpdateApplicator(ConflictResolver* resolver,
38                    Cryptographer* cryptographer,
39                    const UpdateIterator& begin,
40                    const UpdateIterator& end,
41                    const ModelSafeRoutingInfo& routes,
42                    ModelSafeGroup group_filter);
43   ~UpdateApplicator();
44 
45   // returns true if there's more we can do.
46   bool AttemptOneApplication(syncable::WriteTransaction* trans);
47   // return true if we've applied all updates.
48   bool AllUpdatesApplied() const;
49 
50   // This class does not automatically save its progress into the
51   // SyncSession -- to get that to happen, call this method after update
52   // application is finished (i.e., when AttemptOneAllocation stops returning
53   // true).
54   void SaveProgressIntoSessionState(
55       sessions::ConflictProgress* conflict_progress,
56       sessions::UpdateProgress* update_progress);
57 
58  private:
59   // If true, AttemptOneApplication will skip over |entry| and return true.
60   bool SkipUpdate(const syncable::Entry& entry);
61 
62   // Adjusts the UpdateIterator members to move ahead by one update.
63   void Advance();
64 
65   // Used to resolve conflicts when trying to apply updates.
66   ConflictResolver* const resolver_;
67 
68   // Used to decrypt sensitive sync nodes.
69   Cryptographer* cryptographer_;
70 
71   UpdateIterator const begin_;
72   UpdateIterator end_;
73   UpdateIterator pointer_;
74   ModelSafeGroup group_filter_;
75   bool progress_;
76 
77   const ModelSafeRoutingInfo routing_info_;
78 
79   // Track the result of the various items.
80   std::vector<syncable::Id> conflicting_ids_;
81   std::vector<syncable::Id> successful_ids_;
82 
83   DISALLOW_COPY_AND_ASSIGN(UpdateApplicator);
84 };
85 
86 }  // namespace browser_sync
87 
88 #endif  // CHROME_BROWSER_SYNC_ENGINE_UPDATE_APPLICATOR_H_
89