mirror of
https://github.com/ZDoom/gzdoom.git
synced 2025-03-13 22:42:07 +00:00
did some cleanup of the FResourceFile interface.
* making all members protected (but adding friend overrides for the classes which still need it) * allowing to read data without retrieving the FResourceLump object.
This commit is contained in:
parent
fc84579319
commit
ebc808e2a9
12 changed files with 128 additions and 92 deletions
|
@ -215,10 +215,10 @@ FileReader FZipPatReader::OpenFile(const char *name)
|
|||
FileReader fr;
|
||||
if (resf != nullptr)
|
||||
{
|
||||
auto lump = resf->FindLump(name);
|
||||
if (lump != nullptr)
|
||||
auto lump = resf->FindEntry(name);
|
||||
if (lump >= 0)
|
||||
{
|
||||
return lump->NewReader();
|
||||
return resf->GetEntryReader(lump);
|
||||
}
|
||||
}
|
||||
fr.OpenFile(name);
|
||||
|
@ -369,8 +369,8 @@ void FSoundFontManager::ProcessOneFile(const char* fn)
|
|||
{
|
||||
if (zip->LumpCount() > 1) // Anything with just one lump cannot possibly be a packed GUS patch set so skip it right away and simplify the lookup code
|
||||
{
|
||||
auto zipl = zip->FindLump("timidity.cfg");
|
||||
if (zipl != nullptr)
|
||||
auto zipl = zip->FindEntry("timidity.cfg");
|
||||
if (zipl >= 0)
|
||||
{
|
||||
// It seems like this is what we are looking for
|
||||
FSoundFontInfo sft = { fb, fbe, fn, SF_GUS };
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
**
|
||||
**---------------------------------------------------------------------------
|
||||
** Copyright 1998-2008 Randy Heit
|
||||
** Copyright 2005-2008 Christoph Oelckers
|
||||
** Copyright 2005-2023 Christoph Oelckers
|
||||
** All rights reserved.
|
||||
**
|
||||
** Redistribution and use in source and binary forms, with or without
|
||||
|
|
|
@ -110,18 +110,34 @@ struct FCompressedBuffer
|
|||
|
||||
struct FResourceLump
|
||||
{
|
||||
protected:
|
||||
friend class FResourceFile;
|
||||
friend class FWadFile; // this still needs direct access.
|
||||
friend class FileData;
|
||||
friend class FileSystem;
|
||||
friend class FLumpFile;
|
||||
friend class FLumpReader;
|
||||
friend class FGrpFile;
|
||||
friend class F7ZFile;
|
||||
friend class FSSIFile;
|
||||
friend class FWHResFile;
|
||||
friend class FZipFile;
|
||||
friend class FPakFile;
|
||||
friend class FRFFFile;
|
||||
friend class FDirectory;
|
||||
friend int lumpcmp(const void* a, const void* b);
|
||||
|
||||
|
||||
int LumpSize;
|
||||
int RefCount;
|
||||
protected:
|
||||
//protected:
|
||||
const char* FullName;
|
||||
public:
|
||||
//public:
|
||||
uint8_t Flags;
|
||||
char * Cache;
|
||||
FResourceFile * Owner;
|
||||
|
||||
public:
|
||||
FResourceLump()
|
||||
{
|
||||
Cache = NULL;
|
||||
|
@ -129,9 +145,12 @@ public:
|
|||
Flags = 0;
|
||||
RefCount = 0;
|
||||
FullName = "";
|
||||
LumpSize = 0;
|
||||
}
|
||||
|
||||
virtual ~FResourceLump();
|
||||
|
||||
protected:
|
||||
|
||||
virtual FileReader *GetReader();
|
||||
virtual FileReader NewReader();
|
||||
virtual int GetFileOffset() { return -1; }
|
||||
|
@ -186,15 +205,49 @@ public:
|
|||
static FResourceFile *OpenDirectory(const char *filename, LumpFilterInfo* filter = nullptr, FileSystemMessageFunc Printf = nullptr, StringPool* sp = nullptr);
|
||||
virtual ~FResourceFile();
|
||||
// If this FResourceFile represents a directory, the Reader object is not usable so don't return it.
|
||||
FileReader *GetReader() { return Reader.isOpen()? &Reader : nullptr; }
|
||||
uint32_t LumpCount() const { return NumLumps; }
|
||||
FileReader *GetContainerReader() { return Reader.isOpen()? &Reader : nullptr; }
|
||||
[[deprecated]] uint32_t LumpCount() const { return NumLumps; }
|
||||
uint32_t GetFirstEntry() const { return FirstLump; }
|
||||
void SetFirstLump(uint32_t f) { FirstLump = f; }
|
||||
const char* GetHash() const { return Hash; }
|
||||
|
||||
|
||||
virtual FResourceLump *GetLump(int no) = 0;
|
||||
FResourceLump *FindLump(const char *name);
|
||||
|
||||
int EntryCount() const { return NumLumps; }
|
||||
int FindEntry(const char* name);
|
||||
|
||||
size_t Length(int entry)
|
||||
{
|
||||
auto l = GetLump(entry);
|
||||
return l ? l->LumpSize : -1;
|
||||
}
|
||||
|
||||
FileReader GetEntryReader(int entry, bool newreader = true)
|
||||
{
|
||||
auto l = GetLump(entry);
|
||||
return l ? l->NewReader() : FileReader();
|
||||
|
||||
}
|
||||
|
||||
ResourceData Read(int entry)
|
||||
{
|
||||
auto fr = GetEntryReader(entry, false);
|
||||
return fr.Read();
|
||||
}
|
||||
|
||||
const char* getName(int entry)
|
||||
{
|
||||
auto l = GetLump(entry);
|
||||
return l ? l->FullName : nullptr;
|
||||
}
|
||||
FCompressedBuffer GetRawData(int entry)
|
||||
{
|
||||
auto l = GetLump(entry);
|
||||
if (!l) return {};
|
||||
return l->GetRawData();
|
||||
}
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -1421,7 +1421,7 @@ FileReader *FileSystem::GetFileReader(int rfnum)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
return Files[rfnum]->GetReader();
|
||||
return Files[rfnum]->GetContainerReader();
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
|
|
|
@ -618,17 +618,16 @@ bool FResourceFile::FindPrefixRange(const char* filter, void *lumps, size_t lump
|
|||
//
|
||||
//==========================================================================
|
||||
|
||||
FResourceLump *FResourceFile::FindLump(const char *name)
|
||||
int FResourceFile::FindEntry(const char *name)
|
||||
{
|
||||
for (unsigned i = 0; i < NumLumps; i++)
|
||||
{
|
||||
FResourceLump *lump = GetLump(i);
|
||||
if (!stricmp(name, lump->FullName))
|
||||
if (!stricmp(name, getName(i)))
|
||||
{
|
||||
return lump;
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
return -1;
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
|
|
|
@ -58,12 +58,12 @@ struct HexDataSource
|
|||
//
|
||||
//==========================================================================
|
||||
|
||||
void ParseDefinition(FileSys::FResourceLump* font)
|
||||
void ParseDefinition(FResourceFile* resf, int index)
|
||||
{
|
||||
FScanner sc;
|
||||
|
||||
auto data = font->Lock();
|
||||
sc.OpenMem("newconsolefont.hex", (const char*)data, font->Size());
|
||||
auto data = resf->Read(index);
|
||||
sc.OpenMem("newconsolefont.hex", (const char*)data.data(), data.size());
|
||||
sc.SetCMode(true);
|
||||
glyphdata.Push(0); // ensure that index 0 can be used as 'not present'.
|
||||
while (sc.GetString())
|
||||
|
@ -97,7 +97,6 @@ struct HexDataSource
|
|||
lumb = i * 255 / 17;
|
||||
SmallPal[i] = PalEntry(255, lumb, lumb, lumb);
|
||||
}
|
||||
font->Unlock();
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -440,8 +439,8 @@ void LoadHexFont(const char* filename)
|
|||
{
|
||||
auto resf = FResourceFile::OpenResourceFile(filename);
|
||||
if (resf == nullptr) I_FatalError("Unable to open %s", filename);
|
||||
auto hexfont = resf->FindLump("newconsolefont.hex");
|
||||
if (hexfont == nullptr) I_FatalError("Unable to find newconsolefont.hex in %s", filename);
|
||||
hexdata.ParseDefinition(hexfont);
|
||||
auto hexfont = resf->FindEntry("newconsolefont.hex");
|
||||
if (hexfont < 0) I_FatalError("Unable to find newconsolefont.hex in %s", filename);
|
||||
hexdata.ParseDefinition(resf, hexfont);
|
||||
delete resf;
|
||||
}
|
||||
|
|
|
@ -297,37 +297,26 @@ unsigned FSavegameManagerBase::ExtractSaveData(int index)
|
|||
!node->bOldVersion &&
|
||||
(resf = FResourceFile::OpenResourceFile(node->Filename.GetChars(), true)) != nullptr)
|
||||
{
|
||||
auto info = resf->FindLump("info.json");
|
||||
if (info == nullptr)
|
||||
auto info = resf->FindEntry("info.json");
|
||||
if (info < 0)
|
||||
{
|
||||
// this should not happen because the file has already been verified.
|
||||
return index;
|
||||
}
|
||||
|
||||
void* data = info->Lock();
|
||||
auto data = resf->Read(info);
|
||||
FSerializer arc;
|
||||
if (!arc.OpenReader((const char*)data, info->LumpSize))
|
||||
if (!arc.OpenReader((const char*)data.data(), data.size()))
|
||||
{
|
||||
info->Unlock();
|
||||
return index;
|
||||
}
|
||||
info->Unlock();
|
||||
|
||||
SaveCommentString = ExtractSaveComment(arc);
|
||||
|
||||
auto pic = resf->FindLump("savepic.png");
|
||||
if (pic != nullptr)
|
||||
auto pic = resf->FindEntry("savepic.png");
|
||||
if (pic >= 0)
|
||||
{
|
||||
FileReader picreader;
|
||||
|
||||
picreader.OpenMemoryArray([=](std::vector<uint8_t> &array)
|
||||
{
|
||||
auto cache = pic->Lock();
|
||||
array.resize(pic->LumpSize);
|
||||
memcpy(&array[0], cache, pic->LumpSize);
|
||||
pic->Unlock();
|
||||
return true;
|
||||
});
|
||||
FileReader picreader = resf->GetEntryReader(pic);
|
||||
PNGHandle *png = M_VerifyPNG(picreader);
|
||||
if (png != nullptr)
|
||||
{
|
||||
|
|
|
@ -2002,8 +2002,8 @@ void G_DoLoadGame ()
|
|||
LoadGameError("TXT_COULDNOTREAD");
|
||||
return;
|
||||
}
|
||||
auto info = resfile->FindLump("info.json");
|
||||
if (info == nullptr)
|
||||
auto info = resfile->FindEntry("info.json");
|
||||
if (info < 0)
|
||||
{
|
||||
LoadGameError("TXT_NOINFOJSON");
|
||||
return;
|
||||
|
@ -2011,9 +2011,9 @@ void G_DoLoadGame ()
|
|||
|
||||
SaveVersion = 0;
|
||||
|
||||
void *data = info->Lock();
|
||||
auto data = resfile->Read(info);
|
||||
FSerializer arc;
|
||||
if (!arc.OpenReader((const char *)data, info->LumpSize))
|
||||
if (!arc.OpenReader((char*)data.data(), data.size()))
|
||||
{
|
||||
LoadGameError("TXT_FAILEDTOREADSG");
|
||||
return;
|
||||
|
@ -2080,15 +2080,15 @@ void G_DoLoadGame ()
|
|||
// we are done with info.json.
|
||||
arc.Close();
|
||||
|
||||
info = resfile->FindLump("globals.json");
|
||||
if (info == nullptr)
|
||||
info = resfile->FindEntry("globals.json");
|
||||
if (info < 0)
|
||||
{
|
||||
LoadGameError("TXT_NOGLOBALSJSON");
|
||||
return;
|
||||
}
|
||||
|
||||
data = info->Lock();
|
||||
if (!arc.OpenReader((const char *)data, info->LumpSize))
|
||||
data = resfile->Read(info);
|
||||
if (!arc.OpenReader((char*)data.data(), data.size()))
|
||||
{
|
||||
LoadGameError("TXT_SGINFOERR");
|
||||
return;
|
||||
|
|
|
@ -2004,32 +2004,28 @@ void G_ReadSnapshots(FResourceFile *resf)
|
|||
|
||||
G_ClearSnapshots();
|
||||
|
||||
for (unsigned j = 0; j < resf->LumpCount(); j++)
|
||||
for (unsigned j = 0; j < resf->EntryCount(); j++)
|
||||
{
|
||||
auto resl = resf->GetLump(j);
|
||||
if (resl != nullptr)
|
||||
auto name = resf->getName(j);
|
||||
auto ptr = strstr(name, ".map.json");
|
||||
if (ptr != nullptr)
|
||||
{
|
||||
auto name = resl->getName();
|
||||
auto ptr = strstr(name, ".map.json");
|
||||
ptrdiff_t maplen = ptr - name;
|
||||
FString mapname(name, (size_t)maplen);
|
||||
i = FindLevelInfo(mapname.GetChars());
|
||||
if (i != nullptr)
|
||||
{
|
||||
i->Snapshot = resf->GetRawData(j);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
auto ptr = strstr(name, ".mapd.json");
|
||||
if (ptr != nullptr)
|
||||
{
|
||||
ptrdiff_t maplen = ptr - name;
|
||||
FString mapname(name, (size_t)maplen);
|
||||
i = FindLevelInfo(mapname.GetChars());
|
||||
if (i != nullptr)
|
||||
{
|
||||
i->Snapshot = resl->GetRawData();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
auto ptr = strstr(name, ".mapd.json");
|
||||
if (ptr != nullptr)
|
||||
{
|
||||
ptrdiff_t maplen = ptr - name;
|
||||
FString mapname(name, (size_t)maplen);
|
||||
TheDefaultLevelInfo.Snapshot = resl->GetRawData();
|
||||
}
|
||||
TheDefaultLevelInfo.Snapshot = resf->GetRawData(j);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -780,7 +780,7 @@ static int FindGLNodesInFile(FResourceFile * f, const char * label)
|
|||
|
||||
FString glheader;
|
||||
bool mustcheck=false;
|
||||
uint32_t numentries = f->LumpCount();
|
||||
uint32_t numentries = f->EntryCount();
|
||||
|
||||
glheader.Format("GL_%.8s", label);
|
||||
if (glheader.Len()>8)
|
||||
|
@ -793,13 +793,13 @@ static int FindGLNodesInFile(FResourceFile * f, const char * label)
|
|||
{
|
||||
for(uint32_t i=0;i<numentries-4;i++)
|
||||
{
|
||||
if (!strnicmp(f->GetLump(i)->getName(), glheader.GetChars(), 8))
|
||||
if (!strnicmp(f->getName(i), glheader.GetChars(), 8))
|
||||
{
|
||||
if (mustcheck)
|
||||
{
|
||||
char check[16]={0};
|
||||
auto fr = f->GetLump(i)->GetReader();
|
||||
fr->Read(check, 16);
|
||||
auto fr = f->GetEntryReader(i, false);
|
||||
fr.Read(check, 16);
|
||||
if (MatchHeader(label, check)) return i;
|
||||
}
|
||||
else return i;
|
||||
|
@ -900,13 +900,13 @@ bool MapLoader::LoadGLNodes(MapData * map)
|
|||
result=true;
|
||||
for(unsigned i=0; i<4;i++)
|
||||
{
|
||||
if (strnicmp(f_gwa->GetLump(li+i+1)->getName(), check[i], 8))
|
||||
if (strnicmp(f_gwa->getName(li + i + 1), check[i], 8))
|
||||
{
|
||||
result=false;
|
||||
break;
|
||||
}
|
||||
else
|
||||
gwalumps[i] = f_gwa->GetLump(li+i+1)->NewReader();
|
||||
gwalumps[i] = f_gwa->GetEntryReader(li + i + 1);
|
||||
}
|
||||
if (result) result = DoLoadGLNodes(gwalumps);
|
||||
}
|
||||
|
|
|
@ -76,15 +76,15 @@ void FSavegameManager::ReadSaveStrings()
|
|||
{
|
||||
bool oldVer = false;
|
||||
bool missing = false;
|
||||
auto info = savegame->FindLump("info.json");
|
||||
if (info == nullptr)
|
||||
auto info = savegame->FindEntry("info.json");
|
||||
if (info < 0)
|
||||
{
|
||||
// savegame info not found. This is not a savegame so leave it alone.
|
||||
continue;
|
||||
}
|
||||
void *data = info->Lock();
|
||||
auto data = savegame->Read(info);
|
||||
FSerializer arc;
|
||||
if (arc.OpenReader((const char *)data, info->LumpSize))
|
||||
if (arc.OpenReader((const char*)data.data(), data.size()))
|
||||
{
|
||||
int savever = 0;
|
||||
arc("Save Version", savever);
|
||||
|
|
|
@ -126,7 +126,7 @@ MapData *P_OpenMapData(const char * mapname, bool justcheck)
|
|||
return NULL;
|
||||
}
|
||||
map->resource = FResourceFile::OpenResourceFile(mapname);
|
||||
wadReader = map->resource->GetReader();
|
||||
wadReader = map->resource->GetContainerReader();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -265,7 +265,7 @@ MapData *P_OpenMapData(const char * mapname, bool justcheck)
|
|||
map->lumpnum = lump_wad;
|
||||
auto reader = fileSystem.ReopenFileReader(lump_wad);
|
||||
map->resource = FResourceFile::OpenResourceFile(fileSystem.GetFileFullName(lump_wad), reader, true);
|
||||
wadReader = map->resource->GetReader();
|
||||
wadReader = map->resource->GetContainerReader();
|
||||
}
|
||||
}
|
||||
uint32_t id;
|
||||
|
@ -280,21 +280,21 @@ MapData *P_OpenMapData(const char * mapname, bool justcheck)
|
|||
char maplabel[9]="";
|
||||
int index=0;
|
||||
|
||||
map->MapLumps[0].Reader = map->resource->GetLump(0)->NewReader();
|
||||
uppercopy(map->MapLumps[0].Name, map->resource->GetLump(0)->getName());
|
||||
map->MapLumps[0].Reader = map->resource->GetEntryReader(0);
|
||||
uppercopy(map->MapLumps[0].Name, map->resource->getName(0));
|
||||
|
||||
for(uint32_t i = 1; i < map->resource->LumpCount(); i++)
|
||||
for(uint32_t i = 1; i < map->resource->EntryCount(); i++)
|
||||
{
|
||||
const char* lumpname = map->resource->GetLump(i)->getName();
|
||||
const char* lumpname = map->resource->getName(i);
|
||||
|
||||
if (i == 1 && !strnicmp(lumpname, "TEXTMAP", 8))
|
||||
{
|
||||
map->isText = true;
|
||||
map->MapLumps[ML_TEXTMAP].Reader = map->resource->GetLump(i)->NewReader();
|
||||
map->MapLumps[ML_TEXTMAP].Reader = map->resource->GetEntryReader(i);
|
||||
strncpy(map->MapLumps[ML_TEXTMAP].Name, lumpname, 8);
|
||||
for(int i = 2;; i++)
|
||||
{
|
||||
lumpname = map->resource->GetLump(i)->getName();
|
||||
lumpname = map->resource->getName(i);
|
||||
if (!strnicmp(lumpname, "ZNODES",8))
|
||||
{
|
||||
index = ML_GLZNODES;
|
||||
|
@ -326,7 +326,7 @@ MapData *P_OpenMapData(const char * mapname, bool justcheck)
|
|||
return map;
|
||||
}
|
||||
else continue;
|
||||
map->MapLumps[index].Reader = map->resource->GetLump(i)->NewReader();
|
||||
map->MapLumps[index].Reader = map->resource->GetEntryReader(i);
|
||||
strncpy(map->MapLumps[index].Name, lumpname, 8);
|
||||
}
|
||||
}
|
||||
|
@ -358,7 +358,7 @@ MapData *P_OpenMapData(const char * mapname, bool justcheck)
|
|||
maplabel[8]=0;
|
||||
}
|
||||
|
||||
map->MapLumps[index].Reader = map->resource->GetLump(i)->NewReader();
|
||||
map->MapLumps[index].Reader = map->resource->GetEntryReader(i);
|
||||
strncpy(map->MapLumps[index].Name, lumpname, 8);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue