diff options
-rw-r--r-- | engines/sci/resource.cpp | 72 | ||||
-rw-r--r-- | engines/sci/resource.h | 1 | ||||
-rw-r--r-- | engines/sci/resource_audio.cpp | 19 | ||||
-rw-r--r-- | engines/sci/resource_intern.h | 6 |
4 files changed, 38 insertions, 60 deletions
diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp index df33ec6b89..a57ae04847 100644 --- a/engines/sci/resource.cpp +++ b/engines/sci/resource.cpp @@ -1134,20 +1134,12 @@ void ResourceManager::processPatch(ResourceSource *source, ResourceType resource return; } - // Prepare destination, if neccessary - if (_resMap.contains(resId) == false) { - newrsc = new Resource; - _resMap.setVal(resId, newrsc); - } else - newrsc = _resMap.getVal(resId); - // Overwrite everything, because we're patching - newrsc->_id = resId; - newrsc->_status = kResStatusNoMalloc; - newrsc->_source = source; - newrsc->size = fsize - patchDataOffset - 2; + newrsc = updateResource(resId, source, fsize - patchDataOffset - 2); newrsc->_headerSize = patchDataOffset; newrsc->_fileOffset = 0; + + debugC(1, kDebugLevelResMan, "Patching %s - OK", source->getLocationName().c_str()); } @@ -1285,7 +1277,6 @@ void ResourceManager::readResourcePatches(ResourceSource *source) { int ResourceManager::readResourceMapSCI0(ResourceSource *map) { Common::SeekableReadStream *fileStream = 0; - Resource *res; ResourceType type; uint16 number, id; uint32 offset; @@ -1323,9 +1314,8 @@ int ResourceManager::readResourceMapSCI0(ResourceSource *map) { ResourceId resId = ResourceId(type, number); // adding a new resource if (_resMap.contains(resId) == false) { - res = new Resource; - res->_source = findVolume(map, offset >> bShift); - if (!res->_source) { + ResourceSource *source = findVolume(map, offset >> bShift); + if (!source) { warning("Could not get volume for resource %d, VolumeID %d", id, offset >> bShift); if (_mapVersion != _volVersion) { warning("Retrying with the detected volume version instead"); @@ -1333,12 +1323,11 @@ int ResourceManager::readResourceMapSCI0(ResourceSource *map) { _mapVersion = _volVersion; bMask = (_mapVersion == kResVersionSci1Middle) ? 0xF0 : 0xFC; bShift = (_mapVersion == kResVersionSci1Middle) ? 28 : 26; - res->_source = findVolume(map, offset >> bShift); + source = findVolume(map, offset >> bShift); } } - res->_fileOffset = offset & (((~bMask) << 24) | 0xFFFFFF); - res->_id = resId; - _resMap.setVal(resId, res); + + addResource(resId, source, offset & (((~bMask) << 24) | 0xFFFFFF)); } } while (!fileStream->eos()); @@ -1348,7 +1337,6 @@ int ResourceManager::readResourceMapSCI0(ResourceSource *map) { int ResourceManager::readResourceMapSCI1(ResourceSource *map) { Common::SeekableReadStream *fileStream = 0; - Resource *res; if (map->_resourceFile) { fileStream = map->_resourceFile->createReadStream(); @@ -1409,16 +1397,11 @@ int ResourceManager::readResourceMapSCI1(ResourceSource *map) { resId = ResourceId((ResourceType)type, number); // adding new resource only if it does not exist if (_resMap.contains(resId) == false) { - res = new Resource; - _resMap.setVal(resId, res); - res->_id = resId; - // NOTE: We add the map's volume number here to the specified volume number // for SCI2.1 and SCI3 maps that are not resmap.000. The resmap.* files' numbers // need to be used in concurrence with the volume specified in the map to get // the actual resource file. - res->_source = findVolume(map, volume_nr + map->_volumeNumber); - res->_fileOffset = off; + addResource(resId, findVolume(map, volume_nr + map->_volumeNumber), off); } } } @@ -1494,21 +1477,8 @@ void MacResourceForkResourceSource::scanSource() { ResourceId resId = ResourceId(type, idArray[j]); - Resource *newrsc = NULL; - - // Prepare destination, if neccessary. Resource forks may contain patches. - if (!resMan->_resMap.contains(resId)) { - newrsc = new Resource; - resMan->_resMap.setVal(resId, newrsc); - } else - newrsc = resMan->_resMap.getVal(resId); - - // Overwrite everything - newrsc->_id = resId; - newrsc->_status = kResStatusNoMalloc; - newrsc->_source = this; - newrsc->size = fileSize; - newrsc->_headerSize = 0; + // Overwrite Resource instance. Resource forks may contain patches. + resMan->updateResource(resId, this, fileSize); } } } @@ -1525,6 +1495,26 @@ void ResourceManager::addResource(ResourceId resId, ResourceSource *src, uint32 } } +Resource *ResourceManager::updateResource(ResourceId resId, ResourceSource *src, uint32 size) { + // Update a patched resource, whether it exists or not + Resource *res = 0; + + if (_resMap.contains(resId)) { + res = _resMap.getVal(resId); + } else { + res = new Resource; + _resMap.setVal(resId, res); + } + + res->_id = resId; + res->_status = kResStatusNoMalloc; + res->_source = src; + res->_headerSize = 0; + res->size = size; + + return res; +} + int ResourceManager::readResourceInfo(Resource *res, Common::SeekableReadStream *file, uint32 &szPacked, ResourceCompression &compression) { // SCI0 volume format: {wResId wPacked+4 wUnpacked wCompression} = 8 bytes diff --git a/engines/sci/resource.h b/engines/sci/resource.h index db8a1c2a47..09d87eb9e3 100644 --- a/engines/sci/resource.h +++ b/engines/sci/resource.h @@ -395,6 +395,7 @@ protected: int decompress(Resource *res, Common::SeekableReadStream *file); int readResourceInfo(Resource *res, Common::SeekableReadStream *file, uint32 &szPacked, ResourceCompression &compression); void addResource(ResourceId resId, ResourceSource *src, uint32 offset, uint32 size = 0); + Resource *updateResource(ResourceId resId, ResourceSource *src, uint32 size); void removeAudioResource(ResourceId resId); /**--- Resource map decoding functions ---*/ diff --git a/engines/sci/resource_audio.cpp b/engines/sci/resource_audio.cpp index 4df2f6515b..26ea96fb6c 100644 --- a/engines/sci/resource_audio.cpp +++ b/engines/sci/resource_audio.cpp @@ -170,24 +170,11 @@ void ResourceManager::addNewGMPatch(const Common::String &gameId) { void ResourceManager::processWavePatch(ResourceId resourceId, Common::String name) { ResourceSource *resSrc = new WaveResourceSource(name); + Common::File file; + file.open(name); - Resource *newRes = 0; - - if (_resMap.contains(resourceId)) { - newRes = _resMap.getVal(resourceId); - } else { - newRes = new Resource; - _resMap.setVal(resourceId, newRes); - } - - Common::SeekableReadStream *stream = SearchMan.createReadStreamForMember(name); - newRes->size = stream->size(); - delete stream; + updateResource(resourceId, resSrc, name.size()); - newRes->_id = resourceId; - newRes->_status = kResStatusNoMalloc; - newRes->_source = resSrc; - newRes->_headerSize = 0; debugC(1, kDebugLevelResMan, "Patching %s - OK", name.c_str()); } diff --git a/engines/sci/resource_intern.h b/engines/sci/resource_intern.h index 209f3720b1..042c5428d8 100644 --- a/engines/sci/resource_intern.h +++ b/engines/sci/resource_intern.h @@ -170,6 +170,9 @@ public: virtual void loadResource(Resource *res); }; +/** + * Reads SCI1.1+ resources from a Mac resource fork. + */ class MacResourceForkResourceSource : public ResourceSource { protected: Common::MacResManager *_macResMan; @@ -178,9 +181,6 @@ public: MacResourceForkResourceSource(const Common::String &name, int volNum); ~MacResourceForkResourceSource(); - /** - * Reads the SCI1.1+ resource file from a Mac resource fork. - */ virtual void scanSource(); virtual void loadResource(Resource *res); |