diff options
Diffstat (limited to 'src/app.cpp')
-rw-r--r-- | src/app.cpp | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/src/app.cpp b/src/app.cpp new file mode 100644 index 00000000..b8b20300 --- /dev/null +++ b/src/app.cpp @@ -0,0 +1,111 @@ +/** + * Copyright (C) 2021 Saturneric <[email protected]> + * + * This file is part of GpgFrontend. + * + * GpgFrontend is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GpgFrontend is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GpgFrontend. If not, see <https://www.gnu.org/licenses/>. + * + * The initial version of the source code is inherited from + * 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. + * + * SPDX-License-Identifier: GPL-3.0-or-later + * + */ + +#include "GpgFrontendContext.h" +#include "core/GpgConstants.h" +#include "core/GpgCoreInit.h" +#include "module/GpgFrontendModuleInit.h" +#include "ui/GpgFrontendUIInit.h" + +// main +#include "main.h" + +namespace GpgFrontend { + +constexpr int kCrashCode = ~0; ///< + +/** + * @brief + * + * @param argc + * @param argv + * @return int + */ +auto StartApplication(const GFCxtWPtr& p_ctx) -> int { + GFCxtSPtr ctx = p_ctx.lock(); + if (ctx == nullptr) { + GF_MAIN_LOG_ERROR("cannot get gpgfrontend context."); + return -1; + } + + auto* app = ctx->GetApp(); + if (app == nullptr) { + GF_MAIN_LOG_ERROR("cannot get qapplication from gpgfrontend context."); + return -1; + } + + GF_MAIN_LOG_DEBUG("start running gui application"); + + /** + * internationalisation. loop to restart main window + * with changed translation when settings change. + */ + int return_from_event_loop_code; + int restart_count = 0; + + do { + // after that load ui totally + GpgFrontend::UI::InitGpgFrontendUI(app); + + // finally create main window + return_from_event_loop_code = GpgFrontend::UI::RunGpgFrontendUI(app); + + GF_MAIN_LOG_DEBUG("try to destroy modules system and core"); + + restart_count++; + + GF_MAIN_LOG_DEBUG( + "restart loop refresh, event loop code: {}, restart count: {}", + return_from_event_loop_code, restart_count); + } while (return_from_event_loop_code == GpgFrontend::kRestartCode && + restart_count < 99); + + // first should shutdown the module system + GpgFrontend::Module::ShutdownGpgFrontendModules(); + + // then shutdown the core + GpgFrontend::DestroyGpgFrontendCore(); + GF_MAIN_LOG_DEBUG("core and modules system destroyed"); + + // log for debug + GF_MAIN_LOG_INFO("GpgFrontend is about to exit."); + + // deep restart mode + if (return_from_event_loop_code == GpgFrontend::kDeepRestartCode || + return_from_event_loop_code == kCrashCode) { + // log for debug + GF_MAIN_LOG_DEBUG( + "deep restart or cash loop status caught, restart a new application"); + QProcess::startDetached(qApp->arguments()[0], qApp->arguments()); + }; + + // exit the program + return return_from_event_loop_code; +} + +} // namespace GpgFrontend |