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

Side by Side Diff: chromeos/dbus/power_manager_client.cc

Issue 12036092: Implement support for monitor suspend. (Closed) Base URL: https://chromium.googlesource.com/chromium/src@git-svn
Patch Set: Fixed nits 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 unified diff | Download patch
« no previous file with comments | « chromeos/dbus/power_manager_client.h ('k') | chromeos/display/output_configurator.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chromeos/dbus/power_manager_client.h" 5 #include "chromeos/dbus/power_manager_client.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/callback.h" 10 #include "base/callback.h"
11 #include "base/format_macros.h" 11 #include "base/format_macros.h"
12 #include "base/memory/scoped_ptr.h" 12 #include "base/memory/scoped_ptr.h"
13 #include "base/observer_list.h" 13 #include "base/observer_list.h"
14 #include "base/stringprintf.h" 14 #include "base/stringprintf.h"
15 #include "base/time.h" 15 #include "base/time.h"
16 #include "base/timer.h" 16 #include "base/timer.h"
17 #include "chromeos/dbus/power_manager/input_event.pb.h" 17 #include "chromeos/dbus/power_manager/input_event.pb.h"
18 #include "chromeos/dbus/power_manager/suspend.pb.h" 18 #include "chromeos/dbus/power_manager/suspend.pb.h"
19 #include "chromeos/dbus/power_state_control.pb.h" 19 #include "chromeos/dbus/power_state_control.pb.h"
20 #include "chromeos/dbus/power_supply_properties.pb.h" 20 #include "chromeos/dbus/power_supply_properties.pb.h"
21 #include "chromeos/dbus/video_activity_update.pb.h" 21 #include "chromeos/dbus/video_activity_update.pb.h"
22 #include "dbus/bus.h" 22 #include "dbus/bus.h"
23 #include "dbus/message.h" 23 #include "dbus/message.h"
24 #include "dbus/object_path.h" 24 #include "dbus/object_path.h"
25 #include "dbus/object_proxy.h" 25 #include "dbus/object_proxy.h"
26 #include "third_party/cros_system_api/dbus/service_constants.h" 26 #include "third_party/cros_system_api/dbus/service_constants.h"
27 27
28 namespace chromeos { 28 namespace chromeos {
29 29
30 const int kSuspendDelayTimeoutMs = 5000;
31
30 // The PowerManagerClient implementation used in production. 32 // The PowerManagerClient implementation used in production.
31 class PowerManagerClientImpl : public PowerManagerClient { 33 class PowerManagerClientImpl : public PowerManagerClient {
32 public: 34 public:
33 explicit PowerManagerClientImpl(dbus::Bus* bus) 35 explicit PowerManagerClientImpl(dbus::Bus* bus)
34 : power_manager_proxy_(NULL), 36 : power_manager_proxy_(NULL),
37 suspend_delay_id_(-1),
38 has_suspend_delay_id_(false),
35 weak_ptr_factory_(this) { 39 weak_ptr_factory_(this) {
36 power_manager_proxy_ = bus->GetObjectProxy( 40 power_manager_proxy_ = bus->GetObjectProxy(
37 power_manager::kPowerManagerServiceName, 41 power_manager::kPowerManagerServiceName,
38 dbus::ObjectPath(power_manager::kPowerManagerServicePath)); 42 dbus::ObjectPath(power_manager::kPowerManagerServicePath));
39 43
40 // Monitor the D-Bus signal for brightness changes. Only the power 44 // Monitor the D-Bus signal for brightness changes. Only the power
41 // manager knows the actual brightness level. We don't cache the 45 // manager knows the actual brightness level. We don't cache the
42 // brightness level in Chrome as it'll make things less reliable. 46 // brightness level in Chrome as it'll make things less reliable.
43 power_manager_proxy_->ConnectToSignal( 47 power_manager_proxy_->ConnectToSignal(
44 power_manager::kPowerManagerInterface, 48 power_manager::kPowerManagerInterface,
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 base::Bind(&PowerManagerClientImpl::SignalConnected, 93 base::Bind(&PowerManagerClientImpl::SignalConnected,
90 weak_ptr_factory_.GetWeakPtr())); 94 weak_ptr_factory_.GetWeakPtr()));
91 95
92 power_manager_proxy_->ConnectToSignal( 96 power_manager_proxy_->ConnectToSignal(
93 power_manager::kPowerManagerInterface, 97 power_manager::kPowerManagerInterface,
94 power_manager::kSuspendStateChangedSignal, 98 power_manager::kSuspendStateChangedSignal,
95 base::Bind(&PowerManagerClientImpl::SuspendStateChangedReceived, 99 base::Bind(&PowerManagerClientImpl::SuspendStateChangedReceived,
96 weak_ptr_factory_.GetWeakPtr()), 100 weak_ptr_factory_.GetWeakPtr()),
97 base::Bind(&PowerManagerClientImpl::SignalConnected, 101 base::Bind(&PowerManagerClientImpl::SignalConnected,
98 weak_ptr_factory_.GetWeakPtr())); 102 weak_ptr_factory_.GetWeakPtr()));
103
104 power_manager_proxy_->ConnectToSignal(
105 power_manager::kPowerManagerInterface,
106 power_manager::kSuspendImminentSignal,
107 base::Bind(
108 &PowerManagerClientImpl::SuspendImminentReceived,
109 weak_ptr_factory_.GetWeakPtr()),
110 base::Bind(&PowerManagerClientImpl::SignalConnected,
111 weak_ptr_factory_.GetWeakPtr()));
112
113 // Register to powerd for suspend notifications.
114 dbus::MethodCall method_call(
115 power_manager::kPowerManagerInterface,
116 power_manager::kRegisterSuspendDelayMethod);
117 dbus::MessageWriter writer(&method_call);
118
119 power_manager::RegisterSuspendDelayRequest protobuf_request;
120 base::TimeDelta timeout =
121 base::TimeDelta::FromMilliseconds(kSuspendDelayTimeoutMs);
122 protobuf_request.set_timeout(timeout.ToInternalValue());
123
124 if (!writer.AppendProtoAsArrayOfBytes(protobuf_request)) {
125 LOG(ERROR) << "Error constructing message for "
126 << power_manager::kRegisterSuspendDelayMethod;
127 return;
128 }
129 power_manager_proxy_->CallMethod(
130 &method_call,
131 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
132 base::Bind(
133 &PowerManagerClientImpl::OnRegisterSuspendDelayReply,
134 weak_ptr_factory_.GetWeakPtr()));
99 } 135 }
100 136
101 virtual ~PowerManagerClientImpl() { 137 virtual ~PowerManagerClientImpl() {
138 // Here we should unregister suspend notifications from powerd,
139 // however:
140 // - The lifetime of the PowerManagerClientImpl can extend past that of
141 // the objectproxy,
142 // - power_manager can already detect that the client is gone and
143 // unregister our suspend delay.
102 } 144 }
103 145
104 // PowerManagerClient overrides: 146 // PowerManagerClient overrides:
105 147
106 virtual void AddObserver(Observer* observer) OVERRIDE { 148 virtual void AddObserver(Observer* observer) OVERRIDE {
107 CHECK(observer); // http://crbug.com/119976 149 CHECK(observer); // http://crbug.com/119976
108 observers_.AddObserver(observer); 150 observers_.AddObserver(observer);
109 } 151 }
110 152
111 virtual void RemoveObserver(Observer* observer) OVERRIDE { 153 virtual void RemoveObserver(Observer* observer) OVERRIDE {
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after
437 return; 479 return;
438 } 480 }
439 dbus::MessageReader reader(response); 481 dbus::MessageReader reader(response);
440 double percent = 0.0; 482 double percent = 0.0;
441 if (!reader.PopDouble(&percent)) 483 if (!reader.PopDouble(&percent))
442 LOG(ERROR) << "Error reading response from powerd: " 484 LOG(ERROR) << "Error reading response from powerd: "
443 << response->ToString(); 485 << response->ToString();
444 callback.Run(percent); 486 callback.Run(percent);
445 } 487 }
446 488
489 void OnRegisterSuspendDelayReply(dbus::Response* response) {
490 if (!response) {
491 LOG(ERROR) << "Error calling "
492 << power_manager::kRegisterSuspendDelayMethod;
493 return;
494 }
495 dbus::MessageReader reader(response);
496 power_manager::RegisterSuspendDelayReply protobuf;
497 if (!reader.PopArrayOfBytesAsProto(&protobuf)) {
498 LOG(ERROR) << "Unable to parse reply from "
499 << power_manager::kRegisterSuspendDelayMethod;
500 return;
501 }
502 suspend_delay_id_ = protobuf.delay_id();
503 has_suspend_delay_id_ = true;
504 }
505
447 void IdleNotifySignalReceived(dbus::Signal* signal) { 506 void IdleNotifySignalReceived(dbus::Signal* signal) {
448 dbus::MessageReader reader(signal); 507 dbus::MessageReader reader(signal);
449 int64 threshold = 0; 508 int64 threshold = 0;
450 if (!reader.PopInt64(&threshold)) { 509 if (!reader.PopInt64(&threshold)) {
451 LOG(ERROR) << "Idle Notify signal had incorrect parameters: " 510 LOG(ERROR) << "Idle Notify signal had incorrect parameters: "
452 << signal->ToString(); 511 << signal->ToString();
453 return; 512 return;
454 } 513 }
455 DCHECK_GT(threshold, 0); 514 DCHECK_GT(threshold, 0);
456 515
(...skipping 17 matching lines...) Expand all
474 break; 533 break;
475 case power_manager::kSoftwareScreenDimmingIdle: 534 case power_manager::kSoftwareScreenDimmingIdle:
476 state = Observer::SCREEN_DIMMING_IDLE; 535 state = Observer::SCREEN_DIMMING_IDLE;
477 break; 536 break;
478 default: 537 default:
479 LOG(ERROR) << "Unhandled screen dimming state " << signal_state; 538 LOG(ERROR) << "Unhandled screen dimming state " << signal_state;
480 } 539 }
481 FOR_EACH_OBSERVER(Observer, observers_, ScreenDimmingRequested(state)); 540 FOR_EACH_OBSERVER(Observer, observers_, ScreenDimmingRequested(state));
482 } 541 }
483 542
543 void SuspendImminentReceived(dbus::Signal* signal) {
544 if (!has_suspend_delay_id_) {
545 LOG(ERROR) << "Received unrequested "
546 << power_manager::kSuspendImminentSignal << " signal";
547 return;
548 }
549
550 dbus::MessageReader reader(signal);
551 power_manager::SuspendImminent protobuf_imminent;
552 if (!reader.PopArrayOfBytesAsProto(&protobuf_imminent)) {
553 LOG(ERROR) << "Unable to decode protocol buffer from "
554 << power_manager::kSuspendImminentSignal << " signal";
555 return;
556 }
557 int32 suspend_id = protobuf_imminent.suspend_id();
558
559 FOR_EACH_OBSERVER(Observer, observers_, SuspendImminent());
560
561 dbus::MethodCall method_call(
562 power_manager::kPowerManagerInterface,
563 power_manager::kHandleSuspendReadinessMethod);
564 dbus::MessageWriter writer(&method_call);
565
566 power_manager::SuspendReadinessInfo protobuf_request;
567 protobuf_request.set_delay_id(suspend_delay_id_);
568 protobuf_request.set_suspend_id(suspend_id);
569
570 if (!writer.AppendProtoAsArrayOfBytes(protobuf_request)) {
571 LOG(ERROR) << "Error constructing message for "
572 << power_manager::kHandleSuspendReadinessMethod;
573 return;
574 }
575 power_manager_proxy_->CallMethod(
576 &method_call,
577 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
578 dbus::ObjectProxy::EmptyResponseCallback());
579 }
580
484 void InputEventReceived(dbus::Signal* signal) { 581 void InputEventReceived(dbus::Signal* signal) {
485 dbus::MessageReader reader(signal); 582 dbus::MessageReader reader(signal);
486 power_manager::InputEvent proto; 583 power_manager::InputEvent proto;
487 if (!reader.PopArrayOfBytesAsProto(&proto)) { 584 if (!reader.PopArrayOfBytesAsProto(&proto)) {
488 LOG(ERROR) << "Unable to decode protocol buffer from " 585 LOG(ERROR) << "Unable to decode protocol buffer from "
489 << power_manager::kInputEventSignal << " signal"; 586 << power_manager::kInputEventSignal << " signal";
490 return; 587 return;
491 } 588 }
492 589
493 base::TimeTicks timestamp = 590 base::TimeTicks timestamp =
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
535 FOR_EACH_OBSERVER( 632 FOR_EACH_OBSERVER(
536 PowerManagerClient::Observer, observers_, 633 PowerManagerClient::Observer, observers_,
537 SystemResumed(wall_time - last_suspend_wall_time_)); 634 SystemResumed(wall_time - last_suspend_wall_time_));
538 break; 635 break;
539 } 636 }
540 } 637 }
541 638
542 dbus::ObjectProxy* power_manager_proxy_; 639 dbus::ObjectProxy* power_manager_proxy_;
543 ObserverList<Observer> observers_; 640 ObserverList<Observer> observers_;
544 641
642 // The delay_id_ obtained from the RegisterSuspendDelay request.
643 int32 suspend_delay_id_;
644 bool has_suspend_delay_id_;
645
545 // Wall time from the latest signal telling us that the system was about to 646 // Wall time from the latest signal telling us that the system was about to
546 // suspend to memory. 647 // suspend to memory.
547 base::Time last_suspend_wall_time_; 648 base::Time last_suspend_wall_time_;
548 649
549 // Note: This should remain the last member so it'll be destroyed and 650 // Note: This should remain the last member so it'll be destroyed and
550 // invalidate its weak pointers before any other members are destroyed. 651 // invalidate its weak pointers before any other members are destroyed.
551 base::WeakPtrFactory<PowerManagerClientImpl> weak_ptr_factory_; 652 base::WeakPtrFactory<PowerManagerClientImpl> weak_ptr_factory_;
552 653
553 DISALLOW_COPY_AND_ASSIGN(PowerManagerClientImpl); 654 DISALLOW_COPY_AND_ASSIGN(PowerManagerClientImpl);
554 }; 655 };
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
714 PowerManagerClient* PowerManagerClient::Create( 815 PowerManagerClient* PowerManagerClient::Create(
715 DBusClientImplementationType type, 816 DBusClientImplementationType type,
716 dbus::Bus* bus) { 817 dbus::Bus* bus) {
717 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) 818 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION)
718 return new PowerManagerClientImpl(bus); 819 return new PowerManagerClientImpl(bus);
719 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type); 820 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type);
720 return new PowerManagerClientStubImpl(); 821 return new PowerManagerClientStubImpl();
721 } 822 }
722 823
723 } // namespace chromeos 824 } // namespace chromeos
OLDNEW
« no previous file with comments | « chromeos/dbus/power_manager_client.h ('k') | chromeos/display/output_configurator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698