e25d25a4e2ec158f1f45f9b4c9ec5067638033b1
[reactos.git] / dll / win32 / kernel32 / client / power.c
1 /*
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS system libraries
5 * FILE: dll/win32/kernel32/client/power.c
6 * PURPOSE: Power Management Functions
7 * PROGRAMMER: Dmitry Chapyshev <dmitry@reactos.org>
8 *
9 * UPDATE HISTORY:
10 * 01/15/2009 Created
11 */
12
13 #include <k32.h>
14
15 #include <ndk/pofuncs.h>
16
17 #define NDEBUG
18 #include <debug.h>
19
20 /* PUBLIC FUNCTIONS ***********************************************************/
21
22 /*
23 * @implemented
24 */
25 BOOL
26 WINAPI
27 GetSystemPowerStatus(IN LPSYSTEM_POWER_STATUS PowerStatus)
28 {
29 NTSTATUS Status;
30 SYSTEM_BATTERY_STATE BattState;
31 ULONG Max, Current;
32
33 Status = NtPowerInformation(SystemBatteryState,
34 NULL,
35 0,
36 &BattState,
37 sizeof(SYSTEM_BATTERY_STATE));
38 if (!NT_SUCCESS(Status))
39 {
40 BaseSetLastNTError(Status);
41 return FALSE;
42 }
43
44 RtlZeroMemory(PowerStatus, sizeof(SYSTEM_POWER_STATUS));
45
46 PowerStatus->BatteryLifeTime = BATTERY_LIFE_UNKNOWN;
47 PowerStatus->BatteryFullLifeTime = BATTERY_LIFE_UNKNOWN;
48 PowerStatus->BatteryLifePercent = BATTERY_PERCENTAGE_UNKNOWN;
49 PowerStatus->ACLineStatus = AC_LINE_ONLINE;
50
51 Max = BattState.MaxCapacity;
52 Current = BattState.RemainingCapacity;
53 if (Max)
54 {
55 if (Current <= Max)
56 {
57 PowerStatus->BatteryLifePercent = (UCHAR)((100 * Current + Max / 2) / Max);
58 }
59 else
60 {
61 PowerStatus->BatteryLifePercent = 100;
62 }
63
64 if (PowerStatus->BatteryLifePercent <= 32)
65 PowerStatus->BatteryFlag |= BATTERY_FLAG_LOW;
66
67 if (PowerStatus->BatteryLifePercent >= 67)
68 PowerStatus->BatteryFlag |= BATTERY_FLAG_HIGH;
69 }
70
71 if (!BattState.BatteryPresent)
72 PowerStatus->BatteryFlag |= BATTERY_FLAG_NO_BATTERY;
73
74 if (BattState.Charging)
75 PowerStatus->BatteryFlag |= BATTERY_FLAG_CHARGING;
76
77 if (!(BattState.AcOnLine) && (BattState.BatteryPresent))
78 PowerStatus->ACLineStatus = AC_LINE_OFFLINE;
79
80 if (BattState.EstimatedTime)
81 PowerStatus->BatteryLifeTime = BattState.EstimatedTime;
82
83 return TRUE;
84 }
85
86 /*
87 * @implemented
88 */
89 BOOL
90 WINAPI
91 SetSystemPowerState(IN BOOL fSuspend,
92 IN BOOL fForce)
93 {
94 NTSTATUS Status;
95
96 Status = NtInitiatePowerAction((fSuspend != FALSE) ? PowerActionSleep : PowerActionHibernate,
97 (fSuspend != FALSE) ? PowerSystemSleeping1 : PowerSystemHibernate,
98 (fForce == FALSE),
99 FALSE);
100 if (!NT_SUCCESS(Status))
101 {
102 BaseSetLastNTError(Status);
103 return FALSE;
104 }
105
106 return TRUE;
107 }
108
109 /*
110 * @implemented
111 */
112 BOOL
113 WINAPI
114 GetDevicePowerState(IN HANDLE hDevice,
115 OUT BOOL *pfOn)
116 {
117 DEVICE_POWER_STATE DevicePowerState;
118 NTSTATUS Status;
119
120 Status = NtGetDevicePowerState(hDevice, &DevicePowerState);
121 if (NT_SUCCESS(Status))
122 {
123 *pfOn = (DevicePowerState == PowerDeviceUnspecified) ||
124 (DevicePowerState == PowerDeviceD0);
125 return TRUE;
126 }
127
128 BaseSetLastNTError(Status);
129 return FALSE;
130 }
131
132 /*
133 * @implemented
134 */
135 BOOL
136 WINAPI
137 RequestDeviceWakeup(IN HANDLE hDevice)
138 {
139 NTSTATUS Status;
140
141 Status = NtRequestDeviceWakeup(hDevice);
142 if (!NT_SUCCESS(Status))
143 {
144 BaseSetLastNTError(Status);
145 return FALSE;
146 }
147
148 return TRUE;
149 }
150
151 /*
152 * @implemented
153 */
154 BOOL
155 WINAPI
156 RequestWakeupLatency(IN LATENCY_TIME latency)
157 {
158 NTSTATUS Status;
159
160 Status = NtRequestWakeupLatency(latency);
161 if (!NT_SUCCESS(Status))
162 {
163 BaseSetLastNTError(Status);
164 return FALSE;
165 }
166
167 return TRUE;
168 }
169
170 /*
171 * @implemented
172 */
173 BOOL
174 WINAPI
175 CancelDeviceWakeupRequest(IN HANDLE hDevice)
176 {
177 NTSTATUS Status;
178
179 Status = NtCancelDeviceWakeupRequest(hDevice);
180 if (!NT_SUCCESS(Status))
181 {
182 BaseSetLastNTError(Status);
183 return FALSE;
184 }
185
186 return TRUE;
187 }
188
189 /*
190 * @implemented
191 */
192 BOOL
193 WINAPI
194 IsSystemResumeAutomatic(VOID)
195 {
196 return (BOOL)NtIsSystemResumeAutomatic();
197 }
198
199 /*
200 * @implemented
201 */
202 BOOL
203 WINAPI
204 SetMessageWaitingIndicator(IN HANDLE hMsgIndicator,
205 IN ULONG ulMsgCount)
206 {
207 /* This is the correct Windows implementation */
208 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
209 return 0;
210 }
211
212 /*
213 * @implemented
214 */
215 EXECUTION_STATE
216 WINAPI
217 SetThreadExecutionState(EXECUTION_STATE esFlags)
218 {
219 NTSTATUS Status;
220
221 Status = NtSetThreadExecutionState(esFlags, &esFlags);
222 if (!NT_SUCCESS(Status))
223 {
224 BaseSetLastNTError(Status);
225 return 0;
226 }
227
228 return esFlags;
229 }