use std::sync::Arc;
use crate::Result;
use avahi_sys::{
AvahiClient, AvahiIfIndex, AvahiLookupFlags, AvahiProtocol, AvahiServiceBrowser,
AvahiServiceBrowserCallback, avahi_service_browser_free, avahi_service_browser_get_client,
avahi_service_browser_new,
};
use libc::{c_char, c_void};
use super::client::ManagedAvahiClient;
#[derive(Debug)]
pub struct ManagedAvahiServiceBrowser {
inner: *mut AvahiServiceBrowser,
_client: Arc<ManagedAvahiClient>,
}
impl ManagedAvahiServiceBrowser {
pub unsafe fn new(
ManagedAvahiServiceBrowserParams {
client,
interface,
protocol,
kind,
domain,
flags,
callback,
userdata,
}: ManagedAvahiServiceBrowserParams,
) -> Result<Self> {
let inner = unsafe {
avahi_service_browser_new(
client.inner,
interface,
protocol,
kind,
domain,
flags,
callback,
userdata,
)
};
if inner.is_null() {
Err("could not initialize Avahi service browser".into())
} else {
Ok(Self {
inner,
_client: client,
})
}
}
pub unsafe fn get_client(&self) -> *mut AvahiClient {
unsafe { avahi_service_browser_get_client(self.inner) }
}
}
impl Drop for ManagedAvahiServiceBrowser {
fn drop(&mut self) {
unsafe { avahi_service_browser_free(self.inner) };
}
}
unsafe impl Send for ManagedAvahiServiceBrowser {}
unsafe impl Sync for ManagedAvahiServiceBrowser {}
#[derive(Builder, BuilderDelegate)]
pub struct ManagedAvahiServiceBrowserParams {
client: Arc<ManagedAvahiClient>,
interface: AvahiIfIndex,
protocol: AvahiProtocol,
kind: *const c_char,
domain: *const c_char,
flags: AvahiLookupFlags,
callback: AvahiServiceBrowserCallback,
userdata: *mut c_void,
}