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 {