Compare commits
54 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f6b044c10c | ||
|
|
88c87aec0e | ||
|
|
b632dee0ce | ||
|
|
0db772aaeb | ||
|
|
fedfed4028 | ||
|
|
3b27e7be36 | ||
|
|
78402118ef | ||
|
|
aa3094f796 | ||
|
|
20498ce453 | ||
|
|
56559e6509 | ||
|
|
9549d17b03 | ||
|
|
a822fa9766 | ||
|
|
dee4b19775 | ||
|
|
f4b885dce5 | ||
|
|
2c02285def | ||
|
|
be7d76947b | ||
|
|
a81254dfff | ||
|
|
cb24a909ae | ||
|
|
8a87318b68 | ||
|
|
219f544a43 | ||
|
|
46c887537e | ||
|
|
8cf66da07c | ||
|
|
57bcf8a1a7 | ||
|
|
05efff10da | ||
|
|
414ac3225a | ||
|
|
0a8e822f35 | ||
|
|
301d1dd998 | ||
|
|
621565f4a4 | ||
|
|
6f51d447c7 | ||
|
|
f9c7556c54 | ||
|
|
32b98524ff | ||
|
|
efaec3ee17 | ||
|
|
28826cad1b | ||
|
|
ca9840abf4 | ||
|
|
8813d66274 | ||
|
|
da2b0f7dd4 | ||
|
|
b1773dab90 | ||
|
|
9538a67be1 | ||
|
|
fbfbc811d4 | ||
|
|
1c04b752cd | ||
|
|
3b1a2287d5 | ||
|
|
f3e6bd2736 | ||
|
|
4e449811e7 | ||
|
|
910be7f471 | ||
|
|
1e088f851b | ||
|
|
a0b0ad53d2 | ||
|
|
5b3f09aaf7 | ||
|
|
f48468029e | ||
|
|
c837ba5482 | ||
|
|
2708ff7c1a | ||
|
|
1722e50402 | ||
|
|
244da05e70 | ||
|
|
0c26662602 | ||
|
|
2f65575fdf |
1
v2rayN/v2rayN/Forms/MainForm.Designer.cs
generated
1
v2rayN/v2rayN/Forms/MainForm.Designer.cs
generated
@@ -165,6 +165,7 @@
|
||||
this.lvServers.Name = "lvServers";
|
||||
this.lvServers.UseCompatibleStateImageBehavior = false;
|
||||
this.lvServers.View = System.Windows.Forms.View.Details;
|
||||
this.lvServers.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.lvServers_ColumnClick);
|
||||
this.lvServers.SelectedIndexChanged += new System.EventHandler(this.lvServers_SelectedIndexChanged);
|
||||
this.lvServers.Click += new System.EventHandler(this.lvServers_Click);
|
||||
this.lvServers.DoubleClick += new System.EventHandler(this.lvServers_DoubleClick);
|
||||
|
||||
@@ -161,7 +161,7 @@ namespace v2rayN.Forms
|
||||
private void RefreshServers()
|
||||
{
|
||||
RefreshServersView();
|
||||
lvServers.AutoResizeColumns();
|
||||
//lvServers.AutoResizeColumns();
|
||||
RefreshServersMenu();
|
||||
}
|
||||
|
||||
@@ -178,7 +178,7 @@ namespace v2rayN.Forms
|
||||
lvServers.View = View.Details;
|
||||
lvServers.Scrollable = true;
|
||||
lvServers.MultiSelect = true;
|
||||
lvServers.HeaderStyle = ColumnHeaderStyle.Nonclickable;
|
||||
lvServers.HeaderStyle = ColumnHeaderStyle.Clickable;
|
||||
|
||||
lvServers.Columns.Add("", 30);
|
||||
lvServers.Columns.Add(UIRes.I18N("LvServiceType"), 80);
|
||||
@@ -239,7 +239,7 @@ namespace v2rayN.Forms
|
||||
}
|
||||
}
|
||||
ListViewItem lvItem = new ListViewItem(def);
|
||||
_addSubItem(lvItem, EServerColName.type.ToString(), ((EConfigType)item.configType).ToString());
|
||||
_addSubItem(lvItem, EServerColName.configType.ToString(), ((EConfigType)item.configType).ToString());
|
||||
_addSubItem(lvItem, EServerColName.remarks.ToString(), item.remarks);
|
||||
_addSubItem(lvItem, EServerColName.address.ToString(), item.address);
|
||||
_addSubItem(lvItem, EServerColName.port.ToString(), item.port.ToString());
|
||||
@@ -268,7 +268,6 @@ namespace v2rayN.Forms
|
||||
|
||||
if (lvItem != null) lvServers.Items.Add(lvItem);
|
||||
}
|
||||
lvServers.EnsureVisible(config.index);
|
||||
lvServers.EndUpdate();
|
||||
|
||||
//if (lvServers.Items.Count > 0)
|
||||
@@ -378,6 +377,35 @@ namespace v2rayN.Forms
|
||||
}
|
||||
}
|
||||
|
||||
private void lvServers_ColumnClick(object sender, ColumnClickEventArgs e)
|
||||
{
|
||||
if (e.Column < 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var tag = lvServers.Columns[e.Column].Tag?.ToString();
|
||||
bool asc = Utils.IsNullOrEmpty(tag) ? true : !Convert.ToBoolean(tag);
|
||||
if (ConfigHandler.SortServers(ref config, (EServerColName)e.Column, asc) != 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
lvServers.Columns[e.Column].Tag = Convert.ToString(asc);
|
||||
RefreshServers();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Utils.SaveLog(ex.Message, ex);
|
||||
}
|
||||
|
||||
if (e.Column < 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region v2ray 操作
|
||||
@@ -1025,7 +1053,10 @@ namespace v2rayN.Forms
|
||||
this.ShowInTaskbar = true;
|
||||
//this.notifyIcon1.Visible = false;
|
||||
this.txtMsgBox.ScrollToCaret();
|
||||
if (config.index >= 0 && config.index < lvServers.Items.Count)
|
||||
{
|
||||
lvServers.EnsureVisible(config.index); // workaround
|
||||
}
|
||||
|
||||
SetVisibleCore(true);
|
||||
}
|
||||
@@ -1226,11 +1257,11 @@ namespace v2rayN.Forms
|
||||
{
|
||||
int httpPort = config.GetLocalPort(Global.InboundHttp);
|
||||
WebProxy webProxy = new WebProxy(Global.Loopback, httpPort);
|
||||
downloadHandle.DownloadFileAsync(url, webProxy, 60);
|
||||
downloadHandle.DownloadFileAsync(url, webProxy, 600);
|
||||
}
|
||||
else
|
||||
{
|
||||
downloadHandle.DownloadFileAsync(url, null, 60);
|
||||
downloadHandle.DownloadFileAsync(url, null, 600);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1561,8 +1592,8 @@ namespace v2rayN.Forms
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,8 @@ using System.IO;
|
||||
using System.Net;
|
||||
using v2rayN.Mode;
|
||||
using v2rayN.Base;
|
||||
using System.Linq;
|
||||
using v2rayN.Tool;
|
||||
|
||||
namespace v2rayN.Handler
|
||||
{
|
||||
@@ -922,5 +924,45 @@ namespace v2rayN.Handler
|
||||
}
|
||||
}
|
||||
|
||||
public static int SortServers(ref Config config, EServerColName name, bool asc)
|
||||
{
|
||||
if (config.vmess.Count <= 0)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
switch (name)
|
||||
{
|
||||
case EServerColName.configType:
|
||||
case EServerColName.remarks:
|
||||
case EServerColName.address:
|
||||
case EServerColName.port:
|
||||
case EServerColName.security:
|
||||
case EServerColName.network:
|
||||
case EServerColName.testResult:
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
string itemId = config.getItemId();
|
||||
var items = config.vmess.AsQueryable();
|
||||
|
||||
if (asc)
|
||||
{
|
||||
config.vmess = items.OrderBy(name.ToString()).ToList();
|
||||
}
|
||||
else
|
||||
{
|
||||
config.vmess = items.OrderByDescending(name.ToString()).ToList();
|
||||
}
|
||||
|
||||
var index_ = config.vmess.FindIndex(it => it.getItemId() == itemId);
|
||||
if (index_ >= 0)
|
||||
{
|
||||
config.index = index_;
|
||||
}
|
||||
|
||||
ToJsonFile(config);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -228,19 +228,33 @@ namespace v2rayN.Handler
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ws_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (UpdateCompleted != null)
|
||||
{
|
||||
if (e.Error != null) throw e.Error;
|
||||
|
||||
if (e.Cancelled)
|
||||
{
|
||||
((WebClientEx)sender).Dispose();
|
||||
TimeSpan ts = (DateTime.Now - totalDatetime);
|
||||
string speed = string.Format("<{0} MB/s", (totalBytesToReceive / ts.TotalMilliseconds / 1000).ToString("#0.##"));
|
||||
string speed = string.Format("{0} M/s", (totalBytesToReceive / ts.TotalMilliseconds / 1000).ToString("#0.##"));
|
||||
UpdateCompleted(this, new ResultEventArgs(true, speed));
|
||||
return;
|
||||
}
|
||||
|
||||
if (e.Error == null
|
||||
|| Utils.IsNullOrEmpty(e.Error.ToString()))
|
||||
{
|
||||
|
||||
TimeSpan ts = (DateTime.Now - totalDatetime);
|
||||
string speed = string.Format("{0} M/s", (totalBytesToReceive / ts.TotalMilliseconds / 1000).ToString("#0.##"));
|
||||
UpdateCompleted(this, new ResultEventArgs(true, speed));
|
||||
}
|
||||
else
|
||||
{
|
||||
throw e.Error;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
||||
@@ -219,7 +219,7 @@ namespace v2rayN.Handler
|
||||
|
||||
testCounter++;
|
||||
WebProxy webProxy = new WebProxy(Global.Loopback, httpPort + index);
|
||||
downloadHandle2.DownloadFileAsync(url, webProxy, 20);
|
||||
downloadHandle2.DownloadFileAsync(url, webProxy, 10);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ namespace v2rayN.Mode
|
||||
public enum EServerColName
|
||||
{
|
||||
def = 0,
|
||||
type,
|
||||
configType,
|
||||
remarks,
|
||||
address,
|
||||
port,
|
||||
|
||||
@@ -32,4 +32,4 @@ using System.Runtime.InteropServices;
|
||||
// 方法是按如下所示使用“*”:
|
||||
//[assembly: AssemblyVersion("1.0.*")]
|
||||
//[assembly: AssemblyVersion("1.0.0")]
|
||||
[assembly: AssemblyFileVersion("3.15")]
|
||||
[assembly: AssemblyFileVersion("3.16")]
|
||||
|
||||
48
v2rayN/v2rayN/Tool/QueryableExtension.cs
Normal file
48
v2rayN/v2rayN/Tool/QueryableExtension.cs
Normal file
@@ -0,0 +1,48 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Reflection;
|
||||
|
||||
namespace v2rayN.Tool
|
||||
{
|
||||
public static class QueryableExtension
|
||||
{
|
||||
public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> query, string propertyName)
|
||||
{
|
||||
return _OrderBy<T>(query, propertyName, false);
|
||||
}
|
||||
public static IOrderedQueryable<T> OrderByDescending<T>(this IQueryable<T> query, string propertyName)
|
||||
{
|
||||
return _OrderBy<T>(query, propertyName, true);
|
||||
}
|
||||
|
||||
static IOrderedQueryable<T> _OrderBy<T>(IQueryable<T> query, string propertyName, bool isDesc)
|
||||
{
|
||||
string methodname = (isDesc) ? "OrderByDescendingInternal" : "OrderByInternal";
|
||||
|
||||
var memberProp = typeof(T).GetProperty(propertyName);
|
||||
|
||||
var method = typeof(QueryableExtension).GetMethod(methodname)
|
||||
.MakeGenericMethod(typeof(T), memberProp.PropertyType);
|
||||
|
||||
return (IOrderedQueryable<T>)method.Invoke(null, new object[] { query, memberProp });
|
||||
}
|
||||
public static IOrderedQueryable<T> OrderByInternal<T, TProp>(IQueryable<T> query, PropertyInfo memberProperty)
|
||||
{//public
|
||||
return query.OrderBy(_GetLamba<T, TProp>(memberProperty));
|
||||
}
|
||||
public static IOrderedQueryable<T> OrderByDescendingInternal<T, TProp>(IQueryable<T> query, PropertyInfo memberProperty)
|
||||
{//public
|
||||
return query.OrderByDescending(_GetLamba<T, TProp>(memberProperty));
|
||||
}
|
||||
static Expression<Func<T, TProp>> _GetLamba<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);
|
||||
|
||||
return lamba;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -209,6 +209,7 @@
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="Tool\FileManager.cs" />
|
||||
<Compile Include="Tool\Job.cs" />
|
||||
<Compile Include="Tool\QueryableExtension.cs" />
|
||||
<Compile Include="Tool\UIRes.cs" />
|
||||
<Compile Include="Tool\UI.cs" />
|
||||
<Compile Include="Tool\Utils.cs" />
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<ErrorReportUrlHistory />
|
||||
<FallbackCulture>zh-CN</FallbackCulture>
|
||||
<VerifyUploadedFiles>false</VerifyUploadedFiles>
|
||||
<ProjectView>ShowAllFiles</ProjectView>
|
||||
<ProjectView>ProjectFiles</ProjectView>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<EnableSecurityDebugging>false</EnableSecurityDebugging>
|
||||
|
||||
Reference in New Issue
Block a user