promise: Change change_func to get the actual reply of the promise passed

This commit is contained in:
Sebastian Dröge 2019-11-13 11:40:41 +01:00
parent 77c6741ae0
commit cd55f02e20

View file

@ -24,6 +24,13 @@ glib_wrapper! {
} }
} }
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum PromiseError {
Interrupted,
Expired,
Other(PromiseResult),
}
impl Promise { impl Promise {
#[cfg(any(feature = "v1_14", feature = "dox"))] #[cfg(any(feature = "v1_14", feature = "dox"))]
pub fn new() -> Promise { pub fn new() -> Promise {
@ -34,21 +41,39 @@ impl Promise {
#[cfg(any(feature = "v1_14", feature = "dox"))] #[cfg(any(feature = "v1_14", feature = "dox"))]
pub fn new_with_change_func<F>(func: F) -> Promise pub fn new_with_change_func<F>(func: F) -> Promise
where where
F: FnOnce(&Promise) + Send + 'static, F: FnOnce(Result<&StructureRef, PromiseError>) + Send + 'static,
{ {
let user_data: Box<Option<F>> = Box::new(Some(func)); let user_data: Box<Option<F>> = Box::new(Some(func));
unsafe extern "C" fn trampoline<F: FnOnce(&Promise) + Send + 'static>( unsafe extern "C" fn trampoline<
F: FnOnce(Result<&StructureRef, PromiseError>) + Send + 'static,
>(
promise: *mut gst_sys::GstPromise, promise: *mut gst_sys::GstPromise,
user_data: glib_sys::gpointer, user_data: glib_sys::gpointer,
) { ) {
let user_data: &mut Option<F> = &mut *(user_data as *mut _); let user_data: &mut Option<F> = &mut *(user_data as *mut _);
let callback = user_data.take().unwrap(); let callback = user_data.take().unwrap();
callback(&from_glib_borrow(promise)); let promise: Promise = from_glib_borrow(promise);
let res = match promise.wait() {
PromiseResult::Replied => {
Ok(promise.get_reply().expect("Promise resolved but no reply"))
}
PromiseResult::Interrupted => Err(PromiseError::Interrupted),
PromiseResult::Expired => Err(PromiseError::Expired),
PromiseResult::Pending => {
panic!("Promise resolved but returned Pending");
}
err => Err(PromiseError::Other(err)),
};
callback(res);
} }
unsafe extern "C" fn free_user_data<F: FnOnce(&Promise) + Send + 'static>( unsafe extern "C" fn free_user_data<
F: FnOnce(Result<&StructureRef, PromiseError>) + Send + 'static,
>(
user_data: glib_sys::gpointer, user_data: glib_sys::gpointer,
) { ) {
let _: Box<Option<F>> = Box::from_raw(user_data as *mut _); let _: Box<Option<F>> = Box::from_raw(user_data as *mut _);