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