use alloc::boxed::Box;
use uefi_macros::unsafe_protocol;
use uefi_raw::protocol::hii::database::HiiDatabaseProtocol;
use crate::mem::make_boxed;
use crate::{Error, StatusExt};
#[derive(Debug)]
#[repr(transparent)]
#[unsafe_protocol(HiiDatabaseProtocol::GUID)]
pub struct HiiDatabase(HiiDatabaseProtocol);
impl HiiDatabase {
pub fn export_all_raw(&self) -> crate::Result<Box<[u8]>> {
fn fetch_data_fn<'a>(
proto: &HiiDatabase,
buf: &'a mut [u8],
) -> Result<&'a mut [u8], Error<Option<usize>>> {
unsafe {
let mut size = buf.len();
let status = {
(proto.0.export_package_lists)(
&proto.0,
core::ptr::null_mut(),
&mut size,
buf.as_mut_ptr().cast(),
)
};
status.to_result_with_err(|_| Some(size)).map(|_| buf)
}
}
let buf = make_boxed::<[u8], _>(|buf| fetch_data_fn(self, buf))?;
Ok(buf)
}
}