use std::ffi::{c_char, c_int, c_void};
use std::ptr;
use crate::make_x;
use super::{
super::{debugln, internal::copy_to_c_buffer},
Plugin,
};
pub struct PluginData<P> {
pub plugin: *mut P,
}
pub unsafe fn xplugin_start<P>(
data: &mut PluginData<P>,
name: *mut c_char,
signature: *mut c_char,
description: *mut c_char,
) -> c_int
where
P: Plugin,
{
let mut x = make_x();
super::super::internal::xplm_init(&mut x);
match P::start(&mut x) {
Ok(plugin) => {
let info = plugin.info();
unsafe {
copy_to_c_buffer(info.name, name);
copy_to_c_buffer(info.signature, signature);
copy_to_c_buffer(info.description, description);
}
let plugin_box = Box::new(plugin);
data.plugin = Box::into_raw(plugin_box);
1
}
Err(e) => {
debugln!(x, "Plugin failed to start: {}", e).unwrap(); data.plugin = ptr::null_mut();
0
}
}
}
pub unsafe fn xplugin_stop<P>(data: &mut PluginData<P>)
where
P: Plugin,
{
let plugin = unsafe { Box::from_raw(data.plugin) };
data.plugin = ptr::null_mut();
drop(plugin);
}
pub unsafe fn xplugin_enable<P>(data: &mut PluginData<P>) -> c_int
where
P: Plugin,
{
let mut x = make_x();
match unsafe { (*data.plugin).enable(&mut x) } {
Ok(()) => 1,
Err(e) => {
debugln!(x, "Plugin failed to enable: {}", e).unwrap(); 0
}
}
}
pub unsafe fn xplugin_disable<P>(data: &mut PluginData<P>)
where
P: Plugin,
{
let mut x = make_x();
unsafe {
(*data.plugin).disable(&mut x);
}
}
pub unsafe fn xplugin_receive_message<P>(
data: &mut PluginData<P>,
from: c_int,
message: c_int,
param: *mut c_void,
) where
P: Plugin,
{
let mut x = make_x();
unsafe {
(*data.plugin).receive_message(&mut x, from, message.into(), param);
}
}