From 7478430e022a22fff2b4f74b2731f3be6cc0709b Mon Sep 17 00:00:00 2001 From: Jonathan Pallant Date: Fri, 25 Oct 2024 16:54:54 +0100 Subject: [PATCH 1/9] Add a csum() method to ShortFileName. Long File Names carry this checksum of their matching Short File Name. --- src/filesystem/filename.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/filesystem/filename.rs b/src/filesystem/filename.rs index a8b34e4..ad3dd04 100644 --- a/src/filesystem/filename.rs +++ b/src/filesystem/filename.rs @@ -175,6 +175,15 @@ impl ShortFileName { contents: self.contents, } } + + /// Get the LFN checksum for this short filename + pub fn csum(&self) -> u8 { + let mut result = 0u8; + for b in self.contents.iter() { + result = result.rotate_right(1).wrapping_add(*b); + } + result + } } impl core::fmt::Display for ShortFileName { @@ -302,6 +311,16 @@ mod test { assert!(ShortFileName::create_from_str("123456789").is_err()); assert!(ShortFileName::create_from_str("12345678.ABCD").is_err()); } + + #[test] + fn checksum() { + assert_eq!( + 0xB3, + ShortFileName::create_from_str("UNARCH~1.DAT") + .unwrap() + .csum() + ); + } } // **************************************************************************** From f2daa2e05fdeb9d79fdc1e2a00ccdffb00024f9d Mon Sep 17 00:00:00 2001 From: Jonathan Pallant Date: Fri, 25 Oct 2024 16:55:23 +0100 Subject: [PATCH 2/9] Ensure cluster IDs print with a fixed width. --- src/filesystem/cluster.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/filesystem/cluster.rs b/src/filesystem/cluster.rs index bcf6eb0..14f1126 100644 --- a/src/filesystem/cluster.rs +++ b/src/filesystem/cluster.rs @@ -38,22 +38,22 @@ impl core::fmt::Debug for ClusterId { write!(f, "ClusterId(")?; match *self { Self::INVALID => { - write!(f, "INVALID")?; + write!(f, "{:08}", "INVALID")?; } Self::BAD => { - write!(f, "BAD")?; + write!(f, "{:08}", "BAD")?; } Self::EMPTY => { - write!(f, "EMPTY")?; + write!(f, "{:08}", "EMPTY")?; } Self::ROOT_DIR => { - write!(f, "ROOT_DIR")?; + write!(f, "{:08}", "ROOT")?; } Self::END_OF_FILE => { - write!(f, "END_OF_FILE")?; + write!(f, "{:08}", "EOF")?; } ClusterId(value) => { - write!(f, "{:#08x}", value)?; + write!(f, "{:08x}", value)?; } } write!(f, ")")?; From 20e57022535b569447124d7767f9b443878abb62 Mon Sep 17 00:00:00 2001 From: Jonathan Pallant Date: Fri, 25 Oct 2024 16:56:23 +0100 Subject: [PATCH 3/9] Ensure attributes print with a fixed width. --- src/filesystem/attributes.rs | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/filesystem/attributes.rs b/src/filesystem/attributes.rs index a6df757..e22dcd1 100644 --- a/src/filesystem/attributes.rs +++ b/src/filesystem/attributes.rs @@ -71,31 +71,33 @@ impl Attributes { impl core::fmt::Debug for Attributes { fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { + // Worst case is "DRHSVA" + let mut output = heapless::String::<7>::new(); if self.is_lfn() { - write!(f, "LFN")?; + output.push_str("LFN").unwrap(); } else { if self.is_directory() { - write!(f, "D")?; + output.push_str("D").unwrap(); } else { - write!(f, "F")?; + output.push_str("F").unwrap(); } if self.is_read_only() { - write!(f, "R")?; + output.push_str("R").unwrap(); } if self.is_hidden() { - write!(f, "H")?; + output.push_str("H").unwrap(); } if self.is_system() { - write!(f, "S")?; + output.push_str("S").unwrap(); } if self.is_volume() { - write!(f, "V")?; + output.push_str("V").unwrap(); } if self.is_archive() { - write!(f, "A")?; + output.push_str("A").unwrap(); } } - Ok(()) + f.pad(&output) } } From fe2bdff045412e26f64f0aaeea19d2d01ac8f322 Mon Sep 17 00:00:00 2001 From: Jonathan Pallant Date: Fri, 25 Oct 2024 17:07:16 +0100 Subject: [PATCH 4/9] Add an LfnBuffer type. Used to buffer Long File Names. Designed to be fed 16-bit UCS-2 chunks in reverse, like you find in a directory. --- src/filesystem/filename.rs | 102 +++++++++++++++++++++++++++++++++++++ src/lib.rs | 4 +- 2 files changed, 104 insertions(+), 2 deletions(-) diff --git a/src/filesystem/filename.rs b/src/filesystem/filename.rs index ad3dd04..e3f4f6e 100644 --- a/src/filesystem/filename.rs +++ b/src/filesystem/filename.rs @@ -1,6 +1,7 @@ //! Filename related types use crate::fat::VolumeName; +use crate::trace; /// Various filename related errors that can occur. #[cfg_attr(feature = "defmt-log", derive(defmt::Format))] @@ -219,6 +220,83 @@ impl core::fmt::Debug for ShortFileName { } } +/// Used to store a Long File Name +/// +/// The const generic specifies the maximum capacity in bytes. +pub struct LfnBuffer { + /// We fill this buffer in from the back + inner: [u8; N], + /// How many bytes are free. + /// + /// This is also the byte index the string starts from. + free: usize, + /// Did we overflow? + overflow: bool, +} + +impl LfnBuffer { + /// Create a new, empty, LFN Buffer + pub fn new() -> LfnBuffer { + LfnBuffer { + inner: [0u8; N], + free: N, + overflow: false, + } + } + + /// Empty out this buffer + pub fn clear(&mut self) { + self.free = N; + self.overflow = false; + } + + /// Push the 13 UCS-2 characters into this string + /// + /// We assume they are pushed last-chunk-first, as you would find + /// them on disk. + pub fn push(&mut self, buffer: &[u16; 13]) { + // find the first null, if any + let null_idx = buffer + .iter() + .position(|&b| b == 0x0000) + .unwrap_or(buffer.len()); + // take all the wide chars, up to the null (or go to the end) + let buffer = &buffer[0..null_idx]; + for ch in buffer.iter().rev() { + let ch = char::from_u32(*ch as u32).unwrap_or('?'); + trace!("LFN push {:?}", ch); + let mut ch_bytes = [0u8; 4]; + // a buffer of length 4 is always enough + let ch_str = ch.encode_utf8(&mut ch_bytes); + if self.free < ch_str.len() { + self.overflow = true; + return; + } + // store the encoded character in the buffer, working backwards + for b in ch_str.bytes().rev() { + self.free -= 1; + self.inner[self.free] = b; + } + } + } + + /// View this LFN buffer as a string-slice + pub fn as_str(&self) -> &str { + if self.overflow { + "" + } else { + // we always only put UTF-8 encoded data in here + unsafe { core::str::from_utf8_unchecked(&self.inner[self.free..]) } + } + } +} + +impl core::default::Default for LfnBuffer { + fn default() -> Self { + LfnBuffer::new() + } +} + // **************************************************************************** // // Unit Tests @@ -321,6 +399,30 @@ mod test { .csum() ); } + + #[test] + fn one_piece() { + let mut buf: LfnBuffer<64> = LfnBuffer::new(); + buf.push(&[ + 0x0030, 0x0031, 0x0032, 0x0033, 0x2202, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, + ]); + assert_eq!(buf.as_str(), "0123∂"); + } + + #[test] + fn two_piece() { + let mut buf: LfnBuffer<64> = LfnBuffer::new(); + buf.push(&[ + 0x0030, 0x0031, 0x0032, 0x0033, 0x2202, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, + ]); + buf.push(&[ + 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004a, 0x004b, + 0x004c, 0x004d, + ]); + assert_eq!(buf.as_str(), "ABCDEFGHIJKLM0123∂"); + } } // **************************************************************************** diff --git a/src/lib.rs b/src/lib.rs index bdd5630..434808d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -85,8 +85,8 @@ pub use crate::fat::{FatVolume, VolumeName}; #[doc(inline)] pub use crate::filesystem::{ - Attributes, ClusterId, DirEntry, Directory, File, FilenameError, Mode, RawDirectory, RawFile, - ShortFileName, TimeSource, Timestamp, MAX_FILE_SIZE, + Attributes, ClusterId, DirEntry, Directory, File, FilenameError, LfnBuffer, Mode, RawDirectory, + RawFile, ShortFileName, TimeSource, Timestamp, MAX_FILE_SIZE, }; use filesystem::DirectoryInfo; From d89944cb1b6961591a15431502ed93134b5129e8 Mon Sep 17 00:00:00 2001 From: Jonathan Pallant Date: Fri, 25 Oct 2024 18:05:38 +0100 Subject: [PATCH 5/9] Add iterate_dir_lfn. Scoops up bits of LFN into the given LFN buffer and if it all looks OK, passes it to the user-supplied closure as a &str. --- examples/shell.rs | 20 +++- src/fat/mod.rs | 69 ++++++++--- src/fat/ondiskdirentry.rs | 56 +++------ src/fat/volume.rs | 125 ++++++++++++++++++-- src/filesystem/directory.rs | 31 ++++- src/filesystem/mod.rs | 2 +- src/volume_mgr.rs | 65 ++++++++++- tests/directories.rs | 226 +++++++++++++++++++++++++----------- tests/disk.img.gz | Bin 703296 -> 703414 bytes 9 files changed, 451 insertions(+), 143 deletions(-) diff --git a/examples/shell.rs b/examples/shell.rs index 341bb51..d4bdd16 100644 --- a/examples/shell.rs +++ b/examples/shell.rs @@ -71,7 +71,9 @@ use std::{cell::RefCell, io::prelude::*}; -use embedded_sdmmc::{Error as EsError, RawDirectory, RawVolume, ShortFileName, VolumeIdx}; +use embedded_sdmmc::{ + Error as EsError, LfnBuffer, RawDirectory, RawVolume, ShortFileName, VolumeIdx, +}; type VolumeManager = embedded_sdmmc::VolumeManager; type Directory<'a> = embedded_sdmmc::Directory<'a, LinuxBlockDevice, Clock, 8, 8, 4>; @@ -229,17 +231,23 @@ impl Context { fn dir(&self, path: &Path) -> Result<(), Error> { println!("Directory listing of {:?}", path); let dir = self.resolve_existing_directory(path)?; - dir.iterate_dir(|entry| { - if !entry.attributes.is_volume() && !entry.attributes.is_lfn() { - println!( - "{:12} {:9} {} {} {:08X?} {:?}", + let mut lfn_buffer = LfnBuffer::<256>::new(); + dir.iterate_dir_lfn(&mut lfn_buffer, |entry, lfn| { + if !entry.attributes.is_volume() { + print!( + "{:12} {:9} {} {} {:08X?} {:5?}", entry.name, entry.size, entry.ctime, entry.mtime, entry.cluster, - entry.attributes + entry.attributes, ); + if let Some(lfn) = lfn { + println!(" {:?}", lfn); + } else { + println!(); + } } })?; Ok(()) diff --git a/src/fat/mod.rs b/src/fat/mod.rs index 504f67f..c27a8cd 100644 --- a/src/fat/mod.rs +++ b/src/fat/mod.rs @@ -84,7 +84,7 @@ mod test { fn test_dir_entries() { #[derive(Debug)] enum Expected { - Lfn(bool, u8, [char; 13]), + Lfn(bool, u8, u8, [u16; 13]), Short(DirEntry), } let raw_data = r#" @@ -105,6 +105,7 @@ mod test { 422e0064007400620000000f0059ffffffffffffffffffffffff0000ffffffff B..d.t.b.....Y.................. 01620063006d00320037000f0059300038002d0072007000690000002d006200 .b.c.m.2.7...Y0.8.-.r.p.i...-.b. "#; + let results = [ Expected::Short(DirEntry { name: unsafe { @@ -123,9 +124,10 @@ mod test { Expected::Lfn( true, 1, + 0x47, [ - 'o', 'v', 'e', 'r', 'l', 'a', 'y', 's', '\u{0000}', '\u{ffff}', '\u{ffff}', - '\u{ffff}', '\u{ffff}', + 'o' as u16, 'v' as u16, 'e' as u16, 'r' as u16, 'l' as u16, 'a' as u16, + 'y' as u16, 's' as u16, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, ], ), Expected::Short(DirEntry { @@ -141,16 +143,20 @@ mod test { Expected::Lfn( true, 2, + 0x79, [ - '-', 'p', 'l', 'u', 's', '.', 'd', 't', 'b', '\u{0000}', '\u{ffff}', - '\u{ffff}', '\u{ffff}', + '-' as u16, 'p' as u16, 'l' as u16, 'u' as u16, 's' as u16, '.' as u16, + 'd' as u16, 't' as u16, 'b' as u16, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, ], ), Expected::Lfn( false, 1, + 0x79, [ - 'b', 'c', 'm', '2', '7', '0', '8', '-', 'r', 'p', 'i', '-', 'b', + 'b' as u16, 'c' as u16, 'm' as u16, '2' as u16, '7' as u16, '0' as u16, + '8' as u16, '-' as u16, 'r' as u16, 'p' as u16, 'i' as u16, '-' as u16, + 'b' as u16, ], ), Expected::Short(DirEntry { @@ -166,8 +172,11 @@ mod test { Expected::Lfn( true, 1, + 0x12, [ - 'C', 'O', 'P', 'Y', 'I', 'N', 'G', '.', 'l', 'i', 'n', 'u', 'x', + 'C' as u16, 'O' as u16, 'P' as u16, 'Y' as u16, 'I' as u16, 'N' as u16, + 'G' as u16, '.' as u16, 'l' as u16, 'i' as u16, 'n' as u16, 'u' as u16, + 'x' as u16, ], ), Expected::Short(DirEntry { @@ -183,16 +192,31 @@ mod test { Expected::Lfn( true, 2, + 0x67, [ - 'c', 'o', 'm', '\u{0}', '\u{ffff}', '\u{ffff}', '\u{ffff}', '\u{ffff}', - '\u{ffff}', '\u{ffff}', '\u{ffff}', '\u{ffff}', '\u{ffff}', + 'c' as u16, + 'o' as u16, + 'm' as u16, + '\u{0}' as u16, + 0xFFFF, + 0xFFFF, + 0xFFFF, + 0xFFFF, + 0xFFFF, + 0xFFFF, + 0xFFFF, + 0xFFFF, + 0xFFFF, ], ), Expected::Lfn( false, 1, + 0x67, [ - 'L', 'I', 'C', 'E', 'N', 'C', 'E', '.', 'b', 'r', 'o', 'a', 'd', + 'L' as u16, 'I' as u16, 'C' as u16, 'E' as u16, 'N' as u16, 'C' as u16, + 'E' as u16, '.' as u16, 'b' as u16, 'r' as u16, 'o' as u16, 'a' as u16, + 'd' as u16, ], ), Expected::Short(DirEntry { @@ -208,16 +232,20 @@ mod test { Expected::Lfn( true, 2, + 0x19, [ - '-', 'b', '.', 'd', 't', 'b', '\u{0000}', '\u{ffff}', '\u{ffff}', '\u{ffff}', - '\u{ffff}', '\u{ffff}', '\u{ffff}', + '-' as u16, 'b' as u16, '.' as u16, 'd' as u16, 't' as u16, 'b' as u16, 0x0000, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, ], ), Expected::Lfn( false, 1, + 0x19, [ - 'b', 'c', 'm', '2', '7', '0', '9', '-', 'r', 'p', 'i', '-', '2', + 'b' as u16, 'c' as u16, 'm' as u16, '2' as u16, '7' as u16, '0' as u16, + '9' as u16, '-' as u16, 'r' as u16, 'p' as u16, 'i' as u16, '-' as u16, + '2' as u16, ], ), Expected::Short(DirEntry { @@ -233,16 +261,20 @@ mod test { Expected::Lfn( true, 2, + 0x59, [ - '.', 'd', 't', 'b', '\u{0000}', '\u{ffff}', '\u{ffff}', '\u{ffff}', '\u{ffff}', - '\u{ffff}', '\u{ffff}', '\u{ffff}', '\u{ffff}', + '.' as u16, 'd' as u16, 't' as u16, 'b' as u16, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, + 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, ], ), Expected::Lfn( false, 1, + 0x59, [ - 'b', 'c', 'm', '2', '7', '0', '8', '-', 'r', 'p', 'i', '-', 'b', + 'b' as u16, 'c' as u16, 'm' as u16, '2' as u16, '7' as u16, '0' as u16, + '8' as u16, '-' as u16, 'r' as u16, 'p' as u16, 'i' as u16, '-' as u16, + 'b' as u16, ], ), ]; @@ -251,12 +283,13 @@ mod test { for (part, expected) in data.chunks(OnDiskDirEntry::LEN).zip(results.iter()) { let on_disk_entry = OnDiskDirEntry::new(part); match expected { - Expected::Lfn(start, index, contents) if on_disk_entry.is_lfn() => { - let (calc_start, calc_index, calc_contents) = + Expected::Lfn(start, index, csum, contents) if on_disk_entry.is_lfn() => { + let (calc_start, calc_index, calc_csum, calc_contents) = on_disk_entry.lfn_contents().unwrap(); assert_eq!(*start, calc_start); assert_eq!(*index, calc_index); assert_eq!(*contents, calc_contents); + assert_eq!(*csum, calc_csum); } Expected::Short(expected_entry) if !on_disk_entry.is_lfn() => { let parsed_entry = on_disk_entry.get_entry(FatType::Fat32, BlockIdx(0), 0); diff --git a/src/fat/ondiskdirentry.rs b/src/fat/ondiskdirentry.rs index 49b8bb2..83707e4 100644 --- a/src/fat/ondiskdirentry.rs +++ b/src/fat/ondiskdirentry.rs @@ -78,47 +78,27 @@ impl<'a> OnDiskDirEntry<'a> { } /// If this is an LFN, get the contents so we can re-assemble the filename. - pub fn lfn_contents(&self) -> Option<(bool, u8, [char; 13])> { + pub fn lfn_contents(&self) -> Option<(bool, u8, u8, [u16; 13])> { if self.is_lfn() { - let mut buffer = [' '; 13]; let is_start = (self.data[0] & 0x40) != 0; let sequence = self.data[0] & 0x1F; - // LFNs store UCS-2, so we can map from 16-bit char to 32-bit char without problem. - buffer[0] = - core::char::from_u32(u32::from(LittleEndian::read_u16(&self.data[1..=2]))).unwrap(); - buffer[1] = - core::char::from_u32(u32::from(LittleEndian::read_u16(&self.data[3..=4]))).unwrap(); - buffer[2] = - core::char::from_u32(u32::from(LittleEndian::read_u16(&self.data[5..=6]))).unwrap(); - buffer[3] = - core::char::from_u32(u32::from(LittleEndian::read_u16(&self.data[7..=8]))).unwrap(); - buffer[4] = core::char::from_u32(u32::from(LittleEndian::read_u16(&self.data[9..=10]))) - .unwrap(); - buffer[5] = - core::char::from_u32(u32::from(LittleEndian::read_u16(&self.data[14..=15]))) - .unwrap(); - buffer[6] = - core::char::from_u32(u32::from(LittleEndian::read_u16(&self.data[16..=17]))) - .unwrap(); - buffer[7] = - core::char::from_u32(u32::from(LittleEndian::read_u16(&self.data[18..=19]))) - .unwrap(); - buffer[8] = - core::char::from_u32(u32::from(LittleEndian::read_u16(&self.data[20..=21]))) - .unwrap(); - buffer[9] = - core::char::from_u32(u32::from(LittleEndian::read_u16(&self.data[22..=23]))) - .unwrap(); - buffer[10] = - core::char::from_u32(u32::from(LittleEndian::read_u16(&self.data[24..=25]))) - .unwrap(); - buffer[11] = - core::char::from_u32(u32::from(LittleEndian::read_u16(&self.data[28..=29]))) - .unwrap(); - buffer[12] = - core::char::from_u32(u32::from(LittleEndian::read_u16(&self.data[30..=31]))) - .unwrap(); - Some((is_start, sequence, buffer)) + let csum = self.data[13]; + let buffer = [ + LittleEndian::read_u16(&self.data[1..=2]), + LittleEndian::read_u16(&self.data[3..=4]), + LittleEndian::read_u16(&self.data[5..=6]), + LittleEndian::read_u16(&self.data[7..=8]), + LittleEndian::read_u16(&self.data[9..=10]), + LittleEndian::read_u16(&self.data[14..=15]), + LittleEndian::read_u16(&self.data[16..=17]), + LittleEndian::read_u16(&self.data[18..=19]), + LittleEndian::read_u16(&self.data[20..=21]), + LittleEndian::read_u16(&self.data[22..=23]), + LittleEndian::read_u16(&self.data[24..=25]), + LittleEndian::read_u16(&self.data[28..=29]), + LittleEndian::read_u16(&self.data[30..=31]), + ]; + Some((is_start, sequence, csum, buffer)) } else { None } diff --git a/src/fat/volume.rs b/src/fat/volume.rs index fbbedf9..503a7e8 100644 --- a/src/fat/volume.rs +++ b/src/fat/volume.rs @@ -8,7 +8,7 @@ use crate::{ }, filesystem::FilenameError, trace, warn, Attributes, Block, BlockCache, BlockCount, BlockDevice, BlockIdx, ClusterId, - DirEntry, DirectoryInfo, Error, ShortFileName, TimeSource, VolumeType, + DirEntry, DirectoryInfo, Error, LfnBuffer, ShortFileName, TimeSource, VolumeType, }; use byteorder::{ByteOrder, LittleEndian}; use core::convert::TryFrom; @@ -520,7 +520,7 @@ impl FatVolume { &self, block_cache: &mut BlockCache, dir_info: &DirectoryInfo, - func: F, + mut func: F, ) -> Result<(), Error> where F: FnMut(&DirEntry), @@ -528,10 +528,115 @@ impl FatVolume { { match &self.fat_specific_info { FatSpecificInfo::Fat16(fat16_info) => { - self.iterate_fat16(dir_info, fat16_info, block_cache, func) + self.iterate_fat16(dir_info, fat16_info, block_cache, |de, _| func(de)) + } + FatSpecificInfo::Fat32(fat32_info) => { + self.iterate_fat32(dir_info, fat32_info, block_cache, |de, _| func(de)) + } + } + } + + /// Calls callback `func` with every valid entry in the given directory, + /// including the Long File Name. + /// + /// Useful for performing directory listings. + pub(crate) fn iterate_dir_lfn( + &self, + block_cache: &mut BlockCache, + lfn_buffer: &mut LfnBuffer, + dir_info: &DirectoryInfo, + mut func: F, + ) -> Result<(), Error> + where + F: FnMut(&DirEntry, Option<&str>), + D: BlockDevice, + { + #[derive(Clone, Copy)] + enum SeqState { + Waiting, + Remaining { csum: u8, next: u8 }, + Complete { csum: u8 }, + } + + impl SeqState { + fn update( + self, + lfn_buffer: &mut LfnBuffer, + start: bool, + sequence: u8, + csum: u8, + buffer: [u16; 13], + ) -> Self { + debug!("LFN Contents {start} {sequence} {csum:02x} {buffer:04x?}"); + match (start, sequence, self) { + (true, 0x01, _) => { + lfn_buffer.clear(); + lfn_buffer.push(&buffer); + SeqState::Complete { csum } + } + (true, 0x02..0x14, _) => { + lfn_buffer.clear(); + lfn_buffer.push(&buffer); + SeqState::Remaining { + csum, + next: sequence - 1, + } + } + (false, 0x01, SeqState::Remaining { csum, next }) if next == sequence => { + lfn_buffer.push(&buffer); + SeqState::Complete { csum } + } + (false, 0x01..0x13, SeqState::Remaining { csum, next }) if next == sequence => { + lfn_buffer.push(&buffer); + SeqState::Remaining { + csum, + next: sequence - 1, + } + } + _ => { + // this seems wrong + lfn_buffer.clear(); + SeqState::Waiting + } + } + } + } + + let mut seq_state = SeqState::Waiting; + match &self.fat_specific_info { + FatSpecificInfo::Fat16(fat16_info) => { + self.iterate_fat16(dir_info, fat16_info, block_cache, |de, odde| { + if let Some((start, this_seqno, csum, buffer)) = odde.lfn_contents() { + seq_state = seq_state.update(lfn_buffer, start, this_seqno, csum, buffer); + } else if let SeqState::Complete { csum } = seq_state { + if csum == de.name.csum() { + // Checksum is good, and all the pieces are there + func(de, Some(lfn_buffer.as_str())) + } else { + // Checksum was bad + func(de, None) + } + } else { + func(de, None) + } + }) } FatSpecificInfo::Fat32(fat32_info) => { - self.iterate_fat32(dir_info, fat32_info, block_cache, func) + self.iterate_fat32(dir_info, fat32_info, block_cache, |de, odde| { + if let Some((start, this_seqno, csum, buffer)) = odde.lfn_contents() { + seq_state = seq_state.update(lfn_buffer, start, this_seqno, csum, buffer); + } else if let SeqState::Complete { csum } = seq_state { + if csum == de.name.csum() { + // Checksum is good, and all the pieces are there + func(de, Some(lfn_buffer.as_str())) + } else { + // Checksum was bad + func(de, None) + } + } else { + func(de, None) + } + }) } } } @@ -544,7 +649,7 @@ impl FatVolume { mut func: F, ) -> Result<(), Error> where - F: FnMut(&DirEntry), + F: for<'odde> FnMut(&DirEntry, &OnDiskDirEntry<'odde>), D: BlockDevice, { // Root directories on FAT16 have a fixed size, because they use @@ -573,11 +678,11 @@ impl FatVolume { if dir_entry.is_end() { // Can quit early return Ok(()); - } else if dir_entry.is_valid() && !dir_entry.is_lfn() { + } else if dir_entry.is_valid() { // Safe, since Block::LEN always fits on a u32 let start = (i * OnDiskDirEntry::LEN) as u32; let entry = dir_entry.get_entry(FatType::Fat16, block_idx, start); - func(&entry); + func(&entry, &dir_entry); } } } @@ -604,7 +709,7 @@ impl FatVolume { mut func: F, ) -> Result<(), Error> where - F: FnMut(&DirEntry), + F: for<'odde> FnMut(&DirEntry, &OnDiskDirEntry<'odde>), D: BlockDevice, { // All directories on FAT32 have a cluster chain but the root @@ -623,11 +728,11 @@ impl FatVolume { if dir_entry.is_end() { // Can quit early return Ok(()); - } else if dir_entry.is_valid() && !dir_entry.is_lfn() { + } else if dir_entry.is_valid() { // Safe, since Block::LEN always fits on a u32 let start = (i * OnDiskDirEntry::LEN) as u32; let entry = dir_entry.get_entry(FatType::Fat32, block_idx, start); - func(&entry); + func(&entry, &dir_entry); } } } diff --git a/src/filesystem/directory.rs b/src/filesystem/directory.rs index 5cfc5f0..c049352 100644 --- a/src/filesystem/directory.rs +++ b/src/filesystem/directory.rs @@ -1,6 +1,6 @@ use crate::blockdevice::BlockIdx; use crate::fat::{FatType, OnDiskDirEntry}; -use crate::filesystem::{Attributes, ClusterId, Handle, ShortFileName, Timestamp}; +use crate::filesystem::{Attributes, ClusterId, Handle, LfnBuffer, ShortFileName, Timestamp}; use crate::{Error, RawVolume, VolumeManager}; use super::ToShortFileName; @@ -145,6 +145,8 @@ where /// Call a callback function for each directory entry in a directory. /// + /// Long File Names will be ignored. + /// ///
/// /// Do not attempt to call any methods on the VolumeManager or any of its @@ -159,6 +161,33 @@ where self.volume_mgr.iterate_dir(self.raw_directory, func) } + /// Call a callback function for each directory entry in a directory, and + /// process Long File Names. + /// + /// You must supply a [`LfnBuffer`] this API can use to temporarily hold the + /// Long File Name. If you pass one that isn't large enough, any Long File + /// Names that don't fit will be ignored and presented as if they only had a + /// Short File Name. + /// + ///
+ /// + /// Do not attempt to call any methods on the VolumeManager or any of its + /// handles from inside the callback. You will get a lock error because the + /// object is already locked in order to do the iteration. + /// + ///
+ pub fn iterate_dir_lfn( + &self, + lfn_buffer: &mut LfnBuffer, + func: F, + ) -> Result<(), Error> + where + F: FnMut(&DirEntry, Option<&str>), + { + self.volume_mgr + .iterate_dir_lfn(self.raw_directory, lfn_buffer, func) + } + /// Open a file with the given full path. A file can only be opened once. pub fn open_file_in_dir( &self, diff --git a/src/filesystem/mod.rs b/src/filesystem/mod.rs index 92c94a1..668ac86 100644 --- a/src/filesystem/mod.rs +++ b/src/filesystem/mod.rs @@ -17,7 +17,7 @@ mod timestamp; pub use self::attributes::Attributes; pub use self::cluster::ClusterId; pub use self::directory::{DirEntry, Directory, RawDirectory}; -pub use self::filename::{FilenameError, ShortFileName, ToShortFileName}; +pub use self::filename::{FilenameError, LfnBuffer, ShortFileName, ToShortFileName}; pub use self::files::{File, FileError, Mode, RawFile}; pub use self::handles::{Handle, HandleGenerator}; pub use self::timestamp::{TimeSource, Timestamp}; diff --git a/src/volume_mgr.rs b/src/volume_mgr.rs index 75140d0..dab2f02 100644 --- a/src/volume_mgr.rs +++ b/src/volume_mgr.rs @@ -12,7 +12,7 @@ use heapless::Vec; use crate::{ debug, fat, filesystem::{ - Attributes, ClusterId, DirEntry, DirectoryInfo, FileInfo, HandleGenerator, Mode, + Attributes, ClusterId, DirEntry, DirectoryInfo, FileInfo, HandleGenerator, LfnBuffer, Mode, RawDirectory, RawFile, TimeSource, ToShortFileName, MAX_FILE_SIZE, }, trace, Block, BlockCache, BlockCount, BlockDevice, BlockIdx, Error, RawVolume, ShortFileName, @@ -382,6 +382,8 @@ where /// Call a callback function for each directory entry in a directory. /// + /// Long File Names will be ignored. + /// ///
/// /// Do not attempt to call any methods on the VolumeManager or any of its @@ -389,7 +391,11 @@ where /// object is already locked in order to do the iteration. /// ///
- pub fn iterate_dir(&self, directory: RawDirectory, func: F) -> Result<(), Error> + pub fn iterate_dir( + &self, + directory: RawDirectory, + mut func: F, + ) -> Result<(), Error> where F: FnMut(&DirEntry), { @@ -400,7 +406,59 @@ where let volume_idx = data.get_volume_by_id(data.open_dirs[directory_idx].raw_volume)?; match &data.open_volumes[volume_idx].volume_type { VolumeType::Fat(fat) => { - fat.iterate_dir(&mut data.block_cache, &data.open_dirs[directory_idx], func) + fat.iterate_dir( + &mut data.block_cache, + &data.open_dirs[directory_idx], + |de| { + // Hide all the LFN directory entries + if !de.attributes.is_lfn() { + func(de); + } + }, + ) + } + } + } + + /// Call a callback function for each directory entry in a directory, and + /// process Long File Names. + /// + /// You must supply a [`LfnBuffer`] this API can use to temporarily hold the + /// Long File Name. If you pass one that isn't large enough, any Long File + /// Names that don't fit will be ignored and presented as if they only had a + /// Short File Name. + /// + ///
+ /// + /// Do not attempt to call any methods on the VolumeManager or any of its + /// handles from inside the callback. You will get a lock error because the + /// object is already locked in order to do the iteration. + /// + ///
+ pub fn iterate_dir_lfn( + &self, + directory: RawDirectory, + lfn_buffer: &mut LfnBuffer, + func: F, + ) -> Result<(), Error> + where + F: FnMut(&DirEntry, Option<&str>), + { + let mut data = self.data.try_borrow_mut().map_err(|_| Error::LockError)?; + let data = data.deref_mut(); + + let directory_idx = data.get_dir_by_id(directory)?; + let volume_idx = data.get_volume_by_id(data.open_dirs[directory_idx].raw_volume)?; + + match &data.open_volumes[volume_idx].volume_type { + VolumeType::Fat(fat) => { + // This API doesn't care about the on-disk directory entry, so we discard it + fat.iterate_dir_lfn( + &mut data.block_cache, + lfn_buffer, + &data.open_dirs[directory_idx], + func, + ) } } } @@ -1005,6 +1063,7 @@ where // Need mutable access for this match &mut data.open_volumes[volume_idx].volume_type { VolumeType::Fat(fat) => { + // TODO: Move this into the FAT volume code debug!("Making dir entry"); let mut new_dir_entry_in_parent = fat.write_new_directory_entry( &mut data.block_cache, diff --git a/tests/directories.rs b/tests/directories.rs index 1acfb37..62aa72c 100644 --- a/tests/directories.rs +++ b/tests/directories.rs @@ -1,6 +1,6 @@ //! Directory related tests -use embedded_sdmmc::{Mode, ShortFileName}; +use embedded_sdmmc::{LfnBuffer, Mode, ShortFileName}; mod utils; @@ -48,52 +48,86 @@ fn fat16_root_directory_listing() { .expect("open root dir"); let expected = [ - ExpectedDirEntry { - name: String::from("README.TXT"), - mtime: String::from("2018-12-09 19:22:34"), - ctime: String::from("2018-12-09 19:22:34"), - size: 258, - is_dir: false, - }, - ExpectedDirEntry { - name: String::from("EMPTY.DAT"), - mtime: String::from("2018-12-09 19:21:16"), - ctime: String::from("2018-12-09 19:21:16"), - size: 0, - is_dir: false, - }, - ExpectedDirEntry { - name: String::from("TEST"), - mtime: String::from("2018-12-09 19:23:16"), - ctime: String::from("2018-12-09 19:23:16"), - size: 0, - is_dir: true, - }, - ExpectedDirEntry { - name: String::from("64MB.DAT"), - mtime: String::from("2018-12-09 19:21:38"), - ctime: String::from("2018-12-09 19:21:38"), - size: 64 * 1024 * 1024, - is_dir: false, - }, + ( + ExpectedDirEntry { + name: String::from("README.TXT"), + mtime: String::from("2018-12-09 19:22:34"), + ctime: String::from("2018-12-09 19:22:34"), + size: 258, + is_dir: false, + }, + None, + ), + ( + ExpectedDirEntry { + name: String::from("EMPTY.DAT"), + mtime: String::from("2018-12-09 19:21:16"), + ctime: String::from("2018-12-09 19:21:16"), + size: 0, + is_dir: false, + }, + None, + ), + ( + ExpectedDirEntry { + name: String::from("TEST"), + mtime: String::from("2018-12-09 19:23:16"), + ctime: String::from("2018-12-09 19:23:16"), + size: 0, + is_dir: true, + }, + None, + ), + ( + ExpectedDirEntry { + name: String::from("64MB.DAT"), + mtime: String::from("2018-12-09 19:21:38"), + ctime: String::from("2018-12-09 19:21:38"), + size: 64 * 1024 * 1024, + is_dir: false, + }, + None, + ), + ( + ExpectedDirEntry { + name: String::from("FSEVEN~4"), + mtime: String::from("2024-10-25 16:30:42"), + ctime: String::from("2024-10-25 16:30:42"), + size: 0, + is_dir: true, + }, + Some(String::from(".fseventsd")), + ), ]; let mut listing = Vec::new(); + let mut lfn_buffer: LfnBuffer<128> = LfnBuffer::new(); volume_mgr - .iterate_dir(root_dir, |d| { - listing.push(d.clone()); + .iterate_dir_lfn(root_dir, &mut lfn_buffer, |d, opt_lfn| { + listing.push((d.clone(), opt_lfn.map(String::from))); }) .expect("iterate directory"); - assert_eq!(expected.len(), listing.len()); for (expected_entry, given_entry) in expected.iter().zip(listing.iter()) { assert_eq!( - expected_entry, given_entry, + expected_entry.0, given_entry.0, + "{:#?} does not match {:#?}", + given_entry, expected_entry + ); + assert_eq!( + expected_entry.1, given_entry.1, "{:#?} does not match {:#?}", given_entry, expected_entry ); } + assert_eq!( + expected.len(), + listing.len(), + "{:#?} != {:#?}", + expected, + listing + ); } #[test] @@ -151,7 +185,6 @@ fn fat16_sub_directory_listing() { }) .expect("iterate directory"); - assert_eq!(expected.len(), listing.len()); for (expected_entry, given_entry) in expected.iter().zip(listing.iter()) { assert_eq!( expected_entry, given_entry, @@ -159,6 +192,13 @@ fn fat16_sub_directory_listing() { given_entry, expected_entry ); } + assert_eq!( + expected.len(), + listing.len(), + "{:#?} != {:#?}", + expected, + listing + ); } #[test] @@ -175,52 +215,106 @@ fn fat32_root_directory_listing() { .expect("open root dir"); let expected = [ - ExpectedDirEntry { - name: String::from("64MB.DAT"), - mtime: String::from("2018-12-09 19:22:56"), - ctime: String::from("2018-12-09 19:22:56"), - size: 64 * 1024 * 1024, - is_dir: false, - }, - ExpectedDirEntry { - name: String::from("EMPTY.DAT"), - mtime: String::from("2018-12-09 19:22:56"), - ctime: String::from("2018-12-09 19:22:56"), - size: 0, - is_dir: false, - }, - ExpectedDirEntry { - name: String::from("README.TXT"), - mtime: String::from("2023-09-21 09:48:06"), - ctime: String::from("2018-12-09 19:22:56"), - size: 258, - is_dir: false, - }, - ExpectedDirEntry { - name: String::from("TEST"), - mtime: String::from("2018-12-09 19:23:20"), - ctime: String::from("2018-12-09 19:23:20"), - size: 0, - is_dir: true, - }, + ( + ExpectedDirEntry { + name: String::from("64MB.DAT"), + mtime: String::from("2018-12-09 19:22:56"), + ctime: String::from("2018-12-09 19:22:56"), + size: 64 * 1024 * 1024, + is_dir: false, + }, + None, + ), + ( + ExpectedDirEntry { + name: String::from("EMPTY.DAT"), + mtime: String::from("2018-12-09 19:22:56"), + ctime: String::from("2018-12-09 19:22:56"), + size: 0, + is_dir: false, + }, + None, + ), + ( + ExpectedDirEntry { + name: String::from("README.TXT"), + mtime: String::from("2023-09-21 09:48:06"), + ctime: String::from("2018-12-09 19:22:56"), + size: 258, + is_dir: false, + }, + None, + ), + ( + ExpectedDirEntry { + name: String::from("TEST"), + mtime: String::from("2018-12-09 19:23:20"), + ctime: String::from("2018-12-09 19:23:20"), + size: 0, + is_dir: true, + }, + None, + ), + ( + ExpectedDirEntry { + name: String::from("FSEVEN~4"), + mtime: String::from("2024-10-25 16:30:42"), + ctime: String::from("2024-10-25 16:30:42"), + size: 0, + is_dir: true, + }, + Some(String::from(".fseventsd")), + ), + ( + ExpectedDirEntry { + name: String::from("THISIS~9"), + mtime: String::from("2024-10-25 16:30:54"), + ctime: String::from("2024-10-25 16:30:50"), + size: 0, + is_dir: true, + }, + Some(String::from("This is a long file name £99")), + ), + ( + ExpectedDirEntry { + name: String::from("COPYO~13.TXT"), + mtime: String::from("2024-10-25 16:31:14"), + ctime: String::from("2018-12-09 19:22:56"), + size: 258, + is_dir: false, + }, + Some(String::from("Copy of Readme.txt")), + ), ]; let mut listing = Vec::new(); + let mut lfn_buffer: LfnBuffer<128> = LfnBuffer::new(); volume_mgr - .iterate_dir(root_dir, |d| { - listing.push(d.clone()); + .iterate_dir_lfn(root_dir, &mut lfn_buffer, |d, opt_lfn| { + listing.push((d.clone(), opt_lfn.map(String::from))); }) .expect("iterate directory"); - assert_eq!(expected.len(), listing.len()); for (expected_entry, given_entry) in expected.iter().zip(listing.iter()) { assert_eq!( - expected_entry, given_entry, + expected_entry.0, given_entry.0, + "{:#?} does not match {:#?}", + given_entry, expected_entry + ); + assert_eq!( + expected_entry.1, given_entry.1, "{:#?} does not match {:#?}", given_entry, expected_entry ); } + assert_eq!( + expected.len(), + listing.len(), + "{:#?} != {:#?}", + expected, + listing + ); } #[test] diff --git a/tests/disk.img.gz b/tests/disk.img.gz index 8df362bcc05eb233a964c8d5252a1ef7450309fc..1ba2bdfd1f75fb2d39e1ffec210c8bd4d4312f0f 100644 GIT binary patch delta 83661 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 DDy6Pr delta 96624 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
  • YR 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 From 1ed2c1a1ad39788cb54d4074ae481dea4cb89b1b Mon Sep 17 00:00:00 2001 From: Jonathan Pallant Date: Fri, 25 Oct 2024 18:17:05 +0100 Subject: [PATCH 6/9] Fix defmt logs for LFNs. --- src/fat/volume.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/fat/volume.rs b/src/fat/volume.rs index 503a7e8..0e81921 100644 --- a/src/fat/volume.rs +++ b/src/fat/volume.rs @@ -567,7 +567,13 @@ impl FatVolume { csum: u8, buffer: [u16; 13], ) -> Self { + #[cfg(feature = "log")] debug!("LFN Contents {start} {sequence} {csum:02x} {buffer:04x?}"); + #[cfg(feature = "defmt-log")] + debug!( + "LFN Contents {=u8} {=u8} {=u8:02x} {=[?; 13]:#04x}", + start, sequence, csum, buffer + ); match (start, sequence, self) { (true, 0x01, _) => { lfn_buffer.clear(); From c8cc20fc9c5a21ae064e87c67a2398ab08ab49d4 Mon Sep 17 00:00:00 2001 From: Jonathan 'theJPster' Pallant Date: Sun, 27 Oct 2024 12:23:30 +0000 Subject: [PATCH 7/9] LfnBuffer now borrows its contents. Removes a bunch of const generics from the API. --- examples/shell.rs | 3 ++- src/fat/volume.rs | 8 ++++---- src/filesystem/directory.rs | 4 ++-- src/filesystem/filename.rs | 31 +++++++++++++------------------ src/volume_mgr.rs | 4 ++-- tests/directories.rs | 6 ++++-- 6 files changed, 27 insertions(+), 29 deletions(-) diff --git a/examples/shell.rs b/examples/shell.rs index d4bdd16..5c6b0e5 100644 --- a/examples/shell.rs +++ b/examples/shell.rs @@ -231,7 +231,8 @@ impl Context { fn dir(&self, path: &Path) -> Result<(), Error> { println!("Directory listing of {:?}", path); let dir = self.resolve_existing_directory(path)?; - let mut lfn_buffer = LfnBuffer::<256>::new(); + let mut storage = [0u8; 128]; + let mut lfn_buffer = LfnBuffer::new(&mut storage); dir.iterate_dir_lfn(&mut lfn_buffer, |entry, lfn| { if !entry.attributes.is_volume() { print!( diff --git a/src/fat/volume.rs b/src/fat/volume.rs index 0e81921..5d8307d 100644 --- a/src/fat/volume.rs +++ b/src/fat/volume.rs @@ -540,10 +540,10 @@ impl FatVolume { /// including the Long File Name. /// /// Useful for performing directory listings. - pub(crate) fn iterate_dir_lfn( + pub(crate) fn iterate_dir_lfn( &self, block_cache: &mut BlockCache, - lfn_buffer: &mut LfnBuffer, + lfn_buffer: &mut LfnBuffer<'_>, dir_info: &DirectoryInfo, mut func: F, ) -> Result<(), Error> @@ -559,9 +559,9 @@ impl FatVolume { } impl SeqState { - fn update( + fn update( self, - lfn_buffer: &mut LfnBuffer, + lfn_buffer: &mut LfnBuffer<'_>, start: bool, sequence: u8, csum: u8, diff --git a/src/filesystem/directory.rs b/src/filesystem/directory.rs index c049352..527807b 100644 --- a/src/filesystem/directory.rs +++ b/src/filesystem/directory.rs @@ -176,9 +176,9 @@ where /// object is already locked in order to do the iteration. /// ///
  • - pub fn iterate_dir_lfn( + pub fn iterate_dir_lfn( &self, - lfn_buffer: &mut LfnBuffer, + lfn_buffer: &mut LfnBuffer<'_>, func: F, ) -> Result<(), Error> where diff --git a/src/filesystem/filename.rs b/src/filesystem/filename.rs index e3f4f6e..2f197c8 100644 --- a/src/filesystem/filename.rs +++ b/src/filesystem/filename.rs @@ -221,11 +221,9 @@ impl core::fmt::Debug for ShortFileName { } /// Used to store a Long File Name -/// -/// The const generic specifies the maximum capacity in bytes. -pub struct LfnBuffer { +pub struct LfnBuffer<'a> { /// We fill this buffer in from the back - inner: [u8; N], + inner: &'a mut [u8], /// How many bytes are free. /// /// This is also the byte index the string starts from. @@ -234,19 +232,20 @@ pub struct LfnBuffer { overflow: bool, } -impl LfnBuffer { - /// Create a new, empty, LFN Buffer - pub fn new() -> LfnBuffer { +impl<'a> LfnBuffer<'a> { + /// Create a new, empty, LFN Buffer using the given mutable slice as its storage. + pub fn new(storage: &'a mut [u8]) -> LfnBuffer<'a> { + let len = storage.len(); LfnBuffer { - inner: [0u8; N], - free: N, + inner: storage, + free: len, overflow: false, } } /// Empty out this buffer pub fn clear(&mut self) { - self.free = N; + self.free = self.inner.len(); self.overflow = false; } @@ -291,12 +290,6 @@ impl LfnBuffer { } } -impl core::default::Default for LfnBuffer { - fn default() -> Self { - LfnBuffer::new() - } -} - // **************************************************************************** // // Unit Tests @@ -402,7 +395,8 @@ mod test { #[test] fn one_piece() { - let mut buf: LfnBuffer<64> = LfnBuffer::new(); + let mut storage = [0u8; 64]; + let mut buf: LfnBuffer = LfnBuffer::new(&mut storage); buf.push(&[ 0x0030, 0x0031, 0x0032, 0x0033, 0x2202, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, @@ -412,7 +406,8 @@ mod test { #[test] fn two_piece() { - let mut buf: LfnBuffer<64> = LfnBuffer::new(); + let mut storage = [0u8; 64]; + let mut buf: LfnBuffer = LfnBuffer::new(&mut storage); buf.push(&[ 0x0030, 0x0031, 0x0032, 0x0033, 0x2202, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, diff --git a/src/volume_mgr.rs b/src/volume_mgr.rs index dab2f02..f359460 100644 --- a/src/volume_mgr.rs +++ b/src/volume_mgr.rs @@ -435,10 +435,10 @@ where /// object is already locked in order to do the iteration. /// /// - pub fn iterate_dir_lfn( + pub fn iterate_dir_lfn( &self, directory: RawDirectory, - lfn_buffer: &mut LfnBuffer, + lfn_buffer: &mut LfnBuffer<'_>, func: F, ) -> Result<(), Error> where diff --git a/tests/directories.rs b/tests/directories.rs index 62aa72c..e2e20d2 100644 --- a/tests/directories.rs +++ b/tests/directories.rs @@ -101,7 +101,8 @@ fn fat16_root_directory_listing() { ]; let mut listing = Vec::new(); - let mut lfn_buffer: LfnBuffer<128> = LfnBuffer::new(); + let mut storage = [0u8; 128]; + let mut lfn_buffer: LfnBuffer = LfnBuffer::new(&mut storage); volume_mgr .iterate_dir_lfn(root_dir, &mut lfn_buffer, |d, opt_lfn| { @@ -288,7 +289,8 @@ fn fat32_root_directory_listing() { ]; let mut listing = Vec::new(); - let mut lfn_buffer: LfnBuffer<128> = LfnBuffer::new(); + let mut storage = [0u8; 128]; + let mut lfn_buffer: LfnBuffer = LfnBuffer::new(&mut storage); volume_mgr .iterate_dir_lfn(root_dir, &mut lfn_buffer, |d, opt_lfn| { From b77b9caf50daf01c62289c734818d48b95e6b461 Mon Sep 17 00:00:00 2001 From: Jonathan 'theJPster' Pallant Date: Sun, 27 Oct 2024 13:43:33 +0000 Subject: [PATCH 8/9] Handle surrogate-pairs in LFNs. --- src/filesystem/filename.rs | 97 ++++++++++++++++++++++++++++++++++---- 1 file changed, 88 insertions(+), 9 deletions(-) diff --git a/src/filesystem/filename.rs b/src/filesystem/filename.rs index 2f197c8..31d2854 100644 --- a/src/filesystem/filename.rs +++ b/src/filesystem/filename.rs @@ -221,6 +221,7 @@ impl core::fmt::Debug for ShortFileName { } /// Used to store a Long File Name +#[derive(Debug)] pub struct LfnBuffer<'a> { /// We fill this buffer in from the back inner: &'a mut [u8], @@ -230,6 +231,8 @@ pub struct LfnBuffer<'a> { free: usize, /// Did we overflow? overflow: bool, + /// If a surrogate-pair is split over two directory entries, remember half of it here. + unpaired_surrogate: Option, } impl<'a> LfnBuffer<'a> { @@ -240,6 +243,7 @@ impl<'a> LfnBuffer<'a> { inner: storage, free: len, overflow: false, + unpaired_surrogate: None, } } @@ -247,12 +251,26 @@ impl<'a> LfnBuffer<'a> { pub fn clear(&mut self) { self.free = self.inner.len(); self.overflow = false; + self.unpaired_surrogate = None; } - /// Push the 13 UCS-2 characters into this string + /// Push the 13 UTF-16 codepoints into this string. /// /// We assume they are pushed last-chunk-first, as you would find /// them on disk. + /// + /// Any chunk starting with a half of a surrogate pair has that saved for the next call. + /// + /// ```text + /// [de00, 002e, 0074, 0078, 0074, 0000, ffff, ffff, ffff, ffff, ffff, ffff, ffff] + /// [0041, 0042, 0030, 0031, 0032, 0033, 0034, 0035, 0036, 0037, 0038, 0039, d83d] + /// + /// Would map to + /// + /// 0041 0042 0030 0031 0032 0033 0034 0035 0036 0037 0038 0039 1f600 002e 0074 0078 0074, or + /// + /// "AB0123456789😀.txt" + /// ``` pub fn push(&mut self, buffer: &[u16; 13]) { // find the first null, if any let null_idx = buffer @@ -261,18 +279,60 @@ impl<'a> LfnBuffer<'a> { .unwrap_or(buffer.len()); // take all the wide chars, up to the null (or go to the end) let buffer = &buffer[0..null_idx]; - for ch in buffer.iter().rev() { - let ch = char::from_u32(*ch as u32).unwrap_or('?'); + + // This next part will convert the 16-bit values into chars, noting that + // chars outside the Basic Multilingual Plane will require two 16-bit + // values to encode (see UTF-16 Surrogate Pairs). + // + // We cache the decoded chars into this array so we can iterate them + // backwards. It's 60 bytes, but it'll have to do. + let mut char_vec: heapless::Vec = heapless::Vec::new(); + // Now do the decode, including the unpaired surrogate (if any) from + // last time (maybe it has a pair now!) + let mut is_first = true; + for ch in char::decode_utf16( + buffer + .iter() + .cloned() + .chain(self.unpaired_surrogate.take().iter().cloned()), + ) { + match ch { + Ok(ch) => { + char_vec.push(ch).expect("Vec was full!?"); + } + Err(e) => { + // OK, so we found half a surrogate pair and nothing to go + // with it. Was this the first codepoint in the chunk? + if is_first { + // it was - the other half is probably in the next chunk + // so save this for next time + trace!("LFN saved {:?}", e.unpaired_surrogate()); + self.unpaired_surrogate = Some(e.unpaired_surrogate()); + } else { + // it wasn't - can't deal with it these mid-sequence, so + // replace it + trace!("LFN replaced {:?}", e.unpaired_surrogate()); + char_vec.push('\u{fffd}').expect("Vec was full?!"); + } + } + } + is_first = false; + } + + for ch in char_vec.iter().rev() { trace!("LFN push {:?}", ch); - let mut ch_bytes = [0u8; 4]; - // a buffer of length 4 is always enough - let ch_str = ch.encode_utf8(&mut ch_bytes); - if self.free < ch_str.len() { + // a buffer of length 4 is enough to encode any char + let mut encoded_ch = [0u8; 4]; + let encoded_ch = ch.encode_utf8(&mut encoded_ch); + if self.free < encoded_ch.len() { + // the LFN buffer they gave us was not long enough. Note for + // later, so we don't show them garbage. self.overflow = true; return; } - // store the encoded character in the buffer, working backwards - for b in ch_str.bytes().rev() { + // Store the encoded char in the buffer, working backwards. We + // already checked there was enough space. + for b in encoded_ch.bytes().rev() { self.free -= 1; self.inner[self.free] = b; } @@ -280,6 +340,9 @@ impl<'a> LfnBuffer<'a> { } /// View this LFN buffer as a string-slice + /// + /// If the buffer overflowed while parsing the LFN, or if this buffer is + /// empty, you get an empty string. pub fn as_str(&self) -> &str { if self.overflow { "" @@ -418,6 +481,22 @@ mod test { ]); assert_eq!(buf.as_str(), "ABCDEFGHIJKLM0123∂"); } + + #[test] + fn two_piece_split_surrogate() { + let mut storage = [0u8; 64]; + let mut buf: LfnBuffer = LfnBuffer::new(&mut storage); + + buf.push(&[ + 0xde00, 0x002e, 0x0074, 0x0078, 0x0074, 0x0000, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, + 0xffff, 0xffff, + ]); + buf.push(&[ + 0xd83d, 0xde00, 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, + 0x0039, 0xd83d, + ]); + assert_eq!(buf.as_str(), "😀0123456789😀.txt"); + } } // **************************************************************************** From 837ae27ac259f1c4c0f3a99c6ef0c050061689af Mon Sep 17 00:00:00 2001 From: Jonathan 'theJPster' Pallant Date: Tue, 29 Oct 2024 11:47:03 +0000 Subject: [PATCH 9/9] Add missing items to CHANGELOG. --- CHANGELOG.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3361d1a..3a5e92e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,15 +8,21 @@ The format is based on [Keep a Changelog] and this project adheres to [Semantic ### Changed -- None +- __Breaking Change__: `VolumeManager` now uses interior-mutability (with a `RefCell`) and so most methods are now `&self`. This also makes it easier to open multiple `File`, `Directory` or `Volume` objects at once. +- __Breaking Change__: The `VolumeManager`, `File`, `Directory` and `Volume` no longer implement `Send` or `Sync. +- `VolumeManager` uses an interior block cache of 512 bytes, increasing its size by about 520 bytes but hugely reducing stack space required at run-time. +- __Breaking Change__: The `VolumeManager::device` method now takes a callback rather than giving you a reference to the underlying `BlockDevice` +- __Breaking Change__: `Error:LockError` variant added. +- __Breaking Change__: `SearchId` was renamed to `Handle` ### Added - `File` now implements the `embedded-io` `Read`, `Write` and `Seek` traits. +- New `iterate_dir_lfn` method on `VolumeManager` and `Directory` - provides decoded Long File Names as `Option<&str>` ### Removed -- None +- __Breaking Change__: Removed the `reason: &str` argument from `BlockDevice` ## [Version 0.8.0] - 2024-07-12