• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 COMPONENTS_GCM_DRIVER_GCM_CHANNEL_STATUS_SYNCER_H_
6 #define COMPONENTS_GCM_DRIVER_GCM_CHANNEL_STATUS_SYNCER_H_
7 
8 #include "base/compiler_specific.h"
9 #include "base/macros.h"
10 #include "base/memory/ref_counted.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "base/memory/weak_ptr.h"
13 #include "base/time/time.h"
14 
15 class PrefService;
16 class PrefRegistrySimple;
17 
18 namespace net {
19 class URLRequestContextGetter;
20 }
21 
22 namespace user_prefs {
23 class PrefRegistrySyncable;
24 }
25 
26 namespace gcm {
27 
28 class GCMChannelStatusRequest;
29 class GCMDriver;
30 
31 // Syncing with the server for GCM channel status that controls if GCM
32 // functionality should be enabled or disabled.
33 class GCMChannelStatusSyncer {
34  public:
35   static void RegisterPrefs(PrefRegistrySimple* registry);
36   static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
37 
38   GCMChannelStatusSyncer(
39       GCMDriver* driver,
40       PrefService* prefs,
41       const std::string& channel_status_request_url,
42       const std::string& user_agent,
43       const scoped_refptr<net::URLRequestContextGetter>& request_context);
44   ~GCMChannelStatusSyncer();
45 
46   void EnsureStarted();
47   void Stop();
48 
gcm_enabled()49   bool gcm_enabled() const { return gcm_enabled_; }
50 
51   // For testing purpose.
set_delay_removed_for_testing(bool delay_removed)52   void set_delay_removed_for_testing(bool delay_removed) {
53     delay_removed_for_testing_ = delay_removed;
54   }
current_request_delay_interval()55   base::TimeDelta current_request_delay_interval() const {
56     return current_request_delay_interval_;
57   }
58   static int first_time_delay_seconds();
59 
60  private:
61   // Called when a request is completed.
62   void OnRequestCompleted(bool update_received,
63                           bool enabled,
64                           int poll_interval_seconds);
65 
66   // Schedules next request to start after appropriate delay.
67   void ScheduleRequest();
68 
69   // Creates and starts a request immediately.
70   void StartRequest();
71 
72   // Computes and returns a delay with the fuzzing variation added if needed,
73   // after which the request could start.
74   base::TimeDelta GetRequestDelayInterval() const;
75 
76   // GCMDriver owns GCMChannelStatusSyncer instance.
77   GCMDriver* driver_;
78   PrefService* prefs_;
79   const std::string channel_status_request_url_;
80   const std::string user_agent_;
81 
82   scoped_refptr<net::URLRequestContextGetter> request_context_;
83   scoped_ptr<GCMChannelStatusRequest> request_;
84 
85   bool started_;
86   bool gcm_enabled_;
87   int poll_interval_seconds_;
88   base::Time last_check_time_;
89 
90   // If non-zero, |poll_interval_seconds_| is overriden by the command line
91   // options for testing purpose. Each time when the custom poll interval is
92   // used, this count is subtracted by one. When it reaches zero, the default
93   // poll interval will be used instead.
94   int custom_poll_interval_use_count_;
95 
96   // The flag that indicates if the delay, including fuzzing variation and poll
97   // interval, is removed for testing purpose.
98   bool delay_removed_for_testing_;
99 
100   // Tracked for testing purpose.
101   base::TimeDelta current_request_delay_interval_;
102 
103   // Used to pass a weak pointer to a task.
104   base::WeakPtrFactory<GCMChannelStatusSyncer> weak_ptr_factory_;
105 
106   DISALLOW_COPY_AND_ASSIGN(GCMChannelStatusSyncer);
107 };
108 
109 }  // namespace gcm
110 
111 #endif  // COMPONENTS_GCM_DRIVER_GCM_CHANNEL_STATUS_SYNCER_H_
112