diff --git a/src/blackcore/afv/clients/afvclient.cpp b/src/blackcore/afv/clients/afvclient.cpp index 4fac19f47..52e9a5b36 100644 --- a/src/blackcore/afv/clients/afvclient.cpp +++ b/src/blackcore/afv/clients/afvclient.cpp @@ -70,6 +70,8 @@ namespace BlackCore if (m_connection->isConnected()) { emit connectionStatusChanged(Connected); } else { emit connectionStatusChanged(Disconnected); } + + m_connection->getAllAliasedStations(); } void AFVClient::disconnectFrom() diff --git a/src/blackcore/afv/connection/apiserverconnection.cpp b/src/blackcore/afv/connection/apiserverconnection.cpp index f7f774310..f35f4dd44 100644 --- a/src/blackcore/afv/connection/apiserverconnection.cpp +++ b/src/blackcore/afv/connection/apiserverconnection.cpp @@ -125,6 +125,12 @@ namespace BlackCore m_jwt.clear(); } + QVector ApiServerConnection::getAllAliasedStations() + { + getAsVector("/api/v1/stations/aliased"); + return {}; + } + void ApiServerConnection::postNoResponse(const QString &resource, const QJsonDocument &json) { if (isShuttingDown()) { return; } // avoid crash diff --git a/src/blackcore/afv/connection/apiserverconnection.h b/src/blackcore/afv/connection/apiserverconnection.h index 85ce1882c..f126f91c9 100644 --- a/src/blackcore/afv/connection/apiserverconnection.h +++ b/src/blackcore/afv/connection/apiserverconnection.h @@ -56,6 +56,8 @@ namespace BlackCore void forceDisconnect(); + QVector getAllAliasedStations(); + private: template TResponse postNoRequest(const QString &resource) @@ -78,7 +80,7 @@ namespace BlackCore QNetworkRequest request(url); request.setRawHeader("Authorization", "Bearer " + m_jwt); - QNetworkReply *reply = nam->post(request, QByteArray()); + QScopedPointer reply(nam->post(request, QByteArray())); while (! reply->isFinished()) { loop.exec(); } qDebug() << "POST" << resource << "(" << m_watch.elapsed() << "ms)"; @@ -90,11 +92,55 @@ namespace BlackCore const QJsonDocument doc = QJsonDocument::fromJson(reply->readAll()); TResponse response = TResponse::fromJson(doc.object()); - - reply->deleteLater(); return response; } + template + QVector getAsVector(const QString &resource) + { + if (! m_isAuthenticated) + { + qDebug() << "Not authenticated"; + return {}; + } + + checkExpiry(); + + QNetworkAccessManager *nam = sApp->getNetworkAccessManager(); + + m_watch.start(); + QUrl url(m_address); + url.setPath(resource); + QEventLoop loop; + connect(nam, &QNetworkAccessManager::finished, &loop, &QEventLoop::quit); + + QNetworkRequest request(url); + request.setRawHeader("Authorization", "Bearer " + m_jwt); + QScopedPointer reply(nam->get(request)); + while (! reply->isFinished()) { loop.exec(); } + qDebug() << "GET" << resource << "(" << m_watch.elapsed() << "ms)"; + + if (reply->error() != QNetworkReply::NoError) + { + qWarning() << "GET" << resource << "failed:" << reply->errorString(); + return {}; + } + + const QJsonDocument jsonDoc = QJsonDocument::fromJson(reply->readAll()); + QVector dtos; + if (jsonDoc.isArray()) + { + QJsonArray rootArray = jsonDoc.array(); + for (auto o : rootArray) + { + QJsonObject d = o.toObject(); + TResponse dto = TResponse::fromJson(d); + dtos.push_back(dto); + } + } + return dtos; + } + void postNoResponse(const QString &resource, const QJsonDocument &json); void deleteResource(const QString &resource); void checkExpiry(); diff --git a/src/blackcore/afv/connection/clientconnection.cpp b/src/blackcore/afv/connection/clientconnection.cpp index 2a9aa3dd0..0ece86f1b 100644 --- a/src/blackcore/afv/connection/clientconnection.cpp +++ b/src/blackcore/afv/connection/clientconnection.cpp @@ -97,6 +97,11 @@ namespace BlackCore m_apiServerConnection.updateTransceivers(callsign, transceivers); } + QVector ClientConnection::getAllAliasedStations() + { + return m_apiServerConnection.getAllAliasedStations(); + } + void ClientConnection::connectToVoiceServer() { QHostAddress localAddress(QHostAddress::AnyIPv4); diff --git a/src/blackcore/afv/connection/clientconnection.h b/src/blackcore/afv/connection/clientconnection.h index d5c60fc2b..e75b8c3c6 100644 --- a/src/blackcore/afv/connection/clientconnection.h +++ b/src/blackcore/afv/connection/clientconnection.h @@ -64,6 +64,8 @@ namespace BlackCore void updateTransceivers(const QString &callsign, const QVector &transceivers); + QVector getAllAliasedStations(); + signals: void audioReceived(const AudioRxOnTransceiversDto &dto); diff --git a/src/blackcore/afv/dto.h b/src/blackcore/afv/dto.h index 54f8f04d3..bec115db7 100644 --- a/src/blackcore/afv/dto.h +++ b/src/blackcore/afv/dto.h @@ -16,6 +16,7 @@ #include #include #include +#include namespace BlackCore { @@ -137,6 +138,24 @@ namespace BlackCore } }; + struct StationDto + { + QUuid id; + QString name; + quint32 frequency; + quint32 frequencyAlias; + + static StationDto fromJson(const QJsonObject &json) + { + StationDto dto; + dto.id = json.value("id").toString(); + dto.name = json.value("name").toString(); + dto.frequency = json.value("frequency").toInt(); + dto.frequencyAlias = json.value("frequencyAlias").toInt(); + return dto; + } + }; + struct HeartbeatDto { static QByteArray getDtoName() { return "HeartbeatDto"; }