Skip to content

Commit a1716e0

Browse files
committed
Add LFN support
1 parent 011726b commit a1716e0

File tree

1 file changed

+32
-5
lines changed

1 file changed

+32
-5
lines changed

src/fat/volume.rs

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ use crate::{
1111
};
1212
use byteorder::{ByteOrder, LittleEndian};
1313
use core::convert::TryFrom;
14+
use heapless::String;
1415

1516
use super::BlockCache;
1617

@@ -532,6 +533,10 @@ impl FatVolume {
532533
};
533534
let mut blocks = [Block::new()];
534535
let mut block_cache = BlockCache::empty();
536+
537+
let mut lfn_buffer = [[' '; 13]; 8];
538+
let mut lfn_pointer = 0;
539+
535540
while let Some(cluster) = current_cluster {
536541
let block_idx = self.cluster_to_block(cluster);
537542
for block in block_idx.range(BlockCount(u32::from(self.blocks_per_cluster))) {
@@ -545,11 +550,33 @@ impl FatVolume {
545550
if dir_entry.is_end() {
546551
// Can quit early
547552
return Ok(());
548-
} else if dir_entry.is_valid() && !dir_entry.is_lfn() {
549-
// Safe, since Block::LEN always fits on a u32
550-
let start = u32::try_from(start).unwrap();
551-
let entry = dir_entry.get_entry(FatType::Fat32, block, start);
552-
func(&entry);
553+
} else if dir_entry.is_valid() {
554+
if dir_entry.is_lfn() {
555+
if let Some((_, _, data)) = dir_entry.lfn_contents() {
556+
lfn_buffer[lfn_pointer] = data.clone();
557+
lfn_pointer += 1;
558+
}
559+
} else {
560+
if lfn_pointer > 0 {
561+
let mut filename: String<255> = String::new();
562+
while lfn_pointer > 0 {
563+
lfn_pointer -= 1;
564+
for i in 0..13 {
565+
// This will only happen on last chunk after last
566+
// character, so simple break is enough
567+
if lfn_buffer[lfn_pointer][i] == '\0' {
568+
break;
569+
} else {
570+
filename.push(lfn_buffer[lfn_pointer][i]);
571+
}
572+
}
573+
}
574+
}
575+
// Safe, since Block::LEN always fits on a u32
576+
let start = u32::try_from(start).unwrap();
577+
let entry = dir_entry.get_entry(FatType::Fat32, block, start);
578+
func(&entry);
579+
}
553580
}
554581
}
555582
}

0 commit comments

Comments
 (0)