diff options
author | Dominik Holland <dominik.holland@pelagicore.com> | 2019-05-06 16:25:01 +0200 |
---|---|---|
committer | Robert Griebl <robert.griebl@pelagicore.com> | 2019-05-14 12:58:21 +0000 |
commit | 06d415d83fc4b80730286686a8e5243ca0b03a20 (patch) | |
tree | 6e515166b39e7461d25752e886d717c1e0680e3c /src/plugins | |
parent | 07c631aa4c1ac5199b4919087e43815a00154867 (diff) | |
download | qtivi-06d415d83fc4b80730286686a8e5243ca0b03a20.tar.gz |
Introduce a internal QtRemoteObject helper module
This module provides helper functions when using QtRemoteObjects and
starts using it in the autogenerator templates and the handwritten
servers. The helper provides the following:
* generic error handling
* conversion from QIviPendingReply to a pending call on the source side
* conversion to QIviPendingReply on the replica side
Change-Id: Ic9030c89b8153626340cc786d97ecdae416e699d
Fixes: AUTOSUITE-929
Reviewed-by: Robert Griebl <robert.griebl@pelagicore.com>
Diffstat (limited to 'src/plugins')
9 files changed, 57 insertions, 300 deletions
diff --git a/src/plugins/ivimedia/media_qtro/media_qtro.pro b/src/plugins/ivimedia/media_qtro/media_qtro.pro index 6967890..60e6a8a 100644 --- a/src/plugins/ivimedia/media_qtro/media_qtro.pro +++ b/src/plugins/ivimedia/media_qtro/media_qtro.pro @@ -8,7 +8,7 @@ load(qt_plugin) DISTFILES += media_qtro.json -QT += ivicore ivimedia remoteobjects +QT += ivicore ivimedia remoteobjects iviremoteobjects_helper_private HEADERS += \ mediaplugin.h \ diff --git a/src/plugins/ivimedia/media_qtro/mediadiscoverybackend.cpp b/src/plugins/ivimedia/media_qtro/mediadiscoverybackend.cpp index 30ae5b8..30df6a6 100644 --- a/src/plugins/ivimedia/media_qtro/mediadiscoverybackend.cpp +++ b/src/plugins/ivimedia/media_qtro/mediadiscoverybackend.cpp @@ -50,12 +50,14 @@ Q_LOGGING_CATEGORY(qLcROQIviMediaDiscovery, "qtivi.media.qivimediadiscoverybacke MediaDiscoveryBackend::MediaDiscoveryBackend(QRemoteObjectNode *node, QObject *parent) : QIviMediaDeviceDiscoveryModelBackendInterface(parent) , m_initialized(false) + , m_helper(new QIviRemoteObjectReplicaHelper(qLcROQIviMediaDiscovery(), this)) { m_replica.reset(node->acquire<QIviMediaDiscoveryModelReplica>(QStringLiteral("QtIviMedia.QIviMediaDiscoveryModel"))); - connect(node, &QRemoteObjectNode::error, this, &MediaDiscoveryBackend::onNodeError); + connect(node, &QRemoteObjectNode::error, m_helper, &QIviRemoteObjectReplicaHelper::onNodeError); + connect(m_helper, &QIviRemoteObjectReplicaHelper::errorChanged, this, &QIviFeatureInterface::errorChanged); + connect(m_replica.data(), &QRemoteObjectReplica::stateChanged, m_helper, &QIviRemoteObjectReplicaHelper::onReplicaStateChanged); connect(m_replica.data(), &QRemoteObjectReplica::initialized, this, &QIviFeatureInterface::initializationDone); - connect(m_replica.data(), &QRemoteObjectReplica::stateChanged, this, &MediaDiscoveryBackend::onReplicaStateChanged); connect(m_replica.data(), &QIviMediaDiscoveryModelReplica::devicesChanged, this, &MediaDiscoveryBackend::onDevicesChanged); connect(m_replica.data(), &QIviMediaDiscoveryModelReplica::deviceAdded, this, &MediaDiscoveryBackend::onDeviceAdded); connect(m_replica.data(), &QIviMediaDiscoveryModelReplica::deviceRemoved, this, &MediaDiscoveryBackend::onDeviceRemoved); @@ -100,26 +102,3 @@ void MediaDiscoveryBackend::onDeviceRemoved(const QString &device) emit deviceRemoved(dev); dev->deleteLater(); } - -void MediaDiscoveryBackend::onReplicaStateChanged(QRemoteObjectReplica::State newState, QRemoteObjectReplica::State oldState) -{ - Q_UNUSED(oldState) - - if (newState == QRemoteObjectReplica::Suspect) { - qCWarning(qLcROQIviMediaDiscovery) << "QRemoteObjectReplica error, connection to the source lost"; - emit errorChanged(QIviAbstractFeature::Unknown, - "QRemoteObjectReplica error, connection to the source lost"); - } else if (newState == QRemoteObjectReplica::SignatureMismatch) { - qCWarning(qLcROQIviMediaDiscovery) << "QRemoteObjectReplica error, signature mismatch"; - emit errorChanged(QIviAbstractFeature::Unknown, - "QRemoteObjectReplica error, signature mismatch"); - } else if (newState==QRemoteObjectReplica::Valid) { - emit errorChanged(QIviAbstractFeature::NoError, ""); - } -} - -void MediaDiscoveryBackend::onNodeError(QRemoteObjectNode::ErrorCode code) -{ - qCWarning(qLcROQIviMediaDiscovery) << "QRemoteObjectNode error, code: " << code; - emit errorChanged(QIviAbstractFeature::Unknown, "QRemoteObjectNode error, code: " + code); -} diff --git a/src/plugins/ivimedia/media_qtro/mediadiscoverybackend.h b/src/plugins/ivimedia/media_qtro/mediadiscoverybackend.h index 14e78c1..505cf14 100644 --- a/src/plugins/ivimedia/media_qtro/mediadiscoverybackend.h +++ b/src/plugins/ivimedia/media_qtro/mediadiscoverybackend.h @@ -44,10 +44,12 @@ #include <QtIviMedia/QIviMediaDeviceDiscoveryModelBackendInterface> #include <QtIviCore/QIviServiceObject> +#include <QIviRemoteObjectReplicaHelper> #include <QRemoteObjectNode> #include "rep_qivimediadiscoverymodel_replica.h" + class MediaDiscoveryBackend : public QIviMediaDeviceDiscoveryModelBackendInterface { Q_OBJECT @@ -58,10 +60,6 @@ public: void initialize() override; public Q_SLOTS: - void onReplicaStateChanged(QRemoteObjectReplica::State newState, - QRemoteObjectReplica::State oldState); - void onNodeError(QRemoteObjectNode::ErrorCode code); - void onDevicesChanged(const QStringList &devices); void onDeviceAdded(const QString &device); void onDeviceRemoved(const QString &device); @@ -70,6 +68,7 @@ private: QSharedPointer<QIviMediaDiscoveryModelReplica> m_replica; QHash<QString, QIviServiceObject*> m_deviceMap; bool m_initialized; + QIviRemoteObjectReplicaHelper *m_helper; }; #endif // MEDIADISCOVERYBACKEND_H diff --git a/src/plugins/ivimedia/media_qtro/mediaindexerbackend.cpp b/src/plugins/ivimedia/media_qtro/mediaindexerbackend.cpp index bdc26ab..58f2027 100644 --- a/src/plugins/ivimedia/media_qtro/mediaindexerbackend.cpp +++ b/src/plugins/ivimedia/media_qtro/mediaindexerbackend.cpp @@ -47,12 +47,14 @@ Q_LOGGING_CATEGORY(qLcROQIviMediaIndexer, "qtivi.media.qivimediaindexerbackend.r MediaIndexerBackend::MediaIndexerBackend(QRemoteObjectNode *node, QObject *parent) : QIviMediaIndexerControlBackendInterface(parent) + , m_helper(new QIviRemoteObjectReplicaHelper(qLcROQIviMediaIndexer(), this)) { m_replica.reset(node->acquire<QIviMediaIndexerReplica>(QStringLiteral("QtIviMedia.QIviMediaIndexer"))); - connect(node, &QRemoteObjectNode::error, this, &MediaIndexerBackend::onNodeError); + connect(node, &QRemoteObjectNode::error, m_helper, &QIviRemoteObjectReplicaHelper::onNodeError); + connect(m_helper, &QIviRemoteObjectReplicaHelper::errorChanged, this, &QIviFeatureInterface::errorChanged); + connect(m_replica.data(), &QRemoteObjectReplica::stateChanged, m_helper, &QIviRemoteObjectReplicaHelper::onReplicaStateChanged); connect(m_replica.data(), &QRemoteObjectReplica::initialized, this, &QIviFeatureInterface::initializationDone); - connect(m_replica.data(), &QRemoteObjectReplica::stateChanged, this, &MediaIndexerBackend::onReplicaStateChanged); connect(m_replica.data(), &QIviMediaIndexerReplica::stateChanged, this, &MediaIndexerBackend::stateChanged); connect(m_replica.data(), &QIviMediaIndexerReplica::progressChanged, this, &MediaIndexerBackend::progressChanged); @@ -80,26 +82,3 @@ void MediaIndexerBackend::resume() { m_replica->resume(); } - -void MediaIndexerBackend::onReplicaStateChanged(QRemoteObjectReplica::State newState, QRemoteObjectReplica::State oldState) -{ - Q_UNUSED(oldState) - - if (newState == QRemoteObjectReplica::Suspect) { - qCWarning(qLcROQIviMediaIndexer) << "QRemoteObjectReplica error, connection to the source lost"; - emit errorChanged(QIviAbstractFeature::Unknown, - "QRemoteObjectReplica error, connection to the source lost"); - } else if (newState == QRemoteObjectReplica::SignatureMismatch) { - qCWarning(qLcROQIviMediaIndexer) << "QRemoteObjectReplica error, signature mismatch"; - emit errorChanged(QIviAbstractFeature::Unknown, - "QRemoteObjectReplica error, signature mismatch"); - } else if (newState==QRemoteObjectReplica::Valid) { - emit errorChanged(QIviAbstractFeature::NoError, ""); - } -} - -void MediaIndexerBackend::onNodeError(QRemoteObjectNode::ErrorCode code) -{ - qCWarning(qLcROQIviMediaIndexer) << "QRemoteObjectNode error, code: " << code; - emit errorChanged(QIviAbstractFeature::Unknown, "QRemoteObjectNode error, code: " + code); -} diff --git a/src/plugins/ivimedia/media_qtro/mediaindexerbackend.h b/src/plugins/ivimedia/media_qtro/mediaindexerbackend.h index add4010..29a0cd3 100644 --- a/src/plugins/ivimedia/media_qtro/mediaindexerbackend.h +++ b/src/plugins/ivimedia/media_qtro/mediaindexerbackend.h @@ -43,6 +43,7 @@ #define MEDIAINDEXERBACKEND_H #include <QtIviMedia/QIviMediaIndexerControlBackendInterface> +#include <QIviRemoteObjectReplicaHelper> #include <QRemoteObjectNode> #include "rep_qivimediaindexer_replica.h" @@ -57,13 +58,9 @@ public: void pause() override; void resume() override; -public Q_SLOTS: - void onReplicaStateChanged(QRemoteObjectReplica::State newState, - QRemoteObjectReplica::State oldState); - void onNodeError(QRemoteObjectNode::ErrorCode code); - private: QSharedPointer<QIviMediaIndexerReplica> m_replica; + QIviRemoteObjectReplicaHelper *m_helper; }; #endif // MEDIAINDEXERBACKEND_H diff --git a/src/plugins/ivimedia/media_qtro/mediaplayerbackend.cpp b/src/plugins/ivimedia/media_qtro/mediaplayerbackend.cpp index 983dd35..10fc75a 100644 --- a/src/plugins/ivimedia/media_qtro/mediaplayerbackend.cpp +++ b/src/plugins/ivimedia/media_qtro/mediaplayerbackend.cpp @@ -48,6 +48,7 @@ Q_LOGGING_CATEGORY(qLcROQIviMediaPlayer, "qtivi.media.qivimediaplayerbackend.rem MediaPlayerBackend::MediaPlayerBackend(QRemoteObjectNode *node, QObject *parent) : QIviMediaPlayerBackendInterface(parent) + , m_helper(new QIviRemoteObjectReplicaHelper(qLcROQIviMediaPlayer(), this)) { qRegisterMetaType<QIviPlayableItem>(); qRegisterMetaType<QIviAudioTrackItem>(); @@ -55,9 +56,10 @@ MediaPlayerBackend::MediaPlayerBackend(QRemoteObjectNode *node, QObject *parent) m_replica.reset(node->acquire<QIviMediaPlayerReplica>(QStringLiteral("QtIviMedia.QIviMediaPlayer"))); - connect(node, &QRemoteObjectNode::error, this, &MediaPlayerBackend::onNodeError); + connect(node, &QRemoteObjectNode::error, m_helper, &QIviRemoteObjectReplicaHelper::onNodeError); + connect(m_helper, &QIviRemoteObjectReplicaHelper::errorChanged, this, &QIviFeatureInterface::errorChanged); + connect(m_replica.data(), &QRemoteObjectReplica::stateChanged, m_helper, &QIviRemoteObjectReplicaHelper::onReplicaStateChanged); connect(m_replica.data(), &QRemoteObjectReplica::initialized, this, &QIviFeatureInterface::initializationDone); - connect(m_replica.data(), &QRemoteObjectReplica::stateChanged, this, &MediaPlayerBackend::onReplicaStateChanged); connect(m_replica.data(), &QIviMediaPlayerReplica::playModeChanged, this, &MediaPlayerBackend::playModeChanged); connect(m_replica.data(), &QIviMediaPlayerReplica::playStateChanged, this, &MediaPlayerBackend::playStateChanged); connect(m_replica.data(), &QIviMediaPlayerReplica::positionChanged, this, &MediaPlayerBackend::positionChanged); @@ -167,26 +169,3 @@ void MediaPlayerBackend::move(int currentIndex, int newIndex) { m_replica->move(currentIndex, newIndex); } - -void MediaPlayerBackend::onReplicaStateChanged(QRemoteObjectReplica::State newState, QRemoteObjectReplica::State oldState) -{ - Q_UNUSED(oldState) - - if (newState == QRemoteObjectReplica::Suspect) { - qCWarning(qLcROQIviMediaPlayer) << "QRemoteObjectReplica error, connection to the source lost"; - emit errorChanged(QIviAbstractFeature::Unknown, - "QRemoteObjectReplica error, connection to the source lost"); - } else if (newState == QRemoteObjectReplica::SignatureMismatch) { - qCWarning(qLcROQIviMediaPlayer) << "QRemoteObjectReplica error, signature mismatch"; - emit errorChanged(QIviAbstractFeature::Unknown, - "QRemoteObjectReplica error, signature mismatch"); - } else if (newState==QRemoteObjectReplica::Valid) { - emit errorChanged(QIviAbstractFeature::NoError, ""); - } -} - -void MediaPlayerBackend::onNodeError(QRemoteObjectNode::ErrorCode code) -{ - qCWarning(qLcROQIviMediaPlayer) << "QRemoteObjectNode error, code: " << code; - emit errorChanged(QIviAbstractFeature::Unknown, "QRemoteObjectNode error, code: " + code); -} diff --git a/src/plugins/ivimedia/media_qtro/mediaplayerbackend.h b/src/plugins/ivimedia/media_qtro/mediaplayerbackend.h index 3f951e4..62b3b22 100644 --- a/src/plugins/ivimedia/media_qtro/mediaplayerbackend.h +++ b/src/plugins/ivimedia/media_qtro/mediaplayerbackend.h @@ -43,6 +43,7 @@ #define MEDIAPLAYERBACKEND_H #include <QtIviMedia/QIviMediaPlayerBackendInterface> +#include <QIviRemoteObjectReplicaHelper> #include <QRemoteObjectNode> #include "rep_qivimediaplayer_replica.h" @@ -69,13 +70,9 @@ public: void remove(int index) override; void move(int currentIndex, int newIndex) override; -public Q_SLOTS: - void onReplicaStateChanged(QRemoteObjectReplica::State newState, - QRemoteObjectReplica::State oldState); - void onNodeError(QRemoteObjectNode::ErrorCode code); - private: QSharedPointer<QIviMediaPlayerReplica> m_replica; + QIviRemoteObjectReplicaHelper *m_helper; }; #endif // MEDIAPLAYERBACKEND_H diff --git a/src/plugins/ivimedia/media_qtro/searchandbrowsemodel.cpp b/src/plugins/ivimedia/media_qtro/searchandbrowsemodel.cpp index 6297b5a..9a3894e 100644 --- a/src/plugins/ivimedia/media_qtro/searchandbrowsemodel.cpp +++ b/src/plugins/ivimedia/media_qtro/searchandbrowsemodel.cpp @@ -74,6 +74,7 @@ QDataStream &operator>>(QDataStream &stream, SearchAndBrowseItem &obj) SearchAndBrowseModel::SearchAndBrowseModel(QRemoteObjectNode *node, QObject *parent) : QIviSearchAndBrowseModelInterface(parent) + , m_helper(new QIviRemoteObjectReplicaHelper(qLcROQIviSearchAndBrowseModel(), this)) { qRegisterMetaType<SearchAndBrowseItem>(); qRegisterMetaTypeStreamOperators<SearchAndBrowseItem>(); @@ -82,10 +83,11 @@ SearchAndBrowseModel::SearchAndBrowseModel(QRemoteObjectNode *node, QObject *par m_replica.reset(node->acquire<QIviSearchAndBrowseModelReplica>(QStringLiteral("QIviSearchAndBrowseModel"))); - connect(node, &QRemoteObjectNode::error, this, &SearchAndBrowseModel::onNodeError); + connect(node, &QRemoteObjectNode::error, m_helper, &QIviRemoteObjectReplicaHelper::onNodeError); + connect(m_helper, &QIviRemoteObjectReplicaHelper::errorChanged, this, &QIviFeatureInterface::errorChanged); + connect(m_replica.data(), &QRemoteObjectReplica::stateChanged, m_helper, &QIviRemoteObjectReplicaHelper::onReplicaStateChanged); connect(m_replica.data(), &QRemoteObjectReplica::initialized, this, &QIviFeatureInterface::initializationDone); - connect(m_replica.data(), &QRemoteObjectReplica::stateChanged, this, &SearchAndBrowseModel::onReplicaStateChanged); - connect(m_replica.data(), &QIviSearchAndBrowseModelReplica::pendingResultAvailable, this, &SearchAndBrowseModel::onPendingResultAvailable); + connect(m_replica.data(), &QIviSearchAndBrowseModelReplica::pendingResultAvailable, m_helper, &QIviRemoteObjectReplicaHelper::onPendingResultAvailable); connect(m_replica.data(), &QIviSearchAndBrowseModelReplica::canGoBackChanged, this, &SearchAndBrowseModel::canGoBackChanged); connect(m_replica.data(), &QIviSearchAndBrowseModelReplica::canGoForwardChanged, this, &SearchAndBrowseModel::canGoForwardChanged); connect(m_replica.data(), &QIviSearchAndBrowseModelReplica::supportedCapabilitiesChanged, this, &SearchAndBrowseModel::supportedCapabilitiesChanged); @@ -141,244 +143,73 @@ void SearchAndBrowseModel::setupFilter(const QUuid &identifier, QIviAbstractQuer QIviPendingReply<QString> SearchAndBrowseModel::goBack(const QUuid &identifier) { - QIviPendingReply<QString> iviReply; QRemoteObjectPendingReply<QVariant> reply = m_replica->goBack(identifier); - auto watcher = new QRemoteObjectPendingCallWatcher(reply); - connect(watcher, &QRemoteObjectPendingCallWatcher::finished, this, [this, iviReply](QRemoteObjectPendingCallWatcher *self) mutable { - if (self->error() == QRemoteObjectPendingCallWatcher::NoError) { -#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 1) - QVariant value = self->returnValue(); -#else - QVariant value = self->returnValue().value<QVariant>(); -#endif - if (value.canConvert<QIviSearchAndBrowseModelPendingResult>()) { - QIviSearchAndBrowseModelPendingResult result = value.value<QIviSearchAndBrowseModelPendingResult>(); - if (result.failed()) { - qCDebug(qLcROQIviSearchAndBrowseModel) << "Pending Result with id:" << result.id() << "failed"; - iviReply.setFailed(); - } else { - qCDebug(qLcROQIviSearchAndBrowseModel) << "Result not available yet. Waiting for id:" << result.id(); - m_pendingReplies.insert(result.id(), iviReply); - } - } else { - qCDebug(qLcROQIviSearchAndBrowseModel) << "Got the value right away:" << value.value<QString>(); - iviReply.setSuccess(value.toString()); - } - } else { - iviReply.setFailed(); - emit errorChanged(QIviAbstractFeature::InvalidOperation, QStringLiteral("remote call of method insert failed")); - } - self->deleteLater(); + auto iviReply = m_helper->toQIviPendingReply<QString>(reply); + + //Pass an empty std::function to only handle errors. + iviReply.then(std::function<void(QString)>(), [this]() { + emit errorChanged(QIviAbstractFeature::InvalidOperation, QStringLiteral("remote call of method goBack failed")); }); return iviReply; } QIviPendingReply<QString> SearchAndBrowseModel::goForward(const QUuid &identifier, int index) { - QIviPendingReply<QString> iviReply; QRemoteObjectPendingReply<QVariant> reply = m_replica->goForward(identifier, index); - auto watcher = new QRemoteObjectPendingCallWatcher(reply); - connect(watcher, &QRemoteObjectPendingCallWatcher::finished, this, [this, iviReply](QRemoteObjectPendingCallWatcher *self) mutable { - if (self->error() == QRemoteObjectPendingCallWatcher::NoError) { -#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 1) - QVariant value = self->returnValue(); -#else - QVariant value = self->returnValue().value<QVariant>(); -#endif - if (value.canConvert<QIviSearchAndBrowseModelPendingResult>()) { - QIviSearchAndBrowseModelPendingResult result = value.value<QIviSearchAndBrowseModelPendingResult>(); - if (result.failed()) { - qCDebug(qLcROQIviSearchAndBrowseModel) << "Pending Result with id:" << result.id() << "failed"; - iviReply.setFailed(); - } else { - qCDebug(qLcROQIviSearchAndBrowseModel) << "Result not available yet. Waiting for id:" << result.id(); - m_pendingReplies.insert(result.id(), iviReply); - } - } else { - qCDebug(qLcROQIviSearchAndBrowseModel) << "Got the value right away:" << value.value<QString>(); - iviReply.setSuccess(value.toString()); - } - } else { - iviReply.setFailed(); - emit errorChanged(QIviAbstractFeature::InvalidOperation, QStringLiteral("remote call of method insert failed")); - } - self->deleteLater(); + + //Pass an empty std::function to only handle errors. + auto iviReply = m_helper->toQIviPendingReply<QString>(reply); + iviReply.then(std::function<void(QString)>(), [this]() { + emit errorChanged(QIviAbstractFeature::InvalidOperation, QStringLiteral("remote call of method goForward failed")); }); return iviReply; } QIviPendingReply<void> SearchAndBrowseModel::insert(const QUuid &identifier, int index, const QVariant &item) { - QIviPendingReply<void> iviReply; QRemoteObjectPendingReply<QVariant> reply = m_replica->insert(identifier, index, item); - auto watcher = new QRemoteObjectPendingCallWatcher(reply); - connect(watcher, &QRemoteObjectPendingCallWatcher::finished, this, [this, iviReply](QRemoteObjectPendingCallWatcher *self) mutable { - if (self->error() == QRemoteObjectPendingCallWatcher::NoError) { -#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 1) - QVariant value = self->returnValue(); -#else - QVariant value = self->returnValue().value<QVariant>(); -#endif - if (value.canConvert<QIviSearchAndBrowseModelPendingResult>()) { - QIviSearchAndBrowseModelPendingResult result = value.value<QIviSearchAndBrowseModelPendingResult>(); - if (result.failed()) { - qCDebug(qLcROQIviSearchAndBrowseModel) << "Pending Result with id:" << result.id() << "failed"; - iviReply.setFailed(); - } else { - qCDebug(qLcROQIviSearchAndBrowseModel) << "Result not available yet. Waiting for id:" << result.id(); - m_pendingReplies.insert(result.id(), iviReply); - } - } else { - qCDebug(qLcROQIviSearchAndBrowseModel) << "Got the value right away: void"; - iviReply.setSuccess(); - } - } else { - iviReply.setFailed(); - emit errorChanged(QIviAbstractFeature::InvalidOperation, QStringLiteral("remote call of method insert failed")); - } - self->deleteLater(); + + //Pass an empty std::function to only handle errors. + auto iviReply = m_helper->toQIviPendingReply<void>(reply); + iviReply.then(std::function<void()>(), [this]() { + emit errorChanged(QIviAbstractFeature::InvalidOperation, QStringLiteral("remote call of method insert failed")); }); return iviReply; } QIviPendingReply<void> SearchAndBrowseModel::remove(const QUuid &identifier, int index) { - QIviPendingReply<void> iviReply; QRemoteObjectPendingReply<QVariant> reply = m_replica->remove(identifier, index); - auto watcher = new QRemoteObjectPendingCallWatcher(reply); - connect(watcher, &QRemoteObjectPendingCallWatcher::finished, this, [this, iviReply](QRemoteObjectPendingCallWatcher *self) mutable { - if (self->error() == QRemoteObjectPendingCallWatcher::NoError) { -#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 1) - QVariant value = self->returnValue(); -#else - QVariant value = self->returnValue().value<QVariant>(); -#endif - if (value.canConvert<QIviSearchAndBrowseModelPendingResult>()) { - QIviSearchAndBrowseModelPendingResult result = value.value<QIviSearchAndBrowseModelPendingResult>(); - if (result.failed()) { - qCDebug(qLcROQIviSearchAndBrowseModel) << "Pending Result with id:" << result.id() << "failed"; - iviReply.setFailed(); - } else { - qCDebug(qLcROQIviSearchAndBrowseModel) << "Result not available yet. Waiting for id:" << result.id(); - m_pendingReplies.insert(result.id(), iviReply); - } - } else { - qCDebug(qLcROQIviSearchAndBrowseModel) << "Got the value right away: void"; - iviReply.setSuccess(); - } - } else { - iviReply.setFailed(); - emit errorChanged(QIviAbstractFeature::InvalidOperation, QStringLiteral("remote call of method remove failed")); - } - self->deleteLater(); + + //Pass an empty std::function to only handle errors. + auto iviReply = m_helper->toQIviPendingReply<void>(reply); + iviReply.then(std::function<void()>(), [this]() { + emit errorChanged(QIviAbstractFeature::InvalidOperation, QStringLiteral("remote call of method remove failed")); }); return iviReply; } QIviPendingReply<void> SearchAndBrowseModel::move(const QUuid &identifier, int currentIndex, int newIndex) { - QIviPendingReply<void> iviReply; QRemoteObjectPendingReply<QVariant> reply = m_replica->move(identifier, currentIndex, newIndex); - auto watcher = new QRemoteObjectPendingCallWatcher(reply); - connect(watcher, &QRemoteObjectPendingCallWatcher::finished, this, [this, iviReply](QRemoteObjectPendingCallWatcher *self) mutable { - if (self->error() == QRemoteObjectPendingCallWatcher::NoError) { -#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 1) - QVariant value = self->returnValue(); -#else - QVariant value = self->returnValue().value<QVariant>(); -#endif - if (value.canConvert<QIviSearchAndBrowseModelPendingResult>()) { - QIviSearchAndBrowseModelPendingResult result = value.value<QIviSearchAndBrowseModelPendingResult>(); - if (result.failed()) { - qCDebug(qLcROQIviSearchAndBrowseModel) << "Pending Result with id:" << result.id() << "failed"; - iviReply.setFailed(); - } else { - qCDebug(qLcROQIviSearchAndBrowseModel) << "Result not available yet. Waiting for id:" << result.id(); - m_pendingReplies.insert(result.id(), iviReply); - } - } else { - qCDebug(qLcROQIviSearchAndBrowseModel) << "Got the value right away: void"; - iviReply.setSuccess(); - } - } else { - iviReply.setFailed(); - emit errorChanged(QIviAbstractFeature::InvalidOperation, QStringLiteral("remote call of method move failed")); - } - self->deleteLater(); + + //Pass an empty std::function to only handle errors. + auto iviReply = m_helper->toQIviPendingReply<void>(reply); + iviReply.then(std::function<void()>(), [this]() { + emit errorChanged(QIviAbstractFeature::InvalidOperation, QStringLiteral("remote call of method move failed")); }); return iviReply; } QIviPendingReply<int> SearchAndBrowseModel::indexOf(const QUuid &identifier, const QVariant &item) { - QIviPendingReply<int> iviReply; QRemoteObjectPendingReply<QVariant> reply = m_replica->indexOf(identifier, item); - auto watcher = new QRemoteObjectPendingCallWatcher(reply); - connect(watcher, &QRemoteObjectPendingCallWatcher::finished, this, [this, iviReply](QRemoteObjectPendingCallWatcher *self) mutable { - if (self->error() == QRemoteObjectPendingCallWatcher::NoError) { -#if QT_VERSION >= QT_VERSION_CHECK(5, 12, 1) - QVariant value = self->returnValue(); -#else - QVariant value = self->returnValue().value<QVariant>(); -#endif - if (value.canConvert<QIviSearchAndBrowseModelPendingResult>()) { - QIviSearchAndBrowseModelPendingResult result = value.value<QIviSearchAndBrowseModelPendingResult>(); - if (result.failed()) { - qCDebug(qLcROQIviSearchAndBrowseModel) << "Pending Result with id:" << result.id() << "failed"; - iviReply.setFailed(); - } else { - qCDebug(qLcROQIviSearchAndBrowseModel) << "Result not available yet. Waiting for id:" << result.id(); - m_pendingReplies.insert(result.id(), iviReply); - } - } else { - qCDebug(qLcROQIviSearchAndBrowseModel) << "Got the value right away:" << value.value<int>(); - iviReply.setSuccess(value.value<int>()); - } - } else { - iviReply.setFailed(); - emit errorChanged(QIviAbstractFeature::InvalidOperation, QStringLiteral("remote call of method remove failed")); - } - self->deleteLater(); + + //Pass an empty std::function to only handle errors. + auto iviReply = m_helper->toQIviPendingReply<int>(reply); + iviReply.then(std::function<void(int)>(), [this]() { + emit errorChanged(QIviAbstractFeature::InvalidOperation, QStringLiteral("remote call of method indexOf failed")); }); return iviReply; } -void SearchAndBrowseModel::onReplicaStateChanged(QRemoteObjectReplica::State newState, QRemoteObjectReplica::State oldState) -{ - Q_UNUSED(oldState) - - if (newState == QRemoteObjectReplica::Suspect) { - qCWarning(qLcROQIviSearchAndBrowseModel) << "QRemoteObjectReplica error, connection to the source lost"; - emit errorChanged(QIviAbstractFeature::Unknown, - "QRemoteObjectReplica error, connection to the source lost"); - } else if (newState == QRemoteObjectReplica::SignatureMismatch) { - qCWarning(qLcROQIviSearchAndBrowseModel) << "QRemoteObjectReplica error, signature mismatch"; - emit errorChanged(QIviAbstractFeature::Unknown, - "QRemoteObjectReplica error, signature mismatch"); - } else if (newState == QRemoteObjectReplica::Valid) { - emit errorChanged(QIviAbstractFeature::NoError, ""); - } -} - -void SearchAndBrowseModel::onNodeError(QRemoteObjectNode::ErrorCode code) -{ - qCWarning(qLcROQIviSearchAndBrowseModel) << "QRemoteObjectNode error, code: " << code; - emit errorChanged(QIviAbstractFeature::Unknown, "QRemoteObjectNode error, code: " + code); -} - -void SearchAndBrowseModel::onPendingResultAvailable(quint64 id, bool isSuccess, const QVariant &value) -{ - qCDebug(qLcROQIviSearchAndBrowseModel) << "pending result available" << id; - if (!m_pendingReplies.contains(id)) { - qCDebug(qLcROQIviSearchAndBrowseModel) << "Received a result for an unexpected id:" << id << ". Ignoring!"; - return; - } - - QIviPendingReplyBase iviReply = m_pendingReplies.take(id); - - if (isSuccess) - iviReply.setSuccess(value); - else - iviReply.setFailed(); -} - diff --git a/src/plugins/ivimedia/media_qtro/searchandbrowsemodel.h b/src/plugins/ivimedia/media_qtro/searchandbrowsemodel.h index 4a7b23c..5761ee5 100644 --- a/src/plugins/ivimedia/media_qtro/searchandbrowsemodel.h +++ b/src/plugins/ivimedia/media_qtro/searchandbrowsemodel.h @@ -44,6 +44,7 @@ #include <QtIviCore/QIviSearchAndBrowseModelInterface> #include <QtIviMedia/QIviPlayableItem> +#include <QIviRemoteObjectReplicaHelper> #include <QRemoteObjectNode> #include "rep_qivisearchandbrowsemodel_replica.h" @@ -87,14 +88,9 @@ public: QIviPendingReply<void> move(const QUuid &identifier, int currentIndex, int newIndex) override; QIviPendingReply<int> indexOf(const QUuid &identifier, const QVariant &item) override; -public Q_SLOTS: - void onReplicaStateChanged(QRemoteObjectReplica::State newState, - QRemoteObjectReplica::State oldState); - void onNodeError(QRemoteObjectNode::ErrorCode code); - void onPendingResultAvailable(quint64 id, bool isSuccess, const QVariant &value); private: QSharedPointer<QIviSearchAndBrowseModelReplica> m_replica; - QHash<quint64, QIviPendingReplyBase> m_pendingReplies; + QIviRemoteObjectReplicaHelper *m_helper; }; #endif // SEARCHANDBROWSEMODEL_H |