Roll leveldb to r76.
[chromium-blink-merge.git] / chrome_frame / metrics_service.h
blob821a53751817037dee48e51d842f123a88eac234
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.
5 // This file defines a service that collects information about the user
6 // experience in order to help improve future versions of the app.
8 #ifndef CHROME_FRAME_METRICS_SERVICE_H_
9 #define CHROME_FRAME_METRICS_SERVICE_H_
11 #include <map>
12 #include <string>
14 #include "base/basictypes.h"
15 #include "base/lazy_instance.h"
16 #include "base/memory/scoped_ptr.h"
17 #include "base/metrics/histogram.h"
18 #include "base/synchronization/lock.h"
19 #include "base/threading/platform_thread.h"
20 #include "base/threading/thread_local.h"
21 #include "chrome/common/metrics/metrics_service_base.h"
23 // TODO(ananta)
24 // Refactor more common code from chrome/browser/metrics/metrics_service.h into
25 // the MetricsServiceBase class.
26 class MetricsService : public MetricsServiceBase {
27 public:
28 static MetricsService* GetInstance();
29 // Start/stop the metrics recording and uploading machine. These should be
30 // used on startup and when the user clicks the checkbox in the prefs.
31 static void Start();
32 static void Stop();
33 // Set up client ID, session ID, etc.
34 void InitializeMetricsState();
36 // Retrieves a client ID to use to identify self to metrics server.
37 static const std::string& GetClientID();
39 private:
40 MetricsService();
41 virtual ~MetricsService();
42 // The MetricsService has a lifecycle that is stored as a state.
43 // See metrics_service.cc for description of this lifecycle.
44 enum State {
45 INITIALIZED, // Constructor was called.
46 ACTIVE, // Accumalating log data
47 STOPPED, // Service has stopped
50 // Sets and gets whether metrics recording is active.
51 // SetRecording(false) also forces a persistent save of logging state (if
52 // anything has been recorded, or transmitted).
53 void SetRecording(bool enabled);
55 // Enable/disable transmission of accumulated logs and crash reports (dumps).
56 // Return value "true" indicates setting was definitively set as requested).
57 // Return value of "false" indicates that the enable state is effectively
58 // stuck in the other logical setting.
59 // Google Update maintains the authoritative preference in the registry, so
60 // the caller *might* not be able to actually change the setting.
61 // It is always possible to set this to at least one value, which matches the
62 // current value reported by querying Google Update.
63 void SetReporting(bool enabled);
65 // If in_idle is true, sets idle_since_last_transmission to true.
66 // If in_idle is false and idle_since_last_transmission_ is true, sets
67 // idle_since_last_transmission to false and starts the timer (provided
68 // starting the timer is permitted).
69 void HandleIdleSinceLastTransmission(bool in_idle);
71 // ChromeFrame UMA data is uploaded when this timer proc gets invoked.
72 static void CALLBACK TransmissionTimerProc(HWND window, unsigned int message,
73 unsigned int event_id,
74 unsigned int time);
76 // Called to start recording user experience metrics.
77 // Constructs a new, empty current_log_.
78 void StartRecording();
80 // Called to stop recording user experience metrics.
81 void StopRecording(bool save_log);
83 // Takes whatever log should be uploaded next (according to the state_)
84 // and makes it the pending log. If pending_log_ is not NULL,
85 // MakePendingLog does nothing and returns.
86 void MakePendingLog();
88 // Determines from state_ and permissions set out by the server and by
89 // the user whether the pending_log_ should be sent or discarded. Called by
90 // TryToStartTransmission.
91 bool TransmissionPermitted() const;
93 bool recording_active() const {
94 return recording_active_;
97 bool reporting_active() const {
98 return reporting_active_;
101 // Upload pending data to the server by converting it to XML and compressing
102 // it. Returns true on success.
103 bool UploadData();
105 // Get the current version of the application as a string.
106 static std::string GetVersionString();
108 // Indicate whether recording and reporting are currently happening.
109 // These should not be set directly, but by calling SetRecording and
110 // SetReporting.
111 bool recording_active_;
112 bool reporting_active_;
114 // Coincides with the check box in options window that lets the user control
115 // whether to upload.
116 bool user_permits_upload_;
118 // The progession of states made by the browser are recorded in the following
119 // state.
120 State state_;
122 // The URL for the metrics server.
123 std::wstring server_url_;
125 // The identifier that's sent to the server with the log reports.
126 static std::string client_id_;
128 // A number that identifies the how many times the app has been launched.
129 int session_id_;
131 static base::LazyInstance<base::ThreadLocalPointer<MetricsService> >
132 g_metrics_instance_;
134 base::PlatformThreadId thread_;
136 // Indicates if this is the first uma upload from this instance.
137 bool initial_uma_upload_;
139 // The transmission timer id returned by SetTimer
140 int transmission_timer_id_;
142 // Used to serialize the Start and Stop operations on the metrics service.
143 static base::Lock metrics_service_lock_;
145 DISALLOW_COPY_AND_ASSIGN(MetricsService);
148 #endif // CHROME_FRAME_METRICS_SERVICE_H_