1// Copyright 2014 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#ifndef SYNC_ENGINE_GET_UPDATES_DELEGATE_H_
6#define SYNC_ENGINE_GET_UPDATES_DELEGATE_H_
7
8#include "sync/internal_api/public/events/protocol_event.h"
9#include "sync/protocol/sync.pb.h"
10#include "sync/sessions/model_type_registry.h"
11#include "sync/sessions/nudge_tracker.h"
12#include "sync/sessions/status_controller.h"
13
14namespace syncer {
15
16class GetUpdatesProcessor;
17
18// Interface for GetUpdates functionality that dependends on the requested
19// GetUpdate type (normal, configuration, poll).  The GetUpdatesProcessor is
20// given an appropriate GetUpdatesDelegate to handle type specific functionality
21// on construction.
22class SYNC_EXPORT_PRIVATE GetUpdatesDelegate {
23 public:
24  GetUpdatesDelegate();
25  virtual ~GetUpdatesDelegate() = 0;
26
27  // Populates GetUpdate message fields that depende on GetUpdates request type.
28  virtual void HelpPopulateGuMessage(
29      sync_pb::GetUpdatesMessage* get_updates) const = 0;
30
31  // Applies pending updates to non-control types.
32  virtual void ApplyUpdates(
33      ModelTypeSet gu_types,
34      sessions::StatusController* status,
35      UpdateHandlerMap* update_handler_map) const = 0;
36
37  virtual scoped_ptr<ProtocolEvent> GetNetworkRequestEvent(
38      base::Time timestamp,
39      const sync_pb::ClientToServerMessage& request) const = 0;
40};
41
42// Functionality specific to the normal GetUpdate request.
43class SYNC_EXPORT_PRIVATE NormalGetUpdatesDelegate : public GetUpdatesDelegate {
44 public:
45  NormalGetUpdatesDelegate(const sessions::NudgeTracker& nudge_tracker);
46  virtual ~NormalGetUpdatesDelegate();
47
48  // Uses the member NudgeTracker to populate some fields of this GU message.
49  virtual void HelpPopulateGuMessage(
50      sync_pb::GetUpdatesMessage* get_updates) const OVERRIDE;
51
52  // Applies pending updates on the appropriate data type threads.
53  virtual void ApplyUpdates(
54      ModelTypeSet gu_types,
55      sessions::StatusController* status,
56      UpdateHandlerMap* update_handler_map) const OVERRIDE;
57
58  virtual scoped_ptr<ProtocolEvent> GetNetworkRequestEvent(
59      base::Time timestamp,
60      const sync_pb::ClientToServerMessage& request) const OVERRIDE;
61 private:
62  DISALLOW_COPY_AND_ASSIGN(NormalGetUpdatesDelegate);
63
64  const sessions::NudgeTracker& nudge_tracker_;
65};
66
67// Functionality specific to the configure GetUpdate request.
68class SYNC_EXPORT_PRIVATE ConfigureGetUpdatesDelegate
69    : public GetUpdatesDelegate {
70 public:
71  ConfigureGetUpdatesDelegate(
72      sync_pb::GetUpdatesCallerInfo::GetUpdatesSource source);
73  virtual ~ConfigureGetUpdatesDelegate();
74
75  // Sets the 'source' and 'origin' fields for this request.
76  virtual void HelpPopulateGuMessage(
77      sync_pb::GetUpdatesMessage* get_updates) const OVERRIDE;
78
79  // Applies updates passively (ie. on the sync thread).
80  //
81  // This is safe only if the ChangeProcessor is not listening to changes at
82  // this time.
83  virtual void ApplyUpdates(
84      ModelTypeSet gu_types,
85      sessions::StatusController* status,
86      UpdateHandlerMap* update_handler_map) const OVERRIDE;
87
88  virtual scoped_ptr<ProtocolEvent> GetNetworkRequestEvent(
89      base::Time timestamp,
90      const sync_pb::ClientToServerMessage& request) const OVERRIDE;
91 private:
92  DISALLOW_COPY_AND_ASSIGN(ConfigureGetUpdatesDelegate);
93
94  static sync_pb::SyncEnums::GetUpdatesOrigin ConvertConfigureSourceToOrigin(
95      sync_pb::GetUpdatesCallerInfo::GetUpdatesSource source);
96
97  const sync_pb::GetUpdatesCallerInfo::GetUpdatesSource source_;
98};
99
100// Functionality specific to the poll GetUpdate request.
101class SYNC_EXPORT_PRIVATE PollGetUpdatesDelegate : public GetUpdatesDelegate {
102 public:
103  PollGetUpdatesDelegate();
104  virtual ~PollGetUpdatesDelegate();
105
106  // Sets the 'source' and 'origin' to indicate this is a poll request.
107  virtual void HelpPopulateGuMessage(
108      sync_pb::GetUpdatesMessage* get_updates) const OVERRIDE;
109
110  // Applies updates on the appropriate data type thread.
111  virtual void ApplyUpdates(
112      ModelTypeSet gu_types,
113      sessions::StatusController* status,
114      UpdateHandlerMap* update_handler_map) const OVERRIDE;
115
116  virtual scoped_ptr<ProtocolEvent> GetNetworkRequestEvent(
117      base::Time timestamp,
118      const sync_pb::ClientToServerMessage& request) const OVERRIDE;
119 private:
120  DISALLOW_COPY_AND_ASSIGN(PollGetUpdatesDelegate);
121};
122
123}  // namespace syncer
124
125#endif   // SYNC_ENGINE_GET_UPDATES_DELEGATE_H_
126