use super::handlers::entrypoints; use crate::purple::PrplPlugin; use log::info; use std::ffi::CString; use std::marker::PhantomData; use std::os::raw::c_void; #[derive(Default)] pub struct RegisterContext
{
info: Box ,
}
impl RegisterContext {
pub fn new() -> Self {
RegisterContext {
info: Box::new(purple_sys::PurplePluginInfo::default()),
extra_info: Box::new(purple_sys::PurplePluginProtocolInfo::default()),
_phantom_marker: PhantomData,
}
}
pub fn into_raw(mut self) -> *mut purple_sys::PurplePluginInfo {
self.extra_info.roomlist_get_list = Some(entrypoints::roomlist_get_list_handler);
self.info.extra_info = Box::into_raw(self.extra_info) as *mut c_void;
Box::into_raw(self.info)
}
pub fn with_info(mut self, info: PrplInfo) -> Self {
self.info.id = CString::new(info.id).unwrap().into_raw();
self.info.name = CString::new(info.name).unwrap().into_raw();
self.info.version = CString::new(info.version).unwrap().into_raw();
self.info.summary = CString::new(info.summary).unwrap().into_raw();
self.info.description = CString::new(info.description).unwrap().into_raw();
self.info.author = CString::new(info.author).unwrap().into_raw();
self.info.homepage = CString::new(info.homepage).unwrap().into_raw();
self.info.actions = Some(entrypoints::actions);
self
}
pub fn with_password(mut self) -> Self {
// purple_sys defaults extra_info.options to contain:
// OPT_PROTO_NO_PASSWORD | OPT_PROTO_IM_IMAGE | OPT_PROTO_CHAT_TOPIC
// All we have to do is remove the no_password one.
self.extra_info.options = purple_sys::PurpleProtocolOptions::OPT_PROTO_IM_IMAGE
| purple_sys::PurpleProtocolOptions::OPT_PROTO_CHAT_TOPIC;
self
}
}
pub struct PrplPluginLoader );
impl {
pub unsafe fn from_raw(ptr: *mut purple_sys::PurplePlugin) -> Self {
Self(ptr, PhantomData)
}
pub fn init(&self) -> i32 {
let prpl_plugin = Box::new(P::new());
let register_context: RegisterContext