use capi;
use std::os::raw::c_void;
use std::ptr::null_mut;
use ::util::unwrap_optional_callback;
pub use capi::pa_operation as OperationInternal;
pub use capi::pa_operation_state_t as State;
pub struct Operation {
ptr: *mut OperationInternal,
weak: bool,
}
pub type NotifyCb = extern "C" fn(o: *mut OperationInternal, userdata: *mut c_void);
impl Operation {
pub fn from_raw(ptr: *mut OperationInternal) -> Self {
assert_eq!(false, ptr.is_null());
Self { ptr: ptr, weak: false }
}
pub fn from_raw_weak(ptr: *mut OperationInternal) -> Self {
assert_eq!(false, ptr.is_null());
Self { ptr: ptr, weak: true }
}
pub fn cancel(&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(&self, cb: Option<(NotifyCb, *mut c_void)>) {
let (cb_f, cb_d) = unwrap_optional_callback::<NotifyCb>(cb);
unsafe { capi::pa_operation_set_state_callback(self.ptr, cb_f, cb_d); }
}
}
impl Drop for Operation {
fn drop(&mut self) {
if !self.weak {
unsafe { capi::pa_operation_unref(self.ptr) };
}
self.ptr = null_mut::<OperationInternal>();
}
}