Compare commits
468 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
020df117c4 | ||
|
|
b48037b757 | ||
|
|
529b6613e9 | ||
|
|
8a5d8cdf8a | ||
|
|
cdf35740d9 | ||
|
|
76c40585fd | ||
|
|
2bf58288d3 | ||
|
|
ba2eac5290 | ||
|
|
23a4e4cc19 | ||
|
|
841a20cbd4 | ||
|
|
f70ca77913 | ||
|
|
c97df99c5c | ||
|
|
809e170018 | ||
|
|
d0c8f5eb45 | ||
|
|
d0f953f1d8 | ||
|
|
6d1636c540 | ||
|
|
b3292729b0 | ||
|
|
11840ffc8a | ||
|
|
9fd20d1dc8 | ||
|
|
ea6799d749 | ||
|
|
e23fe00a37 | ||
|
|
ccda957e8f | ||
|
|
cdaaf00509 | ||
|
|
4dfb0fa213 | ||
|
|
dcda8fc773 | ||
|
|
9c3fff8510 | ||
|
|
c3526ebfa3 | ||
|
|
28ba47a2f5 | ||
|
|
55a8b9085e | ||
|
|
2f250c5569 | ||
|
|
e9d0565e6a | ||
|
|
272de5f34d | ||
|
|
60a319a482 | ||
|
|
9e440fd5e6 | ||
|
|
235f20813d | ||
|
|
55ce8a3e97 | ||
|
|
b7ac15ad55 | ||
|
|
038b64a416 | ||
|
|
ec2fbca979 | ||
|
|
7f28b1d2c9 | ||
|
|
6a0ec7d294 | ||
|
|
217215b035 | ||
|
|
a6fefcacc9 | ||
|
|
03023c04fc | ||
|
|
8dadfe6579 | ||
|
|
6c06de63e4 | ||
|
|
54a122ae34 | ||
|
|
7a0daee443 | ||
|
|
88b5e29092 | ||
|
|
b3ea08dd99 | ||
|
|
95794bc5b2 | ||
|
|
3275454bd6 | ||
|
|
7f5bb86127 | ||
|
|
cf1ae8f240 | ||
|
|
9b2261918f | ||
|
|
f74071691f | ||
|
|
6d5e02860e | ||
|
|
ffa2acb2f5 | ||
|
|
25b4ff771e | ||
|
|
7a48617fea | ||
|
|
800807b47a | ||
|
|
eaf11c6998 | ||
|
|
e2053d5a77 | ||
|
|
ae6b3ef7fb | ||
|
|
359c6e0f02 | ||
|
|
9a8b4593e1 | ||
|
|
02fc631e3c | ||
|
|
19e03a1fdd | ||
|
|
5ea6279711 | ||
|
|
c44578c341 | ||
|
|
ab34d3fe30 | ||
|
|
5aa27c14c6 | ||
|
|
a5e9edb2e5 | ||
|
|
bbd8ef1f26 | ||
|
|
ad8afa0d3d | ||
|
|
5198f30363 | ||
|
|
50e55761ab | ||
|
|
7cb67aa49c | ||
|
|
1d4993180a | ||
|
|
73a36d5556 | ||
|
|
368e489190 | ||
|
|
d582d4846e | ||
|
|
87ffad398e | ||
|
|
439e7eaca0 | ||
|
|
90d703ae91 | ||
|
|
2d80c90f78 | ||
|
|
b54c8e97bd | ||
|
|
58e69a6644 | ||
|
|
f09a13259f | ||
|
|
8775c5e1f2 | ||
|
|
61b7997ae9 | ||
|
|
99fa98844c | ||
|
|
6e5781c633 | ||
|
|
b58e524d78 | ||
|
|
0d669af44e | ||
|
|
a331c70233 | ||
|
|
fd7d688e6b | ||
|
|
069d47f01b | ||
|
|
3079f1c651 | ||
|
|
f5ecda9255 | ||
|
|
d83ae315ed | ||
|
|
2b40e87eb9 | ||
|
|
f7e3eb180b | ||
|
|
209786cdb6 | ||
|
|
d418f79d8f | ||
|
|
eddd38ff03 | ||
|
|
e4fa729071 | ||
|
|
b3e7eac895 | ||
|
|
c43675d987 | ||
|
|
cdaff66126 | ||
|
|
cf45e89b16 | ||
|
|
aec8459761 | ||
|
|
de746375a9 | ||
|
|
25c2871888 | ||
|
|
28b2e1a405 | ||
|
|
2603132dae | ||
|
|
6f08cb0e88 | ||
|
|
dd65c3fcaa | ||
|
|
fec8641efe | ||
|
|
d5eaa56b60 | ||
|
|
db7e8dd6dc | ||
|
|
9415055e6f | ||
|
|
f597f09914 | ||
|
|
7903228c13 | ||
|
|
4c2388749d | ||
|
|
89da3823a4 | ||
|
|
3a9a49b163 | ||
|
|
277b21dc86 | ||
|
|
bc0e8c17ba | ||
|
|
51d3df69bb | ||
|
|
4913f6f37d | ||
|
|
ff622e2ef6 | ||
|
|
50ad643abe | ||
|
|
944849a381 | ||
|
|
6f485141f0 | ||
|
|
3575291119 | ||
|
|
e256ec5401 | ||
|
|
3defba6290 | ||
|
|
c201d986c5 | ||
|
|
36aad4424e | ||
|
|
b29fb1e2a3 | ||
|
|
d5aa307efb | ||
|
|
48928613bf | ||
|
|
52b8f480f6 | ||
|
|
bcda8bd602 | ||
|
|
2a11fe11e8 | ||
|
|
7ec0607fec | ||
|
|
aa41a8675e | ||
|
|
19f9bff6fe | ||
|
|
4e65732a4e | ||
|
|
47c843bf09 | ||
|
|
a7741a0b7d | ||
|
|
6f3fbdfe17 | ||
|
|
3be93df63f | ||
|
|
6259539c87 | ||
|
|
9654009650 | ||
|
|
62e796cf5a | ||
|
|
af820bb0f2 | ||
|
|
8f5bb3591b | ||
|
|
7eafae98d4 | ||
|
|
1d4e5baafb | ||
|
|
9894aa053f | ||
|
|
4ada8fea27 | ||
|
|
4d013a206b | ||
|
|
2d8a707bed | ||
|
|
0e55a859ea | ||
|
|
0b1ec520f4 | ||
|
|
fcc5f29882 | ||
|
|
d431c63245 | ||
|
|
15f8db64e7 | ||
|
|
c2ea14151e | ||
|
|
977f0428e2 | ||
|
|
f110446738 | ||
|
|
90289120d3 | ||
|
|
688f206555 | ||
|
|
38c739c45d | ||
|
|
73c79ca7bf | ||
|
|
978975ee2d | ||
|
|
d7dc0dff50 | ||
|
|
a3aa6c045f | ||
|
|
785ebc49fc | ||
|
|
fde1c98ddd | ||
|
|
024040163a | ||
|
|
e95b5e04c0 | ||
|
|
815826c856 | ||
|
|
1c5cc190c5 | ||
|
|
50b109ca71 | ||
|
|
3aa48a9a3e | ||
|
|
09702b9bde | ||
|
|
35f6cd3d9c | ||
|
|
b62f1786a9 | ||
|
|
b21ad28d5b | ||
|
|
8d66c0d180 | ||
|
|
ec8aa0df18 | ||
|
|
e824d8e91d | ||
|
|
b919422ec4 | ||
|
|
a8bc9ce605 | ||
|
|
e2f399eeb1 | ||
|
|
82924278b5 | ||
|
|
bb828a4e06 | ||
|
|
74933ac146 | ||
|
|
0d315f0dc3 | ||
|
|
372ee346dc | ||
|
|
cb462ab944 | ||
|
|
606da79372 | ||
|
|
0801c3db64 | ||
|
|
35deb0c915 | ||
|
|
fd4d712688 | ||
|
|
354fc618b0 | ||
|
|
82b6ee5ad2 | ||
|
|
645e6c4ec0 | ||
|
|
cdc83bc9d7 | ||
|
|
70feacd276 | ||
|
|
ece4572058 | ||
|
|
4d16a5e801 | ||
|
|
1493a8b03f | ||
|
|
d20791bf73 | ||
|
|
7bb91f57ac | ||
|
|
b7a6004830 | ||
|
|
dee5613f2f | ||
|
|
e58e0d6ac7 | ||
|
|
a2679e009d | ||
|
|
78d6bcd57a | ||
|
|
026936c92f | ||
|
|
5e5893362c | ||
|
|
5b8ce1836b | ||
|
|
d71f3fafcf | ||
|
|
828f93bc5c | ||
|
|
f947c541c9 | ||
|
|
539b6aafd9 | ||
|
|
c3971bda05 | ||
|
|
8f17331db2 | ||
|
|
583e824337 | ||
|
|
ac79466041 | ||
|
|
291fd491ff | ||
|
|
6408d51c85 | ||
|
|
b693873619 | ||
|
|
c2af982272 | ||
|
|
1f0a77bde2 | ||
|
|
0463c1a6e7 | ||
|
|
6517f66876 | ||
|
|
82682d4474 | ||
|
|
e030fae1c4 | ||
|
|
4d7cf140cd | ||
|
|
f6ccee1976 | ||
|
|
d42346d500 | ||
|
|
887dd8da3b | ||
|
|
731db2541d | ||
|
|
bfdc0a2e77 | ||
|
|
03ea24f29b | ||
|
|
61bd48fd1e | ||
|
|
f05b5d7fff | ||
|
|
0b8d66a87e | ||
|
|
c0b7a8c33e | ||
|
|
32a07bceb2 | ||
|
|
ba8f24d398 | ||
|
|
31b7857238 | ||
|
|
fada5f99bb | ||
|
|
734df5def5 | ||
|
|
03ad07733f | ||
|
|
b2d538d02a | ||
|
|
b9435a4b01 | ||
|
|
d27566686c | ||
|
|
ca883c164d | ||
|
|
0f6cd76f28 | ||
|
|
7778af65aa | ||
|
|
828246130b | ||
|
|
4eb1801f50 | ||
|
|
80b68dcf84 | ||
|
|
685baa576b | ||
|
|
7cdead8cb1 | ||
|
|
f220825b80 | ||
|
|
2b00490dd6 | ||
|
|
d361afa3f3 | ||
|
|
8d5bd5a80c | ||
|
|
002283899f | ||
|
|
206b440966 | ||
|
|
b5b5eb25a1 | ||
|
|
f84e538b6a | ||
|
|
5b9cdec156 | ||
|
|
cf0bd7f1e6 | ||
|
|
f3a86a2173 | ||
|
|
0a1d4d5193 | ||
|
|
88e2288298 | ||
|
|
fec47d4b72 | ||
|
|
f7f23e7980 | ||
|
|
32100db3fc | ||
|
|
dd2bed49f1 | ||
|
|
6a427a2158 | ||
|
|
716029def8 | ||
|
|
610a610ee0 | ||
|
|
4fc0738dad | ||
|
|
fe29771870 | ||
|
|
19be43d2d9 | ||
|
|
cb01809093 | ||
|
|
1138d660b2 | ||
|
|
c29ccf76d5 | ||
|
|
5907bf388c | ||
|
|
54adaffb92 | ||
|
|
3bc7812e1a | ||
|
|
16cd9706f9 | ||
|
|
839d07870c | ||
|
|
933d3c2678 | ||
|
|
a29b744526 | ||
|
|
c4070b26ff | ||
|
|
6d0b4e8c75 | ||
|
|
058e1aafd1 | ||
|
|
eac7361a0b | ||
|
|
64e6d6d038 | ||
|
|
d613fe79af | ||
|
|
565a7b1680 | ||
|
|
5076f45674 | ||
|
|
dc72c949c3 | ||
|
|
c85e418afa | ||
|
|
2fc3e846df | ||
|
|
a665dc9db7 | ||
|
|
672eb4b365 | ||
|
|
c9a150565d | ||
|
|
5b271108c0 | ||
|
|
8b63a19161 | ||
|
|
0d17a112a6 | ||
|
|
d997633810 | ||
|
|
446e981d0e | ||
|
|
dabca02b18 | ||
|
|
790bd1217c | ||
|
|
43d8515e23 | ||
|
|
bcd051e5a3 | ||
|
|
1a1e08753f | ||
|
|
d46838eb55 | ||
|
|
a70b5eeef5 | ||
|
|
7513ff860b | ||
|
|
4d872e9143 | ||
|
|
4408d67c49 | ||
|
|
545e1c5402 | ||
|
|
03dec5b604 | ||
|
|
777427787a | ||
|
|
f0c59e38cc | ||
|
|
35cbc54f99 | ||
|
|
bb78af8489 | ||
|
|
af000a27a6 | ||
|
|
b30191feb2 | ||
|
|
83804bd914 | ||
|
|
23b0f154f3 | ||
|
|
6084173257 | ||
|
|
7885893e9b | ||
|
|
53f9fee834 | ||
|
|
ae79d8c608 | ||
|
|
9c96feb4b5 | ||
|
|
597531b92b | ||
|
|
108ab7069b | ||
|
|
63411c5978 | ||
|
|
e6fc9e4783 | ||
|
|
57d5e02d6a | ||
|
|
e578c75545 | ||
|
|
77c5f6c583 | ||
|
|
d8ee3c3bba | ||
|
|
656451f604 | ||
|
|
9dc8cba3f0 | ||
|
|
03c4954c27 | ||
|
|
3c550e2803 | ||
|
|
52f1bdf834 | ||
|
|
c2c9c6a6db | ||
|
|
b390776219 | ||
|
|
47dce69aa4 | ||
|
|
3aeaadade6 | ||
|
|
162b3ab29c | ||
|
|
b8848823cd | ||
|
|
378f350c52 | ||
|
|
e7231d33b3 | ||
|
|
7c633374f6 | ||
|
|
1663c7d819 | ||
|
|
00982fd40b | ||
|
|
3697de973c | ||
|
|
3e575cc485 | ||
|
|
1675c67ddd | ||
|
|
b20c90acf0 | ||
|
|
a370f7bfbb | ||
|
|
e2de9b4703 | ||
|
|
b487dcf448 | ||
|
|
6c0a364d03 | ||
|
|
f892f0c533 | ||
|
|
0713c0c667 | ||
|
|
ab4d34b6ac | ||
|
|
3823e5ca91 | ||
|
|
c0430536a6 | ||
|
|
6f85b5318b | ||
|
|
76e67693fa | ||
|
|
478521d6d9 | ||
|
|
57299cf182 | ||
|
|
45738a7160 | ||
|
|
583bd22244 | ||
|
|
ba68f5008b | ||
|
|
2f3f52c5e0 | ||
|
|
1dcb72e9dc | ||
|
|
153c8a0a74 | ||
|
|
4e8ea374d8 | ||
|
|
e313e004eb | ||
|
|
93b8dec63e | ||
|
|
5c9c35c199 | ||
|
|
4a6b8968d5 | ||
|
|
088d2e6834 | ||
|
|
4f39f7a932 | ||
|
|
2615b72cee | ||
|
|
a799420d0f | ||
|
|
70069a05e6 | ||
|
|
d385b44a48 | ||
|
|
56c1557f4a | ||
|
|
737d563ebb | ||
|
|
81b70195cf | ||
|
|
e60851153b | ||
|
|
009a15f0d9 | ||
|
|
f234775bd5 | ||
|
|
9b8bd0fa8a | ||
|
|
f74191946c | ||
|
|
ffa8b6296d | ||
|
|
0b2a392de2 | ||
|
|
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 |
58
.github/ISSUE_TEMPLATE/01_bug_report.yml
vendored
Normal file
58
.github/ISSUE_TEMPLATE/01_bug_report.yml
vendored
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
name: Bug 报告
|
||||||
|
description: 在提出问题前请先自行排除服务器端问题和升级到最新客户端,同时也请通过搜索确认是否有人提出过相同问题。
|
||||||
|
title: "[Bug]: "
|
||||||
|
labels: ["bug"]
|
||||||
|
body:
|
||||||
|
- type: input
|
||||||
|
id: "expectation"
|
||||||
|
attributes:
|
||||||
|
label: "预期情况"
|
||||||
|
description: "描述你认为应该发生什么"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: "describe-the-bug"
|
||||||
|
attributes:
|
||||||
|
label: "实际情况"
|
||||||
|
description: "描述实际发生了什么"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: "reproduction-method"
|
||||||
|
attributes:
|
||||||
|
label: "复现方法"
|
||||||
|
description: "在BUG出现前执行了哪些操作"
|
||||||
|
placeholder: 标序号
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: "log"
|
||||||
|
attributes:
|
||||||
|
label: "日志信息"
|
||||||
|
description: "位置在软件当前目录下的guiLogs"
|
||||||
|
placeholder: 在日志开始和结束位置粘贴冒号后的内容:```
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: "more"
|
||||||
|
attributes:
|
||||||
|
label: "额外信息"
|
||||||
|
description: "可选"
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: checkboxes
|
||||||
|
id: "latest-version"
|
||||||
|
attributes:
|
||||||
|
label: "我确认已更新至最新版本"
|
||||||
|
description: "否则请更新后尝试"
|
||||||
|
options:
|
||||||
|
- label: 是
|
||||||
|
required: true
|
||||||
|
- type: checkboxes
|
||||||
|
id: "issues"
|
||||||
|
attributes:
|
||||||
|
label: "我确认已查询历史issues"
|
||||||
|
description: "否则请查询后提出"
|
||||||
|
options:
|
||||||
|
- label: 是
|
||||||
|
required: true
|
||||||
34
.github/ISSUE_TEMPLATE/02_feature_request.yml
vendored
Normal file
34
.github/ISSUE_TEMPLATE/02_feature_request.yml
vendored
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
name: Feature 请求
|
||||||
|
description: "为这个项目提出一个建议"
|
||||||
|
title: "[Feature request]: "
|
||||||
|
labels: ['enhancement']
|
||||||
|
body:
|
||||||
|
- type: input
|
||||||
|
id: problem
|
||||||
|
attributes:
|
||||||
|
label: 相关问题
|
||||||
|
description: "清楚而简洁地描述问题是什么。"
|
||||||
|
placeholder: "当我想要……时,软件不能……"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: way-to-solve
|
||||||
|
attributes:
|
||||||
|
label: 描述你希望的解决方案
|
||||||
|
description: "你希望发生什么"
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: instead
|
||||||
|
attributes:
|
||||||
|
label: 描述你所考虑的替代方案
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: checkboxes
|
||||||
|
id: "issues"
|
||||||
|
attributes:
|
||||||
|
label: "我确认已查询历史issues"
|
||||||
|
description: "否则请查询后提出"
|
||||||
|
options:
|
||||||
|
- label: 是
|
||||||
|
required: true
|
||||||
25
.github/issue_template.md
vendored
25
.github/issue_template.md
vendored
@@ -1,25 +0,0 @@
|
|||||||
在提出问题前请先自行排除服务器端问题和升级到最新客户端,同时也请通过搜索确认是否有人提出过相同问题。
|
|
||||||
|
|
||||||
### 预期行为
|
|
||||||
描述你认为应该发生什么
|
|
||||||
|
|
||||||
### 实际行为
|
|
||||||
描述实际发生了什么
|
|
||||||
|
|
||||||
### 复现方法
|
|
||||||
1.
|
|
||||||
2.
|
|
||||||
3.
|
|
||||||
|
|
||||||
### 日志信息,位置在当前目录下的guiLogs
|
|
||||||
<details>
|
|
||||||
|
|
||||||
```
|
|
||||||
在这里粘贴日志
|
|
||||||
```
|
|
||||||
</details>
|
|
||||||
|
|
||||||
### 环境信息(客户端请升级至最新正式版)
|
|
||||||
|
|
||||||
### 额外信息(可选)
|
|
||||||
|
|
||||||
4
.gitignore
vendored
4
.gitignore
vendored
@@ -13,6 +13,6 @@
|
|||||||
.vs/slnx.sqlite
|
.vs/slnx.sqlite
|
||||||
.vs/VSWorkspaceState.json
|
.vs/VSWorkspaceState.json
|
||||||
/v2rayN/v2rayUpgrade/bin/Debug
|
/v2rayN/v2rayUpgrade/bin/Debug
|
||||||
/v2rayN/v2rayUpgrade/obj/Debug
|
|
||||||
/v2rayN/v2rayUpgrade/bin/Release
|
/v2rayN/v2rayUpgrade/bin/Release
|
||||||
/v2rayN/v2rayUpgrade/obj/Release
|
/v2rayN/v2rayUpgrade/obj/
|
||||||
|
*.user
|
||||||
|
|||||||
19
README.md
19
README.md
@@ -1,10 +1,21 @@
|
|||||||
# v2rayN
|
# v2rayN
|
||||||
|
A V2Ray client for Windows, support [Xray core](https://github.com/XTLS/Xray-core) and [v2fly core](https://github.com/v2fly/v2ray-core)
|
||||||
|
|
||||||
|
|
||||||
|
[](https://github.com/2dust/v2rayN/commits/master)
|
||||||
|
[](https://www.codefactor.io/repository/github/2dust/v2rayn)
|
||||||
|
[](https://github.com/2dust/v2rayN/releases)
|
||||||
|
[](https://t.me/v2rayn)
|
||||||
|
|
||||||
### How to use
|
### How to use
|
||||||
- If you are newbie please download v2rayN-Core.zip from releases
|
- If you are new to this, please download v2rayN-Core.zip from [releases](https://github.com/2dust/v2rayN/releases)
|
||||||
- Otherwise please download v2rayN.zip (Also need to download v2ray core in the same folder)
|
- Otherwise please download v2rayN.zip (you will also need to download v2ray core into the same folder with v2rayN.exe)
|
||||||
- Run v2rayN.exe
|
- Run v2rayN.exe
|
||||||
|
|
||||||
### Requirements
|
### Requirements
|
||||||
- Microsoft [.NET Framework 4.6](https://docs.microsoft.com/zh-cn/dotnet/framework/install/guide-for-developers) or higher
|
- Microsoft [.NET Framework 4.8 Runtime](https://dotnet.microsoft.com/zh-cn/download/dotnet-framework/thank-you/net48-offline-installer)
|
||||||
- Project V core [https://github.com/v2ray/v2ray-core/releases](https://github.com/v2ray/v2ray-core/releases)
|
- v2fly core [https://github.com/v2fly/v2ray-core/releases](https://github.com/v2fly/v2ray-core/releases)
|
||||||
|
- Xray core [https://github.com/XTLS/Xray-core/releases](https://github.com/XTLS/Xray-core/releases)
|
||||||
|
|
||||||
|
### Telegram Channel
|
||||||
|
[github_2dust](https://t.me/github_2dust)
|
||||||
|
|||||||
63
v2rayN/.gitattributes
vendored
Normal file
63
v2rayN/.gitattributes
vendored
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
###############################################################################
|
||||||
|
# Set default behavior to automatically normalize line endings.
|
||||||
|
###############################################################################
|
||||||
|
* text=auto
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# Set default behavior for command prompt diff.
|
||||||
|
#
|
||||||
|
# This is need for earlier builds of msysgit that does not have it on by
|
||||||
|
# default for csharp files.
|
||||||
|
# Note: This is only used by command line
|
||||||
|
###############################################################################
|
||||||
|
#*.cs diff=csharp
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# Set the merge driver for project and solution files
|
||||||
|
#
|
||||||
|
# Merging from the command prompt will add diff markers to the files if there
|
||||||
|
# are conflicts (Merging from VS is not affected by the settings below, in VS
|
||||||
|
# the diff markers are never inserted). Diff markers may cause the following
|
||||||
|
# file extensions to fail to load in VS. An alternative would be to treat
|
||||||
|
# these files as binary and thus will always conflict and require user
|
||||||
|
# intervention with every merge. To do so, just uncomment the entries below
|
||||||
|
###############################################################################
|
||||||
|
#*.sln merge=binary
|
||||||
|
#*.csproj merge=binary
|
||||||
|
#*.vbproj merge=binary
|
||||||
|
#*.vcxproj merge=binary
|
||||||
|
#*.vcproj merge=binary
|
||||||
|
#*.dbproj merge=binary
|
||||||
|
#*.fsproj merge=binary
|
||||||
|
#*.lsproj merge=binary
|
||||||
|
#*.wixproj merge=binary
|
||||||
|
#*.modelproj merge=binary
|
||||||
|
#*.sqlproj merge=binary
|
||||||
|
#*.wwaproj merge=binary
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# behavior for image files
|
||||||
|
#
|
||||||
|
# image files are treated as binary by default.
|
||||||
|
###############################################################################
|
||||||
|
#*.jpg binary
|
||||||
|
#*.png binary
|
||||||
|
#*.gif binary
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# diff behavior for common document formats
|
||||||
|
#
|
||||||
|
# Convert binary document formats to text before diffing them. This feature
|
||||||
|
# is only available from the command line. Turn it on by uncommenting the
|
||||||
|
# entries below.
|
||||||
|
###############################################################################
|
||||||
|
#*.doc diff=astextplain
|
||||||
|
#*.DOC diff=astextplain
|
||||||
|
#*.docx diff=astextplain
|
||||||
|
#*.DOCX diff=astextplain
|
||||||
|
#*.dot diff=astextplain
|
||||||
|
#*.DOT diff=astextplain
|
||||||
|
#*.pdf diff=astextplain
|
||||||
|
#*.PDF diff=astextplain
|
||||||
|
#*.rtf diff=astextplain
|
||||||
|
#*.RTF diff=astextplain
|
||||||
363
v2rayN/.gitignore
vendored
Normal file
363
v2rayN/.gitignore
vendored
Normal file
@@ -0,0 +1,363 @@
|
|||||||
|
## Ignore Visual Studio temporary files, build results, and
|
||||||
|
## files generated by popular Visual Studio add-ons.
|
||||||
|
##
|
||||||
|
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
||||||
|
|
||||||
|
# User-specific files
|
||||||
|
*.rsuser
|
||||||
|
*.suo
|
||||||
|
*.user
|
||||||
|
*.userosscache
|
||||||
|
*.sln.docstates
|
||||||
|
|
||||||
|
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||||
|
*.userprefs
|
||||||
|
|
||||||
|
# Mono auto generated files
|
||||||
|
mono_crash.*
|
||||||
|
|
||||||
|
# Build results
|
||||||
|
[Dd]ebug/
|
||||||
|
[Dd]ebugPublic/
|
||||||
|
[Rr]elease/
|
||||||
|
[Rr]eleases/
|
||||||
|
x64/
|
||||||
|
x86/
|
||||||
|
[Ww][Ii][Nn]32/
|
||||||
|
[Aa][Rr][Mm]/
|
||||||
|
[Aa][Rr][Mm]64/
|
||||||
|
bld/
|
||||||
|
[Bb]in/
|
||||||
|
[Oo]bj/
|
||||||
|
[Oo]ut/
|
||||||
|
[Ll]og/
|
||||||
|
[Ll]ogs/
|
||||||
|
|
||||||
|
# Visual Studio 2015/2017 cache/options directory
|
||||||
|
.vs/
|
||||||
|
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||||
|
#wwwroot/
|
||||||
|
|
||||||
|
# Visual Studio 2017 auto generated files
|
||||||
|
Generated\ Files/
|
||||||
|
|
||||||
|
# MSTest test Results
|
||||||
|
[Tt]est[Rr]esult*/
|
||||||
|
[Bb]uild[Ll]og.*
|
||||||
|
|
||||||
|
# NUnit
|
||||||
|
*.VisualState.xml
|
||||||
|
TestResult.xml
|
||||||
|
nunit-*.xml
|
||||||
|
|
||||||
|
# Build Results of an ATL Project
|
||||||
|
[Dd]ebugPS/
|
||||||
|
[Rr]eleasePS/
|
||||||
|
dlldata.c
|
||||||
|
|
||||||
|
# Benchmark Results
|
||||||
|
BenchmarkDotNet.Artifacts/
|
||||||
|
|
||||||
|
# .NET Core
|
||||||
|
project.lock.json
|
||||||
|
project.fragment.lock.json
|
||||||
|
artifacts/
|
||||||
|
|
||||||
|
# ASP.NET Scaffolding
|
||||||
|
ScaffoldingReadMe.txt
|
||||||
|
|
||||||
|
# StyleCop
|
||||||
|
StyleCopReport.xml
|
||||||
|
|
||||||
|
# Files built by Visual Studio
|
||||||
|
*_i.c
|
||||||
|
*_p.c
|
||||||
|
*_h.h
|
||||||
|
*.ilk
|
||||||
|
*.meta
|
||||||
|
*.obj
|
||||||
|
*.iobj
|
||||||
|
*.pch
|
||||||
|
*.pdb
|
||||||
|
*.ipdb
|
||||||
|
*.pgc
|
||||||
|
*.pgd
|
||||||
|
*.rsp
|
||||||
|
*.sbr
|
||||||
|
*.tlb
|
||||||
|
*.tli
|
||||||
|
*.tlh
|
||||||
|
*.tmp
|
||||||
|
*.tmp_proj
|
||||||
|
*_wpftmp.csproj
|
||||||
|
*.log
|
||||||
|
*.vspscc
|
||||||
|
*.vssscc
|
||||||
|
.builds
|
||||||
|
*.pidb
|
||||||
|
*.svclog
|
||||||
|
*.scc
|
||||||
|
|
||||||
|
# Chutzpah Test files
|
||||||
|
_Chutzpah*
|
||||||
|
|
||||||
|
# Visual C++ cache files
|
||||||
|
ipch/
|
||||||
|
*.aps
|
||||||
|
*.ncb
|
||||||
|
*.opendb
|
||||||
|
*.opensdf
|
||||||
|
*.sdf
|
||||||
|
*.cachefile
|
||||||
|
*.VC.db
|
||||||
|
*.VC.VC.opendb
|
||||||
|
|
||||||
|
# Visual Studio profiler
|
||||||
|
*.psess
|
||||||
|
*.vsp
|
||||||
|
*.vspx
|
||||||
|
*.sap
|
||||||
|
|
||||||
|
# Visual Studio Trace Files
|
||||||
|
*.e2e
|
||||||
|
|
||||||
|
# TFS 2012 Local Workspace
|
||||||
|
$tf/
|
||||||
|
|
||||||
|
# Guidance Automation Toolkit
|
||||||
|
*.gpState
|
||||||
|
|
||||||
|
# ReSharper is a .NET coding add-in
|
||||||
|
_ReSharper*/
|
||||||
|
*.[Rr]e[Ss]harper
|
||||||
|
*.DotSettings.user
|
||||||
|
|
||||||
|
# TeamCity is a build add-in
|
||||||
|
_TeamCity*
|
||||||
|
|
||||||
|
# DotCover is a Code Coverage Tool
|
||||||
|
*.dotCover
|
||||||
|
|
||||||
|
# AxoCover is a Code Coverage Tool
|
||||||
|
.axoCover/*
|
||||||
|
!.axoCover/settings.json
|
||||||
|
|
||||||
|
# Coverlet is a free, cross platform Code Coverage Tool
|
||||||
|
coverage*.json
|
||||||
|
coverage*.xml
|
||||||
|
coverage*.info
|
||||||
|
|
||||||
|
# Visual Studio code coverage results
|
||||||
|
*.coverage
|
||||||
|
*.coveragexml
|
||||||
|
|
||||||
|
# NCrunch
|
||||||
|
_NCrunch_*
|
||||||
|
.*crunch*.local.xml
|
||||||
|
nCrunchTemp_*
|
||||||
|
|
||||||
|
# MightyMoose
|
||||||
|
*.mm.*
|
||||||
|
AutoTest.Net/
|
||||||
|
|
||||||
|
# Web workbench (sass)
|
||||||
|
.sass-cache/
|
||||||
|
|
||||||
|
# Installshield output folder
|
||||||
|
[Ee]xpress/
|
||||||
|
|
||||||
|
# DocProject is a documentation generator add-in
|
||||||
|
DocProject/buildhelp/
|
||||||
|
DocProject/Help/*.HxT
|
||||||
|
DocProject/Help/*.HxC
|
||||||
|
DocProject/Help/*.hhc
|
||||||
|
DocProject/Help/*.hhk
|
||||||
|
DocProject/Help/*.hhp
|
||||||
|
DocProject/Help/Html2
|
||||||
|
DocProject/Help/html
|
||||||
|
|
||||||
|
# Click-Once directory
|
||||||
|
publish/
|
||||||
|
|
||||||
|
# Publish Web Output
|
||||||
|
*.[Pp]ublish.xml
|
||||||
|
*.azurePubxml
|
||||||
|
# Note: Comment the next line if you want to checkin your web deploy settings,
|
||||||
|
# but database connection strings (with potential passwords) will be unencrypted
|
||||||
|
*.pubxml
|
||||||
|
*.publishproj
|
||||||
|
|
||||||
|
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||||
|
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||||
|
# in these scripts will be unencrypted
|
||||||
|
PublishScripts/
|
||||||
|
|
||||||
|
# NuGet Packages
|
||||||
|
*.nupkg
|
||||||
|
# NuGet Symbol Packages
|
||||||
|
*.snupkg
|
||||||
|
# The packages folder can be ignored because of Package Restore
|
||||||
|
**/[Pp]ackages/*
|
||||||
|
# except build/, which is used as an MSBuild target.
|
||||||
|
!**/[Pp]ackages/build/
|
||||||
|
# Uncomment if necessary however generally it will be regenerated when needed
|
||||||
|
#!**/[Pp]ackages/repositories.config
|
||||||
|
# NuGet v3's project.json files produces more ignorable files
|
||||||
|
*.nuget.props
|
||||||
|
*.nuget.targets
|
||||||
|
|
||||||
|
# Microsoft Azure Build Output
|
||||||
|
csx/
|
||||||
|
*.build.csdef
|
||||||
|
|
||||||
|
# Microsoft Azure Emulator
|
||||||
|
ecf/
|
||||||
|
rcf/
|
||||||
|
|
||||||
|
# Windows Store app package directories and files
|
||||||
|
AppPackages/
|
||||||
|
BundleArtifacts/
|
||||||
|
Package.StoreAssociation.xml
|
||||||
|
_pkginfo.txt
|
||||||
|
*.appx
|
||||||
|
*.appxbundle
|
||||||
|
*.appxupload
|
||||||
|
|
||||||
|
# Visual Studio cache files
|
||||||
|
# files ending in .cache can be ignored
|
||||||
|
*.[Cc]ache
|
||||||
|
# but keep track of directories ending in .cache
|
||||||
|
!?*.[Cc]ache/
|
||||||
|
|
||||||
|
# Others
|
||||||
|
ClientBin/
|
||||||
|
~$*
|
||||||
|
*~
|
||||||
|
*.dbmdl
|
||||||
|
*.dbproj.schemaview
|
||||||
|
*.jfm
|
||||||
|
*.pfx
|
||||||
|
*.publishsettings
|
||||||
|
orleans.codegen.cs
|
||||||
|
|
||||||
|
# Including strong name files can present a security risk
|
||||||
|
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
||||||
|
#*.snk
|
||||||
|
|
||||||
|
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||||
|
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||||
|
#bower_components/
|
||||||
|
|
||||||
|
# RIA/Silverlight projects
|
||||||
|
Generated_Code/
|
||||||
|
|
||||||
|
# Backup & report files from converting an old project file
|
||||||
|
# to a newer Visual Studio version. Backup files are not needed,
|
||||||
|
# because we have git ;-)
|
||||||
|
_UpgradeReport_Files/
|
||||||
|
Backup*/
|
||||||
|
UpgradeLog*.XML
|
||||||
|
UpgradeLog*.htm
|
||||||
|
ServiceFabricBackup/
|
||||||
|
*.rptproj.bak
|
||||||
|
|
||||||
|
# SQL Server files
|
||||||
|
*.mdf
|
||||||
|
*.ldf
|
||||||
|
*.ndf
|
||||||
|
|
||||||
|
# Business Intelligence projects
|
||||||
|
*.rdl.data
|
||||||
|
*.bim.layout
|
||||||
|
*.bim_*.settings
|
||||||
|
*.rptproj.rsuser
|
||||||
|
*- [Bb]ackup.rdl
|
||||||
|
*- [Bb]ackup ([0-9]).rdl
|
||||||
|
*- [Bb]ackup ([0-9][0-9]).rdl
|
||||||
|
|
||||||
|
# Microsoft Fakes
|
||||||
|
FakesAssemblies/
|
||||||
|
|
||||||
|
# GhostDoc plugin setting file
|
||||||
|
*.GhostDoc.xml
|
||||||
|
|
||||||
|
# Node.js Tools for Visual Studio
|
||||||
|
.ntvs_analysis.dat
|
||||||
|
node_modules/
|
||||||
|
|
||||||
|
# Visual Studio 6 build log
|
||||||
|
*.plg
|
||||||
|
|
||||||
|
# Visual Studio 6 workspace options file
|
||||||
|
*.opt
|
||||||
|
|
||||||
|
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||||
|
*.vbw
|
||||||
|
|
||||||
|
# Visual Studio LightSwitch build output
|
||||||
|
**/*.HTMLClient/GeneratedArtifacts
|
||||||
|
**/*.DesktopClient/GeneratedArtifacts
|
||||||
|
**/*.DesktopClient/ModelManifest.xml
|
||||||
|
**/*.Server/GeneratedArtifacts
|
||||||
|
**/*.Server/ModelManifest.xml
|
||||||
|
_Pvt_Extensions
|
||||||
|
|
||||||
|
# Paket dependency manager
|
||||||
|
.paket/paket.exe
|
||||||
|
paket-files/
|
||||||
|
|
||||||
|
# FAKE - F# Make
|
||||||
|
.fake/
|
||||||
|
|
||||||
|
# CodeRush personal settings
|
||||||
|
.cr/personal
|
||||||
|
|
||||||
|
# Python Tools for Visual Studio (PTVS)
|
||||||
|
__pycache__/
|
||||||
|
*.pyc
|
||||||
|
|
||||||
|
# Cake - Uncomment if you are using it
|
||||||
|
# tools/**
|
||||||
|
# !tools/packages.config
|
||||||
|
|
||||||
|
# Tabs Studio
|
||||||
|
*.tss
|
||||||
|
|
||||||
|
# Telerik's JustMock configuration file
|
||||||
|
*.jmconfig
|
||||||
|
|
||||||
|
# BizTalk build output
|
||||||
|
*.btp.cs
|
||||||
|
*.btm.cs
|
||||||
|
*.odx.cs
|
||||||
|
*.xsd.cs
|
||||||
|
|
||||||
|
# OpenCover UI analysis results
|
||||||
|
OpenCover/
|
||||||
|
|
||||||
|
# Azure Stream Analytics local run output
|
||||||
|
ASALocalRun/
|
||||||
|
|
||||||
|
# MSBuild Binary and Structured Log
|
||||||
|
*.binlog
|
||||||
|
|
||||||
|
# NVidia Nsight GPU debugger configuration file
|
||||||
|
*.nvuser
|
||||||
|
|
||||||
|
# MFractors (Xamarin productivity tool) working folder
|
||||||
|
.mfractor/
|
||||||
|
|
||||||
|
# Local History for Visual Studio
|
||||||
|
.localhistory/
|
||||||
|
|
||||||
|
# BeatPulse healthcheck temp database
|
||||||
|
healthchecksdb
|
||||||
|
|
||||||
|
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
||||||
|
MigrationBackup/
|
||||||
|
|
||||||
|
# Ionide (cross platform F# VS Code tools) working folder
|
||||||
|
.ionide/
|
||||||
|
|
||||||
|
# Fody - auto-generated XML schema
|
||||||
|
FodyWeavers.xsd
|
||||||
112
v2rayN/PacLib/PacHandler.cs
Normal file
112
v2rayN/PacLib/PacHandler.cs
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace PacLib;
|
||||||
|
|
||||||
|
public class PacHandler
|
||||||
|
{
|
||||||
|
private static string _configPath;
|
||||||
|
private static int _httpPort;
|
||||||
|
private static int _pacPort;
|
||||||
|
private static TcpListener? _tcpListener;
|
||||||
|
private static string _pacText;
|
||||||
|
private static bool _isRunning;
|
||||||
|
private static bool _needRestart = true;
|
||||||
|
|
||||||
|
|
||||||
|
public static void Start(string configPath, int httpPort, int pacPort)
|
||||||
|
{
|
||||||
|
if (configPath.Equals(_configPath)
|
||||||
|
&& httpPort.Equals(_httpPort)
|
||||||
|
&& pacPort.Equals(_pacPort)
|
||||||
|
&& _isRunning)
|
||||||
|
{
|
||||||
|
_needRestart = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
_configPath = configPath;
|
||||||
|
_httpPort = httpPort;
|
||||||
|
_pacPort = pacPort;
|
||||||
|
|
||||||
|
InitText();
|
||||||
|
|
||||||
|
if (_needRestart)
|
||||||
|
{
|
||||||
|
Stop();
|
||||||
|
RunListener();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void InitText()
|
||||||
|
{
|
||||||
|
var path = Path.Combine(_configPath, "pac.txt");
|
||||||
|
if (!File.Exists(path))
|
||||||
|
{
|
||||||
|
File.AppendAllText(path, Resources.ResourceManager.GetString("pac"));
|
||||||
|
}
|
||||||
|
|
||||||
|
_pacText = File.ReadAllText(path).Replace("__PROXY__", $"PROXY 127.0.0.1:{_httpPort};DIRECT;");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void RunListener()
|
||||||
|
{
|
||||||
|
_tcpListener = TcpListener.Create(_pacPort);
|
||||||
|
_isRunning = true;
|
||||||
|
_tcpListener.Start();
|
||||||
|
Task.Factory.StartNew(() =>
|
||||||
|
{
|
||||||
|
while (_isRunning)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!_tcpListener.Pending())
|
||||||
|
{
|
||||||
|
Thread.Sleep(10);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var client = _tcpListener.AcceptTcpClient();
|
||||||
|
Task.Run(() =>
|
||||||
|
{
|
||||||
|
var stream = client.GetStream();
|
||||||
|
var sb = new StringBuilder();
|
||||||
|
sb.AppendLine("HTTP/1.0 200 OK");
|
||||||
|
sb.AppendLine("Content-type:application/x-ns-proxy-autoconfig");
|
||||||
|
sb.AppendLine("Connection:close");
|
||||||
|
sb.AppendLine("Content-Length:" + Encoding.UTF8.GetByteCount(_pacText));
|
||||||
|
sb.AppendLine();
|
||||||
|
sb.Append(_pacText);
|
||||||
|
var content = Encoding.UTF8.GetBytes(sb.ToString());
|
||||||
|
stream.Write(content, 0, content.Length);
|
||||||
|
stream.Flush();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}, TaskCreationOptions.LongRunning);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void Stop()
|
||||||
|
{
|
||||||
|
if (_tcpListener != null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_isRunning = false;
|
||||||
|
_tcpListener.Stop();
|
||||||
|
_tcpListener = null;
|
||||||
|
}
|
||||||
|
catch (Exception e)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
20
v2rayN/PacLib/PacLib.csproj
Normal file
20
v2rayN/PacLib/PacLib.csproj
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net6.0-windows</TargetFramework>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Update="Resources.Designer.cs">
|
||||||
|
<DesignTime>True</DesignTime>
|
||||||
|
<AutoGen>True</AutoGen>
|
||||||
|
<DependentUpon>Resources.resx</DependentUpon>
|
||||||
|
</Compile>
|
||||||
|
<EmbeddedResource Update="Resources.resx">
|
||||||
|
<Generator>ResXFileCodeGenerator</Generator>
|
||||||
|
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
|
||||||
|
</EmbeddedResource>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
95
v2rayN/PacLib/Resources.Designer.cs
generated
Normal file
95
v2rayN/PacLib/Resources.Designer.cs
generated
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <auto-generated>
|
||||||
|
// 此代码由工具生成。
|
||||||
|
// 运行时版本:4.0.30319.42000
|
||||||
|
//
|
||||||
|
// 对此文件的更改可能会导致不正确的行为,并且如果
|
||||||
|
// 重新生成代码,这些更改将会丢失。
|
||||||
|
// </auto-generated>
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
namespace PacLib {
|
||||||
|
using System;
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 一个强类型的资源类,用于查找本地化的字符串等。
|
||||||
|
/// </summary>
|
||||||
|
// 此类是由 StronglyTypedResourceBuilder
|
||||||
|
// 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。
|
||||||
|
// 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen
|
||||||
|
// (以 /str 作为命令选项),或重新生成 VS 项目。
|
||||||
|
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")]
|
||||||
|
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||||
|
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
|
||||||
|
internal class Resources {
|
||||||
|
|
||||||
|
private static global::System.Resources.ResourceManager resourceMan;
|
||||||
|
|
||||||
|
private static global::System.Globalization.CultureInfo resourceCulture;
|
||||||
|
|
||||||
|
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||||
|
internal Resources() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 返回此类使用的缓存的 ResourceManager 实例。
|
||||||
|
/// </summary>
|
||||||
|
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||||
|
internal static global::System.Resources.ResourceManager ResourceManager {
|
||||||
|
get {
|
||||||
|
if (object.ReferenceEquals(resourceMan, null)) {
|
||||||
|
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("PacLib.Resources", typeof(Resources).Assembly);
|
||||||
|
resourceMan = temp;
|
||||||
|
}
|
||||||
|
return resourceMan;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 重写当前线程的 CurrentUICulture 属性,对
|
||||||
|
/// 使用此强类型资源类的所有资源查找执行重写。
|
||||||
|
/// </summary>
|
||||||
|
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
|
||||||
|
internal static global::System.Globalization.CultureInfo Culture {
|
||||||
|
get {
|
||||||
|
return resourceCulture;
|
||||||
|
}
|
||||||
|
set {
|
||||||
|
resourceCulture = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 查找类似 var proxy = '__PROXY__';
|
||||||
|
///var rules = [
|
||||||
|
/// [
|
||||||
|
/// [],
|
||||||
|
/// []
|
||||||
|
/// ],
|
||||||
|
/// [
|
||||||
|
/// [
|
||||||
|
/// "aftygh.gov.tw",
|
||||||
|
/// "aide.gov.tw",
|
||||||
|
/// "aliyun.com",
|
||||||
|
/// "arte.gov.tw",
|
||||||
|
/// "baidu.com",
|
||||||
|
/// "chinaso.com",
|
||||||
|
/// "chinaz.com",
|
||||||
|
/// "chukuang.gov.tw",
|
||||||
|
/// "cycab.gov.tw",
|
||||||
|
/// "dbnsa.gov.tw",
|
||||||
|
/// "df.gov.tw",
|
||||||
|
/// "eastcoast-nsa.gov.tw",
|
||||||
|
/// "erv-nsa.gov.tw",
|
||||||
|
/// "grb.gov.tw",
|
||||||
|
/// "haosou.com",
|
||||||
|
/// [字符串的其余部分被截断]"; 的本地化字符串。
|
||||||
|
/// </summary>
|
||||||
|
internal static string pac {
|
||||||
|
get {
|
||||||
|
return ResourceManager.GetString("pac", resourceCulture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -117,4 +117,8 @@
|
|||||||
<resheader name="writer">
|
<resheader name="writer">
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
</resheader>
|
</resheader>
|
||||||
|
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
||||||
|
<data name="pac" type="System.Resources.ResXFileRef, System.Windows.Forms">
|
||||||
|
<value>Resources\pac.txt;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;gb2312</value>
|
||||||
|
</data>
|
||||||
</root>
|
</root>
|
||||||
6023
v2rayN/PacLib/Resources/pac.txt
Normal file
6023
v2rayN/PacLib/Resources/pac.txt
Normal file
File diff suppressed because it is too large
Load Diff
24
v2rayN/ProtosLib/ProtosLib.csproj
Normal file
24
v2rayN/ProtosLib/ProtosLib.csproj
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net6.0-windows</TargetFramework>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Protobuf Include="Statistics.proto" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Google.Protobuf">
|
||||||
|
<Version>3.21.9</Version>
|
||||||
|
</PackageReference>
|
||||||
|
<PackageReference Include="Grpc.Core">
|
||||||
|
<Version>2.46.5</Version>
|
||||||
|
</PackageReference>
|
||||||
|
<PackageReference Include="Grpc.Tools" Version="2.50.0">
|
||||||
|
<PrivateAssets>all</PrivateAssets>
|
||||||
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
|
</PackageReference>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
syntax = "proto3";
|
syntax = "proto3";
|
||||||
|
|
||||||
package v2ray.core.app.stats.command;
|
package v2ray.core.app.stats.command;
|
||||||
option csharp_namespace = "v2rayN.Protos.Statistics";
|
option csharp_namespace = "ProtosLib.Statistics";
|
||||||
|
|
||||||
message GetStatsRequest {
|
message GetStatsRequest {
|
||||||
// Name of the stat counter.
|
// Name of the stat counter.
|
||||||
15
v2rayN/ProtosLib/Tests.cs
Normal file
15
v2rayN/ProtosLib/Tests.cs
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
using ProtosLib.Statistics;
|
||||||
|
|
||||||
|
namespace ProtosLib
|
||||||
|
{
|
||||||
|
public class Tests
|
||||||
|
{
|
||||||
|
private StatsService.StatsServiceClient client_;
|
||||||
|
|
||||||
|
public Tests()
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,41 +1,43 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio 15
|
# Visual Studio Version 17
|
||||||
VisualStudioVersion = 15.0.28010.2050
|
VisualStudioVersion = 17.3.32811.315
|
||||||
MinimumVisualStudioVersion = 10.0.40219.1
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "v2rayN", "v2rayN\v2rayN.csproj", "{0A9785E6-D256-4B73-9757-4EF59955FD1E}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "v2rayN", "v2rayN\v2rayN.csproj", "{6DE127CA-1763-4236-B297-D2EF9CB2EC9B}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "v2rayUpgrade", "v2rayUpgrade\v2rayUpgrade.csproj", "{F82BE52A-155C-492C-9E0A-1E917EC62C78}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ProtosLib", "ProtosLib\ProtosLib.csproj", "{C5F24BB0-9CC1-44DD-82FF-D545F081819B}"
|
||||||
|
EndProject
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PacLib", "PacLib\PacLib.csproj", "{EE4E6CD8-8353-446B-8F29-A841A02AE5EC}"
|
||||||
|
EndProject
|
||||||
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "v2rayUpgrade", "v2rayUpgrade\v2rayUpgrade.csproj", "{3CD0B9E8-331B-42C6-A395-4DA0FD4BC8EB}"
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
Debug|x86 = Debug|x86
|
|
||||||
Release|Any CPU = Release|Any CPU
|
Release|Any CPU = Release|Any CPU
|
||||||
Release|x86 = Release|x86
|
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
{0A9785E6-D256-4B73-9757-4EF59955FD1E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{6DE127CA-1763-4236-B297-D2EF9CB2EC9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{0A9785E6-D256-4B73-9757-4EF59955FD1E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{6DE127CA-1763-4236-B297-D2EF9CB2EC9B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{0A9785E6-D256-4B73-9757-4EF59955FD1E}.Debug|x86.ActiveCfg = Debug|Any CPU
|
{6DE127CA-1763-4236-B297-D2EF9CB2EC9B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{0A9785E6-D256-4B73-9757-4EF59955FD1E}.Debug|x86.Build.0 = Debug|Any CPU
|
{6DE127CA-1763-4236-B297-D2EF9CB2EC9B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{0A9785E6-D256-4B73-9757-4EF59955FD1E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{C5F24BB0-9CC1-44DD-82FF-D545F081819B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{0A9785E6-D256-4B73-9757-4EF59955FD1E}.Release|Any CPU.Build.0 = Release|Any CPU
|
{C5F24BB0-9CC1-44DD-82FF-D545F081819B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{0A9785E6-D256-4B73-9757-4EF59955FD1E}.Release|x86.ActiveCfg = Release|Any CPU
|
{C5F24BB0-9CC1-44DD-82FF-D545F081819B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{F82BE52A-155C-492C-9E0A-1E917EC62C78}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
{C5F24BB0-9CC1-44DD-82FF-D545F081819B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{F82BE52A-155C-492C-9E0A-1E917EC62C78}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{EE4E6CD8-8353-446B-8F29-A841A02AE5EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{F82BE52A-155C-492C-9E0A-1E917EC62C78}.Debug|x86.ActiveCfg = Debug|Any CPU
|
{EE4E6CD8-8353-446B-8F29-A841A02AE5EC}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{F82BE52A-155C-492C-9E0A-1E917EC62C78}.Debug|x86.Build.0 = Debug|Any CPU
|
{EE4E6CD8-8353-446B-8F29-A841A02AE5EC}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{F82BE52A-155C-492C-9E0A-1E917EC62C78}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{EE4E6CD8-8353-446B-8F29-A841A02AE5EC}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
{F82BE52A-155C-492C-9E0A-1E917EC62C78}.Release|Any CPU.Build.0 = Release|Any CPU
|
{3CD0B9E8-331B-42C6-A395-4DA0FD4BC8EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
{F82BE52A-155C-492C-9E0A-1E917EC62C78}.Release|x86.ActiveCfg = Release|Any CPU
|
{3CD0B9E8-331B-42C6-A395-4DA0FD4BC8EB}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{F82BE52A-155C-492C-9E0A-1E917EC62C78}.Release|x86.Build.0 = Release|Any CPU
|
{3CD0B9E8-331B-42C6-A395-4DA0FD4BC8EB}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{3CD0B9E8-331B-42C6-A395-4DA0FD4BC8EB}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
RESX_SortFileContentOnSave = True
|
SolutionGuid = {43E06CBD-3DA9-40A3-8E4D-F0943CB0DD32}
|
||||||
SolutionGuid = {56B88873-C9CC-4069-A1E5-DABD6C6E865E}
|
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
EndGlobal
|
EndGlobal
|
||||||
|
|||||||
Binary file not shown.
120
v2rayN/v2rayN/App.xaml
Normal file
120
v2rayN/v2rayN/App.xaml
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
<Application
|
||||||
|
x:Class="v2rayN.App"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:local="clr-namespace:v2rayN"
|
||||||
|
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
|
||||||
|
ShutdownMode="OnExplicitShutdown"
|
||||||
|
StartupUri="Views/MainWindow.xaml">
|
||||||
|
<Application.Resources>
|
||||||
|
<ResourceDictionary xmlns:system="clr-namespace:System;assembly=mscorlib">
|
||||||
|
<ResourceDictionary.MergedDictionaries>
|
||||||
|
<materialDesign:BundledTheme
|
||||||
|
BaseTheme="Light"
|
||||||
|
PrimaryColor="DeepPurple"
|
||||||
|
SecondaryColor="Lime" />
|
||||||
|
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" />
|
||||||
|
</ResourceDictionary.MergedDictionaries>
|
||||||
|
<system:Double x:Key="MenuItemHeight">26</system:Double>
|
||||||
|
<Thickness
|
||||||
|
x:Key="ServerItemMargin"
|
||||||
|
Bottom="4"
|
||||||
|
Left="4"
|
||||||
|
Right="4"
|
||||||
|
Top="4" />
|
||||||
|
<Thickness
|
||||||
|
x:Key="SettingItemMargin"
|
||||||
|
Bottom="8"
|
||||||
|
Left="8"
|
||||||
|
Right="8"
|
||||||
|
Top="8" />
|
||||||
|
<Style
|
||||||
|
x:Key="ModuleTitle"
|
||||||
|
BasedOn="{StaticResource MaterialDesignTextBlock}"
|
||||||
|
TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="FontSize" Value="16" />
|
||||||
|
</Style>
|
||||||
|
<Style
|
||||||
|
x:Key="ToolbarTextBlock"
|
||||||
|
BasedOn="{StaticResource MaterialDesignTextBlock}"
|
||||||
|
TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="FontSize" Value="12" />
|
||||||
|
</Style>
|
||||||
|
<Style
|
||||||
|
x:Key="StatusbarItem"
|
||||||
|
BasedOn="{StaticResource MaterialDesignTextBlock}"
|
||||||
|
TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="FontSize" Value="12" />
|
||||||
|
<Setter Property="Padding" Value="0" />
|
||||||
|
</Style>
|
||||||
|
<Style TargetType="{x:Type TextElement}">
|
||||||
|
<Setter Property="FontWeight" Value="Regular" />
|
||||||
|
<Setter Property="Foreground" Value="{DynamicResource MaterialDesignBody}" />
|
||||||
|
</Style>
|
||||||
|
<Style TargetType="{x:Type TextBlock}">
|
||||||
|
<Setter Property="FontWeight" Value="Regular" />
|
||||||
|
<Setter Property="Foreground" Value="{DynamicResource MaterialDesignBody}" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="lvItemSelected" TargetType="{x:Type ListViewItem}">
|
||||||
|
<Setter Property="Height" Value="20" />
|
||||||
|
<Setter Property="FontSize" Value="12" />
|
||||||
|
<Style.Triggers>
|
||||||
|
<Trigger Property="IsSelected" Value="true">
|
||||||
|
<Setter Property="Background" Value="{DynamicResource PrimaryHueLightBrush}" />
|
||||||
|
</Trigger>
|
||||||
|
<Trigger Property="IsMouseOver" Value="true">
|
||||||
|
<Setter Property="Background" Value="{DynamicResource PrimaryHueMidBrush}" />
|
||||||
|
</Trigger>
|
||||||
|
</Style.Triggers>
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
<Style x:Key="GridViewColumnHeaderStyle" TargetType="{x:Type GridViewColumnHeader}">
|
||||||
|
<Setter Property="Height" Value="30" />
|
||||||
|
</Style>
|
||||||
|
<Style
|
||||||
|
x:Key="ListItemCheckBox"
|
||||||
|
BasedOn="{StaticResource MaterialDesignUserForegroundCheckBox}"
|
||||||
|
TargetType="{x:Type CheckBox}">
|
||||||
|
<Setter Property="FontSize" Value="12" />
|
||||||
|
</Style>
|
||||||
|
<Style x:Key="ListItemChip" TargetType="{x:Type materialDesign:Chip}">
|
||||||
|
<Setter Property="FontSize" Value="11" />
|
||||||
|
</Style>
|
||||||
|
<Style
|
||||||
|
x:Key="DefButton"
|
||||||
|
BasedOn="{StaticResource MaterialDesignRaisedButton}"
|
||||||
|
TargetType="{x:Type ButtonBase}">
|
||||||
|
<Setter Property="FontSize" Value="14" />
|
||||||
|
</Style>
|
||||||
|
<Style
|
||||||
|
x:Key="DefContextMenu"
|
||||||
|
BasedOn="{StaticResource MaterialDesignContextMenu}"
|
||||||
|
TargetType="{x:Type ContextMenu}">
|
||||||
|
<Setter Property="FontSize" Value="13" />
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
<Style
|
||||||
|
x:Key="ToolbarMenu"
|
||||||
|
BasedOn="{StaticResource MaterialDesignMenu}"
|
||||||
|
TargetType="{x:Type Menu}">
|
||||||
|
<Setter Property="FontSize" Value="13" />
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
<Style
|
||||||
|
x:Key="DefComboBox"
|
||||||
|
BasedOn="{StaticResource MaterialDesignComboBox}"
|
||||||
|
TargetType="{x:Type ComboBox}">
|
||||||
|
<Setter Property="FontSize" Value="12" />
|
||||||
|
<Setter Property="HorizontalAlignment" Value="Left" />
|
||||||
|
</Style>
|
||||||
|
<Style
|
||||||
|
x:Key="DefDataGrid"
|
||||||
|
BasedOn="{StaticResource MaterialDesignDataGrid}"
|
||||||
|
TargetType="{x:Type DataGrid}">
|
||||||
|
<Setter Property="FontSize" Value="12" />
|
||||||
|
</Style>
|
||||||
|
</ResourceDictionary>
|
||||||
|
|
||||||
|
</Application.Resources>
|
||||||
|
|
||||||
|
</Application>
|
||||||
85
v2rayN/v2rayN/App.xaml.cs
Normal file
85
v2rayN/v2rayN/App.xaml.cs
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Threading;
|
||||||
|
using v2rayN.Handler;
|
||||||
|
using v2rayN.Mode;
|
||||||
|
using v2rayN.Tool;
|
||||||
|
|
||||||
|
namespace v2rayN
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Interaction logic for App.xaml
|
||||||
|
/// </summary>
|
||||||
|
public partial class App : Application
|
||||||
|
{
|
||||||
|
public static EventWaitHandle ProgramStarted;
|
||||||
|
private static Config _config;
|
||||||
|
|
||||||
|
public App()
|
||||||
|
{
|
||||||
|
// Locator.CurrentMutable.RegisterViewsForViewModels(Assembly.GetCallingAssembly());
|
||||||
|
this.DispatcherUnhandledException += App_DispatcherUnhandledException;
|
||||||
|
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
|
||||||
|
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 只打开一个进程
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="e"></param>
|
||||||
|
protected override void OnStartup(StartupEventArgs e)
|
||||||
|
{
|
||||||
|
Global.ExePathKey = Utils.GetMD5(Utils.GetExePath());
|
||||||
|
|
||||||
|
ProgramStarted = new EventWaitHandle(false, EventResetMode.AutoReset, Global.ExePathKey, out bool bCreatedNew);
|
||||||
|
if (!bCreatedNew)
|
||||||
|
{
|
||||||
|
ProgramStarted.Set();
|
||||||
|
Current.Shutdown();
|
||||||
|
Environment.Exit(0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Global.processJob = new Job();
|
||||||
|
|
||||||
|
Logging.Setup();
|
||||||
|
Utils.SaveLog($"v2rayN start up | {Utils.GetVersion()} | {Utils.GetExePath()}");
|
||||||
|
Logging.ClearLogs();
|
||||||
|
|
||||||
|
Init();
|
||||||
|
|
||||||
|
Thread.CurrentThread.CurrentUICulture = new(_config.uiItem.currentLanguage);
|
||||||
|
|
||||||
|
base.OnStartup(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void Init()
|
||||||
|
{
|
||||||
|
if (ConfigHandler.LoadConfig(ref _config) != 0)
|
||||||
|
{
|
||||||
|
UI.ShowWarning($"Loading GUI configuration file is abnormal,please restart the application{Environment.NewLine}加载GUI配置文件异常,请重启应用");
|
||||||
|
Application.Current.Shutdown();
|
||||||
|
Environment.Exit(0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
|
||||||
|
{
|
||||||
|
Utils.SaveLog("App_DispatcherUnhandledException", e.Exception);
|
||||||
|
e.Handled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.ExceptionObject != null)
|
||||||
|
{
|
||||||
|
Utils.SaveLog("CurrentDomain_UnhandledException", (Exception)e.ExceptionObject!);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
|
||||||
|
{
|
||||||
|
Utils.SaveLog("TaskScheduler_UnobservedTaskException", e.Exception);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
10
v2rayN/v2rayN/AssemblyInfo.cs
Normal file
10
v2rayN/v2rayN/AssemblyInfo.cs
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
using System.Windows;
|
||||||
|
|
||||||
|
[assembly: ThemeInfo(
|
||||||
|
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
|
||||||
|
//(used if a resource is not found in the page,
|
||||||
|
// or application resource dictionaries)
|
||||||
|
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
|
||||||
|
//(used if a resource is not found in the page,
|
||||||
|
// app, or any theme specific resource dictionaries)
|
||||||
|
)]
|
||||||
216
v2rayN/v2rayN/Base/HttpClientHelper.cs
Normal file
216
v2rayN/v2rayN/Base/HttpClientHelper.cs
Normal file
@@ -0,0 +1,216 @@
|
|||||||
|
using System.IO;
|
||||||
|
using System.Net.Http;
|
||||||
|
using System.Net.Http.Headers;
|
||||||
|
|
||||||
|
namespace v2rayN.Base
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// </summary>
|
||||||
|
public class HttpClientHelper
|
||||||
|
{
|
||||||
|
private static HttpClientHelper httpClientHelper = null;
|
||||||
|
private HttpClient httpClient;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// </summary>
|
||||||
|
private HttpClientHelper() { }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static HttpClientHelper GetInstance()
|
||||||
|
{
|
||||||
|
if (httpClientHelper != null)
|
||||||
|
{
|
||||||
|
return httpClientHelper;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
HttpClientHelper httpClientHelper = new HttpClientHelper();
|
||||||
|
|
||||||
|
HttpClientHandler handler = new HttpClientHandler() { UseCookies = false };
|
||||||
|
httpClientHelper.httpClient = new HttpClient(handler);
|
||||||
|
return httpClientHelper;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public async Task<string> GetAsync(string url)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(url))
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
HttpResponseMessage response = await httpClient.GetAsync(url);
|
||||||
|
|
||||||
|
return await response.Content.ReadAsStringAsync();
|
||||||
|
}
|
||||||
|
public async Task<string> GetAsync(HttpClient client, string url, CancellationToken token)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(url))
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
HttpResponseMessage response = await client.GetAsync(url, token);
|
||||||
|
if (!response.IsSuccessStatusCode)
|
||||||
|
{
|
||||||
|
throw new Exception(string.Format("{0}", response.StatusCode));
|
||||||
|
}
|
||||||
|
return await response.Content.ReadAsStringAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task PutAsync(string url, Dictionary<string, string> headers)
|
||||||
|
{
|
||||||
|
var myContent = Utils.ToJson(headers);
|
||||||
|
var buffer = System.Text.Encoding.UTF8.GetBytes(myContent);
|
||||||
|
var byteContent = new ByteArrayContent(buffer);
|
||||||
|
byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
|
||||||
|
|
||||||
|
var result = await httpClient.PutAsync(url, byteContent);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task DownloadFileAsync(HttpClient client, string url, string fileName, IProgress<double> progress, CancellationToken token)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(url))
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException("url");
|
||||||
|
}
|
||||||
|
if (string.IsNullOrEmpty(fileName))
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException("fileName");
|
||||||
|
}
|
||||||
|
if (File.Exists(fileName))
|
||||||
|
{
|
||||||
|
File.Delete(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, token);
|
||||||
|
|
||||||
|
if (!response.IsSuccessStatusCode)
|
||||||
|
{
|
||||||
|
throw new Exception(string.Format("{0}", response.StatusCode));
|
||||||
|
}
|
||||||
|
|
||||||
|
var total = response.Content.Headers.ContentLength.HasValue ? response.Content.Headers.ContentLength.Value : -1L;
|
||||||
|
var canReportProgress = total != -1 && progress != null;
|
||||||
|
|
||||||
|
using (var stream = await response.Content.ReadAsStreamAsync())
|
||||||
|
{
|
||||||
|
using (var file = File.Create(fileName))
|
||||||
|
{
|
||||||
|
var totalRead = 0L;
|
||||||
|
var buffer = new byte[1024 * 1024];
|
||||||
|
var isMoreToRead = true;
|
||||||
|
var progressPercentage = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
token.ThrowIfCancellationRequested();
|
||||||
|
|
||||||
|
var read = await stream.ReadAsync(buffer, 0, buffer.Length, token);
|
||||||
|
|
||||||
|
if (read == 0)
|
||||||
|
{
|
||||||
|
isMoreToRead = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var data = new byte[read];
|
||||||
|
buffer.ToList().CopyTo(0, data, 0, read);
|
||||||
|
|
||||||
|
// TODO: put here the code to write the file to disk
|
||||||
|
file.Write(data, 0, read);
|
||||||
|
|
||||||
|
totalRead += read;
|
||||||
|
|
||||||
|
if (canReportProgress)
|
||||||
|
{
|
||||||
|
var percent = Convert.ToInt32((totalRead * 1d) / (total * 1d) * 100);
|
||||||
|
if (progressPercentage != percent && percent % 10 == 0)
|
||||||
|
{
|
||||||
|
progressPercentage = percent;
|
||||||
|
progress.Report(percent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (isMoreToRead);
|
||||||
|
file.Close();
|
||||||
|
if (canReportProgress)
|
||||||
|
{
|
||||||
|
progress.Report(101);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task DownloadDataAsync4Speed(HttpClient client, string url, IProgress<string> progress, CancellationToken token)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(url))
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException("url");
|
||||||
|
}
|
||||||
|
|
||||||
|
var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead, token);
|
||||||
|
|
||||||
|
if (!response.IsSuccessStatusCode)
|
||||||
|
{
|
||||||
|
throw new Exception(string.Format("{0}", response.StatusCode));
|
||||||
|
}
|
||||||
|
|
||||||
|
//var total = response.Content.Headers.ContentLength.HasValue ? response.Content.Headers.ContentLength.Value : -1L;
|
||||||
|
//var canReportProgress = total != -1 && progress != null;
|
||||||
|
|
||||||
|
using (var stream = await response.Content.ReadAsStreamAsync())
|
||||||
|
{
|
||||||
|
var totalRead = 0L;
|
||||||
|
var buffer = new byte[1024 * 64];
|
||||||
|
var isMoreToRead = true;
|
||||||
|
string progressSpeed = string.Empty;
|
||||||
|
DateTime totalDatetime = DateTime.Now;
|
||||||
|
int totalSecond = 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (token.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
if (totalRead > 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
token.ThrowIfCancellationRequested();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var read = await stream.ReadAsync(buffer, 0, buffer.Length, token);
|
||||||
|
|
||||||
|
if (read == 0)
|
||||||
|
{
|
||||||
|
isMoreToRead = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var data = new byte[read];
|
||||||
|
buffer.ToList().CopyTo(0, data, 0, read);
|
||||||
|
|
||||||
|
// TODO:
|
||||||
|
totalRead += read;
|
||||||
|
|
||||||
|
TimeSpan ts = (DateTime.Now - totalDatetime);
|
||||||
|
if (progress != null && ts.Seconds > totalSecond)
|
||||||
|
{
|
||||||
|
totalSecond = ts.Seconds;
|
||||||
|
var speed = (totalRead * 1d / ts.TotalMilliseconds / 1000).ToString("#0.0");
|
||||||
|
if (progressSpeed != speed)
|
||||||
|
{
|
||||||
|
progressSpeed = speed;
|
||||||
|
progress.Report(speed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (isMoreToRead);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,101 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Net;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading;
|
|
||||||
|
|
||||||
namespace v2rayN.Base
|
|
||||||
{
|
|
||||||
public class HttpWebServer
|
|
||||||
{
|
|
||||||
private HttpListener _listener;
|
|
||||||
private Func<string, string> _responderMethod;
|
|
||||||
|
|
||||||
public HttpWebServer(string[] prefixes, Func<string, string> method)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
_listener = new HttpListener();
|
|
||||||
|
|
||||||
if (!HttpListener.IsSupported)
|
|
||||||
throw new NotSupportedException(
|
|
||||||
"Needs Windows XP SP2, Server 2003 or later.");
|
|
||||||
|
|
||||||
// URI prefixes are required, for example
|
|
||||||
// "http://localhost:8080/index/".
|
|
||||||
if (prefixes == null || prefixes.Length == 0)
|
|
||||||
throw new ArgumentException("prefixes");
|
|
||||||
|
|
||||||
// A responder method is required
|
|
||||||
if (method == null)
|
|
||||||
throw new ArgumentException("method");
|
|
||||||
|
|
||||||
foreach (string s in prefixes)
|
|
||||||
_listener.Prefixes.Add(s);
|
|
||||||
|
|
||||||
_responderMethod = method;
|
|
||||||
_listener.Start();
|
|
||||||
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Utils.SaveLog(ex.Message, ex);
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public HttpWebServer(Func<string, string> method, params string[] prefixes)
|
|
||||||
: this(prefixes, method) { }
|
|
||||||
|
|
||||||
public void Run()
|
|
||||||
{
|
|
||||||
ThreadPool.QueueUserWorkItem((o) =>
|
|
||||||
{
|
|
||||||
Utils.SaveLog("Webserver running...");
|
|
||||||
try
|
|
||||||
{
|
|
||||||
while (_listener.IsListening)
|
|
||||||
{
|
|
||||||
ThreadPool.QueueUserWorkItem((c) =>
|
|
||||||
{
|
|
||||||
HttpListenerContext ctx = c as HttpListenerContext;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
string address = ctx.Request.LocalEndPoint.Address.ToString();
|
|
||||||
Utils.SaveLog("Webserver Request " + address);
|
|
||||||
string rstr = _responderMethod(address);
|
|
||||||
byte[] buf = Encoding.UTF8.GetBytes(rstr);
|
|
||||||
ctx.Response.StatusCode = 200;
|
|
||||||
ctx.Response.ContentType = "application/x-ns-proxy-autoconfig";
|
|
||||||
ctx.Response.ContentLength64 = buf.Length;
|
|
||||||
ctx.Response.OutputStream.Write(buf, 0, buf.Length);
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
} // suppress any exceptions
|
|
||||||
finally
|
|
||||||
{
|
|
||||||
// always close the stream
|
|
||||||
ctx.Response.OutputStream.Close();
|
|
||||||
}
|
|
||||||
}, _listener.GetContext());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Utils.SaveLog(ex.Message, ex);
|
|
||||||
} // suppress any exceptions
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Stop()
|
|
||||||
{
|
|
||||||
if (_listener != null)
|
|
||||||
{
|
|
||||||
_listener.Stop();
|
|
||||||
_listener.Close();
|
|
||||||
_listener = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,141 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.IO;
|
|
||||||
using System.Net;
|
|
||||||
using System.Net.Sockets;
|
|
||||||
using System.Threading;
|
|
||||||
|
|
||||||
namespace v2rayN.Base
|
|
||||||
{
|
|
||||||
public class HttpWebServerB
|
|
||||||
{
|
|
||||||
private TcpListener listener;
|
|
||||||
private int port;
|
|
||||||
private Func<string, string> _responderMethod;
|
|
||||||
|
|
||||||
public HttpWebServerB(int port, Func<string, string> method)
|
|
||||||
{
|
|
||||||
this.port = port;
|
|
||||||
this._responderMethod = method;
|
|
||||||
|
|
||||||
Thread thread = new Thread(StartListen)
|
|
||||||
{
|
|
||||||
IsBackground = true
|
|
||||||
};
|
|
||||||
thread.Start();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Stop()
|
|
||||||
{
|
|
||||||
if (listener != null)
|
|
||||||
{
|
|
||||||
listener.Stop();
|
|
||||||
listener = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void StartListen()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
listener = new TcpListener(IPAddress.Any, port);
|
|
||||||
listener.Start();
|
|
||||||
Utils.SaveLog("WebserverB running...");
|
|
||||||
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
if (!listener.Pending())
|
|
||||||
{
|
|
||||||
Thread.Sleep(100);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
TcpClient socket = listener.AcceptTcpClient();
|
|
||||||
Thread thread = new Thread(new ParameterizedThreadStart(ProcessThread))
|
|
||||||
{
|
|
||||||
IsBackground = true
|
|
||||||
};
|
|
||||||
thread.Start(socket);
|
|
||||||
Thread.Sleep(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
Utils.SaveLog("WebserverB start fail.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private void ProcessThread(object obj)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
TcpClient socket = obj as TcpClient;
|
|
||||||
|
|
||||||
BufferedStream inputStream = new BufferedStream(socket.GetStream());
|
|
||||||
StreamWriter outputStream = new StreamWriter(new BufferedStream(socket.GetStream()));
|
|
||||||
if (inputStream.CanRead)
|
|
||||||
{
|
|
||||||
string data = ReadStream(inputStream);
|
|
||||||
|
|
||||||
if (data.Contains("/pac/"))
|
|
||||||
{
|
|
||||||
if (_responderMethod != null)
|
|
||||||
{
|
|
||||||
string address = ((IPEndPoint)socket.Client.LocalEndPoint).Address.ToString();
|
|
||||||
Utils.SaveLog("WebserverB Request " + address);
|
|
||||||
string pac = _responderMethod(address);
|
|
||||||
|
|
||||||
if (inputStream.CanWrite)
|
|
||||||
{
|
|
||||||
WriteStream(outputStream, pac);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
outputStream.BaseStream.Flush();
|
|
||||||
inputStream = null;
|
|
||||||
outputStream = null;
|
|
||||||
socket.Close();
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Utils.SaveLog(ex.Message, ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private string ReadStream(Stream inputStream)
|
|
||||||
{
|
|
||||||
int nextchar;
|
|
||||||
string data = "";
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
nextchar = inputStream.ReadByte();
|
|
||||||
if (nextchar == '\n')
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (nextchar == '\r')
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (nextchar == -1)
|
|
||||||
{
|
|
||||||
Thread.Sleep(1);
|
|
||||||
continue;
|
|
||||||
};
|
|
||||||
data += Convert.ToChar(nextchar);
|
|
||||||
}
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void WriteStream(StreamWriter outputStream, string pac)
|
|
||||||
{
|
|
||||||
string content_type = "application/x-ns-proxy-autoconfig";
|
|
||||||
outputStream.WriteLine("HTTP/1.1 200 OK");
|
|
||||||
outputStream.WriteLine(String.Format("Content-Type:{0}", content_type));
|
|
||||||
outputStream.WriteLine("Connection: close");
|
|
||||||
outputStream.WriteLine("");
|
|
||||||
outputStream.WriteLine(pac);
|
|
||||||
outputStream.Flush();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
using System.Drawing;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
|
|
||||||
namespace v2rayN.Base
|
|
||||||
{
|
|
||||||
class ListViewFlickerFree : ListView
|
|
||||||
{
|
|
||||||
public ListViewFlickerFree()
|
|
||||||
{
|
|
||||||
SetStyle(ControlStyles.OptimizedDoubleBuffer
|
|
||||||
| ControlStyles.AllPaintingInWmPaint
|
|
||||||
, true);
|
|
||||||
UpdateStyles();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void AutoResizeColumns()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
this.SuspendLayout();
|
|
||||||
Graphics graphics = this.CreateGraphics();
|
|
||||||
|
|
||||||
// 原生 ColumnHeaderAutoResizeStyle.ColumnContent 将忽略列头宽度
|
|
||||||
this.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
|
|
||||||
|
|
||||||
for (int i = 0; i < this.Columns.Count; i++)
|
|
||||||
{
|
|
||||||
ColumnHeader c = this.Columns[i];
|
|
||||||
int cWidth = c.Width;
|
|
||||||
string MaxStr = "";
|
|
||||||
Font font = this.Items[0].SubItems[0].Font;
|
|
||||||
|
|
||||||
foreach (ListViewItem item in this.Items)
|
|
||||||
{
|
|
||||||
// 整行视作相同字形,不单独计算每个单元格
|
|
||||||
font = item.SubItems[i].Font;
|
|
||||||
string str = item.SubItems[i].Text;
|
|
||||||
if (str.Length > MaxStr.Length) // 未考虑非等宽问题
|
|
||||||
MaxStr = str;
|
|
||||||
}
|
|
||||||
int strWidth = (int)graphics.MeasureString(MaxStr, font).Width;
|
|
||||||
c.Width = System.Math.Max(cWidth, strWidth);
|
|
||||||
}
|
|
||||||
this.ResumeLayout();
|
|
||||||
}
|
|
||||||
catch { }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
91
v2rayN/v2rayN/Base/SqliteHandler.cs
Normal file
91
v2rayN/v2rayN/Base/SqliteHandler.cs
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
|
||||||
|
using SQLite;
|
||||||
|
using System.Collections;
|
||||||
|
|
||||||
|
namespace v2rayN.Base
|
||||||
|
{
|
||||||
|
public sealed class SqliteHelper
|
||||||
|
{
|
||||||
|
private static readonly Lazy<SqliteHelper> _instance = new Lazy<SqliteHelper>(() => new());
|
||||||
|
public static SqliteHelper Instance => _instance.Value;
|
||||||
|
private string _connstr;
|
||||||
|
public SQLiteConnection _db;
|
||||||
|
public SQLiteAsyncConnection _dbAsync;
|
||||||
|
|
||||||
|
public SqliteHelper()
|
||||||
|
{
|
||||||
|
_connstr = Utils.GetConfigPath(Global.ConfigDB);
|
||||||
|
_db = new SQLiteConnection(_connstr, false);
|
||||||
|
_dbAsync = new SQLiteAsyncConnection(_connstr, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CreateTableResult CreateTable<T>()
|
||||||
|
{
|
||||||
|
return _db.CreateTable<T>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int Add(object model)
|
||||||
|
{
|
||||||
|
return _db.Insert(model);
|
||||||
|
}
|
||||||
|
public async Task<int> AddAsync(object model)
|
||||||
|
{
|
||||||
|
return await _dbAsync.InsertAsync(model);
|
||||||
|
}
|
||||||
|
public int Replace(object model)
|
||||||
|
{
|
||||||
|
return _db.InsertOrReplace(model);
|
||||||
|
}
|
||||||
|
public async Task<int> Replacesync(object model)
|
||||||
|
{
|
||||||
|
return await _dbAsync.InsertOrReplaceAsync(model);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int Update(object model)
|
||||||
|
{
|
||||||
|
return _db.Update(model);
|
||||||
|
}
|
||||||
|
public async Task<int> UpdateAsync(object model)
|
||||||
|
{
|
||||||
|
return await _dbAsync.UpdateAsync(model);
|
||||||
|
}
|
||||||
|
public int UpdateAll(IEnumerable models)
|
||||||
|
{
|
||||||
|
return _db.UpdateAll(models);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int Delete(object model)
|
||||||
|
{
|
||||||
|
return _db.Delete(model);
|
||||||
|
}
|
||||||
|
public async Task<int> DeleteAsync(object model)
|
||||||
|
{
|
||||||
|
return await _dbAsync.DeleteAsync(model);
|
||||||
|
}
|
||||||
|
public List<T> Query<T>(string sql) where T : new()
|
||||||
|
{
|
||||||
|
return _db.Query<T>(sql);
|
||||||
|
}
|
||||||
|
public async Task<List<T>> QueryAsync<T>(string sql) where T : new()
|
||||||
|
{
|
||||||
|
return await _dbAsync.QueryAsync<T>(sql);
|
||||||
|
}
|
||||||
|
public int Execute(string sql)
|
||||||
|
{
|
||||||
|
return _db.Execute(sql);
|
||||||
|
}
|
||||||
|
public async Task<int> ExecuteAsync(string sql)
|
||||||
|
{
|
||||||
|
return await _dbAsync.ExecuteAsync(sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
public TableQuery<T> Table<T>() where T : new()
|
||||||
|
{
|
||||||
|
return _db.Table<T>();
|
||||||
|
}
|
||||||
|
public AsyncTableQuery<T> TableAsync<T>() where T : new()
|
||||||
|
{
|
||||||
|
return _dbAsync.Table<T>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,4 @@
|
|||||||
using System.Collections.Generic;
|
using System.IO;
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace v2rayN.Base
|
namespace v2rayN.Base
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,37 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Net;
|
|
||||||
|
|
||||||
namespace v2rayN.Base
|
|
||||||
{
|
|
||||||
class WebClientEx : WebClient
|
|
||||||
{
|
|
||||||
public int Timeout
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
public WebClientEx(int timeout = 3000)
|
|
||||||
{
|
|
||||||
Timeout = timeout;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override WebRequest GetWebRequest(Uri address)
|
|
||||||
{
|
|
||||||
HttpWebRequest request;
|
|
||||||
request = (HttpWebRequest)base.GetWebRequest(address);
|
|
||||||
request.Timeout = Timeout;
|
|
||||||
request.ReadWriteTimeout = Timeout;
|
|
||||||
//request.AllowAutoRedirect = false;
|
|
||||||
//request.AllowWriteStreamBuffering = true;
|
|
||||||
|
|
||||||
request.ServicePoint.BindIPEndPointDelegate = (servicePoint, remoteEndPoint, retryCount) =>
|
|
||||||
{
|
|
||||||
if (remoteEndPoint.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6)
|
|
||||||
return new IPEndPoint(IPAddress.IPv6Any, 0);
|
|
||||||
else
|
|
||||||
return new IPEndPoint(IPAddress.Any, 0);
|
|
||||||
};
|
|
||||||
|
|
||||||
return request;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
25
v2rayN/v2rayN/Converters/DelayColorConverter.cs
Normal file
25
v2rayN/v2rayN/Converters/DelayColorConverter.cs
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
using System.Windows.Data;
|
||||||
|
using System.Windows.Media;
|
||||||
|
|
||||||
|
namespace v2rayN.Converters
|
||||||
|
{
|
||||||
|
public class DelayColorConverter : IValueConverter
|
||||||
|
{
|
||||||
|
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
|
||||||
|
{
|
||||||
|
int.TryParse(value.ToString(), out var delay);
|
||||||
|
|
||||||
|
if (delay <= 0)
|
||||||
|
return new SolidColorBrush(Colors.Red);
|
||||||
|
if (delay <= 200)
|
||||||
|
return new SolidColorBrush(Colors.Green);
|
||||||
|
else
|
||||||
|
return new SolidColorBrush(Colors.IndianRed);
|
||||||
|
}
|
||||||
|
|
||||||
|
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
3
v2rayN/v2rayN/FodyWeavers.xml
Normal file
3
v2rayN/v2rayN/FodyWeavers.xml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
|
||||||
|
<ReactiveUI />
|
||||||
|
</Weavers>
|
||||||
140
v2rayN/v2rayN/Forms/AddServer2Form.Designer.cs
generated
140
v2rayN/v2rayN/Forms/AddServer2Form.Designer.cs
generated
@@ -1,140 +0,0 @@
|
|||||||
namespace v2rayN.Forms
|
|
||||||
{
|
|
||||||
partial class AddServer2Form
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Required designer variable.
|
|
||||||
/// </summary>
|
|
||||||
private System.ComponentModel.IContainer components = null;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Clean up any resources being used.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
|
||||||
protected override void Dispose(bool disposing)
|
|
||||||
{
|
|
||||||
if (disposing && (components != null))
|
|
||||||
{
|
|
||||||
components.Dispose();
|
|
||||||
}
|
|
||||||
base.Dispose(disposing);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Windows Form Designer generated code
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Required method for Designer support - do not modify
|
|
||||||
/// the contents of this method with the code editor.
|
|
||||||
/// </summary>
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AddServer2Form));
|
|
||||||
this.btnClose = new System.Windows.Forms.Button();
|
|
||||||
this.groupBox1 = new System.Windows.Forms.GroupBox();
|
|
||||||
this.txtAddress = new System.Windows.Forms.TextBox();
|
|
||||||
this.label13 = new System.Windows.Forms.Label();
|
|
||||||
this.txtRemarks = new System.Windows.Forms.TextBox();
|
|
||||||
this.label6 = new System.Windows.Forms.Label();
|
|
||||||
this.label1 = new System.Windows.Forms.Label();
|
|
||||||
this.panel2 = new System.Windows.Forms.Panel();
|
|
||||||
this.btnOK = new System.Windows.Forms.Button();
|
|
||||||
this.panel1 = new System.Windows.Forms.Panel();
|
|
||||||
this.groupBox1.SuspendLayout();
|
|
||||||
this.panel2.SuspendLayout();
|
|
||||||
this.SuspendLayout();
|
|
||||||
//
|
|
||||||
// btnClose
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.btnClose, "btnClose");
|
|
||||||
this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
|
||||||
this.btnClose.Name = "btnClose";
|
|
||||||
this.btnClose.UseVisualStyleBackColor = true;
|
|
||||||
this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
|
|
||||||
//
|
|
||||||
// groupBox1
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.groupBox1, "groupBox1");
|
|
||||||
this.groupBox1.Controls.Add(this.txtAddress);
|
|
||||||
this.groupBox1.Controls.Add(this.label13);
|
|
||||||
this.groupBox1.Controls.Add(this.txtRemarks);
|
|
||||||
this.groupBox1.Controls.Add(this.label6);
|
|
||||||
this.groupBox1.Controls.Add(this.label1);
|
|
||||||
this.groupBox1.Name = "groupBox1";
|
|
||||||
this.groupBox1.TabStop = false;
|
|
||||||
//
|
|
||||||
// txtAddress
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtAddress, "txtAddress");
|
|
||||||
this.txtAddress.Name = "txtAddress";
|
|
||||||
//
|
|
||||||
// label13
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label13, "label13");
|
|
||||||
this.label13.Name = "label13";
|
|
||||||
//
|
|
||||||
// txtRemarks
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtRemarks, "txtRemarks");
|
|
||||||
this.txtRemarks.Name = "txtRemarks";
|
|
||||||
//
|
|
||||||
// label6
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label6, "label6");
|
|
||||||
this.label6.Name = "label6";
|
|
||||||
//
|
|
||||||
// label1
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label1, "label1");
|
|
||||||
this.label1.Name = "label1";
|
|
||||||
//
|
|
||||||
// panel2
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.panel2, "panel2");
|
|
||||||
this.panel2.Controls.Add(this.btnClose);
|
|
||||||
this.panel2.Controls.Add(this.btnOK);
|
|
||||||
this.panel2.Name = "panel2";
|
|
||||||
//
|
|
||||||
// btnOK
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.btnOK, "btnOK");
|
|
||||||
this.btnOK.Name = "btnOK";
|
|
||||||
this.btnOK.UseVisualStyleBackColor = true;
|
|
||||||
this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
|
|
||||||
//
|
|
||||||
// panel1
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.panel1, "panel1");
|
|
||||||
this.panel1.Name = "panel1";
|
|
||||||
//
|
|
||||||
// AddServer2Form
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this, "$this");
|
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
|
||||||
this.CancelButton = this.btnClose;
|
|
||||||
this.Controls.Add(this.groupBox1);
|
|
||||||
this.Controls.Add(this.panel2);
|
|
||||||
this.Controls.Add(this.panel1);
|
|
||||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
|
|
||||||
this.Name = "AddServer2Form";
|
|
||||||
this.Load += new System.EventHandler(this.AddServer2Form_Load);
|
|
||||||
this.groupBox1.ResumeLayout(false);
|
|
||||||
this.groupBox1.PerformLayout();
|
|
||||||
this.panel2.ResumeLayout(false);
|
|
||||||
this.ResumeLayout(false);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
private System.Windows.Forms.GroupBox groupBox1;
|
|
||||||
private System.Windows.Forms.Button btnClose;
|
|
||||||
private System.Windows.Forms.Button btnOK;
|
|
||||||
private System.Windows.Forms.TextBox txtRemarks;
|
|
||||||
private System.Windows.Forms.Label label6;
|
|
||||||
private System.Windows.Forms.Label label1;
|
|
||||||
private System.Windows.Forms.Panel panel1;
|
|
||||||
private System.Windows.Forms.Panel panel2;
|
|
||||||
private System.Windows.Forms.Label label13;
|
|
||||||
private System.Windows.Forms.TextBox txtAddress;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
using v2rayN.Handler;
|
|
||||||
using v2rayN.Mode;
|
|
||||||
|
|
||||||
namespace v2rayN.Forms
|
|
||||||
{
|
|
||||||
public partial class AddServer2Form : BaseForm
|
|
||||||
{
|
|
||||||
public int EditIndex { get; set; }
|
|
||||||
VmessItem vmessItem;
|
|
||||||
|
|
||||||
public AddServer2Form()
|
|
||||||
{
|
|
||||||
InitializeComponent();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void AddServer2Form_Load(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
if (EditIndex >= 0)
|
|
||||||
{
|
|
||||||
BindingServer();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ClearServer();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 绑定数据
|
|
||||||
/// </summary>
|
|
||||||
private void BindingServer()
|
|
||||||
{
|
|
||||||
vmessItem = config.vmess[EditIndex];
|
|
||||||
txtRemarks.Text = vmessItem.remarks;
|
|
||||||
txtAddress.Text = vmessItem.address;
|
|
||||||
txtAddress.ReadOnly = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 清除设置
|
|
||||||
/// </summary>
|
|
||||||
private void ClearServer()
|
|
||||||
{
|
|
||||||
txtRemarks.Text = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
private void btnOK_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
string remarks = txtRemarks.Text;
|
|
||||||
if (Utils.IsNullOrEmpty(remarks))
|
|
||||||
{
|
|
||||||
UI.Show(UIRes.I18N("PleaseFillRemarks"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
vmessItem.remarks = remarks;
|
|
||||||
|
|
||||||
if (ConfigHandler.EditCustomServer(ref config, vmessItem, EditIndex) == 0)
|
|
||||||
{
|
|
||||||
this.DialogResult = DialogResult.OK;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UI.ShowWarning(UIRes.I18N("OperationFailed"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void btnClose_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
this.DialogResult = DialogResult.Cancel;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,264 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<root>
|
|
||||||
<!--
|
|
||||||
Microsoft ResX Schema
|
|
||||||
|
|
||||||
Version 2.0
|
|
||||||
|
|
||||||
The primary goals of this format is to allow a simple XML format
|
|
||||||
that is mostly human readable. The generation and parsing of the
|
|
||||||
various data types are done through the TypeConverter classes
|
|
||||||
associated with the data types.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
... ado.net/XML headers & schema ...
|
|
||||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
|
||||||
<resheader name="version">2.0</resheader>
|
|
||||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
|
||||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
|
||||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
|
||||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
|
||||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
|
||||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
|
||||||
</data>
|
|
||||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
|
||||||
<comment>This is a comment</comment>
|
|
||||||
</data>
|
|
||||||
|
|
||||||
There are any number of "resheader" rows that contain simple
|
|
||||||
name/value pairs.
|
|
||||||
|
|
||||||
Each data row contains a name, and value. The row also contains a
|
|
||||||
type or mimetype. Type corresponds to a .NET class that support
|
|
||||||
text/value conversion through the TypeConverter architecture.
|
|
||||||
Classes that don't support this are serialized and stored with the
|
|
||||||
mimetype set.
|
|
||||||
|
|
||||||
The mimetype is used for serialized objects, and tells the
|
|
||||||
ResXResourceReader how to depersist the object. This is currently not
|
|
||||||
extensible. For a given mimetype the value must be set accordingly:
|
|
||||||
|
|
||||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
|
||||||
that the ResXResourceWriter will generate, however the reader can
|
|
||||||
read any of the formats listed below.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.binary.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.soap.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
|
||||||
value : The object must be serialized into a byte array
|
|
||||||
: using a System.ComponentModel.TypeConverter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
-->
|
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
|
||||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:choice maxOccurs="unbounded">
|
|
||||||
<xsd:element name="metadata">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="assembly">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:attribute name="alias" type="xsd:string" />
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="data">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="resheader">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:choice>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:schema>
|
|
||||||
<resheader name="resmimetype">
|
|
||||||
<value>text/microsoft-resx</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="version">
|
|
||||||
<value>2.0</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="reader">
|
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="writer">
|
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
|
||||||
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
|
||||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
|
||||||
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
|
|
||||||
<value>6, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>611, 271</value>
|
|
||||||
</data>
|
|
||||||
<data name="$this.Localizable" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="$this.Text" xml:space="preserve">
|
|
||||||
<value>Edit custom configuration server</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnClose.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>396, 17</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnClose.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>75, 23</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnClose.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>4</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnClose.Text" xml:space="preserve">
|
|
||||||
<value>&Cancel</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnOK.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>303, 17</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnOK.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>75, 23</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnOK.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>5</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnOK.Text" xml:space="preserve">
|
|
||||||
<value>&OK</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
|
||||||
<value>Fill</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox1.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>0, 10</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox1.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>611, 201</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox1.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>3</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox1.Text" xml:space="preserve">
|
|
||||||
<value>Server</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>12, 62</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>83, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>0</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.Text" xml:space="preserve">
|
|
||||||
<value>Address</value>
|
|
||||||
</data>
|
|
||||||
<data name="label13.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label13.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>446, 26</value>
|
|
||||||
</data>
|
|
||||||
<data name="label13.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>113, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label13.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>22</value>
|
|
||||||
</data>
|
|
||||||
<data name="label13.Text" xml:space="preserve">
|
|
||||||
<value>* Fill in manually</value>
|
|
||||||
</data>
|
|
||||||
<data name="label6.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label6.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>12, 27</value>
|
|
||||||
</data>
|
|
||||||
<data name="label6.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>83, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label6.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>10</value>
|
|
||||||
</data>
|
|
||||||
<data name="label6.Text" xml:space="preserve">
|
|
||||||
<value>Alias (remarks)</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
|
||||||
<value>Top</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel1.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>0, 0</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel1.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>611, 10</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel1.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>6</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel2.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
|
||||||
<value>Bottom</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel2.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>0, 211</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel2.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>611, 60</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel2.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>7</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtAddress.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>127, 62</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtAddress.Multiline" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtAddress.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>432, 104</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtAddress.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>23</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtRemarks.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>127, 23</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtRemarks.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>313, 21</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtRemarks.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>11</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
|
||||||
@@ -1,141 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<root>
|
|
||||||
<!--
|
|
||||||
Microsoft ResX Schema
|
|
||||||
|
|
||||||
Version 2.0
|
|
||||||
|
|
||||||
The primary goals of this format is to allow a simple XML format
|
|
||||||
that is mostly human readable. The generation and parsing of the
|
|
||||||
various data types are done through the TypeConverter classes
|
|
||||||
associated with the data types.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
... ado.net/XML headers & schema ...
|
|
||||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
|
||||||
<resheader name="version">2.0</resheader>
|
|
||||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
|
||||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
|
||||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
|
||||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
|
||||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
|
||||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
|
||||||
</data>
|
|
||||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
|
||||||
<comment>This is a comment</comment>
|
|
||||||
</data>
|
|
||||||
|
|
||||||
There are any number of "resheader" rows that contain simple
|
|
||||||
name/value pairs.
|
|
||||||
|
|
||||||
Each data row contains a name, and value. The row also contains a
|
|
||||||
type or mimetype. Type corresponds to a .NET class that support
|
|
||||||
text/value conversion through the TypeConverter architecture.
|
|
||||||
Classes that don't support this are serialized and stored with the
|
|
||||||
mimetype set.
|
|
||||||
|
|
||||||
The mimetype is used for serialized objects, and tells the
|
|
||||||
ResXResourceReader how to depersist the object. This is currently not
|
|
||||||
extensible. For a given mimetype the value must be set accordingly:
|
|
||||||
|
|
||||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
|
||||||
that the ResXResourceWriter will generate, however the reader can
|
|
||||||
read any of the formats listed below.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.binary.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.soap.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
|
||||||
value : The object must be serialized into a byte array
|
|
||||||
: using a System.ComponentModel.TypeConverter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
-->
|
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
|
||||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:choice maxOccurs="unbounded">
|
|
||||||
<xsd:element name="metadata">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="assembly">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:attribute name="alias" type="xsd:string" />
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="data">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="resheader">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:choice>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:schema>
|
|
||||||
<resheader name="resmimetype">
|
|
||||||
<value>text/microsoft-resx</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="version">
|
|
||||||
<value>2.0</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="reader">
|
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="writer">
|
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<data name="$this.Text" xml:space="preserve">
|
|
||||||
<value>编辑自定义配置服务器</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnClose.Text" xml:space="preserve">
|
|
||||||
<value>取消(&C)</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnOK.Text" xml:space="preserve">
|
|
||||||
<value>确定(&O)</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox1.Text" xml:space="preserve">
|
|
||||||
<value>服务器</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.Text" xml:space="preserve">
|
|
||||||
<value>地址(address)</value>
|
|
||||||
</data>
|
|
||||||
<data name="label13.Text" xml:space="preserve">
|
|
||||||
<value>*手填,方便识别管理</value>
|
|
||||||
</data>
|
|
||||||
<data name="label6.Text" xml:space="preserve">
|
|
||||||
<value>别名(remarks)</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
|
||||||
231
v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs
generated
231
v2rayN/v2rayN/Forms/AddServer3Form.Designer.cs
generated
@@ -1,231 +0,0 @@
|
|||||||
namespace v2rayN.Forms
|
|
||||||
{
|
|
||||||
partial class AddServer3Form
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Required designer variable.
|
|
||||||
/// </summary>
|
|
||||||
private System.ComponentModel.IContainer components = null;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Clean up any resources being used.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
|
||||||
protected override void Dispose(bool disposing)
|
|
||||||
{
|
|
||||||
if (disposing && (components != null))
|
|
||||||
{
|
|
||||||
components.Dispose();
|
|
||||||
}
|
|
||||||
base.Dispose(disposing);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Windows Form Designer generated code
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Required method for Designer support - do not modify
|
|
||||||
/// the contents of this method with the code editor.
|
|
||||||
/// </summary>
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AddServer3Form));
|
|
||||||
this.btnClose = new System.Windows.Forms.Button();
|
|
||||||
this.groupBox1 = new System.Windows.Forms.GroupBox();
|
|
||||||
this.label13 = new System.Windows.Forms.Label();
|
|
||||||
this.cmbSecurity = new System.Windows.Forms.ComboBox();
|
|
||||||
this.txtRemarks = new System.Windows.Forms.TextBox();
|
|
||||||
this.label6 = new System.Windows.Forms.Label();
|
|
||||||
this.label5 = new System.Windows.Forms.Label();
|
|
||||||
this.txtId = new System.Windows.Forms.TextBox();
|
|
||||||
this.label3 = new System.Windows.Forms.Label();
|
|
||||||
this.txtPort = new System.Windows.Forms.TextBox();
|
|
||||||
this.label2 = new System.Windows.Forms.Label();
|
|
||||||
this.txtAddress = new System.Windows.Forms.TextBox();
|
|
||||||
this.label1 = new System.Windows.Forms.Label();
|
|
||||||
this.panel2 = new System.Windows.Forms.Panel();
|
|
||||||
this.btnOK = new System.Windows.Forms.Button();
|
|
||||||
this.panel1 = new System.Windows.Forms.Panel();
|
|
||||||
this.menuServer = new System.Windows.Forms.MenuStrip();
|
|
||||||
this.MenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuItemImportClipboard = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.groupBox1.SuspendLayout();
|
|
||||||
this.panel2.SuspendLayout();
|
|
||||||
this.menuServer.SuspendLayout();
|
|
||||||
this.SuspendLayout();
|
|
||||||
//
|
|
||||||
// btnClose
|
|
||||||
//
|
|
||||||
this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
|
||||||
resources.ApplyResources(this.btnClose, "btnClose");
|
|
||||||
this.btnClose.Name = "btnClose";
|
|
||||||
this.btnClose.UseVisualStyleBackColor = true;
|
|
||||||
this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
|
|
||||||
//
|
|
||||||
// groupBox1
|
|
||||||
//
|
|
||||||
this.groupBox1.Controls.Add(this.label13);
|
|
||||||
this.groupBox1.Controls.Add(this.cmbSecurity);
|
|
||||||
this.groupBox1.Controls.Add(this.txtRemarks);
|
|
||||||
this.groupBox1.Controls.Add(this.label6);
|
|
||||||
this.groupBox1.Controls.Add(this.label5);
|
|
||||||
this.groupBox1.Controls.Add(this.txtId);
|
|
||||||
this.groupBox1.Controls.Add(this.label3);
|
|
||||||
this.groupBox1.Controls.Add(this.txtPort);
|
|
||||||
this.groupBox1.Controls.Add(this.label2);
|
|
||||||
this.groupBox1.Controls.Add(this.txtAddress);
|
|
||||||
this.groupBox1.Controls.Add(this.label1);
|
|
||||||
resources.ApplyResources(this.groupBox1, "groupBox1");
|
|
||||||
this.groupBox1.Name = "groupBox1";
|
|
||||||
this.groupBox1.TabStop = false;
|
|
||||||
//
|
|
||||||
// label13
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label13, "label13");
|
|
||||||
this.label13.Name = "label13";
|
|
||||||
//
|
|
||||||
// cmbSecurity
|
|
||||||
//
|
|
||||||
this.cmbSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
|
||||||
this.cmbSecurity.FormattingEnabled = true;
|
|
||||||
this.cmbSecurity.Items.AddRange(new object[] {
|
|
||||||
resources.GetString("cmbSecurity.Items"),
|
|
||||||
resources.GetString("cmbSecurity.Items1"),
|
|
||||||
resources.GetString("cmbSecurity.Items2"),
|
|
||||||
resources.GetString("cmbSecurity.Items3"),
|
|
||||||
resources.GetString("cmbSecurity.Items4"),
|
|
||||||
resources.GetString("cmbSecurity.Items5"),
|
|
||||||
resources.GetString("cmbSecurity.Items6"),
|
|
||||||
resources.GetString("cmbSecurity.Items7")});
|
|
||||||
resources.ApplyResources(this.cmbSecurity, "cmbSecurity");
|
|
||||||
this.cmbSecurity.Name = "cmbSecurity";
|
|
||||||
//
|
|
||||||
// txtRemarks
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtRemarks, "txtRemarks");
|
|
||||||
this.txtRemarks.Name = "txtRemarks";
|
|
||||||
//
|
|
||||||
// label6
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label6, "label6");
|
|
||||||
this.label6.Name = "label6";
|
|
||||||
//
|
|
||||||
// label5
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label5, "label5");
|
|
||||||
this.label5.Name = "label5";
|
|
||||||
//
|
|
||||||
// txtId
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtId, "txtId");
|
|
||||||
this.txtId.Name = "txtId";
|
|
||||||
//
|
|
||||||
// label3
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label3, "label3");
|
|
||||||
this.label3.Name = "label3";
|
|
||||||
//
|
|
||||||
// txtPort
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtPort, "txtPort");
|
|
||||||
this.txtPort.Name = "txtPort";
|
|
||||||
//
|
|
||||||
// label2
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label2, "label2");
|
|
||||||
this.label2.Name = "label2";
|
|
||||||
//
|
|
||||||
// txtAddress
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtAddress, "txtAddress");
|
|
||||||
this.txtAddress.Name = "txtAddress";
|
|
||||||
//
|
|
||||||
// label1
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label1, "label1");
|
|
||||||
this.label1.Name = "label1";
|
|
||||||
//
|
|
||||||
// panel2
|
|
||||||
//
|
|
||||||
this.panel2.Controls.Add(this.btnClose);
|
|
||||||
this.panel2.Controls.Add(this.btnOK);
|
|
||||||
resources.ApplyResources(this.panel2, "panel2");
|
|
||||||
this.panel2.Name = "panel2";
|
|
||||||
//
|
|
||||||
// btnOK
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.btnOK, "btnOK");
|
|
||||||
this.btnOK.Name = "btnOK";
|
|
||||||
this.btnOK.UseVisualStyleBackColor = true;
|
|
||||||
this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
|
|
||||||
//
|
|
||||||
// panel1
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.panel1, "panel1");
|
|
||||||
this.panel1.Name = "panel1";
|
|
||||||
//
|
|
||||||
// menuServer
|
|
||||||
//
|
|
||||||
this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
|
||||||
this.MenuItem1});
|
|
||||||
resources.ApplyResources(this.menuServer, "menuServer");
|
|
||||||
this.menuServer.Name = "menuServer";
|
|
||||||
//
|
|
||||||
// MenuItem1
|
|
||||||
//
|
|
||||||
this.MenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
|
||||||
this.menuItemImportClipboard});
|
|
||||||
this.MenuItem1.Name = "MenuItem1";
|
|
||||||
resources.ApplyResources(this.MenuItem1, "MenuItem1");
|
|
||||||
//
|
|
||||||
// menuItemImportClipboard
|
|
||||||
//
|
|
||||||
this.menuItemImportClipboard.Name = "menuItemImportClipboard";
|
|
||||||
resources.ApplyResources(this.menuItemImportClipboard, "menuItemImportClipboard");
|
|
||||||
this.menuItemImportClipboard.Click += new System.EventHandler(this.menuItemImportClipboard_Click);
|
|
||||||
//
|
|
||||||
// AddServer3Form
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this, "$this");
|
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
|
||||||
this.CancelButton = this.btnClose;
|
|
||||||
this.Controls.Add(this.groupBox1);
|
|
||||||
this.Controls.Add(this.panel2);
|
|
||||||
this.Controls.Add(this.panel1);
|
|
||||||
this.Controls.Add(this.menuServer);
|
|
||||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
|
|
||||||
this.MinimizeBox = true;
|
|
||||||
this.Name = "AddServer3Form";
|
|
||||||
this.Load += new System.EventHandler(this.AddServer3Form_Load);
|
|
||||||
this.groupBox1.ResumeLayout(false);
|
|
||||||
this.groupBox1.PerformLayout();
|
|
||||||
this.panel2.ResumeLayout(false);
|
|
||||||
this.menuServer.ResumeLayout(false);
|
|
||||||
this.menuServer.PerformLayout();
|
|
||||||
this.ResumeLayout(false);
|
|
||||||
this.PerformLayout();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
private System.Windows.Forms.GroupBox groupBox1;
|
|
||||||
private System.Windows.Forms.Button btnClose;
|
|
||||||
private System.Windows.Forms.Button btnOK;
|
|
||||||
private System.Windows.Forms.TextBox txtRemarks;
|
|
||||||
private System.Windows.Forms.Label label6;
|
|
||||||
private System.Windows.Forms.Label label5;
|
|
||||||
private System.Windows.Forms.TextBox txtId;
|
|
||||||
private System.Windows.Forms.Label label3;
|
|
||||||
private System.Windows.Forms.TextBox txtPort;
|
|
||||||
private System.Windows.Forms.Label label2;
|
|
||||||
private System.Windows.Forms.TextBox txtAddress;
|
|
||||||
private System.Windows.Forms.Label label1;
|
|
||||||
private System.Windows.Forms.ComboBox cmbSecurity;
|
|
||||||
private System.Windows.Forms.Panel panel1;
|
|
||||||
private System.Windows.Forms.Panel panel2;
|
|
||||||
private System.Windows.Forms.Label label13;
|
|
||||||
private System.Windows.Forms.MenuStrip menuServer;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem MenuItem1;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuItemImportClipboard;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,142 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
using v2rayN.Handler;
|
|
||||||
using v2rayN.Mode;
|
|
||||||
|
|
||||||
namespace v2rayN.Forms
|
|
||||||
{
|
|
||||||
public partial class AddServer3Form : BaseForm
|
|
||||||
{
|
|
||||||
public int EditIndex { get; set; }
|
|
||||||
VmessItem vmessItem = null;
|
|
||||||
|
|
||||||
public AddServer3Form()
|
|
||||||
{
|
|
||||||
InitializeComponent();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void AddServer3Form_Load(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
if (EditIndex >= 0)
|
|
||||||
{
|
|
||||||
vmessItem = config.vmess[EditIndex];
|
|
||||||
BindingServer();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
vmessItem = new VmessItem();
|
|
||||||
ClearServer();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 绑定数据
|
|
||||||
/// </summary>
|
|
||||||
private void BindingServer()
|
|
||||||
{
|
|
||||||
|
|
||||||
txtAddress.Text = vmessItem.address;
|
|
||||||
txtPort.Text = vmessItem.port.ToString();
|
|
||||||
txtId.Text = vmessItem.id;
|
|
||||||
cmbSecurity.Text = vmessItem.security;
|
|
||||||
txtRemarks.Text = vmessItem.remarks;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 清除设置
|
|
||||||
/// </summary>
|
|
||||||
private void ClearServer()
|
|
||||||
{
|
|
||||||
txtAddress.Text = "";
|
|
||||||
txtPort.Text = "";
|
|
||||||
txtId.Text = "";
|
|
||||||
cmbSecurity.Text = Global.DefaultSecurity;
|
|
||||||
txtRemarks.Text = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
private void btnOK_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
string address = txtAddress.Text;
|
|
||||||
string port = txtPort.Text;
|
|
||||||
string id = txtId.Text;
|
|
||||||
string security = cmbSecurity.Text;
|
|
||||||
string remarks = txtRemarks.Text;
|
|
||||||
|
|
||||||
if (Utils.IsNullOrEmpty(address))
|
|
||||||
{
|
|
||||||
UI.Show(UIRes.I18N("FillServerAddress"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (Utils.IsNullOrEmpty(port) || !Utils.IsNumberic(port))
|
|
||||||
{
|
|
||||||
UI.Show(UIRes.I18N("FillCorrectServerPort"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (Utils.IsNullOrEmpty(id))
|
|
||||||
{
|
|
||||||
UI.Show(UIRes.I18N("FillPassword"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (Utils.IsNullOrEmpty(security))
|
|
||||||
{
|
|
||||||
UI.Show(UIRes.I18N("PleaseSelectEncryption"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
vmessItem.address = address;
|
|
||||||
vmessItem.port = Utils.ToInt(port);
|
|
||||||
vmessItem.id = id;
|
|
||||||
vmessItem.security = security;
|
|
||||||
vmessItem.remarks = remarks;
|
|
||||||
|
|
||||||
if (ConfigHandler.AddShadowsocksServer(ref config, vmessItem, EditIndex) == 0)
|
|
||||||
{
|
|
||||||
this.DialogResult = DialogResult.OK;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UI.ShowWarning(UIRes.I18N("OperationFailed"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private void btnClose_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
this.DialogResult = DialogResult.Cancel;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#region 导入配置
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 从剪贴板导入URL
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sender"></param>
|
|
||||||
/// <param name="e"></param>
|
|
||||||
private void menuItemImportClipboard_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
ImportConfig();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ImportConfig()
|
|
||||||
{
|
|
||||||
ClearServer();
|
|
||||||
|
|
||||||
VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out string msg);
|
|
||||||
if (vmessItem == null)
|
|
||||||
{
|
|
||||||
UI.ShowWarning(msg);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
txtAddress.Text = vmessItem.address;
|
|
||||||
txtPort.Text = vmessItem.port.ToString();
|
|
||||||
cmbSecurity.Text = vmessItem.security;
|
|
||||||
txtId.Text = vmessItem.id;
|
|
||||||
txtRemarks.Text = vmessItem.remarks;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,384 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<root>
|
|
||||||
<!--
|
|
||||||
Microsoft ResX Schema
|
|
||||||
|
|
||||||
Version 2.0
|
|
||||||
|
|
||||||
The primary goals of this format is to allow a simple XML format
|
|
||||||
that is mostly human readable. The generation and parsing of the
|
|
||||||
various data types are done through the TypeConverter classes
|
|
||||||
associated with the data types.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
... ado.net/XML headers & schema ...
|
|
||||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
|
||||||
<resheader name="version">2.0</resheader>
|
|
||||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
|
||||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
|
||||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
|
||||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
|
||||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
|
||||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
|
||||||
</data>
|
|
||||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
|
||||||
<comment>This is a comment</comment>
|
|
||||||
</data>
|
|
||||||
|
|
||||||
There are any number of "resheader" rows that contain simple
|
|
||||||
name/value pairs.
|
|
||||||
|
|
||||||
Each data row contains a name, and value. The row also contains a
|
|
||||||
type or mimetype. Type corresponds to a .NET class that support
|
|
||||||
text/value conversion through the TypeConverter architecture.
|
|
||||||
Classes that don't support this are serialized and stored with the
|
|
||||||
mimetype set.
|
|
||||||
|
|
||||||
The mimetype is used for serialized objects, and tells the
|
|
||||||
ResXResourceReader how to depersist the object. This is currently not
|
|
||||||
extensible. For a given mimetype the value must be set accordingly:
|
|
||||||
|
|
||||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
|
||||||
that the ResXResourceWriter will generate, however the reader can
|
|
||||||
read any of the formats listed below.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.binary.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.soap.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
|
||||||
value : The object must be serialized into a byte array
|
|
||||||
: using a System.ComponentModel.TypeConverter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
-->
|
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
|
||||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:choice maxOccurs="unbounded">
|
|
||||||
<xsd:element name="metadata">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="assembly">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:attribute name="alias" type="xsd:string" />
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="data">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="resheader">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:choice>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:schema>
|
|
||||||
<resheader name="resmimetype">
|
|
||||||
<value>text/microsoft-resx</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="version">
|
|
||||||
<value>2.0</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="reader">
|
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="writer">
|
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
|
||||||
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
|
||||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
|
||||||
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
|
|
||||||
<value>6, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>547, 291</value>
|
|
||||||
</data>
|
|
||||||
<data name="$this.Localizable" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="$this.Text" xml:space="preserve">
|
|
||||||
<value>Edit or add a [Shadowsocks] server</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnClose.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>396, 17</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnClose.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>75, 23</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnClose.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>4</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnClose.Text" xml:space="preserve">
|
|
||||||
<value>&Cancel</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnOK.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>303, 17</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnOK.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>75, 23</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnOK.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>5</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnOK.Text" xml:space="preserve">
|
|
||||||
<value>&OK</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbSecurity.Items" xml:space="preserve">
|
|
||||||
<value>aes-256-cfb</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbSecurity.Items1" xml:space="preserve">
|
|
||||||
<value>aes-128-cfb</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbSecurity.Items2" xml:space="preserve">
|
|
||||||
<value>chacha20</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbSecurity.Items3" xml:space="preserve">
|
|
||||||
<value>chacha20-ietf</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbSecurity.Items4" xml:space="preserve">
|
|
||||||
<value>aes-256-gcm</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbSecurity.Items5" xml:space="preserve">
|
|
||||||
<value>aes-128-gcm</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbSecurity.Items6" xml:space="preserve">
|
|
||||||
<value>chacha20-poly1305</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbSecurity.Items7" xml:space="preserve">
|
|
||||||
<value>chacha20-ietf-poly1305</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbSecurity.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>127, 120</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbSecurity.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>194, 20</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbSecurity.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>6</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
|
||||||
<value>Fill</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox1.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>0, 35</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox1.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>547, 196</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox1.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>3</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox1.Text" xml:space="preserve">
|
|
||||||
<value>Server</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>12, 31</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>89, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>0</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.Text" xml:space="preserve">
|
|
||||||
<value>Server address</value>
|
|
||||||
</data>
|
|
||||||
<data name="label13.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label13.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>337, 158</value>
|
|
||||||
</data>
|
|
||||||
<data name="label13.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>113, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label13.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>22</value>
|
|
||||||
</data>
|
|
||||||
<data name="label13.Text" xml:space="preserve">
|
|
||||||
<value>* Fill in manually</value>
|
|
||||||
</data>
|
|
||||||
<data name="label2.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label2.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>12, 60</value>
|
|
||||||
</data>
|
|
||||||
<data name="label2.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>71, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label2.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>2</value>
|
|
||||||
</data>
|
|
||||||
<data name="label2.Text" xml:space="preserve">
|
|
||||||
<value>Server port</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>12, 89</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>53, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>4</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.Text" xml:space="preserve">
|
|
||||||
<value>Password</value>
|
|
||||||
</data>
|
|
||||||
<data name="label5.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label5.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>12, 124</value>
|
|
||||||
</data>
|
|
||||||
<data name="label5.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>65, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label5.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>8</value>
|
|
||||||
</data>
|
|
||||||
<data name="label5.Text" xml:space="preserve">
|
|
||||||
<value>Encryption</value>
|
|
||||||
</data>
|
|
||||||
<data name="label6.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label6.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>12, 158</value>
|
|
||||||
</data>
|
|
||||||
<data name="label6.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>95, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label6.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>10</value>
|
|
||||||
</data>
|
|
||||||
<data name="label6.Text" xml:space="preserve">
|
|
||||||
<value>Alias (remarks)</value>
|
|
||||||
</data>
|
|
||||||
<data name="MenuItem1.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>162, 21</value>
|
|
||||||
</data>
|
|
||||||
<data name="MenuItem1.Text" xml:space="preserve">
|
|
||||||
<value>Import configuration file</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuItemImportClipboard.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>235, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuItemImportClipboard.Text" xml:space="preserve">
|
|
||||||
<value>Import URL from clipboard</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuServer.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>0, 0</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuServer.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>547, 25</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuServer.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>8</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuServer.TrayLocation" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>17, 17</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
|
||||||
<value>Top</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel1.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>0, 25</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel1.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>547, 10</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel1.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>6</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel2.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
|
||||||
<value>Bottom</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel2.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>0, 231</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel2.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>547, 60</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel2.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>7</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtAddress.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>127, 27</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtAddress.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>359, 21</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtAddress.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>1</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtId.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>127, 85</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtId.PasswordChar" type="System.Char, mscorlib" xml:space="preserve">
|
|
||||||
<value>*</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtId.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>278, 21</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtId.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>5</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtPort.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>127, 56</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtPort.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>194, 21</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtPort.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>3</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtRemarks.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>127, 154</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtRemarks.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>194, 21</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtRemarks.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>11</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
|
||||||
@@ -1,156 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<root>
|
|
||||||
<!--
|
|
||||||
Microsoft ResX Schema
|
|
||||||
|
|
||||||
Version 2.0
|
|
||||||
|
|
||||||
The primary goals of this format is to allow a simple XML format
|
|
||||||
that is mostly human readable. The generation and parsing of the
|
|
||||||
various data types are done through the TypeConverter classes
|
|
||||||
associated with the data types.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
... ado.net/XML headers & schema ...
|
|
||||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
|
||||||
<resheader name="version">2.0</resheader>
|
|
||||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
|
||||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
|
||||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
|
||||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
|
||||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
|
||||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
|
||||||
</data>
|
|
||||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
|
||||||
<comment>This is a comment</comment>
|
|
||||||
</data>
|
|
||||||
|
|
||||||
There are any number of "resheader" rows that contain simple
|
|
||||||
name/value pairs.
|
|
||||||
|
|
||||||
Each data row contains a name, and value. The row also contains a
|
|
||||||
type or mimetype. Type corresponds to a .NET class that support
|
|
||||||
text/value conversion through the TypeConverter architecture.
|
|
||||||
Classes that don't support this are serialized and stored with the
|
|
||||||
mimetype set.
|
|
||||||
|
|
||||||
The mimetype is used for serialized objects, and tells the
|
|
||||||
ResXResourceReader how to depersist the object. This is currently not
|
|
||||||
extensible. For a given mimetype the value must be set accordingly:
|
|
||||||
|
|
||||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
|
||||||
that the ResXResourceWriter will generate, however the reader can
|
|
||||||
read any of the formats listed below.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.binary.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.soap.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
|
||||||
value : The object must be serialized into a byte array
|
|
||||||
: using a System.ComponentModel.TypeConverter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
-->
|
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
|
||||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:choice maxOccurs="unbounded">
|
|
||||||
<xsd:element name="metadata">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="assembly">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:attribute name="alias" type="xsd:string" />
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="data">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="resheader">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:choice>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:schema>
|
|
||||||
<resheader name="resmimetype">
|
|
||||||
<value>text/microsoft-resx</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="version">
|
|
||||||
<value>2.0</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="reader">
|
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="writer">
|
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<data name="$this.Text" xml:space="preserve">
|
|
||||||
<value>编辑或添加[Shadowsocks]服务器</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnClose.Text" xml:space="preserve">
|
|
||||||
<value>取消(&C)</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnOK.Text" xml:space="preserve">
|
|
||||||
<value>确定(&O)</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox1.Text" xml:space="preserve">
|
|
||||||
<value>服务器</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.Text" xml:space="preserve">
|
|
||||||
<value>服务器地址</value>
|
|
||||||
</data>
|
|
||||||
<data name="label13.Text" xml:space="preserve">
|
|
||||||
<value>*手填,方便识别管理</value>
|
|
||||||
</data>
|
|
||||||
<data name="label2.Text" xml:space="preserve">
|
|
||||||
<value>服务器端口</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.Text" xml:space="preserve">
|
|
||||||
<value>密码</value>
|
|
||||||
</data>
|
|
||||||
<data name="label5.Text" xml:space="preserve">
|
|
||||||
<value>加密方式</value>
|
|
||||||
</data>
|
|
||||||
<data name="label6.Text" xml:space="preserve">
|
|
||||||
<value>别名(remarks)</value>
|
|
||||||
</data>
|
|
||||||
<data name="MenuItem1.Text" xml:space="preserve">
|
|
||||||
<value>导入配置文件</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuItemImportClipboard.Text" xml:space="preserve">
|
|
||||||
<value>从剪贴板导入URL</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
|
||||||
220
v2rayN/v2rayN/Forms/AddServer4Form.Designer.cs
generated
220
v2rayN/v2rayN/Forms/AddServer4Form.Designer.cs
generated
@@ -1,220 +0,0 @@
|
|||||||
namespace v2rayN.Forms
|
|
||||||
{
|
|
||||||
partial class AddServer4Form
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Required designer variable.
|
|
||||||
/// </summary>
|
|
||||||
private System.ComponentModel.IContainer components = null;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Clean up any resources being used.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
|
||||||
protected override void Dispose(bool disposing)
|
|
||||||
{
|
|
||||||
if (disposing && (components != null))
|
|
||||||
{
|
|
||||||
components.Dispose();
|
|
||||||
}
|
|
||||||
base.Dispose(disposing);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Windows Form Designer generated code
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Required method for Designer support - do not modify
|
|
||||||
/// the contents of this method with the code editor.
|
|
||||||
/// </summary>
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AddServer4Form));
|
|
||||||
this.btnClose = new System.Windows.Forms.Button();
|
|
||||||
this.groupBox1 = new System.Windows.Forms.GroupBox();
|
|
||||||
this.txtSecurity = new System.Windows.Forms.TextBox();
|
|
||||||
this.label4 = new System.Windows.Forms.Label();
|
|
||||||
this.txtId = new System.Windows.Forms.TextBox();
|
|
||||||
this.label3 = new System.Windows.Forms.Label();
|
|
||||||
this.label13 = new System.Windows.Forms.Label();
|
|
||||||
this.txtRemarks = new System.Windows.Forms.TextBox();
|
|
||||||
this.label6 = new System.Windows.Forms.Label();
|
|
||||||
this.txtPort = new System.Windows.Forms.TextBox();
|
|
||||||
this.label2 = new System.Windows.Forms.Label();
|
|
||||||
this.txtAddress = new System.Windows.Forms.TextBox();
|
|
||||||
this.label1 = new System.Windows.Forms.Label();
|
|
||||||
this.panel2 = new System.Windows.Forms.Panel();
|
|
||||||
this.btnOK = new System.Windows.Forms.Button();
|
|
||||||
this.panel1 = new System.Windows.Forms.Panel();
|
|
||||||
this.menuServer = new System.Windows.Forms.MenuStrip();
|
|
||||||
this.MenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuItemImportClipboard = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.groupBox1.SuspendLayout();
|
|
||||||
this.panel2.SuspendLayout();
|
|
||||||
this.menuServer.SuspendLayout();
|
|
||||||
this.SuspendLayout();
|
|
||||||
//
|
|
||||||
// btnClose
|
|
||||||
//
|
|
||||||
this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
|
||||||
resources.ApplyResources(this.btnClose, "btnClose");
|
|
||||||
this.btnClose.Name = "btnClose";
|
|
||||||
this.btnClose.UseVisualStyleBackColor = true;
|
|
||||||
this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
|
|
||||||
//
|
|
||||||
// groupBox1
|
|
||||||
//
|
|
||||||
this.groupBox1.Controls.Add(this.txtSecurity);
|
|
||||||
this.groupBox1.Controls.Add(this.label4);
|
|
||||||
this.groupBox1.Controls.Add(this.txtId);
|
|
||||||
this.groupBox1.Controls.Add(this.label3);
|
|
||||||
this.groupBox1.Controls.Add(this.label13);
|
|
||||||
this.groupBox1.Controls.Add(this.txtRemarks);
|
|
||||||
this.groupBox1.Controls.Add(this.label6);
|
|
||||||
this.groupBox1.Controls.Add(this.txtPort);
|
|
||||||
this.groupBox1.Controls.Add(this.label2);
|
|
||||||
this.groupBox1.Controls.Add(this.txtAddress);
|
|
||||||
this.groupBox1.Controls.Add(this.label1);
|
|
||||||
resources.ApplyResources(this.groupBox1, "groupBox1");
|
|
||||||
this.groupBox1.Name = "groupBox1";
|
|
||||||
this.groupBox1.TabStop = false;
|
|
||||||
//
|
|
||||||
// txtSecurity
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtSecurity, "txtSecurity");
|
|
||||||
this.txtSecurity.Name = "txtSecurity";
|
|
||||||
//
|
|
||||||
// label4
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label4, "label4");
|
|
||||||
this.label4.Name = "label4";
|
|
||||||
//
|
|
||||||
// txtId
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtId, "txtId");
|
|
||||||
this.txtId.Name = "txtId";
|
|
||||||
//
|
|
||||||
// label3
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label3, "label3");
|
|
||||||
this.label3.Name = "label3";
|
|
||||||
//
|
|
||||||
// label13
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label13, "label13");
|
|
||||||
this.label13.Name = "label13";
|
|
||||||
//
|
|
||||||
// txtRemarks
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtRemarks, "txtRemarks");
|
|
||||||
this.txtRemarks.Name = "txtRemarks";
|
|
||||||
//
|
|
||||||
// label6
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label6, "label6");
|
|
||||||
this.label6.Name = "label6";
|
|
||||||
//
|
|
||||||
// txtPort
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtPort, "txtPort");
|
|
||||||
this.txtPort.Name = "txtPort";
|
|
||||||
//
|
|
||||||
// label2
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label2, "label2");
|
|
||||||
this.label2.Name = "label2";
|
|
||||||
//
|
|
||||||
// txtAddress
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtAddress, "txtAddress");
|
|
||||||
this.txtAddress.Name = "txtAddress";
|
|
||||||
//
|
|
||||||
// label1
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label1, "label1");
|
|
||||||
this.label1.Name = "label1";
|
|
||||||
//
|
|
||||||
// panel2
|
|
||||||
//
|
|
||||||
this.panel2.Controls.Add(this.btnClose);
|
|
||||||
this.panel2.Controls.Add(this.btnOK);
|
|
||||||
resources.ApplyResources(this.panel2, "panel2");
|
|
||||||
this.panel2.Name = "panel2";
|
|
||||||
//
|
|
||||||
// btnOK
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.btnOK, "btnOK");
|
|
||||||
this.btnOK.Name = "btnOK";
|
|
||||||
this.btnOK.UseVisualStyleBackColor = true;
|
|
||||||
this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
|
|
||||||
//
|
|
||||||
// panel1
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.panel1, "panel1");
|
|
||||||
this.panel1.Name = "panel1";
|
|
||||||
//
|
|
||||||
// menuServer
|
|
||||||
//
|
|
||||||
this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
|
||||||
this.MenuItem1});
|
|
||||||
resources.ApplyResources(this.menuServer, "menuServer");
|
|
||||||
this.menuServer.Name = "menuServer";
|
|
||||||
//
|
|
||||||
// MenuItem1
|
|
||||||
//
|
|
||||||
this.MenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
|
||||||
this.menuItemImportClipboard});
|
|
||||||
this.MenuItem1.Name = "MenuItem1";
|
|
||||||
resources.ApplyResources(this.MenuItem1, "MenuItem1");
|
|
||||||
//
|
|
||||||
// menuItemImportClipboard
|
|
||||||
//
|
|
||||||
this.menuItemImportClipboard.Name = "menuItemImportClipboard";
|
|
||||||
resources.ApplyResources(this.menuItemImportClipboard, "menuItemImportClipboard");
|
|
||||||
this.menuItemImportClipboard.Click += new System.EventHandler(this.menuItemImportClipboard_Click);
|
|
||||||
//
|
|
||||||
// AddServer4Form
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this, "$this");
|
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
|
||||||
this.CancelButton = this.btnClose;
|
|
||||||
this.Controls.Add(this.groupBox1);
|
|
||||||
this.Controls.Add(this.panel2);
|
|
||||||
this.Controls.Add(this.panel1);
|
|
||||||
this.Controls.Add(this.menuServer);
|
|
||||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
|
|
||||||
this.MinimizeBox = true;
|
|
||||||
this.Name = "AddServer4Form";
|
|
||||||
this.Load += new System.EventHandler(this.AddServer4Form_Load);
|
|
||||||
this.groupBox1.ResumeLayout(false);
|
|
||||||
this.groupBox1.PerformLayout();
|
|
||||||
this.panel2.ResumeLayout(false);
|
|
||||||
this.menuServer.ResumeLayout(false);
|
|
||||||
this.menuServer.PerformLayout();
|
|
||||||
this.ResumeLayout(false);
|
|
||||||
this.PerformLayout();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
private System.Windows.Forms.GroupBox groupBox1;
|
|
||||||
private System.Windows.Forms.Button btnClose;
|
|
||||||
private System.Windows.Forms.Button btnOK;
|
|
||||||
private System.Windows.Forms.TextBox txtRemarks;
|
|
||||||
private System.Windows.Forms.Label label6;
|
|
||||||
private System.Windows.Forms.TextBox txtPort;
|
|
||||||
private System.Windows.Forms.Label label2;
|
|
||||||
private System.Windows.Forms.TextBox txtAddress;
|
|
||||||
private System.Windows.Forms.Label label1;
|
|
||||||
private System.Windows.Forms.Panel panel1;
|
|
||||||
private System.Windows.Forms.Panel panel2;
|
|
||||||
private System.Windows.Forms.Label label13;
|
|
||||||
private System.Windows.Forms.MenuStrip menuServer;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem MenuItem1;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuItemImportClipboard;
|
|
||||||
private System.Windows.Forms.TextBox txtId;
|
|
||||||
private System.Windows.Forms.Label label3;
|
|
||||||
private System.Windows.Forms.TextBox txtSecurity;
|
|
||||||
private System.Windows.Forms.Label label4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,131 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
using v2rayN.Handler;
|
|
||||||
using v2rayN.Mode;
|
|
||||||
|
|
||||||
namespace v2rayN.Forms
|
|
||||||
{
|
|
||||||
public partial class AddServer4Form : BaseForm
|
|
||||||
{
|
|
||||||
public int EditIndex { get; set; }
|
|
||||||
VmessItem vmessItem = null;
|
|
||||||
|
|
||||||
public AddServer4Form()
|
|
||||||
{
|
|
||||||
InitializeComponent();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void AddServer4Form_Load(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
if (EditIndex >= 0)
|
|
||||||
{
|
|
||||||
vmessItem = config.vmess[EditIndex];
|
|
||||||
BindingServer();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
vmessItem = new VmessItem();
|
|
||||||
ClearServer();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 绑定数据
|
|
||||||
/// </summary>
|
|
||||||
private void BindingServer()
|
|
||||||
{
|
|
||||||
txtAddress.Text = vmessItem.address;
|
|
||||||
txtPort.Text = vmessItem.port.ToString();
|
|
||||||
txtId.Text = vmessItem.id;
|
|
||||||
txtSecurity.Text = vmessItem.security;
|
|
||||||
txtRemarks.Text = vmessItem.remarks;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 清除设置
|
|
||||||
/// </summary>
|
|
||||||
private void ClearServer()
|
|
||||||
{
|
|
||||||
txtAddress.Text = "";
|
|
||||||
txtPort.Text = "";
|
|
||||||
txtId.Text = "";
|
|
||||||
txtSecurity.Text = "";
|
|
||||||
txtRemarks.Text = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
private void btnOK_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
string address = txtAddress.Text;
|
|
||||||
string port = txtPort.Text;
|
|
||||||
string id = txtId.Text;
|
|
||||||
string security = txtSecurity.Text;
|
|
||||||
string remarks = txtRemarks.Text;
|
|
||||||
|
|
||||||
if (Utils.IsNullOrEmpty(address))
|
|
||||||
{
|
|
||||||
UI.Show(UIRes.I18N("FillServerAddress"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (Utils.IsNullOrEmpty(port) || !Utils.IsNumberic(port))
|
|
||||||
{
|
|
||||||
UI.Show(UIRes.I18N("FillCorrectServerPort"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
vmessItem.address = address;
|
|
||||||
vmessItem.port = Utils.ToInt(port);
|
|
||||||
vmessItem.id = id;
|
|
||||||
vmessItem.security = security;
|
|
||||||
vmessItem.remarks = remarks;
|
|
||||||
|
|
||||||
if (ConfigHandler.AddSocksServer(ref config, vmessItem, EditIndex) == 0)
|
|
||||||
{
|
|
||||||
this.DialogResult = DialogResult.OK;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UI.ShowWarning(UIRes.I18N("OperationFailed"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private void btnClose_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
this.DialogResult = DialogResult.Cancel;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#region 导入配置
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 从剪贴板导入URL
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sender"></param>
|
|
||||||
/// <param name="e"></param>
|
|
||||||
private void menuItemImportClipboard_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
ImportConfig();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ImportConfig()
|
|
||||||
{
|
|
||||||
ClearServer();
|
|
||||||
|
|
||||||
VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out string msg);
|
|
||||||
if (vmessItem == null)
|
|
||||||
{
|
|
||||||
UI.ShowWarning(msg);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
txtAddress.Text = vmessItem.address;
|
|
||||||
txtPort.Text = vmessItem.port.ToString();
|
|
||||||
txtSecurity.Text = vmessItem.security;
|
|
||||||
txtId.Text = vmessItem.id;
|
|
||||||
txtRemarks.Text = vmessItem.remarks;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,366 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<root>
|
|
||||||
<!--
|
|
||||||
Microsoft ResX Schema
|
|
||||||
|
|
||||||
Version 2.0
|
|
||||||
|
|
||||||
The primary goals of this format is to allow a simple XML format
|
|
||||||
that is mostly human readable. The generation and parsing of the
|
|
||||||
various data types are done through the TypeConverter classes
|
|
||||||
associated with the data types.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
... ado.net/XML headers & schema ...
|
|
||||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
|
||||||
<resheader name="version">2.0</resheader>
|
|
||||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
|
||||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
|
||||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
|
||||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
|
||||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
|
||||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
|
||||||
</data>
|
|
||||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
|
||||||
<comment>This is a comment</comment>
|
|
||||||
</data>
|
|
||||||
|
|
||||||
There are any number of "resheader" rows that contain simple
|
|
||||||
name/value pairs.
|
|
||||||
|
|
||||||
Each data row contains a name, and value. The row also contains a
|
|
||||||
type or mimetype. Type corresponds to a .NET class that support
|
|
||||||
text/value conversion through the TypeConverter architecture.
|
|
||||||
Classes that don't support this are serialized and stored with the
|
|
||||||
mimetype set.
|
|
||||||
|
|
||||||
The mimetype is used for serialized objects, and tells the
|
|
||||||
ResXResourceReader how to depersist the object. This is currently not
|
|
||||||
extensible. For a given mimetype the value must be set accordingly:
|
|
||||||
|
|
||||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
|
||||||
that the ResXResourceWriter will generate, however the reader can
|
|
||||||
read any of the formats listed below.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.binary.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.soap.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
|
||||||
value : The object must be serialized into a byte array
|
|
||||||
: using a System.ComponentModel.TypeConverter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
-->
|
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
|
||||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:choice maxOccurs="unbounded">
|
|
||||||
<xsd:element name="metadata">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="assembly">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:attribute name="alias" type="xsd:string" />
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="data">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="resheader">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:choice>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:schema>
|
|
||||||
<resheader name="resmimetype">
|
|
||||||
<value>text/microsoft-resx</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="version">
|
|
||||||
<value>2.0</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="reader">
|
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="writer">
|
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
|
||||||
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
|
||||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
|
||||||
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
|
|
||||||
<value>6, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>547, 291</value>
|
|
||||||
</data>
|
|
||||||
<data name="$this.Localizable" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="$this.Text" xml:space="preserve">
|
|
||||||
<value>Edit or add a [Socks] server</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnClose.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>396, 17</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnClose.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>75, 23</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnClose.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>4</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnClose.Text" xml:space="preserve">
|
|
||||||
<value>&Cancel</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnOK.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>303, 17</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnOK.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>75, 23</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnOK.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>5</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnOK.Text" xml:space="preserve">
|
|
||||||
<value>&OK</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
|
||||||
<value>Fill</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox1.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>0, 35</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox1.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>547, 196</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox1.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>3</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox1.Text" xml:space="preserve">
|
|
||||||
<value>Server</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>12, 31</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>89, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>0</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.Text" xml:space="preserve">
|
|
||||||
<value>Server address</value>
|
|
||||||
</data>
|
|
||||||
<data name="label13.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label13.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>337, 158</value>
|
|
||||||
</data>
|
|
||||||
<data name="label13.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>113, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label13.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>22</value>
|
|
||||||
</data>
|
|
||||||
<data name="label13.Text" xml:space="preserve">
|
|
||||||
<value>* Fill in manually</value>
|
|
||||||
</data>
|
|
||||||
<data name="label2.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label2.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>12, 60</value>
|
|
||||||
</data>
|
|
||||||
<data name="label2.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>71, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label2.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>2</value>
|
|
||||||
</data>
|
|
||||||
<data name="label2.Text" xml:space="preserve">
|
|
||||||
<value>Server port</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
|
||||||
<value>NoControl</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>12, 121</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>113, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>23</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.Text" xml:space="preserve">
|
|
||||||
<value>Password(Optional)</value>
|
|
||||||
</data>
|
|
||||||
<data name="label4.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label4.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
|
||||||
<value>NoControl</value>
|
|
||||||
</data>
|
|
||||||
<data name="label4.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>12, 88</value>
|
|
||||||
</data>
|
|
||||||
<data name="label4.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>89, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label4.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>25</value>
|
|
||||||
</data>
|
|
||||||
<data name="label4.Text" xml:space="preserve">
|
|
||||||
<value>User(Optional)</value>
|
|
||||||
</data>
|
|
||||||
<data name="label6.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label6.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>12, 158</value>
|
|
||||||
</data>
|
|
||||||
<data name="label6.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>95, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label6.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>10</value>
|
|
||||||
</data>
|
|
||||||
<data name="label6.Text" xml:space="preserve">
|
|
||||||
<value>Alias (remarks)</value>
|
|
||||||
</data>
|
|
||||||
<data name="MenuItem1.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>162, 21</value>
|
|
||||||
</data>
|
|
||||||
<data name="MenuItem1.Text" xml:space="preserve">
|
|
||||||
<value>Import configuration file</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuItemImportClipboard.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>235, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuItemImportClipboard.Text" xml:space="preserve">
|
|
||||||
<value>Import URL from clipboard</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuServer.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>0, 0</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuServer.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>547, 25</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuServer.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>8</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuServer.TrayLocation" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>17, 17</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
|
||||||
<value>Top</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel1.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>0, 25</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel1.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>547, 10</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel1.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>6</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel2.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
|
||||||
<value>Bottom</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel2.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>0, 231</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel2.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>547, 60</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel2.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>7</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtAddress.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>127, 27</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtAddress.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>359, 21</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtAddress.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>1</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtId.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>127, 117</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtId.PasswordChar" type="System.Char, mscorlib" xml:space="preserve">
|
|
||||||
<value>*</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtId.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>278, 21</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtId.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>24</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtPort.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>127, 56</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtPort.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>194, 21</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtPort.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>3</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtRemarks.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>127, 154</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtRemarks.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>194, 21</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtRemarks.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>11</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtSecurity.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>127, 84</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtSecurity.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>278, 21</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtSecurity.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>26</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
|
||||||
@@ -1,190 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<root>
|
|
||||||
<!--
|
|
||||||
Microsoft ResX Schema
|
|
||||||
|
|
||||||
Version 2.0
|
|
||||||
|
|
||||||
The primary goals of this format is to allow a simple XML format
|
|
||||||
that is mostly human readable. The generation and parsing of the
|
|
||||||
various data types are done through the TypeConverter classes
|
|
||||||
associated with the data types.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
... ado.net/XML headers & schema ...
|
|
||||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
|
||||||
<resheader name="version">2.0</resheader>
|
|
||||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
|
||||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
|
||||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
|
||||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
|
||||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
|
||||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
|
||||||
</data>
|
|
||||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
|
||||||
<comment>This is a comment</comment>
|
|
||||||
</data>
|
|
||||||
|
|
||||||
There are any number of "resheader" rows that contain simple
|
|
||||||
name/value pairs.
|
|
||||||
|
|
||||||
Each data row contains a name, and value. The row also contains a
|
|
||||||
type or mimetype. Type corresponds to a .NET class that support
|
|
||||||
text/value conversion through the TypeConverter architecture.
|
|
||||||
Classes that don't support this are serialized and stored with the
|
|
||||||
mimetype set.
|
|
||||||
|
|
||||||
The mimetype is used for serialized objects, and tells the
|
|
||||||
ResXResourceReader how to depersist the object. This is currently not
|
|
||||||
extensible. For a given mimetype the value must be set accordingly:
|
|
||||||
|
|
||||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
|
||||||
that the ResXResourceWriter will generate, however the reader can
|
|
||||||
read any of the formats listed below.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.binary.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.soap.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
|
||||||
value : The object must be serialized into a byte array
|
|
||||||
: using a System.ComponentModel.TypeConverter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
-->
|
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
|
||||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:choice maxOccurs="unbounded">
|
|
||||||
<xsd:element name="metadata">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="assembly">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:attribute name="alias" type="xsd:string" />
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="data">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="resheader">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:choice>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:schema>
|
|
||||||
<resheader name="resmimetype">
|
|
||||||
<value>text/microsoft-resx</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="version">
|
|
||||||
<value>2.0</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="reader">
|
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="writer">
|
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
|
||||||
<data name="$this.Text" xml:space="preserve">
|
|
||||||
<value>编辑或添加[Socks]服务器</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnClose.Text" xml:space="preserve">
|
|
||||||
<value>取消(&C)</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnOK.Text" xml:space="preserve">
|
|
||||||
<value>确定(&O)</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox1.Text" xml:space="preserve">
|
|
||||||
<value>服务器</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>65, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.Text" xml:space="preserve">
|
|
||||||
<value>服务器地址</value>
|
|
||||||
</data>
|
|
||||||
<data name="label13.Text" xml:space="preserve">
|
|
||||||
<value>*手填,方便识别管理</value>
|
|
||||||
</data>
|
|
||||||
<data name="label2.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>65, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label2.Text" xml:space="preserve">
|
|
||||||
<value>服务器端口</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>12, 119</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>65, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.Text" xml:space="preserve">
|
|
||||||
<value>密码(可选)</value>
|
|
||||||
</data>
|
|
||||||
<data name="label4.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>12, 89</value>
|
|
||||||
</data>
|
|
||||||
<data name="label4.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>77, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label4.Text" xml:space="preserve">
|
|
||||||
<value>用户名(可选)</value>
|
|
||||||
</data>
|
|
||||||
<data name="label6.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>83, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label6.Text" xml:space="preserve">
|
|
||||||
<value>别名(remarks)</value>
|
|
||||||
</data>
|
|
||||||
<data name="MenuItem1.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>92, 21</value>
|
|
||||||
</data>
|
|
||||||
<data name="MenuItem1.Text" xml:space="preserve">
|
|
||||||
<value>导入配置文件</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuItemImportClipboard.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>171, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuItemImportClipboard.Text" xml:space="preserve">
|
|
||||||
<value>从剪贴板导入URL</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtId.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>127, 115</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtSecurity.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>127, 85</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
|
||||||
516
v2rayN/v2rayN/Forms/AddServerForm.Designer.cs
generated
516
v2rayN/v2rayN/Forms/AddServerForm.Designer.cs
generated
@@ -1,516 +0,0 @@
|
|||||||
namespace v2rayN.Forms
|
|
||||||
{
|
|
||||||
partial class AddServerForm
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Required designer variable.
|
|
||||||
/// </summary>
|
|
||||||
private System.ComponentModel.IContainer components = null;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Clean up any resources being used.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
|
||||||
protected override void Dispose(bool disposing)
|
|
||||||
{
|
|
||||||
if (disposing && (components != null))
|
|
||||||
{
|
|
||||||
components.Dispose();
|
|
||||||
}
|
|
||||||
base.Dispose(disposing);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Windows Form Designer generated code
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Required method for Designer support - do not modify
|
|
||||||
/// the contents of this method with the code editor.
|
|
||||||
/// </summary>
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AddServerForm));
|
|
||||||
this.btnClose = new System.Windows.Forms.Button();
|
|
||||||
this.groupBox1 = new System.Windows.Forms.GroupBox();
|
|
||||||
this.btnGUID = new System.Windows.Forms.Button();
|
|
||||||
this.label13 = new System.Windows.Forms.Label();
|
|
||||||
this.groupBox2 = new System.Windows.Forms.GroupBox();
|
|
||||||
this.label24 = new System.Windows.Forms.Label();
|
|
||||||
this.label23 = new System.Windows.Forms.Label();
|
|
||||||
this.panTlsMore = new System.Windows.Forms.Panel();
|
|
||||||
this.label22 = new System.Windows.Forms.Label();
|
|
||||||
this.label21 = new System.Windows.Forms.Label();
|
|
||||||
this.cmbAllowInsecure = new System.Windows.Forms.ComboBox();
|
|
||||||
this.label20 = new System.Windows.Forms.Label();
|
|
||||||
this.txtPath = new System.Windows.Forms.TextBox();
|
|
||||||
this.label19 = new System.Windows.Forms.Label();
|
|
||||||
this.label18 = new System.Windows.Forms.Label();
|
|
||||||
this.label17 = new System.Windows.Forms.Label();
|
|
||||||
this.label16 = new System.Windows.Forms.Label();
|
|
||||||
this.label14 = new System.Windows.Forms.Label();
|
|
||||||
this.label15 = new System.Windows.Forms.Label();
|
|
||||||
this.cmbStreamSecurity = new System.Windows.Forms.ComboBox();
|
|
||||||
this.label12 = new System.Windows.Forms.Label();
|
|
||||||
this.txtRequestHost = new System.Windows.Forms.TextBox();
|
|
||||||
this.label11 = new System.Windows.Forms.Label();
|
|
||||||
this.label10 = new System.Windows.Forms.Label();
|
|
||||||
this.cmbHeaderType = new System.Windows.Forms.ComboBox();
|
|
||||||
this.label9 = new System.Windows.Forms.Label();
|
|
||||||
this.label8 = new System.Windows.Forms.Label();
|
|
||||||
this.cmbNetwork = new System.Windows.Forms.ComboBox();
|
|
||||||
this.label7 = new System.Windows.Forms.Label();
|
|
||||||
this.cmbSecurity = new System.Windows.Forms.ComboBox();
|
|
||||||
this.txtRemarks = new System.Windows.Forms.TextBox();
|
|
||||||
this.label6 = new System.Windows.Forms.Label();
|
|
||||||
this.label5 = new System.Windows.Forms.Label();
|
|
||||||
this.txtAlterId = new System.Windows.Forms.TextBox();
|
|
||||||
this.label4 = new System.Windows.Forms.Label();
|
|
||||||
this.txtId = new System.Windows.Forms.TextBox();
|
|
||||||
this.label3 = new System.Windows.Forms.Label();
|
|
||||||
this.txtPort = new System.Windows.Forms.TextBox();
|
|
||||||
this.label2 = new System.Windows.Forms.Label();
|
|
||||||
this.txtAddress = new System.Windows.Forms.TextBox();
|
|
||||||
this.label1 = new System.Windows.Forms.Label();
|
|
||||||
this.panel2 = new System.Windows.Forms.Panel();
|
|
||||||
this.btnOK = new System.Windows.Forms.Button();
|
|
||||||
this.panel1 = new System.Windows.Forms.Panel();
|
|
||||||
this.menuServer = new System.Windows.Forms.MenuStrip();
|
|
||||||
this.MenuItem1 = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.MenuItemImportClient = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.MenuItemImportServer = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
|
|
||||||
this.MenuItemImportClipboard = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.groupBox1.SuspendLayout();
|
|
||||||
this.groupBox2.SuspendLayout();
|
|
||||||
this.panTlsMore.SuspendLayout();
|
|
||||||
this.panel2.SuspendLayout();
|
|
||||||
this.menuServer.SuspendLayout();
|
|
||||||
this.SuspendLayout();
|
|
||||||
//
|
|
||||||
// btnClose
|
|
||||||
//
|
|
||||||
this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
|
||||||
resources.ApplyResources(this.btnClose, "btnClose");
|
|
||||||
this.btnClose.Name = "btnClose";
|
|
||||||
this.btnClose.UseVisualStyleBackColor = true;
|
|
||||||
this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
|
|
||||||
//
|
|
||||||
// groupBox1
|
|
||||||
//
|
|
||||||
this.groupBox1.Controls.Add(this.btnGUID);
|
|
||||||
this.groupBox1.Controls.Add(this.label13);
|
|
||||||
this.groupBox1.Controls.Add(this.groupBox2);
|
|
||||||
this.groupBox1.Controls.Add(this.label9);
|
|
||||||
this.groupBox1.Controls.Add(this.label8);
|
|
||||||
this.groupBox1.Controls.Add(this.cmbNetwork);
|
|
||||||
this.groupBox1.Controls.Add(this.label7);
|
|
||||||
this.groupBox1.Controls.Add(this.cmbSecurity);
|
|
||||||
this.groupBox1.Controls.Add(this.txtRemarks);
|
|
||||||
this.groupBox1.Controls.Add(this.label6);
|
|
||||||
this.groupBox1.Controls.Add(this.label5);
|
|
||||||
this.groupBox1.Controls.Add(this.txtAlterId);
|
|
||||||
this.groupBox1.Controls.Add(this.label4);
|
|
||||||
this.groupBox1.Controls.Add(this.txtId);
|
|
||||||
this.groupBox1.Controls.Add(this.label3);
|
|
||||||
this.groupBox1.Controls.Add(this.txtPort);
|
|
||||||
this.groupBox1.Controls.Add(this.label2);
|
|
||||||
this.groupBox1.Controls.Add(this.txtAddress);
|
|
||||||
this.groupBox1.Controls.Add(this.label1);
|
|
||||||
resources.ApplyResources(this.groupBox1, "groupBox1");
|
|
||||||
this.groupBox1.Name = "groupBox1";
|
|
||||||
this.groupBox1.TabStop = false;
|
|
||||||
//
|
|
||||||
// btnGUID
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.btnGUID, "btnGUID");
|
|
||||||
this.btnGUID.Name = "btnGUID";
|
|
||||||
this.btnGUID.UseVisualStyleBackColor = true;
|
|
||||||
this.btnGUID.Click += new System.EventHandler(this.btnGUID_Click);
|
|
||||||
//
|
|
||||||
// label13
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label13, "label13");
|
|
||||||
this.label13.Name = "label13";
|
|
||||||
//
|
|
||||||
// groupBox2
|
|
||||||
//
|
|
||||||
this.groupBox2.Controls.Add(this.label24);
|
|
||||||
this.groupBox2.Controls.Add(this.label23);
|
|
||||||
this.groupBox2.Controls.Add(this.panTlsMore);
|
|
||||||
this.groupBox2.Controls.Add(this.label20);
|
|
||||||
this.groupBox2.Controls.Add(this.txtPath);
|
|
||||||
this.groupBox2.Controls.Add(this.label19);
|
|
||||||
this.groupBox2.Controls.Add(this.label18);
|
|
||||||
this.groupBox2.Controls.Add(this.label17);
|
|
||||||
this.groupBox2.Controls.Add(this.label16);
|
|
||||||
this.groupBox2.Controls.Add(this.label14);
|
|
||||||
this.groupBox2.Controls.Add(this.label15);
|
|
||||||
this.groupBox2.Controls.Add(this.cmbStreamSecurity);
|
|
||||||
this.groupBox2.Controls.Add(this.label12);
|
|
||||||
this.groupBox2.Controls.Add(this.txtRequestHost);
|
|
||||||
this.groupBox2.Controls.Add(this.label11);
|
|
||||||
this.groupBox2.Controls.Add(this.label10);
|
|
||||||
this.groupBox2.Controls.Add(this.cmbHeaderType);
|
|
||||||
resources.ApplyResources(this.groupBox2, "groupBox2");
|
|
||||||
this.groupBox2.Name = "groupBox2";
|
|
||||||
this.groupBox2.TabStop = false;
|
|
||||||
//
|
|
||||||
// label24
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label24, "label24");
|
|
||||||
this.label24.Name = "label24";
|
|
||||||
//
|
|
||||||
// label23
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label23, "label23");
|
|
||||||
this.label23.Name = "label23";
|
|
||||||
//
|
|
||||||
// panTlsMore
|
|
||||||
//
|
|
||||||
this.panTlsMore.Controls.Add(this.label22);
|
|
||||||
this.panTlsMore.Controls.Add(this.label21);
|
|
||||||
this.panTlsMore.Controls.Add(this.cmbAllowInsecure);
|
|
||||||
resources.ApplyResources(this.panTlsMore, "panTlsMore");
|
|
||||||
this.panTlsMore.Name = "panTlsMore";
|
|
||||||
//
|
|
||||||
// label22
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label22, "label22");
|
|
||||||
this.label22.Name = "label22";
|
|
||||||
//
|
|
||||||
// label21
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label21, "label21");
|
|
||||||
this.label21.Name = "label21";
|
|
||||||
//
|
|
||||||
// cmbAllowInsecure
|
|
||||||
//
|
|
||||||
this.cmbAllowInsecure.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
|
||||||
this.cmbAllowInsecure.FormattingEnabled = true;
|
|
||||||
this.cmbAllowInsecure.Items.AddRange(new object[] {
|
|
||||||
resources.GetString("cmbAllowInsecure.Items"),
|
|
||||||
resources.GetString("cmbAllowInsecure.Items1"),
|
|
||||||
resources.GetString("cmbAllowInsecure.Items2")});
|
|
||||||
resources.ApplyResources(this.cmbAllowInsecure, "cmbAllowInsecure");
|
|
||||||
this.cmbAllowInsecure.Name = "cmbAllowInsecure";
|
|
||||||
//
|
|
||||||
// label20
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label20, "label20");
|
|
||||||
this.label20.Name = "label20";
|
|
||||||
//
|
|
||||||
// txtPath
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtPath, "txtPath");
|
|
||||||
this.txtPath.Name = "txtPath";
|
|
||||||
//
|
|
||||||
// label19
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label19, "label19");
|
|
||||||
this.label19.Name = "label19";
|
|
||||||
//
|
|
||||||
// label18
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label18, "label18");
|
|
||||||
this.label18.Name = "label18";
|
|
||||||
//
|
|
||||||
// label17
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label17, "label17");
|
|
||||||
this.label17.Name = "label17";
|
|
||||||
//
|
|
||||||
// label16
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label16, "label16");
|
|
||||||
this.label16.Name = "label16";
|
|
||||||
//
|
|
||||||
// label14
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label14, "label14");
|
|
||||||
this.label14.Name = "label14";
|
|
||||||
//
|
|
||||||
// label15
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label15, "label15");
|
|
||||||
this.label15.Name = "label15";
|
|
||||||
//
|
|
||||||
// cmbStreamSecurity
|
|
||||||
//
|
|
||||||
this.cmbStreamSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
|
||||||
this.cmbStreamSecurity.FormattingEnabled = true;
|
|
||||||
this.cmbStreamSecurity.Items.AddRange(new object[] {
|
|
||||||
resources.GetString("cmbStreamSecurity.Items"),
|
|
||||||
resources.GetString("cmbStreamSecurity.Items1")});
|
|
||||||
resources.ApplyResources(this.cmbStreamSecurity, "cmbStreamSecurity");
|
|
||||||
this.cmbStreamSecurity.Name = "cmbStreamSecurity";
|
|
||||||
this.cmbStreamSecurity.SelectedIndexChanged += new System.EventHandler(this.cmbStreamSecurity_SelectedIndexChanged);
|
|
||||||
//
|
|
||||||
// label12
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label12, "label12");
|
|
||||||
this.label12.Name = "label12";
|
|
||||||
//
|
|
||||||
// txtRequestHost
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtRequestHost, "txtRequestHost");
|
|
||||||
this.txtRequestHost.Name = "txtRequestHost";
|
|
||||||
//
|
|
||||||
// label11
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label11, "label11");
|
|
||||||
this.label11.Name = "label11";
|
|
||||||
//
|
|
||||||
// label10
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label10, "label10");
|
|
||||||
this.label10.Name = "label10";
|
|
||||||
//
|
|
||||||
// cmbHeaderType
|
|
||||||
//
|
|
||||||
this.cmbHeaderType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
|
||||||
this.cmbHeaderType.FormattingEnabled = true;
|
|
||||||
this.cmbHeaderType.Items.AddRange(new object[] {
|
|
||||||
resources.GetString("cmbHeaderType.Items"),
|
|
||||||
resources.GetString("cmbHeaderType.Items1"),
|
|
||||||
resources.GetString("cmbHeaderType.Items2"),
|
|
||||||
resources.GetString("cmbHeaderType.Items3"),
|
|
||||||
resources.GetString("cmbHeaderType.Items4"),
|
|
||||||
resources.GetString("cmbHeaderType.Items5"),
|
|
||||||
resources.GetString("cmbHeaderType.Items6")});
|
|
||||||
resources.ApplyResources(this.cmbHeaderType, "cmbHeaderType");
|
|
||||||
this.cmbHeaderType.Name = "cmbHeaderType";
|
|
||||||
//
|
|
||||||
// label9
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label9, "label9");
|
|
||||||
this.label9.Name = "label9";
|
|
||||||
//
|
|
||||||
// label8
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label8, "label8");
|
|
||||||
this.label8.Name = "label8";
|
|
||||||
//
|
|
||||||
// cmbNetwork
|
|
||||||
//
|
|
||||||
this.cmbNetwork.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
|
||||||
this.cmbNetwork.FormattingEnabled = true;
|
|
||||||
this.cmbNetwork.Items.AddRange(new object[] {
|
|
||||||
resources.GetString("cmbNetwork.Items"),
|
|
||||||
resources.GetString("cmbNetwork.Items1"),
|
|
||||||
resources.GetString("cmbNetwork.Items2"),
|
|
||||||
resources.GetString("cmbNetwork.Items3"),
|
|
||||||
resources.GetString("cmbNetwork.Items4")});
|
|
||||||
resources.ApplyResources(this.cmbNetwork, "cmbNetwork");
|
|
||||||
this.cmbNetwork.Name = "cmbNetwork";
|
|
||||||
this.cmbNetwork.SelectedIndexChanged += new System.EventHandler(this.cmbNetwork_SelectedIndexChanged);
|
|
||||||
//
|
|
||||||
// label7
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label7, "label7");
|
|
||||||
this.label7.Name = "label7";
|
|
||||||
//
|
|
||||||
// cmbSecurity
|
|
||||||
//
|
|
||||||
this.cmbSecurity.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
|
||||||
this.cmbSecurity.FormattingEnabled = true;
|
|
||||||
this.cmbSecurity.Items.AddRange(new object[] {
|
|
||||||
resources.GetString("cmbSecurity.Items"),
|
|
||||||
resources.GetString("cmbSecurity.Items1"),
|
|
||||||
resources.GetString("cmbSecurity.Items2"),
|
|
||||||
resources.GetString("cmbSecurity.Items3")});
|
|
||||||
resources.ApplyResources(this.cmbSecurity, "cmbSecurity");
|
|
||||||
this.cmbSecurity.Name = "cmbSecurity";
|
|
||||||
//
|
|
||||||
// txtRemarks
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtRemarks, "txtRemarks");
|
|
||||||
this.txtRemarks.Name = "txtRemarks";
|
|
||||||
//
|
|
||||||
// label6
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label6, "label6");
|
|
||||||
this.label6.Name = "label6";
|
|
||||||
//
|
|
||||||
// label5
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label5, "label5");
|
|
||||||
this.label5.Name = "label5";
|
|
||||||
//
|
|
||||||
// txtAlterId
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtAlterId, "txtAlterId");
|
|
||||||
this.txtAlterId.Name = "txtAlterId";
|
|
||||||
//
|
|
||||||
// label4
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label4, "label4");
|
|
||||||
this.label4.Name = "label4";
|
|
||||||
//
|
|
||||||
// txtId
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtId, "txtId");
|
|
||||||
this.txtId.Name = "txtId";
|
|
||||||
//
|
|
||||||
// label3
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label3, "label3");
|
|
||||||
this.label3.Name = "label3";
|
|
||||||
//
|
|
||||||
// txtPort
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtPort, "txtPort");
|
|
||||||
this.txtPort.Name = "txtPort";
|
|
||||||
//
|
|
||||||
// label2
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label2, "label2");
|
|
||||||
this.label2.Name = "label2";
|
|
||||||
//
|
|
||||||
// txtAddress
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtAddress, "txtAddress");
|
|
||||||
this.txtAddress.Name = "txtAddress";
|
|
||||||
//
|
|
||||||
// label1
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label1, "label1");
|
|
||||||
this.label1.Name = "label1";
|
|
||||||
//
|
|
||||||
// panel2
|
|
||||||
//
|
|
||||||
this.panel2.Controls.Add(this.btnClose);
|
|
||||||
this.panel2.Controls.Add(this.btnOK);
|
|
||||||
resources.ApplyResources(this.panel2, "panel2");
|
|
||||||
this.panel2.Name = "panel2";
|
|
||||||
//
|
|
||||||
// btnOK
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.btnOK, "btnOK");
|
|
||||||
this.btnOK.Name = "btnOK";
|
|
||||||
this.btnOK.UseVisualStyleBackColor = true;
|
|
||||||
this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
|
|
||||||
//
|
|
||||||
// panel1
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.panel1, "panel1");
|
|
||||||
this.panel1.Name = "panel1";
|
|
||||||
//
|
|
||||||
// menuServer
|
|
||||||
//
|
|
||||||
this.menuServer.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
|
||||||
this.MenuItem1});
|
|
||||||
resources.ApplyResources(this.menuServer, "menuServer");
|
|
||||||
this.menuServer.Name = "menuServer";
|
|
||||||
//
|
|
||||||
// MenuItem1
|
|
||||||
//
|
|
||||||
this.MenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
|
||||||
this.MenuItemImportClient,
|
|
||||||
this.MenuItemImportServer,
|
|
||||||
this.toolStripSeparator1,
|
|
||||||
this.MenuItemImportClipboard});
|
|
||||||
this.MenuItem1.Name = "MenuItem1";
|
|
||||||
resources.ApplyResources(this.MenuItem1, "MenuItem1");
|
|
||||||
//
|
|
||||||
// MenuItemImportClient
|
|
||||||
//
|
|
||||||
this.MenuItemImportClient.Name = "MenuItemImportClient";
|
|
||||||
resources.ApplyResources(this.MenuItemImportClient, "MenuItemImportClient");
|
|
||||||
this.MenuItemImportClient.Click += new System.EventHandler(this.MenuItemImportClient_Click);
|
|
||||||
//
|
|
||||||
// MenuItemImportServer
|
|
||||||
//
|
|
||||||
this.MenuItemImportServer.Name = "MenuItemImportServer";
|
|
||||||
resources.ApplyResources(this.MenuItemImportServer, "MenuItemImportServer");
|
|
||||||
this.MenuItemImportServer.Click += new System.EventHandler(this.MenuItemImportServer_Click);
|
|
||||||
//
|
|
||||||
// toolStripSeparator1
|
|
||||||
//
|
|
||||||
this.toolStripSeparator1.Name = "toolStripSeparator1";
|
|
||||||
resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1");
|
|
||||||
//
|
|
||||||
// MenuItemImportClipboard
|
|
||||||
//
|
|
||||||
this.MenuItemImportClipboard.Name = "MenuItemImportClipboard";
|
|
||||||
resources.ApplyResources(this.MenuItemImportClipboard, "MenuItemImportClipboard");
|
|
||||||
this.MenuItemImportClipboard.Click += new System.EventHandler(this.MenuItemImportClipboard_Click);
|
|
||||||
//
|
|
||||||
// AddServerForm
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this, "$this");
|
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
|
||||||
this.CancelButton = this.btnClose;
|
|
||||||
this.Controls.Add(this.groupBox1);
|
|
||||||
this.Controls.Add(this.panel2);
|
|
||||||
this.Controls.Add(this.panel1);
|
|
||||||
this.Controls.Add(this.menuServer);
|
|
||||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
|
|
||||||
this.Name = "AddServerForm";
|
|
||||||
this.Load += new System.EventHandler(this.AddServerForm_Load);
|
|
||||||
this.groupBox1.ResumeLayout(false);
|
|
||||||
this.groupBox1.PerformLayout();
|
|
||||||
this.groupBox2.ResumeLayout(false);
|
|
||||||
this.groupBox2.PerformLayout();
|
|
||||||
this.panTlsMore.ResumeLayout(false);
|
|
||||||
this.panTlsMore.PerformLayout();
|
|
||||||
this.panel2.ResumeLayout(false);
|
|
||||||
this.menuServer.ResumeLayout(false);
|
|
||||||
this.menuServer.PerformLayout();
|
|
||||||
this.ResumeLayout(false);
|
|
||||||
this.PerformLayout();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
private System.Windows.Forms.GroupBox groupBox1;
|
|
||||||
private System.Windows.Forms.Button btnClose;
|
|
||||||
private System.Windows.Forms.Button btnOK;
|
|
||||||
private System.Windows.Forms.TextBox txtRemarks;
|
|
||||||
private System.Windows.Forms.Label label6;
|
|
||||||
private System.Windows.Forms.Label label5;
|
|
||||||
private System.Windows.Forms.TextBox txtAlterId;
|
|
||||||
private System.Windows.Forms.Label label4;
|
|
||||||
private System.Windows.Forms.TextBox txtId;
|
|
||||||
private System.Windows.Forms.Label label3;
|
|
||||||
private System.Windows.Forms.TextBox txtPort;
|
|
||||||
private System.Windows.Forms.Label label2;
|
|
||||||
private System.Windows.Forms.TextBox txtAddress;
|
|
||||||
private System.Windows.Forms.Label label1;
|
|
||||||
private System.Windows.Forms.ComboBox cmbSecurity;
|
|
||||||
private System.Windows.Forms.ComboBox cmbNetwork;
|
|
||||||
private System.Windows.Forms.Label label7;
|
|
||||||
private System.Windows.Forms.Label label9;
|
|
||||||
private System.Windows.Forms.Label label8;
|
|
||||||
private System.Windows.Forms.Panel panel1;
|
|
||||||
private System.Windows.Forms.Panel panel2;
|
|
||||||
private System.Windows.Forms.TextBox txtRequestHost;
|
|
||||||
private System.Windows.Forms.Label label10;
|
|
||||||
private System.Windows.Forms.Label label11;
|
|
||||||
private System.Windows.Forms.ComboBox cmbHeaderType;
|
|
||||||
private System.Windows.Forms.Label label12;
|
|
||||||
private System.Windows.Forms.GroupBox groupBox2;
|
|
||||||
private System.Windows.Forms.Label label13;
|
|
||||||
private System.Windows.Forms.MenuStrip menuServer;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem MenuItem1;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem MenuItemImportClient;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem MenuItemImportServer;
|
|
||||||
private System.Windows.Forms.Label label15;
|
|
||||||
private System.Windows.Forms.ComboBox cmbStreamSecurity;
|
|
||||||
private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem MenuItemImportClipboard;
|
|
||||||
private System.Windows.Forms.Button btnGUID;
|
|
||||||
private System.Windows.Forms.Label label16;
|
|
||||||
private System.Windows.Forms.Label label14;
|
|
||||||
private System.Windows.Forms.Label label17;
|
|
||||||
private System.Windows.Forms.Label label18;
|
|
||||||
private System.Windows.Forms.Label label19;
|
|
||||||
private System.Windows.Forms.TextBox txtPath;
|
|
||||||
private System.Windows.Forms.Label label20;
|
|
||||||
private System.Windows.Forms.Label label21;
|
|
||||||
private System.Windows.Forms.ComboBox cmbAllowInsecure;
|
|
||||||
private System.Windows.Forms.Label label22;
|
|
||||||
private System.Windows.Forms.Panel panTlsMore;
|
|
||||||
private System.Windows.Forms.Label label24;
|
|
||||||
private System.Windows.Forms.Label label23;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,294 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
using v2rayN.Handler;
|
|
||||||
using v2rayN.Mode;
|
|
||||||
|
|
||||||
namespace v2rayN.Forms
|
|
||||||
{
|
|
||||||
public partial class AddServerForm : BaseForm
|
|
||||||
{
|
|
||||||
public int EditIndex { get; set; }
|
|
||||||
VmessItem vmessItem = null;
|
|
||||||
|
|
||||||
public AddServerForm()
|
|
||||||
{
|
|
||||||
InitializeComponent();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void AddServerForm_Load(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
if (EditIndex >= 0)
|
|
||||||
{
|
|
||||||
vmessItem = config.vmess[EditIndex];
|
|
||||||
BindingServer();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
vmessItem = new VmessItem();
|
|
||||||
ClearServer();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 绑定数据
|
|
||||||
/// </summary>
|
|
||||||
private void BindingServer()
|
|
||||||
{
|
|
||||||
txtAddress.Text = vmessItem.address;
|
|
||||||
txtPort.Text = vmessItem.port.ToString();
|
|
||||||
txtId.Text = vmessItem.id;
|
|
||||||
txtAlterId.Text = vmessItem.alterId.ToString();
|
|
||||||
cmbSecurity.Text = vmessItem.security;
|
|
||||||
cmbNetwork.Text = vmessItem.network;
|
|
||||||
txtRemarks.Text = vmessItem.remarks;
|
|
||||||
|
|
||||||
cmbHeaderType.Text = vmessItem.headerType;
|
|
||||||
txtRequestHost.Text = vmessItem.requestHost;
|
|
||||||
txtPath.Text = vmessItem.path;
|
|
||||||
cmbStreamSecurity.Text = vmessItem.streamSecurity;
|
|
||||||
cmbAllowInsecure.Text = vmessItem.allowInsecure;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 清除设置
|
|
||||||
/// </summary>
|
|
||||||
private void ClearServer()
|
|
||||||
{
|
|
||||||
txtAddress.Text = "";
|
|
||||||
txtPort.Text = "";
|
|
||||||
txtId.Text = "";
|
|
||||||
txtAlterId.Text = "0";
|
|
||||||
cmbSecurity.Text = Global.DefaultSecurity;
|
|
||||||
cmbNetwork.Text = Global.DefaultNetwork;
|
|
||||||
txtRemarks.Text = "";
|
|
||||||
|
|
||||||
cmbHeaderType.Text = Global.None;
|
|
||||||
txtRequestHost.Text = "";
|
|
||||||
cmbStreamSecurity.Text = "";
|
|
||||||
cmbAllowInsecure.Text = "";
|
|
||||||
txtPath.Text = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private void cmbNetwork_SelectedIndexChanged(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
SetHeaderType();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 设置伪装选项
|
|
||||||
/// </summary>
|
|
||||||
private void SetHeaderType()
|
|
||||||
{
|
|
||||||
cmbHeaderType.Items.Clear();
|
|
||||||
|
|
||||||
string network = cmbNetwork.Text;
|
|
||||||
if (Utils.IsNullOrEmpty(network))
|
|
||||||
{
|
|
||||||
cmbHeaderType.Items.Add(Global.None);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
cmbHeaderType.Items.Add(Global.None);
|
|
||||||
if (network.Equals(Global.DefaultNetwork))
|
|
||||||
{
|
|
||||||
cmbHeaderType.Items.Add(Global.TcpHeaderHttp);
|
|
||||||
}
|
|
||||||
else if (network.Equals("kcp") || network.Equals("quic"))
|
|
||||||
{
|
|
||||||
cmbHeaderType.Items.Add("srtp");
|
|
||||||
cmbHeaderType.Items.Add("utp");
|
|
||||||
cmbHeaderType.Items.Add("wechat-video");
|
|
||||||
cmbHeaderType.Items.Add("dtls");
|
|
||||||
cmbHeaderType.Items.Add("wireguard");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
}
|
|
||||||
cmbHeaderType.Text = Global.None;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void btnOK_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
string address = txtAddress.Text;
|
|
||||||
string port = txtPort.Text;
|
|
||||||
string id = txtId.Text;
|
|
||||||
string alterId = txtAlterId.Text;
|
|
||||||
string security = cmbSecurity.Text;
|
|
||||||
string network = cmbNetwork.Text;
|
|
||||||
string remarks = txtRemarks.Text;
|
|
||||||
|
|
||||||
string headerType = cmbHeaderType.Text;
|
|
||||||
string requestHost = txtRequestHost.Text;
|
|
||||||
string path = txtPath.Text;
|
|
||||||
string streamSecurity = cmbStreamSecurity.Text;
|
|
||||||
string allowInsecure = cmbAllowInsecure.Text;
|
|
||||||
|
|
||||||
if (Utils.IsNullOrEmpty(address))
|
|
||||||
{
|
|
||||||
UI.Show(UIRes.I18N("FillServerAddress"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (Utils.IsNullOrEmpty(port) || !Utils.IsNumberic(port))
|
|
||||||
{
|
|
||||||
UI.Show(UIRes.I18N("FillCorrectServerPort"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (Utils.IsNullOrEmpty(id))
|
|
||||||
{
|
|
||||||
UI.Show(UIRes.I18N("FillUUID"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (Utils.IsNullOrEmpty(alterId) || !Utils.IsNumberic(alterId))
|
|
||||||
{
|
|
||||||
UI.Show(UIRes.I18N("FillCorrectAlterId"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
vmessItem.address = address;
|
|
||||||
vmessItem.port = Utils.ToInt(port);
|
|
||||||
vmessItem.id = id;
|
|
||||||
vmessItem.alterId = Utils.ToInt(alterId);
|
|
||||||
vmessItem.security = security;
|
|
||||||
vmessItem.network = network;
|
|
||||||
vmessItem.remarks = remarks;
|
|
||||||
|
|
||||||
vmessItem.headerType = headerType;
|
|
||||||
vmessItem.requestHost = requestHost.Replace(" ", "");
|
|
||||||
vmessItem.path = path.Replace(" ", "");
|
|
||||||
vmessItem.streamSecurity = streamSecurity;
|
|
||||||
vmessItem.allowInsecure = allowInsecure;
|
|
||||||
|
|
||||||
if (ConfigHandler.AddServer(ref config, vmessItem, EditIndex) == 0)
|
|
||||||
{
|
|
||||||
this.DialogResult = DialogResult.OK;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UI.ShowWarning(UIRes.I18N("OperationFailed"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void btnGUID_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
txtId.Text = Utils.GetGUID();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void btnClose_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
this.DialogResult = DialogResult.Cancel;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#region 导入客户端/服务端配置
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 导入客户端
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sender"></param>
|
|
||||||
/// <param name="e"></param>
|
|
||||||
private void MenuItemImportClient_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
MenuItemImport(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 导入服务端
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sender"></param>
|
|
||||||
/// <param name="e"></param>
|
|
||||||
private void MenuItemImportServer_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
MenuItemImport(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void MenuItemImport(int type)
|
|
||||||
{
|
|
||||||
ClearServer();
|
|
||||||
|
|
||||||
OpenFileDialog fileDialog = new OpenFileDialog
|
|
||||||
{
|
|
||||||
Multiselect = false,
|
|
||||||
Filter = "Config|*.json|All|*.*"
|
|
||||||
};
|
|
||||||
if (fileDialog.ShowDialog() != DialogResult.OK)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
string fileName = fileDialog.FileName;
|
|
||||||
if (Utils.IsNullOrEmpty(fileName))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
string msg;
|
|
||||||
VmessItem vmessItem;
|
|
||||||
if (type.Equals(1))
|
|
||||||
{
|
|
||||||
vmessItem = V2rayConfigHandler.ImportFromClientConfig(fileName, out msg);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
vmessItem = V2rayConfigHandler.ImportFromServerConfig(fileName, out msg);
|
|
||||||
}
|
|
||||||
if (vmessItem == null)
|
|
||||||
{
|
|
||||||
UI.ShowWarning(msg);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
txtAddress.Text = vmessItem.address;
|
|
||||||
txtPort.Text = vmessItem.port.ToString();
|
|
||||||
txtId.Text = vmessItem.id;
|
|
||||||
txtAlterId.Text = vmessItem.alterId.ToString();
|
|
||||||
txtRemarks.Text = vmessItem.remarks;
|
|
||||||
cmbNetwork.Text = vmessItem.network;
|
|
||||||
cmbHeaderType.Text = vmessItem.headerType;
|
|
||||||
txtRequestHost.Text = vmessItem.requestHost;
|
|
||||||
txtPath.Text = vmessItem.path;
|
|
||||||
cmbStreamSecurity.Text = vmessItem.streamSecurity;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 从剪贴板导入URL
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sender"></param>
|
|
||||||
/// <param name="e"></param>
|
|
||||||
private void MenuItemImportClipboard_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
ClearServer();
|
|
||||||
|
|
||||||
VmessItem vmessItem = V2rayConfigHandler.ImportFromClipboardConfig(Utils.GetClipboardData(), out string msg);
|
|
||||||
if (vmessItem == null)
|
|
||||||
{
|
|
||||||
UI.ShowWarning(msg);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
txtAddress.Text = vmessItem.address;
|
|
||||||
txtPort.Text = vmessItem.port.ToString();
|
|
||||||
txtId.Text = vmessItem.id;
|
|
||||||
txtAlterId.Text = vmessItem.alterId.ToString();
|
|
||||||
txtRemarks.Text = vmessItem.remarks;
|
|
||||||
cmbNetwork.Text = vmessItem.network;
|
|
||||||
cmbHeaderType.Text = vmessItem.headerType;
|
|
||||||
txtRequestHost.Text = vmessItem.requestHost;
|
|
||||||
txtPath.Text = vmessItem.path;
|
|
||||||
cmbStreamSecurity.Text = vmessItem.streamSecurity;
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
private void cmbStreamSecurity_SelectedIndexChanged(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
string security = cmbStreamSecurity.Text;
|
|
||||||
if (Utils.IsNullOrEmpty(security))
|
|
||||||
{
|
|
||||||
panTlsMore.Hide();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
panTlsMore.Show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,816 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<root>
|
|
||||||
<!--
|
|
||||||
Microsoft ResX Schema
|
|
||||||
|
|
||||||
Version 2.0
|
|
||||||
|
|
||||||
The primary goals of this format is to allow a simple XML format
|
|
||||||
that is mostly human readable. The generation and parsing of the
|
|
||||||
various data types are done through the TypeConverter classes
|
|
||||||
associated with the data types.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
... ado.net/XML headers & schema ...
|
|
||||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
|
||||||
<resheader name="version">2.0</resheader>
|
|
||||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
|
||||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
|
||||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
|
||||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
|
||||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
|
||||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
|
||||||
</data>
|
|
||||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
|
||||||
<comment>This is a comment</comment>
|
|
||||||
</data>
|
|
||||||
|
|
||||||
There are any number of "resheader" rows that contain simple
|
|
||||||
name/value pairs.
|
|
||||||
|
|
||||||
Each data row contains a name, and value. The row also contains a
|
|
||||||
type or mimetype. Type corresponds to a .NET class that support
|
|
||||||
text/value conversion through the TypeConverter architecture.
|
|
||||||
Classes that don't support this are serialized and stored with the
|
|
||||||
mimetype set.
|
|
||||||
|
|
||||||
The mimetype is used for serialized objects, and tells the
|
|
||||||
ResXResourceReader how to depersist the object. This is currently not
|
|
||||||
extensible. For a given mimetype the value must be set accordingly:
|
|
||||||
|
|
||||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
|
||||||
that the ResXResourceWriter will generate, however the reader can
|
|
||||||
read any of the formats listed below.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.binary.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.soap.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
|
||||||
value : The object must be serialized into a byte array
|
|
||||||
: using a System.ComponentModel.TypeConverter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
-->
|
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
|
||||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:choice maxOccurs="unbounded">
|
|
||||||
<xsd:element name="metadata">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="assembly">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:attribute name="alias" type="xsd:string" />
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="data">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="resheader">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:choice>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:schema>
|
|
||||||
<resheader name="resmimetype">
|
|
||||||
<value>text/microsoft-resx</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="version">
|
|
||||||
<value>2.0</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="reader">
|
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="writer">
|
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
|
||||||
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
|
||||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
|
||||||
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
|
|
||||||
<value>6, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>729, 569</value>
|
|
||||||
</data>
|
|
||||||
<data name="$this.Localizable" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="$this.Text" xml:space="preserve">
|
|
||||||
<value>Edit or add a [VMess] server</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnClose.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>396, 17</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnClose.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>75, 23</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnClose.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>4</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnClose.Text" xml:space="preserve">
|
|
||||||
<value>&Cancel</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnGUID.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>411, 83</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnGUID.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>75, 23</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnGUID.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>23</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnGUID.Text" xml:space="preserve">
|
|
||||||
<value>&Generate</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnOK.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>303, 17</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnOK.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>75, 23</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnOK.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>5</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnOK.Text" xml:space="preserve">
|
|
||||||
<value>&OK</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbAllowInsecure.Items" xml:space="preserve">
|
|
||||||
<value />
|
|
||||||
</data>
|
|
||||||
<data name="cmbAllowInsecure.Items1" xml:space="preserve">
|
|
||||||
<value>true</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbAllowInsecure.Items2" xml:space="preserve">
|
|
||||||
<value>false</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbAllowInsecure.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>107, 7</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbAllowInsecure.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>91, 20</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbAllowInsecure.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>30</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbHeaderType.Items" xml:space="preserve">
|
|
||||||
<value>none</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbHeaderType.Items1" xml:space="preserve">
|
|
||||||
<value>http</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbHeaderType.Items2" xml:space="preserve">
|
|
||||||
<value>srtp</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbHeaderType.Items3" xml:space="preserve">
|
|
||||||
<value>utp</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbHeaderType.Items4" xml:space="preserve">
|
|
||||||
<value>wechat-video</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbHeaderType.Items5" xml:space="preserve">
|
|
||||||
<value>dtls</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbHeaderType.Items6" xml:space="preserve">
|
|
||||||
<value>wireguard</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbHeaderType.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>124, 30</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbHeaderType.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>143, 20</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbHeaderType.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>18</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbNetwork.Items" xml:space="preserve">
|
|
||||||
<value>tcp</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbNetwork.Items1" xml:space="preserve">
|
|
||||||
<value>kcp</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbNetwork.Items2" xml:space="preserve">
|
|
||||||
<value>ws</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbNetwork.Items3" xml:space="preserve">
|
|
||||||
<value>h2</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbNetwork.Items4" xml:space="preserve">
|
|
||||||
<value>quic</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbNetwork.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>195, 171</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbNetwork.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>143, 20</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbNetwork.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>12</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbSecurity.Items" xml:space="preserve">
|
|
||||||
<value>aes-128-gcm</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbSecurity.Items1" xml:space="preserve">
|
|
||||||
<value>chacha20-poly1305</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbSecurity.Items2" xml:space="preserve">
|
|
||||||
<value>auto</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbSecurity.Items3" xml:space="preserve">
|
|
||||||
<value>none</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbSecurity.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>195, 143</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbSecurity.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>143, 20</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbSecurity.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>6</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbStreamSecurity.Items" xml:space="preserve">
|
|
||||||
<value />
|
|
||||||
</data>
|
|
||||||
<data name="cmbStreamSecurity.Items1" xml:space="preserve">
|
|
||||||
<value>tls</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbStreamSecurity.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>124, 197</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbStreamSecurity.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>143, 20</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbStreamSecurity.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>21</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
|
||||||
<value>Fill</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox1.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>0, 35</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox1.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>729, 474</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox1.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>3</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox1.Text" xml:space="preserve">
|
|
||||||
<value>Server</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox2.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
|
||||||
<value>Bottom</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox2.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>3, 237</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox2.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>723, 234</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox2.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>21</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox2.Text" xml:space="preserve">
|
|
||||||
<value>Keep the default value if it is not clear</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>12, 31</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>47, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>0</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.Text" xml:space="preserve">
|
|
||||||
<value>Address</value>
|
|
||||||
</data>
|
|
||||||
<data name="label10.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label10.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>9, 62</value>
|
|
||||||
</data>
|
|
||||||
<data name="label10.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>143, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label10.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>17</value>
|
|
||||||
</data>
|
|
||||||
<data name="label10.Text" xml:space="preserve">
|
|
||||||
<value>Camouflage domain(host)</value>
|
|
||||||
</data>
|
|
||||||
<data name="label11.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label11.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>9, 34</value>
|
|
||||||
</data>
|
|
||||||
<data name="label11.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>95, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label11.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>19</value>
|
|
||||||
</data>
|
|
||||||
<data name="label11.Text" xml:space="preserve">
|
|
||||||
<value>Camouflage type</value>
|
|
||||||
</data>
|
|
||||||
<data name="label12.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label12.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>282, 34</value>
|
|
||||||
</data>
|
|
||||||
<data name="label12.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>299, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label12.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>20</value>
|
|
||||||
</data>
|
|
||||||
<data name="label12.Text" xml:space="preserve">
|
|
||||||
<value>*tcp or kcp or QUIC camouflage type, default none</value>
|
|
||||||
</data>
|
|
||||||
<data name="label13.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label13.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>285, 203</value>
|
|
||||||
</data>
|
|
||||||
<data name="label13.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>113, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label13.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>22</value>
|
|
||||||
</data>
|
|
||||||
<data name="label13.Text" xml:space="preserve">
|
|
||||||
<value>* Fill in manually</value>
|
|
||||||
</data>
|
|
||||||
<data name="label14.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label14.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>469, 53</value>
|
|
||||||
</data>
|
|
||||||
<data name="label14.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>215, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label14.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>23</value>
|
|
||||||
</data>
|
|
||||||
<data name="label14.Text" xml:space="preserve">
|
|
||||||
<value>1)http host Separated by commas (,)</value>
|
|
||||||
</data>
|
|
||||||
<data name="label15.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label15.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>9, 201</value>
|
|
||||||
</data>
|
|
||||||
<data name="label15.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>23, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label15.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>22</value>
|
|
||||||
</data>
|
|
||||||
<data name="label15.Text" xml:space="preserve">
|
|
||||||
<value>TLS</value>
|
|
||||||
</data>
|
|
||||||
<data name="label16.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label16.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>526, 130</value>
|
|
||||||
</data>
|
|
||||||
<data name="label16.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>59, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label16.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>24</value>
|
|
||||||
</data>
|
|
||||||
<data name="label16.Text" xml:space="preserve">
|
|
||||||
<value>1)ws path</value>
|
|
||||||
</data>
|
|
||||||
<data name="label17.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label17.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>469, 68</value>
|
|
||||||
</data>
|
|
||||||
<data name="label17.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>59, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label17.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>25</value>
|
|
||||||
</data>
|
|
||||||
<data name="label17.Text" xml:space="preserve">
|
|
||||||
<value>2)ws host</value>
|
|
||||||
</data>
|
|
||||||
<data name="label18.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label18.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>526, 147</value>
|
|
||||||
</data>
|
|
||||||
<data name="label18.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>59, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label18.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>26</value>
|
|
||||||
</data>
|
|
||||||
<data name="label18.Text" xml:space="preserve">
|
|
||||||
<value>2)h2 path</value>
|
|
||||||
</data>
|
|
||||||
<data name="label19.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label19.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>9, 125</value>
|
|
||||||
</data>
|
|
||||||
<data name="label19.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>29, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label19.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>27</value>
|
|
||||||
</data>
|
|
||||||
<data name="label19.Text" xml:space="preserve">
|
|
||||||
<value>Path</value>
|
|
||||||
</data>
|
|
||||||
<data name="label2.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label2.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>12, 60</value>
|
|
||||||
</data>
|
|
||||||
<data name="label2.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>29, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label2.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>2</value>
|
|
||||||
</data>
|
|
||||||
<data name="label2.Text" xml:space="preserve">
|
|
||||||
<value>Port</value>
|
|
||||||
</data>
|
|
||||||
<data name="label20.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label20.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>469, 83</value>
|
|
||||||
</data>
|
|
||||||
<data name="label20.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>203, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label20.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>29</value>
|
|
||||||
</data>
|
|
||||||
<data name="label20.Text" xml:space="preserve">
|
|
||||||
<value>3)h2 host Separated by commas (,)</value>
|
|
||||||
</data>
|
|
||||||
<data name="label21.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label21.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>12, 11</value>
|
|
||||||
</data>
|
|
||||||
<data name="label21.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>83, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label21.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>31</value>
|
|
||||||
</data>
|
|
||||||
<data name="label21.Text" xml:space="preserve">
|
|
||||||
<value>allowInsecure</value>
|
|
||||||
</data>
|
|
||||||
<data name="label22.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label22.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>205, 11</value>
|
|
||||||
</data>
|
|
||||||
<data name="label22.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>113, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label22.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>32</value>
|
|
||||||
</data>
|
|
||||||
<data name="label22.Text" xml:space="preserve">
|
|
||||||
<value>Default value false</value>
|
|
||||||
</data>
|
|
||||||
<data name="label23.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label23.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
|
||||||
<value>NoControl</value>
|
|
||||||
</data>
|
|
||||||
<data name="label23.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>470, 99</value>
|
|
||||||
</data>
|
|
||||||
<data name="label23.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>89, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label23.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>34</value>
|
|
||||||
</data>
|
|
||||||
<data name="label23.Text" xml:space="preserve">
|
|
||||||
<value>4)QUIC securty</value>
|
|
||||||
</data>
|
|
||||||
<data name="label24.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label24.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
|
||||||
<value>NoControl</value>
|
|
||||||
</data>
|
|
||||||
<data name="label24.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>526, 165</value>
|
|
||||||
</data>
|
|
||||||
<data name="label24.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>65, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label24.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>35</value>
|
|
||||||
</data>
|
|
||||||
<data name="label24.Text" xml:space="preserve">
|
|
||||||
<value>3)QUIC key</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>12, 89</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>53, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>4</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.Text" xml:space="preserve">
|
|
||||||
<value>UUID(id)</value>
|
|
||||||
</data>
|
|
||||||
<data name="label4.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label4.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>12, 118</value>
|
|
||||||
</data>
|
|
||||||
<data name="label4.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>47, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label4.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>6</value>
|
|
||||||
</data>
|
|
||||||
<data name="label4.Text" xml:space="preserve">
|
|
||||||
<value>AlterId</value>
|
|
||||||
</data>
|
|
||||||
<data name="label5.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label5.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>12, 147</value>
|
|
||||||
</data>
|
|
||||||
<data name="label5.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>173, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label5.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>8</value>
|
|
||||||
</data>
|
|
||||||
<data name="label5.Text" xml:space="preserve">
|
|
||||||
<value>Encryption method (security)</value>
|
|
||||||
</data>
|
|
||||||
<data name="label6.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label6.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>12, 203</value>
|
|
||||||
</data>
|
|
||||||
<data name="label6.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>95, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label6.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>10</value>
|
|
||||||
</data>
|
|
||||||
<data name="label6.Text" xml:space="preserve">
|
|
||||||
<value>Alias (remarks)</value>
|
|
||||||
</data>
|
|
||||||
<data name="label7.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label7.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>12, 175</value>
|
|
||||||
</data>
|
|
||||||
<data name="label7.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>167, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label7.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>13</value>
|
|
||||||
</data>
|
|
||||||
<data name="label7.Text" xml:space="preserve">
|
|
||||||
<value>Transport protocol(network)</value>
|
|
||||||
</data>
|
|
||||||
<data name="label8.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label8.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>353, 147</value>
|
|
||||||
</data>
|
|
||||||
<data name="label8.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>119, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label8.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>14</value>
|
|
||||||
</data>
|
|
||||||
<data name="label8.Text" xml:space="preserve">
|
|
||||||
<value>*Recommended (auto)</value>
|
|
||||||
</data>
|
|
||||||
<data name="label9.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label9.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>353, 175</value>
|
|
||||||
</data>
|
|
||||||
<data name="label9.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>113, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label9.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>15</value>
|
|
||||||
</data>
|
|
||||||
<data name="label9.Text" xml:space="preserve">
|
|
||||||
<value>*Default value tcp</value>
|
|
||||||
</data>
|
|
||||||
<data name="MenuItem1.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>162, 21</value>
|
|
||||||
</data>
|
|
||||||
<data name="MenuItem1.Text" xml:space="preserve">
|
|
||||||
<value>Import configuration file</value>
|
|
||||||
</data>
|
|
||||||
<data name="MenuItemImportClient.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>237, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="MenuItemImportClient.Text" xml:space="preserve">
|
|
||||||
<value>Import client configuration</value>
|
|
||||||
</data>
|
|
||||||
<data name="MenuItemImportClipboard.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>237, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="MenuItemImportClipboard.Text" xml:space="preserve">
|
|
||||||
<value>Import URL from clipboard</value>
|
|
||||||
</data>
|
|
||||||
<data name="MenuItemImportServer.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>237, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="MenuItemImportServer.Text" xml:space="preserve">
|
|
||||||
<value>Import server configuration</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuServer.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>0, 0</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuServer.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>729, 25</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuServer.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>8</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuServer.TrayLocation" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>17, 17</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel1.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
|
||||||
<value>Top</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel1.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>0, 25</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel1.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>729, 10</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel1.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>6</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel2.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
|
||||||
<value>Bottom</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel2.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>0, 509</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel2.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>729, 60</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel2.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>7</value>
|
|
||||||
</data>
|
|
||||||
<data name="panTlsMore.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>284, 189</value>
|
|
||||||
</data>
|
|
||||||
<data name="panTlsMore.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>338, 35</value>
|
|
||||||
</data>
|
|
||||||
<data name="panTlsMore.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>33</value>
|
|
||||||
</data>
|
|
||||||
<data name="toolStripSeparator1.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>234, 6</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtAddress.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>127, 27</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtAddress.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>359, 21</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtAddress.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>1</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtAlterId.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>127, 114</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtAlterId.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>143, 21</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtAlterId.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>7</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtId.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>127, 85</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtId.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>278, 21</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtId.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>5</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtPath.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>124, 125</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtPath.Multiline" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtPath.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>396, 54</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtPath.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>28</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtPort.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>127, 56</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtPort.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>143, 21</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtPort.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>3</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtRemarks.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>127, 199</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtRemarks.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>143, 21</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtRemarks.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>11</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtRequestHost.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>158, 58</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtRequestHost.Multiline" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtRequestHost.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>300, 53</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtRequestHost.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>16</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
|
||||||
@@ -1,301 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<root>
|
|
||||||
<!--
|
|
||||||
Microsoft ResX Schema
|
|
||||||
|
|
||||||
Version 2.0
|
|
||||||
|
|
||||||
The primary goals of this format is to allow a simple XML format
|
|
||||||
that is mostly human readable. The generation and parsing of the
|
|
||||||
various data types are done through the TypeConverter classes
|
|
||||||
associated with the data types.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
... ado.net/XML headers & schema ...
|
|
||||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
|
||||||
<resheader name="version">2.0</resheader>
|
|
||||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
|
||||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
|
||||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
|
||||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
|
||||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
|
||||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
|
||||||
</data>
|
|
||||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
|
||||||
<comment>This is a comment</comment>
|
|
||||||
</data>
|
|
||||||
|
|
||||||
There are any number of "resheader" rows that contain simple
|
|
||||||
name/value pairs.
|
|
||||||
|
|
||||||
Each data row contains a name, and value. The row also contains a
|
|
||||||
type or mimetype. Type corresponds to a .NET class that support
|
|
||||||
text/value conversion through the TypeConverter architecture.
|
|
||||||
Classes that don't support this are serialized and stored with the
|
|
||||||
mimetype set.
|
|
||||||
|
|
||||||
The mimetype is used for serialized objects, and tells the
|
|
||||||
ResXResourceReader how to depersist the object. This is currently not
|
|
||||||
extensible. For a given mimetype the value must be set accordingly:
|
|
||||||
|
|
||||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
|
||||||
that the ResXResourceWriter will generate, however the reader can
|
|
||||||
read any of the formats listed below.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.binary.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.soap.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
|
||||||
value : The object must be serialized into a byte array
|
|
||||||
: using a System.ComponentModel.TypeConverter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
-->
|
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
|
||||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:choice maxOccurs="unbounded">
|
|
||||||
<xsd:element name="metadata">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="assembly">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:attribute name="alias" type="xsd:string" />
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="data">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="resheader">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:choice>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:schema>
|
|
||||||
<resheader name="resmimetype">
|
|
||||||
<value>text/microsoft-resx</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="version">
|
|
||||||
<value>2.0</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="reader">
|
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="writer">
|
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
|
||||||
<data name="$this.Text" xml:space="preserve">
|
|
||||||
<value>编辑或添加[VMess]服务器</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnClose.Text" xml:space="preserve">
|
|
||||||
<value>取消(&C)</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnGUID.Text" xml:space="preserve">
|
|
||||||
<value>生成(&G)</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnOK.Text" xml:space="preserve">
|
|
||||||
<value>确定(&O)</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbNetwork.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>127, 171</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbNetwork.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>211, 20</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbSecurity.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>127, 143</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbSecurity.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>211, 20</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox1.Text" xml:space="preserve">
|
|
||||||
<value>服务器</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox2.Text" xml:space="preserve">
|
|
||||||
<value>不清楚则保持默认值</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>83, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.Text" xml:space="preserve">
|
|
||||||
<value>地址(address)</value>
|
|
||||||
</data>
|
|
||||||
<data name="label10.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>89, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label10.Text" xml:space="preserve">
|
|
||||||
<value>伪装域名(host)</value>
|
|
||||||
</data>
|
|
||||||
<data name="label11.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>89, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label11.Text" xml:space="preserve">
|
|
||||||
<value>伪装类型(type)</value>
|
|
||||||
</data>
|
|
||||||
<data name="label12.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>197, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label12.Text" xml:space="preserve">
|
|
||||||
<value>*tcp或kcp或QUIC伪装类型,默认none</value>
|
|
||||||
</data>
|
|
||||||
<data name="label13.Text" xml:space="preserve">
|
|
||||||
<value>*手填,方便识别管理</value>
|
|
||||||
</data>
|
|
||||||
<data name="label14.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>161, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label14.Text" xml:space="preserve">
|
|
||||||
<value>1)http host中间逗号(,)隔开</value>
|
|
||||||
</data>
|
|
||||||
<data name="label15.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>77, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label15.Text" xml:space="preserve">
|
|
||||||
<value>底层传输安全</value>
|
|
||||||
</data>
|
|
||||||
<data name="label19.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>65, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label19.Text" xml:space="preserve">
|
|
||||||
<value>路径(path)</value>
|
|
||||||
</data>
|
|
||||||
<data name="label2.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>65, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label2.Text" xml:space="preserve">
|
|
||||||
<value>端口(port)</value>
|
|
||||||
</data>
|
|
||||||
<data name="label20.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>149, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label20.Text" xml:space="preserve">
|
|
||||||
<value>3)h2 host中间逗号(,)隔开</value>
|
|
||||||
</data>
|
|
||||||
<data name="label22.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>53, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label22.Text" xml:space="preserve">
|
|
||||||
<value>默认false</value>
|
|
||||||
</data>
|
|
||||||
<data name="label23.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>95, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label23.Text" xml:space="preserve">
|
|
||||||
<value>4)QUIC 加密方式</value>
|
|
||||||
</data>
|
|
||||||
<data name="label24.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>95, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label24.Text" xml:space="preserve">
|
|
||||||
<value>3)QUIC 加密密钥</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>65, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.Text" xml:space="preserve">
|
|
||||||
<value>用户ID(id)</value>
|
|
||||||
</data>
|
|
||||||
<data name="label4.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>95, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label4.Text" xml:space="preserve">
|
|
||||||
<value>额外ID(alterId)</value>
|
|
||||||
</data>
|
|
||||||
<data name="label5.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>113, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label5.Text" xml:space="preserve">
|
|
||||||
<value>加密方式(security)</value>
|
|
||||||
</data>
|
|
||||||
<data name="label6.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>83, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label6.Text" xml:space="preserve">
|
|
||||||
<value>别名(remarks)</value>
|
|
||||||
</data>
|
|
||||||
<data name="label7.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>107, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label7.Text" xml:space="preserve">
|
|
||||||
<value>传输协议(network)</value>
|
|
||||||
</data>
|
|
||||||
<data name="label8.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>113, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label8.Text" xml:space="preserve">
|
|
||||||
<value>*随便选,建议(auto)</value>
|
|
||||||
</data>
|
|
||||||
<data name="label9.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>143, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label9.Text" xml:space="preserve">
|
|
||||||
<value>*默认tcp,选错会无法连接</value>
|
|
||||||
</data>
|
|
||||||
<data name="MenuItem1.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>92, 21</value>
|
|
||||||
</data>
|
|
||||||
<data name="MenuItem1.Text" xml:space="preserve">
|
|
||||||
<value>导入配置文件</value>
|
|
||||||
</data>
|
|
||||||
<data name="MenuItemImportClient.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>171, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="MenuItemImportClient.Text" xml:space="preserve">
|
|
||||||
<value>导入客户端配置</value>
|
|
||||||
</data>
|
|
||||||
<data name="MenuItemImportClipboard.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>171, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="MenuItemImportClipboard.Text" xml:space="preserve">
|
|
||||||
<value>从剪贴板导入URL</value>
|
|
||||||
</data>
|
|
||||||
<data name="MenuItemImportServer.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>171, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="MenuItemImportServer.Text" xml:space="preserve">
|
|
||||||
<value>导入服务端配置</value>
|
|
||||||
</data>
|
|
||||||
<data name="toolStripSeparator1.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>168, 6</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtRequestHost.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>124, 58</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtRequestHost.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>334, 51</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
|
||||||
51
v2rayN/v2rayN/Forms/BaseForm.Designer.cs
generated
51
v2rayN/v2rayN/Forms/BaseForm.Designer.cs
generated
@@ -1,51 +0,0 @@
|
|||||||
namespace v2rayN.Forms
|
|
||||||
{
|
|
||||||
partial class BaseForm
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Required designer variable.
|
|
||||||
/// </summary>
|
|
||||||
private System.ComponentModel.IContainer components = null;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Clean up any resources being used.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
|
||||||
protected override void Dispose(bool disposing)
|
|
||||||
{
|
|
||||||
if (disposing && (components != null))
|
|
||||||
{
|
|
||||||
components.Dispose();
|
|
||||||
}
|
|
||||||
base.Dispose(disposing);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Windows Form Designer generated code
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Required method for Designer support - do not modify
|
|
||||||
/// the contents of this method with the code editor.
|
|
||||||
/// </summary>
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(BaseForm));
|
|
||||||
this.SuspendLayout();
|
|
||||||
//
|
|
||||||
// BaseForm
|
|
||||||
//
|
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
|
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
|
||||||
this.ClientSize = new System.Drawing.Size(292, 273);
|
|
||||||
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
|
|
||||||
this.MaximizeBox = false;
|
|
||||||
this.MinimizeBox = false;
|
|
||||||
this.Name = "BaseForm";
|
|
||||||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
|
|
||||||
this.Text = "BaseForm";
|
|
||||||
this.ResumeLayout(false);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
using v2rayN.Mode;
|
|
||||||
|
|
||||||
namespace v2rayN.Forms
|
|
||||||
{
|
|
||||||
public partial class BaseForm : Form
|
|
||||||
{
|
|
||||||
protected static Config config;
|
|
||||||
protected static System.Drawing.Icon icon;
|
|
||||||
|
|
||||||
public BaseForm()
|
|
||||||
{
|
|
||||||
InitializeComponent();
|
|
||||||
LoadCustomIcon();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void LoadCustomIcon()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (icon == null)
|
|
||||||
{
|
|
||||||
string file = Utils.GetPath(Global.CustomIconName);
|
|
||||||
if (!System.IO.File.Exists(file))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
icon = new System.Drawing.Icon(file);
|
|
||||||
}
|
|
||||||
this.Icon = icon;
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
Utils.SaveLog($"Loading custom icon failed: {e.Message}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
940
v2rayN/v2rayN/Forms/MainForm.Designer.cs
generated
940
v2rayN/v2rayN/Forms/MainForm.Designer.cs
generated
@@ -1,940 +0,0 @@
|
|||||||
namespace v2rayN.Forms
|
|
||||||
{
|
|
||||||
partial class MainForm
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 必需的设计器变量。
|
|
||||||
/// </summary>
|
|
||||||
private System.ComponentModel.IContainer components = null;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 清理所有正在使用的资源。
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
|
|
||||||
protected override void Dispose(bool disposing)
|
|
||||||
{
|
|
||||||
if (disposing && (components != null))
|
|
||||||
{
|
|
||||||
components.Dispose();
|
|
||||||
}
|
|
||||||
base.Dispose(disposing);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Windows 窗体设计器生成的代码
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 设计器支持所需的方法 - 不要
|
|
||||||
/// 使用代码编辑器修改此方法的内容。
|
|
||||||
/// </summary>
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
this.components = new System.ComponentModel.Container();
|
|
||||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
|
|
||||||
this.scMain = new System.Windows.Forms.SplitContainer();
|
|
||||||
this.lvServers = new v2rayN.Base.ListViewFlickerFree();
|
|
||||||
this.cmsLv = new System.Windows.Forms.ContextMenuStrip(this.components);
|
|
||||||
this.menuAddVmessServer = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuAddShadowsocksServer = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuAddSocksServer = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuAddCustomServer = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuAddServers = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuScanScreen = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
|
|
||||||
this.menuRemoveServer = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuRemoveDuplicateServer = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuCopyServer = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuSetDefaultServer = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator();
|
|
||||||
this.menuMoveTop = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuMoveUp = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuMoveDown = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuMoveBottom = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuSelectAll = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator();
|
|
||||||
this.menuPingServer = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuTcpingServer = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuRealPingServer = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuSpeedServer = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.tsbTestMe = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator();
|
|
||||||
this.menuExport2ClientConfig = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuExport2ServerConfig = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuExport2ShareUrl = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuExport2SubContent = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.tsbServer = new System.Windows.Forms.ToolStripDropDownButton();
|
|
||||||
this.qrCodeControl = new v2rayN.Forms.QRCodeControl();
|
|
||||||
this.notifyMain = new System.Windows.Forms.NotifyIcon(this.components);
|
|
||||||
this.cmsMain = new System.Windows.Forms.ContextMenuStrip(this.components);
|
|
||||||
this.menuSysAgentMode = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuNotEnabledHttp = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuGlobal = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuGlobalPAC = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuKeep = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuKeepPAC = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuKeepNothing = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuKeepPACNothing = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuServers = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuAddServers2 = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuScanScreen2 = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuCopyPACUrl = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.menuUpdateSubscriptions = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
|
|
||||||
this.menuExit = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.bgwScan = new System.ComponentModel.BackgroundWorker();
|
|
||||||
this.groupBox1 = new System.Windows.Forms.GroupBox();
|
|
||||||
this.groupBox2 = new System.Windows.Forms.GroupBox();
|
|
||||||
this.txtMsgBox = new System.Windows.Forms.TextBox();
|
|
||||||
this.ssMain = new System.Windows.Forms.StatusStrip();
|
|
||||||
this.toolSslSocksPortLab = new System.Windows.Forms.ToolStripStatusLabel();
|
|
||||||
this.toolSslSocksPort = new System.Windows.Forms.ToolStripStatusLabel();
|
|
||||||
this.toolSslBlank1 = new System.Windows.Forms.ToolStripStatusLabel();
|
|
||||||
this.toolSslHttpPortLab = new System.Windows.Forms.ToolStripStatusLabel();
|
|
||||||
this.toolSslHttpPort = new System.Windows.Forms.ToolStripStatusLabel();
|
|
||||||
this.toolSslBlank2 = new System.Windows.Forms.ToolStripStatusLabel();
|
|
||||||
this.toolSslPacPortLab = new System.Windows.Forms.ToolStripStatusLabel();
|
|
||||||
this.toolSslPacPort = new System.Windows.Forms.ToolStripStatusLabel();
|
|
||||||
this.toolSslBlank3 = new System.Windows.Forms.ToolStripStatusLabel();
|
|
||||||
this.toolSslServerSpeed = new System.Windows.Forms.ToolStripStatusLabel();
|
|
||||||
this.toolSslBlank4 = new System.Windows.Forms.ToolStripStatusLabel();
|
|
||||||
this.panel1 = new System.Windows.Forms.Panel();
|
|
||||||
this.tsMain = new System.Windows.Forms.ToolStrip();
|
|
||||||
this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
|
|
||||||
this.tsbSub = new System.Windows.Forms.ToolStripDropDownButton();
|
|
||||||
this.tsbSubSetting = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.tsbSubUpdate = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.tsbQRCodeSwitch = new System.Windows.Forms.ToolStripButton();
|
|
||||||
this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator();
|
|
||||||
this.tsbOptionSetting = new System.Windows.Forms.ToolStripButton();
|
|
||||||
this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();
|
|
||||||
this.tsbReload = new System.Windows.Forms.ToolStripButton();
|
|
||||||
this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator();
|
|
||||||
this.tsbCheckUpdate = new System.Windows.Forms.ToolStripDropDownButton();
|
|
||||||
this.tsbCheckUpdateN = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.tsbCheckUpdateCore = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.tsbCheckUpdatePACList = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator();
|
|
||||||
this.tsbCheckClearPACList = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator();
|
|
||||||
this.tsbHelp = new System.Windows.Forms.ToolStripDropDownButton();
|
|
||||||
this.tsbAbout = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.tsbV2rayWebsite = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator();
|
|
||||||
this.tsbLanguageDef = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.tsbLanguageZhHans = new System.Windows.Forms.ToolStripMenuItem();
|
|
||||||
this.tsbPromotion = new System.Windows.Forms.ToolStripButton();
|
|
||||||
this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator();
|
|
||||||
this.tsbClose = new System.Windows.Forms.ToolStripButton();
|
|
||||||
((System.ComponentModel.ISupportInitialize)(this.scMain)).BeginInit();
|
|
||||||
this.scMain.Panel1.SuspendLayout();
|
|
||||||
this.scMain.Panel2.SuspendLayout();
|
|
||||||
this.scMain.SuspendLayout();
|
|
||||||
this.cmsLv.SuspendLayout();
|
|
||||||
this.cmsMain.SuspendLayout();
|
|
||||||
this.groupBox1.SuspendLayout();
|
|
||||||
this.groupBox2.SuspendLayout();
|
|
||||||
this.ssMain.SuspendLayout();
|
|
||||||
this.tsMain.SuspendLayout();
|
|
||||||
this.SuspendLayout();
|
|
||||||
//
|
|
||||||
// scMain
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.scMain, "scMain");
|
|
||||||
this.scMain.FixedPanel = System.Windows.Forms.FixedPanel.Panel2;
|
|
||||||
this.scMain.Name = "scMain";
|
|
||||||
//
|
|
||||||
// scMain.Panel1
|
|
||||||
//
|
|
||||||
this.scMain.Panel1.Controls.Add(this.lvServers);
|
|
||||||
//
|
|
||||||
// scMain.Panel2
|
|
||||||
//
|
|
||||||
this.scMain.Panel2.Controls.Add(this.qrCodeControl);
|
|
||||||
this.scMain.TabStop = false;
|
|
||||||
//
|
|
||||||
// lvServers
|
|
||||||
//
|
|
||||||
this.lvServers.ContextMenuStrip = this.cmsLv;
|
|
||||||
resources.ApplyResources(this.lvServers, "lvServers");
|
|
||||||
this.lvServers.FullRowSelect = true;
|
|
||||||
this.lvServers.GridLines = true;
|
|
||||||
this.lvServers.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
|
|
||||||
this.lvServers.HideSelection = false;
|
|
||||||
this.lvServers.Items.AddRange(new System.Windows.Forms.ListViewItem[] {
|
|
||||||
((System.Windows.Forms.ListViewItem)(resources.GetObject("lvServers.Items")))});
|
|
||||||
this.lvServers.MultiSelect = false;
|
|
||||||
this.lvServers.Name = "lvServers";
|
|
||||||
this.lvServers.UseCompatibleStateImageBehavior = false;
|
|
||||||
this.lvServers.View = System.Windows.Forms.View.Details;
|
|
||||||
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);
|
|
||||||
this.lvServers.KeyDown += new System.Windows.Forms.KeyEventHandler(this.lvServers_KeyDown);
|
|
||||||
//
|
|
||||||
// cmsLv
|
|
||||||
//
|
|
||||||
this.cmsLv.ImageScalingSize = new System.Drawing.Size(20, 20);
|
|
||||||
this.cmsLv.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
|
||||||
this.menuAddVmessServer,
|
|
||||||
this.menuAddShadowsocksServer,
|
|
||||||
this.menuAddSocksServer,
|
|
||||||
this.menuAddCustomServer,
|
|
||||||
this.menuAddServers,
|
|
||||||
this.menuScanScreen,
|
|
||||||
this.toolStripSeparator1,
|
|
||||||
this.menuRemoveServer,
|
|
||||||
this.menuRemoveDuplicateServer,
|
|
||||||
this.menuCopyServer,
|
|
||||||
this.menuSetDefaultServer,
|
|
||||||
this.toolStripSeparator3,
|
|
||||||
this.menuMoveTop,
|
|
||||||
this.menuMoveUp,
|
|
||||||
this.menuMoveDown,
|
|
||||||
this.menuMoveBottom,
|
|
||||||
this.menuSelectAll,
|
|
||||||
this.toolStripSeparator9,
|
|
||||||
this.menuPingServer,
|
|
||||||
this.menuTcpingServer,
|
|
||||||
this.menuRealPingServer,
|
|
||||||
this.menuSpeedServer,
|
|
||||||
this.tsbTestMe,
|
|
||||||
this.toolStripSeparator6,
|
|
||||||
this.menuExport2ClientConfig,
|
|
||||||
this.menuExport2ServerConfig,
|
|
||||||
this.menuExport2ShareUrl,
|
|
||||||
this.menuExport2SubContent});
|
|
||||||
this.cmsLv.Name = "cmsLv";
|
|
||||||
this.cmsLv.OwnerItem = this.tsbServer;
|
|
||||||
resources.ApplyResources(this.cmsLv, "cmsLv");
|
|
||||||
//
|
|
||||||
// menuAddVmessServer
|
|
||||||
//
|
|
||||||
this.menuAddVmessServer.Name = "menuAddVmessServer";
|
|
||||||
resources.ApplyResources(this.menuAddVmessServer, "menuAddVmessServer");
|
|
||||||
this.menuAddVmessServer.Click += new System.EventHandler(this.menuAddVmessServer_Click);
|
|
||||||
//
|
|
||||||
// menuAddShadowsocksServer
|
|
||||||
//
|
|
||||||
this.menuAddShadowsocksServer.Name = "menuAddShadowsocksServer";
|
|
||||||
resources.ApplyResources(this.menuAddShadowsocksServer, "menuAddShadowsocksServer");
|
|
||||||
this.menuAddShadowsocksServer.Click += new System.EventHandler(this.menuAddShadowsocksServer_Click);
|
|
||||||
//
|
|
||||||
// menuAddSocksServer
|
|
||||||
//
|
|
||||||
this.menuAddSocksServer.Name = "menuAddSocksServer";
|
|
||||||
resources.ApplyResources(this.menuAddSocksServer, "menuAddSocksServer");
|
|
||||||
this.menuAddSocksServer.Click += new System.EventHandler(this.menuAddSocksServer_Click);
|
|
||||||
//
|
|
||||||
// menuAddCustomServer
|
|
||||||
//
|
|
||||||
this.menuAddCustomServer.Name = "menuAddCustomServer";
|
|
||||||
resources.ApplyResources(this.menuAddCustomServer, "menuAddCustomServer");
|
|
||||||
this.menuAddCustomServer.Click += new System.EventHandler(this.menuAddCustomServer_Click);
|
|
||||||
//
|
|
||||||
// menuAddServers
|
|
||||||
//
|
|
||||||
this.menuAddServers.Name = "menuAddServers";
|
|
||||||
resources.ApplyResources(this.menuAddServers, "menuAddServers");
|
|
||||||
this.menuAddServers.Click += new System.EventHandler(this.menuAddServers_Click);
|
|
||||||
//
|
|
||||||
// menuScanScreen
|
|
||||||
//
|
|
||||||
this.menuScanScreen.Name = "menuScanScreen";
|
|
||||||
resources.ApplyResources(this.menuScanScreen, "menuScanScreen");
|
|
||||||
this.menuScanScreen.Click += new System.EventHandler(this.menuScanScreen_Click);
|
|
||||||
//
|
|
||||||
// toolStripSeparator1
|
|
||||||
//
|
|
||||||
this.toolStripSeparator1.Name = "toolStripSeparator1";
|
|
||||||
resources.ApplyResources(this.toolStripSeparator1, "toolStripSeparator1");
|
|
||||||
//
|
|
||||||
// menuRemoveServer
|
|
||||||
//
|
|
||||||
this.menuRemoveServer.Name = "menuRemoveServer";
|
|
||||||
resources.ApplyResources(this.menuRemoveServer, "menuRemoveServer");
|
|
||||||
this.menuRemoveServer.Click += new System.EventHandler(this.menuRemoveServer_Click);
|
|
||||||
//
|
|
||||||
// menuRemoveDuplicateServer
|
|
||||||
//
|
|
||||||
this.menuRemoveDuplicateServer.Name = "menuRemoveDuplicateServer";
|
|
||||||
resources.ApplyResources(this.menuRemoveDuplicateServer, "menuRemoveDuplicateServer");
|
|
||||||
this.menuRemoveDuplicateServer.Click += new System.EventHandler(this.menuRemoveDuplicateServer_Click);
|
|
||||||
//
|
|
||||||
// menuCopyServer
|
|
||||||
//
|
|
||||||
this.menuCopyServer.Name = "menuCopyServer";
|
|
||||||
resources.ApplyResources(this.menuCopyServer, "menuCopyServer");
|
|
||||||
this.menuCopyServer.Click += new System.EventHandler(this.menuCopyServer_Click);
|
|
||||||
//
|
|
||||||
// menuSetDefaultServer
|
|
||||||
//
|
|
||||||
this.menuSetDefaultServer.Name = "menuSetDefaultServer";
|
|
||||||
resources.ApplyResources(this.menuSetDefaultServer, "menuSetDefaultServer");
|
|
||||||
this.menuSetDefaultServer.Click += new System.EventHandler(this.menuSetDefaultServer_Click);
|
|
||||||
//
|
|
||||||
// toolStripSeparator3
|
|
||||||
//
|
|
||||||
this.toolStripSeparator3.Name = "toolStripSeparator3";
|
|
||||||
resources.ApplyResources(this.toolStripSeparator3, "toolStripSeparator3");
|
|
||||||
//
|
|
||||||
// menuMoveTop
|
|
||||||
//
|
|
||||||
this.menuMoveTop.Name = "menuMoveTop";
|
|
||||||
resources.ApplyResources(this.menuMoveTop, "menuMoveTop");
|
|
||||||
this.menuMoveTop.Click += new System.EventHandler(this.menuMoveTop_Click);
|
|
||||||
//
|
|
||||||
// menuMoveUp
|
|
||||||
//
|
|
||||||
this.menuMoveUp.Name = "menuMoveUp";
|
|
||||||
resources.ApplyResources(this.menuMoveUp, "menuMoveUp");
|
|
||||||
this.menuMoveUp.Click += new System.EventHandler(this.menuMoveUp_Click);
|
|
||||||
//
|
|
||||||
// menuMoveDown
|
|
||||||
//
|
|
||||||
this.menuMoveDown.Name = "menuMoveDown";
|
|
||||||
resources.ApplyResources(this.menuMoveDown, "menuMoveDown");
|
|
||||||
this.menuMoveDown.Click += new System.EventHandler(this.menuMoveDown_Click);
|
|
||||||
//
|
|
||||||
// menuMoveBottom
|
|
||||||
//
|
|
||||||
this.menuMoveBottom.Name = "menuMoveBottom";
|
|
||||||
resources.ApplyResources(this.menuMoveBottom, "menuMoveBottom");
|
|
||||||
this.menuMoveBottom.Click += new System.EventHandler(this.menuMoveBottom_Click);
|
|
||||||
//
|
|
||||||
// menuSelectAll
|
|
||||||
//
|
|
||||||
this.menuSelectAll.Name = "menuSelectAll";
|
|
||||||
resources.ApplyResources(this.menuSelectAll, "menuSelectAll");
|
|
||||||
this.menuSelectAll.Click += new System.EventHandler(this.menuSelectAll_Click);
|
|
||||||
//
|
|
||||||
// toolStripSeparator9
|
|
||||||
//
|
|
||||||
this.toolStripSeparator9.Name = "toolStripSeparator9";
|
|
||||||
resources.ApplyResources(this.toolStripSeparator9, "toolStripSeparator9");
|
|
||||||
//
|
|
||||||
// menuPingServer
|
|
||||||
//
|
|
||||||
this.menuPingServer.Name = "menuPingServer";
|
|
||||||
resources.ApplyResources(this.menuPingServer, "menuPingServer");
|
|
||||||
this.menuPingServer.Click += new System.EventHandler(this.menuPingServer_Click);
|
|
||||||
//
|
|
||||||
// menuTcpingServer
|
|
||||||
//
|
|
||||||
this.menuTcpingServer.Name = "menuTcpingServer";
|
|
||||||
resources.ApplyResources(this.menuTcpingServer, "menuTcpingServer");
|
|
||||||
this.menuTcpingServer.Click += new System.EventHandler(this.menuTcpingServer_Click);
|
|
||||||
//
|
|
||||||
// menuRealPingServer
|
|
||||||
//
|
|
||||||
this.menuRealPingServer.Name = "menuRealPingServer";
|
|
||||||
resources.ApplyResources(this.menuRealPingServer, "menuRealPingServer");
|
|
||||||
this.menuRealPingServer.Click += new System.EventHandler(this.menuRealPingServer_Click);
|
|
||||||
//
|
|
||||||
// menuSpeedServer
|
|
||||||
//
|
|
||||||
this.menuSpeedServer.Name = "menuSpeedServer";
|
|
||||||
resources.ApplyResources(this.menuSpeedServer, "menuSpeedServer");
|
|
||||||
this.menuSpeedServer.Click += new System.EventHandler(this.menuSpeedServer_Click);
|
|
||||||
//
|
|
||||||
// tsbTestMe
|
|
||||||
//
|
|
||||||
this.tsbTestMe.Name = "tsbTestMe";
|
|
||||||
resources.ApplyResources(this.tsbTestMe, "tsbTestMe");
|
|
||||||
this.tsbTestMe.Click += new System.EventHandler(this.tsbTestMe_Click);
|
|
||||||
//
|
|
||||||
// toolStripSeparator6
|
|
||||||
//
|
|
||||||
this.toolStripSeparator6.Name = "toolStripSeparator6";
|
|
||||||
resources.ApplyResources(this.toolStripSeparator6, "toolStripSeparator6");
|
|
||||||
//
|
|
||||||
// menuExport2ClientConfig
|
|
||||||
//
|
|
||||||
this.menuExport2ClientConfig.Name = "menuExport2ClientConfig";
|
|
||||||
resources.ApplyResources(this.menuExport2ClientConfig, "menuExport2ClientConfig");
|
|
||||||
this.menuExport2ClientConfig.Click += new System.EventHandler(this.menuExport2ClientConfig_Click);
|
|
||||||
//
|
|
||||||
// menuExport2ServerConfig
|
|
||||||
//
|
|
||||||
this.menuExport2ServerConfig.Name = "menuExport2ServerConfig";
|
|
||||||
resources.ApplyResources(this.menuExport2ServerConfig, "menuExport2ServerConfig");
|
|
||||||
this.menuExport2ServerConfig.Click += new System.EventHandler(this.menuExport2ServerConfig_Click);
|
|
||||||
//
|
|
||||||
// menuExport2ShareUrl
|
|
||||||
//
|
|
||||||
this.menuExport2ShareUrl.Name = "menuExport2ShareUrl";
|
|
||||||
resources.ApplyResources(this.menuExport2ShareUrl, "menuExport2ShareUrl");
|
|
||||||
this.menuExport2ShareUrl.Click += new System.EventHandler(this.menuExport2ShareUrl_Click);
|
|
||||||
//
|
|
||||||
// menuExport2SubContent
|
|
||||||
//
|
|
||||||
this.menuExport2SubContent.Name = "menuExport2SubContent";
|
|
||||||
resources.ApplyResources(this.menuExport2SubContent, "menuExport2SubContent");
|
|
||||||
this.menuExport2SubContent.Click += new System.EventHandler(this.menuExport2SubContent_Click);
|
|
||||||
//
|
|
||||||
// tsbServer
|
|
||||||
//
|
|
||||||
this.tsbServer.DropDown = this.cmsLv;
|
|
||||||
this.tsbServer.Image = global::v2rayN.Properties.Resources.server;
|
|
||||||
resources.ApplyResources(this.tsbServer, "tsbServer");
|
|
||||||
this.tsbServer.Name = "tsbServer";
|
|
||||||
//
|
|
||||||
// qrCodeControl
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.qrCodeControl, "qrCodeControl");
|
|
||||||
this.qrCodeControl.Name = "qrCodeControl";
|
|
||||||
//
|
|
||||||
// notifyMain
|
|
||||||
//
|
|
||||||
this.notifyMain.ContextMenuStrip = this.cmsMain;
|
|
||||||
resources.ApplyResources(this.notifyMain, "notifyMain");
|
|
||||||
this.notifyMain.MouseClick += new System.Windows.Forms.MouseEventHandler(this.notifyMain_MouseClick);
|
|
||||||
//
|
|
||||||
// cmsMain
|
|
||||||
//
|
|
||||||
this.cmsMain.ImageScalingSize = new System.Drawing.Size(20, 20);
|
|
||||||
resources.ApplyResources(this.cmsMain, "cmsMain");
|
|
||||||
this.cmsMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
|
||||||
this.menuSysAgentMode,
|
|
||||||
this.menuServers,
|
|
||||||
this.menuAddServers2,
|
|
||||||
this.menuScanScreen2,
|
|
||||||
this.menuCopyPACUrl,
|
|
||||||
this.menuUpdateSubscriptions,
|
|
||||||
this.toolStripSeparator2,
|
|
||||||
this.menuExit});
|
|
||||||
this.cmsMain.Name = "contextMenuStrip1";
|
|
||||||
this.cmsMain.RenderMode = System.Windows.Forms.ToolStripRenderMode.System;
|
|
||||||
this.cmsMain.ShowCheckMargin = true;
|
|
||||||
this.cmsMain.ShowImageMargin = false;
|
|
||||||
//
|
|
||||||
// menuSysAgentMode
|
|
||||||
//
|
|
||||||
this.menuSysAgentMode.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
|
||||||
this.menuNotEnabledHttp,
|
|
||||||
this.menuGlobal,
|
|
||||||
this.menuGlobalPAC,
|
|
||||||
this.menuKeep,
|
|
||||||
this.menuKeepPAC,
|
|
||||||
this.menuKeepNothing,
|
|
||||||
this.menuKeepPACNothing});
|
|
||||||
this.menuSysAgentMode.Name = "menuSysAgentMode";
|
|
||||||
resources.ApplyResources(this.menuSysAgentMode, "menuSysAgentMode");
|
|
||||||
//
|
|
||||||
// menuNotEnabledHttp
|
|
||||||
//
|
|
||||||
this.menuNotEnabledHttp.Name = "menuNotEnabledHttp";
|
|
||||||
resources.ApplyResources(this.menuNotEnabledHttp, "menuNotEnabledHttp");
|
|
||||||
this.menuNotEnabledHttp.Click += new System.EventHandler(this.menuNotEnabledHttp_Click);
|
|
||||||
//
|
|
||||||
// menuGlobal
|
|
||||||
//
|
|
||||||
this.menuGlobal.Name = "menuGlobal";
|
|
||||||
resources.ApplyResources(this.menuGlobal, "menuGlobal");
|
|
||||||
this.menuGlobal.Click += new System.EventHandler(this.menuGlobal_Click);
|
|
||||||
//
|
|
||||||
// menuGlobalPAC
|
|
||||||
//
|
|
||||||
this.menuGlobalPAC.Name = "menuGlobalPAC";
|
|
||||||
resources.ApplyResources(this.menuGlobalPAC, "menuGlobalPAC");
|
|
||||||
this.menuGlobalPAC.Click += new System.EventHandler(this.menuGlobalPAC_Click);
|
|
||||||
//
|
|
||||||
// menuKeep
|
|
||||||
//
|
|
||||||
this.menuKeep.Name = "menuKeep";
|
|
||||||
resources.ApplyResources(this.menuKeep, "menuKeep");
|
|
||||||
this.menuKeep.Click += new System.EventHandler(this.menuKeep_Click);
|
|
||||||
//
|
|
||||||
// menuKeepPAC
|
|
||||||
//
|
|
||||||
this.menuKeepPAC.Name = "menuKeepPAC";
|
|
||||||
resources.ApplyResources(this.menuKeepPAC, "menuKeepPAC");
|
|
||||||
this.menuKeepPAC.Click += new System.EventHandler(this.menuKeepPAC_Click);
|
|
||||||
//
|
|
||||||
// menuKeepNothing
|
|
||||||
//
|
|
||||||
this.menuKeepNothing.Name = "menuKeepNothing";
|
|
||||||
resources.ApplyResources(this.menuKeepNothing, "menuKeepNothing");
|
|
||||||
this.menuKeepNothing.Click += new System.EventHandler(this.menuKeepNothing_Click);
|
|
||||||
//
|
|
||||||
// menuKeepPACNothing
|
|
||||||
//
|
|
||||||
this.menuKeepPACNothing.Name = "menuKeepPACNothing";
|
|
||||||
resources.ApplyResources(this.menuKeepPACNothing, "menuKeepPACNothing");
|
|
||||||
this.menuKeepPACNothing.Click += new System.EventHandler(this.menuKeepPACNothing_Click);
|
|
||||||
//
|
|
||||||
// menuServers
|
|
||||||
//
|
|
||||||
this.menuServers.Name = "menuServers";
|
|
||||||
resources.ApplyResources(this.menuServers, "menuServers");
|
|
||||||
//
|
|
||||||
// menuAddServers2
|
|
||||||
//
|
|
||||||
this.menuAddServers2.Name = "menuAddServers2";
|
|
||||||
resources.ApplyResources(this.menuAddServers2, "menuAddServers2");
|
|
||||||
this.menuAddServers2.Click += new System.EventHandler(this.menuAddServers_Click);
|
|
||||||
//
|
|
||||||
// menuScanScreen2
|
|
||||||
//
|
|
||||||
this.menuScanScreen2.Name = "menuScanScreen2";
|
|
||||||
resources.ApplyResources(this.menuScanScreen2, "menuScanScreen2");
|
|
||||||
this.menuScanScreen2.Click += new System.EventHandler(this.menuScanScreen_Click);
|
|
||||||
//
|
|
||||||
// menuCopyPACUrl
|
|
||||||
//
|
|
||||||
this.menuCopyPACUrl.Name = "menuCopyPACUrl";
|
|
||||||
resources.ApplyResources(this.menuCopyPACUrl, "menuCopyPACUrl");
|
|
||||||
this.menuCopyPACUrl.Click += new System.EventHandler(this.menuCopyPACUrl_Click);
|
|
||||||
//
|
|
||||||
// menuUpdateSubscriptions
|
|
||||||
//
|
|
||||||
this.menuUpdateSubscriptions.Name = "menuUpdateSubscriptions";
|
|
||||||
resources.ApplyResources(this.menuUpdateSubscriptions, "menuUpdateSubscriptions");
|
|
||||||
this.menuUpdateSubscriptions.Click += new System.EventHandler(this.menuUpdateSubscriptions_Click);
|
|
||||||
//
|
|
||||||
// toolStripSeparator2
|
|
||||||
//
|
|
||||||
this.toolStripSeparator2.Name = "toolStripSeparator2";
|
|
||||||
resources.ApplyResources(this.toolStripSeparator2, "toolStripSeparator2");
|
|
||||||
//
|
|
||||||
// menuExit
|
|
||||||
//
|
|
||||||
this.menuExit.Name = "menuExit";
|
|
||||||
resources.ApplyResources(this.menuExit, "menuExit");
|
|
||||||
this.menuExit.Click += new System.EventHandler(this.menuExit_Click);
|
|
||||||
//
|
|
||||||
// bgwScan
|
|
||||||
//
|
|
||||||
this.bgwScan.WorkerReportsProgress = true;
|
|
||||||
this.bgwScan.DoWork += new System.ComponentModel.DoWorkEventHandler(this.bgwScan_DoWork);
|
|
||||||
this.bgwScan.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.bgwScan_ProgressChanged);
|
|
||||||
//
|
|
||||||
// groupBox1
|
|
||||||
//
|
|
||||||
this.groupBox1.Controls.Add(this.scMain);
|
|
||||||
resources.ApplyResources(this.groupBox1, "groupBox1");
|
|
||||||
this.groupBox1.Name = "groupBox1";
|
|
||||||
this.groupBox1.TabStop = false;
|
|
||||||
//
|
|
||||||
// groupBox2
|
|
||||||
//
|
|
||||||
this.groupBox2.Controls.Add(this.txtMsgBox);
|
|
||||||
this.groupBox2.Controls.Add(this.ssMain);
|
|
||||||
resources.ApplyResources(this.groupBox2, "groupBox2");
|
|
||||||
this.groupBox2.Name = "groupBox2";
|
|
||||||
this.groupBox2.TabStop = false;
|
|
||||||
//
|
|
||||||
// txtMsgBox
|
|
||||||
//
|
|
||||||
this.txtMsgBox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(41)))), ((int)(((byte)(49)))), ((int)(((byte)(52)))));
|
|
||||||
this.txtMsgBox.BorderStyle = System.Windows.Forms.BorderStyle.None;
|
|
||||||
resources.ApplyResources(this.txtMsgBox, "txtMsgBox");
|
|
||||||
this.txtMsgBox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(224)))), ((int)(((byte)(226)))), ((int)(((byte)(228)))));
|
|
||||||
this.txtMsgBox.Name = "txtMsgBox";
|
|
||||||
this.txtMsgBox.ReadOnly = true;
|
|
||||||
//
|
|
||||||
// ssMain
|
|
||||||
//
|
|
||||||
this.ssMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
|
||||||
this.toolSslSocksPortLab,
|
|
||||||
this.toolSslSocksPort,
|
|
||||||
this.toolSslBlank1,
|
|
||||||
this.toolSslHttpPortLab,
|
|
||||||
this.toolSslHttpPort,
|
|
||||||
this.toolSslBlank2,
|
|
||||||
this.toolSslPacPortLab,
|
|
||||||
this.toolSslPacPort,
|
|
||||||
this.toolSslBlank3,
|
|
||||||
this.toolSslServerSpeed,
|
|
||||||
this.toolSslBlank4});
|
|
||||||
resources.ApplyResources(this.ssMain, "ssMain");
|
|
||||||
this.ssMain.Name = "ssMain";
|
|
||||||
this.ssMain.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.ssMain_ItemClicked);
|
|
||||||
//
|
|
||||||
// toolSslSocksPortLab
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.toolSslSocksPortLab, "toolSslSocksPortLab");
|
|
||||||
this.toolSslSocksPortLab.Name = "toolSslSocksPortLab";
|
|
||||||
//
|
|
||||||
// toolSslSocksPort
|
|
||||||
//
|
|
||||||
this.toolSslSocksPort.Name = "toolSslSocksPort";
|
|
||||||
resources.ApplyResources(this.toolSslSocksPort, "toolSslSocksPort");
|
|
||||||
//
|
|
||||||
// toolSslBlank1
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.toolSslBlank1, "toolSslBlank1");
|
|
||||||
this.toolSslBlank1.Name = "toolSslBlank1";
|
|
||||||
this.toolSslBlank1.Spring = true;
|
|
||||||
//
|
|
||||||
// toolSslHttpPortLab
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.toolSslHttpPortLab, "toolSslHttpPortLab");
|
|
||||||
this.toolSslHttpPortLab.Name = "toolSslHttpPortLab";
|
|
||||||
//
|
|
||||||
// toolSslHttpPort
|
|
||||||
//
|
|
||||||
this.toolSslHttpPort.Name = "toolSslHttpPort";
|
|
||||||
resources.ApplyResources(this.toolSslHttpPort, "toolSslHttpPort");
|
|
||||||
//
|
|
||||||
// toolSslBlank2
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.toolSslBlank2, "toolSslBlank2");
|
|
||||||
this.toolSslBlank2.Name = "toolSslBlank2";
|
|
||||||
this.toolSslBlank2.Spring = true;
|
|
||||||
//
|
|
||||||
// toolSslPacPortLab
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.toolSslPacPortLab, "toolSslPacPortLab");
|
|
||||||
this.toolSslPacPortLab.Name = "toolSslPacPortLab";
|
|
||||||
//
|
|
||||||
// toolSslPacPort
|
|
||||||
//
|
|
||||||
this.toolSslPacPort.Name = "toolSslPacPort";
|
|
||||||
resources.ApplyResources(this.toolSslPacPort, "toolSslPacPort");
|
|
||||||
//
|
|
||||||
// toolSslBlank3
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.toolSslBlank3, "toolSslBlank3");
|
|
||||||
this.toolSslBlank3.Name = "toolSslBlank3";
|
|
||||||
this.toolSslBlank3.Spring = true;
|
|
||||||
//
|
|
||||||
// toolSslServerSpeed
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.toolSslServerSpeed, "toolSslServerSpeed");
|
|
||||||
this.toolSslServerSpeed.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
|
|
||||||
this.toolSslServerSpeed.Name = "toolSslServerSpeed";
|
|
||||||
//
|
|
||||||
// toolSslBlank4
|
|
||||||
//
|
|
||||||
this.toolSslBlank4.Name = "toolSslBlank4";
|
|
||||||
resources.ApplyResources(this.toolSslBlank4, "toolSslBlank4");
|
|
||||||
//
|
|
||||||
// panel1
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.panel1, "panel1");
|
|
||||||
this.panel1.Name = "panel1";
|
|
||||||
//
|
|
||||||
// tsMain
|
|
||||||
//
|
|
||||||
this.tsMain.ImageScalingSize = new System.Drawing.Size(32, 32);
|
|
||||||
this.tsMain.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
|
||||||
this.tsbServer,
|
|
||||||
this.toolStripSeparator4,
|
|
||||||
this.tsbSub,
|
|
||||||
this.tsbQRCodeSwitch,
|
|
||||||
this.toolStripSeparator8,
|
|
||||||
this.tsbOptionSetting,
|
|
||||||
this.toolStripSeparator5,
|
|
||||||
this.tsbReload,
|
|
||||||
this.toolStripSeparator7,
|
|
||||||
this.tsbCheckUpdate,
|
|
||||||
this.toolStripSeparator10,
|
|
||||||
this.tsbHelp,
|
|
||||||
this.tsbPromotion,
|
|
||||||
this.toolStripSeparator11,
|
|
||||||
this.tsbClose});
|
|
||||||
resources.ApplyResources(this.tsMain, "tsMain");
|
|
||||||
this.tsMain.Name = "tsMain";
|
|
||||||
this.tsMain.TabStop = true;
|
|
||||||
//
|
|
||||||
// toolStripSeparator4
|
|
||||||
//
|
|
||||||
this.toolStripSeparator4.Name = "toolStripSeparator4";
|
|
||||||
resources.ApplyResources(this.toolStripSeparator4, "toolStripSeparator4");
|
|
||||||
//
|
|
||||||
// tsbSub
|
|
||||||
//
|
|
||||||
this.tsbSub.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
|
||||||
this.tsbSubSetting,
|
|
||||||
this.tsbSubUpdate});
|
|
||||||
this.tsbSub.Image = global::v2rayN.Properties.Resources.sub;
|
|
||||||
resources.ApplyResources(this.tsbSub, "tsbSub");
|
|
||||||
this.tsbSub.Name = "tsbSub";
|
|
||||||
//
|
|
||||||
// tsbSubSetting
|
|
||||||
//
|
|
||||||
this.tsbSubSetting.Name = "tsbSubSetting";
|
|
||||||
resources.ApplyResources(this.tsbSubSetting, "tsbSubSetting");
|
|
||||||
this.tsbSubSetting.Click += new System.EventHandler(this.tsbSubSetting_Click);
|
|
||||||
//
|
|
||||||
// tsbSubUpdate
|
|
||||||
//
|
|
||||||
this.tsbSubUpdate.Name = "tsbSubUpdate";
|
|
||||||
resources.ApplyResources(this.tsbSubUpdate, "tsbSubUpdate");
|
|
||||||
this.tsbSubUpdate.Click += new System.EventHandler(this.tsbSubUpdate_Click);
|
|
||||||
//
|
|
||||||
// tsbQRCodeSwitch
|
|
||||||
//
|
|
||||||
this.tsbQRCodeSwitch.CheckOnClick = true;
|
|
||||||
this.tsbQRCodeSwitch.ForeColor = System.Drawing.Color.Black;
|
|
||||||
this.tsbQRCodeSwitch.Image = global::v2rayN.Properties.Resources.share;
|
|
||||||
resources.ApplyResources(this.tsbQRCodeSwitch, "tsbQRCodeSwitch");
|
|
||||||
this.tsbQRCodeSwitch.Name = "tsbQRCodeSwitch";
|
|
||||||
this.tsbQRCodeSwitch.CheckedChanged += new System.EventHandler(this.tsbQRCodeSwitch_CheckedChanged);
|
|
||||||
//
|
|
||||||
// toolStripSeparator8
|
|
||||||
//
|
|
||||||
this.toolStripSeparator8.Name = "toolStripSeparator8";
|
|
||||||
resources.ApplyResources(this.toolStripSeparator8, "toolStripSeparator8");
|
|
||||||
//
|
|
||||||
// tsbOptionSetting
|
|
||||||
//
|
|
||||||
this.tsbOptionSetting.Image = global::v2rayN.Properties.Resources.option;
|
|
||||||
resources.ApplyResources(this.tsbOptionSetting, "tsbOptionSetting");
|
|
||||||
this.tsbOptionSetting.Name = "tsbOptionSetting";
|
|
||||||
this.tsbOptionSetting.Click += new System.EventHandler(this.tsbOptionSetting_Click);
|
|
||||||
//
|
|
||||||
// toolStripSeparator5
|
|
||||||
//
|
|
||||||
this.toolStripSeparator5.Name = "toolStripSeparator5";
|
|
||||||
resources.ApplyResources(this.toolStripSeparator5, "toolStripSeparator5");
|
|
||||||
//
|
|
||||||
// tsbReload
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.tsbReload, "tsbReload");
|
|
||||||
this.tsbReload.Name = "tsbReload";
|
|
||||||
this.tsbReload.Click += new System.EventHandler(this.tsbReload_Click);
|
|
||||||
//
|
|
||||||
// toolStripSeparator7
|
|
||||||
//
|
|
||||||
this.toolStripSeparator7.Name = "toolStripSeparator7";
|
|
||||||
resources.ApplyResources(this.toolStripSeparator7, "toolStripSeparator7");
|
|
||||||
//
|
|
||||||
// tsbCheckUpdate
|
|
||||||
//
|
|
||||||
this.tsbCheckUpdate.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
|
||||||
this.tsbCheckUpdateN,
|
|
||||||
this.tsbCheckUpdateCore,
|
|
||||||
this.tsbCheckUpdatePACList,
|
|
||||||
this.toolStripSeparator13,
|
|
||||||
this.tsbCheckClearPACList});
|
|
||||||
this.tsbCheckUpdate.Image = global::v2rayN.Properties.Resources.checkupdate;
|
|
||||||
resources.ApplyResources(this.tsbCheckUpdate, "tsbCheckUpdate");
|
|
||||||
this.tsbCheckUpdate.Name = "tsbCheckUpdate";
|
|
||||||
//
|
|
||||||
// tsbCheckUpdateN
|
|
||||||
//
|
|
||||||
this.tsbCheckUpdateN.Name = "tsbCheckUpdateN";
|
|
||||||
resources.ApplyResources(this.tsbCheckUpdateN, "tsbCheckUpdateN");
|
|
||||||
this.tsbCheckUpdateN.Click += new System.EventHandler(this.tsbCheckUpdateN_Click);
|
|
||||||
//
|
|
||||||
// tsbCheckUpdateCore
|
|
||||||
//
|
|
||||||
this.tsbCheckUpdateCore.Name = "tsbCheckUpdateCore";
|
|
||||||
resources.ApplyResources(this.tsbCheckUpdateCore, "tsbCheckUpdateCore");
|
|
||||||
this.tsbCheckUpdateCore.Click += new System.EventHandler(this.tsbCheckUpdateCore_Click);
|
|
||||||
//
|
|
||||||
// tsbCheckUpdatePACList
|
|
||||||
//
|
|
||||||
this.tsbCheckUpdatePACList.Name = "tsbCheckUpdatePACList";
|
|
||||||
resources.ApplyResources(this.tsbCheckUpdatePACList, "tsbCheckUpdatePACList");
|
|
||||||
this.tsbCheckUpdatePACList.Click += new System.EventHandler(this.tsbCheckUpdatePACList_Click);
|
|
||||||
//
|
|
||||||
// toolStripSeparator13
|
|
||||||
//
|
|
||||||
this.toolStripSeparator13.Name = "toolStripSeparator13";
|
|
||||||
resources.ApplyResources(this.toolStripSeparator13, "toolStripSeparator13");
|
|
||||||
//
|
|
||||||
// tsbCheckClearPACList
|
|
||||||
//
|
|
||||||
this.tsbCheckClearPACList.Name = "tsbCheckClearPACList";
|
|
||||||
resources.ApplyResources(this.tsbCheckClearPACList, "tsbCheckClearPACList");
|
|
||||||
this.tsbCheckClearPACList.Click += new System.EventHandler(this.tsbCheckClearPACList_Click);
|
|
||||||
//
|
|
||||||
// toolStripSeparator10
|
|
||||||
//
|
|
||||||
this.toolStripSeparator10.Name = "toolStripSeparator10";
|
|
||||||
resources.ApplyResources(this.toolStripSeparator10, "toolStripSeparator10");
|
|
||||||
//
|
|
||||||
// tsbHelp
|
|
||||||
//
|
|
||||||
this.tsbHelp.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
|
||||||
this.tsbAbout,
|
|
||||||
this.tsbV2rayWebsite,
|
|
||||||
this.toolStripSeparator12,
|
|
||||||
this.tsbLanguageDef,
|
|
||||||
this.tsbLanguageZhHans});
|
|
||||||
this.tsbHelp.Image = global::v2rayN.Properties.Resources.help;
|
|
||||||
resources.ApplyResources(this.tsbHelp, "tsbHelp");
|
|
||||||
this.tsbHelp.Name = "tsbHelp";
|
|
||||||
//
|
|
||||||
// tsbAbout
|
|
||||||
//
|
|
||||||
this.tsbAbout.Name = "tsbAbout";
|
|
||||||
resources.ApplyResources(this.tsbAbout, "tsbAbout");
|
|
||||||
this.tsbAbout.Click += new System.EventHandler(this.tsbAbout_Click);
|
|
||||||
//
|
|
||||||
// tsbV2rayWebsite
|
|
||||||
//
|
|
||||||
this.tsbV2rayWebsite.Name = "tsbV2rayWebsite";
|
|
||||||
resources.ApplyResources(this.tsbV2rayWebsite, "tsbV2rayWebsite");
|
|
||||||
this.tsbV2rayWebsite.Click += new System.EventHandler(this.tsbV2rayWebsite_Click);
|
|
||||||
//
|
|
||||||
// toolStripSeparator12
|
|
||||||
//
|
|
||||||
this.toolStripSeparator12.Name = "toolStripSeparator12";
|
|
||||||
resources.ApplyResources(this.toolStripSeparator12, "toolStripSeparator12");
|
|
||||||
//
|
|
||||||
// tsbLanguageDef
|
|
||||||
//
|
|
||||||
this.tsbLanguageDef.Name = "tsbLanguageDef";
|
|
||||||
resources.ApplyResources(this.tsbLanguageDef, "tsbLanguageDef");
|
|
||||||
this.tsbLanguageDef.Click += new System.EventHandler(this.tsbLanguageDef_Click);
|
|
||||||
//
|
|
||||||
// tsbLanguageZhHans
|
|
||||||
//
|
|
||||||
this.tsbLanguageZhHans.Name = "tsbLanguageZhHans";
|
|
||||||
resources.ApplyResources(this.tsbLanguageZhHans, "tsbLanguageZhHans");
|
|
||||||
this.tsbLanguageZhHans.Click += new System.EventHandler(this.tsbLanguageZhHans_Click);
|
|
||||||
//
|
|
||||||
// tsbPromotion
|
|
||||||
//
|
|
||||||
this.tsbPromotion.ForeColor = System.Drawing.Color.Black;
|
|
||||||
this.tsbPromotion.Image = global::v2rayN.Properties.Resources.promotion;
|
|
||||||
resources.ApplyResources(this.tsbPromotion, "tsbPromotion");
|
|
||||||
this.tsbPromotion.Name = "tsbPromotion";
|
|
||||||
this.tsbPromotion.Click += new System.EventHandler(this.tsbPromotion_Click);
|
|
||||||
//
|
|
||||||
// toolStripSeparator11
|
|
||||||
//
|
|
||||||
this.toolStripSeparator11.Name = "toolStripSeparator11";
|
|
||||||
resources.ApplyResources(this.toolStripSeparator11, "toolStripSeparator11");
|
|
||||||
//
|
|
||||||
// tsbClose
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.tsbClose, "tsbClose");
|
|
||||||
this.tsbClose.Name = "tsbClose";
|
|
||||||
this.tsbClose.Click += new System.EventHandler(this.tsbClose_Click);
|
|
||||||
//
|
|
||||||
// MainForm
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this, "$this");
|
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
|
||||||
this.Controls.Add(this.groupBox1);
|
|
||||||
this.Controls.Add(this.groupBox2);
|
|
||||||
this.Controls.Add(this.panel1);
|
|
||||||
this.Controls.Add(this.tsMain);
|
|
||||||
this.MaximizeBox = true;
|
|
||||||
this.MinimizeBox = true;
|
|
||||||
this.Name = "MainForm";
|
|
||||||
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing);
|
|
||||||
this.Load += new System.EventHandler(this.MainForm_Load);
|
|
||||||
this.Shown += new System.EventHandler(this.MainForm_Shown);
|
|
||||||
this.VisibleChanged += new System.EventHandler(this.MainForm_VisibleChanged);
|
|
||||||
this.Resize += new System.EventHandler(this.MainForm_Resize);
|
|
||||||
this.scMain.Panel1.ResumeLayout(false);
|
|
||||||
this.scMain.Panel2.ResumeLayout(false);
|
|
||||||
((System.ComponentModel.ISupportInitialize)(this.scMain)).EndInit();
|
|
||||||
this.scMain.ResumeLayout(false);
|
|
||||||
this.cmsLv.ResumeLayout(false);
|
|
||||||
this.cmsMain.ResumeLayout(false);
|
|
||||||
this.groupBox1.ResumeLayout(false);
|
|
||||||
this.groupBox2.ResumeLayout(false);
|
|
||||||
this.groupBox2.PerformLayout();
|
|
||||||
this.ssMain.ResumeLayout(false);
|
|
||||||
this.ssMain.PerformLayout();
|
|
||||||
this.tsMain.ResumeLayout(false);
|
|
||||||
this.tsMain.PerformLayout();
|
|
||||||
this.ResumeLayout(false);
|
|
||||||
this.PerformLayout();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
private System.Windows.Forms.GroupBox groupBox1;
|
|
||||||
private System.Windows.Forms.GroupBox groupBox2;
|
|
||||||
private System.Windows.Forms.TextBox txtMsgBox;
|
|
||||||
private v2rayN.Base.ListViewFlickerFree lvServers;
|
|
||||||
private System.Windows.Forms.NotifyIcon notifyMain;
|
|
||||||
private System.Windows.Forms.ContextMenuStrip cmsMain;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuExit;
|
|
||||||
private System.Windows.Forms.Panel panel1;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuServers;
|
|
||||||
private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
|
|
||||||
private System.Windows.Forms.ContextMenuStrip cmsLv;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuAddVmessServer;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuRemoveServer;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuSetDefaultServer;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuCopyServer;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuPingServer;
|
|
||||||
private System.Windows.Forms.ToolStripSeparator toolStripSeparator3;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuExport2ClientConfig;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuExport2ServerConfig;
|
|
||||||
private System.Windows.Forms.ToolStrip tsMain;
|
|
||||||
private System.Windows.Forms.ToolStripDropDownButton tsbServer;
|
|
||||||
private System.Windows.Forms.ToolStripButton tsbOptionSetting;
|
|
||||||
private System.Windows.Forms.ToolStripButton tsbClose;
|
|
||||||
private System.Windows.Forms.ToolStripSeparator toolStripSeparator4;
|
|
||||||
private System.Windows.Forms.ToolStripSeparator toolStripSeparator5;
|
|
||||||
private System.Windows.Forms.ToolStripSeparator toolStripSeparator6;
|
|
||||||
private System.Windows.Forms.ToolStripSeparator toolStripSeparator7;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuMoveTop;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuMoveUp;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuMoveDown;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuMoveBottom;
|
|
||||||
private System.Windows.Forms.ToolStripSeparator toolStripSeparator9;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuSysAgentMode;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuGlobal;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuGlobalPAC;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuKeep;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuCopyPACUrl;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuAddCustomServer;
|
|
||||||
private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuAddShadowsocksServer;
|
|
||||||
private System.Windows.Forms.SplitContainer scMain;
|
|
||||||
private QRCodeControl qrCodeControl;
|
|
||||||
private System.Windows.Forms.ToolStripSeparator toolStripSeparator10;
|
|
||||||
private System.Windows.Forms.ToolStripDropDownButton tsbCheckUpdate;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateN;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdateCore;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem tsbCheckUpdatePACList;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuAddServers;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuExport2ShareUrl;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuSpeedServer;
|
|
||||||
private System.Windows.Forms.ToolStripSeparator toolStripSeparator11;
|
|
||||||
private System.Windows.Forms.ToolStripDropDownButton tsbHelp;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem tsbAbout;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuAddServers2;
|
|
||||||
private System.ComponentModel.BackgroundWorker bgwScan;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuScanScreen;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuScanScreen2;
|
|
||||||
private System.Windows.Forms.ToolStripDropDownButton tsbSub;
|
|
||||||
private System.Windows.Forms.ToolStripSeparator toolStripSeparator8;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem tsbSubSetting;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem tsbSubUpdate;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem tsbCheckClearPACList;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuKeepPAC;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuSelectAll;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuExport2SubContent;
|
|
||||||
private System.Windows.Forms.ToolStripSeparator toolStripSeparator12;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem tsbLanguageDef;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem tsbLanguageZhHans;
|
|
||||||
private System.Windows.Forms.ToolStripButton tsbPromotion;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuAddSocksServer;
|
|
||||||
private System.Windows.Forms.StatusStrip ssMain;
|
|
||||||
private System.Windows.Forms.ToolStripStatusLabel toolSslSocksPort;
|
|
||||||
private System.Windows.Forms.ToolStripStatusLabel toolSslHttpPort;
|
|
||||||
private System.Windows.Forms.ToolStripStatusLabel toolSslBlank2;
|
|
||||||
private System.Windows.Forms.ToolStripStatusLabel toolSslBlank1;
|
|
||||||
private System.Windows.Forms.ToolStripStatusLabel toolSslPacPort;
|
|
||||||
private System.Windows.Forms.ToolStripStatusLabel toolSslBlank3;
|
|
||||||
private System.Windows.Forms.ToolStripStatusLabel toolSslSocksPortLab;
|
|
||||||
private System.Windows.Forms.ToolStripStatusLabel toolSslHttpPortLab;
|
|
||||||
private System.Windows.Forms.ToolStripStatusLabel toolSslPacPortLab;
|
|
||||||
private System.Windows.Forms.ToolStripStatusLabel toolSslServerSpeed;
|
|
||||||
private System.Windows.Forms.ToolStripStatusLabel toolSslBlank4;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuRemoveDuplicateServer;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuTcpingServer;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuRealPingServer;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuNotEnabledHttp;
|
|
||||||
private System.Windows.Forms.ToolStripSeparator toolStripSeparator13;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuUpdateSubscriptions;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem tsbV2rayWebsite;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuKeepNothing;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem menuKeepPACNothing;
|
|
||||||
private System.Windows.Forms.ToolStripMenuItem tsbTestMe;
|
|
||||||
private System.Windows.Forms.ToolStripButton tsbReload;
|
|
||||||
private System.Windows.Forms.ToolStripButton tsbQRCodeSwitch;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,516 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<root>
|
|
||||||
<!--
|
|
||||||
Microsoft ResX Schema
|
|
||||||
|
|
||||||
Version 2.0
|
|
||||||
|
|
||||||
The primary goals of this format is to allow a simple XML format
|
|
||||||
that is mostly human readable. The generation and parsing of the
|
|
||||||
various data types are done through the TypeConverter classes
|
|
||||||
associated with the data types.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
... ado.net/XML headers & schema ...
|
|
||||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
|
||||||
<resheader name="version">2.0</resheader>
|
|
||||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
|
||||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
|
||||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
|
||||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
|
||||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
|
||||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
|
||||||
</data>
|
|
||||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
|
||||||
<comment>This is a comment</comment>
|
|
||||||
</data>
|
|
||||||
|
|
||||||
There are any number of "resheader" rows that contain simple
|
|
||||||
name/value pairs.
|
|
||||||
|
|
||||||
Each data row contains a name, and value. The row also contains a
|
|
||||||
type or mimetype. Type corresponds to a .NET class that support
|
|
||||||
text/value conversion through the TypeConverter architecture.
|
|
||||||
Classes that don't support this are serialized and stored with the
|
|
||||||
mimetype set.
|
|
||||||
|
|
||||||
The mimetype is used for serialized objects, and tells the
|
|
||||||
ResXResourceReader how to depersist the object. This is currently not
|
|
||||||
extensible. For a given mimetype the value must be set accordingly:
|
|
||||||
|
|
||||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
|
||||||
that the ResXResourceWriter will generate, however the reader can
|
|
||||||
read any of the formats listed below.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.binary.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.soap.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
|
||||||
value : The object must be serialized into a byte array
|
|
||||||
: using a System.ComponentModel.TypeConverter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
-->
|
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
|
||||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:choice maxOccurs="unbounded">
|
|
||||||
<xsd:element name="metadata">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="assembly">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:attribute name="alias" type="xsd:string" />
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="data">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="resheader">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:choice>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:schema>
|
|
||||||
<resheader name="resmimetype">
|
|
||||||
<value>text/microsoft-resx</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="version">
|
|
||||||
<value>2.0</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="reader">
|
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="writer">
|
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
|
||||||
<data name="menuAddVmessServer.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>300, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuAddVmessServer.Text" xml:space="preserve">
|
|
||||||
<value>添加[VMess]服务器</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuAddShadowsocksServer.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>300, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuAddShadowsocksServer.Text" xml:space="preserve">
|
|
||||||
<value>添加[Shadowsocks]服务器</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuAddSocksServer.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>300, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuAddSocksServer.Text" xml:space="preserve">
|
|
||||||
<value>添加[Socks]服务器</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuAddCustomServer.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>300, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuAddCustomServer.Text" xml:space="preserve">
|
|
||||||
<value>添加自定义配置服务器</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuAddServers.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>300, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuAddServers.Text" xml:space="preserve">
|
|
||||||
<value>从剪贴板导入批量URL (Ctrl+V)</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuScanScreen.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>300, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuScanScreen.Text" xml:space="preserve">
|
|
||||||
<value>扫描屏幕上的二维码 (Ctrl+S)</value>
|
|
||||||
</data>
|
|
||||||
<data name="toolStripSeparator1.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>297, 6</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuRemoveServer.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>300, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuRemoveServer.Text" xml:space="preserve">
|
|
||||||
<value>移除所选服务器(多选) (Delete)</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuRemoveDuplicateServer.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>300, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuRemoveDuplicateServer.Text" xml:space="preserve">
|
|
||||||
<value>移除重复的服务器</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuCopyServer.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>300, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuCopyServer.Text" xml:space="preserve">
|
|
||||||
<value>克隆所选服务器</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuSetDefaultServer.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>300, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuSetDefaultServer.Text" xml:space="preserve">
|
|
||||||
<value>设为活动服务器 (Enter)</value>
|
|
||||||
</data>
|
|
||||||
<data name="toolStripSeparator3.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>297, 6</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuMoveTop.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>300, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuMoveTop.Text" xml:space="preserve">
|
|
||||||
<value>上移至顶 (T)</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuMoveUp.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>300, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuMoveUp.Text" xml:space="preserve">
|
|
||||||
<value>上移 (U)</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuMoveDown.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>300, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuMoveDown.Text" xml:space="preserve">
|
|
||||||
<value>下移 (D)</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuMoveBottom.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>300, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuMoveBottom.Text" xml:space="preserve">
|
|
||||||
<value>下移至底 (B)</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuSelectAll.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>300, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuSelectAll.Text" xml:space="preserve">
|
|
||||||
<value>全选 (Ctrl+A)</value>
|
|
||||||
</data>
|
|
||||||
<data name="toolStripSeparator9.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>297, 6</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuPingServer.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>300, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuPingServer.Text" xml:space="preserve">
|
|
||||||
<value>测试服务器延迟Ping(多选) (Ctrl+P)</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuTcpingServer.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>300, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuTcpingServer.Text" xml:space="preserve">
|
|
||||||
<value>测试服务器延迟Tcping(多选) (Ctrl+O)</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuRealPingServer.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>300, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuRealPingServer.Text" xml:space="preserve">
|
|
||||||
<value>测试服务器真连接延迟(多选) (Ctrl+R)</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuSpeedServer.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>300, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuSpeedServer.Text" xml:space="preserve">
|
|
||||||
<value>测试服务器速度(多选) (Ctrl+T)</value>
|
|
||||||
</data>
|
|
||||||
<data name="toolStripSeparator6.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>297, 6</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuExport2ClientConfig.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>300, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuExport2ClientConfig.Text" xml:space="preserve">
|
|
||||||
<value>导出所选服务器为客户端配置</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuExport2ServerConfig.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>300, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuExport2ServerConfig.Text" xml:space="preserve">
|
|
||||||
<value>导出所选服务器为服务端配置</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuExport2ShareUrl.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>300, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuExport2ShareUrl.Text" xml:space="preserve">
|
|
||||||
<value>批量导出分享URL至剪贴板(多选) (Ctrl+C)</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuExport2SubContent.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>300, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuExport2SubContent.Text" xml:space="preserve">
|
|
||||||
<value>批量导出订阅内容至剪贴板(多选)</value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbServer.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>73, 53</value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbServer.Text" xml:space="preserve">
|
|
||||||
<value> 服务器 </value>
|
|
||||||
</data>
|
|
||||||
<data name="cmsLv.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>301, 534</value>
|
|
||||||
</data>
|
|
||||||
<data name="lvServers.Items" mimetype="application/x-microsoft.net.object.binary.base64">
|
|
||||||
<value>
|
|
||||||
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
|
|
||||||
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0
|
|
||||||
ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu
|
|
||||||
PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA
|
|
||||||
BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5
|
|
||||||
bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp
|
|
||||||
bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz
|
|
||||||
dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA
|
|
||||||
CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp
|
|
||||||
bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5
|
|
||||||
bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3
|
|
||||||
////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0
|
|
||||||
ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw==
|
|
||||||
</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuNotEnabledHttp.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>316, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuNotEnabledHttp.Text" xml:space="preserve">
|
|
||||||
<value>关闭Http代理</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuGlobal.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>316, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuGlobal.Text" xml:space="preserve">
|
|
||||||
<value>开启Http代理,并自动配置系统代理(全局模式)</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuGlobalPAC.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>316, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuGlobalPAC.Text" xml:space="preserve">
|
|
||||||
<value>开启PAC,并自动配置系统代理(PAC模式)</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuKeep.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>316, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuKeep.Text" xml:space="preserve">
|
|
||||||
<value>仅开启Http代理,并清除系统代理</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuKeepPAC.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>316, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuKeepPAC.Text" xml:space="preserve">
|
|
||||||
<value>仅开启PAC,并清除系统代理</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuKeepNothing.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>316, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuKeepNothing.Text" xml:space="preserve">
|
|
||||||
<value>仅开启Http代理,不改变系统代理</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuKeepPACNothing.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>316, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuKeepPACNothing.Text" xml:space="preserve">
|
|
||||||
<value>仅开启PAC,不改变系统代理</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuSysAgentMode.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>195, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuSysAgentMode.Text" xml:space="preserve">
|
|
||||||
<value>Http代理</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuServers.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>195, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuServers.Text" xml:space="preserve">
|
|
||||||
<value>服务器</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuAddServers2.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>195, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuAddServers2.Text" xml:space="preserve">
|
|
||||||
<value>从剪贴板导入批量URL</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuScanScreen2.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>195, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuScanScreen2.Text" xml:space="preserve">
|
|
||||||
<value>扫描屏幕上的二维码</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuCopyPACUrl.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>195, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuCopyPACUrl.Text" xml:space="preserve">
|
|
||||||
<value>复制本地PAC网址</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuUpdateSubscriptions.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>195, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuUpdateSubscriptions.Text" xml:space="preserve">
|
|
||||||
<value>更新订阅</value>
|
|
||||||
</data>
|
|
||||||
<data name="toolStripSeparator2.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>192, 6</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuExit.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>195, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="menuExit.Text" xml:space="preserve">
|
|
||||||
<value>退出</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmsMain.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>196, 164</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox1.Text" xml:space="preserve">
|
|
||||||
<value>服务器列表</value>
|
|
||||||
</data>
|
|
||||||
<data name="toolSslServerSpeed.Text" xml:space="preserve">
|
|
||||||
<value>网速显示未启用</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox2.Text" xml:space="preserve">
|
|
||||||
<value>信息</value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbSubSetting.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>124, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbSubSetting.Text" xml:space="preserve">
|
|
||||||
<value>订阅设置</value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbSubUpdate.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>124, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbSubUpdate.Text" xml:space="preserve">
|
|
||||||
<value>更新订阅</value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbSub.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>61, 53</value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbSub.Text" xml:space="preserve">
|
|
||||||
<value> 订阅 </value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbOptionSetting.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>76, 53</value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbOptionSetting.Text" xml:space="preserve">
|
|
||||||
<value> 参数设置 </value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbReload.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>148, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbReload.Text" xml:space="preserve">
|
|
||||||
<value> 重启服务 </value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbTestMe.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>148, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbTestMe.Text" xml:space="preserve">
|
|
||||||
<value>测试当前服务状态</value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbService.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>
|
|
||||||
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
|
||||||
wwAADsMBx2+oZAAAATdJREFUWEftloENAiEMRW8ER3AEN9ANdARHcAPdwBF0A91AN9INtC+5JvUCJwWM
|
|
||||||
mvCTFw3QUiiU65qa/lUTYT6Ato9rJZyERwT6GFNdU+EihCYNwVhsqmgm3AR1fheOAitd9PCfNvp0HDbY
|
|
||||||
FolV2MmZZCzX9J0FG0TRTlwFdbahIVE7Qe1IR5bYVnXCyr2yO5F1MNUBec25YtjomcCXSxhr9DmrV2Gr
|
|
||||||
flyL4GSrYcm9tmnEZ7JsAC7DgWr5ydbXA8hOAcVjG8FTD6ocQgvXKrW8MqFWUfc1DAXgmRwVFaJQAHsh
|
|
||||||
VbYUU87diqWA934sl/TZ7wV2Lesx0gBwsO5/1Sl5PQhLQb+G+E+bfTm9KXsRAVgHrMK+jO9gbNEzzMSh
|
|
||||||
6DlM9nANoa+kdCeLXLNLFtc9b2r6EXXdE4e4mdByNuG1AAAAAElFTkSuQmCC
|
|
||||||
</value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbService.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>85, 53</value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbService.Text" xml:space="preserve">
|
|
||||||
<value> 当前服务 </value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbCheckUpdateN.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>223, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbCheckUpdateN.Text" xml:space="preserve">
|
|
||||||
<value>v2rayN</value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbCheckUpdateCore.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>223, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbCheckUpdateCore.Text" xml:space="preserve">
|
|
||||||
<value>v2rayCore</value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbCheckUpdatePACList.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>223, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbCheckUpdatePACList.Text" xml:space="preserve">
|
|
||||||
<value>PAC</value>
|
|
||||||
</data>
|
|
||||||
<data name="toolStripSeparator13.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>220, 6</value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbCheckClearPACList.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>223, 22</value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbCheckClearPACList.Text" xml:space="preserve">
|
|
||||||
<value>简化PAC (请设置Core路由)</value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbCheckUpdate.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>85, 53</value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbCheckUpdate.Text" xml:space="preserve">
|
|
||||||
<value> 检查更新 </value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbAbout.Text" xml:space="preserve">
|
|
||||||
<value>v2rayN 项目</value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbV2rayWebsite.Text" xml:space="preserve">
|
|
||||||
<value>V2Ray 官网</value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbHelp.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>69, 53</value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbHelp.Text" xml:space="preserve">
|
|
||||||
<value> 帮助 </value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbPromotion.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>68, 53</value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbPromotion.Text" xml:space="preserve">
|
|
||||||
<value> 推广 </value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbClose.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>
|
|
||||||
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAO
|
|
||||||
wwAADsMBx2+oZAAAADJJREFUWEftzrENACAIRUFGdVMdTZkAG4zFXfI68kMAAD8ap9lUbpfyaDV19QAA
|
|
||||||
8FDEBl3RImu5VcdbAAAAAElFTkSuQmCC
|
|
||||||
</value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbClose.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>76, 53</value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbClose.Text" xml:space="preserve">
|
|
||||||
<value> 关闭窗口 </value>
|
|
||||||
</data>
|
|
||||||
<data name="tsbQRCodeSwitch.Text" xml:space="preserve">
|
|
||||||
<value> 分享 </value>
|
|
||||||
</data>
|
|
||||||
</root>
|
|
||||||
729
v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs
generated
729
v2rayN/v2rayN/Forms/OptionSettingForm.Designer.cs
generated
@@ -1,729 +0,0 @@
|
|||||||
namespace v2rayN.Forms
|
|
||||||
{
|
|
||||||
partial class OptionSettingForm
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Required designer variable.
|
|
||||||
/// </summary>
|
|
||||||
private System.ComponentModel.IContainer components = null;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Clean up any resources being used.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
|
||||||
protected override void Dispose(bool disposing)
|
|
||||||
{
|
|
||||||
if (disposing && (components != null))
|
|
||||||
{
|
|
||||||
components.Dispose();
|
|
||||||
}
|
|
||||||
base.Dispose(disposing);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Windows Form Designer generated code
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Required method for Designer support - do not modify
|
|
||||||
/// the contents of this method with the code editor.
|
|
||||||
/// </summary>
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(OptionSettingForm));
|
|
||||||
this.btnClose = new System.Windows.Forms.Button();
|
|
||||||
this.tabControl1 = new System.Windows.Forms.TabControl();
|
|
||||||
this.tabPage1 = new System.Windows.Forms.TabPage();
|
|
||||||
this.groupBox1 = new System.Windows.Forms.GroupBox();
|
|
||||||
this.label16 = new System.Windows.Forms.Label();
|
|
||||||
this.cmblistenerType = new System.Windows.Forms.ComboBox();
|
|
||||||
this.chksniffingEnabled2 = new System.Windows.Forms.CheckBox();
|
|
||||||
this.chksniffingEnabled = new System.Windows.Forms.CheckBox();
|
|
||||||
this.txtremoteDNS = new System.Windows.Forms.TextBox();
|
|
||||||
this.label14 = new System.Windows.Forms.Label();
|
|
||||||
this.chkmuxEnabled = new System.Windows.Forms.CheckBox();
|
|
||||||
this.chkAllowIn2 = new System.Windows.Forms.CheckBox();
|
|
||||||
this.chkudpEnabled2 = new System.Windows.Forms.CheckBox();
|
|
||||||
this.cmbprotocol2 = new System.Windows.Forms.ComboBox();
|
|
||||||
this.label3 = new System.Windows.Forms.Label();
|
|
||||||
this.txtlocalPort2 = new System.Windows.Forms.TextBox();
|
|
||||||
this.cmbprotocol = new System.Windows.Forms.ComboBox();
|
|
||||||
this.label1 = new System.Windows.Forms.Label();
|
|
||||||
this.chkudpEnabled = new System.Windows.Forms.CheckBox();
|
|
||||||
this.chklogEnabled = new System.Windows.Forms.CheckBox();
|
|
||||||
this.cmbloglevel = new System.Windows.Forms.ComboBox();
|
|
||||||
this.label5 = new System.Windows.Forms.Label();
|
|
||||||
this.txtlocalPort = new System.Windows.Forms.TextBox();
|
|
||||||
this.label2 = new System.Windows.Forms.Label();
|
|
||||||
this.tabPage2 = new System.Windows.Forms.TabPage();
|
|
||||||
this.groupBox2 = new System.Windows.Forms.GroupBox();
|
|
||||||
this.tabControl2 = new System.Windows.Forms.TabControl();
|
|
||||||
this.tabPage3 = new System.Windows.Forms.TabPage();
|
|
||||||
this.txtUseragent = new System.Windows.Forms.TextBox();
|
|
||||||
this.tabPage4 = new System.Windows.Forms.TabPage();
|
|
||||||
this.txtUserdirect = new System.Windows.Forms.TextBox();
|
|
||||||
this.tabPage5 = new System.Windows.Forms.TabPage();
|
|
||||||
this.txtUserblock = new System.Windows.Forms.TextBox();
|
|
||||||
this.tabPage8 = new System.Windows.Forms.TabPage();
|
|
||||||
this.cmbroutingMode = new System.Windows.Forms.ComboBox();
|
|
||||||
this.panel3 = new System.Windows.Forms.Panel();
|
|
||||||
this.linkLabelRoutingDoc = new System.Windows.Forms.LinkLabel();
|
|
||||||
this.btnSetDefRountingRule = new System.Windows.Forms.Button();
|
|
||||||
this.labRoutingTips = new System.Windows.Forms.Label();
|
|
||||||
this.cmbdomainStrategy = new System.Windows.Forms.ComboBox();
|
|
||||||
this.tabPage6 = new System.Windows.Forms.TabPage();
|
|
||||||
this.chkKcpcongestion = new System.Windows.Forms.CheckBox();
|
|
||||||
this.txtKcpwriteBufferSize = new System.Windows.Forms.TextBox();
|
|
||||||
this.label10 = new System.Windows.Forms.Label();
|
|
||||||
this.txtKcpreadBufferSize = new System.Windows.Forms.TextBox();
|
|
||||||
this.label11 = new System.Windows.Forms.Label();
|
|
||||||
this.txtKcpdownlinkCapacity = new System.Windows.Forms.TextBox();
|
|
||||||
this.label8 = new System.Windows.Forms.Label();
|
|
||||||
this.txtKcpuplinkCapacity = new System.Windows.Forms.TextBox();
|
|
||||||
this.label9 = new System.Windows.Forms.Label();
|
|
||||||
this.txtKcptti = new System.Windows.Forms.TextBox();
|
|
||||||
this.label7 = new System.Windows.Forms.Label();
|
|
||||||
this.txtKcpmtu = new System.Windows.Forms.TextBox();
|
|
||||||
this.label6 = new System.Windows.Forms.Label();
|
|
||||||
this.tabPage7 = new System.Windows.Forms.TabPage();
|
|
||||||
this.chkKeepOlderDedupl = new System.Windows.Forms.CheckBox();
|
|
||||||
this.cbFreshrate = new System.Windows.Forms.ComboBox();
|
|
||||||
this.lbFreshrate = new System.Windows.Forms.Label();
|
|
||||||
this.chkEnableStatistics = new System.Windows.Forms.CheckBox();
|
|
||||||
this.chkAllowLANConn = new System.Windows.Forms.CheckBox();
|
|
||||||
this.txturlGFWList = new System.Windows.Forms.TextBox();
|
|
||||||
this.label13 = new System.Windows.Forms.Label();
|
|
||||||
this.chkAutoRun = new System.Windows.Forms.CheckBox();
|
|
||||||
this.tabPage9 = new System.Windows.Forms.TabPage();
|
|
||||||
this.txtuserPacRule = new System.Windows.Forms.TextBox();
|
|
||||||
this.panel4 = new System.Windows.Forms.Panel();
|
|
||||||
this.label4 = new System.Windows.Forms.Label();
|
|
||||||
this.panel2 = new System.Windows.Forms.Panel();
|
|
||||||
this.btnOK = new System.Windows.Forms.Button();
|
|
||||||
this.panel1 = new System.Windows.Forms.Panel();
|
|
||||||
this.tabControl1.SuspendLayout();
|
|
||||||
this.tabPage1.SuspendLayout();
|
|
||||||
this.groupBox1.SuspendLayout();
|
|
||||||
this.tabPage2.SuspendLayout();
|
|
||||||
this.groupBox2.SuspendLayout();
|
|
||||||
this.tabControl2.SuspendLayout();
|
|
||||||
this.tabPage3.SuspendLayout();
|
|
||||||
this.tabPage4.SuspendLayout();
|
|
||||||
this.tabPage5.SuspendLayout();
|
|
||||||
this.tabPage8.SuspendLayout();
|
|
||||||
this.panel3.SuspendLayout();
|
|
||||||
this.tabPage6.SuspendLayout();
|
|
||||||
this.tabPage7.SuspendLayout();
|
|
||||||
this.tabPage9.SuspendLayout();
|
|
||||||
this.panel4.SuspendLayout();
|
|
||||||
this.panel2.SuspendLayout();
|
|
||||||
this.SuspendLayout();
|
|
||||||
//
|
|
||||||
// btnClose
|
|
||||||
//
|
|
||||||
this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
|
||||||
resources.ApplyResources(this.btnClose, "btnClose");
|
|
||||||
this.btnClose.Name = "btnClose";
|
|
||||||
this.btnClose.UseVisualStyleBackColor = true;
|
|
||||||
this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
|
|
||||||
//
|
|
||||||
// tabControl1
|
|
||||||
//
|
|
||||||
this.tabControl1.Controls.Add(this.tabPage1);
|
|
||||||
this.tabControl1.Controls.Add(this.tabPage2);
|
|
||||||
this.tabControl1.Controls.Add(this.tabPage6);
|
|
||||||
this.tabControl1.Controls.Add(this.tabPage7);
|
|
||||||
this.tabControl1.Controls.Add(this.tabPage9);
|
|
||||||
resources.ApplyResources(this.tabControl1, "tabControl1");
|
|
||||||
this.tabControl1.Name = "tabControl1";
|
|
||||||
this.tabControl1.SelectedIndex = 0;
|
|
||||||
//
|
|
||||||
// tabPage1
|
|
||||||
//
|
|
||||||
this.tabPage1.Controls.Add(this.groupBox1);
|
|
||||||
resources.ApplyResources(this.tabPage1, "tabPage1");
|
|
||||||
this.tabPage1.Name = "tabPage1";
|
|
||||||
this.tabPage1.UseVisualStyleBackColor = true;
|
|
||||||
//
|
|
||||||
// groupBox1
|
|
||||||
//
|
|
||||||
this.groupBox1.Controls.Add(this.label16);
|
|
||||||
this.groupBox1.Controls.Add(this.cmblistenerType);
|
|
||||||
this.groupBox1.Controls.Add(this.chksniffingEnabled2);
|
|
||||||
this.groupBox1.Controls.Add(this.chksniffingEnabled);
|
|
||||||
this.groupBox1.Controls.Add(this.txtremoteDNS);
|
|
||||||
this.groupBox1.Controls.Add(this.label14);
|
|
||||||
this.groupBox1.Controls.Add(this.chkmuxEnabled);
|
|
||||||
this.groupBox1.Controls.Add(this.chkAllowIn2);
|
|
||||||
this.groupBox1.Controls.Add(this.chkudpEnabled2);
|
|
||||||
this.groupBox1.Controls.Add(this.cmbprotocol2);
|
|
||||||
this.groupBox1.Controls.Add(this.label3);
|
|
||||||
this.groupBox1.Controls.Add(this.txtlocalPort2);
|
|
||||||
this.groupBox1.Controls.Add(this.cmbprotocol);
|
|
||||||
this.groupBox1.Controls.Add(this.label1);
|
|
||||||
this.groupBox1.Controls.Add(this.chkudpEnabled);
|
|
||||||
this.groupBox1.Controls.Add(this.chklogEnabled);
|
|
||||||
this.groupBox1.Controls.Add(this.cmbloglevel);
|
|
||||||
this.groupBox1.Controls.Add(this.label5);
|
|
||||||
this.groupBox1.Controls.Add(this.txtlocalPort);
|
|
||||||
this.groupBox1.Controls.Add(this.label2);
|
|
||||||
resources.ApplyResources(this.groupBox1, "groupBox1");
|
|
||||||
this.groupBox1.Name = "groupBox1";
|
|
||||||
this.groupBox1.TabStop = false;
|
|
||||||
//
|
|
||||||
// label16
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label16, "label16");
|
|
||||||
this.label16.Name = "label16";
|
|
||||||
//
|
|
||||||
// cmblistenerType
|
|
||||||
//
|
|
||||||
this.cmblistenerType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
|
||||||
this.cmblistenerType.FormattingEnabled = true;
|
|
||||||
this.cmblistenerType.Items.AddRange(new object[] {
|
|
||||||
resources.GetString("cmblistenerType.Items"),
|
|
||||||
resources.GetString("cmblistenerType.Items1"),
|
|
||||||
resources.GetString("cmblistenerType.Items2"),
|
|
||||||
resources.GetString("cmblistenerType.Items3"),
|
|
||||||
resources.GetString("cmblistenerType.Items4"),
|
|
||||||
resources.GetString("cmblistenerType.Items5"),
|
|
||||||
resources.GetString("cmblistenerType.Items6")});
|
|
||||||
resources.ApplyResources(this.cmblistenerType, "cmblistenerType");
|
|
||||||
this.cmblistenerType.Name = "cmblistenerType";
|
|
||||||
//
|
|
||||||
// chksniffingEnabled2
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.chksniffingEnabled2, "chksniffingEnabled2");
|
|
||||||
this.chksniffingEnabled2.Name = "chksniffingEnabled2";
|
|
||||||
this.chksniffingEnabled2.UseVisualStyleBackColor = true;
|
|
||||||
//
|
|
||||||
// chksniffingEnabled
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.chksniffingEnabled, "chksniffingEnabled");
|
|
||||||
this.chksniffingEnabled.Name = "chksniffingEnabled";
|
|
||||||
this.chksniffingEnabled.UseVisualStyleBackColor = true;
|
|
||||||
//
|
|
||||||
// txtremoteDNS
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtremoteDNS, "txtremoteDNS");
|
|
||||||
this.txtremoteDNS.Name = "txtremoteDNS";
|
|
||||||
//
|
|
||||||
// label14
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label14, "label14");
|
|
||||||
this.label14.Name = "label14";
|
|
||||||
//
|
|
||||||
// chkmuxEnabled
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.chkmuxEnabled, "chkmuxEnabled");
|
|
||||||
this.chkmuxEnabled.Name = "chkmuxEnabled";
|
|
||||||
this.chkmuxEnabled.UseVisualStyleBackColor = true;
|
|
||||||
//
|
|
||||||
// chkAllowIn2
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.chkAllowIn2, "chkAllowIn2");
|
|
||||||
this.chkAllowIn2.Name = "chkAllowIn2";
|
|
||||||
this.chkAllowIn2.UseVisualStyleBackColor = true;
|
|
||||||
this.chkAllowIn2.CheckedChanged += new System.EventHandler(this.chkAllowIn2_CheckedChanged);
|
|
||||||
//
|
|
||||||
// chkudpEnabled2
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.chkudpEnabled2, "chkudpEnabled2");
|
|
||||||
this.chkudpEnabled2.Name = "chkudpEnabled2";
|
|
||||||
this.chkudpEnabled2.UseVisualStyleBackColor = true;
|
|
||||||
//
|
|
||||||
// cmbprotocol2
|
|
||||||
//
|
|
||||||
this.cmbprotocol2.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
|
||||||
this.cmbprotocol2.FormattingEnabled = true;
|
|
||||||
this.cmbprotocol2.Items.AddRange(new object[] {
|
|
||||||
resources.GetString("cmbprotocol2.Items"),
|
|
||||||
resources.GetString("cmbprotocol2.Items1")});
|
|
||||||
resources.ApplyResources(this.cmbprotocol2, "cmbprotocol2");
|
|
||||||
this.cmbprotocol2.Name = "cmbprotocol2";
|
|
||||||
//
|
|
||||||
// label3
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label3, "label3");
|
|
||||||
this.label3.Name = "label3";
|
|
||||||
//
|
|
||||||
// txtlocalPort2
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtlocalPort2, "txtlocalPort2");
|
|
||||||
this.txtlocalPort2.Name = "txtlocalPort2";
|
|
||||||
//
|
|
||||||
// cmbprotocol
|
|
||||||
//
|
|
||||||
this.cmbprotocol.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
|
||||||
resources.ApplyResources(this.cmbprotocol, "cmbprotocol");
|
|
||||||
this.cmbprotocol.FormattingEnabled = true;
|
|
||||||
this.cmbprotocol.Items.AddRange(new object[] {
|
|
||||||
resources.GetString("cmbprotocol.Items"),
|
|
||||||
resources.GetString("cmbprotocol.Items1")});
|
|
||||||
this.cmbprotocol.Name = "cmbprotocol";
|
|
||||||
//
|
|
||||||
// label1
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label1, "label1");
|
|
||||||
this.label1.Name = "label1";
|
|
||||||
//
|
|
||||||
// chkudpEnabled
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.chkudpEnabled, "chkudpEnabled");
|
|
||||||
this.chkudpEnabled.Name = "chkudpEnabled";
|
|
||||||
this.chkudpEnabled.UseVisualStyleBackColor = true;
|
|
||||||
//
|
|
||||||
// chklogEnabled
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.chklogEnabled, "chklogEnabled");
|
|
||||||
this.chklogEnabled.Name = "chklogEnabled";
|
|
||||||
this.chklogEnabled.UseVisualStyleBackColor = true;
|
|
||||||
//
|
|
||||||
// cmbloglevel
|
|
||||||
//
|
|
||||||
this.cmbloglevel.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
|
||||||
this.cmbloglevel.FormattingEnabled = true;
|
|
||||||
this.cmbloglevel.Items.AddRange(new object[] {
|
|
||||||
resources.GetString("cmbloglevel.Items"),
|
|
||||||
resources.GetString("cmbloglevel.Items1"),
|
|
||||||
resources.GetString("cmbloglevel.Items2"),
|
|
||||||
resources.GetString("cmbloglevel.Items3"),
|
|
||||||
resources.GetString("cmbloglevel.Items4")});
|
|
||||||
resources.ApplyResources(this.cmbloglevel, "cmbloglevel");
|
|
||||||
this.cmbloglevel.Name = "cmbloglevel";
|
|
||||||
//
|
|
||||||
// label5
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label5, "label5");
|
|
||||||
this.label5.Name = "label5";
|
|
||||||
//
|
|
||||||
// txtlocalPort
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtlocalPort, "txtlocalPort");
|
|
||||||
this.txtlocalPort.Name = "txtlocalPort";
|
|
||||||
//
|
|
||||||
// label2
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label2, "label2");
|
|
||||||
this.label2.Name = "label2";
|
|
||||||
//
|
|
||||||
// tabPage2
|
|
||||||
//
|
|
||||||
this.tabPage2.Controls.Add(this.groupBox2);
|
|
||||||
resources.ApplyResources(this.tabPage2, "tabPage2");
|
|
||||||
this.tabPage2.Name = "tabPage2";
|
|
||||||
this.tabPage2.UseVisualStyleBackColor = true;
|
|
||||||
//
|
|
||||||
// groupBox2
|
|
||||||
//
|
|
||||||
this.groupBox2.Controls.Add(this.tabControl2);
|
|
||||||
this.groupBox2.Controls.Add(this.panel3);
|
|
||||||
resources.ApplyResources(this.groupBox2, "groupBox2");
|
|
||||||
this.groupBox2.Name = "groupBox2";
|
|
||||||
this.groupBox2.TabStop = false;
|
|
||||||
//
|
|
||||||
// tabControl2
|
|
||||||
//
|
|
||||||
this.tabControl2.Controls.Add(this.tabPage3);
|
|
||||||
this.tabControl2.Controls.Add(this.tabPage4);
|
|
||||||
this.tabControl2.Controls.Add(this.tabPage5);
|
|
||||||
this.tabControl2.Controls.Add(this.tabPage8);
|
|
||||||
resources.ApplyResources(this.tabControl2, "tabControl2");
|
|
||||||
this.tabControl2.Name = "tabControl2";
|
|
||||||
this.tabControl2.SelectedIndex = 0;
|
|
||||||
//
|
|
||||||
// tabPage3
|
|
||||||
//
|
|
||||||
this.tabPage3.Controls.Add(this.txtUseragent);
|
|
||||||
resources.ApplyResources(this.tabPage3, "tabPage3");
|
|
||||||
this.tabPage3.Name = "tabPage3";
|
|
||||||
this.tabPage3.UseVisualStyleBackColor = true;
|
|
||||||
//
|
|
||||||
// txtUseragent
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtUseragent, "txtUseragent");
|
|
||||||
this.txtUseragent.Name = "txtUseragent";
|
|
||||||
//
|
|
||||||
// tabPage4
|
|
||||||
//
|
|
||||||
this.tabPage4.Controls.Add(this.txtUserdirect);
|
|
||||||
resources.ApplyResources(this.tabPage4, "tabPage4");
|
|
||||||
this.tabPage4.Name = "tabPage4";
|
|
||||||
this.tabPage4.UseVisualStyleBackColor = true;
|
|
||||||
//
|
|
||||||
// txtUserdirect
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtUserdirect, "txtUserdirect");
|
|
||||||
this.txtUserdirect.Name = "txtUserdirect";
|
|
||||||
//
|
|
||||||
// tabPage5
|
|
||||||
//
|
|
||||||
this.tabPage5.Controls.Add(this.txtUserblock);
|
|
||||||
resources.ApplyResources(this.tabPage5, "tabPage5");
|
|
||||||
this.tabPage5.Name = "tabPage5";
|
|
||||||
this.tabPage5.UseVisualStyleBackColor = true;
|
|
||||||
//
|
|
||||||
// txtUserblock
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtUserblock, "txtUserblock");
|
|
||||||
this.txtUserblock.Name = "txtUserblock";
|
|
||||||
//
|
|
||||||
// tabPage8
|
|
||||||
//
|
|
||||||
this.tabPage8.Controls.Add(this.cmbroutingMode);
|
|
||||||
resources.ApplyResources(this.tabPage8, "tabPage8");
|
|
||||||
this.tabPage8.Name = "tabPage8";
|
|
||||||
this.tabPage8.UseVisualStyleBackColor = true;
|
|
||||||
//
|
|
||||||
// cmbroutingMode
|
|
||||||
//
|
|
||||||
this.cmbroutingMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
|
||||||
this.cmbroutingMode.FormattingEnabled = true;
|
|
||||||
this.cmbroutingMode.Items.AddRange(new object[] {
|
|
||||||
resources.GetString("cmbroutingMode.Items"),
|
|
||||||
resources.GetString("cmbroutingMode.Items1"),
|
|
||||||
resources.GetString("cmbroutingMode.Items2"),
|
|
||||||
resources.GetString("cmbroutingMode.Items3")});
|
|
||||||
resources.ApplyResources(this.cmbroutingMode, "cmbroutingMode");
|
|
||||||
this.cmbroutingMode.Name = "cmbroutingMode";
|
|
||||||
//
|
|
||||||
// panel3
|
|
||||||
//
|
|
||||||
this.panel3.Controls.Add(this.linkLabelRoutingDoc);
|
|
||||||
this.panel3.Controls.Add(this.btnSetDefRountingRule);
|
|
||||||
this.panel3.Controls.Add(this.labRoutingTips);
|
|
||||||
this.panel3.Controls.Add(this.cmbdomainStrategy);
|
|
||||||
resources.ApplyResources(this.panel3, "panel3");
|
|
||||||
this.panel3.Name = "panel3";
|
|
||||||
//
|
|
||||||
// linkLabelRoutingDoc
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.linkLabelRoutingDoc, "linkLabelRoutingDoc");
|
|
||||||
this.linkLabelRoutingDoc.Name = "linkLabelRoutingDoc";
|
|
||||||
this.linkLabelRoutingDoc.TabStop = true;
|
|
||||||
this.linkLabelRoutingDoc.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.linkLabelRoutingDoc_LinkClicked);
|
|
||||||
//
|
|
||||||
// btnSetDefRountingRule
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.btnSetDefRountingRule, "btnSetDefRountingRule");
|
|
||||||
this.btnSetDefRountingRule.Name = "btnSetDefRountingRule";
|
|
||||||
this.btnSetDefRountingRule.UseVisualStyleBackColor = true;
|
|
||||||
this.btnSetDefRountingRule.Click += new System.EventHandler(this.btnSetDefRountingRule_Click);
|
|
||||||
//
|
|
||||||
// labRoutingTips
|
|
||||||
//
|
|
||||||
this.labRoutingTips.ForeColor = System.Drawing.Color.Brown;
|
|
||||||
resources.ApplyResources(this.labRoutingTips, "labRoutingTips");
|
|
||||||
this.labRoutingTips.Name = "labRoutingTips";
|
|
||||||
//
|
|
||||||
// cmbdomainStrategy
|
|
||||||
//
|
|
||||||
this.cmbdomainStrategy.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
|
||||||
this.cmbdomainStrategy.FormattingEnabled = true;
|
|
||||||
this.cmbdomainStrategy.Items.AddRange(new object[] {
|
|
||||||
resources.GetString("cmbdomainStrategy.Items"),
|
|
||||||
resources.GetString("cmbdomainStrategy.Items1"),
|
|
||||||
resources.GetString("cmbdomainStrategy.Items2")});
|
|
||||||
resources.ApplyResources(this.cmbdomainStrategy, "cmbdomainStrategy");
|
|
||||||
this.cmbdomainStrategy.Name = "cmbdomainStrategy";
|
|
||||||
//
|
|
||||||
// tabPage6
|
|
||||||
//
|
|
||||||
this.tabPage6.Controls.Add(this.chkKcpcongestion);
|
|
||||||
this.tabPage6.Controls.Add(this.txtKcpwriteBufferSize);
|
|
||||||
this.tabPage6.Controls.Add(this.label10);
|
|
||||||
this.tabPage6.Controls.Add(this.txtKcpreadBufferSize);
|
|
||||||
this.tabPage6.Controls.Add(this.label11);
|
|
||||||
this.tabPage6.Controls.Add(this.txtKcpdownlinkCapacity);
|
|
||||||
this.tabPage6.Controls.Add(this.label8);
|
|
||||||
this.tabPage6.Controls.Add(this.txtKcpuplinkCapacity);
|
|
||||||
this.tabPage6.Controls.Add(this.label9);
|
|
||||||
this.tabPage6.Controls.Add(this.txtKcptti);
|
|
||||||
this.tabPage6.Controls.Add(this.label7);
|
|
||||||
this.tabPage6.Controls.Add(this.txtKcpmtu);
|
|
||||||
this.tabPage6.Controls.Add(this.label6);
|
|
||||||
resources.ApplyResources(this.tabPage6, "tabPage6");
|
|
||||||
this.tabPage6.Name = "tabPage6";
|
|
||||||
this.tabPage6.UseVisualStyleBackColor = true;
|
|
||||||
//
|
|
||||||
// chkKcpcongestion
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.chkKcpcongestion, "chkKcpcongestion");
|
|
||||||
this.chkKcpcongestion.Name = "chkKcpcongestion";
|
|
||||||
this.chkKcpcongestion.UseVisualStyleBackColor = true;
|
|
||||||
//
|
|
||||||
// txtKcpwriteBufferSize
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtKcpwriteBufferSize, "txtKcpwriteBufferSize");
|
|
||||||
this.txtKcpwriteBufferSize.Name = "txtKcpwriteBufferSize";
|
|
||||||
//
|
|
||||||
// label10
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label10, "label10");
|
|
||||||
this.label10.Name = "label10";
|
|
||||||
//
|
|
||||||
// txtKcpreadBufferSize
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtKcpreadBufferSize, "txtKcpreadBufferSize");
|
|
||||||
this.txtKcpreadBufferSize.Name = "txtKcpreadBufferSize";
|
|
||||||
//
|
|
||||||
// label11
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label11, "label11");
|
|
||||||
this.label11.Name = "label11";
|
|
||||||
//
|
|
||||||
// txtKcpdownlinkCapacity
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtKcpdownlinkCapacity, "txtKcpdownlinkCapacity");
|
|
||||||
this.txtKcpdownlinkCapacity.Name = "txtKcpdownlinkCapacity";
|
|
||||||
//
|
|
||||||
// label8
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label8, "label8");
|
|
||||||
this.label8.Name = "label8";
|
|
||||||
//
|
|
||||||
// txtKcpuplinkCapacity
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtKcpuplinkCapacity, "txtKcpuplinkCapacity");
|
|
||||||
this.txtKcpuplinkCapacity.Name = "txtKcpuplinkCapacity";
|
|
||||||
//
|
|
||||||
// label9
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label9, "label9");
|
|
||||||
this.label9.Name = "label9";
|
|
||||||
//
|
|
||||||
// txtKcptti
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtKcptti, "txtKcptti");
|
|
||||||
this.txtKcptti.Name = "txtKcptti";
|
|
||||||
//
|
|
||||||
// label7
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label7, "label7");
|
|
||||||
this.label7.Name = "label7";
|
|
||||||
//
|
|
||||||
// txtKcpmtu
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtKcpmtu, "txtKcpmtu");
|
|
||||||
this.txtKcpmtu.Name = "txtKcpmtu";
|
|
||||||
//
|
|
||||||
// label6
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label6, "label6");
|
|
||||||
this.label6.Name = "label6";
|
|
||||||
//
|
|
||||||
// tabPage7
|
|
||||||
//
|
|
||||||
this.tabPage7.Controls.Add(this.chkKeepOlderDedupl);
|
|
||||||
this.tabPage7.Controls.Add(this.cbFreshrate);
|
|
||||||
this.tabPage7.Controls.Add(this.lbFreshrate);
|
|
||||||
this.tabPage7.Controls.Add(this.chkEnableStatistics);
|
|
||||||
this.tabPage7.Controls.Add(this.chkAllowLANConn);
|
|
||||||
this.tabPage7.Controls.Add(this.txturlGFWList);
|
|
||||||
this.tabPage7.Controls.Add(this.label13);
|
|
||||||
this.tabPage7.Controls.Add(this.chkAutoRun);
|
|
||||||
resources.ApplyResources(this.tabPage7, "tabPage7");
|
|
||||||
this.tabPage7.Name = "tabPage7";
|
|
||||||
this.tabPage7.UseVisualStyleBackColor = true;
|
|
||||||
//
|
|
||||||
// chkKeepOlderDedupl
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.chkKeepOlderDedupl, "chkKeepOlderDedupl");
|
|
||||||
this.chkKeepOlderDedupl.Name = "chkKeepOlderDedupl";
|
|
||||||
this.chkKeepOlderDedupl.UseVisualStyleBackColor = true;
|
|
||||||
//
|
|
||||||
// cbFreshrate
|
|
||||||
//
|
|
||||||
this.cbFreshrate.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
|
|
||||||
this.cbFreshrate.FormattingEnabled = true;
|
|
||||||
resources.ApplyResources(this.cbFreshrate, "cbFreshrate");
|
|
||||||
this.cbFreshrate.Name = "cbFreshrate";
|
|
||||||
//
|
|
||||||
// lbFreshrate
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.lbFreshrate, "lbFreshrate");
|
|
||||||
this.lbFreshrate.Name = "lbFreshrate";
|
|
||||||
//
|
|
||||||
// chkEnableStatistics
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.chkEnableStatistics, "chkEnableStatistics");
|
|
||||||
this.chkEnableStatistics.Name = "chkEnableStatistics";
|
|
||||||
this.chkEnableStatistics.UseVisualStyleBackColor = true;
|
|
||||||
//
|
|
||||||
// chkAllowLANConn
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.chkAllowLANConn, "chkAllowLANConn");
|
|
||||||
this.chkAllowLANConn.Name = "chkAllowLANConn";
|
|
||||||
this.chkAllowLANConn.UseVisualStyleBackColor = true;
|
|
||||||
//
|
|
||||||
// txturlGFWList
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txturlGFWList, "txturlGFWList");
|
|
||||||
this.txturlGFWList.Name = "txturlGFWList";
|
|
||||||
//
|
|
||||||
// label13
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label13, "label13");
|
|
||||||
this.label13.Name = "label13";
|
|
||||||
//
|
|
||||||
// chkAutoRun
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.chkAutoRun, "chkAutoRun");
|
|
||||||
this.chkAutoRun.Name = "chkAutoRun";
|
|
||||||
this.chkAutoRun.UseVisualStyleBackColor = true;
|
|
||||||
//
|
|
||||||
// tabPage9
|
|
||||||
//
|
|
||||||
this.tabPage9.Controls.Add(this.txtuserPacRule);
|
|
||||||
this.tabPage9.Controls.Add(this.panel4);
|
|
||||||
resources.ApplyResources(this.tabPage9, "tabPage9");
|
|
||||||
this.tabPage9.Name = "tabPage9";
|
|
||||||
this.tabPage9.UseVisualStyleBackColor = true;
|
|
||||||
//
|
|
||||||
// txtuserPacRule
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtuserPacRule, "txtuserPacRule");
|
|
||||||
this.txtuserPacRule.Name = "txtuserPacRule";
|
|
||||||
//
|
|
||||||
// panel4
|
|
||||||
//
|
|
||||||
this.panel4.Controls.Add(this.label4);
|
|
||||||
resources.ApplyResources(this.panel4, "panel4");
|
|
||||||
this.panel4.Name = "panel4";
|
|
||||||
//
|
|
||||||
// label4
|
|
||||||
//
|
|
||||||
this.label4.ForeColor = System.Drawing.Color.Brown;
|
|
||||||
resources.ApplyResources(this.label4, "label4");
|
|
||||||
this.label4.Name = "label4";
|
|
||||||
//
|
|
||||||
// panel2
|
|
||||||
//
|
|
||||||
this.panel2.Controls.Add(this.btnClose);
|
|
||||||
this.panel2.Controls.Add(this.btnOK);
|
|
||||||
resources.ApplyResources(this.panel2, "panel2");
|
|
||||||
this.panel2.Name = "panel2";
|
|
||||||
//
|
|
||||||
// btnOK
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.btnOK, "btnOK");
|
|
||||||
this.btnOK.Name = "btnOK";
|
|
||||||
this.btnOK.UseVisualStyleBackColor = true;
|
|
||||||
this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
|
|
||||||
//
|
|
||||||
// panel1
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.panel1, "panel1");
|
|
||||||
this.panel1.Name = "panel1";
|
|
||||||
//
|
|
||||||
// OptionSettingForm
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this, "$this");
|
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
|
||||||
this.CancelButton = this.btnClose;
|
|
||||||
this.Controls.Add(this.tabControl1);
|
|
||||||
this.Controls.Add(this.panel2);
|
|
||||||
this.Controls.Add(this.panel1);
|
|
||||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
|
|
||||||
this.Name = "OptionSettingForm";
|
|
||||||
this.Load += new System.EventHandler(this.OptionSettingForm_Load);
|
|
||||||
this.tabControl1.ResumeLayout(false);
|
|
||||||
this.tabPage1.ResumeLayout(false);
|
|
||||||
this.groupBox1.ResumeLayout(false);
|
|
||||||
this.groupBox1.PerformLayout();
|
|
||||||
this.tabPage2.ResumeLayout(false);
|
|
||||||
this.groupBox2.ResumeLayout(false);
|
|
||||||
this.tabControl2.ResumeLayout(false);
|
|
||||||
this.tabPage3.ResumeLayout(false);
|
|
||||||
this.tabPage3.PerformLayout();
|
|
||||||
this.tabPage4.ResumeLayout(false);
|
|
||||||
this.tabPage4.PerformLayout();
|
|
||||||
this.tabPage5.ResumeLayout(false);
|
|
||||||
this.tabPage5.PerformLayout();
|
|
||||||
this.tabPage8.ResumeLayout(false);
|
|
||||||
this.panel3.ResumeLayout(false);
|
|
||||||
this.panel3.PerformLayout();
|
|
||||||
this.tabPage6.ResumeLayout(false);
|
|
||||||
this.tabPage6.PerformLayout();
|
|
||||||
this.tabPage7.ResumeLayout(false);
|
|
||||||
this.tabPage7.PerformLayout();
|
|
||||||
this.tabPage9.ResumeLayout(false);
|
|
||||||
this.tabPage9.PerformLayout();
|
|
||||||
this.panel4.ResumeLayout(false);
|
|
||||||
this.panel2.ResumeLayout(false);
|
|
||||||
this.ResumeLayout(false);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
private System.Windows.Forms.Button btnClose;
|
|
||||||
private System.Windows.Forms.Button btnOK;
|
|
||||||
private System.Windows.Forms.GroupBox groupBox1;
|
|
||||||
private System.Windows.Forms.ComboBox cmbloglevel;
|
|
||||||
private System.Windows.Forms.Label label5;
|
|
||||||
private System.Windows.Forms.TextBox txtlocalPort;
|
|
||||||
private System.Windows.Forms.Label label2;
|
|
||||||
private System.Windows.Forms.CheckBox chklogEnabled;
|
|
||||||
private System.Windows.Forms.CheckBox chkudpEnabled;
|
|
||||||
private System.Windows.Forms.Panel panel1;
|
|
||||||
private System.Windows.Forms.TabControl tabControl1;
|
|
||||||
private System.Windows.Forms.TabPage tabPage1;
|
|
||||||
private System.Windows.Forms.TabPage tabPage2;
|
|
||||||
private System.Windows.Forms.Panel panel2;
|
|
||||||
private System.Windows.Forms.GroupBox groupBox2;
|
|
||||||
private System.Windows.Forms.ComboBox cmbprotocol;
|
|
||||||
private System.Windows.Forms.Label label1;
|
|
||||||
private System.Windows.Forms.ComboBox cmbprotocol2;
|
|
||||||
private System.Windows.Forms.Label label3;
|
|
||||||
private System.Windows.Forms.TextBox txtlocalPort2;
|
|
||||||
private System.Windows.Forms.CheckBox chkudpEnabled2;
|
|
||||||
private System.Windows.Forms.CheckBox chkAllowIn2;
|
|
||||||
private System.Windows.Forms.CheckBox chkmuxEnabled;
|
|
||||||
private System.Windows.Forms.TabControl tabControl2;
|
|
||||||
private System.Windows.Forms.TabPage tabPage3;
|
|
||||||
private System.Windows.Forms.TabPage tabPage4;
|
|
||||||
private System.Windows.Forms.Label labRoutingTips;
|
|
||||||
private System.Windows.Forms.TextBox txtUseragent;
|
|
||||||
private System.Windows.Forms.TabPage tabPage5;
|
|
||||||
private System.Windows.Forms.TextBox txtUserdirect;
|
|
||||||
private System.Windows.Forms.TextBox txtUserblock;
|
|
||||||
private System.Windows.Forms.TabPage tabPage6;
|
|
||||||
private System.Windows.Forms.TextBox txtKcpmtu;
|
|
||||||
private System.Windows.Forms.Label label6;
|
|
||||||
private System.Windows.Forms.TextBox txtKcptti;
|
|
||||||
private System.Windows.Forms.Label label7;
|
|
||||||
private System.Windows.Forms.TextBox txtKcpwriteBufferSize;
|
|
||||||
private System.Windows.Forms.Label label10;
|
|
||||||
private System.Windows.Forms.TextBox txtKcpreadBufferSize;
|
|
||||||
private System.Windows.Forms.Label label11;
|
|
||||||
private System.Windows.Forms.TextBox txtKcpdownlinkCapacity;
|
|
||||||
private System.Windows.Forms.Label label8;
|
|
||||||
private System.Windows.Forms.TextBox txtKcpuplinkCapacity;
|
|
||||||
private System.Windows.Forms.Label label9;
|
|
||||||
private System.Windows.Forms.CheckBox chkKcpcongestion;
|
|
||||||
private System.Windows.Forms.TabPage tabPage7;
|
|
||||||
private System.Windows.Forms.CheckBox chkAutoRun;
|
|
||||||
private System.Windows.Forms.Label label13;
|
|
||||||
private System.Windows.Forms.TextBox txturlGFWList;
|
|
||||||
private System.Windows.Forms.CheckBox chkAllowLANConn;
|
|
||||||
private System.Windows.Forms.TextBox txtremoteDNS;
|
|
||||||
private System.Windows.Forms.Label label14;
|
|
||||||
private System.Windows.Forms.Panel panel3;
|
|
||||||
private System.Windows.Forms.ComboBox cmbdomainStrategy;
|
|
||||||
private System.Windows.Forms.ComboBox cmbroutingMode;
|
|
||||||
private System.Windows.Forms.CheckBox chksniffingEnabled;
|
|
||||||
private System.Windows.Forms.CheckBox chksniffingEnabled2;
|
|
||||||
private System.Windows.Forms.Button btnSetDefRountingRule;
|
|
||||||
private System.Windows.Forms.CheckBox chkEnableStatistics;
|
|
||||||
private System.Windows.Forms.ComboBox cbFreshrate;
|
|
||||||
private System.Windows.Forms.Label lbFreshrate;
|
|
||||||
private System.Windows.Forms.Label label16;
|
|
||||||
private System.Windows.Forms.ComboBox cmblistenerType;
|
|
||||||
private System.Windows.Forms.TabPage tabPage8;
|
|
||||||
private System.Windows.Forms.TabPage tabPage9;
|
|
||||||
private System.Windows.Forms.TextBox txtuserPacRule;
|
|
||||||
private System.Windows.Forms.Panel panel4;
|
|
||||||
private System.Windows.Forms.Label label4;
|
|
||||||
private System.Windows.Forms.CheckBox chkKeepOlderDedupl;
|
|
||||||
private System.Windows.Forms.LinkLabel linkLabelRoutingDoc;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,458 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
using v2rayN.Handler;
|
|
||||||
using v2rayN.Base;
|
|
||||||
using v2rayN.HttpProxyHandler;
|
|
||||||
|
|
||||||
namespace v2rayN.Forms
|
|
||||||
{
|
|
||||||
public partial class OptionSettingForm : BaseForm
|
|
||||||
{
|
|
||||||
public OptionSettingForm()
|
|
||||||
{
|
|
||||||
InitializeComponent();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void OptionSettingForm_Load(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
InitBase();
|
|
||||||
|
|
||||||
InitRouting();
|
|
||||||
|
|
||||||
InitKCP();
|
|
||||||
|
|
||||||
InitGUI();
|
|
||||||
|
|
||||||
InitUserPAC();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 初始化基础设置
|
|
||||||
/// </summary>
|
|
||||||
private void InitBase()
|
|
||||||
{
|
|
||||||
//日志
|
|
||||||
chklogEnabled.Checked = config.logEnabled;
|
|
||||||
cmbloglevel.Text = config.loglevel;
|
|
||||||
|
|
||||||
//Mux
|
|
||||||
chkmuxEnabled.Checked = config.muxEnabled;
|
|
||||||
|
|
||||||
//本地监听
|
|
||||||
if (config.inbound.Count > 0)
|
|
||||||
{
|
|
||||||
txtlocalPort.Text = config.inbound[0].localPort.ToString();
|
|
||||||
cmbprotocol.Text = config.inbound[0].protocol.ToString();
|
|
||||||
chkudpEnabled.Checked = config.inbound[0].udpEnabled;
|
|
||||||
chksniffingEnabled.Checked = config.inbound[0].sniffingEnabled;
|
|
||||||
|
|
||||||
txtlocalPort2.Text = $"{config.inbound[0].localPort + 1}";
|
|
||||||
cmbprotocol2.Text = Global.InboundHttp;
|
|
||||||
|
|
||||||
if (config.inbound.Count > 1)
|
|
||||||
{
|
|
||||||
txtlocalPort2.Text = config.inbound[1].localPort.ToString();
|
|
||||||
cmbprotocol2.Text = config.inbound[1].protocol.ToString();
|
|
||||||
chkudpEnabled2.Checked = config.inbound[1].udpEnabled;
|
|
||||||
chksniffingEnabled2.Checked = config.inbound[1].sniffingEnabled;
|
|
||||||
chkAllowIn2.Checked = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
chkAllowIn2.Checked = false;
|
|
||||||
}
|
|
||||||
chkAllowIn2State();
|
|
||||||
}
|
|
||||||
|
|
||||||
//remoteDNS
|
|
||||||
txtremoteDNS.Text = config.remoteDNS;
|
|
||||||
|
|
||||||
cmblistenerType.SelectedIndex = (int)config.listenerType;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 初始化路由设置
|
|
||||||
/// </summary>
|
|
||||||
private void InitRouting()
|
|
||||||
{
|
|
||||||
//路由
|
|
||||||
cmbdomainStrategy.Text = config.domainStrategy;
|
|
||||||
int.TryParse(config.routingMode, out int routingMode);
|
|
||||||
cmbroutingMode.SelectedIndex = routingMode;
|
|
||||||
|
|
||||||
txtUseragent.Text = Utils.List2String(config.useragent, true);
|
|
||||||
txtUserdirect.Text = Utils.List2String(config.userdirect, true);
|
|
||||||
txtUserblock.Text = Utils.List2String(config.userblock, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 初始化KCP设置
|
|
||||||
/// </summary>
|
|
||||||
private void InitKCP()
|
|
||||||
{
|
|
||||||
txtKcpmtu.Text = config.kcpItem.mtu.ToString();
|
|
||||||
txtKcptti.Text = config.kcpItem.tti.ToString();
|
|
||||||
txtKcpuplinkCapacity.Text = config.kcpItem.uplinkCapacity.ToString();
|
|
||||||
txtKcpdownlinkCapacity.Text = config.kcpItem.downlinkCapacity.ToString();
|
|
||||||
txtKcpreadBufferSize.Text = config.kcpItem.readBufferSize.ToString();
|
|
||||||
txtKcpwriteBufferSize.Text = config.kcpItem.writeBufferSize.ToString();
|
|
||||||
chkKcpcongestion.Checked = config.kcpItem.congestion;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 初始化v2rayN GUI设置
|
|
||||||
/// </summary>
|
|
||||||
private void InitGUI()
|
|
||||||
{
|
|
||||||
//开机自动启动
|
|
||||||
chkAutoRun.Checked = Utils.IsAutoRun();
|
|
||||||
|
|
||||||
//自定义GFWList
|
|
||||||
txturlGFWList.Text = config.urlGFWList;
|
|
||||||
|
|
||||||
chkAllowLANConn.Checked = config.allowLANConn;
|
|
||||||
chkEnableStatistics.Checked = config.enableStatistics;
|
|
||||||
chkKeepOlderDedupl.Checked = config.keepOlderDedupl;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ComboItem[] cbSource = new ComboItem[]
|
|
||||||
{
|
|
||||||
new ComboItem{ID = (int)Global.StatisticsFreshRate.quick, Text = UIRes.I18N("QuickFresh")},
|
|
||||||
new ComboItem{ID = (int)Global.StatisticsFreshRate.medium, Text = UIRes.I18N("MediumFresh")},
|
|
||||||
new ComboItem{ID = (int)Global.StatisticsFreshRate.slow, Text = UIRes.I18N("SlowFresh")},
|
|
||||||
};
|
|
||||||
cbFreshrate.DataSource = cbSource;
|
|
||||||
|
|
||||||
cbFreshrate.DisplayMember = "Text";
|
|
||||||
cbFreshrate.ValueMember = "ID";
|
|
||||||
|
|
||||||
switch (config.statisticsFreshRate)
|
|
||||||
{
|
|
||||||
case (int)Global.StatisticsFreshRate.quick:
|
|
||||||
cbFreshrate.SelectedItem = cbSource[0];
|
|
||||||
break;
|
|
||||||
case (int)Global.StatisticsFreshRate.medium:
|
|
||||||
cbFreshrate.SelectedItem = cbSource[1];
|
|
||||||
break;
|
|
||||||
case (int)Global.StatisticsFreshRate.slow:
|
|
||||||
cbFreshrate.SelectedItem = cbSource[2];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
private void InitUserPAC()
|
|
||||||
{
|
|
||||||
txtuserPacRule.Text = Utils.List2String(config.userPacRule, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void btnOK_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
if (SaveBase() != 0)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (SaveRouting() != 0)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (SaveKCP() != 0)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (SaveGUI() != 0)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (SaveUserPAC() != 0)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ConfigHandler.SaveConfig(ref config) == 0)
|
|
||||||
{
|
|
||||||
this.DialogResult = DialogResult.OK;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UI.ShowWarning(UIRes.I18N("OperationFailed"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 保存基础设置
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
private int SaveBase()
|
|
||||||
{
|
|
||||||
//日志
|
|
||||||
bool logEnabled = chklogEnabled.Checked;
|
|
||||||
string loglevel = cmbloglevel.Text.TrimEx();
|
|
||||||
|
|
||||||
//Mux
|
|
||||||
bool muxEnabled = chkmuxEnabled.Checked;
|
|
||||||
|
|
||||||
//本地监听
|
|
||||||
string localPort = txtlocalPort.Text.TrimEx();
|
|
||||||
string protocol = cmbprotocol.Text.TrimEx();
|
|
||||||
bool udpEnabled = chkudpEnabled.Checked;
|
|
||||||
bool sniffingEnabled = chksniffingEnabled.Checked;
|
|
||||||
if (Utils.IsNullOrEmpty(localPort) || !Utils.IsNumberic(localPort))
|
|
||||||
{
|
|
||||||
UI.Show(UIRes.I18N("FillLocalListeningPort"));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (Utils.IsNullOrEmpty(protocol))
|
|
||||||
{
|
|
||||||
UI.Show(UIRes.I18N("PleaseSelectProtocol"));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
config.inbound[0].localPort = Utils.ToInt(localPort);
|
|
||||||
config.inbound[0].protocol = protocol;
|
|
||||||
config.inbound[0].udpEnabled = udpEnabled;
|
|
||||||
config.inbound[0].sniffingEnabled = sniffingEnabled;
|
|
||||||
|
|
||||||
//本地监听2
|
|
||||||
string localPort2 = txtlocalPort2.Text.TrimEx();
|
|
||||||
string protocol2 = cmbprotocol2.Text.TrimEx();
|
|
||||||
bool udpEnabled2 = chkudpEnabled2.Checked;
|
|
||||||
bool sniffingEnabled2 = chksniffingEnabled2.Checked;
|
|
||||||
if (chkAllowIn2.Checked)
|
|
||||||
{
|
|
||||||
if (Utils.IsNullOrEmpty(localPort2) || !Utils.IsNumberic(localPort2))
|
|
||||||
{
|
|
||||||
UI.Show(UIRes.I18N("FillLocalListeningPort"));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (Utils.IsNullOrEmpty(protocol2))
|
|
||||||
{
|
|
||||||
UI.Show(UIRes.I18N("PleaseSelectProtocol"));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (config.inbound.Count < 2)
|
|
||||||
{
|
|
||||||
config.inbound.Add(new Mode.InItem());
|
|
||||||
}
|
|
||||||
config.inbound[1].localPort = Utils.ToInt(localPort2);
|
|
||||||
config.inbound[1].protocol = protocol2;
|
|
||||||
config.inbound[1].udpEnabled = udpEnabled2;
|
|
||||||
config.inbound[1].sniffingEnabled = sniffingEnabled2;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (config.inbound.Count > 1)
|
|
||||||
{
|
|
||||||
config.inbound.RemoveAt(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//日志
|
|
||||||
config.logEnabled = logEnabled;
|
|
||||||
config.loglevel = loglevel;
|
|
||||||
|
|
||||||
//Mux
|
|
||||||
config.muxEnabled = muxEnabled;
|
|
||||||
|
|
||||||
//remoteDNS
|
|
||||||
config.remoteDNS = txtremoteDNS.Text.TrimEx();
|
|
||||||
|
|
||||||
config.listenerType = (ListenerType)Enum.ToObject(typeof(ListenerType), cmblistenerType.SelectedIndex);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 保存路由设置
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
private int SaveRouting()
|
|
||||||
{
|
|
||||||
//路由
|
|
||||||
string domainStrategy = cmbdomainStrategy.Text;
|
|
||||||
string routingMode = cmbroutingMode.SelectedIndex.ToString();
|
|
||||||
|
|
||||||
string useragent = txtUseragent.Text.TrimEx();
|
|
||||||
string userdirect = txtUserdirect.Text.TrimEx();
|
|
||||||
string userblock = txtUserblock.Text.TrimEx();
|
|
||||||
|
|
||||||
config.domainStrategy = domainStrategy;
|
|
||||||
config.routingMode = routingMode;
|
|
||||||
|
|
||||||
config.useragent = Utils.String2List(useragent);
|
|
||||||
config.userdirect = Utils.String2List(userdirect);
|
|
||||||
config.userblock = Utils.String2List(userblock);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 保存KCP设置
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
private int SaveKCP()
|
|
||||||
{
|
|
||||||
string mtu = txtKcpmtu.Text.TrimEx();
|
|
||||||
string tti = txtKcptti.Text.TrimEx();
|
|
||||||
string uplinkCapacity = txtKcpuplinkCapacity.Text.TrimEx();
|
|
||||||
string downlinkCapacity = txtKcpdownlinkCapacity.Text.TrimEx();
|
|
||||||
string readBufferSize = txtKcpreadBufferSize.Text.TrimEx();
|
|
||||||
string writeBufferSize = txtKcpwriteBufferSize.Text.TrimEx();
|
|
||||||
bool congestion = chkKcpcongestion.Checked;
|
|
||||||
|
|
||||||
if (Utils.IsNullOrEmpty(mtu) || !Utils.IsNumberic(mtu)
|
|
||||||
|| Utils.IsNullOrEmpty(tti) || !Utils.IsNumberic(tti)
|
|
||||||
|| Utils.IsNullOrEmpty(uplinkCapacity) || !Utils.IsNumberic(uplinkCapacity)
|
|
||||||
|| Utils.IsNullOrEmpty(downlinkCapacity) || !Utils.IsNumberic(downlinkCapacity)
|
|
||||||
|| Utils.IsNullOrEmpty(readBufferSize) || !Utils.IsNumberic(readBufferSize)
|
|
||||||
|| Utils.IsNullOrEmpty(writeBufferSize) || !Utils.IsNumberic(writeBufferSize))
|
|
||||||
{
|
|
||||||
UI.Show(UIRes.I18N("FillKcpParameters"));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
config.kcpItem.mtu = Utils.ToInt(mtu);
|
|
||||||
config.kcpItem.tti = Utils.ToInt(tti);
|
|
||||||
config.kcpItem.uplinkCapacity = Utils.ToInt(uplinkCapacity);
|
|
||||||
config.kcpItem.downlinkCapacity = Utils.ToInt(downlinkCapacity);
|
|
||||||
config.kcpItem.readBufferSize = Utils.ToInt(readBufferSize);
|
|
||||||
config.kcpItem.writeBufferSize = Utils.ToInt(writeBufferSize);
|
|
||||||
config.kcpItem.congestion = congestion;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 保存GUI设置
|
|
||||||
/// </summary>
|
|
||||||
/// <returns></returns>
|
|
||||||
private int SaveGUI()
|
|
||||||
{
|
|
||||||
//开机自动启动
|
|
||||||
Utils.SetAutoRun(chkAutoRun.Checked);
|
|
||||||
|
|
||||||
//自定义GFWList
|
|
||||||
config.urlGFWList = txturlGFWList.Text.TrimEx();
|
|
||||||
|
|
||||||
config.allowLANConn = chkAllowLANConn.Checked;
|
|
||||||
|
|
||||||
bool lastEnableStatistics = config.enableStatistics;
|
|
||||||
config.enableStatistics = chkEnableStatistics.Checked;
|
|
||||||
config.statisticsFreshRate = (int)cbFreshrate.SelectedValue;
|
|
||||||
config.keepOlderDedupl = chkKeepOlderDedupl.Checked;
|
|
||||||
|
|
||||||
//if(lastEnableStatistics != config.enableStatistics)
|
|
||||||
//{
|
|
||||||
// /// https://stackoverflow.com/questions/779405/how-do-i-restart-my-c-sharp-winform-application
|
|
||||||
// // Shut down the current app instance.
|
|
||||||
// Application.Exit();
|
|
||||||
|
|
||||||
// // Restart the app passing "/restart [processId]" as cmd line args
|
|
||||||
// Process.Start(Application.ExecutablePath, "/restart " + Process.GetCurrentProcess().Id);
|
|
||||||
//}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
private int SaveUserPAC()
|
|
||||||
{
|
|
||||||
string userPacRule = txtuserPacRule.Text.TrimEx();
|
|
||||||
userPacRule = userPacRule.Replace("\"", "");
|
|
||||||
|
|
||||||
config.userPacRule = Utils.String2List(userPacRule);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
private void btnClose_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
this.DialogResult = DialogResult.Cancel;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void chkAllowIn2_CheckedChanged(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
chkAllowIn2State();
|
|
||||||
}
|
|
||||||
private void chkAllowIn2State()
|
|
||||||
{
|
|
||||||
bool blAllow2 = chkAllowIn2.Checked;
|
|
||||||
txtlocalPort2.Enabled =
|
|
||||||
cmbprotocol2.Enabled =
|
|
||||||
chkudpEnabled2.Enabled = blAllow2;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void btnSetDefRountingRule_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
txtUseragent.Text = Utils.GetEmbedText(Global.CustomRoutingFileName + Global.agentTag);
|
|
||||||
txtUserdirect.Text = Utils.GetEmbedText(Global.CustomRoutingFileName + Global.directTag);
|
|
||||||
txtUserblock.Text = Utils.GetEmbedText(Global.CustomRoutingFileName + Global.blockTag);
|
|
||||||
cmbroutingMode.SelectedIndex = 3;
|
|
||||||
|
|
||||||
List<string> lstUrl = new List<string>
|
|
||||||
{
|
|
||||||
Global.CustomRoutingListUrl + Global.agentTag,
|
|
||||||
Global.CustomRoutingListUrl + Global.directTag,
|
|
||||||
Global.CustomRoutingListUrl + Global.blockTag
|
|
||||||
};
|
|
||||||
|
|
||||||
List<TextBox> lstTxt = new List<TextBox>
|
|
||||||
{
|
|
||||||
txtUseragent,
|
|
||||||
txtUserdirect,
|
|
||||||
txtUserblock
|
|
||||||
};
|
|
||||||
|
|
||||||
for (int k = 0; k < lstUrl.Count; k++)
|
|
||||||
{
|
|
||||||
TextBox txt = lstTxt[k];
|
|
||||||
DownloadHandle downloadHandle = new DownloadHandle();
|
|
||||||
downloadHandle.UpdateCompleted += (sender2, args) =>
|
|
||||||
{
|
|
||||||
if (args.Success)
|
|
||||||
{
|
|
||||||
string result = args.Msg;
|
|
||||||
if (Utils.IsNullOrEmpty(result))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
txt.Text = result;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
AppendText(false, args.Msg);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
downloadHandle.Error += (sender2, args) =>
|
|
||||||
{
|
|
||||||
AppendText(true, args.GetException().Message);
|
|
||||||
};
|
|
||||||
|
|
||||||
downloadHandle.WebDownloadString(lstUrl[k]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void AppendText(bool notify, string text)
|
|
||||||
{
|
|
||||||
labRoutingTips.Text = text;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void linkLabelRoutingDoc_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
|
|
||||||
{
|
|
||||||
System.Diagnostics.Process.Start("https://www.v2ray.com/chapter_02/03_routing.html#routingobject");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class ComboItem
|
|
||||||
{
|
|
||||||
public int ID
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
public string Text
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,369 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<root>
|
|
||||||
<!--
|
|
||||||
Microsoft ResX Schema
|
|
||||||
|
|
||||||
Version 2.0
|
|
||||||
|
|
||||||
The primary goals of this format is to allow a simple XML format
|
|
||||||
that is mostly human readable. The generation and parsing of the
|
|
||||||
various data types are done through the TypeConverter classes
|
|
||||||
associated with the data types.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
... ado.net/XML headers & schema ...
|
|
||||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
|
||||||
<resheader name="version">2.0</resheader>
|
|
||||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
|
||||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
|
||||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
|
||||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
|
||||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
|
||||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
|
||||||
</data>
|
|
||||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
|
||||||
<comment>This is a comment</comment>
|
|
||||||
</data>
|
|
||||||
|
|
||||||
There are any number of "resheader" rows that contain simple
|
|
||||||
name/value pairs.
|
|
||||||
|
|
||||||
Each data row contains a name, and value. The row also contains a
|
|
||||||
type or mimetype. Type corresponds to a .NET class that support
|
|
||||||
text/value conversion through the TypeConverter architecture.
|
|
||||||
Classes that don't support this are serialized and stored with the
|
|
||||||
mimetype set.
|
|
||||||
|
|
||||||
The mimetype is used for serialized objects, and tells the
|
|
||||||
ResXResourceReader how to depersist the object. This is currently not
|
|
||||||
extensible. For a given mimetype the value must be set accordingly:
|
|
||||||
|
|
||||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
|
||||||
that the ResXResourceWriter will generate, however the reader can
|
|
||||||
read any of the formats listed below.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.binary.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.soap.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
|
||||||
value : The object must be serialized into a byte array
|
|
||||||
: using a System.ComponentModel.TypeConverter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
-->
|
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
|
||||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:choice maxOccurs="unbounded">
|
|
||||||
<xsd:element name="metadata">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="assembly">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:attribute name="alias" type="xsd:string" />
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="data">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="resheader">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:choice>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:schema>
|
|
||||||
<resheader name="resmimetype">
|
|
||||||
<value>text/microsoft-resx</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="version">
|
|
||||||
<value>2.0</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="reader">
|
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="writer">
|
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<data name="$this.Text" xml:space="preserve">
|
|
||||||
<value>参数设置</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnClose.Text" xml:space="preserve">
|
|
||||||
<value>取消(&C)</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnOK.Text" xml:space="preserve">
|
|
||||||
<value>确定(&O)</value>
|
|
||||||
</data>
|
|
||||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
|
||||||
<data name="btnSetDefRountingRule.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
|
||||||
<value>NoControl</value>
|
|
||||||
</data>
|
|
||||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
|
||||||
<data name="btnSetDefRountingRule.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>351, 14</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnSetDefRountingRule.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>201, 23</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnSetDefRountingRule.Text" xml:space="preserve">
|
|
||||||
<value>一键设置默认自定义路由规则</value>
|
|
||||||
</data>
|
|
||||||
<data name="chkAllowIn2.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>102, 16</value>
|
|
||||||
</data>
|
|
||||||
<data name="chkAllowIn2.Text" xml:space="preserve">
|
|
||||||
<value>本地监听端口2</value>
|
|
||||||
</data>
|
|
||||||
<data name="chkAllowLANConn.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>144, 16</value>
|
|
||||||
</data>
|
|
||||||
<data name="chkAllowLANConn.Text" xml:space="preserve">
|
|
||||||
<value>允许来自局域网的连接</value>
|
|
||||||
</data>
|
|
||||||
<data name="chkAutoRun.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>180, 16</value>
|
|
||||||
</data>
|
|
||||||
<data name="chkAutoRun.Text" xml:space="preserve">
|
|
||||||
<value>开机自动启动(可能会不成功)</value>
|
|
||||||
</data>
|
|
||||||
<data name="chkEnableStatistics.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>384, 16</value>
|
|
||||||
</data>
|
|
||||||
<data name="chkEnableStatistics.Text" xml:space="preserve">
|
|
||||||
<value>启用统计(实时网速显示和使用流量显示,需要重启v2rayN客户端)</value>
|
|
||||||
</data>
|
|
||||||
<data name="chkKeepOlderDedupl.Text" xml:space="preserve">
|
|
||||||
<value>去重时保留序号较小的项</value>
|
|
||||||
</data>
|
|
||||||
<data name="chklogEnabled.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>156, 16</value>
|
|
||||||
</data>
|
|
||||||
<data name="chklogEnabled.Text" xml:space="preserve">
|
|
||||||
<value>记录本地日志(默认关闭)</value>
|
|
||||||
</data>
|
|
||||||
<data name="chkmuxEnabled.Text" xml:space="preserve">
|
|
||||||
<value>开启Mux多路复用(默认开启)</value>
|
|
||||||
</data>
|
|
||||||
<data name="chksniffingEnabled.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>96, 16</value>
|
|
||||||
</data>
|
|
||||||
<data name="chksniffingEnabled.Text" xml:space="preserve">
|
|
||||||
<value>开启流量探测</value>
|
|
||||||
</data>
|
|
||||||
<data name="chksniffingEnabled2.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>96, 16</value>
|
|
||||||
</data>
|
|
||||||
<data name="chksniffingEnabled2.Text" xml:space="preserve">
|
|
||||||
<value>开启流量探测</value>
|
|
||||||
</data>
|
|
||||||
<data name="chkudpEnabled.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>66, 16</value>
|
|
||||||
</data>
|
|
||||||
<data name="chkudpEnabled.Text" xml:space="preserve">
|
|
||||||
<value>开启UDP</value>
|
|
||||||
</data>
|
|
||||||
<data name="chkudpEnabled2.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>66, 16</value>
|
|
||||||
</data>
|
|
||||||
<data name="chkudpEnabled2.Text" xml:space="preserve">
|
|
||||||
<value>开启UDP</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmblistenerType.Items" xml:space="preserve">
|
|
||||||
<value>关闭Http代理</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmblistenerType.Items1" xml:space="preserve">
|
|
||||||
<value>开启Http代理,并自动配置系统代理(全局模式)</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmblistenerType.Items2" xml:space="preserve">
|
|
||||||
<value>开启PAC,并自动配置系统代理(PAC模式)</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmblistenerType.Items3" xml:space="preserve">
|
|
||||||
<value>仅开启Http代理,并清除系统代理</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmblistenerType.Items4" xml:space="preserve">
|
|
||||||
<value>仅开启PAC,并清除系统代理</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmblistenerType.Items5" xml:space="preserve">
|
|
||||||
<value>仅开启Http代理,不改变系统代理</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmblistenerType.Items6" xml:space="preserve">
|
|
||||||
<value>仅开启PAC,不改变系统代理</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbroutingMode.Items" xml:space="preserve">
|
|
||||||
<value>全局</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbroutingMode.Items1" xml:space="preserve">
|
|
||||||
<value>绕过局域网地址</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbroutingMode.Items2" xml:space="preserve">
|
|
||||||
<value>绕过大陆地址</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbroutingMode.Items3" xml:space="preserve">
|
|
||||||
<value>绕过局域网及大陆地址</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbroutingMode.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>19, 26</value>
|
|
||||||
</data>
|
|
||||||
<data name="cmbroutingMode.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>244, 20</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>29, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label1.Text" xml:space="preserve">
|
|
||||||
<value>协议</value>
|
|
||||||
</data>
|
|
||||||
<data name="label13.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>227, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label13.Text" xml:space="preserve">
|
|
||||||
<value>自定义GFWList地址(不需自定义请填空白)</value>
|
|
||||||
</data>
|
|
||||||
<data name="label14.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>191, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label14.Text" xml:space="preserve">
|
|
||||||
<value>自定义DNS(可多个,用逗号(,)隔开)</value>
|
|
||||||
</data>
|
|
||||||
<data name="label15.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>53, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label16.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>53, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label16.Text" xml:space="preserve">
|
|
||||||
<value>Http代理</value>
|
|
||||||
</data>
|
|
||||||
<data name="label2.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>77, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label2.Text" xml:space="preserve">
|
|
||||||
<value>本地监听端口</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>29, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.Text" xml:space="preserve">
|
|
||||||
<value>协议</value>
|
|
||||||
</data>
|
|
||||||
<data name="label4.Text" xml:space="preserve">
|
|
||||||
<value>*设置用户PAC规则,用逗号(,)隔开</value>
|
|
||||||
</data>
|
|
||||||
<data name="label5.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>53, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label5.Text" xml:space="preserve">
|
|
||||||
<value>日志等级</value>
|
|
||||||
</data>
|
|
||||||
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
|
||||||
<data name="labRoutingTips.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="labRoutingTips.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>5, 49</value>
|
|
||||||
</data>
|
|
||||||
<data name="labRoutingTips.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>383, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="labRoutingTips.Text" xml:space="preserve">
|
|
||||||
<value>*设置的规则,用逗号(,)隔开;支持Domain(纯字符串/正则/子域名)和IP</value>
|
|
||||||
</data>
|
|
||||||
<data name="lbFreshrate.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>77, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="lbFreshrate.Text" xml:space="preserve">
|
|
||||||
<value>统计刷新频率</value>
|
|
||||||
</data>
|
|
||||||
<data name="linkLabelRoutingDoc.Text" xml:space="preserve">
|
|
||||||
<value>域名解析策略</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel3.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>642, 72</value>
|
|
||||||
</data>
|
|
||||||
<data name="tabControl2.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>3, 89</value>
|
|
||||||
</data>
|
|
||||||
<data name="tabControl2.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>642, 481</value>
|
|
||||||
</data>
|
|
||||||
<data name="tabPage1.Text" xml:space="preserve">
|
|
||||||
<value> Core:基础设置 </value>
|
|
||||||
</data>
|
|
||||||
<data name="tabPage2.Text" xml:space="preserve">
|
|
||||||
<value> Core:路由设置 </value>
|
|
||||||
</data>
|
|
||||||
<data name="tabPage3.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>634, 455</value>
|
|
||||||
</data>
|
|
||||||
<data name="tabPage3.Text" xml:space="preserve">
|
|
||||||
<value> 1.代理的Domain或IP </value>
|
|
||||||
</data>
|
|
||||||
<data name="tabPage4.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>634, 455</value>
|
|
||||||
</data>
|
|
||||||
<data name="tabPage4.Text" xml:space="preserve">
|
|
||||||
<value> 2.直连的Domain或IP </value>
|
|
||||||
</data>
|
|
||||||
<data name="tabPage5.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>634, 455</value>
|
|
||||||
</data>
|
|
||||||
<data name="tabPage5.Text" xml:space="preserve">
|
|
||||||
<value> 3.阻止的Domain或IP </value>
|
|
||||||
</data>
|
|
||||||
<data name="tabPage6.Text" xml:space="preserve">
|
|
||||||
<value> Core:KCP设置 </value>
|
|
||||||
</data>
|
|
||||||
<data name="tabPage7.Text" xml:space="preserve">
|
|
||||||
<value> v2rayN设置 </value>
|
|
||||||
</data>
|
|
||||||
<data name="tabPage8.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>634, 455</value>
|
|
||||||
</data>
|
|
||||||
<data name="tabPage8.Text" xml:space="preserve">
|
|
||||||
<value> 4.预定义规则 </value>
|
|
||||||
</data>
|
|
||||||
<data name="tabPage9.Text" xml:space="preserve">
|
|
||||||
<value> 用户PAC设置 </value>
|
|
||||||
</data>
|
|
||||||
<data name="txtUseragent.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>628, 449</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtUserblock.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>628, 449</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtUserdirect.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>628, 449</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
|
||||||
68
v2rayN/v2rayN/Forms/QRCodeControl.Designer.cs
generated
68
v2rayN/v2rayN/Forms/QRCodeControl.Designer.cs
generated
@@ -1,68 +0,0 @@
|
|||||||
namespace v2rayN.Forms
|
|
||||||
{
|
|
||||||
partial class QRCodeControl
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 必需的设计器变量。
|
|
||||||
/// </summary>
|
|
||||||
private System.ComponentModel.IContainer components = null;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 清理所有正在使用的资源。
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
|
|
||||||
protected override void Dispose(bool disposing)
|
|
||||||
{
|
|
||||||
if (disposing && (components != null))
|
|
||||||
{
|
|
||||||
components.Dispose();
|
|
||||||
}
|
|
||||||
base.Dispose(disposing);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region 组件设计器生成的代码
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 设计器支持所需的方法 - 不要
|
|
||||||
/// 使用代码编辑器修改此方法的内容。
|
|
||||||
/// </summary>
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(QRCodeControl));
|
|
||||||
this.txtUrl = new System.Windows.Forms.TextBox();
|
|
||||||
this.picQRCode = new System.Windows.Forms.PictureBox();
|
|
||||||
((System.ComponentModel.ISupportInitialize)(this.picQRCode)).BeginInit();
|
|
||||||
this.SuspendLayout();
|
|
||||||
//
|
|
||||||
// txtUrl
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtUrl, "txtUrl");
|
|
||||||
this.txtUrl.Name = "txtUrl";
|
|
||||||
this.txtUrl.ReadOnly = true;
|
|
||||||
//
|
|
||||||
// picQRCode
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.picQRCode, "picQRCode");
|
|
||||||
this.picQRCode.Name = "picQRCode";
|
|
||||||
this.picQRCode.TabStop = false;
|
|
||||||
//
|
|
||||||
// QRCodeControl
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this, "$this");
|
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
|
||||||
this.Controls.Add(this.picQRCode);
|
|
||||||
this.Controls.Add(this.txtUrl);
|
|
||||||
this.Name = "QRCodeControl";
|
|
||||||
this.Load += new System.EventHandler(this.QRCodeControl_Load);
|
|
||||||
((System.ComponentModel.ISupportInitialize)(this.picQRCode)).EndInit();
|
|
||||||
this.ResumeLayout(false);
|
|
||||||
this.PerformLayout();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
private System.Windows.Forms.TextBox txtUrl;
|
|
||||||
private System.Windows.Forms.PictureBox picQRCode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
using System.Windows.Forms;
|
|
||||||
using v2rayN.Handler;
|
|
||||||
using v2rayN.Mode;
|
|
||||||
|
|
||||||
namespace v2rayN.Forms
|
|
||||||
{
|
|
||||||
public partial class QRCodeControl : UserControl
|
|
||||||
{
|
|
||||||
public QRCodeControl()
|
|
||||||
{
|
|
||||||
InitializeComponent();
|
|
||||||
}
|
|
||||||
private void QRCodeControl_Load(object sender, System.EventArgs e)
|
|
||||||
{
|
|
||||||
txtUrl.MouseUp += txtUrl_MouseUp;
|
|
||||||
}
|
|
||||||
|
|
||||||
void txtUrl_MouseUp(object sender, MouseEventArgs e)
|
|
||||||
{
|
|
||||||
txtUrl.SelectAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void showQRCode(int Index, Config config)
|
|
||||||
{
|
|
||||||
if (Index >= 0)
|
|
||||||
{
|
|
||||||
string url = ConfigHandler.GetVmessQRCode(config, Index);
|
|
||||||
if (Utils.IsNullOrEmpty(url))
|
|
||||||
{
|
|
||||||
picQRCode.Image = null;
|
|
||||||
txtUrl.Text = string.Empty;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
txtUrl.Text = url;
|
|
||||||
picQRCode.Image = QRCodeHelper.GetQRCode(url);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,192 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<root>
|
|
||||||
<!--
|
|
||||||
Microsoft ResX Schema
|
|
||||||
|
|
||||||
Version 2.0
|
|
||||||
|
|
||||||
The primary goals of this format is to allow a simple XML format
|
|
||||||
that is mostly human readable. The generation and parsing of the
|
|
||||||
various data types are done through the TypeConverter classes
|
|
||||||
associated with the data types.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
... ado.net/XML headers & schema ...
|
|
||||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
|
||||||
<resheader name="version">2.0</resheader>
|
|
||||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
|
||||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
|
||||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
|
||||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
|
||||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
|
||||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
|
||||||
</data>
|
|
||||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
|
||||||
<comment>This is a comment</comment>
|
|
||||||
</data>
|
|
||||||
|
|
||||||
There are any number of "resheader" rows that contain simple
|
|
||||||
name/value pairs.
|
|
||||||
|
|
||||||
Each data row contains a name, and value. The row also contains a
|
|
||||||
type or mimetype. Type corresponds to a .NET class that support
|
|
||||||
text/value conversion through the TypeConverter architecture.
|
|
||||||
Classes that don't support this are serialized and stored with the
|
|
||||||
mimetype set.
|
|
||||||
|
|
||||||
The mimetype is used for serialized objects, and tells the
|
|
||||||
ResXResourceReader how to depersist the object. This is currently not
|
|
||||||
extensible. For a given mimetype the value must be set accordingly:
|
|
||||||
|
|
||||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
|
||||||
that the ResXResourceWriter will generate, however the reader can
|
|
||||||
read any of the formats listed below.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.binary.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.soap.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
|
||||||
value : The object must be serialized into a byte array
|
|
||||||
: using a System.ComponentModel.TypeConverter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
-->
|
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
|
||||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:choice maxOccurs="unbounded">
|
|
||||||
<xsd:element name="metadata">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="assembly">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:attribute name="alias" type="xsd:string" />
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="data">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="resheader">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:choice>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:schema>
|
|
||||||
<resheader name="resmimetype">
|
|
||||||
<value>text/microsoft-resx</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="version">
|
|
||||||
<value>2.0</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="reader">
|
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="writer">
|
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
|
||||||
<data name="txtUrl.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
|
||||||
<value>Bottom</value>
|
|
||||||
</data>
|
|
||||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
|
||||||
<data name="txtUrl.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>0, 371</value>
|
|
||||||
</data>
|
|
||||||
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
|
||||||
<data name="txtUrl.Multiline" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtUrl.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>356, 70</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtUrl.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>0</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>txtUrl.Name" xml:space="preserve">
|
|
||||||
<value>txtUrl</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>txtUrl.Type" xml:space="preserve">
|
|
||||||
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>txtUrl.Parent" xml:space="preserve">
|
|
||||||
<value>$this</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>txtUrl.ZOrder" xml:space="preserve">
|
|
||||||
<value>1</value>
|
|
||||||
</data>
|
|
||||||
<data name="picQRCode.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
|
||||||
<value>Fill</value>
|
|
||||||
</data>
|
|
||||||
<data name="picQRCode.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>0, 0</value>
|
|
||||||
</data>
|
|
||||||
<data name="picQRCode.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>356, 371</value>
|
|
||||||
</data>
|
|
||||||
<data name="picQRCode.SizeMode" type="System.Windows.Forms.PictureBoxSizeMode, System.Windows.Forms">
|
|
||||||
<value>Zoom</value>
|
|
||||||
</data>
|
|
||||||
<data name="picQRCode.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>24</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>picQRCode.Name" xml:space="preserve">
|
|
||||||
<value>picQRCode</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>picQRCode.Type" xml:space="preserve">
|
|
||||||
<value>System.Windows.Forms.PictureBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>picQRCode.Parent" xml:space="preserve">
|
|
||||||
<value>$this</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>picQRCode.ZOrder" xml:space="preserve">
|
|
||||||
<value>0</value>
|
|
||||||
</data>
|
|
||||||
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
|
|
||||||
<value>True</value>
|
|
||||||
</metadata>
|
|
||||||
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
|
|
||||||
<value>6, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="$this.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>356, 441</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>$this.Name" xml:space="preserve">
|
|
||||||
<value>QRCodeControl</value>
|
|
||||||
</data>
|
|
||||||
<data name=">>$this.Type" xml:space="preserve">
|
|
||||||
<value>System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
|
||||||
94
v2rayN/v2rayN/Forms/QRCodeForm.Designer.cs
generated
94
v2rayN/v2rayN/Forms/QRCodeForm.Designer.cs
generated
@@ -1,94 +0,0 @@
|
|||||||
namespace v2rayN.Forms
|
|
||||||
{
|
|
||||||
partial class QRCodeForm
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Required designer variable.
|
|
||||||
/// </summary>
|
|
||||||
private System.ComponentModel.IContainer components = null;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Clean up any resources being used.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
|
||||||
protected override void Dispose(bool disposing)
|
|
||||||
{
|
|
||||||
if (disposing && (components != null))
|
|
||||||
{
|
|
||||||
components.Dispose();
|
|
||||||
}
|
|
||||||
base.Dispose(disposing);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Windows Form Designer generated code
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Required method for Designer support - do not modify
|
|
||||||
/// the contents of this method with the code editor.
|
|
||||||
/// </summary>
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
this.picQRCode = new System.Windows.Forms.PictureBox();
|
|
||||||
this.groupBox1 = new System.Windows.Forms.GroupBox();
|
|
||||||
this.txtUrl = new System.Windows.Forms.TextBox();
|
|
||||||
((System.ComponentModel.ISupportInitialize)(this.picQRCode)).BeginInit();
|
|
||||||
this.groupBox1.SuspendLayout();
|
|
||||||
this.SuspendLayout();
|
|
||||||
//
|
|
||||||
// picQRCode
|
|
||||||
//
|
|
||||||
this.picQRCode.Dock = System.Windows.Forms.DockStyle.Fill;
|
|
||||||
this.picQRCode.Location = new System.Drawing.Point(0, 0);
|
|
||||||
this.picQRCode.Name = "picQRCode";
|
|
||||||
this.picQRCode.Size = new System.Drawing.Size(482, 483);
|
|
||||||
this.picQRCode.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
|
|
||||||
this.picQRCode.TabIndex = 23;
|
|
||||||
this.picQRCode.TabStop = false;
|
|
||||||
//
|
|
||||||
// groupBox1
|
|
||||||
//
|
|
||||||
this.groupBox1.Controls.Add(this.txtUrl);
|
|
||||||
this.groupBox1.Dock = System.Windows.Forms.DockStyle.Bottom;
|
|
||||||
this.groupBox1.Location = new System.Drawing.Point(0, 483);
|
|
||||||
this.groupBox1.Name = "groupBox1";
|
|
||||||
this.groupBox1.Size = new System.Drawing.Size(482, 90);
|
|
||||||
this.groupBox1.TabIndex = 0;
|
|
||||||
this.groupBox1.TabStop = false;
|
|
||||||
this.groupBox1.Text = "URL";
|
|
||||||
//
|
|
||||||
// txtUrl
|
|
||||||
//
|
|
||||||
this.txtUrl.Dock = System.Windows.Forms.DockStyle.Fill;
|
|
||||||
this.txtUrl.Location = new System.Drawing.Point(3, 17);
|
|
||||||
this.txtUrl.Multiline = true;
|
|
||||||
this.txtUrl.Name = "txtUrl";
|
|
||||||
this.txtUrl.ReadOnly = true;
|
|
||||||
this.txtUrl.Size = new System.Drawing.Size(476, 70);
|
|
||||||
this.txtUrl.TabIndex = 0;
|
|
||||||
//
|
|
||||||
// QRCodeForm
|
|
||||||
//
|
|
||||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
|
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
|
||||||
this.ClientSize = new System.Drawing.Size(482, 573);
|
|
||||||
this.Controls.Add(this.picQRCode);
|
|
||||||
this.Controls.Add(this.groupBox1);
|
|
||||||
this.Name = "QRCodeForm";
|
|
||||||
this.Text = "服务器配置二维码和URL";
|
|
||||||
this.Load += new System.EventHandler(this.QRCodeForm_Load);
|
|
||||||
this.Shown += new System.EventHandler(this.QRCodeForm_Shown);
|
|
||||||
((System.ComponentModel.ISupportInitialize)(this.picQRCode)).EndInit();
|
|
||||||
this.groupBox1.ResumeLayout(false);
|
|
||||||
this.groupBox1.PerformLayout();
|
|
||||||
this.ResumeLayout(false);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
private System.Windows.Forms.GroupBox groupBox1;
|
|
||||||
private System.Windows.Forms.TextBox txtUrl;
|
|
||||||
private System.Windows.Forms.PictureBox picQRCode;
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.ComponentModel;
|
|
||||||
using System.Data;
|
|
||||||
using System.Drawing;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
using v2rayN.Handler;
|
|
||||||
using v2rayN.Mode;
|
|
||||||
|
|
||||||
namespace v2rayN.Forms
|
|
||||||
{
|
|
||||||
public partial class QRCodeForm : BaseForm
|
|
||||||
{
|
|
||||||
public int Index { get; set; }
|
|
||||||
|
|
||||||
public QRCodeForm()
|
|
||||||
{
|
|
||||||
InitializeComponent();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void QRCodeForm_Load(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
txtUrl.MouseUp += txtUrl_MouseUp;
|
|
||||||
}
|
|
||||||
|
|
||||||
void txtUrl_MouseUp(object sender, MouseEventArgs e)
|
|
||||||
{
|
|
||||||
txtUrl.SelectAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void QRCodeForm_Shown(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
if (Index >= 0)
|
|
||||||
{
|
|
||||||
VmessQRCode vmessQRCode = null;
|
|
||||||
if (ConfigHandler.GetVmessQRCode(config, Index, ref vmessQRCode) != 0)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
string url = Utils.ToJson(vmessQRCode);
|
|
||||||
url = Utils.Base64Encode(url);
|
|
||||||
url = string.Format("{0}{1}", Global.vmessProtocol, url);
|
|
||||||
picQRCode.Image = QRCodeHelper.GetQRCode(url);
|
|
||||||
txtUrl.Text = url;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,120 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<root>
|
|
||||||
<!--
|
|
||||||
Microsoft ResX Schema
|
|
||||||
|
|
||||||
Version 2.0
|
|
||||||
|
|
||||||
The primary goals of this format is to allow a simple XML format
|
|
||||||
that is mostly human readable. The generation and parsing of the
|
|
||||||
various data types are done through the TypeConverter classes
|
|
||||||
associated with the data types.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
... ado.net/XML headers & schema ...
|
|
||||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
|
||||||
<resheader name="version">2.0</resheader>
|
|
||||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
|
||||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
|
||||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
|
||||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
|
||||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
|
||||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
|
||||||
</data>
|
|
||||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
|
||||||
<comment>This is a comment</comment>
|
|
||||||
</data>
|
|
||||||
|
|
||||||
There are any number of "resheader" rows that contain simple
|
|
||||||
name/value pairs.
|
|
||||||
|
|
||||||
Each data row contains a name, and value. The row also contains a
|
|
||||||
type or mimetype. Type corresponds to a .NET class that support
|
|
||||||
text/value conversion through the TypeConverter architecture.
|
|
||||||
Classes that don't support this are serialized and stored with the
|
|
||||||
mimetype set.
|
|
||||||
|
|
||||||
The mimetype is used for serialized objects, and tells the
|
|
||||||
ResXResourceReader how to depersist the object. This is currently not
|
|
||||||
extensible. For a given mimetype the value must be set accordingly:
|
|
||||||
|
|
||||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
|
||||||
that the ResXResourceWriter will generate, however the reader can
|
|
||||||
read any of the formats listed below.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.binary.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.soap.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
|
||||||
value : The object must be serialized into a byte array
|
|
||||||
: using a System.ComponentModel.TypeConverter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
-->
|
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
|
||||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:choice maxOccurs="unbounded">
|
|
||||||
<xsd:element name="metadata">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="assembly">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:attribute name="alias" type="xsd:string" />
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="data">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="resheader">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:choice>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:schema>
|
|
||||||
<resheader name="resmimetype">
|
|
||||||
<value>text/microsoft-resx</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="version">
|
|
||||||
<value>2.0</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="reader">
|
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="writer">
|
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
</root>
|
|
||||||
113
v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs
generated
113
v2rayN/v2rayN/Forms/SubSettingControl.Designer.cs
generated
@@ -1,113 +0,0 @@
|
|||||||
namespace v2rayN.Forms
|
|
||||||
{
|
|
||||||
partial class SubSettingControl
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 必需的设计器变量。
|
|
||||||
/// </summary>
|
|
||||||
private System.ComponentModel.IContainer components = null;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 清理所有正在使用的资源。
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
|
|
||||||
protected override void Dispose(bool disposing)
|
|
||||||
{
|
|
||||||
if (disposing && (components != null))
|
|
||||||
{
|
|
||||||
components.Dispose();
|
|
||||||
}
|
|
||||||
base.Dispose(disposing);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region 组件设计器生成的代码
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 设计器支持所需的方法 - 不要修改
|
|
||||||
/// 使用代码编辑器修改此方法的内容。
|
|
||||||
/// </summary>
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SubSettingControl));
|
|
||||||
this.groupBox2 = new System.Windows.Forms.GroupBox();
|
|
||||||
this.chkEnabled = new System.Windows.Forms.CheckBox();
|
|
||||||
this.btnRemove = new System.Windows.Forms.Button();
|
|
||||||
this.txtUrl = new System.Windows.Forms.TextBox();
|
|
||||||
this.txtRemarks = new System.Windows.Forms.TextBox();
|
|
||||||
this.label2 = new System.Windows.Forms.Label();
|
|
||||||
this.label3 = new System.Windows.Forms.Label();
|
|
||||||
this.groupBox2.SuspendLayout();
|
|
||||||
this.SuspendLayout();
|
|
||||||
//
|
|
||||||
// groupBox2
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.groupBox2, "groupBox2");
|
|
||||||
this.groupBox2.Controls.Add(this.chkEnabled);
|
|
||||||
this.groupBox2.Controls.Add(this.btnRemove);
|
|
||||||
this.groupBox2.Controls.Add(this.txtUrl);
|
|
||||||
this.groupBox2.Controls.Add(this.txtRemarks);
|
|
||||||
this.groupBox2.Controls.Add(this.label2);
|
|
||||||
this.groupBox2.Controls.Add(this.label3);
|
|
||||||
this.groupBox2.Name = "groupBox2";
|
|
||||||
this.groupBox2.TabStop = false;
|
|
||||||
//
|
|
||||||
// chkEnabled
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.chkEnabled, "chkEnabled");
|
|
||||||
this.chkEnabled.Name = "chkEnabled";
|
|
||||||
this.chkEnabled.UseVisualStyleBackColor = true;
|
|
||||||
this.chkEnabled.Leave += new System.EventHandler(this.txtRemarks_Leave);
|
|
||||||
//
|
|
||||||
// btnRemove
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.btnRemove, "btnRemove");
|
|
||||||
this.btnRemove.Name = "btnRemove";
|
|
||||||
this.btnRemove.UseVisualStyleBackColor = true;
|
|
||||||
this.btnRemove.Click += new System.EventHandler(this.btnRemove_Click);
|
|
||||||
//
|
|
||||||
// txtUrl
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtUrl, "txtUrl");
|
|
||||||
this.txtUrl.Name = "txtUrl";
|
|
||||||
this.txtUrl.Leave += new System.EventHandler(this.txtRemarks_Leave);
|
|
||||||
//
|
|
||||||
// txtRemarks
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.txtRemarks, "txtRemarks");
|
|
||||||
this.txtRemarks.Name = "txtRemarks";
|
|
||||||
this.txtRemarks.Leave += new System.EventHandler(this.txtRemarks_Leave);
|
|
||||||
//
|
|
||||||
// label2
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label2, "label2");
|
|
||||||
this.label2.Name = "label2";
|
|
||||||
//
|
|
||||||
// label3
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.label3, "label3");
|
|
||||||
this.label3.Name = "label3";
|
|
||||||
//
|
|
||||||
// SubSettingControl
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this, "$this");
|
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
|
||||||
this.Controls.Add(this.groupBox2);
|
|
||||||
this.Name = "SubSettingControl";
|
|
||||||
this.Load += new System.EventHandler(this.SubSettingControl_Load);
|
|
||||||
this.groupBox2.ResumeLayout(false);
|
|
||||||
this.groupBox2.PerformLayout();
|
|
||||||
this.ResumeLayout(false);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
private System.Windows.Forms.GroupBox groupBox2;
|
|
||||||
private System.Windows.Forms.TextBox txtUrl;
|
|
||||||
private System.Windows.Forms.TextBox txtRemarks;
|
|
||||||
private System.Windows.Forms.Label label2;
|
|
||||||
private System.Windows.Forms.Label label3;
|
|
||||||
private System.Windows.Forms.Button btnRemove;
|
|
||||||
private System.Windows.Forms.CheckBox chkEnabled;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,60 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
using v2rayN.Base;
|
|
||||||
using v2rayN.Mode;
|
|
||||||
|
|
||||||
namespace v2rayN.Forms
|
|
||||||
{
|
|
||||||
public delegate void ChangeEventHandler(object sender, EventArgs e);
|
|
||||||
public partial class SubSettingControl : UserControl
|
|
||||||
{
|
|
||||||
public event ChangeEventHandler OnButtonClicked;
|
|
||||||
|
|
||||||
|
|
||||||
public SubItem subItem { get; set; }
|
|
||||||
|
|
||||||
public SubSettingControl()
|
|
||||||
{
|
|
||||||
InitializeComponent();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SubSettingControl_Load(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
BindingSub();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void BindingSub()
|
|
||||||
{
|
|
||||||
if (subItem != null)
|
|
||||||
{
|
|
||||||
txtRemarks.Text = subItem.remarks.ToString();
|
|
||||||
txtUrl.Text = subItem.url.ToString();
|
|
||||||
chkEnabled.Checked = subItem.enabled;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private void EndBindingSub()
|
|
||||||
{
|
|
||||||
if (subItem != null)
|
|
||||||
{
|
|
||||||
subItem.remarks = txtRemarks.Text.TrimEx();
|
|
||||||
subItem.url = txtUrl.Text.TrimEx();
|
|
||||||
subItem.enabled = chkEnabled.Checked;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private void txtRemarks_Leave(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
EndBindingSub();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void btnRemove_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
if (subItem != null)
|
|
||||||
{
|
|
||||||
subItem.remarks = string.Empty;
|
|
||||||
subItem.url = string.Empty;
|
|
||||||
}
|
|
||||||
|
|
||||||
OnButtonClicked?.Invoke(sender, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,240 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<root>
|
|
||||||
<!--
|
|
||||||
Microsoft ResX Schema
|
|
||||||
|
|
||||||
Version 2.0
|
|
||||||
|
|
||||||
The primary goals of this format is to allow a simple XML format
|
|
||||||
that is mostly human readable. The generation and parsing of the
|
|
||||||
various data types are done through the TypeConverter classes
|
|
||||||
associated with the data types.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
... ado.net/XML headers & schema ...
|
|
||||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
|
||||||
<resheader name="version">2.0</resheader>
|
|
||||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
|
||||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
|
||||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
|
||||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
|
||||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
|
||||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
|
||||||
</data>
|
|
||||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
|
||||||
<comment>This is a comment</comment>
|
|
||||||
</data>
|
|
||||||
|
|
||||||
There are any number of "resheader" rows that contain simple
|
|
||||||
name/value pairs.
|
|
||||||
|
|
||||||
Each data row contains a name, and value. The row also contains a
|
|
||||||
type or mimetype. Type corresponds to a .NET class that support
|
|
||||||
text/value conversion through the TypeConverter architecture.
|
|
||||||
Classes that don't support this are serialized and stored with the
|
|
||||||
mimetype set.
|
|
||||||
|
|
||||||
The mimetype is used for serialized objects, and tells the
|
|
||||||
ResXResourceReader how to depersist the object. This is currently not
|
|
||||||
extensible. For a given mimetype the value must be set accordingly:
|
|
||||||
|
|
||||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
|
||||||
that the ResXResourceWriter will generate, however the reader can
|
|
||||||
read any of the formats listed below.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.binary.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.soap.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
|
||||||
value : The object must be serialized into a byte array
|
|
||||||
: using a System.ComponentModel.TypeConverter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
-->
|
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
|
||||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:choice maxOccurs="unbounded">
|
|
||||||
<xsd:element name="metadata">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="assembly">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:attribute name="alias" type="xsd:string" />
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="data">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="resheader">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:choice>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:schema>
|
|
||||||
<resheader name="resmimetype">
|
|
||||||
<value>text/microsoft-resx</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="version">
|
|
||||||
<value>2.0</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="reader">
|
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="writer">
|
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
|
||||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
|
||||||
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
|
||||||
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
|
|
||||||
<value>6, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="$this.Language" type="System.Globalization.CultureInfo, mscorlib">
|
|
||||||
<value>zh-Hans</value>
|
|
||||||
</data>
|
|
||||||
<data name="$this.Localizable" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="$this.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>584, 119</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnRemove.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
|
||||||
<value>NoControl</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnRemove.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>484, 21</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnRemove.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>75, 23</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnRemove.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>24</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnRemove.Text" xml:space="preserve">
|
|
||||||
<value>&Remove</value>
|
|
||||||
</data>
|
|
||||||
<data name="chkEnabled.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="chkEnabled.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
|
||||||
<value>NoControl</value>
|
|
||||||
</data>
|
|
||||||
<data name="chkEnabled.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>406, 23</value>
|
|
||||||
</data>
|
|
||||||
<data name="chkEnabled.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>60, 16</value>
|
|
||||||
</data>
|
|
||||||
<data name="chkEnabled.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>25</value>
|
|
||||||
</data>
|
|
||||||
<data name="chkEnabled.Text" xml:space="preserve">
|
|
||||||
<value>Enable</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox2.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
|
||||||
<value>Bottom</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox2.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>0, 9</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox2.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>584, 110</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox2.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>10</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox2.Text" xml:space="preserve">
|
|
||||||
<value>Subscription details</value>
|
|
||||||
</data>
|
|
||||||
<data name="label2.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label2.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
|
||||||
<value>NoControl</value>
|
|
||||||
</data>
|
|
||||||
<data name="label2.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>12, 25</value>
|
|
||||||
</data>
|
|
||||||
<data name="label2.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>47, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label2.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>10</value>
|
|
||||||
</data>
|
|
||||||
<data name="label2.Text" xml:space="preserve">
|
|
||||||
<value>Remarks</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.AutoSize" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
|
||||||
<value>NoControl</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>12, 55</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>83, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>0</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.Text" xml:space="preserve">
|
|
||||||
<value>Address (url)</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtRemarks.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>127, 21</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtRemarks.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>265, 21</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtRemarks.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>11</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtUrl.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>127, 55</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtUrl.Multiline" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtUrl.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>432, 46</value>
|
|
||||||
</data>
|
|
||||||
<data name="txtUrl.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>23</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
|
||||||
@@ -1,145 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<root>
|
|
||||||
<!--
|
|
||||||
Microsoft ResX Schema
|
|
||||||
|
|
||||||
Version 2.0
|
|
||||||
|
|
||||||
The primary goals of this format is to allow a simple XML format
|
|
||||||
that is mostly human readable. The generation and parsing of the
|
|
||||||
various data types are done through the TypeConverter classes
|
|
||||||
associated with the data types.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
... ado.net/XML headers & schema ...
|
|
||||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
|
||||||
<resheader name="version">2.0</resheader>
|
|
||||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
|
||||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
|
||||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
|
||||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
|
||||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
|
||||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
|
||||||
</data>
|
|
||||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
|
||||||
<comment>This is a comment</comment>
|
|
||||||
</data>
|
|
||||||
|
|
||||||
There are any number of "resheader" rows that contain simple
|
|
||||||
name/value pairs.
|
|
||||||
|
|
||||||
Each data row contains a name, and value. The row also contains a
|
|
||||||
type or mimetype. Type corresponds to a .NET class that support
|
|
||||||
text/value conversion through the TypeConverter architecture.
|
|
||||||
Classes that don't support this are serialized and stored with the
|
|
||||||
mimetype set.
|
|
||||||
|
|
||||||
The mimetype is used for serialized objects, and tells the
|
|
||||||
ResXResourceReader how to depersist the object. This is currently not
|
|
||||||
extensible. For a given mimetype the value must be set accordingly:
|
|
||||||
|
|
||||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
|
||||||
that the ResXResourceWriter will generate, however the reader can
|
|
||||||
read any of the formats listed below.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.binary.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.soap.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
|
||||||
value : The object must be serialized into a byte array
|
|
||||||
: using a System.ComponentModel.TypeConverter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
-->
|
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
|
||||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:choice maxOccurs="unbounded">
|
|
||||||
<xsd:element name="metadata">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="assembly">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:attribute name="alias" type="xsd:string" />
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="data">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="resheader">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:choice>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:schema>
|
|
||||||
<resheader name="resmimetype">
|
|
||||||
<value>text/microsoft-resx</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="version">
|
|
||||||
<value>2.0</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="reader">
|
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="writer">
|
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
|
||||||
<data name="btnRemove.Text" xml:space="preserve">
|
|
||||||
<value>移除</value>
|
|
||||||
</data>
|
|
||||||
<data name="chkEnabled.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>48, 16</value>
|
|
||||||
</data>
|
|
||||||
<data name="chkEnabled.Text" xml:space="preserve">
|
|
||||||
<value>启用</value>
|
|
||||||
</data>
|
|
||||||
<data name="groupBox2.Text" xml:space="preserve">
|
|
||||||
<value>订阅详情</value>
|
|
||||||
</data>
|
|
||||||
<data name="label2.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>29, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label2.Text" xml:space="preserve">
|
|
||||||
<value>备注</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>65, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="label3.Text" xml:space="preserve">
|
|
||||||
<value>地址 (url)</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
|
||||||
97
v2rayN/v2rayN/Forms/SubSettingForm.Designer.cs
generated
97
v2rayN/v2rayN/Forms/SubSettingForm.Designer.cs
generated
@@ -1,97 +0,0 @@
|
|||||||
namespace v2rayN.Forms
|
|
||||||
{
|
|
||||||
partial class SubSettingForm
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Required designer variable.
|
|
||||||
/// </summary>
|
|
||||||
private System.ComponentModel.IContainer components = null;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Clean up any resources being used.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
|
||||||
protected override void Dispose(bool disposing)
|
|
||||||
{
|
|
||||||
if (disposing && (components != null))
|
|
||||||
{
|
|
||||||
components.Dispose();
|
|
||||||
}
|
|
||||||
base.Dispose(disposing);
|
|
||||||
}
|
|
||||||
|
|
||||||
#region Windows Form Designer generated code
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Required method for Designer support - do not modify
|
|
||||||
/// the contents of this method with the code editor.
|
|
||||||
/// </summary>
|
|
||||||
private void InitializeComponent()
|
|
||||||
{
|
|
||||||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SubSettingForm));
|
|
||||||
this.btnClose = new System.Windows.Forms.Button();
|
|
||||||
this.panCon = new System.Windows.Forms.Panel();
|
|
||||||
this.panel2 = new System.Windows.Forms.Panel();
|
|
||||||
this.btnAdd = new System.Windows.Forms.Button();
|
|
||||||
this.btnOK = new System.Windows.Forms.Button();
|
|
||||||
this.panel2.SuspendLayout();
|
|
||||||
this.SuspendLayout();
|
|
||||||
//
|
|
||||||
// btnClose
|
|
||||||
//
|
|
||||||
this.btnClose.DialogResult = System.Windows.Forms.DialogResult.Cancel;
|
|
||||||
resources.ApplyResources(this.btnClose, "btnClose");
|
|
||||||
this.btnClose.Name = "btnClose";
|
|
||||||
this.btnClose.UseVisualStyleBackColor = true;
|
|
||||||
this.btnClose.Click += new System.EventHandler(this.btnClose_Click);
|
|
||||||
//
|
|
||||||
// panCon
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.panCon, "panCon");
|
|
||||||
this.panCon.Name = "panCon";
|
|
||||||
//
|
|
||||||
// panel2
|
|
||||||
//
|
|
||||||
this.panel2.Controls.Add(this.btnAdd);
|
|
||||||
this.panel2.Controls.Add(this.btnClose);
|
|
||||||
this.panel2.Controls.Add(this.btnOK);
|
|
||||||
resources.ApplyResources(this.panel2, "panel2");
|
|
||||||
this.panel2.Name = "panel2";
|
|
||||||
//
|
|
||||||
// btnAdd
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.btnAdd, "btnAdd");
|
|
||||||
this.btnAdd.Name = "btnAdd";
|
|
||||||
this.btnAdd.UseVisualStyleBackColor = true;
|
|
||||||
this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click);
|
|
||||||
//
|
|
||||||
// btnOK
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this.btnOK, "btnOK");
|
|
||||||
this.btnOK.Name = "btnOK";
|
|
||||||
this.btnOK.UseVisualStyleBackColor = true;
|
|
||||||
this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
|
|
||||||
//
|
|
||||||
// SubSettingForm
|
|
||||||
//
|
|
||||||
resources.ApplyResources(this, "$this");
|
|
||||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
|
||||||
this.CancelButton = this.btnClose;
|
|
||||||
this.Controls.Add(this.panCon);
|
|
||||||
this.Controls.Add(this.panel2);
|
|
||||||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
|
|
||||||
this.Name = "SubSettingForm";
|
|
||||||
this.Load += new System.EventHandler(this.SubSettingForm_Load);
|
|
||||||
this.panel2.ResumeLayout(false);
|
|
||||||
this.ResumeLayout(false);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
private System.Windows.Forms.Button btnClose;
|
|
||||||
private System.Windows.Forms.Button btnOK;
|
|
||||||
private System.Windows.Forms.Panel panel2;
|
|
||||||
private System.Windows.Forms.Button btnAdd;
|
|
||||||
private System.Windows.Forms.Panel panCon;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,110 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
using v2rayN.Handler;
|
|
||||||
using v2rayN.Mode;
|
|
||||||
|
|
||||||
namespace v2rayN.Forms
|
|
||||||
{
|
|
||||||
public partial class SubSettingForm : BaseForm
|
|
||||||
{
|
|
||||||
List<SubSettingControl> lstControls = new List<SubSettingControl>();
|
|
||||||
|
|
||||||
public SubSettingForm()
|
|
||||||
{
|
|
||||||
InitializeComponent();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void SubSettingForm_Load(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
if (config.subItem == null)
|
|
||||||
{
|
|
||||||
config.subItem = new List<SubItem>();
|
|
||||||
}
|
|
||||||
|
|
||||||
RefreshSubsView();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 刷新列表
|
|
||||||
/// </summary>
|
|
||||||
private void RefreshSubsView()
|
|
||||||
{
|
|
||||||
panCon.Controls.Clear();
|
|
||||||
lstControls.Clear();
|
|
||||||
|
|
||||||
for (int k = config.subItem.Count - 1; k >= 0; k--)
|
|
||||||
{
|
|
||||||
SubItem item = config.subItem[k];
|
|
||||||
if (Utils.IsNullOrEmpty(item.remarks)
|
|
||||||
&& Utils.IsNullOrEmpty(item.url))
|
|
||||||
{
|
|
||||||
if (!Utils.IsNullOrEmpty(item.id))
|
|
||||||
{
|
|
||||||
ConfigHandler.RemoveServerViaSubid(ref config, item.id);
|
|
||||||
}
|
|
||||||
config.subItem.RemoveAt(k);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (SubItem item in config.subItem)
|
|
||||||
{
|
|
||||||
SubSettingControl control = new SubSettingControl();
|
|
||||||
control.OnButtonClicked += Control_OnButtonClicked;
|
|
||||||
control.subItem = item;
|
|
||||||
control.Dock = DockStyle.Top;
|
|
||||||
|
|
||||||
panCon.Controls.Add(control);
|
|
||||||
panCon.Controls.SetChildIndex(control, 0);
|
|
||||||
|
|
||||||
lstControls.Add(control);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Control_OnButtonClicked(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
RefreshSubsView();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void btnOK_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
if (config.subItem.Count <= 0)
|
|
||||||
{
|
|
||||||
AddSub();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ConfigHandler.SaveSubItem(ref config) == 0)
|
|
||||||
{
|
|
||||||
this.DialogResult = DialogResult.OK;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
UI.ShowWarning(UIRes.I18N("OperationFailed"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void btnClose_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
this.DialogResult = DialogResult.Cancel;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void btnAdd_Click(object sender, EventArgs e)
|
|
||||||
{
|
|
||||||
AddSub();
|
|
||||||
|
|
||||||
RefreshSubsView();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private void AddSub()
|
|
||||||
{
|
|
||||||
SubItem subItem = new SubItem
|
|
||||||
{
|
|
||||||
id = string.Empty,
|
|
||||||
remarks = "remarks",
|
|
||||||
url = "url"
|
|
||||||
};
|
|
||||||
config.subItem.Add(subItem);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,207 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<root>
|
|
||||||
<!--
|
|
||||||
Microsoft ResX Schema
|
|
||||||
|
|
||||||
Version 2.0
|
|
||||||
|
|
||||||
The primary goals of this format is to allow a simple XML format
|
|
||||||
that is mostly human readable. The generation and parsing of the
|
|
||||||
various data types are done through the TypeConverter classes
|
|
||||||
associated with the data types.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
... ado.net/XML headers & schema ...
|
|
||||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
|
||||||
<resheader name="version">2.0</resheader>
|
|
||||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
|
||||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
|
||||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
|
||||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
|
||||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
|
||||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
|
||||||
</data>
|
|
||||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
|
||||||
<comment>This is a comment</comment>
|
|
||||||
</data>
|
|
||||||
|
|
||||||
There are any number of "resheader" rows that contain simple
|
|
||||||
name/value pairs.
|
|
||||||
|
|
||||||
Each data row contains a name, and value. The row also contains a
|
|
||||||
type or mimetype. Type corresponds to a .NET class that support
|
|
||||||
text/value conversion through the TypeConverter architecture.
|
|
||||||
Classes that don't support this are serialized and stored with the
|
|
||||||
mimetype set.
|
|
||||||
|
|
||||||
The mimetype is used for serialized objects, and tells the
|
|
||||||
ResXResourceReader how to depersist the object. This is currently not
|
|
||||||
extensible. For a given mimetype the value must be set accordingly:
|
|
||||||
|
|
||||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
|
||||||
that the ResXResourceWriter will generate, however the reader can
|
|
||||||
read any of the formats listed below.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.binary.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.soap.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
|
||||||
value : The object must be serialized into a byte array
|
|
||||||
: using a System.ComponentModel.TypeConverter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
-->
|
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
|
||||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:choice maxOccurs="unbounded">
|
|
||||||
<xsd:element name="metadata">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="assembly">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:attribute name="alias" type="xsd:string" />
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="data">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="resheader">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:choice>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:schema>
|
|
||||||
<resheader name="resmimetype">
|
|
||||||
<value>text/microsoft-resx</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="version">
|
|
||||||
<value>2.0</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="reader">
|
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="writer">
|
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
|
||||||
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
|
|
||||||
<assembly alias="mscorlib" name="mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
|
|
||||||
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
|
|
||||||
<value>6, 12</value>
|
|
||||||
</data>
|
|
||||||
<data name="$this.ClientSize" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>581, 629</value>
|
|
||||||
</data>
|
|
||||||
<data name="$this.Localizable" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="$this.Text" xml:space="preserve">
|
|
||||||
<value>Subscription settings</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnAdd.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
|
||||||
<value>NoControl</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnAdd.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>47, 17</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnAdd.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>75, 23</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnAdd.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>6</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnAdd.Text" xml:space="preserve">
|
|
||||||
<value>&Add</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnClose.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
|
||||||
<value>NoControl</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnClose.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>448, 17</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnClose.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>75, 23</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnClose.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>4</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnClose.Text" xml:space="preserve">
|
|
||||||
<value>&Cancel</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnOK.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
|
|
||||||
<value>NoControl</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnOK.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>355, 17</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnOK.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>75, 23</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnOK.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>5</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnOK.Text" xml:space="preserve">
|
|
||||||
<value>&OK</value>
|
|
||||||
</data>
|
|
||||||
<data name="panCon.AutoScroll" type="System.Boolean, mscorlib">
|
|
||||||
<value>True</value>
|
|
||||||
</data>
|
|
||||||
<data name="panCon.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
|
||||||
<value>Fill</value>
|
|
||||||
</data>
|
|
||||||
<data name="panCon.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>0, 0</value>
|
|
||||||
</data>
|
|
||||||
<data name="panCon.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>581, 569</value>
|
|
||||||
</data>
|
|
||||||
<data name="panCon.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>10</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel2.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
|
|
||||||
<value>Bottom</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel2.Location" type="System.Drawing.Point, System.Drawing">
|
|
||||||
<value>0, 569</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel2.Size" type="System.Drawing.Size, System.Drawing">
|
|
||||||
<value>581, 60</value>
|
|
||||||
</data>
|
|
||||||
<data name="panel2.TabIndex" type="System.Int32, mscorlib">
|
|
||||||
<value>7</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
|
||||||
@@ -1,149 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<root>
|
|
||||||
<!--
|
|
||||||
Microsoft ResX Schema
|
|
||||||
|
|
||||||
Version 2.0
|
|
||||||
|
|
||||||
The primary goals of this format is to allow a simple XML format
|
|
||||||
that is mostly human readable. The generation and parsing of the
|
|
||||||
various data types are done through the TypeConverter classes
|
|
||||||
associated with the data types.
|
|
||||||
|
|
||||||
Example:
|
|
||||||
|
|
||||||
... ado.net/XML headers & schema ...
|
|
||||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
|
||||||
<resheader name="version">2.0</resheader>
|
|
||||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
|
||||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
|
||||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
|
||||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
|
||||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
|
||||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
|
||||||
</data>
|
|
||||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
|
||||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
|
||||||
<comment>This is a comment</comment>
|
|
||||||
</data>
|
|
||||||
|
|
||||||
There are any number of "resheader" rows that contain simple
|
|
||||||
name/value pairs.
|
|
||||||
|
|
||||||
Each data row contains a name, and value. The row also contains a
|
|
||||||
type or mimetype. Type corresponds to a .NET class that support
|
|
||||||
text/value conversion through the TypeConverter architecture.
|
|
||||||
Classes that don't support this are serialized and stored with the
|
|
||||||
mimetype set.
|
|
||||||
|
|
||||||
The mimetype is used for serialized objects, and tells the
|
|
||||||
ResXResourceReader how to depersist the object. This is currently not
|
|
||||||
extensible. For a given mimetype the value must be set accordingly:
|
|
||||||
|
|
||||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
|
||||||
that the ResXResourceWriter will generate, however the reader can
|
|
||||||
read any of the formats listed below.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.binary.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.soap.base64
|
|
||||||
value : The object must be serialized with
|
|
||||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
|
|
||||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
|
||||||
value : The object must be serialized into a byte array
|
|
||||||
: using a System.ComponentModel.TypeConverter
|
|
||||||
: and then encoded with base64 encoding.
|
|
||||||
-->
|
|
||||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
|
||||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
|
||||||
<xsd:element name="root" msdata:IsDataSet="true">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:choice maxOccurs="unbounded">
|
|
||||||
<xsd:element name="metadata">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="assembly">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:attribute name="alias" type="xsd:string" />
|
|
||||||
<xsd:attribute name="name" type="xsd:string" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="data">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
|
||||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
|
||||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
|
||||||
<xsd:attribute ref="xml:space" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
<xsd:element name="resheader">
|
|
||||||
<xsd:complexType>
|
|
||||||
<xsd:sequence>
|
|
||||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
|
||||||
</xsd:sequence>
|
|
||||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:choice>
|
|
||||||
</xsd:complexType>
|
|
||||||
</xsd:element>
|
|
||||||
</xsd:schema>
|
|
||||||
<resheader name="resmimetype">
|
|
||||||
<value>text/microsoft-resx</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="version">
|
|
||||||
<value>2.0</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="reader">
|
|
||||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<resheader name="writer">
|
|
||||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
|
||||||
</resheader>
|
|
||||||
<data name="$this.Text" xml:space="preserve">
|
|
||||||
<value>订阅设置</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnAdd.Text" xml:space="preserve">
|
|
||||||
<value>添加(&A)</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnClose.Text" xml:space="preserve">
|
|
||||||
<value>取消(&C)</value>
|
|
||||||
</data>
|
|
||||||
<data name="btnOK.Text" xml:space="preserve">
|
|
||||||
<value>确定(&O)</value>
|
|
||||||
</data>
|
|
||||||
<data name="lvSubs.Items" mimetype="application/x-microsoft.net.object.binary.base64">
|
|
||||||
<value>
|
|
||||||
AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
|
|
||||||
LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkMAwAAAFFTeXN0
|
|
||||||
ZW0uRHJhd2luZywgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2Vu
|
|
||||||
PWIwM2Y1ZjdmMTFkNTBhM2EFAQAAACFTeXN0ZW0uV2luZG93cy5Gb3Jtcy5MaXN0Vmlld0l0ZW0HAAAA
|
|
||||||
BFRleHQKSW1hZ2VJbmRleAlCYWNrQ29sb3IHQ2hlY2tlZARGb250CUZvcmVDb2xvchdVc2VJdGVtU3R5
|
|
||||||
bGVGb3JTdWJJdGVtcwEABAAEBAAIFFN5c3RlbS5EcmF3aW5nLkNvbG9yAwAAAAETU3lzdGVtLkRyYXdp
|
|
||||||
bmcuRm9udAMAAAAUU3lzdGVtLkRyYXdpbmcuQ29sb3IDAAAAAQIAAAAGBAAAAAD/////Bfv///8UU3lz
|
|
||||||
dGVtLkRyYXdpbmcuQ29sb3IEAAAABG5hbWUFdmFsdWUKa25vd25Db2xvcgVzdGF0ZQEAAAAJBwcDAAAA
|
|
||||||
CgAAAAAAAAAAGAABAAAJBgAAAAH5////+////woAAAAAAAAAABoAAQABBQYAAAATU3lzdGVtLkRyYXdp
|
|
||||||
bmcuRm9udAQAAAAETmFtZQRTaXplBVN0eWxlBFVuaXQBAAQECxhTeXN0ZW0uRHJhd2luZy5Gb250U3R5
|
|
||||||
bGUDAAAAG1N5c3RlbS5EcmF3aW5nLkdyYXBoaWNzVW5pdAMAAAADAAAABggAAAAG5a6L5L2TAAAQQQX3
|
|
||||||
////GFN5c3RlbS5EcmF3aW5nLkZvbnRTdHlsZQEAAAAHdmFsdWVfXwAIAwAAAAAAAAAF9v///xtTeXN0
|
|
||||||
ZW0uRHJhd2luZy5HcmFwaGljc1VuaXQBAAAAB3ZhbHVlX18ACAMAAAADAAAACw==
|
|
||||||
</value>
|
|
||||||
</data>
|
|
||||||
</root>
|
|
||||||
@@ -1,235 +1,122 @@
|
|||||||
|
namespace v2rayN
|
||||||
namespace v2rayN
|
|
||||||
{
|
{
|
||||||
class Global
|
class Global
|
||||||
{
|
{
|
||||||
#region 常量
|
#region const
|
||||||
|
public const string v2rayWebsiteUrl = @"https://www.v2fly.org/";
|
||||||
|
|
||||||
public const string v2rayWebsiteUrl = @"https://www.v2ray.com/";
|
|
||||||
public const string AboutUrl = @"https://github.com/2dust/v2rayN";
|
public const string AboutUrl = @"https://github.com/2dust/v2rayN";
|
||||||
public const string UpdateUrl = AboutUrl + @"/releases";
|
public const string UpdateUrl = AboutUrl + @"/releases";
|
||||||
|
public const string v2flyCoreUrl = "https://github.com/v2fly/v2ray-core/releases";
|
||||||
|
public const string xrayCoreUrl = "https://github.com/XTLS/Xray-core/releases";
|
||||||
/// <summary>
|
public const string SagerNetCoreUrl = "https://github.com/SagerNet/v2ray-core/releases";
|
||||||
/// SpeedTestUrl
|
public const string NUrl = @"https://github.com/2dust/v2rayN/releases";
|
||||||
/// </summary>
|
public const string clashCoreUrl = "https://github.com/Dreamacro/clash/releases";
|
||||||
public const string SpeedTestUrl = @"http://speedtest-sgp1.digitalocean.com/10mb.test";
|
public const string clashMetaCoreUrl = "https://github.com/MetaCubeX/Clash.Meta/releases";
|
||||||
|
public const string hysteriaCoreUrl = "https://github.com/HyNetwork/hysteria/releases";
|
||||||
|
public const string naiveproxyCoreUrl = "https://github.com/klzgrad/naiveproxy/releases";
|
||||||
|
public const string tuicCoreUrl = "https://github.com/EAimTY/tuic/releases";
|
||||||
|
public const string singboxCoreUrl = "https://github.com/SagerNet/sing-box/releases";
|
||||||
|
public const string geoUrl = "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/{0}.dat";
|
||||||
|
public const string SpeedTestUrl = @"http://cachefly.cachefly.net/10mb.test";
|
||||||
public const string SpeedPingTestUrl = @"https://www.google.com/generate_204";
|
public const string SpeedPingTestUrl = @"https://www.google.com/generate_204";
|
||||||
public const string AvailabilityTestUrl = @"https://www.google.com/generate_204";
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// CustomRoutingListUrl
|
|
||||||
/// </summary>
|
|
||||||
public const string CustomRoutingListUrl = @"https://raw.githubusercontent.com/2dust/v2rayCustomRoutingList/master/";
|
public const string CustomRoutingListUrl = @"https://raw.githubusercontent.com/2dust/v2rayCustomRoutingList/master/";
|
||||||
|
|
||||||
public const string GFWLIST_URL = "https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt";
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// PromotionUrl
|
|
||||||
/// </summary>
|
|
||||||
public const string PromotionUrl = @"aHR0cHM6Ly85LjIzNDQ1Ni54eXovYWJjLmh0bWw=";
|
public const string PromotionUrl = @"aHR0cHM6Ly85LjIzNDQ1Ni54eXovYWJjLmh0bWw=";
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 本软件配置文件名
|
|
||||||
/// </summary>
|
|
||||||
public const string ConfigFileName = "guiNConfig.json";
|
public const string ConfigFileName = "guiNConfig.json";
|
||||||
|
public const string ConfigDB = "guiNDB.db";
|
||||||
/// <summary>
|
public const string coreConfigFileName = "config.json";
|
||||||
/// v2ray配置文件名
|
public const string v2raySampleClient = "v2rayN.Sample.SampleClientConfig";
|
||||||
/// </summary>
|
public const string v2raySampleServer = "v2rayN.Sample.SampleServerConfig";
|
||||||
public const string v2rayConfigFileName = "config.json";
|
public const string v2raySampleHttprequestFileName = "v2rayN.Sample.SampleHttprequest";
|
||||||
|
public const string v2raySampleHttpresponseFileName = "v2rayN.Sample.SampleHttpresponse";
|
||||||
/// <summary>
|
|
||||||
/// v2ray客户端配置样例文件名
|
|
||||||
/// </summary>
|
|
||||||
public const string v2raySampleClient = "v2rayN.Sample.SampleClientConfig.txt";
|
|
||||||
/// <summary>
|
|
||||||
/// v2ray服务端配置样例文件名
|
|
||||||
/// </summary>
|
|
||||||
public const string v2raySampleServer = "v2rayN.Sample.SampleServerConfig.txt";
|
|
||||||
/// <summary>
|
|
||||||
/// v2ray配置Httprequest文件名
|
|
||||||
/// </summary>
|
|
||||||
public const string v2raySampleHttprequestFileName = "v2rayN.Sample.SampleHttprequest.txt";
|
|
||||||
/// <summary>
|
|
||||||
/// v2ray配置Httpresponse文件名
|
|
||||||
/// </summary>
|
|
||||||
public const string v2raySampleHttpresponseFileName = "v2rayN.Sample.SampleHttpresponse.txt";
|
|
||||||
/// <summary>
|
|
||||||
/// 空白的pac文件
|
|
||||||
/// </summary>
|
|
||||||
public const string BlankPacFileName = "v2rayN.Sample.BlankPac.txt";
|
|
||||||
|
|
||||||
public const string CustomRoutingFileName = "v2rayN.Sample.custom_routing_";
|
public const string CustomRoutingFileName = "v2rayN.Sample.custom_routing_";
|
||||||
|
public const string v2raySampleInbound = "v2rayN.Sample.SampleInbound";
|
||||||
|
public const string TunSingboxFileName = "v2rayN.Sample.tun_singbox";
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 默认加密方式
|
|
||||||
/// </summary>
|
|
||||||
public const string DefaultSecurity = "auto";
|
public const string DefaultSecurity = "auto";
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 默认传输协议
|
|
||||||
/// </summary>
|
|
||||||
public const string DefaultNetwork = "tcp";
|
public const string DefaultNetwork = "tcp";
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Tcp伪装http
|
|
||||||
/// </summary>
|
|
||||||
public const string TcpHeaderHttp = "http";
|
public const string TcpHeaderHttp = "http";
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// None值
|
|
||||||
/// </summary>
|
|
||||||
public const string None = "none";
|
public const string None = "none";
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 代理 tag值
|
|
||||||
/// </summary>
|
|
||||||
public const string agentTag = "proxy";
|
public const string agentTag = "proxy";
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 直连 tag值
|
|
||||||
/// </summary>
|
|
||||||
public const string directTag = "direct";
|
public const string directTag = "direct";
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 阻止 tag值
|
|
||||||
/// </summary>
|
|
||||||
public const string blockTag = "block";
|
public const string blockTag = "block";
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public const string StreamSecurity = "tls";
|
public const string StreamSecurity = "tls";
|
||||||
|
public const string StreamSecurityX = "xtls";
|
||||||
public const string InboundSocks = "socks";
|
public const string InboundSocks = "socks";
|
||||||
public const string InboundHttp = "http";
|
public const string InboundHttp = "http";
|
||||||
|
public const string InboundSocks2 = "socks2";
|
||||||
|
public const string InboundHttp2 = "http2";
|
||||||
public const string Loopback = "127.0.0.1";
|
public const string Loopback = "127.0.0.1";
|
||||||
public const string InboundAPITagName = "api";
|
public const string InboundAPITagName = "api";
|
||||||
public const string InboundAPIProtocal = "dokodemo-door";
|
public const string InboundAPIProtocal = "dokodemo-door";
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// vmess
|
|
||||||
/// </summary>
|
|
||||||
public const string vmessProtocol = "vmess://";
|
public const string vmessProtocol = "vmess://";
|
||||||
/// <summary>
|
public const string vmessProtocolLite = "vmess";
|
||||||
/// shadowsocks
|
|
||||||
/// </summary>
|
|
||||||
public const string ssProtocol = "ss://";
|
public const string ssProtocol = "ss://";
|
||||||
/// <summary>
|
public const string ssProtocolLite = "shadowsocks";
|
||||||
/// socks
|
|
||||||
/// </summary>
|
|
||||||
public const string socksProtocol = "socks://";
|
public const string socksProtocol = "socks://";
|
||||||
/// <summary>
|
public const string socksProtocolLite = "socks";
|
||||||
/// http
|
|
||||||
/// </summary>
|
|
||||||
public const string httpProtocol = "http://";
|
public const string httpProtocol = "http://";
|
||||||
/// <summary>
|
|
||||||
/// https
|
|
||||||
/// </summary>
|
|
||||||
public const string httpsProtocol = "https://";
|
public const string httpsProtocol = "https://";
|
||||||
|
public const string vlessProtocol = "vless://";
|
||||||
|
public const string vlessProtocolLite = "vless";
|
||||||
|
public const string trojanProtocol = "trojan://";
|
||||||
|
public const string trojanProtocolLite = "trojan";
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// pac
|
|
||||||
/// </summary>
|
|
||||||
public const string pacFILE = "pac.txt";
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// email
|
|
||||||
/// </summary>
|
|
||||||
public const string userEMail = "t@t.tt";
|
public const string userEMail = "t@t.tt";
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// MyRegPath
|
|
||||||
/// </summary>
|
|
||||||
public const string MyRegPath = "Software\\v2rayNGUI";
|
public const string MyRegPath = "Software\\v2rayNGUI";
|
||||||
|
public const string AutoRunRegPath = @"Software\Microsoft\Windows\CurrentVersion\Run";
|
||||||
/// <summary>
|
public const string AutoRunName = "v2rayNAutoRun";
|
||||||
/// Language
|
|
||||||
/// </summary>
|
|
||||||
public const string MyRegKeyLanguage = "CurrentLanguage";
|
public const string MyRegKeyLanguage = "CurrentLanguage";
|
||||||
/// <summary>
|
|
||||||
/// Icon
|
|
||||||
/// </summary>
|
|
||||||
public const string CustomIconName = "v2rayN.ico";
|
public const string CustomIconName = "v2rayN.ico";
|
||||||
|
|
||||||
public enum StatisticsFreshRate
|
|
||||||
{
|
|
||||||
quick = 1000,
|
|
||||||
medium = 2000,
|
|
||||||
slow = 3000
|
|
||||||
}
|
|
||||||
public const string StatisticLogOverall = "StatisticLogOverall.json";
|
|
||||||
|
|
||||||
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 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 int MaxPort = 65536;
|
||||||
|
public const string CommandClearMsg = "CommandClearMsg";
|
||||||
|
public const string DelayUnit = "";
|
||||||
|
public const string SpeedUnit = "";
|
||||||
|
|
||||||
|
public static readonly List<string> IEProxyProtocols = new List<string> {
|
||||||
|
"{ip}:{http_port}",
|
||||||
|
"socks={ip}:{socks_port}",
|
||||||
|
"http={ip}:{http_port};https={ip}:{http_port};ftp={ip}:{http_port};socks={ip}:{socks_port}",
|
||||||
|
"http=http://{ip}:{http_port};https=http://{ip}:{http_port}",
|
||||||
|
""
|
||||||
|
};
|
||||||
|
public static readonly List<string> vmessSecuritys = new List<string> { "aes-128-gcm", "chacha20-poly1305", "auto", "none", "zero" };
|
||||||
|
public static readonly List<string> ssSecuritys = new List<string> { "aes-256-gcm", "aes-128-gcm", "chacha20-poly1305", "chacha20-ietf-poly1305", "none", "plain" };
|
||||||
|
public static readonly List<string> ssSecuritysInSagerNet = new List<string> { "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 List<string> { "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> xtlsFlows = new List<string> { "", "xtls-rprx-origin", "xtls-rprx-origin-udp443", "xtls-rprx-direct", "xtls-rprx-direct-udp443", "xtls-rprx-vision", "xtls-rprx-vision-udp443" };
|
||||||
|
public static readonly List<string> networks = new List<string> { "tcp", "kcp", "ws", "h2", "quic", "grpc" };
|
||||||
|
public static readonly List<string> kcpHeaderTypes = new List<string> { "srtp", "utp", "wechat-video", "dtls", "wireguard" };
|
||||||
|
public static readonly List<string> coreTypes = new List<string> { "v2fly", "SagerNet", "Xray", "v2fly_v5" };
|
||||||
|
public static readonly List<string> domainStrategys = new List<string> { "AsIs", "IPIfNonMatch", "IPOnDemand" };
|
||||||
|
public static readonly List<string> domainMatchers = new List<string> { "linear", "mph", "" };
|
||||||
|
public static readonly List<string> fingerprints = new List<string> { "chrome", "firefox", "safari", "randomized", "" };
|
||||||
|
public static readonly List<string> allowInsecures = new List<string> { "true", "false", "" };
|
||||||
|
public static readonly List<string> domainStrategy4Freedoms = new List<string> { "AsIs", "UseIP", "UseIPv4", "UseIPv6", "" };
|
||||||
|
public static readonly List<string> Languages = new List<string> { "zh-Hans", "en" };
|
||||||
|
public static readonly List<string> alpns = new List<string> { "h2", "http/1.1", "h2,http/1.1", "" };
|
||||||
|
public static readonly List<string> LogLevel = new List<string> { "debug", "info", "warning", "error", "none" };
|
||||||
|
public static readonly List<string> InboundTags = new List<string> { "socks", "http", "socks2", "http2" };
|
||||||
|
public static readonly List<string> Protocols = new List<string> { "http", "tls", "bittorrent" };
|
||||||
|
public static readonly List<string> TunMtus = new List<string> { "9000", "1500" };
|
||||||
|
public static readonly List<string> TunStacks = new List<string> { "gvisor", "system" };
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region 全局变量
|
#region global variable
|
||||||
|
|
||||||
/// <summary>
|
public static bool reloadCore { get; set; }
|
||||||
/// 是否需要重启服务V2ray
|
public static int statePort { get; set; }
|
||||||
/// </summary>
|
public static Job processJob { get; set; }
|
||||||
public static bool reloadV2ray
|
public static bool ShowInTaskbar { get; set; }
|
||||||
{
|
public static string ExePathKey { get; set; }
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 是否开启全局代理(http)
|
|
||||||
/// </summary>
|
|
||||||
public static bool sysAgent
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// socks端口
|
|
||||||
/// </summary>
|
|
||||||
public static int socksPort
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// http端口
|
|
||||||
/// </summary>
|
|
||||||
public static int httpPort
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// PAC端口
|
|
||||||
/// </summary>
|
|
||||||
public static int pacPort
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public static int statePort
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Job processJob
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
public static System.Threading.Mutex mutexObj
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
1550
v2rayN/v2rayN/Handler/CoreConfigHandler.cs
Normal file
1550
v2rayN/v2rayN/Handler/CoreConfigHandler.cs
Normal file
File diff suppressed because it is too large
Load Diff
317
v2rayN/v2rayN/Handler/CoreHandler.cs
Normal file
317
v2rayN/v2rayN/Handler/CoreHandler.cs
Normal file
@@ -0,0 +1,317 @@
|
|||||||
|
using System.Diagnostics;
|
||||||
|
using System.IO;
|
||||||
|
using System.Text;
|
||||||
|
using v2rayN.Mode;
|
||||||
|
using v2rayN.Resx;
|
||||||
|
|
||||||
|
namespace v2rayN.Handler
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Core process processing class
|
||||||
|
/// </summary>
|
||||||
|
class CoreHandler
|
||||||
|
{
|
||||||
|
private static string coreCConfigRes = Global.coreConfigFileName;
|
||||||
|
private CoreInfo coreInfo;
|
||||||
|
private int processId = 0;
|
||||||
|
private Process _process;
|
||||||
|
Action<bool, string> _updateFunc;
|
||||||
|
|
||||||
|
public CoreHandler(Action<bool, string> update)
|
||||||
|
{
|
||||||
|
_updateFunc = update;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LoadCore(Config config)
|
||||||
|
{
|
||||||
|
if (Global.reloadCore)
|
||||||
|
{
|
||||||
|
var node = ConfigHandler.GetDefaultServer(ref config);
|
||||||
|
if (node == null)
|
||||||
|
{
|
||||||
|
ShowMsg(false, ResUI.CheckServerSettings);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (SetCore(config, node) != 0)
|
||||||
|
{
|
||||||
|
ShowMsg(false, ResUI.CheckServerSettings);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
string fileName = Utils.GetConfigPath(coreCConfigRes);
|
||||||
|
if (CoreConfigHandler.GenerateClientConfig(node, fileName, out string msg, out string content) != 0)
|
||||||
|
{
|
||||||
|
ShowMsg(false, msg);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ShowMsg(false, msg);
|
||||||
|
ShowMsg(true, $"{node.GetSummary()}");
|
||||||
|
CoreStop();
|
||||||
|
CoreStart(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
//start a socks service
|
||||||
|
if (_process != null && !_process.HasExited && node.configType == EConfigType.Custom && node.preSocksPort > 0)
|
||||||
|
{
|
||||||
|
var itemSocks = new ProfileItem()
|
||||||
|
{
|
||||||
|
configType = EConfigType.Socks,
|
||||||
|
address = Global.Loopback,
|
||||||
|
port = node.preSocksPort
|
||||||
|
};
|
||||||
|
if (CoreConfigHandler.GenerateClientConfig(itemSocks, null, out string msg2, out string configStr) == 0)
|
||||||
|
{
|
||||||
|
processId = CoreStartViaString(configStr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int LoadCoreConfigString(Config config, List<ServerTestItem> _selecteds)
|
||||||
|
{
|
||||||
|
int pid = -1;
|
||||||
|
string configStr = CoreConfigHandler.GenerateClientSpeedtestConfigString(config, _selecteds, out string msg);
|
||||||
|
if (configStr == "")
|
||||||
|
{
|
||||||
|
ShowMsg(false, msg);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ShowMsg(false, msg);
|
||||||
|
pid = CoreStartViaString(configStr);
|
||||||
|
}
|
||||||
|
return pid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CoreStop()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (_process != null)
|
||||||
|
{
|
||||||
|
KillProcess(_process);
|
||||||
|
_process.Dispose();
|
||||||
|
_process = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (coreInfo == null || coreInfo.coreExes == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
foreach (string vName in coreInfo.coreExes)
|
||||||
|
{
|
||||||
|
Process[] existing = Process.GetProcessesByName(vName);
|
||||||
|
foreach (Process p in existing)
|
||||||
|
{
|
||||||
|
string path = p.MainModule.FileName;
|
||||||
|
if (path == $"{Utils.GetBinPath(vName, coreInfo.coreType)}.exe")
|
||||||
|
{
|
||||||
|
KillProcess(p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (processId > 0)
|
||||||
|
{
|
||||||
|
CoreStopPid(processId);
|
||||||
|
processId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Utils.SaveLog(ex.Message, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CoreStopPid(int pid)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Process _p = Process.GetProcessById(pid);
|
||||||
|
KillProcess(_p);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Utils.SaveLog(ex.Message, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private string CoreFindexe(List<string> lstCoreTemp)
|
||||||
|
{
|
||||||
|
string fileName = string.Empty;
|
||||||
|
foreach (string name in lstCoreTemp)
|
||||||
|
{
|
||||||
|
string vName = $"{name}.exe";
|
||||||
|
vName = Utils.GetBinPath(vName, coreInfo.coreType);
|
||||||
|
if (File.Exists(vName))
|
||||||
|
{
|
||||||
|
fileName = vName;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (Utils.IsNullOrEmpty(fileName))
|
||||||
|
{
|
||||||
|
string msg = string.Format(ResUI.NotFoundCore, Utils.GetBinPath("", coreInfo.coreType), string.Join(", ", lstCoreTemp.ToArray()), coreInfo.coreUrl);
|
||||||
|
ShowMsg(false, msg);
|
||||||
|
}
|
||||||
|
return fileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CoreStart(ProfileItem node)
|
||||||
|
{
|
||||||
|
ShowMsg(false, string.Format(ResUI.StartService, DateTime.Now.ToString()));
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string fileName = CoreFindexe(coreInfo.coreExes);
|
||||||
|
if (fileName == "") return;
|
||||||
|
|
||||||
|
Process p = new Process
|
||||||
|
{
|
||||||
|
StartInfo = new ProcessStartInfo
|
||||||
|
{
|
||||||
|
FileName = fileName,
|
||||||
|
Arguments = coreInfo.arguments,
|
||||||
|
WorkingDirectory = Utils.GetConfigPath(),
|
||||||
|
UseShellExecute = false,
|
||||||
|
RedirectStandardOutput = node.displayLog,
|
||||||
|
RedirectStandardError = node.displayLog,
|
||||||
|
CreateNoWindow = true,
|
||||||
|
StandardOutputEncoding = node.displayLog ? Encoding.UTF8 : null,
|
||||||
|
StandardErrorEncoding = node.displayLog ? Encoding.UTF8 : null,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if (node.displayLog)
|
||||||
|
{
|
||||||
|
p.OutputDataReceived += (sender, e) =>
|
||||||
|
{
|
||||||
|
if (!String.IsNullOrEmpty(e.Data))
|
||||||
|
{
|
||||||
|
string msg = e.Data + Environment.NewLine;
|
||||||
|
ShowMsg(false, msg);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
p.Start();
|
||||||
|
if (node.displayLog)
|
||||||
|
{
|
||||||
|
p.BeginOutputReadLine();
|
||||||
|
}
|
||||||
|
_process = p;
|
||||||
|
|
||||||
|
if (p.WaitForExit(1000))
|
||||||
|
{
|
||||||
|
throw new Exception(node.displayLog ? p.StandardError.ReadToEnd() : "启动进程失败并退出 (Failed to start the process and exited)");
|
||||||
|
}
|
||||||
|
|
||||||
|
Global.processJob.AddProcess(p.Handle);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Utils.SaveLog(ex.Message, ex);
|
||||||
|
string msg = ex.Message;
|
||||||
|
ShowMsg(true, msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int CoreStartViaString(string configStr)
|
||||||
|
{
|
||||||
|
ShowMsg(false, string.Format(ResUI.StartService, DateTime.Now.ToString()));
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string fileName = CoreFindexe(new List<string> { "xray", "wxray", "wv2ray", "v2ray" });
|
||||||
|
if (fileName == "") return -1;
|
||||||
|
|
||||||
|
Process p = new Process
|
||||||
|
{
|
||||||
|
StartInfo = new ProcessStartInfo
|
||||||
|
{
|
||||||
|
FileName = fileName,
|
||||||
|
Arguments = "-config stdin:",
|
||||||
|
WorkingDirectory = Utils.GetConfigPath(),
|
||||||
|
UseShellExecute = false,
|
||||||
|
RedirectStandardInput = true,
|
||||||
|
RedirectStandardOutput = true,
|
||||||
|
RedirectStandardError = true,
|
||||||
|
CreateNoWindow = true,
|
||||||
|
StandardOutputEncoding = Encoding.UTF8,
|
||||||
|
StandardErrorEncoding = Encoding.UTF8
|
||||||
|
}
|
||||||
|
};
|
||||||
|
p.OutputDataReceived += (sender, e) =>
|
||||||
|
{
|
||||||
|
if (!String.IsNullOrEmpty(e.Data))
|
||||||
|
{
|
||||||
|
string msg = e.Data + Environment.NewLine;
|
||||||
|
ShowMsg(false, msg);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
p.Start();
|
||||||
|
p.BeginOutputReadLine();
|
||||||
|
|
||||||
|
p.StandardInput.Write(configStr);
|
||||||
|
p.StandardInput.Close();
|
||||||
|
|
||||||
|
if (p.WaitForExit(1000))
|
||||||
|
{
|
||||||
|
throw new Exception(p.StandardError.ReadToEnd());
|
||||||
|
}
|
||||||
|
|
||||||
|
Global.processJob.AddProcess(p.Handle);
|
||||||
|
return p.Id;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Utils.SaveLog(ex.Message, ex);
|
||||||
|
string msg = ex.Message;
|
||||||
|
ShowMsg(false, msg);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ShowMsg(bool updateToTrayTooltip, string msg)
|
||||||
|
{
|
||||||
|
_updateFunc(updateToTrayTooltip, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void KillProcess(Process p)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
p.CloseMainWindow();
|
||||||
|
p.WaitForExit(100);
|
||||||
|
if (!p.HasExited)
|
||||||
|
{
|
||||||
|
p.Kill();
|
||||||
|
p.WaitForExit(100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Utils.SaveLog(ex.Message, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int SetCore(Config config, ProfileItem node)
|
||||||
|
{
|
||||||
|
if (node == null)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
var coreType = LazyConfig.Instance.GetCoreType(node, node.configType);
|
||||||
|
|
||||||
|
coreInfo = LazyConfig.Instance.GetCoreInfo(coreType);
|
||||||
|
|
||||||
|
if (coreInfo == null)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,16 +1,11 @@
|
|||||||
using Newtonsoft.Json;
|
using System.Diagnostics;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
using System.Text;
|
using System.Net.Http.Headers;
|
||||||
using System.Text.RegularExpressions;
|
using System.Net.Sockets;
|
||||||
using System.Threading.Tasks;
|
|
||||||
using v2rayN.Base;
|
using v2rayN.Base;
|
||||||
using v2rayN.Mode;
|
using v2rayN.Resx;
|
||||||
using v2rayN.Properties;
|
|
||||||
|
|
||||||
namespace v2rayN.Handler
|
namespace v2rayN.Handler
|
||||||
{
|
{
|
||||||
@@ -19,19 +14,10 @@ namespace v2rayN.Handler
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
class DownloadHandle
|
class DownloadHandle
|
||||||
{
|
{
|
||||||
public event EventHandler<ResultEventArgs> AbsoluteCompleted;
|
|
||||||
|
|
||||||
public event EventHandler<ResultEventArgs> UpdateCompleted;
|
public event EventHandler<ResultEventArgs> UpdateCompleted;
|
||||||
|
|
||||||
public event ErrorEventHandler Error;
|
public event ErrorEventHandler Error;
|
||||||
|
|
||||||
public string DownloadFileName
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return "v2ray-windows.zip";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ResultEventArgs : EventArgs
|
public class ResultEventArgs : EventArgs
|
||||||
{
|
{
|
||||||
@@ -40,214 +26,115 @@ namespace v2rayN.Handler
|
|||||||
|
|
||||||
public ResultEventArgs(bool success, string msg)
|
public ResultEventArgs(bool success, string msg)
|
||||||
{
|
{
|
||||||
this.Success = success;
|
Success = success;
|
||||||
this.Msg = msg;
|
Msg = msg;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private int progressPercentage = -1;
|
public async Task<int> DownloadDataAsync(string url, WebProxy webProxy, int downloadTimeout, Action<bool, string> update)
|
||||||
private long totalBytesToReceive = 0;
|
|
||||||
private DateTime totalDatetime = new DateTime();
|
|
||||||
private int DownloadTimeout = -1;
|
|
||||||
|
|
||||||
#region Check for updates
|
|
||||||
|
|
||||||
private readonly string nLatestUrl = "https://github.com/2dust/v2rayN/releases/latest";
|
|
||||||
private const string nUrl = "https://github.com/2dust/v2rayN/releases/download/{0}/v2rayN.zip";
|
|
||||||
private readonly string coreLatestUrl = "https://github.com/v2ray/v2ray-core/releases/latest";
|
|
||||||
private const string coreUrl = "https://github.com/v2ray/v2ray-core/releases/download/{0}/v2ray-windows-{1}.zip";
|
|
||||||
|
|
||||||
public async void CheckUpdateAsync(string type)
|
|
||||||
{
|
{
|
||||||
Utils.SetSecurityProtocol();
|
var hasValue = false;
|
||||||
WebRequestHandler webRequestHandler = new WebRequestHandler
|
try
|
||||||
{
|
{
|
||||||
AllowAutoRedirect = false
|
Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13);
|
||||||
|
|
||||||
|
var client = new HttpClient(new SocketsHttpHandler()
|
||||||
|
{
|
||||||
|
Proxy = webProxy
|
||||||
|
});
|
||||||
|
|
||||||
|
var progress = new Progress<string>();
|
||||||
|
progress.ProgressChanged += (sender, value) =>
|
||||||
|
{
|
||||||
|
hasValue = true;
|
||||||
|
if (update != null)
|
||||||
|
{
|
||||||
|
string msg = $"{value}";
|
||||||
|
update(false, msg);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
HttpClient httpClient = new HttpClient(webRequestHandler);
|
|
||||||
|
|
||||||
string url;
|
var cancellationToken = new CancellationTokenSource();
|
||||||
if (type == "Core")
|
cancellationToken.CancelAfter(downloadTimeout * 1000);
|
||||||
{
|
await HttpClientHelper.GetInstance().DownloadDataAsync4Speed(client,
|
||||||
url = coreLatestUrl;
|
url,
|
||||||
|
progress,
|
||||||
|
cancellationToken.Token);
|
||||||
}
|
}
|
||||||
else if (type == "v2rayN")
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
url = nLatestUrl;
|
if (!hasValue)
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
throw new ArgumentException("Type");
|
update(false, ex.Message);
|
||||||
|
if (ex.InnerException != null)
|
||||||
|
{
|
||||||
|
update(false, ex.InnerException.Message);
|
||||||
}
|
}
|
||||||
HttpResponseMessage response = await httpClient.GetAsync(url);
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DownloadFileAsync(string url, bool blProxy, int downloadTimeout)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13);
|
||||||
|
UpdateCompleted?.Invoke(this, new ResultEventArgs(false, ResUI.Downloading));
|
||||||
|
|
||||||
|
var client = new HttpClient(new SocketsHttpHandler()
|
||||||
|
{
|
||||||
|
Proxy = GetWebProxy(blProxy)
|
||||||
|
});
|
||||||
|
|
||||||
|
var progress = new Progress<double>();
|
||||||
|
progress.ProgressChanged += (sender, value) =>
|
||||||
|
{
|
||||||
|
if (UpdateCompleted != null)
|
||||||
|
{
|
||||||
|
string msg = $"...{value}%";
|
||||||
|
UpdateCompleted(this, new ResultEventArgs(value > 100 ? true : false, msg));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var cancellationToken = new CancellationTokenSource();
|
||||||
|
_ = HttpClientHelper.GetInstance().DownloadFileAsync(client,
|
||||||
|
url,
|
||||||
|
Utils.GetTempPath(Utils.GetDownloadFileName(url)),
|
||||||
|
progress,
|
||||||
|
cancellationToken.Token);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Utils.SaveLog(ex.Message, ex);
|
||||||
|
|
||||||
|
Error?.Invoke(this, new ErrorEventArgs(ex));
|
||||||
|
if (ex.InnerException != null)
|
||||||
|
{
|
||||||
|
Error?.Invoke(this, new ErrorEventArgs(ex.InnerException));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<string> UrlRedirectAsync(string url, bool blProxy)
|
||||||
|
{
|
||||||
|
Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13);
|
||||||
|
var webRequestHandler = new SocketsHttpHandler
|
||||||
|
{
|
||||||
|
AllowAutoRedirect = false,
|
||||||
|
Proxy = GetWebProxy(blProxy)
|
||||||
|
};
|
||||||
|
HttpClient client = new HttpClient(webRequestHandler);
|
||||||
|
|
||||||
|
HttpResponseMessage response = await client.GetAsync(url);
|
||||||
if (response.StatusCode.ToString() == "Redirect")
|
if (response.StatusCode.ToString() == "Redirect")
|
||||||
{
|
{
|
||||||
responseHandler(type, response.Headers.Location.ToString());
|
return response.Headers.Location.ToString();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Utils.SaveLog("StatusCode error: " + url);
|
Utils.SaveLog("StatusCode error: " + url);
|
||||||
return;
|
return null;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取V2RayCore版本
|
|
||||||
/// </summary>
|
|
||||||
public string getV2rayVersion()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
string filePath = Utils.GetPath("V2ray.exe");
|
|
||||||
if (!File.Exists(filePath))
|
|
||||||
{
|
|
||||||
string msg = string.Format(UIRes.I18N("NotFoundCore"), @"https://github.com/v2ray/v2ray-core/releases");
|
|
||||||
//ShowMsg(true, msg);
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
|
|
||||||
Process p = new Process();
|
|
||||||
p.StartInfo.FileName = filePath;
|
|
||||||
p.StartInfo.Arguments = "-version";
|
|
||||||
p.StartInfo.WorkingDirectory = Utils.StartupPath();
|
|
||||||
p.StartInfo.UseShellExecute = false;
|
|
||||||
p.StartInfo.RedirectStandardOutput = true;
|
|
||||||
p.StartInfo.CreateNoWindow = true;
|
|
||||||
p.StartInfo.StandardOutputEncoding = Encoding.UTF8;
|
|
||||||
p.Start();
|
|
||||||
p.WaitForExit(5000);
|
|
||||||
string echo = p.StandardOutput.ReadToEnd();
|
|
||||||
string version = Regex.Match(echo, "V2Ray ([0-9.]+) \\(").Groups[1].Value;
|
|
||||||
return version;
|
|
||||||
}
|
|
||||||
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Utils.SaveLog(ex.Message, ex);
|
|
||||||
return "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private void responseHandler(string type, string redirectUrl)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
string version = redirectUrl.Substring(redirectUrl.LastIndexOf("/", StringComparison.Ordinal) + 1);
|
|
||||||
|
|
||||||
string curVersion;
|
|
||||||
string message;
|
|
||||||
string url;
|
|
||||||
if (type == "Core") {
|
|
||||||
curVersion = "v" + getV2rayVersion();
|
|
||||||
message = string.Format(UIRes.I18N("IsLatestCore"), curVersion);
|
|
||||||
string osBit = Environment.Is64BitProcess ? "64" : "32";
|
|
||||||
url = string.Format(coreUrl, version, osBit);
|
|
||||||
}
|
|
||||||
else if (type == "v2rayN") {
|
|
||||||
curVersion = FileVersionInfo.GetVersionInfo(Utils.GetExePath()).FileVersion.ToString();
|
|
||||||
message = string.Format(UIRes.I18N("IsLatestN"), curVersion);
|
|
||||||
url = string.Format(nUrl, version);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
throw new ArgumentException("Type");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (curVersion == version)
|
|
||||||
{
|
|
||||||
AbsoluteCompleted?.Invoke(this, new ResultEventArgs(false, message));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
AbsoluteCompleted?.Invoke(this, new ResultEventArgs(true, url));
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Utils.SaveLog(ex.Message, ex);
|
|
||||||
|
|
||||||
Error?.Invoke(this, new ErrorEventArgs(ex));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
#region Download
|
|
||||||
|
|
||||||
public void DownloadFileAsync(string url, WebProxy webProxy, int downloadTimeout)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Utils.SetSecurityProtocol();
|
|
||||||
UpdateCompleted?.Invoke(this, new ResultEventArgs(false, UIRes.I18N("Downloading")));
|
|
||||||
|
|
||||||
progressPercentage = -1;
|
|
||||||
totalBytesToReceive = 0;
|
|
||||||
|
|
||||||
WebClientEx ws = new WebClientEx();
|
|
||||||
DownloadTimeout = downloadTimeout;
|
|
||||||
if (webProxy != null)
|
|
||||||
{
|
|
||||||
ws.Proxy = webProxy;// new WebProxy(Global.Loopback, Global.httpPort);
|
|
||||||
}
|
|
||||||
|
|
||||||
ws.DownloadFileCompleted += ws_DownloadFileCompleted;
|
|
||||||
ws.DownloadProgressChanged += ws_DownloadProgressChanged;
|
|
||||||
ws.DownloadFileAsync(new Uri(url), Utils.GetPath(DownloadFileName));
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Utils.SaveLog(ex.Message, ex);
|
|
||||||
|
|
||||||
Error?.Invoke(this, new ErrorEventArgs(ex));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ws_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
|
|
||||||
{
|
|
||||||
if (UpdateCompleted != null)
|
|
||||||
{
|
|
||||||
if (totalBytesToReceive == 0)
|
|
||||||
{
|
|
||||||
totalDatetime = DateTime.Now;
|
|
||||||
totalBytesToReceive = e.BytesReceived;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
totalBytesToReceive = e.BytesReceived;
|
|
||||||
|
|
||||||
if (DownloadTimeout != -1)
|
|
||||||
{
|
|
||||||
if ((DateTime.Now - totalDatetime).TotalSeconds > DownloadTimeout)
|
|
||||||
{
|
|
||||||
((WebClientEx)sender).CancelAsync();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (progressPercentage != e.ProgressPercentage && e.ProgressPercentage % 10 == 0)
|
|
||||||
{
|
|
||||||
progressPercentage = e.ProgressPercentage;
|
|
||||||
string msg = string.Format("...{0}%", e.ProgressPercentage);
|
|
||||||
UpdateCompleted(this, new ResultEventArgs(false, msg));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ws_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (UpdateCompleted != null)
|
|
||||||
{
|
|
||||||
if (e.Error != null) throw e.Error;
|
|
||||||
|
|
||||||
((WebClientEx)sender).Dispose();
|
|
||||||
TimeSpan ts = (DateTime.Now - totalDatetime);
|
|
||||||
string speed = string.Format("<{0} MB/s", (totalBytesToReceive / ts.TotalMilliseconds / 1000).ToString("#0.##"));
|
|
||||||
UpdateCompleted(this, new ResultEventArgs(true, speed));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Utils.SaveLog(ex.Message, ex);
|
|
||||||
|
|
||||||
Error?.Invoke(this, new ErrorEventArgs(ex));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -255,87 +142,144 @@ namespace v2rayN.Handler
|
|||||||
/// DownloadString
|
/// DownloadString
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="url"></param>
|
/// <param name="url"></param>
|
||||||
public void WebDownloadString(string url)
|
public async Task<string> DownloadStringAsync(string url, bool blProxy, string userAgent)
|
||||||
{
|
{
|
||||||
string source = string.Empty;
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Utils.SetSecurityProtocol();
|
Utils.SetSecurityProtocol(LazyConfig.Instance.GetConfig().enableSecurityProtocolTls13);
|
||||||
|
var client = new HttpClient(new SocketsHttpHandler()
|
||||||
|
{
|
||||||
|
Proxy = GetWebProxy(blProxy)
|
||||||
|
});
|
||||||
|
|
||||||
WebClientEx ws = new WebClientEx();
|
if (Utils.IsNullOrEmpty(userAgent))
|
||||||
ws.DownloadStringCompleted += Ws_DownloadStringCompleted;
|
{
|
||||||
ws.DownloadStringAsync(new Uri(url));
|
userAgent = $"{Utils.GetVersion(false)}";
|
||||||
|
}
|
||||||
|
client.DefaultRequestHeaders.UserAgent.TryParseAdd(userAgent);
|
||||||
|
|
||||||
|
Uri uri = new Uri(url);
|
||||||
|
//Authorization Header
|
||||||
|
if (!Utils.IsNullOrEmpty(uri.UserInfo))
|
||||||
|
{
|
||||||
|
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Utils.Base64Encode(uri.UserInfo));
|
||||||
|
}
|
||||||
|
|
||||||
|
var cts = new CancellationTokenSource();
|
||||||
|
cts.CancelAfter(1000 * 30);
|
||||||
|
|
||||||
|
var result = await HttpClientHelper.GetInstance().GetAsync(client, url, cts.Token);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Utils.SaveLog(ex.Message, ex);
|
Utils.SaveLog(ex.Message, ex);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Ws_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (e.Error == null
|
|
||||||
|| Utils.IsNullOrEmpty(e.Error.ToString()))
|
|
||||||
{
|
|
||||||
string source = e.Result;
|
|
||||||
UpdateCompleted?.Invoke(this, new ResultEventArgs(true, source));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
throw e.Error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Utils.SaveLog(ex.Message, ex);
|
|
||||||
|
|
||||||
Error?.Invoke(this, new ErrorEventArgs(ex));
|
Error?.Invoke(this, new ErrorEventArgs(ex));
|
||||||
|
if (ex.InnerException != null)
|
||||||
|
{
|
||||||
|
Error?.Invoke(this, new ErrorEventArgs(ex.InnerException));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
public int RunAvailabilityCheck(WebProxy webProxy)
|
||||||
|
|
||||||
#region PAC
|
|
||||||
|
|
||||||
public string GenPacFile(string result)
|
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
File.WriteAllText(Utils.GetTempPath("gfwlist.txt"), result, Encoding.UTF8);
|
if (webProxy == null)
|
||||||
List<string> lines = ParsePacResult(result);
|
{
|
||||||
string abpContent = Utils.UnGzip(Resources.abp_js);
|
var httpPort = LazyConfig.Instance.GetLocalPort(Global.InboundHttp);
|
||||||
abpContent = abpContent.Replace("__RULES__", JsonConvert.SerializeObject(lines, Formatting.Indented));
|
webProxy = new WebProxy(Global.Loopback, httpPort);
|
||||||
File.WriteAllText(Utils.GetPath(Global.pacFILE), abpContent, Encoding.UTF8);
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string status = GetRealPingTime(Global.SpeedPingTestUrl, webProxy, 10, out int responseTime);
|
||||||
|
bool noError = Utils.IsNullOrEmpty(status);
|
||||||
|
return noError ? responseTime : -1;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Utils.SaveLog(ex.Message, ex);
|
Utils.SaveLog(ex.Message, ex);
|
||||||
return ex.Message;
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Utils.SaveLog(ex.Message, ex);
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
return string.Empty;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<string> ParsePacResult(string response)
|
public string GetRealPingTime(string url, WebProxy webProxy, int downloadTimeout, out int responseTime)
|
||||||
{
|
{
|
||||||
IEnumerable<char> IgnoredLineBegins = new[] { '!', '[' };
|
string msg = string.Empty;
|
||||||
|
responseTime = -1;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
|
||||||
|
myHttpWebRequest.Timeout = downloadTimeout * 1000;
|
||||||
|
myHttpWebRequest.Proxy = webProxy;
|
||||||
|
|
||||||
byte[] bytes = Convert.FromBase64String(response);
|
Stopwatch timer = new Stopwatch();
|
||||||
string content = Encoding.UTF8.GetString(bytes);
|
timer.Start();
|
||||||
List<string> valid_lines = new List<string>();
|
|
||||||
using (StringReader sr = new StringReader(content))
|
HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
|
||||||
|
if (myHttpWebResponse.StatusCode != HttpStatusCode.OK
|
||||||
|
&& myHttpWebResponse.StatusCode != HttpStatusCode.NoContent)
|
||||||
{
|
{
|
||||||
foreach (string line in sr.NonWhiteSpaceLines())
|
msg = myHttpWebResponse.StatusDescription;
|
||||||
|
}
|
||||||
|
timer.Stop();
|
||||||
|
responseTime = timer.Elapsed.Milliseconds;
|
||||||
|
|
||||||
|
myHttpWebResponse.Close();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
if (line.BeginWithAny(IgnoredLineBegins))
|
Utils.SaveLog(ex.Message, ex);
|
||||||
continue;
|
msg = ex.Message;
|
||||||
valid_lines.Add(line);
|
|
||||||
}
|
}
|
||||||
}
|
return msg;
|
||||||
return valid_lines;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
private WebProxy GetWebProxy(bool blProxy)
|
||||||
|
{
|
||||||
|
if (!blProxy)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
var httpPort = LazyConfig.Instance.GetLocalPort(Global.InboundHttp);
|
||||||
|
if (!SocketCheck(Global.Loopback, httpPort))
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new WebProxy(Global.Loopback, httpPort);
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool SocketCheck(string ip, int port)
|
||||||
|
{
|
||||||
|
Socket sock = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
IPAddress ipa = IPAddress.Parse(ip);
|
||||||
|
IPEndPoint point = new IPEndPoint(ipa, port);
|
||||||
|
sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
||||||
|
sock.Connect(point);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
if (sock != null)
|
||||||
|
{
|
||||||
|
sock.Close();
|
||||||
|
sock.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
345
v2rayN/v2rayN/Handler/LazyConfig.cs
Normal file
345
v2rayN/v2rayN/Handler/LazyConfig.cs
Normal file
@@ -0,0 +1,345 @@
|
|||||||
|
using v2rayN.Base;
|
||||||
|
using v2rayN.Mode;
|
||||||
|
|
||||||
|
namespace v2rayN.Handler
|
||||||
|
{
|
||||||
|
public sealed class LazyConfig
|
||||||
|
{
|
||||||
|
private static readonly Lazy<LazyConfig> _instance = new Lazy<LazyConfig>(() => new());
|
||||||
|
private Config _config;
|
||||||
|
private List<CoreInfo> coreInfos;
|
||||||
|
|
||||||
|
public static LazyConfig Instance => _instance.Value;
|
||||||
|
|
||||||
|
public LazyConfig()
|
||||||
|
{
|
||||||
|
SqliteHelper.Instance.CreateTable<SubItem>();
|
||||||
|
SqliteHelper.Instance.CreateTable<ProfileItem>();
|
||||||
|
SqliteHelper.Instance.CreateTable<ServerStatItem>();
|
||||||
|
SqliteHelper.Instance.CreateTable<RoutingItem>();
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Config
|
||||||
|
|
||||||
|
public void SetConfig(ref Config config)
|
||||||
|
{
|
||||||
|
_config = config;
|
||||||
|
}
|
||||||
|
public Config GetConfig()
|
||||||
|
{
|
||||||
|
return _config;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int GetLocalPort(string protocol)
|
||||||
|
{
|
||||||
|
int localPort = _config.inbound.FirstOrDefault(t => t.protocol == Global.InboundSocks).localPort;
|
||||||
|
if (protocol == Global.InboundSocks)
|
||||||
|
{
|
||||||
|
return localPort;
|
||||||
|
}
|
||||||
|
else if (protocol == Global.InboundHttp)
|
||||||
|
{
|
||||||
|
return localPort + 1;
|
||||||
|
}
|
||||||
|
else if (protocol == Global.InboundSocks2)
|
||||||
|
{
|
||||||
|
return localPort + 2;
|
||||||
|
}
|
||||||
|
else if (protocol == Global.InboundHttp2)
|
||||||
|
{
|
||||||
|
return localPort + 3;
|
||||||
|
}
|
||||||
|
else if (protocol == ESysProxyType.Pac.ToString())
|
||||||
|
{
|
||||||
|
return localPort + 4;
|
||||||
|
}
|
||||||
|
else if (protocol == "speedtest")
|
||||||
|
{
|
||||||
|
return localPort + 103;
|
||||||
|
}
|
||||||
|
return localPort;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<SubItem> SubItems()
|
||||||
|
{
|
||||||
|
return SqliteHelper.Instance.Table<SubItem>().ToList();
|
||||||
|
}
|
||||||
|
public SubItem GetSubItem(string subid)
|
||||||
|
{
|
||||||
|
return SqliteHelper.Instance.Table<SubItem>().FirstOrDefault(t => t.id == subid);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ProfileItem> ProfileItems(string subid)
|
||||||
|
{
|
||||||
|
if (Utils.IsNullOrEmpty(subid))
|
||||||
|
{
|
||||||
|
return SqliteHelper.Instance.Table<ProfileItem>().ToList();
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return SqliteHelper.Instance.Table<ProfileItem>().Where(t => t.subid == subid).ToList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ProfileItemModel> ProfileItems(string subid, string filter)
|
||||||
|
{
|
||||||
|
var sql = @$"select a.*
|
||||||
|
,b.remarks subRemarks
|
||||||
|
,case when a.indexId = '{_config.indexId}' then true else false end isActive
|
||||||
|
from ProfileItem a
|
||||||
|
left join SubItem b on a.subid = b.id
|
||||||
|
where 1=1 ";
|
||||||
|
if (!Utils.IsNullOrEmpty(subid))
|
||||||
|
{
|
||||||
|
sql += $" and a.subid = {subid}";
|
||||||
|
}
|
||||||
|
if (!Utils.IsNullOrEmpty(filter))
|
||||||
|
{
|
||||||
|
sql += $" and a.remarks like '%{filter}%'";
|
||||||
|
}
|
||||||
|
sql += " order by a.sort";
|
||||||
|
|
||||||
|
return SqliteHelper.Instance.Query<ProfileItemModel>(sql).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public ProfileItem GetProfileItem(string indexId)
|
||||||
|
{
|
||||||
|
if (Utils.IsNullOrEmpty(indexId))
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return SqliteHelper.Instance.Table<ProfileItem>().FirstOrDefault(it => it.indexId == indexId);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task SetTestResult(string indexId, string delayVal, string speedVal)
|
||||||
|
{
|
||||||
|
string sql = string.Empty;
|
||||||
|
if (!Utils.IsNullOrEmpty(delayVal) && !Utils.IsNullOrEmpty(speedVal))
|
||||||
|
{
|
||||||
|
int.TryParse(delayVal, out int delay);
|
||||||
|
decimal.TryParse(speedVal, out decimal speed);
|
||||||
|
sql = $"update ProfileItem set delay={delay},speed={speed} where indexId = '{indexId}'";
|
||||||
|
}
|
||||||
|
else if (!Utils.IsNullOrEmpty(delayVal))
|
||||||
|
{
|
||||||
|
int.TryParse(delayVal, out int delay);
|
||||||
|
sql = $"update ProfileItem set delay={delay} where indexId = '{indexId}'";
|
||||||
|
}
|
||||||
|
else if (!Utils.IsNullOrEmpty(speedVal))
|
||||||
|
{
|
||||||
|
decimal.TryParse(speedVal, out decimal speed);
|
||||||
|
sql = $"update ProfileItem set speed={speed} where indexId = '{indexId}'";
|
||||||
|
}
|
||||||
|
return SqliteHelper.Instance.ExecuteAsync(sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ServerStatItem> ServerStatItems()
|
||||||
|
{
|
||||||
|
return SqliteHelper.Instance.Table<ServerStatItem>().ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<RoutingItem> RoutingItems()
|
||||||
|
{
|
||||||
|
return SqliteHelper.Instance.Table<RoutingItem>().Where(it => it.locked == false).ToList();
|
||||||
|
}
|
||||||
|
public RoutingItem GetRoutingItem(string id)
|
||||||
|
{
|
||||||
|
return SqliteHelper.Instance.Table<RoutingItem>().FirstOrDefault(it => it.locked == false && it.id == id);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Core Type
|
||||||
|
|
||||||
|
public List<string> GetShadowsocksSecuritys(ProfileItem profileItem)
|
||||||
|
{
|
||||||
|
if (GetCoreType(profileItem, EConfigType.Shadowsocks) == ECoreType.v2fly)
|
||||||
|
{
|
||||||
|
return Global.ssSecuritys;
|
||||||
|
}
|
||||||
|
if (GetCoreType(profileItem, EConfigType.Shadowsocks) == ECoreType.Xray)
|
||||||
|
{
|
||||||
|
return Global.ssSecuritysInXray;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Global.ssSecuritysInSagerNet;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ECoreType GetCoreType(ProfileItem profileItem, EConfigType eConfigType)
|
||||||
|
{
|
||||||
|
if (profileItem != null && profileItem.coreType != null)
|
||||||
|
{
|
||||||
|
return (ECoreType)profileItem.coreType;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_config.coreTypeItem == null)
|
||||||
|
{
|
||||||
|
return ECoreType.Xray;
|
||||||
|
}
|
||||||
|
var item = _config.coreTypeItem.FirstOrDefault(it => it.configType == eConfigType);
|
||||||
|
if (item == null)
|
||||||
|
{
|
||||||
|
return ECoreType.Xray;
|
||||||
|
}
|
||||||
|
return item.coreType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CoreInfo GetCoreInfo(ECoreType coreType)
|
||||||
|
{
|
||||||
|
if (coreInfos == null)
|
||||||
|
{
|
||||||
|
InitCoreInfo();
|
||||||
|
}
|
||||||
|
return coreInfos.Where(t => t.coreType == coreType).FirstOrDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<CoreInfo> GetCoreInfos()
|
||||||
|
{
|
||||||
|
if (coreInfos == null)
|
||||||
|
{
|
||||||
|
InitCoreInfo();
|
||||||
|
}
|
||||||
|
return coreInfos;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void InitCoreInfo()
|
||||||
|
{
|
||||||
|
coreInfos = new List<CoreInfo>();
|
||||||
|
|
||||||
|
coreInfos.Add(new CoreInfo
|
||||||
|
{
|
||||||
|
coreType = ECoreType.v2rayN,
|
||||||
|
coreUrl = Global.NUrl,
|
||||||
|
coreReleaseApiUrl = Global.NUrl.Replace(@"https://github.com", @"https://api.github.com/repos"),
|
||||||
|
coreDownloadUrl32 = Global.NUrl + "/download/{0}/v2rayN.zip",
|
||||||
|
coreDownloadUrl64 = Global.NUrl + "/download/{0}/v2rayN.zip",
|
||||||
|
});
|
||||||
|
|
||||||
|
coreInfos.Add(new CoreInfo
|
||||||
|
{
|
||||||
|
coreType = ECoreType.v2fly,
|
||||||
|
coreExes = new List<string> { "wv2ray", "v2ray" },
|
||||||
|
arguments = "",
|
||||||
|
coreUrl = Global.v2flyCoreUrl,
|
||||||
|
coreReleaseApiUrl = Global.v2flyCoreUrl.Replace(@"https://github.com", @"https://api.github.com/repos"),
|
||||||
|
coreDownloadUrl32 = Global.v2flyCoreUrl + "/download/{0}/v2ray-windows-{1}.zip",
|
||||||
|
coreDownloadUrl64 = Global.v2flyCoreUrl + "/download/{0}/v2ray-windows-{1}.zip",
|
||||||
|
match = "V2Ray",
|
||||||
|
versionArg = "-version",
|
||||||
|
redirectInfo = true,
|
||||||
|
});
|
||||||
|
|
||||||
|
coreInfos.Add(new CoreInfo
|
||||||
|
{
|
||||||
|
coreType = ECoreType.SagerNet,
|
||||||
|
coreExes = new List<string> { "SagerNet", "v2ray" },
|
||||||
|
arguments = "run",
|
||||||
|
coreUrl = Global.SagerNetCoreUrl,
|
||||||
|
coreReleaseApiUrl = Global.SagerNetCoreUrl.Replace(@"https://github.com", @"https://api.github.com/repos"),
|
||||||
|
coreDownloadUrl32 = Global.SagerNetCoreUrl + "/download/{0}/v2ray-windows-{1}.zip",
|
||||||
|
coreDownloadUrl64 = Global.SagerNetCoreUrl + "/download/{0}/v2ray-windows-{1}.zip",
|
||||||
|
match = "V2Ray",
|
||||||
|
versionArg = "version",
|
||||||
|
redirectInfo = true,
|
||||||
|
});
|
||||||
|
|
||||||
|
coreInfos.Add(new CoreInfo
|
||||||
|
{
|
||||||
|
coreType = ECoreType.v2fly_v5,
|
||||||
|
coreExes = new List<string> { "v2ray" },
|
||||||
|
arguments = "run",
|
||||||
|
coreUrl = Global.v2flyCoreUrl,
|
||||||
|
coreReleaseApiUrl = Global.v2flyCoreUrl.Replace(@"https://github.com", @"https://api.github.com/repos"),
|
||||||
|
coreDownloadUrl32 = Global.v2flyCoreUrl + "/download/{0}/v2ray-windows-{1}.zip",
|
||||||
|
coreDownloadUrl64 = Global.v2flyCoreUrl + "/download/{0}/v2ray-windows-{1}.zip",
|
||||||
|
match = "V2Ray",
|
||||||
|
versionArg = "version",
|
||||||
|
redirectInfo = true,
|
||||||
|
});
|
||||||
|
|
||||||
|
coreInfos.Add(new CoreInfo
|
||||||
|
{
|
||||||
|
coreType = ECoreType.Xray,
|
||||||
|
coreExes = new List<string> { "xray", "wxray" },
|
||||||
|
arguments = "",
|
||||||
|
coreUrl = Global.xrayCoreUrl,
|
||||||
|
coreReleaseApiUrl = Global.xrayCoreUrl.Replace(@"https://github.com", @"https://api.github.com/repos"),
|
||||||
|
coreDownloadUrl32 = Global.xrayCoreUrl + "/download/{0}/Xray-windows-{1}.zip",
|
||||||
|
coreDownloadUrl64 = Global.xrayCoreUrl + "/download/{0}/Xray-windows-{1}.zip",
|
||||||
|
match = "Xray",
|
||||||
|
versionArg = "-version",
|
||||||
|
redirectInfo = true,
|
||||||
|
});
|
||||||
|
|
||||||
|
coreInfos.Add(new CoreInfo
|
||||||
|
{
|
||||||
|
coreType = ECoreType.clash,
|
||||||
|
coreExes = new List<string> { "clash-windows-amd64-v3", "clash-windows-amd64", "clash-windows-386", "clash" },
|
||||||
|
arguments = "-f config.json",
|
||||||
|
coreUrl = Global.clashCoreUrl,
|
||||||
|
coreReleaseApiUrl = Global.clashCoreUrl.Replace(@"https://github.com", @"https://api.github.com/repos"),
|
||||||
|
coreDownloadUrl32 = Global.clashCoreUrl + "/download/{0}/clash-windows-386-{0}.zip",
|
||||||
|
coreDownloadUrl64 = Global.clashCoreUrl + "/download/{0}/clash-windows-amd64-{0}.zip",
|
||||||
|
match = "v",
|
||||||
|
versionArg = "-v",
|
||||||
|
redirectInfo = true,
|
||||||
|
});
|
||||||
|
|
||||||
|
coreInfos.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" },
|
||||||
|
arguments = "-f config.json",
|
||||||
|
coreUrl = Global.clashMetaCoreUrl,
|
||||||
|
coreReleaseApiUrl = Global.clashMetaCoreUrl.Replace(@"https://github.com", @"https://api.github.com/repos"),
|
||||||
|
coreDownloadUrl32 = Global.clashMetaCoreUrl + "/download/{0}/Clash.Meta-windows-386-{0}.zip",
|
||||||
|
coreDownloadUrl64 = Global.clashMetaCoreUrl + "/download/{0}/Clash.Meta-windows-amd64-compatible-{0}.zip",
|
||||||
|
match = "v",
|
||||||
|
versionArg = "-v",
|
||||||
|
redirectInfo = true,
|
||||||
|
});
|
||||||
|
|
||||||
|
coreInfos.Add(new CoreInfo
|
||||||
|
{
|
||||||
|
coreType = ECoreType.hysteria,
|
||||||
|
coreExes = new List<string> { "hysteria-windows-amd64", "hysteria-windows-386", "hysteria" },
|
||||||
|
arguments = "",
|
||||||
|
coreUrl = Global.hysteriaCoreUrl,
|
||||||
|
coreReleaseApiUrl = Global.hysteriaCoreUrl.Replace(@"https://github.com", @"https://api.github.com/repos"),
|
||||||
|
coreDownloadUrl32 = Global.hysteriaCoreUrl + "/download/{0}/hysteria-windows-386.exe",
|
||||||
|
coreDownloadUrl64 = Global.hysteriaCoreUrl + "/download/{0}/hysteria-windows-amd64.exe",
|
||||||
|
redirectInfo = true,
|
||||||
|
});
|
||||||
|
|
||||||
|
coreInfos.Add(new CoreInfo
|
||||||
|
{
|
||||||
|
coreType = ECoreType.naiveproxy,
|
||||||
|
coreExes = new List<string> { "naiveproxy", "naive" },
|
||||||
|
arguments = "config.json",
|
||||||
|
coreUrl = Global.naiveproxyCoreUrl,
|
||||||
|
redirectInfo = false,
|
||||||
|
});
|
||||||
|
|
||||||
|
coreInfos.Add(new CoreInfo
|
||||||
|
{
|
||||||
|
coreType = ECoreType.tuic,
|
||||||
|
coreExes = new List<string> { "tuic-client", "tuic" },
|
||||||
|
arguments = "-c config.json",
|
||||||
|
coreUrl = Global.tuicCoreUrl,
|
||||||
|
redirectInfo = true,
|
||||||
|
});
|
||||||
|
|
||||||
|
coreInfos.Add(new CoreInfo
|
||||||
|
{
|
||||||
|
coreType = ECoreType.sing_box,
|
||||||
|
coreExes = new List<string> { "sing-box-client", "sing-box" },
|
||||||
|
arguments = "run",
|
||||||
|
coreUrl = Global.singboxCoreUrl,
|
||||||
|
redirectInfo = true,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,13 +1,19 @@
|
|||||||
using System;
|
using NHotkey;
|
||||||
|
using NHotkey.Wpf;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
|
using System.IO;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
using System.Windows.Input;
|
||||||
|
using System.Windows.Media.Imaging;
|
||||||
using v2rayN.Mode;
|
using v2rayN.Mode;
|
||||||
|
using v2rayN.Resx;
|
||||||
|
|
||||||
namespace v2rayN.Handler
|
namespace v2rayN.Handler
|
||||||
{
|
{
|
||||||
class MainFormHandler
|
public sealed class MainFormHandler
|
||||||
{
|
{
|
||||||
private static MainFormHandler instance;
|
private static readonly Lazy<MainFormHandler> instance = new Lazy<MainFormHandler>(() => new MainFormHandler());
|
||||||
|
//Action<bool, string> _updateUI;
|
||||||
|
|
||||||
//private DownloadHandle downloadHandle2;
|
//private DownloadHandle downloadHandle2;
|
||||||
//private Config _config;
|
//private Config _config;
|
||||||
@@ -15,28 +21,87 @@ namespace v2rayN.Handler
|
|||||||
//private List<int> _selecteds;
|
//private List<int> _selecteds;
|
||||||
//private Thread _workThread;
|
//private Thread _workThread;
|
||||||
//Action<int, string> _updateFunc;
|
//Action<int, string> _updateFunc;
|
||||||
public static MainFormHandler Instance
|
public static MainFormHandler Instance => instance.Value;
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (instance == null)
|
|
||||||
{
|
|
||||||
instance = new MainFormHandler();
|
|
||||||
}
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Icon GetNotifyIcon(Config config, Icon def)
|
public Icon GetNotifyIcon(Config config)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
int index = (int)config.sysProxyType;
|
||||||
|
|
||||||
|
//Load from routing setting
|
||||||
|
var createdIcon = GetNotifyIcon4Routing(config);
|
||||||
|
if (createdIcon != null)
|
||||||
|
{
|
||||||
|
return createdIcon;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Load from local file
|
||||||
|
var fileName = Utils.GetPath($"NotifyIcon{index + 1}.ico");
|
||||||
|
if (File.Exists(fileName))
|
||||||
|
{
|
||||||
|
return new Icon(fileName);
|
||||||
|
}
|
||||||
|
switch (index)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
return Properties.Resources.NotifyIcon1;
|
||||||
|
case 1:
|
||||||
|
return Properties.Resources.NotifyIcon2;
|
||||||
|
case 2:
|
||||||
|
return Properties.Resources.NotifyIcon3;
|
||||||
|
case 3:
|
||||||
|
return Properties.Resources.NotifyIcon2;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Properties.Resources.NotifyIcon1;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Utils.SaveLog(ex.Message, ex);
|
||||||
|
return Properties.Resources.NotifyIcon1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public System.Windows.Media.ImageSource GetAppIcon(Config config)
|
||||||
|
{
|
||||||
|
int index = 1;
|
||||||
|
switch ((int)config.sysProxyType)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
index = 1;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
case 3:
|
||||||
|
index = 2;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
index = 3;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return BitmapFrame.Create(new Uri($"pack://application:,,,/Resources/NotifyIcon{index}.ico", UriKind.RelativeOrAbsolute));
|
||||||
|
}
|
||||||
|
|
||||||
|
private Icon GetNotifyIcon4Routing(Config config)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (!config.enableRoutingAdvanced)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var item = ConfigHandler.GetDefaultRouting(ref config);
|
||||||
|
if (item == null || Utils.IsNullOrEmpty(item.customIcon) || !File.Exists(item.customIcon))
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
Color color = ColorTranslator.FromHtml("#3399CC");
|
Color color = ColorTranslator.FromHtml("#3399CC");
|
||||||
int index = (int)config.listenerType;
|
int index = (int)config.sysProxyType;
|
||||||
if (index > 0)
|
if (index > 0)
|
||||||
{
|
{
|
||||||
color = (new Color[] { Color.Red, Color.Purple, Color.DarkGreen, Color.Orange, Color.DarkSlateBlue, Color.RoyalBlue })[index - 1];
|
color = (new[] { Color.Red, Color.Purple, Color.DarkGreen, Color.Orange, Color.DarkSlateBlue, Color.RoyalBlue })[index - 1];
|
||||||
//color = ColorTranslator.FromHtml(new string[] { "#CC0066", "#CC6600", "#99CC99", "#666699" }[index - 1]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int width = 128;
|
int width = 128;
|
||||||
@@ -46,9 +111,10 @@ namespace v2rayN.Handler
|
|||||||
Graphics graphics = Graphics.FromImage(bitmap);
|
Graphics graphics = Graphics.FromImage(bitmap);
|
||||||
SolidBrush drawBrush = new SolidBrush(color);
|
SolidBrush drawBrush = new SolidBrush(color);
|
||||||
|
|
||||||
graphics.FillEllipse(drawBrush, new Rectangle(0, 0, width, height));
|
graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
|
||||||
int zoom = 16;
|
//graphics.FillRectangle(drawBrush, new Rectangle(0, 0, width, height));
|
||||||
graphics.DrawImage(new Bitmap(Properties.Resources.notify, width - zoom, width - zoom), zoom / 2, zoom / 2);
|
graphics.DrawImage(new Bitmap(item.customIcon), 0, 0, width, height);
|
||||||
|
graphics.FillEllipse(drawBrush, width / 2, width / 2, width / 2, width / 2);
|
||||||
|
|
||||||
Icon createdIcon = Icon.FromHandle(bitmap.GetHicon());
|
Icon createdIcon = Icon.FromHandle(bitmap.GetHicon());
|
||||||
|
|
||||||
@@ -61,20 +127,19 @@ namespace v2rayN.Handler
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Utils.SaveLog(ex.Message, ex);
|
Utils.SaveLog(ex.Message, ex);
|
||||||
return def;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Export2ClientConfig(int index, Config config)
|
public void Export2ClientConfig(ProfileItem item, Config config)
|
||||||
{
|
{
|
||||||
//int index = GetLvSelectedIndex();
|
if (item == null)
|
||||||
if (index < 0)
|
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (config.vmess[index].configType != (int)EConfigType.Vmess)
|
if (item.configType == EConfigType.Custom)
|
||||||
{
|
{
|
||||||
UI.Show(UIRes.I18N("NonVmessService"));
|
UI.Show(ResUI.NonVmessService);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,28 +158,28 @@ namespace v2rayN.Handler
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Config configCopy = Utils.DeepCopy(config);
|
//Config configCopy = Utils.DeepCopy(config);
|
||||||
configCopy.index = index;
|
//configCopy.index = index;
|
||||||
if (V2rayConfigHandler.Export2ClientConfig(configCopy, fileName, out string msg) != 0)
|
if (CoreConfigHandler.Export2ClientConfig(item, fileName, out string msg) != 0)
|
||||||
{
|
{
|
||||||
UI.Show(msg);
|
UI.Show(msg);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
UI.ShowWarning(string.Format(UIRes.I18N("SaveClientConfigurationIn"), fileName));
|
UI.ShowWarning(string.Format(ResUI.SaveClientConfigurationIn, fileName));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Export2ServerConfig(int index, Config config)
|
public void Export2ServerConfig(ProfileItem item, Config config)
|
||||||
{
|
{
|
||||||
//int index = GetLvSelectedIndex();
|
if (item == null)
|
||||||
if (index < 0)
|
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (config.vmess[index].configType != (int)EConfigType.Vmess)
|
if (item.configType != EConfigType.VMess
|
||||||
|
&& item.configType != EConfigType.VLESS)
|
||||||
{
|
{
|
||||||
UI.Show(UIRes.I18N("NonVmessService"));
|
UI.Show(ResUI.NonVmessService);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -133,18 +198,200 @@ namespace v2rayN.Handler
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Config configCopy = Utils.DeepCopy(config);
|
//Config configCopy = Utils.DeepCopy(config);
|
||||||
configCopy.index = index;
|
//configCopy.index = index;
|
||||||
if (V2rayConfigHandler.Export2ServerConfig(configCopy, fileName, out string msg) != 0)
|
if (CoreConfigHandler.Export2ServerConfig(item, fileName, out string msg) != 0)
|
||||||
{
|
{
|
||||||
UI.Show(msg);
|
UI.Show(msg);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
UI.ShowWarning(string.Format(UIRes.I18N("SaveServerConfigurationIn"), fileName));
|
UI.ShowWarning(string.Format(ResUI.SaveServerConfigurationIn, fileName));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void BackupGuiNConfig(Config config, bool auto = false)
|
||||||
|
{
|
||||||
|
string fileName = $"guiNConfig_{DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss_fff")}.json";
|
||||||
|
if (auto)
|
||||||
|
{
|
||||||
|
fileName = Utils.GetBackupPath(fileName);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SaveFileDialog fileDialog = new SaveFileDialog
|
||||||
|
{
|
||||||
|
FileName = fileName,
|
||||||
|
Filter = "guiNConfig|*.json",
|
||||||
|
FilterIndex = 2,
|
||||||
|
RestoreDirectory = true
|
||||||
|
};
|
||||||
|
if (fileDialog.ShowDialog() != DialogResult.OK)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fileName = fileDialog.FileName;
|
||||||
|
}
|
||||||
|
if (Utils.IsNullOrEmpty(fileName))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var ret = Utils.ToJsonFile(config, fileName);
|
||||||
|
if (!auto)
|
||||||
|
{
|
||||||
|
if (ret == 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
UI.Show(ResUI.OperationSuccess);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
UI.ShowWarning(ResUI.OperationFailed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool RestoreGuiNConfig(ref Config config)
|
||||||
|
{
|
||||||
|
var fileContent = string.Empty;
|
||||||
|
using (OpenFileDialog fileDialog = new OpenFileDialog())
|
||||||
|
{
|
||||||
|
fileDialog.InitialDirectory = Utils.GetBackupPath("");
|
||||||
|
fileDialog.Filter = "guiNConfig|*.json|All|*.*";
|
||||||
|
fileDialog.FilterIndex = 2;
|
||||||
|
fileDialog.RestoreDirectory = true;
|
||||||
|
|
||||||
|
if (fileDialog.ShowDialog() == DialogResult.OK)
|
||||||
|
{
|
||||||
|
fileContent = Utils.LoadResource(fileDialog.FileName);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (Utils.IsNullOrEmpty(fileContent))
|
||||||
|
{
|
||||||
|
UI.ShowWarning(ResUI.OperationFailed);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var resConfig = Utils.FromJson<Config>(fileContent);
|
||||||
|
if (resConfig == null)
|
||||||
|
{
|
||||||
|
UI.ShowWarning(ResUI.OperationFailed);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
//backup first
|
||||||
|
BackupGuiNConfig(config, true);
|
||||||
|
|
||||||
|
config = resConfig;
|
||||||
|
LazyConfig.Instance.SetConfig(ref config);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateTask(Config config, Action<bool, string> update)
|
||||||
|
{
|
||||||
|
Task.Run(() => UpdateTaskRun(config, update));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateTaskRun(Config config, Action<bool, string> update)
|
||||||
|
{
|
||||||
|
var autoUpdateSubTime = DateTime.Now;
|
||||||
|
var autoUpdateGeoTime = DateTime.Now;
|
||||||
|
|
||||||
|
Thread.Sleep(60000);
|
||||||
|
Utils.SaveLog("UpdateTaskRun");
|
||||||
|
|
||||||
|
var updateHandle = new UpdateHandle();
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
var dtNow = DateTime.Now;
|
||||||
|
|
||||||
|
if (config.autoUpdateSubInterval > 0)
|
||||||
|
{
|
||||||
|
if ((dtNow - autoUpdateSubTime).Hours % config.autoUpdateSubInterval == 0)
|
||||||
|
{
|
||||||
|
updateHandle.UpdateSubscriptionProcess(config, "", true, (bool success, string msg) =>
|
||||||
|
{
|
||||||
|
update(success, msg);
|
||||||
|
if (success)
|
||||||
|
Utils.SaveLog("subscription" + msg);
|
||||||
|
});
|
||||||
|
autoUpdateSubTime = dtNow;
|
||||||
|
}
|
||||||
|
Thread.Sleep(60000);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (config.autoUpdateInterval > 0)
|
||||||
|
{
|
||||||
|
if ((dtNow - autoUpdateGeoTime).Hours % config.autoUpdateInterval == 0)
|
||||||
|
{
|
||||||
|
updateHandle.UpdateGeoFile("geosite", config, (bool success, string msg) =>
|
||||||
|
{
|
||||||
|
update(false, msg);
|
||||||
|
if (success)
|
||||||
|
Utils.SaveLog("geosite" + msg);
|
||||||
|
});
|
||||||
|
|
||||||
|
updateHandle.UpdateGeoFile("geoip", config, (bool success, string msg) =>
|
||||||
|
{
|
||||||
|
update(false, msg);
|
||||||
|
if (success)
|
||||||
|
Utils.SaveLog("geoip" + msg);
|
||||||
|
});
|
||||||
|
autoUpdateGeoTime = dtNow;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Thread.Sleep(1000 * 3600);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RegisterGlobalHotkey(Config config, EventHandler<HotkeyEventArgs> handler, Action<bool, string> update)
|
||||||
|
{
|
||||||
|
if (config.globalHotkeys == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var item in config.globalHotkeys)
|
||||||
|
{
|
||||||
|
if (item.KeyCode == null)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var modifiers = ModifierKeys.None;
|
||||||
|
if (item.Control)
|
||||||
|
{
|
||||||
|
modifiers |= ModifierKeys.Control;
|
||||||
|
}
|
||||||
|
if (item.Alt)
|
||||||
|
{
|
||||||
|
modifiers |= ModifierKeys.Alt;
|
||||||
|
}
|
||||||
|
if (item.Shift)
|
||||||
|
{
|
||||||
|
modifiers |= ModifierKeys.Shift;
|
||||||
|
}
|
||||||
|
|
||||||
|
var gesture = new KeyGesture(KeyInterop.KeyFromVirtualKey((int)item.KeyCode), modifiers);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
HotkeyManager.Current.AddOrReplace(((int)item.eGlobalHotkey).ToString(), gesture, handler);
|
||||||
|
var msg = string.Format(ResUI.RegisterGlobalHotkeySuccessfully, $"{item.eGlobalHotkey.ToString()}");
|
||||||
|
update(false, msg);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
var msg = string.Format(ResUI.RegisterGlobalHotkeyFailed, $"{item.eGlobalHotkey.ToString()}", ex.Message);
|
||||||
|
update(false, msg);
|
||||||
|
Utils.SaveLog(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
33
v2rayN/v2rayN/Handler/NoticeHandler.cs
Normal file
33
v2rayN/v2rayN/Handler/NoticeHandler.cs
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
using MaterialDesignThemes.Wpf;
|
||||||
|
using ReactiveUI;
|
||||||
|
|
||||||
|
namespace v2rayN.Handler
|
||||||
|
{
|
||||||
|
public class NoticeHandler
|
||||||
|
{
|
||||||
|
private readonly ISnackbarMessageQueue _snackbarMessageQueue;
|
||||||
|
|
||||||
|
public NoticeHandler(ISnackbarMessageQueue snackbarMessageQueue)
|
||||||
|
{
|
||||||
|
_snackbarMessageQueue = snackbarMessageQueue ?? throw new ArgumentNullException(nameof(snackbarMessageQueue));
|
||||||
|
|
||||||
|
//_snackbarMessageQueue = snackbarMessageQueue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Enqueue(object content)
|
||||||
|
{
|
||||||
|
_snackbarMessageQueue?.Enqueue(content);
|
||||||
|
}
|
||||||
|
public void SendMessage(string msg)
|
||||||
|
{
|
||||||
|
MessageBus.Current.SendMessage(msg, "MsgView");
|
||||||
|
}
|
||||||
|
public void SendMessage(string msg, bool time)
|
||||||
|
{
|
||||||
|
msg = $"{DateTime.Now} {msg}";
|
||||||
|
MessageBus.Current.SendMessage(msg, "MsgView");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +1,7 @@
|
|||||||
using Microsoft.Win32;
|
using Microsoft.Win32;
|
||||||
using System;
|
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
namespace v2rayN.HttpProxyHandler
|
namespace v2rayN.Handler
|
||||||
{
|
{
|
||||||
class ProxySetting
|
class ProxySetting
|
||||||
{
|
{
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
using System.Drawing;
|
using QRCoder;
|
||||||
using ZXing;
|
using QRCoder.Xaml;
|
||||||
using ZXing.QrCode;
|
using System.Windows.Media;
|
||||||
|
|
||||||
namespace v2rayN.Handler
|
namespace v2rayN.Handler
|
||||||
{
|
{
|
||||||
@@ -9,35 +9,22 @@ namespace v2rayN.Handler
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class QRCodeHelper
|
public class QRCodeHelper
|
||||||
{
|
{
|
||||||
public static Image GetQRCode(string strContent)
|
public static DrawingImage GetQRCode(string strContent)
|
||||||
{
|
{
|
||||||
Image img = null;
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
QrCodeEncodingOptions options = new QrCodeEncodingOptions
|
QRCodeGenerator qrGenerator = new QRCodeGenerator();
|
||||||
{
|
QRCodeData qrCodeData = qrGenerator.CreateQrCode(strContent, QRCodeGenerator.ECCLevel.H);
|
||||||
CharacterSet = "UTF-8",
|
XamlQRCode qrCode = new XamlQRCode(qrCodeData);
|
||||||
DisableECI = true, // Extended Channel Interpretation (ECI) 主要用于特殊的字符集。并不是所有的扫描器都支持这种编码。
|
DrawingImage qrCodeAsXaml = qrCode.GetGraphic(40);
|
||||||
ErrorCorrection = ZXing.QrCode.Internal.ErrorCorrectionLevel.M, // 纠错级别
|
return qrCodeAsXaml;
|
||||||
Width = 500,
|
|
||||||
Height = 500,
|
|
||||||
Margin = 1
|
|
||||||
};
|
|
||||||
// options.Hints,更多属性,也可以在这里添加。
|
|
||||||
|
|
||||||
BarcodeWriter writer = new BarcodeWriter
|
|
||||||
{
|
|
||||||
Format = BarcodeFormat.QR_CODE,
|
|
||||||
Options = options
|
|
||||||
};
|
|
||||||
Bitmap bmp = writer.Write(strContent);
|
|
||||||
img = (Image)bmp;
|
|
||||||
return img;
|
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
return img;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
804
v2rayN/v2rayN/Handler/ShareHandler.cs
Normal file
804
v2rayN/v2rayN/Handler/ShareHandler.cs
Normal file
@@ -0,0 +1,804 @@
|
|||||||
|
using System.Collections.Specialized;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using System.Web;
|
||||||
|
using v2rayN.Base;
|
||||||
|
using v2rayN.Mode;
|
||||||
|
using v2rayN.Resx;
|
||||||
|
|
||||||
|
namespace v2rayN.Handler
|
||||||
|
{
|
||||||
|
class ShareHandler
|
||||||
|
{
|
||||||
|
|
||||||
|
#region GetShareUrl
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// GetShareUrl
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="item"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static string GetShareUrl(ProfileItem item)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string url = string.Empty;
|
||||||
|
|
||||||
|
switch (item.configType)
|
||||||
|
{
|
||||||
|
case EConfigType.VMess:
|
||||||
|
url = ShareVmess(item);
|
||||||
|
break;
|
||||||
|
case EConfigType.Shadowsocks:
|
||||||
|
url = ShareShadowsocks(item);
|
||||||
|
break;
|
||||||
|
case EConfigType.Socks:
|
||||||
|
url = ShareSocks(item);
|
||||||
|
break;
|
||||||
|
case EConfigType.Trojan:
|
||||||
|
url = ShareTrojan(item);
|
||||||
|
break;
|
||||||
|
case EConfigType.VLESS:
|
||||||
|
url = ShareVLESS(item);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Utils.SaveLog(ex.Message, ex);
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string ShareVmess(ProfileItem item)
|
||||||
|
{
|
||||||
|
string url = string.Empty;
|
||||||
|
|
||||||
|
VmessQRCode vmessQRCode = new VmessQRCode
|
||||||
|
{
|
||||||
|
v = item.configVersion.ToString(),
|
||||||
|
ps = item.remarks.TrimEx(), //备注也许很长 ;
|
||||||
|
add = item.address,
|
||||||
|
port = item.port.ToString(),
|
||||||
|
id = item.id,
|
||||||
|
aid = item.alterId.ToString(),
|
||||||
|
scy = item.security,
|
||||||
|
net = item.network,
|
||||||
|
type = item.headerType,
|
||||||
|
host = item.requestHost,
|
||||||
|
path = item.path,
|
||||||
|
tls = item.streamSecurity,
|
||||||
|
sni = item.sni,
|
||||||
|
alpn = item.alpn
|
||||||
|
};
|
||||||
|
|
||||||
|
url = Utils.ToJson(vmessQRCode);
|
||||||
|
url = Utils.Base64Encode(url);
|
||||||
|
url = $"{Global.vmessProtocol}{url}";
|
||||||
|
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string ShareShadowsocks(ProfileItem item)
|
||||||
|
{
|
||||||
|
string url = string.Empty;
|
||||||
|
|
||||||
|
string remark = string.Empty;
|
||||||
|
if (!Utils.IsNullOrEmpty(item.remarks))
|
||||||
|
{
|
||||||
|
remark = "#" + Utils.UrlEncode(item.remarks);
|
||||||
|
}
|
||||||
|
//url = string.Format("{0}:{1}@{2}:{3}",
|
||||||
|
// item.security,
|
||||||
|
// item.id,
|
||||||
|
// item.address,
|
||||||
|
// item.port);
|
||||||
|
//url = Utils.Base64Encode(url);
|
||||||
|
//new Sip002
|
||||||
|
var pw = Utils.Base64Encode($"{item.security}:{item.id}");
|
||||||
|
url = $"{pw}@{GetIpv6(item.address)}:{item.port}";
|
||||||
|
url = $"{Global.ssProtocol}{url}{remark}";
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string ShareSocks(ProfileItem item)
|
||||||
|
{
|
||||||
|
string url = string.Empty;
|
||||||
|
string remark = string.Empty;
|
||||||
|
if (!Utils.IsNullOrEmpty(item.remarks))
|
||||||
|
{
|
||||||
|
remark = "#" + Utils.UrlEncode(item.remarks);
|
||||||
|
}
|
||||||
|
//url = string.Format("{0}:{1}@{2}:{3}",
|
||||||
|
// item.security,
|
||||||
|
// item.id,
|
||||||
|
// item.address,
|
||||||
|
// item.port);
|
||||||
|
//url = Utils.Base64Encode(url);
|
||||||
|
//new
|
||||||
|
var pw = Utils.Base64Encode($"{item.security}:{item.id}");
|
||||||
|
url = $"{pw}@{GetIpv6(item.address)}:{item.port}";
|
||||||
|
url = $"{Global.socksProtocol}{url}{remark}";
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string ShareTrojan(ProfileItem item)
|
||||||
|
{
|
||||||
|
string url = string.Empty;
|
||||||
|
string remark = string.Empty;
|
||||||
|
if (!Utils.IsNullOrEmpty(item.remarks))
|
||||||
|
{
|
||||||
|
remark = "#" + Utils.UrlEncode(item.remarks);
|
||||||
|
}
|
||||||
|
var dicQuery = new Dictionary<string, string>();
|
||||||
|
GetStdTransport(item, null, ref dicQuery);
|
||||||
|
string query = "?" + string.Join("&", dicQuery.Select(x => x.Key + "=" + x.Value).ToArray());
|
||||||
|
|
||||||
|
url = string.Format("{0}@{1}:{2}",
|
||||||
|
item.id,
|
||||||
|
GetIpv6(item.address),
|
||||||
|
item.port);
|
||||||
|
url = $"{Global.trojanProtocol}{url}{query}{remark}";
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string ShareVLESS(ProfileItem item)
|
||||||
|
{
|
||||||
|
string url = string.Empty;
|
||||||
|
string remark = string.Empty;
|
||||||
|
if (!Utils.IsNullOrEmpty(item.remarks))
|
||||||
|
{
|
||||||
|
remark = "#" + Utils.UrlEncode(item.remarks);
|
||||||
|
}
|
||||||
|
var dicQuery = new Dictionary<string, string>();
|
||||||
|
if (!Utils.IsNullOrEmpty(item.security))
|
||||||
|
{
|
||||||
|
dicQuery.Add("encryption", item.security);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dicQuery.Add("encryption", "none");
|
||||||
|
}
|
||||||
|
GetStdTransport(item, "none", ref dicQuery);
|
||||||
|
string query = "?" + string.Join("&", dicQuery.Select(x => x.Key + "=" + x.Value).ToArray());
|
||||||
|
|
||||||
|
url = string.Format("{0}@{1}:{2}",
|
||||||
|
item.id,
|
||||||
|
GetIpv6(item.address),
|
||||||
|
item.port);
|
||||||
|
url = $"{Global.vlessProtocol}{url}{query}{remark}";
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
private static string GetIpv6(string address)
|
||||||
|
{
|
||||||
|
return Utils.IsIpv6(address) ? $"[{address}]" : address;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int GetStdTransport(ProfileItem item, string securityDef, ref Dictionary<string, string> dicQuery)
|
||||||
|
{
|
||||||
|
if (!Utils.IsNullOrEmpty(item.flow))
|
||||||
|
{
|
||||||
|
dicQuery.Add("flow", item.flow);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Utils.IsNullOrEmpty(item.streamSecurity))
|
||||||
|
{
|
||||||
|
dicQuery.Add("security", item.streamSecurity);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (securityDef != null)
|
||||||
|
{
|
||||||
|
dicQuery.Add("security", securityDef);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!Utils.IsNullOrEmpty(item.sni))
|
||||||
|
{
|
||||||
|
dicQuery.Add("sni", item.sni);
|
||||||
|
}
|
||||||
|
if (!Utils.IsNullOrEmpty(item.alpn))
|
||||||
|
{
|
||||||
|
dicQuery.Add("alpn", Utils.UrlEncode(item.alpn));
|
||||||
|
}
|
||||||
|
|
||||||
|
dicQuery.Add("type", !Utils.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("host", Utils.UrlEncode(item.requestHost));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "kcp":
|
||||||
|
dicQuery.Add("headerType", !Utils.IsNullOrEmpty(item.headerType) ? item.headerType : "none");
|
||||||
|
if (!Utils.IsNullOrEmpty(item.path))
|
||||||
|
{
|
||||||
|
dicQuery.Add("seed", Utils.UrlEncode(item.path));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "ws":
|
||||||
|
if (!Utils.IsNullOrEmpty(item.requestHost))
|
||||||
|
{
|
||||||
|
dicQuery.Add("host", Utils.UrlEncode(item.requestHost));
|
||||||
|
}
|
||||||
|
if (!Utils.IsNullOrEmpty(item.path))
|
||||||
|
{
|
||||||
|
dicQuery.Add("path", Utils.UrlEncode(item.path));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "http":
|
||||||
|
case "h2":
|
||||||
|
dicQuery["type"] = "http";
|
||||||
|
if (!Utils.IsNullOrEmpty(item.requestHost))
|
||||||
|
{
|
||||||
|
dicQuery.Add("host", Utils.UrlEncode(item.requestHost));
|
||||||
|
}
|
||||||
|
if (!Utils.IsNullOrEmpty(item.path))
|
||||||
|
{
|
||||||
|
dicQuery.Add("path", Utils.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));
|
||||||
|
break;
|
||||||
|
case "grpc":
|
||||||
|
if (!Utils.IsNullOrEmpty(item.path))
|
||||||
|
{
|
||||||
|
dicQuery.Add("serviceName", Utils.UrlEncode(item.path));
|
||||||
|
if (item.headerType == Global.GrpcgunMode || item.headerType == Global.GrpcmultiMode)
|
||||||
|
{
|
||||||
|
dicQuery.Add("mode", Utils.UrlEncode(item.headerType));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region ImportShareUrl
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 从剪贴板导入URL
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="fileName"></param>
|
||||||
|
/// <param name="msg"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static ProfileItem ImportFromClipboardConfig(string clipboardData, out string msg)
|
||||||
|
{
|
||||||
|
msg = string.Empty;
|
||||||
|
ProfileItem profileItem = new ProfileItem();
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
//载入配置文件
|
||||||
|
string result = clipboardData.TrimEx();// Utils.GetClipboardData();
|
||||||
|
if (Utils.IsNullOrEmpty(result))
|
||||||
|
{
|
||||||
|
msg = ResUI.FailedReadConfiguration;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result.StartsWith(Global.vmessProtocol))
|
||||||
|
{
|
||||||
|
int indexSplit = result.IndexOf("?");
|
||||||
|
if (indexSplit > 0)
|
||||||
|
{
|
||||||
|
profileItem = ResolveStdVmess(result) ?? ResolveVmess4Kitsunebi(result);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
profileItem = ResolveVmess(result, out msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (result.StartsWith(Global.ssProtocol))
|
||||||
|
{
|
||||||
|
msg = ResUI.ConfigurationFormatIncorrect;
|
||||||
|
|
||||||
|
profileItem = ResolveSSLegacy(result) ?? ResolveSip002(result);
|
||||||
|
if (profileItem == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (profileItem.address.Length == 0 || profileItem.port == 0 || profileItem.security.Length == 0 || profileItem.id.Length == 0)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
profileItem.configType = EConfigType.Shadowsocks;
|
||||||
|
}
|
||||||
|
else if (result.StartsWith(Global.socksProtocol))
|
||||||
|
{
|
||||||
|
msg = ResUI.ConfigurationFormatIncorrect;
|
||||||
|
|
||||||
|
profileItem = ResolveSocksNew(result) ?? ResolveSocks(result);
|
||||||
|
if (profileItem == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (profileItem.address.Length == 0 || profileItem.port == 0)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
profileItem.configType = EConfigType.Socks;
|
||||||
|
}
|
||||||
|
else if (result.StartsWith(Global.trojanProtocol))
|
||||||
|
{
|
||||||
|
msg = ResUI.ConfigurationFormatIncorrect;
|
||||||
|
|
||||||
|
profileItem = ResolveTrojan(result);
|
||||||
|
}
|
||||||
|
else if (result.StartsWith(Global.vlessProtocol))
|
||||||
|
{
|
||||||
|
profileItem = ResolveStdVLESS(result);
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
msg = ResUI.NonvmessOrssProtocol;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Utils.SaveLog(ex.Message, ex);
|
||||||
|
msg = ResUI.Incorrectconfiguration;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return profileItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ProfileItem ResolveVmess(string result, out string msg)
|
||||||
|
{
|
||||||
|
msg = string.Empty;
|
||||||
|
var profileItem = new ProfileItem
|
||||||
|
{
|
||||||
|
configType = EConfigType.VMess
|
||||||
|
};
|
||||||
|
|
||||||
|
result = result.Substring(Global.vmessProtocol.Length);
|
||||||
|
result = Utils.Base64Decode(result);
|
||||||
|
|
||||||
|
//转成Json
|
||||||
|
VmessQRCode vmessQRCode = Utils.FromJson<VmessQRCode>(result);
|
||||||
|
if (vmessQRCode == null)
|
||||||
|
{
|
||||||
|
msg = ResUI.FailedConversionConfiguration;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
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.security = !Utils.IsNullOrEmpty(vmessQRCode.scy) ? vmessQRCode.scy : Global.DefaultSecurity;
|
||||||
|
if (!Utils.IsNullOrEmpty(vmessQRCode.net))
|
||||||
|
{
|
||||||
|
profileItem.network = vmessQRCode.net;
|
||||||
|
}
|
||||||
|
if (!Utils.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);
|
||||||
|
|
||||||
|
return profileItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ProfileItem ResolveVmess4Kitsunebi(string result)
|
||||||
|
{
|
||||||
|
ProfileItem profileItem = new ProfileItem
|
||||||
|
{
|
||||||
|
configType = EConfigType.VMess
|
||||||
|
};
|
||||||
|
result = result.Substring(Global.vmessProtocol.Length);
|
||||||
|
int indexSplit = result.IndexOf("?");
|
||||||
|
if (indexSplit > 0)
|
||||||
|
{
|
||||||
|
result = result.Substring(0, indexSplit);
|
||||||
|
}
|
||||||
|
result = Utils.Base64Decode(result);
|
||||||
|
|
||||||
|
string[] arr1 = result.Split('@');
|
||||||
|
if (arr1.Length != 2)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
string[] arr21 = arr1[0].Split(':');
|
||||||
|
string[] arr22 = arr1[1].Split(':');
|
||||||
|
if (arr21.Length != 2 || arr21.Length != 2)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
profileItem.address = arr22[0];
|
||||||
|
profileItem.port = Utils.ToInt(arr22[1]);
|
||||||
|
profileItem.security = arr21[0];
|
||||||
|
profileItem.id = arr21[1];
|
||||||
|
|
||||||
|
profileItem.network = Global.DefaultNetwork;
|
||||||
|
profileItem.headerType = Global.None;
|
||||||
|
profileItem.remarks = "Alien";
|
||||||
|
|
||||||
|
return profileItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ProfileItem ResolveStdVmess(string result)
|
||||||
|
{
|
||||||
|
ProfileItem i = new ProfileItem
|
||||||
|
{
|
||||||
|
configType = EConfigType.VMess,
|
||||||
|
security = "auto"
|
||||||
|
};
|
||||||
|
|
||||||
|
Uri u = new Uri(result);
|
||||||
|
|
||||||
|
i.address = u.IdnHost;
|
||||||
|
i.port = u.Port;
|
||||||
|
i.remarks = u.GetComponents(UriComponents.Fragment, UriFormat.Unescaped);
|
||||||
|
var q = HttpUtility.ParseQueryString(u.Query);
|
||||||
|
|
||||||
|
var m = StdVmessUserInfo.Match(u.UserInfo);
|
||||||
|
if (!m.Success) return null;
|
||||||
|
|
||||||
|
i.id = m.Groups["id"].Value;
|
||||||
|
|
||||||
|
if (m.Groups["streamSecurity"].Success)
|
||||||
|
{
|
||||||
|
i.streamSecurity = m.Groups["streamSecurity"].Value;
|
||||||
|
}
|
||||||
|
switch (i.streamSecurity)
|
||||||
|
{
|
||||||
|
case "tls":
|
||||||
|
// TODO tls config
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (!string.IsNullOrWhiteSpace(i.streamSecurity))
|
||||||
|
return null;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
i.network = m.Groups["network"].Value;
|
||||||
|
switch (i.network)
|
||||||
|
{
|
||||||
|
case "tcp":
|
||||||
|
string t1 = q["type"] ?? "none";
|
||||||
|
i.headerType = t1;
|
||||||
|
// TODO http option
|
||||||
|
|
||||||
|
break;
|
||||||
|
case "kcp":
|
||||||
|
i.headerType = q["type"] ?? "none";
|
||||||
|
// TODO kcp seed
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "ws":
|
||||||
|
string p1 = q["path"] ?? "/";
|
||||||
|
string h1 = q["host"] ?? "";
|
||||||
|
i.requestHost = Utils.UrlDecode(h1);
|
||||||
|
i.path = p1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "http":
|
||||||
|
case "h2":
|
||||||
|
i.network = "h2";
|
||||||
|
string p2 = q["path"] ?? "/";
|
||||||
|
string h2 = q["host"] ?? "";
|
||||||
|
i.requestHost = Utils.UrlDecode(h2);
|
||||||
|
i.path = p2;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "quic":
|
||||||
|
string s = q["security"] ?? "none";
|
||||||
|
string k = q["key"] ?? "";
|
||||||
|
string t3 = q["type"] ?? "none";
|
||||||
|
i.headerType = t3;
|
||||||
|
i.requestHost = Utils.UrlDecode(s);
|
||||||
|
i.path = k;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ProfileItem ResolveSip002(string result)
|
||||||
|
{
|
||||||
|
Uri parsedUrl;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
parsedUrl = new Uri(result);
|
||||||
|
}
|
||||||
|
catch (UriFormatException)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
ProfileItem server = new ProfileItem
|
||||||
|
{
|
||||||
|
remarks = parsedUrl.GetComponents(UriComponents.Fragment, UriFormat.Unescaped),
|
||||||
|
address = parsedUrl.IdnHost,
|
||||||
|
port = parsedUrl.Port,
|
||||||
|
};
|
||||||
|
string rawUserInfo = parsedUrl.GetComponents(UriComponents.UserInfo, UriFormat.UriEscaped);
|
||||||
|
//2022-blake3
|
||||||
|
if (rawUserInfo.Contains(":"))
|
||||||
|
{
|
||||||
|
string[] userInfoParts = rawUserInfo.Split(new[] { ':' }, 2);
|
||||||
|
if (userInfoParts.Length != 2)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
server.security = userInfoParts[0];
|
||||||
|
server.id = Utils.UrlDecode(userInfoParts[1]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// parse base64 UserInfo
|
||||||
|
string userInfo = Utils.Base64Decode(rawUserInfo);
|
||||||
|
string[] userInfoParts = userInfo.Split(new[] { ':' }, 2);
|
||||||
|
if (userInfoParts.Length != 2)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
server.security = userInfoParts[0];
|
||||||
|
server.id = userInfoParts[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
NameValueCollection queryParameters = HttpUtility.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))
|
||||||
|
{
|
||||||
|
obfsHost = obfsHost.Replace("obfs-host=", "");
|
||||||
|
server.network = Global.DefaultNetwork;
|
||||||
|
server.headerType = Global.TcpHeaderHttp;
|
||||||
|
server.requestHost = obfsHost;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return server;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static readonly Regex UrlFinder = new Regex(@"ss://(?<base64>[A-Za-z0-9+-/=_]+)(?:#(?<tag>\S+))?", RegexOptions.IgnoreCase);
|
||||||
|
private static readonly Regex DetailsParser = new Regex(@"^((?<method>.+?):(?<password>.*)@(?<hostname>.+?):(?<port>\d+?))$", RegexOptions.IgnoreCase);
|
||||||
|
|
||||||
|
private static ProfileItem ResolveSSLegacy(string result)
|
||||||
|
{
|
||||||
|
var match = UrlFinder.Match(result);
|
||||||
|
if (!match.Success)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
ProfileItem server = new ProfileItem();
|
||||||
|
var base64 = match.Groups["base64"].Value.TrimEnd('/');
|
||||||
|
var tag = match.Groups["tag"].Value;
|
||||||
|
if (!Utils.IsNullOrEmpty(tag))
|
||||||
|
{
|
||||||
|
server.remarks = Utils.UrlDecode(tag);
|
||||||
|
}
|
||||||
|
Match details;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
details = DetailsParser.Match(Utils.Base64Decode(base64));
|
||||||
|
}
|
||||||
|
catch (FormatException)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (!details.Success)
|
||||||
|
return null;
|
||||||
|
server.security = details.Groups["method"].Value;
|
||||||
|
server.id = details.Groups["password"].Value;
|
||||||
|
server.address = details.Groups["hostname"].Value;
|
||||||
|
server.port = int.Parse(details.Groups["port"].Value);
|
||||||
|
return server;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static readonly Regex StdVmessUserInfo = new Regex(
|
||||||
|
@"^(?<network>[a-z]+)(\+(?<streamSecurity>[a-z]+))?:(?<id>[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$");
|
||||||
|
|
||||||
|
private static ProfileItem ResolveSocks(string result)
|
||||||
|
{
|
||||||
|
ProfileItem profileItem = new ProfileItem
|
||||||
|
{
|
||||||
|
configType = EConfigType.Socks
|
||||||
|
};
|
||||||
|
result = result.Substring(Global.socksProtocol.Length);
|
||||||
|
//remark
|
||||||
|
int indexRemark = result.IndexOf("#");
|
||||||
|
if (indexRemark > 0)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
profileItem.remarks = Utils.UrlDecode(result.Substring(indexRemark + 1, result.Length - indexRemark - 1));
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
result = result.Substring(0, indexRemark);
|
||||||
|
}
|
||||||
|
//part decode
|
||||||
|
int indexS = result.IndexOf("@");
|
||||||
|
if (indexS > 0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result = Utils.Base64Decode(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
string[] arr1 = result.Split('@');
|
||||||
|
if (arr1.Length != 2)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
string[] arr21 = arr1[0].Split(':');
|
||||||
|
//string[] arr22 = arr1[1].Split(':');
|
||||||
|
int indexPort = arr1[1].LastIndexOf(":");
|
||||||
|
if (arr21.Length != 2 || indexPort < 0)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
profileItem.address = arr1[1].Substring(0, indexPort);
|
||||||
|
profileItem.port = Utils.ToInt(arr1[1].Substring(indexPort + 1, arr1[1].Length - (indexPort + 1)));
|
||||||
|
profileItem.security = arr21[0];
|
||||||
|
profileItem.id = arr21[1];
|
||||||
|
|
||||||
|
return profileItem;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ProfileItem ResolveSocksNew(string result)
|
||||||
|
{
|
||||||
|
Uri parsedUrl;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
parsedUrl = new Uri(result);
|
||||||
|
}
|
||||||
|
catch (UriFormatException)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
ProfileItem server = new ProfileItem
|
||||||
|
{
|
||||||
|
remarks = parsedUrl.GetComponents(UriComponents.Fragment, UriFormat.Unescaped),
|
||||||
|
address = parsedUrl.IdnHost,
|
||||||
|
port = parsedUrl.Port,
|
||||||
|
};
|
||||||
|
|
||||||
|
// parse base64 UserInfo
|
||||||
|
string rawUserInfo = parsedUrl.GetComponents(UriComponents.UserInfo, UriFormat.Unescaped);
|
||||||
|
string userInfo = Utils.Base64Decode(rawUserInfo);
|
||||||
|
string[] userInfoParts = userInfo.Split(new[] { ':' }, 2);
|
||||||
|
if (userInfoParts.Length == 2)
|
||||||
|
{
|
||||||
|
server.security = userInfoParts[0];
|
||||||
|
server.id = userInfoParts[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
return server;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static ProfileItem ResolveTrojan(string result)
|
||||||
|
{
|
||||||
|
ProfileItem item = new ProfileItem
|
||||||
|
{
|
||||||
|
configType = EConfigType.Trojan
|
||||||
|
};
|
||||||
|
|
||||||
|
Uri url = new Uri(result);
|
||||||
|
|
||||||
|
item.address = url.IdnHost;
|
||||||
|
item.port = url.Port;
|
||||||
|
item.remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped);
|
||||||
|
item.id = url.UserInfo;
|
||||||
|
|
||||||
|
var query = HttpUtility.ParseQueryString(url.Query);
|
||||||
|
ResolveStdTransport(query, ref item);
|
||||||
|
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
private static ProfileItem ResolveStdVLESS(string result)
|
||||||
|
{
|
||||||
|
ProfileItem item = new ProfileItem
|
||||||
|
{
|
||||||
|
configType = EConfigType.VLESS,
|
||||||
|
security = "none"
|
||||||
|
};
|
||||||
|
|
||||||
|
Uri url = new Uri(result);
|
||||||
|
|
||||||
|
item.address = url.IdnHost;
|
||||||
|
item.port = url.Port;
|
||||||
|
item.remarks = url.GetComponents(UriComponents.Fragment, UriFormat.Unescaped);
|
||||||
|
item.id = url.UserInfo;
|
||||||
|
|
||||||
|
var query = HttpUtility.ParseQueryString(url.Query);
|
||||||
|
item.security = query["encryption"] ?? "none";
|
||||||
|
item.streamSecurity = query["security"] ?? "";
|
||||||
|
ResolveStdTransport(query, ref item);
|
||||||
|
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int ResolveStdTransport(NameValueCollection query, ref ProfileItem item)
|
||||||
|
{
|
||||||
|
item.flow = query["flow"] ?? "";
|
||||||
|
item.streamSecurity = query["security"] ?? "";
|
||||||
|
item.sni = query["sni"] ?? "";
|
||||||
|
item.alpn = Utils.UrlDecode(query["alpn"] ?? "");
|
||||||
|
item.network = query["type"] ?? "tcp";
|
||||||
|
switch (item.network)
|
||||||
|
{
|
||||||
|
case "tcp":
|
||||||
|
item.headerType = query["headerType"] ?? "none";
|
||||||
|
item.requestHost = Utils.UrlDecode(query["host"] ?? "");
|
||||||
|
|
||||||
|
break;
|
||||||
|
case "kcp":
|
||||||
|
item.headerType = query["headerType"] ?? "none";
|
||||||
|
item.path = Utils.UrlDecode(query["seed"] ?? "");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "ws":
|
||||||
|
item.requestHost = Utils.UrlDecode(query["host"] ?? "");
|
||||||
|
item.path = Utils.UrlDecode(query["path"] ?? "/");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "http":
|
||||||
|
case "h2":
|
||||||
|
item.network = "h2";
|
||||||
|
item.requestHost = Utils.UrlDecode(query["host"] ?? "");
|
||||||
|
item.path = Utils.UrlDecode(query["path"] ?? "/");
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "quic":
|
||||||
|
item.headerType = query["headerType"] ?? "none";
|
||||||
|
item.requestHost = query["quicSecurity"] ?? "none";
|
||||||
|
item.path = Utils.UrlDecode(query["key"] ?? "");
|
||||||
|
break;
|
||||||
|
case "grpc":
|
||||||
|
item.path = Utils.UrlDecode(query["serviceName"] ?? "");
|
||||||
|
item.headerType = Utils.UrlDecode(query["mode"] ?? Global.GrpcgunMode);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,69 +1,71 @@
|
|||||||
using System;
|
using System.Diagnostics;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.Net;
|
using System.Net;
|
||||||
|
using System.Net.NetworkInformation;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using v2rayN.Mode;
|
using v2rayN.Mode;
|
||||||
|
using v2rayN.Resx;
|
||||||
|
|
||||||
namespace v2rayN.Handler
|
namespace v2rayN.Handler
|
||||||
{
|
{
|
||||||
class SpeedtestHandler
|
class SpeedtestHandler
|
||||||
{
|
{
|
||||||
private DownloadHandle downloadHandle2;
|
|
||||||
private Config _config;
|
private Config _config;
|
||||||
private V2rayHandler _v2rayHandler;
|
private CoreHandler _coreHandler;
|
||||||
private List<int> _selecteds;
|
private List<ServerTestItem> _selecteds;
|
||||||
Action<int, string> _updateFunc;
|
Action<string, string, string> _updateFunc;
|
||||||
|
|
||||||
private int testCounter = 0;
|
public SpeedtestHandler(Config config)
|
||||||
private int ItemIndex
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return _selecteds[testCounter - 1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public SpeedtestHandler(ref Config config, ref V2rayHandler v2rayHandler, List<int> selecteds, string actionType, Action<int, string> update)
|
|
||||||
{
|
{
|
||||||
_config = config;
|
_config = config;
|
||||||
_v2rayHandler = v2rayHandler;
|
}
|
||||||
_selecteds = selecteds;
|
|
||||||
|
public SpeedtestHandler(Config config, CoreHandler coreHandler, List<ProfileItem> selecteds, ESpeedActionType actionType, Action<string, string, string> update)
|
||||||
|
{
|
||||||
|
_config = config;
|
||||||
|
_coreHandler = coreHandler;
|
||||||
|
//_selecteds = Utils.DeepCopy(selecteds);
|
||||||
_updateFunc = update;
|
_updateFunc = update;
|
||||||
|
|
||||||
if (actionType == "ping")
|
_selecteds = new List<ServerTestItem>();
|
||||||
|
foreach (var it in selecteds)
|
||||||
{
|
{
|
||||||
Task.Run(() => RunPing());
|
_selecteds.Add(new ServerTestItem()
|
||||||
|
{
|
||||||
|
indexId = it.indexId,
|
||||||
|
address = it.address,
|
||||||
|
port = it.port,
|
||||||
|
configType = it.configType
|
||||||
|
});
|
||||||
}
|
}
|
||||||
if (actionType == "tcping")
|
switch (actionType)
|
||||||
{
|
{
|
||||||
Task.Run(() => RunTcping());
|
case ESpeedActionType.Ping:
|
||||||
}
|
Task.Run(RunPing);
|
||||||
else if (actionType == "realping")
|
break;
|
||||||
{
|
case ESpeedActionType.Tcping:
|
||||||
Task.Run(() => RunRealPing());
|
Task.Run(RunTcping);
|
||||||
}
|
break;
|
||||||
else if (actionType == "speedtest")
|
case ESpeedActionType.Realping:
|
||||||
{
|
Task.Run(RunRealPing);
|
||||||
Task.Run(() => RunSpeedTest());
|
break;
|
||||||
|
case ESpeedActionType.Speedtest:
|
||||||
|
Task.Run(RunSpeedTestAsync);
|
||||||
|
break;
|
||||||
|
case ESpeedActionType.Mixedtest:
|
||||||
|
Task.Run(RunMixedtestAsync);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RunPingSub(Action<int> updateFun)
|
private void RunPingSub(Action<ServerTestItem> updateFun)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
foreach (int index in _selecteds)
|
foreach (var it in _selecteds.Where(it => it.configType != EConfigType.Custom))
|
||||||
{
|
{
|
||||||
if (_config.vmess[index].configType == (int)EConfigType.Custom)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
updateFun(index);
|
Task.Run(() => updateFun(it));
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -82,37 +84,52 @@ namespace v2rayN.Handler
|
|||||||
|
|
||||||
private void RunPing()
|
private void RunPing()
|
||||||
{
|
{
|
||||||
RunPingSub((int index) =>
|
RunPingSub((ServerTestItem it) =>
|
||||||
{
|
{
|
||||||
long time = Utils.Ping(_config.vmess[index].address);
|
long time = Ping(it.address);
|
||||||
_updateFunc(index, FormatOut(time, "ms"));
|
var output = FormatOut(time, Global.DelayUnit);
|
||||||
|
|
||||||
|
LazyConfig.Instance.SetTestResult(it.indexId, output, "");
|
||||||
|
UpdateFunc(it.indexId, output);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RunTcping()
|
private void RunTcping()
|
||||||
{
|
{
|
||||||
RunPingSub((int index) =>
|
RunPingSub((ServerTestItem it) =>
|
||||||
{
|
{
|
||||||
int time = GetTcpingTime(_config.vmess[index].address, _config.vmess[index].port);
|
int time = GetTcpingTime(it.address, it.port);
|
||||||
_updateFunc(index, FormatOut(time, "ms"));
|
var output = FormatOut(time, Global.DelayUnit);
|
||||||
|
|
||||||
|
LazyConfig.Instance.SetTestResult(it.indexId, output, "");
|
||||||
|
UpdateFunc(it.indexId, output);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RunRealPing()
|
private async Task RunRealPing()
|
||||||
{
|
{
|
||||||
int pid = -1;
|
int pid = -1;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
string msg = string.Empty;
|
string msg = string.Empty;
|
||||||
|
|
||||||
pid = _v2rayHandler.LoadV2rayConfigString(_config, _selecteds);
|
pid = _coreHandler.LoadCoreConfigString(_config, _selecteds);
|
||||||
|
if (pid < 0)
|
||||||
//Thread.Sleep(5000);
|
|
||||||
int httpPort = _config.GetLocalPort("speedtest");
|
|
||||||
List<Task> tasks = new List<Task>();
|
|
||||||
foreach (int itemIndex in _selecteds)
|
|
||||||
{
|
{
|
||||||
if (_config.vmess[itemIndex].configType == (int)EConfigType.Custom)
|
UpdateFunc("", ResUI.FailedToRunCore);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DownloadHandle downloadHandle = new DownloadHandle();
|
||||||
|
//Thread.Sleep(5000);
|
||||||
|
List<Task> tasks = new List<Task>();
|
||||||
|
foreach (var it in _selecteds)
|
||||||
|
{
|
||||||
|
if (!it.allowTest)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (it.configType == EConfigType.Custom)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -120,11 +137,13 @@ namespace v2rayN.Handler
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
WebProxy webProxy = new WebProxy(Global.Loopback, httpPort + itemIndex);
|
LazyConfig.Instance.SetTestResult(it.indexId, "-1", "");
|
||||||
int responseTime = -1;
|
|
||||||
string status = GetRealPingTime(_config.speedPingTestUrl, webProxy, out responseTime);
|
WebProxy webProxy = new WebProxy(Global.Loopback, it.port);
|
||||||
string output = Utils.IsNullOrEmpty(status) ? FormatOut(responseTime, "ms") : FormatOut(status, "");
|
string output = GetRealPingTime(downloadHandle, webProxy);
|
||||||
_updateFunc(itemIndex, output);
|
|
||||||
|
LazyConfig.Instance.SetTestResult(it.indexId, output, "");
|
||||||
|
UpdateFunc(it.indexId, output);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -141,88 +160,73 @@ namespace v2rayN.Handler
|
|||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
if (pid > 0) _v2rayHandler.V2rayStopPid(pid);
|
if (pid > 0) _coreHandler.CoreStopPid(pid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
private async Task RunSpeedTestAsync()
|
||||||
public int RunAvailabilityCheck() // alias: isLive
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
int httpPort = _config.GetLocalPort(Global.InboundHttp);
|
|
||||||
|
|
||||||
Task<int> t = Task.Run(() =>
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
WebProxy webProxy = new WebProxy(Global.Loopback, httpPort);
|
|
||||||
int responseTime = -1;
|
|
||||||
string status = GetRealPingTime(Global.AvailabilityTestUrl, webProxy, out responseTime);
|
|
||||||
bool noError = Utils.IsNullOrEmpty(status);
|
|
||||||
return noError ? responseTime : -1;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Utils.SaveLog(ex.Message, ex);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return t.Result;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Utils.SaveLog(ex.Message, ex);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void RunSpeedTest()
|
|
||||||
{
|
{
|
||||||
|
string testIndexId = string.Empty;
|
||||||
int pid = -1;
|
int pid = -1;
|
||||||
|
|
||||||
if (_config.vmess.Count <= 0)
|
pid = _coreHandler.LoadCoreConfigString(_config, _selecteds);
|
||||||
|
if (pid < 0)
|
||||||
{
|
{
|
||||||
|
UpdateFunc("", ResUI.FailedToRunCore);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
pid = _v2rayHandler.LoadV2rayConfigString(_config, _selecteds);
|
string url = _config.constItem.speedTestUrl;
|
||||||
|
DownloadHandle downloadHandle = new DownloadHandle();
|
||||||
|
|
||||||
string url = _config.speedTestUrl;
|
var timeout = 10;
|
||||||
testCounter = 0;
|
foreach (var it in _selecteds)
|
||||||
if (downloadHandle2 == null)
|
|
||||||
{
|
{
|
||||||
downloadHandle2 = new DownloadHandle();
|
_ = LazyConfig.Instance.SetTestResult(it.indexId, "", "-1");
|
||||||
downloadHandle2.UpdateCompleted += (sender2, args) =>
|
UpdateFunc(it.indexId, "", ResUI.Speedtesting);
|
||||||
|
if (!it.allowTest)
|
||||||
{
|
{
|
||||||
_updateFunc(ItemIndex, args.Msg);
|
continue;
|
||||||
if (args.Success) StartNext();
|
}
|
||||||
};
|
if (it.configType == EConfigType.Custom)
|
||||||
downloadHandle2.Error += (sender2, args) =>
|
|
||||||
{
|
{
|
||||||
_updateFunc(ItemIndex, args.GetException().Message);
|
continue;
|
||||||
StartNext();
|
}
|
||||||
};
|
testIndexId = it.indexId;
|
||||||
|
|
||||||
|
var item = LazyConfig.Instance.GetProfileItem(it.indexId);
|
||||||
|
if (item is null) continue;
|
||||||
|
|
||||||
|
WebProxy webProxy = new WebProxy(Global.Loopback, it.port);
|
||||||
|
|
||||||
|
await downloadHandle.DownloadDataAsync(url, webProxy, timeout, (bool success, string msg) =>
|
||||||
|
{
|
||||||
|
decimal.TryParse(msg, out decimal dec);
|
||||||
|
if (dec > 0)
|
||||||
|
{
|
||||||
|
_ = LazyConfig.Instance.SetTestResult(it.indexId, "", msg);
|
||||||
|
}
|
||||||
|
UpdateFunc(it.indexId, "", msg);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
StartNext();
|
if (pid > 0)
|
||||||
|
|
||||||
void StartNext()
|
|
||||||
{
|
{
|
||||||
if (testCounter >= _selecteds.Count)
|
_coreHandler.CoreStopPid(pid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private async Task RunMixedtestAsync()
|
||||||
{
|
{
|
||||||
if (pid > 0) _v2rayHandler.V2rayStopPid(pid);
|
await RunRealPing();
|
||||||
return;
|
|
||||||
|
await RunSpeedTestAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
int httpPort = _config.GetLocalPort("speedtest");
|
public string GetRealPingTime(DownloadHandle downloadHandle, WebProxy webProxy)
|
||||||
int index = _selecteds[testCounter];
|
{
|
||||||
|
string status = downloadHandle.GetRealPingTime(_config.constItem.speedPingTestUrl, webProxy, 10, out int responseTime);
|
||||||
testCounter++;
|
//string output = Utils.IsNullOrEmpty(status) ? FormatOut(responseTime, "ms") : status;
|
||||||
WebProxy webProxy = new WebProxy(Global.Loopback, httpPort + index);
|
return FormatOut(Utils.IsNullOrEmpty(status) ? responseTime : -1, Global.DelayUnit);
|
||||||
downloadHandle2.DownloadFileAsync(url, webProxy, 20);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private int GetTcpingTime(string url, int port)
|
private int GetTcpingTime(string url, int port)
|
||||||
{
|
{
|
||||||
@@ -258,44 +262,56 @@ namespace v2rayN.Handler
|
|||||||
return responseTime;
|
return responseTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
private string GetRealPingTime(string url, WebProxy webProxy, out int responseTime)
|
|
||||||
|
/// <summary>
|
||||||
|
/// Ping
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="host"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public long Ping(string host)
|
||||||
{
|
{
|
||||||
string msg = string.Empty;
|
long roundtripTime = -1;
|
||||||
responseTime = -1;
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);
|
int timeout = 30;
|
||||||
myHttpWebRequest.Timeout = 5000;
|
int echoNum = 2;
|
||||||
myHttpWebRequest.Proxy = webProxy;//new WebProxy(Global.Loopback, Global.httpPort);
|
Ping pingSender = new Ping();
|
||||||
|
for (int i = 0; i < echoNum; i++)
|
||||||
Stopwatch timer = new Stopwatch();
|
|
||||||
timer.Start();
|
|
||||||
|
|
||||||
HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
|
|
||||||
if (myHttpWebResponse.StatusCode != HttpStatusCode.OK
|
|
||||||
&& myHttpWebResponse.StatusCode != HttpStatusCode.NoContent)
|
|
||||||
{
|
{
|
||||||
msg = myHttpWebResponse.StatusDescription;
|
PingReply reply = pingSender.Send(host, timeout);
|
||||||
|
if (reply.Status == IPStatus.Success)
|
||||||
|
{
|
||||||
|
if (reply.RoundtripTime < 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (roundtripTime < 0 || reply.RoundtripTime < roundtripTime)
|
||||||
|
{
|
||||||
|
roundtripTime = reply.RoundtripTime;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
timer.Stop();
|
|
||||||
responseTime = timer.Elapsed.Milliseconds;
|
|
||||||
|
|
||||||
myHttpWebResponse.Close();
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Utils.SaveLog(ex.Message, ex);
|
Utils.SaveLog(ex.Message, ex);
|
||||||
msg = ex.Message;
|
return -1;
|
||||||
}
|
}
|
||||||
return msg;
|
return roundtripTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
private string FormatOut(object time, string unit)
|
private string FormatOut(object time, string unit)
|
||||||
{
|
{
|
||||||
if (time.ToString().Equals("-1"))
|
//if (time.ToString().Equals("-1"))
|
||||||
|
//{
|
||||||
|
// return "Timeout";
|
||||||
|
//}
|
||||||
|
return $"{time}";
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateFunc(string indexId, string delay, string speed = "")
|
||||||
{
|
{
|
||||||
return "Timeout";
|
_updateFunc(indexId, delay, speed);
|
||||||
}
|
|
||||||
return string.Format("{0}{1}", time, unit).PadLeft(6, ' ');
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,73 +1,38 @@
|
|||||||
using Grpc.Core;
|
using Grpc.Core;
|
||||||
using System;
|
using ProtosLib.Statistics;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
using System.Threading;
|
using v2rayN.Base;
|
||||||
using System.Threading.Tasks;
|
|
||||||
using v2rayN.Mode;
|
using v2rayN.Mode;
|
||||||
using v2rayN.Protos.Statistics;
|
|
||||||
|
|
||||||
namespace v2rayN.Handler
|
namespace v2rayN.Handler
|
||||||
{
|
{
|
||||||
class StatisticsHandler
|
class StatisticsHandler
|
||||||
{
|
{
|
||||||
private Mode.Config config_;
|
private Mode.Config config_;
|
||||||
private ServerStatistics serverStatistics_;
|
|
||||||
private Channel channel_;
|
private Channel channel_;
|
||||||
private StatsService.StatsServiceClient client_;
|
private StatsService.StatsServiceClient client_;
|
||||||
private bool exitFlag_;
|
private bool exitFlag_;
|
||||||
|
private ServerStatItem _serverStatItem;
|
||||||
|
|
||||||
Action<ulong, ulong, List<ServerStatItem>> updateFunc_;
|
Action<ServerSpeedItem> updateFunc_;
|
||||||
|
|
||||||
public bool Enable
|
public bool Enable
|
||||||
{
|
{
|
||||||
get; set;
|
get; set;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool UpdateUI
|
public StatisticsHandler(Mode.Config config, Action<ServerSpeedItem> update)
|
||||||
{
|
{
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<ServerStatItem> Statistic
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return serverStatistics_.server;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public StatisticsHandler(Mode.Config config, Action<ulong, ulong, List<ServerStatItem>> update)
|
|
||||||
{
|
|
||||||
//try
|
|
||||||
//{
|
|
||||||
// if (Environment.Is64BitOperatingSystem)
|
|
||||||
// {
|
|
||||||
// FileManager.UncompressFile(Utils.GetPath("grpc_csharp_ext.x64.dll"), Resources.grpc_csharp_ext_x64_dll);
|
|
||||||
// }
|
|
||||||
// else
|
|
||||||
// {
|
|
||||||
// FileManager.UncompressFile(Utils.GetPath("grpc_csharp_ext.x86.dll"), Resources.grpc_csharp_ext_x86_dll);
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
//catch (IOException ex)
|
|
||||||
//{
|
|
||||||
// Utils.SaveLog(ex.Message, ex);
|
|
||||||
|
|
||||||
//}
|
|
||||||
|
|
||||||
config_ = config;
|
config_ = config;
|
||||||
Enable = config.enableStatistics;
|
Enable = config.enableStatistics;
|
||||||
UpdateUI = false;
|
|
||||||
updateFunc_ = update;
|
updateFunc_ = update;
|
||||||
exitFlag_ = false;
|
exitFlag_ = false;
|
||||||
|
|
||||||
LoadFromFile();
|
Init();
|
||||||
|
|
||||||
GrpcInit();
|
GrpcInit();
|
||||||
|
|
||||||
Task.Run(() => Run());
|
Task.Run(Run);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void GrpcInit()
|
private void GrpcInit()
|
||||||
@@ -110,124 +75,97 @@ namespace v2rayN.Handler
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Utils.SaveLog(ex.Message, ex);
|
//Utils.SaveLog(ex.Message, ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (res != null)
|
if (res != null)
|
||||||
{
|
{
|
||||||
string itemId = config_.getItemId();
|
GetServerStatItem(config_.indexId);
|
||||||
ServerStatItem serverStatItem = GetServerStatItem(itemId);
|
ParseOutput(res.Stat, out ServerSpeedItem server);
|
||||||
|
|
||||||
//TODO: parse output
|
_serverStatItem.todayUp += server.proxyUp;
|
||||||
ParseOutput(res.Stat, out ulong up, out ulong down);
|
_serverStatItem.todayDown += server.proxyDown;
|
||||||
|
_serverStatItem.totalUp += server.proxyUp;
|
||||||
|
_serverStatItem.totalDown += server.proxyDown;
|
||||||
|
|
||||||
serverStatItem.todayUp += up;
|
if (Global.ShowInTaskbar)
|
||||||
serverStatItem.todayDown += down;
|
|
||||||
serverStatItem.totalUp += up;
|
|
||||||
serverStatItem.totalDown += down;
|
|
||||||
|
|
||||||
if (UpdateUI)
|
|
||||||
{
|
{
|
||||||
updateFunc_(up, down, new List<ServerStatItem> { serverStatItem });
|
server.indexId = config_.indexId;
|
||||||
|
updateFunc_(server);
|
||||||
|
}
|
||||||
|
if (server.proxyUp != 0 || server.proxyDown != 0)
|
||||||
|
{
|
||||||
|
_ = SqliteHelper.Instance.UpdateAsync(_serverStatItem);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
var sleep = config_.statisticsFreshRate < 1 ? 1 : config_.statisticsFreshRate;
|
||||||
Thread.Sleep(config_.statisticsFreshRate);
|
Thread.Sleep(1000 * sleep);
|
||||||
channel_.ConnectAsync();
|
channel_.ConnectAsync();
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch
|
||||||
{
|
{
|
||||||
Utils.SaveLog(ex.Message, ex);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void LoadFromFile()
|
public void ClearAllServerStatistics()
|
||||||
{
|
{
|
||||||
try
|
SqliteHelper.Instance.Execute($"delete from ServerStatItem ");
|
||||||
{
|
_serverStatItem = null;
|
||||||
string result = Utils.LoadResource(Utils.GetPath(Global.StatisticLogOverall));
|
|
||||||
if (!Utils.IsNullOrEmpty(result))
|
|
||||||
{
|
|
||||||
//转成Json
|
|
||||||
serverStatistics_ = Utils.FromJson<ServerStatistics>(result);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (serverStatistics_ == null)
|
private void Init()
|
||||||
{
|
|
||||||
serverStatistics_ = new ServerStatistics();
|
|
||||||
}
|
|
||||||
if (serverStatistics_.server == null)
|
|
||||||
{
|
|
||||||
serverStatistics_.server = new List<ServerStatItem>();
|
|
||||||
}
|
|
||||||
|
|
||||||
long ticks = DateTime.Now.Date.Ticks;
|
|
||||||
foreach (ServerStatItem item in serverStatistics_.server)
|
|
||||||
{
|
|
||||||
if (item.dateNow != ticks)
|
|
||||||
{
|
|
||||||
item.todayUp = 0;
|
|
||||||
item.todayDown = 0;
|
|
||||||
item.dateNow = ticks;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Utils.SaveLog(ex.Message, ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SaveToFile()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Utils.ToJsonFile(serverStatistics_, Utils.GetPath(Global.StatisticLogOverall));
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Utils.SaveLog(ex.Message, ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private ServerStatItem GetServerStatItem(string itemId)
|
|
||||||
{
|
{
|
||||||
long ticks = DateTime.Now.Date.Ticks;
|
long ticks = DateTime.Now.Date.Ticks;
|
||||||
int cur = Statistic.FindIndex(item => item.itemId == itemId);
|
SqliteHelper.Instance.Execute($"update ServerStatItem set todayUp = 0,todayDown=0,dateNow={ticks} where dateNow<>{ticks}");
|
||||||
if (cur < 0)
|
}
|
||||||
|
|
||||||
|
private void GetServerStatItem(string indexId)
|
||||||
{
|
{
|
||||||
Statistic.Add(new ServerStatItem
|
long ticks = DateTime.Now.Date.Ticks;
|
||||||
|
if (_serverStatItem != null && _serverStatItem.indexId != indexId)
|
||||||
{
|
{
|
||||||
itemId = itemId,
|
_serverStatItem = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_serverStatItem == null)
|
||||||
|
{
|
||||||
|
_serverStatItem = SqliteHelper.Instance.Table<ServerStatItem>().FirstOrDefault(t => t.indexId == indexId);
|
||||||
|
if (_serverStatItem == null)
|
||||||
|
{
|
||||||
|
_serverStatItem = new ServerStatItem
|
||||||
|
{
|
||||||
|
indexId = indexId,
|
||||||
totalUp = 0,
|
totalUp = 0,
|
||||||
totalDown = 0,
|
totalDown = 0,
|
||||||
todayUp = 0,
|
todayUp = 0,
|
||||||
todayDown = 0,
|
todayDown = 0,
|
||||||
dateNow = ticks
|
dateNow = ticks
|
||||||
});
|
};
|
||||||
cur = Statistic.Count - 1;
|
_ = SqliteHelper.Instance.Replacesync(_serverStatItem);
|
||||||
}
|
}
|
||||||
if (Statistic[cur].dateNow != ticks)
|
|
||||||
{
|
|
||||||
Statistic[cur].todayUp = 0;
|
|
||||||
Statistic[cur].todayDown = 0;
|
|
||||||
Statistic[cur].dateNow = ticks;
|
|
||||||
}
|
|
||||||
return Statistic[cur];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ParseOutput(Google.Protobuf.Collections.RepeatedField<Stat> source, out ulong up, out ulong down)
|
if (_serverStatItem.dateNow != ticks)
|
||||||
{
|
{
|
||||||
|
_serverStatItem.todayUp = 0;
|
||||||
|
_serverStatItem.todayDown = 0;
|
||||||
|
_serverStatItem.dateNow = ticks;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
up = 0; down = 0;
|
private void ParseOutput(Google.Protobuf.Collections.RepeatedField<Stat> source, out ServerSpeedItem server)
|
||||||
|
{
|
||||||
|
server = new();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
||||||
foreach (Stat stat in source)
|
foreach (Stat stat in source)
|
||||||
{
|
{
|
||||||
string name = stat.Name;
|
string name = stat.Name;
|
||||||
long value = stat.Value;
|
long value = stat.Value / 1024; //KByte
|
||||||
string[] nStr = name.Split(">>>".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
|
string[] nStr = name.Split(">>>".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
|
||||||
string type = "";
|
string type = "";
|
||||||
|
|
||||||
@@ -240,18 +178,29 @@ namespace v2rayN.Handler
|
|||||||
{
|
{
|
||||||
if (type == "uplink")
|
if (type == "uplink")
|
||||||
{
|
{
|
||||||
up = (ulong)value;
|
server.proxyUp = value;
|
||||||
}
|
}
|
||||||
else if (type == "downlink")
|
else if (type == "downlink")
|
||||||
{
|
{
|
||||||
down = (ulong)value;
|
server.proxyDown = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (name == Global.directTag)
|
||||||
|
{
|
||||||
|
if (type == "uplink")
|
||||||
|
{
|
||||||
|
server.directUp = value;
|
||||||
|
}
|
||||||
|
else if (type == "downlink")
|
||||||
|
{
|
||||||
|
server.directDown = value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Utils.SaveLog(ex.Message, ex);
|
//Utils.SaveLog(ex.Message, ex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +1,12 @@
|
|||||||
|
using PacLib;
|
||||||
using System;
|
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading;
|
|
||||||
using v2rayN.Mode;
|
using v2rayN.Mode;
|
||||||
using v2rayN.Properties;
|
using v2rayN.Properties;
|
||||||
using v2rayN.Tool;
|
using v2rayN.Tool;
|
||||||
|
|
||||||
namespace v2rayN.HttpProxyHandler
|
namespace v2rayN.Handler
|
||||||
{
|
{
|
||||||
public static class SysProxyHandle
|
public static class SysProxyHandle
|
||||||
{
|
{
|
||||||
@@ -47,38 +45,88 @@ namespace v2rayN.HttpProxyHandler
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void SetIEProxy(bool enable, bool global, string strProxy)
|
|
||||||
{
|
|
||||||
//Read();
|
|
||||||
|
|
||||||
//if (!_userSettings.UserSettingsRecorded)
|
public static bool UpdateSysProxy(Config config, bool forceDisable)
|
||||||
//{
|
|
||||||
// // record user settings
|
|
||||||
// ExecSysproxy("query");
|
|
||||||
// //ParseQueryStr(_queryStr);
|
|
||||||
//}
|
|
||||||
|
|
||||||
string arguments;
|
|
||||||
if (enable)
|
|
||||||
{
|
{
|
||||||
arguments = global
|
var type = config.sysProxyType;
|
||||||
? $"global {strProxy} {Global.IEProxyExceptions}"
|
|
||||||
: $"pac {strProxy}";
|
if (forceDisable && type == ESysProxyType.ForcedChange)
|
||||||
|
{
|
||||||
|
type = ESysProxyType.ForcedClear;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
int port = LazyConfig.Instance.GetLocalPort(Global.InboundHttp);
|
||||||
|
int portSocks = LazyConfig.Instance.GetLocalPort(Global.InboundSocks);
|
||||||
|
int portPac = LazyConfig.Instance.GetLocalPort(ESysProxyType.Pac.ToString());
|
||||||
|
if (port <= 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (type == ESysProxyType.ForcedChange)
|
||||||
|
{
|
||||||
|
var strExceptions = $"{config.constItem.defIEProxyExceptions};{config.systemProxyExceptions}";
|
||||||
|
|
||||||
|
var strProxy = string.Empty;
|
||||||
|
if (Utils.IsNullOrEmpty(config.systemProxyAdvancedProtocol))
|
||||||
|
{
|
||||||
|
strProxy = $"{Global.Loopback}:{port}";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// restore user settings
|
strProxy = config.systemProxyAdvancedProtocol
|
||||||
string flags = _userSettings.Flags;
|
.Replace("{ip}", Global.Loopback)
|
||||||
string proxy_server = _userSettings.ProxyServer ?? "-";
|
.Replace("{http_port}", port.ToString())
|
||||||
string bypass_list = _userSettings.BypassList ?? "-";
|
.Replace("{socks_port}", portSocks.ToString());
|
||||||
string pac_url = _userSettings.PacUrl ?? "-";
|
}
|
||||||
arguments = $"set {flags} {proxy_server} {bypass_list} {pac_url}";
|
SetIEProxy(true, strProxy, strExceptions);
|
||||||
|
}
|
||||||
// have to get new settings
|
else if (type == ESysProxyType.ForcedClear)
|
||||||
_userSettings.UserSettingsRecorded = false;
|
{
|
||||||
|
ResetIEProxy();
|
||||||
|
}
|
||||||
|
else if (type == ESysProxyType.Unchanged)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else if (type == ESysProxyType.Pac)
|
||||||
|
{
|
||||||
|
PacHandler.Start(Utils.GetConfigPath(), port, portPac);
|
||||||
|
var strProxy = $"{Global.httpProtocol}{Global.Loopback}:{portPac}/pac?t={DateTime.Now.Ticks}";
|
||||||
|
SetIEProxy(false, strProxy, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
//Save();
|
if (type != ESysProxyType.Pac)
|
||||||
|
{
|
||||||
|
PacHandler.Stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Utils.SaveLog(ex.Message, ex);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ResetIEProxy4WindowsShutDown()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
//TODO To be verified
|
||||||
|
Utils.RegWriteValue(@"Software\Microsoft\Windows\CurrentVersion\Internet Settings", "ProxyEnable", 0);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void SetIEProxy(bool global, string strProxy, string strExceptions)
|
||||||
|
{
|
||||||
|
string arguments = global
|
||||||
|
? $"global {strProxy} {strExceptions}"
|
||||||
|
: $"pac {strProxy}";
|
||||||
|
|
||||||
ExecSysproxy(arguments);
|
ExecSysproxy(arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
249
v2rayN/v2rayN/Handler/TunHandler.cs
Normal file
249
v2rayN/v2rayN/Handler/TunHandler.cs
Normal file
@@ -0,0 +1,249 @@
|
|||||||
|
using System.Diagnostics;
|
||||||
|
using System.IO;
|
||||||
|
using System.Reactive.Linq;
|
||||||
|
using v2rayN.Handler;
|
||||||
|
using v2rayN.Mode;
|
||||||
|
|
||||||
|
namespace v2rayN.Base
|
||||||
|
{
|
||||||
|
public sealed class TunHandler
|
||||||
|
{
|
||||||
|
private static readonly Lazy<TunHandler> _instance = new Lazy<TunHandler>(() => new());
|
||||||
|
public static TunHandler Instance => _instance.Value;
|
||||||
|
private string _tunConfigName = "tunConfig.json";
|
||||||
|
private static Config _config;
|
||||||
|
private CoreInfo coreInfo;
|
||||||
|
private Process _process;
|
||||||
|
private static int _socksPort;
|
||||||
|
private static bool _needRestart = true;
|
||||||
|
private static bool _isRunning = false;
|
||||||
|
|
||||||
|
public TunHandler()
|
||||||
|
{
|
||||||
|
_config = LazyConfig.Instance.GetConfig();
|
||||||
|
|
||||||
|
Observable.Interval(TimeSpan.FromSeconds(10))
|
||||||
|
.Subscribe(x =>
|
||||||
|
{
|
||||||
|
if (_isRunning && _config.tunModeItem.enableTun)
|
||||||
|
{
|
||||||
|
if (_process == null || _process.HasExited)
|
||||||
|
{
|
||||||
|
if (Init() == false)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
CoreStart();
|
||||||
|
Utils.SaveLog("Tun mode monitors restart");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Start()
|
||||||
|
{
|
||||||
|
var socksPort = LazyConfig.Instance.GetLocalPort(Global.InboundSocks);
|
||||||
|
|
||||||
|
if (socksPort.Equals(_socksPort)
|
||||||
|
&& _process != null
|
||||||
|
&& !_process.HasExited)
|
||||||
|
{
|
||||||
|
_needRestart = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
_socksPort = socksPort;
|
||||||
|
|
||||||
|
if (_needRestart)
|
||||||
|
{
|
||||||
|
CoreStop();
|
||||||
|
if (Init() == false)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
CoreStart();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Stop()
|
||||||
|
{
|
||||||
|
CoreStop();
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool Init()
|
||||||
|
{
|
||||||
|
coreInfo = LazyConfig.Instance.GetCoreInfo(ECoreType.sing_box);
|
||||||
|
string configStr = Utils.GetEmbedText(Global.TunSingboxFileName);
|
||||||
|
if (Utils.IsNullOrEmpty(configStr))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
//settings
|
||||||
|
if (_config.tunModeItem.mtu <= 0)
|
||||||
|
{
|
||||||
|
_config.tunModeItem.mtu = Convert.ToInt32(Global.TunMtus[0]);
|
||||||
|
}
|
||||||
|
if (Utils.IsNullOrEmpty(_config.tunModeItem.stack))
|
||||||
|
{
|
||||||
|
_config.tunModeItem.stack = Global.TunStacks[0];
|
||||||
|
}
|
||||||
|
configStr = configStr.Replace("$mtu$", $"{_config.tunModeItem.mtu}");
|
||||||
|
configStr = configStr.Replace("$strict_route$", $"{_config.tunModeItem.strictRoute.ToString().ToLower()}");
|
||||||
|
configStr = configStr.Replace("$stack$", $"{_config.tunModeItem.stack}");
|
||||||
|
|
||||||
|
|
||||||
|
//port
|
||||||
|
configStr = configStr.Replace("$socksPort$", $"{_socksPort}");
|
||||||
|
|
||||||
|
//exe
|
||||||
|
List<string> lstDnsExe = new List<string>();
|
||||||
|
List<string> lstDirectExe = new List<string>();
|
||||||
|
var coreInfos = LazyConfig.Instance.GetCoreInfos();
|
||||||
|
foreach (var it in coreInfos)
|
||||||
|
{
|
||||||
|
if (it.coreType == ECoreType.v2rayN)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
foreach (var it2 in it.coreExes)
|
||||||
|
{
|
||||||
|
if (!lstDnsExe.Contains(it2) && it.coreType != ECoreType.sing_box)
|
||||||
|
{
|
||||||
|
lstDnsExe.Add(it2);
|
||||||
|
lstDnsExe.Add($"{it2}.exe");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!lstDirectExe.Contains(it2))
|
||||||
|
{
|
||||||
|
lstDirectExe.Add(it2);
|
||||||
|
lstDirectExe.Add($"{it2}.exe");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
string strDns = string.Join("\",\"", lstDnsExe.ToArray());
|
||||||
|
configStr = configStr.Replace("$dnsProcessName$", $"\"{strDns}\"");
|
||||||
|
|
||||||
|
string strDirect = string.Join("\",\"", lstDirectExe.ToArray());
|
||||||
|
configStr = configStr.Replace("$directProcessName$", $"\"{strDirect}\"");
|
||||||
|
|
||||||
|
|
||||||
|
//ips
|
||||||
|
if (_config.tunModeItem.directIP != null && _config.tunModeItem.directIP.Count > 0)
|
||||||
|
{
|
||||||
|
var ips = new { outbound = "direct", ip_cidr = _config.tunModeItem.directIP };
|
||||||
|
configStr = configStr.Replace("$ruleDirectIPs$", "," + Utils.ToJson(ips));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
configStr = configStr.Replace("$ruleDirectIPs$", "");
|
||||||
|
}
|
||||||
|
//process
|
||||||
|
if (_config.tunModeItem.directProcess != null && _config.tunModeItem.directProcess.Count > 0)
|
||||||
|
{
|
||||||
|
var process = new { outbound = "direct", process_name = _config.tunModeItem.directProcess };
|
||||||
|
configStr = configStr.Replace("$ruleDirectProcess$", "," + Utils.ToJson(process));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
configStr = configStr.Replace("$ruleDirectProcess$", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
File.WriteAllText(Utils.GetConfigPath(_tunConfigName), configStr);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CoreStop()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_isRunning = false;
|
||||||
|
if (_process != null)
|
||||||
|
{
|
||||||
|
KillProcess(_process);
|
||||||
|
_process.Dispose();
|
||||||
|
_process = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Utils.SaveLog(ex.Message, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private string CoreFindexe()
|
||||||
|
{
|
||||||
|
string fileName = string.Empty;
|
||||||
|
foreach (string name in coreInfo.coreExes)
|
||||||
|
{
|
||||||
|
string vName = $"{name}.exe";
|
||||||
|
vName = Utils.GetBinPath(vName, coreInfo.coreType);
|
||||||
|
if (File.Exists(vName))
|
||||||
|
{
|
||||||
|
fileName = vName;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (Utils.IsNullOrEmpty(fileName))
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
return fileName;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CoreStart()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string fileName = CoreFindexe();
|
||||||
|
if (fileName == "")
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Process p = new Process
|
||||||
|
{
|
||||||
|
StartInfo = new ProcessStartInfo
|
||||||
|
{
|
||||||
|
FileName = fileName,
|
||||||
|
Arguments = $"run -c {Utils.GetConfigPath(_tunConfigName)}",
|
||||||
|
WorkingDirectory = Utils.GetConfigPath(),
|
||||||
|
UseShellExecute = _config.tunModeItem.showWindow,
|
||||||
|
CreateNoWindow = !_config.tunModeItem.showWindow,
|
||||||
|
Verb = "runas",
|
||||||
|
}
|
||||||
|
};
|
||||||
|
p.Start();
|
||||||
|
_process = p;
|
||||||
|
_isRunning = true;
|
||||||
|
if (p.WaitForExit(1000))
|
||||||
|
{
|
||||||
|
throw new Exception("start tun mode fail");
|
||||||
|
}
|
||||||
|
|
||||||
|
Global.processJob.AddProcess(p.Handle);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Utils.SaveLog(ex.Message, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void KillProcess(Process p)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
p.CloseMainWindow();
|
||||||
|
p.WaitForExit(100);
|
||||||
|
if (!p.HasExited)
|
||||||
|
{
|
||||||
|
p.Kill();
|
||||||
|
p.WaitForExit(100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Utils.SaveLog(ex.Message, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
496
v2rayN/v2rayN/Handler/UpdateHandle.cs
Normal file
496
v2rayN/v2rayN/Handler/UpdateHandle.cs
Normal file
@@ -0,0 +1,496 @@
|
|||||||
|
using Splat;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.IO;
|
||||||
|
using System.Text;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
using v2rayN.Base;
|
||||||
|
using v2rayN.Mode;
|
||||||
|
using v2rayN.Resx;
|
||||||
|
|
||||||
|
namespace v2rayN.Handler
|
||||||
|
{
|
||||||
|
class UpdateHandle
|
||||||
|
{
|
||||||
|
Action<bool, string> _updateFunc;
|
||||||
|
private Config _config;
|
||||||
|
|
||||||
|
public event EventHandler<ResultEventArgs> AbsoluteCompleted;
|
||||||
|
|
||||||
|
public class ResultEventArgs : EventArgs
|
||||||
|
{
|
||||||
|
public bool Success;
|
||||||
|
public string Msg;
|
||||||
|
|
||||||
|
public ResultEventArgs(bool success, string msg)
|
||||||
|
{
|
||||||
|
Success = success;
|
||||||
|
Msg = msg;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CheckUpdateGuiN(Config config, Action<bool, string> update, bool preRelease)
|
||||||
|
{
|
||||||
|
_config = config;
|
||||||
|
_updateFunc = update;
|
||||||
|
var url = string.Empty;
|
||||||
|
|
||||||
|
DownloadHandle downloadHandle = null;
|
||||||
|
if (downloadHandle == null)
|
||||||
|
{
|
||||||
|
downloadHandle = new DownloadHandle();
|
||||||
|
|
||||||
|
downloadHandle.UpdateCompleted += (sender2, args) =>
|
||||||
|
{
|
||||||
|
if (args.Success)
|
||||||
|
{
|
||||||
|
_updateFunc(false, ResUI.MsgDownloadV2rayCoreSuccessfully);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string fileName = Utils.GetTempPath(Utils.GetDownloadFileName(url));
|
||||||
|
fileName = Utils.UrlEncode(fileName);
|
||||||
|
Process process = new Process
|
||||||
|
{
|
||||||
|
StartInfo = new ProcessStartInfo
|
||||||
|
{
|
||||||
|
FileName = "v2rayUpgrade.exe",
|
||||||
|
Arguments = "\"" + fileName + "\"",
|
||||||
|
WorkingDirectory = Utils.StartupPath()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
process.Start();
|
||||||
|
if (process.Id > 0)
|
||||||
|
{
|
||||||
|
_updateFunc(true, "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_updateFunc(false, ex.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_updateFunc(false, args.Msg);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
downloadHandle.Error += (sender2, args) =>
|
||||||
|
{
|
||||||
|
_updateFunc(false, args.GetException().Message);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
AbsoluteCompleted += (sender2, args) =>
|
||||||
|
{
|
||||||
|
if (args.Success)
|
||||||
|
{
|
||||||
|
_updateFunc(false, string.Format(ResUI.MsgParsingSuccessfully, "v2rayN"));
|
||||||
|
|
||||||
|
url = args.Msg;
|
||||||
|
askToDownload(downloadHandle, url, true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Locator.Current.GetService<NoticeHandler>()?.Enqueue(args.Msg);
|
||||||
|
_updateFunc(false, args.Msg);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
_updateFunc(false, string.Format(ResUI.MsgStartUpdating, "v2rayN"));
|
||||||
|
CheckUpdateAsync(ECoreType.v2rayN, preRelease);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void CheckUpdateCore(ECoreType type, Config config, Action<bool, string> update, bool preRelease)
|
||||||
|
{
|
||||||
|
_config = config;
|
||||||
|
_updateFunc = update;
|
||||||
|
var url = string.Empty;
|
||||||
|
|
||||||
|
DownloadHandle downloadHandle = null;
|
||||||
|
if (downloadHandle == null)
|
||||||
|
{
|
||||||
|
downloadHandle = new DownloadHandle();
|
||||||
|
downloadHandle.UpdateCompleted += (sender2, args) =>
|
||||||
|
{
|
||||||
|
if (args.Success)
|
||||||
|
{
|
||||||
|
_updateFunc(false, ResUI.MsgDownloadV2rayCoreSuccessfully);
|
||||||
|
_updateFunc(false, ResUI.MsgUnpacking);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_updateFunc(true, url);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_updateFunc(false, ex.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_updateFunc(false, args.Msg);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
downloadHandle.Error += (sender2, args) =>
|
||||||
|
{
|
||||||
|
_updateFunc(true, args.GetException().Message);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
AbsoluteCompleted += (sender2, args) =>
|
||||||
|
{
|
||||||
|
if (args.Success)
|
||||||
|
{
|
||||||
|
_updateFunc(false, string.Format(ResUI.MsgParsingSuccessfully, "Core"));
|
||||||
|
url = args.Msg;
|
||||||
|
askToDownload(downloadHandle, url, true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Locator.Current.GetService<NoticeHandler>()?.Enqueue(args.Msg);
|
||||||
|
_updateFunc(false, args.Msg);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
_updateFunc(false, string.Format(ResUI.MsgStartUpdating, "Core"));
|
||||||
|
CheckUpdateAsync(type, preRelease);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void UpdateSubscriptionProcess(Config config, string subId, bool blProxy, Action<bool, string> update)
|
||||||
|
{
|
||||||
|
_config = config;
|
||||||
|
_updateFunc = update;
|
||||||
|
|
||||||
|
_updateFunc(false, ResUI.MsgUpdateSubscriptionStart);
|
||||||
|
var subItem = LazyConfig.Instance.SubItems();
|
||||||
|
|
||||||
|
if (subItem == null || subItem.Count <= 0)
|
||||||
|
{
|
||||||
|
_updateFunc(false, ResUI.MsgNoValidSubscription);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Task.Run(async () =>
|
||||||
|
{
|
||||||
|
//Turn off system proxy
|
||||||
|
bool bSysProxyType = false;
|
||||||
|
if (!blProxy && config.sysProxyType == ESysProxyType.ForcedChange)
|
||||||
|
{
|
||||||
|
bSysProxyType = true;
|
||||||
|
config.sysProxyType = ESysProxyType.ForcedClear;
|
||||||
|
SysProxyHandle.UpdateSysProxy(config, false);
|
||||||
|
Thread.Sleep(3000);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var item in subItem)
|
||||||
|
{
|
||||||
|
if (item.enabled == false)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!Utils.IsNullOrEmpty(subId) && item.id != subId)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
string id = item.id.TrimEx();
|
||||||
|
string url = item.url.TrimEx();
|
||||||
|
string userAgent = item.userAgent.TrimEx();
|
||||||
|
string hashCode = $"{item.remarks}->";
|
||||||
|
if (Utils.IsNullOrEmpty(id) || Utils.IsNullOrEmpty(url))
|
||||||
|
{
|
||||||
|
//_updateFunc(false, $"{hashCode}{ResUI.MsgNoValidSubscription}");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var downloadHandle = new DownloadHandle();
|
||||||
|
downloadHandle.Error += (sender2, args) =>
|
||||||
|
{
|
||||||
|
_updateFunc(false, $"{hashCode}{args.GetException().Message}");
|
||||||
|
};
|
||||||
|
|
||||||
|
//idn to idc
|
||||||
|
url = Utils.GetPunycode(url);
|
||||||
|
|
||||||
|
_updateFunc(false, $"{hashCode}{ResUI.MsgStartGettingSubscriptions}");
|
||||||
|
var result = await downloadHandle.DownloadStringAsync(url, blProxy, userAgent);
|
||||||
|
if (blProxy && Utils.IsNullOrEmpty(result))
|
||||||
|
{
|
||||||
|
result = await downloadHandle.DownloadStringAsync(url, false, userAgent);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Utils.IsNullOrEmpty(result))
|
||||||
|
{
|
||||||
|
_updateFunc(false, $"{hashCode}{ResUI.MsgSubscriptionDecodingFailed}");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_updateFunc(false, $"{hashCode}{ResUI.MsgGetSubscriptionSuccessfully}");
|
||||||
|
if (result.Length < 99)
|
||||||
|
{
|
||||||
|
_updateFunc(false, $"{hashCode}{result}");
|
||||||
|
}
|
||||||
|
|
||||||
|
int ret = ConfigHandler.AddBatchServers(ref config, result, id, true);
|
||||||
|
_updateFunc(false,
|
||||||
|
ret > 0
|
||||||
|
? $"{hashCode}{ResUI.MsgUpdateSubscriptionEnd}"
|
||||||
|
: $"{hashCode}{ResUI.MsgFailedImportSubscription}");
|
||||||
|
}
|
||||||
|
_updateFunc(false, "-------------------------------------------------------");
|
||||||
|
}
|
||||||
|
//restore system proxy
|
||||||
|
if (bSysProxyType)
|
||||||
|
{
|
||||||
|
config.sysProxyType = ESysProxyType.ForcedChange;
|
||||||
|
SysProxyHandle.UpdateSysProxy(config, false);
|
||||||
|
}
|
||||||
|
_updateFunc(true, $"{ResUI.MsgUpdateSubscriptionEnd}");
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void UpdateGeoFile(string geoName, Config config, Action<bool, string> update)
|
||||||
|
{
|
||||||
|
_config = config;
|
||||||
|
_updateFunc = update;
|
||||||
|
var url = string.Format(Global.geoUrl, geoName);
|
||||||
|
|
||||||
|
DownloadHandle downloadHandle = null;
|
||||||
|
if (downloadHandle == null)
|
||||||
|
{
|
||||||
|
downloadHandle = new DownloadHandle();
|
||||||
|
|
||||||
|
downloadHandle.UpdateCompleted += (sender2, args) =>
|
||||||
|
{
|
||||||
|
if (args.Success)
|
||||||
|
{
|
||||||
|
_updateFunc(false, string.Format(ResUI.MsgDownloadGeoFileSuccessfully, geoName));
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string fileName = Utils.GetTempPath(Utils.GetDownloadFileName(url));
|
||||||
|
if (File.Exists(fileName))
|
||||||
|
{
|
||||||
|
Global.coreTypes.ForEach(it =>
|
||||||
|
{
|
||||||
|
string targetPath = Utils.GetBinPath($"{geoName}.dat", (ECoreType)Enum.Parse(typeof(ECoreType), it));
|
||||||
|
File.Copy(fileName, targetPath, true);
|
||||||
|
});
|
||||||
|
//_updateFunc(true, "");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_updateFunc(false, ex.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_updateFunc(false, args.Msg);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
downloadHandle.Error += (sender2, args) =>
|
||||||
|
{
|
||||||
|
_updateFunc(false, args.GetException().Message);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
askToDownload(downloadHandle, url, false);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RunAvailabilityCheck(Action<bool, string> update)
|
||||||
|
{
|
||||||
|
Task.Run(() =>
|
||||||
|
{
|
||||||
|
var time = (new DownloadHandle()).RunAvailabilityCheck(null);
|
||||||
|
|
||||||
|
update(false, string.Format(ResUI.TestMeOutput, time));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
#region private
|
||||||
|
|
||||||
|
private async void CheckUpdateAsync(ECoreType type, bool preRelease)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var coreInfo = LazyConfig.Instance.GetCoreInfo(type);
|
||||||
|
string url = coreInfo.coreReleaseApiUrl;
|
||||||
|
|
||||||
|
var result = await (new DownloadHandle()).DownloadStringAsync(url, true, "");
|
||||||
|
if (!Utils.IsNullOrEmpty(result))
|
||||||
|
{
|
||||||
|
responseHandler(type, result, preRelease);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Utils.SaveLog("StatusCode error: " + url);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Utils.SaveLog(ex.Message, ex);
|
||||||
|
_updateFunc(false, ex.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取V2RayCore版本
|
||||||
|
/// </summary>
|
||||||
|
private string getCoreVersion(ECoreType type)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
|
||||||
|
var coreInfo = LazyConfig.Instance.GetCoreInfo(type);
|
||||||
|
string filePath = string.Empty;
|
||||||
|
foreach (string name in coreInfo.coreExes)
|
||||||
|
{
|
||||||
|
string vName = $"{name}.exe";
|
||||||
|
vName = Utils.GetBinPath(vName, coreInfo.coreType);
|
||||||
|
if (File.Exists(vName))
|
||||||
|
{
|
||||||
|
filePath = vName;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!File.Exists(filePath))
|
||||||
|
{
|
||||||
|
string msg = string.Format(ResUI.NotFoundCore, @"", "", "");
|
||||||
|
//ShowMsg(true, msg);
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
Process p = new Process();
|
||||||
|
p.StartInfo.FileName = filePath;
|
||||||
|
p.StartInfo.Arguments = coreInfo.versionArg;
|
||||||
|
p.StartInfo.WorkingDirectory = Utils.StartupPath();
|
||||||
|
p.StartInfo.UseShellExecute = false;
|
||||||
|
p.StartInfo.RedirectStandardOutput = true;
|
||||||
|
p.StartInfo.CreateNoWindow = true;
|
||||||
|
p.StartInfo.StandardOutputEncoding = Encoding.UTF8;
|
||||||
|
p.Start();
|
||||||
|
p.WaitForExit(5000);
|
||||||
|
string echo = p.StandardOutput.ReadToEnd();
|
||||||
|
string version = string.Empty;
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case ECoreType.v2fly:
|
||||||
|
case ECoreType.SagerNet:
|
||||||
|
case ECoreType.Xray:
|
||||||
|
case ECoreType.v2fly_v5:
|
||||||
|
version = Regex.Match(echo, $"{coreInfo.match} ([0-9.]+) \\(").Groups[1].Value;
|
||||||
|
break;
|
||||||
|
case ECoreType.clash:
|
||||||
|
case ECoreType.clash_meta:
|
||||||
|
version = Regex.Match(echo, $"v[0-9.]+").Groups[0].Value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return version;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Utils.SaveLog(ex.Message, ex);
|
||||||
|
_updateFunc(false, ex.Message);
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void responseHandler(ECoreType type, string gitHubReleaseApi, bool preRelease)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var gitHubReleases = Utils.FromJson<List<GitHubRelease>>(gitHubReleaseApi);
|
||||||
|
string version;
|
||||||
|
if (preRelease)
|
||||||
|
{
|
||||||
|
version = gitHubReleases!.First().TagName;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
version = gitHubReleases!.First(r => r.Prerelease == false).TagName;
|
||||||
|
}
|
||||||
|
var coreInfo = LazyConfig.Instance.GetCoreInfo(type);
|
||||||
|
|
||||||
|
string curVersion;
|
||||||
|
string message;
|
||||||
|
string url;
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case ECoreType.v2fly:
|
||||||
|
case ECoreType.SagerNet:
|
||||||
|
case ECoreType.Xray:
|
||||||
|
case ECoreType.v2fly_v5:
|
||||||
|
{
|
||||||
|
curVersion = "v" + getCoreVersion(type);
|
||||||
|
message = string.Format(ResUI.IsLatestCore, curVersion);
|
||||||
|
string osBit = Environment.Is64BitProcess ? "64" : "32";
|
||||||
|
url = string.Format(coreInfo.coreDownloadUrl64, version, osBit);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ECoreType.clash:
|
||||||
|
case ECoreType.clash_meta:
|
||||||
|
{
|
||||||
|
curVersion = getCoreVersion(type);
|
||||||
|
message = string.Format(ResUI.IsLatestCore, curVersion);
|
||||||
|
if (Environment.Is64BitProcess)
|
||||||
|
{
|
||||||
|
url = string.Format(coreInfo.coreDownloadUrl64, version);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
url = string.Format(coreInfo.coreDownloadUrl32, version);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ECoreType.v2rayN:
|
||||||
|
{
|
||||||
|
curVersion = FileVersionInfo.GetVersionInfo(Utils.GetExePath()).FileVersion.ToString();
|
||||||
|
message = string.Format(ResUI.IsLatestN, curVersion);
|
||||||
|
url = string.Format(coreInfo.coreDownloadUrl64, version);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
throw new ArgumentException("Type");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (curVersion == version)
|
||||||
|
{
|
||||||
|
AbsoluteCompleted?.Invoke(this, new ResultEventArgs(false, message));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
AbsoluteCompleted?.Invoke(this, new ResultEventArgs(true, url));
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Utils.SaveLog(ex.Message, ex);
|
||||||
|
_updateFunc(false, ex.Message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void askToDownload(DownloadHandle downloadHandle, string url, bool blAsk)
|
||||||
|
{
|
||||||
|
bool blDownload = false;
|
||||||
|
if (blAsk)
|
||||||
|
{
|
||||||
|
if (UI.ShowYesNo(string.Format(ResUI.DownloadYesNo, url)) == DialogResult.Yes)
|
||||||
|
{
|
||||||
|
blDownload = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
blDownload = true;
|
||||||
|
}
|
||||||
|
if (blDownload)
|
||||||
|
{
|
||||||
|
downloadHandle.DownloadFileAsync(url, true, 600);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,322 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.IO;
|
|
||||||
using System.Text;
|
|
||||||
using v2rayN.Mode;
|
|
||||||
|
|
||||||
namespace v2rayN.Handler
|
|
||||||
{
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 消息委托
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="notify">是否显示在托盘区</param>
|
|
||||||
/// <param name="msg">内容</param>
|
|
||||||
public delegate void ProcessDelegate(bool notify, string msg);
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// v2ray进程处理类
|
|
||||||
/// </summary>
|
|
||||||
class V2rayHandler
|
|
||||||
{
|
|
||||||
private static string v2rayConfigRes = Global.v2rayConfigFileName;
|
|
||||||
private List<string> lstV2ray;
|
|
||||||
public event ProcessDelegate ProcessEvent;
|
|
||||||
//private int processId = 0;
|
|
||||||
private Process _process;
|
|
||||||
|
|
||||||
public V2rayHandler()
|
|
||||||
{
|
|
||||||
lstV2ray = new List<string>
|
|
||||||
{
|
|
||||||
"wv2ray",
|
|
||||||
"v2ray"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 载入V2ray
|
|
||||||
/// </summary>
|
|
||||||
public void LoadV2ray(Config config)
|
|
||||||
{
|
|
||||||
if (Global.reloadV2ray)
|
|
||||||
{
|
|
||||||
string fileName = Utils.GetPath(v2rayConfigRes);
|
|
||||||
if (V2rayConfigHandler.GenerateClientConfig(config, fileName, false, out string msg) != 0)
|
|
||||||
{
|
|
||||||
ShowMsg(false, msg);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ShowMsg(true, msg);
|
|
||||||
V2rayRestart();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 新建进程,载入V2ray配置文件字符串
|
|
||||||
/// 返回新进程pid。
|
|
||||||
/// </summary>
|
|
||||||
public int LoadV2rayConfigString(Config config, List<int> _selecteds)
|
|
||||||
{
|
|
||||||
int pid = -1;
|
|
||||||
string configStr = V2rayConfigHandler.GenerateClientSpeedtestConfigString(config, _selecteds, out string msg);
|
|
||||||
if (configStr == "")
|
|
||||||
{
|
|
||||||
ShowMsg(false, msg);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ShowMsg(false, msg);
|
|
||||||
pid = V2rayStartNew(configStr);
|
|
||||||
//V2rayRestart();
|
|
||||||
// start with -config
|
|
||||||
}
|
|
||||||
return pid;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// V2ray重启
|
|
||||||
/// </summary>
|
|
||||||
private void V2rayRestart()
|
|
||||||
{
|
|
||||||
V2rayStop();
|
|
||||||
V2rayStart();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// V2ray停止
|
|
||||||
/// </summary>
|
|
||||||
public void V2rayStop()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (_process != null)
|
|
||||||
{
|
|
||||||
KillProcess(_process);
|
|
||||||
_process.Dispose();
|
|
||||||
_process = null;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
foreach (string vName in lstV2ray)
|
|
||||||
{
|
|
||||||
Process[] existing = Process.GetProcessesByName(vName);
|
|
||||||
foreach (Process p in existing)
|
|
||||||
{
|
|
||||||
string path = p.MainModule.FileName;
|
|
||||||
if (path == $"{Utils.GetPath(vName)}.exe")
|
|
||||||
{
|
|
||||||
KillProcess(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//bool blExist = true;
|
|
||||||
//if (processId > 0)
|
|
||||||
//{
|
|
||||||
// Process p1 = Process.GetProcessById(processId);
|
|
||||||
// if (p1 != null)
|
|
||||||
// {
|
|
||||||
// p1.Kill();
|
|
||||||
// blExist = false;
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
//if (blExist)
|
|
||||||
//{
|
|
||||||
// foreach (string vName in lstV2ray)
|
|
||||||
// {
|
|
||||||
// Process[] killPro = Process.GetProcessesByName(vName);
|
|
||||||
// foreach (Process p in killPro)
|
|
||||||
// {
|
|
||||||
// p.Kill();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Utils.SaveLog(ex.Message, ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// V2ray停止
|
|
||||||
/// </summary>
|
|
||||||
public void V2rayStopPid(int pid)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Process _p = Process.GetProcessById(pid);
|
|
||||||
KillProcess(_p);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Utils.SaveLog(ex.Message, ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private string V2rayFindexe() {
|
|
||||||
//查找v2ray文件是否存在
|
|
||||||
string fileName = string.Empty;
|
|
||||||
lstV2ray.Reverse();
|
|
||||||
foreach (string name in lstV2ray)
|
|
||||||
{
|
|
||||||
string vName = string.Format("{0}.exe", name);
|
|
||||||
vName = Utils.GetPath(vName);
|
|
||||||
if (File.Exists(vName))
|
|
||||||
{
|
|
||||||
fileName = vName;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (Utils.IsNullOrEmpty(fileName))
|
|
||||||
{
|
|
||||||
string msg = string.Format(UIRes.I18N("NotFoundCore"), @"https://github.com/v2ray/v2ray-core/releases");
|
|
||||||
ShowMsg(false, msg);
|
|
||||||
}
|
|
||||||
return fileName;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// V2ray启动
|
|
||||||
/// </summary>
|
|
||||||
private void V2rayStart()
|
|
||||||
{
|
|
||||||
ShowMsg(false, string.Format(UIRes.I18N("StartService"), DateTime.Now.ToString()));
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
string fileName = V2rayFindexe();
|
|
||||||
if (fileName == "") return;
|
|
||||||
|
|
||||||
Process p = new Process
|
|
||||||
{
|
|
||||||
StartInfo = new ProcessStartInfo
|
|
||||||
{
|
|
||||||
FileName = fileName,
|
|
||||||
WorkingDirectory = Utils.StartupPath(),
|
|
||||||
UseShellExecute = false,
|
|
||||||
RedirectStandardOutput = true,
|
|
||||||
RedirectStandardError = true,
|
|
||||||
CreateNoWindow = true,
|
|
||||||
StandardOutputEncoding = Encoding.UTF8
|
|
||||||
}
|
|
||||||
};
|
|
||||||
p.OutputDataReceived += new DataReceivedEventHandler((sender, e) =>
|
|
||||||
{
|
|
||||||
if (!String.IsNullOrEmpty(e.Data))
|
|
||||||
{
|
|
||||||
string msg = e.Data + Environment.NewLine;
|
|
||||||
ShowMsg(false, msg);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
p.Start();
|
|
||||||
p.PriorityClass = ProcessPriorityClass.High;
|
|
||||||
p.BeginOutputReadLine();
|
|
||||||
//processId = p.Id;
|
|
||||||
_process = p;
|
|
||||||
|
|
||||||
if (p.WaitForExit(1000))
|
|
||||||
{
|
|
||||||
throw new Exception(p.StandardError.ReadToEnd());
|
|
||||||
}
|
|
||||||
|
|
||||||
Global.processJob.AddProcess(p.Handle);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Utils.SaveLog(ex.Message, ex);
|
|
||||||
string msg = ex.Message;
|
|
||||||
ShowMsg(true, msg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// V2ray启动,新建进程,传入配置字符串
|
|
||||||
/// </summary>
|
|
||||||
private int V2rayStartNew(string configStr)
|
|
||||||
{
|
|
||||||
ShowMsg(false, string.Format(UIRes.I18N("StartService"), DateTime.Now.ToString()));
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
string fileName = V2rayFindexe();
|
|
||||||
if (fileName == "") return -1;
|
|
||||||
|
|
||||||
Process p = new Process
|
|
||||||
{
|
|
||||||
StartInfo = new ProcessStartInfo
|
|
||||||
{
|
|
||||||
FileName = fileName,
|
|
||||||
Arguments = "-config stdin:",
|
|
||||||
WorkingDirectory = Utils.StartupPath(),
|
|
||||||
UseShellExecute = false,
|
|
||||||
RedirectStandardInput = true,
|
|
||||||
RedirectStandardOutput = true,
|
|
||||||
RedirectStandardError = true,
|
|
||||||
CreateNoWindow = true,
|
|
||||||
StandardOutputEncoding = Encoding.UTF8
|
|
||||||
}
|
|
||||||
};
|
|
||||||
p.OutputDataReceived += new DataReceivedEventHandler((sender, e) =>
|
|
||||||
{
|
|
||||||
if (!String.IsNullOrEmpty(e.Data))
|
|
||||||
{
|
|
||||||
string msg = e.Data + Environment.NewLine;
|
|
||||||
ShowMsg(false, msg);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
p.Start();
|
|
||||||
p.BeginOutputReadLine();
|
|
||||||
|
|
||||||
p.StandardInput.Write(configStr);
|
|
||||||
p.StandardInput.Close();
|
|
||||||
|
|
||||||
if (p.WaitForExit(1000))
|
|
||||||
{
|
|
||||||
throw new Exception(p.StandardError.ReadToEnd());
|
|
||||||
}
|
|
||||||
|
|
||||||
Global.processJob.AddProcess(p.Handle);
|
|
||||||
return p.Id;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Utils.SaveLog(ex.Message, ex);
|
|
||||||
string msg = ex.Message;
|
|
||||||
ShowMsg(false, msg);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 消息委托
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="updateToTrayTooltip">是否更新托盘图标的工具提示</param>
|
|
||||||
/// <param name="msg">输出到日志框</param>
|
|
||||||
private void ShowMsg(bool updateToTrayTooltip, string msg)
|
|
||||||
{
|
|
||||||
ProcessEvent?.Invoke(updateToTrayTooltip, msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void KillProcess(Process p)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
p.CloseMainWindow();
|
|
||||||
p.WaitForExit(100);
|
|
||||||
if (!p.HasExited)
|
|
||||||
{
|
|
||||||
p.Kill();
|
|
||||||
p.WaitForExit(100);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Utils.SaveLog(ex.Message, ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,186 +0,0 @@
|
|||||||
using System;
|
|
||||||
using v2rayN.Mode;
|
|
||||||
|
|
||||||
namespace v2rayN.HttpProxyHandler
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 系统代理(http)模式
|
|
||||||
/// </summary>
|
|
||||||
public enum ListenerType
|
|
||||||
{
|
|
||||||
noHttpProxy = 0,
|
|
||||||
GlobalHttp = 1,
|
|
||||||
GlobalPac = 2,
|
|
||||||
HttpOpenAndClear = 3,
|
|
||||||
PacOpenAndClear = 4,
|
|
||||||
HttpOpenOnly = 5,
|
|
||||||
PacOpenOnly = 6
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// 系统代理(http)总处理
|
|
||||||
/// 启动privoxy提供http协议
|
|
||||||
/// 设置IE系统代理或者PAC模式
|
|
||||||
/// </summary>
|
|
||||||
class HttpProxyHandle
|
|
||||||
{
|
|
||||||
private static bool Update(Config config, bool forceDisable)
|
|
||||||
{
|
|
||||||
ListenerType type = config.listenerType;
|
|
||||||
|
|
||||||
if (forceDisable)
|
|
||||||
{
|
|
||||||
type = ListenerType.noHttpProxy;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (type != ListenerType.noHttpProxy)
|
|
||||||
{
|
|
||||||
int port = Global.httpPort;
|
|
||||||
if (port <= 0)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (type == ListenerType.GlobalHttp)
|
|
||||||
{
|
|
||||||
//PACServerHandle.Stop();
|
|
||||||
//ProxySetting.SetProxy($"{Global.Loopback}:{port}", Global.IEProxyExceptions, 2);
|
|
||||||
SysProxyHandle.SetIEProxy(true, true, $"{Global.Loopback}:{port}");
|
|
||||||
}
|
|
||||||
else if (type == ListenerType.GlobalPac)
|
|
||||||
{
|
|
||||||
string pacUrl = GetPacUrl();
|
|
||||||
//ProxySetting.SetProxy(pacUrl, "", 4);
|
|
||||||
SysProxyHandle.SetIEProxy(true, false, pacUrl);
|
|
||||||
//PACServerHandle.Stop();
|
|
||||||
PACServerHandle.Init(config);
|
|
||||||
}
|
|
||||||
else if (type == ListenerType.HttpOpenAndClear)
|
|
||||||
{
|
|
||||||
//PACServerHandle.Stop();
|
|
||||||
SysProxyHandle.ResetIEProxy();
|
|
||||||
}
|
|
||||||
else if (type == ListenerType.PacOpenAndClear)
|
|
||||||
{
|
|
||||||
string pacUrl = GetPacUrl();
|
|
||||||
SysProxyHandle.ResetIEProxy();
|
|
||||||
//PACServerHandle.Stop();
|
|
||||||
PACServerHandle.Init(config);
|
|
||||||
}
|
|
||||||
else if (type == ListenerType.HttpOpenOnly)
|
|
||||||
{
|
|
||||||
//PACServerHandle.Stop();
|
|
||||||
//SysProxyHandle.ResetIEProxy();
|
|
||||||
}
|
|
||||||
else if (type == ListenerType.PacOpenOnly)
|
|
||||||
{
|
|
||||||
string pacUrl = GetPacUrl();
|
|
||||||
//SysProxyHandle.ResetIEProxy();
|
|
||||||
//PACServerHandle.Stop();
|
|
||||||
PACServerHandle.Init(config);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SysProxyHandle.ResetIEProxy();
|
|
||||||
//PACServerHandle.Stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Utils.SaveLog(ex.Message, ex);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 启用系统代理(http)
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="config"></param>
|
|
||||||
private static void StartHttpAgent(Config config)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
int localPort = config.GetLocalPort(Global.InboundSocks);
|
|
||||||
if (localPort > 0)
|
|
||||||
{
|
|
||||||
PrivoxyHandler.Instance.Restart(localPort, config);
|
|
||||||
if (PrivoxyHandler.Instance.RunningPort > 0)
|
|
||||||
{
|
|
||||||
Global.sysAgent = true;
|
|
||||||
Global.socksPort = localPort;
|
|
||||||
Global.httpPort = PrivoxyHandler.Instance.RunningPort;
|
|
||||||
Global.pacPort = config.GetLocalPort("pac");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 关闭系统代理
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="config"></param>
|
|
||||||
public static void CloseHttpAgent(Config config)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (config.listenerType != ListenerType.HttpOpenOnly && config.listenerType != ListenerType.PacOpenOnly)
|
|
||||||
{
|
|
||||||
Update(config, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
PrivoxyHandler.Instance.Stop();
|
|
||||||
|
|
||||||
Global.sysAgent = false;
|
|
||||||
Global.socksPort = 0;
|
|
||||||
Global.httpPort = 0;
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 重启系统代理(http)
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="config"></param>
|
|
||||||
/// <param name="forced"></param>
|
|
||||||
public static void RestartHttpAgent(Config config, bool forced)
|
|
||||||
{
|
|
||||||
bool isRestart = false;
|
|
||||||
if (config.listenerType == ListenerType.noHttpProxy)
|
|
||||||
{
|
|
||||||
// 关闭http proxy时,直接返回
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
//强制重启或者socks端口变化
|
|
||||||
if (forced)
|
|
||||||
{
|
|
||||||
isRestart = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int localPort = config.GetLocalPort(Global.InboundSocks);
|
|
||||||
if (localPort != Global.socksPort)
|
|
||||||
{
|
|
||||||
isRestart = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (isRestart)
|
|
||||||
{
|
|
||||||
CloseHttpAgent(config);
|
|
||||||
StartHttpAgent(config);
|
|
||||||
}
|
|
||||||
Update(config, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static string GetPacUrl()
|
|
||||||
{
|
|
||||||
string pacUrl = $"http://{Global.Loopback}:{Global.pacPort}/pac/?t={ DateTime.Now.ToString("HHmmss")}";
|
|
||||||
return pacUrl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,209 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.IO;
|
|
||||||
using System.Text;
|
|
||||||
using v2rayN.Mode;
|
|
||||||
using v2rayN.Properties;
|
|
||||||
using v2rayN.Tool;
|
|
||||||
using v2rayN.Base;
|
|
||||||
|
|
||||||
namespace v2rayN.HttpProxyHandler
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 提供PAC功能支持
|
|
||||||
/// </summary>
|
|
||||||
class PACServerHandle
|
|
||||||
{
|
|
||||||
private static int pacPort = 0;
|
|
||||||
private static HttpWebServer server;
|
|
||||||
private static HttpWebServerB serverB;
|
|
||||||
private static Config _config;
|
|
||||||
|
|
||||||
public static bool IsRunning
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return (pacPort > 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void Init(Config config)
|
|
||||||
{
|
|
||||||
_config = config;
|
|
||||||
Global.pacPort = config.GetLocalPort("pac");
|
|
||||||
|
|
||||||
if (InitServer("*"))
|
|
||||||
{
|
|
||||||
pacPort = Global.pacPort;
|
|
||||||
}
|
|
||||||
//else if (InitServer(Global.Loopback))
|
|
||||||
//{
|
|
||||||
// pacPort = Global.pacPort;
|
|
||||||
//}
|
|
||||||
else if (InitServerB(Global.Loopback))
|
|
||||||
{
|
|
||||||
pacPort = Global.pacPort;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Utils.SaveLog("Webserver init failed ");
|
|
||||||
pacPort = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static bool InitServer(string address)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (pacPort != Global.pacPort)
|
|
||||||
{
|
|
||||||
if (server != null)
|
|
||||||
{
|
|
||||||
server.Stop();
|
|
||||||
server = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (server == null)
|
|
||||||
{
|
|
||||||
string prefixes = string.Format("http://{0}:{1}/pac/", address, Global.pacPort);
|
|
||||||
Utils.SaveLog("Webserver prefixes " + prefixes);
|
|
||||||
|
|
||||||
server = new HttpWebServer(SendResponse, prefixes);
|
|
||||||
server.Run();
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Utils.SaveLog("Webserver at " + address);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Utils.SaveLog("Webserver InitServer " + ex.Message);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static bool InitServerB(string address)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (pacPort != Global.pacPort)
|
|
||||||
{
|
|
||||||
if (serverB != null)
|
|
||||||
{
|
|
||||||
serverB.Stop();
|
|
||||||
serverB = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (serverB == null)
|
|
||||||
{
|
|
||||||
serverB = new HttpWebServerB(Global.pacPort, SendResponse);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Utils.SaveLog("WebserverB at " + address);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Utils.SaveLog("WebserverB InitServer " + ex.Message);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static string SendResponse(string address)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
string pac = GetPacList(address);
|
|
||||||
return pac;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Utils.SaveLog("Webserver SendResponse " + ex.Message);
|
|
||||||
return ex.Message;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void Stop()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (server != null)
|
|
||||||
{
|
|
||||||
server.Stop();
|
|
||||||
server = null;
|
|
||||||
}
|
|
||||||
if (serverB != null)
|
|
||||||
{
|
|
||||||
serverB.Stop();
|
|
||||||
serverB = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Utils.SaveLog("Webserver Stop " + ex.Message);
|
|
||||||
}
|
|
||||||
|
|
||||||
//try
|
|
||||||
//{
|
|
||||||
// if (httpWebServer == null)
|
|
||||||
// {
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// foreach (var key in httpWebServer.Keys)
|
|
||||||
// {
|
|
||||||
// Utils.SaveLog("Webserver Stop " + key.ToString());
|
|
||||||
// ((HttpWebServer)httpWebServer[key]).Stop();
|
|
||||||
// }
|
|
||||||
// httpWebServer.Clear();
|
|
||||||
//}
|
|
||||||
//catch (Exception ex)
|
|
||||||
//{
|
|
||||||
// Utils.SaveLog("Webserver Stop " + ex.Message);
|
|
||||||
//}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static string GetPacList(string address)
|
|
||||||
{
|
|
||||||
int port = Global.httpPort;
|
|
||||||
if (port <= 0)
|
|
||||||
{
|
|
||||||
return "No port";
|
|
||||||
}
|
|
||||||
try
|
|
||||||
{
|
|
||||||
List<string> lstProxy = new List<string>
|
|
||||||
{
|
|
||||||
string.Format("PROXY {0}:{1};", address, port)
|
|
||||||
};
|
|
||||||
string proxy = string.Join("", lstProxy.ToArray());
|
|
||||||
|
|
||||||
string strPacfile = Utils.GetPath(Global.pacFILE);
|
|
||||||
if (!File.Exists(strPacfile))
|
|
||||||
{
|
|
||||||
FileManager.UncompressFile(strPacfile, Resources.pac_txt);
|
|
||||||
}
|
|
||||||
string pac = File.ReadAllText(strPacfile, Encoding.UTF8);
|
|
||||||
pac = pac.Replace("__PROXY__", proxy);
|
|
||||||
|
|
||||||
if (_config.userPacRule.Count > 0)
|
|
||||||
{
|
|
||||||
string keyWords = "var rules = [";
|
|
||||||
if (pac.IndexOf(keyWords) >= 0)
|
|
||||||
{
|
|
||||||
string userPac = string.Join($"\",{Environment.NewLine}\"", _config.userPacRule.ToArray());
|
|
||||||
userPac = string.Format("\"{0}\",", userPac);
|
|
||||||
pac = pac.Replace(keyWords, keyWords + userPac);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return pac;
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
}
|
|
||||||
return "No pac content";
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,194 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.IO;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Windows.Forms;
|
|
||||||
using v2rayN.Mode;
|
|
||||||
using v2rayN.Properties;
|
|
||||||
using v2rayN.Tool;
|
|
||||||
|
|
||||||
namespace v2rayN.HttpProxyHandler
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Privoxy处理类,提供http协议代理
|
|
||||||
/// </summary>
|
|
||||||
class PrivoxyHandler
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 单例
|
|
||||||
/// </summary>
|
|
||||||
private static PrivoxyHandler instance;
|
|
||||||
|
|
||||||
private static int _uid;
|
|
||||||
private static string _uniqueConfigFile;
|
|
||||||
private Process _process;
|
|
||||||
private static string _privoxyName = "v2ray_privoxy";
|
|
||||||
|
|
||||||
static PrivoxyHandler()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
_uid = Application.StartupPath.GetHashCode();
|
|
||||||
_uniqueConfigFile = string.Format("privoxy_{0}.conf", _uid);
|
|
||||||
|
|
||||||
FileManager.UncompressFile(Utils.GetTempPath($"{_privoxyName}.exe"), Resources.privoxy_exe);
|
|
||||||
}
|
|
||||||
catch (IOException ex)
|
|
||||||
{
|
|
||||||
Utils.SaveLog(ex.Message, ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 单例
|
|
||||||
/// </summary>
|
|
||||||
public static PrivoxyHandler Instance
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (instance == null)
|
|
||||||
{
|
|
||||||
instance = new PrivoxyHandler();
|
|
||||||
}
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public int RunningPort
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Restart(int localPort, Config config)
|
|
||||||
{
|
|
||||||
Stop();
|
|
||||||
Start(localPort, config);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public void Start(int localPort, Config config)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (_process == null)
|
|
||||||
{
|
|
||||||
|
|
||||||
string privoxyConfig = Resources.privoxy_conf;
|
|
||||||
RunningPort = config.GetLocalPort(Global.InboundHttp);
|
|
||||||
privoxyConfig = privoxyConfig.Replace("__SOCKS_PORT__", localPort.ToString());
|
|
||||||
privoxyConfig = privoxyConfig.Replace("__PRIVOXY_BIND_PORT__", RunningPort.ToString());
|
|
||||||
if (config.allowLANConn)
|
|
||||||
{
|
|
||||||
privoxyConfig = privoxyConfig.Replace("__PRIVOXY_BIND_IP__", "0.0.0.0");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
privoxyConfig = privoxyConfig.Replace("__PRIVOXY_BIND_IP__", Global.Loopback);
|
|
||||||
}
|
|
||||||
FileManager.ByteArrayToFile(Utils.GetTempPath(_uniqueConfigFile), Encoding.UTF8.GetBytes(privoxyConfig));
|
|
||||||
|
|
||||||
_process = new Process
|
|
||||||
{
|
|
||||||
// Configure the process using the StartInfo properties.
|
|
||||||
StartInfo =
|
|
||||||
{
|
|
||||||
FileName = $"{_privoxyName}.exe",
|
|
||||||
Arguments = _uniqueConfigFile,
|
|
||||||
WorkingDirectory = Utils.GetTempPath(),
|
|
||||||
WindowStyle = ProcessWindowStyle.Hidden,
|
|
||||||
UseShellExecute = true,
|
|
||||||
CreateNoWindow = true
|
|
||||||
}
|
|
||||||
};
|
|
||||||
_process.Start();
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Add this process to job obj associated with this ss process, so that
|
|
||||||
* when ss exit unexpectedly, this process will be forced killed by system.
|
|
||||||
*/
|
|
||||||
|
|
||||||
Global.processJob.AddProcess(_process.Handle);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
RunningPort = 0;
|
|
||||||
Utils.SaveLog(ex.Message, ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Stop()
|
|
||||||
{
|
|
||||||
if (_process != null)
|
|
||||||
{
|
|
||||||
KillProcess(_process);
|
|
||||||
_process.Dispose();
|
|
||||||
_process = null;
|
|
||||||
RunningPort = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Process[] existingPrivoxy = Process.GetProcessesByName(_privoxyName);
|
|
||||||
foreach (Process p in existingPrivoxy.Where(IsChildProcess))
|
|
||||||
{
|
|
||||||
KillProcess(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void KillProcess(Process p)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
p.CloseMainWindow();
|
|
||||||
p.WaitForExit(100);
|
|
||||||
if (!p.HasExited)
|
|
||||||
{
|
|
||||||
p.Kill();
|
|
||||||
p.WaitForExit(100);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Utils.SaveLog(ex.Message, ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We won't like to kill other ss instances' v2ray_privoxy.exe.
|
|
||||||
* This function will check whether the given process is created
|
|
||||||
* by this process by checking the module path or command line.
|
|
||||||
*
|
|
||||||
* Since it's required to put ss in different dirs to run muti instances,
|
|
||||||
* different instance will create their unique "privoxy_UID.conf" where
|
|
||||||
* UID is hash of ss's location.
|
|
||||||
*/
|
|
||||||
|
|
||||||
private static bool IsChildProcess(Process process)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Under PortableMode, we could identify it by the path of v2ray_privoxy.exe.
|
|
||||||
*/
|
|
||||||
string path = process.MainModule.FileName;
|
|
||||||
|
|
||||||
return Utils.GetTempPath($"{_privoxyName}.exe").Equals(path);
|
|
||||||
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Utils.SaveLog(ex.Message, ex);
|
|
||||||
/*
|
|
||||||
* Sometimes Process.GetProcessesByName will return some processes that
|
|
||||||
* are already dead, and that will cause exceptions here.
|
|
||||||
* We could simply ignore those exceptions.
|
|
||||||
*/
|
|
||||||
//Logging.LogUsefulException(ex);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
14
v2rayN/v2rayN/Mode/ComboItem.cs
Normal file
14
v2rayN/v2rayN/Mode/ComboItem.cs
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
namespace v2rayN.Mode
|
||||||
|
{
|
||||||
|
public class ComboItem
|
||||||
|
{
|
||||||
|
public string ID
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
public string Text
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,10 +1,4 @@
|
|||||||
using System;
|
namespace v2rayN.Mode
|
||||||
using System.Collections.Generic;
|
|
||||||
using v2rayN.Base;
|
|
||||||
using v2rayN.HttpProxyHandler;
|
|
||||||
|
|
||||||
|
|
||||||
namespace v2rayN.Mode
|
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 本软件配置文件实体类
|
/// 本软件配置文件实体类
|
||||||
@@ -12,13 +6,7 @@ namespace v2rayN.Mode
|
|||||||
[Serializable]
|
[Serializable]
|
||||||
public class Config
|
public class Config
|
||||||
{
|
{
|
||||||
/// <summary>
|
#region property
|
||||||
/// 本地监听
|
|
||||||
/// </summary>
|
|
||||||
public List<InItem> inbound
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 允许日志
|
/// 允许日志
|
||||||
@@ -36,18 +24,7 @@ namespace v2rayN.Mode
|
|||||||
get; set;
|
get; set;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
public string indexId
|
||||||
/// 活动配置序号
|
|
||||||
/// </summary>
|
|
||||||
public int index
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// vmess服务器信息
|
|
||||||
/// </summary>
|
|
||||||
public List<VmessItem> vmess
|
|
||||||
{
|
{
|
||||||
get; set;
|
get; set;
|
||||||
}
|
}
|
||||||
@@ -61,87 +38,9 @@ namespace v2rayN.Mode
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 域名解析策略
|
///
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string domainStrategy
|
public ESysProxyType sysProxyType
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 路由模式
|
|
||||||
/// </summary>
|
|
||||||
public string routingMode
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 用户自定义需代理的网址或ip
|
|
||||||
/// </summary>
|
|
||||||
public List<string> useragent
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 用户自定义直连的网址或ip
|
|
||||||
/// </summary>
|
|
||||||
public List<string> userdirect
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 用户自定义阻止的网址或ip
|
|
||||||
/// </summary>
|
|
||||||
public List<string> userblock
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// KcpItem
|
|
||||||
/// </summary>
|
|
||||||
public KcpItem kcpItem
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 监听状态
|
|
||||||
/// </summary>
|
|
||||||
public ListenerType listenerType
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 自定义服务器下载测速url
|
|
||||||
/// </summary>
|
|
||||||
public string speedTestUrl
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// 自定义“服务器真连接延迟”测试url
|
|
||||||
/// </summary>
|
|
||||||
public string speedPingTestUrl
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// 自定义GFWList url
|
|
||||||
/// </summary>
|
|
||||||
public string urlGFWList
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 允许来自局域网的连接
|
|
||||||
/// </summary>
|
|
||||||
public bool allowLANConn
|
|
||||||
{
|
{
|
||||||
get; set;
|
get; set;
|
||||||
}
|
}
|
||||||
@@ -170,7 +69,6 @@ namespace v2rayN.Mode
|
|||||||
get; set;
|
get; set;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 自定义远程DNS
|
/// 自定义远程DNS
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -179,541 +77,82 @@ namespace v2rayN.Mode
|
|||||||
get; set;
|
get; set;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Outbound Freedom domainStrategy
|
||||||
|
/// </summary>
|
||||||
|
public string domainStrategy4Freedom
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 是否允许不安全连接
|
/// 是否允许不安全连接
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string defaultAllowInsecure
|
public bool defAllowInsecure
|
||||||
{
|
{
|
||||||
get; set;
|
get; set;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 订阅
|
/// 域名解析策略
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public List<SubItem> subItem
|
public string domainStrategy
|
||||||
{
|
{
|
||||||
get; set;
|
get; set;
|
||||||
}
|
}
|
||||||
|
public string domainMatcher
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
public string routingIndexId { get; set; }
|
||||||
|
public bool enableRoutingAdvanced
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool ignoreGeoUpdateCore
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// UI
|
/// systemProxyExceptions
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public UIItem uiItem
|
public string systemProxyExceptions
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
public string systemProxyAdvancedProtocol { get; set; }
|
||||||
|
|
||||||
|
public int autoUpdateInterval { get; set; } = 0;
|
||||||
|
|
||||||
|
public int autoUpdateSubInterval { get; set; } = 0;
|
||||||
|
|
||||||
|
public bool checkPreReleaseUpdate { get; set; } = false;
|
||||||
|
|
||||||
|
public bool enableSecurityProtocolTls13
|
||||||
{
|
{
|
||||||
get; set;
|
get; set;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<string> userPacRule
|
public int trayMenuServersLimit { get; set; }
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
#region 函数
|
public bool autoHideStartup { get; set; }
|
||||||
|
|
||||||
public string address()
|
#endregion
|
||||||
{
|
|
||||||
if (index < 0)
|
|
||||||
{
|
|
||||||
return string.Empty;
|
|
||||||
}
|
|
||||||
return vmess[index].address.TrimEx();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int port()
|
#region other entities
|
||||||
{
|
|
||||||
if (index < 0)
|
|
||||||
{
|
|
||||||
return 10808;
|
|
||||||
}
|
|
||||||
return vmess[index].port;
|
|
||||||
}
|
|
||||||
|
|
||||||
public string id()
|
public TunModeItem tunModeItem { get; set; }
|
||||||
{
|
public KcpItem kcpItem { get; set; }
|
||||||
if (index < 0)
|
public GrpcItem grpcItem { get; set; }
|
||||||
{
|
public UIItem uiItem { get; set; }
|
||||||
return string.Empty;
|
public ConstItem constItem { get; set; }
|
||||||
}
|
public List<InItem> inbound { get; set; }
|
||||||
return vmess[index].id.TrimEx();
|
public List<KeyEventItem> globalHotkeys { get; set; }
|
||||||
}
|
public List<CoreTypeItem> coreTypeItem { get; set; }
|
||||||
|
|
||||||
public int alterId()
|
|
||||||
{
|
|
||||||
if (index < 0)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return vmess[index].alterId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public string security()
|
|
||||||
{
|
|
||||||
if (index < 0)
|
|
||||||
{
|
|
||||||
return string.Empty;
|
|
||||||
}
|
|
||||||
return vmess[index].security.TrimEx();
|
|
||||||
}
|
|
||||||
|
|
||||||
public string remarks()
|
|
||||||
{
|
|
||||||
if (index < 0)
|
|
||||||
{
|
|
||||||
return string.Empty;
|
|
||||||
}
|
|
||||||
return vmess[index].remarks.TrimEx();
|
|
||||||
}
|
|
||||||
public string network()
|
|
||||||
{
|
|
||||||
if (index < 0 || Utils.IsNullOrEmpty(vmess[index].network))
|
|
||||||
{
|
|
||||||
return Global.DefaultNetwork;
|
|
||||||
}
|
|
||||||
return vmess[index].network.TrimEx();
|
|
||||||
}
|
|
||||||
public string headerType()
|
|
||||||
{
|
|
||||||
if (index < 0 || Utils.IsNullOrEmpty(vmess[index].headerType))
|
|
||||||
{
|
|
||||||
return Global.None;
|
|
||||||
}
|
|
||||||
return vmess[index].headerType.Replace(" ", "").TrimEx();
|
|
||||||
}
|
|
||||||
public string requestHost()
|
|
||||||
{
|
|
||||||
if (index < 0 || Utils.IsNullOrEmpty(vmess[index].requestHost))
|
|
||||||
{
|
|
||||||
return string.Empty;
|
|
||||||
}
|
|
||||||
return vmess[index].requestHost.Replace(" ", "").TrimEx();
|
|
||||||
}
|
|
||||||
public string path()
|
|
||||||
{
|
|
||||||
if (index < 0 || Utils.IsNullOrEmpty(vmess[index].path))
|
|
||||||
{
|
|
||||||
return string.Empty;
|
|
||||||
}
|
|
||||||
return vmess[index].path.Replace(" ", "").TrimEx();
|
|
||||||
}
|
|
||||||
public string streamSecurity()
|
|
||||||
{
|
|
||||||
if (index < 0 || Utils.IsNullOrEmpty(vmess[index].streamSecurity))
|
|
||||||
{
|
|
||||||
return string.Empty;
|
|
||||||
}
|
|
||||||
return vmess[index].streamSecurity;
|
|
||||||
}
|
|
||||||
public bool allowInsecure()
|
|
||||||
{
|
|
||||||
if (index < 0 || Utils.IsNullOrEmpty(vmess[index].allowInsecure))
|
|
||||||
{
|
|
||||||
return Convert.ToBoolean(defaultAllowInsecure);
|
|
||||||
}
|
|
||||||
return Convert.ToBoolean(vmess[index].allowInsecure);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int GetLocalPort(string protocol)
|
|
||||||
{
|
|
||||||
if (protocol == Global.InboundHttp)
|
|
||||||
{
|
|
||||||
return GetLocalPort(Global.InboundSocks) + 1;
|
|
||||||
}
|
|
||||||
else if (protocol == "pac")
|
|
||||||
{
|
|
||||||
return GetLocalPort(Global.InboundSocks) + 2;
|
|
||||||
}
|
|
||||||
else if (protocol == "speedtest")
|
|
||||||
{
|
|
||||||
return GetLocalPort(Global.InboundSocks) + 103;
|
|
||||||
}
|
|
||||||
|
|
||||||
int localPort = 0;
|
|
||||||
foreach (InItem inItem in inbound)
|
|
||||||
{
|
|
||||||
if (inItem.protocol.Equals(protocol))
|
|
||||||
{
|
|
||||||
localPort = inItem.localPort;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return localPort;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int configType()
|
|
||||||
{
|
|
||||||
if (index < 0)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return vmess[index].configType;
|
|
||||||
}
|
|
||||||
|
|
||||||
public string getSummary()
|
|
||||||
{
|
|
||||||
if (index < 0)
|
|
||||||
{
|
|
||||||
return string.Empty;
|
|
||||||
}
|
|
||||||
return vmess[index].getSummary();
|
|
||||||
}
|
|
||||||
|
|
||||||
public string getItemId()
|
|
||||||
{
|
|
||||||
if (index < 0)
|
|
||||||
{
|
|
||||||
return string.Empty;
|
|
||||||
}
|
|
||||||
|
|
||||||
return vmess[index].getItemId();
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Serializable]
|
|
||||||
public class VmessItem
|
|
||||||
{
|
|
||||||
public VmessItem()
|
|
||||||
{
|
|
||||||
configVersion = 1;
|
|
||||||
address = string.Empty;
|
|
||||||
port = 0;
|
|
||||||
id = string.Empty;
|
|
||||||
alterId = 0;
|
|
||||||
security = string.Empty;
|
|
||||||
network = string.Empty;
|
|
||||||
remarks = string.Empty;
|
|
||||||
headerType = string.Empty;
|
|
||||||
requestHost = string.Empty;
|
|
||||||
path = string.Empty;
|
|
||||||
streamSecurity = string.Empty;
|
|
||||||
allowInsecure = string.Empty;
|
|
||||||
configType = (int)EConfigType.Vmess;
|
|
||||||
testResult = string.Empty;
|
|
||||||
subid = string.Empty;
|
|
||||||
}
|
|
||||||
|
|
||||||
public string getSummary()
|
|
||||||
{
|
|
||||||
string summary = string.Format("{0}-", ((EConfigType)configType).ToString());
|
|
||||||
string[] arrAddr = address.Split('.');
|
|
||||||
string addr;
|
|
||||||
if (arrAddr.Length > 2)
|
|
||||||
{
|
|
||||||
addr = $"{arrAddr[0]}***{arrAddr[arrAddr.Length - 1]}";
|
|
||||||
}
|
|
||||||
else if (arrAddr.Length > 1)
|
|
||||||
{
|
|
||||||
addr = $"***{arrAddr[arrAddr.Length - 1]}";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
addr = address;
|
|
||||||
}
|
|
||||||
if (configType == (int)EConfigType.Vmess)
|
|
||||||
{
|
|
||||||
summary += string.Format("{0}({1}:{2})", remarks, addr, port);
|
|
||||||
}
|
|
||||||
else if (configType == (int)EConfigType.Shadowsocks)
|
|
||||||
{
|
|
||||||
summary += string.Format("{0}({1}:{2})", remarks, addr, port);
|
|
||||||
}
|
|
||||||
else if (configType == (int)EConfigType.Socks)
|
|
||||||
{
|
|
||||||
summary += string.Format("{0}({1}:{2})", remarks, addr, port);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
summary += string.Format("{0}", remarks);
|
|
||||||
}
|
|
||||||
return summary;
|
|
||||||
}
|
|
||||||
public string getSubRemarks(Config config)
|
|
||||||
{
|
|
||||||
string subRemarks = string.Empty;
|
|
||||||
if (Utils.IsNullOrEmpty(subid))
|
|
||||||
{
|
|
||||||
return subRemarks;
|
|
||||||
}
|
|
||||||
foreach (SubItem sub in config.subItem)
|
|
||||||
{
|
|
||||||
if (sub.id.EndsWith(subid))
|
|
||||||
{
|
|
||||||
return sub.remarks;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (subid.Length <= 4)
|
|
||||||
{
|
|
||||||
return subid;
|
|
||||||
}
|
|
||||||
return subid.Substring(0, 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
public string getItemId()
|
|
||||||
{
|
|
||||||
string itemId = $"{address}{port}{requestHost}{path}";
|
|
||||||
itemId = Utils.Base64Encode(itemId);
|
|
||||||
return itemId;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 版本(现在=2)
|
|
||||||
/// </summary>
|
|
||||||
public int configVersion
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 远程服务器地址
|
|
||||||
/// </summary>
|
|
||||||
public string address
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// 远程服务器端口
|
|
||||||
/// </summary>
|
|
||||||
public int port
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// 远程服务器ID
|
|
||||||
/// </summary>
|
|
||||||
public string id
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// 远程服务器额外ID
|
|
||||||
/// </summary>
|
|
||||||
public int alterId
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// 本地安全策略
|
|
||||||
/// </summary>
|
|
||||||
public string security
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// tcp,kcp,ws,h2,quic
|
|
||||||
/// </summary>
|
|
||||||
public string network
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
/// 备注或别名
|
|
||||||
/// </summary>
|
|
||||||
public string remarks
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 伪装类型
|
|
||||||
/// </summary>
|
|
||||||
public string headerType
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 伪装的域名
|
|
||||||
/// </summary>
|
|
||||||
public string requestHost
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// ws h2 path
|
|
||||||
/// </summary>
|
|
||||||
public string path
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 底层传输安全
|
|
||||||
/// </summary>
|
|
||||||
public string streamSecurity
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 是否允许不安全连接(用于客户端)
|
|
||||||
/// </summary>
|
|
||||||
public string allowInsecure
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// config type(1=normal,2=custom)
|
|
||||||
/// </summary>
|
|
||||||
public int configType
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public string testResult
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// SubItem id
|
|
||||||
/// </summary>
|
|
||||||
public string subid
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[Serializable]
|
|
||||||
public class InItem
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 本地监听端口
|
|
||||||
/// </summary>
|
|
||||||
public int localPort
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 协议,默认为socks
|
|
||||||
/// </summary>
|
|
||||||
public string protocol
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 允许udp
|
|
||||||
/// </summary>
|
|
||||||
public bool udpEnabled
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 开启流量探测
|
|
||||||
/// </summary>
|
|
||||||
public bool sniffingEnabled { get; set; } = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
[Serializable]
|
|
||||||
public class KcpItem
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public int mtu
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public int tti
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public int uplinkCapacity
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public int downlinkCapacity
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public bool congestion
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public int readBufferSize
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public int writeBufferSize
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
[Serializable]
|
|
||||||
public class SubItem
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
///
|
|
||||||
/// </summary>
|
|
||||||
public string id
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 备注
|
|
||||||
/// </summary>
|
|
||||||
public string remarks
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// url
|
|
||||||
/// </summary>
|
|
||||||
public string url
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// enable
|
|
||||||
/// </summary>
|
|
||||||
public bool enabled { get; set; } = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
[Serializable]
|
|
||||||
public class UIItem
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
public System.Drawing.Size mainSize
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Dictionary<string, int> mainLvColWidth
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
109
v2rayN/v2rayN/Mode/ConfigItems.cs
Normal file
109
v2rayN/v2rayN/Mode/ConfigItems.cs
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace v2rayN.Mode
|
||||||
|
{
|
||||||
|
[Serializable]
|
||||||
|
public class InItem
|
||||||
|
{
|
||||||
|
public int localPort { get; set; }
|
||||||
|
|
||||||
|
public string protocol { get; set; }
|
||||||
|
|
||||||
|
public bool udpEnabled { get; set; }
|
||||||
|
|
||||||
|
public bool sniffingEnabled { get; set; } = true;
|
||||||
|
public bool routeOnly { get; set; }
|
||||||
|
|
||||||
|
public bool allowLANConn { get; set; }
|
||||||
|
|
||||||
|
public bool newPort4LAN { get; set; }
|
||||||
|
|
||||||
|
public string user { get; set; }
|
||||||
|
|
||||||
|
public string pass { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
public class KcpItem
|
||||||
|
{
|
||||||
|
public int mtu { get; set; }
|
||||||
|
|
||||||
|
public int tti { get; set; }
|
||||||
|
|
||||||
|
public int uplinkCapacity { get; set; }
|
||||||
|
|
||||||
|
public int downlinkCapacity { get; set; }
|
||||||
|
|
||||||
|
public bool congestion { get; set; }
|
||||||
|
|
||||||
|
public int readBufferSize { get; set; }
|
||||||
|
|
||||||
|
public int writeBufferSize { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
public class GrpcItem
|
||||||
|
{
|
||||||
|
public int idle_timeout { get; set; }
|
||||||
|
public int health_check_timeout { get; set; }
|
||||||
|
public bool permit_without_stream { get; set; }
|
||||||
|
public int initial_windows_size { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
public class UIItem
|
||||||
|
{
|
||||||
|
public bool enableAutoAdjustMainLvColWidth { get; set; }
|
||||||
|
public double mainWidth { get; set; }
|
||||||
|
public double mainHeight { get; set; }
|
||||||
|
public bool colorModeDark { get; set; }
|
||||||
|
public string? colorPrimaryName { get; set; }
|
||||||
|
public string currentLanguage { get; set; }
|
||||||
|
public Dictionary<string, int> mainLvColWidth { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
public class ConstItem
|
||||||
|
{
|
||||||
|
public string speedTestUrl { get; set; }
|
||||||
|
public string speedPingTestUrl { get; set; }
|
||||||
|
public string defIEProxyExceptions { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
public class KeyEventItem
|
||||||
|
{
|
||||||
|
public EGlobalHotkey eGlobalHotkey { get; set; }
|
||||||
|
|
||||||
|
public bool Alt { get; set; }
|
||||||
|
|
||||||
|
public bool Control { get; set; }
|
||||||
|
|
||||||
|
public bool Shift { get; set; }
|
||||||
|
|
||||||
|
public Keys? KeyCode { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
public class CoreTypeItem
|
||||||
|
{
|
||||||
|
public EConfigType configType { get; set; }
|
||||||
|
|
||||||
|
public ECoreType coreType { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
public class TunModeItem
|
||||||
|
{
|
||||||
|
public bool enableTun { get; set; }
|
||||||
|
public bool showWindow { get; set; }
|
||||||
|
public bool strictRoute { get; set; }
|
||||||
|
public string stack { get; set; }
|
||||||
|
public int mtu { get; set; }
|
||||||
|
public List<string> directIP { get; set; }
|
||||||
|
public List<string> directProcess { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
426
v2rayN/v2rayN/Mode/ConfigOld.cs
Normal file
426
v2rayN/v2rayN/Mode/ConfigOld.cs
Normal file
@@ -0,0 +1,426 @@
|
|||||||
|
namespace v2rayN.Mode
|
||||||
|
{
|
||||||
|
[Serializable]
|
||||||
|
public class ConfigOld
|
||||||
|
{
|
||||||
|
#region property
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 允许日志
|
||||||
|
/// </summary>
|
||||||
|
public bool logEnabled
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 日志等级
|
||||||
|
/// </summary>
|
||||||
|
public string loglevel
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string indexId
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 允许Mux多路复用
|
||||||
|
/// </summary>
|
||||||
|
public bool muxEnabled
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
public ESysProxyType sysProxyType
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 启用实时网速和流量统计
|
||||||
|
/// </summary>
|
||||||
|
public bool enableStatistics
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 去重时优先保留较旧(顶部)节点
|
||||||
|
/// </summary>
|
||||||
|
public bool keepOlderDedupl
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 视图刷新率
|
||||||
|
/// </summary>
|
||||||
|
public int statisticsFreshRate
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 自定义远程DNS
|
||||||
|
/// </summary>
|
||||||
|
public string remoteDNS
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Outbound Freedom domainStrategy
|
||||||
|
/// </summary>
|
||||||
|
public string domainStrategy4Freedom
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否允许不安全连接
|
||||||
|
/// </summary>
|
||||||
|
public bool defAllowInsecure
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 域名解析策略
|
||||||
|
/// </summary>
|
||||||
|
public string domainStrategy
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
public string domainMatcher
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
public int routingIndex
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
public bool enableRoutingAdvanced
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool ignoreGeoUpdateCore
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// systemProxyExceptions
|
||||||
|
/// </summary>
|
||||||
|
public string systemProxyExceptions
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
public string systemProxyAdvancedProtocol { get; set; }
|
||||||
|
|
||||||
|
public int autoUpdateInterval { get; set; } = 0;
|
||||||
|
|
||||||
|
public int autoUpdateSubInterval { get; set; } = 0;
|
||||||
|
|
||||||
|
public bool checkPreReleaseUpdate { get; set; } = false;
|
||||||
|
|
||||||
|
public bool enableSecurityProtocolTls13
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int trayMenuServersLimit { get; set; }
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region other entities
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 本地监听
|
||||||
|
/// </summary>
|
||||||
|
public List<InItem> inbound
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// vmess服务器信息
|
||||||
|
/// </summary>
|
||||||
|
public List<VmessItem> vmess
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// KcpItem
|
||||||
|
/// </summary>
|
||||||
|
public KcpItem kcpItem
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 订阅
|
||||||
|
/// </summary>
|
||||||
|
public List<SubItem> subItem
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// UI
|
||||||
|
/// </summary>
|
||||||
|
public UIItem uiItem
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
public List<RoutingItemOld> routings
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ConstItem constItem
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<KeyEventItem> globalHotkeys
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public List<CoreTypeItem> coreTypeItem
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
public class VmessItem
|
||||||
|
{
|
||||||
|
public VmessItem()
|
||||||
|
{
|
||||||
|
indexId = string.Empty;
|
||||||
|
configType = EConfigType.VMess;
|
||||||
|
configVersion = 2;
|
||||||
|
sort = 0;
|
||||||
|
address = string.Empty;
|
||||||
|
port = 0;
|
||||||
|
id = string.Empty;
|
||||||
|
alterId = 0;
|
||||||
|
security = string.Empty;
|
||||||
|
network = string.Empty;
|
||||||
|
remarks = string.Empty;
|
||||||
|
headerType = string.Empty;
|
||||||
|
requestHost = string.Empty;
|
||||||
|
path = string.Empty;
|
||||||
|
streamSecurity = string.Empty;
|
||||||
|
allowInsecure = string.Empty;
|
||||||
|
testResult = string.Empty;
|
||||||
|
subid = string.Empty;
|
||||||
|
flow = string.Empty;
|
||||||
|
groupId = string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public string indexId
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// config type(1=normal,2=custom)
|
||||||
|
/// </summary>
|
||||||
|
public EConfigType configType
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 版本(现在=2)
|
||||||
|
/// </summary>
|
||||||
|
public int configVersion
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int sort
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 远程服务器地址
|
||||||
|
/// </summary>
|
||||||
|
public string address
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 远程服务器端口
|
||||||
|
/// </summary>
|
||||||
|
public int port
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 远程服务器ID
|
||||||
|
/// </summary>
|
||||||
|
public string id
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 远程服务器额外ID
|
||||||
|
/// </summary>
|
||||||
|
public int alterId
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 本地安全策略
|
||||||
|
/// </summary>
|
||||||
|
public string security
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// tcp,kcp,ws,h2,quic
|
||||||
|
/// </summary>
|
||||||
|
public string network
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 备注或别名
|
||||||
|
/// </summary>
|
||||||
|
public string remarks
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 伪装类型
|
||||||
|
/// </summary>
|
||||||
|
public string headerType
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 伪装的域名
|
||||||
|
/// </summary>
|
||||||
|
public string requestHost
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// ws h2 path
|
||||||
|
/// </summary>
|
||||||
|
public string path
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 传输层安全
|
||||||
|
/// </summary>
|
||||||
|
public string streamSecurity
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否允许不安全连接(用于客户端)
|
||||||
|
/// </summary>
|
||||||
|
public string allowInsecure
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
///
|
||||||
|
/// </summary>
|
||||||
|
public string testResult
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// SubItem id
|
||||||
|
/// </summary>
|
||||||
|
public string subid
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// VLESS flow
|
||||||
|
/// </summary>
|
||||||
|
public string flow
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// tls sni
|
||||||
|
/// </summary>
|
||||||
|
public string sni
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string groupId
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
} = string.Empty;
|
||||||
|
|
||||||
|
public ECoreType? coreType
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int preSocksPort
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string fingerprint { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
public class RoutingItemOld
|
||||||
|
{
|
||||||
|
public string remarks
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
public string url
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
public List<RulesItem> rules
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
public bool enabled { get; set; } = true;
|
||||||
|
|
||||||
|
public bool locked
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
public string customIcon
|
||||||
|
{
|
||||||
|
get; set;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
26
v2rayN/v2rayN/Mode/CoreInfo.cs
Normal file
26
v2rayN/v2rayN/Mode/CoreInfo.cs
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
namespace v2rayN.Mode
|
||||||
|
{
|
||||||
|
[Serializable]
|
||||||
|
public class CoreInfo
|
||||||
|
{
|
||||||
|
public ECoreType coreType { get; set; }
|
||||||
|
|
||||||
|
public List<string> coreExes { get; set; }
|
||||||
|
|
||||||
|
public string arguments { get; set; }
|
||||||
|
|
||||||
|
public string coreUrl { get; set; }
|
||||||
|
|
||||||
|
public string coreReleaseApiUrl { get; set; }
|
||||||
|
|
||||||
|
public string coreDownloadUrl32 { get; set; }
|
||||||
|
|
||||||
|
public string coreDownloadUrl64 { get; set; }
|
||||||
|
|
||||||
|
public string match { get; set; }
|
||||||
|
public string versionArg { get; set; }
|
||||||
|
|
||||||
|
public bool redirectInfo { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,9 +3,11 @@ namespace v2rayN.Mode
|
|||||||
{
|
{
|
||||||
public enum EConfigType
|
public enum EConfigType
|
||||||
{
|
{
|
||||||
Vmess = 1,
|
VMess = 1,
|
||||||
Custom = 2,
|
Custom = 2,
|
||||||
Shadowsocks = 3,
|
Shadowsocks = 3,
|
||||||
Socks = 4
|
Socks = 4,
|
||||||
|
VLESS = 5,
|
||||||
|
Trojan = 6
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
18
v2rayN/v2rayN/Mode/ECoreType.cs
Normal file
18
v2rayN/v2rayN/Mode/ECoreType.cs
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
|
||||||
|
namespace v2rayN.Mode
|
||||||
|
{
|
||||||
|
public enum ECoreType
|
||||||
|
{
|
||||||
|
v2fly = 1,
|
||||||
|
Xray = 2,
|
||||||
|
SagerNet = 3,
|
||||||
|
v2fly_v5 = 4,
|
||||||
|
clash = 11,
|
||||||
|
clash_meta = 12,
|
||||||
|
hysteria = 21,
|
||||||
|
naiveproxy = 22,
|
||||||
|
tuic = 23,
|
||||||
|
sing_box = 24,
|
||||||
|
v2rayN = 99
|
||||||
|
}
|
||||||
|
}
|
||||||
12
v2rayN/v2rayN/Mode/EGlobalHotkey.cs
Normal file
12
v2rayN/v2rayN/Mode/EGlobalHotkey.cs
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
|
||||||
|
namespace v2rayN.Mode
|
||||||
|
{
|
||||||
|
public enum EGlobalHotkey
|
||||||
|
{
|
||||||
|
ShowForm = 0,
|
||||||
|
SystemProxyClear = 1,
|
||||||
|
SystemProxySet = 2,
|
||||||
|
SystemProxyUnchanged = 3,
|
||||||
|
SystemProxyPac = 4,
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -6,6 +6,7 @@ namespace v2rayN.Mode
|
|||||||
Top = 1,
|
Top = 1,
|
||||||
Up = 2,
|
Up = 2,
|
||||||
Down = 3,
|
Down = 3,
|
||||||
Bottom = 4
|
Bottom = 4,
|
||||||
|
Position = 5
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user