pub use super::consts::event::*;
use super::openjpeg::*;
#[derive(Copy, Clone)]
pub struct opj_event_mgr {
m_error_data: *mut core::ffi::c_void,
m_warning_data: *mut core::ffi::c_void,
m_info_data: *mut core::ffi::c_void,
error_handler: opj_msg_callback,
warning_handler: opj_msg_callback,
info_handler: opj_msg_callback,
}
impl Default for opj_event_mgr {
fn default() -> Self {
Self {
m_error_data: core::ptr::null_mut::<core::ffi::c_void>(),
m_warning_data: core::ptr::null_mut::<core::ffi::c_void>(),
m_info_data: core::ptr::null_mut::<core::ffi::c_void>(),
error_handler: None,
info_handler: None,
warning_handler: None,
}
}
}
impl opj_event_mgr {
pub fn set_default_event_handler(&mut self) {
*self = Self::default();
}
pub fn set_info_handler(
&mut self,
mut p_callback: opj_msg_callback,
mut p_user_data: *mut core::ffi::c_void,
) {
self.info_handler = p_callback;
self.m_info_data = p_user_data;
}
pub fn set_warning_handler(
&mut self,
mut p_callback: opj_msg_callback,
mut p_user_data: *mut core::ffi::c_void,
) {
self.warning_handler = p_callback;
self.m_warning_data = p_user_data;
}
pub fn set_error_handler(
&mut self,
mut p_callback: opj_msg_callback,
mut p_user_data: *mut core::ffi::c_void,
) {
self.error_handler = p_callback;
self.m_error_data = p_user_data;
}
pub fn get_handler(
&self,
event_type: EventType,
) -> Option<(opj_msg_callback_fn, *mut core::ffi::c_void)> {
match event_type {
EventType::Error => self.error_handler.map(|h| (h, self.m_error_data)),
EventType::Warning => self.warning_handler.map(|h| (h, self.m_warning_data)),
EventType::Info => self.info_handler.map(|h| (h, self.m_info_data)),
}
}
pub fn is_enabled(&self, event_type: EventType) -> bool {
self.get_handler(event_type).is_some()
}
pub fn msg_write(&self, event_type: EventType, msg: &str) -> i32 {
let (msg_handler, l_data) = match self.get_handler(event_type) {
Some(handler) => handler,
None => {
return 0;
}
};
let c_msg = alloc::ffi::CString::new(msg).unwrap();
unsafe {
msg_handler(c_msg.as_ptr(), l_data);
}
1
}
}
macro_rules! event_msg {
($event_mgr:expr, $event_type:expr, $fmt:expr) => {
$event_mgr.msg_write($event_type, $fmt)
};
($event_mgr:expr, $event_type:expr, $fmt:expr,) => {
$event_mgr.msg_write($event_type, $fmt)
};
($event_mgr:expr, $event_type:expr, $fmt:expr, $($arg:expr),*) => {
event_msg!(internal $event_mgr, $event_type, $fmt, $($arg,)*)
};
($event_mgr:expr, $event_type:expr, $fmt:expr, $($arg:expr,)*) => {
event_msg!(internal $event_mgr, $event_type, $fmt, $($arg,)*)
};
(internal $event_mgr:expr, $event_type:expr, $fmt:expr, $($arg:expr,)*) => {
if $event_mgr.is_enabled($event_type) {
let s = ::sprintf::sprintf!($fmt, $($arg),*);
match &s {
Ok(s) => $event_mgr.msg_write($event_type, s),
Err(err) => {
log::error!("sprintf failed: {err:?}");
0i32
}
}
} else {
0i32
}
};
}