use std::ffi::{CString, c_void};
use crate::{str2cstring, PHEXCHAT};
use std::ptr;
use std::cell::RefCell;
use std::rc::Rc;
#[allow(dead_code)]
struct PluginData {
file_name : CString,
plugin_name : CString,
description : CString,
version : CString,
handle : *const c_void,
removed : bool,
}
#[derive(Clone)]
pub struct Plugin {
data: Rc<RefCell<PluginData>>,
}
impl Plugin {
pub fn new(file_name : &str,
plugin_name : &str,
description : &str,
version : &str)
-> Plugin
{
unsafe {
let hc = &*PHEXCHAT;
let null = ptr::null::<c_void>();
let file_name = str2cstring(file_name);
let plugin_name = str2cstring(plugin_name);
let description = str2cstring(description);
let version = str2cstring(version);
let handle = (hc.c_plugingui_add)(hc,
file_name.as_ptr(),
plugin_name.as_ptr(),
description.as_ptr(),
version.as_ptr(),
null.cast());
let pd = PluginData {
file_name,
plugin_name,
description,
version,
handle : handle.cast(),
removed : false,
};
Plugin { data: Rc::new(RefCell::new(pd)) }
}
}
pub fn remove(&self) {
let cell = &*self.data;
let data = &mut *cell.borrow_mut();
if !data.removed {
unsafe {
let hc = &*PHEXCHAT;
(hc.c_plugingui_remove)(hc, data.handle.cast());
}
data.removed = true;
}
}
}
impl Drop for PluginData {
fn drop(&mut self) {
if !self.removed {
unsafe {
let hc = &*PHEXCHAT;
(hc.c_plugingui_remove)(hc, self.handle.cast());
}
}
}
}