summaryrefslogtreecommitdiffstats
path: root/src/BobinkClient.cpp
diff options
context:
space:
mode:
authorThomas Vanbesien <tvanbesi@proton.me>2026-02-18 00:18:33 +0100
committerThomas Vanbesien <tvanbesi@proton.me>2026-02-18 00:18:33 +0100
commit1a79ab468d8cc23cfdf28ddfa85d3e03ffddf44c (patch)
treee19d73f0aa00958dc65d19cb2dfc607f2469089b /src/BobinkClient.cpp
parent343169dff6b062074fd3c4a5e240b449ffc4a449 (diff)
downloadBobinkQtOpcUa-1a79ab468d8cc23cfdf28ddfa85d3e03ffddf44c.tar.gz
BobinkQtOpcUa-1a79ab468d8cc23cfdf28ddfa85d3e03ffddf44c.zip
Refactor and document: fix cert filenames, add Doxygen, improve demo
Refactoring (issues 1,3,4,5,7,8,9,10 from review): - Replace hardcoded cert filenames with certFile/keyFile properties - Add 30s timeout to certificate trust QEventLoop - Cache servers() QVariantList instead of rebuilding per call - Validate URLs before passing to QtOpcUa - Use ComboBox valueRole for robust enum mapping - Add certificate trust dialog to demo - Remove unnecessary RowLayout wrapper - Remove debug output from BuildDeps.cmake Documentation: - Add Doxygen file blocks to all C++ files - Document AuthMode enum, toAuthenticationInformation(), key Q_INVOKABLE methods, certificateTrustRequested signal contract - Convert section banners to standard format - Add file/target comments to CMake and QML files
Diffstat (limited to 'src/BobinkClient.cpp')
-rw-r--r--src/BobinkClient.cpp89
1 files changed, 69 insertions, 20 deletions
diff --git a/src/BobinkClient.cpp b/src/BobinkClient.cpp
index ea61583..a067489 100644
--- a/src/BobinkClient.cpp
+++ b/src/BobinkClient.cpp
@@ -1,3 +1,7 @@
+/**
+ * @file BobinkClient.cpp
+ * @brief BobinkClient implementation.
+ */
#include "BobinkClient.h"
#include "BobinkAuth.h"
@@ -12,6 +16,7 @@ static QString defaultPkiDir()
+ QStringLiteral("/pki");
}
+/** @brief Create the standard OPC UA PKI directory tree. */
static void ensurePkiDirs(const QString &base)
{
for (const auto *sub : {"own/certs", "own/private",
@@ -69,7 +74,9 @@ void BobinkClient::setupClient()
this, &BobinkClient::handleFindServersFinished);
}
-// --- Connection properties ---
+/* ======================================
+ * Connection properties
+ * ====================================== */
bool BobinkClient::connected() const { return m_connected; }
@@ -95,7 +102,9 @@ void BobinkClient::setAuth(BobinkAuth *auth)
QOpcUaClient *BobinkClient::opcuaClient() const { return m_client; }
-// --- Connection methods ---
+/* ======================================
+ * Connection methods
+ * ====================================== */
void BobinkClient::connectToServer()
{
@@ -112,7 +121,12 @@ void BobinkClient::connectToServer()
return;
}
- m_client->requestEndpoints(QUrl(m_serverUrl));
+ QUrl url(m_serverUrl);
+ if (!url.isValid()) {
+ emit connectionError(QStringLiteral("Invalid server URL: %1").arg(m_serverUrl));
+ return;
+ }
+ m_client->requestEndpoints(url);
}
void BobinkClient::disconnectFromServer()
@@ -135,7 +149,9 @@ void BobinkClient::rejectCertificate()
m_certLoop->quit();
}
-// --- Discovery properties ---
+/* ======================================
+ * Discovery properties
+ * ====================================== */
QString BobinkClient::discoveryUrl() const { return m_discoveryUrl; }
@@ -169,18 +185,12 @@ const QList<QOpcUaApplicationDescription> &BobinkClient::discoveredServers() con
QVariantList BobinkClient::servers() const
{
- QVariantList list;
- for (const auto &s : m_discoveredServers) {
- QVariantMap entry;
- entry[QStringLiteral("serverName")] = s.applicationName().text();
- entry[QStringLiteral("applicationUri")] = s.applicationUri();
- entry[QStringLiteral("discoveryUrls")] = QVariant::fromValue(s.discoveryUrls());
- list.append(entry);
- }
- return list;
+ return m_serversCache;
}
-// --- PKI ---
+/* ======================================
+ * PKI
+ * ====================================== */
QString BobinkClient::pkiDir() const { return m_pkiDir; }
@@ -193,14 +203,36 @@ void BobinkClient::setPkiDir(const QString &path)
emit pkiDirChanged();
}
+QString BobinkClient::certFile() const { return m_certFile; }
+
+void BobinkClient::setCertFile(const QString &path)
+{
+ if (m_certFile == path)
+ return;
+ m_certFile = path;
+ emit certFileChanged();
+}
+
+QString BobinkClient::keyFile() const { return m_keyFile; }
+
+void BobinkClient::setKeyFile(const QString &path)
+{
+ if (m_keyFile == path)
+ return;
+ m_keyFile = path;
+ emit keyFileChanged();
+}
+
void BobinkClient::applyPki()
{
if (!m_client || m_pkiDir.isEmpty())
return;
QOpcUaPkiConfiguration pki;
- pki.setClientCertificateFile(m_pkiDir + QStringLiteral("/own/certs/BobinkDemo_cert.der"));
- pki.setPrivateKeyFile(m_pkiDir + QStringLiteral("/own/private/BobinkDemo_key.pem"));
+ if (!m_certFile.isEmpty())
+ pki.setClientCertificateFile(m_certFile);
+ if (!m_keyFile.isEmpty())
+ pki.setPrivateKeyFile(m_keyFile);
pki.setTrustListDirectory(m_pkiDir + QStringLiteral("/trusted/certs"));
pki.setRevocationListDirectory(m_pkiDir + QStringLiteral("/trusted/crl"));
pki.setIssuerListDirectory(m_pkiDir + QStringLiteral("/issuers/certs"));
@@ -212,7 +244,9 @@ void BobinkClient::applyPki()
m_client->setApplicationIdentity(pki.applicationIdentity());
}
-// --- Discovery methods ---
+/* ======================================
+ * Discovery methods
+ * ====================================== */
void BobinkClient::startDiscovery()
{
@@ -240,11 +274,17 @@ void BobinkClient::stopDiscovery()
void BobinkClient::doDiscovery()
{
- if (m_client && !m_discoveryUrl.isEmpty())
- m_client->findServers(QUrl(m_discoveryUrl));
+ if (!m_client || m_discoveryUrl.isEmpty())
+ return;
+ QUrl url(m_discoveryUrl);
+ if (!url.isValid())
+ return;
+ m_client->findServers(url);
}
-// --- Private slots ---
+/* ======================================
+ * Private slots
+ * ====================================== */
void BobinkClient::handleStateChanged(QOpcUaClient::ClientState state)
{
@@ -291,6 +331,7 @@ void BobinkClient::handleConnectError(QOpcUaErrorState *errorState)
QEventLoop loop;
m_certLoop = &loop;
+ QTimer::singleShot(30000, &loop, &QEventLoop::quit);
loop.exec();
m_certLoop = nullptr;
@@ -311,5 +352,13 @@ void BobinkClient::handleFindServersFinished(
return;
m_discoveredServers = servers;
+ m_serversCache.clear();
+ for (const auto &s : m_discoveredServers) {
+ QVariantMap entry;
+ entry[QStringLiteral("serverName")] = s.applicationName().text();
+ entry[QStringLiteral("applicationUri")] = s.applicationUri();
+ entry[QStringLiteral("discoveryUrls")] = QVariant::fromValue(s.discoveryUrls());
+ m_serversCache.append(entry);
+ }
emit serversChanged();
}