diff options
Diffstat (limited to 'src/plugins/ivimedia/media_qtro')
10 files changed, 269 insertions, 103 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 |