Files
qt5-legatus-legacy/Lts/Tools/VapixConfig/httprequesthandler.cpp
T
2026-08-13 18:33:10 +02:00

151 lines
5.5 KiB
C++
Executable File

/**
* @RDE_HEADER@
* HTTPRequestHandler sends requests to Axis Cameras initialized in VapixConfig
* $Id$
* $HeadURL$
* $Author$
* Created by Terrell Scharfenberg, SLSE, 2016-05-27
*/
#include "httprequesthandler.h"
#include <QDebug>
#include <QEventLoop>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QRegularExpression>
using namespace VapixConfig;
HTTPRequestHandler::HTTPRequestHandler()
{}
void HTTPRequestHandler::init(const QString &ip, const QString &password, const QString &username)
{
m_ip = ip;
m_userName = username;
m_password = password;
}
QNetworkReply *HTTPRequestHandler::sendRequest(const QUrl &paramUrl, QNetworkAccessManager *qNam)
{
QNetworkRequest request(paramUrl);
QNetworkReply *reply = qNam->get(request);
// TODO
QEventLoop eventLoop;
QObject::connect(qNam, &QNetworkAccessManager::finished,
&eventLoop, &QEventLoop::quit);
eventLoop.exec();
qDebug() << "Request sent";
return reply;
}
// gets all parameter(configuration) from the camera
QVector<QMap<QString, QString>> HTTPRequestHandler::getParams(const QString &groupName, QNetworkAccessManager *qNam)
{
int amount = getAmount(groupName, qNam);
QVector<QMap<QString, QString>> paramList;
const QString prefix = buildHttpPrefix() + QLatin1String("/axis-cgi/admin/param.cgi?action=list&group=");
QString baseUrl;
paramList.reserve(amount);
for (int i = 0; i < amount; ++i)
{
if (groupName == QLatin1String("Event.*.Actions"))
baseUrl = prefix + QLatin1String("Event.E") + QString::number(i) + QLatin1String(".Actions");
else if (groupName == QLatin1String("EventServers"))
baseUrl = prefix + groupName + QLatin1String(".TCP.T") + QString::number(i);
else if (groupName == QLatin1String("Motion"))
baseUrl = prefix + groupName + QLatin1String(".M") + QString::number(i);
else if (groupName == QLatin1String("Event"))
baseUrl = prefix + groupName + QLatin1String(".E") + QString::number(i);
else if (groupName == QLatin1String("Image"))
baseUrl = prefix + groupName + QLatin1String(".I0.Appearance.Resolution");
else
qDebug() << "Error: Groupname does not exist";
QUrl requestUrl(baseUrl);
QNetworkReply *reply = sendRequest(requestUrl, qNam);
QByteArray replyBytes = reply->readAll();
QString replyText = QString::fromUtf8(replyBytes.data(), replyBytes.size());
QRegularExpression re(QLatin1String("(\\w++=[^_]++)"));
const QVector<QStringRef> replyList = replyText.splitRef(QRegExp(QLatin1String("\n|\r\n|\r")));
QMap<QString, QString> paramMap;
for (const QStringRef &string : replyList)
{
QRegularExpressionMatch match = re.match(string, 0, QRegularExpression::PartialPreferCompleteMatch);
if (!match.captured(0).isNull())
{
const QStringList sl = match.captured(0).split(QLatin1Char('='));
paramMap[sl.at(0)] = sl.at(1);
}
}
reply->deleteLater();
paramList.append(paramMap);
paramMap.clear();
}
return paramList;
}
//removes all modified parameter
void HTTPRequestHandler::removeParams(const QString &groupName, QNetworkAccessManager *qNam)
{
const QString prefix = buildHttpPrefix() + QLatin1String("/axis-cgi/admin/param.cgi?action=list&group=");
QUrl requestUrl(prefix + groupName);
QNetworkReply *reply = sendRequest(requestUrl, qNam);
QByteArray replyBytes = reply->readAll();
QString replyText = QString::fromUtf8(replyBytes.data(), replyBytes.size());
QRegularExpression re(QLatin1String("(\\b\\w{2}\\b)"));
const QVector<QStringRef> replyList = replyText.splitRef(QRegExp(QLatin1String("\n|\r\n|\r")));
QStringList tempList;
for (const QStringRef &string : replyList)
{
QRegularExpressionMatch match = re.match(string, 0, QRegularExpression::NormalMatch);
if (match.capturedRef(0).isNull())
continue;
const QString removeUrl = buildHttpPrefix() + QLatin1String("/axis-cgi/admin/param.cgi?action=remove&group=") +
groupName + QLatin1Char('.') + match.captured(0);
tempList.append(removeUrl);
}
tempList.removeDuplicates();
for (const QString &string : qAsConst(tempList))
{
QUrl url;
url.setUrl(string);
sendRequest(url, qNam);
}
reply->deleteLater();
}
//method to get how many parameter are configurated multiple times
int HTTPRequestHandler::getAmount(const QString &groupName, QNetworkAccessManager *qNam)
{
const QString reqStr = buildHttpPrefix() + QLatin1String("/axis-cgi/admin/param.cgi?action=list&group=");
QString baseUrl;
if (groupName == QLatin1String("Event.*.Actions"))
baseUrl = reqStr + groupName + QLatin1String(".*.Protocol");
else if (groupName == QLatin1String("EventServers"))
baseUrl = reqStr + groupName + QLatin1String(".TCP.*.Name");
else if (groupName == QLatin1String("Image"))
baseUrl = reqStr + groupName + QLatin1String(".I0.Appearance.Resolution");
else
baseUrl = reqStr + groupName + QLatin1String(".*.Name");
QUrl requestUrl(baseUrl);
QNetworkReply *reply = sendRequest(requestUrl, qNam);
QByteArray replyBytes = reply->readAll();
QString bytesString = QString::fromUtf8(replyBytes.data(), replyBytes.size());
QString replyText = QVariant(bytesString).toString();
QStringList replyList = replyText.split(QRegExp(QLatin1String("\n|\r\n|\r")));
reply->deleteLater();
return replyList.count() - 1;
}
QString HTTPRequestHandler::buildHttpPrefix() const
{
QString prefix = QLatin1String("http://");
if (!m_userName.isEmpty())
prefix += m_userName + QLatin1Char(':');
if (!m_password.isEmpty())
prefix += m_password + QLatin1Char('@');
prefix += m_ip;
return prefix;
}