From f79bb2402436ca51849233577dcba63368536800 Mon Sep 17 00:00:00 2001 From: tux3 Date: Tue, 19 Jan 2016 16:28:42 +0100 Subject: [PATCH] Fix ODR violation in SettingsSerializer Fixes #2173 Also fixes some compilation errors in some situations --- src/persistence/settingsserializer.cpp | 85 +++++++++++--------------- src/persistence/settingsserializer.h | 4 +- 2 files changed, 36 insertions(+), 53 deletions(-) diff --git a/src/persistence/settingsserializer.cpp b/src/persistence/settingsserializer.cpp index 8aaf0e420..28eb5a8d8 100644 --- a/src/persistence/settingsserializer.cpp +++ b/src/persistence/settingsserializer.cpp @@ -31,17 +31,12 @@ using namespace std; const char SettingsSerializer::magic[] = {0x51,0x54,0x4F,0x58}; -inline QDataStream& operator<<(QDataStream& dataStream, const SettingsSerializer::RecordTag& tag) +QDataStream& writeStream(QDataStream& dataStream, const SettingsSerializer::RecordTag& tag) { return dataStream << static_cast(tag); } -inline QDataStream& operator<<(QDataStream& dataStream, const QString& str) -{ - return dataStream << str.toUtf8(); -} - -inline QDataStream& operator<<(QDataStream& dataStream, const QByteArray& data) +QDataStream& writeStream(QDataStream& dataStream, const QByteArray& data) { QByteArray size = vuintToData(data.size()); dataStream.writeRawData(size.data(), size.size()); @@ -49,12 +44,18 @@ inline QDataStream& operator<<(QDataStream& dataStream, const QByteArray& data) return dataStream; } -QDataStream& operator>>(QDataStream& dataStream, SettingsSerializer::RecordTag& tag) +QDataStream& writeStream(QDataStream& dataStream, const QString& str) +{ + return writeStream(dataStream, str.toUtf8()); +} + +QDataStream& readStream(QDataStream& dataStream, SettingsSerializer::RecordTag& tag) { return dataStream.operator >>((uint8_t&)tag); } -inline QDataStream& operator>>(QDataStream& dataStream, QByteArray& data) + +QDataStream& readStream(QDataStream& dataStream, QByteArray& data) { unsigned char num3; size_t num = 0; @@ -214,16 +215,6 @@ void SettingsSerializer::load() readSerialized(); else readIni(); - - /* Dump state for debugging - qDebug() << "SettingsSerializer data:"; - for (int i=0; i> tag; + readStream(stream, tag); if (tag == RecordTag::Value) { QByteArray key; QByteArray value; - stream >> key; - stream >> value; + readStream(stream, key); + readStream(stream, value); setValue(QString::fromUtf8(key), QVariant(QString::fromUtf8(value))); - //qDebug() << "!Got key"<> prefix; + readStream(stream, prefix); beginGroup(QString::fromUtf8(prefix)); - //qDebug()<<"!Group start"<> prefix; + readStream(stream, prefix); beginReadArray(QString::fromUtf8(prefix)); QByteArray sizeData; - stream >> sizeData; + readStream(stream, sizeData); if (sizeData.isEmpty()) { qWarning("The personal save file is corrupted!"); @@ -378,12 +364,11 @@ void SettingsSerializer::readSerialized() } quint64 size = dataToVUint(sizeData); arrays[array].size = max(size, arrays[array].size); - //qDebug()<<"!Array start"<> indexData; + readStream(stream, indexData); if (indexData.isEmpty()) { qWarning("The personal save file is corrupted!"); @@ -393,15 +378,13 @@ void SettingsSerializer::readSerialized() setArrayIndex(index); QByteArray key; QByteArray value; - stream >> key; - stream >> value; + readStream(stream, key); + readStream(stream, value); setValue(QString::fromUtf8(key), QVariant(QString::fromUtf8(value))); - //qDebug() << "!Got array key"<>(QDataStream& dataStream, SettingsSerializer::RecordTag& tag); + friend QDataStream& writeStream(QDataStream& dataStream, const SettingsSerializer::RecordTag& tag); + friend QDataStream& readStream(QDataStream& dataStream, SettingsSerializer::RecordTag& tag); struct Value {