bool SaveContainer::isSave(Common::SeekableReadStream &stream) { // Remember the stream's position to seek back to uint32 startPos = stream.pos(); SaveHeader header; header.setType(kID); header.setVersion(kVersion); bool result = header.verifyReadSize(stream); // Seek back stream.seek(startPos); return result; }
Common::Array<SaveContainer::PartInfo> *SaveContainer::getPartsInfo(Common::SeekableReadStream &stream) { Common::Array<PartInfo> *parts = 0; // Remember the stream's position to seek back to uint32 startPos = stream.pos(); SaveHeader header; header.setType(kID); header.setVersion(kVersion); // Verify the header if (!header.verifyReadSize(stream)) { // Seek back stream.seek(startPos); return 0; } // Read the part count uint32 partCount = stream.readUint32LE(); // Create a part information array parts = new Common::Array<PartInfo>; parts->resize(partCount); // Read all part sizes for (uint32 i = 0; i < partCount; i++) (*parts)[i].size = stream.readUint32LE(); // Iterate over all parts for (uint32 i = 0; i < partCount; i++) { // The part's offset (from the starting point of the stream) (*parts)[i].offset = stream.pos() - startPos; SaveHeader partHeader; // Read the header if (!partHeader.read(stream)) { // Seek back stream.seek(startPos); delete parts; return 0; } // Fill in the ID (*parts)[i].id = partHeader.getType(); // Skip the part's content stream.skip(partHeader.getSize()); } if (stream.err()) { delete parts; parts = 0; } // Seek back stream.seek(startPos); return parts; }