1a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// found in the LICENSE file.
4a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
5a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/child/power_monitor_broadcast_source.h"
6a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
7a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/message_loop/message_loop.h"
8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "content/common/power_monitor_messages.h"
95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ipc/message_filter.h"
10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace content {
12a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass PowerMessageFilter : public IPC::MessageFilter {
14a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public:
15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  PowerMessageFilter(
16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      PowerMonitorBroadcastSource* source,
17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      scoped_refptr<base::MessageLoopProxy> message_loop)
18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      : source_(source),
19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        message_loop_(message_loop) {
20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE {
23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    bool handled = true;
24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    IPC_BEGIN_MESSAGE_MAP(PowerMessageFilter, message)
25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      IPC_MESSAGE_HANDLER(PowerMonitorMsg_PowerStateChange, OnPowerStateChange)
26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      IPC_MESSAGE_HANDLER(PowerMonitorMsg_Suspend, OnSuspend)
27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      IPC_MESSAGE_HANDLER(PowerMonitorMsg_Resume, OnResume)
28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      IPC_MESSAGE_UNHANDLED(handled = false)
29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    IPC_END_MESSAGE_MAP()
30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    return handled;
31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void RemoveSource() {
34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    source_ = NULL;
35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private:
38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  friend class base::RefCounted<PowerMessageFilter>;
39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual ~PowerMessageFilter() {};
41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void OnPowerStateChange(bool on_battery_power) {
43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    message_loop_->PostTask(FROM_HERE,
44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        base::Bind(&PowerMessageFilter::NotifySourcePowerStateChange, this,
45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)            on_battery_power));
46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void OnSuspend() {
48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    message_loop_->PostTask(FROM_HERE,
49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        base::Bind(&PowerMessageFilter::NotifySourceSuspend, this));
50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void OnResume() {
52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    message_loop_->PostTask(FROM_HERE,
53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        base::Bind(&PowerMessageFilter::NotifySourceResume, this));
54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void NotifySourcePowerStateChange(bool on_battery_power) {
57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (source_)
58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      source_->OnPowerStateChange(on_battery_power);
59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void NotifySourceSuspend() {
61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (source_)
62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      source_->OnSuspend();
63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void NotifySourceResume() {
65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)     if (source_)
66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      source_->OnResume();
67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // source_ should only be accessed on the thread associated with
70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // message_loop_.
71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  PowerMonitorBroadcastSource* source_;
72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_refptr<base::MessageLoopProxy> message_loop_;
73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PowerMessageFilter);
75a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)PowerMonitorBroadcastSource::PowerMonitorBroadcastSource()
78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    : last_reported_battery_power_state_(false) {
79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  message_filter_ = new PowerMessageFilter(this,
80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      base::MessageLoopProxy::current());
81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
82a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
83a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)PowerMonitorBroadcastSource::~PowerMonitorBroadcastSource() {
84a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  message_filter_->RemoveSource();
85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuIPC::MessageFilter* PowerMonitorBroadcastSource::GetMessageFilter() {
88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return message_filter_.get();
89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
90a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
91a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)bool PowerMonitorBroadcastSource::IsOnBatteryPowerImpl() {
92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return last_reported_battery_power_state_;
93a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void PowerMonitorBroadcastSource::OnPowerStateChange(bool on_battery_power) {
96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  last_reported_battery_power_state_ = on_battery_power;
97a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ProcessPowerEvent(PowerMonitorSource::POWER_STATE_EVENT);
98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
99a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void PowerMonitorBroadcastSource::OnSuspend() {
101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ProcessPowerEvent(PowerMonitorSource::SUSPEND_EVENT);
102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
104a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void PowerMonitorBroadcastSource::OnResume() {
105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ProcessPowerEvent(PowerMonitorSource::RESUME_EVENT);
106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}  // namespace content
109