@@ -60,7 +60,7 @@ namespace Shadowsocks.Controller | |||||
else | else | ||||
{ | { | ||||
string pacUrl; | string pacUrl; | ||||
if (config.useOnlinePac && !string.IsNullOrEmpty(config.pacUrl)) | |||||
if (config.useOnlinePac && !config.pacUrl.IsNullOrEmpty()) | |||||
pacUrl = config.pacUrl; | pacUrl = config.pacUrl; | ||||
else | else | ||||
pacUrl = $"http://127.0.0.1:{config.localPort}/pac?t={GetTimestamp(DateTime.Now)}"; | pacUrl = $"http://127.0.0.1:{config.localPort}/pac?t={GetTimestamp(DateTime.Now)}"; | ||||
@@ -25,7 +25,7 @@ namespace Shadowsocks.Encryption | |||||
public static IEncryptor GetEncryptor(string method, string password, bool onetimeauth, bool isudp) | public static IEncryptor GetEncryptor(string method, string password, bool onetimeauth, bool isudp) | ||||
{ | { | ||||
if (string.IsNullOrEmpty(method)) | |||||
if (method.IsNullOrEmpty()) | |||||
{ | { | ||||
method = "aes-256-cfb"; | method = "aes-256-cfb"; | ||||
} | } | ||||
@@ -124,13 +124,13 @@ namespace Shadowsocks.Model | |||||
private static void CheckPassword(string password) | private static void CheckPassword(string password) | ||||
{ | { | ||||
if (string.IsNullOrEmpty(password)) | |||||
if (password.IsNullOrEmpty()) | |||||
throw new ArgumentException(I18N.GetString("Password can not be blank")); | throw new ArgumentException(I18N.GetString("Password can not be blank")); | ||||
} | } | ||||
private static void CheckServer(string server) | private static void CheckServer(string server) | ||||
{ | { | ||||
if (string.IsNullOrEmpty(server)) | |||||
if (server.IsNullOrEmpty()) | |||||
throw new ArgumentException(I18N.GetString("Server IP can not be blank")); | throw new ArgumentException(I18N.GetString("Server IP can not be blank")); | ||||
} | } | ||||
} | } | ||||
@@ -29,11 +29,11 @@ namespace Shadowsocks.Model | |||||
public string FriendlyName() | public string FriendlyName() | ||||
{ | { | ||||
if (string.IsNullOrEmpty(server)) | |||||
if (server.IsNullOrEmpty()) | |||||
{ | { | ||||
return I18N.GetString("New server"); | return I18N.GetString("New server"); | ||||
} | } | ||||
if (string.IsNullOrEmpty(remarks)) | |||||
if (remarks.IsNullOrEmpty()) | |||||
{ | { | ||||
return server + ":" + server_port; | return server + ":" + server_port; | ||||
} | } | ||||
@@ -0,0 +1,196 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Globalization; | |||||
using System.Linq; | |||||
using System.Text; | |||||
static partial class StringEx | |||||
{ | |||||
#pragma warning disable 1591 | |||||
public static StringComparison GlobalDefaultComparison { get; set; } = StringComparison.Ordinal; | |||||
[ThreadStatic] | |||||
private static StringComparison? _DefaultComparison; | |||||
public static StringComparison DefaultComparison | |||||
{ | |||||
get { return _DefaultComparison ?? GlobalDefaultComparison; } | |||||
set { _DefaultComparison = value; } | |||||
} | |||||
#region basic String methods | |||||
public static bool IsNullOrEmpty(this string value) | |||||
=> string.IsNullOrEmpty(value); | |||||
public static bool IsNullOrWhiteSpace(this string value) | |||||
=> string.IsNullOrWhiteSpace(value); | |||||
#if !PCL | |||||
public static string IsInterned(this string value) | |||||
{ | |||||
if (value == null) | |||||
throw new ArgumentNullException(nameof(value)); | |||||
return string.IsInterned(value); | |||||
} | |||||
public static string Intern(this string value) | |||||
{ | |||||
if (value == null) | |||||
throw new ArgumentNullException(nameof(value)); | |||||
return string.Intern(value); | |||||
} | |||||
#endif | |||||
#endregion | |||||
#region comparing | |||||
#region Is | |||||
public static bool Is(this string a, string b) | |||||
=> string.Equals(a, b, DefaultComparison); | |||||
public static bool Is(this string a, string b, StringComparison comparisonType) | |||||
=> string.Equals(a, b, comparisonType); | |||||
#endregion | |||||
#region BeginWith | |||||
public static bool BeginWith(this string s, char c) | |||||
{ | |||||
if (s.IsNullOrEmpty()) return false; | |||||
return s[0] == c; | |||||
} | |||||
public static bool BeginWithAny(this string s, IEnumerable<char> chars) | |||||
{ | |||||
if (s.IsNullOrEmpty()) return false; | |||||
return chars.Contains(s[0]); | |||||
} | |||||
public static bool BeginWithAny(this string s, params char[] chars) | |||||
=> s.BeginWithAny(chars.AsEnumerable()); | |||||
public static bool BeginWith(this string a, string b) | |||||
{ | |||||
if (a == null || b == null) return false; | |||||
return a.StartsWith(b, DefaultComparison); | |||||
} | |||||
public static bool BeginWith(this string a, string b, StringComparison comparisonType) | |||||
{ | |||||
if (a == null || b == null) return false; | |||||
return a.StartsWith(b, comparisonType); | |||||
} | |||||
#if !PCL | |||||
public static bool BeginWith(this string a, string b, bool ignoreCase, CultureInfo culture) | |||||
{ | |||||
if (a == null || b == null) return false; | |||||
return a.StartsWith(b, ignoreCase, culture); | |||||
} | |||||
#endif | |||||
#endregion | |||||
#region FinishWith | |||||
public static bool FinishWith(this string s, char c) | |||||
{ | |||||
if (s.IsNullOrEmpty()) return false; | |||||
return s.Last() == c; | |||||
} | |||||
public static bool FinishWithAny(this string s, IEnumerable<char> chars) | |||||
{ | |||||
if (s.IsNullOrEmpty()) return false; | |||||
return chars.Contains(s.Last()); | |||||
} | |||||
public static bool FinishWithAny(this string s, params char[] chars) | |||||
=> s.FinishWithAny(chars.AsEnumerable()); | |||||
public static bool FinishWith(this string a, string b) | |||||
{ | |||||
if (a == null || b == null) return false; | |||||
return a.EndsWith(b, DefaultComparison); | |||||
} | |||||
public static bool FinishWith(this string a, string b, StringComparison comparisonType) | |||||
{ | |||||
if (a == null || b == null) return false; | |||||
return a.EndsWith(b, comparisonType); | |||||
} | |||||
#if !PCL | |||||
public static bool FinishWith(this string a, string b, bool ignoreCase, CultureInfo culture) | |||||
{ | |||||
if (a == null || b == null) return false; | |||||
return a.EndsWith(b, ignoreCase, culture); | |||||
} | |||||
#endif | |||||
#endregion | |||||
#endregion | |||||
#region others | |||||
private static readonly char[][] Quotes = new[] | |||||
{ | |||||
"\"\"", | |||||
"''", | |||||
"“”", | |||||
"‘’", | |||||
"『』", | |||||
"「」", | |||||
"〖〗", | |||||
"【】", | |||||
}.Select(s => s.ToCharArray()).ToArray(); | |||||
public static string Enquote(this string value) | |||||
{ | |||||
if (value == null) | |||||
return "(null)"; | |||||
foreach (var pair in Quotes) | |||||
{ | |||||
if (value.IndexOfAny(pair) < 0) | |||||
return pair[0] + value + pair[1]; | |||||
} | |||||
return '"' + value.Replace("\\", @"\\").Replace("\"", @"\""") + '"'; | |||||
} | |||||
public static string Replace(this string value, string find, string rep, StringComparison comparsionType) | |||||
{ | |||||
if (find.IsNullOrEmpty()) | |||||
throw new ArgumentException(null, nameof(find)); | |||||
if (rep == null) | |||||
rep = ""; | |||||
if (value.IsNullOrEmpty()) | |||||
return value; | |||||
var sb = new StringBuilder(value.Length); | |||||
var last = 0; | |||||
var len = find.Length; | |||||
var idx = value.IndexOf(find, DefaultComparison); | |||||
while (idx != -1) | |||||
{ | |||||
sb.Append(value.Substring(last, idx - last)); | |||||
sb.Append(rep); | |||||
idx += len; | |||||
last = idx; | |||||
idx = value.IndexOf(find, idx, comparsionType); | |||||
} | |||||
sb.Append(value.Substring(last)); | |||||
return sb.ToString(); | |||||
} | |||||
public static string ReplaceEx(this string value, string find, string rep) | |||||
=> value.Replace(find, rep, DefaultComparison); | |||||
#endregion | |||||
} |
@@ -630,11 +630,11 @@ namespace Shadowsocks.View | |||||
{ | { | ||||
if (!onlinePACItem.Checked) | if (!onlinePACItem.Checked) | ||||
{ | { | ||||
if (String.IsNullOrEmpty(controller.GetConfigurationCopy().pacUrl)) | |||||
if (controller.GetConfigurationCopy().pacUrl.IsNullOrEmpty()) | |||||
{ | { | ||||
UpdateOnlinePACURLItem_Click(sender, e); | UpdateOnlinePACURLItem_Click(sender, e); | ||||
} | } | ||||
if (!String.IsNullOrEmpty(controller.GetConfigurationCopy().pacUrl)) | |||||
if (!controller.GetConfigurationCopy().pacUrl.IsNullOrEmpty()) | |||||
{ | { | ||||
localPACItem.Checked = false; | localPACItem.Checked = false; | ||||
onlinePACItem.Checked = true; | onlinePACItem.Checked = true; | ||||
@@ -651,7 +651,7 @@ namespace Shadowsocks.View | |||||
I18N.GetString("Please input PAC Url"), | I18N.GetString("Please input PAC Url"), | ||||
I18N.GetString("Edit Online PAC URL"), | I18N.GetString("Edit Online PAC URL"), | ||||
origPacUrl, -1, -1); | origPacUrl, -1, -1); | ||||
if (!string.IsNullOrEmpty(pacUrl) && pacUrl != origPacUrl) | |||||
if (!pacUrl.IsNullOrEmpty() && pacUrl != origPacUrl) | |||||
{ | { | ||||
controller.SavePACUrl(pacUrl); | controller.SavePACUrl(pacUrl); | ||||
} | } | ||||
@@ -8,5 +8,6 @@ | |||||
<package id="Microsoft.Bcl.Build" version="1.0.21" targetFramework="net40-client" /> | <package id="Microsoft.Bcl.Build" version="1.0.21" targetFramework="net40-client" /> | ||||
<package id="Microsoft.Net.Http" version="2.0.20710.0" targetFramework="net4-client" /> | <package id="Microsoft.Net.Http" version="2.0.20710.0" targetFramework="net4-client" /> | ||||
<package id="Newtonsoft.Json" version="8.0.2" targetFramework="net40-client" /> | <package id="Newtonsoft.Json" version="8.0.2" targetFramework="net40-client" /> | ||||
<package id="StringEx" version="0.1.1" targetFramework="net40-client" /> | |||||
<package id="System.Net.Http" version="2.0.20710.0" targetFramework="net40-client" /> | <package id="System.Net.Http" version="2.0.20710.0" targetFramework="net40-client" /> | ||||
</packages> | </packages> |
@@ -204,6 +204,7 @@ | |||||
<Compile Include="Controller\Strategy\BalancingStrategy.cs" /> | <Compile Include="Controller\Strategy\BalancingStrategy.cs" /> | ||||
<Compile Include="Controller\Strategy\StrategyManager.cs" /> | <Compile Include="Controller\Strategy\StrategyManager.cs" /> | ||||
<Compile Include="Controller\Strategy\IStrategy.cs" /> | <Compile Include="Controller\Strategy\IStrategy.cs" /> | ||||
<Compile Include="StringEx.cs" /> | |||||
<Compile Include="Util\Util.cs" /> | <Compile Include="Util\Util.cs" /> | ||||
<Compile Include="View\ConfigForm.cs"> | <Compile Include="View\ConfigForm.cs"> | ||||
<SubType>Form</SubType> | <SubType>Form</SubType> | ||||