bool ResourceManager::hasArchive(ArchiveType archive, const Common::UString &file) { assert((archive >= 0) && (archive < kArchiveMAX)); if (archive == kArchiveNDS) return Common::File::exists(file); return !findArchive(file, _archiveDirs[archive], _archiveFiles[archive]).empty(); }
void ResourceManager::findBIFs(const KEYFile &key, std::vector<Common::UString> &bifs) { const KEYFile::BIFList &keyBIFs = key.getBIFs(); bifs.resize(keyBIFs.size()); KEYFile::BIFList::const_iterator keyBIF = keyBIFs.begin(); std::vector<Common::UString>::iterator bif = bifs.begin(); for (; (keyBIF != keyBIFs.end()) && (bif != bifs.end()); ++keyBIF, ++bif) { *bif = findArchive(*keyBIF, _archiveDirs[kArchiveBIF], _archiveFiles[kArchiveBIF]); if (bif->empty()) throw Common::Exception("BIF \"%s\" not found", keyBIF->c_str()); } }
ResourceManager::ChangeID ResourceManager::addArchive(ArchiveType archive, const Common::UString &file, uint32 priority) { // NDS aren't found in resource directories, they are used /instead/ of directories if (archive == kArchiveNDS) { NDSFile *nds = new NDSFile(file); ChangeID change = newChangeSet(); return indexArchive(nds, priority, change); } // HERF files are only found inside NDS files if (archive == kArchiveHERF) { HERFFile *herf = new HERFFile(file); ChangeID change = newChangeSet(); return indexArchive(herf, priority, change); } assert((archive >= 0) && (archive < kArchiveMAX)); if (archive == kArchiveBIF) throw Common::Exception("Attempted to index a lone BIF"); Common::UString realName = findArchive(file, _archiveDirs[archive], _archiveFiles[archive]); if (realName.empty()) throw Common::Exception("No such archive file \"%s\"", file.c_str()); if (archive == kArchiveKEY) return indexKEY(realName, priority); if (archive == kArchiveERF) { ERFFile *erf = new ERFFile(realName); ChangeID change = newChangeSet(); return indexArchive(erf, priority, change); } if (archive == kArchiveRIM) { RIMFile *rim = new RIMFile(realName); ChangeID change = newChangeSet(); return indexArchive(rim, priority, change); } if (archive == kArchiveZIP) { ZIPFile *zip = new ZIPFile(realName); ChangeID change = newChangeSet(); return indexArchive(zip, priority, change); } if (archive == kArchiveEXE) { PEFile *pe = new PEFile(realName, _cursorRemap); ChangeID change = newChangeSet(); return indexArchive(pe, priority, change); } return ChangeID(); }
InterfaceProxy *DataManager::getObjectInterface(ObjectID const &id, std::string const &path_str, DataArchive const *d) const { DataArchive *archive = findArchive(id, path_str, d); return archive->getObjectInterface(id); }
const LinkBase DataManager::getObject(Path const& path, std::string const &path_str, DataArchive const *d) const { hasht id = (hasht) path.getPath(); DataArchive *archive = findArchive(id, path_str, d); return archive->getObject(path, path_str); }