1 // Copyright (c) 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 #ifndef CHROME_BROWSER_METRICS_METRICS_REPORTING_SCHEDULER_H_ 6 #define CHROME_BROWSER_METRICS_METRICS_REPORTING_SCHEDULER_H_ 7 8 #include "base/basictypes.h" 9 #include "base/callback.h" 10 #include "base/memory/weak_ptr.h" 11 #include "base/time/time.h" 12 #include "base/timer/timer.h" 13 14 // Scheduler task to drive a MetricsService object's uploading. 15 class MetricsReportingScheduler { 16 public: 17 explicit MetricsReportingScheduler(const base::Closure& upload_callback); 18 ~MetricsReportingScheduler(); 19 20 // Starts scheduling uploads. This in a no-op if the scheduler is already 21 // running, so it is safe to call more than once. 22 void Start(); 23 24 // Stops scheduling uploads. 25 void Stop(); 26 27 // Callback from MetricsService when a triggered upload finishes. 28 void UploadFinished(bool server_is_healthy, bool more_logs_remaining); 29 30 // Callback from MetricsService when a triggered upload is cancelled by the 31 // MetricsService. 32 void UploadCancelled(); 33 34 private: 35 // Timer callback indicating it's time for the MetricsService to upload 36 // metrics. 37 void TriggerUpload(); 38 39 // Schedules a future call to TriggerUpload if one isn't already pending. 40 void ScheduleNextUpload(); 41 42 // Increases the upload interval each time it's called, to handle the case 43 // where the server is having issues. 44 void BackOffUploadInterval(); 45 46 // The MetricsService method to call when uploading should happen. 47 const base::Closure upload_callback_; 48 49 base::OneShotTimer<MetricsReportingScheduler> upload_timer_; 50 51 // The interval between being told an upload is done and starting the next 52 // upload. 53 base::TimeDelta upload_interval_; 54 55 // Indicates that the scheduler is running (i.e., that Start has been called 56 // more recently than Stop). 57 bool running_; 58 59 // Indicates that the last triggered upload hasn't resolved yet. 60 bool callback_pending_; 61 62 DISALLOW_COPY_AND_ASSIGN(MetricsReportingScheduler); 63 }; 64 65 #endif // CHROME_BROWSER_METRICS_METRICS_REPORTING_SCHEDULER_H_ 66