From 7a50587392d11061e08378115f027a5cc2c58c71 Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 11 Feb 2026 20:18:15 +0100 Subject: [PATCH] Use class static instead of global --- src/logos_blockchain_module.cpp | 50 +++++++++++++++++++-------------- src/logos_blockchain_module.h | 11 ++++++++ 2 files changed, 40 insertions(+), 21 deletions(-) diff --git a/src/logos_blockchain_module.cpp b/src/logos_blockchain_module.cpp index 5294cb7..c784a77 100644 --- a/src/logos_blockchain_module.cpp +++ b/src/logos_blockchain_module.cpp @@ -2,14 +2,30 @@ #include "logos_api_client.h" #include -// This is a static variable that is used to store the module instance. -// It is used to access the module instance from subscribe_to_new_blocks callback. -static LogosBlockchainModule* s_moduleForCallback = nullptr; +// Define static member +LogosBlockchainModule* LogosBlockchainModule::s_instance = nullptr; -LogosBlockchainModule::LogosBlockchainModule() = default; +// Static callback implementation +void LogosBlockchainModule::onNewBlockCallback(const char* block) { + if (s_instance) { + qInfo() << "Received new block: " << block; + QVariantList data; + data.append(QString::fromUtf8(block)); + s_instance->emitNewBlockEvent(data); + free_cstring(const_cast(block)); // Free Rust-allocated memory + } +} + +LogosBlockchainModule::LogosBlockchainModule() { + client = logosAPI->getClient("liblogos-blockchain-module"); + node = nullptr; + if (!client) { + qWarning() << "LogosBlockchainModule: Failed to get liblogos-blockchain-module client for liblogos-blockchain-module"; + return; + } +} LogosBlockchainModule::~LogosBlockchainModule() { - s_moduleForCallback = nullptr; if (node) { stop(); } @@ -71,19 +87,8 @@ int LogosBlockchainModule::start(const QString& config_path, const QString& depl return 1; } - s_moduleForCallback = this; - subscribe_to_new_blocks(node, [](const char* block) { - std::cout << "Received new block: " << block << std::endl; - if (!s_moduleForCallback) { - qCritical() << "s_moduleForCallback is nullptr cant forward the event."; - free_cstring(const_cast(block)); // Free Rust-allocated memory - return; - } - QVariantList data; - data.append(QString::fromUtf8(block)); - s_moduleForCallback->emitEvent("newBlock", data); - free_cstring(const_cast(block)); // Free Rust-allocated memory - }); + s_instance = this; + subscribe_to_new_blocks(node, onNewBlockCallback); return 0; } @@ -94,6 +99,8 @@ int LogosBlockchainModule::stop() { return 1; } + s_instance = nullptr; // Clear before stopping to prevent callbacks during shutdown + const OperationStatus status = stop_node(node); if (is_ok(&status)) { qInfo() << "The node was stopped successfully."; @@ -149,12 +156,13 @@ void LogosBlockchainModule::emitEvent(const QString& eventName, const QVariantLi qWarning() << "LogosBlockchainModule: LogosAPI not available, cannot emit" << eventName; return; } - - LogosAPIClient* client = logosAPI->getClient("liblogos-blockchain-module"); if (!client) { qWarning() << "LogosBlockchainModule: Failed to get liblogos-blockchain-module client for event" << eventName; return; } - client->onEventResponse(this, eventName, data); } + +void LogosBlockchainModule::emitNewBlockEvent(const QVariantList& data) { + emitEvent("newBlock", data); +} diff --git a/src/logos_blockchain_module.h b/src/logos_blockchain_module.h index 44ca038..0595e49 100644 --- a/src/logos_blockchain_module.h +++ b/src/logos_blockchain_module.h @@ -26,8 +26,19 @@ public: signals: void eventResponse(const QString& eventName, const QVariantList& data); +public: + // Public method for C callback to emit block events + void emitNewBlockEvent(const QVariantList& data); + private: LogosBlockchainNode* node = nullptr; + LogosAPIClient* client = nullptr; + + // Static instance for C callback (C API doesn't support user data) + static LogosBlockchainModule* s_instance; + + // C-compatible callback function + static void onNewBlockCallback(const char* block); // Helper method for emitting events void emitEvent(const QString& eventName, const QVariantList& data);