From 9196387fe66f42f408773b9db6a905e759cdba0f Mon Sep 17 00:00:00 2001 From: Tindy X <49061470+tindy2013@users.noreply.github.com> Date: Wed, 1 Jan 2020 14:30:41 +0800 Subject: [PATCH] Enhancements Add loading external custom configuration from URL. Optimize codes. --- src/main.cpp | 103 ++++++++++++++++++++++++++++++++++++--------------- src/misc.h | 6 +++ 2 files changed, 79 insertions(+), 30 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 5705aa4..8d13f3b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -253,6 +253,38 @@ void readConf() std::cerr<<"Read preference settings completed."< rca; if(!url.size()) @@ -301,34 +333,53 @@ std::string subconverter(RESPONSE_CALLBACK_ARGS) if(!api_mode || cfw_child_process) readConf(); - if(groups.size()) + std::string proxy; + if(proxy_subscription == "SYSTEM") + proxy = getSystemProxy(); + else if(proxy_subscription == "NONE") + proxy = ""; + else + proxy = proxy_subscription; + + if(config.size()) { - extra_group = split(groups, "@"); - if(!extra_group.size()) - extra_group = clash_extra_group; + std::cerr<<"External configuration file provided. Loading...\n"; + extra_group = clash_extra_group; + extra_ruleset = rulesets; + loadExternalConfig(config, extra_group, extra_ruleset, proxy); + refreshRulesets(extra_ruleset, rca); } else - extra_group = clash_extra_group; - - if(ruleset.size()) { - extra_ruleset = split(ruleset, "@"); - if(!extra_ruleset.size()) + if(groups.size()) + { + extra_group = split(groups, "@"); + if(!extra_group.size()) + extra_group = clash_extra_group; + } + else + extra_group = clash_extra_group; + + if(ruleset.size()) + { + extra_ruleset = split(ruleset, "@"); + if(!extra_ruleset.size()) + { + if(update_ruleset_on_request || cfw_child_process) + refreshRulesets(rulesets, ruleset_content_array); + rca = ruleset_content_array; + } + else + { + refreshRulesets(extra_ruleset, rca); + } + } + else { if(update_ruleset_on_request || cfw_child_process) refreshRulesets(rulesets, ruleset_content_array); rca = ruleset_content_array; } - else - { - refreshRulesets(extra_ruleset, rca); - } - } - else - { - if(update_ruleset_on_request || cfw_child_process) - refreshRulesets(rulesets, ruleset_content_array); - rca = ruleset_content_array; } extra_settings ext; @@ -346,14 +397,6 @@ std::string subconverter(RESPONSE_CALLBACK_ARGS) else ext.append_proxy_type = append_proxy_type; - std::string proxy; - if(proxy_subscription == "SYSTEM") - proxy = getSystemProxy(); - else if(proxy_subscription == "NONE") - proxy = ""; - else - proxy = proxy_subscription; - ext.tfo = tfo.size() ? tfo == "true" : tfo_flag; ext.udp = udp.size() ? udp == "true" : udp_flag; ext.sort_flag = sort_flag.size() ? sort_flag == "true" : do_sort; @@ -390,7 +433,7 @@ std::string subconverter(RESPONSE_CALLBACK_ARGS) if(target == "clash" || target == "clashr") { std::cerr<<"Clash"<<((target == "clashr") ? "R" : "")< static inline void eraseElements(std::vector &target) +{ + target.clear(); + target.shrink_to_fit(); +} + template static inline void eraseElements(T &target) { T().swap(target);