svn-id: r34831
This commit is contained in:
Johannes Schickel 2008-10-21 11:42:08 +00:00
parent a5a73ff9d6
commit cd38ddc542
3 changed files with 49 additions and 29 deletions

View File

@ -108,7 +108,13 @@ bool Resource::reset() {
};
for (uint i = 0; i < ARRAYSIZE(list); ++i) {
Common::ArchivePtr archive = loadArchive(list[i]);
Common::ArchiveMemberList fileList;
listFiles(list[i], fileList);
if (fileList.empty())
error("Couldn't load PAK file '%s'", list[i]);
Common::ArchivePtr archive = loadArchive(list[i], *fileList.begin());
if (archive)
_protectedFiles->add(list[i], archive, 0);
}
@ -137,14 +143,26 @@ bool Resource::reset() {
bool Resource::loadPakFile(Common::String filename) {
filename.toUppercase();
if (_archiveFiles->hasArchive(filename) || _protectedFiles->hasArchive(filename))
Common::ArchiveMemberList list;
_files.listMatchingMembers(list, filename);
if (list.empty())
return false;
return loadPakFile(filename, *list.begin());
}
bool Resource::loadPakFile(Common::String name, Common::SharedPtr<Common::ArchiveMember> file) {
name.toUppercase();
if (_archiveFiles->hasArchive(name) || _protectedFiles->hasArchive(name))
return true;
Common::ArchivePtr archive = loadArchive(filename);
Common::ArchivePtr archive = loadArchive(name, file);
if (!archive)
return false;
_archiveFiles->add(filename, archive, 0);
_archiveFiles->add(name, archive, 0);
return true;
}
@ -200,9 +218,11 @@ bool Resource::loadFileList(const char * const *filelist, uint32 numFiles) {
return true;
}
void Resource::unloadPakFile(Common::String filename) {
void Resource::unloadPakFile(Common::String filename, bool remFromCache) {
filename.toUppercase();
_archiveFiles->remove(filename);
if (remFromCache)
_archiveCache.erase(filename);
// We do not remove files from '_protectedFiles' here, since
// those are protected against unloading.
}
@ -212,11 +232,20 @@ bool Resource::isInPakList(Common::String filename) {
return (_archiveFiles->hasArchive(filename) || _protectedFiles->hasArchive(filename));
}
bool Resource::isInCacheList(Common::String name) {
name.toUppercase();
return (_archiveCache.find(name) != _archiveCache.end());
}
void Resource::unloadAllPakFiles() {
_archiveFiles->clear();
_protectedFiles->clear();
}
void Resource::listFiles(const Common::String &pattern, Common::ArchiveMemberList &list) {
_files.listMatchingMembers(list, pattern);
}
uint8 *Resource::fileData(const char *file, uint32 *size) {
Common::SeekableReadStream *stream = getFileStream(file);
if (!stream)
@ -265,21 +294,11 @@ Common::SeekableReadStream *Resource::getFileStream(const Common::String &file)
return _files.openFile(file);
}
Common::ArchivePtr Resource::loadArchive(const Common::String &file) {
ArchiveMap::iterator cachedArchive = _archiveCache.find(file);
Common::ArchivePtr Resource::loadArchive(const Common::String &name, Common::SharedPtr<Common::ArchiveMember> member) {
ArchiveMap::iterator cachedArchive = _archiveCache.find(name);
if (cachedArchive != _archiveCache.end())
return cachedArchive->_value;
Common::ArchiveMemberList list;
_files.listMatchingMembers(list, file);
if (list.empty())
return Common::ArchivePtr();
return loadArchive(file, *list.begin());
}
Common::ArchivePtr Resource::loadArchive(const Common::String &name, Common::SharedPtr<Common::ArchiveMember> member) {
Common::SeekableReadStream *stream = member->open();
if (!stream)

View File

@ -47,7 +47,6 @@ class Resource;
class ResArchiveLoader;
class Resource {
friend class StaticResource;
public:
Resource(KyraEngine_v1 *vm);
~Resource();
@ -55,14 +54,20 @@ public:
bool reset();
bool loadPakFile(Common::String filename);
void unloadPakFile(Common::String filename);
bool loadPakFile(Common::String name, Common::SharedPtr<Common::ArchiveMember> file);
void unloadPakFile(Common::String filename, bool remFromCache = false);
bool isInPakList(Common::String filename);
bool isInCacheList(Common::String name);
bool loadFileList(const Common::String &filedata);
bool loadFileList(const char * const *filelist, uint32 numFiles);
// This unloads *all* pakfiles, even kyra.dat and protected ones
// This unloads *all* pakfiles, even kyra.dat and protected ones.
// It does not remove files from cache though!
void unloadAllPakFiles();
void listFiles(const Common::String &pattern, Common::ArchiveMemberList &list);
bool exists(const char *file, bool errorOutOnFail=false);
uint32 getFileSize(const char *file);
uint8* fileData(const char *file, uint32 *size);
@ -77,7 +82,6 @@ protected:
Common::SharedPtr<Common::SearchSet> _archiveFiles;
Common::SharedPtr<Common::SearchSet> _protectedFiles;
Common::ArchivePtr loadArchive(const Common::String &file);
Common::ArchivePtr loadArchive(const Common::String &name, Common::SharedPtr<Common::ArchiveMember> member);
Common::ArchivePtr loadInstallerArchive(const Common::String &file, const Common::String &ext, const uint8 offset);

View File

@ -136,11 +136,11 @@ static const LanguageTypes languages[] = {
bool StaticResource::loadStaticResourceFile() {
Resource *res = _vm->resource();
if (res->_archiveCache.find(staticDataFilename()) != res->_archiveCache.end())
if (res->isInCacheList(staticDataFilename()))
return true;
Common::ArchiveMemberList kyraDatFiles;
res->_files.listMatchingMembers(kyraDatFiles, staticDataFilename());
res->listFiles(staticDataFilename(), kyraDatFiles);
bool foundWorkingKyraDat = false;
for (Common::ArchiveMemberList::iterator i = kyraDatFiles.begin(); i != kyraDatFiles.end(); ++i) {
@ -152,18 +152,15 @@ bool StaticResource::loadStaticResourceFile() {
delete file; file = 0;
Common::ArchivePtr archive = res->loadArchive(staticDataFilename(), *i);
if (!archive)
if (!res->loadPakFile(staticDataFilename(), *i))
continue;
res->_archiveFiles->add(staticDataFilename(), archive, 0);
if (tryKyraDatLoad()) {
foundWorkingKyraDat = true;
break;
}
res->_archiveCache.erase(staticDataFilename());
res->_archiveFiles->remove(staticDataFilename());
res->unloadPakFile(staticDataFilename(), true);
unloadId(-1);
}