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

Side by Side 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: Patch set 2. 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
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 has_suspend_delay_id_(false),
38 suspend_delay_id_(-1),
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 // Unregister from powerd for suspend notifications.
139 if (has_suspend_delay_id_) {
140 dbus::MethodCall method_call(
141 power_manager::kPowerManagerInterface,
142 power_manager::kUnregisterSuspendDelayMethod);
143 dbus::MessageWriter writer(&method_call);
144
145 power_manager::UnregisterSuspendDelayRequest protobuf;
146 protobuf.Clear();
147 protobuf.set_delay_id(suspend_delay_id_);
148
149 power_manager_proxy_->CallMethod(
150 &method_call,
151 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
152 dbus::ObjectProxy::EmptyResponseCallback());
153 }
102 } 154 }
103 155
104 // PowerManagerClient overrides: 156 // PowerManagerClient overrides:
105 157
106 virtual void AddObserver(Observer* observer) OVERRIDE { 158 virtual void AddObserver(Observer* observer) OVERRIDE {
107 CHECK(observer); // http://crbug.com/119976 159 CHECK(observer); // http://crbug.com/119976
108 observers_.AddObserver(observer); 160 observers_.AddObserver(observer);
109 } 161 }
110 162
111 virtual void RemoveObserver(Observer* observer) OVERRIDE { 163 virtual void RemoveObserver(Observer* observer) OVERRIDE {
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after
437 return; 489 return;
438 } 490 }
439 dbus::MessageReader reader(response); 491 dbus::MessageReader reader(response);
440 double percent = 0.0; 492 double percent = 0.0;
441 if (!reader.PopDouble(&percent)) 493 if (!reader.PopDouble(&percent))
442 LOG(ERROR) << "Error reading response from powerd: " 494 LOG(ERROR) << "Error reading response from powerd: "
443 << response->ToString(); 495 << response->ToString();
444 callback.Run(percent); 496 callback.Run(percent);
445 } 497 }
446 498
499 void OnRegisterSuspendDelayReply(dbus::Response* response) {
500 if (!response) {
501 LOG(ERROR) << "Error calling "
502 << power_manager::kRegisterSuspendDelayMethod;
503 return;
504 }
505 dbus::MessageReader reader(response);
506 power_manager::RegisterSuspendDelayReply protobuf;
507 if (!reader.PopArrayOfBytesAsProto(&protobuf)) {
508 LOG(ERROR) << "Unable to parse reply from "
509 << power_manager::kRegisterSuspendDelayMethod;
510 return;
511 }
512 suspend_delay_id_ = protobuf.delay_id();
513 has_suspend_delay_id_ = true;
514 }
515
447 void IdleNotifySignalReceived(dbus::Signal* signal) { 516 void IdleNotifySignalReceived(dbus::Signal* signal) {
448 dbus::MessageReader reader(signal); 517 dbus::MessageReader reader(signal);
449 int64 threshold = 0; 518 int64 threshold = 0;
450 if (!reader.PopInt64(&threshold)) { 519 if (!reader.PopInt64(&threshold)) {
451 LOG(ERROR) << "Idle Notify signal had incorrect parameters: " 520 LOG(ERROR) << "Idle Notify signal had incorrect parameters: "
452 << signal->ToString(); 521 << signal->ToString();
453 return; 522 return;
454 } 523 }
455 DCHECK_GT(threshold, 0); 524 DCHECK_GT(threshold, 0);
456 525
(...skipping 17 matching lines...) Expand all
474 break; 543 break;
475 case power_manager::kSoftwareScreenDimmingIdle: 544 case power_manager::kSoftwareScreenDimmingIdle:
476 state = Observer::SCREEN_DIMMING_IDLE; 545 state = Observer::SCREEN_DIMMING_IDLE;
477 break; 546 break;
478 default: 547 default:
479 LOG(ERROR) << "Unhandled screen dimming state " << signal_state; 548 LOG(ERROR) << "Unhandled screen dimming state " << signal_state;
480 } 549 }
481 FOR_EACH_OBSERVER(Observer, observers_, ScreenDimmingRequested(state)); 550 FOR_EACH_OBSERVER(Observer, observers_, ScreenDimmingRequested(state));
482 } 551 }
483 552
553 void SuspendImminentReceived(dbus::Signal* signal) {
554 if (!has_suspend_delay_id_) {
555 LOG(ERROR) << "Received unrequested "
556 << power_manager::kSuspendImminentSignal << " signal";
557 return;
558 }
559
560 dbus::MessageReader reader(signal);
561 power_manager::SuspendImminent protobuf_imminent;
562 if (!reader.PopArrayOfBytesAsProto(&protobuf_imminent)) {
563 LOG(ERROR) << "Unable to decode protocol buffer from "
564 << power_manager::kSuspendImminentSignal << " signal";
565 return;
566 }
567 int32 suspend_id = protobuf_imminent.suspend_id();
568
569 FOR_EACH_OBSERVER(Observer, observers_, SuspendImminent());
570
571 dbus::MethodCall method_call(
572 power_manager::kPowerManagerInterface,
573 power_manager::kHandleSuspendReadinessMethod);
574 dbus::MessageWriter writer(&method_call);
575
576 power_manager::SuspendReadinessInfo protobuf_request;
577 protobuf_request.set_delay_id(suspend_delay_id_);
578 protobuf_request.set_suspend_id(suspend_id);
579
580 if (!writer.AppendProtoAsArrayOfBytes(protobuf_request)) {
581 LOG(ERROR) << "Error constructing message for "
582 << power_manager::kHandleSuspendReadinessMethod;
583 return;
584 }
585 power_manager_proxy_->CallMethod(
586 &method_call,
587 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
588 dbus::ObjectProxy::EmptyResponseCallback());
589 }
590
484 void InputEventReceived(dbus::Signal* signal) { 591 void InputEventReceived(dbus::Signal* signal) {
485 dbus::MessageReader reader(signal); 592 dbus::MessageReader reader(signal);
486 power_manager::InputEvent proto; 593 power_manager::InputEvent proto;
487 if (!reader.PopArrayOfBytesAsProto(&proto)) { 594 if (!reader.PopArrayOfBytesAsProto(&proto)) {
488 LOG(ERROR) << "Unable to decode protocol buffer from " 595 LOG(ERROR) << "Unable to decode protocol buffer from "
489 << power_manager::kInputEventSignal << " signal"; 596 << power_manager::kInputEventSignal << " signal";
490 return; 597 return;
491 } 598 }
492 599
493 base::TimeTicks timestamp = 600 base::TimeTicks timestamp =
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
535 FOR_EACH_OBSERVER( 642 FOR_EACH_OBSERVER(
536 PowerManagerClient::Observer, observers_, 643 PowerManagerClient::Observer, observers_,
537 SystemResumed(wall_time - last_suspend_wall_time_)); 644 SystemResumed(wall_time - last_suspend_wall_time_));
538 break; 645 break;
539 } 646 }
540 } 647 }
541 648
542 dbus::ObjectProxy* power_manager_proxy_; 649 dbus::ObjectProxy* power_manager_proxy_;
543 ObserverList<Observer> observers_; 650 ObserverList<Observer> observers_;
544 651
652 // The delay_id_ obtained from the RegisterSuspendDelay request.
653 int32 suspend_delay_id_;
654 bool has_suspend_delay_id_;
655
545 // Wall time from the latest signal telling us that the system was about to 656 // Wall time from the latest signal telling us that the system was about to
546 // suspend to memory. 657 // suspend to memory.
547 base::Time last_suspend_wall_time_; 658 base::Time last_suspend_wall_time_;
548 659
549 // Note: This should remain the last member so it'll be destroyed and 660 // Note: This should remain the last member so it'll be destroyed and
550 // invalidate its weak pointers before any other members are destroyed. 661 // invalidate its weak pointers before any other members are destroyed.
551 base::WeakPtrFactory<PowerManagerClientImpl> weak_ptr_factory_; 662 base::WeakPtrFactory<PowerManagerClientImpl> weak_ptr_factory_;
552 663
553 DISALLOW_COPY_AND_ASSIGN(PowerManagerClientImpl); 664 DISALLOW_COPY_AND_ASSIGN(PowerManagerClientImpl);
554 }; 665 };
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
714 PowerManagerClient* PowerManagerClient::Create( 825 PowerManagerClient* PowerManagerClient::Create(
715 DBusClientImplementationType type, 826 DBusClientImplementationType type,
716 dbus::Bus* bus) { 827 dbus::Bus* bus) {
717 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) 828 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION)
718 return new PowerManagerClientImpl(bus); 829 return new PowerManagerClientImpl(bus);
719 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type); 830 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type);
720 return new PowerManagerClientStubImpl(); 831 return new PowerManagerClientStubImpl();
721 } 832 }
722 833
723 } // namespace chromeos 834 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698