From d3f3a008ffcd9b8c337717cce48ea55c74f379d0 Mon Sep 17 00:00:00 2001
From: Evgenii Tagiltsev <tagiltsev.ebgenii@gmail.com>
Date: Thu, 25 Jul 2019 11:33:28 +0200
Subject: [PATCH] [*] corrected class for request node network

---
 .../DapChainDashboardService.cpp              |  6 +++
 .../DapChainDashboardService.h                |  3 +-
 .../DapChainNodeNetworkHandler.cpp            | 50 +++++++++++++++++++
 .../DapChainNodeNetworkHandler.h              | 21 ++++++++
 .../KelvinDashboardService.pro                |  4 +-
 5 files changed, 81 insertions(+), 3 deletions(-)
 create mode 100644 KelvinDashboardService/DapChainNodeNetworkHandler.cpp
 create mode 100644 KelvinDashboardService/DapChainNodeNetworkHandler.h

diff --git a/KelvinDashboardService/DapChainDashboardService.cpp b/KelvinDashboardService/DapChainDashboardService.cpp
index ea3a4acf8..587556644 100755
--- a/KelvinDashboardService/DapChainDashboardService.cpp
+++ b/KelvinDashboardService/DapChainDashboardService.cpp
@@ -66,6 +66,12 @@ QStringList DapChainDashboardService::getWalletInfo(const QString &asWalletName)
     return m_pDapChainWalletHandler->getWalletInfo(asWalletName);
 }
 
+QVariant DapChainDashboardService::getNodeNetwork() const
+{
+    qInfo() << QString("getNodeNetwork");
+    return m_pDapChainNodeHandler->getNodeNetwork();
+}
+
 QString DapChainDashboardService::sendToken(const QString &asWalletName, const QString &asReceiverAddr, const QString &asToken, const QString &asAmount)
 {
     qInfo() << QString("sendToken(%1;%2;%3;%4)").arg(asWalletName).arg(asReceiverAddr).arg(asToken).arg(asAmount);
diff --git a/KelvinDashboardService/DapChainDashboardService.h b/KelvinDashboardService/DapChainDashboardService.h
index 626efb736..8f65ad5d6 100755
--- a/KelvinDashboardService/DapChainDashboardService.h
+++ b/KelvinDashboardService/DapChainDashboardService.h
@@ -44,7 +44,7 @@ class DapChainDashboardService : public DapRpcService
 
     DapChainWalletHandler   * m_pDapChainWalletHandler {nullptr};
 
-    DapChainNodeHandler     * m_pDapChainNodeHandler {nullptr};
+    DapChainNodeNetworkHandler     * m_pDapChainNodeHandler {nullptr};
 
 public:
     /// Standard сonstructor.
@@ -80,6 +80,7 @@ public slots:
 
     QString sendToken(const QString &asWalletName, const QString &asReceiverAddr, const QString &asToken, const QString &asAmount);
     
+    QVariant getNodeNetwork() const;
 };
 
 #endif // DAPCHAINDASHBOARDSERVICE_H
diff --git a/KelvinDashboardService/DapChainNodeNetworkHandler.cpp b/KelvinDashboardService/DapChainNodeNetworkHandler.cpp
new file mode 100644
index 000000000..fc7766889
--- /dev/null
+++ b/KelvinDashboardService/DapChainNodeNetworkHandler.cpp
@@ -0,0 +1,50 @@
+#include "DapChainNodeNetworkHandler.h"
+
+DapChainNodeNetworkHandler::DapChainNodeNetworkHandler(QObject *parent) : QObject(parent)
+{
+
+}
+
+QVariant DapChainNodeNetworkHandler::getNodeNetwork() const
+{
+    QProcess process;
+    process.start(QString(CLI_PATH) + " node dump -net kelvin-testnet -full");
+
+    process.waitForFinished(-1);
+    QByteArray result = process.readAll();
+
+    QMap<QString, QVariant> nodeMap;
+    if(!result.isEmpty())
+    {
+        QStringList nodes = QString::fromStdString(result.toStdString()).split("node ");
+        for(int m = 1; m < nodes.count(); m++)
+        {
+            QString node = nodes.at(m);
+            QStringList nodeData;
+            QRegExp rx_node("address ((?:[0-9A-F]{4}::){3}[0-9A-F]{4})\\s+\n"
+                       "cell (0[xX][0-9A-F]{16})((?:\\d{1,3}\\.){3}\\d{1,3})\\s+\n"
+                       "ipv4 ::\\s+\n"
+                       "ipv6\\s+\n"
+                       "alias (\\S+)\\s+\n"
+                       "links (\\d+)\\s+\n");
+
+            rx_node.indexIn(node, 0);
+            for(int i = 2; i < 6; i++) nodeData << rx_node.cap(i);
+
+            if(nodeData.last().toUInt() > 0)
+            {
+                QRegExp rx_links("link\\d+ address : ((?:[0-9A-F]{4}::){3}[0-9A-F]{4})");
+                int pos = 0;
+                while ((pos = rx_links.indexIn(node, pos)) != -1)
+                {
+                    nodeData << rx_links.cap(1);
+                    pos += rx_links.matchedLength();
+                }
+            }
+
+            nodeMap[rx_node.cap(1)] = nodeData;
+        }
+    }
+
+    return nodeMap;
+}
diff --git a/KelvinDashboardService/DapChainNodeNetworkHandler.h b/KelvinDashboardService/DapChainNodeNetworkHandler.h
new file mode 100644
index 000000000..8e51450ff
--- /dev/null
+++ b/KelvinDashboardService/DapChainNodeNetworkHandler.h
@@ -0,0 +1,21 @@
+#ifndef DAPCHAINNODENETWORKHANDLER_H
+#define DAPCHAINNODENETWORKHANDLER_H
+
+#include <QObject>
+#include <QProcess>
+#include <QRegExp>
+#include <QDebug>
+//#include "DapNetworkType.h"
+
+class DapChainNodeNetworkHandler : public QObject
+{
+    Q_OBJECT
+
+public:
+    explicit DapChainNodeNetworkHandler(QObject *parent = nullptr);
+
+public slots:
+    QVariant getNodeNetwork() const;
+};
+
+#endif // DAPCHAINNODENETWORKHANDLER_H
diff --git a/KelvinDashboardService/KelvinDashboardService.pro b/KelvinDashboardService/KelvinDashboardService.pro
index fa11a6d2f..38acef3da 100755
--- a/KelvinDashboardService/KelvinDashboardService.pro
+++ b/KelvinDashboardService/KelvinDashboardService.pro
@@ -39,13 +39,13 @@ DEFINES += QT_DEPRECATED_WARNINGS
 #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
 
 SOURCES += \
+    DapChainNodeNetworkHandler.cpp \
         main.cpp \
     DapChainDashboardService.cpp \
     DapChainNode.cpp \
     DapChainNodeCache.cpp \
     DapChainWalletHandler.cpp \
-    DapChainLogHandler.cpp \
-    DapChainNodeHandler.cpp
+    DapChainLogHandler.cpp
 
 HEADERS += \
     DapChainDashboardService.h \
-- 
GitLab