mirror of
				https://github.com/2dust/v2rayN.git
				synced 2025-10-27 02:34:41 +00:00 
			
		
		
		
	spell check and update
This commit is contained in:
		
							parent
							
								
									4af148f480
								
							
						
					
					
						commit
						1b118ea911
					
				
					 83 changed files with 815 additions and 815 deletions
				
			
		|  | @ -1,7 +1,7 @@ | |||
| using System.Windows; | ||||
| using System.Windows.Threading; | ||||
| using v2rayN.Handler; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| 
 | ||||
| namespace v2rayN | ||||
| { | ||||
|  | @ -27,11 +27,11 @@ namespace v2rayN | |||
|         /// <param name="e"></param> | ||||
|         protected override void OnStartup(StartupEventArgs e) | ||||
|         { | ||||
|             var exePathKey = Utils.GetMD5(Utils.GetExePath()); | ||||
|             var exePathKey = Utile.GetMD5(Utile.GetExePath()); | ||||
| 
 | ||||
|             var rebootas = (e.Args ?? new string[] { }).Any(t => t == Global.RebootAs); | ||||
|             var rebootAs = (e.Args ?? new string[] { }).Any(t => t == Global.RebootAs); | ||||
|             ProgramStarted = new EventWaitHandle(false, EventResetMode.AutoReset, exePathKey, out bool bCreatedNew); | ||||
|             if (!rebootas && !bCreatedNew) | ||||
|             if (!rebootAs && !bCreatedNew) | ||||
|             { | ||||
|                 ProgramStarted.Set(); | ||||
|                 Current.Shutdown(); | ||||
|  | @ -42,7 +42,7 @@ namespace v2rayN | |||
|             Logging.Setup(); | ||||
|             Init(); | ||||
|             Logging.LoggingEnabled(_config.guiItem.enableLog); | ||||
|             Logging.SaveLog($"v2rayN start up | {Utils.GetVersion()} | {Utils.GetExePath()}"); | ||||
|             Logging.SaveLog($"v2rayN start up | {Utile.GetVersion()} | {Utile.GetExePath()}"); | ||||
|             Logging.ClearLogs(); | ||||
| 
 | ||||
|             Thread.CurrentThread.CurrentUICulture = new(_config.uiItem.currentLanguage); | ||||
|  |  | |||
|  | @ -19,9 +19,9 @@ namespace v2rayN | |||
|             Uri uri = new(url); | ||||
|             //Authorization Header | ||||
|             var headers = new WebHeaderCollection(); | ||||
|             if (!Utils.IsNullOrEmpty(uri.UserInfo)) | ||||
|             if (!Utile.IsNullOrEmpty(uri.UserInfo)) | ||||
|             { | ||||
|                 headers.Add(HttpRequestHeader.Authorization, "Basic " + Utils.Base64Encode(uri.UserInfo)); | ||||
|                 headers.Add(HttpRequestHeader.Authorization, "Basic " + Utile.Base64Encode(uri.UserInfo)); | ||||
|             } | ||||
| 
 | ||||
|             var downloadOpt = new DownloadConfiguration() | ||||
|  |  | |||
|  | @ -20,7 +20,7 @@ namespace v2rayN | |||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|         public static void UncompressFile(string fileName, byte[] content) | ||||
|         public static void UncompressedFile(string fileName, byte[] content) | ||||
|         { | ||||
|             try | ||||
|             { | ||||
|  | @ -67,7 +67,7 @@ namespace v2rayN | |||
|                     } | ||||
|                     try | ||||
|                     { | ||||
|                         if (!Utils.IsNullOrEmpty(ignoredName) && entry.Name.Contains(ignoredName)) | ||||
|                         if (!Utile.IsNullOrEmpty(ignoredName) && entry.Name.Contains(ignoredName)) | ||||
|                         { | ||||
|                             continue; | ||||
|                         } | ||||
|  |  | |||
|  | @ -35,7 +35,7 @@ namespace v2rayN | |||
| 
 | ||||
|         public async Task PutAsync(string url, Dictionary<string, string> headers) | ||||
|         { | ||||
|             var jsonContent = JsonUtils.Serialize(headers); | ||||
|             var jsonContent = JsonUtile.Serialize(headers); | ||||
|             var content = new StringContent(jsonContent, Encoding.UTF8, MediaTypeNames.Application.Json); | ||||
| 
 | ||||
|             var result = await httpClient.PutAsync(url, content); | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ using System.Text.Json.Serialization; | |||
| 
 | ||||
| namespace v2rayN | ||||
| { | ||||
|     internal class JsonUtils | ||||
|     internal class JsonUtile | ||||
|     { | ||||
|         /// <summary> | ||||
|         /// DeepCopy | ||||
|  | @ -13,7 +13,7 @@ namespace v2rayN | |||
|             FileTarget fileTarget = new(); | ||||
|             config.AddTarget("file", fileTarget); | ||||
|             fileTarget.Layout = "${longdate}-${level:uppercase=true} ${message}"; | ||||
|             fileTarget.FileName = Utils.GetLogPath("${shortdate}.txt"); | ||||
|             fileTarget.FileName = Utile.GetLogPath("${shortdate}.txt"); | ||||
|             config.LoggingRules.Add(new LoggingRule("*", LogLevel.Debug, fileTarget)); | ||||
|             LogManager.Configuration = config; | ||||
|         } | ||||
|  | @ -33,7 +33,7 @@ namespace v2rayN | |||
|                 try | ||||
|                 { | ||||
|                     var now = DateTime.Now.AddMonths(-1); | ||||
|                     var dir = Utils.GetLogPath(); | ||||
|                     var dir = Utile.GetLogPath(); | ||||
|                     var files = Directory.GetFiles(dir, "*.txt"); | ||||
|                     foreach (var filePath in files) | ||||
|                     { | ||||
|  |  | |||
|  | @ -29,22 +29,22 @@ namespace v2rayN | |||
| 
 | ||||
|         public static IOrderedQueryable<T> OrderByInternal<T, TProp>(IQueryable<T> query, PropertyInfo memberProperty) | ||||
|         {//public | ||||
|             return query.OrderBy(_GetLamba<T, TProp>(memberProperty)); | ||||
|             return query.OrderBy(_GetLambda<T, TProp>(memberProperty)); | ||||
|         } | ||||
| 
 | ||||
|         public static IOrderedQueryable<T> OrderByDescendingInternal<T, TProp>(IQueryable<T> query, PropertyInfo memberProperty) | ||||
|         {//public | ||||
|             return query.OrderByDescending(_GetLamba<T, TProp>(memberProperty)); | ||||
|             return query.OrderByDescending(_GetLambda<T, TProp>(memberProperty)); | ||||
|         } | ||||
| 
 | ||||
|         private static Expression<Func<T, TProp>> _GetLamba<T, TProp>(PropertyInfo memberProperty) | ||||
|         private static Expression<Func<T, TProp>> _GetLambda<T, TProp>(PropertyInfo memberProperty) | ||||
|         { | ||||
|             if (memberProperty.PropertyType != typeof(TProp)) throw new Exception(); | ||||
| 
 | ||||
|             var thisArg = Expression.Parameter(typeof(T)); | ||||
|             var lamba = Expression.Lambda<Func<T, TProp>>(Expression.Property(thisArg, memberProperty), thisArg); | ||||
|             var lambda = Expression.Lambda<Func<T, TProp>>(Expression.Property(thisArg, memberProperty), thisArg); | ||||
| 
 | ||||
|             return lamba; | ||||
|             return lambda; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -3,19 +3,19 @@ using System.Collections; | |||
| 
 | ||||
| namespace v2rayN | ||||
| { | ||||
|     public sealed class SqliteHelper | ||||
|     public sealed class SQLiteHelper | ||||
|     { | ||||
|         private static readonly Lazy<SqliteHelper> _instance = new(() => new()); | ||||
|         public static SqliteHelper Instance => _instance.Value; | ||||
|         private static readonly Lazy<SQLiteHelper> _instance = new(() => new()); | ||||
|         public static SQLiteHelper Instance => _instance.Value; | ||||
|         private string _connstr; | ||||
|         private SQLiteConnection _db; | ||||
|         private SQLiteAsyncConnection _dbAsync; | ||||
|         private static readonly object objLock = new(); | ||||
|         public readonly string _configDB = "guiNDB.db"; | ||||
| 
 | ||||
|         public SqliteHelper() | ||||
|         public SQLiteHelper() | ||||
|         { | ||||
|             _connstr = Utils.GetConfigPath(_configDB); | ||||
|             _connstr = Utile.GetConfigPath(_configDB); | ||||
|             _db = new SQLiteConnection(_connstr, false); | ||||
|             _dbAsync = new SQLiteAsyncConnection(_connstr, false); | ||||
|         } | ||||
|  | @ -51,7 +51,7 @@ namespace v2rayN | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public async Task<int> Replacesync(object model) | ||||
|         public async Task<int> ReplaceAsync(object model) | ||||
|         { | ||||
|             return await _dbAsync.InsertOrReplaceAsync(model); | ||||
|         } | ||||
|  |  | |||
|  | @ -25,7 +25,7 @@ using ZXing.Windows.Compatibility; | |||
| 
 | ||||
| namespace v2rayN | ||||
| { | ||||
|     internal class Utils | ||||
|     internal class Utile | ||||
|     { | ||||
|         #region 资源Json操作 | ||||
| 
 | ||||
|  | @ -404,7 +404,7 @@ namespace v2rayN | |||
|         /// </summary> | ||||
|         /// <param name="oText"></param> | ||||
|         /// <returns></returns> | ||||
|         public static bool IsNumberic(string oText) | ||||
|         public static bool IsNumeric(string oText) | ||||
|         { | ||||
|             try | ||||
|             { | ||||
|  | @ -456,7 +456,7 @@ namespace v2rayN | |||
|                 string[] cidr = ip.Split('/'); | ||||
|                 if (cidr.Length == 2) | ||||
|                 { | ||||
|                     if (!IsNumberic(cidr[0])) | ||||
|                     if (!IsNumeric(cidr[0])) | ||||
|                     { | ||||
|                         return false; | ||||
|                     } | ||||
|  | @ -581,7 +581,7 @@ namespace v2rayN | |||
|             try | ||||
|             { | ||||
|                 int defaultPort = 9090; | ||||
|                 if (!Utils.PortInUse(defaultPort)) | ||||
|                 if (!Utile.PortInUse(defaultPort)) | ||||
|                 { | ||||
|                     return defaultPort; | ||||
|                 } | ||||
|  | @ -14,7 +14,7 @@ namespace v2rayN.Converters | |||
|                 var fontFamily = LazyConfig.Instance.GetConfig().uiItem.currentFontFamily; | ||||
|                 if (!string.IsNullOrEmpty(fontFamily)) | ||||
|                 { | ||||
|                     var fontPath = Utils.GetFontsPath(); | ||||
|                     var fontPath = Utile.GetFontsPath(); | ||||
|                     MyFont = new FontFamily(new Uri(@$"file:///{fontPath}\"), $"./#{fontFamily}"); | ||||
|                 } | ||||
|             } | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| 
 | ||||
| namespace v2rayN | ||||
| { | ||||
|  | @ -35,8 +35,8 @@ namespace v2rayN | |||
|         public const string CoreSpeedtestConfigFileName = "configSpeedtest.json"; | ||||
|         public const string V2raySampleClient = "v2rayN.Sample.SampleClientConfig"; | ||||
|         public const string SingboxSampleClient = "v2rayN.Sample.SingboxSampleClientConfig"; | ||||
|         public const string V2raySampleHttprequestFileName = "v2rayN.Sample.SampleHttprequest"; | ||||
|         public const string V2raySampleHttpresponseFileName = "v2rayN.Sample.SampleHttpresponse"; | ||||
|         public const string V2raySampleHttpRequestFileName = "v2rayN.Sample.SampleHttpRequest"; | ||||
|         public const string V2raySampleHttpResponseFileName = "v2rayN.Sample.SampleHttpResponse"; | ||||
|         public const string V2raySampleInbound = "v2rayN.Sample.SampleInbound"; | ||||
|         public const string V2raySampleOutbound = "v2rayN.Sample.SampleOutbound"; | ||||
|         public const string SingboxSampleOutbound = "v2rayN.Sample.SingboxSampleOutbound"; | ||||
|  | @ -62,7 +62,7 @@ namespace v2rayN | |||
|         public const string InboundHttp2 = "http2"; | ||||
|         public const string Loopback = "127.0.0.1"; | ||||
|         public const string InboundAPITagName = "api"; | ||||
|         public const string InboundAPIProtocal = "dokodemo-door"; | ||||
|         public const string InboundAPIProtocol = "dokodemo-door"; | ||||
|         public const string HttpProtocol = "http://"; | ||||
|         public const string HttpsProtocol = "https://"; | ||||
| 
 | ||||
|  | @ -74,8 +74,8 @@ namespace v2rayN | |||
|         public const string CustomIconName = "v2rayN.ico"; | ||||
|         public const string IEProxyExceptions = "localhost;127.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;192.168.*"; | ||||
|         public const string RoutingRuleComma = "<COMMA>"; | ||||
|         public const string GrpcgunMode = "gun"; | ||||
|         public const string GrpcmultiMode = "multi"; | ||||
|         public const string GrpcGunMode = "gun"; | ||||
|         public const string GrpcMultiMode = "multi"; | ||||
|         public const int MaxPort = 65536; | ||||
|         public const string CommandClearMsg = "CommandClearMsg"; | ||||
|         public const string DelayUnit = ""; | ||||
|  | @ -122,7 +122,7 @@ namespace v2rayN | |||
|             @"https://www.google.com/generate_204", | ||||
|         }; | ||||
| 
 | ||||
|         public static readonly Dictionary<string, string> UserAgentTxts = new() | ||||
|         public static readonly Dictionary<string, string> UserAgentTexts = new() | ||||
|         { | ||||
|             {"chrome","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36" }, | ||||
|             {"firefox","Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0" }, | ||||
|  | @ -157,23 +157,23 @@ namespace v2rayN | |||
|             {EConfigType.Wireguard,"wireguard"} | ||||
|         }; | ||||
| 
 | ||||
|         public static readonly List<string> VmessSecuritys = new() { "aes-128-gcm", "chacha20-poly1305", "auto", "none", "zero" }; | ||||
|         public static readonly List<string> SsSecuritys = new() { "aes-256-gcm", "aes-128-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305", "none", "plain" }; | ||||
|         public static readonly List<string> SsSecuritysInSagerNet = new() { "none", "2022-blake3-aes-128-gcm", "2022-blake3-aes-256-gcm", "2022-blake3-chacha20-poly1305", "aes-128-gcm", "aes-192-gcm", "aes-256-gcm", "chacha20-ietf-poly1305", "xchacha20-ietf-poly1305", "rc4", "rc4-md5", "aes-128-ctr", "aes-192-ctr", "aes-256-ctr", "aes-128-cfb", "aes-192-cfb", "aes-256-cfb", "aes-128-cfb8", "aes-192-cfb8", "aes-256-cfb8", "aes-128-ofb", "aes-192-ofb", "aes-256-ofb", "bf-cfb", "cast5-cfb", "des-cfb", "idea-cfb", "rc2-cfb", "seed-cfb", "camellia-128-cfb", "camellia-192-cfb", "camellia-256-cfb", "camellia-128-cfb8", "camellia-192-cfb8", "camellia-256-cfb8", "salsa20", "chacha20", "chacha20-ietf", "xchacha20" }; | ||||
|         public static readonly List<string> SsSecuritysInXray = new() { "aes-256-gcm", "aes-128-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305", "xchacha20-poly1305", "xchacha20-ietf-poly1305", "none", "plain", "2022-blake3-aes-128-gcm", "2022-blake3-aes-256-gcm", "2022-blake3-chacha20-poly1305" }; | ||||
|         public static readonly List<string> SsSecuritysInSingbox = new() { "aes-256-gcm", "aes-192-gcm", "aes-128-gcm", "chacha20-ietf-poly1305", "xchacha20-ietf-poly1305", "none", "2022-blake3-aes-128-gcm", "2022-blake3-aes-256-gcm", "2022-blake3-chacha20-poly1305", "aes-128-ctr", "aes-192-ctr", "aes-256-ctr", "aes-128-cfb", "aes-192-cfb", "aes-256-cfb", "rc4-md5", "chacha20-ietf", "xchacha20" }; | ||||
|         public static readonly List<string> VmessSecurities = new() { "aes-128-gcm", "chacha20-poly1305", "auto", "none", "zero" }; | ||||
|         public static readonly List<string> SsSecurities = new() { "aes-256-gcm", "aes-128-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305", "none", "plain" }; | ||||
|         public static readonly List<string> SsSecuritiesInSagerNet = new() { "none", "2022-blake3-aes-128-gcm", "2022-blake3-aes-256-gcm", "2022-blake3-chacha20-poly1305", "aes-128-gcm", "aes-192-gcm", "aes-256-gcm", "chacha20-ietf-poly1305", "xchacha20-ietf-poly1305", "rc4", "rc4-md5", "aes-128-ctr", "aes-192-ctr", "aes-256-ctr", "aes-128-cfb", "aes-192-cfb", "aes-256-cfb", "aes-128-cfb8", "aes-192-cfb8", "aes-256-cfb8", "aes-128-ofb", "aes-192-ofb", "aes-256-ofb", "bf-cfb", "cast5-cfb", "des-cfb", "idea-cfb", "rc2-cfb", "seed-cfb", "camellia-128-cfb", "camellia-192-cfb", "camellia-256-cfb", "camellia-128-cfb8", "camellia-192-cfb8", "camellia-256-cfb8", "salsa20", "chacha20", "chacha20-ietf", "xchacha20" }; | ||||
|         public static readonly List<string> SsSecuritiesInXray = new() { "aes-256-gcm", "aes-128-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305", "xchacha20-poly1305", "xchacha20-ietf-poly1305", "none", "plain", "2022-blake3-aes-128-gcm", "2022-blake3-aes-256-gcm", "2022-blake3-chacha20-poly1305" }; | ||||
|         public static readonly List<string> SsSecuritiesInSingbox = new() { "aes-256-gcm", "aes-192-gcm", "aes-128-gcm", "chacha20-ietf-poly1305", "xchacha20-ietf-poly1305", "none", "2022-blake3-aes-128-gcm", "2022-blake3-aes-256-gcm", "2022-blake3-chacha20-poly1305", "aes-128-ctr", "aes-192-ctr", "aes-256-ctr", "aes-128-cfb", "aes-192-cfb", "aes-256-cfb", "rc4-md5", "chacha20-ietf", "xchacha20" }; | ||||
|         public static readonly List<string> Flows = new() { "", "xtls-rprx-vision", "xtls-rprx-vision-udp443" }; | ||||
|         public static readonly List<string> Networks = new() { "tcp", "kcp", "ws", "h2", "quic", "grpc" }; | ||||
|         public static readonly List<string> KcpHeaderTypes = new() { "srtp", "utp", "wechat-video", "dtls", "wireguard" }; | ||||
|         public static readonly List<string> CoreTypes = new() { "v2fly", "SagerNet", "Xray", "sing_box" }; | ||||
|         public static readonly List<string> CoreTypes4VLESS = new() { "Xray", "sing_box" }; | ||||
|         public static readonly List<string> DomainStrategys = new() { "AsIs", "IPIfNonMatch", "IPOnDemand" }; | ||||
|         public static readonly List<string> DomainStrategys4Singbox = new() { "ipv4_only", "ipv6_only", "prefer_ipv4", "prefer_ipv6", "" }; | ||||
|         public static readonly List<string> DomainStrategies = new() { "AsIs", "IPIfNonMatch", "IPOnDemand" }; | ||||
|         public static readonly List<string> DomainStrategies4Singbox = new() { "ipv4_only", "ipv6_only", "prefer_ipv4", "prefer_ipv6", "" }; | ||||
|         public static readonly List<string> DomainMatchers = new() { "linear", "mph", "" }; | ||||
|         public static readonly List<string> Fingerprints = new() { "chrome", "firefox", "safari", "ios", "android", "edge", "360", "qq", "random", "randomized", "" }; | ||||
|         public static readonly List<string> UserAgent = new() { "chrome", "firefox", "safari", "edge", "none" }; | ||||
| 
 | ||||
|         public static readonly List<string> AllowInsecures = new() { "true", "false", "" }; | ||||
|         public static readonly List<string> AllowInsecure = new() { "true", "false", "" }; | ||||
|         public static readonly List<string> DomainStrategy4Freedoms = new() { "AsIs", "UseIP", "UseIPv4", "UseIPv6", "" }; | ||||
|         public static readonly List<string> Languages = new() { "zh-Hans", "zh-Hant", "en", "fa-Ir", "ru" }; | ||||
|         public static readonly List<string> Alpns = new() { "h3", "h2", "http/1.1", "h3,h2,http/1.1", "h3,h2", "h2,http/1.1", "" }; | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| using System.Data; | ||||
| using System.IO; | ||||
| using System.Text.RegularExpressions; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| 
 | ||||
| namespace v2rayN.Handler | ||||
| { | ||||
|  | @ -23,15 +23,15 @@ namespace v2rayN.Handler | |||
|         public static int LoadConfig(ref Config? config) | ||||
|         { | ||||
|             //载入配置文件 | ||||
|             var result = Utils.LoadResource(Utils.GetConfigPath(configRes)); | ||||
|             if (!Utils.IsNullOrEmpty(result)) | ||||
|             var result = Utile.LoadResource(Utile.GetConfigPath(configRes)); | ||||
|             if (!Utile.IsNullOrEmpty(result)) | ||||
|             { | ||||
|                 //转成Json | ||||
|                 config = JsonUtils.Deserialize<Config>(result); | ||||
|                 config = JsonUtile.Deserialize<Config>(result); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 if (File.Exists(Utils.GetConfigPath(configRes))) | ||||
|                 if (File.Exists(Utile.GetConfigPath(configRes))) | ||||
|                 { | ||||
|                     Logging.SaveLog("LoadConfig Exception"); | ||||
|                     return -1; | ||||
|  | @ -92,11 +92,11 @@ namespace v2rayN.Handler | |||
|                 }; | ||||
|             } | ||||
|             //路由规则 | ||||
|             if (Utils.IsNullOrEmpty(config.routingBasicItem.domainStrategy)) | ||||
|             if (Utile.IsNullOrEmpty(config.routingBasicItem.domainStrategy)) | ||||
|             { | ||||
|                 config.routingBasicItem.domainStrategy = Global.DomainStrategys[0];//"IPIfNonMatch"; | ||||
|                 config.routingBasicItem.domainStrategy = Global.DomainStrategies[0];//"IPIfNonMatch"; | ||||
|             } | ||||
|             //if (Utils.IsNullOrEmpty(config.domainMatcher)) | ||||
|             //if (Utile.IsNullOrEmpty(config.domainMatcher)) | ||||
|             //{ | ||||
|             //    config.domainMatcher = "linear"; | ||||
|             //} | ||||
|  | @ -151,7 +151,7 @@ namespace v2rayN.Handler | |||
|             { | ||||
|                 config.uiItem.mainColumnItem = new(); | ||||
|             } | ||||
|             if (Utils.IsNullOrEmpty(config.uiItem.currentLanguage)) | ||||
|             if (Utile.IsNullOrEmpty(config.uiItem.currentLanguage)) | ||||
|             { | ||||
|                 config.uiItem.currentLanguage = Global.Languages[0]; | ||||
|             } | ||||
|  | @ -160,7 +160,7 @@ namespace v2rayN.Handler | |||
|             { | ||||
|                 config.constItem = new ConstItem(); | ||||
|             } | ||||
|             if (Utils.IsNullOrEmpty(config.constItem.defIEProxyExceptions)) | ||||
|             if (Utile.IsNullOrEmpty(config.constItem.defIEProxyExceptions)) | ||||
|             { | ||||
|                 config.constItem.defIEProxyExceptions = Global.IEProxyExceptions; | ||||
|             } | ||||
|  | @ -173,11 +173,11 @@ namespace v2rayN.Handler | |||
|             { | ||||
|                 config.speedTestItem.speedTestTimeout = 10; | ||||
|             } | ||||
|             if (Utils.IsNullOrEmpty(config.speedTestItem.speedTestUrl)) | ||||
|             if (Utile.IsNullOrEmpty(config.speedTestItem.speedTestUrl)) | ||||
|             { | ||||
|                 config.speedTestItem.speedTestUrl = Global.SpeedTestUrls[0]; | ||||
|             } | ||||
|             if (Utils.IsNullOrEmpty(config.speedTestItem.speedPingTestUrl)) | ||||
|             if (Utile.IsNullOrEmpty(config.speedTestItem.speedPingTestUrl)) | ||||
|             { | ||||
|                 config.speedTestItem.speedPingTestUrl = Global.SpeedPingTestUrl; | ||||
|             } | ||||
|  | @ -227,9 +227,9 @@ namespace v2rayN.Handler | |||
|                 try | ||||
|                 { | ||||
|                     //save temp file | ||||
|                     var resPath = Utils.GetConfigPath(configRes); | ||||
|                     var resPath = Utile.GetConfigPath(configRes); | ||||
|                     var tempPath = $"{resPath}_temp"; | ||||
|                     if (JsonUtils.ToFile(config, tempPath) != 0) | ||||
|                     if (JsonUtile.ToFile(config, tempPath) != 0) | ||||
|                     { | ||||
|                         return; | ||||
|                     } | ||||
|  | @ -250,36 +250,36 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|         public static int ImportOldGuiConfig(Config config, string fileName) | ||||
|         { | ||||
|             var result = Utils.LoadResource(fileName); | ||||
|             if (Utils.IsNullOrEmpty(result)) | ||||
|             var result = Utile.LoadResource(fileName); | ||||
|             if (Utile.IsNullOrEmpty(result)) | ||||
|             { | ||||
|                 return -1; | ||||
|             } | ||||
| 
 | ||||
|             var configOld = JsonUtils.Deserialize<ConfigOld>(result); | ||||
|             var configOld = JsonUtile.Deserialize<ConfigOld>(result); | ||||
|             if (configOld == null) | ||||
|             { | ||||
|                 return -1; | ||||
|             } | ||||
| 
 | ||||
|             var subItem = JsonUtils.Deserialize<List<SubItem>>(JsonUtils.Serialize(configOld.subItem)); | ||||
|             var subItem = JsonUtile.Deserialize<List<SubItem>>(JsonUtile.Serialize(configOld.subItem)); | ||||
|             foreach (var it in subItem) | ||||
|             { | ||||
|                 if (Utils.IsNullOrEmpty(it.id)) | ||||
|                 if (Utile.IsNullOrEmpty(it.id)) | ||||
|                 { | ||||
|                     it.id = Utils.GetGUID(false); | ||||
|                     it.id = Utile.GetGUID(false); | ||||
|                 } | ||||
|                 SqliteHelper.Instance.Replace(it); | ||||
|                 SQLiteHelper.Instance.Replace(it); | ||||
|             } | ||||
| 
 | ||||
|             var profileItems = JsonUtils.Deserialize<List<ProfileItem>>(JsonUtils.Serialize(configOld.vmess)); | ||||
|             var profileItems = JsonUtile.Deserialize<List<ProfileItem>>(JsonUtile.Serialize(configOld.vmess)); | ||||
|             foreach (var it in profileItems) | ||||
|             { | ||||
|                 if (Utils.IsNullOrEmpty(it.indexId)) | ||||
|                 if (Utile.IsNullOrEmpty(it.indexId)) | ||||
|                 { | ||||
|                     it.indexId = Utils.GetGUID(false); | ||||
|                     it.indexId = Utile.GetGUID(false); | ||||
|                 } | ||||
|                 SqliteHelper.Instance.Replace(it); | ||||
|                 SQLiteHelper.Instance.Replace(it); | ||||
|             } | ||||
| 
 | ||||
|             foreach (var it in configOld.routings) | ||||
|  | @ -288,22 +288,22 @@ namespace v2rayN.Handler | |||
|                 { | ||||
|                     continue; | ||||
|                 } | ||||
|                 var routing = JsonUtils.Deserialize<RoutingItem>(JsonUtils.Serialize(it)); | ||||
|                 var routing = JsonUtile.Deserialize<RoutingItem>(JsonUtile.Serialize(it)); | ||||
|                 foreach (var it2 in it.rules) | ||||
|                 { | ||||
|                     it2.id = Utils.GetGUID(false); | ||||
|                     it2.id = Utile.GetGUID(false); | ||||
|                 } | ||||
|                 routing.ruleNum = it.rules.Count; | ||||
|                 routing.ruleSet = JsonUtils.Serialize(it.rules, false); | ||||
|                 routing.ruleSet = JsonUtile.Serialize(it.rules, false); | ||||
| 
 | ||||
|                 if (Utils.IsNullOrEmpty(routing.id)) | ||||
|                 if (Utile.IsNullOrEmpty(routing.id)) | ||||
|                 { | ||||
|                     routing.id = Utils.GetGUID(false); | ||||
|                     routing.id = Utile.GetGUID(false); | ||||
|                 } | ||||
|                 SqliteHelper.Instance.Replace(routing); | ||||
|                 SQLiteHelper.Instance.Replace(routing); | ||||
|             } | ||||
| 
 | ||||
|             config = JsonUtils.Deserialize<Config>(JsonUtils.Serialize(configOld)); | ||||
|             config = JsonUtile.Deserialize<Config>(JsonUtile.Serialize(configOld)); | ||||
| 
 | ||||
|             if (config.coreBasicItem == null) | ||||
|             { | ||||
|  | @ -369,7 +369,7 @@ namespace v2rayN.Handler | |||
|             profileItem.path = profileItem.path.TrimEx(); | ||||
|             profileItem.streamSecurity = profileItem.streamSecurity.TrimEx(); | ||||
| 
 | ||||
|             if (!Global.VmessSecuritys.Contains(profileItem.security)) | ||||
|             if (!Global.VmessSecurities.Contains(profileItem.security)) | ||||
|             { | ||||
|                 return -1; | ||||
|             } | ||||
|  | @ -387,17 +387,17 @@ namespace v2rayN.Handler | |||
|         /// 移除服务器 | ||||
|         /// </summary> | ||||
|         /// <param name="config"></param> | ||||
|         /// <param name="indexs"></param> | ||||
|         /// <param name="indexes"></param> | ||||
|         /// <returns></returns> | ||||
|         public static int RemoveServer(Config config, List<ProfileItem> indexs) | ||||
|         public static int RemoveServer(Config config, List<ProfileItem> indexes) | ||||
|         { | ||||
|             var subid = "TempRemoveSubId"; | ||||
|             foreach (var item in indexs) | ||||
|             foreach (var item in indexes) | ||||
|             { | ||||
|                 item.subid = subid; | ||||
|             } | ||||
| 
 | ||||
|             SqliteHelper.Instance.UpdateAll(indexs); | ||||
|             SQLiteHelper.Instance.UpdateAll(indexes); | ||||
|             RemoveServerViaSubid(config, subid, false); | ||||
| 
 | ||||
|             return 0; | ||||
|  | @ -409,9 +409,9 @@ namespace v2rayN.Handler | |||
|         /// <param name="config"></param> | ||||
|         /// <param name="index"></param> | ||||
|         /// <returns></returns> | ||||
|         public static int CopyServer(Config config, List<ProfileItem> indexs) | ||||
|         public static int CopyServer(Config config, List<ProfileItem> indexes) | ||||
|         { | ||||
|             foreach (var it in indexs) | ||||
|             foreach (var it in indexes) | ||||
|             { | ||||
|                 var item = LazyConfig.Instance.GetProfileItem(it.indexId); | ||||
|                 if (item is null) | ||||
|  | @ -419,13 +419,13 @@ namespace v2rayN.Handler | |||
|                     continue; | ||||
|                 } | ||||
| 
 | ||||
|                 ProfileItem profileItem = JsonUtils.DeepCopy(item); | ||||
|                 ProfileItem profileItem = JsonUtile.DeepCopy(item); | ||||
|                 profileItem.indexId = string.Empty; | ||||
|                 profileItem.remarks = $"{item.remarks}-clone"; | ||||
| 
 | ||||
|                 if (profileItem.configType == EConfigType.Custom) | ||||
|                 { | ||||
|                     profileItem.address = Utils.GetConfigPath(profileItem.address); | ||||
|                     profileItem.address = Utile.GetConfigPath(profileItem.address); | ||||
|                     if (AddCustomServer(config, profileItem, false) == 0) | ||||
|                     { | ||||
|                     } | ||||
|  | @ -447,7 +447,7 @@ namespace v2rayN.Handler | |||
|         /// <returns></returns> | ||||
|         public static int SetDefaultServerIndex(Config config, string? indexId) | ||||
|         { | ||||
|             if (Utils.IsNullOrEmpty(indexId)) | ||||
|             if (Utile.IsNullOrEmpty(indexId)) | ||||
|             { | ||||
|                 return -1; | ||||
|             } | ||||
|  | @ -465,7 +465,7 @@ namespace v2rayN.Handler | |||
|             { | ||||
|                 return 0; | ||||
|             } | ||||
|             if (SqliteHelper.Instance.Table<ProfileItem>().Where(t => t.indexId == config.indexId).Any()) | ||||
|             if (SQLiteHelper.Instance.Table<ProfileItem>().Where(t => t.indexId == config.indexId).Any()) | ||||
|             { | ||||
|                 return 0; | ||||
|             } | ||||
|  | @ -473,7 +473,7 @@ namespace v2rayN.Handler | |||
|             { | ||||
|                 return SetDefaultServerIndex(config, lstProfile.Where(t => t.port > 0).FirstOrDefault()?.indexId); | ||||
|             } | ||||
|             return SetDefaultServerIndex(config, SqliteHelper.Instance.Table<ProfileItem>().Where(t => t.port > 0).Select(t => t.indexId).FirstOrDefault()); | ||||
|             return SetDefaultServerIndex(config, SQLiteHelper.Instance.Table<ProfileItem>().Where(t => t.port > 0).Select(t => t.indexId).FirstOrDefault()); | ||||
|         } | ||||
| 
 | ||||
|         public static ProfileItem? GetDefaultServer(Config config) | ||||
|  | @ -481,7 +481,7 @@ namespace v2rayN.Handler | |||
|             var item = LazyConfig.Instance.GetProfileItem(config.indexId); | ||||
|             if (item is null) | ||||
|             { | ||||
|                 var item2 = SqliteHelper.Instance.Table<ProfileItem>().FirstOrDefault(); | ||||
|                 var item2 = SQLiteHelper.Instance.Table<ProfileItem>().FirstOrDefault(); | ||||
|                 SetDefaultServerIndex(config, item2?.indexId); | ||||
|                 return item2; | ||||
|             } | ||||
|  | @ -577,12 +577,12 @@ namespace v2rayN.Handler | |||
|                 return -1; | ||||
|             } | ||||
|             var ext = Path.GetExtension(fileName); | ||||
|             string newFileName = $"{Utils.GetGUID()}{ext}"; | ||||
|             //newFileName = Path.Combine(Utils.GetTempPath(), newFileName); | ||||
|             string newFileName = $"{Utile.GetGUID()}{ext}"; | ||||
|             //newFileName = Path.Combine(Utile.GetTempPath(), newFileName); | ||||
| 
 | ||||
|             try | ||||
|             { | ||||
|                 File.Copy(fileName, Utils.GetConfigPath(newFileName)); | ||||
|                 File.Copy(fileName, Utile.GetConfigPath(newFileName)); | ||||
|                 if (blDelete) | ||||
|                 { | ||||
|                     File.Delete(fileName); | ||||
|  | @ -596,7 +596,7 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|             profileItem.address = newFileName; | ||||
|             profileItem.configType = EConfigType.Custom; | ||||
|             if (Utils.IsNullOrEmpty(profileItem.remarks)) | ||||
|             if (Utile.IsNullOrEmpty(profileItem.remarks)) | ||||
|             { | ||||
|                 profileItem.remarks = $"import custom@{DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")}"; | ||||
|             } | ||||
|  | @ -614,7 +614,7 @@ namespace v2rayN.Handler | |||
|         /// <returns></returns> | ||||
|         public static int EditCustomServer(Config config, ProfileItem profileItem) | ||||
|         { | ||||
|             if (SqliteHelper.Instance.Update(profileItem) > 0) | ||||
|             if (SQLiteHelper.Instance.Update(profileItem) > 0) | ||||
|             { | ||||
|                 return 0; | ||||
|             } | ||||
|  | @ -640,7 +640,7 @@ namespace v2rayN.Handler | |||
|             profileItem.id = profileItem.id.TrimEx(); | ||||
|             profileItem.security = profileItem.security.TrimEx(); | ||||
| 
 | ||||
|             if (!LazyConfig.Instance.GetShadowsocksSecuritys(profileItem).Contains(profileItem.security)) | ||||
|             if (!LazyConfig.Instance.GetShadowsocksSecurities(profileItem).Contains(profileItem.security)) | ||||
|             { | ||||
|                 return -1; | ||||
|             } | ||||
|  | @ -683,7 +683,7 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|             profileItem.address = profileItem.address.TrimEx(); | ||||
|             profileItem.id = profileItem.id.TrimEx(); | ||||
|             if (Utils.IsNullOrEmpty(profileItem.streamSecurity)) | ||||
|             if (Utile.IsNullOrEmpty(profileItem.streamSecurity)) | ||||
|             { | ||||
|                 profileItem.streamSecurity = Global.StreamSecurity; | ||||
|             } | ||||
|  | @ -713,7 +713,7 @@ namespace v2rayN.Handler | |||
|             profileItem.path = profileItem.path.TrimEx(); | ||||
|             profileItem.network = string.Empty; | ||||
| 
 | ||||
|             if (Utils.IsNullOrEmpty(profileItem.streamSecurity)) | ||||
|             if (Utile.IsNullOrEmpty(profileItem.streamSecurity)) | ||||
|             { | ||||
|                 profileItem.streamSecurity = Global.StreamSecurity; | ||||
|             } | ||||
|  | @ -748,11 +748,11 @@ namespace v2rayN.Handler | |||
|                 profileItem.headerType = Global.TuicCongestionControls.FirstOrDefault()!; | ||||
|             } | ||||
| 
 | ||||
|             if (Utils.IsNullOrEmpty(profileItem.streamSecurity)) | ||||
|             if (Utile.IsNullOrEmpty(profileItem.streamSecurity)) | ||||
|             { | ||||
|                 profileItem.streamSecurity = Global.StreamSecurity; | ||||
|             } | ||||
|             if (Utils.IsNullOrEmpty(profileItem.alpn)) | ||||
|             if (Utile.IsNullOrEmpty(profileItem.alpn)) | ||||
|             { | ||||
|                 profileItem.alpn = "h3"; | ||||
|             } | ||||
|  | @ -954,27 +954,27 @@ namespace v2rayN.Handler | |||
|         { | ||||
|             profileItem.configVersion = 2; | ||||
| 
 | ||||
|             if (!Utils.IsNullOrEmpty(profileItem.streamSecurity)) | ||||
|             if (!Utile.IsNullOrEmpty(profileItem.streamSecurity)) | ||||
|             { | ||||
|                 if (Utils.IsNullOrEmpty(profileItem.allowInsecure)) | ||||
|                 if (Utile.IsNullOrEmpty(profileItem.allowInsecure)) | ||||
|                 { | ||||
|                     profileItem.allowInsecure = config.coreBasicItem.defAllowInsecure.ToString().ToLower(); | ||||
|                 } | ||||
|                 if (Utils.IsNullOrEmpty(profileItem.fingerprint) && profileItem.streamSecurity == Global.StreamSecurityReality) | ||||
|                 if (Utile.IsNullOrEmpty(profileItem.fingerprint) && profileItem.streamSecurity == Global.StreamSecurityReality) | ||||
|                 { | ||||
|                     profileItem.fingerprint = config.coreBasicItem.defFingerprint; | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             if (!Utils.IsNullOrEmpty(profileItem.network) && !Global.Networks.Contains(profileItem.network)) | ||||
|             if (!Utile.IsNullOrEmpty(profileItem.network) && !Global.Networks.Contains(profileItem.network)) | ||||
|             { | ||||
|                 profileItem.network = Global.DefaultNetwork; | ||||
|             } | ||||
| 
 | ||||
|             var maxSort = -1; | ||||
|             if (Utils.IsNullOrEmpty(profileItem.indexId)) | ||||
|             if (Utile.IsNullOrEmpty(profileItem.indexId)) | ||||
|             { | ||||
|                 profileItem.indexId = Utils.GetGUID(false); | ||||
|                 profileItem.indexId = Utile.GetGUID(false); | ||||
|                 maxSort = ProfileExHandler.Instance.GetMaxSort(); | ||||
|             } | ||||
|             if (!toFile && maxSort < 0) | ||||
|  | @ -988,7 +988,7 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|             if (toFile) | ||||
|             { | ||||
|                 SqliteHelper.Instance.Replace(profileItem); | ||||
|                 SQLiteHelper.Instance.Replace(profileItem); | ||||
|             } | ||||
|             return 0; | ||||
|         } | ||||
|  | @ -1027,10 +1027,10 @@ namespace v2rayN.Handler | |||
|                 } | ||||
|                 if (item.configType == EConfigType.Custom) | ||||
|                 { | ||||
|                     File.Delete(Utils.GetConfigPath(item.address)); | ||||
|                     File.Delete(Utile.GetConfigPath(item.address)); | ||||
|                 } | ||||
| 
 | ||||
|                 SqliteHelper.Instance.Delete(item); | ||||
|                 SQLiteHelper.Instance.Delete(item); | ||||
|             } | ||||
|             catch (Exception ex) | ||||
|             { | ||||
|  | @ -1053,14 +1053,14 @@ namespace v2rayN.Handler | |||
|         /// <returns>成功导入的数量</returns> | ||||
|         private static int AddBatchServers(Config config, string clipboardData, string subid, bool isSub, List<ProfileItem> lstOriSub) | ||||
|         { | ||||
|             if (Utils.IsNullOrEmpty(clipboardData)) | ||||
|             if (Utile.IsNullOrEmpty(clipboardData)) | ||||
|             { | ||||
|                 return -1; | ||||
|             } | ||||
| 
 | ||||
|             string subFilter = string.Empty; | ||||
|             //remove sub items | ||||
|             if (isSub && !Utils.IsNullOrEmpty(subid)) | ||||
|             if (isSub && !Utile.IsNullOrEmpty(subid)) | ||||
|             { | ||||
|                 RemoveServerViaSubid(config, subid, isSub); | ||||
|                 subFilter = LazyConfig.Instance.GetSubItem(subid)?.filter ?? ""; | ||||
|  | @ -1093,7 +1093,7 @@ namespace v2rayN.Handler | |||
|                 } | ||||
| 
 | ||||
|                 //exist sub items | ||||
|                 if (isSub && !Utils.IsNullOrEmpty(subid)) | ||||
|                 if (isSub && !Utile.IsNullOrEmpty(subid)) | ||||
|                 { | ||||
|                     var existItem = lstOriSub?.FirstOrDefault(t => t.isSub == isSub | ||||
|                                                 && config.uiItem.enableUpdateSubOnlyRemarksExist ? t.remarks == profileItem.remarks : CompareProfileItem(t, profileItem, true)); | ||||
|  | @ -1102,7 +1102,7 @@ namespace v2rayN.Handler | |||
|                         //Check for duplicate indexId | ||||
|                         if (lstDbIndexId is null) | ||||
|                         { | ||||
|                             lstDbIndexId = LazyConfig.Instance.ProfileItemIndexs(""); | ||||
|                             lstDbIndexId = LazyConfig.Instance.ProfileItemIndexes(""); | ||||
|                         } | ||||
|                         if (lstAdd.Any(t => t.indexId == existItem.indexId) | ||||
|                             || lstDbIndexId.Any(t => t == existItem.indexId)) | ||||
|  | @ -1115,7 +1115,7 @@ namespace v2rayN.Handler | |||
|                         } | ||||
|                     } | ||||
|                     //filter | ||||
|                     if (!Utils.IsNullOrEmpty(subFilter)) | ||||
|                     if (!Utile.IsNullOrEmpty(subFilter)) | ||||
|                     { | ||||
|                         if (!Regex.IsMatch(profileItem.remarks, subFilter)) | ||||
|                         { | ||||
|  | @ -1148,7 +1148,7 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|             if (lstAdd.Count > 0) | ||||
|             { | ||||
|                 SqliteHelper.Instance.InsertAll(lstAdd); | ||||
|                 SQLiteHelper.Instance.InsertAll(lstAdd); | ||||
|             } | ||||
| 
 | ||||
|             ToJsonFile(config); | ||||
|  | @ -1157,13 +1157,13 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|         private static int AddBatchServers4Custom(Config config, string clipboardData, string subid, bool isSub, List<ProfileItem> lstOriSub) | ||||
|         { | ||||
|             if (Utils.IsNullOrEmpty(clipboardData)) | ||||
|             if (Utile.IsNullOrEmpty(clipboardData)) | ||||
|             { | ||||
|                 return -1; | ||||
|             } | ||||
| 
 | ||||
|             //判断str是否包含s的任意一个字符串 | ||||
|             static bool Containss(string str, params string[] s) | ||||
|             static bool Contains(string str, params string[] s) | ||||
|             { | ||||
|                 foreach (var item in s) | ||||
|                 { | ||||
|  | @ -1174,11 +1174,11 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|             ProfileItem profileItem = new(); | ||||
|             //Is v2ray configuration | ||||
|             V2rayConfig? v2rayConfig = JsonUtils.Deserialize<V2rayConfig>(clipboardData); | ||||
|             V2rayConfig? v2rayConfig = JsonUtile.Deserialize<V2rayConfig>(clipboardData); | ||||
|             if (v2rayConfig?.inbounds?.Count > 0 | ||||
|                 && v2rayConfig.outbounds?.Count > 0) | ||||
|             { | ||||
|                 var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.json"); | ||||
|                 var fileName = Utile.GetTempPath($"{Utile.GetGUID(false)}.json"); | ||||
|                 File.WriteAllText(fileName, clipboardData); | ||||
| 
 | ||||
|                 profileItem.coreType = ECoreType.Xray; | ||||
|  | @ -1186,9 +1186,9 @@ namespace v2rayN.Handler | |||
|                 profileItem.remarks = "v2ray_custom"; | ||||
|             } | ||||
|             //Is Clash configuration | ||||
|             else if (Containss(clipboardData, "port", "socks-port", "proxies")) | ||||
|             else if (Contains(clipboardData, "port", "socks-port", "proxies")) | ||||
|             { | ||||
|                 var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.yaml"); | ||||
|                 var fileName = Utile.GetTempPath($"{Utile.GetGUID(false)}.yaml"); | ||||
|                 File.WriteAllText(fileName, clipboardData); | ||||
| 
 | ||||
|                 profileItem.coreType = ECoreType.mihomo; | ||||
|  | @ -1196,9 +1196,9 @@ namespace v2rayN.Handler | |||
|                 profileItem.remarks = "clash_custom"; | ||||
|             } | ||||
|             //Is hysteria configuration | ||||
|             else if (Containss(clipboardData, "server", "up", "down", "listen", "<html>", "<body>")) | ||||
|             else if (Contains(clipboardData, "server", "up", "down", "listen", "<html>", "<body>")) | ||||
|             { | ||||
|                 var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.json"); | ||||
|                 var fileName = Utile.GetTempPath($"{Utile.GetGUID(false)}.json"); | ||||
|                 File.WriteAllText(fileName, clipboardData); | ||||
| 
 | ||||
|                 profileItem.coreType = ECoreType.hysteria; | ||||
|  | @ -1206,9 +1206,9 @@ namespace v2rayN.Handler | |||
|                 profileItem.remarks = "hysteria_custom"; | ||||
|             } | ||||
|             //Is naiveproxy configuration | ||||
|             else if (Containss(clipboardData, "listen", "proxy", "<html>", "<body>")) | ||||
|             else if (Contains(clipboardData, "listen", "proxy", "<html>", "<body>")) | ||||
|             { | ||||
|                 var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.json"); | ||||
|                 var fileName = Utile.GetTempPath($"{Utile.GetGUID(false)}.json"); | ||||
|                 File.WriteAllText(fileName, clipboardData); | ||||
| 
 | ||||
|                 profileItem.coreType = ECoreType.naiveproxy; | ||||
|  | @ -1219,14 +1219,14 @@ namespace v2rayN.Handler | |||
|             else | ||||
|             { | ||||
|                 return -1; | ||||
|                 //var fileName = Utils.GetTempPath($"{Utils.GetGUID(false)}.txt"); | ||||
|                 //var fileName = Utile.GetTempPath($"{Utile.GetGUID(false)}.txt"); | ||||
|                 //File.WriteAllText(fileName, clipboardData); | ||||
| 
 | ||||
|                 //profileItem.address = fileName; | ||||
|                 //profileItem.remarks = "other_custom"; | ||||
|             } | ||||
| 
 | ||||
|             if (isSub && !Utils.IsNullOrEmpty(subid)) | ||||
|             if (isSub && !Utile.IsNullOrEmpty(subid)) | ||||
|             { | ||||
|                 RemoveServerViaSubid(config, subid, isSub); | ||||
|             } | ||||
|  | @ -1237,7 +1237,7 @@ namespace v2rayN.Handler | |||
|             profileItem.subid = subid; | ||||
|             profileItem.isSub = isSub; | ||||
| 
 | ||||
|             if (Utils.IsNullOrEmpty(profileItem.address)) | ||||
|             if (Utile.IsNullOrEmpty(profileItem.address)) | ||||
|             { | ||||
|                 return -1; | ||||
|             } | ||||
|  | @ -1254,21 +1254,21 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|         private static int AddBatchServers4SsSIP008(Config config, string clipboardData, string subid, bool isSub, List<ProfileItem> lstOriSub) | ||||
|         { | ||||
|             if (Utils.IsNullOrEmpty(clipboardData)) | ||||
|             if (Utile.IsNullOrEmpty(clipboardData)) | ||||
|             { | ||||
|                 return -1; | ||||
|             } | ||||
| 
 | ||||
|             if (isSub && !Utils.IsNullOrEmpty(subid)) | ||||
|             if (isSub && !Utile.IsNullOrEmpty(subid)) | ||||
|             { | ||||
|                 RemoveServerViaSubid(config, subid, isSub); | ||||
|             } | ||||
| 
 | ||||
|             //SsSIP008 | ||||
|             var lstSsServer = JsonUtils.Deserialize<List<SsServer>>(clipboardData); | ||||
|             var lstSsServer = JsonUtile.Deserialize<List<SsServer>>(clipboardData); | ||||
|             if (lstSsServer?.Count <= 0) | ||||
|             { | ||||
|                 var ssSIP008 = JsonUtils.Deserialize<SsSIP008>(clipboardData); | ||||
|                 var ssSIP008 = JsonUtile.Deserialize<SsSIP008>(clipboardData); | ||||
|                 if (ssSIP008?.servers?.Count > 0) | ||||
|                 { | ||||
|                     lstSsServer = ssSIP008.servers; | ||||
|  | @ -1287,7 +1287,7 @@ namespace v2rayN.Handler | |||
|                         security = it.method, | ||||
|                         id = it.password, | ||||
|                         address = it.server, | ||||
|                         port = Utils.ToInt(it.server_port) | ||||
|                         port = Utile.ToInt(it.server_port) | ||||
|                     }; | ||||
|                     ssItem.subid = subid; | ||||
|                     ssItem.isSub = isSub; | ||||
|  | @ -1306,15 +1306,15 @@ namespace v2rayN.Handler | |||
|         public static int AddBatchServers(Config config, string clipboardData, string subid, bool isSub) | ||||
|         { | ||||
|             List<ProfileItem>? lstOriSub = null; | ||||
|             if (isSub && !Utils.IsNullOrEmpty(subid)) | ||||
|             if (isSub && !Utile.IsNullOrEmpty(subid)) | ||||
|             { | ||||
|                 lstOriSub = LazyConfig.Instance.ProfileItems(subid); | ||||
|             } | ||||
| 
 | ||||
|             var counter = 0; | ||||
|             if (Utils.IsBase64String(clipboardData)) | ||||
|             if (Utile.IsBase64String(clipboardData)) | ||||
|             { | ||||
|                 counter = AddBatchServers(config, Utils.Base64Decode(clipboardData), subid, isSub, lstOriSub); | ||||
|                 counter = AddBatchServers(config, Utile.Base64Decode(clipboardData), subid, isSub, lstOriSub); | ||||
|             } | ||||
|             if (counter < 1) | ||||
|             { | ||||
|  | @ -1322,7 +1322,7 @@ namespace v2rayN.Handler | |||
|             } | ||||
|             if (counter < 1) | ||||
|             { | ||||
|                 counter = AddBatchServers(config, Utils.Base64Decode(clipboardData), subid, isSub, lstOriSub); | ||||
|                 counter = AddBatchServers(config, Utile.Base64Decode(clipboardData), subid, isSub, lstOriSub); | ||||
|             } | ||||
| 
 | ||||
|             if (counter < 1) | ||||
|  | @ -1352,7 +1352,7 @@ namespace v2rayN.Handler | |||
|         public static int AddSubItem(Config config, string url) | ||||
|         { | ||||
|             //already exists | ||||
|             if (SqliteHelper.Instance.Table<SubItem>().Where(e => e.url == url).Count() > 0) | ||||
|             if (SQLiteHelper.Instance.Table<SubItem>().Where(e => e.url == url).Count() > 0) | ||||
|             { | ||||
|                 return 0; | ||||
|             } | ||||
|  | @ -1369,21 +1369,21 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|         public static int AddSubItem(Config config, SubItem subItem) | ||||
|         { | ||||
|             if (Utils.IsNullOrEmpty(subItem.id)) | ||||
|             if (Utile.IsNullOrEmpty(subItem.id)) | ||||
|             { | ||||
|                 subItem.id = Utils.GetGUID(false); | ||||
|                 subItem.id = Utile.GetGUID(false); | ||||
| 
 | ||||
|                 if (subItem.sort <= 0) | ||||
|                 { | ||||
|                     var maxSort = 0; | ||||
|                     if (SqliteHelper.Instance.Table<SubItem>().Count() > 0) | ||||
|                     if (SQLiteHelper.Instance.Table<SubItem>().Count() > 0) | ||||
|                     { | ||||
|                         maxSort = SqliteHelper.Instance.Table<SubItem>().Max(t => t == null ? 0 : t.sort); | ||||
|                         maxSort = SQLiteHelper.Instance.Table<SubItem>().Max(t => t == null ? 0 : t.sort); | ||||
|                     } | ||||
|                     subItem.sort = maxSort + 1; | ||||
|                 } | ||||
|             } | ||||
|             if (SqliteHelper.Instance.Replace(subItem) > 0) | ||||
|             if (SQLiteHelper.Instance.Replace(subItem) > 0) | ||||
|             { | ||||
|                 return 0; | ||||
|             } | ||||
|  | @ -1401,22 +1401,22 @@ namespace v2rayN.Handler | |||
|         /// <returns></returns> | ||||
|         public static int RemoveServerViaSubid(Config config, string subid, bool isSub) | ||||
|         { | ||||
|             if (Utils.IsNullOrEmpty(subid)) | ||||
|             if (Utile.IsNullOrEmpty(subid)) | ||||
|             { | ||||
|                 return -1; | ||||
|             } | ||||
|             var customProfile = SqliteHelper.Instance.Table<ProfileItem>().Where(t => t.subid == subid && t.configType == EConfigType.Custom).ToList(); | ||||
|             var customProfile = SQLiteHelper.Instance.Table<ProfileItem>().Where(t => t.subid == subid && t.configType == EConfigType.Custom).ToList(); | ||||
|             if (isSub) | ||||
|             { | ||||
|                 SqliteHelper.Instance.Execute($"delete from ProfileItem where isSub = 1 and subid = '{subid}'"); | ||||
|                 SQLiteHelper.Instance.Execute($"delete from ProfileItem where isSub = 1 and subid = '{subid}'"); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 SqliteHelper.Instance.Execute($"delete from ProfileItem where subid = '{subid}'"); | ||||
|                 SQLiteHelper.Instance.Execute($"delete from ProfileItem where subid = '{subid}'"); | ||||
|             } | ||||
|             foreach (var item in customProfile) | ||||
|             { | ||||
|                 File.Delete(Utils.GetConfigPath(item.address)); | ||||
|                 File.Delete(Utile.GetConfigPath(item.address)); | ||||
|             } | ||||
| 
 | ||||
|             return 0; | ||||
|  | @ -1429,7 +1429,7 @@ namespace v2rayN.Handler | |||
|             { | ||||
|                 return 0; | ||||
|             } | ||||
|             SqliteHelper.Instance.Delete(item); | ||||
|             SQLiteHelper.Instance.Delete(item); | ||||
|             RemoveServerViaSubid(config, id, false); | ||||
| 
 | ||||
|             return 0; | ||||
|  | @ -1441,7 +1441,7 @@ namespace v2rayN.Handler | |||
|             { | ||||
|                 item.subid = subid; | ||||
|             } | ||||
|             SqliteHelper.Instance.UpdateAll(lstProfile); | ||||
|             SQLiteHelper.Instance.UpdateAll(lstProfile); | ||||
| 
 | ||||
|             return 0; | ||||
|         } | ||||
|  | @ -1452,12 +1452,12 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|         public static int SaveRoutingItem(Config config, RoutingItem item) | ||||
|         { | ||||
|             if (Utils.IsNullOrEmpty(item.id)) | ||||
|             if (Utile.IsNullOrEmpty(item.id)) | ||||
|             { | ||||
|                 item.id = Utils.GetGUID(false); | ||||
|                 item.id = Utile.GetGUID(false); | ||||
|             } | ||||
| 
 | ||||
|             if (SqliteHelper.Instance.Replace(item) > 0) | ||||
|             if (SQLiteHelper.Instance.Replace(item) > 0) | ||||
|             { | ||||
|                 return 0; | ||||
|             } | ||||
|  | @ -1475,12 +1475,12 @@ namespace v2rayN.Handler | |||
|         /// <returns></returns> | ||||
|         public static int AddBatchRoutingRules(ref RoutingItem routingItem, string clipboardData) | ||||
|         { | ||||
|             if (Utils.IsNullOrEmpty(clipboardData)) | ||||
|             if (Utile.IsNullOrEmpty(clipboardData)) | ||||
|             { | ||||
|                 return -1; | ||||
|             } | ||||
| 
 | ||||
|             var lstRules = JsonUtils.Deserialize<List<RulesItem>>(clipboardData); | ||||
|             var lstRules = JsonUtile.Deserialize<List<RulesItem>>(clipboardData); | ||||
|             if (lstRules == null) | ||||
|             { | ||||
|                 return -1; | ||||
|  | @ -1488,17 +1488,17 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|             foreach (var item in lstRules) | ||||
|             { | ||||
|                 item.id = Utils.GetGUID(false); | ||||
|                 item.id = Utile.GetGUID(false); | ||||
|             } | ||||
|             routingItem.ruleNum = lstRules.Count; | ||||
|             routingItem.ruleSet = JsonUtils.Serialize(lstRules, false); | ||||
|             routingItem.ruleSet = JsonUtile.Serialize(lstRules, false); | ||||
| 
 | ||||
|             if (Utils.IsNullOrEmpty(routingItem.id)) | ||||
|             if (Utile.IsNullOrEmpty(routingItem.id)) | ||||
|             { | ||||
|                 routingItem.id = Utils.GetGUID(false); | ||||
|                 routingItem.id = Utile.GetGUID(false); | ||||
|             } | ||||
| 
 | ||||
|             if (SqliteHelper.Instance.Replace(routingItem) > 0) | ||||
|             if (SQLiteHelper.Instance.Replace(routingItem) > 0) | ||||
|             { | ||||
|                 return 0; | ||||
|             } | ||||
|  | @ -1530,7 +1530,7 @@ namespace v2rayN.Handler | |||
|                         { | ||||
|                             return 0; | ||||
|                         } | ||||
|                         var item = JsonUtils.DeepCopy(rules[index]); | ||||
|                         var item = JsonUtile.DeepCopy(rules[index]); | ||||
|                         rules.RemoveAt(index); | ||||
|                         rules.Insert(0, item); | ||||
| 
 | ||||
|  | @ -1542,7 +1542,7 @@ namespace v2rayN.Handler | |||
|                         { | ||||
|                             return 0; | ||||
|                         } | ||||
|                         var item = JsonUtils.DeepCopy(rules[index]); | ||||
|                         var item = JsonUtile.DeepCopy(rules[index]); | ||||
|                         rules.RemoveAt(index); | ||||
|                         rules.Insert(index - 1, item); | ||||
| 
 | ||||
|  | @ -1555,7 +1555,7 @@ namespace v2rayN.Handler | |||
|                         { | ||||
|                             return 0; | ||||
|                         } | ||||
|                         var item = JsonUtils.DeepCopy(rules[index]); | ||||
|                         var item = JsonUtile.DeepCopy(rules[index]); | ||||
|                         rules.RemoveAt(index); | ||||
|                         rules.Insert(index + 1, item); | ||||
| 
 | ||||
|  | @ -1567,7 +1567,7 @@ namespace v2rayN.Handler | |||
|                         { | ||||
|                             return 0; | ||||
|                         } | ||||
|                         var item = JsonUtils.DeepCopy(rules[index]); | ||||
|                         var item = JsonUtile.DeepCopy(rules[index]); | ||||
|                         rules.RemoveAt(index); | ||||
|                         rules.Add(item); | ||||
| 
 | ||||
|  | @ -1576,7 +1576,7 @@ namespace v2rayN.Handler | |||
|                 case EMove.Position: | ||||
|                     { | ||||
|                         var removeItem = rules[index]; | ||||
|                         var item = JsonUtils.DeepCopy(rules[index]); | ||||
|                         var item = JsonUtile.DeepCopy(rules[index]); | ||||
|                         rules.Insert(pos, item); | ||||
|                         rules.Remove(removeItem); | ||||
|                         break; | ||||
|  | @ -1587,7 +1587,7 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|         public static int SetDefaultRouting(Config config, RoutingItem routingItem) | ||||
|         { | ||||
|             if (SqliteHelper.Instance.Table<RoutingItem>().Where(t => t.id == routingItem.id).Count() > 0) | ||||
|             if (SQLiteHelper.Instance.Table<RoutingItem>().Where(t => t.id == routingItem.id).Count() > 0) | ||||
|             { | ||||
|                 config.routingBasicItem.routingIndexId = routingItem.id; | ||||
|             } | ||||
|  | @ -1602,7 +1602,7 @@ namespace v2rayN.Handler | |||
|             var item = LazyConfig.Instance.GetRoutingItem(config.routingBasicItem.routingIndexId); | ||||
|             if (item is null) | ||||
|             { | ||||
|                 var item2 = SqliteHelper.Instance.Table<RoutingItem>().FirstOrDefault(t => t.locked == false); | ||||
|                 var item2 = SQLiteHelper.Instance.Table<RoutingItem>().FirstOrDefault(t => t.locked == false); | ||||
|                 SetDefaultRouting(config, item2); | ||||
|                 return item2; | ||||
|             } | ||||
|  | @ -1623,7 +1623,7 @@ namespace v2rayN.Handler | |||
|                     url = string.Empty, | ||||
|                     sort = maxSort + 1, | ||||
|                 }; | ||||
|                 AddBatchRoutingRules(ref item2, Utils.GetEmbedText(Global.CustomRoutingFileName + "white")); | ||||
|                 AddBatchRoutingRules(ref item2, Utile.GetEmbedText(Global.CustomRoutingFileName + "white")); | ||||
| 
 | ||||
|                 //Blacklist | ||||
|                 var item3 = new RoutingItem() | ||||
|  | @ -1632,7 +1632,7 @@ namespace v2rayN.Handler | |||
|                     url = string.Empty, | ||||
|                     sort = maxSort + 2, | ||||
|                 }; | ||||
|                 AddBatchRoutingRules(ref item3, Utils.GetEmbedText(Global.CustomRoutingFileName + "black")); | ||||
|                 AddBatchRoutingRules(ref item3, Utile.GetEmbedText(Global.CustomRoutingFileName + "black")); | ||||
| 
 | ||||
|                 //Global | ||||
|                 var item1 = new RoutingItem() | ||||
|  | @ -1641,7 +1641,7 @@ namespace v2rayN.Handler | |||
|                     url = string.Empty, | ||||
|                     sort = maxSort + 3, | ||||
|                 }; | ||||
|                 AddBatchRoutingRules(ref item1, Utils.GetEmbedText(Global.CustomRoutingFileName + "global")); | ||||
|                 AddBatchRoutingRules(ref item1, Utile.GetEmbedText(Global.CustomRoutingFileName + "global")); | ||||
| 
 | ||||
|                 if (!blImportAdvancedRules) | ||||
|                 { | ||||
|  | @ -1657,19 +1657,19 @@ namespace v2rayN.Handler | |||
|                     url = string.Empty, | ||||
|                     locked = true, | ||||
|                 }; | ||||
|                 AddBatchRoutingRules(ref item1, Utils.GetEmbedText(Global.CustomRoutingFileName + "locked")); | ||||
|                 AddBatchRoutingRules(ref item1, Utile.GetEmbedText(Global.CustomRoutingFileName + "locked")); | ||||
|             } | ||||
|             return 0; | ||||
|         } | ||||
| 
 | ||||
|         public static RoutingItem GetLockedRoutingItem(Config config) | ||||
|         { | ||||
|             return SqliteHelper.Instance.Table<RoutingItem>().FirstOrDefault(it => it.locked == true); | ||||
|             return SQLiteHelper.Instance.Table<RoutingItem>().FirstOrDefault(it => it.locked == true); | ||||
|         } | ||||
| 
 | ||||
|         public static void RemoveRoutingItem(RoutingItem routingItem) | ||||
|         { | ||||
|             SqliteHelper.Instance.Delete(routingItem); | ||||
|             SQLiteHelper.Instance.Delete(routingItem); | ||||
|         } | ||||
| 
 | ||||
|         #endregion Routing | ||||
|  | @ -1701,12 +1701,12 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|         public static int SaveDNSItems(Config config, DNSItem item) | ||||
|         { | ||||
|             if (Utils.IsNullOrEmpty(item.id)) | ||||
|             if (Utile.IsNullOrEmpty(item.id)) | ||||
|             { | ||||
|                 item.id = Utils.GetGUID(false); | ||||
|                 item.id = Utile.GetGUID(false); | ||||
|             } | ||||
| 
 | ||||
|             if (SqliteHelper.Instance.Replace(item) > 0) | ||||
|             if (SQLiteHelper.Instance.Replace(item) > 0) | ||||
|             { | ||||
|                 return 0; | ||||
|             } | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| using System.IO; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| using v2rayN.Resx; | ||||
| 
 | ||||
| namespace v2rayN.Handler | ||||
|  | @ -33,13 +33,13 @@ namespace v2rayN.Handler | |||
|                     { | ||||
|                         return -1; | ||||
|                     } | ||||
|                     if (Utils.IsNullOrEmpty(fileName)) | ||||
|                     if (Utile.IsNullOrEmpty(fileName)) | ||||
|                     { | ||||
|                         content = JsonUtils.Serialize(singboxConfig); | ||||
|                         content = JsonUtile.Serialize(singboxConfig); | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         JsonUtils.ToFile(singboxConfig, fileName, false); | ||||
|                         JsonUtile.ToFile(singboxConfig, fileName, false); | ||||
|                     } | ||||
|                 } | ||||
|                 else | ||||
|  | @ -49,13 +49,13 @@ namespace v2rayN.Handler | |||
|                     { | ||||
|                         return -1; | ||||
|                     } | ||||
|                     if (Utils.IsNullOrEmpty(fileName)) | ||||
|                     if (Utile.IsNullOrEmpty(fileName)) | ||||
|                     { | ||||
|                         content = JsonUtils.Serialize(v2rayConfig); | ||||
|                         content = JsonUtile.Serialize(v2rayConfig); | ||||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         JsonUtils.ToFile(v2rayConfig, fileName, false); | ||||
|                         JsonUtile.ToFile(v2rayConfig, fileName, false); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|  | @ -87,7 +87,7 @@ namespace v2rayN.Handler | |||
|                 string addressFileName = node.address; | ||||
|                 if (!File.Exists(addressFileName)) | ||||
|                 { | ||||
|                     addressFileName = Utils.GetConfigPath(addressFileName); | ||||
|                     addressFileName = Utile.GetConfigPath(addressFileName); | ||||
|                 } | ||||
|                 if (!File.Exists(addressFileName)) | ||||
|                 { | ||||
|  | @ -158,7 +158,7 @@ namespace v2rayN.Handler | |||
|                 { | ||||
|                     return -1; | ||||
|                 } | ||||
|                 JsonUtils.ToFile(singboxConfig, fileName, false); | ||||
|                 JsonUtile.ToFile(singboxConfig, fileName, false); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|  | @ -166,7 +166,7 @@ namespace v2rayN.Handler | |||
|                 { | ||||
|                     return -1; | ||||
|                 } | ||||
|                 JsonUtils.ToFile(v2rayConfig, fileName, false); | ||||
|                 JsonUtile.ToFile(v2rayConfig, fileName, false); | ||||
|             } | ||||
|             return 0; | ||||
|         } | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| using System.Net; | ||||
| using System.Net.NetworkInformation; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| using v2rayN.Resx; | ||||
| 
 | ||||
| namespace v2rayN.Handler | ||||
|  | @ -28,14 +28,14 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|                 msg = ResUI.InitialConfiguration; | ||||
| 
 | ||||
|                 string result = Utils.GetEmbedText(Global.SingboxSampleClient); | ||||
|                 if (Utils.IsNullOrEmpty(result)) | ||||
|                 string result = Utile.GetEmbedText(Global.SingboxSampleClient); | ||||
|                 if (Utile.IsNullOrEmpty(result)) | ||||
|                 { | ||||
|                     msg = ResUI.FailedGetDefaultConfiguration; | ||||
|                     return -1; | ||||
|                 } | ||||
| 
 | ||||
|                 singboxConfig = JsonUtils.Deserialize<SingboxConfig>(result); | ||||
|                 singboxConfig = JsonUtile.Deserialize<SingboxConfig>(result); | ||||
|                 if (singboxConfig == null) | ||||
|                 { | ||||
|                     msg = ResUI.FailedGenDefaultConfiguration; | ||||
|  | @ -95,7 +95,7 @@ namespace v2rayN.Handler | |||
|                 if (_config.coreBasicItem.logEnabled) | ||||
|                 { | ||||
|                     var dtNow = DateTime.Now; | ||||
|                     singboxConfig.log.output = Utils.GetLogPath($"sbox_{dtNow:yyyy-MM-dd}.txt"); | ||||
|                     singboxConfig.log.output = Utile.GetLogPath($"sbox_{dtNow:yyyy-MM-dd}.txt"); | ||||
|                 } | ||||
|             } | ||||
|             catch (Exception ex) | ||||
|  | @ -124,12 +124,12 @@ namespace v2rayN.Handler | |||
|                     inbound.listen_port = LazyConfig.Instance.GetLocalPort(Global.InboundSocks); | ||||
|                     inbound.sniff = _config.inbound[0].sniffingEnabled; | ||||
|                     inbound.sniff_override_destination = _config.inbound[0].routeOnly ? false : _config.inbound[0].sniffingEnabled; | ||||
|                     inbound.domain_strategy = Utils.IsNullOrEmpty(_config.routingBasicItem.domainStrategy4Singbox) ? null : _config.routingBasicItem.domainStrategy4Singbox; | ||||
|                     inbound.domain_strategy = Utile.IsNullOrEmpty(_config.routingBasicItem.domainStrategy4Singbox) ? null : _config.routingBasicItem.domainStrategy4Singbox; | ||||
| 
 | ||||
|                     if (_config.routingBasicItem.enableRoutingAdvanced) | ||||
|                     { | ||||
|                         var routing = ConfigHandler.GetDefaultRouting(_config); | ||||
|                         if (!Utils.IsNullOrEmpty(routing.domainStrategy4Singbox)) | ||||
|                         if (!Utile.IsNullOrEmpty(routing.domainStrategy4Singbox)) | ||||
|                         { | ||||
|                             inbound.domain_strategy = routing.domainStrategy4Singbox; | ||||
|                         } | ||||
|  | @ -152,7 +152,7 @@ namespace v2rayN.Handler | |||
|                             singboxConfig.inbounds.Add(inbound4); | ||||
| 
 | ||||
|                             //auth | ||||
|                             if (!Utils.IsNullOrEmpty(_config.inbound[0].user) && !Utils.IsNullOrEmpty(_config.inbound[0].pass)) | ||||
|                             if (!Utile.IsNullOrEmpty(_config.inbound[0].user) && !Utile.IsNullOrEmpty(_config.inbound[0].pass)) | ||||
|                             { | ||||
|                                 inbound3.users = new() { new() { username = _config.inbound[0].user, password = _config.inbound[0].pass } }; | ||||
|                                 inbound4.users = new() { new() { username = _config.inbound[0].user, password = _config.inbound[0].pass } }; | ||||
|  | @ -170,14 +170,14 @@ namespace v2rayN.Handler | |||
|                 { | ||||
|                     if (_config.tunModeItem.mtu <= 0) | ||||
|                     { | ||||
|                         _config.tunModeItem.mtu = Utils.ToInt(Global.TunMtus[0]); | ||||
|                         _config.tunModeItem.mtu = Utile.ToInt(Global.TunMtus[0]); | ||||
|                     } | ||||
|                     if (Utils.IsNullOrEmpty(_config.tunModeItem.stack)) | ||||
|                     if (Utile.IsNullOrEmpty(_config.tunModeItem.stack)) | ||||
|                     { | ||||
|                         _config.tunModeItem.stack = Global.TunStacks[0]; | ||||
|                     } | ||||
| 
 | ||||
|                     var tunInbound = JsonUtils.Deserialize<Inbound4Sbox>(Utils.GetEmbedText(Global.TunSingboxInboundFileName)) ?? new Inbound4Sbox { }; | ||||
|                     var tunInbound = JsonUtile.Deserialize<Inbound4Sbox>(Utile.GetEmbedText(Global.TunSingboxInboundFileName)) ?? new Inbound4Sbox { }; | ||||
|                     tunInbound.mtu = _config.tunModeItem.mtu; | ||||
|                     tunInbound.strict_route = _config.tunModeItem.strictRoute; | ||||
|                     tunInbound.stack = _config.tunModeItem.stack; | ||||
|  | @ -200,7 +200,7 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|         private Inbound4Sbox GetInbound(Inbound4Sbox inItem, string tag, int offset, bool bSocks) | ||||
|         { | ||||
|             var inbound = JsonUtils.DeepCopy(inItem); | ||||
|             var inbound = JsonUtile.DeepCopy(inItem); | ||||
|             inbound.tag = tag; | ||||
|             inbound.listen_port = inItem.listen_port + offset; | ||||
|             inbound.type = bSocks ? Global.InboundSocks : Global.InboundHttp; | ||||
|  | @ -220,7 +220,7 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|                     outbound.uuid = node.id; | ||||
|                     outbound.alter_id = node.alterId; | ||||
|                     if (Global.VmessSecuritys.Contains(node.security)) | ||||
|                     if (Global.VmessSecurities.Contains(node.security)) | ||||
|                     { | ||||
|                         outbound.security = node.security; | ||||
|                     } | ||||
|  | @ -235,7 +235,7 @@ namespace v2rayN.Handler | |||
|                 { | ||||
|                     outbound.type = Global.ProtocolTypes[EConfigType.Shadowsocks]; | ||||
| 
 | ||||
|                     outbound.method = LazyConfig.Instance.GetShadowsocksSecuritys(node).Contains(node.security) ? node.security : "none"; | ||||
|                     outbound.method = LazyConfig.Instance.GetShadowsocksSecurities(node).Contains(node.security) ? node.security : "none"; | ||||
|                     outbound.password = node.id; | ||||
| 
 | ||||
|                     GenOutboundMux(node, outbound); | ||||
|  | @ -245,8 +245,8 @@ namespace v2rayN.Handler | |||
|                     outbound.type = Global.ProtocolTypes[EConfigType.Socks]; | ||||
| 
 | ||||
|                     outbound.version = "5"; | ||||
|                     if (!Utils.IsNullOrEmpty(node.security) | ||||
|                       && !Utils.IsNullOrEmpty(node.id)) | ||||
|                     if (!Utile.IsNullOrEmpty(node.security) | ||||
|                       && !Utile.IsNullOrEmpty(node.id)) | ||||
|                     { | ||||
|                         outbound.username = node.security; | ||||
|                         outbound.password = node.id; | ||||
|  | @ -260,7 +260,7 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|                     outbound.packet_encoding = "xudp"; | ||||
| 
 | ||||
|                     if (Utils.IsNullOrEmpty(node.flow)) | ||||
|                     if (Utile.IsNullOrEmpty(node.flow)) | ||||
|                     { | ||||
|                         GenOutboundMux(node, outbound); | ||||
|                     } | ||||
|  | @ -283,7 +283,7 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|                     outbound.password = node.id; | ||||
| 
 | ||||
|                     if (!Utils.IsNullOrEmpty(node.path)) | ||||
|                     if (!Utile.IsNullOrEmpty(node.path)) | ||||
|                     { | ||||
|                         outbound.obfs = new() | ||||
|                         { | ||||
|  | @ -309,9 +309,9 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|                     outbound.private_key = node.id; | ||||
|                     outbound.peer_public_key = node.publicKey; | ||||
|                     outbound.reserved = Utils.String2List(node.path).Select(int.Parse).ToArray(); | ||||
|                     outbound.local_address = [.. Utils.String2List(node.requestHost)]; | ||||
|                     outbound.mtu = Utils.ToInt(node.shortId.IsNullOrEmpty() ? Global.TunMtus.FirstOrDefault() : node.shortId); | ||||
|                     outbound.reserved = Utile.String2List(node.path).Select(int.Parse).ToArray(); | ||||
|                     outbound.local_address = [.. Utile.String2List(node.requestHost)]; | ||||
|                     outbound.mtu = Utile.ToInt(node.shortId.IsNullOrEmpty() ? Global.TunMtus.FirstOrDefault() : node.shortId); | ||||
|                 } | ||||
| 
 | ||||
|                 GenOutboundTls(node, outbound); | ||||
|  | @ -360,16 +360,16 @@ namespace v2rayN.Handler | |||
|                     } | ||||
|                     else if (!string.IsNullOrWhiteSpace(node.requestHost)) | ||||
|                     { | ||||
|                         server_name = Utils.String2List(node.requestHost)[0]; | ||||
|                         server_name = Utile.String2List(node.requestHost)[0]; | ||||
|                     } | ||||
|                     var tls = new Tls4Sbox() | ||||
|                     { | ||||
|                         enabled = true, | ||||
|                         server_name = server_name, | ||||
|                         insecure = Utils.ToBool(node.allowInsecure.IsNullOrEmpty() ? _config.coreBasicItem.defAllowInsecure.ToString().ToLower() : node.allowInsecure), | ||||
|                         insecure = Utile.ToBool(node.allowInsecure.IsNullOrEmpty() ? _config.coreBasicItem.defAllowInsecure.ToString().ToLower() : node.allowInsecure), | ||||
|                         alpn = node.GetAlpn(), | ||||
|                     }; | ||||
|                     if (!Utils.IsNullOrEmpty(node.fingerprint)) | ||||
|                     if (!Utile.IsNullOrEmpty(node.fingerprint)) | ||||
|                     { | ||||
|                         tls.utls = new Utls4Sbox() | ||||
|                         { | ||||
|  | @ -407,14 +407,14 @@ namespace v2rayN.Handler | |||
|                 { | ||||
|                     case "h2": | ||||
|                         transport.type = "http"; | ||||
|                         transport.host = Utils.IsNullOrEmpty(node.requestHost) ? null : Utils.String2List(node.requestHost); | ||||
|                         transport.path = Utils.IsNullOrEmpty(node.path) ? null : node.path; | ||||
|                         transport.host = Utile.IsNullOrEmpty(node.requestHost) ? null : Utile.String2List(node.requestHost); | ||||
|                         transport.path = Utile.IsNullOrEmpty(node.path) ? null : node.path; | ||||
|                         break; | ||||
| 
 | ||||
|                     case "ws": | ||||
|                         transport.type = "ws"; | ||||
|                         transport.path = Utils.IsNullOrEmpty(node.path) ? null : node.path; | ||||
|                         if (!Utils.IsNullOrEmpty(node.requestHost)) | ||||
|                         transport.path = Utile.IsNullOrEmpty(node.path) ? null : node.path; | ||||
|                         if (!Utile.IsNullOrEmpty(node.requestHost)) | ||||
|                         { | ||||
|                             transport.headers = new() | ||||
|                             { | ||||
|  | @ -465,14 +465,14 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|                 //current proxy | ||||
|                 var outbound = singboxConfig.outbounds[0]; | ||||
|                 var txtOutbound = Utils.GetEmbedText(Global.SingboxSampleOutbound); | ||||
|                 var txtOutbound = Utile.GetEmbedText(Global.SingboxSampleOutbound); | ||||
| 
 | ||||
|                 //Previous proxy | ||||
|                 var prevNode = LazyConfig.Instance.GetProfileItemViaRemarks(subItem.prevProfile!); | ||||
|                 if (prevNode is not null | ||||
|                     && prevNode.configType != EConfigType.Custom) | ||||
|                 { | ||||
|                     var prevOutbound = JsonUtils.Deserialize<Outbound4Sbox>(txtOutbound); | ||||
|                     var prevOutbound = JsonUtile.Deserialize<Outbound4Sbox>(txtOutbound); | ||||
|                     GenOutbound(prevNode, prevOutbound); | ||||
|                     prevOutbound.tag = $"{Global.ProxyTag}2"; | ||||
|                     singboxConfig.outbounds.Add(prevOutbound); | ||||
|  | @ -485,7 +485,7 @@ namespace v2rayN.Handler | |||
|                 if (nextNode is not null | ||||
|                     && nextNode.configType != EConfigType.Custom) | ||||
|                 { | ||||
|                     var nextOutbound = JsonUtils.Deserialize<Outbound4Sbox>(txtOutbound); | ||||
|                     var nextOutbound = JsonUtile.Deserialize<Outbound4Sbox>(txtOutbound); | ||||
|                     GenOutbound(nextNode, nextOutbound); | ||||
|                     nextOutbound.tag = Global.ProxyTag; | ||||
|                     singboxConfig.outbounds.Insert(0, nextOutbound); | ||||
|  | @ -510,7 +510,7 @@ namespace v2rayN.Handler | |||
|                 { | ||||
|                     singboxConfig.route.auto_detect_interface = true; | ||||
| 
 | ||||
|                     var tunRules = JsonUtils.Deserialize<List<Rule4Sbox>>(Utils.GetEmbedText(Global.TunSingboxRulesFileName)); | ||||
|                     var tunRules = JsonUtile.Deserialize<List<Rule4Sbox>>(Utile.GetEmbedText(Global.TunSingboxRulesFileName)); | ||||
|                     singboxConfig.route.rules.AddRange(tunRules); | ||||
| 
 | ||||
|                     GenRoutingDirectExe(out List<string> lstDnsExe, out List<string> lstDirectExe); | ||||
|  | @ -533,7 +533,7 @@ namespace v2rayN.Handler | |||
|                     var routing = ConfigHandler.GetDefaultRouting(_config); | ||||
|                     if (routing != null) | ||||
|                     { | ||||
|                         var rules = JsonUtils.Deserialize<List<RulesItem>>(routing.ruleSet); | ||||
|                         var rules = JsonUtile.Deserialize<List<RulesItem>>(routing.ruleSet); | ||||
|                         foreach (var item in rules!) | ||||
|                         { | ||||
|                             if (item.enabled) | ||||
|  | @ -548,7 +548,7 @@ namespace v2rayN.Handler | |||
|                     var lockedItem = ConfigHandler.GetLockedRoutingItem(_config); | ||||
|                     if (lockedItem != null) | ||||
|                     { | ||||
|                         var rules = JsonUtils.Deserialize<List<RulesItem>>(lockedItem.ruleSet); | ||||
|                         var rules = JsonUtile.Deserialize<List<RulesItem>>(lockedItem.ruleSet); | ||||
|                         foreach (var item in rules!) | ||||
|                         { | ||||
|                             GenRoutingUserRule(item, singboxConfig.route.rules); | ||||
|  | @ -567,8 +567,8 @@ namespace v2rayN.Handler | |||
|         { | ||||
|             lstDnsExe = new(); | ||||
|             lstDirectExe = new(); | ||||
|             var coreInfos = LazyConfig.Instance.GetCoreInfos(); | ||||
|             foreach (var it in coreInfos) | ||||
|             var coreInfo = LazyConfig.Instance.GetCoreInfo(); | ||||
|             foreach (var it in coreInfo) | ||||
|             { | ||||
|                 if (it.coreType == ECoreType.v2rayN) | ||||
|                 { | ||||
|  | @ -603,7 +603,7 @@ namespace v2rayN.Handler | |||
|                     outbound = item.outboundTag, | ||||
|                 }; | ||||
| 
 | ||||
|                 if (!Utils.IsNullOrEmpty(item.port)) | ||||
|                 if (!Utile.IsNullOrEmpty(item.port)) | ||||
|                 { | ||||
|                     if (item.port.Contains("-")) | ||||
|                     { | ||||
|  | @ -611,7 +611,7 @@ namespace v2rayN.Handler | |||
|                     } | ||||
|                     else | ||||
|                     { | ||||
|                         rule.port = new List<int> { Utils.ToInt(item.port) }; | ||||
|                         rule.port = new List<int> { Utile.ToInt(item.port) }; | ||||
|                     } | ||||
|                 } | ||||
|                 if (item.protocol?.Count > 0) | ||||
|  | @ -622,8 +622,8 @@ namespace v2rayN.Handler | |||
|                 { | ||||
|                     rule.inbound = item.inboundTag; | ||||
|                 } | ||||
|                 var rule2 = JsonUtils.DeepCopy(rule); | ||||
|                 var rule3 = JsonUtils.DeepCopy(rule); | ||||
|                 var rule2 = JsonUtile.DeepCopy(rule); | ||||
|                 var rule3 = JsonUtile.DeepCopy(rule); | ||||
| 
 | ||||
|                 var hasDomainIp = false; | ||||
|                 if (item.domain?.Count > 0) | ||||
|  | @ -738,9 +738,9 @@ namespace v2rayN.Handler | |||
|                     var tunDNS = item?.tunDNS; | ||||
|                     if (string.IsNullOrWhiteSpace(tunDNS)) | ||||
|                     { | ||||
|                         tunDNS = Utils.GetEmbedText(Global.TunSingboxDNSFileName); | ||||
|                         tunDNS = Utile.GetEmbedText(Global.TunSingboxDNSFileName); | ||||
|                     } | ||||
|                     dns4Sbox = JsonUtils.Deserialize<Dns4Sbox>(tunDNS); | ||||
|                     dns4Sbox = JsonUtile.Deserialize<Dns4Sbox>(tunDNS); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|  | @ -751,7 +751,7 @@ namespace v2rayN.Handler | |||
|                         normalDNS = "{\"servers\":[{\"address\":\"tcp://8.8.8.8\"}]}"; | ||||
|                     } | ||||
| 
 | ||||
|                     dns4Sbox = JsonUtils.Deserialize<Dns4Sbox>(normalDNS); | ||||
|                     dns4Sbox = JsonUtile.Deserialize<Dns4Sbox>(normalDNS); | ||||
|                 } | ||||
|                 if (dns4Sbox is null) | ||||
|                 { | ||||
|  | @ -827,15 +827,15 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|                 msg = ResUI.InitialConfiguration; | ||||
| 
 | ||||
|                 string result = Utils.GetEmbedText(Global.SingboxSampleClient); | ||||
|                 string txtOutbound = Utils.GetEmbedText(Global.SingboxSampleOutbound); | ||||
|                 if (Utils.IsNullOrEmpty(result) || txtOutbound.IsNullOrEmpty()) | ||||
|                 string result = Utile.GetEmbedText(Global.SingboxSampleClient); | ||||
|                 string txtOutbound = Utile.GetEmbedText(Global.SingboxSampleOutbound); | ||||
|                 if (Utile.IsNullOrEmpty(result) || txtOutbound.IsNullOrEmpty()) | ||||
|                 { | ||||
|                     msg = ResUI.FailedGetDefaultConfiguration; | ||||
|                     return -1; | ||||
|                 } | ||||
| 
 | ||||
|                 singboxConfig = JsonUtils.Deserialize<SingboxConfig>(result); | ||||
|                 singboxConfig = JsonUtile.Deserialize<SingboxConfig>(result); | ||||
|                 if (singboxConfig == null) | ||||
|                 { | ||||
|                     msg = ResUI.FailedGenDefaultConfiguration; | ||||
|  | @ -874,13 +874,13 @@ namespace v2rayN.Handler | |||
|                     if (it.configType is EConfigType.VMess or EConfigType.VLESS) | ||||
|                     { | ||||
|                         var item2 = LazyConfig.Instance.GetProfileItem(it.indexId); | ||||
|                         if (item2 is null || Utils.IsNullOrEmpty(item2.id) || !Utils.IsGuidByParse(item2.id)) | ||||
|                         if (item2 is null || Utile.IsNullOrEmpty(item2.id) || !Utile.IsGuidByParse(item2.id)) | ||||
|                         { | ||||
|                             continue; | ||||
|                         } | ||||
|                     } | ||||
| 
 | ||||
|                     //find unuse port | ||||
|                     //find unused port | ||||
|                     var port = httpPort; | ||||
|                     for (int k = httpPort; k < Global.MaxPort; k++) | ||||
|                     { | ||||
|  | @ -923,7 +923,7 @@ namespace v2rayN.Handler | |||
|                         continue; | ||||
|                     } | ||||
|                     if (item.configType == EConfigType.Shadowsocks | ||||
|                         && !Global.SsSecuritysInSingbox.Contains(item.security)) | ||||
|                         && !Global.SsSecuritiesInSingbox.Contains(item.security)) | ||||
|                     { | ||||
|                         continue; | ||||
|                     } | ||||
|  | @ -933,7 +933,7 @@ namespace v2rayN.Handler | |||
|                         continue; | ||||
|                     } | ||||
| 
 | ||||
|                     var outbound = JsonUtils.Deserialize<Outbound4Sbox>(txtOutbound); | ||||
|                     var outbound = JsonUtile.Deserialize<Outbound4Sbox>(txtOutbound); | ||||
|                     GenOutbound(item, outbound); | ||||
|                     outbound.tag = Global.ProxyTag + inbound.listen_port.ToString(); | ||||
|                     singboxConfig.outbounds.Add(outbound); | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| using System.Net; | ||||
| using System.Net.NetworkInformation; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| using v2rayN.Resx; | ||||
| 
 | ||||
| namespace v2rayN.Handler | ||||
|  | @ -28,14 +28,14 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|                 msg = ResUI.InitialConfiguration; | ||||
| 
 | ||||
|                 string result = Utils.GetEmbedText(Global.V2raySampleClient); | ||||
|                 if (Utils.IsNullOrEmpty(result)) | ||||
|                 string result = Utile.GetEmbedText(Global.V2raySampleClient); | ||||
|                 if (Utile.IsNullOrEmpty(result)) | ||||
|                 { | ||||
|                     msg = ResUI.FailedGetDefaultConfiguration; | ||||
|                     return -1; | ||||
|                 } | ||||
| 
 | ||||
|                 v2rayConfig = JsonUtils.Deserialize<V2rayConfig>(result); | ||||
|                 v2rayConfig = JsonUtile.Deserialize<V2rayConfig>(result); | ||||
|                 if (v2rayConfig == null) | ||||
|                 { | ||||
|                     msg = ResUI.FailedGenDefaultConfiguration; | ||||
|  | @ -77,8 +77,8 @@ namespace v2rayN.Handler | |||
|                 { | ||||
|                     var dtNow = DateTime.Now; | ||||
|                     v2rayConfig.log.loglevel = _config.coreBasicItem.loglevel; | ||||
|                     v2rayConfig.log.access = Utils.GetLogPath($"Vaccess_{dtNow:yyyy-MM-dd}.txt"); | ||||
|                     v2rayConfig.log.error = Utils.GetLogPath($"Verror_{dtNow:yyyy-MM-dd}.txt"); | ||||
|                     v2rayConfig.log.access = Utile.GetLogPath($"Vaccess_{dtNow:yyyy-MM-dd}.txt"); | ||||
|                     v2rayConfig.log.error = Utile.GetLogPath($"Verror_{dtNow:yyyy-MM-dd}.txt"); | ||||
|                 } | ||||
|                 else | ||||
|                 { | ||||
|  | @ -120,7 +120,7 @@ namespace v2rayN.Handler | |||
|                         v2rayConfig.inbounds.Add(inbound4); | ||||
| 
 | ||||
|                         //auth | ||||
|                         if (!Utils.IsNullOrEmpty(_config.inbound[0].user) && !Utils.IsNullOrEmpty(_config.inbound[0].pass)) | ||||
|                         if (!Utile.IsNullOrEmpty(_config.inbound[0].user) && !Utile.IsNullOrEmpty(_config.inbound[0].pass)) | ||||
|                         { | ||||
|                             inbound3.settings.auth = "password"; | ||||
|                             inbound3.settings.accounts = new List<AccountsItem4Ray> { new AccountsItem4Ray() { user = _config.inbound[0].user, pass = _config.inbound[0].pass } }; | ||||
|  | @ -145,13 +145,13 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|         private Inbounds4Ray? GetInbound(InItem inItem, string tag, int offset, bool bSocks) | ||||
|         { | ||||
|             string result = Utils.GetEmbedText(Global.V2raySampleInbound); | ||||
|             if (Utils.IsNullOrEmpty(result)) | ||||
|             string result = Utile.GetEmbedText(Global.V2raySampleInbound); | ||||
|             if (Utile.IsNullOrEmpty(result)) | ||||
|             { | ||||
|                 return null; | ||||
|             } | ||||
| 
 | ||||
|             var inbound = JsonUtils.Deserialize<Inbounds4Ray>(result); | ||||
|             var inbound = JsonUtile.Deserialize<Inbounds4Ray>(result); | ||||
|             if (inbound == null) | ||||
|             { | ||||
|                 return null; | ||||
|  | @ -173,23 +173,23 @@ namespace v2rayN.Handler | |||
|                 if (v2rayConfig.routing?.rules != null) | ||||
|                 { | ||||
|                     v2rayConfig.routing.domainStrategy = _config.routingBasicItem.domainStrategy; | ||||
|                     v2rayConfig.routing.domainMatcher = Utils.IsNullOrEmpty(_config.routingBasicItem.domainMatcher) ? null : _config.routingBasicItem.domainMatcher; | ||||
|                     v2rayConfig.routing.domainMatcher = Utile.IsNullOrEmpty(_config.routingBasicItem.domainMatcher) ? null : _config.routingBasicItem.domainMatcher; | ||||
| 
 | ||||
|                     if (_config.routingBasicItem.enableRoutingAdvanced) | ||||
|                     { | ||||
|                         var routing = ConfigHandler.GetDefaultRouting(_config); | ||||
|                         if (routing != null) | ||||
|                         { | ||||
|                             if (!Utils.IsNullOrEmpty(routing.domainStrategy)) | ||||
|                             if (!Utile.IsNullOrEmpty(routing.domainStrategy)) | ||||
|                             { | ||||
|                                 v2rayConfig.routing.domainStrategy = routing.domainStrategy; | ||||
|                             } | ||||
|                             var rules = JsonUtils.Deserialize<List<RulesItem>>(routing.ruleSet); | ||||
|                             var rules = JsonUtile.Deserialize<List<RulesItem>>(routing.ruleSet); | ||||
|                             foreach (var item in rules) | ||||
|                             { | ||||
|                                 if (item.enabled) | ||||
|                                 { | ||||
|                                     var item2 = JsonUtils.Deserialize<RulesItem4Ray>(JsonUtils.Serialize(item)); | ||||
|                                     var item2 = JsonUtile.Deserialize<RulesItem4Ray>(JsonUtile.Serialize(item)); | ||||
|                                     GenRoutingUserRule(item2, v2rayConfig); | ||||
|                                 } | ||||
|                             } | ||||
|  | @ -200,10 +200,10 @@ namespace v2rayN.Handler | |||
|                         var lockedItem = ConfigHandler.GetLockedRoutingItem(_config); | ||||
|                         if (lockedItem != null) | ||||
|                         { | ||||
|                             var rules = JsonUtils.Deserialize<List<RulesItem>>(lockedItem.ruleSet); | ||||
|                             var rules = JsonUtile.Deserialize<List<RulesItem>>(lockedItem.ruleSet); | ||||
|                             foreach (var item in rules) | ||||
|                             { | ||||
|                                 var item2 = JsonUtils.Deserialize<RulesItem4Ray>(JsonUtils.Serialize(item)); | ||||
|                                 var item2 = JsonUtile.Deserialize<RulesItem4Ray>(JsonUtile.Serialize(item)); | ||||
|                                 GenRoutingUserRule(item2, v2rayConfig); | ||||
|                             } | ||||
|                         } | ||||
|  | @ -225,7 +225,7 @@ namespace v2rayN.Handler | |||
|                 { | ||||
|                     return 0; | ||||
|                 } | ||||
|                 if (Utils.IsNullOrEmpty(rules.port)) | ||||
|                 if (Utile.IsNullOrEmpty(rules.port)) | ||||
|                 { | ||||
|                     rules.port = null; | ||||
|                 } | ||||
|  | @ -249,7 +249,7 @@ namespace v2rayN.Handler | |||
|                 var hasDomainIp = false; | ||||
|                 if (rules.domain?.Count > 0) | ||||
|                 { | ||||
|                     var it = JsonUtils.DeepCopy(rules); | ||||
|                     var it = JsonUtile.DeepCopy(rules); | ||||
|                     it.ip = null; | ||||
|                     it.type = "field"; | ||||
|                     for (int k = it.domain.Count - 1; k >= 0; k--) | ||||
|  | @ -265,7 +265,7 @@ namespace v2rayN.Handler | |||
|                 } | ||||
|                 if (rules.ip?.Count > 0) | ||||
|                 { | ||||
|                     var it = JsonUtils.DeepCopy(rules); | ||||
|                     var it = JsonUtile.DeepCopy(rules); | ||||
|                     it.domain = null; | ||||
|                     it.type = "field"; | ||||
|                     v2rayConfig.routing.rules.Add(it); | ||||
|  | @ -273,12 +273,12 @@ namespace v2rayN.Handler | |||
|                 } | ||||
|                 if (!hasDomainIp) | ||||
|                 { | ||||
|                     if (!Utils.IsNullOrEmpty(rules.port) | ||||
|                     if (!Utile.IsNullOrEmpty(rules.port) | ||||
|                         || (rules.protocol?.Count > 0) | ||||
|                         || (rules.inboundTag?.Count > 0) | ||||
|                         ) | ||||
|                     { | ||||
|                         var it = JsonUtils.DeepCopy(rules); | ||||
|                         var it = JsonUtile.DeepCopy(rules); | ||||
|                         it.type = "field"; | ||||
|                         v2rayConfig.routing.rules.Add(it); | ||||
|                     } | ||||
|  | @ -324,7 +324,7 @@ namespace v2rayN.Handler | |||
|                     usersItem.id = node.id; | ||||
|                     usersItem.alterId = node.alterId; | ||||
|                     usersItem.email = Global.UserEMail; | ||||
|                     if (Global.VmessSecuritys.Contains(node.security)) | ||||
|                     if (Global.VmessSecurities.Contains(node.security)) | ||||
|                     { | ||||
|                         usersItem.security = node.security; | ||||
|                     } | ||||
|  | @ -353,7 +353,7 @@ namespace v2rayN.Handler | |||
|                     serversItem.address = node.address; | ||||
|                     serversItem.port = node.port; | ||||
|                     serversItem.password = node.id; | ||||
|                     serversItem.method = LazyConfig.Instance.GetShadowsocksSecuritys(node).Contains(node.security) ? node.security : "none"; | ||||
|                     serversItem.method = LazyConfig.Instance.GetShadowsocksSecurities(node).Contains(node.security) ? node.security : "none"; | ||||
| 
 | ||||
|                     serversItem.ota = false; | ||||
|                     serversItem.level = 1; | ||||
|  | @ -380,8 +380,8 @@ namespace v2rayN.Handler | |||
|                     serversItem.method = null; | ||||
|                     serversItem.password = null; | ||||
| 
 | ||||
|                     if (!Utils.IsNullOrEmpty(node.security) | ||||
|                         && !Utils.IsNullOrEmpty(node.id)) | ||||
|                     if (!Utile.IsNullOrEmpty(node.security) | ||||
|                         && !Utile.IsNullOrEmpty(node.id)) | ||||
|                     { | ||||
|                         SocksUsersItem4Ray socksUsersItem = new() | ||||
|                         { | ||||
|  | @ -432,14 +432,14 @@ namespace v2rayN.Handler | |||
|                     if (node.streamSecurity == Global.StreamSecurityReality | ||||
|                         || node.streamSecurity == Global.StreamSecurity) | ||||
|                     { | ||||
|                         if (!Utils.IsNullOrEmpty(node.flow)) | ||||
|                         if (!Utile.IsNullOrEmpty(node.flow)) | ||||
|                         { | ||||
|                             usersItem.flow = node.flow; | ||||
| 
 | ||||
|                             GenOutboundMux(node, outbound, false); | ||||
|                         } | ||||
|                     } | ||||
|                     if (node.streamSecurity == Global.StreamSecurityReality && Utils.IsNullOrEmpty(node.flow)) | ||||
|                     if (node.streamSecurity == Global.StreamSecurityReality && Utile.IsNullOrEmpty(node.flow)) | ||||
|                     { | ||||
|                         GenOutboundMux(node, outbound, _config.coreBasicItem.muxEnabled); | ||||
|                     } | ||||
|  | @ -514,7 +514,7 @@ namespace v2rayN.Handler | |||
|                 { | ||||
|                     try | ||||
|                     { | ||||
|                         useragent = Global.UserAgentTxts[_config.coreBasicItem.defUserAgent]; | ||||
|                         useragent = Global.UserAgentTexts[_config.coreBasicItem.defUserAgent]; | ||||
|                     } | ||||
|                     catch (KeyNotFoundException) | ||||
|                     { | ||||
|  | @ -529,7 +529,7 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|                     TlsSettings4Ray tlsSettings = new() | ||||
|                     { | ||||
|                         allowInsecure = Utils.ToBool(node.allowInsecure.IsNullOrEmpty() ? _config.coreBasicItem.defAllowInsecure.ToString().ToLower() : node.allowInsecure), | ||||
|                         allowInsecure = Utile.ToBool(node.allowInsecure.IsNullOrEmpty() ? _config.coreBasicItem.defAllowInsecure.ToString().ToLower() : node.allowInsecure), | ||||
|                         alpn = node.GetAlpn(), | ||||
|                         fingerprint = node.fingerprint.IsNullOrEmpty() ? _config.coreBasicItem.defFingerprint : node.fingerprint | ||||
|                     }; | ||||
|  | @ -539,7 +539,7 @@ namespace v2rayN.Handler | |||
|                     } | ||||
|                     else if (!string.IsNullOrWhiteSpace(host)) | ||||
|                     { | ||||
|                         tlsSettings.serverName = Utils.String2List(host)[0]; | ||||
|                         tlsSettings.serverName = Utile.String2List(host)[0]; | ||||
|                     } | ||||
|                     streamSettings.tlsSettings = tlsSettings; | ||||
|                 } | ||||
|  | @ -581,7 +581,7 @@ namespace v2rayN.Handler | |||
|                         { | ||||
|                             type = node.headerType | ||||
|                         }; | ||||
|                         if (!Utils.IsNullOrEmpty(node.path)) | ||||
|                         if (!Utile.IsNullOrEmpty(node.path)) | ||||
|                         { | ||||
|                             kcpSettings.seed = node.path; | ||||
|                         } | ||||
|  | @ -613,7 +613,7 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|                         if (!string.IsNullOrWhiteSpace(host)) | ||||
|                         { | ||||
|                             httpSettings.host = Utils.String2List(host); | ||||
|                             httpSettings.host = Utile.String2List(host); | ||||
|                         } | ||||
|                         httpSettings.path = node.path; | ||||
| 
 | ||||
|  | @ -649,7 +649,7 @@ namespace v2rayN.Handler | |||
|                         GrpcSettings4Ray grpcSettings = new() | ||||
|                         { | ||||
|                             serviceName = node.path, | ||||
|                             multiMode = (node.headerType == Global.GrpcmultiMode), | ||||
|                             multiMode = (node.headerType == Global.GrpcMultiMode), | ||||
|                             idle_timeout = _config.grpcItem.idle_timeout, | ||||
|                             health_check_timeout = _config.grpcItem.health_check_timeout, | ||||
|                             permit_without_stream = _config.grpcItem.permit_without_stream, | ||||
|  | @ -671,7 +671,7 @@ namespace v2rayN.Handler | |||
|                             }; | ||||
| 
 | ||||
|                             //request Host | ||||
|                             string request = Utils.GetEmbedText(Global.V2raySampleHttprequestFileName); | ||||
|                             string request = Utile.GetEmbedText(Global.V2raySampleHttpRequestFileName); | ||||
|                             string[] arrHost = host.Split(','); | ||||
|                             string host2 = string.Join("\",\"", arrHost); | ||||
|                             request = request.Replace("$requestHost$", $"\"{host2}\""); | ||||
|  | @ -679,13 +679,13 @@ namespace v2rayN.Handler | |||
|                             request = request.Replace("$requestUserAgent$", $"\"{useragent}\""); | ||||
|                             //Path | ||||
|                             string pathHttp = @"/"; | ||||
|                             if (!Utils.IsNullOrEmpty(node.path)) | ||||
|                             if (!Utile.IsNullOrEmpty(node.path)) | ||||
|                             { | ||||
|                                 string[] arrPath = node.path.Split(','); | ||||
|                                 pathHttp = string.Join("\",\"", arrPath); | ||||
|                             } | ||||
|                             request = request.Replace("$requestPath$", $"\"{pathHttp}\""); | ||||
|                             tcpSettings.header.request = JsonUtils.Deserialize<object>(request); | ||||
|                             tcpSettings.header.request = JsonUtile.Deserialize<object>(request); | ||||
| 
 | ||||
|                             streamSettings.tcpSettings = tcpSettings; | ||||
|                         } | ||||
|  | @ -719,7 +719,7 @@ namespace v2rayN.Handler | |||
|                     outbound.settings.userLevel = 0; | ||||
|                 } | ||||
| 
 | ||||
|                 var obj = JsonUtils.ParseJson(normalDNS); | ||||
|                 var obj = JsonUtile.ParseJson(normalDNS); | ||||
|                 if (obj is null) | ||||
|                 { | ||||
|                     List<string> servers = []; | ||||
|  | @ -728,14 +728,14 @@ namespace v2rayN.Handler | |||
|                     { | ||||
|                         servers.Add(str); | ||||
|                     } | ||||
|                     obj = JsonUtils.ParseJson("{}"); | ||||
|                     obj["servers"] = JsonUtils.SerializeToNode(servers); | ||||
|                     obj = JsonUtile.ParseJson("{}"); | ||||
|                     obj["servers"] = JsonUtile.SerializeToNode(servers); | ||||
|                 } | ||||
| 
 | ||||
|                 // 追加至 dns 设置 | ||||
|                 if (item.useSystemHosts) | ||||
|                 { | ||||
|                     var systemHosts = Utils.GetSystemHosts(); | ||||
|                     var systemHosts = Utile.GetSystemHosts(); | ||||
|                     if (systemHosts.Count > 0) | ||||
|                     { | ||||
|                         var normalHost = obj["hosts"]; | ||||
|  | @ -789,7 +789,7 @@ namespace v2rayN.Handler | |||
|                     apiInbound.tag = tag; | ||||
|                     apiInbound.listen = Global.Loopback; | ||||
|                     apiInbound.port = LazyConfig.Instance.StatePort; | ||||
|                     apiInbound.protocol = Global.InboundAPIProtocal; | ||||
|                     apiInbound.protocol = Global.InboundAPIProtocol; | ||||
|                     apiInboundSettings.address = Global.Loopback; | ||||
|                     apiInbound.settings = apiInboundSettings; | ||||
|                     v2rayConfig.inbounds.Add(apiInbound); | ||||
|  | @ -826,7 +826,7 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|                 //current proxy | ||||
|                 var outbound = v2rayConfig.outbounds[0]; | ||||
|                 var txtOutbound = Utils.GetEmbedText(Global.V2raySampleOutbound); | ||||
|                 var txtOutbound = Utile.GetEmbedText(Global.V2raySampleOutbound); | ||||
| 
 | ||||
|                 //Previous proxy | ||||
|                 var prevNode = LazyConfig.Instance.GetProfileItemViaRemarks(subItem.prevProfile!); | ||||
|  | @ -836,7 +836,7 @@ namespace v2rayN.Handler | |||
|                     && prevNode.configType != EConfigType.Tuic | ||||
|                     && prevNode.configType != EConfigType.Wireguard) | ||||
|                 { | ||||
|                     var prevOutbound = JsonUtils.Deserialize<Outbounds4Ray>(txtOutbound); | ||||
|                     var prevOutbound = JsonUtile.Deserialize<Outbounds4Ray>(txtOutbound); | ||||
|                     GenOutbound(prevNode, prevOutbound); | ||||
|                     prevOutbound.tag = $"{Global.ProxyTag}2"; | ||||
|                     v2rayConfig.outbounds.Add(prevOutbound); | ||||
|  | @ -855,7 +855,7 @@ namespace v2rayN.Handler | |||
|                     && nextNode.configType != EConfigType.Tuic | ||||
|                     && nextNode.configType != EConfigType.Wireguard) | ||||
|                 { | ||||
|                     var nextOutbound = JsonUtils.Deserialize<Outbounds4Ray>(txtOutbound); | ||||
|                     var nextOutbound = JsonUtile.Deserialize<Outbounds4Ray>(txtOutbound); | ||||
|                     GenOutbound(nextNode, nextOutbound); | ||||
|                     nextOutbound.tag = Global.ProxyTag; | ||||
|                     v2rayConfig.outbounds.Insert(0, nextOutbound); | ||||
|  | @ -892,15 +892,15 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|                 msg = ResUI.InitialConfiguration; | ||||
| 
 | ||||
|                 string result = Utils.GetEmbedText(Global.V2raySampleClient); | ||||
|                 string txtOutbound = Utils.GetEmbedText(Global.V2raySampleOutbound); | ||||
|                 if (Utils.IsNullOrEmpty(result) || txtOutbound.IsNullOrEmpty()) | ||||
|                 string result = Utile.GetEmbedText(Global.V2raySampleClient); | ||||
|                 string txtOutbound = Utile.GetEmbedText(Global.V2raySampleOutbound); | ||||
|                 if (Utile.IsNullOrEmpty(result) || txtOutbound.IsNullOrEmpty()) | ||||
|                 { | ||||
|                     msg = ResUI.FailedGetDefaultConfiguration; | ||||
|                     return -1; | ||||
|                 } | ||||
| 
 | ||||
|                 v2rayConfig = JsonUtils.Deserialize<V2rayConfig>(result); | ||||
|                 v2rayConfig = JsonUtile.Deserialize<V2rayConfig>(result); | ||||
|                 if (v2rayConfig == null) | ||||
|                 { | ||||
|                     msg = ResUI.FailedGenDefaultConfiguration; | ||||
|  | @ -938,13 +938,13 @@ namespace v2rayN.Handler | |||
|                     if (it.configType is EConfigType.VMess or EConfigType.VLESS) | ||||
|                     { | ||||
|                         var item2 = LazyConfig.Instance.GetProfileItem(it.indexId); | ||||
|                         if (item2 is null || Utils.IsNullOrEmpty(item2.id) || !Utils.IsGuidByParse(item2.id)) | ||||
|                         if (item2 is null || Utile.IsNullOrEmpty(item2.id) || !Utile.IsGuidByParse(item2.id)) | ||||
|                         { | ||||
|                             continue; | ||||
|                         } | ||||
|                     } | ||||
| 
 | ||||
|                     //find unuse port | ||||
|                     //find unused port | ||||
|                     var port = httpPort; | ||||
|                     for (int k = httpPort; k < Global.MaxPort; k++) | ||||
|                     { | ||||
|  | @ -987,7 +987,7 @@ namespace v2rayN.Handler | |||
|                         continue; | ||||
|                     } | ||||
|                     if (item.configType == EConfigType.Shadowsocks | ||||
|                         && !Global.SsSecuritysInXray.Contains(item.security)) | ||||
|                         && !Global.SsSecuritiesInXray.Contains(item.security)) | ||||
|                     { | ||||
|                         continue; | ||||
|                     } | ||||
|  | @ -997,7 +997,7 @@ namespace v2rayN.Handler | |||
|                         continue; | ||||
|                     } | ||||
| 
 | ||||
|                     var outbound = JsonUtils.Deserialize<Outbounds4Ray>(txtOutbound); | ||||
|                     var outbound = JsonUtile.Deserialize<Outbounds4Ray>(txtOutbound); | ||||
|                     GenOutbound(item, outbound); | ||||
|                     outbound.tag = Global.ProxyTag + inbound.port.ToString(); | ||||
|                     v2rayConfig.outbounds.Add(outbound); | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
| using System.IO; | ||||
| using System.Reactive.Linq; | ||||
| using System.Text; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| using v2rayN.Resx; | ||||
| 
 | ||||
| namespace v2rayN.Handler | ||||
|  | @ -22,8 +22,8 @@ namespace v2rayN.Handler | |||
|             _config = config; | ||||
|             _updateFunc = update; | ||||
| 
 | ||||
|             Environment.SetEnvironmentVariable("v2ray.location.asset", Utils.GetBinPath(""), EnvironmentVariableTarget.Process); | ||||
|             Environment.SetEnvironmentVariable("xray.location.asset", Utils.GetBinPath(""), EnvironmentVariableTarget.Process); | ||||
|             Environment.SetEnvironmentVariable("v2ray.location.asset", Utile.GetBinPath(""), EnvironmentVariableTarget.Process); | ||||
|             Environment.SetEnvironmentVariable("xray.location.asset", Utile.GetBinPath(""), EnvironmentVariableTarget.Process); | ||||
|         } | ||||
| 
 | ||||
|         public void LoadCore() | ||||
|  | @ -35,7 +35,7 @@ namespace v2rayN.Handler | |||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             string fileName = Utils.GetConfigPath(Global.CoreConfigFileName); | ||||
|             string fileName = Utile.GetConfigPath(Global.CoreConfigFileName); | ||||
|             if (CoreConfigHandler.GenerateClientConfig(node, fileName, out string msg, out string content) != 0) | ||||
|             { | ||||
|                 ShowMsg(false, msg); | ||||
|  | @ -48,7 +48,7 @@ namespace v2rayN.Handler | |||
|                 if (_config.tunModeItem.enableTun) | ||||
|                 { | ||||
|                     Thread.Sleep(1000); | ||||
|                     Utils.RemoveTunDevice(); | ||||
|                     Utile.RemoveTunDevice(); | ||||
|                 } | ||||
| 
 | ||||
|                 CoreStart(node); | ||||
|  | @ -77,7 +77,7 @@ namespace v2rayN.Handler | |||
|         { | ||||
|             int pid = -1; | ||||
|             var coreType = selecteds.Exists(t => t.configType == EConfigType.Hysteria2 || t.configType == EConfigType.Tuic || t.configType == EConfigType.Wireguard) ? ECoreType.sing_box : ECoreType.Xray; | ||||
|             string configPath = Utils.GetConfigPath(Global.CoreSpeedtestConfigFileName); | ||||
|             string configPath = Utile.GetConfigPath(Global.CoreSpeedtestConfigFileName); | ||||
|             if (CoreConfigHandler.GenerateClientSpeedtestConfig(_config, configPath, selecteds, coreType, out string msg) != 0) | ||||
|             { | ||||
|                 ShowMsg(false, msg); | ||||
|  | @ -113,8 +113,8 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|                 if (!hasProc) | ||||
|                 { | ||||
|                     var coreInfos = LazyConfig.Instance.GetCoreInfos(); | ||||
|                     foreach (var it in coreInfos) | ||||
|                     var coreInfo = LazyConfig.Instance.GetCoreInfo(); | ||||
|                     foreach (var it in coreInfo) | ||||
|                     { | ||||
|                         if (it.coreType == ECoreType.v2rayN) | ||||
|                         { | ||||
|  | @ -126,7 +126,7 @@ namespace v2rayN.Handler | |||
|                             foreach (Process p in existing) | ||||
|                             { | ||||
|                                 string? path = p.MainModule?.FileName; | ||||
|                                 if (path == $"{Utils.GetBinPath(vName, it.coreType.ToString())}.exe") | ||||
|                                 if (path == $"{Utile.GetBinPath(vName, it.coreType.ToString())}.exe") | ||||
|                                 { | ||||
|                                     KillProcess(p); | ||||
|                                 } | ||||
|  | @ -162,16 +162,16 @@ namespace v2rayN.Handler | |||
|             foreach (string name in coreInfo.coreExes) | ||||
|             { | ||||
|                 string vName = $"{name}.exe"; | ||||
|                 vName = Utils.GetBinPath(vName, coreInfo.coreType.ToString()); | ||||
|                 vName = Utile.GetBinPath(vName, coreInfo.coreType.ToString()); | ||||
|                 if (File.Exists(vName)) | ||||
|                 { | ||||
|                     fileName = vName; | ||||
|                     break; | ||||
|                 } | ||||
|             } | ||||
|             if (Utils.IsNullOrEmpty(fileName)) | ||||
|             if (Utile.IsNullOrEmpty(fileName)) | ||||
|             { | ||||
|                 string msg = string.Format(ResUI.NotFoundCore, Utils.GetBinPath("", coreInfo.coreType.ToString()), string.Join(", ", coreInfo.coreExes.ToArray()), coreInfo.coreUrl); | ||||
|                 string msg = string.Format(ResUI.NotFoundCore, Utile.GetBinPath("", coreInfo.coreType.ToString()), string.Join(", ", coreInfo.coreExes.ToArray()), coreInfo.coreUrl); | ||||
|                 Logging.SaveLog(msg); | ||||
|                 ShowMsg(false, msg); | ||||
|             } | ||||
|  | @ -214,7 +214,7 @@ namespace v2rayN.Handler | |||
|                         address = Global.Loopback, | ||||
|                         port = node.preSocksPort | ||||
|                     }; | ||||
|                     string fileName2 = Utils.GetConfigPath(Global.CorePreConfigFileName); | ||||
|                     string fileName2 = Utile.GetConfigPath(Global.CorePreConfigFileName); | ||||
|                     if (CoreConfigHandler.GenerateClientConfig(itemSocks, fileName2, out string msg2, out string configStr) == 0) | ||||
|                     { | ||||
|                         var coreInfo2 = LazyConfig.Instance.GetCoreInfo(ECoreType.sing_box); | ||||
|  | @ -267,7 +267,7 @@ namespace v2rayN.Handler | |||
|             try | ||||
|             { | ||||
|                 string fileName = CoreFindExe(coreInfo); | ||||
|                 if (Utils.IsNullOrEmpty(fileName)) | ||||
|                 if (Utile.IsNullOrEmpty(fileName)) | ||||
|                 { | ||||
|                     return null; | ||||
|                 } | ||||
|  | @ -277,7 +277,7 @@ namespace v2rayN.Handler | |||
|                     { | ||||
|                         FileName = fileName, | ||||
|                         Arguments = string.Format(coreInfo.arguments, configPath), | ||||
|                         WorkingDirectory = Utils.GetConfigPath(), | ||||
|                         WorkingDirectory = Utile.GetConfigPath(), | ||||
|                         UseShellExecute = false, | ||||
|                         RedirectStandardOutput = displayLog, | ||||
|                         RedirectStandardError = displayLog, | ||||
|  |  | |||
|  | @ -33,7 +33,7 @@ namespace v2rayN.Handler | |||
|         { | ||||
|             try | ||||
|             { | ||||
|                 Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().guiItem.enableSecurityProtocolTls13); | ||||
|                 Utile.SetSecurityProtocol(LazyConfig.Instance.GetConfig().guiItem.enableSecurityProtocolTls13); | ||||
| 
 | ||||
|                 var progress = new Progress<string>(); | ||||
|                 progress.ProgressChanged += (sender, value) => | ||||
|  | @ -65,7 +65,7 @@ namespace v2rayN.Handler | |||
|         { | ||||
|             try | ||||
|             { | ||||
|                 Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().guiItem.enableSecurityProtocolTls13); | ||||
|                 Utile.SetSecurityProtocol(LazyConfig.Instance.GetConfig().guiItem.enableSecurityProtocolTls13); | ||||
|                 UpdateCompleted?.Invoke(this, new ResultEventArgs(false, $"{ResUI.Downloading}   {url}")); | ||||
| 
 | ||||
|                 var progress = new Progress<double>(); | ||||
|  | @ -77,7 +77,7 @@ namespace v2rayN.Handler | |||
|                 var webProxy = GetWebProxy(blProxy); | ||||
|                 await DownloaderHelper.Instance.DownloadFileAsync(webProxy, | ||||
|                     url, | ||||
|                     Utils.GetTempPath(Utils.GetDownloadFileName(url)), | ||||
|                     Utile.GetTempPath(Utile.GetDownloadFileName(url)), | ||||
|                     progress, | ||||
|                     downloadTimeout); | ||||
|             } | ||||
|  | @ -95,7 +95,7 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|         public async Task<string?> UrlRedirectAsync(string url, bool blProxy) | ||||
|         { | ||||
|             Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().guiItem.enableSecurityProtocolTls13); | ||||
|             Utile.SetSecurityProtocol(LazyConfig.Instance.GetConfig().guiItem.enableSecurityProtocolTls13); | ||||
|             var webRequestHandler = new SocketsHttpHandler | ||||
|             { | ||||
|                 AllowAutoRedirect = false, | ||||
|  | @ -120,7 +120,7 @@ namespace v2rayN.Handler | |||
|             try | ||||
|             { | ||||
|                 var result1 = await DownloadStringAsync(url, blProxy, userAgent); | ||||
|                 if (!Utils.IsNullOrEmpty(result1)) | ||||
|                 if (!Utile.IsNullOrEmpty(result1)) | ||||
|                 { | ||||
|                     return result1; | ||||
|                 } | ||||
|  | @ -138,7 +138,7 @@ namespace v2rayN.Handler | |||
|             try | ||||
|             { | ||||
|                 var result2 = await DownloadStringViaDownloader(url, blProxy, userAgent); | ||||
|                 if (!Utils.IsNullOrEmpty(result2)) | ||||
|                 if (!Utile.IsNullOrEmpty(result2)) | ||||
|                 { | ||||
|                     return result2; | ||||
|                 } | ||||
|  | @ -158,7 +158,7 @@ namespace v2rayN.Handler | |||
|                 using var wc = new WebClient(); | ||||
|                 wc.Proxy = GetWebProxy(blProxy); | ||||
|                 var result3 = await wc.DownloadStringTaskAsync(url); | ||||
|                 if (!Utils.IsNullOrEmpty(result3)) | ||||
|                 if (!Utile.IsNullOrEmpty(result3)) | ||||
|                 { | ||||
|                     return result3; | ||||
|                 } | ||||
|  | @ -184,7 +184,7 @@ namespace v2rayN.Handler | |||
|         { | ||||
|             try | ||||
|             { | ||||
|                 Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().guiItem.enableSecurityProtocolTls13); | ||||
|                 Utile.SetSecurityProtocol(LazyConfig.Instance.GetConfig().guiItem.enableSecurityProtocolTls13); | ||||
|                 var webProxy = GetWebProxy(blProxy); | ||||
|                 var client = new HttpClient(new SocketsHttpHandler() | ||||
|                 { | ||||
|  | @ -192,17 +192,17 @@ namespace v2rayN.Handler | |||
|                     UseProxy = webProxy != null | ||||
|                 }); | ||||
| 
 | ||||
|                 if (Utils.IsNullOrEmpty(userAgent)) | ||||
|                 if (Utile.IsNullOrEmpty(userAgent)) | ||||
|                 { | ||||
|                     userAgent = Utils.GetVersion(false); | ||||
|                     userAgent = Utile.GetVersion(false); | ||||
|                 } | ||||
|                 client.DefaultRequestHeaders.UserAgent.TryParseAdd(userAgent); | ||||
| 
 | ||||
|                 Uri uri = new(url); | ||||
|                 //Authorization Header | ||||
|                 if (!Utils.IsNullOrEmpty(uri.UserInfo)) | ||||
|                 if (!Utile.IsNullOrEmpty(uri.UserInfo)) | ||||
|                 { | ||||
|                     client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Utils.Base64Encode(uri.UserInfo)); | ||||
|                     client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Utile.Base64Encode(uri.UserInfo)); | ||||
|                 } | ||||
| 
 | ||||
|                 using var cts = new CancellationTokenSource(); | ||||
|  | @ -229,13 +229,13 @@ namespace v2rayN.Handler | |||
|         { | ||||
|             try | ||||
|             { | ||||
|                 Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().guiItem.enableSecurityProtocolTls13); | ||||
|                 Utile.SetSecurityProtocol(LazyConfig.Instance.GetConfig().guiItem.enableSecurityProtocolTls13); | ||||
| 
 | ||||
|                 var webProxy = GetWebProxy(blProxy); | ||||
| 
 | ||||
|                 if (Utils.IsNullOrEmpty(userAgent)) | ||||
|                 if (Utile.IsNullOrEmpty(userAgent)) | ||||
|                 { | ||||
|                     userAgent = Utils.GetVersion(false); | ||||
|                     userAgent = Utile.GetVersion(false); | ||||
|                 } | ||||
|                 var result = await DownloaderHelper.Instance.DownloadStringAsync(webProxy, url, userAgent, 30); | ||||
|                 return result; | ||||
|  | @ -300,7 +300,7 @@ namespace v2rayN.Handler | |||
|             } | ||||
|             catch //(Exception ex) | ||||
|             { | ||||
|                 //Utils.SaveLog(ex.Message, ex); | ||||
|                 //Utile.SaveLog(ex.Message, ex); | ||||
|             } | ||||
|             return responseTime; | ||||
|         } | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ using System.Text; | |||
| using System.Windows; | ||||
| using System.Windows.Input; | ||||
| using System.Windows.Interop; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| using v2rayN.Resx; | ||||
| 
 | ||||
| namespace v2rayN.Handler | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| using System.Runtime.Intrinsics.X86; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| 
 | ||||
| namespace v2rayN.Handler | ||||
| { | ||||
|  | @ -7,7 +7,7 @@ namespace v2rayN.Handler | |||
|     { | ||||
|         private static readonly Lazy<LazyConfig> _instance = new(() => new()); | ||||
|         private Config _config; | ||||
|         private List<CoreInfo> coreInfos; | ||||
|         private List<CoreInfo> coreInfo; | ||||
| 
 | ||||
|         public static LazyConfig Instance => _instance.Value; | ||||
| 
 | ||||
|  | @ -18,7 +18,7 @@ namespace v2rayN.Handler | |||
|             { | ||||
|                 if (_statePort is null) | ||||
|                 { | ||||
|                     _statePort = Utils.GetFreePort(); | ||||
|                     _statePort = Utile.GetFreePort(); | ||||
|                 } | ||||
| 
 | ||||
|                 return _statePort.Value; | ||||
|  | @ -29,12 +29,12 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|         public LazyConfig() | ||||
|         { | ||||
|             SqliteHelper.Instance.CreateTable<SubItem>(); | ||||
|             SqliteHelper.Instance.CreateTable<ProfileItem>(); | ||||
|             SqliteHelper.Instance.CreateTable<ServerStatItem>(); | ||||
|             SqliteHelper.Instance.CreateTable<RoutingItem>(); | ||||
|             SqliteHelper.Instance.CreateTable<ProfileExItem>(); | ||||
|             SqliteHelper.Instance.CreateTable<DNSItem>(); | ||||
|             SQLiteHelper.Instance.CreateTable<SubItem>(); | ||||
|             SQLiteHelper.Instance.CreateTable<ProfileItem>(); | ||||
|             SQLiteHelper.Instance.CreateTable<ServerStatItem>(); | ||||
|             SQLiteHelper.Instance.CreateTable<RoutingItem>(); | ||||
|             SQLiteHelper.Instance.CreateTable<ProfileExItem>(); | ||||
|             SQLiteHelper.Instance.CreateTable<DNSItem>(); | ||||
|         } | ||||
| 
 | ||||
|         #region Config | ||||
|  | @ -90,35 +90,35 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|         public List<SubItem> SubItems() | ||||
|         { | ||||
|             return SqliteHelper.Instance.Table<SubItem>().ToList(); | ||||
|             return SQLiteHelper.Instance.Table<SubItem>().ToList(); | ||||
|         } | ||||
| 
 | ||||
|         public SubItem GetSubItem(string subid) | ||||
|         { | ||||
|             return SqliteHelper.Instance.Table<SubItem>().FirstOrDefault(t => t.id == subid); | ||||
|             return SQLiteHelper.Instance.Table<SubItem>().FirstOrDefault(t => t.id == subid); | ||||
|         } | ||||
| 
 | ||||
|         public List<ProfileItem> ProfileItems(string subid) | ||||
|         { | ||||
|             if (Utils.IsNullOrEmpty(subid)) | ||||
|             if (Utile.IsNullOrEmpty(subid)) | ||||
|             { | ||||
|                 return SqliteHelper.Instance.Table<ProfileItem>().ToList(); | ||||
|                 return SQLiteHelper.Instance.Table<ProfileItem>().ToList(); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 return SqliteHelper.Instance.Table<ProfileItem>().Where(t => t.subid == subid).ToList(); | ||||
|                 return SQLiteHelper.Instance.Table<ProfileItem>().Where(t => t.subid == subid).ToList(); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public List<string> ProfileItemIndexs(string subid) | ||||
|         public List<string> ProfileItemIndexes(string subid) | ||||
|         { | ||||
|             if (Utils.IsNullOrEmpty(subid)) | ||||
|             if (Utile.IsNullOrEmpty(subid)) | ||||
|             { | ||||
|                 return SqliteHelper.Instance.Table<ProfileItem>().Select(t => t.indexId).ToList(); | ||||
|                 return SQLiteHelper.Instance.Table<ProfileItem>().Select(t => t.indexId).ToList(); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 return SqliteHelper.Instance.Table<ProfileItem>().Where(t => t.subid == subid).Select(t => t.indexId).ToList(); | ||||
|                 return SQLiteHelper.Instance.Table<ProfileItem>().Where(t => t.subid == subid).Select(t => t.indexId).ToList(); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|  | @ -129,11 +129,11 @@ namespace v2rayN.Handler | |||
|                         from ProfileItem a | ||||
|                         left join SubItem b on a.subid = b.id | ||||
|                         where 1=1 ";
 | ||||
|             if (!Utils.IsNullOrEmpty(subid)) | ||||
|             if (!Utile.IsNullOrEmpty(subid)) | ||||
|             { | ||||
|                 sql += $" and a.subid = '{subid}'"; | ||||
|             } | ||||
|             if (!Utils.IsNullOrEmpty(filter)) | ||||
|             if (!Utile.IsNullOrEmpty(filter)) | ||||
|             { | ||||
|                 if (filter.Contains('\'')) | ||||
|                 { | ||||
|  | @ -142,66 +142,66 @@ namespace v2rayN.Handler | |||
|                 sql += String.Format(" and (a.remarks like '%{0}%' or a.address like '%{0}%') ", filter); | ||||
|             } | ||||
| 
 | ||||
|             return SqliteHelper.Instance.Query<ProfileItemModel>(sql).ToList(); | ||||
|             return SQLiteHelper.Instance.Query<ProfileItemModel>(sql).ToList(); | ||||
|         } | ||||
| 
 | ||||
|         public ProfileItem? GetProfileItem(string indexId) | ||||
|         { | ||||
|             if (Utils.IsNullOrEmpty(indexId)) | ||||
|             if (Utile.IsNullOrEmpty(indexId)) | ||||
|             { | ||||
|                 return null; | ||||
|             } | ||||
|             return SqliteHelper.Instance.Table<ProfileItem>().FirstOrDefault(it => it.indexId == indexId); | ||||
|             return SQLiteHelper.Instance.Table<ProfileItem>().FirstOrDefault(it => it.indexId == indexId); | ||||
|         } | ||||
| 
 | ||||
|         public ProfileItem? GetProfileItemViaRemarks(string remarks) | ||||
|         { | ||||
|             if (Utils.IsNullOrEmpty(remarks)) | ||||
|             if (Utile.IsNullOrEmpty(remarks)) | ||||
|             { | ||||
|                 return null; | ||||
|             } | ||||
|             return SqliteHelper.Instance.Table<ProfileItem>().FirstOrDefault(it => it.remarks == remarks); | ||||
|             return SQLiteHelper.Instance.Table<ProfileItem>().FirstOrDefault(it => it.remarks == remarks); | ||||
|         } | ||||
| 
 | ||||
|         public List<RoutingItem> RoutingItems() | ||||
|         { | ||||
|             return SqliteHelper.Instance.Table<RoutingItem>().Where(it => it.locked == false).OrderBy(t => t.sort).ToList(); | ||||
|             return SQLiteHelper.Instance.Table<RoutingItem>().Where(it => it.locked == false).OrderBy(t => t.sort).ToList(); | ||||
|         } | ||||
| 
 | ||||
|         public RoutingItem GetRoutingItem(string id) | ||||
|         { | ||||
|             return SqliteHelper.Instance.Table<RoutingItem>().FirstOrDefault(it => it.locked == false && it.id == id); | ||||
|             return SQLiteHelper.Instance.Table<RoutingItem>().FirstOrDefault(it => it.locked == false && it.id == id); | ||||
|         } | ||||
| 
 | ||||
|         public List<DNSItem> DNSItems() | ||||
|         { | ||||
|             return SqliteHelper.Instance.Table<DNSItem>().ToList(); | ||||
|             return SQLiteHelper.Instance.Table<DNSItem>().ToList(); | ||||
|         } | ||||
| 
 | ||||
|         public DNSItem GetDNSItem(ECoreType eCoreType) | ||||
|         { | ||||
|             return SqliteHelper.Instance.Table<DNSItem>().FirstOrDefault(it => it.coreType == eCoreType); | ||||
|             return SQLiteHelper.Instance.Table<DNSItem>().FirstOrDefault(it => it.coreType == eCoreType); | ||||
|         } | ||||
| 
 | ||||
|         #endregion SqliteHelper | ||||
| 
 | ||||
|         #region Core Type | ||||
| 
 | ||||
|         public List<string> GetShadowsocksSecuritys(ProfileItem profileItem) | ||||
|         public List<string> GetShadowsocksSecurities(ProfileItem profileItem) | ||||
|         { | ||||
|             var coreType = GetCoreType(profileItem, EConfigType.Shadowsocks); | ||||
|             switch (coreType) | ||||
|             { | ||||
|                 case ECoreType.v2fly: | ||||
|                     return Global.SsSecuritys; | ||||
|                     return Global.SsSecurities; | ||||
| 
 | ||||
|                 case ECoreType.Xray: | ||||
|                     return Global.SsSecuritysInXray; | ||||
|                     return Global.SsSecuritiesInXray; | ||||
| 
 | ||||
|                 case ECoreType.sing_box: | ||||
|                     return Global.SsSecuritysInSingbox; | ||||
|                     return Global.SsSecuritiesInSingbox; | ||||
|             } | ||||
|             return Global.SsSecuritysInSagerNet; | ||||
|             return Global.SsSecuritiesInSagerNet; | ||||
|         } | ||||
| 
 | ||||
|         public ECoreType GetCoreType(ProfileItem profileItem, EConfigType eConfigType) | ||||
|  | @ -225,27 +225,27 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|         public CoreInfo? GetCoreInfo(ECoreType coreType) | ||||
|         { | ||||
|             if (coreInfos == null) | ||||
|             if (coreInfo == null) | ||||
|             { | ||||
|                 InitCoreInfo(); | ||||
|             } | ||||
|             return coreInfos!.FirstOrDefault(t => t.coreType == coreType); | ||||
|             return coreInfo!.FirstOrDefault(t => t.coreType == coreType); | ||||
|         } | ||||
| 
 | ||||
|         public List<CoreInfo> GetCoreInfos() | ||||
|         public List<CoreInfo> GetCoreInfo() | ||||
|         { | ||||
|             if (coreInfos == null) | ||||
|             if (coreInfo == null) | ||||
|             { | ||||
|                 InitCoreInfo(); | ||||
|             } | ||||
|             return coreInfos!; | ||||
|             return coreInfo!; | ||||
|         } | ||||
| 
 | ||||
|         private void InitCoreInfo() | ||||
|         { | ||||
|             coreInfos = new(16); | ||||
|             coreInfo = new(16); | ||||
| 
 | ||||
|             coreInfos.Add(new CoreInfo | ||||
|             coreInfo.Add(new CoreInfo | ||||
|             { | ||||
|                 coreType = ECoreType.v2rayN, | ||||
|                 coreUrl = Global.NUrl, | ||||
|  | @ -255,7 +255,7 @@ namespace v2rayN.Handler | |||
|                 coreDownloadUrlArm64 = Global.NUrl + "/download/{0}/v2rayN-arm64.zip" | ||||
|             }); | ||||
| 
 | ||||
|             coreInfos.Add(new CoreInfo | ||||
|             coreInfo.Add(new CoreInfo | ||||
|             { | ||||
|                 coreType = ECoreType.v2fly, | ||||
|                 coreExes = new List<string> { "wv2ray", "v2ray" }, | ||||
|  | @ -270,7 +270,7 @@ namespace v2rayN.Handler | |||
|                 redirectInfo = true, | ||||
|             }); | ||||
| 
 | ||||
|             coreInfos.Add(new CoreInfo | ||||
|             coreInfo.Add(new CoreInfo | ||||
|             { | ||||
|                 coreType = ECoreType.SagerNet, | ||||
|                 coreExes = new List<string> { "SagerNet", "v2ray" }, | ||||
|  | @ -285,7 +285,7 @@ namespace v2rayN.Handler | |||
|                 redirectInfo = true, | ||||
|             }); | ||||
| 
 | ||||
|             coreInfos.Add(new CoreInfo | ||||
|             coreInfo.Add(new CoreInfo | ||||
|             { | ||||
|                 coreType = ECoreType.v2fly_v5, | ||||
|                 coreExes = new List<string> { "v2ray" }, | ||||
|  | @ -300,7 +300,7 @@ namespace v2rayN.Handler | |||
|                 redirectInfo = true, | ||||
|             }); | ||||
| 
 | ||||
|             coreInfos.Add(new CoreInfo | ||||
|             coreInfo.Add(new CoreInfo | ||||
|             { | ||||
|                 coreType = ECoreType.Xray, | ||||
|                 coreExes = new List<string> { "xray", "wxray" }, | ||||
|  | @ -315,7 +315,7 @@ namespace v2rayN.Handler | |||
|                 redirectInfo = true, | ||||
|             }); | ||||
| 
 | ||||
|             coreInfos.Add(new CoreInfo | ||||
|             coreInfo.Add(new CoreInfo | ||||
|             { | ||||
|                 coreType = ECoreType.clash, | ||||
|                 coreExes = new List<string> { "clash-windows-amd64-v3", "clash-windows-amd64", "clash-windows-386", "clash" }, | ||||
|  | @ -330,7 +330,7 @@ namespace v2rayN.Handler | |||
|                 redirectInfo = true, | ||||
|             }); | ||||
| 
 | ||||
|             coreInfos.Add(new CoreInfo | ||||
|             coreInfo.Add(new CoreInfo | ||||
|             { | ||||
|                 coreType = ECoreType.clash_meta, | ||||
|                 coreExes = new List<string> { "Clash.Meta-windows-amd64-compatible", "Clash.Meta-windows-amd64", "Clash.Meta-windows-386", "Clash.Meta", "clash" }, | ||||
|  | @ -345,7 +345,7 @@ namespace v2rayN.Handler | |||
|                 redirectInfo = true, | ||||
|             }); | ||||
| 
 | ||||
|             coreInfos.Add(new CoreInfo | ||||
|             coreInfo.Add(new CoreInfo | ||||
|             { | ||||
|                 coreType = ECoreType.mihomo, | ||||
|                 coreExes = new List<string> { $"mihomo-windows-amd64{(Avx2.X64.IsSupported ? "" : "-compatible")}", "mihomo-windows-amd64-compatible", "mihomo-windows-amd64", "mihomo-windows-386", "mihomo", "clash" }, | ||||
|  | @ -356,7 +356,7 @@ namespace v2rayN.Handler | |||
|                 redirectInfo = true, | ||||
|             }); | ||||
| 
 | ||||
|             coreInfos.Add(new CoreInfo | ||||
|             coreInfo.Add(new CoreInfo | ||||
|             { | ||||
|                 coreType = ECoreType.hysteria, | ||||
|                 coreExes = new List<string> { "hysteria-windows-amd64", "hysteria-windows-386", "hysteria" }, | ||||
|  | @ -369,7 +369,7 @@ namespace v2rayN.Handler | |||
|                 redirectInfo = true, | ||||
|             }); | ||||
| 
 | ||||
|             coreInfos.Add(new CoreInfo | ||||
|             coreInfo.Add(new CoreInfo | ||||
|             { | ||||
|                 coreType = ECoreType.naiveproxy, | ||||
|                 coreExes = new List<string> { "naiveproxy", "naive" }, | ||||
|  | @ -378,7 +378,7 @@ namespace v2rayN.Handler | |||
|                 redirectInfo = false, | ||||
|             }); | ||||
| 
 | ||||
|             coreInfos.Add(new CoreInfo | ||||
|             coreInfo.Add(new CoreInfo | ||||
|             { | ||||
|                 coreType = ECoreType.tuic, | ||||
|                 coreExes = new List<string> { "tuic-client", "tuic" }, | ||||
|  | @ -387,7 +387,7 @@ namespace v2rayN.Handler | |||
|                 redirectInfo = true, | ||||
|             }); | ||||
| 
 | ||||
|             coreInfos.Add(new CoreInfo | ||||
|             coreInfo.Add(new CoreInfo | ||||
|             { | ||||
|                 coreType = ECoreType.sing_box, | ||||
|                 coreExes = new List<string> { "sing-box-client", "sing-box" }, | ||||
|  | @ -402,7 +402,7 @@ namespace v2rayN.Handler | |||
|                 versionArg = "version", | ||||
|             }); | ||||
| 
 | ||||
|             coreInfos.Add(new CoreInfo | ||||
|             coreInfo.Add(new CoreInfo | ||||
|             { | ||||
|                 coreType = ECoreType.juicity, | ||||
|                 coreExes = new List<string> { "juicity-client", "juicity" }, | ||||
|  | @ -410,7 +410,7 @@ namespace v2rayN.Handler | |||
|                 coreUrl = Global.JuicityCoreUrl | ||||
|             }); | ||||
| 
 | ||||
|             coreInfos.Add(new CoreInfo | ||||
|             coreInfo.Add(new CoreInfo | ||||
|             { | ||||
|                 coreType = ECoreType.hysteria2, | ||||
|                 coreExes = new List<string> { "hysteria-windows-amd64", "hysteria-windows-386", "hysteria" }, | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
| using System.Drawing; | ||||
| using System.IO; | ||||
| using System.Windows.Media.Imaging; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| using v2rayN.Resx; | ||||
| 
 | ||||
| namespace v2rayN.Handler | ||||
|  | @ -26,7 +26,7 @@ namespace v2rayN.Handler | |||
|                 } | ||||
| 
 | ||||
|                 //Load from local file | ||||
|                 var fileName = Utils.GetPath($"NotifyIcon{index + 1}.ico"); | ||||
|                 var fileName = Utile.GetPath($"NotifyIcon{index + 1}.ico"); | ||||
|                 if (File.Exists(fileName)) | ||||
|                 { | ||||
|                     return new Icon(fileName); | ||||
|  | @ -78,7 +78,7 @@ namespace v2rayN.Handler | |||
|                 } | ||||
| 
 | ||||
|                 var item = ConfigHandler.GetDefaultRouting(config); | ||||
|                 if (item == null || Utils.IsNullOrEmpty(item.customIcon) || !File.Exists(item.customIcon)) | ||||
|                 if (item == null || Utile.IsNullOrEmpty(item.customIcon) || !File.Exists(item.customIcon)) | ||||
|                 { | ||||
|                     return null; | ||||
|                 } | ||||
|  | @ -140,7 +140,7 @@ namespace v2rayN.Handler | |||
|                 return; | ||||
|             } | ||||
|             string fileName = fileDialog.FileName; | ||||
|             if (Utils.IsNullOrEmpty(fileName)) | ||||
|             if (Utile.IsNullOrEmpty(fileName)) | ||||
|             { | ||||
|                 return; | ||||
|             } | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| using System.Collections.Concurrent; | ||||
| using System.Reactive.Linq; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| 
 | ||||
| namespace v2rayN.Handler | ||||
| { | ||||
|  | @ -19,9 +19,9 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|         private void Init() | ||||
|         { | ||||
|             SqliteHelper.Instance.Execute($"delete from ProfileExItem where indexId not in ( select indexId from ProfileItem )"); | ||||
|             SQLiteHelper.Instance.Execute($"delete from ProfileExItem where indexId not in ( select indexId from ProfileItem )"); | ||||
| 
 | ||||
|             _lstProfileEx = new(SqliteHelper.Instance.Table<ProfileExItem>()); | ||||
|             _lstProfileEx = new(SQLiteHelper.Instance.Table<ProfileExItem>()); | ||||
| 
 | ||||
|             Task.Run(async () => | ||||
|             { | ||||
|  | @ -34,7 +34,7 @@ namespace v2rayN.Handler | |||
|                         var item = _lstProfileEx.FirstOrDefault(t => t.indexId == id); | ||||
|                         if (item is not null) | ||||
|                         { | ||||
|                             SqliteHelper.Instance.Replace(item); | ||||
|                             SQLiteHelper.Instance.Replace(item); | ||||
|                         } | ||||
|                     } | ||||
|                     await Task.Delay(1000 * 60); | ||||
|  | @ -44,7 +44,7 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|         private void IndexIdEnqueue(string indexId) | ||||
|         { | ||||
|             if (!Utils.IsNullOrEmpty(indexId) && !_queIndexIds.Contains(indexId)) | ||||
|             if (!Utile.IsNullOrEmpty(indexId) && !_queIndexIds.Contains(indexId)) | ||||
|             { | ||||
|                 _queIndexIds.Enqueue(indexId); | ||||
|             } | ||||
|  | @ -65,7 +65,7 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|         public void ClearAll() | ||||
|         { | ||||
|             SqliteHelper.Instance.Execute($"delete from ProfileExItem "); | ||||
|             SQLiteHelper.Instance.Execute($"delete from ProfileExItem "); | ||||
|             _lstProfileEx = new(); | ||||
|         } | ||||
| 
 | ||||
|  | @ -75,9 +75,9 @@ namespace v2rayN.Handler | |||
|             { | ||||
|                 //foreach (var item in _lstProfileEx) | ||||
|                 //{ | ||||
|                 //    SqliteHelper.Instance.Replace(item); | ||||
|                 //    SQLiteHelper.Instance.Replace(item); | ||||
|                 //} | ||||
|                 SqliteHelper.Instance.UpdateAll(_lstProfileEx); | ||||
|                 SQLiteHelper.Instance.UpdateAll(_lstProfileEx); | ||||
|             } | ||||
|             catch (Exception ex) | ||||
|             { | ||||
|  |  | |||
|  | @ -26,7 +26,7 @@ namespace v2rayN.Handler | |||
|         ///     PROXY_TYPE_AUTO_DETECT      = 0x00000008  // use autoproxy detection | ||||
|         /// </param> | ||||
|         /// <exception cref="ApplicationException">Error message with win32 error code</exception> | ||||
|         /// <returns>true: one of connnection is successfully updated proxy settings</returns> | ||||
|         /// <returns>true: one of connection is successfully updated proxy settings</returns> | ||||
|         public static bool SetProxy(string? strProxy, string? exceptions, int type) | ||||
|         { | ||||
|             // set proxy for LAN | ||||
|  | @ -51,7 +51,7 @@ namespace v2rayN.Handler | |||
|             } | ||||
|             else if (type is 2 or 4) // named proxy or autoproxy script URL | ||||
|             { | ||||
|                 optionCount = Utils.IsNullOrEmpty(exceptions) ? 2 : 3; | ||||
|                 optionCount = Utile.IsNullOrEmpty(exceptions) ? 2 : 3; | ||||
|             } | ||||
| 
 | ||||
|             int m_Int = (int)PerConnFlags.PROXY_TYPE_DIRECT; | ||||
|  | @ -67,7 +67,7 @@ namespace v2rayN.Handler | |||
|                 m_Option = PerConnOption.INTERNET_PER_CONN_AUTOCONFIG_URL; | ||||
|             } | ||||
| 
 | ||||
|             //int optionCount = Utils.IsNullOrEmpty(strProxy) ? 1 : (Utils.IsNullOrEmpty(exceptions) ? 2 : 3); | ||||
|             //int optionCount = Utile.IsNullOrEmpty(strProxy) ? 1 : (Utile.IsNullOrEmpty(exceptions) ? 2 : 3); | ||||
|             InternetConnectionOption[] options = new InternetConnectionOption[optionCount]; | ||||
|             // USE a proxy server ... | ||||
|             options[0].m_Option = PerConnOption.INTERNET_PER_CONN_FLAGS; | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| using System.Collections.Specialized; | ||||
| using System.Text.RegularExpressions; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| using v2rayN.Resx; | ||||
| 
 | ||||
| namespace v2rayN.Handler | ||||
|  | @ -65,8 +65,8 @@ namespace v2rayN.Handler | |||
|                 fp = item.fingerprint | ||||
|             }; | ||||
| 
 | ||||
|             url = JsonUtils.Serialize(vmessQRCode); | ||||
|             url = Utils.Base64Encode(url); | ||||
|             url = JsonUtile.Serialize(vmessQRCode); | ||||
|             url = Utile.Base64Encode(url); | ||||
|             url = $"{Global.ProtocolShares[EConfigType.VMess]}{url}"; | ||||
| 
 | ||||
|             return url; | ||||
|  | @ -77,18 +77,18 @@ namespace v2rayN.Handler | |||
|             string url = string.Empty; | ||||
| 
 | ||||
|             string remark = string.Empty; | ||||
|             if (!Utils.IsNullOrEmpty(item.remarks)) | ||||
|             if (!Utile.IsNullOrEmpty(item.remarks)) | ||||
|             { | ||||
|                 remark = "#" + Utils.UrlEncode(item.remarks); | ||||
|                 remark = "#" + Utile.UrlEncode(item.remarks); | ||||
|             } | ||||
|             //url = string.Format("{0}:{1}@{2}:{3}", | ||||
|             //    item.security, | ||||
|             //    item.id, | ||||
|             //    item.address, | ||||
|             //    item.port); | ||||
|             //url = Utils.Base64Encode(url); | ||||
|             //url = Utile.Base64Encode(url); | ||||
|             //new Sip002 | ||||
|             var pw = Utils.Base64Encode($"{item.security}:{item.id}"); | ||||
|             var pw = Utile.Base64Encode($"{item.security}:{item.id}"); | ||||
|             url = $"{pw}@{GetIpv6(item.address)}:{item.port}"; | ||||
|             url = $"{Global.ProtocolShares[EConfigType.Shadowsocks]}{url}{remark}"; | ||||
|             return url; | ||||
|  | @ -98,18 +98,18 @@ namespace v2rayN.Handler | |||
|         { | ||||
|             string url = string.Empty; | ||||
|             string remark = string.Empty; | ||||
|             if (!Utils.IsNullOrEmpty(item.remarks)) | ||||
|             if (!Utile.IsNullOrEmpty(item.remarks)) | ||||
|             { | ||||
|                 remark = "#" + Utils.UrlEncode(item.remarks); | ||||
|                 remark = "#" + Utile.UrlEncode(item.remarks); | ||||
|             } | ||||
|             //url = string.Format("{0}:{1}@{2}:{3}", | ||||
|             //    item.security, | ||||
|             //    item.id, | ||||
|             //    item.address, | ||||
|             //    item.port); | ||||
|             //url = Utils.Base64Encode(url); | ||||
|             //url = Utile.Base64Encode(url); | ||||
|             //new | ||||
|             var pw = Utils.Base64Encode($"{item.security}:{item.id}"); | ||||
|             var pw = Utile.Base64Encode($"{item.security}:{item.id}"); | ||||
|             url = $"{pw}@{GetIpv6(item.address)}:{item.port}"; | ||||
|             url = $"{Global.ProtocolShares[EConfigType.Socks]}{url}{remark}"; | ||||
|             return url; | ||||
|  | @ -119,9 +119,9 @@ namespace v2rayN.Handler | |||
|         { | ||||
|             string url = string.Empty; | ||||
|             string remark = string.Empty; | ||||
|             if (!Utils.IsNullOrEmpty(item.remarks)) | ||||
|             if (!Utile.IsNullOrEmpty(item.remarks)) | ||||
|             { | ||||
|                 remark = "#" + Utils.UrlEncode(item.remarks); | ||||
|                 remark = "#" + Utile.UrlEncode(item.remarks); | ||||
|             } | ||||
|             var dicQuery = new Dictionary<string, string>(); | ||||
|             GetStdTransport(item, null, ref dicQuery); | ||||
|  | @ -139,12 +139,12 @@ namespace v2rayN.Handler | |||
|         { | ||||
|             string url = string.Empty; | ||||
|             string remark = string.Empty; | ||||
|             if (!Utils.IsNullOrEmpty(item.remarks)) | ||||
|             if (!Utile.IsNullOrEmpty(item.remarks)) | ||||
|             { | ||||
|                 remark = "#" + Utils.UrlEncode(item.remarks); | ||||
|                 remark = "#" + Utile.UrlEncode(item.remarks); | ||||
|             } | ||||
|             var dicQuery = new Dictionary<string, string>(); | ||||
|             if (!Utils.IsNullOrEmpty(item.security)) | ||||
|             if (!Utile.IsNullOrEmpty(item.security)) | ||||
|             { | ||||
|                 dicQuery.Add("encryption", item.security); | ||||
|             } | ||||
|  | @ -167,23 +167,23 @@ namespace v2rayN.Handler | |||
|         { | ||||
|             string url = string.Empty; | ||||
|             string remark = string.Empty; | ||||
|             if (!Utils.IsNullOrEmpty(item.remarks)) | ||||
|             if (!Utile.IsNullOrEmpty(item.remarks)) | ||||
|             { | ||||
|                 remark = "#" + Utils.UrlEncode(item.remarks); | ||||
|                 remark = "#" + Utile.UrlEncode(item.remarks); | ||||
|             } | ||||
|             var dicQuery = new Dictionary<string, string>(); | ||||
|             if (!Utils.IsNullOrEmpty(item.sni)) | ||||
|             if (!Utile.IsNullOrEmpty(item.sni)) | ||||
|             { | ||||
|                 dicQuery.Add("sni", item.sni); | ||||
|             } | ||||
|             if (!Utils.IsNullOrEmpty(item.alpn)) | ||||
|             if (!Utile.IsNullOrEmpty(item.alpn)) | ||||
|             { | ||||
|                 dicQuery.Add("alpn", Utils.UrlEncode(item.alpn)); | ||||
|                 dicQuery.Add("alpn", Utile.UrlEncode(item.alpn)); | ||||
|             } | ||||
|             if (!Utils.IsNullOrEmpty(item.path)) | ||||
|             if (!Utile.IsNullOrEmpty(item.path)) | ||||
|             { | ||||
|                 dicQuery.Add("obfs", "salamander"); | ||||
|                 dicQuery.Add("obfs-password", Utils.UrlEncode(item.path)); | ||||
|                 dicQuery.Add("obfs-password", Utile.UrlEncode(item.path)); | ||||
|             } | ||||
|             dicQuery.Add("insecure", item.allowInsecure.ToLower() == "true" ? "1" : "0"); | ||||
| 
 | ||||
|  | @ -201,18 +201,18 @@ namespace v2rayN.Handler | |||
|         { | ||||
|             string url = string.Empty; | ||||
|             string remark = string.Empty; | ||||
|             if (!Utils.IsNullOrEmpty(item.remarks)) | ||||
|             if (!Utile.IsNullOrEmpty(item.remarks)) | ||||
|             { | ||||
|                 remark = "#" + Utils.UrlEncode(item.remarks); | ||||
|                 remark = "#" + Utile.UrlEncode(item.remarks); | ||||
|             } | ||||
|             var dicQuery = new Dictionary<string, string>(); | ||||
|             if (!Utils.IsNullOrEmpty(item.sni)) | ||||
|             if (!Utile.IsNullOrEmpty(item.sni)) | ||||
|             { | ||||
|                 dicQuery.Add("sni", item.sni); | ||||
|             } | ||||
|             if (!Utils.IsNullOrEmpty(item.alpn)) | ||||
|             if (!Utile.IsNullOrEmpty(item.alpn)) | ||||
|             { | ||||
|                 dicQuery.Add("alpn", Utils.UrlEncode(item.alpn)); | ||||
|                 dicQuery.Add("alpn", Utile.UrlEncode(item.alpn)); | ||||
|             } | ||||
|             dicQuery.Add("congestion_control", item.headerType); | ||||
| 
 | ||||
|  | @ -230,32 +230,32 @@ namespace v2rayN.Handler | |||
|         { | ||||
|             string url = string.Empty; | ||||
|             string remark = string.Empty; | ||||
|             if (!Utils.IsNullOrEmpty(item.remarks)) | ||||
|             if (!Utile.IsNullOrEmpty(item.remarks)) | ||||
|             { | ||||
|                 remark = "#" + Utils.UrlEncode(item.remarks); | ||||
|                 remark = "#" + Utile.UrlEncode(item.remarks); | ||||
|             } | ||||
| 
 | ||||
|             var dicQuery = new Dictionary<string, string>(); | ||||
|             if (!Utils.IsNullOrEmpty(item.publicKey)) | ||||
|             if (!Utile.IsNullOrEmpty(item.publicKey)) | ||||
|             { | ||||
|                 dicQuery.Add("publickey", Utils.UrlEncode(item.publicKey)); | ||||
|                 dicQuery.Add("publickey", Utile.UrlEncode(item.publicKey)); | ||||
|             } | ||||
|             if (!Utils.IsNullOrEmpty(item.path)) | ||||
|             if (!Utile.IsNullOrEmpty(item.path)) | ||||
|             { | ||||
|                 dicQuery.Add("reserved", Utils.UrlEncode(item.path)); | ||||
|                 dicQuery.Add("reserved", Utile.UrlEncode(item.path)); | ||||
|             } | ||||
|             if (!Utils.IsNullOrEmpty(item.requestHost)) | ||||
|             if (!Utile.IsNullOrEmpty(item.requestHost)) | ||||
|             { | ||||
|                 dicQuery.Add("address", Utils.UrlEncode(item.requestHost)); | ||||
|                 dicQuery.Add("address", Utile.UrlEncode(item.requestHost)); | ||||
|             } | ||||
|             if (!Utils.IsNullOrEmpty(item.shortId)) | ||||
|             if (!Utile.IsNullOrEmpty(item.shortId)) | ||||
|             { | ||||
|                 dicQuery.Add("mtu", Utils.UrlEncode(item.shortId)); | ||||
|                 dicQuery.Add("mtu", Utile.UrlEncode(item.shortId)); | ||||
|             } | ||||
|             string query = "?" + string.Join("&", dicQuery.Select(x => x.Key + "=" + x.Value).ToArray()); | ||||
| 
 | ||||
|             url = string.Format("{0}@{1}:{2}", | ||||
|             Utils.UrlEncode(item.id), | ||||
|             Utile.UrlEncode(item.id), | ||||
|             GetIpv6(item.address), | ||||
|             item.port); | ||||
|             url = $"{Global.ProtocolShares[EConfigType.Wireguard]}{url}/{query}{remark}"; | ||||
|  | @ -264,17 +264,17 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|         private static string GetIpv6(string address) | ||||
|         { | ||||
|             return Utils.IsIpv6(address) ? $"[{address}]" : address; | ||||
|             return Utile.IsIpv6(address) ? $"[{address}]" : address; | ||||
|         } | ||||
| 
 | ||||
|         private static int GetStdTransport(ProfileItem item, string? securityDef, ref Dictionary<string, string> dicQuery) | ||||
|         { | ||||
|             if (!Utils.IsNullOrEmpty(item.flow)) | ||||
|             if (!Utile.IsNullOrEmpty(item.flow)) | ||||
|             { | ||||
|                 dicQuery.Add("flow", item.flow); | ||||
|             } | ||||
| 
 | ||||
|             if (!Utils.IsNullOrEmpty(item.streamSecurity)) | ||||
|             if (!Utile.IsNullOrEmpty(item.streamSecurity)) | ||||
|             { | ||||
|                 dicQuery.Add("security", item.streamSecurity); | ||||
|             } | ||||
|  | @ -285,88 +285,88 @@ namespace v2rayN.Handler | |||
|                     dicQuery.Add("security", securityDef); | ||||
|                 } | ||||
|             } | ||||
|             if (!Utils.IsNullOrEmpty(item.sni)) | ||||
|             if (!Utile.IsNullOrEmpty(item.sni)) | ||||
|             { | ||||
|                 dicQuery.Add("sni", item.sni); | ||||
|             } | ||||
|             if (!Utils.IsNullOrEmpty(item.alpn)) | ||||
|             if (!Utile.IsNullOrEmpty(item.alpn)) | ||||
|             { | ||||
|                 dicQuery.Add("alpn", Utils.UrlEncode(item.alpn)); | ||||
|                 dicQuery.Add("alpn", Utile.UrlEncode(item.alpn)); | ||||
|             } | ||||
|             if (!Utils.IsNullOrEmpty(item.fingerprint)) | ||||
|             if (!Utile.IsNullOrEmpty(item.fingerprint)) | ||||
|             { | ||||
|                 dicQuery.Add("fp", Utils.UrlEncode(item.fingerprint)); | ||||
|                 dicQuery.Add("fp", Utile.UrlEncode(item.fingerprint)); | ||||
|             } | ||||
|             if (!Utils.IsNullOrEmpty(item.publicKey)) | ||||
|             if (!Utile.IsNullOrEmpty(item.publicKey)) | ||||
|             { | ||||
|                 dicQuery.Add("pbk", Utils.UrlEncode(item.publicKey)); | ||||
|                 dicQuery.Add("pbk", Utile.UrlEncode(item.publicKey)); | ||||
|             } | ||||
|             if (!Utils.IsNullOrEmpty(item.shortId)) | ||||
|             if (!Utile.IsNullOrEmpty(item.shortId)) | ||||
|             { | ||||
|                 dicQuery.Add("sid", Utils.UrlEncode(item.shortId)); | ||||
|                 dicQuery.Add("sid", Utile.UrlEncode(item.shortId)); | ||||
|             } | ||||
|             if (!Utils.IsNullOrEmpty(item.spiderX)) | ||||
|             if (!Utile.IsNullOrEmpty(item.spiderX)) | ||||
|             { | ||||
|                 dicQuery.Add("spx", Utils.UrlEncode(item.spiderX)); | ||||
|                 dicQuery.Add("spx", Utile.UrlEncode(item.spiderX)); | ||||
|             } | ||||
| 
 | ||||
|             dicQuery.Add("type", !Utils.IsNullOrEmpty(item.network) ? item.network : "tcp"); | ||||
|             dicQuery.Add("type", !Utile.IsNullOrEmpty(item.network) ? item.network : "tcp"); | ||||
| 
 | ||||
|             switch (item.network) | ||||
|             { | ||||
|                 case "tcp": | ||||
|                     dicQuery.Add("headerType", !Utils.IsNullOrEmpty(item.headerType) ? item.headerType : "none"); | ||||
|                     if (!Utils.IsNullOrEmpty(item.requestHost)) | ||||
|                     dicQuery.Add("headerType", !Utile.IsNullOrEmpty(item.headerType) ? item.headerType : "none"); | ||||
|                     if (!Utile.IsNullOrEmpty(item.requestHost)) | ||||
|                     { | ||||
|                         dicQuery.Add("host", Utils.UrlEncode(item.requestHost)); | ||||
|                         dicQuery.Add("host", Utile.UrlEncode(item.requestHost)); | ||||
|                     } | ||||
|                     break; | ||||
| 
 | ||||
|                 case "kcp": | ||||
|                     dicQuery.Add("headerType", !Utils.IsNullOrEmpty(item.headerType) ? item.headerType : "none"); | ||||
|                     if (!Utils.IsNullOrEmpty(item.path)) | ||||
|                     dicQuery.Add("headerType", !Utile.IsNullOrEmpty(item.headerType) ? item.headerType : "none"); | ||||
|                     if (!Utile.IsNullOrEmpty(item.path)) | ||||
|                     { | ||||
|                         dicQuery.Add("seed", Utils.UrlEncode(item.path)); | ||||
|                         dicQuery.Add("seed", Utile.UrlEncode(item.path)); | ||||
|                     } | ||||
|                     break; | ||||
| 
 | ||||
|                 case "ws": | ||||
|                     if (!Utils.IsNullOrEmpty(item.requestHost)) | ||||
|                     if (!Utile.IsNullOrEmpty(item.requestHost)) | ||||
|                     { | ||||
|                         dicQuery.Add("host", Utils.UrlEncode(item.requestHost)); | ||||
|                         dicQuery.Add("host", Utile.UrlEncode(item.requestHost)); | ||||
|                     } | ||||
|                     if (!Utils.IsNullOrEmpty(item.path)) | ||||
|                     if (!Utile.IsNullOrEmpty(item.path)) | ||||
|                     { | ||||
|                         dicQuery.Add("path", Utils.UrlEncode(item.path)); | ||||
|                         dicQuery.Add("path", Utile.UrlEncode(item.path)); | ||||
|                     } | ||||
|                     break; | ||||
| 
 | ||||
|                 case "http": | ||||
|                 case "h2": | ||||
|                     dicQuery["type"] = "http"; | ||||
|                     if (!Utils.IsNullOrEmpty(item.requestHost)) | ||||
|                     if (!Utile.IsNullOrEmpty(item.requestHost)) | ||||
|                     { | ||||
|                         dicQuery.Add("host", Utils.UrlEncode(item.requestHost)); | ||||
|                         dicQuery.Add("host", Utile.UrlEncode(item.requestHost)); | ||||
|                     } | ||||
|                     if (!Utils.IsNullOrEmpty(item.path)) | ||||
|                     if (!Utile.IsNullOrEmpty(item.path)) | ||||
|                     { | ||||
|                         dicQuery.Add("path", Utils.UrlEncode(item.path)); | ||||
|                         dicQuery.Add("path", Utile.UrlEncode(item.path)); | ||||
|                     } | ||||
|                     break; | ||||
| 
 | ||||
|                 case "quic": | ||||
|                     dicQuery.Add("headerType", !Utils.IsNullOrEmpty(item.headerType) ? item.headerType : "none"); | ||||
|                     dicQuery.Add("quicSecurity", Utils.UrlEncode(item.requestHost)); | ||||
|                     dicQuery.Add("key", Utils.UrlEncode(item.path)); | ||||
|                     dicQuery.Add("headerType", !Utile.IsNullOrEmpty(item.headerType) ? item.headerType : "none"); | ||||
|                     dicQuery.Add("quicSecurity", Utile.UrlEncode(item.requestHost)); | ||||
|                     dicQuery.Add("key", Utile.UrlEncode(item.path)); | ||||
|                     break; | ||||
| 
 | ||||
|                 case "grpc": | ||||
|                     if (!Utils.IsNullOrEmpty(item.path)) | ||||
|                     if (!Utile.IsNullOrEmpty(item.path)) | ||||
|                     { | ||||
|                         dicQuery.Add("serviceName", Utils.UrlEncode(item.path)); | ||||
|                         if (item.headerType is Global.GrpcgunMode or Global.GrpcmultiMode) | ||||
|                         dicQuery.Add("serviceName", Utile.UrlEncode(item.path)); | ||||
|                         if (item.headerType is Global.GrpcGunMode or Global.GrpcMultiMode) | ||||
|                         { | ||||
|                             dicQuery.Add("mode", Utils.UrlEncode(item.headerType)); | ||||
|                             dicQuery.Add("mode", Utile.UrlEncode(item.headerType)); | ||||
|                         } | ||||
|                     } | ||||
|                     break; | ||||
|  | @ -391,7 +391,7 @@ namespace v2rayN.Handler | |||
|             try | ||||
|             { | ||||
|                 string result = clipboardData.TrimEx(); | ||||
|                 if (Utils.IsNullOrEmpty(result)) | ||||
|                 if (Utile.IsNullOrEmpty(result)) | ||||
|                 { | ||||
|                     msg = ResUI.FailedReadConfiguration; | ||||
|                     return null; | ||||
|  | @ -482,10 +482,10 @@ namespace v2rayN.Handler | |||
|             }; | ||||
| 
 | ||||
|             result = result[Global.ProtocolShares[EConfigType.VMess].Length..]; | ||||
|             result = Utils.Base64Decode(result); | ||||
|             result = Utile.Base64Decode(result); | ||||
| 
 | ||||
|             //转成Json | ||||
|             VmessQRCode? vmessQRCode = JsonUtils.Deserialize<VmessQRCode>(result); | ||||
|             VmessQRCode? vmessQRCode = JsonUtile.Deserialize<VmessQRCode>(result); | ||||
|             if (vmessQRCode == null) | ||||
|             { | ||||
|                 msg = ResUI.FailedConversionConfiguration; | ||||
|  | @ -495,30 +495,30 @@ namespace v2rayN.Handler | |||
|             profileItem.network = Global.DefaultNetwork; | ||||
|             profileItem.headerType = Global.None; | ||||
| 
 | ||||
|             profileItem.configVersion = Utils.ToInt(vmessQRCode.v); | ||||
|             profileItem.remarks = Utils.ToString(vmessQRCode.ps); | ||||
|             profileItem.address = Utils.ToString(vmessQRCode.add); | ||||
|             profileItem.port = Utils.ToInt(vmessQRCode.port); | ||||
|             profileItem.id = Utils.ToString(vmessQRCode.id); | ||||
|             profileItem.alterId = Utils.ToInt(vmessQRCode.aid); | ||||
|             profileItem.security = Utils.ToString(vmessQRCode.scy); | ||||
|             profileItem.configVersion = Utile.ToInt(vmessQRCode.v); | ||||
|             profileItem.remarks = Utile.ToString(vmessQRCode.ps); | ||||
|             profileItem.address = Utile.ToString(vmessQRCode.add); | ||||
|             profileItem.port = Utile.ToInt(vmessQRCode.port); | ||||
|             profileItem.id = Utile.ToString(vmessQRCode.id); | ||||
|             profileItem.alterId = Utile.ToInt(vmessQRCode.aid); | ||||
|             profileItem.security = Utile.ToString(vmessQRCode.scy); | ||||
| 
 | ||||
|             profileItem.security = !Utils.IsNullOrEmpty(vmessQRCode.scy) ? vmessQRCode.scy : Global.DefaultSecurity; | ||||
|             if (!Utils.IsNullOrEmpty(vmessQRCode.net)) | ||||
|             profileItem.security = !Utile.IsNullOrEmpty(vmessQRCode.scy) ? vmessQRCode.scy : Global.DefaultSecurity; | ||||
|             if (!Utile.IsNullOrEmpty(vmessQRCode.net)) | ||||
|             { | ||||
|                 profileItem.network = vmessQRCode.net; | ||||
|             } | ||||
|             if (!Utils.IsNullOrEmpty(vmessQRCode.type)) | ||||
|             if (!Utile.IsNullOrEmpty(vmessQRCode.type)) | ||||
|             { | ||||
|                 profileItem.headerType = vmessQRCode.type; | ||||
|             } | ||||
| 
 | ||||
|             profileItem.requestHost = Utils.ToString(vmessQRCode.host); | ||||
|             profileItem.path = Utils.ToString(vmessQRCode.path); | ||||
|             profileItem.streamSecurity = Utils.ToString(vmessQRCode.tls); | ||||
|             profileItem.sni = Utils.ToString(vmessQRCode.sni); | ||||
|             profileItem.alpn = Utils.ToString(vmessQRCode.alpn); | ||||
|             profileItem.fingerprint = Utils.ToString(vmessQRCode.fp); | ||||
|             profileItem.requestHost = Utile.ToString(vmessQRCode.host); | ||||
|             profileItem.path = Utile.ToString(vmessQRCode.path); | ||||
|             profileItem.streamSecurity = Utile.ToString(vmessQRCode.tls); | ||||
|             profileItem.sni = Utile.ToString(vmessQRCode.sni); | ||||
|             profileItem.alpn = Utile.ToString(vmessQRCode.alpn); | ||||
|             profileItem.fingerprint = Utile.ToString(vmessQRCode.fp); | ||||
| 
 | ||||
|             return profileItem; | ||||
|         } | ||||
|  | @ -535,7 +535,7 @@ namespace v2rayN.Handler | |||
|             { | ||||
|                 result = result[..indexSplit]; | ||||
|             } | ||||
|             result = Utils.Base64Decode(result); | ||||
|             result = Utile.Base64Decode(result); | ||||
| 
 | ||||
|             string[] arr1 = result.Split('@'); | ||||
|             if (arr1.Length != 2) | ||||
|  | @ -550,7 +550,7 @@ namespace v2rayN.Handler | |||
|             } | ||||
| 
 | ||||
|             profileItem.address = arr22[0]; | ||||
|             profileItem.port = Utils.ToInt(arr22[1]); | ||||
|             profileItem.port = Utile.ToInt(arr22[1]); | ||||
|             profileItem.security = arr21[0]; | ||||
|             profileItem.id = arr21[1]; | ||||
| 
 | ||||
|  | @ -574,7 +574,7 @@ namespace v2rayN.Handler | |||
|             i.address = u.IdnHost; | ||||
|             i.port = u.Port; | ||||
|             i.remarks = u.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); | ||||
|             var query = Utils.ParseQueryString(u.Query); | ||||
|             var query = Utile.ParseQueryString(u.Query); | ||||
| 
 | ||||
|             var m = StdVmessUserInfo.Match(u.UserInfo); | ||||
|             if (!m.Success) return null; | ||||
|  | @ -611,7 +611,7 @@ namespace v2rayN.Handler | |||
|                 case "ws": | ||||
|                     string p1 = query["path"] ?? "/"; | ||||
|                     string h1 = query["host"] ?? ""; | ||||
|                     i.requestHost = Utils.UrlDecode(h1); | ||||
|                     i.requestHost = Utile.UrlDecode(h1); | ||||
|                     i.path = p1; | ||||
|                     break; | ||||
| 
 | ||||
|  | @ -620,7 +620,7 @@ namespace v2rayN.Handler | |||
|                     i.network = "h2"; | ||||
|                     string p2 = query["path"] ?? "/"; | ||||
|                     string h2 = query["host"] ?? ""; | ||||
|                     i.requestHost = Utils.UrlDecode(h2); | ||||
|                     i.requestHost = Utile.UrlDecode(h2); | ||||
|                     i.path = p2; | ||||
|                     break; | ||||
| 
 | ||||
|  | @ -629,7 +629,7 @@ namespace v2rayN.Handler | |||
|                     string k = query["key"] ?? ""; | ||||
|                     string t3 = query["type"] ?? "none"; | ||||
|                     i.headerType = t3; | ||||
|                     i.requestHost = Utils.UrlDecode(s); | ||||
|                     i.requestHost = Utile.UrlDecode(s); | ||||
|                     i.path = k; | ||||
|                     break; | ||||
| 
 | ||||
|  | @ -667,12 +667,12 @@ namespace v2rayN.Handler | |||
|                     return null; | ||||
|                 } | ||||
|                 server.security = userInfoParts[0]; | ||||
|                 server.id = Utils.UrlDecode(userInfoParts[1]); | ||||
|                 server.id = Utile.UrlDecode(userInfoParts[1]); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 // parse base64 UserInfo | ||||
|                 string userInfo = Utils.Base64Decode(rawUserInfo); | ||||
|                 string userInfo = Utile.Base64Decode(rawUserInfo); | ||||
|                 string[] userInfoParts = userInfo.Split(new[] { ':' }, 2); | ||||
|                 if (userInfoParts.Length != 2) | ||||
|                 { | ||||
|  | @ -682,12 +682,12 @@ namespace v2rayN.Handler | |||
|                 server.id = userInfoParts[1]; | ||||
|             } | ||||
| 
 | ||||
|             var queryParameters = Utils.ParseQueryString(parsedUrl.Query); | ||||
|             var queryParameters = Utile.ParseQueryString(parsedUrl.Query); | ||||
|             if (queryParameters["plugin"] != null) | ||||
|             { | ||||
|                 //obfs-host exists | ||||
|                 var obfsHost = queryParameters["plugin"].Split(';').FirstOrDefault(t => t.Contains("obfs-host")); | ||||
|                 if (queryParameters["plugin"].Contains("obfs=http") && !Utils.IsNullOrEmpty(obfsHost)) | ||||
|                 if (queryParameters["plugin"].Contains("obfs=http") && !Utile.IsNullOrEmpty(obfsHost)) | ||||
|                 { | ||||
|                     obfsHost = obfsHost.Replace("obfs-host=", ""); | ||||
|                     server.network = Global.DefaultNetwork; | ||||
|  | @ -715,14 +715,14 @@ namespace v2rayN.Handler | |||
|             ProfileItem server = new(); | ||||
|             var base64 = match.Groups["base64"].Value.TrimEnd('/'); | ||||
|             var tag = match.Groups["tag"].Value; | ||||
|             if (!Utils.IsNullOrEmpty(tag)) | ||||
|             if (!Utile.IsNullOrEmpty(tag)) | ||||
|             { | ||||
|                 server.remarks = Utils.UrlDecode(tag); | ||||
|                 server.remarks = Utile.UrlDecode(tag); | ||||
|             } | ||||
|             Match details; | ||||
|             try | ||||
|             { | ||||
|                 details = DetailsParser.Match(Utils.Base64Decode(base64)); | ||||
|                 details = DetailsParser.Match(Utile.Base64Decode(base64)); | ||||
|             } | ||||
|             catch (FormatException) | ||||
|             { | ||||
|  | @ -733,7 +733,7 @@ namespace v2rayN.Handler | |||
|             server.security = details.Groups["method"].Value; | ||||
|             server.id = details.Groups["password"].Value; | ||||
|             server.address = details.Groups["hostname"].Value; | ||||
|             server.port = Utils.ToInt(details.Groups["port"].Value); | ||||
|             server.port = Utile.ToInt(details.Groups["port"].Value); | ||||
|             return server; | ||||
|         } | ||||
| 
 | ||||
|  | @ -753,7 +753,7 @@ namespace v2rayN.Handler | |||
|             { | ||||
|                 try | ||||
|                 { | ||||
|                     profileItem.remarks = Utils.UrlDecode(result.Substring(indexRemark + 1, result.Length - indexRemark - 1)); | ||||
|                     profileItem.remarks = Utile.UrlDecode(result.Substring(indexRemark + 1, result.Length - indexRemark - 1)); | ||||
|                 } | ||||
|                 catch { } | ||||
|                 result = result[..indexRemark]; | ||||
|  | @ -765,7 +765,7 @@ namespace v2rayN.Handler | |||
|             } | ||||
|             else | ||||
|             { | ||||
|                 result = Utils.Base64Decode(result); | ||||
|                 result = Utile.Base64Decode(result); | ||||
|             } | ||||
| 
 | ||||
|             string[] arr1 = result.Split('@'); | ||||
|  | @ -781,7 +781,7 @@ namespace v2rayN.Handler | |||
|                 return null; | ||||
|             } | ||||
|             profileItem.address = arr1[1][..indexPort]; | ||||
|             profileItem.port = Utils.ToInt(arr1[1][(indexPort + 1)..]); | ||||
|             profileItem.port = Utile.ToInt(arr1[1][(indexPort + 1)..]); | ||||
|             profileItem.security = arr21[0]; | ||||
|             profileItem.id = arr21[1]; | ||||
| 
 | ||||
|  | @ -808,7 +808,7 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|             // parse base64 UserInfo | ||||
|             string rawUserInfo = parsedUrl.GetComponents(UriComponents.UserInfo, UriFormat.Unescaped); | ||||
|             string userInfo = Utils.Base64Decode(rawUserInfo); | ||||
|             string userInfo = Utile.Base64Decode(rawUserInfo); | ||||
|             string[] userInfoParts = userInfo.Split(new[] { ':' }, 2); | ||||
|             if (userInfoParts.Length == 2) | ||||
|             { | ||||
|  | @ -831,9 +831,9 @@ namespace v2rayN.Handler | |||
|             item.address = url.IdnHost; | ||||
|             item.port = url.Port; | ||||
|             item.remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); | ||||
|             item.id = Utils.UrlDecode(url.UserInfo); | ||||
|             item.id = Utile.UrlDecode(url.UserInfo); | ||||
| 
 | ||||
|             var query = Utils.ParseQueryString(url.Query); | ||||
|             var query = Utile.ParseQueryString(url.Query); | ||||
|             ResolveStdTransport(query, ref item); | ||||
| 
 | ||||
|             return item; | ||||
|  | @ -852,9 +852,9 @@ namespace v2rayN.Handler | |||
|             item.address = url.IdnHost; | ||||
|             item.port = url.Port; | ||||
|             item.remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); | ||||
|             item.id = Utils.UrlDecode(url.UserInfo); | ||||
|             item.id = Utile.UrlDecode(url.UserInfo); | ||||
| 
 | ||||
|             var query = Utils.ParseQueryString(url.Query); | ||||
|             var query = Utile.ParseQueryString(url.Query); | ||||
|             item.security = query["encryption"] ?? "none"; | ||||
|             item.streamSecurity = query["security"] ?? ""; | ||||
|             ResolveStdTransport(query, ref item); | ||||
|  | @ -874,11 +874,11 @@ namespace v2rayN.Handler | |||
|             item.address = url.IdnHost; | ||||
|             item.port = url.Port; | ||||
|             item.remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); | ||||
|             item.id = Utils.UrlDecode(url.UserInfo); | ||||
|             item.id = Utile.UrlDecode(url.UserInfo); | ||||
| 
 | ||||
|             var query = Utils.ParseQueryString(url.Query); | ||||
|             var query = Utile.ParseQueryString(url.Query); | ||||
|             ResolveStdTransport(query, ref item); | ||||
|             item.path = Utils.UrlDecode(query["obfs-password"] ?? ""); | ||||
|             item.path = Utile.UrlDecode(query["obfs-password"] ?? ""); | ||||
|             item.allowInsecure = (query["insecure"] ?? "") == "1" ? "true" : "false"; | ||||
| 
 | ||||
|             return item; | ||||
|  | @ -903,7 +903,7 @@ namespace v2rayN.Handler | |||
|                 item.security = userInfoParts[1]; | ||||
|             } | ||||
| 
 | ||||
|             var query = Utils.ParseQueryString(url.Query); | ||||
|             var query = Utile.ParseQueryString(url.Query); | ||||
|             ResolveStdTransport(query, ref item); | ||||
|             item.headerType = query["congestion_control"] ?? ""; | ||||
| 
 | ||||
|  | @ -922,14 +922,14 @@ namespace v2rayN.Handler | |||
|             item.address = url.IdnHost; | ||||
|             item.port = url.Port; | ||||
|             item.remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped); | ||||
|             item.id = Utils.UrlDecode(url.UserInfo); | ||||
|             item.id = Utile.UrlDecode(url.UserInfo); | ||||
| 
 | ||||
|             var query = Utils.ParseQueryString(url.Query); | ||||
|             var query = Utile.ParseQueryString(url.Query); | ||||
| 
 | ||||
|             item.publicKey = Utils.UrlDecode(query["publickey"] ?? ""); | ||||
|             item.path = Utils.UrlDecode(query["reserved"] ?? ""); | ||||
|             item.requestHost = Utils.UrlDecode(query["address"] ?? ""); | ||||
|             item.shortId = Utils.UrlDecode(query["mtu"] ?? ""); | ||||
|             item.publicKey = Utile.UrlDecode(query["publickey"] ?? ""); | ||||
|             item.path = Utile.UrlDecode(query["reserved"] ?? ""); | ||||
|             item.requestHost = Utile.UrlDecode(query["address"] ?? ""); | ||||
|             item.shortId = Utile.UrlDecode(query["mtu"] ?? ""); | ||||
| 
 | ||||
|             return item; | ||||
|         } | ||||
|  | @ -939,47 +939,47 @@ namespace v2rayN.Handler | |||
|             item.flow = query["flow"] ?? ""; | ||||
|             item.streamSecurity = query["security"] ?? ""; | ||||
|             item.sni = query["sni"] ?? ""; | ||||
|             item.alpn = Utils.UrlDecode(query["alpn"] ?? ""); | ||||
|             item.fingerprint = Utils.UrlDecode(query["fp"] ?? ""); | ||||
|             item.publicKey = Utils.UrlDecode(query["pbk"] ?? ""); | ||||
|             item.shortId = Utils.UrlDecode(query["sid"] ?? ""); | ||||
|             item.spiderX = Utils.UrlDecode(query["spx"] ?? ""); | ||||
|             item.alpn = Utile.UrlDecode(query["alpn"] ?? ""); | ||||
|             item.fingerprint = Utile.UrlDecode(query["fp"] ?? ""); | ||||
|             item.publicKey = Utile.UrlDecode(query["pbk"] ?? ""); | ||||
|             item.shortId = Utile.UrlDecode(query["sid"] ?? ""); | ||||
|             item.spiderX = Utile.UrlDecode(query["spx"] ?? ""); | ||||
| 
 | ||||
|             item.network = query["type"] ?? "tcp"; | ||||
|             switch (item.network) | ||||
|             { | ||||
|                 case "tcp": | ||||
|                     item.headerType = query["headerType"] ?? "none"; | ||||
|                     item.requestHost = Utils.UrlDecode(query["host"] ?? ""); | ||||
|                     item.requestHost = Utile.UrlDecode(query["host"] ?? ""); | ||||
| 
 | ||||
|                     break; | ||||
| 
 | ||||
|                 case "kcp": | ||||
|                     item.headerType = query["headerType"] ?? "none"; | ||||
|                     item.path = Utils.UrlDecode(query["seed"] ?? ""); | ||||
|                     item.path = Utile.UrlDecode(query["seed"] ?? ""); | ||||
|                     break; | ||||
| 
 | ||||
|                 case "ws": | ||||
|                     item.requestHost = Utils.UrlDecode(query["host"] ?? ""); | ||||
|                     item.path = Utils.UrlDecode(query["path"] ?? "/"); | ||||
|                     item.requestHost = Utile.UrlDecode(query["host"] ?? ""); | ||||
|                     item.path = Utile.UrlDecode(query["path"] ?? "/"); | ||||
|                     break; | ||||
| 
 | ||||
|                 case "http": | ||||
|                 case "h2": | ||||
|                     item.network = "h2"; | ||||
|                     item.requestHost = Utils.UrlDecode(query["host"] ?? ""); | ||||
|                     item.path = Utils.UrlDecode(query["path"] ?? "/"); | ||||
|                     item.requestHost = Utile.UrlDecode(query["host"] ?? ""); | ||||
|                     item.path = Utile.UrlDecode(query["path"] ?? "/"); | ||||
|                     break; | ||||
| 
 | ||||
|                 case "quic": | ||||
|                     item.headerType = query["headerType"] ?? "none"; | ||||
|                     item.requestHost = query["quicSecurity"] ?? "none"; | ||||
|                     item.path = Utils.UrlDecode(query["key"] ?? ""); | ||||
|                     item.path = Utile.UrlDecode(query["key"] ?? ""); | ||||
|                     break; | ||||
| 
 | ||||
|                 case "grpc": | ||||
|                     item.path = Utils.UrlDecode(query["serviceName"] ?? ""); | ||||
|                     item.headerType = Utils.UrlDecode(query["mode"] ?? Global.GrpcgunMode); | ||||
|                     item.path = Utile.UrlDecode(query["serviceName"] ?? ""); | ||||
|                     item.headerType = Utile.UrlDecode(query["mode"] ?? Global.GrpcGunMode); | ||||
|                     break; | ||||
| 
 | ||||
|                 default: | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| using System.Diagnostics; | ||||
| using System.Net; | ||||
| using System.Net.Sockets; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| using v2rayN.Resx; | ||||
| 
 | ||||
| namespace v2rayN.Handler | ||||
|  | @ -326,7 +326,7 @@ namespace v2rayN.Handler | |||
|         private async Task<string> GetRealPingTime(DownloadHandle downloadHandle, IWebProxy webProxy) | ||||
|         { | ||||
|             int responseTime = await downloadHandle.GetRealPingTime(_config.speedTestItem.speedPingTestUrl, webProxy, 10); | ||||
|             //string output = Utils.IsNullOrEmpty(status) ? FormatOut(responseTime, "ms") : status; | ||||
|             //string output = Utile.IsNullOrEmpty(status) ? FormatOut(responseTime, "ms") : status; | ||||
|             return FormatOut(responseTime, Global.DelayUnit); | ||||
|         } | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| using System.Net; | ||||
| using System.Net.Sockets; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| 
 | ||||
| namespace v2rayN.Handler | ||||
| { | ||||
|  | @ -48,7 +48,7 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|         public void ClearAllServerStatistics() | ||||
|         { | ||||
|             SqliteHelper.Instance.Execute($"delete from ServerStatItem "); | ||||
|             SQLiteHelper.Instance.Execute($"delete from ServerStatItem "); | ||||
|             _serverStatItem = null; | ||||
|             _lstServerStat = new(); | ||||
|         } | ||||
|  | @ -57,7 +57,7 @@ namespace v2rayN.Handler | |||
|         { | ||||
|             try | ||||
|             { | ||||
|                 SqliteHelper.Instance.UpdateAll(_lstServerStat); | ||||
|                 SQLiteHelper.Instance.UpdateAll(_lstServerStat); | ||||
|             } | ||||
|             catch (Exception ex) | ||||
|             { | ||||
|  | @ -67,12 +67,12 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|         private void Init() | ||||
|         { | ||||
|             SqliteHelper.Instance.Execute($"delete from ServerStatItem where indexId not in ( select indexId from ProfileItem )"); | ||||
|             SQLiteHelper.Instance.Execute($"delete from ServerStatItem where indexId not in ( select indexId from ProfileItem )"); | ||||
| 
 | ||||
|             long ticks = DateTime.Now.Date.Ticks; | ||||
|             SqliteHelper.Instance.Execute($"update ServerStatItem set todayUp = 0,todayDown=0,dateNow={ticks} where dateNow<>{ticks}"); | ||||
|             SQLiteHelper.Instance.Execute($"update ServerStatItem set todayUp = 0,todayDown=0,dateNow={ticks} where dateNow<>{ticks}"); | ||||
| 
 | ||||
|             _lstServerStat = SqliteHelper.Instance.Table<ServerStatItem>().ToList(); | ||||
|             _lstServerStat = SQLiteHelper.Instance.Table<ServerStatItem>().ToList(); | ||||
|         } | ||||
| 
 | ||||
|         private void UpdateServerStat(ServerSpeedItem server) | ||||
|  | @ -121,7 +121,7 @@ namespace v2rayN.Handler | |||
|                         todayDown = 0, | ||||
|                         dateNow = ticks | ||||
|                     }; | ||||
|                     SqliteHelper.Instance.Replace(_serverStatItem); | ||||
|                     SQLiteHelper.Instance.Replace(_serverStatItem); | ||||
|                     _lstServerStat.Add(_serverStatItem); | ||||
|                 } | ||||
|             } | ||||
|  | @ -139,7 +139,7 @@ namespace v2rayN.Handler | |||
|             try | ||||
|             { | ||||
|                 int defaultPort = 9090; | ||||
|                 if (!Utils.PortInUse(defaultPort)) | ||||
|                 if (!Utile.PortInUse(defaultPort)) | ||||
|                 { | ||||
|                     return defaultPort; | ||||
|                 } | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| using System.Net.WebSockets; | ||||
| using System.Text; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| 
 | ||||
| namespace v2rayN.Handler | ||||
| { | ||||
|  | @ -113,7 +113,7 @@ namespace v2rayN.Handler | |||
|             up = 0; down = 0; | ||||
|             try | ||||
|             { | ||||
|                 var trafficItem = JsonUtils.Deserialize<TrafficItem>(source); | ||||
|                 var trafficItem = JsonUtile.Deserialize<TrafficItem>(source); | ||||
|                 if (trafficItem != null) | ||||
|                 { | ||||
|                     up = trafficItem.up; | ||||
|  |  | |||
|  | @ -1,19 +1,19 @@ | |||
| using Grpc.Core; | ||||
| using Grpc.Net.Client; | ||||
| using ProtosLib.Statistics; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| 
 | ||||
| namespace v2rayN.Handler | ||||
| { | ||||
|     internal class StatisticsV2ray | ||||
|     { | ||||
|         private Mode.Config _config; | ||||
|         private Model.Config _config; | ||||
|         private GrpcChannel? _channel; | ||||
|         private StatsService.StatsServiceClient? _client; | ||||
|         private bool _exitFlag; | ||||
|         private Action<ServerSpeedItem> _updateFunc; | ||||
| 
 | ||||
|         public StatisticsV2ray(Mode.Config config, Action<ServerSpeedItem> update) | ||||
|         public StatisticsV2ray(Model.Config config, Action<ServerSpeedItem> update) | ||||
|         { | ||||
|             _config = config; | ||||
|             _updateFunc = update; | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| using PacLib; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| 
 | ||||
| namespace v2rayN.Handler | ||||
| { | ||||
|  | @ -53,7 +53,7 @@ namespace v2rayN.Handler | |||
|                     var strExceptions = $"<local>;{config.constItem.defIEProxyExceptions};{config.systemProxyExceptions}"; | ||||
| 
 | ||||
|                     var strProxy = string.Empty; | ||||
|                     if (Utils.IsNullOrEmpty(config.systemProxyAdvancedProtocol)) | ||||
|                     if (Utile.IsNullOrEmpty(config.systemProxyAdvancedProtocol)) | ||||
|                     { | ||||
|                         strProxy = $"{Global.Loopback}:{port}"; | ||||
|                     } | ||||
|  | @ -75,7 +75,7 @@ namespace v2rayN.Handler | |||
|                 } | ||||
|                 else if (type == ESysProxyType.Pac) | ||||
|                 { | ||||
|                     PacHandler.Start(Utils.GetConfigPath(), port, portPac); | ||||
|                     PacHandler.Start(Utile.GetConfigPath(), port, portPac); | ||||
|                     var strProxy = $"{Global.HttpProtocol}{Global.Loopback}:{portPac}/pac?t={DateTime.Now.Ticks}"; | ||||
|                     ProxySetting.SetProxy(strProxy, "", 4); // use pac script url for auto-config proxy | ||||
|                 } | ||||
|  | @ -97,7 +97,7 @@ namespace v2rayN.Handler | |||
|             try | ||||
|             { | ||||
|                 //TODO To be verified | ||||
|                 Utils.RegWriteValue(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyEnable", 0); | ||||
|                 Utile.RegWriteValue(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyEnable", 0); | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|  |  | |||
|  | @ -6,7 +6,7 @@ using System.Runtime.InteropServices; | |||
| using System.Text; | ||||
| using System.Text.RegularExpressions; | ||||
| using System.Windows; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| using v2rayN.Resx; | ||||
| 
 | ||||
| namespace v2rayN.Handler | ||||
|  | @ -47,15 +47,15 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|                     try | ||||
|                     { | ||||
|                         string fileName = Utils.GetTempPath(Utils.GetDownloadFileName(url)); | ||||
|                         fileName = Utils.UrlEncode(fileName); | ||||
|                         string fileName = Utile.GetTempPath(Utile.GetDownloadFileName(url)); | ||||
|                         fileName = Utile.UrlEncode(fileName); | ||||
|                         Process process = new() | ||||
|                         { | ||||
|                             StartInfo = new ProcessStartInfo | ||||
|                             { | ||||
|                                 FileName = "v2rayUpgrade.exe", | ||||
|                                 Arguments = fileName.AppendQuotes(),                                 | ||||
|                                 WorkingDirectory = Utils.StartupPath() | ||||
|                                 WorkingDirectory = Utile.StartupPath() | ||||
|                             } | ||||
|                         }; | ||||
|                         process.Start(); | ||||
|  | @ -179,7 +179,7 @@ namespace v2rayN.Handler | |||
|                     string url = item.url.TrimEx(); | ||||
|                     string userAgent = item.userAgent.TrimEx(); | ||||
|                     string hashCode = $"{item.remarks}->"; | ||||
|                     if (Utils.IsNullOrEmpty(id) || Utils.IsNullOrEmpty(url) || (!Utils.IsNullOrEmpty(subId) && item.id != subId)) | ||||
|                     if (Utile.IsNullOrEmpty(id) || Utile.IsNullOrEmpty(url) || (!Utile.IsNullOrEmpty(subId) && item.id != subId)) | ||||
|                     { | ||||
|                         //_updateFunc(false, $"{hashCode}{ResUI.MsgNoValidSubscription}"); | ||||
|                         continue; | ||||
|  | @ -203,12 +203,12 @@ namespace v2rayN.Handler | |||
|                     _updateFunc(false, $"{hashCode}{ResUI.MsgStartGettingSubscriptions}"); | ||||
| 
 | ||||
|                     //one url | ||||
|                     url = Utils.GetPunycode(url); | ||||
|                     url = Utile.GetPunycode(url); | ||||
|                     //convert | ||||
|                     if (!Utils.IsNullOrEmpty(item.convertTarget)) | ||||
|                     if (!Utile.IsNullOrEmpty(item.convertTarget)) | ||||
|                     { | ||||
|                         var subConvertUrl = string.IsNullOrEmpty(config.constItem.subConvertUrl) ? Global.SubConvertUrls.FirstOrDefault() : config.constItem.subConvertUrl; | ||||
|                         url = string.Format(subConvertUrl!, Utils.UrlEncode(url)); | ||||
|                         url = string.Format(subConvertUrl!, Utile.UrlEncode(url)); | ||||
|                         if (!url.Contains("target=")) | ||||
|                         { | ||||
|                             url += string.Format("&target={0}", item.convertTarget); | ||||
|  | @ -219,17 +219,17 @@ namespace v2rayN.Handler | |||
|                         } | ||||
|                     } | ||||
|                     var result = await downloadHandle.TryDownloadString(url, blProxy, userAgent); | ||||
|                     if (blProxy && Utils.IsNullOrEmpty(result)) | ||||
|                     if (blProxy && Utile.IsNullOrEmpty(result)) | ||||
|                     { | ||||
|                         result = await downloadHandle.TryDownloadString(url, false, userAgent); | ||||
|                     } | ||||
| 
 | ||||
|                     //more url | ||||
|                     if (Utils.IsNullOrEmpty(item.convertTarget) && !Utils.IsNullOrEmpty(item.moreUrl.TrimEx())) | ||||
|                     if (Utile.IsNullOrEmpty(item.convertTarget) && !Utile.IsNullOrEmpty(item.moreUrl.TrimEx())) | ||||
|                     { | ||||
|                         if (!Utils.IsNullOrEmpty(result) && Utils.IsBase64String(result!)) | ||||
|                         if (!Utile.IsNullOrEmpty(result) && Utile.IsBase64String(result!)) | ||||
|                         { | ||||
|                             result = Utils.Base64Decode(result); | ||||
|                             result = Utile.Base64Decode(result); | ||||
|                         } | ||||
| 
 | ||||
|                         var lstUrl = new List<string> | ||||
|  | @ -238,22 +238,22 @@ namespace v2rayN.Handler | |||
|                         }; | ||||
|                         foreach (var it in lstUrl) | ||||
|                         { | ||||
|                             var url2 = Utils.GetPunycode(it); | ||||
|                             if (Utils.IsNullOrEmpty(url2)) | ||||
|                             var url2 = Utile.GetPunycode(it); | ||||
|                             if (Utile.IsNullOrEmpty(url2)) | ||||
|                             { | ||||
|                                 continue; | ||||
|                             } | ||||
| 
 | ||||
|                             var result2 = await downloadHandle.TryDownloadString(url2, blProxy, userAgent); | ||||
|                             if (blProxy && Utils.IsNullOrEmpty(result2)) | ||||
|                             if (blProxy && Utile.IsNullOrEmpty(result2)) | ||||
|                             { | ||||
|                                 result2 = await downloadHandle.TryDownloadString(url2, false, userAgent); | ||||
|                             } | ||||
|                             if (!Utils.IsNullOrEmpty(result2)) | ||||
|                             if (!Utile.IsNullOrEmpty(result2)) | ||||
|                             { | ||||
|                                 if (Utils.IsBase64String(result2!)) | ||||
|                                 if (Utile.IsBase64String(result2!)) | ||||
|                                 { | ||||
|                                     result += Utils.Base64Decode(result2); | ||||
|                                     result += Utile.Base64Decode(result2); | ||||
|                                 } | ||||
|                                 else | ||||
|                                 { | ||||
|  | @ -263,7 +263,7 @@ namespace v2rayN.Handler | |||
|                         } | ||||
|                     } | ||||
| 
 | ||||
|                     if (Utils.IsNullOrEmpty(result)) | ||||
|                     if (Utile.IsNullOrEmpty(result)) | ||||
|                     { | ||||
|                         _updateFunc(false, $"{hashCode}{ResUI.MsgSubscriptionDecodingFailed}"); | ||||
|                     } | ||||
|  | @ -325,7 +325,7 @@ namespace v2rayN.Handler | |||
|                 string url = coreInfo.coreReleaseApiUrl; | ||||
| 
 | ||||
|                 var result = await (new DownloadHandle()).DownloadStringAsync(url, true, ""); | ||||
|                 if (!Utils.IsNullOrEmpty(result)) | ||||
|                 if (!Utile.IsNullOrEmpty(result)) | ||||
|                 { | ||||
|                     responseHandler(type, result, preRelease); | ||||
|                 } | ||||
|  | @ -354,7 +354,7 @@ namespace v2rayN.Handler | |||
|                 foreach (string name in coreInfo.coreExes) | ||||
|                 { | ||||
|                     string vName = $"{name}.exe"; | ||||
|                     vName = Utils.GetBinPath(vName, coreInfo.coreType.ToString()); | ||||
|                     vName = Utile.GetBinPath(vName, coreInfo.coreType.ToString()); | ||||
|                     if (File.Exists(vName)) | ||||
|                     { | ||||
|                         filePath = vName; | ||||
|  | @ -372,7 +372,7 @@ namespace v2rayN.Handler | |||
|                 using Process p = new(); | ||||
|                 p.StartInfo.FileName = filePath.AppendQuotes(); | ||||
|                 p.StartInfo.Arguments = coreInfo.versionArg; | ||||
|                 p.StartInfo.WorkingDirectory = Utils.StartupPath(); | ||||
|                 p.StartInfo.WorkingDirectory = Utile.StartupPath(); | ||||
|                 p.StartInfo.UseShellExecute = false; | ||||
|                 p.StartInfo.RedirectStandardOutput = true; | ||||
|                 p.StartInfo.CreateNoWindow = true; | ||||
|  | @ -413,7 +413,7 @@ namespace v2rayN.Handler | |||
|         { | ||||
|             try | ||||
|             { | ||||
|                 var gitHubReleases = JsonUtils.Deserialize<List<GitHubRelease>>(gitHubReleaseApi); | ||||
|                 var gitHubReleases = JsonUtile.Deserialize<List<GitHubRelease>>(gitHubReleaseApi); | ||||
|                 var gitHubRelease = preRelease ? gitHubReleases!.First() : gitHubReleases!.First(r => r.Prerelease == false); | ||||
|                 var version = new SemanticVersion(gitHubRelease!.TagName); | ||||
|                 var body = gitHubRelease!.Body; | ||||
|  | @ -496,7 +496,7 @@ namespace v2rayN.Handler | |||
|                         } | ||||
|                     case ECoreType.v2rayN: | ||||
|                         { | ||||
|                             curVersion = new SemanticVersion(FileVersionInfo.GetVersionInfo(Utils.GetExePath()).FileVersion.ToString()); | ||||
|                             curVersion = new SemanticVersion(FileVersionInfo.GetVersionInfo(Utile.GetExePath()).FileVersion.ToString()); | ||||
|                             message = string.Format(ResUI.IsLatestN, type, curVersion); | ||||
|                             switch (RuntimeInformation.ProcessArchitecture) | ||||
|                             { | ||||
|  | @ -568,15 +568,15 @@ namespace v2rayN.Handler | |||
| 
 | ||||
|                     try | ||||
|                     { | ||||
|                         string fileName = Utils.GetTempPath(Utils.GetDownloadFileName(url)); | ||||
|                         string fileName = Utile.GetTempPath(Utile.GetDownloadFileName(url)); | ||||
|                         if (File.Exists(fileName)) | ||||
|                         { | ||||
|                             //Global.coreTypes.ForEach(it => | ||||
|                             //{ | ||||
|                             //    string targetPath = Utils.GetBinPath($"{geoName}.dat", (ECoreType)Enum.Parse(typeof(ECoreType), it)); | ||||
|                             //    string targetPath = Utile.GetBinPath($"{geoName}.dat", (ECoreType)Enum.Parse(typeof(ECoreType), it)); | ||||
|                             //    File.Copy(fileName, targetPath, true); | ||||
|                             //}); | ||||
|                             string targetPath = Utils.GetBinPath($"{geoName}.dat"); | ||||
|                             string targetPath = Utile.GetBinPath($"{geoName}.dat"); | ||||
|                             File.Copy(fileName, targetPath, true); | ||||
| 
 | ||||
|                             File.Delete(fileName); | ||||
|  | @ -621,10 +621,10 @@ namespace v2rayN.Handler | |||
|                             coreHandler?.CoreStop(); | ||||
|                             await Task.Delay(3000); | ||||
|                         } | ||||
|                         string fileName = Utils.GetTempPath(Utils.GetDownloadFileName(url)); | ||||
|                         string fileName = Utile.GetTempPath(Utile.GetDownloadFileName(url)); | ||||
|                         if (File.Exists(fileName)) | ||||
|                         { | ||||
|                             string targetPath = Utils.GetConfigPath($"{geoName}.db"); | ||||
|                             string targetPath = Utile.GetConfigPath($"{geoName}.db"); | ||||
|                             File.Copy(fileName, targetPath, true); | ||||
| 
 | ||||
|                             File.Delete(fileName); | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     public class ComboItem | ||||
|     { | ||||
|  | @ -1,4 +1,4 @@ | |||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     /// <summary> | ||||
|     /// 本软件配置文件实体类 | ||||
|  | @ -1,6 +1,6 @@ | |||
| using System.Windows.Input; | ||||
| 
 | ||||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     [Serializable] | ||||
|     public class CoreBasicItem | ||||
|  | @ -1,4 +1,4 @@ | |||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     [Serializable] | ||||
|     public class ConfigOld | ||||
|  | @ -1,4 +1,4 @@ | |||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     [Serializable] | ||||
|     public class CoreInfo | ||||
|  | @ -1,6 +1,6 @@ | |||
| using SQLite; | ||||
| 
 | ||||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     [Serializable] | ||||
|     public class DNSItem | ||||
|  | @ -1,4 +1,4 @@ | |||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     public enum EConfigType | ||||
|     { | ||||
|  | @ -1,4 +1,4 @@ | |||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     public enum ECoreType | ||||
|     { | ||||
|  | @ -1,4 +1,4 @@ | |||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     public enum EGlobalHotkey | ||||
|     { | ||||
|  | @ -1,4 +1,4 @@ | |||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     public enum EMove | ||||
|     { | ||||
|  | @ -1,4 +1,4 @@ | |||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     public enum EServerColName | ||||
|     { | ||||
|  | @ -1,4 +1,4 @@ | |||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     public enum ESpeedActionType | ||||
|     { | ||||
|  | @ -1,4 +1,4 @@ | |||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     public enum ESysProxyType | ||||
|     { | ||||
|  | @ -1,4 +1,4 @@ | |||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     public enum EViewAction | ||||
|     { | ||||
|  | @ -1,6 +1,6 @@ | |||
| using System.Text.Json.Serialization; | ||||
| 
 | ||||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     public class GitHubReleaseAsset | ||||
|     { | ||||
|  | @ -1,6 +1,6 @@ | |||
| using SQLite; | ||||
| 
 | ||||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     [Serializable] | ||||
|     public class ProfileExItem | ||||
|  | @ -1,6 +1,6 @@ | |||
| using SQLite; | ||||
| 
 | ||||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     [Serializable] | ||||
|     public class ProfileItem | ||||
|  | @ -60,19 +60,19 @@ namespace v2rayN.Mode | |||
| 
 | ||||
|         public List<string> GetAlpn() | ||||
|         { | ||||
|             if (Utils.IsNullOrEmpty(alpn)) | ||||
|             if (Utile.IsNullOrEmpty(alpn)) | ||||
|             { | ||||
|                 return null; | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 return Utils.String2List(alpn); | ||||
|                 return Utile.String2List(alpn); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         public string GetNetwork() | ||||
|         { | ||||
|             if (Utils.IsNullOrEmpty(network) || !Global.Networks.Contains(network)) | ||||
|             if (Utile.IsNullOrEmpty(network) || !Global.Networks.Contains(network)) | ||||
|             { | ||||
|                 return Global.DefaultNetwork; | ||||
|             } | ||||
|  | @ -1,4 +1,4 @@ | |||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     [Serializable] | ||||
|     public class ProfileItemModel : ProfileItem | ||||
|  | @ -1,6 +1,6 @@ | |||
| using SQLite; | ||||
| 
 | ||||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     [Serializable] | ||||
|     public class RoutingItem | ||||
|  | @ -1,4 +1,4 @@ | |||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     [Serializable] | ||||
|     public class RoutingItemModel : RoutingItem | ||||
|  | @ -1,4 +1,4 @@ | |||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     [Serializable] | ||||
|     public class RulesItem | ||||
|  | @ -1,4 +1,4 @@ | |||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     [Serializable] | ||||
|     public class RulesItemModel : RulesItem | ||||
|  | @ -1,4 +1,4 @@ | |||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     [Serializable] | ||||
|     internal class ServerSpeedItem : ServerStatItem | ||||
|  | @ -1,6 +1,6 @@ | |||
| using SQLite; | ||||
| 
 | ||||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     [Serializable] | ||||
|     public class ServerStatItem | ||||
|  | @ -1,4 +1,4 @@ | |||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     [Serializable] | ||||
|     internal class ServerTestItem | ||||
|  | @ -1,4 +1,4 @@ | |||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     public class SingboxConfig | ||||
|     { | ||||
|  | @ -1,4 +1,4 @@ | |||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     public class SsSIP008 | ||||
|     { | ||||
|  | @ -1,6 +1,6 @@ | |||
| using SQLite; | ||||
| 
 | ||||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     [Serializable] | ||||
|     public class SubItem | ||||
|  | @ -1,6 +1,6 @@ | |||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     internal class SysproxyConfig | ||||
|     internal class SysProxyConfig | ||||
|     { | ||||
|         public bool UserSettingsRecorded; | ||||
|         public string Flags; | ||||
|  | @ -8,7 +8,7 @@ | |||
|         public string BypassList; | ||||
|         public string PacUrl; | ||||
| 
 | ||||
|         public SysproxyConfig() | ||||
|         public SysProxyConfig() | ||||
|         { | ||||
|             UserSettingsRecorded = false; | ||||
|             Flags = "1"; | ||||
|  | @ -1,6 +1,6 @@ | |||
| using System.Text.Json.Serialization; | ||||
| 
 | ||||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     /// <summary> | ||||
|     /// v2ray配置文件实体类 例子SampleConfig.txt | ||||
|  | @ -1,4 +1,4 @@ | |||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     /// <summary> | ||||
|     /// Tcp伪装http的Request,只要Host | ||||
|  | @ -1,6 +1,6 @@ | |||
| using System.Text.Json.Serialization; | ||||
| 
 | ||||
| namespace v2rayN.Mode | ||||
| namespace v2rayN.Model | ||||
| { | ||||
|     /// <summary> | ||||
|     /// https://github.com/2dust/v2rayN/wiki/ | ||||
|  | @ -6,7 +6,7 @@ using System.IO; | |||
| using System.Reactive; | ||||
| using System.Windows; | ||||
| using v2rayN.Handler; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| using v2rayN.Resx; | ||||
| 
 | ||||
| namespace v2rayN.ViewModels | ||||
|  | @ -36,7 +36,7 @@ namespace v2rayN.ViewModels | |||
|             } | ||||
|             else | ||||
|             { | ||||
|                 SelectedSource = JsonUtils.DeepCopy(profileItem); | ||||
|                 SelectedSource = JsonUtile.DeepCopy(profileItem); | ||||
|             } | ||||
| 
 | ||||
|             _view = view; | ||||
|  | @ -56,19 +56,19 @@ namespace v2rayN.ViewModels | |||
|                 SaveServer(); | ||||
|             }); | ||||
| 
 | ||||
|             Utils.SetDarkBorder(view, _config.uiItem.colorModeDark); | ||||
|             Utile.SetDarkBorder(view, _config.uiItem.colorModeDark); | ||||
|         } | ||||
| 
 | ||||
|         private void SaveServer() | ||||
|         { | ||||
|             string remarks = SelectedSource.remarks; | ||||
|             if (Utils.IsNullOrEmpty(remarks)) | ||||
|             if (Utile.IsNullOrEmpty(remarks)) | ||||
|             { | ||||
|                 UI.Show(ResUI.PleaseFillRemarks); | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             if (Utils.IsNullOrEmpty(SelectedSource.address)) | ||||
|             if (Utile.IsNullOrEmpty(SelectedSource.address)) | ||||
|             { | ||||
|                 UI.Show(ResUI.FillServerAddressCustom); | ||||
|                 return; | ||||
|  | @ -108,7 +108,7 @@ namespace v2rayN.ViewModels | |||
|             { | ||||
|                 return; | ||||
|             } | ||||
|             if (Utils.IsNullOrEmpty(fileName)) | ||||
|             if (Utile.IsNullOrEmpty(fileName)) | ||||
|             { | ||||
|                 return; | ||||
|             } | ||||
|  | @ -119,9 +119,9 @@ namespace v2rayN.ViewModels | |||
|             if (ConfigHandler.AddCustomServer(_config, item, false) == 0) | ||||
|             { | ||||
|                 _noticeHandler?.Enqueue(ResUI.SuccessfullyImportedCustomServer); | ||||
|                 if (!Utils.IsNullOrEmpty(item.indexId)) | ||||
|                 if (!Utile.IsNullOrEmpty(item.indexId)) | ||||
|                 { | ||||
|                     SelectedSource = JsonUtils.DeepCopy(item); | ||||
|                     SelectedSource = JsonUtile.DeepCopy(item); | ||||
|                 } | ||||
|                 IsModified = true; | ||||
|             } | ||||
|  | @ -134,16 +134,16 @@ namespace v2rayN.ViewModels | |||
|         private void EditServer() | ||||
|         { | ||||
|             var address = SelectedSource.address; | ||||
|             if (Utils.IsNullOrEmpty(address)) | ||||
|             if (Utile.IsNullOrEmpty(address)) | ||||
|             { | ||||
|                 UI.Show(ResUI.FillServerAddressCustom); | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             address = Utils.GetConfigPath(address); | ||||
|             address = Utile.GetConfigPath(address); | ||||
|             if (File.Exists(address)) | ||||
|             { | ||||
|                 Utils.ProcessStart(address); | ||||
|                 Utile.ProcessStart(address); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ using Splat; | |||
| using System.Reactive; | ||||
| using System.Windows; | ||||
| using v2rayN.Handler; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| using v2rayN.Resx; | ||||
| 
 | ||||
| namespace v2rayN.ViewModels | ||||
|  | @ -36,7 +36,7 @@ namespace v2rayN.ViewModels | |||
|             } | ||||
|             else | ||||
|             { | ||||
|                 SelectedSource = JsonUtils.DeepCopy(profileItem); | ||||
|                 SelectedSource = JsonUtile.DeepCopy(profileItem); | ||||
|             } | ||||
| 
 | ||||
|             SaveCmd = ReactiveCommand.Create(() => | ||||
|  | @ -44,24 +44,24 @@ namespace v2rayN.ViewModels | |||
|                 SaveServer(); | ||||
|             }); | ||||
| 
 | ||||
|             Utils.SetDarkBorder(view, _config.uiItem.colorModeDark); | ||||
|             Utile.SetDarkBorder(view, _config.uiItem.colorModeDark); | ||||
|         } | ||||
| 
 | ||||
|         private void SaveServer() | ||||
|         { | ||||
|             if (Utils.IsNullOrEmpty(SelectedSource.remarks)) | ||||
|             if (Utile.IsNullOrEmpty(SelectedSource.remarks)) | ||||
|             { | ||||
|                 UI.Show(ResUI.PleaseFillRemarks); | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             if (Utils.IsNullOrEmpty(SelectedSource.address)) | ||||
|             if (Utile.IsNullOrEmpty(SelectedSource.address)) | ||||
|             { | ||||
|                 UI.Show(ResUI.FillServerAddress); | ||||
|                 return; | ||||
|             } | ||||
|             var port = SelectedSource.port.ToString(); | ||||
|             if (Utils.IsNullOrEmpty(port) || !Utils.IsNumberic(port) | ||||
|             if (Utile.IsNullOrEmpty(port) || !Utile.IsNumeric(port) | ||||
|                 || SelectedSource.port <= 0 || SelectedSource.port >= Global.MaxPort) | ||||
|             { | ||||
|                 UI.Show(ResUI.FillCorrectServerPort); | ||||
|  | @ -69,12 +69,12 @@ namespace v2rayN.ViewModels | |||
|             } | ||||
|             if (SelectedSource.configType == EConfigType.Shadowsocks) | ||||
|             { | ||||
|                 if (Utils.IsNullOrEmpty(SelectedSource.id)) | ||||
|                 if (Utile.IsNullOrEmpty(SelectedSource.id)) | ||||
|                 { | ||||
|                     UI.Show(ResUI.FillPassword); | ||||
|                     return; | ||||
|                 } | ||||
|                 if (Utils.IsNullOrEmpty(SelectedSource.security)) | ||||
|                 if (Utile.IsNullOrEmpty(SelectedSource.security)) | ||||
|                 { | ||||
|                     UI.Show(ResUI.PleaseSelectEncryption); | ||||
|                     return; | ||||
|  | @ -82,7 +82,7 @@ namespace v2rayN.ViewModels | |||
|             } | ||||
|             if (SelectedSource.configType != EConfigType.Socks) | ||||
|             { | ||||
|                 if (Utils.IsNullOrEmpty(SelectedSource.id)) | ||||
|                 if (Utile.IsNullOrEmpty(SelectedSource.id)) | ||||
|                 { | ||||
|                     UI.Show(ResUI.FillUUID); | ||||
|                     return; | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ using Splat; | |||
| using System.Reactive; | ||||
| using System.Windows; | ||||
| using v2rayN.Handler; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| using v2rayN.Resx; | ||||
| 
 | ||||
| namespace v2rayN.ViewModels | ||||
|  | @ -47,23 +47,23 @@ namespace v2rayN.ViewModels | |||
| 
 | ||||
|             ImportDefConfig4V2rayCmd = ReactiveCommand.Create(() => | ||||
|             { | ||||
|                 normalDNS = Utils.GetEmbedText(Global.DNSV2rayNormalFileName); | ||||
|                 normalDNS = Utile.GetEmbedText(Global.DNSV2rayNormalFileName); | ||||
|             }); | ||||
| 
 | ||||
|             ImportDefConfig4SingboxCmd = ReactiveCommand.Create(() => | ||||
|             { | ||||
|                 normalDNS2 = Utils.GetEmbedText(Global.DNSSingboxNormalFileName); | ||||
|                 tunDNS2 = Utils.GetEmbedText(Global.TunSingboxDNSFileName); | ||||
|                 normalDNS2 = Utile.GetEmbedText(Global.DNSSingboxNormalFileName); | ||||
|                 tunDNS2 = Utile.GetEmbedText(Global.TunSingboxDNSFileName); | ||||
|             }); | ||||
| 
 | ||||
|             Utils.SetDarkBorder(view, _config.uiItem.colorModeDark); | ||||
|             Utile.SetDarkBorder(view, _config.uiItem.colorModeDark); | ||||
|         } | ||||
| 
 | ||||
|         private void SaveSetting() | ||||
|         { | ||||
|             if (!Utils.IsNullOrEmpty(normalDNS)) | ||||
|             if (!Utile.IsNullOrEmpty(normalDNS)) | ||||
|             { | ||||
|                 var obj = JsonUtils.ParseJson(normalDNS); | ||||
|                 var obj = JsonUtile.ParseJson(normalDNS); | ||||
|                 if (obj != null && obj["servers"] != null) | ||||
|                 { | ||||
|                 } | ||||
|  | @ -76,18 +76,18 @@ namespace v2rayN.ViewModels | |||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             if (!Utils.IsNullOrEmpty(normalDNS2)) | ||||
|             if (!Utile.IsNullOrEmpty(normalDNS2)) | ||||
|             { | ||||
|                 var obj2 = JsonUtils.Deserialize<Dns4Sbox>(normalDNS2); | ||||
|                 var obj2 = JsonUtile.Deserialize<Dns4Sbox>(normalDNS2); | ||||
|                 if (obj2 == null) | ||||
|                 { | ||||
|                     UI.Show(ResUI.FillCorrectDNSText); | ||||
|                     return; | ||||
|                 } | ||||
|             } | ||||
|             if (!Utils.IsNullOrEmpty(tunDNS2)) | ||||
|             if (!Utile.IsNullOrEmpty(tunDNS2)) | ||||
|             { | ||||
|                 var obj2 = JsonUtils.Deserialize<Dns4Sbox>(tunDNS2); | ||||
|                 var obj2 = JsonUtile.Deserialize<Dns4Sbox>(tunDNS2); | ||||
|                 if (obj2 == null) | ||||
|                 { | ||||
|                     UI.Show(ResUI.FillCorrectDNSText); | ||||
|  | @ -102,8 +102,8 @@ namespace v2rayN.ViewModels | |||
|             ConfigHandler.SaveDNSItems(_config, item); | ||||
| 
 | ||||
|             var item2 = LazyConfig.Instance.GetDNSItem(ECoreType.sing_box); | ||||
|             item2.normalDNS = JsonUtils.Serialize(JsonUtils.ParseJson(normalDNS2)); | ||||
|             item2.tunDNS = JsonUtils.Serialize(JsonUtils.ParseJson(tunDNS2)); | ||||
|             item2.normalDNS = JsonUtile.Serialize(JsonUtile.ParseJson(normalDNS2)); | ||||
|             item2.tunDNS = JsonUtile.Serialize(JsonUtile.ParseJson(tunDNS2)); | ||||
|             ConfigHandler.SaveDNSItems(_config, item2); | ||||
| 
 | ||||
|             _noticeHandler?.Enqueue(ResUI.OperationSuccess); | ||||
|  |  | |||
|  | @ -15,7 +15,7 @@ using System.Text; | |||
| using System.Windows; | ||||
| using System.Windows.Media; | ||||
| using v2rayN.Handler; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| using v2rayN.Resx; | ||||
| using v2rayN.Views; | ||||
| 
 | ||||
|  | @ -265,7 +265,7 @@ namespace v2rayN.ViewModels | |||
|             SelectedMoveToGroup = new(); | ||||
|             SelectedRouting = new(); | ||||
|             SelectedServer = new(); | ||||
|             if (_config.tunModeItem.enableTun && Utils.IsAdministrator()) | ||||
|             if (_config.tunModeItem.enableTun && Utile.IsAdministrator()) | ||||
|             { | ||||
|                 EnableTun = true; | ||||
|             } | ||||
|  | @ -641,8 +641,8 @@ namespace v2rayN.ViewModels | |||
|                         return; | ||||
|                     } | ||||
| 
 | ||||
|                     SpeedProxyDisplay = string.Format(ResUI.SpeedDisplayText, Global.ProxyTag, Utils.HumanFy(update.proxyUp), Utils.HumanFy(update.proxyDown)); | ||||
|                     SpeedDirectDisplay = string.Format(ResUI.SpeedDisplayText, Global.DirectTag, Utils.HumanFy(update.directUp), Utils.HumanFy(update.directDown)); | ||||
|                     SpeedProxyDisplay = string.Format(ResUI.SpeedDisplayText, Global.ProxyTag, Utile.HumanFy(update.proxyUp), Utile.HumanFy(update.proxyDown)); | ||||
|                     SpeedDirectDisplay = string.Format(ResUI.SpeedDisplayText, Global.DirectTag, Utile.HumanFy(update.directUp), Utile.HumanFy(update.directDown)); | ||||
| 
 | ||||
|                     if (update.proxyUp + update.proxyDown > 0) | ||||
|                     { | ||||
|  | @ -652,20 +652,20 @@ namespace v2rayN.ViewModels | |||
|                             var item = _profileItems.Where(it => it.indexId == update.indexId).FirstOrDefault(); | ||||
|                             if (item != null) | ||||
|                             { | ||||
|                                 item.todayDown = Utils.HumanFy(update.todayDown); | ||||
|                                 item.todayUp = Utils.HumanFy(update.todayUp); | ||||
|                                 item.totalDown = Utils.HumanFy(update.totalDown); | ||||
|                                 item.totalUp = Utils.HumanFy(update.totalUp); | ||||
|                                 item.todayDown = Utile.HumanFy(update.todayDown); | ||||
|                                 item.todayUp = Utile.HumanFy(update.todayUp); | ||||
|                                 item.totalDown = Utile.HumanFy(update.totalDown); | ||||
|                                 item.totalUp = Utile.HumanFy(update.totalUp); | ||||
| 
 | ||||
|                                 if (SelectedProfile?.indexId == item.indexId) | ||||
|                                 { | ||||
|                                     var temp = JsonUtils.DeepCopy(item); | ||||
|                                     var temp = JsonUtile.DeepCopy(item); | ||||
|                                     _profileItems.Replace(item, temp); | ||||
|                                     SelectedProfile = temp; | ||||
|                                 } | ||||
|                                 else | ||||
|                                 { | ||||
|                                     _profileItems.Replace(item, JsonUtils.DeepCopy(item)); | ||||
|                                     _profileItems.Replace(item, JsonUtile.DeepCopy(item)); | ||||
|                                 } | ||||
|                             } | ||||
|                         } | ||||
|  | @ -688,7 +688,7 @@ namespace v2rayN.ViewModels | |||
| 
 | ||||
|         private void SetTestResult(string indexId, string delay, string speed) | ||||
|         { | ||||
|             if (Utils.IsNullOrEmpty(indexId)) | ||||
|             if (Utile.IsNullOrEmpty(indexId)) | ||||
|             { | ||||
|                 _noticeHandler?.SendMessage(delay, true); | ||||
|                 _noticeHandler?.Enqueue(delay); | ||||
|  | @ -697,17 +697,17 @@ namespace v2rayN.ViewModels | |||
|             var item = _profileItems.Where(it => it.indexId == indexId).FirstOrDefault(); | ||||
|             if (item != null) | ||||
|             { | ||||
|                 if (!Utils.IsNullOrEmpty(delay)) | ||||
|                 if (!Utile.IsNullOrEmpty(delay)) | ||||
|                 { | ||||
|                     int.TryParse(delay, out int temp); | ||||
|                     item.delay = temp; | ||||
|                     item.delayVal = $"{delay} {Global.DelayUnit}"; | ||||
|                 } | ||||
|                 if (!Utils.IsNullOrEmpty(speed)) | ||||
|                 if (!Utile.IsNullOrEmpty(speed)) | ||||
|                 { | ||||
|                     item.speedVal = $"{speed} {Global.SpeedUnit}"; | ||||
|                 } | ||||
|                 _profileItems.Replace(item, JsonUtils.DeepCopy(item)); | ||||
|                 _profileItems.Replace(item, JsonUtile.DeepCopy(item)); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|  | @ -797,7 +797,7 @@ namespace v2rayN.ViewModels | |||
|                 return; | ||||
|             } | ||||
|             _serverFilter = ServerFilter; | ||||
|             if (Utils.IsNullOrEmpty(_serverFilter)) | ||||
|             if (Utile.IsNullOrEmpty(_serverFilter)) | ||||
|             { | ||||
|                 RefreshServers(); | ||||
|             } | ||||
|  | @ -837,12 +837,12 @@ namespace v2rayN.ViewModels | |||
|                             delay = t33 == null ? 0 : t33.delay, | ||||
|                             delayVal = t33?.delay != 0 ? $"{t33?.delay} {Global.DelayUnit}" : string.Empty, | ||||
|                             speedVal = t33?.speed != 0 ? $"{t33?.speed} {Global.SpeedUnit}" : string.Empty, | ||||
|                             todayDown = t22 == null ? "" : Utils.HumanFy(t22.todayDown), | ||||
|                             todayUp = t22 == null ? "" : Utils.HumanFy(t22.todayUp), | ||||
|                             totalDown = t22 == null ? "" : Utils.HumanFy(t22.totalDown), | ||||
|                             totalUp = t22 == null ? "" : Utils.HumanFy(t22.totalUp) | ||||
|                             todayDown = t22 == null ? "" : Utile.HumanFy(t22.todayDown), | ||||
|                             todayUp = t22 == null ? "" : Utile.HumanFy(t22.todayUp), | ||||
|                             totalDown = t22 == null ? "" : Utile.HumanFy(t22.totalDown), | ||||
|                             totalUp = t22 == null ? "" : Utile.HumanFy(t22.totalUp) | ||||
|                         }).OrderBy(t => t.sort).ToList(); | ||||
|             _lstProfile = JsonUtils.Deserialize<List<ProfileItem>>(JsonUtils.Serialize(lstModel)); | ||||
|             _lstProfile = JsonUtile.Deserialize<List<ProfileItem>>(JsonUtile.Serialize(lstModel)); | ||||
| 
 | ||||
|             Application.Current.Dispatcher.Invoke((Action)(() => | ||||
|             { | ||||
|  | @ -947,7 +947,7 @@ namespace v2rayN.ViewModels | |||
|             } | ||||
|             else | ||||
|             { | ||||
|                 lstSelecteds = JsonUtils.Deserialize<List<ProfileItem>>(JsonUtils.Serialize(orderProfiles)); | ||||
|                 lstSelecteds = JsonUtile.Deserialize<List<ProfileItem>>(JsonUtile.Serialize(orderProfiles)); | ||||
|             } | ||||
| 
 | ||||
|             return 0; | ||||
|  | @ -967,7 +967,7 @@ namespace v2rayN.ViewModels | |||
|             } | ||||
|             else | ||||
|             { | ||||
|                 if (Utils.IsNullOrEmpty(SelectedProfile?.indexId)) | ||||
|                 if (Utile.IsNullOrEmpty(SelectedProfile?.indexId)) | ||||
|                 { | ||||
|                     return; | ||||
|                 } | ||||
|  | @ -1000,7 +1000,7 @@ namespace v2rayN.ViewModels | |||
| 
 | ||||
|         public void AddServerViaClipboard() | ||||
|         { | ||||
|             var clipboardData = Utils.GetClipboardData(); | ||||
|             var clipboardData = Utile.GetClipboardData(); | ||||
|             int ret = ConfigHandler.AddBatchServers(_config, clipboardData!, _subId, false); | ||||
|             if (ret > 0) | ||||
|             { | ||||
|  | @ -1014,15 +1014,15 @@ namespace v2rayN.ViewModels | |||
|         { | ||||
|             ShowHideWindow(false); | ||||
| 
 | ||||
|             var dpiXY = Utils.GetDpiXY(Application.Current.MainWindow); | ||||
|             var dpiXY = Utile.GetDpiXY(Application.Current.MainWindow); | ||||
|             string result = await Task.Run(() => | ||||
|             { | ||||
|                 return Utils.ScanScreen(dpiXY.Item1, dpiXY.Item2); | ||||
|                 return Utile.ScanScreen(dpiXY.Item1, dpiXY.Item2); | ||||
|             }); | ||||
| 
 | ||||
|             ShowHideWindow(true); | ||||
| 
 | ||||
|             if (Utils.IsNullOrEmpty(result)) | ||||
|             if (Utile.IsNullOrEmpty(result)) | ||||
|             { | ||||
|                 _noticeHandler?.Enqueue(ResUI.NoValidQRcodeFound); | ||||
|             } | ||||
|  | @ -1084,7 +1084,7 @@ namespace v2rayN.ViewModels | |||
| 
 | ||||
|         public void SetDefaultServer() | ||||
|         { | ||||
|             if (Utils.IsNullOrEmpty(SelectedProfile?.indexId)) | ||||
|             if (Utile.IsNullOrEmpty(SelectedProfile?.indexId)) | ||||
|             { | ||||
|                 return; | ||||
|             } | ||||
|  | @ -1093,7 +1093,7 @@ namespace v2rayN.ViewModels | |||
| 
 | ||||
|         private void SetDefaultServer(string indexId) | ||||
|         { | ||||
|             if (Utils.IsNullOrEmpty(indexId)) | ||||
|             if (Utile.IsNullOrEmpty(indexId)) | ||||
|             { | ||||
|                 return; | ||||
|             } | ||||
|  | @ -1125,7 +1125,7 @@ namespace v2rayN.ViewModels | |||
|             { | ||||
|                 return; | ||||
|             } | ||||
|             if (Utils.IsNullOrEmpty(SelectedServer.ID)) | ||||
|             if (Utile.IsNullOrEmpty(SelectedServer.ID)) | ||||
|             { | ||||
|                 return; | ||||
|             } | ||||
|  | @ -1141,7 +1141,7 @@ namespace v2rayN.ViewModels | |||
|                 return; | ||||
|             } | ||||
|             var url = ShareHandler.GetShareUrl(item); | ||||
|             if (Utils.IsNullOrEmpty(url)) | ||||
|             if (Utile.IsNullOrEmpty(url)) | ||||
|             { | ||||
|                 return; | ||||
|             } | ||||
|  | @ -1157,7 +1157,7 @@ namespace v2rayN.ViewModels | |||
| 
 | ||||
|         public void SortServer(string colName) | ||||
|         { | ||||
|             if (Utils.IsNullOrEmpty(colName)) | ||||
|             if (Utile.IsNullOrEmpty(colName)) | ||||
|             { | ||||
|                 return; | ||||
|             } | ||||
|  | @ -1282,7 +1282,7 @@ namespace v2rayN.ViewModels | |||
|             foreach (var it in lstSelecteds) | ||||
|             { | ||||
|                 string url = ShareHandler.GetShareUrl(it); | ||||
|                 if (Utils.IsNullOrEmpty(url)) | ||||
|                 if (Utile.IsNullOrEmpty(url)) | ||||
|                 { | ||||
|                     continue; | ||||
|                 } | ||||
|  | @ -1291,7 +1291,7 @@ namespace v2rayN.ViewModels | |||
|             } | ||||
|             if (sb.Length > 0) | ||||
|             { | ||||
|                 Utils.SetClipboardData(sb.ToString()); | ||||
|                 Utile.SetClipboardData(sb.ToString()); | ||||
|                 _noticeHandler?.SendMessage(ResUI.BatchExportURLSuccessfully); | ||||
|             } | ||||
|         } | ||||
|  | @ -1307,7 +1307,7 @@ namespace v2rayN.ViewModels | |||
|             foreach (var it in lstSelecteds) | ||||
|             { | ||||
|                 string? url = ShareHandler.GetShareUrl(it); | ||||
|                 if (Utils.IsNullOrEmpty(url)) | ||||
|                 if (Utile.IsNullOrEmpty(url)) | ||||
|                 { | ||||
|                     continue; | ||||
|                 } | ||||
|  | @ -1316,7 +1316,7 @@ namespace v2rayN.ViewModels | |||
|             } | ||||
|             if (sb.Length > 0) | ||||
|             { | ||||
|                 Utils.SetClipboardData(Utils.Base64Encode(sb.ToString())); | ||||
|                 Utile.SetClipboardData(Utile.Base64Encode(sb.ToString())); | ||||
|                 _noticeHandler?.SendMessage(ResUI.BatchExportSubscriptionSuccessfully); | ||||
|             } | ||||
|         } | ||||
|  | @ -1403,8 +1403,8 @@ namespace v2rayN.ViewModels | |||
|             { | ||||
|                 UseShellExecute = true, | ||||
|                 Arguments = Global.RebootAs, | ||||
|                 WorkingDirectory = Utils.StartupPath(), | ||||
|                 FileName = Utils.GetExePath().AppendQuotes(), | ||||
|                 WorkingDirectory = Utile.StartupPath(), | ||||
|                 FileName = Utile.GetExePath().AppendQuotes(), | ||||
|                 Verb = "runas", | ||||
|             }; | ||||
|             try | ||||
|  | @ -1422,7 +1422,7 @@ namespace v2rayN.ViewModels | |||
|             { | ||||
|                 return; | ||||
|             } | ||||
|             if (Utils.IsNullOrEmpty(fileName)) | ||||
|             if (Utile.IsNullOrEmpty(fileName)) | ||||
|             { | ||||
|                 return; | ||||
|             } | ||||
|  | @ -1468,8 +1468,8 @@ namespace v2rayN.ViewModels | |||
|                 { | ||||
|                     CloseV2ray(); | ||||
| 
 | ||||
|                     string fileName = Utils.GetTempPath(Utils.GetDownloadFileName(msg)); | ||||
|                     string toPath = Utils.GetBinPath("", type.ToString()); | ||||
|                     string fileName = Utile.GetTempPath(Utile.GetDownloadFileName(msg)); | ||||
|                     string toPath = Utile.GetBinPath("", type.ToString()); | ||||
| 
 | ||||
|                     FileManager.ZipExtractToFile(fileName, toPath, _config.guiItem.ignoreGeoUpdateCore ? "geo" : ""); | ||||
| 
 | ||||
|  | @ -1562,7 +1562,7 @@ namespace v2rayN.ViewModels | |||
|                 BlSystemProxyNothing = (type == ESysProxyType.Unchanged); | ||||
|                 BlSystemProxyPac = (type == ESysProxyType.Pac); | ||||
| 
 | ||||
|                 InboundDisplayStaus(); | ||||
|                 InboundDisplayStatus(); | ||||
| 
 | ||||
|                 if (blChange) | ||||
|                 { | ||||
|  | @ -1643,7 +1643,7 @@ namespace v2rayN.ViewModels | |||
|             { | ||||
|                 _config.tunModeItem.enableTun = EnableTun; | ||||
|                 // When running as a non-administrator, reboot to administrator mode | ||||
|                 if (EnableTun && !Utils.IsAdministrator()) | ||||
|                 if (EnableTun && !Utile.IsAdministrator()) | ||||
|                 { | ||||
|                     _config.tunModeItem.enableTun = false; | ||||
|                     RebootAsAdmin(); | ||||
|  | @ -1676,7 +1676,7 @@ namespace v2rayN.ViewModels | |||
|                 Application.Current.MainWindow.Hide(); | ||||
|                 //Application.Current.MainWindow.ShowInTaskbar = false; | ||||
|                 //IntPtr windowHandle = new WindowInteropHelper(Application.Current.MainWindow).Handle; | ||||
|                 //Utils.RegWriteValue(Global.MyRegPath, Utils.WindowHwndKey, Convert.ToString((long)windowHandle)); | ||||
|                 //Utile.RegWriteValue(Global.MyRegPath, Utile.WindowHwndKey, Convert.ToString((long)windowHandle)); | ||||
|             } | ||||
|             _showInTaskbar = bl; | ||||
|         } | ||||
|  | @ -1685,7 +1685,7 @@ namespace v2rayN.ViewModels | |||
|         { | ||||
|             if (FollowSystemTheme) | ||||
|             { | ||||
|                 ModifyTheme(!Utils.IsLightTheme()); | ||||
|                 ModifyTheme(!Utile.IsLightTheme()); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|  | @ -1743,7 +1743,7 @@ namespace v2rayN.ViewModels | |||
|                             ConfigHandler.SaveConfig(_config); | ||||
|                             if (FollowSystemTheme) | ||||
|                             { | ||||
|                                 ModifyTheme(!Utils.IsLightTheme()); | ||||
|                                 ModifyTheme(!Utile.IsLightTheme()); | ||||
|                             } | ||||
|                             else | ||||
|                             { | ||||
|  | @ -1795,7 +1795,7 @@ namespace v2rayN.ViewModels | |||
|              y => y != null && !y.IsNullOrEmpty()) | ||||
|                 .Subscribe(c => | ||||
|                 { | ||||
|                     if (!Utils.IsNullOrEmpty(CurrentLanguage)) | ||||
|                     if (!Utile.IsNullOrEmpty(CurrentLanguage)) | ||||
|                     { | ||||
|                         _config.uiItem.currentLanguage = CurrentLanguage; | ||||
|                         Thread.CurrentThread.CurrentUICulture = new(CurrentLanguage); | ||||
|  | @ -1804,7 +1804,7 @@ namespace v2rayN.ViewModels | |||
|                 }); | ||||
|         } | ||||
| 
 | ||||
|         public void InboundDisplayStaus() | ||||
|         public void InboundDisplayStatus() | ||||
|         { | ||||
|             StringBuilder sb = new(); | ||||
|             sb.Append($"[{Global.InboundSocks}:{LazyConfig.Instance.GetLocalPort(Global.InboundSocks)}]"); | ||||
|  | @ -1847,7 +1847,7 @@ namespace v2rayN.ViewModels | |||
|             theme.SetBaseTheme(isDarkTheme ? Theme.Dark : Theme.Light); | ||||
|             _paletteHelper.SetTheme(theme); | ||||
| 
 | ||||
|             Utils.SetDarkBorder(Application.Current.MainWindow, isDarkTheme); | ||||
|             Utile.SetDarkBorder(Application.Current.MainWindow, isDarkTheme); | ||||
|         } | ||||
| 
 | ||||
|         public void ChangePrimaryColor(System.Windows.Media.Color color) | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ using Splat; | |||
| using System.Reactive; | ||||
| using System.Windows; | ||||
| using v2rayN.Handler; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| using v2rayN.Resx; | ||||
| 
 | ||||
| namespace v2rayN.ViewModels | ||||
|  | @ -192,7 +192,7 @@ namespace v2rayN.ViewModels | |||
|                 SaveSetting(); | ||||
|             }); | ||||
| 
 | ||||
|             Utils.SetDarkBorder(view, _config.uiItem.colorModeDark); | ||||
|             Utile.SetDarkBorder(view, _config.uiItem.colorModeDark); | ||||
|         } | ||||
| 
 | ||||
|         private void InitCoreType() | ||||
|  | @ -249,19 +249,19 @@ namespace v2rayN.ViewModels | |||
| 
 | ||||
|         private void SaveSetting() | ||||
|         { | ||||
|             if (Utils.IsNullOrEmpty(localPort.ToString()) || !Utils.IsNumberic(localPort.ToString()) | ||||
|             if (Utile.IsNullOrEmpty(localPort.ToString()) || !Utile.IsNumeric(localPort.ToString()) | ||||
|                || localPort <= 0 || localPort >= Global.MaxPort) | ||||
|             { | ||||
|                 UI.Show(ResUI.FillLocalListeningPort); | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             //if (Utils.IsNullOrEmpty(Kcpmtu.ToString()) || !Utils.IsNumberic(Kcpmtu.ToString()) | ||||
|             //       || Utils.IsNullOrEmpty(Kcptti.ToString()) || !Utils.IsNumberic(Kcptti.ToString()) | ||||
|             //       || Utils.IsNullOrEmpty(KcpuplinkCapacity.ToString()) || !Utils.IsNumberic(KcpuplinkCapacity.ToString()) | ||||
|             //       || Utils.IsNullOrEmpty(KcpdownlinkCapacity.ToString()) || !Utils.IsNumberic(KcpdownlinkCapacity.ToString()) | ||||
|             //       || Utils.IsNullOrEmpty(KcpreadBufferSize.ToString()) || !Utils.IsNumberic(KcpreadBufferSize.ToString()) | ||||
|             //       || Utils.IsNullOrEmpty(KcpwriteBufferSize.ToString()) || !Utils.IsNumberic(KcpwriteBufferSize.ToString())) | ||||
|             //if (Utile.IsNullOrEmpty(Kcpmtu.ToString()) || !Utile.IsNumeric(Kcpmtu.ToString()) | ||||
|             //       || Utile.IsNullOrEmpty(Kcptti.ToString()) || !Utile.IsNumeric(Kcptti.ToString()) | ||||
|             //       || Utile.IsNullOrEmpty(KcpuplinkCapacity.ToString()) || !Utile.IsNumeric(KcpuplinkCapacity.ToString()) | ||||
|             //       || Utile.IsNullOrEmpty(KcpdownlinkCapacity.ToString()) || !Utile.IsNumeric(KcpdownlinkCapacity.ToString()) | ||||
|             //       || Utile.IsNullOrEmpty(KcpreadBufferSize.ToString()) || !Utile.IsNumeric(KcpreadBufferSize.ToString()) | ||||
|             //       || Utile.IsNullOrEmpty(KcpwriteBufferSize.ToString()) || !Utile.IsNumeric(KcpwriteBufferSize.ToString())) | ||||
|             //{ | ||||
|             //    UI.Show(ResUI.FillKcpParameters); | ||||
|             //    return; | ||||
|  | @ -300,7 +300,7 @@ namespace v2rayN.ViewModels | |||
|             //_config.kcpItem.congestion = Kcpcongestion; | ||||
| 
 | ||||
|             //UI | ||||
|             Utils.SetAutoRun(Global.AutoRunRegPath, Global.AutoRunName, AutoRun); | ||||
|             Utile.SetAutoRun(Global.AutoRunRegPath, Global.AutoRunName, AutoRun); | ||||
|             _config.guiItem.autoRun = AutoRun; | ||||
|             _config.guiItem.enableStatistics = EnableStatistics; | ||||
|             _config.guiItem.keepOlderDedupl = KeepOlderDedupl; | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ using Splat; | |||
| using System.Reactive; | ||||
| using System.Windows; | ||||
| using v2rayN.Handler; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| using v2rayN.Resx; | ||||
| 
 | ||||
| namespace v2rayN.ViewModels | ||||
|  | @ -43,7 +43,7 @@ namespace v2rayN.ViewModels | |||
| 
 | ||||
|             if (rulesItem.id.IsNullOrEmpty()) | ||||
|             { | ||||
|                 rulesItem.id = Utils.GetGUID(false); | ||||
|                 rulesItem.id = Utile.GetGUID(false); | ||||
|                 rulesItem.outboundTag = Global.ProxyTag; | ||||
|                 rulesItem.enabled = true; | ||||
|                 SelectedSource = rulesItem; | ||||
|  | @ -53,35 +53,35 @@ namespace v2rayN.ViewModels | |||
|                 SelectedSource = rulesItem; | ||||
|             } | ||||
| 
 | ||||
|             Domain = Utils.List2String(SelectedSource.domain, true); | ||||
|             IP = Utils.List2String(SelectedSource.ip, true); | ||||
|             Process = Utils.List2String(SelectedSource.process, true); | ||||
|             Domain = Utile.List2String(SelectedSource.domain, true); | ||||
|             IP = Utile.List2String(SelectedSource.ip, true); | ||||
|             Process = Utile.List2String(SelectedSource.process, true); | ||||
| 
 | ||||
|             SaveCmd = ReactiveCommand.Create(() => | ||||
|             { | ||||
|                 SaveRules(); | ||||
|             }); | ||||
| 
 | ||||
|             Utils.SetDarkBorder(view, _config.uiItem.colorModeDark); | ||||
|             Utile.SetDarkBorder(view, _config.uiItem.colorModeDark); | ||||
|         } | ||||
| 
 | ||||
|         private void SaveRules() | ||||
|         { | ||||
|             Domain = Utils.Convert2Comma(Domain); | ||||
|             IP = Utils.Convert2Comma(IP); | ||||
|             Process = Utils.Convert2Comma(Process); | ||||
|             Domain = Utile.Convert2Comma(Domain); | ||||
|             IP = Utile.Convert2Comma(IP); | ||||
|             Process = Utile.Convert2Comma(Process); | ||||
| 
 | ||||
|             if (AutoSort) | ||||
|             { | ||||
|                 SelectedSource.domain = Utils.String2ListSorted(Domain); | ||||
|                 SelectedSource.ip = Utils.String2ListSorted(IP); | ||||
|                 SelectedSource.process = Utils.String2ListSorted(Process); | ||||
|                 SelectedSource.domain = Utile.String2ListSorted(Domain); | ||||
|                 SelectedSource.ip = Utile.String2ListSorted(IP); | ||||
|                 SelectedSource.process = Utile.String2ListSorted(Process); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 SelectedSource.domain = Utils.String2List(Domain); | ||||
|                 SelectedSource.ip = Utils.String2List(IP); | ||||
|                 SelectedSource.process = Utils.String2List(Process); | ||||
|                 SelectedSource.domain = Utile.String2List(Domain); | ||||
|                 SelectedSource.ip = Utile.String2List(IP); | ||||
|                 SelectedSource.process = Utile.String2List(Process); | ||||
|             } | ||||
|             SelectedSource.protocol = ProtocolItems?.ToList(); | ||||
|             SelectedSource.inboundTag = InboundTagItems?.ToList(); | ||||
|  | @ -90,7 +90,7 @@ namespace v2rayN.ViewModels | |||
|               || SelectedSource.ip?.Count > 0 | ||||
|               || SelectedSource.protocol?.Count > 0 | ||||
|               || SelectedSource.process?.Count > 0 | ||||
|               || !Utils.IsNullOrEmpty(SelectedSource.port); | ||||
|               || !Utile.IsNullOrEmpty(SelectedSource.port); | ||||
| 
 | ||||
|             if (!hasRule) | ||||
|             { | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ using Splat; | |||
| using System.Reactive; | ||||
| using System.Windows; | ||||
| using v2rayN.Handler; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| using v2rayN.Resx; | ||||
| using v2rayN.Views; | ||||
| using Application = System.Windows.Application; | ||||
|  | @ -58,7 +58,7 @@ namespace v2rayN.ViewModels | |||
|             else | ||||
|             { | ||||
|                 SelectedRouting = routingItem; | ||||
|                 _rules = JsonUtils.Deserialize<List<RulesItem>>(SelectedRouting.ruleSet); | ||||
|                 _rules = JsonUtile.Deserialize<List<RulesItem>>(SelectedRouting.ruleSet); | ||||
|             } | ||||
| 
 | ||||
|             RefreshRulesItems(); | ||||
|  | @ -115,7 +115,7 @@ namespace v2rayN.ViewModels | |||
|                 SaveRouting(); | ||||
|             }); | ||||
| 
 | ||||
|             Utils.SetDarkBorder(view, _config.uiItem.colorModeDark); | ||||
|             Utile.SetDarkBorder(view, _config.uiItem.colorModeDark); | ||||
|         } | ||||
| 
 | ||||
|         public void RefreshRulesItems() | ||||
|  | @ -129,10 +129,10 @@ namespace v2rayN.ViewModels | |||
|                     id = item.id, | ||||
|                     outboundTag = item.outboundTag, | ||||
|                     port = item.port, | ||||
|                     protocols = Utils.List2String(item.protocol), | ||||
|                     inboundTags = Utils.List2String(item.inboundTag), | ||||
|                     domains = Utils.List2String(item.domain), | ||||
|                     ips = Utils.List2String(item.ip), | ||||
|                     protocols = Utile.List2String(item.protocol), | ||||
|                     inboundTags = Utile.List2String(item.inboundTag), | ||||
|                     domains = Utile.List2String(item.domain), | ||||
|                     ips = Utile.List2String(item.ip), | ||||
|                     enabled = item.enabled, | ||||
|                 }; | ||||
|                 _rulesItems.Add(it); | ||||
|  | @ -207,7 +207,7 @@ namespace v2rayN.ViewModels | |||
|             } | ||||
|             if (lst.Count > 0) | ||||
|             { | ||||
|                 Utils.SetClipboardData(JsonUtils.Serialize(lst)); | ||||
|                 Utile.SetClipboardData(JsonUtile.Serialize(lst)); | ||||
|                 //UI.Show(ResUI.OperationSuccess")); | ||||
|             } | ||||
|         } | ||||
|  | @ -235,7 +235,7 @@ namespace v2rayN.ViewModels | |||
|         private void SaveRouting() | ||||
|         { | ||||
|             string remarks = SelectedRouting.remarks; | ||||
|             if (Utils.IsNullOrEmpty(remarks)) | ||||
|             if (Utile.IsNullOrEmpty(remarks)) | ||||
|             { | ||||
|                 UI.Show(ResUI.PleaseFillRemarks); | ||||
|                 return; | ||||
|  | @ -243,10 +243,10 @@ namespace v2rayN.ViewModels | |||
|             var item = SelectedRouting; | ||||
|             foreach (var it in _rules) | ||||
|             { | ||||
|                 it.id = Utils.GetGUID(false); | ||||
|                 it.id = Utile.GetGUID(false); | ||||
|             } | ||||
|             item.ruleNum = _rules.Count; | ||||
|             item.ruleSet = JsonUtils.Serialize(_rules, false); | ||||
|             item.ruleSet = JsonUtile.Serialize(_rules, false); | ||||
| 
 | ||||
|             if (ConfigHandler.SaveRoutingItem(_config, item) == 0) | ||||
|             { | ||||
|  | @ -268,13 +268,13 @@ namespace v2rayN.ViewModels | |||
|             { | ||||
|                 return; | ||||
|             } | ||||
|             if (Utils.IsNullOrEmpty(fileName)) | ||||
|             if (Utile.IsNullOrEmpty(fileName)) | ||||
|             { | ||||
|                 return; | ||||
|             } | ||||
| 
 | ||||
|             string result = Utils.LoadResource(fileName); | ||||
|             if (Utils.IsNullOrEmpty(result)) | ||||
|             string result = Utile.LoadResource(fileName); | ||||
|             if (Utile.IsNullOrEmpty(result)) | ||||
|             { | ||||
|                 return; | ||||
|             } | ||||
|  | @ -288,7 +288,7 @@ namespace v2rayN.ViewModels | |||
| 
 | ||||
|         private void ImportRulesFromClipboard() | ||||
|         { | ||||
|             string clipboardData = Utils.GetClipboardData(); | ||||
|             string clipboardData = Utile.GetClipboardData(); | ||||
|             if (AddBatchRoutingRules(SelectedRouting, clipboardData) == 0) | ||||
|             { | ||||
|                 RefreshRulesItems(); | ||||
|  | @ -299,7 +299,7 @@ namespace v2rayN.ViewModels | |||
|         private async Task ImportRulesFromUrl() | ||||
|         { | ||||
|             var url = SelectedRouting.url; | ||||
|             if (Utils.IsNullOrEmpty(url)) | ||||
|             if (Utile.IsNullOrEmpty(url)) | ||||
|             { | ||||
|                 UI.Show(ResUI.MsgNeedUrl); | ||||
|                 return; | ||||
|  | @ -324,18 +324,18 @@ namespace v2rayN.ViewModels | |||
|             { | ||||
|                 blReplace = true; | ||||
|             } | ||||
|             if (Utils.IsNullOrEmpty(clipboardData)) | ||||
|             if (Utile.IsNullOrEmpty(clipboardData)) | ||||
|             { | ||||
|                 return -1; | ||||
|             } | ||||
|             var lstRules = JsonUtils.Deserialize<List<RulesItem>>(clipboardData); | ||||
|             var lstRules = JsonUtile.Deserialize<List<RulesItem>>(clipboardData); | ||||
|             if (lstRules == null) | ||||
|             { | ||||
|                 return -1; | ||||
|             } | ||||
|             foreach (var rule in lstRules) | ||||
|             { | ||||
|                 rule.id = Utils.GetGUID(false); | ||||
|                 rule.id = Utile.GetGUID(false); | ||||
|             } | ||||
| 
 | ||||
|             if (blReplace) | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ using Splat; | |||
| using System.Reactive; | ||||
| using System.Windows; | ||||
| using v2rayN.Handler; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| using v2rayN.Resx; | ||||
| using v2rayN.Views; | ||||
| 
 | ||||
|  | @ -126,7 +126,7 @@ namespace v2rayN.ViewModels | |||
|                 SaveRouting(); | ||||
|             }); | ||||
| 
 | ||||
|             Utils.SetDarkBorder(view, _config.uiItem.colorModeDark); | ||||
|             Utile.SetDarkBorder(view, _config.uiItem.colorModeDark); | ||||
|         } | ||||
| 
 | ||||
|         #region locked | ||||
|  | @ -136,15 +136,15 @@ namespace v2rayN.ViewModels | |||
|             _lockedItem = ConfigHandler.GetLockedRoutingItem(_config); | ||||
|             if (_lockedItem != null) | ||||
|             { | ||||
|                 _lockedRules = JsonUtils.Deserialize<List<RulesItem>>(_lockedItem.ruleSet); | ||||
|                 ProxyDomain = Utils.List2String(_lockedRules[0].domain, true); | ||||
|                 ProxyIP = Utils.List2String(_lockedRules[0].ip, true); | ||||
|                 _lockedRules = JsonUtile.Deserialize<List<RulesItem>>(_lockedItem.ruleSet); | ||||
|                 ProxyDomain = Utile.List2String(_lockedRules[0].domain, true); | ||||
|                 ProxyIP = Utile.List2String(_lockedRules[0].ip, true); | ||||
| 
 | ||||
|                 DirectDomain = Utils.List2String(_lockedRules[1].domain, true); | ||||
|                 DirectIP = Utils.List2String(_lockedRules[1].ip, true); | ||||
|                 DirectDomain = Utile.List2String(_lockedRules[1].domain, true); | ||||
|                 DirectIP = Utile.List2String(_lockedRules[1].ip, true); | ||||
| 
 | ||||
|                 BlockDomain = Utils.List2String(_lockedRules[2].domain, true); | ||||
|                 BlockIP = Utils.List2String(_lockedRules[2].ip, true); | ||||
|                 BlockDomain = Utile.List2String(_lockedRules[2].domain, true); | ||||
|                 BlockIP = Utile.List2String(_lockedRules[2].ip, true); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|  | @ -152,16 +152,16 @@ namespace v2rayN.ViewModels | |||
|         { | ||||
|             if (_lockedItem != null) | ||||
|             { | ||||
|                 _lockedRules[0].domain = Utils.String2List(Utils.Convert2Comma(ProxyDomain.TrimEx())); | ||||
|                 _lockedRules[0].ip = Utils.String2List(Utils.Convert2Comma(ProxyIP.TrimEx())); | ||||
|                 _lockedRules[0].domain = Utile.String2List(Utile.Convert2Comma(ProxyDomain.TrimEx())); | ||||
|                 _lockedRules[0].ip = Utile.String2List(Utile.Convert2Comma(ProxyIP.TrimEx())); | ||||
| 
 | ||||
|                 _lockedRules[1].domain = Utils.String2List(Utils.Convert2Comma(DirectDomain.TrimEx())); | ||||
|                 _lockedRules[1].ip = Utils.String2List(Utils.Convert2Comma(DirectIP.TrimEx())); | ||||
|                 _lockedRules[1].domain = Utile.String2List(Utile.Convert2Comma(DirectDomain.TrimEx())); | ||||
|                 _lockedRules[1].ip = Utile.String2List(Utile.Convert2Comma(DirectIP.TrimEx())); | ||||
| 
 | ||||
|                 _lockedRules[2].domain = Utils.String2List(Utils.Convert2Comma(BlockDomain.TrimEx())); | ||||
|                 _lockedRules[2].ip = Utils.String2List(Utils.Convert2Comma(BlockIP.TrimEx())); | ||||
|                 _lockedRules[2].domain = Utile.String2List(Utile.Convert2Comma(BlockDomain.TrimEx())); | ||||
|                 _lockedRules[2].ip = Utile.String2List(Utile.Convert2Comma(BlockIP.TrimEx())); | ||||
| 
 | ||||
|                 _lockedItem.ruleSet = JsonUtils.Serialize(_lockedRules, false); | ||||
|                 _lockedItem.ruleSet = JsonUtile.Serialize(_lockedRules, false); | ||||
| 
 | ||||
|                 ConfigHandler.SaveRoutingItem(_config, _lockedItem); | ||||
|             } | ||||
|  |  | |||
|  | @ -4,7 +4,7 @@ using Splat; | |||
| using System.Reactive; | ||||
| using System.Windows; | ||||
| using v2rayN.Handler; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| using v2rayN.Resx; | ||||
| 
 | ||||
| namespace v2rayN.ViewModels | ||||
|  | @ -32,7 +32,7 @@ namespace v2rayN.ViewModels | |||
|             } | ||||
|             else | ||||
|             { | ||||
|                 SelectedSource = JsonUtils.DeepCopy(subItem); | ||||
|                 SelectedSource = JsonUtile.DeepCopy(subItem); | ||||
|             } | ||||
| 
 | ||||
|             SaveCmd = ReactiveCommand.Create(() => | ||||
|  | @ -40,7 +40,7 @@ namespace v2rayN.ViewModels | |||
|                 SaveSub(); | ||||
|             }); | ||||
| 
 | ||||
|             Utils.SetDarkBorder(view, _config.uiItem.colorModeDark); | ||||
|             Utile.SetDarkBorder(view, _config.uiItem.colorModeDark); | ||||
|         } | ||||
| 
 | ||||
|         private void SaveSub() | ||||
|  |  | |||
|  | @ -7,7 +7,7 @@ using Splat; | |||
| using System.Reactive; | ||||
| using System.Windows; | ||||
| using v2rayN.Handler; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| using v2rayN.Resx; | ||||
| using v2rayN.Views; | ||||
| 
 | ||||
|  | @ -62,7 +62,7 @@ namespace v2rayN.ViewModels | |||
|                 SubShare(); | ||||
|             }, canEditRemove); | ||||
| 
 | ||||
|             Utils.SetDarkBorder(view, _config.uiItem.colorModeDark); | ||||
|             Utile.SetDarkBorder(view, _config.uiItem.colorModeDark); | ||||
|         } | ||||
| 
 | ||||
|         public void RefreshSubItems() | ||||
|  | @ -112,7 +112,7 @@ namespace v2rayN.ViewModels | |||
| 
 | ||||
|         private async void SubShare() | ||||
|         { | ||||
|             if (Utils.IsNullOrEmpty(SelectedSource?.url)) | ||||
|             if (Utile.IsNullOrEmpty(SelectedSource?.url)) | ||||
|             { | ||||
|                 return; | ||||
|             } | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| using ReactiveUI; | ||||
| using System.Reactive.Disposables; | ||||
| using System.Windows; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| using v2rayN.ViewModels; | ||||
| 
 | ||||
| namespace v2rayN.Views | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ using System.Reactive.Disposables; | |||
| using System.Windows; | ||||
| using System.Windows.Controls; | ||||
| using v2rayN.Handler; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| using v2rayN.Resx; | ||||
| using v2rayN.ViewModels; | ||||
| 
 | ||||
|  | @ -60,7 +60,7 @@ namespace v2rayN.Views | |||
|                 cmbFingerprint.Items.Add(it); | ||||
|                 cmbFingerprint2.Items.Add(it); | ||||
|             }); | ||||
|             Global.AllowInsecures.ForEach(it => | ||||
|             Global.AllowInsecure.ForEach(it => | ||||
|             { | ||||
|                 cmbAllowInsecure.Items.Add(it); | ||||
|             }); | ||||
|  | @ -73,7 +73,7 @@ namespace v2rayN.Views | |||
|             { | ||||
|                 case EConfigType.VMess: | ||||
|                     gridVMess.Visibility = Visibility.Visible; | ||||
|                     Global.VmessSecuritys.ForEach(it => | ||||
|                     Global.VmessSecurities.ForEach(it => | ||||
|                     { | ||||
|                         cmbSecurity.Items.Add(it); | ||||
|                     }); | ||||
|  | @ -85,7 +85,7 @@ namespace v2rayN.Views | |||
| 
 | ||||
|                 case EConfigType.Shadowsocks: | ||||
|                     gridSs.Visibility = Visibility.Visible; | ||||
|                     LazyConfig.Instance.GetShadowsocksSecuritys(profileItem).ForEach(it => | ||||
|                     LazyConfig.Instance.GetShadowsocksSecurities(profileItem).ForEach(it => | ||||
|                     { | ||||
|                         cmbSecurity3.Items.Add(it); | ||||
|                     }); | ||||
|  | @ -265,7 +265,7 @@ namespace v2rayN.Views | |||
|         private void btnGUID_Click(object sender, RoutedEventArgs e) | ||||
|         { | ||||
|             txtId.Text = | ||||
|             txtId5.Text = Utils.GetGUID(); | ||||
|             txtId5.Text = Utile.GetGUID(); | ||||
|         } | ||||
| 
 | ||||
|         private void SetHeaderType() | ||||
|  | @ -273,7 +273,7 @@ namespace v2rayN.Views | |||
|             cmbHeaderType.Items.Clear(); | ||||
| 
 | ||||
|             var network = cmbNetwork.SelectedItem.ToString(); | ||||
|             if (Utils.IsNullOrEmpty(network)) | ||||
|             if (Utile.IsNullOrEmpty(network)) | ||||
|             { | ||||
|                 cmbHeaderType.Items.Add(Global.None); | ||||
|                 return; | ||||
|  | @ -294,8 +294,8 @@ namespace v2rayN.Views | |||
|             } | ||||
|             else if (network == "grpc") | ||||
|             { | ||||
|                 cmbHeaderType.Items.Add(Global.GrpcgunMode); | ||||
|                 cmbHeaderType.Items.Add(Global.GrpcmultiMode); | ||||
|                 cmbHeaderType.Items.Add(Global.GrpcGunMode); | ||||
|                 cmbHeaderType.Items.Add(Global.GrpcMultiMode); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|  | @ -307,7 +307,7 @@ namespace v2rayN.Views | |||
|         private void SetTips() | ||||
|         { | ||||
|             var network = cmbNetwork.SelectedItem.ToString(); | ||||
|             if (Utils.IsNullOrEmpty(network)) | ||||
|             if (Utile.IsNullOrEmpty(network)) | ||||
|             { | ||||
|                 network = Global.DefaultNetwork; | ||||
|             } | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
| using System.Reactive.Disposables; | ||||
| using System.Windows; | ||||
| using v2rayN.Handler; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| using v2rayN.ViewModels; | ||||
| 
 | ||||
| namespace v2rayN.Views | ||||
|  | @ -51,12 +51,12 @@ namespace v2rayN.Views | |||
| 
 | ||||
|         private void linkDnsObjectDoc_Click(object sender, RoutedEventArgs e) | ||||
|         { | ||||
|             Utils.ProcessStart("https://www.v2fly.org/config/dns.html#dnsobject"); | ||||
|             Utile.ProcessStart("https://www.v2fly.org/config/dns.html#dnsobject"); | ||||
|         } | ||||
| 
 | ||||
|         private void linkDnsSingboxObjectDoc_Click(object sender, RoutedEventArgs e) | ||||
|         { | ||||
|             Utils.ProcessStart("https://sing-box.sagernet.org/zh/configuration/dns/"); | ||||
|             Utile.ProcessStart("https://sing-box.sagernet.org/zh/configuration/dns/"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -3,7 +3,7 @@ using System.Windows; | |||
| using System.Windows.Controls; | ||||
| using System.Windows.Input; | ||||
| using v2rayN.Handler; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| using v2rayN.Resx; | ||||
| 
 | ||||
| namespace v2rayN.Views | ||||
|  | @ -39,7 +39,7 @@ namespace v2rayN.Views | |||
| 
 | ||||
|             HotkeyHandler.Instance.IsPause = true; | ||||
|             this.Closing += (s, e) => HotkeyHandler.Instance.IsPause = false; | ||||
|             Utils.SetDarkBorder(this, _config.uiItem.colorModeDark); | ||||
|             Utile.SetDarkBorder(this, _config.uiItem.colorModeDark); | ||||
|             InitData(); | ||||
|         } | ||||
| 
 | ||||
|  | @ -68,9 +68,9 @@ namespace v2rayN.Views | |||
|             (sender as TextBox)!.Text = KeyEventItemToString(_TextBoxKeyEventItem[sender]); | ||||
|         } | ||||
| 
 | ||||
|         private KeyEventItem GetKeyEventItemByEGlobalHotkey(List<KeyEventItem> KELsit, EGlobalHotkey eg) | ||||
|         private KeyEventItem GetKeyEventItemByEGlobalHotkey(List<KeyEventItem> KEList, EGlobalHotkey eg) | ||||
|         { | ||||
|             return JsonUtils.DeepCopy(KELsit.Find((it) => it.eGlobalHotkey == eg) ?? new() | ||||
|             return JsonUtile.DeepCopy(KEList.Find((it) => it.eGlobalHotkey == eg) ?? new() | ||||
|             { | ||||
|                 eGlobalHotkey = eg, | ||||
|                 Control = false, | ||||
|  |  | |||
|  | @ -11,7 +11,7 @@ using System.Windows.Interop; | |||
| using System.Windows.Media; | ||||
| using v2rayN.Base; | ||||
| using v2rayN.Handler; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| using v2rayN.Resx; | ||||
| using v2rayN.ViewModels; | ||||
| using Point = System.Windows.Point; | ||||
|  | @ -139,7 +139,7 @@ namespace v2rayN.Views | |||
|                 this.BindCommand(ViewModel, vm => vm.ClearServerStatisticsCmd, v => v.menuClearServerStatistics).DisposeWith(disposables); | ||||
|                 this.BindCommand(ViewModel, vm => vm.ImportOldGuiConfigCmd, v => v.menuImportOldGuiConfig).DisposeWith(disposables); | ||||
| 
 | ||||
|                 //checkupdate | ||||
|                 //check update | ||||
|                 this.BindCommand(ViewModel, vm => vm.CheckUpdateNCmd, v => v.menuCheckUpdateN).DisposeWith(disposables); | ||||
|                 //this.BindCommand(ViewModel, vm => vm.CheckUpdateV2flyCoreCmd, v => v.menuCheckUpdateV2flyCore).DisposeWith(disposables); | ||||
|                 //this.BindCommand(ViewModel, vm => vm.CheckUpdateSagerNetCoreCmd, v => v.menuCheckUpdateSagerNetCore).DisposeWith(disposables); | ||||
|  | @ -210,8 +210,8 @@ namespace v2rayN.Views | |||
|             RestoreUI(); | ||||
|             AddHelpMenuItem(); | ||||
| 
 | ||||
|             var IsAdministrator = Utils.IsAdministrator(); | ||||
|             this.Title = $"{Utils.GetVersion()} - {(IsAdministrator ? ResUI.RunAsAdmin : ResUI.NotRunAsAdmin)}"; | ||||
|             var IsAdministrator = Utile.IsAdministrator(); | ||||
|             this.Title = $"{Utile.GetVersion()} - {(IsAdministrator ? ResUI.RunAsAdmin : ResUI.NotRunAsAdmin)}"; | ||||
| 
 | ||||
|             //if (_config.uiItem.autoHideStartup) | ||||
|             //{ | ||||
|  | @ -234,7 +234,7 @@ namespace v2rayN.Views | |||
|                     { | ||||
|                         if (wParam == IntPtr.Zero && Marshal.PtrToStringUni(lParam) == "ImmersiveColorSet") | ||||
|                         { | ||||
|                             ViewModel?.ModifyTheme(!Utils.IsLightTheme()); | ||||
|                             ViewModel?.ModifyTheme(!Utile.IsLightTheme()); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|  | @ -417,7 +417,7 @@ namespace v2rayN.Views | |||
| 
 | ||||
|         private void menuPromotion_Click(object sender, RoutedEventArgs e) | ||||
|         { | ||||
|             Utils.ProcessStart($"{Utils.Base64Decode(Global.PromotionUrl)}?t={DateTime.Now.Ticks}"); | ||||
|             Utile.ProcessStart($"{Utile.Base64Decode(Global.PromotionUrl)}?t={DateTime.Now.Ticks}"); | ||||
|         } | ||||
| 
 | ||||
|         private void txtRunningInfoDisplay_MouseDoubleClick(object sender, MouseButtonEventArgs e) | ||||
|  | @ -427,7 +427,7 @@ namespace v2rayN.Views | |||
| 
 | ||||
|         private void menuSettingsSetUWP_Click(object sender, RoutedEventArgs e) | ||||
|         { | ||||
|             Utils.ProcessStart(Utils.GetBinPath("EnableLoopback.exe")); | ||||
|             Utile.ProcessStart(Utile.GetBinPath("EnableLoopback.exe")); | ||||
|         } | ||||
| 
 | ||||
|         private void BtnAutofitColumnWidth_Click(object sender, RoutedEventArgs e) | ||||
|  | @ -512,8 +512,8 @@ namespace v2rayN.Views | |||
| 
 | ||||
|         private void StorageUI() | ||||
|         { | ||||
|             _config.uiItem.mainWidth = Utils.ToInt(this.Width); | ||||
|             _config.uiItem.mainHeight = Utils.ToInt(this.Height); | ||||
|             _config.uiItem.mainWidth = Utile.ToInt(this.Width); | ||||
|             _config.uiItem.mainHeight = Utile.ToInt(this.Height); | ||||
| 
 | ||||
|             List<ColumnItem> lvColumnItem = new(); | ||||
|             for (int k = 0; k < lstProfiles.Columns.Count; k++) | ||||
|  | @ -522,7 +522,7 @@ namespace v2rayN.Views | |||
|                 lvColumnItem.Add(new() | ||||
|                 { | ||||
|                     Name = item2.ExName, | ||||
|                     Width = item2.Visibility == Visibility.Visible ? Utils.ToInt(item2.ActualWidth) : -1, | ||||
|                     Width = item2.Visibility == Visibility.Visible ? Utile.ToInt(item2.ActualWidth) : -1, | ||||
|                     Index = item2.DisplayIndex | ||||
|                 }); | ||||
|             } | ||||
|  | @ -534,8 +534,8 @@ namespace v2rayN.Views | |||
| 
 | ||||
|         private void AddHelpMenuItem() | ||||
|         { | ||||
|             var coreInfos = LazyConfig.Instance.GetCoreInfos(); | ||||
|             foreach (var it in coreInfos | ||||
|             var coreInfo = LazyConfig.Instance.GetCoreInfo(); | ||||
|             foreach (var it in coreInfo | ||||
|                 .Where(t => t.coreType != ECoreType.v2fly | ||||
|                             && t.coreType != ECoreType.clash | ||||
|                             && t.coreType != ECoreType.clash_meta | ||||
|  | @ -555,7 +555,7 @@ namespace v2rayN.Views | |||
|         { | ||||
|             if (sender is MenuItem item) | ||||
|             { | ||||
|                 Utils.ProcessStart(item.Tag.ToString()); | ||||
|                 Utile.ProcessStart(item.Tag.ToString()); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|  | @ -573,7 +573,7 @@ namespace v2rayN.Views | |||
|         /// <typeparam name="T"></typeparam> | ||||
|         /// <param name="current"></param> | ||||
|         /// <returns></returns> | ||||
|         private static T? FindAnchestor<T>(DependencyObject current) where T : DependencyObject | ||||
|         private static T? FindAncestor<T>(DependencyObject current) where T : DependencyObject | ||||
|         { | ||||
|             do | ||||
|             { | ||||
|  | @ -605,7 +605,7 @@ namespace v2rayN.Views | |||
|             { | ||||
|                 // Get the dragged Item | ||||
|                 if (sender is not DataGrid listView) return; | ||||
|                 var listViewItem = FindAnchestor<DataGridRow>((DependencyObject)e.OriginalSource); | ||||
|                 var listViewItem = FindAncestor<DataGridRow>((DependencyObject)e.OriginalSource); | ||||
|                 if (listViewItem == null) return;           // Abort | ||||
|                                                             // Find the data behind the ListViewItem | ||||
|                 ProfileItemModel item = (ProfileItemModel)listView.ItemContainerGenerator.ItemFromContainer(listViewItem); | ||||
|  | @ -631,7 +631,7 @@ namespace v2rayN.Views | |||
|             { | ||||
|                 // Get the drop Item destination | ||||
|                 if (sender is not DataGrid listView) return; | ||||
|                 var listViewItem = FindAnchestor<DataGridRow>((DependencyObject)e.OriginalSource); | ||||
|                 var listViewItem = FindAncestor<DataGridRow>((DependencyObject)e.OriginalSource); | ||||
|                 if (listViewItem == null) | ||||
|                 { | ||||
|                     // Abort | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ using System.Reactive.Linq; | |||
| using System.Text.RegularExpressions; | ||||
| using System.Windows.Threading; | ||||
| using v2rayN.Handler; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| 
 | ||||
| namespace v2rayN.Views | ||||
| { | ||||
|  | @ -99,13 +99,13 @@ namespace v2rayN.Views | |||
|         private void menuMsgViewCopy_Click(object sender, System.Windows.RoutedEventArgs e) | ||||
|         { | ||||
|             var data = txtMsg.SelectedText.TrimEx(); | ||||
|             Utils.SetClipboardData(data); | ||||
|             Utile.SetClipboardData(data); | ||||
|         } | ||||
| 
 | ||||
|         private void menuMsgViewCopyAll_Click(object sender, System.Windows.RoutedEventArgs e) | ||||
|         { | ||||
|             var data = txtMsg.Text; | ||||
|             Utils.SetClipboardData(data); | ||||
|             Utile.SetClipboardData(data); | ||||
|         } | ||||
| 
 | ||||
|         private void menuMsgViewClear_Click(object sender, System.Windows.RoutedEventArgs e) | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ using System.Reactive.Disposables; | |||
| using System.Windows; | ||||
| using System.Windows.Media; | ||||
| using v2rayN.Handler; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| using v2rayN.ViewModels; | ||||
| 
 | ||||
| namespace v2rayN.Views | ||||
|  | @ -96,13 +96,13 @@ namespace v2rayN.Views | |||
|                 var files = new List<string>(); | ||||
|                 foreach (var pattern in searchPatterns) | ||||
|                 { | ||||
|                     files.AddRange(Directory.GetFiles(Utils.GetFontsPath(), pattern)); | ||||
|                     files.AddRange(Directory.GetFiles(Utile.GetFontsPath(), pattern)); | ||||
|                 } | ||||
|                 var culture = _config.uiItem.currentLanguage == Global.Languages[0] ? "zh-cn" : "en-us"; | ||||
|                 var culture2 = "en-us"; | ||||
|                 foreach (var ttf in files) | ||||
|                 { | ||||
|                     var families = Fonts.GetFontFamilies(Utils.GetFontsPath(ttf)); | ||||
|                     var families = Fonts.GetFontFamilies(Utile.GetFontsPath(ttf)); | ||||
|                     foreach (FontFamily family in families) | ||||
|                     { | ||||
|                         var typefaces = family.GetTypefaces(); | ||||
|  | @ -115,10 +115,10 @@ namespace v2rayN.Views | |||
|                             //    continue; | ||||
|                             //} | ||||
|                             var fontFamily = glyph.Win32FamilyNames[new CultureInfo(culture)]; | ||||
|                             if (Utils.IsNullOrEmpty(fontFamily)) | ||||
|                             if (Utile.IsNullOrEmpty(fontFamily)) | ||||
|                             { | ||||
|                                 fontFamily = glyph.Win32FamilyNames[new CultureInfo(culture2)]; | ||||
|                                 if (Utils.IsNullOrEmpty(fontFamily)) | ||||
|                                 if (Utile.IsNullOrEmpty(fontFamily)) | ||||
|                                 { | ||||
|                                     continue; | ||||
|                                 } | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| using ReactiveUI; | ||||
| using System.Reactive.Disposables; | ||||
| using System.Windows; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| using v2rayN.ViewModels; | ||||
| 
 | ||||
| namespace v2rayN.Views | ||||
|  | @ -83,7 +83,7 @@ namespace v2rayN.Views | |||
| 
 | ||||
|         private void linkRuleobjectDoc_Click(object sender, RoutedEventArgs e) | ||||
|         { | ||||
|             Utils.ProcessStart("https://www.v2fly.org/config/routing.html#ruleobject"); | ||||
|             Utile.ProcessStart("https://www.v2fly.org/config/routing.html#ruleobject"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -2,7 +2,7 @@ | |||
| using System.Reactive.Disposables; | ||||
| using System.Windows; | ||||
| using System.Windows.Input; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| using v2rayN.ViewModels; | ||||
| 
 | ||||
| namespace v2rayN.Views | ||||
|  | @ -30,12 +30,12 @@ namespace v2rayN.Views | |||
|             lstRules.MouseDoubleClick += LstRules_MouseDoubleClick; | ||||
| 
 | ||||
|             ViewModel = new RoutingRuleSettingViewModel(routingItem, this); | ||||
|             Global.DomainStrategys.ForEach(it => | ||||
|             Global.DomainStrategies.ForEach(it => | ||||
|             { | ||||
|                 cmbdomainStrategy.Items.Add(it); | ||||
|             }); | ||||
|             cmbdomainStrategy.Items.Add(string.Empty); | ||||
|             Global.DomainStrategys4Singbox.ForEach(it => | ||||
|             Global.DomainStrategies4Singbox.ForEach(it => | ||||
|             { | ||||
|                 cmbdomainStrategy4Singbox.Items.Add(it); | ||||
|             }); | ||||
|  |  | |||
|  | @ -2,7 +2,7 @@ | |||
| using System.Reactive.Disposables; | ||||
| using System.Windows; | ||||
| using System.Windows.Input; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| using v2rayN.ViewModels; | ||||
| 
 | ||||
| namespace v2rayN.Views | ||||
|  | @ -31,7 +31,7 @@ namespace v2rayN.Views | |||
| 
 | ||||
|             ViewModel = new RoutingSettingViewModel(this); | ||||
| 
 | ||||
|             Global.DomainStrategys.ForEach(it => | ||||
|             Global.DomainStrategies.ForEach(it => | ||||
|             { | ||||
|                 cmbdomainStrategy.Items.Add(it); | ||||
|             }); | ||||
|  | @ -39,7 +39,7 @@ namespace v2rayN.Views | |||
|             { | ||||
|                 cmbdomainMatcher.Items.Add(it); | ||||
|             }); | ||||
|             Global.DomainStrategys4Singbox.ForEach(it => | ||||
|             Global.DomainStrategies4Singbox.ForEach(it => | ||||
|             { | ||||
|                 cmbdomainStrategy4Singbox.Items.Add(it); | ||||
|             }); | ||||
|  | @ -127,12 +127,12 @@ namespace v2rayN.Views | |||
| 
 | ||||
|         private void linkdomainStrategy_Click(object sender, System.Windows.RoutedEventArgs e) | ||||
|         { | ||||
|             Utils.ProcessStart("https://www.v2fly.org/config/routing.html"); | ||||
|             Utile.ProcessStart("https://www.v2fly.org/config/routing.html"); | ||||
|         } | ||||
| 
 | ||||
|         private void linkdomainStrategy4Singbox_Click(object sender, RoutedEventArgs e) | ||||
|         { | ||||
|             Utils.ProcessStart("https://sing-box.sagernet.org/zh/configuration/shared/listen/#domain_strategy"); | ||||
|             Utile.ProcessStart("https://sing-box.sagernet.org/zh/configuration/shared/listen/#domain_strategy"); | ||||
|         } | ||||
| 
 | ||||
|         private void btnCancel_Click(object sender, System.Windows.RoutedEventArgs e) | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| using ReactiveUI; | ||||
| using System.Reactive.Disposables; | ||||
| using System.Windows; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| using v2rayN.ViewModels; | ||||
| 
 | ||||
| namespace v2rayN.Views | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ using System.ComponentModel; | |||
| using System.Reactive.Disposables; | ||||
| using System.Windows; | ||||
| using System.Windows.Input; | ||||
| using v2rayN.Mode; | ||||
| using v2rayN.Model; | ||||
| using v2rayN.ViewModels; | ||||
| 
 | ||||
| namespace v2rayN.Views | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 NimaZare
						NimaZare