diff options
author | Dominik Holland <dominik.holland@pelagicore.com> | 2019-04-02 16:06:40 +0200 |
---|---|---|
committer | Dominik Holland <dominik.holland@pelagicore.com> | 2019-05-07 14:14:00 +0000 |
commit | 0e73a6dea0651e4b7df8169d85d3b5b45d11a0b5 (patch) | |
tree | e7314dc08aaa23f8ceead4da9ab7622c406fe8c7 | |
parent | 569268fd6c0fce70348695c9fe8949b17bb69924 (diff) | |
download | qtivi-0e73a6dea0651e4b7df8169d85d3b5b45d11a0b5.tar.gz |
Make the QIviQueryTerm and QIviOrderTerm classes serializable
This is needed to make a full featured generic async backend
for the QIviSearchAndBrowseModel.
Change-Id: Ifcbd6d86d45348f92427c78ce8ce48a918beeb6a
Reviewed-by: Robert Griebl <robert.griebl@pelagicore.com>
-rw-r--r-- | src/ivicore/queryparser/qiviqueryterm.cpp | 116 | ||||
-rw-r--r-- | src/ivicore/queryparser/qiviqueryterm.h | 20 | ||||
-rw-r--r-- | src/ivimedia/qiviplayableitem.cpp | 2 | ||||
-rw-r--r-- | tests/auto/core/queryparser/tst_queryparser.cpp | 11 |
4 files changed, 149 insertions, 0 deletions
diff --git a/src/ivicore/queryparser/qiviqueryterm.cpp b/src/ivicore/queryparser/qiviqueryterm.cpp index 360e9a4..7460b12 100644 --- a/src/ivicore/queryparser/qiviqueryterm.cpp +++ b/src/ivicore/queryparser/qiviqueryterm.cpp @@ -43,6 +43,12 @@ #include "qiviqueryterm.h" #include "qiviqueryterm_p.h" +#include <QDataStream> +#include <QMetaEnum> +#include <QtDebug> + +QT_BEGIN_NAMESPACE + QIviConjunctionTermPrivate::QIviConjunctionTermPrivate() : m_conjunction(QIviConjunctionTerm::And) { @@ -402,3 +408,113 @@ QString QIviOrderTerm::propertyName() const { return d->m_propertyName; } + +QDataStream &operator<<(QDataStream &out, QIviConjunctionTerm::Conjunction var) +{ + out << int(var); + return out; +} + +QDataStream &operator>>(QDataStream &in, QIviConjunctionTerm::Conjunction &var) +{ + int val; + in >> val; + QMetaEnum metaEnum = QMetaEnum::fromType<QIviConjunctionTerm::Conjunction>(); + if (metaEnum.valueToKey(val) == nullptr) + qWarning() << "Received an invalid enum value for type QIviConjunctionTerm::Conjunction, value =" << val; + var = QIviConjunctionTerm::Conjunction(val); + return in; +} + +QDataStream &operator<<(QDataStream &out, QIviFilterTerm::Operator var) +{ + out << int(var); + return out; +} + +QDataStream &operator>>(QDataStream &in, QIviFilterTerm::Operator &var) +{ + int val; + in >> val; + QMetaEnum metaEnum = QMetaEnum::fromType<QIviFilterTerm::Operator>(); + if (metaEnum.valueToKey(val) == nullptr) + qWarning() << "Received an invalid enum value for type QIviFilterTerm::Operator, value =" << val; + var = QIviFilterTerm::Operator(val); + return in; +} + +QDataStream &operator<<(QDataStream &out, QIviAbstractQueryTerm *var) +{ + if (var->type() == QIviAbstractQueryTerm::FilterTerm) { + auto *term = static_cast<QIviFilterTerm*>(var); + out << QStringLiteral("filter"); + out << term->operatorType(); + out << term->value(); + out << term->propertyName(); + out << term->isNegated(); + } else if (var->type() == QIviAbstractQueryTerm::ScopeTerm) { + auto *term = static_cast<QIviScopeTerm*>(var); + out << QStringLiteral("scope"); + out << term->isNegated(); + out << term->term(); + } else { + auto *term = static_cast<QIviConjunctionTerm*>(var); + out << QStringLiteral("conjunction"); + out << term->conjunction(); + const auto subTerms = term->terms(); + out << subTerms.count(); + for (const auto subTerm : subTerms) + out << subTerm; + } + return out; +} + +QDataStream &operator>>(QDataStream &in, QIviAbstractQueryTerm **var) +{ + QString type; + QIviAbstractQueryTerm *aTerm=nullptr; + in >> type; + if (type == QStringLiteral("filter")) { + auto term = new QIviFilterTerm(); + aTerm = term; + in >> term->d_ptr->m_operator; + in >> term->d_ptr->m_value; + in >> term->d_ptr->m_property; + in >> term->d_ptr->m_negated; + } else if (type == QStringLiteral("scope")) { + auto term = new QIviScopeTerm(); + aTerm = term; + in >> term->d_ptr->m_negated; + in >> &term->d_ptr->m_term; + } else { + Q_ASSERT(type == QStringLiteral("conjunction")); + auto term = new QIviConjunctionTerm(); + aTerm = term; + int count = 0; + in >> term->d_ptr->m_conjunction; + in >> count; + for (int i = 0; i < count; ++i) { + QIviAbstractQueryTerm *subTerm=nullptr; + in >> &subTerm; + term->d_ptr->m_terms.append(subTerm); + } + } + *var = aTerm; + return in; +} + +QDataStream &operator<<(QDataStream &out, const QIviOrderTerm &var) +{ + out << var.propertyName(); + out << var.isAscending(); + return out; +} + +QDataStream &operator>>(QDataStream &in, QIviOrderTerm &var) +{ + in >> var.d->m_propertyName; + in >> var.d->m_ascending; + return in; +} + +QT_END_NAMESPACE diff --git a/src/ivicore/queryparser/qiviqueryterm.h b/src/ivicore/queryparser/qiviqueryterm.h index d907b37..2cbb4f1 100644 --- a/src/ivicore/queryparser/qiviqueryterm.h +++ b/src/ivicore/queryparser/qiviqueryterm.h @@ -69,11 +69,13 @@ public: class QIviConjunctionTermPrivate; class Q_QTIVICORE_EXPORT QIviConjunctionTerm : public QIviAbstractQueryTerm { + Q_GADGET public: enum Conjunction { And, Or }; + Q_ENUM(Conjunction) explicit QIviConjunctionTerm(); ~QIviConjunctionTerm() override; @@ -88,11 +90,13 @@ private: QIviConjunctionTermPrivate * d_ptr; Q_DECLARE_PRIVATE(QIviConjunctionTerm) friend class QIviQueryParser; + friend Q_QTIVICORE_EXPORT QDataStream &operator>>(QDataStream &in, QIviAbstractQueryTerm** var); }; class QIviScopeTermPrivate; class Q_QTIVICORE_EXPORT QIviScopeTerm : public QIviAbstractQueryTerm { + Q_GADGET public: explicit QIviScopeTerm(); @@ -108,11 +112,13 @@ private: QIviScopeTermPrivate * d_ptr; Q_DECLARE_PRIVATE(QIviScopeTerm) friend class QIviQueryParser; + friend Q_QTIVICORE_EXPORT QDataStream &operator>>(QDataStream &in, QIviAbstractQueryTerm** var); }; class QIviFilterTermPrivate; class Q_QTIVICORE_EXPORT QIviFilterTerm : public QIviAbstractQueryTerm { + Q_GADGET public: enum Operator { Equals, @@ -123,6 +129,7 @@ public: LowerThan, LowerEquals }; + Q_ENUM(Operator) explicit QIviFilterTerm(); ~QIviFilterTerm() override; @@ -139,6 +146,7 @@ private: QIviFilterTermPrivate * d_ptr; Q_DECLARE_PRIVATE(QIviFilterTerm) friend class QIviQueryParser; + friend Q_QTIVICORE_EXPORT QDataStream &operator>>(QDataStream &in, QIviAbstractQueryTerm** var); }; class QIviOrderTermPrivate; @@ -156,10 +164,22 @@ public: private: QSharedDataPointer<QIviOrderTermPrivate> d; friend class QIviQueryParser; + friend Q_QTIVICORE_EXPORT QDataStream &operator>>(QDataStream &in, QIviOrderTerm &var); }; Q_DECLARE_TYPEINFO(QIviOrderTerm, Q_MOVABLE_TYPE); +Q_QTIVICORE_EXPORT QDataStream &operator<<(QDataStream &out, QIviConjunctionTerm::Conjunction var); +Q_QTIVICORE_EXPORT QDataStream &operator>>(QDataStream &in, QIviConjunctionTerm::Conjunction &var); +Q_QTIVICORE_EXPORT QDataStream &operator<<(QDataStream &out, QIviFilterTerm::Operator var); +Q_QTIVICORE_EXPORT QDataStream &operator>>(QDataStream &in, QIviFilterTerm::Operator &var); +Q_QTIVICORE_EXPORT QDataStream &operator<<(QDataStream &out, QIviAbstractQueryTerm *var); +Q_QTIVICORE_EXPORT QDataStream &operator>>(QDataStream &in, QIviAbstractQueryTerm **var); +Q_QTIVICORE_EXPORT QDataStream &operator<<(QDataStream &out, const QIviOrderTerm &var); +Q_QTIVICORE_EXPORT QDataStream &operator>>(QDataStream &in, QIviOrderTerm &var); + QT_END_NAMESPACE +Q_DECLARE_METATYPE(QIviOrderTerm) + #endif // QUERYTERM_H diff --git a/src/ivimedia/qiviplayableitem.cpp b/src/ivimedia/qiviplayableitem.cpp index 6559fc6..e91f0af 100644 --- a/src/ivimedia/qiviplayableitem.cpp +++ b/src/ivimedia/qiviplayableitem.cpp @@ -41,6 +41,8 @@ ****************************************************************************/ #include "qiviplayableitem.h" +#include <QDataStream> +#include <QDebug> QT_BEGIN_NAMESPACE diff --git a/tests/auto/core/queryparser/tst_queryparser.cpp b/tests/auto/core/queryparser/tst_queryparser.cpp index bcaade2..fb7f21e 100644 --- a/tests/auto/core/queryparser/tst_queryparser.cpp +++ b/tests/auto/core/queryparser/tst_queryparser.cpp @@ -155,6 +155,17 @@ void TestQueryParser::validQueries() CHECK_ERRORSTRING(term->toString(), representationQuery); + //Test the searialize functions + QByteArray buffer; + QDataStream in(&buffer, QIODevice::WriteOnly); + in << term; + + QDataStream out(buffer); + QIviAbstractQueryTerm *newTerm = nullptr; + out >> &newTerm; + + QCOMPARE(term->toString(), newTerm->toString()); + delete newTerm; delete term; } |