morpheus_core/fs/fat32_ops/
mod.rsmod context;
mod directory;
mod file_ops;
pub mod filename;
mod types;
use super::Fat32Error;
use context::Fat32Context;
use gpt_disk_io::BlockIo;
extern crate alloc;
use alloc::vec::Vec;
pub type ProgressCallback<'a> = Option<&'a mut dyn FnMut(usize, usize, &str)>;
pub fn write_file<B: BlockIo>(
block_io: &mut B,
partition_lba_start: u64,
path: &str,
data: &[u8],
) -> Result<(), Fat32Error> {
write_file_with_progress(block_io, partition_lba_start, path, data, &mut None)
}
pub fn write_file_with_progress<B: BlockIo>(
block_io: &mut B,
partition_lba_start: u64,
path: &str,
data: &[u8],
progress: &mut ProgressCallback,
) -> Result<(), Fat32Error> {
let ctx = Fat32Context::from_boot_sector(block_io, partition_lba_start)?;
let path = path.trim_start_matches('/');
let parts: Vec<&str> = path.split('/').collect();
let mut current_cluster = ctx.root_cluster;
for (i, part) in parts.iter().enumerate() {
let is_last = i == parts.len() - 1;
if !is_last {
current_cluster = directory::ensure_directory_exists(
block_io,
partition_lba_start,
&ctx,
current_cluster,
part,
)?;
} else {
file_ops::write_file_in_directory_with_progress(
block_io,
partition_lba_start,
&ctx,
current_cluster,
part,
data,
progress,
)?;
}
}
block_io.flush().map_err(|_| Fat32Error::IoError)?;
Ok(())
}
pub fn create_directory<B: BlockIo>(
block_io: &mut B,
partition_lba_start: u64,
path: &str,
) -> Result<(), Fat32Error> {
let ctx = Fat32Context::from_boot_sector(block_io, partition_lba_start)?;
directory::create_directory(block_io, partition_lba_start, &ctx, path)?;
block_io.flush().map_err(|_| Fat32Error::IoError)?;
Ok(())
}
pub fn read_file<B: BlockIo>(
block_io: &mut B,
partition_lba_start: u64,
path: &str,
) -> Result<Vec<u8>, Fat32Error> {
let ctx = Fat32Context::from_boot_sector(block_io, partition_lba_start)?;
file_ops::read_file(block_io, partition_lba_start, &ctx, path)
}
pub fn file_exists<B: BlockIo>(
block_io: &mut B,
partition_lba_start: u64,
path: &str,
) -> Result<bool, Fat32Error> {
let ctx = Fat32Context::from_boot_sector(block_io, partition_lba_start)?;
file_ops::file_exists(block_io, partition_lba_start, &ctx, path)
}