use crate::plugin_import;
use std::{
ffi::{CStr, CString},
os::raw::c_char,
path::PathBuf,
};
mod guest_plugin;
pub use guest_plugin::{load_guest_plugin, Channel, ChannelCB, ChannelId, GuestPlugin};
mod from_channel_msg;
pub use from_channel_msg::FromChannelMessage;
#[doc(inline)]
pub use panda_macros::channel_recv;
plugin_import! {
static GUEST_PLUGIN_MANAGER: GuestPluginManager = extern "guest_plugin_manager" {
fn add_guest_plugin(plugin: GuestPlugin) -> ChannelId;
fn channel_write(channel: ChannelId, out: *const u8, out_len: usize);
fn get_channel_from_name(channel_name: *const c_char) -> ChannelId;
fn allocate_channel(callback: ChannelCB) -> ChannelId;
};
}
pub fn guest_plugin_path(name: &str) -> Option<PathBuf> {
extern "C" {
fn panda_guest_plugin_path(name: *const c_char) -> *mut c_char;
}
let name = CString::new(name).ok()?;
let path_result = unsafe { panda_guest_plugin_path(name.as_ptr()) };
if path_result.is_null() {
None
} else {
let path = unsafe { CStr::from_ptr(path_result) };
let path = path.to_str().ok().map(PathBuf::from);
unsafe {
panda::sys::free(path_result as _);
}
path
}
}