Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(84)

Unified Diff: chromeos/dbus/power_manager_client.cc

Issue 11783020: Implement support for monitor suspend. (Closed) Base URL: https://chromium.googlesource.com/chromium/src@git-svn
Patch Set: Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chromeos/dbus/power_manager_client.cc
diff --git a/chromeos/dbus/power_manager_client.cc b/chromeos/dbus/power_manager_client.cc
index 4dd191f0b6c663b6f84079e1c8d222d600675fa7..5eefc62250aa6acba6916628780b5b18532ee176 100644
--- a/chromeos/dbus/power_manager_client.cc
+++ b/chromeos/dbus/power_manager_client.cc
@@ -27,11 +27,14 @@
namespace chromeos {
+const int kSuspendDelayTimeoutMs = 5000;
+
// The PowerManagerClient implementation used in production.
class PowerManagerClientImpl : public PowerManagerClient {
public:
explicit PowerManagerClientImpl(dbus::Bus* bus)
: power_manager_proxy_(NULL),
+ has_delay_id_(false),
Daniel Erat 2013/01/08 00:51:35 nit: rename to be more descriptive: has_suspend_de
marcheu 2013/01/10 01:03:49 Done.
weak_ptr_factory_(this) {
power_manager_proxy_ = bus->GetObjectProxy(
power_manager::kPowerManagerServiceName,
@@ -96,9 +99,61 @@ 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);
Daniel Erat 2013/01/08 00:51:35 nit: fix indenting
marcheu 2013/01/10 01:03:49 Done.
+ dbus::MessageWriter writer(&method_call);
+
+ power_manager::RegisterSuspendDelayRequest protobuf_request;
+ base::TimeDelta timeout =
+ base::TimeDelta::FromMilliseconds(kSuspendDelayTimeoutMs);
+ protobuf_request.Clear();
Daniel Erat 2013/01/08 00:51:35 nit: don't need to call Clear() on a new protobuf,
marcheu 2013/01/10 01:03:49 Done.
+ protobuf_request.set_timeout(timeout.ToInternalValue());
+
+ if (!writer.AppendProtoAsArrayOfBytes(protobuf_request)) {
+ LOG(ERROR) << "Error calling "
Daniel Erat 2013/01/08 00:51:35 nit: change this to "Error constructing message fo
marcheu 2013/01/10 01:03:49 Done.
+ << power_manager::kRegisterSuspendDelayMethod;
+ return;
+ }
+ power_manager_proxy_->CallMethod(
+ &method_call,
+ dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
+ base::Bind(
+ &PowerManagerClientImpl::OnRegisterSuspendDelayReply,
+ weak_ptr_factory_.GetWeakPtr()));
}
virtual ~PowerManagerClientImpl() {
+ // Unregister from powerd for suspend notifications.
+ if (!has_delay_id_) {
+ LOG(ERROR) << "Destroying PowerManagerClientImpl without a delay_id_";
+ return;
Daniel Erat 2013/01/08 00:51:35 i'm pretty sure you don't want to bail out early f
marcheu 2013/01/10 01:03:49 Done.
+ }
+
+ 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:
@@ -444,6 +499,25 @@ class PowerManagerClientImpl : public PowerManagerClient {
callback.Run(percent);
}
+ void OnRegisterSuspendDelayReply(
+ dbus::Response* response) {
Daniel Erat 2013/01/08 00:51:35 nit: unwrap this line
marcheu 2013/01/10 01:03:49 Done.
+ if (!response) {
+ LOG(ERROR) << "Error calling "
+ << power_manager::kRegisterSuspendDelayMethod;
+ return;
+ }
+ dbus::MessageReader reader(response);
+ power_manager::RegisterSuspendDelayReply protobuf;
+ if (!reader.PopArrayOfBytesAsProto(&protobuf)) {
+ LOG(ERROR) << "Error calling "
+ << power_manager::kRegisterSuspendDelayMethod
+ << response->ToString();
Daniel Erat 2013/01/08 00:51:35 nit: change this to be more descriptive, like:
marcheu 2013/01/10 01:03:49 Done.
+ return;
+ }
+ delay_id_ = protobuf.delay_id();
+ has_delay_id_ = true;
+ }
+
void IdleNotifySignalReceived(dbus::Signal* signal) {
dbus::MessageReader reader(signal);
int64 threshold = 0;
@@ -481,6 +555,45 @@ class PowerManagerClientImpl : public PowerManagerClient {
FOR_EACH_OBSERVER(Observer, observers_, ScreenDimmingRequested(state));
}
+ void SuspendImminentReceived(dbus::Signal* signal) {
+ if (!has_delay_id_) {
+ LOG(ERROR) << "Received unrequested "
+ << power_manager::kSuspendImminentSignal << " signal";
+ return;
+ }
+
+ dbus::MessageReader reader(signal);
+ power_manager::SuspendImminent protobuf_imminent;
+ if (!reader.PopArrayOfBytesAsProto(&protobuf_imminent)) {
+ LOG(ERROR) << "Unable to decode protocol buffer from "
+ << power_manager::kSuspendImminentSignal << " signal";
+ return;
+ }
+ int32 suspend_id = protobuf_imminent.suspend_id();
+
+ FOR_EACH_OBSERVER(Observer, observers_, SuspendImminent());
+
+ dbus::MethodCall method_call(
+ power_manager::kPowerManagerInterface,
+ power_manager::kHandleSuspendReadinessMethod);
Daniel Erat 2013/01/08 00:51:35 nit: fix indenting
marcheu 2013/01/10 01:03:49 Done.
+ dbus::MessageWriter writer(&method_call);
+
+ power_manager::SuspendReadinessInfo protobuf_request;
+ protobuf_request.Clear();
Daniel Erat 2013/01/08 00:51:35 nit: don't need Clear() here
marcheu 2013/01/10 01:03:49 Done.
+ protobuf_request.set_delay_id(delay_id_);
+ protobuf_request.set_suspend_id(suspend_id);
+
+ if (!writer.AppendProtoAsArrayOfBytes(protobuf_request)) {
+ LOG(ERROR) << "Error calling "
Daniel Erat 2013/01/08 00:51:35 nit: "Error constructing message for " << ...
marcheu 2013/01/10 01:03:49 Done.
+ << power_manager::kHandleSuspendReadinessMethod;
+ return;
+ }
+ power_manager_proxy_->CallMethod(
+ &method_call,
+ dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
+ dbus::ObjectProxy::EmptyResponseCallback());
+ }
+
void InputEventReceived(dbus::Signal* signal) {
dbus::MessageReader reader(signal);
power_manager::InputEvent proto;
@@ -542,6 +655,10 @@ class PowerManagerClientImpl : public PowerManagerClient {
dbus::ObjectProxy* power_manager_proxy_;
ObserverList<Observer> observers_;
+ // The delay_id_ obtained from the RegisterSuspendDelay request.
+ int32 delay_id_;
Daniel Erat 2013/01/08 00:51:35 nit: rename this to suspend_delay_id_, too
marcheu 2013/01/10 01:03:49 Done.
+ bool has_delay_id_;
+
// Wall time from the latest signal telling us that the system was about to
// suspend to memory.
base::Time last_suspend_wall_time_;

Powered by Google App Engine
This is Rietveld 408576698