1
0
Fork 0
mirror of https://github.com/HenkKalkwater/harbour-sailfin.git synced 2024-05-12 00:52:43 +00:00
harbour-sailfin/core/src/viewmodel/remotedevice.cpp
Chris Josten b257fe60aa Discover remote sessions
Adds a way of discovering remote sessions and in Jellyfin the UI.
2023-01-02 20:05:41 +01:00

153 lines
5.4 KiB
C++

/*
* Sailfin: a Jellyfin client written using Qt
* Copyright (C) 2022 Chris Josten and the Sailfin Contributors.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <JellyfinQt/viewmodel/remotedevice.h>
#include <JellyfinQt/model/controllablesession.h>
#include <JellyfinQt/viewmodel/playbackmanager.h>
namespace Jellyfin {
namespace ViewModel {
RemoteDeviceList::RemoteDeviceList(QObject *parent)
: QAbstractListModel(parent) {}
void RemoteDeviceList::classBegin() {}
void RemoteDeviceList::componentComplete() {
m_componentComplete = true;
if (m_apiClient != nullptr) {
setApiClient(m_apiClient);
}
}
void RemoteDeviceList::setApiClient(ApiClient *apiClient) {
if (m_apiClient != nullptr) {
for (auto it = m_scanners.begin(); it != m_scanners.end(); it++) {
disconnect(*it, &Model::RemoteSessionScanner::sessionFound, this, &RemoteDeviceList::onSessionFound);
disconnect(*it, &Model::RemoteSessionScanner::sessionLost, this, &RemoteDeviceList::onSessionLost);
disconnect(*it, &Model::RemoteSessionScanner::resetSessions, this, &RemoteDeviceList::onSessionsReset);
}
for (auto it = m_sessions.begin(); it != m_sessions.end(); it++) {
it->first->stopScanning();
it->first->deleteLater();
it->second->deleteLater();
}
m_scanners.clear();
m_sessions.clear();
}
m_apiClient = apiClient;
emit apiClientChanged();
if (!m_componentComplete) return;
m_scanners.append(new Model::RemoteJellyfinSessionScanner(m_apiClient, this));
for (auto it = m_scanners.begin(); it != m_scanners.end(); it++) {
connect(*it, &Model::RemoteSessionScanner::sessionFound, this, &RemoteDeviceList::onSessionFound);
connect(*it, &Model::RemoteSessionScanner::sessionLost, this, &RemoteDeviceList::onSessionLost);
connect(*it, &Model::RemoteSessionScanner::resetSessions, this, &RemoteDeviceList::onSessionsReset);
}
}
int RemoteDeviceList::rowCount(const QModelIndex &parent) const {
return m_sessions.size();
}
QVariant RemoteDeviceList::data(const QModelIndex &index, int role) const {
int row = index.row();
if (!index.isValid() || row < 0 || row > rowCount()) return QVariant();
const QSharedPointer<Model::ControllableSession> session = m_sessions.at(row).second;
if (session.isNull()) return QVariant();
switch (role) {
case RoleNames::jellyfinId:
return session->id();
case RoleNames::name:
return session->name();
case RoleNames::deviceName:
return session->appName();
case RoleNames::deviceType:
return QVariant::fromValue<Model::DeviceType>(session->deviceType());
case RoleNames::userName:
return session->userName();
default:
return QVariant();
}
}
void RemoteDeviceList::activateSession(PlaybackManager *manager, int index) {
manager->setControllingSession(m_sessions.at(index).second);
}
void RemoteDeviceList::setScanning(bool scanning) {
if (scanning == m_scanning) return;
m_scanning = scanning;
emit scanningChanged();
if (scanning) {
for (auto it = m_scanners.begin(); it != m_scanners.end(); it++) {
(*it)->startScanning();
}
} else {
for (auto it = m_scanners.begin(); it != m_scanners.end(); it++) {
(*it)->stopScanning();
}
}
}
void RemoteDeviceList::onSessionFound(Model::ControllableSession *session) {
beginInsertRows(QModelIndex(), rowCount(), rowCount());
m_sessions.append(std::make_pair(qobject_cast<Model::RemoteSessionScanner *>(sender()), QSharedPointer<Model::ControllableSession>(session)));
endInsertRows();
}
void RemoteDeviceList::onSessionLost(QString sessionId) {
Model::RemoteSessionScanner *scanner = qobject_cast<Model::RemoteSessionScanner *>(sender());
for (int i = 0; i < m_sessions.size(); i++) {
auto row = m_sessions.at(i);
if (row.first == scanner && row.second->name() == sessionId) {
beginRemoveRows(QModelIndex(), i, i);
m_sessions.removeAt(i);
if (row.second->parent() == this) {
row.second->deleteLater();
}
endRemoveRows();
i--;
}
}
}
void RemoteDeviceList::onSessionsReset() {
Model::RemoteSessionScanner *scanner = qobject_cast<Model::RemoteSessionScanner *>(sender());
for (int i = 0; i < m_sessions.size(); i++) {
auto row = m_sessions.at(i);
if (row.first == scanner) {
beginRemoveRows(QModelIndex(), i, i);
m_sessions.removeAt(i);
if (row.second->parent() == this) {
row.second->deleteLater();
}
endRemoveRows();
i--;
}
}
}
} // NS Model
} // NS Jellyfin