pub struct UserEventCode(/* private fields */);Expand description
Struct describing a user-defined control code (128 to 255)
Implementations§
Source§impl UserEventCode
impl UserEventCode
Sourcepub const unsafe fn from_unchecked(raw: u32) -> Self
pub const unsafe fn from_unchecked(raw: u32) -> Self
Mainly for declaring user events as constants:
const MY_EVENT: UserEventCode = unsafe { UserEventCode::from_unchecked(130) };§Safety
raw should be a valid user control code in the range of 128 to 255.
pub fn from_raw(raw: u32) -> Result<UserEventCode, ParseRawError>
Sourcepub fn to_raw(&self) -> u32
pub fn to_raw(&self) -> u32
Examples found in repository?
examples/ping_service.rs (line 90)
71 pub fn run_service() -> Result<()> {
72 // Create a channel to be able to poll a stop event from the service worker loop.
73 let (shutdown_tx, shutdown_rx) = mpsc::channel();
74
75 // Define system service event handler that will be receiving service events.
76 let event_handler = move |control_event| -> ServiceControlHandlerResult {
77 match control_event {
78 // Notifies a service to report its current status information to the service
79 // control manager. Always return NoError even if not implemented.
80 ServiceControl::Interrogate => ServiceControlHandlerResult::NoError,
81
82 // Handle stop
83 ServiceControl::Stop => {
84 shutdown_tx.send(()).unwrap();
85 ServiceControlHandlerResult::NoError
86 }
87
88 // treat the UserEvent as a stop request
89 ServiceControl::UserEvent(code) => {
90 if code.to_raw() == 130 {
91 shutdown_tx.send(()).unwrap();
92 }
93 ServiceControlHandlerResult::NoError
94 }
95
96 _ => ServiceControlHandlerResult::NotImplemented,
97 }
98 };
99
100 // Register system service event handler.
101 // The returned status handle should be used to report service status changes to the system.
102 let status_handle = service_control_handler::register(SERVICE_NAME, event_handler)?;
103
104 // Tell the system that service is running
105 status_handle.set_service_status(ServiceStatus {
106 service_type: SERVICE_TYPE,
107 current_state: ServiceState::Running,
108 controls_accepted: ServiceControlAccept::STOP,
109 exit_code: ServiceExitCode::Win32(0),
110 checkpoint: 0,
111 wait_hint: Duration::default(),
112 process_id: None,
113 })?;
114
115 // For demo purposes this service sends a UDP packet once a second.
116 let loopback_ip = IpAddr::from(LOOPBACK_ADDR);
117 let sender_addr = SocketAddr::new(loopback_ip, 0);
118 let receiver_addr = SocketAddr::new(loopback_ip, RECEIVER_PORT);
119 let msg = PING_MESSAGE.as_bytes();
120 let socket = UdpSocket::bind(sender_addr).unwrap();
121
122 loop {
123 let _ = socket.send_to(msg, receiver_addr);
124
125 // Poll shutdown event.
126 match shutdown_rx.recv_timeout(Duration::from_secs(1)) {
127 // Break the loop either upon stop or channel disconnect
128 Ok(_) | Err(mpsc::RecvTimeoutError::Disconnected) => break,
129
130 // Continue work if no events were received within the timeout
131 Err(mpsc::RecvTimeoutError::Timeout) => (),
132 };
133 }
134
135 // Tell the system that service has stopped.
136 status_handle.set_service_status(ServiceStatus {
137 service_type: SERVICE_TYPE,
138 current_state: ServiceState::Stopped,
139 controls_accepted: ServiceControlAccept::empty(),
140 exit_code: ServiceExitCode::Win32(0),
141 checkpoint: 0,
142 wait_hint: Duration::default(),
143 process_id: None,
144 })?;
145
146 Ok(())
147 }Trait Implementations§
Source§impl Clone for UserEventCode
impl Clone for UserEventCode
Source§fn clone(&self) -> UserEventCode
fn clone(&self) -> UserEventCode
Returns a duplicate of the value. Read more
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Debug for UserEventCode
impl Debug for UserEventCode
Source§impl Hash for UserEventCode
impl Hash for UserEventCode
Source§impl PartialEq for UserEventCode
impl PartialEq for UserEventCode
impl Copy for UserEventCode
impl Eq for UserEventCode
impl StructuralPartialEq for UserEventCode
Auto Trait Implementations§
impl Freeze for UserEventCode
impl RefUnwindSafe for UserEventCode
impl Send for UserEventCode
impl Sync for UserEventCode
impl Unpin for UserEventCode
impl UnwindSafe for UserEventCode
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more