use capi;
use std::os::raw::c_void;
use std::ptr::null_mut;
use capi::pa_operation as OperationInternal;
pub use capi::pa_operation_state_t as State;
pub struct Operation {
ptr: *mut OperationInternal,
cb_ptrs: CallbackPointers,
}
#[derive(Default)]
struct CallbackPointers {
state: NotifyCb,
}
type NotifyCb = ::callbacks::MultiUseCallback<FnMut(),
extern "C" fn(*mut OperationInternal, *mut c_void)>;
impl Operation {
pub(crate) fn from_raw(ptr: *mut OperationInternal) -> Self {
assert_eq!(false, ptr.is_null());
Self { ptr: ptr, cb_ptrs: Default::default() }
}
pub fn cancel(&mut self) {
unsafe { capi::pa_operation_cancel(self.ptr); }
}
pub fn get_state(&self) -> State {
unsafe { capi::pa_operation_get_state(self.ptr) }
}
pub fn set_state_callback(&mut self, callback: Option<Box<FnMut() + 'static>>) {
let saved = &mut self.cb_ptrs.state;
*saved = NotifyCb::new(callback);
let (cb_fn, cb_data) = saved.get_capi_params(notify_cb_proxy);
unsafe { capi::pa_operation_set_state_callback(self.ptr, cb_fn, cb_data); }
}
}
impl Drop for Operation {
fn drop(&mut self) {
unsafe { capi::pa_operation_unref(self.ptr) };
self.ptr = null_mut::<OperationInternal>();
}
}
extern "C"
fn notify_cb_proxy(_: *mut OperationInternal, userdata: *mut c_void) {
assert!(!userdata.is_null());
let callback = unsafe { &mut *(userdata as *mut Box<FnMut()>) };
callback();
}