#include "importUiController.h" #include #include #include #include #include #include "systemController.h" #ifdef Q_OS_ANDROID #include "platforms/android/android_controller.h" #endif #if defined Q_OS_ANDROID ImportUiController* ImportUiController::mInstance = nullptr; static QMutex qrDecodeMutex; #endif ImportUiController::ImportUiController(ImportController* importController, QObject *parent) : QObject(parent), m_importController(importController), m_isNativeWireGuardConfig(false) { #if defined Q_OS_ANDROID mInstance = this; #endif connect(m_importController, &ImportController::importFinished, this, &ImportUiController::importFinished); connect(m_importController, &ImportController::importErrorOccurred, this, &ImportUiController::importErrorOccurred); connect(m_importController, &ImportController::restoreAppConfig, this, &ImportUiController::restoreAppConfig); } bool ImportUiController::importLink(const QUrl &url) { auto result = m_importController->importLink(url); if (result.errorCode != ErrorCode::NoError) { emit importErrorOccurred(result.errorCode, false); return false; } m_config = result.config; m_configFileName = result.configFileName; m_maliciousWarningText = result.maliciousWarningText; m_isNativeWireGuardConfig = result.isNativeWireGuardConfig; return true; } bool ImportUiController::editServerConfigWithData(QString data, int serverIndex) { auto result = m_importController->editServerConfigWithData(data, serverIndex); if (result.errorCode != ErrorCode::NoError) { emit importErrorOccurred(result.errorCode, false); return false; } m_config = result.config; m_configFileName = result.configFileName; m_maliciousWarningText = result.maliciousWarningText; m_isNativeWireGuardConfig = result.isNativeWireGuardConfig; return true; } bool ImportUiController::extractConfigFromFile(const QString &fileName) { QString data; if (!SystemController::readFile(fileName, data)) { emit importErrorOccurred(ErrorCode::ImportOpenConfigError, false); return false; } QString configFileName = QFileInfo(QFile(fileName).fileName()).fileName(); #ifdef Q_OS_ANDROID if (configFileName.isEmpty()) { configFileName = AndroidController::instance()->getFileName(fileName); } #endif auto result = m_importController->extractConfigFromData(data, configFileName); if (result.errorCode != ErrorCode::NoError) { emit importErrorOccurred(result.errorCode, false); return false; } m_config = result.config; m_configFileName = result.configFileName; m_maliciousWarningText = result.maliciousWarningText; m_isNativeWireGuardConfig = result.isNativeWireGuardConfig; emit importConfigChanged(); return true; } bool ImportUiController::extractConfigFromData(QString data) { auto result = m_importController->extractConfigFromData(data); if (result.errorCode != ErrorCode::NoError) { emit importErrorOccurred(result.errorCode, false); return false; } m_config = result.config; m_configFileName = result.configFileName; m_maliciousWarningText = result.maliciousWarningText; m_isNativeWireGuardConfig = result.isNativeWireGuardConfig; emit importConfigChanged(); return true; } bool ImportUiController::extractConfigFromQr(const QByteArray &data) { auto result = m_importController->extractConfigFromQr(data); if (result.errorCode != ErrorCode::NoError) { emit importErrorOccurred(result.errorCode, false); return false; } m_config = result.config; m_configFileName = result.configFileName; m_maliciousWarningText = result.maliciousWarningText; m_isNativeWireGuardConfig = result.isNativeWireGuardConfig; emit importConfigChanged(); return true; } QString ImportUiController::getConfig() { return QJsonDocument(m_config).toJson(QJsonDocument::Indented); } QString ImportUiController::getConfigFileName() { return m_configFileName; } QString ImportUiController::getMaliciousWarningText() { return m_maliciousWarningText; } bool ImportUiController::isNativeWireGuardConfig() { return m_isNativeWireGuardConfig; } void ImportUiController::processNativeWireGuardConfig() { m_config = m_importController->processNativeWireGuardConfig(m_config); emit importConfigChanged(); } void ImportUiController::importConfig() { m_importController->importConfig(m_config); m_config = {}; m_configFileName.clear(); m_maliciousWarningText.clear(); m_isNativeWireGuardConfig = false; emit importConfigChanged(); } void ImportUiController::clearConfigFileName() { m_configFileName.clear(); emit importConfigChanged(); } #if defined Q_OS_ANDROID || defined Q_OS_IOS void ImportUiController::startDecodingQr() { m_importController->startDecodingQr(); #if defined Q_OS_ANDROID AndroidController::instance()->startQrReaderActivity(); #endif } void ImportUiController::stopDecodingQr() { emit qrDecodingFinished(); } bool ImportUiController::parseQrCodeChunk(const QString &code) { auto parseResult = m_importController->parseQrCodeChunk(code); if (parseResult.success) { m_config = parseResult.importResult.config; m_configFileName = parseResult.importResult.configFileName; m_maliciousWarningText = parseResult.importResult.maliciousWarningText; m_isNativeWireGuardConfig = parseResult.importResult.isNativeWireGuardConfig; emit importConfigChanged(); stopDecodingQr(); return true; } return false; } double ImportUiController::getQrCodeScanProgressBarValue() { const int total = m_importController->qrChunksTotal(); if (total == 0) { return 0.0; } return (1.0 / total) * m_importController->qrChunksReceived(); } QString ImportUiController::getQrCodeScanProgressString() { return tr("Scanned %1 of %2.").arg(m_importController->qrChunksReceived()).arg(m_importController->qrChunksTotal()); } #endif #if defined Q_OS_ANDROID bool ImportUiController::decodeQrCode(const QString &code) { QMutexLocker lock(&qrDecodeMutex); if (!mInstance) { return false; } if (!mInstance->m_importController->isQrDecodingActive()) { mInstance->m_importController->startDecodingQr(); } return mInstance->parseQrCodeChunk(code); } #endif