Files
LifeProject/LifeCore/vfs/pak/IPakFileContentProvider.cpp
2025-05-13 02:46:21 +03:00

76 lines
1.7 KiB
C++

#include "IPakFileContentProvider.h"
namespace LifeCore
{
static const String pakPathSplitter(_text("/"));
IPakFileContentProvider::IPakFileContentProvider(IDataStream* pakFile, const String& name)
{
IPakFolder* folder = new IPakFolder();
// g_rootFolder = pakFile;
folder->Provider = this;
folder->Name = name;
folder->EntryName = _text("");
fileSystem = new IFileSystem(folder);
g_sourceFile.Open(pakFile);
fileSystem->GetRootFolder();
BuildTree();
}
void IPakFileContentProvider::BuildTree()
{
//g_sourceFile.LocateEntry(0);
int numFiles = g_sourceFile.filesCount();
for (int i = 0; i < numFiles; i++)
{
//g_sourceFile.LocateEntry(i);
entry_info info = g_sourceFile.GetEntryInfo(i);
String p = GetPakPathWithoutFilename(info.fileName);
IPakFolder* folder;
if(this->fileSystem->GetFolder(p, (IFolder**)&folder) != SC_OK)
{
printf("Failed to get folder! IPakFileContentProvider::BuildTree\n");
return;
}
IPakFile* file = new IPakFile();
file->FileName = GetFileName(info.fileName, pakPathSplitter);
file->Provider = this;
file->Size = info.fileSize;
file->EntryName = info.fileName;
folder->AddFile(file);
//g_sourceFile.CloseCurrentEntry();
}
//print folder tree
String tab(_text("\t"));
int cnt = fileSystem->GetRootFolder()->folderCount;
for(int i = 0; i < cnt; i++)
{
IFolder* fld = fileSystem->GetRootFolder()->GetFolder(i);
PRINT(_text("%s\n"), fld->Name.c_str());
PRINT(_text("Files count: %i\n"), fld->fileCount);
}
}
String IPakFileContentProvider::GetPakPathWithoutFilename(const String& path)
{
int offset = path.find_last_of(_text("/"));
if(offset>=0)
{
return path.substr(0, offset);
}
else
{
return _text("/");
}
}
}