#[cfg(doc)]
use crate::Status;
use crate::proto::unsafe_protocol;
use uefi_raw::protocol::media::{LoadFile2Protocol, LoadFileProtocol};
#[cfg(feature = "alloc")]
use {
crate::{Result, StatusExt, mem::make_boxed, proto::device_path::DevicePath},
alloc::boxed::Box,
uefi::proto::BootPolicy,
uefi_raw::Boolean,
};
#[derive(Debug)]
#[repr(transparent)]
#[unsafe_protocol(LoadFileProtocol::GUID)]
pub struct LoadFile(LoadFileProtocol);
impl LoadFile {
#[cfg(feature = "alloc")]
#[allow(clippy::extra_unused_lifetimes)] pub fn load_file<'a>(
&mut self,
file_path: &DevicePath,
boot_policy: BootPolicy,
) -> Result<Box<[u8]>> {
let fetch_data_fn = |buf: &'a mut [u8]| {
let mut size = buf.len();
let status = unsafe {
(self.0.load_file)(
&raw mut self.0,
file_path.as_ffi_ptr().cast(),
boot_policy.into(),
&mut size,
buf.as_mut_ptr().cast(),
)
};
status.to_result_with_err(|_| Some(size)).map(|_| buf)
};
let file: Box<[u8]> = make_boxed::<[u8], _>(fetch_data_fn)?;
Ok(file)
}
}
#[derive(Debug)]
#[repr(transparent)]
#[unsafe_protocol(LoadFile2Protocol::GUID)]
pub struct LoadFile2(LoadFile2Protocol);
impl LoadFile2 {
#[cfg(feature = "alloc")]
#[allow(clippy::extra_unused_lifetimes)] pub fn load_file<'a>(&mut self, file_path: &DevicePath) -> Result<Box<[u8]>> {
let fetch_data_fn = |buf: &'a mut [u8]| {
let mut size = buf.len();
let status = unsafe {
(self.0.load_file)(
&raw mut self.0,
file_path.as_ffi_ptr().cast(),
Boolean::FALSE,
&mut size,
buf.as_mut_ptr().cast(),
)
};
status.to_result_with_err(|_| Some(size)).map(|_| buf)
};
let file: Box<[u8]> = make_boxed::<[u8], _>(fetch_data_fn)?;
Ok(file)
}
}