Diagnostics & logging: - add verbose logging system (VERBOSE_LOGF) with toggle in Settings - forward app-level log messages to Console tab for in-UI visibility - add detailed connection attempt logging (attempt #, daemon state, config paths, auth failures, port owner identification) - detect HTTP 401 auth failures and show actionable error messages - identify port owner process (PID + name) on both Linux and Windows - demote noisy acrylic/shader traces from DEBUG_LOGF to VERBOSE_LOGF - persist verbose_logging preference in settings.json - link iphlpapi on Windows for GetExtendedTcpTable Security & encryption: - update local encryption state immediately after encryptwallet RPC so Settings reflects the change before daemon restarts - show notifications for encrypt success/failure and PIN skip - use dedicated RPC client for z_importwallet during decrypt flow to avoid blocking main rpc_ curl_mutex (which starved peer/tx refresh) - force full state refresh (addresses, transactions, peers) after successful wallet import Network tab: - redesign peers refresh button as glass-panel with icon + label, matching the mining button style - add spinning arc animation while peer data is loading (peer_refresh_in_progress_ atomic flag set/cleared in refreshPeerInfo) - prevent double-click spam during refresh - add refresh-button size to ui.toml Other: - use fast_rpc_ for rescan polling to avoid blocking on main rpc_ - enable DRAGONX_DEBUG in all build configs (was debug-only) - setup.sh: pull latest xmrig-hac when repo already exists
90 lines
2.2 KiB
C++
90 lines
2.2 KiB
C++
// DragonX Wallet - ImGui Edition
|
|
// Copyright 2024-2026 The Hush Developers
|
|
// Released under the GPLv3
|
|
|
|
#pragma once
|
|
|
|
#include <string>
|
|
#include <fstream>
|
|
#include <functional>
|
|
#include <mutex>
|
|
|
|
namespace dragonx {
|
|
namespace util {
|
|
|
|
/**
|
|
* @brief Simple file logger
|
|
*/
|
|
class Logger {
|
|
public:
|
|
Logger();
|
|
~Logger();
|
|
|
|
/**
|
|
* @brief Initialize logger with output file
|
|
* @param path Path to log file
|
|
* @return true if opened successfully
|
|
*/
|
|
bool init(const std::string& path);
|
|
|
|
/**
|
|
* @brief Write a log message
|
|
* @param message Message to log
|
|
*/
|
|
void write(const std::string& message);
|
|
|
|
/**
|
|
* @brief Write a formatted log message
|
|
* @param format printf-style format string
|
|
*/
|
|
void writef(const char* format, ...);
|
|
|
|
/**
|
|
* @brief Get the singleton instance
|
|
*/
|
|
static Logger& instance();
|
|
|
|
/**
|
|
* @brief Set a callback invoked for every log message.
|
|
* The callback receives the raw (unformatted) message string.
|
|
* Thread-safe — the callback is invoked under the logger lock.
|
|
*/
|
|
void setCallback(std::function<void(const std::string&)> cb);
|
|
|
|
/**
|
|
* @brief Enable/disable verbose (diagnostic) logging.
|
|
* When disabled, VERBOSE_LOGF calls are suppressed.
|
|
*/
|
|
void setVerbose(bool v) { verbose_ = v; }
|
|
bool isVerbose() const { return verbose_; }
|
|
|
|
private:
|
|
std::ofstream file_;
|
|
std::mutex mutex_;
|
|
bool initialized_ = false;
|
|
bool verbose_ = false;
|
|
std::function<void(const std::string&)> callback_;
|
|
};
|
|
|
|
// Convenience macros
|
|
#define LOG(msg) dragonx::util::Logger::instance().write(msg)
|
|
#define LOGF(...) dragonx::util::Logger::instance().writef(__VA_ARGS__)
|
|
|
|
#ifdef DRAGONX_DEBUG
|
|
#define DEBUG_LOG(msg) LOG(msg)
|
|
#define DEBUG_LOGF(...) LOGF(__VA_ARGS__)
|
|
#else
|
|
#define DEBUG_LOG(msg)
|
|
#define DEBUG_LOGF(...)
|
|
#endif
|
|
|
|
// Verbose logging — only emitted when Logger::isVerbose() is true.
|
|
// Used for detailed diagnostic output (connection attempts, daemon state, etc.)
|
|
#define VERBOSE_LOGF(...) do { \
|
|
if (dragonx::util::Logger::instance().isVerbose()) \
|
|
dragonx::util::Logger::instance().writef(__VA_ARGS__); \
|
|
} while (0)
|
|
|
|
} // namespace util
|
|
} // namespace dragonx
|