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