blob: e6adad78234c7dafbdd935acf825499719ca20a4 [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
5#ifndef SHILL_POWER_MANAGER_
6#define SHILL_POWER_MANAGER_
7
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>
37#include <base/memory/scoped_ptr.h>
Gary Morain43bc6272012-01-30 14:01:15 -080038
39#include "shill/power_manager_proxy_interface.h"
40
41namespace shill {
42
43class ProxyFactory;
44
45class PowerManager : public PowerManagerProxyDelegate {
46 public:
47 typedef PowerManagerProxyDelegate::SuspendState SuspendState;
48
49 // Callbacks registered with the power manager are of this type. They take
50 // one argument, the new power state. The callback function or method should
51 // look like this:
52 //
53 // void HandlePowerStateChange(PowerStateCallbacks::SuspendState);
Eric Shienbrood3e20a232012-02-16 11:35:56 -050054 typedef base::Callback<void(SuspendState)> PowerStateCallback;
Gary Morain43bc6272012-01-30 14:01:15 -080055
56 // |proxy_factory| creates the PowerManagerProxy. Usually this is
57 // ProxyFactory::GetInstance(). Use a fake for testing.
58 explicit PowerManager(ProxyFactory *proxy_factory);
59 virtual ~PowerManager();
60
61 // Methods inherited from PowerManagerProxyDelegate.
62 virtual void OnSuspendDelay(uint32 sequence_number);
63 virtual void OnPowerStateChanged(SuspendState new_power_state);
64
65 // TODO(gmorain): Add descriptive comment.
66 void RegisterSuspendDelay(const uint32_t &delay_ms);
67
68 // Registers a power state change callback with the power manager. When a
69 // power state change occurs, this callback will be called with the new power
Eric Shienbrood3e20a232012-02-16 11:35:56 -050070 // state as its argument. |key| must be unique.
Gary Morainac1bdb42012-02-16 17:42:29 -080071 virtual void AddStateChangeCallback(const std::string &key,
Eric Shienbrood3e20a232012-02-16 11:35:56 -050072 const PowerStateCallback &callback);
Gary Morain43bc6272012-01-30 14:01:15 -080073
74 // Unregisters a callback identified by |key|. The callback must have been
75 // previously registered and not yet removed. The callback is deleted.
Gary Morainac1bdb42012-02-16 17:42:29 -080076 virtual void RemoveStateChangeCallback(const std::string &key);
Gary Morain43bc6272012-01-30 14:01:15 -080077
78 // TODO(gmorain): Add registration for the OnSuspendDelay event.
79
80 private:
Eric Shienbrood3e20a232012-02-16 11:35:56 -050081 typedef std::map<const std::string, PowerStateCallback>
Gary Morain43bc6272012-01-30 14:01:15 -080082 StateChangeCallbackMap;
83
84 // The power manager proxy created by this class. It dispatches the inherited
85 // delegate methods of this object when changes in the power state occur.
86 const scoped_ptr<PowerManagerProxyInterface> power_manager_proxy_;
87 StateChangeCallbackMap state_change_callbacks_;
88
89 DISALLOW_COPY_AND_ASSIGN(PowerManager);
90};
91
92} // namespace shill
93
94#endif // SHILL_POWER_MANAGER_