diff --git a/include/global/DataStore.hpp b/include/global/DataStore.hpp index 5acdf16..bd9fb4d 100644 --- a/include/global/DataStore.hpp +++ b/include/global/DataStore.hpp @@ -87,6 +87,7 @@ namespace Configs { int stats_tab = 0; // either connection or log int speed_test_mode = TestConfig::FULL; QString simple_dl_url = "http://cachefly.cachefly.net/1mb.test"; + bool allow_beta_update = false; // Subscription QString user_agent = ""; // set at main.cpp diff --git a/include/ui/mainwindow.h b/include/ui/mainwindow.h index 977dfa4..dd4bf3a 100644 --- a/include/ui/mainwindow.h +++ b/include/ui/mainwindow.h @@ -66,7 +66,7 @@ public: void profile_start(int _id = -1); - void profile_stop(bool crash = false, bool sem = false, bool manual = false); + void profile_stop(bool crash = false, bool block = false, bool manual = false); void set_spmode_system_proxy(bool enable, bool save = true); @@ -189,7 +189,6 @@ private: QMutex mu_starting; QMutex mu_stopping; QMutex mu_exit; - QSemaphore sem_stopped; int exit_reason = 0; // QMutex mu_download_update; diff --git a/include/ui/profile/dialog_edit_profile.ui b/include/ui/profile/dialog_edit_profile.ui index aa7da63..8a8df6f 100644 --- a/include/ui/profile/dialog_edit_profile.ui +++ b/include/ui/profile/dialog_edit_profile.ui @@ -7,7 +7,7 @@ 0 0 1000 - 802 + 885 @@ -121,99 +121,6 @@ - - - - - - - 0 - 0 - - - - Custom Outbound Settings - - - - - - Edit - - - - - - - - - - Custom Config Settings - - - - - - Edit - - - - - - - - - - - - - - Apply settings to this group - - - - - - - - 0 - 0 - - - - Qt::Orientation::Horizontal - - - QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok - - - - - - - - - - - - - 0 - 0 - - - - - 400 - 0 - - - - - - - - QLayout::SizeConstraint::SetDefaultConstraint - @@ -419,6 +326,99 @@ + + + + + + + 0 + 0 + + + + Custom Outbound Settings + + + + + + Edit + + + + + + + + + + Custom Config Settings + + + + + + Edit + + + + + + + + + + + + + + Apply settings to this group + + + + + + + + 0 + 0 + + + + Qt::Orientation::Horizontal + + + QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok + + + + + + + + + + + + + 0 + 0 + + + + + 400 + 0 + + + + + + + + QLayout::SizeConstraint::SetDefaultConstraint + diff --git a/include/ui/setting/dialog_basic_settings.ui b/include/ui/setting/dialog_basic_settings.ui index d5c4687..bb06225 100644 --- a/include/ui/setting/dialog_basic_settings.ui +++ b/include/ui/setting/dialog_basic_settings.ui @@ -208,6 +208,13 @@ + + + + Allow updating to beta versions + + + diff --git a/src/global/Configs.cpp b/src/global/Configs.cpp index 1231839..44badbb 100644 --- a/src/global/Configs.cpp +++ b/src/global/Configs.cpp @@ -310,6 +310,7 @@ namespace Configs { _add(new configItem("enable_tun_routing", &enable_tun_routing, itemType::boolean)); _add(new configItem("speed_test_mode", &speed_test_mode, itemType::integer)); _add(new configItem("use_mozilla_certs", &use_mozilla_certs, itemType::boolean)); + _add(new configItem("allow_beta_update", &allow_beta_update, itemType::boolean)); } void DataStore::UpdateStartedId(int id) { diff --git a/src/sys/Process.cpp b/src/sys/Process.cpp index 8bf749c..2c3238a 100644 --- a/src/sys/Process.cpp +++ b/src/sys/Process.cpp @@ -5,6 +5,8 @@ #include #include +#include "include/ui/mainwindow.h" + namespace Configs_sys { CoreProcess::~CoreProcess() { } @@ -59,7 +61,8 @@ namespace Configs_sys { if (failed_to_start) return; // no retry if (restarting) return; - MW_dialog_message("ExternalProcess", "CoreCrashed"); + MW_show_log("[Fatal] " + QObject::tr("Core exited, cleaning up...")); + GetMainWindow()->profile_stop(true, true); // Retry rate limit if (coreRestartTimer.isValid()) { @@ -74,7 +77,7 @@ namespace Configs_sys { // Restart start_profile_when_core_is_up = Configs::dataStore->started_id; - MW_show_log("[Fatal] " + QObject::tr("Core exited, restarting.")); + MW_show_log("[Warn] " + QObject::tr("Restarting the core ...")); setTimeout([=,this] { Restart(); }, this, 200); } }); diff --git a/src/ui/mainwindow.cpp b/src/ui/mainwindow.cpp index 34b4bee..e4a087c 100644 --- a/src/ui/mainwindow.cpp +++ b/src/ui/mainwindow.cpp @@ -765,8 +765,6 @@ void MainWindow::dialog_message_impl(const QString &sender, const QString &info) } else if (sender == "ExternalProcess") { if (info == "Crashed") { profile_stop(); - } else if (info == "CoreCrashed") { - profile_stop(true); } else if (info.startsWith("CoreStarted")) { Configs::IsAdmin(true); if (Configs::dataStore->remember_enable || Configs::dataStore->flag_restart_tun_on) { @@ -879,7 +877,6 @@ void MainWindow::prepare_exit() // Configs::dataStore->save_control_no_save = true; // don't change datastore after this line profile_stop(false, true); - sem_stopped.acquire(); QMutex coreKillMu; coreKillMu.lock(); @@ -2413,6 +2410,7 @@ void MainWindow::CheckUpdate() { QJsonArray array = QString2QJsonArray(resp.data); for (const QJsonValue value : array) { QJsonObject release = value.toObject(); + if (release["prerelease"].toBool() && !Configs::dataStore->allow_beta_update) continue; for (const QJsonValue asset : release["assets"].toArray()) { if (asset["name"].toString().contains(search) && asset["name"].toString().section('.', -1) == QString("zip")) { note_pre_release = release["prerelease"].toBool() ? " (Pre-release)" : ""; diff --git a/src/ui/mainwindow_grpc.cpp b/src/ui/mainwindow_grpc.cpp index b8a7ad7..687f059 100644 --- a/src/ui/mainwindow_grpc.cpp +++ b/src/ui/mainwindow_grpc.cpp @@ -524,8 +524,7 @@ void MainWindow::profile_start(int _id) { runOnNewThread([=, this] { // stop current running if (running != nullptr) { - runOnUiThread([=,this] { profile_stop(false, true, true); }); - sem_stopped.acquire(); + profile_stop(false, true, true); } // do start MW_show_log(">>>>>>>> " + tr("Starting profile %1").arg(ent->bean->DisplayTypeAndName())); @@ -564,12 +563,11 @@ void MainWindow::set_spmode_system_proxy(bool enable, bool save) { refresh_status(); } -void MainWindow::profile_stop(bool crash, bool sem, bool manual) { - auto id = Configs::dataStore->started_id; - if (id < 0) { - if (sem) sem_stopped.release(); +void MainWindow::profile_stop(bool crash, bool block, bool manual) { + if (running == nullptr) { return; } + auto id = running->id; auto profile_stop_stage2 = [=,this] { if (!crash) { @@ -586,9 +584,10 @@ void MainWindow::profile_stop(bool crash, bool sem, bool manual) { }; if (!mu_stopping.tryLock()) { - if (sem) sem_stopped.release(); return; } + QMutex blocker; + if (block) blocker.lock(); // timeout message auto restartMsgbox = new QMessageBox(QMessageBox::Question, software_name, tr("If there is no response for a long time, it is recommended to restart the software."), @@ -612,7 +611,7 @@ void MainWindow::profile_stop(bool crash, bool sem, bool manual) { restartMsgboxTimer->deleteLater(); restartMsgbox->deleteLater(); - runOnNewThread([=, this] { + runOnNewThread([=, this, &blocker] { // do stop MW_show_log(">>>>>>>> " + tr("Stopping profile %1").arg(running->bean->DisplayTypeAndName())); if (!profile_stop_stage2()) { @@ -623,13 +622,19 @@ void MainWindow::profile_stop(bool crash, bool sem, bool manual) { Configs::dataStore->need_keep_vpn_off = false; running = nullptr; - if (sem) sem_stopped.release(); + if (block) blocker.unlock(); - runOnUiThread([=, this] { + runOnUiThread([=, this, &blocker] { refresh_status(); refresh_proxy_list_impl_refresh_data(id, true); mu_stopping.unlock(); }); }); + + if (block) + { + blocker.lock(); + blocker.unlock(); + } } diff --git a/src/ui/setting/dialog_basic_settings.cpp b/src/ui/setting/dialog_basic_settings.cpp index 3682b56..76c2d6c 100644 --- a/src/ui/setting/dialog_basic_settings.cpp +++ b/src/ui/setting/dialog_basic_settings.cpp @@ -37,6 +37,7 @@ DialogBasicSettings::DialogBasicSettings(QWidget *parent) D_LOAD_BOOL(disable_tray) ui->speedtest_mode->setCurrentIndex(Configs::dataStore->speed_test_mode); ui->simple_down_url->setText(Configs::dataStore->simple_dl_url); + ui->allow_beta->setChecked(Configs::dataStore->allow_beta_update); connect(ui->custom_inbound_edit, &QPushButton::clicked, this, [=,this] { C_EDIT_JSON_ALLOW_EMPTY(custom_inbound) @@ -174,6 +175,7 @@ void DialogBasicSettings::accept() { Configs::dataStore->proxy_scheme = ui->proxy_scheme->currentText().toLower(); Configs::dataStore->speed_test_mode = ui->speedtest_mode->currentIndex(); Configs::dataStore->simple_dl_url = ui->simple_down_url->text(); + Configs::dataStore->allow_beta_update = ui->allow_beta->isChecked(); // Style