Files
amnezia-client/client/core/local-proxy/xraycontroller.cpp
T

100 lines
2.3 KiB
C++
Raw Normal View History

2025-08-08 06:44:18 +04:00
#include "xraycontroller.h"
2025-08-08 06:44:18 +04:00
#include "proxylogger.h"
#include "core/ipcclient.h"
namespace {
const QString kIpcUnavailableError = QStringLiteral("Failed to communicate with IPC service");
}
2025-08-08 06:44:18 +04:00
XrayController::XrayController(QObject *parent)
: QObject(parent)
2025-08-08 06:44:18 +04:00
{
ProxyLogger::getInstance().debug("XrayController initialized");
}
XrayController::~XrayController()
{
stop();
}
bool XrayController::start(const QString &configJson)
2025-08-08 06:44:18 +04:00
{
if (m_isRunning) {
ProxyLogger::getInstance().info("Xray is already running");
2025-08-08 06:44:18 +04:00
return true;
}
ProxyLogger::getInstance().info("Request to start Xray via IPC");
2025-08-08 06:44:18 +04:00
m_lastError.clear();
2025-08-08 06:44:18 +04:00
if (configJson.trimmed().isEmpty()) {
m_lastError = QStringLiteral("Config content is empty");
ProxyLogger::getInstance().error(m_lastError);
2025-08-08 06:44:18 +04:00
return false;
}
const bool ipcResult = IpcClient::withInterface([&](QSharedPointer<IpcInterfaceReplica> iface) {
iface->xrayStart(configJson);
return true;
}, []() {
2025-08-08 06:44:18 +04:00
return false;
});
2025-08-08 06:44:18 +04:00
if (!ipcResult) {
m_lastError = kIpcUnavailableError;
ProxyLogger::getInstance().error(m_lastError);
2025-08-08 06:44:18 +04:00
return false;
}
ProxyLogger::getInstance().info("Xray start command sent to IPC service");
m_isRunning = true;
2025-08-08 06:44:18 +04:00
return true;
}
bool XrayController::stop()
2025-08-08 06:44:18 +04:00
{
if (!m_isRunning) {
ProxyLogger::getInstance().debug("Skipping Xray stop via IPC: local proxy Xray is not running");
return true;
}
ProxyLogger::getInstance().info("Stopping Xray via IPC");
const bool ipcResult = IpcClient::withInterface([](QSharedPointer<IpcInterfaceReplica> iface) {
2026-04-13 09:24:55 +04:00
auto xrayStop = iface->xrayStop();
if (!xrayStop.waitForFinished() || !xrayStop.returnValue()) {
ProxyLogger::getInstance().warning("Failed to stop Xray via IPC");
return false;
}
return true;
}, []() {
return false;
});
if (!ipcResult) {
m_lastError = kIpcUnavailableError;
ProxyLogger::getInstance().warning(m_lastError);
return false;
2025-08-08 06:44:18 +04:00
}
m_isRunning = false;
return true;
2025-08-08 06:44:18 +04:00
}
bool XrayController::isXrayRunning() const
{
return m_isRunning;
2025-08-08 06:44:18 +04:00
}
qint64 XrayController::getProcessId() const
{
return -1;
2025-08-08 06:44:18 +04:00
}
QString XrayController::getError() const
{
return m_lastError;
2025-08-08 06:44:18 +04:00
}