151 lines
5.5 KiB
C++
Executable File
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 ¶mUrl, 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;
|
|
}
|