SaveStateList FullpipeMetaEngine::listSaves(const char *target) const { Common::SaveFileManager *saveFileMan = g_system->getSavefileManager(); Common::StringArray filenames; Common::String pattern("fullpipe.s##"); filenames = saveFileMan->listSavefiles(pattern); SaveStateList saveList; for (Common::StringArray::const_iterator file = filenames.begin(); file != filenames.end(); ++file) { // Obtain the last 2 digits of the filename, since they correspond to the save slot int slotNum = atoi(file->c_str() + file->size() - 2); if (slotNum >= 0 && slotNum <= getMaximumSaveSlot()) { Common::ScopedPtr<Common::InSaveFile> in(saveFileMan->openForLoading(*file)); if (in) { Fullpipe::FullpipeSavegameHeader header; Fullpipe::readSavegameHeader(in.get(), header); SaveStateDescriptor desc; parseSavegameHeader(header, desc); desc.setSaveSlot(slotNum); saveList.push_back(desc); } } } // Sort saves based on slot number. Common::sort(saveList.begin(), saveList.end(), SaveStateDescriptorSlotComparator()); return saveList; }
bool readSavegameHeader(Common::InSaveFile *in, FullpipeSavegameHeader &header) { header.thumbnail = NULL; uint oldPos = in->pos(); in->seek(-4, SEEK_END); int headerOffset = in->readUint32LE(); // Sanity check if (headerOffset >= in->pos() || headerOffset == 0) { in->seek(oldPos, SEEK_SET); // Rewind the file fillDummyHeader(header); return false; } in->seek(headerOffset, SEEK_SET); in->read(header.id, 6); // Validate the header Id if (strcmp(header.id, "SVMCR")) { in->seek(oldPos, SEEK_SET); // Rewind the file fillDummyHeader(header); return false; } header.version = in->readByte(); if (header.version != FULLPIPE_SAVEGAME_VERSION) { in->seek(oldPos, SEEK_SET); // Rewind the file fillDummyHeader(header); return false; } header.date = in->readUint32LE(); header.time = in->readUint16LE(); header.playtime = in->readUint32LE(); // Generate savename SaveStateDescriptor desc; parseSavegameHeader(header, desc); header.saveName = Common::String::format("%s %s", desc.getSaveDate().c_str(), desc.getSaveTime().c_str()); // Get the thumbnail header.thumbnail = Graphics::loadThumbnail(*in); in->seek(oldPos, SEEK_SET); // Rewind the file if (!header.thumbnail) return false; return true; }
SaveStateDescriptor FullpipeMetaEngine::querySaveMetaInfos(const char *target, int slot) const { Common::ScopedPtr<Common::InSaveFile> f(g_system->getSavefileManager()->openForLoading( Fullpipe::getSavegameFile(slot))); if (f) { Fullpipe::FullpipeSavegameHeader header; Fullpipe::readSavegameHeader(f.get(), header); // Create the return descriptor SaveStateDescriptor desc; parseSavegameHeader(header, desc); desc.setSaveSlot(slot); desc.setThumbnail(header.thumbnail); return desc; } return SaveStateDescriptor(); }