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.
5 #ifndef COMPONENTS_GCM_DRIVER_GCM_CHANNEL_STATUS_SYNCER_H_
6 #define COMPONENTS_GCM_DRIVER_GCM_CHANNEL_STATUS_SYNCER_H_
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"
16 class PrefRegistrySimple
;
19 class URLRequestContextGetter
;
22 namespace user_prefs
{
23 class PrefRegistrySyncable
;
28 class GCMChannelStatusRequest
;
31 // Syncing with the server for GCM channel status that controls if GCM
32 // functionality should be enabled or disabled.
33 class GCMChannelStatusSyncer
{
35 static void RegisterPrefs(PrefRegistrySimple
* registry
);
36 static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable
* registry
);
38 GCMChannelStatusSyncer(
41 const std::string
& channel_status_request_url
,
42 const std::string
& user_agent
,
43 const scoped_refptr
<net::URLRequestContextGetter
>& request_context
);
44 ~GCMChannelStatusSyncer();
49 bool gcm_enabled() const { return gcm_enabled_
; }
51 // For testing purpose.
52 void set_delay_removed_for_testing(bool delay_removed
) {
53 delay_removed_for_testing_
= delay_removed
;
55 base::TimeDelta
current_request_delay_interval() const {
56 return current_request_delay_interval_
;
58 static int first_time_delay_seconds();
61 // Called when a request is completed.
62 void OnRequestCompleted(bool update_received
,
64 int poll_interval_seconds
);
66 // Schedules next request to start after appropriate delay.
67 void ScheduleRequest();
69 // Creates and starts a request immediately.
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;
76 // GCMDriver owns GCMChannelStatusSyncer instance.
79 const std::string channel_status_request_url_
;
80 const std::string user_agent_
;
82 scoped_refptr
<net::URLRequestContextGetter
> request_context_
;
83 scoped_ptr
<GCMChannelStatusRequest
> request_
;
87 int poll_interval_seconds_
;
88 base::Time last_check_time_
;
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_
;
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_
;
100 // Tracked for testing purpose.
101 base::TimeDelta current_request_delay_interval_
;
103 // Used to pass a weak pointer to a task.
104 base::WeakPtrFactory
<GCMChannelStatusSyncer
> weak_ptr_factory_
;
106 DISALLOW_COPY_AND_ASSIGN(GCMChannelStatusSyncer
);
111 #endif // COMPONENTS_GCM_DRIVER_GCM_CHANNEL_STATUS_SYNCER_H_