@@ -11,6 +11,7 @@ use crate::{
1111} ;
1212use byteorder:: { ByteOrder , LittleEndian } ;
1313use core:: convert:: TryFrom ;
14+ use heapless:: String ;
1415
1516use 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