diff options
Diffstat (limited to 'src/ui/GpgFrontendUIInit.cpp')
-rw-r--r-- | src/ui/GpgFrontendUIInit.cpp | 347 |
1 files changed, 123 insertions, 224 deletions
diff --git a/src/ui/GpgFrontendUIInit.cpp b/src/ui/GpgFrontendUIInit.cpp index bfe4d828..c7f54286 100644 --- a/src/ui/GpgFrontendUIInit.cpp +++ b/src/ui/GpgFrontendUIInit.cpp @@ -1,5 +1,5 @@ /** - * Copyright (C) 2021 Saturneric + * Copyright (C) 2021 Saturneric <[email protected]> * * This file is part of GpgFrontend. * @@ -20,7 +20,7 @@ * the gpg4usb project, which is under GPL-3.0-or-later. * * All the source code of GpgFrontend was modified and released by - * Saturneric<[email protected]> starting on May 12, 2021. + * Saturneric <[email protected]> starting on May 12, 2021. * * SPDX-License-Identifier: GPL-3.0-or-later * @@ -28,76 +28,109 @@ #include "GpgFrontendUIInit.h" -#include <spdlog/async.h> -#include <spdlog/common.h> -#include <spdlog/sinks/rotating_file_sink.h> -#include <spdlog/sinks/stdout_color_sinks.h> - -#include <string> +#include <clocale> #include "core/GpgConstants.h" +#include "core/function/CoreSignalStation.h" #include "core/function/GlobalSettingStation.h" -#include "core/thread/CtxCheckTask.h" -#include "core/thread/TaskRunnerGetter.h" -#include "spdlog/spdlog.h" -#include "ui/SignalStation.h" +#include "core/module/ModuleManager.h" +#include "ui/UISignalStation.h" #include "ui/UserInterfaceUtils.h" #include "ui/main_window/MainWindow.h" -#if !defined(RELEASE) && defined(WINDOWS) -#include "core/function/GlobalSettingStation.h" -#endif - namespace GpgFrontend::UI { -extern void init_logging_system(); -extern void init_locale(); +extern void InitLocale(); + +void WaitEnvCheckingProcess() { + GF_UI_LOG_DEBUG("need to waiting for env checking process"); + + // create and show loading window before starting the main window + auto* waiting_dialog = new QProgressDialog(); + waiting_dialog->setMaximum(0); + waiting_dialog->setMinimum(0); + auto* waiting_dialog_label = new QLabel( + QObject::tr("Loading Gnupg Info...") + "<br /><br />" + + QObject::tr("If this process is too slow, please set the key " + "server address appropriately in the gnupg configuration " + "file (depending " + "on the network situation in your country or region).")); + waiting_dialog_label->setWordWrap(true); + waiting_dialog->setLabel(waiting_dialog_label); + waiting_dialog->resize(420, 120); + QApplication::connect(CoreSignalStation::GetInstance(), + &CoreSignalStation::SignalGoodGnupgEnv, waiting_dialog, + [=]() { + GF_UI_LOG_DEBUG("gpg env loaded successfuly"); + waiting_dialog->finished(0); + waiting_dialog->deleteLater(); + }); + + // new local event looper + QEventLoop looper; + QApplication::connect(CoreSignalStation::GetInstance(), + &CoreSignalStation::SignalGoodGnupgEnv, &looper, + &QEventLoop::quit); + + QApplication::connect(waiting_dialog, &QProgressDialog::canceled, [=]() { + GF_UI_LOG_DEBUG("cancel clicked on wairing dialog"); + QApplication::quit(); + exit(0); + }); + + auto env_state = + Module::RetrieveRTValueTypedOrDefault<>("core", "env.state.basic", 0); + GF_UI_LOG_DEBUG("ui is ready to wating for env initialized, env_state: {}", + env_state); + + // check twice to avoid some unlucky sitations + if (env_state == 1) { + GF_UI_LOG_DEBUG("env state turned initialized before the looper start"); + waiting_dialog->finished(0); + waiting_dialog->deleteLater(); + return; + } + + // show the loading window + waiting_dialog->setModal(true); + waiting_dialog->setFocus(); + waiting_dialog->show(); + + // block the main thread until the gpg context is loaded + looper.exec(); +} + +void PreInitGpgFrontendUI() { CommonUtils::GetInstance(); } -void InitGpgFrontendUI(QApplication* app) { +void InitGpgFrontendUI(QApplication* /*app*/) { // init locale - init_locale(); - -#if !defined(RELEASE) && defined(WINDOWS) - // css - std::filesystem::path css_path = - GpgFrontend::GlobalSettingStation::GetInstance().GetResourceDir() / - "css" / "default.qss"; - QFile file(css_path.u8string().c_str()); - file.open(QFile::ReadOnly); - QString styleSheet = QLatin1String(file.readAll()); - qApp->setStyleSheet(styleSheet); - file.close(); -#endif + InitLocale(); // init signal station - SignalStation::GetInstance(); + UISignalStation::GetInstance(); // init common utils CommonUtils::GetInstance(); + auto settings = GlobalSettingStation::GetInstance().GetSettings(); + // application proxy configure - bool proxy_enable = - GlobalSettingStation::GetInstance().LookupSettings("proxy.enable", false); + bool proxy_enable = settings.value("proxy/enable", false).toBool(); // if enable proxy for application if (proxy_enable) { try { - std::string proxy_type = - GlobalSettingStation::GetInstance().LookupSettings("proxy.proxy_type", - std::string{}); - std::string proxy_host = - GlobalSettingStation::GetInstance().LookupSettings("proxy.proxy_host", - std::string{}); - int proxy_port = - GlobalSettingStation::GetInstance().LookupSettings("proxy.port", 0); - std::string proxy_username = - GlobalSettingStation::GetInstance().LookupSettings("proxy.username", - std::string{}); - std::string proxy_password = - GlobalSettingStation::GetInstance().LookupSettings("proxy.password", - std::string{}); - SPDLOG_DEBUG("proxy settings: type {}, host {}, port: {}", proxy_type, - proxy_host, proxy_port); + QString proxy_type = + settings.value("proxy/proxy_type", QString{}).toString(); + QString proxy_host = + settings.value("proxy/proxy_host", QString{}).toString(); + int proxy_port = settings.value("prox/port", 0).toInt(); + QString proxy_username = + settings.value("proxy/username", QString{}).toString(); + QString proxy_password = + settings.value("proxy/password", QString{}).toString(); + GF_UI_LOG_DEBUG("proxy settings: type {}, host {}, port: {}", proxy_type, + proxy_host, proxy_port); QNetworkProxy::ProxyType proxy_type_qt = QNetworkProxy::NoProxy; if (proxy_type == "HTTP") { @@ -112,19 +145,21 @@ void InitGpgFrontendUI(QApplication* app) { QNetworkProxy proxy; if (proxy_type_qt != QNetworkProxy::DefaultProxy) { proxy.setType(proxy_type_qt); - proxy.setHostName(QString::fromStdString(proxy_host)); + proxy.setHostName(proxy_host); proxy.setPort(proxy_port); - if (!proxy_username.empty()) - proxy.setUser(QString::fromStdString(proxy_username)); - if (!proxy_password.empty()) - proxy.setPassword(QString::fromStdString(proxy_password)); + if (!proxy_username.isEmpty()) { + proxy.setUser(proxy_username); + } + if (!proxy_password.isEmpty()) { + proxy.setPassword(proxy_password); + } } else { proxy.setType(proxy_type_qt); } QNetworkProxy::setApplicationProxy(proxy); } catch (...) { - SPDLOG_ERROR("setting operation error: proxy setings"); + GF_UI_LOG_ERROR("setting operation error: proxy setings"); // no proxy by default QNetworkProxy::setApplicationProxy(QNetworkProxy::NoProxy); } @@ -133,196 +168,60 @@ void InitGpgFrontendUI(QApplication* app) { QNetworkProxy::setApplicationProxy(QNetworkProxy::NoProxy); } - // create the thread to load the gpg context - auto* init_ctx_task = new Thread::CtxCheckTask(); - - // create and show loading window before starting the main window - auto* waiting_dialog = new QProgressDialog(); - waiting_dialog->setMaximum(0); - waiting_dialog->setMinimum(0); - auto waiting_dialog_label = - new QLabel(QString(_("Loading Gnupg Info...")) + "<br /><br />" + - _("If this process is too slow, please set the key " - "server address appropriately in the gnupg configuration " - "file (depending " - "on the network situation in your country or region).")); - waiting_dialog_label->setWordWrap(true); - waiting_dialog->setLabel(waiting_dialog_label); - waiting_dialog->resize(420, 120); - app->connect(init_ctx_task, &Thread::CtxCheckTask::SignalTaskEnd, - waiting_dialog, [=]() { - SPDLOG_DEBUG("gpg context loaded"); - waiting_dialog->finished(0); - waiting_dialog->deleteLater(); - }); - - app->connect(waiting_dialog, &QProgressDialog::canceled, [=]() { - SPDLOG_DEBUG("cancel clicked"); - app->quit(); - exit(0); - }); - - // show the loading window - waiting_dialog->setModal(true); - waiting_dialog->setFocus(); - waiting_dialog->show(); - - // new local event looper - QEventLoop looper; - app->connect(init_ctx_task, &Thread::CtxCheckTask::SignalTaskEnd, &looper, - &QEventLoop::quit); - - // start the thread to load the gpg context - Thread::TaskRunnerGetter::GetInstance().GetTaskRunner()->PostTask( - init_ctx_task); + if (Module::RetrieveRTValueTypedOrDefault<>("core", "env.state.basic", 0) == + 0) { + WaitEnvCheckingProcess(); + } - // block the main thread until the gpg context is loaded - looper.exec(); + qRegisterMetaType<QSharedPointer<GpgPassphraseContext> >( + "QSharedPointer<GpgPassphraseContext>"); } -int RunGpgFrontendUI(QApplication* app) { +auto RunGpgFrontendUI(QApplication* app) -> int { // create main window and show it auto main_window = std::make_unique<GpgFrontend::UI::MainWindow>(); // pre-check, if application need to restart if (CommonUtils::GetInstance()->isApplicationNeedRestart()) { - SPDLOG_DEBUG("application need to restart, before mian window init"); - return DEEP_RESTART_CODE; - } else { - main_window->Init(); - SPDLOG_DEBUG("main window inited"); - main_window->show(); + GF_UI_LOG_DEBUG("application need to restart, before mian window init"); + return kDeepRestartCode; } + // init main window + main_window->Init(); + + // show main windows + GF_UI_LOG_DEBUG("main window is ready to show"); + main_window->show(); + // start the main event loop return app->exec(); } -void InitUILoggingSystem() { - using namespace boost::posix_time; - using namespace boost::gregorian; - - // get the log directory - auto logfile_path = (GlobalSettingStation::GetInstance().GetLogDir() / "ui"); - logfile_path.replace_extension(".log"); - - // sinks - std::vector<spdlog::sink_ptr> sinks; - sinks.push_back(std::make_shared<spdlog::sinks::stderr_color_sink_mt>()); - sinks.push_back(std::make_shared<spdlog::sinks::rotating_file_sink_mt>( - logfile_path.u8string(), 1048576 * 32, 32)); - - // thread pool - spdlog::init_thread_pool(1024, 2); - - // logger - auto ui_logger = std::make_shared<spdlog::async_logger>( - "ui", begin(sinks), end(sinks), spdlog::thread_pool()); - ui_logger->set_pattern( - "[%H:%M:%S.%e] [T:%t] [%=4n] %^[%=8l]%$ [%s:%#] [%!] -> %v (+%ius)"); - -#ifdef DEBUG - ui_logger->set_level(spdlog::level::trace); -#else - ui_logger->set_level(spdlog::level::info); -#endif - - // flush policy - ui_logger->flush_on(spdlog::level::err); - spdlog::flush_every(std::chrono::seconds(5)); - - // register it as default logger - spdlog::set_default_logger(ui_logger); -} - -void ShutdownUILoggingSystem() { -#ifdef WINDOWS - // Under VisualStudio, this must be called before main finishes to workaround - // a known VS issue - spdlog::drop_all(); - spdlog::shutdown(); -#endif -} +void GPGFRONTEND_UI_EXPORT DestroyGpgFrontendUI() {} /** * @brief setup the locale and load the translations * */ -void init_locale() { +void InitLocale() { // get the instance of the GlobalSettingStation - auto& settings = - GpgFrontend::GlobalSettingStation::GetInstance().GetUISettings(); - - // create general settings if not exist - if (!settings.exists("general") || - settings.lookup("general").getType() != libconfig::Setting::TypeGroup) - settings.add("general", libconfig::Setting::TypeGroup); - - // set system default at first - auto& general = settings["general"]; - if (!general.exists("lang")) - general.add("lang", libconfig::Setting::TypeString) = ""; - - // sync the settings to the file - GpgFrontend::GlobalSettingStation::GetInstance().SyncSettings(); - - SPDLOG_DEBUG("current system locale: {}", setlocale(LC_ALL, nullptr)); + auto settings = + GpgFrontend::GlobalSettingStation::GetInstance().GetSettings(); // read from settings file - std::string lang; - if (!general.lookupValue("lang", lang)) { - SPDLOG_ERROR(_("could not read properly from configure file")); - }; - - SPDLOG_DEBUG("lang from settings: {}", lang); - SPDLOG_DEBUG("project name: {}", PROJECT_NAME); - SPDLOG_DEBUG("locales path: {}", - GpgFrontend::GlobalSettingStation::GetInstance() - .GetLocaleDir() - .u8string()); - -#ifndef WINDOWS - if (!lang.empty()) { - std::string lc = lang + ".UTF-8"; - - // set LC_ALL - auto* locale_name = setlocale(LC_ALL, lc.c_str()); - if (locale_name == nullptr) SPDLOG_WARN("set LC_ALL failed, lc: {}", lc); - auto language = getenv("LANGUAGE"); - // set LANGUAGE - std::string language_env = language == nullptr ? "en" : language; - language_env.insert(0, lang + ":"); - SPDLOG_DEBUG("language env: {}", language_env); - if (setenv("LANGUAGE", language_env.c_str(), 1)) { - SPDLOG_WARN("set LANGUAGE {} failed", language_env); - }; - } -#else - if (!lang.empty()) { - std::string lc = lang; - - // set LC_ALL - auto* locale_name = setlocale(LC_ALL, lc.c_str()); - if (locale_name == nullptr) SPDLOG_WARN("set LC_ALL failed, lc: {}", lc); - - auto language = getenv("LANGUAGE"); - // set LANGUAGE - std::string language_env = language == nullptr ? "en" : language; - language_env.insert(0, lang + ":"); - language_env.insert(0, "LANGUAGE="); - SPDLOG_DEBUG("language env: {}", language_env); - if (putenv(language_env.c_str())) { - SPDLOG_WARN("set LANGUAGE {} failed", language_env); - }; + auto lang = settings.value("basic/lang").toString(); + GF_UI_LOG_INFO("current system locale: {}", QLocale().name()); + GF_UI_LOG_INFO("current custom locale settings: {}", lang); + + auto target_locale = lang.isEmpty() ? QLocale() : QLocale(lang); + auto* translator = new QTranslator(QCoreApplication::instance()); + if (translator->load(target_locale, QLatin1String(PROJECT_NAME), + QLatin1String("."), QLatin1String(":/i18n"), + QLatin1String(".qm"))) { + GF_UI_LOG_INFO("load target translation file done"); + QCoreApplication::installTranslator(translator); } -#endif - - bindtextdomain(PROJECT_NAME, GpgFrontend::GlobalSettingStation::GetInstance() - .GetLocaleDir() - .u8string() - .c_str()); - bind_textdomain_codeset(PROJECT_NAME, "utf-8"); - textdomain(PROJECT_NAME); } } // namespace GpgFrontend::UI |