mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2024-11-28 23:11:58 +00:00
- pass lump filters as parameter when initializing the file system to reduce dependencies on high level state in the low level code.
This commit is contained in:
parent
d12a9bb77a
commit
135f159927
15 changed files with 115 additions and 109 deletions
|
@ -2480,7 +2480,25 @@ static int D_DoomMain_Internal (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!batchrun) Printf ("W_Init: Init WADfiles.\n");
|
if (!batchrun) Printf ("W_Init: Init WADfiles.\n");
|
||||||
Wads.InitMultipleFiles (allwads, iwad_info->DeleteLumps);
|
|
||||||
|
LumpFilterInfo lfi;
|
||||||
|
lfi.dotFilter = LumpFilterIWAD;
|
||||||
|
|
||||||
|
static const struct { int match; const char* name; } blanket[] =
|
||||||
|
{
|
||||||
|
{ GAME_Raven, "game-Raven" },
|
||||||
|
{ GAME_DoomStrifeChex, "game-DoomStrifeChex" },
|
||||||
|
{ GAME_DoomChex, "game-DoomChex" },
|
||||||
|
{ GAME_Any, NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
for (auto& inf : blanket)
|
||||||
|
{
|
||||||
|
if (gameinfo.gametype & inf.match) lfi.gameTypeFilter.Push(inf.name);
|
||||||
|
}
|
||||||
|
lfi.gameTypeFilter.Push(FStringf("game-%s", GameTypeName()));
|
||||||
|
|
||||||
|
Wads.InitMultipleFiles (allwads, iwad_info->DeleteLumps, false, &lfi);
|
||||||
allwads.Clear();
|
allwads.Clear();
|
||||||
allwads.ShrinkToFit();
|
allwads.ShrinkToFit();
|
||||||
SetMapxxFlag();
|
SetMapxxFlag();
|
||||||
|
|
|
@ -190,7 +190,7 @@ class F7ZFile : public FResourceFile
|
||||||
|
|
||||||
public:
|
public:
|
||||||
F7ZFile(const char * filename, FileReader &filer);
|
F7ZFile(const char * filename, FileReader &filer);
|
||||||
bool Open(bool quiet);
|
bool Open(bool quiet, LumpFilterInfo* filter);
|
||||||
virtual ~F7ZFile();
|
virtual ~F7ZFile();
|
||||||
virtual FResourceLump *GetLump(int no) { return ((unsigned)no < NumLumps)? &Lumps[no] : NULL; }
|
virtual FResourceLump *GetLump(int no) { return ((unsigned)no < NumLumps)? &Lumps[no] : NULL; }
|
||||||
};
|
};
|
||||||
|
@ -217,7 +217,7 @@ F7ZFile::F7ZFile(const char * filename, FileReader &filer)
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
bool F7ZFile::Open(bool quiet)
|
bool F7ZFile::Open(bool quiet, LumpFilterInfo *filter)
|
||||||
{
|
{
|
||||||
Archive = new C7zArchive(Reader);
|
Archive = new C7zArchive(Reader);
|
||||||
int skipped = 0;
|
int skipped = 0;
|
||||||
|
@ -317,7 +317,7 @@ bool F7ZFile::Open(bool quiet)
|
||||||
if (!quiet && !batchrun) Printf(", %d lumps\n", NumLumps);
|
if (!quiet && !batchrun) Printf(", %d lumps\n", NumLumps);
|
||||||
|
|
||||||
GenerateHash();
|
GenerateHash();
|
||||||
PostProcessArchive(&Lumps[0], sizeof(F7ZLump));
|
PostProcessArchive(&Lumps[0], sizeof(F7ZLump), filter);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -359,7 +359,7 @@ int F7ZLump::FillCache()
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
FResourceFile *Check7Z(const char *filename, FileReader &file, bool quiet)
|
FResourceFile *Check7Z(const char *filename, FileReader &file, bool quiet, LumpFilterInfo* filter)
|
||||||
{
|
{
|
||||||
char head[k7zSignatureSize];
|
char head[k7zSignatureSize];
|
||||||
|
|
||||||
|
@ -371,7 +371,7 @@ FResourceFile *Check7Z(const char *filename, FileReader &file, bool quiet)
|
||||||
if (!memcmp(head, k7zSignature, k7zSignatureSize))
|
if (!memcmp(head, k7zSignature, k7zSignatureSize))
|
||||||
{
|
{
|
||||||
FResourceFile *rf = new F7ZFile(filename, file);
|
FResourceFile *rf = new F7ZFile(filename, file);
|
||||||
if (rf->Open(quiet)) return rf;
|
if (rf->Open(quiet, filter)) return rf;
|
||||||
|
|
||||||
file = std::move(rf->Reader); // to avoid destruction of reader
|
file = std::move(rf->Reader); // to avoid destruction of reader
|
||||||
delete rf;
|
delete rf;
|
||||||
|
|
|
@ -51,8 +51,8 @@
|
||||||
|
|
||||||
struct FDirectoryLump : public FResourceLump
|
struct FDirectoryLump : public FResourceLump
|
||||||
{
|
{
|
||||||
virtual FileReader NewReader();
|
FileReader NewReader() override;
|
||||||
virtual int FillCache();
|
int FillCache() override;
|
||||||
|
|
||||||
FString mFullPath;
|
FString mFullPath;
|
||||||
};
|
};
|
||||||
|
@ -74,7 +74,7 @@ class FDirectory : public FResourceFile
|
||||||
|
|
||||||
public:
|
public:
|
||||||
FDirectory(const char * dirname, bool nosubdirflag = false);
|
FDirectory(const char * dirname, bool nosubdirflag = false);
|
||||||
bool Open(bool quiet);
|
bool Open(bool quiet, LumpFilterInfo* filter);
|
||||||
virtual FResourceLump *GetLump(int no) { return ((unsigned)no < NumLumps)? &Lumps[no] : NULL; }
|
virtual FResourceLump *GetLump(int no) { return ((unsigned)no < NumLumps)? &Lumps[no] : NULL; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -180,11 +180,11 @@ int FDirectory::AddDirectory(const char *dirpath)
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
bool FDirectory::Open(bool quiet)
|
bool FDirectory::Open(bool quiet, LumpFilterInfo* filter)
|
||||||
{
|
{
|
||||||
NumLumps = AddDirectory(FileName);
|
NumLumps = AddDirectory(FileName);
|
||||||
if (!quiet) Printf(", %d lumps\n", NumLumps);
|
if (!quiet) Printf(", %d lumps\n", NumLumps);
|
||||||
PostProcessArchive(&Lumps[0], sizeof(FDirectoryLump));
|
PostProcessArchive(&Lumps[0], sizeof(FDirectoryLump), filter);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -253,10 +253,10 @@ int FDirectoryLump::FillCache()
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
FResourceFile *CheckDir(const char *filename, bool quiet)
|
FResourceFile *CheckDir(const char *filename, bool quiet, bool nosubdirflag, LumpFilterInfo* filter)
|
||||||
{
|
{
|
||||||
FResourceFile *rf = new FDirectory(filename);
|
FResourceFile *rf = new FDirectory(filename, nosubdirflag);
|
||||||
if (rf->Open(quiet)) return rf;
|
if (rf->Open(quiet, filter)) return rf;
|
||||||
delete rf;
|
delete rf;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,7 +73,7 @@ class FGrpFile : public FUncompressedFile
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
FGrpFile(const char * filename, FileReader &file);
|
FGrpFile(const char * filename, FileReader &file);
|
||||||
bool Open(bool quiet);
|
bool Open(bool quiet, LumpFilterInfo* filter);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -94,7 +94,7 @@ FGrpFile::FGrpFile(const char *filename, FileReader &file)
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
bool FGrpFile::Open(bool quiet)
|
bool FGrpFile::Open(bool quiet, LumpFilterInfo*)
|
||||||
{
|
{
|
||||||
GrpInfo header;
|
GrpInfo header;
|
||||||
|
|
||||||
|
@ -131,7 +131,7 @@ bool FGrpFile::Open(bool quiet)
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
FResourceFile *CheckGRP(const char *filename, FileReader &file, bool quiet)
|
FResourceFile *CheckGRP(const char *filename, FileReader &file, bool quiet, LumpFilterInfo* filter)
|
||||||
{
|
{
|
||||||
char head[12];
|
char head[12];
|
||||||
|
|
||||||
|
@ -143,7 +143,7 @@ FResourceFile *CheckGRP(const char *filename, FileReader &file, bool quiet)
|
||||||
if (!memcmp(head, "KenSilverman", 12))
|
if (!memcmp(head, "KenSilverman", 12))
|
||||||
{
|
{
|
||||||
FResourceFile *rf = new FGrpFile(filename, file);
|
FResourceFile *rf = new FGrpFile(filename, file);
|
||||||
if (rf->Open(quiet)) return rf;
|
if (rf->Open(quiet, filter)) return rf;
|
||||||
|
|
||||||
file = std::move(rf->Reader); // to avoid destruction of reader
|
file = std::move(rf->Reader); // to avoid destruction of reader
|
||||||
delete rf;
|
delete rf;
|
||||||
|
|
|
@ -47,7 +47,7 @@ class FLumpFile : public FUncompressedFile
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
FLumpFile(const char * filename, FileReader &file);
|
FLumpFile(const char * filename, FileReader &file);
|
||||||
bool Open(bool quiet);
|
bool Open(bool quiet, LumpFilterInfo* filter);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -68,7 +68,7 @@ FLumpFile::FLumpFile(const char *filename, FileReader &file)
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
bool FLumpFile::Open(bool quiet)
|
bool FLumpFile::Open(bool quiet, LumpFilterInfo*)
|
||||||
{
|
{
|
||||||
FString name(ExtractFileBase(FileName, true));
|
FString name(ExtractFileBase(FileName, true));
|
||||||
|
|
||||||
|
@ -92,11 +92,11 @@ bool FLumpFile::Open(bool quiet)
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
FResourceFile *CheckLump(const char *filename, FileReader &file, bool quiet)
|
FResourceFile *CheckLump(const char *filename, FileReader &file, bool quiet, LumpFilterInfo* filter)
|
||||||
{
|
{
|
||||||
// always succeeds
|
// always succeeds
|
||||||
FResourceFile *rf = new FLumpFile(filename, file);
|
FResourceFile *rf = new FLumpFile(filename, file);
|
||||||
if (rf->Open(quiet)) return rf;
|
if (rf->Open(quiet, filter)) return rf;
|
||||||
file = std::move(rf->Reader); // to avoid destruction of reader
|
file = std::move(rf->Reader); // to avoid destruction of reader
|
||||||
delete rf;
|
delete rf;
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -66,7 +66,7 @@ class FPakFile : public FUncompressedFile
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
FPakFile(const char * filename, FileReader &file);
|
FPakFile(const char * filename, FileReader &file);
|
||||||
bool Open(bool quiet);
|
bool Open(bool quiet, LumpFilterInfo* filter);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -89,7 +89,7 @@ FPakFile::FPakFile(const char *filename, FileReader &file)
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
bool FPakFile::Open(bool quiet)
|
bool FPakFile::Open(bool quiet, LumpFilterInfo* filter)
|
||||||
{
|
{
|
||||||
dpackheader_t header;
|
dpackheader_t header;
|
||||||
|
|
||||||
|
@ -115,6 +115,7 @@ bool FPakFile::Open(bool quiet)
|
||||||
Lumps[i].CheckEmbedded();
|
Lumps[i].CheckEmbedded();
|
||||||
}
|
}
|
||||||
GenerateHash();
|
GenerateHash();
|
||||||
|
PostProcessArchive(&Lumps[0], sizeof(Lumps[0]), filter);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,7 +126,7 @@ bool FPakFile::Open(bool quiet)
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
FResourceFile *CheckPak(const char *filename, FileReader &file, bool quiet)
|
FResourceFile *CheckPak(const char *filename, FileReader &file, bool quiet, LumpFilterInfo* filter)
|
||||||
{
|
{
|
||||||
char head[4];
|
char head[4];
|
||||||
|
|
||||||
|
@ -137,7 +138,7 @@ FResourceFile *CheckPak(const char *filename, FileReader &file, bool quiet)
|
||||||
if (!memcmp(head, "PACK", 4))
|
if (!memcmp(head, "PACK", 4))
|
||||||
{
|
{
|
||||||
FResourceFile *rf = new FPakFile(filename, file);
|
FResourceFile *rf = new FPakFile(filename, file);
|
||||||
if (rf->Open(quiet)) return rf;
|
if (rf->Open(quiet, filter)) return rf;
|
||||||
|
|
||||||
file = std::move(rf->Reader); // to avoid destruction of reader
|
file = std::move(rf->Reader); // to avoid destruction of reader
|
||||||
delete rf;
|
delete rf;
|
||||||
|
|
|
@ -112,7 +112,7 @@ class FRFFFile : public FResourceFile
|
||||||
public:
|
public:
|
||||||
FRFFFile(const char * filename, FileReader &file);
|
FRFFFile(const char * filename, FileReader &file);
|
||||||
virtual ~FRFFFile();
|
virtual ~FRFFFile();
|
||||||
virtual bool Open(bool quiet);
|
virtual bool Open(bool quiet, LumpFilterInfo* filter);
|
||||||
virtual FResourceLump *GetLump(int no) { return ((unsigned)no < NumLumps)? &Lumps[no] : NULL; }
|
virtual FResourceLump *GetLump(int no) { return ((unsigned)no < NumLumps)? &Lumps[no] : NULL; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -135,7 +135,7 @@ FRFFFile::FRFFFile(const char *filename, FileReader &file)
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
bool FRFFFile::Open(bool quiet)
|
bool FRFFFile::Open(bool quiet, LumpFilterInfo*)
|
||||||
{
|
{
|
||||||
RFFLump *lumps;
|
RFFLump *lumps;
|
||||||
RFFInfo header;
|
RFFInfo header;
|
||||||
|
@ -239,7 +239,7 @@ int FRFFLump::FillCache()
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
FResourceFile *CheckRFF(const char *filename, FileReader &file, bool quiet)
|
FResourceFile *CheckRFF(const char *filename, FileReader &file, bool quiet, LumpFilterInfo* filter)
|
||||||
{
|
{
|
||||||
char head[4];
|
char head[4];
|
||||||
|
|
||||||
|
@ -251,7 +251,7 @@ FResourceFile *CheckRFF(const char *filename, FileReader &file, bool quiet)
|
||||||
if (!memcmp(head, "RFF\x1a", 4))
|
if (!memcmp(head, "RFF\x1a", 4))
|
||||||
{
|
{
|
||||||
FResourceFile *rf = new FRFFFile(filename, file);
|
FResourceFile *rf = new FRFFFile(filename, file);
|
||||||
if (rf->Open(quiet)) return rf;
|
if (rf->Open(quiet, filter)) return rf;
|
||||||
|
|
||||||
file = std::move(rf->Reader); // to avoid destruction of reader
|
file = std::move(rf->Reader); // to avoid destruction of reader
|
||||||
delete rf;
|
delete rf;
|
||||||
|
|
|
@ -116,7 +116,7 @@ class FWadFile : public FResourceFile
|
||||||
public:
|
public:
|
||||||
FWadFile(const char * filename, FileReader &file);
|
FWadFile(const char * filename, FileReader &file);
|
||||||
FResourceLump *GetLump(int lump) { return &Lumps[lump]; }
|
FResourceLump *GetLump(int lump) { return &Lumps[lump]; }
|
||||||
bool Open(bool quiet);
|
bool Open(bool quiet, LumpFilterInfo* filter);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -139,7 +139,7 @@ FWadFile::FWadFile(const char *filename, FileReader &file)
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
bool FWadFile::Open(bool quiet)
|
bool FWadFile::Open(bool quiet, LumpFilterInfo*)
|
||||||
{
|
{
|
||||||
wadinfo_t header;
|
wadinfo_t header;
|
||||||
uint32_t InfoTableOfs;
|
uint32_t InfoTableOfs;
|
||||||
|
@ -442,7 +442,7 @@ void FWadFile::SkinHack ()
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
FResourceFile *CheckWad(const char *filename, FileReader &file, bool quiet)
|
FResourceFile *CheckWad(const char *filename, FileReader &file, bool quiet, LumpFilterInfo* filter)
|
||||||
{
|
{
|
||||||
char head[4];
|
char head[4];
|
||||||
|
|
||||||
|
@ -454,7 +454,7 @@ FResourceFile *CheckWad(const char *filename, FileReader &file, bool quiet)
|
||||||
if (!memcmp(head, "IWAD", 4) || !memcmp(head, "PWAD", 4))
|
if (!memcmp(head, "IWAD", 4) || !memcmp(head, "PWAD", 4))
|
||||||
{
|
{
|
||||||
FResourceFile *rf = new FWadFile(filename, file);
|
FResourceFile *rf = new FWadFile(filename, file);
|
||||||
if (rf->Open(quiet)) return rf;
|
if (rf->Open(quiet, filter)) return rf;
|
||||||
|
|
||||||
file = std::move(rf->Reader); // to avoid destruction of reader
|
file = std::move(rf->Reader); // to avoid destruction of reader
|
||||||
delete rf;
|
delete rf;
|
||||||
|
|
|
@ -68,7 +68,7 @@ class FWHResFile : public FUncompressedFile
|
||||||
FString basename;
|
FString basename;
|
||||||
public:
|
public:
|
||||||
FWHResFile(const char * filename, FileReader &file);
|
FWHResFile(const char * filename, FileReader &file);
|
||||||
bool Open(bool quiet);
|
bool Open(bool quiet, LumpFilterInfo* filter);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -92,7 +92,7 @@ FWHResFile::FWHResFile(const char *filename, FileReader &file)
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
bool FWHResFile::Open(bool quiet)
|
bool FWHResFile::Open(bool quiet, LumpFilterInfo*)
|
||||||
{
|
{
|
||||||
int directory[1024];
|
int directory[1024];
|
||||||
|
|
||||||
|
@ -130,7 +130,7 @@ bool FWHResFile::Open(bool quiet)
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
FResourceFile *CheckWHRes(const char *filename, FileReader &file, bool quiet)
|
FResourceFile *CheckWHRes(const char *filename, FileReader &file, bool quiet, LumpFilterInfo* filter)
|
||||||
{
|
{
|
||||||
if (file.GetLength() >= 8192) // needs to be at least 8192 to contain one file and the directory.
|
if (file.GetLength() >= 8192) // needs to be at least 8192 to contain one file and the directory.
|
||||||
{
|
{
|
||||||
|
@ -150,7 +150,7 @@ FResourceFile *CheckWHRes(const char *filename, FileReader &file, bool quiet)
|
||||||
checkpos += (length+4095) / 4096;
|
checkpos += (length+4095) / 4096;
|
||||||
}
|
}
|
||||||
FResourceFile *rf = new FWHResFile(filename, file);
|
FResourceFile *rf = new FWHResFile(filename, file);
|
||||||
if (rf->Open(quiet)) return rf;
|
if (rf->Open(quiet, filter)) return rf;
|
||||||
file = std::move(rf->Reader); // to avoid destruction of reader
|
file = std::move(rf->Reader); // to avoid destruction of reader
|
||||||
delete rf;
|
delete rf;
|
||||||
}
|
}
|
||||||
|
|
|
@ -171,7 +171,7 @@ FZipFile::FZipFile(const char * filename, FileReader &file)
|
||||||
Lumps = NULL;
|
Lumps = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FZipFile::Open(bool quiet)
|
bool FZipFile::Open(bool quiet, LumpFilterInfo* filter)
|
||||||
{
|
{
|
||||||
uint32_t centraldir = Zip_FindCentralDir(Reader);
|
uint32_t centraldir = Zip_FindCentralDir(Reader);
|
||||||
FZipEndOfCentralDirectory info;
|
FZipEndOfCentralDirectory info;
|
||||||
|
@ -359,7 +359,7 @@ bool FZipFile::Open(bool quiet)
|
||||||
if (!quiet && !batchrun) Printf(TEXTCOLOR_NORMAL ", %d lumps\n", NumLumps);
|
if (!quiet && !batchrun) Printf(TEXTCOLOR_NORMAL ", %d lumps\n", NumLumps);
|
||||||
|
|
||||||
GenerateHash();
|
GenerateHash();
|
||||||
PostProcessArchive(&Lumps[0], sizeof(FZipLump));
|
PostProcessArchive(&Lumps[0], sizeof(FZipLump), filter);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -474,7 +474,7 @@ int FZipLump::GetFileOffset()
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
FResourceFile *CheckZip(const char *filename, FileReader &file, bool quiet)
|
FResourceFile *CheckZip(const char *filename, FileReader &file, bool quiet, LumpFilterInfo* filter)
|
||||||
{
|
{
|
||||||
char head[4];
|
char head[4];
|
||||||
|
|
||||||
|
@ -486,7 +486,7 @@ FResourceFile *CheckZip(const char *filename, FileReader &file, bool quiet)
|
||||||
if (!memcmp(head, "PK\x3\x4", 4))
|
if (!memcmp(head, "PK\x3\x4", 4))
|
||||||
{
|
{
|
||||||
FResourceFile *rf = new FZipFile(filename, file);
|
FResourceFile *rf = new FZipFile(filename, file);
|
||||||
if (rf->Open(quiet)) return rf;
|
if (rf->Open(quiet, filter)) return rf;
|
||||||
|
|
||||||
file = std::move(rf->Reader); // to avoid destruction of reader
|
file = std::move(rf->Reader); // to avoid destruction of reader
|
||||||
delete rf;
|
delete rf;
|
||||||
|
|
|
@ -41,7 +41,7 @@ class FZipFile : public FResourceFile
|
||||||
public:
|
public:
|
||||||
FZipFile(const char * filename, FileReader &file);
|
FZipFile(const char * filename, FileReader &file);
|
||||||
virtual ~FZipFile();
|
virtual ~FZipFile();
|
||||||
bool Open(bool quiet);
|
bool Open(bool quiet, LumpFilterInfo* filter);
|
||||||
virtual FResourceLump *GetLump(int no) { return ((unsigned)no < NumLumps)? &Lumps[no] : NULL; }
|
virtual FResourceLump *GetLump(int no) { return ((unsigned)no < NumLumps)? &Lumps[no] : NULL; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -236,52 +236,45 @@ int FResourceLump::Unlock()
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
typedef FResourceFile * (*CheckFunc)(const char *filename, FileReader &file, bool quiet);
|
typedef FResourceFile * (*CheckFunc)(const char *filename, FileReader &file, bool quiet, LumpFilterInfo* filter);
|
||||||
|
|
||||||
FResourceFile *CheckWad(const char *filename, FileReader &file, bool quiet);
|
FResourceFile *CheckWad(const char *filename, FileReader &file, bool quiet, LumpFilterInfo* filter);
|
||||||
FResourceFile *CheckGRP(const char *filename, FileReader &file, bool quiet);
|
FResourceFile *CheckGRP(const char *filename, FileReader &file, bool quiet, LumpFilterInfo* filter);
|
||||||
FResourceFile *CheckRFF(const char *filename, FileReader &file, bool quiet);
|
FResourceFile *CheckRFF(const char *filename, FileReader &file, bool quiet, LumpFilterInfo* filter);
|
||||||
FResourceFile *CheckPak(const char *filename, FileReader &file, bool quiet);
|
FResourceFile *CheckPak(const char *filename, FileReader &file, bool quiet, LumpFilterInfo* filter);
|
||||||
FResourceFile *CheckZip(const char *filename, FileReader &file, bool quiet);
|
FResourceFile *CheckZip(const char *filename, FileReader &file, bool quiet, LumpFilterInfo* filter);
|
||||||
FResourceFile *Check7Z(const char *filename, FileReader &file, bool quiet);
|
FResourceFile *Check7Z(const char *filename, FileReader &file, bool quiet, LumpFilterInfo* filter);
|
||||||
FResourceFile *CheckLump(const char *filename,FileReader &file, bool quiet);
|
FResourceFile *CheckLump(const char *filename,FileReader &file, bool quiet, LumpFilterInfo* filter);
|
||||||
FResourceFile *CheckDir(const char *filename, bool quiet);
|
FResourceFile *CheckDir(const char *filename, bool quiet, bool nosub, LumpFilterInfo* filter);
|
||||||
|
|
||||||
static CheckFunc funcs[] = { CheckWad, CheckZip, Check7Z, CheckPak, CheckGRP, CheckRFF, CheckLump };
|
static CheckFunc funcs[] = { CheckWad, CheckZip, Check7Z, CheckPak, CheckGRP, CheckRFF, CheckLump };
|
||||||
|
|
||||||
FResourceFile *FResourceFile::DoOpenResourceFile(const char *filename, FileReader &file, bool quiet, bool containeronly)
|
FResourceFile *FResourceFile::DoOpenResourceFile(const char *filename, FileReader &file, bool quiet, bool containeronly, LumpFilterInfo* filter)
|
||||||
{
|
{
|
||||||
for(size_t i = 0; i < countof(funcs) - containeronly; i++)
|
for(size_t i = 0; i < countof(funcs) - containeronly; i++)
|
||||||
{
|
{
|
||||||
FResourceFile *resfile = funcs[i](filename, file, quiet);
|
FResourceFile *resfile = funcs[i](filename, file, quiet, filter);
|
||||||
if (resfile != NULL) return resfile;
|
if (resfile != NULL) return resfile;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
FResourceFile *FResourceFile::OpenResourceFile(const char *filename, FileReader &file, bool quiet, bool containeronly)
|
FResourceFile *FResourceFile::OpenResourceFile(const char *filename, FileReader &file, bool quiet, bool containeronly, LumpFilterInfo* filter)
|
||||||
{
|
{
|
||||||
return DoOpenResourceFile(filename, file, quiet, containeronly);
|
return DoOpenResourceFile(filename, file, quiet, containeronly, filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
FResourceFile *FResourceFile::OpenResourceFile(const char *filename, bool quiet, bool containeronly)
|
FResourceFile *FResourceFile::OpenResourceFile(const char *filename, bool quiet, bool containeronly, LumpFilterInfo* filter)
|
||||||
{
|
{
|
||||||
FileReader file;
|
FileReader file;
|
||||||
if (!file.OpenFile(filename)) return nullptr;
|
if (!file.OpenFile(filename)) return nullptr;
|
||||||
return DoOpenResourceFile(filename, file, quiet, containeronly);
|
return DoOpenResourceFile(filename, file, quiet, containeronly, filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
FResourceFile *FResourceFile::OpenResourceFileFromLump(int lumpnum, bool quiet, bool containeronly)
|
FResourceFile *FResourceFile::OpenDirectory(const char *filename, bool quiet, LumpFilterInfo* filter)
|
||||||
{
|
{
|
||||||
FileReader file = Wads.ReopenLumpReader(lumpnum);
|
return CheckDir(filename, quiet, false, filter);
|
||||||
return DoOpenResourceFile("internal", file, quiet, containeronly);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
FResourceFile *FResourceFile::OpenDirectory(const char *filename, bool quiet)
|
|
||||||
{
|
|
||||||
return CheckDir(filename, quiet);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
@ -355,28 +348,29 @@ void FResourceFile::GenerateHash()
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
void FResourceFile::PostProcessArchive(void *lumps, size_t lumpsize)
|
void FResourceFile::PostProcessArchive(void *lumps, size_t lumpsize, LumpFilterInfo *filter)
|
||||||
{
|
{
|
||||||
// Entries in archives are sorted alphabetically
|
// Entries in archives are sorted alphabetically
|
||||||
qsort(lumps, NumLumps, lumpsize, lumpcmp);
|
qsort(lumps, NumLumps, lumpsize, lumpcmp);
|
||||||
|
if (!filter) return;
|
||||||
|
|
||||||
// Filter out lumps using the same names as the Autoload.* sections
|
// Filter out lumps using the same names as the Autoload.* sections
|
||||||
// in the ini file use. We reduce the maximum lump concidered after
|
// in the ini file use. We reduce the maximum lump concidered after
|
||||||
// each one so that we don't risk refiltering already filtered lumps.
|
// each one so that we don't risk refiltering already filtered lumps.
|
||||||
uint32_t max = NumLumps;
|
uint32_t max = NumLumps;
|
||||||
max -= FilterLumpsByGameType(gameinfo.gametype, lumps, lumpsize, max);
|
max -= FilterLumpsByGameType(filter, lumps, lumpsize, max);
|
||||||
|
|
||||||
long len;
|
long len;
|
||||||
int lastpos = -1;
|
int lastpos = -1;
|
||||||
FString file;
|
FString file;
|
||||||
if (LumpFilterIWAD.IndexOf('.') < 0)
|
FString LumpFilter = filter->dotFilter;
|
||||||
|
if (LumpFilter.IndexOf('.') < 0)
|
||||||
{
|
{
|
||||||
max -= FilterLumps(LumpFilterIWAD, lumps, lumpsize, max);
|
max -= FilterLumps(LumpFilter, lumps, lumpsize, max);
|
||||||
}
|
}
|
||||||
else while ((len = LumpFilterIWAD.IndexOf('.', lastpos+1)) > 0)
|
else while ((len = LumpFilter.IndexOf('.', lastpos+1)) > 0)
|
||||||
{
|
{
|
||||||
max -= FilterLumps(LumpFilterIWAD.Left(len), lumps, lumpsize, max);
|
max -= FilterLumps(LumpFilter.Left(len), lumps, lumpsize, max);
|
||||||
lastpos = len;
|
lastpos = len;
|
||||||
}
|
}
|
||||||
JunkLeftoverFilters(lumps, lumpsize, max);
|
JunkLeftoverFilters(lumps, lumpsize, max);
|
||||||
|
@ -457,30 +451,18 @@ int FResourceFile::FilterLumps(FString filtername, void *lumps, size_t lumpsize,
|
||||||
//
|
//
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
int FResourceFile::FilterLumpsByGameType(int type, void *lumps, size_t lumpsize, uint32_t max)
|
int FResourceFile::FilterLumpsByGameType(LumpFilterInfo *filter, void *lumps, size_t lumpsize, uint32_t max)
|
||||||
{
|
{
|
||||||
static const struct { int match; const char *name; } blanket[] =
|
if (filter == nullptr)
|
||||||
{
|
|
||||||
{ GAME_Raven, "game-Raven" },
|
|
||||||
{ GAME_DoomStrifeChex, "game-DoomStrifeChex" },
|
|
||||||
{ GAME_DoomChex, "game-DoomChex" },
|
|
||||||
{ GAME_Any, NULL }
|
|
||||||
};
|
|
||||||
if (type == 0)
|
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int count = 0;
|
int count = 0;
|
||||||
for (int i = 0; blanket[i].name != NULL; ++i)
|
for (auto &fstring : filter->gameTypeFilter)
|
||||||
{
|
{
|
||||||
if (type & blanket[i].match)
|
count += FilterLumps(fstring, lumps, lumpsize, max);
|
||||||
{
|
|
||||||
count += FilterLumps(blanket[i].name, lumps, lumpsize, max);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
FString filter = "game-";
|
return count;
|
||||||
filter += GameNames[type];
|
|
||||||
return count + FilterLumps(filter, lumps, lumpsize, max);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
@ -707,7 +689,7 @@ int FExternalLump::FillCache()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool FMemoryFile::Open(bool quiet)
|
bool FMemoryFile::Open(bool quiet, LumpFilterInfo*)
|
||||||
{
|
{
|
||||||
FString name(ExtractFileBase(FileName));
|
FString name(ExtractFileBase(FileName));
|
||||||
FString fname(ExtractFileBase(FileName, true));
|
FString fname(ExtractFileBase(FileName, true));
|
||||||
|
|
|
@ -5,6 +5,12 @@
|
||||||
|
|
||||||
#include "files.h"
|
#include "files.h"
|
||||||
|
|
||||||
|
struct LumpFilterInfo
|
||||||
|
{
|
||||||
|
TArray<FString> gameTypeFilter; // this can contain multiple entries
|
||||||
|
FString dotFilter;
|
||||||
|
};
|
||||||
|
|
||||||
class FResourceFile;
|
class FResourceFile;
|
||||||
class FTexture;
|
class FTexture;
|
||||||
|
|
||||||
|
@ -128,22 +134,21 @@ protected:
|
||||||
|
|
||||||
// for archives that can contain directories
|
// for archives that can contain directories
|
||||||
void GenerateHash();
|
void GenerateHash();
|
||||||
void PostProcessArchive(void *lumps, size_t lumpsize);
|
void PostProcessArchive(void *lumps, size_t lumpsize, LumpFilterInfo *filter);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint32_t FirstLump;
|
uint32_t FirstLump;
|
||||||
|
|
||||||
int FilterLumps(FString filtername, void *lumps, size_t lumpsize, uint32_t max);
|
int FilterLumps(FString filtername, void *lumps, size_t lumpsize, uint32_t max);
|
||||||
int FilterLumpsByGameType(int gametype, void *lumps, size_t lumpsize, uint32_t max);
|
int FilterLumpsByGameType(LumpFilterInfo *filter, void *lumps, size_t lumpsize, uint32_t max);
|
||||||
bool FindPrefixRange(FString filter, void *lumps, size_t lumpsize, uint32_t max, uint32_t &start, uint32_t &end);
|
bool FindPrefixRange(FString filter, void *lumps, size_t lumpsize, uint32_t max, uint32_t &start, uint32_t &end);
|
||||||
void JunkLeftoverFilters(void *lumps, size_t lumpsize, uint32_t max);
|
void JunkLeftoverFilters(void *lumps, size_t lumpsize, uint32_t max);
|
||||||
static FResourceFile *DoOpenResourceFile(const char *filename, FileReader &file, bool quiet, bool containeronly);
|
static FResourceFile *DoOpenResourceFile(const char *filename, FileReader &file, bool quiet, bool containeronly, LumpFilterInfo* filter);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static FResourceFile *OpenResourceFile(const char *filename, FileReader &file, bool quiet = false, bool containeronly = false);
|
static FResourceFile *OpenResourceFile(const char *filename, FileReader &file, bool quiet = false, bool containeronly = false, LumpFilterInfo* filter = nullptr);
|
||||||
static FResourceFile *OpenResourceFile(const char *filename, bool quiet = false, bool containeronly = false);
|
static FResourceFile *OpenResourceFile(const char *filename, bool quiet = false, bool containeronly = false, LumpFilterInfo* filter = nullptr);
|
||||||
static FResourceFile *OpenResourceFileFromLump(int lumpnum, bool quiet = false, bool containeronly = false);
|
static FResourceFile *OpenDirectory(const char *filename, bool quiet = false, LumpFilterInfo* filter = nullptr);
|
||||||
static FResourceFile *OpenDirectory(const char *filename, bool quiet = false);
|
|
||||||
virtual ~FResourceFile();
|
virtual ~FResourceFile();
|
||||||
// If this FResourceFile represents a directory, the Reader object is not usable so don't return it.
|
// If this FResourceFile represents a directory, the Reader object is not usable so don't return it.
|
||||||
FileReader *GetReader() { return Reader.isOpen()? &Reader : nullptr; }
|
FileReader *GetReader() { return Reader.isOpen()? &Reader : nullptr; }
|
||||||
|
@ -153,7 +158,7 @@ public:
|
||||||
const FString &GetHash() const { return Hash; }
|
const FString &GetHash() const { return Hash; }
|
||||||
|
|
||||||
|
|
||||||
virtual bool Open(bool quiet) = 0;
|
virtual bool Open(bool quiet, LumpFilterInfo* filter) = 0;
|
||||||
virtual FResourceLump *GetLump(int no) = 0;
|
virtual FResourceLump *GetLump(int no) = 0;
|
||||||
FResourceLump *FindLump(const char *name);
|
FResourceLump *FindLump(const char *name);
|
||||||
};
|
};
|
||||||
|
@ -198,7 +203,7 @@ struct FMemoryFile : public FUncompressedFile
|
||||||
Reader.OpenMemoryArray(sdata, length);
|
Reader.OpenMemoryArray(sdata, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Open(bool quiet);
|
bool Open(bool quiet, LumpFilterInfo* filter);
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -263,7 +263,7 @@ void FWadCollection::InitSingleFile(const char* filename, bool quiet)
|
||||||
InitMultipleFiles(filenames, deletes, true);
|
InitMultipleFiles(filenames, deletes, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FWadCollection::InitMultipleFiles (TArray<FString> &filenames, const TArray<FString> &deletelumps, bool quiet)
|
void FWadCollection::InitMultipleFiles (TArray<FString> &filenames, const TArray<FString> &deletelumps, bool quiet, LumpFilterInfo* filter)
|
||||||
{
|
{
|
||||||
int numfiles;
|
int numfiles;
|
||||||
|
|
||||||
|
@ -274,7 +274,7 @@ void FWadCollection::InitMultipleFiles (TArray<FString> &filenames, const TArray
|
||||||
for(unsigned i=0;i<filenames.Size(); i++)
|
for(unsigned i=0;i<filenames.Size(); i++)
|
||||||
{
|
{
|
||||||
int baselump = NumLumps;
|
int baselump = NumLumps;
|
||||||
AddFile (filenames[i], nullptr, quiet);
|
AddFile (filenames[i], nullptr, quiet, filter);
|
||||||
|
|
||||||
if (i == (unsigned)MaxIwadIndex) MoveLumpsInFolder("after_iwad/");
|
if (i == (unsigned)MaxIwadIndex) MoveLumpsInFolder("after_iwad/");
|
||||||
FStringf path("filter/%s", Files.Last()->GetHash().GetChars());
|
FStringf path("filter/%s", Files.Last()->GetHash().GetChars());
|
||||||
|
@ -331,7 +331,7 @@ int FWadCollection::AddExternalFile(const char *filename)
|
||||||
// [RH] Removed reload hack
|
// [RH] Removed reload hack
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
|
|
||||||
void FWadCollection::AddFile (const char *filename, FileReader *wadr, bool quiet)
|
void FWadCollection::AddFile (const char *filename, FileReader *wadr, bool quiet, LumpFilterInfo* filter)
|
||||||
{
|
{
|
||||||
int startlump;
|
int startlump;
|
||||||
bool isdir = false;
|
bool isdir = false;
|
||||||
|
@ -371,9 +371,9 @@ void FWadCollection::AddFile (const char *filename, FileReader *wadr, bool quiet
|
||||||
FResourceFile *resfile;
|
FResourceFile *resfile;
|
||||||
|
|
||||||
if (!isdir)
|
if (!isdir)
|
||||||
resfile = FResourceFile::OpenResourceFile(filename, wadreader, quiet);
|
resfile = FResourceFile::OpenResourceFile(filename, wadreader, quiet, false, filter);
|
||||||
else
|
else
|
||||||
resfile = FResourceFile::OpenDirectory(filename, quiet);
|
resfile = FResourceFile::OpenDirectory(filename, quiet, filter);
|
||||||
|
|
||||||
if (resfile != NULL)
|
if (resfile != NULL)
|
||||||
{
|
{
|
||||||
|
@ -397,7 +397,7 @@ void FWadCollection::AddFile (const char *filename, FileReader *wadr, bool quiet
|
||||||
FString path;
|
FString path;
|
||||||
path.Format("%s:%s", filename, lump->getName());
|
path.Format("%s:%s", filename, lump->getName());
|
||||||
auto embedded = lump->NewReader();
|
auto embedded = lump->NewReader();
|
||||||
AddFile(path, &embedded);
|
AddFile(path, &embedded, quiet, filter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -82,8 +82,8 @@ public:
|
||||||
void SetMaxIwadNum(int x) { MaxIwadIndex = x; }
|
void SetMaxIwadNum(int x) { MaxIwadIndex = x; }
|
||||||
|
|
||||||
void InitSingleFile(const char *filename, bool quiet = false);
|
void InitSingleFile(const char *filename, bool quiet = false);
|
||||||
void InitMultipleFiles (TArray<FString> &filenames, const TArray<FString> &deletelumps, bool quiet = false);
|
void InitMultipleFiles (TArray<FString> &filenames, const TArray<FString> &deletelumps, bool quiet = false, LumpFilterInfo* filter = nullptr);
|
||||||
void AddFile (const char *filename, FileReader *wadinfo = NULL, bool quiet = false);
|
void AddFile (const char *filename, FileReader *wadinfo, bool quiet, LumpFilterInfo* filter);
|
||||||
int CheckIfWadLoaded (const char *name);
|
int CheckIfWadLoaded (const char *name);
|
||||||
|
|
||||||
const char *GetWadName (int wadnum) const;
|
const char *GetWadName (int wadnum) const;
|
||||||
|
|
Loading…
Reference in a new issue