diff --git a/KelvinDashboardGUI/DapCommandController.cpp b/KelvinDashboardGUI/DapCommandController.cpp index e475a6b357a693c5841cfc0475c2b6213a0047c5..e989edf3624214094fb7862b2e373e699213ed9a 100755 --- a/KelvinDashboardGUI/DapCommandController.cpp +++ b/KelvinDashboardGUI/DapCommandController.cpp @@ -52,12 +52,18 @@ void DapCommandController::getNodeLogs() connect(reply, SIGNAL(finished()), this, SLOT(processGetNodeLogs())); } -void DapCommandController::setListenerHistory() +void DapCommandController::getHistory() { DapRpcServiceReply *reply = m_DAPRpcSocket->invokeRemoteMethod("RPCServer.getHistory"); connect(reply, SIGNAL(finished()), this, SLOT(processGetHistory())); } +void DapCommandController::setNewHistory(const QVariant& aData) +{ + qDebug() << "new story" << aData; + emit sendHistory(aData); +} + void DapCommandController::processChangedLog() { // QStringList tempLogModel; @@ -181,9 +187,10 @@ void DapCommandController::processExecuteCommand() void DapCommandController::processGetHistory() { - qInfo() << "processGetHistory()"; + qDebug() << "processGetHistory()"; DapRpcServiceReply *reply = static_cast<DapRpcServiceReply *>(sender()); - emit sendHistory(reply->response().result().toVariant()); + QVariant result = reply->response().result().toArray().toVariantList(); + emit sendHistory(result); } /// Show or hide GUI client by clicking on the tray icon. diff --git a/KelvinDashboardGUI/DapCommandController.h b/KelvinDashboardGUI/DapCommandController.h index 75c4546766a1e14f3537a2eeefc3e2c1faf5dba3..05758ec7a5793bfa0a1b964bdaa3193f4bbb4282 100755 --- a/KelvinDashboardGUI/DapCommandController.h +++ b/KelvinDashboardGUI/DapCommandController.h @@ -110,7 +110,9 @@ public slots: /// Get node logs. void getNodeLogs(); - void setListenerHistory(); + void getHistory(); + + void setNewHistory(const QVariant& aData); }; #endif // COMMANDCONTROLLER_H diff --git a/KelvinDashboardGUI/DapScreenHistoryFilterModel.cpp b/KelvinDashboardGUI/DapScreenHistoryFilterModel.cpp index ed91771e3ae5e8340757923288bd1cf8e5e08eab..26675588cd82c02e735b002db8dacfec19433f5a 100644 --- a/KelvinDashboardGUI/DapScreenHistoryFilterModel.cpp +++ b/KelvinDashboardGUI/DapScreenHistoryFilterModel.cpp @@ -25,7 +25,7 @@ void DapScreenHistoryFilterModel::setFilterDate(const QDateTime& aDateLeft, cons m_dateRight = aDateRight; } -void DapScreenHistoryFilterModel::setFilterStatus(const DapScreenHistoryModel::DapTransactionStatus aStatus) +void DapScreenHistoryFilterModel::setFilterStatus(const DapTransactionStatus aStatus) { if(m_status == aStatus) return; m_status = aStatus; diff --git a/KelvinDashboardGUI/DapScreenHistoryFilterModel.h b/KelvinDashboardGUI/DapScreenHistoryFilterModel.h index 44f63308f0b805bb5b4dc6f749b0a9d61e8de647..606cc0c45211bae23b63dcfcc5cc0209242805fe 100644 --- a/KelvinDashboardGUI/DapScreenHistoryFilterModel.h +++ b/KelvinDashboardGUI/DapScreenHistoryFilterModel.h @@ -26,7 +26,7 @@ public: public slots: void setFilterWallet(const QString& aWalletNumber); void setFilterDate(const QDateTime& aDateLeft, const QDateTime& aDateRight); - void setFilterStatus(const DapScreenHistoryModel::DapTransactionStatus aStatus); + void setFilterStatus(const DapTransactionStatus aStatus); }; #endif // DAPSCREENHISTORYFILTERMODEL_H diff --git a/KelvinDashboardGUI/DapScreenHistoryModel.cpp b/KelvinDashboardGUI/DapScreenHistoryModel.cpp index e376050858f1a022f5701a1279aa55cc9d4f932b..2fd022bb7bf7a8298df91db5990df6f81ca9f93e 100644 --- a/KelvinDashboardGUI/DapScreenHistoryModel.cpp +++ b/KelvinDashboardGUI/DapScreenHistoryModel.cpp @@ -26,6 +26,7 @@ QHash<int, QByteArray> DapScreenHistoryModel::roleNames() const void DapScreenHistoryModel::receiveNewData(const QVariant& aData) { + if(!aData.isValid()) return; beginResetModel(); QList<QVariant> dataList = aData.toList(); m_elementList.clear(); @@ -43,7 +44,7 @@ void DapScreenHistoryModel::receiveNewData(const QVariant& aData) QStringList dataItem = dataList.at(i).toStringList(); DapTransactionItem item; - item.Date = QDateTime::fromString(dataItem.at(0), "ddd MMM dd h:mm:ss YYYY"); + item.Date = QDateTime::fromString(dataItem.at(0), Qt::RFC2822Date); item.Status = static_cast<DapTransactionStatus>(dataItem.at(1).toInt()); item.Cryptocurrency = dataItem.at(2); item.TokenName = dataItem.at(3); @@ -75,7 +76,7 @@ QVariant DapScreenHistoryModel::data(const QModelIndex &index, int role) const } case DisplayNameTokenRole: return m_elementList.at(index.row()).TokenName; case DisplayNumberWalletRole: return m_elementList.at(index.row()).WalletNumber; - case DisplayStatusRole: return m_elementList.at(index.row()).Status; + case DisplayStatusRole: return DapTransactionStatusConvertor::getLongStatus(m_elementList.at(index.row()).Status); case DisplayCryptocurrency: return m_elementList.at(index.row()).Cryptocurrency; case DisplayCurrency: return m_elementList.at(index.row()).Currency; default: return QVariant(); diff --git a/KelvinDashboardGUI/DapScreenHistoryModel.h b/KelvinDashboardGUI/DapScreenHistoryModel.h index db75a9a238a502783c69ba9602d85c0a02cfc01d..5bf8797f9b96e7bc926702256d37cc4706f5c1f3 100644 --- a/KelvinDashboardGUI/DapScreenHistoryModel.h +++ b/KelvinDashboardGUI/DapScreenHistoryModel.h @@ -5,6 +5,7 @@ #include <QImage> #include <QAbstractListModel> #include <QDateTime> +#include "DapHistoryType.h" #define MASK_FOR_MODEL QString("MMMM, dd") @@ -13,23 +14,23 @@ class DapScreenHistoryModel : public QAbstractListModel Q_OBJECT public: - enum DapTransactionStatus { - Pending, - Sent, - Received, - Error - }; - Q_ENUM(DapTransactionStatus) - - struct DapTransactionItem { - QDateTime Date; - QImage TokenPic; - DapTransactionStatus Status; - QString TokenName; - QString WalletNumber; - QString Cryptocurrency; - QString Currency; - }; +// enum DapTransactionStatus { +// Pending, +// Sent, +// Received, +// Error +// }; +// Q_ENUM(DapTransactionStatus) + +// struct DapTransactionItem { +// QDateTime Date; +// QImage TokenPic; +// DapTransactionStatus Status; +// QString TokenName; +// QString WalletNumber; +// QString Cryptocurrency; +// QString Currency; +// }; enum { DisplayDateRole = Qt::UserRole, diff --git a/KelvinDashboardGUI/DapServiceController.cpp b/KelvinDashboardGUI/DapServiceController.cpp index bc97ed80e8a602add2a22e5c7ce9979fd270795e..de0442e0864b8602f52572651658e71248d5adbc 100755 --- a/KelvinDashboardGUI/DapServiceController.cpp +++ b/KelvinDashboardGUI/DapServiceController.cpp @@ -57,6 +57,8 @@ void DapServiceController::init(DapServiceClient *apDapServiceClient) connect(&DapChainNodeNetworkModel::getInstance(), SIGNAL(requestNodeStatus(bool)), this, SLOT(setNodeStatus(bool))); connect(m_pDapCommandController, SIGNAL(sendHistory(QVariant)), this, SLOT(processGetHistory(QVariant))); + + connect(m_pDapCommandController, &DapCommandController::sendHistory, &DapScreenHistoryModel::getInstance(), &DapScreenHistoryModel::receiveNewData); } QString DapServiceController::getBrand() const @@ -178,6 +180,11 @@ void DapServiceController::getWalletInfo(const QString &asWalletName) m_pDapCommandController->getWalletInfo(asWalletName); } +void DapServiceController::getHistory() +{ + m_pDapCommandController->getHistory(); +} + void DapServiceController::getNodeNetwork() { qInfo() << QString("requestNodeNetwork"); diff --git a/KelvinDashboardGUI/DapServiceController.h b/KelvinDashboardGUI/DapServiceController.h index 83cbef79fdd44cd960639a74b0d26b42a587cab3..4ca69571e27416f8cb27a24fb9011766e9d67aa9 100755 --- a/KelvinDashboardGUI/DapServiceController.h +++ b/KelvinDashboardGUI/DapServiceController.h @@ -82,6 +82,8 @@ public: void getWalletInfo(const QString& asWalletName); + void getHistory(); + signals: /// The signal is emitted when the Brand company property changes. void brandChanged(const QString &brand); diff --git a/KelvinDashboardGUI/main.cpp b/KelvinDashboardGUI/main.cpp index b9143429363d915cfff2f90007c29669adbf690d..bb90a7cb9530b38eae7d9bccc75e42bd28110826 100755 --- a/KelvinDashboardGUI/main.cpp +++ b/KelvinDashboardGUI/main.cpp @@ -53,6 +53,7 @@ int main(int argc, char *argv[]) dapServiceClient.init(); controller.getNodeLogs(0, 100); controller.getWallets(); + controller.getHistory(); DapScreenHistoryFilterModel::getInstance() .setSourceModel(&DapScreenHistoryModel::getInstance()); diff --git a/KelvinDashboardService/DapChainDashboardService.cpp b/KelvinDashboardService/DapChainDashboardService.cpp index 59fbf897af40c20c938e2d92cfff904b23af3012..6f01f3b2e9e5a45d23fbdc4495e1c067a3455fb7 100755 --- a/KelvinDashboardService/DapChainDashboardService.cpp +++ b/KelvinDashboardService/DapChainDashboardService.cpp @@ -10,6 +10,12 @@ DapChainDashboardService::DapChainDashboardService() : DapRpcService(nullptr) connect(this, &DapChainDashboardService::onNewClientConnected, [=] { qDebug() << "New client"; }); + + m_pDapChainNodeHandler = new DapChainNodeNetworkHandler(this); + + m_pDapChainHistoryHandler = new DapChainHistoryHandler {this}; + QObject::connect(m_pDapChainHistoryHandler, &DapChainHistoryHandler::requsetWallets, this, &DapChainDashboardService::doRequestWallets); + QObject::connect(m_pDapChainHistoryHandler, &DapChainHistoryHandler::changeHistory, this, &DapChainDashboardService::doSendNewHistory); } bool DapChainDashboardService::start() @@ -63,8 +69,9 @@ QMap<QString, QVariant> DapChainDashboardService::getWallets() QStringList DapChainDashboardService::getWalletInfo(const QString &asWalletName) { - qInfo() << QString("getWalletInfo(%1)").arg(asWalletName); - return m_pDapChainWalletHandler->getWalletInfo(asWalletName); +// qInfo() << QString("getWalletInfo(%1)").arg(asWalletName); +// return m_pDapChainWalletHandler->getWalletInfo(asWalletName); + return QStringList(); } QVariant DapChainDashboardService::getNodeNetwork() const @@ -77,6 +84,24 @@ void DapChainDashboardService::setNodeStatus(const bool aIsOnline) m_pDapChainNodeHandler->setNodeStatus(aIsOnline); } +QVariant DapChainDashboardService::getHistory() const +{ + return m_pDapChainHistoryHandler->getHistory(); +} + +void DapChainDashboardService::doRequestWallets() +{ + m_pDapChainHistoryHandler->onRequestNewHistory(m_pDapChainWalletHandler->getWallets()); +} + +void DapChainDashboardService::doSendNewHistory(const QVariant& aData) +{ + if(!aData.isValid()) return; + QVariantList params = QVariantList() << aData; + DapRpcMessage request = DapRpcMessage::createRequest("RPCClient.setNewHistory", QJsonArray::fromVariantList(params)); + m_pServer->notifyConnectedClients(request); +} + 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 b5717ee9abace9593fda952e9b49d7543a3b4ca7..22ce4d49653dc2a093c103058e6ee8a26a2f97eb 100755 --- a/KelvinDashboardService/DapChainDashboardService.h +++ b/KelvinDashboardService/DapChainDashboardService.h @@ -26,6 +26,7 @@ #include "DapChainLogHandler.h" #include "DapChainWalletHandler.h" #include "DapChainNodeNetworkHandler.h" +#include "DapChainHistoryHandler.h" #include <QLocalServer> typedef class DapRpcLocalServer DapUiService; @@ -46,6 +47,8 @@ class DapChainDashboardService : public DapRpcService DapChainNodeNetworkHandler * m_pDapChainNodeHandler {nullptr}; + DapChainHistoryHandler* m_pDapChainHistoryHandler {nullptr}; + public: /// Standard Ñonstructor. explicit DapChainDashboardService(); @@ -86,6 +89,12 @@ public slots: QVariant getNodeNetwork() const; void setNodeStatus(const bool aIsOnline); + + QVariant getHistory() const; + +private slots: + void doRequestWallets(); + void doSendNewHistory(const QVariant& aData); }; #endif // DAPCHAINDASHBOARDSERVICE_H diff --git a/KelvinDashboardService/DapChainHistoryHandler.cpp b/KelvinDashboardService/DapChainHistoryHandler.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6645da84bb6e1ec90ebb2936477d330e233fd84e --- /dev/null +++ b/KelvinDashboardService/DapChainHistoryHandler.cpp @@ -0,0 +1,55 @@ +#include "DapChainHistoryHandler.h" + +DapChainHistoryHandler::DapChainHistoryHandler(QObject *parent) : + QObject(parent) +{ + m_timoutRequestHistory = new QTimer(this); + QObject::connect(m_timoutRequestHistory, &QTimer::timeout, this, &DapChainHistoryHandler::requsetWallets, Qt::QueuedConnection); + m_timoutRequestHistory->start(3000); +} + +QVariant DapChainHistoryHandler::getHistory() const +{ +// qDebug() << "get story" << m_history; + + return m_history; +} + +void DapChainHistoryHandler::onRequestNewHistory(const QMap<QString, QVariant>& aWallets) +{ + if(m_wallets != aWallets.values()) + m_wallets = aWallets.values(); + + if(m_wallets.isEmpty()) return; + + QList<QVariant> data; + for(int i = 0; i < m_wallets.count(); i++) + { + QProcess process; + process.start(QString(CLI_PATH) + " tx_history -net private -chain gdb -addr " + m_wallets.at(i).toString()); + process.waitForFinished(-1); + + QByteArray result = process.readAll(); + + if(!result.isEmpty()) + { + QRegExp reg("(\\w{3}\\s\\w{3}\\s\\d+\\s\\d{1,2}:\\d{2}:\\d{2}\\s\\d{4}).+" + "\\s(\\w+)\\s(\\d+)\\s(\\w+)\\s\\w+\\s+(\\w+)"); + + int pos = 0; + while ((pos = reg.indexIn(result, pos)) != -1) + { + QStringList dataItem = QStringList() << reg.cap(1) << QString::number(DapTransactionStatusConvertor::getStatusByShort(reg.cap(2))) << reg.cap(3) << reg.cap(4) << reg.cap(5) << m_wallets.at(i).toString(); + data.append(dataItem); + pos += reg.matchedLength(); + } + } + } + + + if(m_history != data) + { + m_history = data; + emit changeHistory(m_history); + } +} diff --git a/KelvinDashboardService/DapChainHistoryHandler.h b/KelvinDashboardService/DapChainHistoryHandler.h new file mode 100644 index 0000000000000000000000000000000000000000..0f81af029ae890263708ea30baea384b8fed23e7 --- /dev/null +++ b/KelvinDashboardService/DapChainHistoryHandler.h @@ -0,0 +1,35 @@ +#ifndef DAPCHAINHISTORYHANDLER_H +#define DAPCHAINHISTORYHANDLER_H + +#include <QObject> +#include <QVariantList> +#include <QTimer> +#include <QProcess> +#include <QDebug> +#include <QList> + +#include "DapHistoryType.h" + +class DapChainHistoryHandler : public QObject +{ + Q_OBJECT + +private: + QList<QVariant> m_wallets; + QVariant m_history; + QTimer* m_timoutRequestHistory; + +public: + explicit DapChainHistoryHandler(QObject *parent = nullptr); + + QVariant getHistory() const; + +public slots: + void onRequestNewHistory(const QMap<QString, QVariant>& aWallets); + +signals: + void requsetWallets(); + void changeHistory(QVariant); +}; + +#endif // DAPCHAINHISTORYHANDLER_H diff --git a/KelvinDashboardService/KelvinDashboardService.pro b/KelvinDashboardService/KelvinDashboardService.pro index 69994d7c9e4ad047153916d909ef5b0d5b510b9f..bce4996d1cb0c4318565821c810a200806d86666 100755 --- a/KelvinDashboardService/KelvinDashboardService.pro +++ b/KelvinDashboardService/KelvinDashboardService.pro @@ -41,21 +41,23 @@ 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 + $$PWD/DapChainHistoryHandler.cpp \ + $$PWD/DapChainNodeNetworkHandler.cpp \ + $$PWD/main.cpp \ + $$PWD/DapChainDashboardService.cpp \ + $$PWD/DapChainNode.cpp \ + $$PWD/DapChainNodeCache.cpp \ + $$PWD/DapChainWalletHandler.cpp \ + $$PWD/DapChainLogHandler.cpp HEADERS += \ - DapChainDashboardService.h \ - DapChainNode.h \ - DapChainNodeCache.h \ - DapChainNodeNetworkHandler.h \ - DapChainWalletHandler.h \ - DapChainLogHandler.h + $$PWD/DapChainDashboardService.h \ + $$PWD/DapChainHistoryHandler.h \ + $$PWD/DapChainNode.h \ + $$PWD/DapChainNodeCache.h \ + $$PWD/DapChainNodeNetworkHandler.h \ + $$PWD/DapChainWalletHandler.h \ + $$PWD/DapChainLogHandler.h include (../libdap/libdap.pri) include (../libdap-crypto/libdap-crypto.pri) @@ -74,4 +76,4 @@ unix: !mac : !android { } RESOURCES += \ - KelvinDashboardService.qrc + $$PWD/KelvinDashboardService.qrc diff --git a/libKelvinDashboardCommon/DapHistoryType.cpp b/libKelvinDashboardCommon/DapHistoryType.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d143f860e076faef257b3ebae6aa079b6b52798f --- /dev/null +++ b/libKelvinDashboardCommon/DapHistoryType.cpp @@ -0,0 +1,41 @@ +#include "DapHistoryType.h" + +const QMap<DapTransactionStatus, QStringList> DapTransactionStatusConvertor::m_statusMap = +{ + {stSent, QStringList() << "send" << "Sent"}, + {stReceived, QStringList() << "recv" << "Received"}, +}; + +QString DapTransactionStatusConvertor::getShortStatus(const DapTransactionStatus aStatus) +{ + if(!m_statusMap.contains(aStatus)) return QString(); + return m_statusMap[aStatus].at(0); +} + +QString DapTransactionStatusConvertor::getLongStatus(const DapTransactionStatus aStatus) +{ + if(!m_statusMap.contains(aStatus)) return QString(); + return m_statusMap[aStatus].at(1); +} + +DapTransactionStatus DapTransactionStatusConvertor::getStatusByShort(const QString& aShortStatus) +{ + for(auto item = m_statusMap.constBegin(); item != m_statusMap.constEnd(); item++) + { + if(item.value().at(0) == aShortStatus) + return item.key(); + } + + return stUnknow; +} + +DapTransactionStatus DapTransactionStatusConvertor::getStatusByLong(const QString& aLongStatus) +{ + for(auto item = m_statusMap.constBegin(); item != m_statusMap.constEnd(); item++) + { + if(item.value().at(1) == aLongStatus) + return item.key(); + } + + return stUnknow; +} diff --git a/libKelvinDashboardCommon/DapHistoryType.h b/libKelvinDashboardCommon/DapHistoryType.h new file mode 100644 index 0000000000000000000000000000000000000000..29dc980c7b9e2936ca5e9d70bccf1f4ce71cebb4 --- /dev/null +++ b/libKelvinDashboardCommon/DapHistoryType.h @@ -0,0 +1,40 @@ +#ifndef DAPHISTORYTYPE_H +#define DAPHISTORYTYPE_H + +#include <QDateTime> +#include <QImage> +#include <QMap> +#include <QStringList> + +enum DapTransactionStatus { + stUnknow, + stPending, + stSent, + stReceived, + stError +}; + +struct DapTransactionItem { + QDateTime Date; + QImage TokenPic; + DapTransactionStatus Status; + QString TokenName; + QString WalletNumber; + QString Cryptocurrency; + QString Currency; +}; + +class DapTransactionStatusConvertor +{ + +private: + static const QMap<DapTransactionStatus, QStringList> m_statusMap; + +public: + static QString getShortStatus(const DapTransactionStatus aStatus); + static QString getLongStatus(const DapTransactionStatus aStatus); + static DapTransactionStatus getStatusByShort(const QString& aShortStatus); + static DapTransactionStatus getStatusByLong(const QString& aLongStatus); +}; + +#endif // DAPHISTORYTYPE_H diff --git a/libKelvinDashboardCommon/libKelvinDashboardCommon.pri b/libKelvinDashboardCommon/libKelvinDashboardCommon.pri index 6f2fbbbe156c9bdd4ad6e9c832f1e94c15edecb6..6e8beb83da91f703e58e56382528782fa57733e6 100755 --- a/libKelvinDashboardCommon/libKelvinDashboardCommon.pri +++ b/libKelvinDashboardCommon/libKelvinDashboardCommon.pri @@ -10,9 +10,11 @@ #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 QT += quick quickwidgets +CONFIG += c++11 SOURCES +=\ $$PWD/DapHalper.cpp \ + $$PWD/DapHistoryType.cpp \ $$PWD/DapSettings.cpp \ $$PWD/DapSettingsCipher.cpp \ $$PWD/DapLogMessage.cpp \ @@ -21,6 +23,7 @@ SOURCES +=\ HEADERS +=\ $$PWD/DapHalper.h \ + $$PWD/DapHistoryType.h \ $$PWD/DapSettings.h \ $$PWD/DapSettingsCipher.h \ $$PWD/DapLogMessage.h \