shill: power management framework

Add handling of the PowerStateChange event from the power manager.

BUG=chromium-os:22407
TEST=Manual.  Created an instance of PowerManager and verified that signals are
received when the lid is closed and opened.  Verified that when using the root
path, RegisterSuspendDelay is received by powerd.

Change-Id: I040c60b1704879529e1c2e66edc4ddceef3fa39d
Reviewed-on: https://gerrit.chromium.org/gerrit/14162
Commit-Ready: Gary Morain <gmorain@chromium.org>
Reviewed-by: Gary Morain <gmorain@chromium.org>
Tested-by: Gary Morain <gmorain@chromium.org>
diff --git a/power_manager_proxy.cc b/power_manager_proxy.cc
index a0e7693..7d07c67 100644
--- a/power_manager_proxy.cc
+++ b/power_manager_proxy.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
+// Copyright (c) 2012 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.
 
@@ -7,7 +7,10 @@
 #include <base/logging.h>
 #include <chromeos/dbus/service_constants.h>
 
+using std::string;
+
 namespace shill {
+const char PowerManagerProxy::kRootPath[] = "/";
 
 PowerManagerProxy::PowerManagerProxy(PowerManagerProxyDelegate *delegate,
                                      DBus::Connection *connection)
@@ -22,7 +25,7 @@
 PowerManagerProxy::Proxy::Proxy(PowerManagerProxyDelegate *delegate,
                                 DBus::Connection *connection)
     : DBus::ObjectProxy(*connection,
-                        power_manager::kPowerManagerServicePath,
+                        kRootPath,
                         power_manager::kPowerManagerServiceName),
       delegate_(delegate) {}
 
@@ -33,4 +36,23 @@
   delegate_->OnSuspendDelay(sequence_number);
 }
 
+void PowerManagerProxy::Proxy::PowerStateChanged(
+    const string &new_power_state) {
+  VLOG(2) << __func__ << "(" << new_power_state << ")";
+
+  PowerManagerProxyDelegate::SuspendState suspend_state;
+  if (new_power_state == "on") {
+    suspend_state = PowerManagerProxyDelegate::kOn;
+  } else if (new_power_state == "standby") {
+    suspend_state = PowerManagerProxyDelegate::kStandby;
+  } else if (new_power_state == "mem") {
+    suspend_state = PowerManagerProxyDelegate::kMem;
+  } else if (new_power_state == "disk") {
+    suspend_state = PowerManagerProxyDelegate::kDisk;
+  } else {
+    suspend_state = PowerManagerProxyDelegate::kUnknown;
+  }
+  delegate_->OnPowerStateChanged(suspend_state);
+}
+
 }  // namespace shill