Files
utun2/tools/chatgui/transport/node_config.h
T

78 lines
5.1 KiB
C++

/* GUI-проекция desktop INI: идентичность, control и параметры интерфейса.
* Все вызовы синхронные, в одном потоке; доступ к файлу сериализует вызывающий.
* load проверяет физический текст и собственные поля GUI без DNS/сетевого I/O.
* Полную схему сетевых опций проверяет parse_config при запуске ядра.
* save обновляет только поля этой модели, сохраняя остальные секции/комментарии;
* публикация через общий config_updater с проверкой записи и commit. */
#ifndef NODE_CONFIG_H
#define NODE_CONFIG_H
#include <cstdint>
#include <QString>
#include <QStringList>
class NodeConfig {
public:
explicit NodeConfig(const QString& path);
bool exists() const; // существует ли путь; доступность проверяется чтением
bool create(const QString& nodeName); // новый файл: X25519/id, автосокеты TCP+UDP, control 127.0.0.1:9999
bool load(); // false при I/O/повреждённом тексте, прежняя модель сохраняется; true => проверить hasErrors()
bool save(); // false при неверном поле/I/O; весь набор правок публикуется одной записью
QString nodeName() const { return m_nodeName; }
void setNodeName(const QString& name) { m_nodeName = name; }
QString nodeId() const { return m_nodeId; } // 16 HEX-символов либо пусто, если не задан
QString pubKey() const { return m_pubKey; }
QString privKey() const { return m_privKey; } // секрет; не выводить в диагностику
uint64_t nodeIdU64() const; // 0, если ID отсутствует или неверен
QString controlAddr() const { return m_controlAddr; } // host:port либо [IPv6]:port; пусто => control не задан
void setControlAddr(const QString& address) { m_controlAddr = address; }
quint16 controlPort() const; // 0 при отсутствии/ошибке; явный нулевой порт также допустим
void setControlPort(quint16 port); // сохраняет host; при пустом адресе использует 127.0.0.1
bool autoSockets() const { return m_autoSocketsValue != "no"; }
void setAutoSockets(bool enabled) { m_autoSocketsValue = enabled ? "yes" : "no"; }
QString autoSocketProtocols() const { return m_autoSocketProtocols; }
void setAutoSocketProtocols(const QString& protocols) { m_autoSocketProtocols = protocols; }
QString filePath() const { return m_path; }
bool utunEnabled() const { return m_utunEnabled; }
void setUtunEnabled(bool enabled) { m_utunEnabled = enabled; }
QString dbPath() const { return m_dbPath; }
void setDbPath(const QString& path) { m_dbPath = path; }
QString debugFile() const { return m_debugFile; }
void setDebugFile(const QString& path) { m_debugFile = path; }
QString debugLevel() const { return m_debugLevel; } // пустой при отсутствии, save использует info
QString debugCategories() const { return m_debugCategories; } // [debug] как category=level через запятую
QString language() const { return m_language; }
void setLanguage(const QString& language) { m_language = language; }
/* load заменяет модель целиком; удалённые из файла значения не сохраняются.
* Ошибки собственных полей не мешают прочитать остальные; save проверяет текущие значения заново. */
bool hasErrors() const { return !m_errors.isEmpty(); }
const QStringList& errors() const { return m_errors; }
bool generateIdentity(); // успех заменяет всю идентичность; ошибка сохраняет прежнюю, файл не меняет
private:
QString m_path; // путь INI, не каталог данных
QString m_nodeName;
QString m_nodeId;
QString m_pubKey;
QString m_privKey;
QString m_controlAddr;
bool m_utunEnabled = false; // явно запускаемый дополнительный UTUN-сервис
QString m_autoSocketsValue = QStringLiteral("no"); // yes/no/android, последний режим сохраняется до явного setter
QString m_autoSocketProtocols = QStringLiteral("tcp+udp");
QString m_dbPath; // относительно каталога конфигурации; пустой save заменяет на chat_data
QString m_debugFile; // путь журнала GUI
QString m_debugLevel;
QString m_debugCategories;
QString m_language = QStringLiteral("system"); // system/en/ru
QStringList m_errors; // ошибки последнего успешного чтения, без секретных значений
};
#endif // NODE_CONFIG_H