Index: chromeos/dbus/power_manager_client.cc |
diff --git a/chromeos/dbus/power_manager_client.cc b/chromeos/dbus/power_manager_client.cc |
index 54b0cc42edbaf5a0d6f6833e3e17f1842789a433..348a1a06b3ff9fb21e198738034afe95de70f360 100644 |
--- a/chromeos/dbus/power_manager_client.cc |
+++ b/chromeos/dbus/power_manager_client.cc |
@@ -14,6 +14,7 @@ |
#include "base/stringprintf.h" |
#include "base/time.h" |
#include "base/timer.h" |
+#include "chromeos/dbus/power_manager/suspend.pb.h" |
#include "chromeos/dbus/power_state_control.pb.h" |
#include "chromeos/dbus/power_supply_properties.pb.h" |
#include "chromeos/dbus/video_activity_update.pb.h" |
@@ -25,6 +26,8 @@ |
namespace chromeos { |
+const int kSuspendDelayTimeoutMs = 5000; |
+ |
// The PowerManagerClient implementation used in production. |
class PowerManagerClientImpl : public PowerManagerClient { |
public: |
@@ -78,9 +81,55 @@ class PowerManagerClientImpl : public PowerManagerClient { |
weak_ptr_factory_.GetWeakPtr()), |
base::Bind(&PowerManagerClientImpl::SignalConnected, |
weak_ptr_factory_.GetWeakPtr())); |
+ |
+ power_manager_proxy_->ConnectToSignal( |
+ power_manager::kPowerManagerInterface, |
+ power_manager::kSuspendImminentSignal, |
+ base::Bind( |
+ &PowerManagerClientImpl::SuspendImminentReceived, |
+ weak_ptr_factory_.GetWeakPtr()), |
+ base::Bind(&PowerManagerClientImpl::SignalConnected, |
+ weak_ptr_factory_.GetWeakPtr())); |
+ |
+ // Register to powerd for suspend notifications. |
+ dbus::MethodCall method_call( |
+ power_manager::kPowerManagerInterface, |
+ power_manager::kRegisterSuspendDelayMethod); |
+ dbus::MessageWriter writer(&method_call); |
+ |
+ power_manager::RegisterSuspendDelayRequest protobuf_request; |
+ protobuf_request.Clear(); |
+ protobuf_request.set_timeout(kSuspendDelayTimeoutMs); |
+ |
+ if (!writer.AppendProtoAsArrayOfBytes(protobuf_request)) { |
+ LOG(ERROR) << "Error calling " |
+ << power_manager::kRegisterSuspendDelayMethod; |
+ return; |
+ } |
+ power_manager_proxy_->CallMethod( |
+ &method_call, |
+ dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
+ dbus::ObjectProxy::EmptyResponseCallback()); |
+ |
+ power_manager::RegisterSuspendDelayReply protobuf_reply; |
+ delay_id_ = protobuf_reply.delay_id(); |
} |
virtual ~PowerManagerClientImpl() { |
+ // Unregister from powerd for suspend notifications. |
+ dbus::MethodCall method_call( |
+ power_manager::kPowerManagerInterface, |
+ power_manager::kUnregisterSuspendDelayMethod); |
+ dbus::MessageWriter writer(&method_call); |
+ |
+ power_manager::UnregisterSuspendDelayRequest protobuf; |
+ protobuf.Clear(); |
+ protobuf.set_delay_id(delay_id_); |
+ |
+ power_manager_proxy_->CallMethod( |
+ &method_call, |
+ dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
+ dbus::ObjectProxy::EmptyResponseCallback()); |
} |
// PowerManagerClient overrides: |
@@ -463,8 +512,38 @@ class PowerManagerClientImpl : public PowerManagerClient { |
FOR_EACH_OBSERVER(Observer, observers_, ScreenDimmingRequested(state)); |
} |
+ void SuspendImminentReceived(dbus::Signal* signal) { |
+ dbus::MessageReader reader(signal); |
+ power_manager::SuspendImminent protobuf_imminent; |
+ int32 suspend_id = protobuf_imminent.suspend_id(); |
+ |
+ FOR_EACH_OBSERVER(Observer, observers_, DelaySuspend()); |
+ |
+ dbus::MethodCall method_call( |
+ power_manager::kPowerManagerInterface, |
+ power_manager::kHandleSuspendReadinessMethod); |
+ dbus::MessageWriter writer(&method_call); |
+ |
+ power_manager::SuspendReadinessInfo protobuf_request; |
+ protobuf_request.Clear(); |
+ protobuf_request.set_delay_id(delay_id_); |
+ protobuf_request.set_suspend_id(suspend_id); |
+ |
+ if (!writer.AppendProtoAsArrayOfBytes(protobuf_request)) { |
+ LOG(ERROR) << "Error calling " |
+ << power_manager::kHandleSuspendReadinessMethod; |
+ return; |
+ } |
+ power_manager_proxy_->CallMethod( |
+ &method_call, |
+ dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
+ dbus::ObjectProxy::EmptyResponseCallback()); |
+ } |
+ |
dbus::ObjectProxy* power_manager_proxy_; |
ObserverList<Observer> observers_; |
+ std::list<SuspendImminentCallback> suspend_delay_callback_list_; |
+ int32 delay_id_; |
// Note: This should remain the last member so it'll be destroyed and |
// invalidate its weak pointers before any other members are destroyed. |