diff options
author | Dominik Holland <dominik.holland@pelagicore.com> | 2019-07-31 15:13:02 +0200 |
---|---|---|
committer | Dominik Holland <dominik.holland@pelagicore.com> | 2019-08-01 16:02:22 +0200 |
commit | 4e9b53ecb262d90ea58c287325294b5c645d7ca0 (patch) | |
tree | a3901c9075ac5731c9814a3fbaba367d7dbeecbb | |
parent | 7297377a0b954ae39d00ea3a5a2bc66250a92ff2 (diff) | |
download | qtivi-4e9b53ecb262d90ea58c287325294b5c645d7ca0.tar.gz |
media_qtro: Support connecting to a different host
Similar to the autogenerated backends, the media_qtro backend is now
able to connect to a new host as the connection is now part of the
actual backend and not maintained in the plugin anymore.
In addition the ivimedia-simulation-server doesn't use a second QtRO
connection for the USB Device Simulation anymore, instead the
SearchAndBrowseModelBackend instance is now registered on the same
connection with a different name. This enables to use the simulation
also on a tcp connection and is not limited to local sockets anymore.
Fixes: AUTOSUITE-1144
Change-Id: Ieb57157836e69c1c50c69f7f1af952d57939ba54
Reviewed-by: Robert Griebl <robert.griebl@pelagicore.com>
14 files changed, 292 insertions, 115 deletions
diff --git a/src/plugins/ivimedia/media_qtro/mediadiscoverybackend.cpp b/src/plugins/ivimedia/media_qtro/mediadiscoverybackend.cpp index 30df6a6..2a93757 100644 --- a/src/plugins/ivimedia/media_qtro/mediadiscoverybackend.cpp +++ b/src/plugins/ivimedia/media_qtro/mediadiscoverybackend.cpp @@ -44,36 +44,32 @@ #include <QtDebug> #include <QTimer> +#include <QSettings> Q_LOGGING_CATEGORY(qLcROQIviMediaDiscovery, "qtivi.media.qivimediadiscoverybackend.remoteobjects", QtInfoMsg) -MediaDiscoveryBackend::MediaDiscoveryBackend(QRemoteObjectNode *node, QObject *parent) +MediaDiscoveryBackend::MediaDiscoveryBackend(QObject *parent) : QIviMediaDeviceDiscoveryModelBackendInterface(parent) + , m_node(nullptr) , m_initialized(false) , m_helper(new QIviRemoteObjectReplicaHelper(qLcROQIviMediaDiscovery(), this)) { - m_replica.reset(node->acquire<QIviMediaDiscoveryModelReplica>(QStringLiteral("QtIviMedia.QIviMediaDiscoveryModel"))); - - 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(), &QIviMediaDiscoveryModelReplica::devicesChanged, this, &MediaDiscoveryBackend::onDevicesChanged); - connect(m_replica.data(), &QIviMediaDiscoveryModelReplica::deviceAdded, this, &MediaDiscoveryBackend::onDeviceAdded); - connect(m_replica.data(), &QIviMediaDiscoveryModelReplica::deviceRemoved, this, &MediaDiscoveryBackend::onDeviceRemoved); - - QTimer::singleShot(3000, this, [this](){ - if (!m_replica->isInitialized()) - qCCritical(qLcROQIviMediaDiscovery) << "QtIviMedia.QIviMediaDiscoveryModel wasn't initialized within the timeout period. Please make sure the server is running."; - }); } void MediaDiscoveryBackend::initialize() { + if (!connectToNode()) + return; + if (m_replica->isInitialized()) { onDevicesChanged(m_replica->devices()); emit initializationDone(); } + + QTimer::singleShot(3000, this, [this](){ + if (!m_replica->isInitialized()) + qCCritical(qLcROQIviMediaDiscovery) << "QtIviMedia.QIviMediaDiscoveryModel wasn't initialized within the timeout period. Please make sure the server is running."; + }); } void MediaDiscoveryBackend::onDevicesChanged(const QStringList &devices) @@ -100,5 +96,47 @@ void MediaDiscoveryBackend::onDeviceRemoved(const QString &device) { QIviServiceObject *dev = m_deviceMap.take(device); emit deviceRemoved(dev); - dev->deleteLater(); +} + +bool MediaDiscoveryBackend::connectToNode() +{ + static QString configPath; + if (configPath.isEmpty()) { + if (qEnvironmentVariableIsSet("SERVER_CONF_PATH")) { + configPath = QString::fromLocal8Bit(qgetenv("SERVER_CONF_PATH")); + } else { + configPath = QStringLiteral("./server.conf"); + qCInfo(qLcROQIviMediaDiscovery) << "Environment variable SERVER_CONF_PATH not defined, using " << configPath; + } + } + + QSettings settings(configPath, QSettings::IniFormat); + settings.beginGroup(QStringLiteral("qtivimedia")); + QUrl registryUrl = QUrl(settings.value(QStringLiteral("Registry"), QStringLiteral("local:qtivimedia")).toString()); + if (m_url != registryUrl) { + m_url = registryUrl; + // QtRO doesn't allow to change the URL without destroying the Node + delete m_node; + m_node = new QRemoteObjectNode(this); + if (!m_node->connectToNode(m_url)) { + qCCritical(qLcROQIviMediaDiscovery) << "Connection to" << m_url << "failed!"; + m_replica.reset(); + return false; + } + qCInfo(qLcROQIviMediaDiscovery) << "Connecting to" << m_url; + m_replica.reset(m_node->acquire<QIviMediaDiscoveryModelReplica>(QStringLiteral("QtIviMedia.QIviMediaDiscoveryModel"))); + setupConnections(); + } + return true; +} + +void MediaDiscoveryBackend::setupConnections() +{ + connect(m_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(), &QIviMediaDiscoveryModelReplica::devicesChanged, this, &MediaDiscoveryBackend::onDevicesChanged); + connect(m_replica.data(), &QIviMediaDiscoveryModelReplica::deviceAdded, this, &MediaDiscoveryBackend::onDeviceAdded); + connect(m_replica.data(), &QIviMediaDiscoveryModelReplica::deviceRemoved, this, &MediaDiscoveryBackend::onDeviceRemoved); } diff --git a/src/plugins/ivimedia/media_qtro/mediadiscoverybackend.h b/src/plugins/ivimedia/media_qtro/mediadiscoverybackend.h index 505cf14..e875715 100644 --- a/src/plugins/ivimedia/media_qtro/mediadiscoverybackend.h +++ b/src/plugins/ivimedia/media_qtro/mediadiscoverybackend.h @@ -55,7 +55,7 @@ class MediaDiscoveryBackend : public QIviMediaDeviceDiscoveryModelBackendInterfa Q_OBJECT public: - MediaDiscoveryBackend(QRemoteObjectNode *node, QObject *parent = nullptr); + explicit MediaDiscoveryBackend(QObject *parent = nullptr); void initialize() override; @@ -64,8 +64,14 @@ public Q_SLOTS: void onDeviceAdded(const QString &device); void onDeviceRemoved(const QString &device); +protected: + void setupConnections(); + bool connectToNode(); + private: QSharedPointer<QIviMediaDiscoveryModelReplica> m_replica; + QRemoteObjectNode *m_node; + QUrl m_url; QHash<QString, QIviServiceObject*> m_deviceMap; bool m_initialized; QIviRemoteObjectReplicaHelper *m_helper; diff --git a/src/plugins/ivimedia/media_qtro/mediaindexerbackend.cpp b/src/plugins/ivimedia/media_qtro/mediaindexerbackend.cpp index 58f2027..128f82e 100644 --- a/src/plugins/ivimedia/media_qtro/mediaindexerbackend.cpp +++ b/src/plugins/ivimedia/media_qtro/mediaindexerbackend.cpp @@ -42,35 +42,32 @@ #include "mediaindexerbackend.h" #include <QTimer> +#include <QSettings> Q_LOGGING_CATEGORY(qLcROQIviMediaIndexer, "qtivi.media.qivimediaindexerbackend.remoteobjects", QtInfoMsg) -MediaIndexerBackend::MediaIndexerBackend(QRemoteObjectNode *node, QObject *parent) +MediaIndexerBackend::MediaIndexerBackend(QObject *parent) : QIviMediaIndexerControlBackendInterface(parent) + , m_node(nullptr) , m_helper(new QIviRemoteObjectReplicaHelper(qLcROQIviMediaIndexer(), this)) { - m_replica.reset(node->acquire<QIviMediaIndexerReplica>(QStringLiteral("QtIviMedia.QIviMediaIndexer"))); - - 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(), &QIviMediaIndexerReplica::stateChanged, this, &MediaIndexerBackend::stateChanged); - connect(m_replica.data(), &QIviMediaIndexerReplica::progressChanged, this, &MediaIndexerBackend::progressChanged); - - QTimer::singleShot(3000, this, [this](){ - if (!m_replica->isInitialized()) - qCCritical(qLcROQIviMediaIndexer) << "QtIviMedia.QIviMediaIndexer wasn't initialized within the timeout period. Please make sure the server is running."; - }); } void MediaIndexerBackend::initialize() { + if (!connectToNode()) + return; + if (m_replica->isInitialized()) { emit progressChanged(m_replica->progress()); emit stateChanged(m_replica->state()); emit initializationDone(); } + + QTimer::singleShot(3000, this, [this](){ + if (!m_replica->isInitialized()) + qCCritical(qLcROQIviMediaIndexer) << "QtIviMedia.QIviMediaIndexer wasn't initialized within the timeout period. Please make sure the server is running."; + }); } void MediaIndexerBackend::pause() @@ -82,3 +79,45 @@ void MediaIndexerBackend::resume() { m_replica->resume(); } + +bool MediaIndexerBackend::connectToNode() +{ + static QString configPath; + if (configPath.isEmpty()) { + if (qEnvironmentVariableIsSet("SERVER_CONF_PATH")) { + configPath = QString::fromLocal8Bit(qgetenv("SERVER_CONF_PATH")); + } else { + configPath = QStringLiteral("./server.conf"); + qCInfo(qLcROQIviMediaIndexer) << "Environment variable SERVER_CONF_PATH not defined, using " << configPath; + } + } + + QSettings settings(configPath, QSettings::IniFormat); + settings.beginGroup(QStringLiteral("qtivimedia")); + QUrl registryUrl = QUrl(settings.value(QStringLiteral("Registry"), QStringLiteral("local:qtivimedia")).toString()); + if (m_url != registryUrl) { + m_url = registryUrl; + // QtRO doesn't allow to change the URL without destroying the Node + delete m_node; + m_node = new QRemoteObjectNode(this); + if (!m_node->connectToNode(m_url)) { + qCCritical(qLcROQIviMediaIndexer) << "Connection to" << m_url << "failed!"; + m_replica.reset(); + return false; + } + qCInfo(qLcROQIviMediaIndexer) << "Connecting to" << m_url; + m_replica.reset(m_node->acquire<QIviMediaIndexerReplica>(QStringLiteral("QtIviMedia.QIviMediaIndexer"))); + setupConnections(); + } + return true; +} + +void MediaIndexerBackend::setupConnections() +{ + connect(m_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(), &QIviMediaIndexerReplica::stateChanged, this, &MediaIndexerBackend::stateChanged); + connect(m_replica.data(), &QIviMediaIndexerReplica::progressChanged, this, &MediaIndexerBackend::progressChanged); +} diff --git a/src/plugins/ivimedia/media_qtro/mediaindexerbackend.h b/src/plugins/ivimedia/media_qtro/mediaindexerbackend.h index 29a0cd3..6e004e7 100644 --- a/src/plugins/ivimedia/media_qtro/mediaindexerbackend.h +++ b/src/plugins/ivimedia/media_qtro/mediaindexerbackend.h @@ -51,15 +51,21 @@ class MediaIndexerBackend : public QIviMediaIndexerControlBackendInterface { public: - MediaIndexerBackend(QRemoteObjectNode *node, QObject *parent = nullptr); + explicit MediaIndexerBackend(QObject *parent = nullptr); public: void initialize() override; void pause() override; void resume() override; +protected: + void setupConnections(); + bool connectToNode(); + private: QSharedPointer<QIviMediaIndexerReplica> m_replica; + QRemoteObjectNode *m_node; + QUrl m_url; QIviRemoteObjectReplicaHelper *m_helper; }; diff --git a/src/plugins/ivimedia/media_qtro/mediaplayerbackend.cpp b/src/plugins/ivimedia/media_qtro/mediaplayerbackend.cpp index 7da53b5..11f77e8 100644 --- a/src/plugins/ivimedia/media_qtro/mediaplayerbackend.cpp +++ b/src/plugins/ivimedia/media_qtro/mediaplayerbackend.cpp @@ -43,46 +43,25 @@ #include "qiviqmlconversion_helper.h" #include <QTimer> +#include <QSettings> -Q_LOGGING_CATEGORY(qLcROQIviMediaPlayer, "qtivi.media.qivimediaplayerbackend.remoteobjects", QtInfoMsg) +Q_LOGGING_CATEGORY(qLcROQIviMediaPlayer, "qtivi.media.qivimediaplayerbackend.remoteobjects", QtDebugMsg) -MediaPlayerBackend::MediaPlayerBackend(QRemoteObjectNode *node, QObject *parent) +MediaPlayerBackend::MediaPlayerBackend(QObject *parent) : QIviMediaPlayerBackendInterface(parent) + , m_node(nullptr) , m_helper(new QIviRemoteObjectReplicaHelper(qLcROQIviMediaPlayer(), this)) { qRegisterMetaType<QIviPlayableItem>(); qRegisterMetaType<QIviAudioTrackItem>(); qRegisterMetaTypeStreamOperators<QIviAudioTrackItem>(); - - m_replica.reset(node->acquire<QIviMediaPlayerReplica>(QStringLiteral("QtIviMedia.QIviMediaPlayer"))); - - 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(), &QIviMediaPlayerReplica::playModeChanged, this, &MediaPlayerBackend::playModeChanged); - connect(m_replica.data(), &QIviMediaPlayerReplica::playStateChanged, this, &MediaPlayerBackend::playStateChanged); - connect(m_replica.data(), &QIviMediaPlayerReplica::positionChanged, this, &MediaPlayerBackend::positionChanged); - connect(m_replica.data(), &QIviMediaPlayerReplica::durationChanged, this, &MediaPlayerBackend::durationChanged); - connect(m_replica.data(), &QIviMediaPlayerReplica::currentTrackChanged, this, [this] (const QVariant ¤tTrack) { - emit currentTrackChanged(m_helper->fromRemoteObjectVariant(currentTrack)); - }); - connect(m_replica.data(), &QIviMediaPlayerReplica::currentIndexChanged, this, &MediaPlayerBackend::currentIndexChanged); - connect(m_replica.data(), &QIviMediaPlayerReplica::volumeChanged, this, &MediaPlayerBackend::volumeChanged); - connect(m_replica.data(), &QIviMediaPlayerReplica::mutedChanged, this, &MediaPlayerBackend::mutedChanged); - connect(m_replica.data(), &QIviMediaPlayerReplica::countChanged, this, &MediaPlayerBackend::countChanged); - connect(m_replica.data(), &QIviMediaPlayerReplica::canReportCountChanged, this, &MediaPlayerBackend::canReportCountChanged); - connect(m_replica.data(), &QIviMediaPlayerReplica::dataFetched, this, &MediaPlayerBackend::dataFetched); - connect(m_replica.data(), &QIviMediaPlayerReplica::dataChanged, this, &MediaPlayerBackend::dataChanged); - - QTimer::singleShot(3000, this, [this](){ - if (!m_replica->isInitialized()) - qCCritical(qLcROQIviMediaPlayer) << "QtIviMedia.QIviMediaPlayer wasn't initialized within the timeout period. Please make sure the server is running."; - }); } void MediaPlayerBackend::initialize() { + if (!connectToNode()) + return; + if (m_replica->isInitialized()) { emit canReportCountChanged(m_replica->canReportCount()); emit playModeChanged(m_replica->playMode()); @@ -95,6 +74,11 @@ void MediaPlayerBackend::initialize() emit mutedChanged(m_replica->muted()); emit initializationDone(); } + + QTimer::singleShot(3000, this, [this](){ + if (!m_replica->isInitialized()) + qCCritical(qLcROQIviMediaPlayer) << "QtIviMedia.QIviMediaPlayer wasn't initialized within the timeout period. Please make sure the server is running."; + }); } void MediaPlayerBackend::play() @@ -171,3 +155,58 @@ void MediaPlayerBackend::move(int currentIndex, int newIndex) { m_replica->move(currentIndex, newIndex); } + +bool MediaPlayerBackend::connectToNode() +{ + static QString configPath; + if (configPath.isEmpty()) { + if (qEnvironmentVariableIsSet("SERVER_CONF_PATH")) { + configPath = QString::fromLocal8Bit(qgetenv("SERVER_CONF_PATH")); + } else { + configPath = QStringLiteral("./server.conf"); + qCInfo(qLcROQIviMediaPlayer) << "Environment variable SERVER_CONF_PATH not defined, using " << configPath; + } + } + + QSettings settings(configPath, QSettings::IniFormat); + settings.beginGroup(QStringLiteral("qtivimedia")); + QUrl registryUrl = QUrl(settings.value(QStringLiteral("Registry"), QStringLiteral("local:qtivimedia")).toString()); + if (m_url != registryUrl) { + m_url = registryUrl; + // QtRO doesn't allow to change the URL without destroying the Node + delete m_node; + m_node = new QRemoteObjectNode(this); + if (!m_node->connectToNode(m_url)) { + qCCritical(qLcROQIviMediaPlayer) << "Connection to" << m_url << "failed!"; + m_replica.reset(); + return false; + } + qCInfo(qLcROQIviMediaPlayer) << "Connecting to" << m_url; + m_replica.reset(m_node->acquire<QIviMediaPlayerReplica>(QStringLiteral("QtIviMedia.QIviMediaPlayer"))); + setupConnections(); + } + return true; +} + +void MediaPlayerBackend::setupConnections() +{ + connect(m_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(), &QIviMediaPlayerReplica::playModeChanged, this, &MediaPlayerBackend::playModeChanged); + connect(m_replica.data(), &QIviMediaPlayerReplica::playStateChanged, this, &MediaPlayerBackend::playStateChanged); + connect(m_replica.data(), &QIviMediaPlayerReplica::positionChanged, this, &MediaPlayerBackend::positionChanged); + connect(m_replica.data(), &QIviMediaPlayerReplica::durationChanged, this, &MediaPlayerBackend::durationChanged); + connect(m_replica.data(), &QIviMediaPlayerReplica::currentTrackChanged, this, [this] (const QVariant ¤tTrack) { + emit currentTrackChanged(m_helper->fromRemoteObjectVariant(currentTrack)); + }); + connect(m_replica.data(), &QIviMediaPlayerReplica::currentIndexChanged, this, &MediaPlayerBackend::currentIndexChanged); + connect(m_replica.data(), &QIviMediaPlayerReplica::volumeChanged, this, &MediaPlayerBackend::volumeChanged); + connect(m_replica.data(), &QIviMediaPlayerReplica::mutedChanged, this, &MediaPlayerBackend::mutedChanged); + connect(m_replica.data(), &QIviMediaPlayerReplica::countChanged, this, &MediaPlayerBackend::countChanged); + connect(m_replica.data(), &QIviMediaPlayerReplica::canReportCountChanged, this, &MediaPlayerBackend::canReportCountChanged); + connect(m_replica.data(), &QIviMediaPlayerReplica::dataFetched, this, &MediaPlayerBackend::dataFetched); + connect(m_replica.data(), &QIviMediaPlayerReplica::dataChanged, this, &MediaPlayerBackend::dataChanged); +} diff --git a/src/plugins/ivimedia/media_qtro/mediaplayerbackend.h b/src/plugins/ivimedia/media_qtro/mediaplayerbackend.h index 62b3b22..74aac72 100644 --- a/src/plugins/ivimedia/media_qtro/mediaplayerbackend.h +++ b/src/plugins/ivimedia/media_qtro/mediaplayerbackend.h @@ -50,7 +50,7 @@ class MediaPlayerBackend : public QIviMediaPlayerBackendInterface { public: - MediaPlayerBackend(QRemoteObjectNode *node, QObject *parent = nullptr); + explicit MediaPlayerBackend(QObject *parent = nullptr); public: void initialize() override; @@ -70,8 +70,14 @@ public: void remove(int index) override; void move(int currentIndex, int newIndex) override; +protected: + void setupConnections(); + bool connectToNode(); + private: QSharedPointer<QIviMediaPlayerReplica> m_replica; + QRemoteObjectNode *m_node; + QUrl m_url; QIviRemoteObjectReplicaHelper *m_helper; }; diff --git a/src/plugins/ivimedia/media_qtro/mediaplugin.cpp b/src/plugins/ivimedia/media_qtro/mediaplugin.cpp index 1a0b5e0..eca202d 100644 --- a/src/plugins/ivimedia/media_qtro/mediaplugin.cpp +++ b/src/plugins/ivimedia/media_qtro/mediaplugin.cpp @@ -56,21 +56,11 @@ MediaPlugin::MediaPlugin(QObject *parent) : QObject(parent) + , m_player(new MediaPlayerBackend(this)) + , m_indexer(new MediaIndexerBackend(this)) + , m_searchModel(new SearchAndBrowseModel(this)) + , m_discovery(new MediaDiscoveryBackend(this)) { - QString configPath(QStringLiteral("./server.conf")); - if (qEnvironmentVariableIsSet("SERVER_CONF_PATH")) - configPath = QString::fromLocal8Bit(qgetenv("SERVER_CONF_PATH")); - else - qInfo() << "Environment variable SERVER_CONF_PATH not defined, using " << configPath; - QSettings settings(configPath, QSettings::IniFormat); - settings.beginGroup(QStringLiteral("remote")); - QUrl url = QUrl(settings.value(QStringLiteral("Registry"), QStringLiteral("local:qtivimedia")).toString()); - QRemoteObjectNode *node = new QRemoteObjectNode(url); - - m_player = new MediaPlayerBackend(node, this); - m_indexer = new MediaIndexerBackend(node, this); - m_searchModel = new SearchAndBrowseModel(node, this); - m_discovery = new MediaDiscoveryBackend(node, this); } QStringList MediaPlugin::interfaces() const diff --git a/src/plugins/ivimedia/media_qtro/searchandbrowsemodel.cpp b/src/plugins/ivimedia/media_qtro/searchandbrowsemodel.cpp index 9a3894e..cc771e6 100644 --- a/src/plugins/ivimedia/media_qtro/searchandbrowsemodel.cpp +++ b/src/plugins/ivimedia/media_qtro/searchandbrowsemodel.cpp @@ -43,6 +43,7 @@ #include "qiviqmlconversion_helper.h" #include <QTimer> +#include <QSettings> Q_LOGGING_CATEGORY(qLcROQIviSearchAndBrowseModel, "qtivi.media.qivisearchandbrowsebackend.remoteobjects", QtInfoMsg) @@ -72,44 +73,32 @@ QDataStream &operator>>(QDataStream &stream, SearchAndBrowseItem &obj) return stream; } -SearchAndBrowseModel::SearchAndBrowseModel(QRemoteObjectNode *node, QObject *parent) +SearchAndBrowseModel::SearchAndBrowseModel(QObject *parent, const QString& remoteObjectsLookupName) : QIviSearchAndBrowseModelInterface(parent) + , m_remoteObjectsLookupName(remoteObjectsLookupName) + , m_node(nullptr) , m_helper(new QIviRemoteObjectReplicaHelper(qLcROQIviSearchAndBrowseModel(), this)) { qRegisterMetaType<SearchAndBrowseItem>(); qRegisterMetaTypeStreamOperators<SearchAndBrowseItem>(); qRegisterMetaType<QIviAudioTrackItem>(); qRegisterMetaTypeStreamOperators<QIviAudioTrackItem>(); - - m_replica.reset(node->acquire<QIviSearchAndBrowseModelReplica>(QStringLiteral("QIviSearchAndBrowseModel"))); - - 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(), &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); - connect(m_replica.data(), &QIviSearchAndBrowseModelReplica::queryIdentifiersChanged, this, &SearchAndBrowseModel::queryIdentifiersChanged); - connect(m_replica.data(), &QIviSearchAndBrowseModelReplica::availableContentTypesChanged, this, &SearchAndBrowseModel::availableContentTypesChanged); - connect(m_replica.data(), &QIviSearchAndBrowseModelReplica::contentTypeChanged, this, &SearchAndBrowseModel::contentTypeChanged); - connect(m_replica.data(), &QIviSearchAndBrowseModelReplica::countChanged, this, &SearchAndBrowseModel::countChanged); - connect(m_replica.data(), &QIviSearchAndBrowseModelReplica::dataFetched, this, &SearchAndBrowseModel::dataFetched); - connect(m_replica.data(), &QIviSearchAndBrowseModelReplica::dataChanged, this, &SearchAndBrowseModel::dataChanged); - - QTimer::singleShot(3000, this, [this](){ - if (!m_replica->isInitialized()) - qCCritical(qLcROQIviSearchAndBrowseModel) << "QIviSearchAndBrowseModel wasn't initialized within the timeout period. Please make sure the server is running."; - }); } void SearchAndBrowseModel::initialize() { + if (!connectToNode()) + return; + if (m_replica->isInitialized()) { emit availableContentTypesChanged(m_replica->availableContentTypes()); emit initializationDone(); } + + QTimer::singleShot(3000, this, [this](){ + if (!m_replica->isInitialized()) + qCCritical(qLcROQIviSearchAndBrowseModel) << "QIviSearchAndBrowseModel wasn't initialized within the timeout period. Please make sure the server is running."; + }); } void SearchAndBrowseModel::registerInstance(const QUuid &identifier) @@ -213,3 +202,52 @@ QIviPendingReply<int> SearchAndBrowseModel::indexOf(const QUuid &identifier, con return iviReply; } +bool SearchAndBrowseModel::connectToNode() +{ + static QString configPath; + if (configPath.isEmpty()) { + if (qEnvironmentVariableIsSet("SERVER_CONF_PATH")) { + configPath = QString::fromLocal8Bit(qgetenv("SERVER_CONF_PATH")); + } else { + configPath = QStringLiteral("./server.conf"); + qCInfo(qLcROQIviSearchAndBrowseModel) << "Environment variable SERVER_CONF_PATH not defined, using " << configPath; + } + } + + QSettings settings(configPath, QSettings::IniFormat); + settings.beginGroup(QStringLiteral("qtivimedia")); + QUrl registryUrl = QUrl(settings.value(QStringLiteral("Registry"), QStringLiteral("local:qtivimedia")).toString()); + if (m_url != registryUrl) { + m_url = registryUrl; + // QtRO doesn't allow to change the URL without destroying the Node + delete m_node; + m_node = new QRemoteObjectNode(this); + if (!m_node->connectToNode(m_url)) { + qCCritical(qLcROQIviSearchAndBrowseModel) << "Connection to" << m_url << "failed!"; + m_replica.reset(); + return false; + } + qCInfo(qLcROQIviSearchAndBrowseModel) << "Connecting to" << m_url; + m_replica.reset(m_node->acquire<QIviSearchAndBrowseModelReplica>(m_remoteObjectsLookupName)); + setupConnections(); + } + return true; +} + +void SearchAndBrowseModel::setupConnections() +{ + connect(m_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(), &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); + connect(m_replica.data(), &QIviSearchAndBrowseModelReplica::queryIdentifiersChanged, this, &SearchAndBrowseModel::queryIdentifiersChanged); + connect(m_replica.data(), &QIviSearchAndBrowseModelReplica::availableContentTypesChanged, this, &SearchAndBrowseModel::availableContentTypesChanged); + connect(m_replica.data(), &QIviSearchAndBrowseModelReplica::contentTypeChanged, this, &SearchAndBrowseModel::contentTypeChanged); + connect(m_replica.data(), &QIviSearchAndBrowseModelReplica::countChanged, this, &SearchAndBrowseModel::countChanged); + connect(m_replica.data(), &QIviSearchAndBrowseModelReplica::dataFetched, this, &SearchAndBrowseModel::dataFetched); + connect(m_replica.data(), &QIviSearchAndBrowseModelReplica::dataChanged, this, &SearchAndBrowseModel::dataChanged); +} diff --git a/src/plugins/ivimedia/media_qtro/searchandbrowsemodel.h b/src/plugins/ivimedia/media_qtro/searchandbrowsemodel.h index 5761ee5..1600453 100644 --- a/src/plugins/ivimedia/media_qtro/searchandbrowsemodel.h +++ b/src/plugins/ivimedia/media_qtro/searchandbrowsemodel.h @@ -72,7 +72,7 @@ class SearchAndBrowseModel : public QIviSearchAndBrowseModelInterface { Q_OBJECT public: - SearchAndBrowseModel(QRemoteObjectNode *node, QObject *parent = nullptr); + explicit SearchAndBrowseModel(QObject *parent = nullptr, const QString& remoteObjectsLookupName = QStringLiteral("QIviSearchAndBrowseModel")); void initialize() override; void registerInstance(const QUuid &identifier) override; @@ -88,8 +88,15 @@ public: QIviPendingReply<void> move(const QUuid &identifier, int currentIndex, int newIndex) override; QIviPendingReply<int> indexOf(const QUuid &identifier, const QVariant &item) override; +protected: + void setupConnections(); + bool connectToNode(); + private: + QString m_remoteObjectsLookupName; QSharedPointer<QIviSearchAndBrowseModelReplica> m_replica; + QRemoteObjectNode *m_node; + QUrl m_url; QIviRemoteObjectReplicaHelper *m_helper; }; diff --git a/src/plugins/ivimedia/media_qtro/usbdevice.cpp b/src/plugins/ivimedia/media_qtro/usbdevice.cpp index b5ab341..0576a13 100644 --- a/src/plugins/ivimedia/media_qtro/usbdevice.cpp +++ b/src/plugins/ivimedia/media_qtro/usbdevice.cpp @@ -46,10 +46,7 @@ USBDevice::USBDevice(const QString &name, QObject *parent) : QIviMediaUsbDevice(parent) , m_name(name) { - QUrl url = QUrl(QStringLiteral("local:qtivimedia_") + name); - QRemoteObjectNode *node = new QRemoteObjectNode(url, this); - - m_browseModel = new SearchAndBrowseModel(node, this); + m_browseModel = new SearchAndBrowseModel(this, QStringLiteral("QIviSearchAndBrowseModel_") + name); } QString USBDevice::name() const diff --git a/src/tools/media-simulation-server/qivimediadiscoveryqtroadapter.cpp b/src/tools/media-simulation-server/qivimediadiscoveryqtroadapter.cpp index 8bc739b..98fc70d 100644 --- a/src/tools/media-simulation-server/qivimediadiscoveryqtroadapter.cpp +++ b/src/tools/media-simulation-server/qivimediadiscoveryqtroadapter.cpp @@ -41,6 +41,7 @@ #include "qivimediadiscoveryqtroadapter.h" #include "qivisearchandbrowsemodelqtroadapter.h" +#include "core.h" #include <QIviMediaDevice> #include <QRemoteObjectRegistryHost> @@ -83,20 +84,22 @@ void QIviMediaDiscoveryModelQtRoAdapter::onDeviceRemoved(QIviServiceObject *devi return; emit deviceRemoved(mediaDevice->name()); - auto host = m_hostMap.take(mediaDevice->name()); - qDebug() << "Removing host:" << host->registryUrl().toString(); - delete host; + auto instance = m_hostMap.take(mediaDevice->name()); + + qDebug() << "Removing USB Instance" << mediaDevice->name(); + Core::instance()->host()->disableRemoting(instance); + delete instance; } void QIviMediaDiscoveryModelQtRoAdapter::createDeviceAdapter(QIviMediaDevice *device) { - auto m_host = new QRemoteObjectRegistryHost(QUrl("local:qtivimedia_" + device->name())); - qDebug() << "Adding host at: " << m_host->registryUrl().toString(); + qDebug() << "Adding USB Instance" << device->name(); QIviSearchAndBrowseModelInterface *searchAndBrowseBackend = qivi_interface_cast<QIviSearchAndBrowseModelInterface *>(device->interfaceInstance(QStringLiteral(QIviSearchAndBrowseModel_iid))); searchAndBrowseBackend->initialize(); - m_host->enableRemoting<QIviSearchAndBrowseModelAddressWrapper>(new QIviSearchAndBrowseModelQtRoAdapter(searchAndBrowseBackend)); + auto instance = new QIviSearchAndBrowseModelQtRoAdapter(searchAndBrowseBackend, QStringLiteral("QIviSearchAndBrowseModel_") + device->name()); + Core::instance()->host()->enableRemoting<QIviSearchAndBrowseModelAddressWrapper>(instance); - m_hostMap.insert(device->name(), m_host); + m_hostMap.insert(device->name(), instance); } diff --git a/src/tools/media-simulation-server/qivimediadiscoveryqtroadapter.h b/src/tools/media-simulation-server/qivimediadiscoveryqtroadapter.h index 70193a2..d295ac9 100644 --- a/src/tools/media-simulation-server/qivimediadiscoveryqtroadapter.h +++ b/src/tools/media-simulation-server/qivimediadiscoveryqtroadapter.h @@ -68,7 +68,7 @@ private: void createDeviceAdapter(QIviMediaDevice *device); MediaDiscoveryBackend *m_backend; - QHash<QString, QRemoteObjectRegistryHost*> m_hostMap; + QHash<QString, QObject*> m_hostMap; }; #endif // QIVIMEDIAINDEXERQTROADAPTER_H diff --git a/src/tools/media-simulation-server/qivisearchandbrowsemodelqtroadapter.cpp b/src/tools/media-simulation-server/qivisearchandbrowsemodelqtroadapter.cpp index 631958c..0eaf3cd 100644 --- a/src/tools/media-simulation-server/qivisearchandbrowsemodelqtroadapter.cpp +++ b/src/tools/media-simulation-server/qivisearchandbrowsemodelqtroadapter.cpp @@ -44,8 +44,9 @@ Q_LOGGING_CATEGORY(qLcROQIviSearchAndBrowseModel, "qt.ivi.qivisearchandbrowsemodel.remoteobjects", QtInfoMsg) -QIviSearchAndBrowseModelQtRoAdapter::QIviSearchAndBrowseModelQtRoAdapter(QIviSearchAndBrowseModelInterface *parent) +QIviSearchAndBrowseModelQtRoAdapter::QIviSearchAndBrowseModelQtRoAdapter(QIviSearchAndBrowseModelInterface *parent, const QString &remoteObjectsLookupName) : QIviSearchAndBrowseModelSource(parent) + , m_remoteObjectsLookupName(remoteObjectsLookupName) , m_backend(parent) , m_helper(this, qLcROQIviSearchAndBrowseModel()) { @@ -60,6 +61,11 @@ QIviSearchAndBrowseModelQtRoAdapter::QIviSearchAndBrowseModelQtRoAdapter(QIviSea connect(m_backend, &SearchAndBrowseBackend::queryIdentifiersChanged, this, &QIviSearchAndBrowseModelQtRoAdapter::queryIdentifiersChanged); } +QString QIviSearchAndBrowseModelQtRoAdapter::remoteObjectsLookupName() const +{ + return m_remoteObjectsLookupName; +} + QStringList QIviSearchAndBrowseModelQtRoAdapter::availableContentTypes() const { return m_backend->property("availableContentTypes").toStringList(); diff --git a/src/tools/media-simulation-server/qivisearchandbrowsemodelqtroadapter.h b/src/tools/media-simulation-server/qivisearchandbrowsemodelqtroadapter.h index 7141519..d665204 100644 --- a/src/tools/media-simulation-server/qivisearchandbrowsemodelqtroadapter.h +++ b/src/tools/media-simulation-server/qivisearchandbrowsemodelqtroadapter.h @@ -49,16 +49,17 @@ template <class ObjectType> struct QIviSearchAndBrowseModelAddressWrapper: public QIviSearchAndBrowseModelSourceAPI<ObjectType> { - QIviSearchAndBrowseModelAddressWrapper(ObjectType *object, const QString &name = QStringLiteral("QIviSearchAndBrowseModel")) - : QIviSearchAndBrowseModelSourceAPI<ObjectType>(object, name) + QIviSearchAndBrowseModelAddressWrapper(ObjectType *object) + : QIviSearchAndBrowseModelSourceAPI<ObjectType>(object, object->remoteObjectsLookupName()) {} }; class QIviSearchAndBrowseModelQtRoAdapter : public QIviSearchAndBrowseModelSource { public: - QIviSearchAndBrowseModelQtRoAdapter(QIviSearchAndBrowseModelInterface *parent); + QIviSearchAndBrowseModelQtRoAdapter(QIviSearchAndBrowseModelInterface *parent, const QString& remoteObjectsLookupName = QStringLiteral("QIviSearchAndBrowseModel")); + QString remoteObjectsLookupName() const; QStringList availableContentTypes() const override; public Q_SLOTS: @@ -76,6 +77,7 @@ public Q_SLOTS: void fetchData(const QUuid &identifier, int start, int count) override; private: + QString m_remoteObjectsLookupName; QIviSearchAndBrowseModelInterface *m_backend; QIviRemoteObjectSourceHelper<QIviSearchAndBrowseModelQtRoAdapter> m_helper; }; |