Files
qt-migration-legatus/qt5-before/dlbo/Lts/Services/AudioVideoManagement/vd_comm.cpp
T
torstenandCopilot 7173785915 Qt6 Migration: Complete migration with DDS/RTI support and build validation
Major Changes:
- Merged latest Qt5 devel content from dlbo (292 files changed, 7 new dirs)
- Consolidated forward-declarations and include folders
- Removed unneeded modules per Niklas' repo check list

Build System Fixes:
- Fixed CMake VERSION_GREATER syntax in ParticipantManagement/CMakeLists.txt
- Added VLC packages (libvlc-dev, vlc-plugin-base) to docker_build.sh
- Added PostgreSQL dev packages (libpq-dev, postgresql-server-dev-all) to Dockerfile
- Fixed locale warnings (ANSI_X3.4-1968 → C.UTF-8)
- Fixed ArcGIS SDK path warnings when BUILD_ARCGIS=OFF

Code Generation Fixes:
- Fixed IDL enum collisions (PortType→CorePortType/DdsutPortType, PdmEventType)
- Fixed Grantlee template svc_translation.cpp.grantlee:
  - Changed {{ idl_enum.name }}_def:: to {{ idl_enum.name }}::
  - Fixed .underlying() calls for C++11 scoped enums (enum class)
- Removed generated files from repo (moc_*, *_dtc.h, *_ftc.h)

Validation:
- BUILD_RTI=ON: SUCCESS
- BUILD_RTI=OFF: SUCCESS
- C++17 standard maintained for RTI 7.7 compatibility
- Ubuntu 26.04 Docker environment verified

Remaining Warnings (expected):
- BgViewer, KDChart, KDReports, Poppler-Qt6 not found (optional features)

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-09-15 18:20:26 +00:00

146 lines
3.8 KiB
C++

/**
* @RDE_HEADER@
* Video download communication
* $Id$
* $HeadURL$
* $Author$
* Created by Astrid Müller, SGAS, 2018-02-22
*/
#include "vd_comm.h"
#include "av_helper.h"
#include <AudioVideoManagement/logger.h>
#include <QString>
#include <QStringList>
#include <QByteArray>
#include <QList>
#include <QTextStream>
#include <cmath>
namespace AudioVideoManagement
{
VdComm::VdComm(const QString &vdHost, quint16 vdPort)
: m_avSocket(vdHost, vdPort, getLogger("VdComm"), getLogger("VdComm.IO"))
, m_logger(getLogger("VdComm"))
, m_loggerIO(getLogger("VdComm.IO"))
{
connect(&m_avSocket, &AVSocketWrapper::readyRead, this, &VdComm::onReadyRead);
connect(&m_avSocket, &AVSocketWrapper::disconnected, this, &VdComm::disconnected); // signal -> signal
}
void VdComm::start()
{
m_avSocket.connectToAVS();
}
void VdComm::forceDisconnect()
{
m_avSocket.disconnectFromHost();
}
void VdComm::switchContext(int exerciseId)
{
m_avSocket.send(QByteArray("switchContext ex_").append(QByteArray::number(exerciseId)));
}
void VdComm::vdSetScript(const QString &scriptName, AvaStreamType typ, int fileSplitting, const QVector<AvaScriptEntry> &streams,
const QString &exportedDirBaseName, const QString &absolutePath)
{
QStringList streamList;
streamList.reserve(streams.size());
for (const auto &stream : streams)
{
// not in db here!
const double vol = pow(10.0, double(stream.db) / 20.0);
streamList += QStringLiteral("{%1} %2 %3 %4 %5 %6 %7")
.arg(stream.name,
QString::number(stream.speed),
QString::number(stream.mute),
toString(stream.start),
toString(stream.stop),
QString::number(stream.pint),
QString::number(vol));
}
static const QString cmd = QStringLiteral(R"(VDSetScript "%1" %2 %3 "%4" "%5" "%6")");
TRACE_LOG(m_loggerIO) << "New Export Script: '" << cmd << "'";
TRACE_LOG(m_logger) << "New Export Script: '" << cmd << "'";
m_avSocket.send(cmd.arg(scriptName).arg(static_cast<int>(typ)).arg(QString::number(fileSplitting), streamList.join(QLatin1Char('\n')),
exportedDirBaseName, absolutePath).toUtf8());
}
void VdComm::vdReleaseScript(const QString &scriptName)
{
static const QString cmd = QStringLiteral(R"(VDReleaseScript "%1")");
m_avSocket.send(cmd.arg(scriptName).toUtf8());
}
void VdComm::keepAlive()
{
static const QString cmd = QStringLiteral("KeepAlive");
m_avSocket.send(cmd.toUtf8());
}
void VdComm::onReadyRead(QTcpSocket *socket)
{
Q_ASSERT(socket);
while (socket->canReadLine())
parseResponse(socket->readLine().trimmed());
}
void VdComm::parseResponse(const QByteArray &line)
{
static const QByteArray GREETER("RCP_VD/1.0");
DEBUG_LOG(m_loggerIO) << "From A/V: '" << line << "'";
if (line == GREETER)
{
emit connected();
return;
}
const auto parts = AVSocket::parseLine(line);
bool couldConvert = false;
Response response = static_cast<Response>(parts.at(0).toInt(&couldConvert));
Q_ASSERT(couldConvert);
switch (response)
{
case Response::Ok:
Q_ASSERT(parts.size() == 2);
emit ok();
break;
case Response::ExportProgress:
{
Q_ASSERT(parts.size() == 3);
int progress = parts.at(1).toInt();
emit scriptExportProgress(progress);
break;
}
case Response::ScriptState:
{
Q_ASSERT(parts.size() == 5);
QString scriptName = QString::fromUtf8(parts.at(1));
AvaStreamState scriptState = static_cast<AvaStreamState>(parts.at(3).toInt(&couldConvert));
Q_ASSERT(couldConvert);
emit scriptStateReceived(scriptName, scriptState);
break;
}
case Response::KeepAlive:
emit keepAliveReceived();
break;
default:
DEBUG_LOG(m_logger) << "Response not implemented: " << line;
}
}
} // namespace AudioVideoManagement