@ -77,7 +77,7 @@ namespace AZ::IO
return m_findData & & m_lastFetchValid ;
}
void FindData : : Scan ( IArchive * archive , AZStd : : string_view szDir , bool bAllowUseFS )
void FindData : : Scan ( IArchive * archive , AZStd : : string_view szDir , bool bAllowUseFS , bool bScanZips )
{
// get the priority into local variable to avoid it changing in the course of
// this function execution
@ -87,12 +87,18 @@ namespace AZ::IO
{
// first, find the file system files
ScanFS ( archive , szDir ) ;
ScanZips ( archive , szDir ) ;
if ( bScanZips )
{
ScanZips ( archive , szDir ) ;
}
}
else
{
// first, find the zip files
ScanZips ( archive , szDir ) ;
if ( bScanZips )
{
ScanZips ( archive , szDir ) ;
}
if ( bAllowUseFS | | nVarPakPriority ! = ArchiveLocationPriority : : ePakPriorityPakOnly )
{
ScanFS ( archive , szDir ) ;
@ -111,30 +117,31 @@ namespace AZ::IO
}
AZ : : IO : : FileIOBase : : GetDirectInstance ( ) - > FindFiles ( searchDirectory . c_str ( ) , pattern . c_str ( ) , [ & ] ( const char * filePath ) - > bool
{
AZ : : IO : : FileDesc fileDesc ;
AZStd : : string filePathEntry { filePath } ;
AZ : : IO : : ArchiveFileIterator fileIterator ;
fileIterator . m_filename = AZ : : IO : : PathView ( filePath ) . Filename ( ) . Native ( ) ;
fileIterator . m_fileDesc . nAttrib = { } ;
if ( AZ : : IO : : FileIOBase : : GetDirectInstance ( ) - > IsDirectory ( filePath ) )
{
fileDesc . nAttrib = fileDesc . nAttrib | AZ : : IO : : FileDesc : : Attribute : : Subdirectory ;
fileIterator . m_fileDesc . nAttrib = fileIterator . m_fileDesc . nAttrib | AZ : : IO : : FileDesc : : Attribute : : Subdirectory ;
m_fileStack . emplace_back ( AZStd : : move ( fileIterator ) ) ;
}
else
{
if ( AZ : : IO : : FileIOBase : : GetDirectInstance ( ) - > IsReadOnly ( filePath ) )
{
file Desc. nAttrib = fileDesc. nAttrib | AZ : : IO : : FileDesc : : Attribute : : ReadOnly ;
file Iterator. m_file Desc. nAttrib = fileIterator. m_ fileDesc. nAttrib | AZ : : IO : : FileDesc : : Attribute : : ReadOnly ;
}
AZ : : u64 fileSize = 0 ;
AZ : : IO : : FileIOBase : : GetDirectInstance ( ) - > Size ( filePath , fileSize ) ;
file Desc. nSize = fileSize ;
file Desc. tWrite = AZ : : IO : : FileIOBase : : GetDirectInstance ( ) - > ModificationTime ( filePath ) ;
file Iterator. m_file Desc. nSize = fileSize ;
file Iterator. m_file Desc. tWrite = AZ : : IO : : FileIOBase : : GetDirectInstance ( ) - > ModificationTime ( filePath ) ;
// These times are not supported by our file interface
fileDesc . tAccess = fileDesc . tWrite ;
fileDesc . tCreate = fileDesc . tWrite ;
fileIterator . m_fileDesc . tAccess = fileIterator . m_fileDesc . tWrite ;
fileIterator . m_fileDesc . tCreate = fileIterator . m_fileDesc . tWrite ;
m_fileStack . emplace_back ( AZStd : : move ( fileIterator ) ) ;
}
[[maybe_unused]] auto result = m_mapFiles . emplace ( AZStd : : move ( filePathEntry ) , fileDesc ) ;
AZ_Assert ( result . second , " Failed to insert FindData entry for filePath %s " , filePath ) ;
return true ;
} ) ;
}
@ -164,7 +171,7 @@ namespace AZ::IO
fileDesc . nAttrib = AZ : : IO : : FileDesc : : Attribute : : ReadOnly | AZ : : IO : : FileDesc : : Attribute : : Archive ;
fileDesc . nSize = fileEntry - > desc . lSizeUncompressed ;
fileDesc . tWrite = fileEntry - > GetModificationTime ( ) ;
m_ mapFiles. emplace ( fname , fileDesc ) ;
m_ fileStack. emplace_back ( AZ : : IO : : ArchiveFileIterator { this , fname , fileDesc } ) ;
}
ZipDir : : FindDir findDirectoryEntry ( zipCache ) ;
@ -177,7 +184,7 @@ namespace AZ::IO
}
AZ : : IO : : FileDesc fileDesc ;
fileDesc . nAttrib = AZ : : IO : : FileDesc : : Attribute : : ReadOnly | AZ : : IO : : FileDesc : : Attribute : : Archive | AZ : : IO : : FileDesc : : Attribute : : Subdirectory ;
m_ mapFiles. emplace ( fname , fileDesc ) ;
m_ fileStack. emplace_back ( AZ : : IO : : ArchiveFileIterator { this , fname , fileDesc } ) ;
}
} ;
@ -246,7 +253,7 @@ namespace AZ::IO
if ( ! bindRootIter - > empty ( ) & & AZStd : : wildcard_match ( sourcePathRemainder . Native ( ) , bindRootIter - > Native ( ) ) )
{
AZ : : IO : : FileDesc fileDesc { AZ : : IO : : FileDesc : : Attribute : : ReadOnly | AZ : : IO : : FileDesc : : Attribute : : Archive | AZ : : IO : : FileDesc : : Attribute : : Subdirectory } ;
m_ mapFiles. emplace ( bindRootIter - > Native ( ) , fileDesc ) ;
m_ fileStack. emplace_back ( AZ : : IO : : ArchiveFileIterator { this , bindRootIter - > Native ( ) , fileDesc } ) ;
}
}
else
@ -262,22 +269,19 @@ namespace AZ::IO
AZ : : IO : : ArchiveFileIterator FindData : : Fetch ( )
{
AZ : : IO : : ArchiveFileIterator fileIterator ;
fileIterator . m_findData = this ;
if ( m_mapFiles . empty ( ) )
if ( m_fileStack . empty ( ) )
{
return fileIterator ;
AZ : : IO : : ArchiveFileIterator emptyFileIterator ;
emptyFileIterator . m_lastFetchValid = false ;
emptyFileIterator . m_findData = this ;
return emptyFileIterator ;
}
auto pakFileIter = m_mapFiles . begin ( ) ;
AZStd : : string fullFilePath ;
AZ : : StringFunc : : Path : : GetFullFileName ( pakFileIter - > first . c_str ( ) , fullFilePath ) ;
fileIterator . m_filename = AZStd : : move ( fullFilePath ) ;
fileIterator . m_fileDesc = pakFileIter - > second ;
fileIterator . m_lastFetchValid = true ;
// Remove Fetched item from the FindData map so that the iteration continues
m_mapFiles . erase ( pakFileIter ) ;
AZ : : IO : : ArchiveFileIterator fileIterator { m_fileStack . back ( ) } ;
fileIterator . m_lastFetchValid = true ;
fileIterator . m_findData = this ;
m_fileStack . pop_back ( ) ;
return fileIterator ;
}
}