diff options
author | Paul Gilbert | 2011-10-01 17:50:19 +1000 |
---|---|---|
committer | Paul Gilbert | 2011-10-01 17:50:19 +1000 |
commit | 9bb978486b102dc751922c6d5f4e729e264c2887 (patch) | |
tree | 65a5b4603f3f9c3376eed9fde8034f170ecb5ede | |
parent | 8465f9f99ff5eca617a57b4231efdbcf7c9f9e8a (diff) | |
download | scummvm-rg350-9bb978486b102dc751922c6d5f4e729e264c2887.tar.gz scummvm-rg350-9bb978486b102dc751922c6d5f4e729e264c2887.tar.bz2 scummvm-rg350-9bb978486b102dc751922c6d5f4e729e264c2887.zip |
COMMON: Fix multiple engines asserting in querySaveMetaInfos for empty save slots
-rw-r--r-- | engines/cge/detection.cpp | 65 | ||||
-rw-r--r-- | engines/cruise/detection.cpp | 27 | ||||
-rw-r--r-- | engines/draci/detection.cpp | 49 | ||||
-rw-r--r-- | engines/tsage/detection.cpp | 33 |
4 files changed, 93 insertions, 81 deletions
diff --git a/engines/cge/detection.cpp b/engines/cge/detection.cpp index abb0cf5efb..8b90bd1483 100644 --- a/engines/cge/detection.cpp +++ b/engines/cge/detection.cpp @@ -189,38 +189,41 @@ SaveStateList CGEMetaEngine::listSaves(const char *target) const { SaveStateDescriptor CGEMetaEngine::querySaveMetaInfos(const char *target, int slot) const { Common::String fileName = Common::String::format("%s.%03d", target, slot); Common::InSaveFile *f = g_system->getSavefileManager()->openForLoading(fileName); - assert(f); - - CGE::SavegameHeader header; - - // Check to see if it's a ScummVM savegame or not - char buffer[kSavegameStrSize + 1]; - f->read(buffer, kSavegameStrSize + 1); - - bool hasHeader = !strncmp(buffer, CGE::savegameStr, kSavegameStrSize + 1) && - CGE::CGEEngine::readSavegameHeader(f, header); - delete f; - - if (!hasHeader) { - // Original savegame perhaps? - SaveStateDescriptor desc(slot, "Unknown"); - return desc; - } else { - // Create the return descriptor - SaveStateDescriptor desc(slot, header.saveName); - desc.setDeletableFlag(true); - desc.setWriteProtectedFlag(false); - desc.setThumbnail(header.thumbnail); - desc.setSaveDate(header.saveYear, header.saveMonth, header.saveDay); - desc.setSaveTime(header.saveHour, header.saveMinutes); - - // Slot 0 is used for the 'automatic save on exit' save in Soltys, thus - // we prevent it from being deleted or overwritten by accident. - desc.setDeletableFlag(slot != 0); - desc.setWriteProtectedFlag(slot == 0); - - return desc; + + if (f) { + CGE::SavegameHeader header; + + // Check to see if it's a ScummVM savegame or not + char buffer[kSavegameStrSize + 1]; + f->read(buffer, kSavegameStrSize + 1); + + bool hasHeader = !strncmp(buffer, CGE::savegameStr, kSavegameStrSize + 1) && + CGE::CGEEngine::readSavegameHeader(f, header); + delete f; + + if (!hasHeader) { + // Original savegame perhaps? + SaveStateDescriptor desc(slot, "Unknown"); + return desc; + } else { + // Create the return descriptor + SaveStateDescriptor desc(slot, header.saveName); + desc.setDeletableFlag(true); + desc.setWriteProtectedFlag(false); + desc.setThumbnail(header.thumbnail); + desc.setSaveDate(header.saveYear, header.saveMonth, header.saveDay); + desc.setSaveTime(header.saveHour, header.saveMinutes); + + // Slot 0 is used for the 'automatic save on exit' save in Soltys, thus + // we prevent it from being deleted or overwritten by accident. + desc.setDeletableFlag(slot != 0); + desc.setWriteProtectedFlag(slot == 0); + + return desc; + } } + + return SaveStateDescriptor(); } bool CGEMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const { diff --git a/engines/cruise/detection.cpp b/engines/cruise/detection.cpp index 5be2fdeeea..a68b14d986 100644 --- a/engines/cruise/detection.cpp +++ b/engines/cruise/detection.cpp @@ -284,19 +284,22 @@ void CruiseMetaEngine::removeSaveState(const char *target, int slot) const { SaveStateDescriptor CruiseMetaEngine::querySaveMetaInfos(const char *target, int slot) const { Common::InSaveFile *f = g_system->getSavefileManager()->openForLoading( Cruise::CruiseEngine::getSavegameFile(slot)); - assert(f); - - Cruise::CruiseSavegameHeader header; - Cruise::readSavegameHeader(f, header); - delete f; - - // Create the return descriptor - SaveStateDescriptor desc(slot, header.saveName); - desc.setDeletableFlag(true); - desc.setWriteProtectedFlag(false); - desc.setThumbnail(header.thumbnail); + + if (f) { + Cruise::CruiseSavegameHeader header; + Cruise::readSavegameHeader(f, header); + delete f; + + // Create the return descriptor + SaveStateDescriptor desc(slot, header.saveName); + desc.setDeletableFlag(true); + desc.setWriteProtectedFlag(false); + desc.setThumbnail(header.thumbnail); + + return desc; + } - return desc; + return SaveStateDescriptor(); } bool CruiseMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const { diff --git a/engines/draci/detection.cpp b/engines/draci/detection.cpp index b7e83e1edb..e7fbaf62ef 100644 --- a/engines/draci/detection.cpp +++ b/engines/draci/detection.cpp @@ -155,30 +155,33 @@ void DraciMetaEngine::removeSaveState(const char *target, int slot) const { SaveStateDescriptor DraciMetaEngine::querySaveMetaInfos(const char *target, int slot) const { Common::InSaveFile *f = g_system->getSavefileManager()->openForLoading( Draci::DraciEngine::getSavegameFile(slot)); - assert(f); - - Draci::DraciSavegameHeader header; - Draci::readSavegameHeader(f, header); - delete f; - - // Create the return descriptor - SaveStateDescriptor desc(slot, header.saveName); - desc.setDeletableFlag(true); - desc.setWriteProtectedFlag(false); - desc.setThumbnail(header.thumbnail); - - int day = (header.date >> 24) & 0xFF; - int month = (header.date >> 16) & 0xFF; - int year = header.date & 0xFFFF; - desc.setSaveDate(year, month, day); - - int hour = (header.time >> 8) & 0xFF; - int minutes = header.time & 0xFF; - desc.setSaveTime(hour, minutes); - - desc.setPlayTime(header.playtime * 1000); + + if (f) { + Draci::DraciSavegameHeader header; + Draci::readSavegameHeader(f, header); + delete f; + + // Create the return descriptor + SaveStateDescriptor desc(slot, header.saveName); + desc.setDeletableFlag(true); + desc.setWriteProtectedFlag(false); + desc.setThumbnail(header.thumbnail); + + int day = (header.date >> 24) & 0xFF; + int month = (header.date >> 16) & 0xFF; + int year = header.date & 0xFFFF; + desc.setSaveDate(year, month, day); + + int hour = (header.time >> 8) & 0xFF; + int minutes = header.time & 0xFF; + desc.setSaveTime(hour, minutes); + + desc.setPlayTime(header.playtime * 1000); + + return desc; + } - return desc; + return SaveStateDescriptor(); } bool DraciMetaEngine::createInstance(OSystem *syst, Engine **engine, const ADGameDescription *desc) const { diff --git a/engines/tsage/detection.cpp b/engines/tsage/detection.cpp index 8a4b834f46..3395205234 100644 --- a/engines/tsage/detection.cpp +++ b/engines/tsage/detection.cpp @@ -156,22 +156,25 @@ public: SaveStateDescriptor querySaveMetaInfos(const char *target, int slot) const { Common::InSaveFile *f = g_system->getSavefileManager()->openForLoading( generateGameStateFileName(target, slot)); - assert(f); + + if (f) { + TsAGE::tSageSavegameHeader header; + TsAGE::Saver::readSavegameHeader(f, header); + delete f; + + // Create the return descriptor + SaveStateDescriptor desc(slot, header.saveName); + desc.setDeletableFlag(true); + desc.setWriteProtectedFlag(false); + desc.setThumbnail(header.thumbnail); + desc.setSaveDate(header.saveYear, header.saveMonth, header.saveDay); + desc.setSaveTime(header.saveHour, header.saveMinutes); + desc.setPlayTime(header.totalFrames * GAME_FRAME_TIME); + + return desc; + } - TsAGE::tSageSavegameHeader header; - TsAGE::Saver::readSavegameHeader(f, header); - delete f; - - // Create the return descriptor - SaveStateDescriptor desc(slot, header.saveName); - desc.setDeletableFlag(true); - desc.setWriteProtectedFlag(false); - desc.setThumbnail(header.thumbnail); - desc.setSaveDate(header.saveYear, header.saveMonth, header.saveDay); - desc.setSaveTime(header.saveHour, header.saveMinutes); - desc.setPlayTime(header.totalFrames * GAME_FRAME_TIME); - - return desc; + return SaveStateDescriptor(); } }; |