file.rs 1.2 KB

12345678910111213141516171819202122232425262728293031323334
  1. use crate::{kernel::mem::Page, KResult};
  2. use super::{ClusterIterator, FatFs};
  3. pub trait ClusterReadIterator<'data>: Iterator<Item = KResult<&'data [u8]>> + 'data {}
  4. impl<'a, I> ClusterReadIterator<'a> for I where I: Iterator<Item = KResult<&'a [u8]>> + 'a {}
  5. pub(super) trait ClusterRead<'data> {
  6. fn read<'vfs>(self, vfs: &'vfs FatFs, offset: usize) -> impl ClusterReadIterator<'data>
  7. where
  8. Self: Sized,
  9. 'vfs: 'data;
  10. }
  11. impl<'data, 'fat: 'data> ClusterRead<'data> for ClusterIterator<'fat> {
  12. fn read<'vfs: 'data>(self, vfs: &'vfs FatFs, offset: usize) -> impl ClusterReadIterator<'data> {
  13. const SECTOR_SIZE: usize = 512;
  14. let cluster_size = vfs.sectors_per_cluster as usize * SECTOR_SIZE;
  15. assert!(cluster_size <= 0x1000, "Cluster size is too large");
  16. let skip_clusters = offset / cluster_size;
  17. let mut inner_offset = offset % cluster_size;
  18. let buffer_page = Page::alloc_one();
  19. self.skip(skip_clusters).map(move |cluster| {
  20. vfs.read_cluster(cluster, &buffer_page)?;
  21. let data = &buffer_page.as_slice()[inner_offset..];
  22. inner_offset = 0;
  23. Ok(data)
  24. })
  25. }
  26. }