Unify metrics_collection and metrics_daemon into metrics.

Tested new binaries on the target.
Tested incremental build.
Tested arm-generic build.

Review URL: http://codereview.chromium.org/1650006
diff --git a/metrics/metrics_daemon.h b/metrics/metrics_daemon.h
new file mode 100644
index 0000000..2ac1ea0
--- /dev/null
+++ b/metrics/metrics_daemon.h
@@ -0,0 +1,88 @@
+// Copyright (c) 2010 The Chromium OS 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 METRICS_DAEMON_H_
+#define METRICS_DAEMON_H_
+
+#include <dbus/dbus-glib.h>
+#include <sys/time.h>
+#include <time.h>
+
+class MetricsDaemon {
+
+ public:
+  MetricsDaemon()
+      : network_state_id_(kUnknownNetworkStateId) {
+  }
+  ~MetricsDaemon() {}
+
+  // Does all the work.  If |run_as_daemon| is true, daemonize by forking.  If
+  // |testing| is true, log the stats instead of sending them to Chrome.
+  void Run(bool run_as_daemon, bool testing);
+
+ private:
+  // Shared with Chrome for transport.
+  static const char* kMetricsFilePath;
+  static const int kMetricsMessageMaxLength = 4096;
+
+  // The network states.  See network_states.h.
+  typedef enum {
+    // Initial/unknown network state id.
+    kUnknownNetworkStateId = -1,
+#define STATE(name, capname) kNetworkState ## capname,
+#include "network_states.h"
+    kNumberNetworkStates
+  } NetworkStateId;
+
+  typedef struct {
+    const char* name;
+    const char* stat_name;
+  } NetworkState;
+
+  // Initializes.
+  void Init(bool testing);
+
+  // Creates the event loop and enters it.
+  void Loop();
+
+  // Static callback for network events on DBus.
+  static void StaticNetSignalHandler(::DBusGProxy* proxy, const char* property,
+                                     const ::GValue* value, void* data);
+
+  // Callback for network events on DBus.
+  void NetSignalHandler(::DBusGProxy* proxy, const char* property,
+                        const ::GValue* value);
+
+  // This is called at each network state change.  The new state is identified
+  // by the string @newstate.  As a side effect, this method ships to Chrome
+  // (or prints to stdout when testing) the name and duration of the state
+  // that has ended.
+  void LogNetworkStateChange(const char* newstate);
+
+  // Given a string with the name of a state, returns the id for the state.
+  NetworkStateId GetNetworkStateId(const char* state_name);
+
+  // Sends a stat to Chrome for transport to UMA.
+  void ChromePublishMetric(const char* name, const char* value);
+
+  // Prints a stat for testing.
+  void TestPublishMetric(const char* name, const char* value);
+
+#if 0
+  // Fetches a name-value hash table from DBus.
+  bool GetProperties(::DBusGProxy* proxy, ::GHashTable** table);
+
+  // The type descriptor for a glib hash table.
+  GType hashtable_gtype;
+#endif
+
+  // Array of network states of interest.
+  static NetworkState network_states_[kNumberNetworkStates];
+
+  bool testing_;                           // just testing
+  NetworkStateId network_state_id_;        // id of current state
+  struct timeval network_state_start_;     // when current state was entered
+};
+
+#endif  // METRICS_DAEMON_H_