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; }