blob: fc3df48a7349287bb1cde00946c183aa590158ae (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef BASE_POWER_MONITOR_POWER_MONITOR_H_
#define BASE_POWER_MONITOR_POWER_MONITOR_H_
#include "base/base_export.h"
#include "base/basictypes.h"
#include "base/memory/ref_counted.h"
#include "base/observer_list_threadsafe.h"
#include "base/power_monitor/power_observer.h"
#if defined(OS_WIN)
#include <windows.h>
// Windows HiRes timers drain the battery faster so we need to know the battery
// status. This isn't true for other platforms.
#define ENABLE_BATTERY_MONITORING 1
#else
#undef ENABLE_BATTERY_MONITORING
#endif // !OS_WIN
#if defined(ENABLE_BATTERY_MONITORING)
#include "base/timer/timer.h"
#endif // defined(ENABLE_BATTERY_MONITORING)
#if defined(OS_IOS)
#include <objc/runtime.h>
#endif // OS_IOS
namespace base {
// A class used to monitor the power state change and notify the observers about
// the change event.
class BASE_EXPORT PowerMonitor {
public:
// Normalized list of power events.
enum PowerEvent {
POWER_STATE_EVENT, // The Power status of the system has changed.
SUSPEND_EVENT, // The system is being suspended.
RESUME_EVENT // The system is being resumed.
};
PowerMonitor();
~PowerMonitor();
// Get the application-wide PowerMonitor (if not present, returns NULL).
static PowerMonitor* Get();
#if defined(OS_MACOSX)
// Allocate system resources needed by the PowerMonitor class.
//
// This function must be called before instantiating an instance of the class
// and before the Sandbox is initialized.
#if !defined(OS_IOS)
static void AllocateSystemIOPorts();
#else
static void AllocateSystemIOPorts() {}
#endif // OS_IOS
#endif // OS_MACOSX
// Add and remove an observer.
// Can be called from any thread.
// Must not be called from within a notification callback.
void AddObserver(PowerObserver* observer);
void RemoveObserver(PowerObserver* observer);
// Is the computer currently on battery power. Can be called on any thread.
bool BatteryPower() const {
// Using a lock here is not necessary for just a bool.
return battery_in_use_;
}
private:
friend class PowerMonitorTest;
// A friend function that is allowed to access the private ProcessPowerEvent.
friend void ProcessPowerEventHelper(PowerEvent);
#if defined(OS_WIN)
// Represents a message-only window for power message handling on Windows.
// Only allow PowerMonitor to create it.
class PowerMessageWindow {
public:
PowerMessageWindow();
~PowerMessageWindow();
private:
void ProcessWmPowerBroadcastMessage(int event_id);
LRESULT CALLBACK WndProc(HWND hwnd, UINT message,
WPARAM wparam, LPARAM lparam);
static LRESULT CALLBACK WndProcThunk(HWND hwnd,
UINT message,
WPARAM wparam,
LPARAM lparam);
// Instance of the module containing the window procedure.
HMODULE instance_;
// A hidden message-only window.
HWND message_hwnd_;
};
#endif // OS_WIN
#if defined(OS_MACOSX)
void PlatformInit();
void PlatformDestroy();
#endif
// Cross-platform handling of a power event.
void ProcessPowerEvent(PowerEvent event_id);
// Platform-specific method to check whether the system is currently
// running on battery power. Returns true if running on batteries,
// false otherwise.
bool IsBatteryPower();
// Checks the battery status and notifies observers if the battery
// status has changed.
void BatteryCheck();
void NotifyPowerStateChange();
void NotifySuspend();
void NotifyResume();
#if defined(OS_IOS)
// Holds pointers to system event notification observers.
std::vector<id> notification_observers_;
#endif
#if defined(ENABLE_BATTERY_MONITORING)
base::OneShotTimer<PowerMonitor> delayed_battery_check_;
#endif
scoped_refptr<ObserverListThreadSafe<PowerObserver> > observers_;
bool battery_in_use_;
bool suspended_;
#if defined(OS_WIN)
PowerMessageWindow power_message_window_;
#endif
DISALLOW_COPY_AND_ASSIGN(PowerMonitor);
};
} // namespace base
#endif // BASE_POWER_MONITOR_POWER_MONITOR_H_
|