diff --git a/main/NekoGui.cpp b/main/NekoGui.cpp index 154ecd8..fd176a5 100644 --- a/main/NekoGui.cpp +++ b/main/NekoGui.cpp @@ -1,4 +1,5 @@ #include "NekoGui.hpp" +#include "fmt/Preset.hpp" #include #include @@ -314,6 +315,10 @@ namespace NekoGui { "domain:crashlytics.com\n" "domain:google-analytics.com"; } + if (IS_NEKO_BOX) { + if (!Preset::SingBox::DomainStrategy.contains(domain_strategy)) domain_strategy = ""; + if (!Preset::SingBox::DomainStrategy.contains(outbound_domain_strategy)) outbound_domain_strategy = ""; + } _add(new configItem("direct_ip", &this->direct_ip, itemType::string)); _add(new configItem("direct_domain", &this->direct_domain, itemType::string)); _add(new configItem("proxy_ip", &this->proxy_ip, itemType::string)); @@ -337,12 +342,12 @@ namespace NekoGui { QString Routing::DisplayRouting() const { return QString("[Proxy] %1\n[Proxy] %2\n[Direct] %3\n[Direct] %4\n[Block] %5\n[Block] %6\n[Default Outbound] %7\n[DNS] %8") - .arg(SplitLinesSkipSharp(proxy_domain).join(",")) - .arg(SplitLinesSkipSharp(proxy_ip).join(",")) - .arg(SplitLinesSkipSharp(direct_domain).join(",")) - .arg(SplitLinesSkipSharp(direct_ip).join(",")) - .arg(SplitLinesSkipSharp(block_domain).join(",")) - .arg(SplitLinesSkipSharp(block_ip).join(",")) + .arg(SplitLinesSkipSharp(proxy_domain).join(","), 10) + .arg(SplitLinesSkipSharp(proxy_ip).join(","), 10) + .arg(SplitLinesSkipSharp(direct_domain).join(","), 10) + .arg(SplitLinesSkipSharp(direct_ip).join(","), 10) + .arg(SplitLinesSkipSharp(block_domain).join(","), 10) + .arg(SplitLinesSkipSharp(block_ip).join(","), 10) .arg(def_outbound) .arg(use_dns_object ? "DNS Object" : "Simple DNS"); } @@ -352,11 +357,16 @@ namespace NekoGui { return dr.entryList(QDir::Files); } - void Routing::SetToActive(const QString &name) { + bool Routing::SetToActive(const QString &name) { + NekoGui::dataStore->routing = std::make_unique(); + NekoGui::dataStore->routing->load_control_must = true; NekoGui::dataStore->routing->fn = ROUTES_PREFIX + name; - NekoGui::dataStore->routing->Load(); - NekoGui::dataStore->active_routing = name; - NekoGui::dataStore->Save(); + auto ok = NekoGui::dataStore->routing->Load(); + if (ok) { + NekoGui::dataStore->active_routing = name; + NekoGui::dataStore->Save(); + } + return ok; } // NO default extra core diff --git a/main/NekoGui_DataStore.hpp b/main/NekoGui_DataStore.hpp index fb5c3e2..492de2b 100644 --- a/main/NekoGui_DataStore.hpp +++ b/main/NekoGui_DataStore.hpp @@ -33,7 +33,7 @@ namespace NekoGui { static QStringList List(); - static void SetToActive(const QString &name); + static bool SetToActive(const QString &name); }; class ExtraCore : public JsonStore { @@ -74,7 +74,7 @@ namespace NekoGui { QString appdataDir = ""; QStringList ignoreConnTag = {}; - Routing *routing = new Routing; + std::unique_ptr routing; int imported_count = 0; bool refreshing_group_list = false; bool refreshing_group = false; diff --git a/main/NekoGui_Utils.cpp b/main/NekoGui_Utils.cpp index 83fc4ef..92a0672 100644 --- a/main/NekoGui_Utils.cpp +++ b/main/NekoGui_Utils.cpp @@ -30,12 +30,14 @@ QStringList SplitLines(const QString &_string) { #endif } -QStringList SplitLinesSkipSharp(const QString &_string) { +QStringList SplitLinesSkipSharp(const QString &_string, int maxLine) { auto lines = SplitLines(_string); QStringList newLines; + int i = 0; for (const auto &line: lines) { if (line.trimmed().startsWith("#")) continue; newLines << line; + if (maxLine > 0 && ++i >= maxLine) break; } return newLines; } diff --git a/main/NekoGui_Utils.hpp b/main/NekoGui_Utils.hpp index 8b9719c..ab2d750 100644 --- a/main/NekoGui_Utils.hpp +++ b/main/NekoGui_Utils.hpp @@ -50,7 +50,7 @@ QString QStringList2Command(const QStringList &list); QStringList SplitLines(const QString &_string); -QStringList SplitLinesSkipSharp(const QString &_string); +QStringList SplitLinesSkipSharp(const QString &_string, int maxLine = 0); // Base64 diff --git a/main/main.cpp b/main/main.cpp index 1281984..d619358 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -219,6 +219,7 @@ int main(int argc, char* argv[]) { if (NekoGui::dataStore->start_minimal) NekoGui::dataStore->flag_tray = true; // load routing + NekoGui::dataStore->routing = std::make_unique(); NekoGui::dataStore->routing->fn = ROUTES_PREFIX + NekoGui::dataStore->active_routing; isLoaded = NekoGui::dataStore->routing->Load(); if (!isLoaded) { diff --git a/ui/dialog_manage_routes.cpp b/ui/dialog_manage_routes.cpp index 55dfc50..c6bf0ae 100644 --- a/ui/dialog_manage_routes.cpp +++ b/ui/dialog_manage_routes.cpp @@ -89,7 +89,7 @@ DialogManageRoutes::DialogManageRoutes(QWidget *parent) : QDialog(parent), ui(ne ui->proxyIPLayout->addWidget(proxyIPTxt, 0, 0); ui->blockIPLayout->addWidget(blockIPTxt, 0, 0); // - REFRESH_ACTIVE_ROUTING(NekoGui::dataStore->active_routing, NekoGui::dataStore->routing) + REFRESH_ACTIVE_ROUTING(NekoGui::dataStore->active_routing, NekoGui::dataStore->routing.get()) ADD_ASTERISK(this) } @@ -102,7 +102,7 @@ void DialogManageRoutes::accept() { D_C_SAVE_STRING(custom_route_global) bool routeChanged = false; if (NekoGui::dataStore->active_routing != active_routing) routeChanged = true; - SaveDisplayRouting(NekoGui::dataStore->routing); + SaveDisplayRouting(NekoGui::dataStore->routing.get()); NekoGui::dataStore->active_routing = active_routing; NekoGui::dataStore->routing->fn = ROUTES_PREFIX + NekoGui::dataStore->active_routing; if (NekoGui::dataStore->routing->Save()) routeChanged = true; @@ -211,7 +211,7 @@ void DialogManageRoutes::on_load_save_clicked() { r->fn = ROUTES_PREFIX + fn; if (r->Load()) { if (QMessageBox::question(nullptr, software_name, tr("Load routing: %1").arg(fn) + "\n" + r->DisplayRouting()) == QMessageBox::Yes) { - REFRESH_ACTIVE_ROUTING(fn, r.get()) + REFRESH_ACTIVE_ROUTING(fn, r.get()) // temp save to the window w->accept(); } } @@ -238,7 +238,7 @@ void DialogManageRoutes::on_load_save_clicked() { f.remove(); if (NekoGui::dataStore->active_routing == fn) { NekoGui::Routing::SetToActive(NekoGui::Routing::List().first()); - REFRESH_ACTIVE_ROUTING(NekoGui::dataStore->active_routing, NekoGui::dataStore->routing) + REFRESH_ACTIVE_ROUTING(NekoGui::dataStore->active_routing, NekoGui::dataStore->routing.get()) } w->accept(); } diff --git a/ui/mainwindow.cpp b/ui/mainwindow.cpp index 0942456..3b6f0e1 100644 --- a/ui/mainwindow.cpp +++ b/ui/mainwindow.cpp @@ -94,8 +94,6 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWi software_core_name = "sing-box"; // replace default values if (NekoGui::dataStore->log_level == "warning") NekoGui::dataStore->log_level = "info"; - if (!Preset::SingBox::DomainStrategy.contains(NekoGui::dataStore->routing->domain_strategy)) NekoGui::dataStore->routing->domain_strategy = ""; - if (!Preset::SingBox::DomainStrategy.contains(NekoGui::dataStore->routing->outbound_domain_strategy)) NekoGui::dataStore->routing->outbound_domain_strategy = ""; if (NekoGui::dataStore->mux_protocol.isEmpty()) NekoGui::dataStore->mux_protocol = "h2mux"; // if (QDir("dashboard").count() == 0) {