Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/cli/src/tunnels/nosleep_windows.rs
3314 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
use std::io;
7
8
use winapi::{
9
ctypes::c_void,
10
um::{
11
handleapi::CloseHandle,
12
minwinbase::REASON_CONTEXT,
13
winbase::{PowerClearRequest, PowerCreateRequest, PowerSetRequest},
14
winnt::{
15
PowerRequestSystemRequired, POWER_REQUEST_CONTEXT_SIMPLE_STRING,
16
POWER_REQUEST_CONTEXT_VERSION, POWER_REQUEST_TYPE,
17
},
18
},
19
};
20
21
use crate::constants::TUNNEL_ACTIVITY_NAME;
22
23
struct Request(*mut c_void);
24
25
impl Request {
26
pub fn new() -> io::Result<Self> {
27
let mut reason: Vec<u16> = TUNNEL_ACTIVITY_NAME.encode_utf16().chain([0u16]).collect();
28
let mut context = REASON_CONTEXT {
29
Version: POWER_REQUEST_CONTEXT_VERSION,
30
Flags: POWER_REQUEST_CONTEXT_SIMPLE_STRING,
31
Reason: unsafe { std::mem::zeroed() },
32
};
33
unsafe { *context.Reason.SimpleReasonString_mut() = reason.as_mut_ptr() };
34
35
let request = unsafe { PowerCreateRequest(&mut context) };
36
if request.is_null() {
37
return Err(io::Error::last_os_error());
38
}
39
40
Ok(Self(request))
41
}
42
43
pub fn set(&self, request_type: POWER_REQUEST_TYPE) -> io::Result<()> {
44
let result = unsafe { PowerSetRequest(self.0, request_type) };
45
if result == 0 {
46
return Err(io::Error::last_os_error());
47
}
48
49
Ok(())
50
}
51
}
52
53
impl Drop for Request {
54
fn drop(&mut self) {
55
unsafe {
56
CloseHandle(self.0);
57
}
58
}
59
}
60
61
pub struct SleepInhibitor {
62
request: Request,
63
}
64
65
impl SleepInhibitor {
66
pub async fn new() -> io::Result<Self> {
67
let request = Request::new()?;
68
request.set(PowerRequestSystemRequired)?;
69
Ok(Self { request })
70
}
71
}
72
73
impl Drop for SleepInhibitor {
74
fn drop(&mut self) {
75
unsafe {
76
PowerClearRequest(self.request.0, PowerRequestSystemRequired);
77
}
78
}
79
}
80
81