blob: 42ca2ea38f3a69bb2305f330b2a17380d789bb2f [file] [log] [blame]
Gary Morain43bc6272012-01-30 14:01:15 -08001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Darin Petkovca621542012-07-25 14:25:56 +02005#ifndef SHILL_POWER_MANAGER_H_
6#define SHILL_POWER_MANAGER_H_
Gary Morain43bc6272012-01-30 14:01:15 -08007
8// This class instantiates a PowerManagerProxy and distributes power events to
9// registered users. It also provides a means for calling methods on the
10// PowerManagerProxy.
11//
12// Usage:
13//
14// Registering for power state changes is done as follows:
15//
16// class Foo {
17// public:
18// void HandleStateChange(PowerManager::SuspendState new_state);
19// };
20// Foo foo;
21// PowerManager power_manager(ProxyFactory::GetInstance());
Eric Shienbrood3e20a232012-02-16 11:35:56 -050022// PowerManager::PowerStateCallback cb = Bind(&Foo::HandleStateChange, &foo);
Gary Morain43bc6272012-01-30 14:01:15 -080023// power_manager.AddStateChangeCallback("foo_key", cb);
24//
Eric Shienbrood3e20a232012-02-16 11:35:56 -050025// Note that depending on the definition of Foo, "&foo" may need to appear
26// inside an appropriate wrapper, such as base::Unretained.
27//
Gary Morain43bc6272012-01-30 14:01:15 -080028// Whenever the power state changes, foo.HandleStateChange() is called with the
Eric Shienbrood3e20a232012-02-16 11:35:56 -050029// new state passed in. To unregister:
Gary Morain43bc6272012-01-30 14:01:15 -080030//
31// power_manager.RemoveStateChangeCallback("foo_key");
Gary Morain43bc6272012-01-30 14:01:15 -080032
33#include <map>
34#include <string>
35
Eric Shienbrood3e20a232012-02-16 11:35:56 -050036#include <base/callback.h>
Darin Petkov3ec55342012-09-28 14:04:44 +020037#include <base/cancelable_callback.h>
Eric Shienbrood3e20a232012-02-16 11:35:56 -050038#include <base/memory/scoped_ptr.h>
Gary Morain43bc6272012-01-30 14:01:15 -080039
40#include "shill/power_manager_proxy_interface.h"
41
42namespace shill {
43
Darin Petkov3ec55342012-09-28 14:04:44 +020044class EventDispatcher;
Gary Morain43bc6272012-01-30 14:01:15 -080045class ProxyFactory;
46
47class PowerManager : public PowerManagerProxyDelegate {
48 public:
49 typedef PowerManagerProxyDelegate::SuspendState SuspendState;
50
51 // Callbacks registered with the power manager are of this type. They take
52 // one argument, the new power state. The callback function or method should
53 // look like this:
54 //
55 // void HandlePowerStateChange(PowerStateCallbacks::SuspendState);
Eric Shienbrood3e20a232012-02-16 11:35:56 -050056 typedef base::Callback<void(SuspendState)> PowerStateCallback;
Gary Morain43bc6272012-01-30 14:01:15 -080057
Gary Morain52fabab2012-08-22 09:27:31 -070058 // This callback is called prior to a suspend event. When it is OK for the
Daniel Erat0818cca2012-12-14 10:16:21 -080059 // system to suspend, this callback should call ReportSuspendReadiness(),
60 // passing it the suspend ID passed to this callback.
61 typedef base::Callback<void(int)> SuspendDelayCallback;
Gary Morain52fabab2012-08-22 09:27:31 -070062
Darin Petkov3ec55342012-09-28 14:04:44 +020063 static const int kSuspendTimeoutMilliseconds;
64
Gary Morain43bc6272012-01-30 14:01:15 -080065 // |proxy_factory| creates the PowerManagerProxy. Usually this is
66 // ProxyFactory::GetInstance(). Use a fake for testing.
Darin Petkov3ec55342012-09-28 14:04:44 +020067 PowerManager(EventDispatcher *dispatcher,
68 ProxyFactory *proxy_factory);
Gary Morain43bc6272012-01-30 14:01:15 -080069 virtual ~PowerManager();
70
Darin Petkovca621542012-07-25 14:25:56 +020071 SuspendState power_state() const { return power_state_; }
72
Gary Morain43bc6272012-01-30 14:01:15 -080073 // Methods inherited from PowerManagerProxyDelegate.
Daniel Erat0818cca2012-12-14 10:16:21 -080074 virtual void OnSuspendImminent(int suspend_id);
Gary Morain43bc6272012-01-30 14:01:15 -080075 virtual void OnPowerStateChanged(SuspendState new_power_state);
76
Darin Petkov3ec55342012-09-28 14:04:44 +020077 // See corresponding methods in PowerManagerProxyInterface.
Daniel Eratf9753672013-01-24 10:17:02 -080078 virtual bool RegisterSuspendDelay(base::TimeDelta timeout,
79 const std::string &description,
80 int *delay_id_out);
Daniel Erat0818cca2012-12-14 10:16:21 -080081 virtual bool UnregisterSuspendDelay(int delay_id);
82 virtual bool ReportSuspendReadiness(int delay_id, int suspend_id);
Gary Morain43bc6272012-01-30 14:01:15 -080083
84 // Registers a power state change callback with the power manager. When a
85 // power state change occurs, this callback will be called with the new power
Eric Shienbrood3e20a232012-02-16 11:35:56 -050086 // state as its argument. |key| must be unique.
Gary Morainac1bdb42012-02-16 17:42:29 -080087 virtual void AddStateChangeCallback(const std::string &key,
Eric Shienbrood3e20a232012-02-16 11:35:56 -050088 const PowerStateCallback &callback);
Gary Morain43bc6272012-01-30 14:01:15 -080089
Gary Morain52fabab2012-08-22 09:27:31 -070090 // Registers a suspend delay callback with the power manager. This callback
91 // will be called prior to a suspend event by the amount specified in the most
92 // recent call to RegisterSuspendDelay(). |key| must be unique.
93 virtual void AddSuspendDelayCallback(const std::string &key,
94 const SuspendDelayCallback &callback);
95
96 // Unregisters a power state change callback identified by |key|. The
97 // callback must have been previously registered and not yet removed.
Gary Morainac1bdb42012-02-16 17:42:29 -080098 virtual void RemoveStateChangeCallback(const std::string &key);
Gary Morain43bc6272012-01-30 14:01:15 -080099
Gary Morain52fabab2012-08-22 09:27:31 -0700100 // Unregisters a suspend delay callback identified by |key|. The callback
101 // must have been previously registered and not yet removed.
102 virtual void RemoveSuspendDelayCallback(const std::string &key);
Gary Morain43bc6272012-01-30 14:01:15 -0800103
104 private:
Darin Petkovca621542012-07-25 14:25:56 +0200105 friend class ManagerTest;
Darin Petkov3ec55342012-09-28 14:04:44 +0200106 friend class PowerManagerTest;
Darin Petkovcb0b5662012-12-13 09:59:44 +0100107 friend class ServiceTest;
Darin Petkovca621542012-07-25 14:25:56 +0200108
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500109 typedef std::map<const std::string, PowerStateCallback>
Gary Morain43bc6272012-01-30 14:01:15 -0800110 StateChangeCallbackMap;
111
Gary Morain52fabab2012-08-22 09:27:31 -0700112 typedef std::map<const std::string, SuspendDelayCallback>
113 SuspendDelayCallbackMap;
114
Darin Petkov3ec55342012-09-28 14:04:44 +0200115 void OnSuspendTimeout();
116
Gary Morain52fabab2012-08-22 09:27:31 -0700117 template<class Callback>
118 void AddCallback(const std::string &key, const Callback &callback,
119 std::map<const std::string, Callback> *callback_map);
120
121 template<class Callback>
122 void RemoveCallback(const std::string &key,
123 std::map<const std::string, Callback> *callback_map);
124
125 template<class Param, class Callback>
126 void OnEvent(const Param &param,
127 std::map<const std::string, Callback> *callback_map) const;
128
Darin Petkov3ec55342012-09-28 14:04:44 +0200129 EventDispatcher *dispatcher_;
Gary Morain52fabab2012-08-22 09:27:31 -0700130
Gary Morain43bc6272012-01-30 14:01:15 -0800131 // The power manager proxy created by this class. It dispatches the inherited
132 // delegate methods of this object when changes in the power state occur.
133 const scoped_ptr<PowerManagerProxyInterface> power_manager_proxy_;
134 StateChangeCallbackMap state_change_callbacks_;
Gary Morain52fabab2012-08-22 09:27:31 -0700135 SuspendDelayCallbackMap suspend_delay_callbacks_;
Darin Petkov3ec55342012-09-28 14:04:44 +0200136 base::CancelableClosure suspend_timeout_;
Gary Morain43bc6272012-01-30 14:01:15 -0800137
Darin Petkovca621542012-07-25 14:25:56 +0200138 SuspendState power_state_;
139
Gary Morain43bc6272012-01-30 14:01:15 -0800140 DISALLOW_COPY_AND_ASSIGN(PowerManager);
141};
142
143} // namespace shill
144
Darin Petkovca621542012-07-25 14:25:56 +0200145#endif // SHILL_POWER_MANAGER_H_