diff options
Diffstat (limited to 'examples/corelib/serialization')
8 files changed, 33 insertions, 105 deletions
diff --git a/examples/corelib/serialization/convert/cborconverter.cpp b/examples/corelib/serialization/convert/cborconverter.cpp index f907bb0af6..77df367e50 100644 --- a/examples/corelib/serialization/convert/cborconverter.cpp +++ b/examples/corelib/serialization/convert/cborconverter.cpp @@ -134,7 +134,7 @@ static QVariant convertCborValue(const QCborValue &value) enum TrimFloatingPoint { Double, Float, Float16 }; static QCborValue convertFromVariant(const QVariant &v, TrimFloatingPoint fpTrimming) { - if (v.userType() == QVariant::List) { + if (v.userType() == QMetaType::QVariantList) { const QVariantList list = v.toList(); QCborArray array; for (const QVariant &v : list) @@ -144,7 +144,7 @@ static QCborValue convertFromVariant(const QVariant &v, TrimFloatingPoint fpTrim } if (v.userType() == qMetaTypeId<VariantOrderedMap>()) { - const auto m = v.value<VariantOrderedMap>(); + const auto m = qvariant_cast<VariantOrderedMap>(v); QCborMap map; for (const auto &pair : m) map.insert(convertFromVariant(pair.first, fpTrimming), @@ -152,7 +152,7 @@ static QCborValue convertFromVariant(const QVariant &v, TrimFloatingPoint fpTrim return map; } - if (v.userType() == QVariant::Double && fpTrimming != Double) { + if (v.userType() == QMetaType::Double && fpTrimming != Double) { float f = float(v.toDouble()); if (fpTrimming == Float16) return float(qfloat16(f)); diff --git a/examples/corelib/serialization/convert/datastreamconverter.cpp b/examples/corelib/serialization/convert/datastreamconverter.cpp index 7cdb844141..6f0ca41ff5 100644 --- a/examples/corelib/serialization/convert/datastreamconverter.cpp +++ b/examples/corelib/serialization/convert/datastreamconverter.cpp @@ -96,9 +96,9 @@ static QString dumpVariant(const QVariant &v, const QString &indent = QLatin1Str QString indented = indent + QLatin1String(" "); int type = v.userType(); - if (type == qMetaTypeId<VariantOrderedMap>() || type == QVariant::Map) { - const auto map = (type == QVariant::Map) ? - VariantOrderedMap(v.toMap()) : v.value<VariantOrderedMap>(); + if (type == qMetaTypeId<VariantOrderedMap>() || type == QMetaType::QVariantMap) { + const auto map = (type == QMetaType::QVariantMap) ? + VariantOrderedMap(v.toMap()) : qvariant_cast<VariantOrderedMap>(v); result = QLatin1String("Map {"); for (const auto &pair : map) { @@ -109,7 +109,7 @@ static QString dumpVariant(const QVariant &v, const QString &indent = QLatin1Str } result.chop(1); // remove comma result += indent + QLatin1String("},"); - } else if (type == QVariant::List) { + } else if (type == QMetaType::QVariantList) { const QVariantList list = v.toList(); result = QLatin1String("List ["); diff --git a/examples/corelib/serialization/convert/jsonconverter.cpp b/examples/corelib/serialization/convert/jsonconverter.cpp index 80d1cc6827..ec24af703d 100644 --- a/examples/corelib/serialization/convert/jsonconverter.cpp +++ b/examples/corelib/serialization/convert/jsonconverter.cpp @@ -57,7 +57,6 @@ #include <QJsonValue> static JsonConverter jsonConverter; -static BinaryJsonConverter BinaryJsonConverter; static const char optionHelp[] = "compact=no|yes Use compact JSON form.\n"; @@ -151,62 +150,3 @@ void JsonConverter::saveFile(QIODevice *f, const QVariant &contents, const QStri f->write(convertFromVariant(contents).toJson(format)); } - -QString BinaryJsonConverter::name() -{ - return "binary-json"; -} - -Converter::Direction BinaryJsonConverter::directions() -{ - return InOut; -} - -Converter::Options BinaryJsonConverter::outputOptions() -{ - return {}; -} - -const char *BinaryJsonConverter::optionsHelp() -{ - return nullptr; -} - -bool BinaryJsonConverter::probeFile(QIODevice *f) -{ - return f->isReadable() && f->peek(4) == "qbjs"; -} - -QVariant BinaryJsonConverter::loadFile(QIODevice *f, Converter *&outputConverter) -{ - if (!outputConverter) - outputConverter = &jsonConverter; - - QJsonDocument doc; - if (auto file = qobject_cast<QFile *>(f)) { - uchar *ptr = file->map(0, file->size()); - if (ptr) - doc = QJsonDocument::fromRawData(reinterpret_cast<char *>(ptr), file->size()); - } - - if (doc.isNull()) - doc = QJsonDocument::fromBinaryData(f->readAll()); - - if (!doc.isObject() && !doc.isArray()) { - fprintf(stderr, "Failed to load Binary JSON.\n"); - exit(EXIT_FAILURE); - } - if (outputConverter == null) - return QVariant(); - return doc.toVariant(); -} - -void BinaryJsonConverter::saveFile(QIODevice *f, const QVariant &contents, const QStringList &options) -{ - if (!options.isEmpty()) { - fprintf(stderr, "Unknown option '%s' to JSON output. This format has no options.\n", qPrintable(options.first())); - exit(EXIT_FAILURE); - } - - f->write(convertFromVariant(contents).toBinaryData()); -} diff --git a/examples/corelib/serialization/convert/jsonconverter.h b/examples/corelib/serialization/convert/jsonconverter.h index 17170603c7..445a0e6695 100644 --- a/examples/corelib/serialization/convert/jsonconverter.h +++ b/examples/corelib/serialization/convert/jsonconverter.h @@ -69,17 +69,4 @@ public: void saveFile(QIODevice *f, const QVariant &contents, const QStringList &options) override; }; -class BinaryJsonConverter : public Converter -{ - // Converter interface -public: - QString name() override; - Direction directions() override; - Options outputOptions() override; - const char *optionsHelp() override; - bool probeFile(QIODevice *f) override; - QVariant loadFile(QIODevice *f, Converter *&outputConverter) override; - void saveFile(QIODevice *f, const QVariant &contents, const QStringList &options) override; -}; - #endif // JSONCONVERTER_H diff --git a/examples/corelib/serialization/convert/textconverter.cpp b/examples/corelib/serialization/convert/textconverter.cpp index 7aed08f96c..ae03b9a334 100644 --- a/examples/corelib/serialization/convert/textconverter.cpp +++ b/examples/corelib/serialization/convert/textconverter.cpp @@ -56,21 +56,21 @@ static void dumpVariant(QTextStream &out, const QVariant &v) { switch (v.userType()) { - case QVariant::List: { + case QMetaType::QVariantList: { const QVariantList list = v.toList(); for (const QVariant &item : list) dumpVariant(out, item); break; } - case QVariant::String: { + case QMetaType::QString: { const QStringList list = v.toStringList(); for (const QString &s : list) out << s << Qt::endl; break; } - case QVariant::Map: { + case QMetaType::QVariantMap: { const QVariantMap map = v.toMap(); for (auto it = map.begin(); it != map.end(); ++it) { out << it.key() << " => "; diff --git a/examples/corelib/serialization/convert/xmlconverter.cpp b/examples/corelib/serialization/convert/xmlconverter.cpp index e62801bf76..42cb10100a 100644 --- a/examples/corelib/serialization/convert/xmlconverter.cpp +++ b/examples/corelib/serialization/convert/xmlconverter.cpp @@ -284,18 +284,18 @@ static QVariant variantFromXml(QXmlStreamReader &xml, Converter::Options options ba.resize(n); result = ba; } else { - int id = QVariant::Invalid; + int id = QMetaType::UnknownType; if (type == QLatin1String("datetime")) - id = QVariant::DateTime; + id = QMetaType::QDateTime; else if (type == QLatin1String("url")) - id = QVariant::Url; + id = QMetaType::QUrl; else if (type == QLatin1String("uuid")) - id = QVariant::Uuid; + id = QMetaType::QUuid; else if (type == QLatin1String("regex")) - id = QVariant::RegularExpression; + id = QMetaType::QRegularExpression; else id = QMetaType::type(type.toLatin1()); - if (id == QVariant::Invalid) { + if (id == QMetaType::UnknownType) { fprintf(stderr, "%lld:%lld: Invalid XML: unknown type '%s'.\n", xml.lineNumber(), xml.columnNumber(), qPrintable(type.toString())); exit(EXIT_FAILURE); @@ -327,16 +327,16 @@ static QVariant variantFromXml(QXmlStreamReader &xml, Converter::Options options static void variantToXml(QXmlStreamWriter &xml, const QVariant &v) { int type = v.userType(); - if (type == QVariant::List) { + if (type == QMetaType::QVariantList) { QVariantList list = v.toList(); xml.writeStartElement("list"); for (const QVariant &v : list) variantToXml(xml, v); xml.writeEndElement(); - } else if (type == QVariant::Map || type == qMetaTypeId<VariantOrderedMap>()) { - const VariantOrderedMap map = (type == QVariant::Map) ? + } else if (type == QMetaType::QVariantMap || type == qMetaTypeId<VariantOrderedMap>()) { + const VariantOrderedMap map = (type == QMetaType::QVariantMap) ? VariantOrderedMap(v.toMap()) : - v.value<VariantOrderedMap>(); + qvariant_cast<VariantOrderedMap>(v); xml.writeStartElement("map"); for (const auto &pair : map) { @@ -425,15 +425,15 @@ static void variantToXml(QXmlStreamWriter &xml, const QVariant &v) default: if (type == qMetaTypeId<qfloat16>()) { xml.writeAttribute(typeString, "number"); - xml.writeCharacters(QString::number(float(v.value<qfloat16>()))); + xml.writeCharacters(QString::number(float(qvariant_cast<qfloat16>(v)))); } else if (type == qMetaTypeId<QCborSimpleType>()) { xml.writeAttribute(typeString, "CBOR simple type"); - xml.writeCharacters(QString::number(int(v.value<QCborSimpleType>()))); + xml.writeCharacters(QString::number(int(qvariant_cast<QCborSimpleType>(v)))); } else { // does this convert to string? const char *typeName = v.typeName(); QVariant copy = v; - if (copy.convert(QVariant::String)) { + if (copy.convert(QMetaType::QString)) { xml.writeAttribute(typeString, QString::fromLatin1(typeName)); xml.writeCharacters(copy.toString()); } else { diff --git a/examples/corelib/serialization/savegame/doc/src/savegame.qdoc b/examples/corelib/serialization/savegame/doc/src/savegame.qdoc index a35f763430..e20cb6bc6c 100644 --- a/examples/corelib/serialization/savegame/doc/src/savegame.qdoc +++ b/examples/corelib/serialization/savegame/doc/src/savegame.qdoc @@ -37,8 +37,8 @@ game generally involves serializing each game object's member variables to a file. Many formats can be used for this purpose, one of which is JSON. With QJsonDocument, you also have the ability to serialize a document in a - binary format, which is great if you don't want the save file to be - readable, or if you need to keep the file size down. + \l {https://tools.ietf.org/html/rfc7049} {CBOR} format, which is great if you + don't want the save file to be readable, or if you need to keep the file size down. In this example, we'll demonstrate how to save and load a simple game to and from JSON and binary formats. @@ -133,7 +133,7 @@ When loading a saved game in loadGame(), the first thing we do is open the save file based on which format it was saved to; \c "save.json" for JSON, - and \c "save.dat" for binary. We print a warning and return \c false if the + and \c "save.dat" for CBOR. We print a warning and return \c false if the file couldn't be opened. Since QJsonDocument's \l{QJsonDocument::fromJson()}{fromJson()} and @@ -172,7 +172,7 @@ \snippet serialization/savegame/main.cpp 1 When the player has finished, we save their game. For demonstration - purposes, we can serialize to either JSON or binary. You can examine the + purposes, we can serialize to either JSON or CBOR. You can examine the contents of the files in the same directory as the executable (or re-run the example, making sure to also specify the "load" option), although the binary save file will contain some garbage characters (which is normal). diff --git a/examples/corelib/serialization/savegame/game.cpp b/examples/corelib/serialization/savegame/game.cpp index c39362bc68..58fc087b1f 100644 --- a/examples/corelib/serialization/savegame/game.cpp +++ b/examples/corelib/serialization/savegame/game.cpp @@ -50,6 +50,8 @@ #include "game.h" +#include <QCborMap> +#include <QCborValue> #include <QFile> #include <QJsonArray> #include <QJsonDocument> @@ -122,14 +124,14 @@ bool Game::loadGame(Game::SaveFormat saveFormat) QJsonDocument loadDoc(saveFormat == Json ? QJsonDocument::fromJson(saveData) - : QJsonDocument::fromBinaryData(saveData)); + : QJsonDocument(QCborValue::fromCbor(saveData).toMap().toJsonObject())); read(loadDoc.object()); QTextStream(stdout) << "Loaded save for " << loadDoc["player"]["name"].toString() << " using " - << (saveFormat != Json ? "binary " : "") << "JSON...\n"; + << (saveFormat != Json ? "CBOR" : "JSON") << "...\n"; return true; } //! [3] @@ -148,10 +150,9 @@ bool Game::saveGame(Game::SaveFormat saveFormat) const QJsonObject gameObject; write(gameObject); - QJsonDocument saveDoc(gameObject); saveFile.write(saveFormat == Json - ? saveDoc.toJson() - : saveDoc.toBinaryData()); + ? QJsonDocument(gameObject).toJson() + : QCborValue::fromJsonValue(gameObject).toCbor()); return true; } |