diff options
-rw-r--r-- | engines/sci/resource.cpp | 76 | ||||
-rw-r--r-- | engines/sci/resource_audio.cpp | 14 | ||||
-rw-r--r-- | engines/sci/resource_intern.h | 26 |
3 files changed, 62 insertions, 54 deletions
diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index d25c3286df..0de1a3f2bd 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -26,6 +26,7 @@ // Resource library #include "common/file.h" +#include "common/macresman.h" #include "sci/resource.h" #include "sci/resource_intern.h" @@ -144,7 +145,7 @@ Resource::Resource() { Resource::~Resource() { delete[] data; - if (_source && _source->source_type == kSourcePatch) + if (_source && _source->getSourceType() == kSourcePatch) delete _source; } @@ -166,14 +167,33 @@ uint32 Resource::getAudioCompressionType() { return _source->audioCompressionType; } + +ResourceSource::ResourceSource(ResSourceType type) + : _sourceType(type) { + scanned = false; + resourceFile = 0; + volume_number = 0; + associated_map = NULL; + audioCompressionType = 0; + audioCompressionOffsetMapping = NULL; + + if (_sourceType == kSourceMacResourceFork) + _macResMan = new Common::MacResManager(); + else + _macResMan = NULL; +} + +ResourceSource::~ResourceSource() { + delete _macResMan; +} + //-- resMan helper functions -- // Resource source list management ResourceSource *ResourceManager::addExternalMap(const char *file_name, int volume_nr) { - ResourceSource *newsrc = new ResourceSource(); + ResourceSource *newsrc = new ResourceSource(kSourceExtMap); - newsrc->source_type = kSourceExtMap; newsrc->location_name = file_name; newsrc->volume_number = volume_nr; @@ -182,9 +202,8 @@ ResourceSource *ResourceManager::addExternalMap(const char *file_name, int volum } ResourceSource *ResourceManager::addExternalMap(const Common::FSNode *mapFile, int volume_nr) { - ResourceSource *newsrc = new ResourceSource(); + ResourceSource *newsrc = new ResourceSource(kSourceExtMap); - newsrc->source_type = kSourceExtMap; newsrc->location_name = mapFile->getName(); newsrc->resourceFile = mapFile; newsrc->volume_number = volume_nr; @@ -194,9 +213,8 @@ ResourceSource *ResourceManager::addExternalMap(const Common::FSNode *mapFile, i } ResourceSource *ResourceManager::addSource(ResourceSource *map, ResSourceType type, const char *filename, int number) { - ResourceSource *newsrc = new ResourceSource(); + ResourceSource *newsrc = new ResourceSource(type); - newsrc->source_type = type; newsrc->location_name = filename; newsrc->volume_number = number; newsrc->associated_map = map; @@ -208,9 +226,8 @@ ResourceSource *ResourceManager::addSource(ResourceSource *map, ResSourceType ty } ResourceSource *ResourceManager::addSource(ResourceSource *map, ResSourceType type, const Common::FSNode *resFile, int number) { - ResourceSource *newsrc = new ResourceSource(); + ResourceSource *newsrc = new ResourceSource(type); - newsrc->source_type = type; newsrc->location_name = resFile->getName(); newsrc->resourceFile = resFile; newsrc->volume_number = number; @@ -223,9 +240,8 @@ ResourceSource *ResourceManager::addSource(ResourceSource *map, ResSourceType ty } ResourceSource *ResourceManager::addPatchDir(const char *dirname) { - ResourceSource *newsrc = new ResourceSource(); + ResourceSource *newsrc = new ResourceSource(kSourceDirectory); - newsrc->source_type = kSourceDirectory; newsrc->location_name = dirname; _sources.push_back(newsrc); @@ -235,7 +251,7 @@ ResourceSource *ResourceManager::addPatchDir(const char *dirname) { ResourceSource *ResourceManager::getVolume(ResourceSource *map, int volume_nr) { for (Common::List<ResourceSource *>::iterator it = _sources.begin(); it != _sources.end(); ++it) { ResourceSource *src = *it; - if ((src->source_type == kSourceVolume || src->source_type == kSourceAudioVolume) + if ((src->getSourceType() == kSourceVolume || src->getSourceType() == kSourceAudioVolume) && src->associated_map == map && src->volume_number == volume_nr) return src; } @@ -327,11 +343,12 @@ Common::SeekableReadStream *ResourceManager::getVolumeFile(ResourceSource *sourc static uint32 resTypeToMacTag(ResourceType type); void ResourceManager::loadResource(Resource *res) { - if (res->_source->source_type == kSourcePatch && loadFromPatchFile(res)) + if (res->_source->getSourceType() == kSourcePatch && loadFromPatchFile(res)) return; - if (res->_source->source_type == kSourceMacResourceFork) { - Common::SeekableReadStream *stream = res->_source->macResMan.getResource(resTypeToMacTag(res->_id.type), res->_id.number); + if (res->_source->getSourceType() == kSourceMacResourceFork) { + assert(res->_source->_macResMan); + Common::SeekableReadStream *stream = res->_source->_macResMan->getResource(resTypeToMacTag(res->_id.type), res->_id.number); if (!stream) error("Could not get Mac resource fork resource: %d %d", res->_id.type, res->_id.number); @@ -353,7 +370,7 @@ void ResourceManager::loadResource(Resource *res) { return; } - switch(res->_source->source_type) { + switch(res->_source->getSourceType()) { case kSourceWave: fileStream->seek(res->_fileOffset, SEEK_SET); loadFromWaveFile(res, fileStream); @@ -605,7 +622,7 @@ void ResourceManager::scanNewSources() { if (!source->scanned) { source->scanned = true; - switch (source->source_type) { + switch (source->getSourceType()) { case kSourceDirectory: readResourcePatches(source); @@ -874,7 +891,7 @@ ResourceManager::ResVersion ResourceManager::detectMapVersion() { for (Common::List<ResourceSource *>::iterator it = _sources.begin(); it != _sources.end(); ++it) { rsrc = *it; - if (rsrc->source_type == kSourceExtMap) { + if (rsrc->getSourceType() == kSourceExtMap) { if (rsrc->resourceFile) { fileStream = rsrc->resourceFile->createReadStream(); } else { @@ -884,7 +901,7 @@ ResourceManager::ResVersion ResourceManager::detectMapVersion() { fileStream = file; } break; - } else if (rsrc->source_type == kSourceMacResourceFork) + } else if (rsrc->getSourceType() == kSourceMacResourceFork) return kResVersionSci11Mac; } @@ -963,7 +980,7 @@ ResourceManager::ResVersion ResourceManager::detectVolVersion() { for (Common::List<ResourceSource *>::iterator it = _sources.begin(); it != _sources.end(); ++it) { rsrc = *it; - if (rsrc->source_type == kSourceVolume) { + if (rsrc->getSourceType() == kSourceVolume) { if (rsrc->resourceFile) { fileStream = rsrc->resourceFile->createReadStream(); } else { @@ -973,7 +990,7 @@ ResourceManager::ResVersion ResourceManager::detectVolVersion() { fileStream = file; } break; - } else if (rsrc->source_type == kSourceMacResourceFork) + } else if (rsrc->getSourceType() == kSourceMacResourceFork) return kResVersionSci11Mac; } @@ -1213,8 +1230,7 @@ void ResourceManager::readResourcePatchesBase36(ResourceSource *source) { delete stream; } - psrcPatch = new ResourceSource; - psrcPatch->source_type = kSourcePatch; + psrcPatch = new ResourceSource(kSourcePatch); psrcPatch->location_name = name; processPatch(psrcPatch, (ResourceType)i, resourceNr, resource36.tuple); } @@ -1263,8 +1279,7 @@ void ResourceManager::readResourcePatches(ResourceSource *source) { } if (bAdd) { - psrcPatch = new ResourceSource; - psrcPatch->source_type = kSourcePatch; + psrcPatch = new ResourceSource(kSourcePatch); psrcPatch->location_name = name; processPatch(psrcPatch, (ResourceType)i, resourceNr); } @@ -1449,10 +1464,11 @@ static uint32 resTypeToMacTag(ResourceType type) { } int ResourceManager::readMacResourceFork(ResourceSource *source) { - if (!source->macResMan.open(source->location_name.c_str())) + assert(source->_macResMan); + if (!source->_macResMan->open(source->location_name.c_str())) error("%s is not a valid Mac resource fork", source->location_name.c_str()); - Common::MacResTagArray tagArray = source->macResMan.getResTagArray(); + Common::MacResTagArray tagArray = source->_macResMan->getResTagArray(); for (uint32 i = 0; i < tagArray.size(); i++) { ResourceType type = kResourceTypeInvalid; @@ -1467,11 +1483,11 @@ int ResourceManager::readMacResourceFork(ResourceSource *source) { if (type == kResourceTypeInvalid) continue; - Common::MacResIDArray idArray = source->macResMan.getResIDArray(tagArray[i]); + Common::MacResIDArray idArray = source->_macResMan->getResIDArray(tagArray[i]); for (uint32 j = 0; j < idArray.size(); j++) { // Get the size of the file - Common::SeekableReadStream *stream = source->macResMan.getResource(tagArray[i], idArray[j]); + Common::SeekableReadStream *stream = source->_macResMan->getResource(tagArray[i], idArray[j]); // Some IBIS resources have a size of 0, so we skip them if (!stream) @@ -1671,7 +1687,7 @@ ResourceCompression ResourceManager::getViewCompression() { if (!res) continue; - if (res->_source->source_type != kSourceVolume) + if (res->_source->getSourceType() != kSourceVolume) continue; fileStream = getVolumeFile(res->_source); diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index d2f1d53e11..85758e9ef0 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -155,23 +155,15 @@ void ResourceManager::addNewGMPatch(const Common::String &gameId) { gmPatchFile = "TALEGM.PAT"; if (!gmPatchFile.empty() && Common::File::exists(gmPatchFile)) { - ResourceSource *psrcPatch = new ResourceSource; - psrcPatch->source_type = kSourcePatch; - psrcPatch->resourceFile = 0; + ResourceSource *psrcPatch = new ResourceSource(kSourcePatch); psrcPatch->location_name = gmPatchFile; - psrcPatch->audioCompressionType = 0; - psrcPatch->audioCompressionOffsetMapping = NULL; processPatch(psrcPatch, kResourceTypePatch, 4); } } void ResourceManager::processWavePatch(ResourceId resourceId, Common::String name) { - ResourceSource *resSrc = new ResourceSource; - resSrc->source_type = kSourceWave; - resSrc->resourceFile = 0; + ResourceSource *resSrc = new ResourceSource(kSourceWave); resSrc->location_name = name; - resSrc->volume_number = 0; - resSrc->audioCompressionType = 0; Resource *newRes = 0; @@ -211,7 +203,7 @@ void ResourceManager::removeAudioResource(ResourceId resId) { if (_resMap.contains(resId)) { Resource *res = _resMap.getVal(resId); - if (res->_source->source_type == kSourceAudioVolume) { + if (res->_source->getSourceType() == kSourceAudioVolume) { if (res->_status == kResStatusLocked) { warning("Failed to remove resource %s (still in use)", resId.toString().c_str()); } else { diff --git a/engines/sci/resource_intern.h b/engines/sci/resource_intern.h index 01f1f45180..89fde718d7 100644 --- a/engines/sci/resource_intern.h +++ b/engines/sci/resource_intern.h @@ -26,14 +26,16 @@ #ifndef SCI_RESOURCE_INTERN_H #define SCI_RESOURCE_INTERN_H -#include "common/macresman.h" - #include "sci/resource.h" +namespace Common { + class MacResManager; +} + namespace Sci { struct ResourceSource { - ResSourceType source_type; + const ResSourceType _sourceType; bool scanned; Common::String location_name; // FIXME: Replace by FSNode ? const Common::FSNode *resourceFile; @@ -41,16 +43,14 @@ struct ResourceSource { ResourceSource *associated_map; uint32 audioCompressionType; int32 *audioCompressionOffsetMapping; - Common::MacResManager macResMan; - ResourceSource() { - source_type = kSourceDirectory; - scanned = false; - resourceFile = 0; - volume_number = 0; - associated_map = NULL; - audioCompressionType = 0; - audioCompressionOffsetMapping = NULL; - } + Common::MacResManager *_macResMan; + +public: + + ResourceSource(ResSourceType type); + ~ResourceSource(); + + ResSourceType getSourceType() const { return _sourceType; } }; |