Index: components/gcm_driver/gcm_channel_status_syncer.h |
diff --git a/components/gcm_driver/gcm_channel_status_syncer.h b/components/gcm_driver/gcm_channel_status_syncer.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..83cfbda30cbf3b500d890420880ecbad81610e67 |
--- /dev/null |
+++ b/components/gcm_driver/gcm_channel_status_syncer.h |
@@ -0,0 +1,98 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef COMPONENTS_GCM_DRIVER_GCM_CHANNEL_STATUS_SYNCER_H_ |
+#define COMPONENTS_GCM_DRIVER_GCM_CHANNEL_STATUS_SYNCER_H_ |
+ |
+#include "base/compiler_specific.h" |
+#include "base/macros.h" |
+#include "base/memory/ref_counted.h" |
+#include "base/memory/scoped_ptr.h" |
+#include "base/memory/weak_ptr.h" |
+#include "base/time/time.h" |
+ |
+class PrefService; |
+class PrefRegistrySimple; |
+ |
+namespace net { |
+class URLRequestContextGetter; |
+} |
+ |
+namespace user_prefs { |
+class PrefRegistrySyncable; |
+} |
+ |
+namespace gcm { |
+ |
+class GCMChannelStatusRequest; |
+class GCMDriver; |
+ |
+// Syncing with the server for GCM channel status that controls if GCM |
+// functionality should be enabled or disabled. |
+class GCMChannelStatusSyncer { |
+ public: |
+ static void RegisterPrefs(PrefRegistrySimple* registry); |
+ static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); |
+ |
+ GCMChannelStatusSyncer( |
+ GCMDriver* driver, |
+ PrefService* prefs, |
+ const scoped_refptr<net::URLRequestContextGetter>& request_context); |
+ ~GCMChannelStatusSyncer(); |
+ |
+ void EnsureStarted(); |
+ void Stop(); |
+ |
+ bool gcm_enabled() const { return gcm_enabled_; } |
+ |
+ // For testing purpose. |
+ void set_delay_removed_for_testing(bool delay_removed) { |
+ delay_removed_for_testing_ = delay_removed; |
+ } |
+ base::TimeDelta current_request_delay_interval() const { |
+ return current_request_delay_interval_; |
+ } |
+ static int first_time_delay_seconds(); |
+ |
+ private: |
+ // Called when a request is completed. |
+ void OnRequestCompleted(bool enabled, int poll_interval_seconds); |
+ |
+ // Schedules next request to start after appropriate delay. |
+ void ScheduleRequest(); |
+ |
+ // Creates and starts a request immediately. |
+ void StartRequest(); |
+ |
+ // Computes and returns a delay with the fuzzing variation added if needed, |
+ // after which the request could start. |
+ base::TimeDelta GetRequestDelayInterval() const; |
+ |
+ // GCMDriver owns GCMChannelStatusSyncer instance. |
+ GCMDriver* driver_; |
+ PrefService* prefs_; |
+ |
+ scoped_refptr<net::URLRequestContextGetter> request_context_; |
+ scoped_ptr<GCMChannelStatusRequest> request_; |
+ |
+ bool gcm_enabled_; |
+ int poll_interval_seconds_; |
+ base::Time last_check_time_; |
+ |
+ // The flag that indicates if the delay, including fuzzing variation and poll |
+ // interval, is removed for testing purpose. |
+ bool delay_removed_for_testing_; |
+ |
+ // Tracked for testing purpose. |
+ base::TimeDelta current_request_delay_interval_; |
+ |
+ // Used to pass a weak pointer to a task. |
+ base::WeakPtrFactory<GCMChannelStatusSyncer> weak_ptr_factory_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(GCMChannelStatusSyncer); |
+}; |
+ |
+} // namespace gcm |
+ |
+#endif // COMPONENTS_GCM_DRIVER_GCM_CHANNEL_STATUS_SYNCER_H_ |