From 50a625d2bc2c012b498054b8cad370be012b7887 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Tue, 15 May 2018 02:53:35 +0200 Subject: [PATCH] Ref T267, allow to call "convertFromMemoizedJson", but also convert via "convertFromJson" The variant convertFromMemoizedJson trait did already do something similar, calling "convertFromJson" if the memoized version is not avilable. Now the function also "decides" based on the passed data itself. --- .../simulation/aircraftmodellist.cpp | 24 +++++++++++++++---- src/blackmisc/simulation/aircraftmodellist.h | 2 +- src/blackmisc/variant.cpp | 10 ++++---- src/blackmisc/variant.h | 2 +- src/blackmisc/variantmap.cpp | 4 ++-- src/blackmisc/variantprivate.h | 14 +++++------ 6 files changed, 37 insertions(+), 19 deletions(-) diff --git a/src/blackmisc/simulation/aircraftmodellist.cpp b/src/blackmisc/simulation/aircraftmodellist.cpp index 005a79896..fd272059b 100644 --- a/src/blackmisc/simulation/aircraftmodellist.cpp +++ b/src/blackmisc/simulation/aircraftmodellist.cpp @@ -977,7 +977,7 @@ namespace BlackMisc return json; } - void CAircraftModelList::convertFromMemoizedJson(const QJsonObject &json) + void CAircraftModelList::convertFromMemoizedJson(const QJsonObject &json, bool fallbackToConvertToJson) { clear(); QJsonValue value = json.value("containerbase"); @@ -988,9 +988,25 @@ namespace BlackMisc const QJsonValue aircraftIcaos = json.value("aircraftIcaos"); const QJsonValue liveries = json.value("liveries"); const QJsonValue distributors = json.value("distributors"); - if (aircraftIcaos.isUndefined()) { throw CJsonException("Missing 'aircraftIcaos'"); } - if (liveries.isUndefined()) { throw CJsonException("Missing 'liveries'"); } - if (distributors.isUndefined()) { throw CJsonException("Missing 'distributors'"); } + + const bool undefAc = aircraftIcaos.isUndefined(); + const bool undefLiv = liveries.isUndefined(); + const bool undefDist = distributors.isUndefined(); + const bool undefAll = undefAc && undefDist && undefLiv; + + if (fallbackToConvertToJson && undefAll) + { + this->convertFromJson(json); + return; + } + else + { + if (undefAc) { throw CJsonException("Missing 'aircraftIcaos'"); } + if (undefLiv) { throw CJsonException("Missing 'liveries'"); } + if (undefDist) { throw CJsonException("Missing 'distributors'"); } + } + + // convert { CJsonScope scope("aircraftIcaos"); Q_UNUSED(scope); diff --git a/src/blackmisc/simulation/aircraftmodellist.h b/src/blackmisc/simulation/aircraftmodellist.h index 8d7a83f2f..66387ce5b 100644 --- a/src/blackmisc/simulation/aircraftmodellist.h +++ b/src/blackmisc/simulation/aircraftmodellist.h @@ -335,7 +335,7 @@ namespace BlackMisc QJsonObject toMemoizedJson() const; //! From compact JSON format - void convertFromMemoizedJson(const QJsonObject &json); + void convertFromMemoizedJson(const QJsonObject &json, bool fallbackToConvertToJson = false); //! To database JSON QJsonArray toDatabaseJson() const; diff --git a/src/blackmisc/variant.cpp b/src/blackmisc/variant.cpp index 7c8369cec..761f0aa35 100644 --- a/src/blackmisc/variant.cpp +++ b/src/blackmisc/variant.cpp @@ -194,7 +194,9 @@ namespace BlackMisc { CJsonScope scope("value"); m_v = QVariant(typeId, nullptr); - meta->convertFromJson(value.toObject(), data()); + + // this will call convertFromJson if there is no MemoizedJson + meta->convertFromMemoizedJson(value.toObject(), data(), true); } else if (QMetaType::hasRegisteredConverterFunction(qMetaTypeId(), typeId)) { @@ -253,7 +255,7 @@ namespace BlackMisc } } - void CVariant::convertFromMemoizedJson(const QJsonObject &json) + void CVariant::convertFromMemoizedJson(const QJsonObject &json, bool allowFallbackToJson) { QJsonValue typeValue = json.value("type"); if (typeValue.isUndefined()) { throw CJsonException("Missing 'type'"); } @@ -271,7 +273,7 @@ namespace BlackMisc CJsonScope scope("value"); m_v = QVariant(typeId, nullptr); - meta->convertFromMemoizedJson(value.toObject(), data()); + meta->convertFromMemoizedJson(value.toObject(), data(), allowFallbackToJson); } catch (const Private::CVariantException &ex) { @@ -288,7 +290,7 @@ namespace BlackMisc { try { - convertFromMemoizedJson(json); + convertFromMemoizedJson(json, false); } catch (const CJsonException &ex) { diff --git a/src/blackmisc/variant.h b/src/blackmisc/variant.h index 850a982c5..98a38cf6e 100644 --- a/src/blackmisc/variant.h +++ b/src/blackmisc/variant.h @@ -286,7 +286,7 @@ namespace BlackMisc QJsonObject toMemoizedJson() const; //! From compact JSON format. - void convertFromMemoizedJson(const QJsonObject &json); + void convertFromMemoizedJson(const QJsonObject &json, bool allowFallbackToJson); //! Call convertFromMemoizedJson, catch any CJsonException that is thrown and return it as CStatusMessage. CStatusMessage convertFromMemoizedJsonNoThrow(const QJsonObject &json, const CLogCategoryList &categories, const QString &prefix); diff --git a/src/blackmisc/variantmap.cpp b/src/blackmisc/variantmap.cpp index 15c001901..9ae026ff6 100644 --- a/src/blackmisc/variantmap.cpp +++ b/src/blackmisc/variantmap.cpp @@ -86,7 +86,7 @@ namespace BlackMisc CJsonScope scope(key); Q_UNUSED(scope); CVariant value; - value.convertFromMemoizedJson(it.value().toObject()); + value.convertFromMemoizedJson(it.value().toObject(), true); implementationOf(*this).insert(cend(), key, value); } } @@ -101,7 +101,7 @@ namespace BlackMisc CJsonScope scope(key); Q_UNUSED(scope); CVariant var; - var.convertFromMemoizedJson(value.toObject()); + var.convertFromMemoizedJson(value.toObject(), true); insert(key, var); } } diff --git a/src/blackmisc/variantprivate.h b/src/blackmisc/variantprivate.h index 88ed7eb83..79d8cdd72 100644 --- a/src/blackmisc/variantprivate.h +++ b/src/blackmisc/variantprivate.h @@ -47,7 +47,7 @@ namespace BlackMisc virtual QJsonObject toJson(const void *object) const = 0; virtual void convertFromJson(const QJsonObject &json, void *object) const = 0; virtual QJsonObject toMemoizedJson(const void *object) const = 0; - virtual void convertFromMemoizedJson(const QJsonObject &json, void *object) const = 0; + virtual void convertFromMemoizedJson(const QJsonObject &json, void *object, bool allowFallbackToJson) const = 0; virtual void unmarshall(const QDBusArgument &arg, void *object) const = 0; virtual uint getValueHash(const void *object) const = 0; virtual int getMetaTypeId() const = 0; @@ -101,9 +101,9 @@ namespace BlackMisc static QJsonObject toMemoizedJson(const T &object, ...) { return toJson(object, 0); } template - static void convertFromMemoizedJson(const QJsonObject &json, T &object, decltype(static_cast(object.convertFromMemoizedJson(json)), 0)) { object.convertFromMemoizedJson(json); } + static void convertFromMemoizedJson(const QJsonObject &json, T &object, bool allowFallbackToJson, decltype(static_cast(object.convertFromMemoizedJson(json, allowFallbackToJson)), 0)) { object.convertFromMemoizedJson(json, allowFallbackToJson); } template - static void convertFromMemoizedJson(const QJsonObject &json, T &object, ...) { convertFromJson(json, object, 0); } + static void convertFromMemoizedJson(const QJsonObject &json, T &object, bool allowFallbackToJson, ...) { convertFromJson(json, object, 0); Q_UNUSED(allowFallbackToJson) } template static uint getValueHash(const T &object, decltype(static_cast(qHash(object)), 0)) { return qHash(object); } @@ -113,7 +113,7 @@ namespace BlackMisc template static int compareImpl(const T &lhs, const T &rhs, decltype(static_cast(compare(lhs, rhs)), 0)) { return compare(lhs, rhs); } template - static int compareImpl(const T &lhs, const T&, ...) { throw CVariantException(lhs, "compare"); } + static int compareImpl(const T &lhs, const T &, ...) { throw CVariantException(lhs, "compare"); } template static void setPropertyByIndex(T &object, const CVariant &variant, const CPropertyIndex &index, decltype(static_cast(object.setPropertyByIndex(index, variant)), 0)) { object.setPropertyByIndex(index, variant); } @@ -136,7 +136,7 @@ namespace BlackMisc static bool equalsPropertyByIndex(const T &object, const CVariant &, const CPropertyIndex &, ...) { throw CVariantException(object, "equalsPropertyByIndex"); } template - static void toIcon(const T &object, CIcon &o_icon, std::enable_if_t::value, decltype(static_cast(object.toIcon()), 0)>) { assign(o_icon, object.toIcon()); } + static void toIcon(const T &object, CIcon &o_icon, std::enable_if_t < ! std::is_same::value, decltype(static_cast(object.toIcon()), 0) >) { assign(o_icon, object.toIcon()); } template static void toIcon(const T &object, CIcon &, ...) { throw CVariantException(object, "toIcon"); } }; @@ -161,9 +161,9 @@ namespace BlackMisc { return CValueObjectMetaInfoHelper::toMemoizedJson(cast(object), 0); } - virtual void convertFromMemoizedJson(const QJsonObject &json, void *object) const override + virtual void convertFromMemoizedJson(const QJsonObject &json, void *object, bool allowFallbackToJson) const override { - CValueObjectMetaInfoHelper::convertFromMemoizedJson(json, cast(object), 0); + CValueObjectMetaInfoHelper::convertFromMemoizedJson(json, cast(object), allowFallbackToJson, 0); } virtual void unmarshall(const QDBusArgument &arg, void *object) const override {