Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,12 @@ find_package(Qt6 QUIET COMPONENTS Core NO_SYSTEM_ENVIRONMENT_PATH)

if (Qt6_FOUND)
find_package(Qt6 REQUIRED COMPONENTS Network Test)
find_package(Qt6 QUIET COMPONENTS Zlib)
find_package(Qt6 QUIET COMPONENTS Widgets Zlib)
set(Qt_DIR ${QT6_INSTALL_PREFIX})
set(Qt_VERSION ${Qt6_VERSION})
else()
find_package(Qt5 5.15 REQUIRED COMPONENTS Network Test)
find_package(Qt5 QUIET COMPONENTS Zlib)
find_package(Qt5 QUIET COMPONENTS Widgets Zlib)
set(Qt_VERSION ${Qt5_VERSION})
set(Qt_DIR ${Qt5_DIR})
endif()
Expand Down Expand Up @@ -99,6 +99,7 @@ add_subdirectory(http)
add_subdirectory(mdns)
add_subdirectory(qnc)
add_subdirectory(ssdp)
add_subdirectory(upnp)
add_subdirectory(xml)

if (NOT IOS) # FIXME Figure out code signing on Github
Expand Down
4 changes: 2 additions & 2 deletions mdns/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ target_link_libraries(QncMdns PUBLIC QncCore)


if (NOT IOS) # FIXME Figure out code signing on Github
qnc_add_executable(MDNSResolverDemo TYPE tool mdnsresolverdemo.cpp)
target_link_libraries(MDNSResolverDemo PRIVATE QncMdns)
qnc_add_executable(mdnsresolverdemo TYPE tool mdnsresolverdemo.cpp)
target_link_libraries(mdnsresolverdemo PRIVATE QncMdns)
endif()

#if (WIN32)
Expand Down
4 changes: 2 additions & 2 deletions ssdp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@ qnc_add_library(
target_link_libraries(QncSsdp PUBLIC QncHttp)

if (NOT IOS) # FIXME Figure out code signing on Github
qnc_add_executable(SSDPResolverDemo TYPE tool ssdpresolverdemo.cpp)
target_link_libraries(SSDPResolverDemo PRIVATE QncSsdp)
qnc_add_executable(ssdpresolverdemo TYPE tool ssdpresolverdemo.cpp)
target_link_libraries(ssdpresolverdemo PRIVATE QncSsdp)
endif()
1 change: 1 addition & 0 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
add_subdirectory(auto)
add_subdirectory(manual)
2 changes: 2 additions & 0 deletions tests/manual/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
qnc_add_executable(upnpparsertest upnpparsertest.cpp)
target_link_libraries(upnpparsertest PRIVATE QncUpnp)
157 changes: 157 additions & 0 deletions tests/manual/upnpparsertest.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
/* QtNetworkCrumbs - Some networking toys for Qt
* Copyright (C) 2019-2024 Mathias Hasselmann
*/

// QtNetworkCrumbs headers
#include "qncliterals.h"
#include "upnpresolver.h"

// Qt headers
#include <QCommandLineParser>
#include <QCoreApplication>
#include <QDir>

namespace qnc::upnp::tests {
namespace {

class ParserTest : public QCoreApplication
{
public:
using QCoreApplication::QCoreApplication;

int run()
{
const auto ssdpDir = QCommandLineOption{"ssdp"_L1, tr("directory with SSDP files"), tr("DIRPATH")};
const auto scpdDir = QCommandLineOption{"scpd"_L1, tr("directory with SCPD files"), tr("DIRPATH")};
const auto controlDir = QCommandLineOption{"control"_L1, tr("directory with control files"), tr("DIRPATH")};
const auto eventingDir = QCommandLineOption{"eventing"_L1, tr("directory with eventing files"), tr("DIRPATH")};

auto commandLine = QCommandLineParser{};

commandLine.addOption(ssdpDir);
commandLine.addOption(scpdDir);
commandLine.addOption(controlDir);
commandLine.addOption(eventingDir);
commandLine.addHelpOption();

commandLine.process(arguments());

if (!commandLine.positionalArguments().isEmpty()) {
commandLine.showHelp(EXIT_FAILURE);
return EXIT_FAILURE;
}

if (commandLine.isSet(ssdpDir) && !readTestData(commandLine.value(ssdpDir), &ssdpParse))
return EXIT_FAILURE;
if (commandLine.isSet(scpdDir) && !readTestData(commandLine.value(scpdDir), &scpdParse))
return EXIT_FAILURE;

return EXIT_SUCCESS;
}

private:
static bool readTestData(const QString &path, bool (* parse)(QFile *))
{
const auto fileInfo = QFileInfo{path};

if (fileInfo.isDir()) {
const auto &fileInfoList = QDir{path}.entryInfoList(QDir::Files);

for (const auto &fileInfo : fileInfoList) {
if (!readFile(fileInfo, parse))
return false;
}

return true;
} else {
return readFile(fileInfo, parse);
}
}

static bool readFile(const QFileInfo &fileInfo, bool (* parse)(QFile *))
{
qInfo() << QUrl::fromPercentEncoding(fileInfo.fileName().toUtf8());

auto file = QFile{fileInfo.filePath()};
qInfo() << file.fileName();

if (!file.open(QFile::ReadOnly)) {
qWarning() << file.errorString();
return false;
}

if (!parse(&file))
return false;

return true;
}

static bool ssdpParse(QFile *file)
{
const auto &deviceList = DeviceDescription::parse(file);

if (deviceList.isEmpty())
return false;

for (const auto &device : deviceList) {
qInfo() << "-"
<< device.specVersion
<< device.displayName
<< device.deviceType;

for (const auto &service : device.services) {
qInfo() << " -"
<< service.type
<< service.id;
}
}

return true;
}

static bool scpdParse(QFile *file)
{
const auto controlPoint = ControlPointDescription::parse(file);

if (!controlPoint)
return false;

qInfo() << "- actions:";
for (const auto &action : controlPoint->actions) {
qInfo() << " -"
<< action.name
<< action.flags;

for (const auto &argument : action.arguments) {
qInfo() << " -"
<< argument.name
// FIXME: << argument.direction
<< argument.stateVariable;
}
}

qInfo() << "- variables:";
for (const auto &variable : controlPoint->stateVariables) {
qInfo() << " -"
<< variable.name
// FIXME: << variable.dataType
<< variable.defaultValue
<< variable.flags
<< variable.allowedValues
<< variable.valueRange.minimum
<< variable.valueRange.maximum
<< variable.valueRange.step;
}

return true;
}
};

} // namespace
} // namespace qnc::upnp::tests

int main(int argc, char *argv[])
{
return qnc::upnp::tests::ParserTest{argc, argv}.run();
}

19 changes: 19 additions & 0 deletions upnp/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
qnc_add_library(
QncUpnp STATIC
upnpresolver.cpp
upnpresolver.h
upnptreemodel.cpp
upnptreemodel.h
)

target_link_libraries(QncUpnp PUBLIC QncSsdp QncXml)

if (NOT IOS) # FIXME Figure out code signing on Github
qnc_add_executable(upnpresolverdemo TYPE tool upnpresolverdemo.cpp)
target_link_libraries(upnpresolverdemo PRIVATE QncUpnp)

if (TARGET Qt::Widgets)
qnc_add_executable(upnpviewer TYPE tool upnpviewer.cpp)
target_link_libraries(upnpviewer PRIVATE QncUpnp Qt::Widgets)
endif()
endif()
Loading
Loading