#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("/"); } } }