use crate::{Iterator,Object,Properties,Proxy,SpaPod};
use glib::{prelude::*,signal::{connect_raw, SignalHandlerId},translate::*};
use std::{boxed::Box as Box_,pin::Pin};
glib::wrapper! {
#[doc(alias = "WpPipewireObject")]
pub struct PipewireObject(Interface<ffi::WpPipewireObject, ffi::WpPipewireObjectInterface>) @requires Proxy, Object;
match fn {
type_ => || ffi::wp_pipewire_object_get_type(),
}
}
impl PipewireObject {
pub const NONE: Option<&'static PipewireObject> = None;
}
mod sealed {
pub trait Sealed {}
impl<T: super::IsA<super::PipewireObject>> Sealed for T {}
}
pub trait PipewireObjectExt: IsA<PipewireObject> + sealed::Sealed + 'static {
#[doc(alias = "wp_pipewire_object_enum_params")]
fn enum_params<P: FnOnce(Result<Option<Iterator>, glib::Error>) + 'static>(&self, id: Option<&str>, filter: Option<&SpaPod>, cancellable: Option<&impl IsA<gio::Cancellable>>, callback: P) {
let main_context = glib::MainContext::ref_thread_default();
let is_main_context_owner = main_context.is_owner();
let has_acquired_main_context = (!is_main_context_owner)
.then(|| main_context.acquire().ok())
.flatten();
assert!(
is_main_context_owner || has_acquired_main_context.is_some(),
"Async operations only allowed if the thread is owning the MainContext"
);
let user_data: Box_<glib::thread_guard::ThreadGuard<P>> = Box_::new(glib::thread_guard::ThreadGuard::new(callback));
unsafe extern "C" fn enum_params_trampoline<P: FnOnce(Result<Option<Iterator>, glib::Error>) + 'static>(_source_object: *mut glib::gobject_ffi::GObject, res: *mut gio::ffi::GAsyncResult, user_data: glib::ffi::gpointer) {
let mut error = std::ptr::null_mut();
let ret = ffi::wp_pipewire_object_enum_params_finish(_source_object as *mut _, res, &mut error);
let result = if error.is_null() { Ok(from_glib_full(ret)) } else { Err(from_glib_full(error)) };
let callback: Box_<glib::thread_guard::ThreadGuard<P>> = Box_::from_raw(user_data as *mut _);
let callback: P = callback.into_inner();
callback(result);
}
let callback = enum_params_trampoline::<P>;
unsafe {
ffi::wp_pipewire_object_enum_params(self.as_ref().to_glib_none().0, id.to_glib_none().0, filter.to_glib_none().0, cancellable.map(|p| p.as_ref()).to_glib_none().0, Some(callback), Box_::into_raw(user_data) as *mut _);
}
}
fn enum_params_future(&self, id: Option<&str>, filter: Option<&SpaPod>) -> Pin<Box_<dyn std::future::Future<Output = Result<Option<Iterator>, glib::Error>> + 'static>> {
let id = id.map(ToOwned::to_owned);
let filter = filter.map(ToOwned::to_owned);
Box_::pin(gio::GioFuture::new(self, move |obj, cancellable, send| {
obj.enum_params(
id.as_ref().map(::std::borrow::Borrow::borrow),
filter.as_ref().map(::std::borrow::Borrow::borrow),
Some(cancellable),
move |res| {
send.resolve(res);
},
);
}))
}
#[doc(alias = "wp_pipewire_object_enum_params_sync")]
fn enum_params_sync(&self, id: &str, filter: Option<&SpaPod>) -> Option<Iterator> {
unsafe {
from_glib_full(ffi::wp_pipewire_object_enum_params_sync(self.as_ref().to_glib_none().0, id.to_glib_none().0, filter.to_glib_none().0))
}
}
#[doc(alias = "wp_pipewire_object_get_param_info")]
#[doc(alias = "get_param_info")]
fn param_info(&self) -> Option<glib::Variant> {
unsafe {
from_glib_full(ffi::wp_pipewire_object_get_param_info(self.as_ref().to_glib_none().0))
}
}
#[doc(alias = "wp_pipewire_object_get_properties")]
#[doc(alias = "get_properties")]
fn properties(&self) -> Option<Properties> {
unsafe {
from_glib_full(ffi::wp_pipewire_object_get_properties(self.as_ref().to_glib_none().0))
}
}
#[doc(alias = "wp_pipewire_object_new_properties_iterator")]
fn new_properties_iterator(&self) -> Option<Iterator> {
unsafe {
from_glib_full(ffi::wp_pipewire_object_new_properties_iterator(self.as_ref().to_glib_none().0))
}
}
#[doc(alias = "wp_pipewire_object_set_param")]
fn set_param(&self, id: &str, flags: u32, param: SpaPod) -> bool {
unsafe {
from_glib(ffi::wp_pipewire_object_set_param(self.as_ref().to_glib_none().0, id.to_glib_none().0, flags, param.into_glib_ptr()))
}
}
#[doc(alias = "params-changed")]
fn connect_params_changed<F: Fn(&Self, &str) + 'static>(&self, f: F) -> SignalHandlerId {
unsafe extern "C" fn params_changed_trampoline<P: IsA<PipewireObject>, F: Fn(&P, &str) + 'static>(this: *mut ffi::WpPipewireObject, object: *mut libc::c_char, f: glib::ffi::gpointer) {
let f: &F = &*(f as *const F);
f(PipewireObject::from_glib_borrow(this).unsafe_cast_ref(), &glib::GString::from_glib_borrow(object))
}
unsafe {
let f: Box_<F> = Box_::new(f);
connect_raw(self.as_ptr() as *mut _, b"params-changed\0".as_ptr() as *const _,
Some(std::mem::transmute::<_, unsafe extern "C" fn()>(params_changed_trampoline::<Self, F> as *const ())), Box_::into_raw(f))
}
}
#[doc(alias = "native-info")]
fn connect_native_info_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
unsafe extern "C" fn notify_native_info_trampoline<P: IsA<PipewireObject>, F: Fn(&P) + 'static>(this: *mut ffi::WpPipewireObject, _param_spec: glib::ffi::gpointer, f: glib::ffi::gpointer) {
let f: &F = &*(f as *const F);
f(PipewireObject::from_glib_borrow(this).unsafe_cast_ref())
}
unsafe {
let f: Box_<F> = Box_::new(f);
connect_raw(self.as_ptr() as *mut _, b"notify::native-info\0".as_ptr() as *const _,
Some(std::mem::transmute::<_, unsafe extern "C" fn()>(notify_native_info_trampoline::<Self, F> as *const ())), Box_::into_raw(f))
}
}
#[doc(alias = "param-info")]
fn connect_param_info_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
unsafe extern "C" fn notify_param_info_trampoline<P: IsA<PipewireObject>, F: Fn(&P) + 'static>(this: *mut ffi::WpPipewireObject, _param_spec: glib::ffi::gpointer, f: glib::ffi::gpointer) {
let f: &F = &*(f as *const F);
f(PipewireObject::from_glib_borrow(this).unsafe_cast_ref())
}
unsafe {
let f: Box_<F> = Box_::new(f);
connect_raw(self.as_ptr() as *mut _, b"notify::param-info\0".as_ptr() as *const _,
Some(std::mem::transmute::<_, unsafe extern "C" fn()>(notify_param_info_trampoline::<Self, F> as *const ())), Box_::into_raw(f))
}
}
#[doc(alias = "properties")]
fn connect_properties_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
unsafe extern "C" fn notify_properties_trampoline<P: IsA<PipewireObject>, F: Fn(&P) + 'static>(this: *mut ffi::WpPipewireObject, _param_spec: glib::ffi::gpointer, f: glib::ffi::gpointer) {
let f: &F = &*(f as *const F);
f(PipewireObject::from_glib_borrow(this).unsafe_cast_ref())
}
unsafe {
let f: Box_<F> = Box_::new(f);
connect_raw(self.as_ptr() as *mut _, b"notify::properties\0".as_ptr() as *const _,
Some(std::mem::transmute::<_, unsafe extern "C" fn()>(notify_properties_trampoline::<Self, F> as *const ())), Box_::into_raw(f))
}
}
}
impl<O: IsA<PipewireObject>> PipewireObjectExt for O {}