use crate::Result;
use crate::{avahi::avahi_util, error::Error};
use avahi_sys::{
AvahiSimplePoll, avahi_simple_poll_free, avahi_simple_poll_iterate, avahi_simple_poll_loop,
avahi_simple_poll_new,
};
use std::{convert::TryInto, time::Duration};
#[derive(Debug)]
pub struct ManagedAvahiSimplePoll(*mut AvahiSimplePoll);
impl ManagedAvahiSimplePoll {
pub unsafe fn new() -> Result<Self> {
let poll = unsafe { avahi_simple_poll_new() };
if poll.is_null() {
Err("could not initialize AvahiSimplePoll".into())
} else {
Ok(Self(poll))
}
}
pub unsafe fn start_loop(&self) -> Result<()> {
unsafe {
avahi_util::sys_exec(
|| avahi_simple_poll_loop(self.0),
"could not start AvahiSimplePoll",
)
}
}
pub unsafe fn iterate(&self, timeout: Duration) -> Result<()> {
let sleep_time: i32 = timeout
.as_millis() .try_into() .unwrap_or(i32::MAX);
match unsafe { avahi_simple_poll_iterate(self.0, sleep_time) } {
0 | 1 => Ok(()),
-1 => Err(Error::from(
"avahi_simple_poll_iterate(..) threw an error result",
)),
_ => Err(Error::from(
"avahi_simple_poll_iterate(..) returned an unknown result",
)),
}
}
pub(super) fn inner(&self) -> *mut AvahiSimplePoll {
self.0
}
}
impl Drop for ManagedAvahiSimplePoll {
fn drop(&mut self) {
unsafe { avahi_simple_poll_free(self.0) };
}
}
unsafe impl Send for ManagedAvahiSimplePoll {}
unsafe impl Sync for ManagedAvahiSimplePoll {}