blob: ac225ee3e4c78ec3282fa7cb113005634756d89d [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>
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
Darin Petkovca621542012-07-25 14:25:56 +020061 SuspendState power_state() const { return power_state_; }
62
Gary Morain43bc6272012-01-30 14:01:15 -080063 // Methods inherited from PowerManagerProxyDelegate.
64 virtual void OnSuspendDelay(uint32 sequence_number);
65 virtual void OnPowerStateChanged(SuspendState new_power_state);
66
67 // TODO(gmorain): Add descriptive comment.
68 void RegisterSuspendDelay(const uint32_t &delay_ms);
69
70 // Registers a power state change callback with the power manager. When a
71 // power state change occurs, this callback will be called with the new power
Eric Shienbrood3e20a232012-02-16 11:35:56 -050072 // state as its argument. |key| must be unique.
Gary Morainac1bdb42012-02-16 17:42:29 -080073 virtual void AddStateChangeCallback(const std::string &key,
Eric Shienbrood3e20a232012-02-16 11:35:56 -050074 const PowerStateCallback &callback);
Gary Morain43bc6272012-01-30 14:01:15 -080075
76 // Unregisters a callback identified by |key|. The callback must have been
77 // previously registered and not yet removed. The callback is deleted.
Gary Morainac1bdb42012-02-16 17:42:29 -080078 virtual void RemoveStateChangeCallback(const std::string &key);
Gary Morain43bc6272012-01-30 14:01:15 -080079
80 // TODO(gmorain): Add registration for the OnSuspendDelay event.
81
82 private:
Darin Petkovca621542012-07-25 14:25:56 +020083 friend class ManagerTest;
84
Eric Shienbrood3e20a232012-02-16 11:35:56 -050085 typedef std::map<const std::string, PowerStateCallback>
Gary Morain43bc6272012-01-30 14:01:15 -080086 StateChangeCallbackMap;
87
88 // The power manager proxy created by this class. It dispatches the inherited
89 // delegate methods of this object when changes in the power state occur.
90 const scoped_ptr<PowerManagerProxyInterface> power_manager_proxy_;
91 StateChangeCallbackMap state_change_callbacks_;
92
Darin Petkovca621542012-07-25 14:25:56 +020093 SuspendState power_state_;
94
Gary Morain43bc6272012-01-30 14:01:15 -080095 DISALLOW_COPY_AND_ASSIGN(PowerManager);
96};
97
98} // namespace shill
99
Darin Petkovca621542012-07-25 14:25:56 +0200100#endif // SHILL_POWER_MANAGER_H_