implement the different reader types.
This commit is contained in:
parent
11d6b3e5b4
commit
737e3f22d7
12 changed files with 73 additions and 43 deletions
|
|
@ -180,7 +180,7 @@ public:
|
|||
bool Open(LumpFilterInfo* filter, FileSystemMessageFunc Printf);
|
||||
virtual ~F7ZFile();
|
||||
FileData Read(int entry) override;
|
||||
FileReader GetEntryReader(uint32_t entry, bool) override;
|
||||
FileReader GetEntryReader(uint32_t entry, int, int) override;
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -335,7 +335,7 @@ FileData F7ZFile::Read(int entry)
|
|||
//
|
||||
//==========================================================================
|
||||
|
||||
FileReader F7ZFile::GetEntryReader(uint32_t entry, bool)
|
||||
FileReader F7ZFile::GetEntryReader(uint32_t entry, int, int)
|
||||
{
|
||||
FileReader fr;
|
||||
if (entry < 0 || entry >= NumLumps) return fr;
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ class FDirectory : public FResourceFile
|
|||
public:
|
||||
FDirectory(const char * dirname, StringPool* sp, bool nosubdirflag = false);
|
||||
bool Open(LumpFilterInfo* filter, FileSystemMessageFunc Printf);
|
||||
FileReader GetEntryReader(uint32_t entry, bool newreader = true) override;
|
||||
FileReader GetEntryReader(uint32_t entry, int, int) override;
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -162,13 +162,18 @@ bool FDirectory::Open(LumpFilterInfo* filter, FileSystemMessageFunc Printf)
|
|||
//
|
||||
//==========================================================================
|
||||
|
||||
FileReader FDirectory::GetEntryReader(uint32_t entry, bool newreader)
|
||||
FileReader FDirectory::GetEntryReader(uint32_t entry, int readertype, int)
|
||||
{
|
||||
FileReader fr;
|
||||
if (entry < NumLumps)
|
||||
{
|
||||
std::string fn = mBasePath; fn += Entries[entry].FileName;
|
||||
fr.OpenFile(fn.c_str());
|
||||
if (readertype == READER_CACHED)
|
||||
{
|
||||
auto data = fr.Read();
|
||||
fr.OpenMemoryArray(data);
|
||||
}
|
||||
}
|
||||
return fr;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -940,7 +940,7 @@ bool OpenDecompressor(FileReader& self, FileReader &parent, FileReader::Size len
|
|||
return false;
|
||||
}
|
||||
fr = new MemoryArrayReader(buffer);
|
||||
flags &= ~DCF_SEEKABLE;
|
||||
flags &= ~(DCF_SEEKABLE | DCF_CACHED);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -949,7 +949,7 @@ bool OpenDecompressor(FileReader& self, FileReader &parent, FileReader::Size len
|
|||
FileData buffer(nullptr, length);
|
||||
ShrinkLoop(buffer.writable(), length, *p, p->GetLength()); // this never fails.
|
||||
fr = new MemoryArrayReader(buffer);
|
||||
flags &= ~DCF_SEEKABLE;
|
||||
flags &= ~(DCF_SEEKABLE | DCF_CACHED);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -965,7 +965,7 @@ bool OpenDecompressor(FileReader& self, FileReader &parent, FileReader::Size len
|
|||
bufr[i] ^= i >> 1;
|
||||
}
|
||||
fr = new MemoryArrayReader(buffer);
|
||||
flags &= ~DCF_SEEKABLE;
|
||||
flags &= ~(DCF_SEEKABLE | DCF_CACHED);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
@ -980,7 +980,14 @@ bool OpenDecompressor(FileReader& self, FileReader &parent, FileReader::Size len
|
|||
}
|
||||
dec->Length = length;
|
||||
}
|
||||
if ((flags & DCF_SEEKABLE))
|
||||
if ((flags & DCF_CACHED))
|
||||
{
|
||||
// read everything into a MemoryArrayReader.
|
||||
FileData data(nullptr, length);
|
||||
fr->Read(data.writable(), length);
|
||||
fr = new MemoryArrayReader(data);
|
||||
}
|
||||
else if ((flags & DCF_SEEKABLE))
|
||||
{
|
||||
// create a wrapper that can buffer the content so that seeking is possible
|
||||
fr = new BufferingReader(fr);
|
||||
|
|
|
|||
|
|
@ -396,7 +396,7 @@ void FileSystem::AddFile (const char *filename, FileReader *filer, LumpFilterInf
|
|||
std::string path = filename;
|
||||
path += ':';
|
||||
path += resfile->getName(i);
|
||||
auto embedded = resfile->GetEntryReader(i, true);
|
||||
auto embedded = resfile->GetEntryReader(i, READER_NEW, READERFLAG_SEEKABLE);
|
||||
AddFile(path.c_str(), &embedded, filter, Printf, hashfile);
|
||||
}
|
||||
}
|
||||
|
|
@ -428,7 +428,7 @@ void FileSystem::AddFile (const char *filename, FileReader *filer, LumpFilterInf
|
|||
int flags = resfile->GetEntryFlags(i);
|
||||
if (!(flags & RESFF_EMBEDDED))
|
||||
{
|
||||
auto reader = resfile->GetEntryReader(i, true);
|
||||
auto reader = resfile->GetEntryReader(i, READER_SHARED, 0);
|
||||
md5Hash(filereader, cksum);
|
||||
|
||||
for (size_t j = 0; j < sizeof(cksum); ++j)
|
||||
|
|
@ -1306,7 +1306,7 @@ FileData FileSystem::ReadFile (int lump)
|
|||
//==========================================================================
|
||||
|
||||
|
||||
FileReader FileSystem::OpenFileReader(int lump)
|
||||
FileReader FileSystem::OpenFileReader(int lump, int readertype, int readerflags)
|
||||
{
|
||||
if ((unsigned)lump >= (unsigned)FileInfo.size())
|
||||
{
|
||||
|
|
@ -1314,18 +1314,7 @@ FileReader FileSystem::OpenFileReader(int lump)
|
|||
}
|
||||
|
||||
auto file = FileInfo[lump].resfile;
|
||||
return file->GetEntryReader(FileInfo[lump].resindex, false);
|
||||
}
|
||||
|
||||
FileReader FileSystem::ReopenFileReader(int lump, bool alwayscache)
|
||||
{
|
||||
if ((unsigned)lump >= (unsigned)FileInfo.size())
|
||||
{
|
||||
throw FileSystemException("ReopenFileReader: %u >= NumEntries", lump);
|
||||
}
|
||||
|
||||
auto file = FileInfo[lump].resfile;
|
||||
return file->GetEntryReader(FileInfo[lump].resindex, true);
|
||||
return file->GetEntryReader(FileInfo[lump].resindex, readertype, readerflags);
|
||||
}
|
||||
|
||||
FileReader FileSystem::OpenFileReader(const char* name)
|
||||
|
|
|
|||
|
|
@ -211,7 +211,7 @@ FCompressedBuffer FResourceFile::GetRawData(uint32_t entry)
|
|||
FCompressedBuffer cbuf = { LumpSize, LumpSize, METHOD_STORED, 0, 0, LumpSize == 0? nullptr : new char[LumpSize] };
|
||||
if (LumpSize > 0)
|
||||
{
|
||||
auto fr = GetEntryReader(entry);
|
||||
auto fr = GetEntryReader(entry, READER_SHARED, 0);
|
||||
size_t read = fr.Read(cbuf.mBuffer, LumpSize);
|
||||
if (read < LumpSize)
|
||||
{
|
||||
|
|
@ -542,7 +542,7 @@ int FResourceFile::FindEntry(const char *name)
|
|||
//
|
||||
//==========================================================================
|
||||
|
||||
FileReader FResourceFile::GetEntryReader(uint32_t entry, bool newreader)
|
||||
FileReader FResourceFile::GetEntryReader(uint32_t entry, int readertype, int readerflags)
|
||||
{
|
||||
FileReader fr;
|
||||
if (entry < NumLumps)
|
||||
|
|
@ -553,20 +553,30 @@ FileReader FResourceFile::GetEntryReader(uint32_t entry, bool newreader)
|
|||
}
|
||||
if (!(Entries[entry].Flags & RESFF_COMPRESSED))
|
||||
{
|
||||
if (!newreader)
|
||||
if (readertype == READER_SHARED)
|
||||
{
|
||||
fr.OpenFilePart(Reader, Entries[entry].Position, Entries[entry].Length);
|
||||
}
|
||||
else
|
||||
else if (readertype == READER_NEW)
|
||||
{
|
||||
fr.OpenFile(FileName, Entries[entry].Position, Entries[entry].Length);
|
||||
}
|
||||
else if (readertype == READER_CACHED)
|
||||
{
|
||||
Reader.Seek(Entries[entry].Position, FileReader::SeekSet);
|
||||
auto data = Reader.Read(Entries[entry].Length);
|
||||
fr.OpenMemoryArray(data);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
FileReader fri;
|
||||
fri.OpenFilePart(Reader, Entries[entry].Position, Entries[entry].CompressedSize);
|
||||
OpenDecompressor(fr, fri, Entries[entry].Length, Entries[entry].Method, FileSys::DCF_TRANSFEROWNER | FileSys::DCF_SEEKABLE | FileSys::DCF_EXCEPTIONS);
|
||||
if (readertype == READER_NEW) fri.OpenFile(FileName, Entries[entry].Position, Entries[entry].CompressedSize);
|
||||
else fri.OpenFilePart(Reader, Entries[entry].Position, Entries[entry].CompressedSize);
|
||||
int flags = DCF_TRANSFEROWNER | DCF_EXCEPTIONS;
|
||||
if (readertype == READER_CACHED) flags |= DCF_CACHED;
|
||||
else if (readerflags & READERFLAG_SEEKABLE) flags |= DCF_SEEKABLE;
|
||||
OpenDecompressor(fr, fri, Entries[entry].Length, Entries[entry].Method, flags);
|
||||
}
|
||||
}
|
||||
return fr;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue