Files
ObsidianDragon/src/util/logger.h
dan_s 4b16a2a2c4 improve diagnostics, security UX, and network tab refresh
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
2026-03-05 05:26:04 -06:00

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