blob: 3ab857a9667662f92f1aecf5e3fa8f54134e44c3 [file] [log] [blame]
Darin Petkov65b01462010-04-14 13:32:20 -07001// Copyright (c) 2010 The Chromium OS 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 METRICS_DAEMON_H_
6#define METRICS_DAEMON_H_
7
Darin Petkov703ec972010-04-27 11:02:18 -07008#include <dbus/dbus.h>
Darin Petkov41e06232010-05-03 16:45:37 -07009#include <glib.h>
Darin Petkov65b01462010-04-14 13:32:20 -070010#include <time.h>
11
Darin Petkov2ccef012010-05-05 16:06:37 -070012#include <gtest/gtest_prod.h> // for FRIEND_TEST
13
Darin Petkov65b01462010-04-14 13:32:20 -070014class MetricsDaemon {
15
16 public:
17 MetricsDaemon()
Darin Petkov2ccef012010-05-05 16:06:37 -070018 : daily_use_record_file_(NULL),
19 network_state_(kUnknownNetworkState),
Darin Petkov41e06232010-05-03 16:45:37 -070020 network_state_last_(0),
21 power_state_(kUnknownPowerState),
22 screensaver_state_(kUnknownScreenSaverState),
23 session_state_(kUnknownSessionState),
24 user_active_(false),
25 user_active_last_(0),
26 daily_use_day_last_(0),
27 usemon_interval_(0),
28 usemon_source_(NULL) {}
Darin Petkov65b01462010-04-14 13:32:20 -070029 ~MetricsDaemon() {}
30
Darin Petkov703ec972010-04-27 11:02:18 -070031 // Does all the work. If |run_as_daemon| is true, daemonizes by
Darin Petkov2ccef012010-05-05 16:06:37 -070032 // forking.
33 void Run(bool run_as_daemon);
Darin Petkov65b01462010-04-14 13:32:20 -070034
35 private:
Darin Petkov2ccef012010-05-05 16:06:37 -070036 friend class MetricsDaemonTest;
37 FRIEND_TEST(MetricsDaemonTest, LogDailyUseRecord);
38 FRIEND_TEST(MetricsDaemonTest, LookupNetworkState);
39 FRIEND_TEST(MetricsDaemonTest, LookupPowerState);
40 FRIEND_TEST(MetricsDaemonTest, LookupScreenSaverState);
41 FRIEND_TEST(MetricsDaemonTest, LookupSessionState);
Darin Petkove579d662010-05-05 16:19:39 -070042 FRIEND_TEST(MetricsDaemonTest, MessageFilter);
Darin Petkov2ccef012010-05-05 16:06:37 -070043 FRIEND_TEST(MetricsDaemonTest, NetStateChanged);
44 FRIEND_TEST(MetricsDaemonTest, PowerStateChanged);
45 FRIEND_TEST(MetricsDaemonTest, PublishMetric);
46 FRIEND_TEST(MetricsDaemonTest, ScreenSaverStateChanged);
47 FRIEND_TEST(MetricsDaemonTest, SessionStateChanged);
48 FRIEND_TEST(MetricsDaemonTest, SetUserActiveState);
49
Darin Petkov703ec972010-04-27 11:02:18 -070050 // The network states (see network_states.h).
51 enum NetworkState {
52 kUnknownNetworkState = -1, // Initial/unknown network state.
Darin Petkov65b01462010-04-14 13:32:20 -070053#define STATE(name, capname) kNetworkState ## capname,
54#include "network_states.h"
55 kNumberNetworkStates
Darin Petkov703ec972010-04-27 11:02:18 -070056 };
Darin Petkov65b01462010-04-14 13:32:20 -070057
Darin Petkov703ec972010-04-27 11:02:18 -070058 // The power states (see power_states.h).
59 enum PowerState {
60 kUnknownPowerState = -1, // Initial/unknown power state.
61#define STATE(name, capname) kPowerState ## capname,
62#include "power_states.h"
63 kNumberPowerStates
64 };
Darin Petkov65b01462010-04-14 13:32:20 -070065
Darin Petkov41e06232010-05-03 16:45:37 -070066 // The screen-saver states (see screensaver_states.h).
67 enum ScreenSaverState {
68 kUnknownScreenSaverState = -1, // Initial/unknown screen-saver state.
69#define STATE(name, capname) kScreenSaverState ## capname,
70#include "screensaver_states.h"
71 kNumberScreenSaverStates
72 };
73
74 // The user session states (see session_states.h).
75 enum SessionState {
76 kUnknownSessionState = -1, // Initial/unknown user session state.
77#define STATE(name, capname) kSessionState ## capname,
78#include "session_states.h"
79 kNumberSessionStates
80 };
81
82 // Data record for aggregating daily usage.
83 class UseRecord {
84 public:
85 UseRecord() : day_(0), seconds_(0) {}
86 int day_;
87 int seconds_;
88 };
89
Darin Petkov2ccef012010-05-05 16:06:37 -070090 // Metric parameters.
91 static const char kMetricDailyUseTimeName[];
92 static const int kMetricDailyUseTimeMin;
93 static const int kMetricDailyUseTimeMax;
94 static const int kMetricDailyUseTimeBuckets;
95 static const char kMetricTimeToNetworkDropName[];
96 static const int kMetricTimeToNetworkDropMin;
97 static const int kMetricTimeToNetworkDropMax;
98 static const int kMetricTimeToNetworkDropBuckets;
99
Darin Petkov41e06232010-05-03 16:45:37 -0700100 // D-Bus message match strings.
101 static const char* kDBusMatches_[];
102
103 // Array of network states.
104 static const char* kNetworkStates_[kNumberNetworkStates];
105
106 // Array of power states.
107 static const char* kPowerStates_[kNumberPowerStates];
108
109 // Array of screen-saver states.
110 static const char* kScreenSaverStates_[kNumberScreenSaverStates];
111
112 // Array of user session states.
113 static const char* kSessionStates_[kNumberSessionStates];
114
Darin Petkov65b01462010-04-14 13:32:20 -0700115 // Initializes.
116 void Init(bool testing);
117
118 // Creates the event loop and enters it.
119 void Loop();
120
Darin Petkov703ec972010-04-27 11:02:18 -0700121 // D-Bus filter callback.
122 static DBusHandlerResult MessageFilter(DBusConnection* connection,
123 DBusMessage* message,
124 void* user_data);
Darin Petkov65b01462010-04-14 13:32:20 -0700125
Darin Petkov703ec972010-04-27 11:02:18 -0700126 // Processes network state change.
Darin Petkov41e06232010-05-03 16:45:37 -0700127 void NetStateChanged(const char* state_name, time_t now);
Darin Petkov65b01462010-04-14 13:32:20 -0700128
Darin Petkov703ec972010-04-27 11:02:18 -0700129 // Given the state name, returns the state id.
130 NetworkState LookupNetworkState(const char* state_name);
Darin Petkov65b01462010-04-14 13:32:20 -0700131
Darin Petkov703ec972010-04-27 11:02:18 -0700132 // Processes power state change.
Darin Petkov41e06232010-05-03 16:45:37 -0700133 void PowerStateChanged(const char* state_name, time_t now);
Darin Petkov703ec972010-04-27 11:02:18 -0700134
135 // Given the state name, returns the state id.
136 PowerState LookupPowerState(const char* state_name);
Darin Petkov65b01462010-04-14 13:32:20 -0700137
Darin Petkov41e06232010-05-03 16:45:37 -0700138 // Processes screen-saver state change.
139 void ScreenSaverStateChanged(const char* state_name, time_t now);
140
141 // Given the state name, returns the state id.
142 ScreenSaverState LookupScreenSaverState(const char* state_name);
143
144 // Processes user session state change.
145 void SessionStateChanged(const char* state_name, time_t now);
146
147 // Given the state name, returns the state id.
148 SessionState LookupSessionState(const char* state_name);
149
150 // Updates the user-active state to |active| and logs the usage data
151 // since the last update. If the user has just become active,
152 // reschedule the daily use monitor for more frequent updates --
153 // this is followed by an exponential back-off (see UseMonitor).
154 void SetUserActiveState(bool active, time_t now);
155
156 // Updates the daily usage file, if necessary, by adding |seconds|
157 // of active use to the |day| since Epoch. If there's usage data for
158 // day in the past in the usage file, that data is sent to UMA and
159 // removed from the file. If there's already usage data for |day| in
160 // the usage file, the |seconds| are accumulated.
161 void LogDailyUseRecord(int day, int seconds);
162
163 // Callbacks for the daily use monitor. The daily use monitor uses
164 // LogDailyUseRecord to aggregate current usage data and send it to
165 // UMA, if necessary. It also reschedules itself using an
166 // exponentially bigger interval (up to a certain maximum) -- so
167 // usage is monitored less frequently with longer active use.
168 static gboolean UseMonitorStatic(gpointer data);
169 bool UseMonitor();
170
171 // Schedules or reschedules a daily use monitor for |interval|
172 // seconds from now. |backoff| mode is used by the use monitor to
173 // reschedule itself. If there's a monitor scheduled already and
174 // |backoff| is false, unschedules it first. Doesn't schedule a
175 // monitor for more than kUseMonitorIntervalMax seconds in the
176 // future (see metrics_daemon.cc). Returns true if a new use monitor
177 // was scheduled, false otherwise (note that if |backoff| is false a
178 // new use monitor will always be scheduled).
179 bool ScheduleUseMonitor(int interval, bool backoff);
180
181 // Unschedules a scheduled use monitor, if any.
182 void UnscheduleUseMonitor();
183
Darin Petkovc2526a12010-04-21 14:24:04 -0700184 // Sends a stat to Chrome for transport to UMA (or prints it for
185 // testing). See MetricsLibrary::SendToChrome in metrics_library.h
186 // for a description of the arguments.
187 void PublishMetric(const char* name, int sample,
188 int min, int max, int nbuckets);
Darin Petkov65b01462010-04-14 13:32:20 -0700189
Darin Petkov2ccef012010-05-05 16:06:37 -0700190 // Test mode.
Darin Petkov41e06232010-05-03 16:45:37 -0700191 bool testing_;
Darin Petkov65b01462010-04-14 13:32:20 -0700192
Darin Petkov2ccef012010-05-05 16:06:37 -0700193 const char* daily_use_record_file_;
194
Darin Petkov41e06232010-05-03 16:45:37 -0700195 // Current network state.
196 NetworkState network_state_;
Darin Petkov65b01462010-04-14 13:32:20 -0700197
Darin Petkov41e06232010-05-03 16:45:37 -0700198 // Timestamps last network state update.
199 time_t network_state_last_;
Darin Petkov65b01462010-04-14 13:32:20 -0700200
Darin Petkov41e06232010-05-03 16:45:37 -0700201 // Current power state.
202 PowerState power_state_;
203
204 // Current screen-saver state.
205 ScreenSaverState screensaver_state_;
206
207 // Current user session state.
208 SessionState session_state_;
209
210 // Is the user currently active: power is on, user session has
211 // started, screen is not locked.
212 bool user_active_;
213
214 // Timestamps last user active update.
215 time_t user_active_last_;
216
217 // Last stored daily use day (since epoch).
218 int daily_use_day_last_;
219
220 // Sleep period until the next daily usage aggregation performed by
221 // the daily use monitor (see ScheduleUseMonitor).
222 int usemon_interval_;
223
224 // Scheduled daily use monitor source (see ScheduleUseMonitor).
225 GSource* usemon_source_;
Darin Petkov65b01462010-04-14 13:32:20 -0700226};
227
228#endif // METRICS_DAEMON_H_