chore(cleanup): Use class static instead of global (#7)

* Use class static instead of global

* Fix comments
This commit is contained in:
Daniel Sanchez 2026-02-12 10:55:28 +01:00 committed by GitHub
parent 986d3213ff
commit 5f7d85f168
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 32 additions and 21 deletions

View File

@ -2,14 +2,30 @@
#include "logos_api_client.h"
#include <QVariant>
// 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;
void LogosBlockchainModule::onNewBlockCallback(const char* block) {
if (s_instance) {
qInfo() << "Received new block: " << block;
QVariantList data;
data.append(QString::fromUtf8(block));
s_instance->emitEvent("newBlock", data);
free_cstring(const_cast<char*>(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;
s_instance = 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<char*>(block)); // Free Rust-allocated memory
return;
}
QVariantList data;
data.append(QString::fromUtf8(block));
s_moduleForCallback->emitEvent("newBlock", data);
free_cstring(const_cast<char*>(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,9 @@ 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);
}

View File

@ -28,6 +28,13 @@ signals:
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);