summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDominik Holland <dominik.holland@pelagicore.com>2019-07-31 15:13:02 +0200
committerDominik Holland <dominik.holland@pelagicore.com>2019-08-01 16:02:22 +0200
commit4e9b53ecb262d90ea58c287325294b5c645d7ca0 (patch)
treea3901c9075ac5731c9814a3fbaba367d7dbeecbb
parent7297377a0b954ae39d00ea3a5a2bc66250a92ff2 (diff)
downloadqtivi-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>
-rw-r--r--src/plugins/ivimedia/media_qtro/mediadiscoverybackend.cpp70
-rw-r--r--src/plugins/ivimedia/media_qtro/mediadiscoverybackend.h8
-rw-r--r--src/plugins/ivimedia/media_qtro/mediaindexerbackend.cpp67
-rw-r--r--src/plugins/ivimedia/media_qtro/mediaindexerbackend.h8
-rw-r--r--src/plugins/ivimedia/media_qtro/mediaplayerbackend.cpp95
-rw-r--r--src/plugins/ivimedia/media_qtro/mediaplayerbackend.h8
-rw-r--r--src/plugins/ivimedia/media_qtro/mediaplugin.cpp18
-rw-r--r--src/plugins/ivimedia/media_qtro/searchandbrowsemodel.cpp84
-rw-r--r--src/plugins/ivimedia/media_qtro/searchandbrowsemodel.h9
-rw-r--r--src/plugins/ivimedia/media_qtro/usbdevice.cpp5
-rw-r--r--src/tools/media-simulation-server/qivimediadiscoveryqtroadapter.cpp17
-rw-r--r--src/tools/media-simulation-server/qivimediadiscoveryqtroadapter.h2
-rw-r--r--src/tools/media-simulation-server/qivisearchandbrowsemodelqtroadapter.cpp8
-rw-r--r--src/tools/media-simulation-server/qivisearchandbrowsemodelqtroadapter.h8
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 &currentTrack) {
- 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 &currentTrack) {
+ 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;
};