• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 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 // A class to schedule syncer tasks intelligently.
6 #ifndef SYNC_ENGINE_SYNC_SCHEDULER_H_
7 #define SYNC_ENGINE_SYNC_SCHEDULER_H_
8 
9 #include <string>
10 
11 #include "base/callback.h"
12 #include "base/compiler_specific.h"
13 #include "base/time/time.h"
14 #include "sync/base/sync_export.h"
15 #include "sync/engine/nudge_source.h"
16 #include "sync/internal_api/public/base/invalidation_interface.h"
17 #include "sync/sessions/sync_session.h"
18 
19 namespace tracked_objects {
20 class Location;
21 }  // namespace tracked_objects
22 
23 namespace syncer {
24 
25 struct ServerConnectionEvent;
26 
27 struct SYNC_EXPORT_PRIVATE ConfigurationParams {
28   ConfigurationParams();
29   ConfigurationParams(
30       const sync_pb::GetUpdatesCallerInfo::GetUpdatesSource& source,
31       ModelTypeSet types_to_download,
32       const ModelSafeRoutingInfo& routing_info,
33       const base::Closure& ready_task,
34       const base::Closure& retry_task);
35   ~ConfigurationParams();
36 
37   // Source for the configuration.
38   sync_pb::GetUpdatesCallerInfo::GetUpdatesSource source;
39   // The types that should be downloaded.
40   ModelTypeSet types_to_download;
41   // The new routing info (superset of types to be downloaded).
42   ModelSafeRoutingInfo routing_info;
43   // Callback to invoke on configuration completion.
44   base::Closure ready_task;
45   // Callback to invoke on configuration failure.
46   base::Closure retry_task;
47 };
48 
49 class SYNC_EXPORT_PRIVATE SyncScheduler
50     : public sessions::SyncSession::Delegate {
51  public:
52   enum Mode {
53     // In this mode, the thread only performs configuration tasks.  This is
54     // designed to make the case where we want to download updates for a
55     // specific type only, and not continue syncing until we are moved into
56     // normal mode.
57     CONFIGURATION_MODE,
58     // Resumes polling and allows nudges, drops configuration tasks.  Runs
59     // through entire sync cycle.
60     NORMAL_MODE,
61   };
62 
63   // All methods of SyncScheduler must be called on the same thread
64   // (except for RequestEarlyExit()).
65 
66   SyncScheduler();
67   virtual ~SyncScheduler();
68 
69   // Start the scheduler with the given mode.  If the scheduler is
70   // already started, switch to the given mode, although some
71   // scheduled tasks from the old mode may still run.
72   virtual void Start(Mode mode) = 0;
73 
74   // Schedules the configuration task specified by |params|. Returns true if
75   // the configuration task executed immediately, false if it had to be
76   // scheduled for a later attempt. |params.ready_task| is invoked whenever the
77   // configuration task executes. |params.retry_task| is invoked once if the
78   // configuration task could not execute. |params.ready_task| will still be
79   // called when configuration finishes.
80   // Note: must already be in CONFIGURATION mode.
81   virtual void ScheduleConfiguration(const ConfigurationParams& params) = 0;
82 
83   // Request that the syncer avoid starting any new tasks and prepare for
84   // shutdown.
85   virtual void Stop() = 0;
86 
87   // The meat and potatoes. All three of the following methods will post a
88   // delayed task to attempt the actual nudge (see ScheduleNudgeImpl).
89   //
90   // NOTE: |desired_delay| is best-effort. If a nudge is already scheduled to
91   // depart earlier than Now() + delay, the scheduler can and will prefer to
92   // batch the two so that only one nudge is sent (at the earlier time). Also,
93   // as always with delayed tasks and timers, it's possible the task gets run
94   // any time after |desired_delay|.
95 
96   // The LocalNudge indicates that we've made a local change, and that the
97   // syncer should plan to commit this to the server some time soon.
98   virtual void ScheduleLocalNudge(
99       ModelTypeSet types,
100       const tracked_objects::Location& nudge_location) = 0;
101 
102   // The LocalRefreshRequest occurs when we decide for some reason to manually
103   // request updates.  This should be used sparingly.  For example, one of its
104   // uses is to fetch the latest tab sync data when it's relevant to the UI on
105   // platforms where tab sync is not registered for invalidations.
106   virtual void ScheduleLocalRefreshRequest(
107       ModelTypeSet types,
108       const tracked_objects::Location& nudge_location) = 0;
109 
110   // Invalidations are notifications the server sends to let us know when other
111   // clients have committed data.  We need to contact the sync server (being
112   // careful to pass along the "hints" delivered with those invalidations) in
113   // order to fetch the update.
114   virtual void ScheduleInvalidationNudge(
115       syncer::ModelType type,
116       scoped_ptr<InvalidationInterface> invalidation,
117       const tracked_objects::Location& nudge_location) = 0;
118 
119   // Requests a non-blocking initial sync request for the specified type.
120   //
121   // Many types can only complete initial sync while the scheduler is in
122   // configure mode, but a few of them are able to perform their initial sync
123   // while the scheduler is in normal mode.  This non-blocking initial sync
124   // can be requested through this function.
125   virtual void ScheduleInitialSyncNudge(syncer::ModelType model_type) = 0;
126 
127   // Change status of notifications in the SyncSessionContext.
128   virtual void SetNotificationsEnabled(bool notifications_enabled) = 0;
129 
130   // Called when credentials are updated by the user.
131   virtual void OnCredentialsUpdated() = 0;
132 
133   // Called when the network layer detects a connection status change.
134   virtual void OnConnectionStatusChange() = 0;
135 };
136 
137 }  // namespace syncer
138 
139 #endif  // SYNC_ENGINE_SYNC_SCHEDULER_H_
140