void FArchiveFileReaderWindows::Serialize( void* V, INT Length ) { while( Length>0 ) { INT Copy = Min( Length, BufferBase+BufferCount-Pos ); if( Copy<=0 ) { if( Length >= ARRAY_COUNT(Buffer) ) { INT Count=0; // Read data from device via Win32 ReadFile API. { SCOPED_FILE_IO_READ_STATS( StatsHandle, Length, Pos ); ReadFile( Handle, V, Length, (DWORD*)&Count, NULL ); } if( Count!=Length ) { ArIsError = 1; Error->Logf( TEXT("ReadFile failed: Count=%i Length=%i Error=%s for file %s"), Count, Length, appGetSystemErrorMessage(), *Filename ); } Pos += Length; BufferBase += Length; return; } InternalPrecache( Pos, MAXINT ); Copy = Min( Length, BufferBase+BufferCount-Pos ); if( Copy<=0 ) { ArIsError = 1; Error->Logf( TEXT("ReadFile beyond EOF %i+%i/%i for file %s"), Pos, Length, Size, *Filename ); } if( ArIsError ) { return; } } appMemcpy( V, Buffer+Pos-BufferBase, Copy ); Pos += Copy; Length -= Copy; V = (BYTE*)V + Copy; } }
void FArchiveFileReaderGeneric::Serialize( void* V, int64 Length ) { while( Length>0 ) { int64 Copy = FMath::Min( Length, BufferBase+BufferCount-Pos ); if( Copy<=0 ) { if( Length >= ARRAY_COUNT( Buffer ) ) { int64 Count=0; { ReadLowLevel(( uint8* )V, Length, Count ); } if( Count!=Length ) { TCHAR ErrorBuffer[1024]; ArIsError = true; UE_LOG( LogFileManager, Warning, TEXT( "ReadFile failed: Count=%lld Length=%lld Error=%s for file %s" ), Count, Length, FPlatformMisc::GetSystemErrorMessage( ErrorBuffer, 1024, 0 ), *Filename ); } Pos += Length; return; } InternalPrecache( Pos, MAX_int32 ); Copy = FMath::Min( Length, BufferBase+BufferCount-Pos ); if( Copy<=0 ) { ArIsError = true; UE_LOG( LogFileManager, Error, TEXT( "ReadFile beyond EOF %lld+%lld/%lld for file %s" ), Pos, Length, Size, *Filename ); } if( ArIsError ) { return; } } FMemory::Memcpy( V, Buffer+Pos-BufferBase, Copy ); Pos += Copy; Length -= Copy; V =( uint8* )V + Copy; } }