use crate::{
raw::size_t,
{ErrorKind, Result},
};
use core::ffi::c_void;
pub struct PluginParameters<'a, 'b> {
pub cmd: u32,
pub sub_cmd: u32,
buf: &'a mut [u8],
out_len: Option<&'b mut size_t>,
}
impl<'a, 'b> PluginParameters<'a, 'b> {
pub unsafe fn from_raw(
cmd: u32,
sub_cmd: u32,
buf: *mut c_void,
in_len: size_t,
out_len: *mut size_t,
) -> Result<Self> {
if (in_len != 0 || !out_len.is_null()) && buf.is_null() {
return Err(ErrorKind::BadParameters.into());
}
let buf = match buf.is_null() {
true => &mut [],
false => unsafe { core::slice::from_raw_parts_mut(buf as *mut _, in_len) },
};
let out_len = unsafe { out_len.as_mut() };
Ok(Self {
cmd,
sub_cmd,
buf,
out_len,
})
}
pub fn set_buf_from_slice(&mut self, sendslice: &[u8]) -> Result<()> {
self.write_output_at(0, sendslice)
}
pub fn write_output_at(&mut self, pos: usize, data: &[u8]) -> Result<()> {
if let Some(out_len) = self.out_len.as_mut() {
let dest_len = pos + data.len();
if self.buf.len() < dest_len {
log::debug!("Overflow: Input length is less than output length");
return Err(ErrorKind::ShortBuffer.into());
}
self.buf[pos..dest_len].copy_from_slice(data);
(**out_len) = dest_len;
return Ok(());
}
log::debug!("output is not allowed");
Err(ErrorKind::BadState.into())
}
pub fn get_buffer(&self) -> &[u8] {
self.buf
}
pub unsafe fn get_buffer_mut(&mut self) -> &mut [u8] {
self.buf
}
pub fn set_out_len(&mut self, out_len: usize) -> Result<()> {
if out_len > self.buf.len() {
return Err(ErrorKind::BadParameters.into());
}
match self.out_len.as_mut() {
None => Err(ErrorKind::BadState.into()),
Some(v) => {
**v = out_len;
Ok(())
}
}
}
}