/** * @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 #include #include #include #include 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> HTTPRequestHandler::getParams(const QString &groupName, QNetworkAccessManager *qNam) { int amount = getAmount(groupName, qNam); QVector> 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 replyList = replyText.splitRef(QRegExp(QLatin1String("\n|\r\n|\r"))); QMap 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 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; }