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

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: 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_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.
35 weak_ptr_factory_(this) { 38 weak_ptr_factory_(this) {
36 power_manager_proxy_ = bus->GetObjectProxy( 39 power_manager_proxy_ = bus->GetObjectProxy(
37 power_manager::kPowerManagerServiceName, 40 power_manager::kPowerManagerServiceName,
38 dbus::ObjectPath(power_manager::kPowerManagerServicePath)); 41 dbus::ObjectPath(power_manager::kPowerManagerServicePath));
39 42
40 // Monitor the D-Bus signal for brightness changes. Only the power 43 // Monitor the D-Bus signal for brightness changes. Only the power
41 // manager knows the actual brightness level. We don't cache the 44 // manager knows the actual brightness level. We don't cache the
42 // brightness level in Chrome as it'll make things less reliable. 45 // brightness level in Chrome as it'll make things less reliable.
43 power_manager_proxy_->ConnectToSignal( 46 power_manager_proxy_->ConnectToSignal(
44 power_manager::kPowerManagerInterface, 47 power_manager::kPowerManagerInterface,
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
89 base::Bind(&PowerManagerClientImpl::SignalConnected, 92 base::Bind(&PowerManagerClientImpl::SignalConnected,
90 weak_ptr_factory_.GetWeakPtr())); 93 weak_ptr_factory_.GetWeakPtr()));
91 94
92 power_manager_proxy_->ConnectToSignal( 95 power_manager_proxy_->ConnectToSignal(
93 power_manager::kPowerManagerInterface, 96 power_manager::kPowerManagerInterface,
94 power_manager::kSuspendStateChangedSignal, 97 power_manager::kSuspendStateChangedSignal,
95 base::Bind(&PowerManagerClientImpl::SuspendStateChangedReceived, 98 base::Bind(&PowerManagerClientImpl::SuspendStateChangedReceived,
96 weak_ptr_factory_.GetWeakPtr()), 99 weak_ptr_factory_.GetWeakPtr()),
97 base::Bind(&PowerManagerClientImpl::SignalConnected, 100 base::Bind(&PowerManagerClientImpl::SignalConnected,
98 weak_ptr_factory_.GetWeakPtr())); 101 weak_ptr_factory_.GetWeakPtr()));
102
103 power_manager_proxy_->ConnectToSignal(
104 power_manager::kPowerManagerInterface,
105 power_manager::kSuspendImminentSignal,
106 base::Bind(
107 &PowerManagerClientImpl::SuspendImminentReceived,
108 weak_ptr_factory_.GetWeakPtr()),
109 base::Bind(&PowerManagerClientImpl::SignalConnected,
110 weak_ptr_factory_.GetWeakPtr()));
111
112 // Register to powerd for suspend notifications.
113 dbus::MethodCall method_call(
114 power_manager::kPowerManagerInterface,
115 power_manager::kRegisterSuspendDelayMethod);
Daniel Erat 2013/01/08 00:51:35 nit: fix indenting
marcheu 2013/01/10 01:03:49 Done.
116 dbus::MessageWriter writer(&method_call);
117
118 power_manager::RegisterSuspendDelayRequest protobuf_request;
119 base::TimeDelta timeout =
120 base::TimeDelta::FromMilliseconds(kSuspendDelayTimeoutMs);
121 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.
122 protobuf_request.set_timeout(timeout.ToInternalValue());
123
124 if (!writer.AppendProtoAsArrayOfBytes(protobuf_request)) {
125 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.
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_delay_id_) {
140 LOG(ERROR) << "Destroying PowerManagerClientImpl without a delay_id_";
141 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.
142 }
143
144 dbus::MethodCall method_call(
145 power_manager::kPowerManagerInterface,
146 power_manager::kUnregisterSuspendDelayMethod);
147 dbus::MessageWriter writer(&method_call);
148
149 power_manager::UnregisterSuspendDelayRequest protobuf;
150 protobuf.Clear();
151 protobuf.set_delay_id(delay_id_);
152
153 power_manager_proxy_->CallMethod(
154 &method_call,
155 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
156 dbus::ObjectProxy::EmptyResponseCallback());
102 } 157 }
103 158
104 // PowerManagerClient overrides: 159 // PowerManagerClient overrides:
105 160
106 virtual void AddObserver(Observer* observer) OVERRIDE { 161 virtual void AddObserver(Observer* observer) OVERRIDE {
107 CHECK(observer); // http://crbug.com/119976 162 CHECK(observer); // http://crbug.com/119976
108 observers_.AddObserver(observer); 163 observers_.AddObserver(observer);
109 } 164 }
110 165
111 virtual void RemoveObserver(Observer* observer) OVERRIDE { 166 virtual void RemoveObserver(Observer* observer) OVERRIDE {
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after
437 return; 492 return;
438 } 493 }
439 dbus::MessageReader reader(response); 494 dbus::MessageReader reader(response);
440 double percent = 0.0; 495 double percent = 0.0;
441 if (!reader.PopDouble(&percent)) 496 if (!reader.PopDouble(&percent))
442 LOG(ERROR) << "Error reading response from powerd: " 497 LOG(ERROR) << "Error reading response from powerd: "
443 << response->ToString(); 498 << response->ToString();
444 callback.Run(percent); 499 callback.Run(percent);
445 } 500 }
446 501
502 void OnRegisterSuspendDelayReply(
503 dbus::Response* response) {
Daniel Erat 2013/01/08 00:51:35 nit: unwrap this line
marcheu 2013/01/10 01:03:49 Done.
504 if (!response) {
505 LOG(ERROR) << "Error calling "
506 << power_manager::kRegisterSuspendDelayMethod;
507 return;
508 }
509 dbus::MessageReader reader(response);
510 power_manager::RegisterSuspendDelayReply protobuf;
511 if (!reader.PopArrayOfBytesAsProto(&protobuf)) {
512 LOG(ERROR) << "Error calling "
513 << power_manager::kRegisterSuspendDelayMethod
514 << 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.
515 return;
516 }
517 delay_id_ = protobuf.delay_id();
518 has_delay_id_ = true;
519 }
520
447 void IdleNotifySignalReceived(dbus::Signal* signal) { 521 void IdleNotifySignalReceived(dbus::Signal* signal) {
448 dbus::MessageReader reader(signal); 522 dbus::MessageReader reader(signal);
449 int64 threshold = 0; 523 int64 threshold = 0;
450 if (!reader.PopInt64(&threshold)) { 524 if (!reader.PopInt64(&threshold)) {
451 LOG(ERROR) << "Idle Notify signal had incorrect parameters: " 525 LOG(ERROR) << "Idle Notify signal had incorrect parameters: "
452 << signal->ToString(); 526 << signal->ToString();
453 return; 527 return;
454 } 528 }
455 DCHECK_GT(threshold, 0); 529 DCHECK_GT(threshold, 0);
456 530
(...skipping 17 matching lines...) Expand all
474 break; 548 break;
475 case power_manager::kSoftwareScreenDimmingIdle: 549 case power_manager::kSoftwareScreenDimmingIdle:
476 state = Observer::SCREEN_DIMMING_IDLE; 550 state = Observer::SCREEN_DIMMING_IDLE;
477 break; 551 break;
478 default: 552 default:
479 LOG(ERROR) << "Unhandled screen dimming state " << signal_state; 553 LOG(ERROR) << "Unhandled screen dimming state " << signal_state;
480 } 554 }
481 FOR_EACH_OBSERVER(Observer, observers_, ScreenDimmingRequested(state)); 555 FOR_EACH_OBSERVER(Observer, observers_, ScreenDimmingRequested(state));
482 } 556 }
483 557
558 void SuspendImminentReceived(dbus::Signal* signal) {
559 if (!has_delay_id_) {
560 LOG(ERROR) << "Received unrequested "
561 << power_manager::kSuspendImminentSignal << " signal";
562 return;
563 }
564
565 dbus::MessageReader reader(signal);
566 power_manager::SuspendImminent protobuf_imminent;
567 if (!reader.PopArrayOfBytesAsProto(&protobuf_imminent)) {
568 LOG(ERROR) << "Unable to decode protocol buffer from "
569 << power_manager::kSuspendImminentSignal << " signal";
570 return;
571 }
572 int32 suspend_id = protobuf_imminent.suspend_id();
573
574 FOR_EACH_OBSERVER(Observer, observers_, SuspendImminent());
575
576 dbus::MethodCall method_call(
577 power_manager::kPowerManagerInterface,
578 power_manager::kHandleSuspendReadinessMethod);
Daniel Erat 2013/01/08 00:51:35 nit: fix indenting
marcheu 2013/01/10 01:03:49 Done.
579 dbus::MessageWriter writer(&method_call);
580
581 power_manager::SuspendReadinessInfo protobuf_request;
582 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.
583 protobuf_request.set_delay_id(delay_id_);
584 protobuf_request.set_suspend_id(suspend_id);
585
586 if (!writer.AppendProtoAsArrayOfBytes(protobuf_request)) {
587 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.
588 << power_manager::kHandleSuspendReadinessMethod;
589 return;
590 }
591 power_manager_proxy_->CallMethod(
592 &method_call,
593 dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
594 dbus::ObjectProxy::EmptyResponseCallback());
595 }
596
484 void InputEventReceived(dbus::Signal* signal) { 597 void InputEventReceived(dbus::Signal* signal) {
485 dbus::MessageReader reader(signal); 598 dbus::MessageReader reader(signal);
486 power_manager::InputEvent proto; 599 power_manager::InputEvent proto;
487 if (!reader.PopArrayOfBytesAsProto(&proto)) { 600 if (!reader.PopArrayOfBytesAsProto(&proto)) {
488 LOG(ERROR) << "Unable to decode protocol buffer from " 601 LOG(ERROR) << "Unable to decode protocol buffer from "
489 << power_manager::kInputEventSignal << " signal"; 602 << power_manager::kInputEventSignal << " signal";
490 return; 603 return;
491 } 604 }
492 605
493 base::TimeTicks timestamp = 606 base::TimeTicks timestamp =
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
535 FOR_EACH_OBSERVER( 648 FOR_EACH_OBSERVER(
536 PowerManagerClient::Observer, observers_, 649 PowerManagerClient::Observer, observers_,
537 SystemResumed(wall_time - last_suspend_wall_time_)); 650 SystemResumed(wall_time - last_suspend_wall_time_));
538 break; 651 break;
539 } 652 }
540 } 653 }
541 654
542 dbus::ObjectProxy* power_manager_proxy_; 655 dbus::ObjectProxy* power_manager_proxy_;
543 ObserverList<Observer> observers_; 656 ObserverList<Observer> observers_;
544 657
658 // The delay_id_ obtained from the RegisterSuspendDelay request.
659 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.
660 bool has_delay_id_;
661
545 // Wall time from the latest signal telling us that the system was about to 662 // Wall time from the latest signal telling us that the system was about to
546 // suspend to memory. 663 // suspend to memory.
547 base::Time last_suspend_wall_time_; 664 base::Time last_suspend_wall_time_;
548 665
549 // Note: This should remain the last member so it'll be destroyed and 666 // Note: This should remain the last member so it'll be destroyed and
550 // invalidate its weak pointers before any other members are destroyed. 667 // invalidate its weak pointers before any other members are destroyed.
551 base::WeakPtrFactory<PowerManagerClientImpl> weak_ptr_factory_; 668 base::WeakPtrFactory<PowerManagerClientImpl> weak_ptr_factory_;
552 669
553 DISALLOW_COPY_AND_ASSIGN(PowerManagerClientImpl); 670 DISALLOW_COPY_AND_ASSIGN(PowerManagerClientImpl);
554 }; 671 };
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
714 PowerManagerClient* PowerManagerClient::Create( 831 PowerManagerClient* PowerManagerClient::Create(
715 DBusClientImplementationType type, 832 DBusClientImplementationType type,
716 dbus::Bus* bus) { 833 dbus::Bus* bus) {
717 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) 834 if (type == REAL_DBUS_CLIENT_IMPLEMENTATION)
718 return new PowerManagerClientImpl(bus); 835 return new PowerManagerClientImpl(bus);
719 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type); 836 DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type);
720 return new PowerManagerClientStubImpl(); 837 return new PowerManagerClientStubImpl();
721 } 838 }
722 839
723 } // namespace chromeos 840 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698