76 lines
1.7 KiB
C++
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("/");
|
|
}
|
|
}
|
|
} |