Compare commits
811 Commits
Author | SHA1 | Date | |
---|---|---|---|
960cd18d0a | |||
405b85c4b4 | |||
92e323df51 | |||
3f2c34903d | |||
3c260aa333 | |||
da41f3a93b | |||
aeb711acde | |||
a46ee9a5b2 | |||
088f9558ec | |||
376d61c155 | |||
285a2b92e5 | |||
8939c573ea | |||
3839d9873a | |||
116762ebce | |||
7dd8f00e95 | |||
29a3db4b5c | |||
5d95907996 | |||
2f940d01b6 | |||
517e170b88 | |||
b27fbb9b8e | |||
9b97d32ea8 | |||
d4f3952a90 | |||
f7840652ed | |||
08634c1ff6 | |||
dec4205890 | |||
b49ab59e3b | |||
7e1171ec9f | |||
3eae787957 | |||
9ecba4fc5e | |||
4fb9eef198 | |||
49ecfd8224 | |||
09a2854b8b | |||
82976e609f | |||
b2d6b60300 | |||
90737493e6 | |||
fe3abc79d6 | |||
9931112387 | |||
1cd646afe2 | |||
0d262d28b7 | |||
f33e950780 | |||
7094489536 | |||
2dd650df01 | |||
7e8037979f | |||
3a1c042cd2 | |||
ca81c35b3d | |||
6a2dfff34d | |||
5eccc01de6 | |||
1850e893e9 | |||
2341793546 | |||
1f1d089fda | |||
5372a50bcc | |||
83588d9b98 | |||
58e960ceb5 | |||
de07705671 | |||
49ff3cfbf3 | |||
e392469835 | |||
7745bd89a9 | |||
01bed932c7 | |||
157190757b | |||
e0f1047d72 | |||
15f0cda41f | |||
9a95122c7c | |||
d868f7c02a | |||
5ca2f306b8 | |||
c714c1a0c9 | |||
e6e6c00497 | |||
62a3da2fa6 | |||
f1f97e8ec5 | |||
6c361679c6 | |||
ae89d2f2ab | |||
8053fb5eae | |||
ebf5eb6e20 | |||
2e2bff3f0a | |||
a3f290e4d8 | |||
e0dd1f13e3 | |||
787def6a1c | |||
1f5d7d7b5b | |||
4bc5215833 | |||
7736545f5b | |||
1ecf4377c6 | |||
593d4dc508 | |||
93d366fea1 | |||
7973f2e8b9 | |||
bb14fa0b4e | |||
95aba0c537 | |||
df4143f036 | |||
ed0575e937 | |||
456ed0aab4 | |||
47c8389419 | |||
51fd4d70da | |||
79e32231fb | |||
80f9f857e5 | |||
5a4c2de425 | |||
7e547743c7 | |||
3f3d43df41 | |||
0cc72a49c8 | |||
35c9e99914 | |||
2e4bd1e440 | |||
22c0b8e524 | |||
faeb58f7e2 | |||
cdc184c5e5 | |||
2f9a4f0fa5 | |||
37437da34d | |||
6d3a5856b4 | |||
4d4538a346 | |||
327102a254 | |||
3602eb14f5 | |||
cf82b51a1f | |||
412d3bc2f8 | |||
4735508a0a | |||
9225d01b29 | |||
7782970d51 | |||
6f053287d5 | |||
7a88f59f08 | |||
d56aae8913 | |||
a309a14396 | |||
b80cbbdd4a | |||
5bc2dab1d2 | |||
8bbe7fabb3 | |||
c537d160a6 | |||
475187fcbc | |||
a379e36e24 | |||
a9054a3cab | |||
ea7a9c259f | |||
2cba48d4d7 | |||
42b79c5a20 | |||
be9523f1e4 | |||
6a8dd0f053 | |||
1b63aa411b | |||
33a7f3351b | |||
f7af5e1329 | |||
3a9a029d70 | |||
0aaacc86e2 | |||
1b8b7b741c | |||
66831c619b | |||
30628fb5f9 | |||
064ff8a7d2 | |||
9a18955de3 | |||
35da3f3334 | |||
335d45f03e | |||
c466cd77ad | |||
d998e2e9bb | |||
0a20315280 | |||
01753f5aea | |||
bcd22cfbf3 | |||
7e039d0339 | |||
ab08ac70aa | |||
5decf3cd7a | |||
5c6d757e35 | |||
4b75be804f | |||
6515e6ee17 | |||
55e8583663 | |||
3fbff71861 | |||
e5eea47b66 | |||
b10b0e8f57 | |||
631a367b1c | |||
8ea279fbe2 | |||
089572befd | |||
0f96b9569a | |||
d1114666de | |||
f676abc0d4 | |||
3492b7219b | |||
a12ae6e399 | |||
9b2e18a65b | |||
c52ccf7eef | |||
1282434684 | |||
4e844187f7 | |||
ccd67d658d | |||
62383819cb | |||
3febcf6043 | |||
a431137f45 | |||
5a6e14b9df | |||
536bc3112f | |||
81b2e6b789 | |||
4cf376ec1d | |||
d3a0c91398 | |||
43140d3efd | |||
3dd3bf829d | |||
bdcad06ece | |||
69fdfb0635 | |||
55a8002b9c | |||
e36f9b2273 | |||
70ae99f31a | |||
15565ca09c | |||
f188e02a5d | |||
4d005349a7 | |||
c65a97882e | |||
cf880548d9 | |||
b5876e7f04 | |||
2436ea1131 | |||
5395b6829a | |||
c3af134a5b | |||
cce72a5f1b | |||
32c143f8d7 | |||
895cb1f2e5 | |||
7986f5646e | |||
59a5776f9d | |||
fc8c0ccfe1 | |||
0930ead814 | |||
b5a17637cb | |||
460c8a319f | |||
7aa051ef4f | |||
c7c132c0ac | |||
d84b1125eb | |||
8d4a1899f2 | |||
3a0cdf1388 | |||
d8d76fd327 | |||
abf7296de1 | |||
316c20ee44 | |||
13e8c95667 | |||
a14ad423a6 | |||
e1a5d5e19a | |||
6e29eddaa7 | |||
65ae26a961 | |||
1afd946a94 | |||
d6820634ac | |||
95dd744633 | |||
219af36090 | |||
24e83398ba | |||
4172ed21a9 | |||
1cba7b8ec1 | |||
0bef85277e | |||
2f4c428316 | |||
4de0b73cd8 | |||
7ffb3f46b5 | |||
ad6cd05295 | |||
6e7ad3ecdb | |||
a6243d14c0 | |||
b0a477c5ca | |||
1d655c7abc | |||
abf2bead33 | |||
f1103bec7b | |||
fb1a6534dc | |||
22b1d5fe75 | |||
d2c939bc09 | |||
73f8cb4819 | |||
256bb771e1 | |||
cc533b0431 | |||
3c76fda8d9 | |||
c5555350ae | |||
22744084dc | |||
e4b212ec90 | |||
4be0af5de5 | |||
d771745981 | |||
7628842b0a | |||
6bcdb7fd92 | |||
27561fb632 | |||
f6ec3f66f8 | |||
2f0b9a8f94 | |||
3fb1a4ebc5 | |||
9abb0a1581 | |||
e60e29b70f | |||
d84352896f | |||
ee419454f4 | |||
68445fe195 | |||
12b2d4c00b | |||
fbb4d3a636 | |||
ca415376c7 | |||
718f73ebb1 | |||
fb47eef218 | |||
87dd473148 | |||
9bbbccee1a | |||
0088750b16 | |||
0aae2deb58 | |||
0d62b37c13 | |||
64ece1080c | |||
b4256e484a | |||
b0ea204be5 | |||
118d7fce09 | |||
5e498e0bd6 | |||
c312fa869b | |||
fe394b0b46 | |||
6039f3931d | |||
71d72b426f | |||
7d5042c507 | |||
e2b0e14771 | |||
0e9bfba84d | |||
99f53413a6 | |||
f46600d7fe | |||
0607a87514 | |||
1658690b97 | |||
eae0f3273b | |||
508beb2fc7 | |||
0de2f492d1 | |||
72a7393844 | |||
99f8468f63 | |||
a9e8fc2f1f | |||
e225244887 | |||
cbde15b00f | |||
8e38047d43 | |||
dc1d0195eb | |||
7d7f264bc0 | |||
b3c30b4fd2 | |||
6c87005eeb | |||
8d2a516044 | |||
dc0cc49dbf | |||
497bc5a414 | |||
2a71baef90 | |||
49a74e8610 | |||
6340fbb3d4 | |||
748203f4e7 | |||
a91cc94228 | |||
029ac71e58 | |||
e830b46173 | |||
a4d053f555 | |||
b298796060 | |||
895490df3d | |||
a09c06849b | |||
37c494bf0a | |||
d6fccc07be | |||
819efc132b | |||
8ffdae4182 | |||
efd6dcc8df | |||
70a17ecfaf | |||
15dbf67983 | |||
a43df30051 | |||
1bff5a7b9e | |||
ec49d9becf | |||
bc49f51dbb | |||
b869860a83 | |||
2772a0e5e4 | |||
46970f5a4a | |||
ccf9cd3f71 | |||
b9c464f8cb | |||
48510c1157 | |||
3035fcf080 | |||
930f402eb9 | |||
4e93191312 | |||
9bc4f6bacb | |||
9b42129fea | |||
0650137e32 | |||
a13e528972 | |||
82f8dd5635 | |||
7f93cb22ce | |||
e6738053b2 | |||
b74ab51438 | |||
d7a591ce3a | |||
cfe33a8bbd | |||
ca7593cdf2 | |||
b185d11daf | |||
5106c37ac4 | |||
5d40ad1749 | |||
24edce3daf | |||
cfd1ab7d78 | |||
bfaa648edd | |||
fd19210bce | |||
9a3b103324 | |||
0ee5c905e4 | |||
5f22a226cc | |||
56b3144c56 | |||
dad4bef70c | |||
13a04dba71 | |||
ab66dfcb65 | |||
ab349a5303 | |||
53a68ff5a3 | |||
29f13868b7 | |||
8ce71d724c | |||
e3de3dcc1d | |||
fa6a6fa4ef | |||
e78e4c93c0 | |||
0173f5877b | |||
32e829da74 | |||
68e81fa8c8 | |||
9f84d13542 | |||
48f591eea8 | |||
cb6dce4e03 | |||
e5e7f01e84 | |||
f90a320d95 | |||
96c94a294e | |||
ab81887138 | |||
d13e3d95d3 | |||
64f1fe0b51 | |||
0a77f88229 | |||
12d34a50ff | |||
92daa920d2 | |||
091d03b9d8 | |||
f7ee11cb44 | |||
6226b8ae6d | |||
a6a61421d9 | |||
5c20574044 | |||
aca006253a | |||
7a752cc7a2 | |||
de7dc2c1f7 | |||
35b5bf187e | |||
efbc4c5184 | |||
711c2b7dfd | |||
a4adb4709b | |||
7121b5fa31 | |||
c944648b99 | |||
45cdd556c7 | |||
429bd0a4e3 | |||
135f8c1be2 | |||
7b7a590e21 | |||
95728ef29f | |||
021b44724e | |||
ba0efe64c7 | |||
1a247d8d3a | |||
21b03e8e8a | |||
03790e3e4d | |||
9af239aa65 | |||
02fc700ac0 | |||
1fb5238642 | |||
461af7d0a2 | |||
cf3efc11ba | |||
b6e24b5094 | |||
0b590763f3 | |||
3cc4ee7199 | |||
4828cd2f16 | |||
45da7e8704 | |||
e00b88ca32 | |||
e497680ca8 | |||
dbb9eefe70 | |||
7388fdf820 | |||
0c46d561ec | |||
4248ab936c | |||
e5139113b1 | |||
0f1a4ad4cd | |||
00d99fb1a9 | |||
ee8dc4af2d | |||
d7b4be1e74 | |||
7ed509b76a | |||
c616f66e83 | |||
e8bfac27aa | |||
df3b3bfc8f | |||
ac358502ce | |||
2b905d2ed5 | |||
49c55ae12a | |||
d280d7a389 | |||
19ccdcd951 | |||
cac9b2e1f1 | |||
e0e42a0f87 | |||
1d845dab03 | |||
71b9bb67a6 | |||
06be251032 | |||
454a6ab177 | |||
1e1c3cdff0 | |||
52de5e569c | |||
2f97942286 | |||
4b1eabf1fc | |||
6c7f1cbf8a | |||
ffc582093b | |||
cc833f3ca4 | |||
00d0aa7830 | |||
54f649a4b4 | |||
1c2cd4dcb2 | |||
43d6851199 | |||
9527684cf7 | |||
1965815d7d | |||
cc2be105a6 | |||
e4c599b756 | |||
a8a21ddb73 | |||
942c31621b | |||
ca14002bd1 | |||
5eec098e2b | |||
37043195ba | |||
ab8e2cf34d | |||
882e08fc4f | |||
2e5caac8bf | |||
714fe82d2f | |||
1724e5b499 | |||
a5fa6acf5d | |||
59105a9ad6 | |||
abc23e9a49 | |||
72071566e7 | |||
055cd99dde | |||
d2c52e5c94 | |||
c7541f819a | |||
7972c0c862 | |||
3fee5a3781 | |||
db45e74fcc | |||
206e45b9e8 | |||
a9345953f3 | |||
eb324d7652 | |||
85adfc40fb | |||
f1bb8910cb | |||
8ca794dc57 | |||
fe3cd65c62 | |||
9e1181900b | |||
256c5356fb | |||
0bc6fd246f | |||
77ce768cb4 | |||
b23256dc4e | |||
5906fb7139 | |||
0606050231 | |||
56a700e82d | |||
47cd9beefa | |||
b93aada213 | |||
0ce6872693 | |||
1c9d84771e | |||
6699366597 | |||
5d0d7aca58 | |||
29d0c19b0e | |||
917e1023e4 | |||
1fd5a20373 | |||
abc83362e7 | |||
9792336b33 | |||
4a6d0e4ba2 | |||
bc38ca4f91 | |||
306b3017e4 | |||
ce92b6cb66 | |||
8e2df567d8 | |||
4622f369c3 | |||
1eb4473e9d | |||
22c2829714 | |||
a87f8e8687 | |||
c89fb9ad73 | |||
978de73351 | |||
a1ec01ec2d | |||
7aa9949332 | |||
71f3cd648f | |||
7f379027ca | |||
279f3e4934 | |||
bdd75793bc | |||
58660bed3c | |||
2ca0ae7529 | |||
3ee09df6ce | |||
9b866b8e06 | |||
4d4954c5b8 | |||
17751ffd57 | |||
e8773f6a98 | |||
112ddc7156 | |||
e5ec72b09b | |||
24daf00616 | |||
718375419e | |||
a16bcf8e51 | |||
5c28125350 | |||
937de87dbf | |||
cadbe2c2c0 | |||
7c646f8693 | |||
1479ef9a6a | |||
daf078d4d7 | |||
c0fd1dbcbc | |||
821dcddda0 | |||
d9cb4e2620 | |||
290af4c187 | |||
11ad98e7bd | |||
ce50a9ca44 | |||
b7d581b412 | |||
a08dd4aefa | |||
be52b5930c | |||
0382120363 | |||
7151590abc | |||
51faed2c4d | |||
c1a8c8a3fd | |||
4975d30714 | |||
45d9f9d07d | |||
9b0e553ece | |||
dcaa0594f1 | |||
1202a303b7 | |||
ed8fd0bde2 | |||
834bfde45c | |||
fd4e57aafc | |||
4c4b3b776c | |||
eee160503b | |||
bef55b25ea | |||
623f972e8b | |||
7e651d53a0 | |||
5d212d3cea | |||
3e31de1602 | |||
245b7168ab | |||
4a9b567ebd | |||
2f6ae99452 | |||
1538ba0cc3 | |||
06a3417124 | |||
524a25eb2c | |||
8ff2724213 | |||
a9a2d2debb | |||
0070abc04c | |||
936a338e0e | |||
6c349d0ec4 | |||
7e1e3c3c32 | |||
ce23d76c72 | |||
cb488ebf7b | |||
7931451a49 | |||
59449cf513 | |||
39e5ff7eaa | |||
b430b02021 | |||
0bc67f5a89 | |||
56dc96de1e | |||
3ccbf37b41 | |||
7725b9e8a1 | |||
f511c9bc90 | |||
56b768fe19 | |||
f8901e94a9 | |||
ec5cc7e4d3 | |||
2413bcd99a | |||
1838ad4ae7 | |||
26c4f983d7 | |||
22609bbfdb | |||
0a8cbcbfb6 | |||
7f33051fe1 | |||
e65c2e279b | |||
b43338bd63 | |||
65ae9138ef | |||
665b691711 | |||
87953c4b93 | |||
be480d577c | |||
32566a43bd | |||
fd598dea5b | |||
8fef5d9a06 | |||
2f1d6e3f90 | |||
53f62bd8dd | |||
e6c87c54be | |||
ee3edc9661 | |||
32dddac75b | |||
906482823c | |||
91c389777a | |||
042a08b90e | |||
7f4c23a038 | |||
e7b0691116 | |||
235058eab1 | |||
85963a5c72 | |||
c639525c1d | |||
de18ebbb73 | |||
47e32c82fc | |||
71b708b0f2 | |||
ab9fee260f | |||
e86e42818a | |||
067e76c1b0 | |||
13b3bb4490 | |||
e82898c988 | |||
f4fdbceb3b | |||
c75ff538a3 | |||
7e71ead3e9 | |||
29489ad198 | |||
eac45256aa | |||
7feb97e415 | |||
695752629d | |||
c3c20ceca4 | |||
aa04820fd1 | |||
3208b7289e | |||
b4336fdec7 | |||
e0652a4607 | |||
4ab46b1de8 | |||
d7122cdad7 | |||
9c3eac58f1 | |||
79954cec68 | |||
d927f8bcb0 | |||
4426cc359c | |||
b1465b7dff | |||
438ea1b269 | |||
f10bfda115 | |||
b7e2d3a10b | |||
846c5fcfc3 | |||
31cd726b7b | |||
3ba43a77f4 | |||
cb5390b2fb | |||
fae7262d31 | |||
9b6abc1e19 | |||
631cd37f8b | |||
b59a38ffad | |||
9a6a993a81 | |||
9234a94da9 | |||
aa2f9e34c0 | |||
87eafa30d0 | |||
287eff50b7 | |||
8514e7962d | |||
9bed2bde3c | |||
9e003a9f93 | |||
86f02691a8 | |||
3ad3988937 | |||
757855a5c9 | |||
ccab73ff66 | |||
9df04724c4 | |||
94c2ba7fc5 | |||
a267fcc9cc | |||
66a292a9c6 | |||
7cd0112211 | |||
9195e754cf | |||
965b183d9e | |||
7372a18cec | |||
c5ba5f3a5b | |||
90251b8545 | |||
a8c97053c7 | |||
117d3a5614 | |||
70a2e48a72 | |||
a6f106ed6d | |||
47dd1b6168 | |||
bc7a963f5c | |||
47fc3b0d0b | |||
3d7b9560cb | |||
9bd3bea90a | |||
9541abc0a4 | |||
0be28c1701 | |||
8bb28ea825 | |||
85382863d2 | |||
ef737415c5 | |||
72e4dabd30 | |||
6bcd547ca0 | |||
283f7a3f37 | |||
d9a2e024ee | |||
fe4e76a7f8 | |||
9c4a7c02fd | |||
a516d6474e | |||
eba6ca5430 | |||
ee7e70b98a | |||
0b7fb21263 | |||
95a38779de | |||
e7913061e9 | |||
7d91bdba1e | |||
29fe221fe6 | |||
30b73ffe6d | |||
fceec5c129 | |||
e42f7ab8fc | |||
54b80d6724 | |||
e82f173f85 | |||
b45dfb85f0 | |||
3db244f5d2 | |||
65a41908ec | |||
7e3bda9d4d | |||
c6b2492e73 | |||
d41afc0c43 | |||
40637e0f28 | |||
0e4c846942 | |||
6dc5d0f8d7 | |||
7688df6fe5 | |||
32b6c77156 | |||
a8a0e2a91c | |||
4c396e5b95 | |||
d3181e53cc | |||
4139b36eac | |||
becc6dc0fc | |||
79a963fcab | |||
b21e011203 | |||
5a6b65d20c | |||
5b44bcb44f | |||
c3bafcab05 | |||
9ae4fce0db | |||
4929a7e635 | |||
b61861f840 | |||
35b5eb74f6 | |||
fc10031ff0 | |||
accf3dbf3f | |||
c2fedf8538 | |||
3b19afe7ed | |||
64ada538f4 | |||
a0c4e79c8a | |||
34249e3dca | |||
f5bd10207b | |||
9cc1511863 | |||
c1d7562331 | |||
542e0f2ed3 | |||
ab33b52f23 | |||
a223c7ac75 | |||
c32c9a2391 | |||
798e1422c6 | |||
e05b46002b | |||
fa6aa44a86 | |||
4f0013e8da | |||
b2e5e14bc6 | |||
e15b469833 | |||
c9b6d72c5a | |||
a279f8d530 | |||
89f0f09b86 | |||
157b85b11b | |||
7b15cc8113 | |||
8d4c332987 | |||
4ffa2450c2 | |||
d670d98e60 | |||
33b2762003 | |||
507b6d45d5 | |||
f331dad72d | |||
5b41827a7b | |||
178b5996a5 | |||
8054078b9e | |||
452adfa860 | |||
833ebd0714 | |||
b430abf172 | |||
939311d2de | |||
0c738e2c6f | |||
48e544c014 | |||
08b186aa24 | |||
2f46efe78d | |||
3ddd5f2a51 | |||
29a58cb030 | |||
0bcbe6ae05 | |||
3944688829 | |||
e126233fbc | |||
ae83b4202d | |||
7cdfe45acf | |||
eae4362181 | |||
f2e9e2cc23 | |||
311ec4eb54 | |||
f4254659ea | |||
b542f17194 | |||
ddf5cf80b2 | |||
0f1f33eaa4 | |||
18a475eff3 | |||
54255cab4a | |||
bc831d3c35 | |||
d54695e542 | |||
12625a46c2 | |||
ab84a5ce8e | |||
fcbfd7554f | |||
4d27f18710 | |||
1bc4cb382e | |||
6b825fbe25 | |||
2cf5221620 | |||
de6edc6a99 | |||
bc086a78eb | |||
e0dccb5970 | |||
a4d16af95d | |||
5022575429 | |||
b8f22bf3bf | |||
5a8b3eb8f3 | |||
d26ac84126 | |||
82045b3fde | |||
14ce5a2432 | |||
06aeff9a30 | |||
78075cb3aa | |||
312e6071d7 |
44
INSTALL-headless.txt
Normal file
44
INSTALL-headless.txt
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
Headless I2P installation instructions
|
||||||
|
|
||||||
|
1) java -jar i2pinstall.exe -console (you've already done this)
|
||||||
|
|
||||||
|
This will run the installer in text mode, including running the postinstall.sh
|
||||||
|
script. After that, you may run 'sh i2prouter start'
|
||||||
|
which will start the router and attempt to launch a browser.
|
||||||
|
|
||||||
|
If you do not have an X server running, the browser launch will probably fail, and
|
||||||
|
you may use:
|
||||||
|
lynx http://localhost:7657/index.jsp
|
||||||
|
to configure the router.
|
||||||
|
|
||||||
|
If you're having trouble, swing by http://forum.i2p2.de/, check the
|
||||||
|
website at http://www.i2p2.de/, or get on irc://irc.freenode.net/#i2p
|
||||||
|
|
||||||
|
I2P will create and store files and configuration data in the user directory
|
||||||
|
~/.i2p/ on Linux and %APPDATA%\I2P\ on Windows. This directory is created
|
||||||
|
when I2P is run for the first time. It also creates files in the system
|
||||||
|
temporary directory specified by the Java Virtual Machine.
|
||||||
|
To change the location of these directories, or to configure I2P to
|
||||||
|
put all files in this directory (the so-called "portable" configuration),
|
||||||
|
edit the files i2prouter (Linux) and wrapper.config (Linux and Windows)
|
||||||
|
where there are comments labeled "PORTABLE". Do this before you
|
||||||
|
run I2P for the first time.
|
||||||
|
|
||||||
|
To run I2P explicitly:
|
||||||
|
(*nix): sh i2prouter start
|
||||||
|
(win*): I2P.exe
|
||||||
|
|
||||||
|
To stop the router (gracefully):
|
||||||
|
lynx http://localhost:7657/configservice.jsp ("Shutdown gracefully")
|
||||||
|
|
||||||
|
To stop the router (immediately):
|
||||||
|
sh i2prouter stop
|
||||||
|
|
||||||
|
To uninstall I2P:
|
||||||
|
rm -rf $i2pInstallDir
|
||||||
|
|
||||||
|
Supported JVMs:
|
||||||
|
Windows: Latest available from http://java.sun.com/ (1.5+ supported)
|
||||||
|
Linux: Latest available from http://java.sun.com/ (1.5+ supported)
|
||||||
|
FreeBSD: Sun 1.5-compatible (NIO required)
|
||||||
|
various: http://www.kaffe.org/ Sun 1.5-compatible (NIO required)
|
@ -6,16 +6,20 @@ and package up the appropriate installer by running:
|
|||||||
ant pkg
|
ant pkg
|
||||||
|
|
||||||
This will produce a few key files:
|
This will produce a few key files:
|
||||||
* i2p.tar.bz2: the headless installation
|
* install.jar: the GUI and console installer
|
||||||
* install.jar: the GUI installer
|
* i2pinstall.exe: the GUI and console installer wrapped for cross-platform execution
|
||||||
* i2pupdate.zip: the update package
|
* i2pupdate.zip: the update package
|
||||||
|
|
||||||
From there, you can follow the headless installation instructions
|
From there, you can run the headless (console mode) installer:
|
||||||
with the headless installer, run the GUI installer, or deploy
|
java -jar i2pinstall.exe -console
|
||||||
the update into an existing installation.
|
|
||||||
|
Or run the GUI installer:
|
||||||
|
java -jar i2pinstall.exe
|
||||||
|
|
||||||
|
Or move the update file into an existing installation directory and restart.
|
||||||
|
|
||||||
You will need to have ant installed from http://ant.apache.org/
|
You will need to have ant installed from http://ant.apache.org/
|
||||||
(1.5 or newer)
|
(1.7.0 or newer)
|
||||||
|
|
||||||
Supported JVMs:
|
Supported JVMs:
|
||||||
Windows: Latest available from http://java.sun.com/ (1.5+ supported)
|
Windows: Latest available from http://java.sun.com/ (1.5+ supported)
|
62
LICENSE.txt
62
LICENSE.txt
@ -67,23 +67,61 @@ Public domain except as listed below:
|
|||||||
|
|
||||||
|
|
||||||
Router:
|
Router:
|
||||||
Public domain
|
Public domain except as listed below:
|
||||||
|
UPnP.java:
|
||||||
|
From freenet
|
||||||
|
See licenses/LICENSE-GPLv2.txt
|
||||||
|
|
||||||
|
UPnP subsystem 1.7:
|
||||||
|
Copyright (C) 2003-2006 Satoshi Konno
|
||||||
|
See licenses/LICENSE-UPnP.txt
|
||||||
|
|
||||||
|
GeoIP data free to use, courtesy http://ip-to-country.webhosting.info/
|
||||||
|
|
||||||
|
|
||||||
Installer:
|
Installer:
|
||||||
Launch4j:
|
Launch4j 2.0.RC3:
|
||||||
Copyright (C) 2005 Grzegorz Kowal
|
Copyright (C) 2005 Grzegorz Kowal
|
||||||
See licenses/LICENSE-GPLv2.txt
|
See licenses/LICENSE-GPLv2.txt
|
||||||
|
The following projects are used by Launch4j...
|
||||||
|
MinGW binutils (http://www.mingw.org/)
|
||||||
|
|
||||||
Izpack:
|
Commons BeanUtils (http://jakarta.apache.org/commons/beanutils/)
|
||||||
See licenses/LICENSE-Apache1.1.txt
|
|
||||||
|
Commons Logging (http://jakarta.apache.org/commons/logging/)
|
||||||
|
See licenses/LICENSE-Apache1.1.txt
|
||||||
|
See licenses/NOTICE-Commons-Logging.txt
|
||||||
|
|
||||||
|
XStream (http://xstream.codehaus.org/)
|
||||||
|
Copyright (c) 2003-2004, Joe Walnes
|
||||||
|
See licenses/LICENSE-XStream.txt
|
||||||
|
|
||||||
|
JGoodies Forms (http://www.jgoodies.com/freeware/forms/)
|
||||||
|
Copyright (c) 2002-2004 JGoodies Karsten Lentzsch. All rights reserved.
|
||||||
|
See licenses/LICENSE-JGoodies-Forms.txt
|
||||||
|
|
||||||
|
JGoodies Looks (http://www.jgoodies.com/freeware/looks/)
|
||||||
|
Copyright (c) 2003 JGoodies Karsten Lentzsch. All rights reserved.
|
||||||
|
See licenses/LICENSE-JGoodies-Looks.txt
|
||||||
|
|
||||||
|
Foxtrot (http://foxtrot.sourceforge.net/)
|
||||||
|
Copyright (c) 2002, Simone Bordet & Marco Cravero. All rights reserved.
|
||||||
|
See licenses/LICENSE-Foxtrot.txt
|
||||||
|
|
||||||
|
Nuvola Icon Theme (http://www.icon-king.com)
|
||||||
|
See licenses/LICENSE-LGPLv2.1.txt
|
||||||
|
|
||||||
|
Forms were created using Abeille Forms Designer (https://abeille.dev.java.net/)
|
||||||
|
|
||||||
|
Izpack 4.3.0:
|
||||||
|
Copyright (c) 2001-2008 Julien Ponge
|
||||||
|
See licenses/LICENSE-Apache2.0.txt
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Wrapper:
|
Wrapper 3.1.1:
|
||||||
Copyright (c) 1999, 2004 Tanuki Software
|
Copyright (c) 1999, 2004 Tanuki Software
|
||||||
See licenses/LICENSE-Wrapper.txt
|
See licenses/LICENSE-Wrapper.txt
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -121,7 +159,6 @@ Applications:
|
|||||||
Copyright 2000-2004 Mort Bay Consulting Pty. Ltd.
|
Copyright 2000-2004 Mort Bay Consulting Pty. Ltd.
|
||||||
See licenses/LICENSE-Apache1.1.txt
|
See licenses/LICENSE-Apache1.1.txt
|
||||||
See licenses/LICENSE-Apache2.0.txt
|
See licenses/LICENSE-Apache2.0.txt
|
||||||
See licenses/NOTICE-Ant.txt
|
|
||||||
See licenses/NOTICE-Commons-Logging.txt
|
See licenses/NOTICE-Commons-Logging.txt
|
||||||
|
|
||||||
JRobin 1.4.0:
|
JRobin 1.4.0:
|
||||||
@ -137,6 +174,11 @@ Applications:
|
|||||||
|
|
||||||
Router console:
|
Router console:
|
||||||
Public domain.
|
Public domain.
|
||||||
|
Flag icons: public domain, courtesy mjames@gmail.com http://www.famfamfam.com/
|
||||||
|
|
||||||
|
GeoIP Data:
|
||||||
|
Copyright (c) 2003 Direct Information Pvt. Ltd. All Rights Reserved.
|
||||||
|
See licenses/LICENSE-GeoIP.txt
|
||||||
|
|
||||||
SAM:
|
SAM:
|
||||||
Public domain.
|
Public domain.
|
||||||
@ -168,6 +210,10 @@ distributions. See the source package for the additional license information.
|
|||||||
Atalk:
|
Atalk:
|
||||||
Public domain
|
Public domain
|
||||||
|
|
||||||
|
Desktopgui
|
||||||
|
Copyright (c) Mathias De Maré
|
||||||
|
See apps/desktopgui/LICENSE
|
||||||
|
|
||||||
SAM C Library:
|
SAM C Library:
|
||||||
Copyright (c) 2004, Matthew P. Cashdollar <mpc@innographx.com>
|
Copyright (c) 2004, Matthew P. Cashdollar <mpc@innographx.com>
|
||||||
See apps/sam/c/doc/license.txt
|
See apps/sam/c/doc/license.txt
|
||||||
|
51
Makefile.gcj
51
Makefile.gcj
@ -5,7 +5,7 @@
|
|||||||
GCJ=gcj #/usr/local/gcc-4.0.2/bin/gcj
|
GCJ=gcj #/usr/local/gcc-4.0.2/bin/gcj
|
||||||
EXTRA_LD_PATH= #/usr/local/gcc-4.0.2/lib
|
EXTRA_LD_PATH= #/usr/local/gcc-4.0.2/lib
|
||||||
ANT=ant #/opt/apache-ant-1.6.5/bin/ant
|
ANT=ant #/opt/apache-ant-1.6.5/bin/ant
|
||||||
ANT_TARGET=buildclean
|
ANT_TARGET=build2
|
||||||
NATIVE_DIR=native
|
NATIVE_DIR=native
|
||||||
|
|
||||||
##
|
##
|
||||||
@ -24,20 +24,22 @@ JAR_BASE=i2p.jar mstreaming.jar streaming.jar
|
|||||||
JAR_CLIENTS=i2ptunnel.jar sam.jar
|
JAR_CLIENTS=i2ptunnel.jar sam.jar
|
||||||
JAR_ROUTER=router.jar
|
JAR_ROUTER=router.jar
|
||||||
JAR_JBIGI=jbigi.jar
|
JAR_JBIGI=jbigi.jar
|
||||||
JAR_XML=xml-apis.jar resolver.jar xercesImpl.jar
|
|
||||||
JAR_CONSOLE=\
|
JAR_CONSOLE=\
|
||||||
i2psnark.jar \
|
|
||||||
javax.servlet.jar \
|
javax.servlet.jar \
|
||||||
commons-el.jar \
|
commons-el.jar \
|
||||||
commons-logging.jar \
|
commons-logging.jar \
|
||||||
jasper-runtime.jar \
|
jasper-runtime.jar \
|
||||||
ant-apache-bcel.jar \
|
|
||||||
ant.jar \
|
|
||||||
jasper-compiler.jar \
|
jasper-compiler.jar \
|
||||||
org.mortbay.jetty.jar \
|
org.mortbay.jetty.jar \
|
||||||
routerconsole.jar
|
routerconsole.jar
|
||||||
JAR_SUCKER=jdom.jar rome-0.7.jar sucker.jar
|
|
||||||
LIBI2P_JARS=${JAR_BASE} ${JAR_CLIENTS} ${JAR_ROUTER} ${JAR_JBIGI}
|
LIBI2P_JARS=${JAR_BASE} ${JAR_CLIENTS} ${JAR_ROUTER} ${JAR_JBIGI}
|
||||||
|
LIBSAM_JARS=${JAR_BASE} sam.jar
|
||||||
|
LIBROUTER_JARS=i2p.jar ${JAR_ROUTER} ${JAR_JBIGI}
|
||||||
|
LIBCONSOLE_JARS=${LIBROUTER_JARS} ${JAR_CONSOLE}
|
||||||
|
LIBSNARK_JARS=${LIBROUTER_JARS} i2psnark.jar
|
||||||
|
# update:
|
||||||
|
# similar error with gcj 4.3.3.
|
||||||
|
#
|
||||||
# unfortunately, its not quite ready for most end users, as the
|
# unfortunately, its not quite ready for most end users, as the
|
||||||
# ${JAR_CONSOLE} fails to compile with:
|
# ${JAR_CONSOLE} fails to compile with:
|
||||||
# org/apache/commons/logging/impl/LogKitLogger.java: In class 'org.apache.commons.logging.impl.LogKitLogger':
|
# org/apache/commons/logging/impl/LogKitLogger.java: In class 'org.apache.commons.logging.impl.LogKitLogger':
|
||||||
@ -95,7 +97,36 @@ native_shared: libi2p.so
|
|||||||
@echo " i2ptunnel will, so it will start all the proxies defined in i2ptunnel.config"
|
@echo " i2ptunnel will, so it will start all the proxies defined in i2ptunnel.config"
|
||||||
|
|
||||||
libi2p.so:
|
libi2p.so:
|
||||||
@echo "* Building libi2p.so"
|
@echo "* Building $@"
|
||||||
@(cd build ; time ${GCJ} ${OPTIMIZE} -fPIC -fjni -shared -o ../${NATIVE_DIR}/libi2p.so ${LIBI2P_JARS} ; cd .. )
|
@(cd build ; time ${GCJ} ${OPTIMIZE} -fPIC -fjni -shared -o ../${NATIVE_DIR}/$@ ${LIBI2P_JARS} ; cd .. )
|
||||||
@ls -l ${NATIVE_DIR}/libi2p.so
|
@ls -l ${NATIVE_DIR}/$@
|
||||||
@echo "* libi2p.so built"
|
@echo "* $@ built"
|
||||||
|
|
||||||
|
sam: jars libi2psam.so
|
||||||
|
|
||||||
|
libi2psam.so:
|
||||||
|
@echo "* Building $@"
|
||||||
|
@rm -f ${NATIVE_DIR}/$@
|
||||||
|
@(cd build ; time ${GCJ} ${OPTIMIZE} -fPIC -fjni -shared -o ../${NATIVE_DIR}/$@ ${LIBSAM_JARS} ; cd .. )
|
||||||
|
@ls -l ${NATIVE_DIR}/$@
|
||||||
|
@echo "* $@ built"
|
||||||
|
|
||||||
|
router: jars libi2prouter.so
|
||||||
|
|
||||||
|
libi2prouter.so:
|
||||||
|
@echo "* Building $@"
|
||||||
|
@rm -f ${NATIVE_DIR}/$@
|
||||||
|
@(cd build ; time ${GCJ} ${OPTIMIZE} -fPIC -fjni -shared -o ../${NATIVE_DIR}/$@ ${LIBROUTER_JARS} ; cd .. )
|
||||||
|
@ls -l ${NATIVE_DIR}/$@
|
||||||
|
@echo "* $@ built"
|
||||||
|
|
||||||
|
console: jars libi2pconsole.so
|
||||||
|
|
||||||
|
# doesn't work, see above
|
||||||
|
libi2pconsole.so:
|
||||||
|
@echo "* Building $@"
|
||||||
|
@rm -f ${NATIVE_DIR}/$@
|
||||||
|
@(cd build ; time ${GCJ} ${OPTIMIZE} -fPIC -fjni -shared -o ../${NATIVE_DIR}/$@ ${LIBCONSOLE_JARS} ; cd .. )
|
||||||
|
@ls -l ${NATIVE_DIR}/$@
|
||||||
|
@echo "* $@ built"
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ mkdir -p $PKG
|
|||||||
# es: usr/local
|
# es: usr/local
|
||||||
NAME=i2p-base
|
NAME=i2p-base
|
||||||
VERSION=0.0.1
|
VERSION=0.0.1
|
||||||
BUILD=1sim
|
BUILD=1sponge
|
||||||
ARCH=noarch
|
ARCH=noarch
|
||||||
INSTALL_DIR=opt
|
INSTALL_DIR=opt
|
||||||
cd $PKG
|
cd $PKG
|
||||||
@ -38,5 +38,9 @@ sed "s|directory|/$INSTALL_DIR/i2p/|g" $CWD/doinst.sh > $PKG/install/doinst.sh
|
|||||||
cat $CWD/slack-desc > $PKG/install/slack-desc
|
cat $CWD/slack-desc > $PKG/install/slack-desc
|
||||||
|
|
||||||
cd $PKG
|
cd $PKG
|
||||||
requiredbuilder -v -y -s $CWD $PKG
|
#
|
||||||
|
# Not really that important to exec this.
|
||||||
|
#requiredbuilder -v -y -s $CWD $PKG
|
||||||
|
#
|
||||||
|
cat $CWD/slack-required > $PKG/install/slack-required
|
||||||
makepkg -l y -c n $CWD/${NAME}-$VERSION-$ARCH-$BUILD.tgz
|
makepkg -l y -c n $CWD/${NAME}-$VERSION-$ARCH-$BUILD.tgz
|
||||||
|
@ -49,16 +49,21 @@ echo
|
|||||||
echo "FINISHING I2P INSTALLATION. PLEASE WAIT."
|
echo "FINISHING I2P INSTALLATION. PLEASE WAIT."
|
||||||
|
|
||||||
cd $INST_DIR
|
cd $INST_DIR
|
||||||
sh postinstall.sh || (
|
|
||||||
echo "ERROR: failed execution of postinstall.sh. Please"
|
|
||||||
echo "cd into i2p installation directory and run "
|
|
||||||
echo "postinstall.sh manually with ./postinstall.sh"
|
|
||||||
exit 1
|
|
||||||
)
|
|
||||||
|
|
||||||
sleep 10
|
|
||||||
|
|
||||||
sh i2prouter stop || exit 1
|
|
||||||
|
OS_ARCH=`uname -m`
|
||||||
|
X86_64=`echo "$OS_ARCH" | grep x86_64`
|
||||||
|
if [ "X$X86_64" = "X" ]; then
|
||||||
|
wrapperpath="./lib/wrapper/linux"
|
||||||
|
else
|
||||||
|
wrapperpath="./lib/wrapper/linux64"
|
||||||
|
fi
|
||||||
|
cp $wrapperpath/libwrapper.so ./lib/
|
||||||
|
cp $wrapperpath/wrapper.jar ./lib/
|
||||||
|
cp $wrapperpath/i2psvc .
|
||||||
|
rm -rf ./lib/wrapper
|
||||||
|
chmod 744 ./i2psvc
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo "Installation finished."
|
echo "Installation finished."
|
||||||
|
@ -15,10 +15,10 @@
|
|||||||
# It's suggested to subscribe to various dns host, like i2host.i2p
|
# It's suggested to subscribe to various dns host, like i2host.i2p
|
||||||
# For any additional information, visit i2host.i2p and forum.i2p
|
# For any additional information, visit i2host.i2p and forum.i2p
|
||||||
|
|
||||||
BUILD=1sim
|
BUILD=1sponge
|
||||||
|
|
||||||
# put here installation dir, without first and last /
|
# put here installation dir, without first and last /
|
||||||
# es: usr/local
|
# eg: usr/local
|
||||||
INSTALL_DIR=opt
|
INSTALL_DIR=opt
|
||||||
NAME=i2p
|
NAME=i2p
|
||||||
ARCH=noarch
|
ARCH=noarch
|
||||||
@ -64,8 +64,8 @@ mkdir -p $PKG
|
|||||||
cd $CWD/../../
|
cd $CWD/../../
|
||||||
|
|
||||||
ant distclean
|
ant distclean
|
||||||
ant dist
|
#ant dist
|
||||||
|
ant tarball
|
||||||
|
|
||||||
tar xjvf i2p.tar.bz2 -C $TMP
|
tar xjvf i2p.tar.bz2 -C $TMP
|
||||||
|
|
||||||
@ -76,6 +76,34 @@ mkdir -p $PKG/$INSTALL_DIR/
|
|||||||
cp -a ../i2p $PKG/$INSTALL_DIR/
|
cp -a ../i2p $PKG/$INSTALL_DIR/
|
||||||
|
|
||||||
mkdir -p $PKG/install
|
mkdir -p $PKG/install
|
||||||
|
|
||||||
|
#############################################################################
|
||||||
|
# Preconfigureation to make package smaller
|
||||||
|
#############################################################################
|
||||||
|
cd $PKG/$INSTALL_DIR/i2p
|
||||||
|
|
||||||
|
# wrapper.config $INSTALL_PATH and $SYSTEM_java_io_tmpdir
|
||||||
|
sed "s|\$INSTALL_PATH|$INSTALL_DIR/i2p|g" wrapper.config > a
|
||||||
|
sed "s|\$SYSTEM_java_io_tmpdir|/var/tmp|g" a > wrapper.config
|
||||||
|
# eepget %INSTALL_PATH
|
||||||
|
sed "s|\$INSTALL_PATH|$INSTALL_DIR/i2p|g" eepget > a
|
||||||
|
rm eepget
|
||||||
|
mv a eepget
|
||||||
|
# runplain.sh %INSTALL_PATH and %SYSTEM_java_io_tmpdir
|
||||||
|
sed "s|%INSTALL_PATH|$INSTALL_DIR/i2p|g" runplain.sh > a
|
||||||
|
sed "s|%SYSTEM_java_io_tmpdir|/var/tmp|g" a > runplain.sh
|
||||||
|
# i2prouter %INSTALL_PATH and %SYSTEM_java_io_tmpdir
|
||||||
|
sed "s|%INSTALL_PATH|$INSTALL_DIR/i2p|g" i2prouter > a
|
||||||
|
sed "s|%SYSTEM_java_io_tmpdir|/var/tmp|g" a > i2prouter
|
||||||
|
|
||||||
|
chmod 744 ./i2prouter
|
||||||
|
chmod 744 ./osid
|
||||||
|
chmod 744 ./runplain.sh
|
||||||
|
chmod 744 ./eepget
|
||||||
|
chmod 744 ./scripts/i2pbench.sh
|
||||||
|
chmod 744 ./scripts/i2ptest.sh
|
||||||
|
rm -Rf ./lib/*.dll ./*.bat ./*.exe ./installer ./icons ./a postinstall.sh
|
||||||
|
|
||||||
mv $PKG/$INSTALL_DIR/i2p/*.config $PKG/install
|
mv $PKG/$INSTALL_DIR/i2p/*.config $PKG/install
|
||||||
mv $PKG/$INSTALL_DIR/i2p/blocklist.txt $PKG/$INSTALL_DIR/i2p/blocklist.txt.new
|
mv $PKG/$INSTALL_DIR/i2p/blocklist.txt $PKG/$INSTALL_DIR/i2p/blocklist.txt.new
|
||||||
mv $PKG/$INSTALL_DIR/i2p/eepsite/jetty.xml $PKG/$INSTALL_DIR/i2p/eepsite/jetty.xml.new
|
mv $PKG/$INSTALL_DIR/i2p/eepsite/jetty.xml $PKG/$INSTALL_DIR/i2p/eepsite/jetty.xml.new
|
||||||
@ -83,6 +111,13 @@ mv $PKG/$INSTALL_DIR/i2p/eepsite/docroot/index.html $PKG/$INSTALL_DIR/i2p/eepsit
|
|||||||
mv $PKG/$INSTALL_DIR/i2p/eepsite/docroot/favicon.ico $PKG/$INSTALL_DIR/i2p/eepsite/docroot/favicon.ico.new
|
mv $PKG/$INSTALL_DIR/i2p/eepsite/docroot/favicon.ico $PKG/$INSTALL_DIR/i2p/eepsite/docroot/favicon.ico.new
|
||||||
sed "s|directory|/$INSTALL_DIR/i2p/|g" $CWD/doinst.sh > $PKG/install/doinst.sh
|
sed "s|directory|/$INSTALL_DIR/i2p/|g" $CWD/doinst.sh > $PKG/install/doinst.sh
|
||||||
cat $CWD/slack-desc > $PKG/install/slack-desc
|
cat $CWD/slack-desc > $PKG/install/slack-desc
|
||||||
|
|
||||||
cd $PKG
|
cd $PKG
|
||||||
requiredbuilder -v -y -s $CWD $PKG
|
#
|
||||||
|
# requiredbuilder fucks up REALLY bad, and thinks java is perl?!
|
||||||
|
# It also did not catch the shell requirements! BOOOOOOOOOOO! HISSSSSSSS!
|
||||||
|
#
|
||||||
|
#requiredbuilder -v -y -s $CWD $PKG
|
||||||
|
#
|
||||||
|
cat $CWD/slack-required > $PKG/install/slack-required
|
||||||
makepkg -l y -c n $CWD/${NAME}-$VERSION-$ARCH-$BUILD.tgz
|
makepkg -l y -c n $CWD/${NAME}-$VERSION-$ARCH-$BUILD.tgz
|
||||||
|
@ -1,2 +1,4 @@
|
|||||||
glibc >= 2.7-i486-17 | glibc-solibs >= 2.7-i486-17
|
jre >= 5
|
||||||
perl >= 5.10.0-i486-1
|
i2p-base >= 0.0.1
|
||||||
|
bash >= 3.1.017
|
||||||
|
|
||||||
|
19
android/AndroidManifest.xml
Normal file
19
android/AndroidManifest.xml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="net.i2p.router"
|
||||||
|
android:versionCode="1"
|
||||||
|
android:versionName="1.0.0">
|
||||||
|
<uses-permission android:name="android.permission.INTERNET" />
|
||||||
|
<!-- 3 = 1.5, 2 = 1.1, 1 = 1.0; would probably work with 1 but don't have a 1.0 SDK to test against -->
|
||||||
|
<uses-sdk android:minSdkVersion="2" />
|
||||||
|
<application android:label="@string/app_name">
|
||||||
|
<activity android:name=".I2PAndroid"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:launchMode="singleTask" >
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.MAIN" />
|
||||||
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
</intent-filter>
|
||||||
|
</activity>
|
||||||
|
</application>
|
||||||
|
</manifest>
|
25
android/README.txt
Normal file
25
android/README.txt
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
These instructions are for the 1.5 SDK.
|
||||||
|
The build file is not compatible with the 1.1 SDK any more.
|
||||||
|
|
||||||
|
#Unzip the android SDK in ../../
|
||||||
|
#So then the android tools will be in ../../android-sdk-linux_x86-1.5_r2/tools/
|
||||||
|
|
||||||
|
#then build the android apk file:
|
||||||
|
ant debug
|
||||||
|
|
||||||
|
# Create the android 1.5 virtual device
|
||||||
|
# (don't make a custom hardware profile)
|
||||||
|
../../android-sdk-linux_x86-1.5_r2/tools/android create avd --name i2p --target 2
|
||||||
|
|
||||||
|
#then run the emulator:
|
||||||
|
../../android-sdk-linux_x86-1.5_r2/tools/emulator -avd i2p &
|
||||||
|
|
||||||
|
#then wait a couple minutes until the emulator is up
|
||||||
|
#then install the I2P app
|
||||||
|
ant install
|
||||||
|
|
||||||
|
#then run the debugger
|
||||||
|
../../android-sdk-linux_x86-1.5_r2/tools/ddms &
|
||||||
|
|
||||||
|
#to rebuild and reinstall to emulator:
|
||||||
|
ant reinstall
|
352
android/build.xml
Normal file
352
android/build.xml
Normal file
@ -0,0 +1,352 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project name=".I2PAndroid" default="help">
|
||||||
|
|
||||||
|
<!-- The local.properties file is created and updated by the 'android' tool.
|
||||||
|
It contain the path to the SDK. It should *NOT* be checked in in Version
|
||||||
|
Control Systems. -->
|
||||||
|
<property file="local.properties"/>
|
||||||
|
|
||||||
|
<!-- The build.properties file can be created by you and is never touched
|
||||||
|
by the 'android' tool. This is the place to change some of the default property values
|
||||||
|
used by the Ant rules.
|
||||||
|
Here are some properties you may want to change/update:
|
||||||
|
|
||||||
|
application-package
|
||||||
|
the name of your application package as defined in the manifest. Used by the
|
||||||
|
'uninstall' rule.
|
||||||
|
source-folder
|
||||||
|
the name of the source folder. Default is 'src'.
|
||||||
|
out-folder
|
||||||
|
the name of the output folder. Default is 'bin'.
|
||||||
|
|
||||||
|
Properties related to the SDK location or the project target should be updated
|
||||||
|
using the 'android' tool with the 'update' action.
|
||||||
|
|
||||||
|
This file is an integral part of the build system for your application and
|
||||||
|
should be checked in in Version Control Systems.
|
||||||
|
|
||||||
|
-->
|
||||||
|
<property file="build.properties"/>
|
||||||
|
|
||||||
|
<!-- The default.properties file is created and updated by the 'android' tool, as well
|
||||||
|
as ADT.
|
||||||
|
This file is an integral part of the build system for your application and
|
||||||
|
should be checked in in Version Control Systems. -->
|
||||||
|
<property file="default.properties"/>
|
||||||
|
|
||||||
|
<!-- Custom Android task to deal with the project target, and import the proper rules.
|
||||||
|
This requires ant 1.6.0 or above. -->
|
||||||
|
<path id="android.antlibs">
|
||||||
|
<pathelement path="${sdk-location}/tools/lib/anttasks.jar" />
|
||||||
|
<pathelement path="${sdk-location}/tools/lib/sdklib.jar" />
|
||||||
|
<pathelement path="${sdk-location}/tools/lib/androidprefs.jar" />
|
||||||
|
<pathelement path="${sdk-location}/tools/lib/apkbuilder.jar" />
|
||||||
|
<pathelement path="${sdk-location}/tools/lib/jarutils.jar" />
|
||||||
|
</path>
|
||||||
|
|
||||||
|
<taskdef name="setup"
|
||||||
|
classname="com.android.ant.SetupTask"
|
||||||
|
classpathref="android.antlibs"/>
|
||||||
|
|
||||||
|
<!-- Execute the Android Setup task that will setup some properties specific to the target,
|
||||||
|
and import the rules files.
|
||||||
|
To customize the rules, copy/paste them below the task, and disable import by setting
|
||||||
|
the import attribute to false:
|
||||||
|
<setup import="false" />
|
||||||
|
|
||||||
|
This will ensure that the properties are setup correctly but that your customized
|
||||||
|
targets are used.
|
||||||
|
-->
|
||||||
|
<setup import="false" />
|
||||||
|
|
||||||
|
<!--
|
||||||
|
================================================================================
|
||||||
|
New I2P rules
|
||||||
|
================================================================================
|
||||||
|
-->
|
||||||
|
|
||||||
|
<target name="buildrouter" depends="dirs" >
|
||||||
|
<!-- build router and core -->
|
||||||
|
<ant dir=".." target="buildrouter" />
|
||||||
|
|
||||||
|
<!-- router -->
|
||||||
|
<copy file="../build/router.jar" todir="${external-libs-folder}" />
|
||||||
|
|
||||||
|
<!-- core -->
|
||||||
|
<mkdir dir="tmp" />
|
||||||
|
<unjar src="../build/i2p.jar" dest="tmp/" />
|
||||||
|
<delete file="tmp/net/i2p/util/LogWriter.class" />
|
||||||
|
<!-- org.bouncycastle.crypto already in android
|
||||||
|
but we need a little trickery because our HMac is incompatible...
|
||||||
|
and the libs aren't in the SDK to compile against??? -->
|
||||||
|
<jar destfile="${external-libs-folder}/crypto.jar" >
|
||||||
|
<fileset dir="tmp/" >
|
||||||
|
<include name="org/bouncycastle/crypto/Digest.class" />
|
||||||
|
<include name="org/bouncycastle/crypto/Mac.class" />
|
||||||
|
<include name="org/bouncycastle/crypto/digests/GeneralDigest.class" />
|
||||||
|
<include name="org/bouncycastle/crypto/digests/MD5Digest.class" />
|
||||||
|
</fileset>
|
||||||
|
</jar>
|
||||||
|
<delete>
|
||||||
|
<fileset dir="tmp/" >
|
||||||
|
<include name="org/bouncycastle/crypto/Digest.class" />
|
||||||
|
<include name="org/bouncycastle/crypto/Mac.class" />
|
||||||
|
<include name="org/bouncycastle/crypto/digests/GeneralDigest.class" />
|
||||||
|
<include name="org/bouncycastle/crypto/digests/MD5Digest.class" />
|
||||||
|
</fileset>
|
||||||
|
</delete>
|
||||||
|
<!--
|
||||||
|
<delete dir="tmp/org/bouncycastle/" />
|
||||||
|
<delete file="tmp/net/i2p/crypto/HMACGenerator.class" />
|
||||||
|
-->
|
||||||
|
<delete file="tmp/org/bouncycastle/" />
|
||||||
|
<!-- lots of unneeded stuff could be deleted here -->
|
||||||
|
<jar destfile="${external-libs-folder}/i2p.jar" basedir="tmp/" />
|
||||||
|
|
||||||
|
<!-- some resources -->
|
||||||
|
<mkdir dir="res/drawable/" />
|
||||||
|
<copy file="../installer/resources/themes/console/images/i2plogo.png" todir="res/drawable/" />
|
||||||
|
<copy file="../installer/resources/blocklist.txt" tofile="res/raw/blocklist_txt" />
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="hackcleanup">
|
||||||
|
<delete file="${external-libs-folder}/crypto.jar" />
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
================================================================================
|
||||||
|
From here down copied from SDK platforms/android-1.1/templates/android_rules.xml
|
||||||
|
and then modified
|
||||||
|
================================================================================
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!--
|
||||||
|
This rules file is meant to be imported by the custom Ant task:
|
||||||
|
com.android.ant.AndroidInitTask
|
||||||
|
|
||||||
|
The following properties are put in place by the importing task:
|
||||||
|
android-jar, android-aidl, aapt, aidl, and dx
|
||||||
|
|
||||||
|
Additionnaly, the task sets up the following classpath reference:
|
||||||
|
android.target.classpath
|
||||||
|
This is used by the compiler task as the boot classpath.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- Custom tasks -->
|
||||||
|
<taskdef name="aaptexec"
|
||||||
|
classname="com.android.ant.AaptExecLoopTask"
|
||||||
|
classpathref="android.antlibs"/>
|
||||||
|
|
||||||
|
<taskdef name="apkbuilder"
|
||||||
|
classname="com.android.ant.ApkBuilderTask"
|
||||||
|
classpathref="android.antlibs"/>
|
||||||
|
|
||||||
|
<!-- Properties -->
|
||||||
|
|
||||||
|
<property name="android-tools" value="${sdk-location}/tools" />
|
||||||
|
|
||||||
|
<!-- Input directories -->
|
||||||
|
<property name="source-folder" value="src" />
|
||||||
|
<property name="gen-folder" value="gen" />
|
||||||
|
<property name="resource-folder" value="res" />
|
||||||
|
<property name="asset-folder" value="assets" />
|
||||||
|
<property name="source-location" value="${basedir}/${source-folder}" />
|
||||||
|
|
||||||
|
<!-- folder for the 3rd party java libraries -->
|
||||||
|
<property name="external-libs-folder" value="libs" />
|
||||||
|
|
||||||
|
<!-- folder for the native libraries -->
|
||||||
|
<property name="native-libs-folder" value="libs" />
|
||||||
|
|
||||||
|
<!-- Output directories -->
|
||||||
|
<property name="gen-folder" value="gen" />
|
||||||
|
<property name="out-folder" value="bin" />
|
||||||
|
<property name="out-classes" value="${out-folder}/classes" />
|
||||||
|
<property name="out-classes-location" value="${basedir}/${out-classes}"/>
|
||||||
|
<!-- out folders for a parent project if this project is an instrumentation project -->
|
||||||
|
<property name="main-out-folder" value="../${out-folder}" />
|
||||||
|
<property name="main-out-classes" value="${main-out-folder}/classes"/>
|
||||||
|
|
||||||
|
<!-- Intermediate files -->
|
||||||
|
<property name="dex-file" value="classes.dex" />
|
||||||
|
<property name="intermediate-dex" value="${out-folder}/${dex-file}" />
|
||||||
|
<!-- dx does not properly support incorrect / or \ based on the platform
|
||||||
|
and Ant cannot convert them because the parameter is not a valid path.
|
||||||
|
Because of this we have to compute different paths depending on the platform. -->
|
||||||
|
<condition property="intermediate-dex-location"
|
||||||
|
value="${basedir}\${intermediate-dex}"
|
||||||
|
else="${basedir}/${intermediate-dex}" >
|
||||||
|
<os family="windows"/>
|
||||||
|
</condition>
|
||||||
|
|
||||||
|
<!-- The final package file to generate -->
|
||||||
|
<property name="out-debug-package" value="${out-folder}/${ant.project.name}-debug.apk"/>
|
||||||
|
|
||||||
|
<!-- Tools -->
|
||||||
|
<condition property="exe" value=".exe" else=""><os family="windows"/></condition>
|
||||||
|
<property name="adb" value="${android-tools}/adb${exe}"/>
|
||||||
|
|
||||||
|
<!-- rules -->
|
||||||
|
|
||||||
|
<!-- Create the output directories if they don't exist yet. -->
|
||||||
|
<target name="dirs">
|
||||||
|
<echo>Creating output directories if needed...</echo>
|
||||||
|
<mkdir dir="${resource-folder}" />
|
||||||
|
<mkdir dir="${external-libs-folder}" />
|
||||||
|
<mkdir dir="${gen-folder}" />
|
||||||
|
<mkdir dir="${out-folder}" />
|
||||||
|
<mkdir dir="${out-classes}" />
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<!-- Generate the R.java file for this project's resources. -->
|
||||||
|
<target name="resource-src" depends="dirs">
|
||||||
|
<echo>Generating R.java / Manifest.java from the resources...</echo>
|
||||||
|
<exec executable="${aapt}" failonerror="true">
|
||||||
|
<arg value="package" />
|
||||||
|
<arg value="-m" />
|
||||||
|
<arg value="-J" />
|
||||||
|
<arg path="${gen-folder}" />
|
||||||
|
<arg value="-M" />
|
||||||
|
<arg path="AndroidManifest.xml" />
|
||||||
|
<arg value="-S" />
|
||||||
|
<arg path="${resource-folder}" />
|
||||||
|
<arg value="-I" />
|
||||||
|
<arg path="${android-jar}" />
|
||||||
|
</exec>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<!-- Generate java classes from .aidl files. -->
|
||||||
|
<target name="aidl" depends="dirs">
|
||||||
|
<echo>Compiling aidl files into Java classes...</echo>
|
||||||
|
<apply executable="${aidl}" failonerror="true">
|
||||||
|
<arg value="-p${android-aidl}" />
|
||||||
|
<arg value="-I${source-folder}" />
|
||||||
|
<arg value="-o${gen-folder}" />
|
||||||
|
<fileset dir="${source-folder}">
|
||||||
|
<include name="**/*.aidl"/>
|
||||||
|
</fileset>
|
||||||
|
</apply>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<!-- Compile this project's .java files into .class files. -->
|
||||||
|
<!-- I2P add buildrouter -->
|
||||||
|
<target name="compile" depends="buildrouter, resource-src, aidl">
|
||||||
|
<javac encoding="ascii" target="1.5" debug="true" extdirs=""
|
||||||
|
destdir="${out-classes}"
|
||||||
|
bootclasspathref="android.target.classpath">
|
||||||
|
<src path="${source-folder}" />
|
||||||
|
<src path="${gen-folder}" />
|
||||||
|
<classpath>
|
||||||
|
<fileset dir="${external-libs-folder}" includes="*.jar"/>
|
||||||
|
<pathelement path="${main-out-classes}"/>
|
||||||
|
</classpath>
|
||||||
|
</javac>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<!-- Convert this project's .class files into .dex files. -->
|
||||||
|
<!-- I2P add hackcleanup -->
|
||||||
|
<target name="dex" depends="compile, hackcleanup">
|
||||||
|
<echo>Converting compiled files and external libraries into ${out-folder}/${dex-file}...</echo>
|
||||||
|
<apply executable="${dx}" failonerror="true" parallel="true">
|
||||||
|
<!-- I2P this is a bad sign that we need this -->
|
||||||
|
<arg value="-JXmx256m" />
|
||||||
|
<arg value="--dex" />
|
||||||
|
<arg value="--output=${intermediate-dex-location}" />
|
||||||
|
<arg path="${out-classes-location}" />
|
||||||
|
<fileset dir="${external-libs-folder}" includes="*.jar"/>
|
||||||
|
</apply>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<!-- Put the project's resources into the output package file
|
||||||
|
This actually can create multiple resource package in case
|
||||||
|
Some custom apk with specific configuration have been
|
||||||
|
declared in default.properties.
|
||||||
|
-->
|
||||||
|
<target name="package-resources">
|
||||||
|
<echo>Packaging resources</echo>
|
||||||
|
<aaptexec executable="${aapt}"
|
||||||
|
command="package"
|
||||||
|
manifest="AndroidManifest.xml"
|
||||||
|
resources="${resource-folder}"
|
||||||
|
assets="${asset-folder}"
|
||||||
|
androidjar="${android-jar}"
|
||||||
|
outfolder="${out-folder}"
|
||||||
|
basename="${ant.project.name}" />
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<!-- Package the application and sign it with a debug key.
|
||||||
|
This is the default target when building. It is used for debug. -->
|
||||||
|
<target name="debug" depends="dex, package-resources">
|
||||||
|
<apkbuilder
|
||||||
|
outfolder="${out-folder}"
|
||||||
|
basename="${ant.project.name}"
|
||||||
|
signed="true"
|
||||||
|
verbose="false">
|
||||||
|
<file path="${intermediate-dex}" />
|
||||||
|
<sourcefolder path="${source-folder}" />
|
||||||
|
<jarfolder path="${external-libs-folder}" />
|
||||||
|
<nativefolder path="${native-libs-folder}" />
|
||||||
|
</apkbuilder>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<!-- Package the application without signing it.
|
||||||
|
This allows for the application to be signed later with an official publishing key. -->
|
||||||
|
<target name="release" depends="dex, package-resources">
|
||||||
|
<apkbuilder
|
||||||
|
outfolder="${out-folder}"
|
||||||
|
basename="${ant.project.name}"
|
||||||
|
signed="false"
|
||||||
|
verbose="false">
|
||||||
|
<file path="${intermediate-dex}" />
|
||||||
|
<sourcefolder path="${source-folder}" />
|
||||||
|
<jarfolder path="${external-libs-folder}" />
|
||||||
|
<nativefolder path="${native-libs-folder}" />
|
||||||
|
</apkbuilder>
|
||||||
|
<echo>All generated packages need to be signed with jarsigner before they are published.</echo>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<!-- Install the package on the default emulator -->
|
||||||
|
<target name="install" depends="debug">
|
||||||
|
<echo>Installing ${out-debug-package} onto default emulator...</echo>
|
||||||
|
<exec executable="${adb}" failonerror="true">
|
||||||
|
<arg value="install" />
|
||||||
|
<arg path="${out-debug-package}" />
|
||||||
|
</exec>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="reinstall" depends="debug">
|
||||||
|
<echo>Installing ${out-debug-package} onto default emulator...</echo>
|
||||||
|
<exec executable="${adb}" failonerror="true">
|
||||||
|
<arg value="install" />
|
||||||
|
<arg value="-r" />
|
||||||
|
<arg path="${out-debug-package}" />
|
||||||
|
</exec>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<!-- Uinstall the package from the default emulator -->
|
||||||
|
<target name="uninstall">
|
||||||
|
<echo>Uninstalling ${application-package} from the default emulator...</echo>
|
||||||
|
<exec executable="${adb}" failonerror="true">
|
||||||
|
<arg value="uninstall" />
|
||||||
|
<arg path="${application-package}" />
|
||||||
|
</exec>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="help">
|
||||||
|
<!-- displays starts at col 13
|
||||||
|
|13 80| -->
|
||||||
|
<echo>Android Ant Build. Available targets:</echo>
|
||||||
|
<echo> help: Displays this help.</echo>
|
||||||
|
<echo> debug: Builds the application and sign it with a debug key.</echo>
|
||||||
|
<echo> release: Builds the application. The generated apk file must be</echo>
|
||||||
|
<echo> signed before it is published.</echo>
|
||||||
|
<echo> install: Installs the debug package onto a running emulator or</echo>
|
||||||
|
<echo> device. This can only be used if the application has </echo>
|
||||||
|
<echo> not yet been installed.</echo>
|
||||||
|
<echo> reinstall: Installs the debug package on a running emulator or</echo>
|
||||||
|
<echo> device that already has the application.</echo>
|
||||||
|
<echo> The signatures must match.</echo>
|
||||||
|
<echo> uninstall: uninstall the application from a running emulator or</echo>
|
||||||
|
<echo> device.</echo>
|
||||||
|
</target>
|
||||||
|
</project>
|
11
android/default.properties
Normal file
11
android/default.properties
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# This file is automatically generated by Android Tools.
|
||||||
|
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
|
||||||
|
#
|
||||||
|
# This file must be checked in Version Control Systems.
|
||||||
|
#
|
||||||
|
# To customize properties used by the Ant build system use,
|
||||||
|
# "build.properties", and override values to adapt the script to your
|
||||||
|
# project structure.
|
||||||
|
|
||||||
|
# Project target.
|
||||||
|
target=android-2
|
18
android/res/layout/main.xml
Normal file
18
android/res/layout/main.xml
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="fill_parent"
|
||||||
|
>
|
||||||
|
<TextView
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Hello World, I2PAndroid"
|
||||||
|
/>
|
||||||
|
<ImageView
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:src="@drawable/i2plogo"
|
||||||
|
/>
|
||||||
|
</LinearLayout>
|
||||||
|
|
3
android/res/raw/logger_config
Normal file
3
android/res/raw/logger_config
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
logger.defaultLevel=INFO
|
||||||
|
logger.record.net.i2p.router.transport.FIFOBandwidthRefiller=ERROR
|
||||||
|
logger.record.net.i2p.stat.Rate=ERROR
|
16
android/res/raw/router_config
Normal file
16
android/res/raw/router_config
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
# initial router.config
|
||||||
|
# temp directory
|
||||||
|
i2p.dir.temp=/data/data/net.i2p.router/files/tmp
|
||||||
|
i2p.dir.pid=/data/data/net.i2p.router/files/tmp
|
||||||
|
# save memory
|
||||||
|
prng.buffers=2
|
||||||
|
router.decayingBloomFilterM=20
|
||||||
|
stat.full=false
|
||||||
|
i2np.udp.maxConnections=30
|
||||||
|
# no I2CP
|
||||||
|
i2p.dummyClientFacade=true
|
||||||
|
# for now
|
||||||
|
i2np.ntcp.enable=false
|
||||||
|
# not on android
|
||||||
|
i2np.upnp.enable=false
|
||||||
|
routerconsole.geoip.enable=false
|
4
android/res/values/strings.xml
Normal file
4
android/res/values/strings.xml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<string name="app_name">I2PAndroid</string>
|
||||||
|
</resources>
|
142
android/src/net/i2p/router/I2PAndroid.java
Normal file
142
android/src/net/i2p/router/I2PAndroid.java
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
package net.i2p.router;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.res.Resources;
|
||||||
|
import android.content.res.Resources.NotFoundException;
|
||||||
|
import android.os.Bundle;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import net.i2p.router.Router;
|
||||||
|
import net.i2p.router.RouterLaunch;
|
||||||
|
// import net.i2p.util.NativeBigInteger;
|
||||||
|
|
||||||
|
public class I2PAndroid extends Activity
|
||||||
|
{
|
||||||
|
static Context _context;
|
||||||
|
private static final String DIR = "/data/data/net.i2p.router/files";
|
||||||
|
|
||||||
|
/** Called when the activity is first created. */
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState)
|
||||||
|
{
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.main);
|
||||||
|
|
||||||
|
_context = this; // Activity extends Context
|
||||||
|
debugStuff();
|
||||||
|
initialize();
|
||||||
|
// 300ms per run
|
||||||
|
// 5x slower than java on my server and 50x slower than native on my server
|
||||||
|
// NativeBigInteger.main(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onRestart()
|
||||||
|
{
|
||||||
|
System.err.println("onRestart called");
|
||||||
|
super.onRestart();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onStart()
|
||||||
|
{
|
||||||
|
System.err.println("onStart called");
|
||||||
|
super.onStart();
|
||||||
|
RouterLaunch.main(null);
|
||||||
|
System.err.println("Router.main finished");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onResume()
|
||||||
|
{
|
||||||
|
System.err.println("onResume called");
|
||||||
|
super.onResume();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onPause()
|
||||||
|
{
|
||||||
|
System.err.println("onPause called");
|
||||||
|
super.onPause();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onStop()
|
||||||
|
{
|
||||||
|
System.err.println("onStop called");
|
||||||
|
super.onStop();
|
||||||
|
|
||||||
|
// from routerconsole ContextHelper
|
||||||
|
List contexts = RouterContext.listContexts();
|
||||||
|
if ( (contexts == null) || (contexts.size() <= 0) )
|
||||||
|
throw new IllegalStateException("No contexts. This is usually because the router is either starting up or shutting down.");
|
||||||
|
RouterContext ctx = (RouterContext)contexts.get(0);
|
||||||
|
|
||||||
|
// shutdown() doesn't return so use shutdownGracefully()
|
||||||
|
ctx.router().shutdownGracefully(Router.EXIT_HARD);
|
||||||
|
System.err.println("shutdown complete");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onDestroy()
|
||||||
|
{
|
||||||
|
System.err.println("onDestroy called");
|
||||||
|
super.onDestroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Context getContext() {
|
||||||
|
return _context;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void debugStuff() {
|
||||||
|
System.err.println("java.io.tmpdir" + ": " + System.getProperty("java.io.tmpdir"));
|
||||||
|
System.err.println("java.vendor" + ": " + System.getProperty("java.vendor"));
|
||||||
|
System.err.println("java.version" + ": " + System.getProperty("java.version"));
|
||||||
|
System.err.println("os.arch" + ": " + System.getProperty("os.arch"));
|
||||||
|
System.err.println("os.name" + ": " + System.getProperty("os.name"));
|
||||||
|
System.err.println("os.version" + ": " + System.getProperty("os.version"));
|
||||||
|
System.err.println("user.dir" + ": " + System.getProperty("user.dir"));
|
||||||
|
System.err.println("user.home" + ": " + System.getProperty("user.home"));
|
||||||
|
System.err.println("user.name" + ": " + System.getProperty("user.name"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initialize() {
|
||||||
|
// Until we can edit the router.config on the device,
|
||||||
|
// copy it from the resource every time.
|
||||||
|
// File f = new I2PFile("router.config");
|
||||||
|
// if (!f.exists()) {
|
||||||
|
copyResourceToFile(R.raw.router_config, "router.config");
|
||||||
|
copyResourceToFile(R.raw.logger_config, "logger.config");
|
||||||
|
copyResourceToFile(R.raw.blocklist_txt, "blocklist.txt");
|
||||||
|
// }
|
||||||
|
|
||||||
|
// Set up the locations so Router and WorkingDir can find them
|
||||||
|
System.setProperty("i2p.dir.base", DIR);
|
||||||
|
System.setProperty("i2p.dir.config", DIR);
|
||||||
|
System.setProperty("wrapper.logfile", DIR + "/wrapper.log");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void copyResourceToFile(int resID, String f) {
|
||||||
|
InputStream in = null;
|
||||||
|
FileOutputStream out = null;
|
||||||
|
|
||||||
|
System.err.println("Creating file " + f + " from resource");
|
||||||
|
byte buf[] = new byte[4096];
|
||||||
|
try {
|
||||||
|
// Context methods
|
||||||
|
in = getResources().openRawResource(resID);
|
||||||
|
out = openFileOutput(f, 0);
|
||||||
|
|
||||||
|
int read = 0;
|
||||||
|
while ( (read = in.read(buf)) != -1)
|
||||||
|
out.write(buf, 0, read);
|
||||||
|
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
} catch (Resources.NotFoundException nfe) {
|
||||||
|
} finally {
|
||||||
|
if (in != null) try { in.close(); } catch (IOException ioe) {}
|
||||||
|
if (out != null) try { out.close(); } catch (IOException ioe) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
163
android/src/net/i2p/util/LogWriter.java
Normal file
163
android/src/net/i2p/util/LogWriter.java
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
package net.i2p.util;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* public domain
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* bridge to android logging
|
||||||
|
*
|
||||||
|
* @author zzz
|
||||||
|
*/
|
||||||
|
class LogWriter implements Runnable {
|
||||||
|
private final static long CONFIG_READ_ITERVAL = 10 * 1000;
|
||||||
|
private long _lastReadConfig = 0;
|
||||||
|
private long _numBytesInCurrentFile = 0;
|
||||||
|
private OutputStream _currentOut; // = System.out
|
||||||
|
private int _rotationNum = -1;
|
||||||
|
private String _logFilenamePattern;
|
||||||
|
private File _currentFile;
|
||||||
|
private LogManager _manager;
|
||||||
|
|
||||||
|
private boolean _write;
|
||||||
|
|
||||||
|
private LogWriter() { // nop
|
||||||
|
}
|
||||||
|
|
||||||
|
public LogWriter(LogManager manager) {
|
||||||
|
_manager = manager;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stopWriting() {
|
||||||
|
_write = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
_write = true;
|
||||||
|
try {
|
||||||
|
while (_write) {
|
||||||
|
flushRecords();
|
||||||
|
rereadConfig();
|
||||||
|
}
|
||||||
|
System.err.println("Done writing");
|
||||||
|
} catch (Exception e) {
|
||||||
|
System.err.println("Error writing the logs: " + e.getMessage());
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void flushRecords() { flushRecords(true); }
|
||||||
|
public void flushRecords(boolean shouldWait) {
|
||||||
|
try {
|
||||||
|
List records = _manager._removeAll();
|
||||||
|
if (records == null) return;
|
||||||
|
for (int i = 0; i < records.size(); i++) {
|
||||||
|
LogRecord rec = (LogRecord) records.get(i);
|
||||||
|
writeRecord(rec);
|
||||||
|
}
|
||||||
|
} catch (Throwable t) {
|
||||||
|
t.printStackTrace();
|
||||||
|
} finally {
|
||||||
|
if (shouldWait) {
|
||||||
|
try {
|
||||||
|
synchronized (this) {
|
||||||
|
this.wait(10*1000);
|
||||||
|
}
|
||||||
|
} catch (InterruptedException ie) { // nop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String currentFile() {
|
||||||
|
return _currentFile != null ? _currentFile.getAbsolutePath() : "uninitialized";
|
||||||
|
}
|
||||||
|
|
||||||
|
private void rereadConfig() {
|
||||||
|
long now = Clock.getInstance().now();
|
||||||
|
if (now - _lastReadConfig > CONFIG_READ_ITERVAL) {
|
||||||
|
_manager.rereadConfig();
|
||||||
|
_lastReadConfig = now;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void writeRecord(LogRecord rec) {
|
||||||
|
if (rec.getThrowable() == null)
|
||||||
|
log(rec.getPriority(), rec.getSource(), rec.getSourceName(), rec.getThreadName(), rec.getMessage());
|
||||||
|
else
|
||||||
|
log(rec.getPriority(), rec.getSource(), rec.getSourceName(), rec.getThreadName(), rec.getMessage(), rec.getThrowable());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void log(int priority, Class src, String name, String threadName, String msg) {
|
||||||
|
if (src != null) {
|
||||||
|
String tag = src.getName();
|
||||||
|
int dot = tag.lastIndexOf(".");
|
||||||
|
if (dot >= 0)
|
||||||
|
tag = tag.substring(dot + 1);
|
||||||
|
android.util.Log.println(toAndroidLevel(priority),
|
||||||
|
tag,
|
||||||
|
'[' + threadName + "] " + msg);
|
||||||
|
} else if (name != null)
|
||||||
|
android.util.Log.println(toAndroidLevel(priority),
|
||||||
|
name,
|
||||||
|
'[' + threadName + "] " + msg);
|
||||||
|
else
|
||||||
|
android.util.Log.println(toAndroidLevel(priority),
|
||||||
|
threadName, msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void log(int priority, Class src, String name, String threadName, String msg, Throwable t) {
|
||||||
|
if (src != null) {
|
||||||
|
String tag = src.getName();
|
||||||
|
int dot = tag.lastIndexOf(".");
|
||||||
|
if (dot >= 0)
|
||||||
|
tag = tag.substring(dot + 1);
|
||||||
|
android.util.Log.println(toAndroidLevel(priority),
|
||||||
|
tag,
|
||||||
|
'[' + threadName + "] " + msg +
|
||||||
|
' ' + t.toString() + ' ' + android.util.Log.getStackTraceString(t));
|
||||||
|
} else if (name != null)
|
||||||
|
android.util.Log.println(toAndroidLevel(priority),
|
||||||
|
name,
|
||||||
|
'[' + threadName + "] " + msg +
|
||||||
|
' ' + t.toString() + ' ' + android.util.Log.getStackTraceString(t));
|
||||||
|
else
|
||||||
|
android.util.Log.println(toAndroidLevel(priority),
|
||||||
|
threadName,
|
||||||
|
msg + ' ' + t.toString() + ' ' + android.util.Log.getStackTraceString(t));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int toAndroidLevel(int level) {
|
||||||
|
switch (level) {
|
||||||
|
case Log.DEBUG:
|
||||||
|
return android.util.Log.DEBUG;
|
||||||
|
case Log.INFO:
|
||||||
|
return android.util.Log.INFO;
|
||||||
|
case Log.WARN:
|
||||||
|
return android.util.Log.WARN;
|
||||||
|
case Log.ERROR:
|
||||||
|
case Log.CRIT:
|
||||||
|
default:
|
||||||
|
return android.util.Log.ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final String replace(String pattern, int num) {
|
||||||
|
char c[] = pattern.toCharArray();
|
||||||
|
StringBuffer buf = new StringBuffer();
|
||||||
|
for (int i = 0; i < c.length; i++) {
|
||||||
|
if ( (c[i] != '#') && (c[i] != '@') )
|
||||||
|
buf.append(c[i]);
|
||||||
|
else
|
||||||
|
buf.append(num);
|
||||||
|
}
|
||||||
|
return buf.toString();
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project-private xmlns="http://www.netbeans.org/ns/project-private/1">
|
<project-private xmlns="http://www.netbeans.org/ns/project-private/1">
|
||||||
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/1"/>
|
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/1"/>
|
||||||
|
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/1">
|
||||||
|
<file>file:/usblv/NetBeansProjects/wi2p.i2p/apps/BOB/src/net/i2p/BOB/BOB.java</file>
|
||||||
|
</open-files>
|
||||||
</project-private>
|
</project-private>
|
||||||
|
@ -23,14 +23,20 @@
|
|||||||
*/
|
*/
|
||||||
package net.i2p.BOB;
|
package net.i2p.BOB;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.net.ConnectException;
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.net.ServerSocket;
|
import java.net.ServerSocket;
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
|
import java.net.SocketTimeoutException;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
|
import net.i2p.I2PAppContext;
|
||||||
import net.i2p.client.I2PClient;
|
import net.i2p.client.I2PClient;
|
||||||
import net.i2p.client.streaming.RetransmissionTimer;
|
import net.i2p.client.streaming.RetransmissionTimer;
|
||||||
import net.i2p.util.Log;
|
import net.i2p.util.Log;
|
||||||
@ -114,10 +120,15 @@ public class BOB {
|
|||||||
public final static String PROP_CONFIG_LOCATION = "BOB.config";
|
public final static String PROP_CONFIG_LOCATION = "BOB.config";
|
||||||
public final static String PROP_BOB_PORT = "BOB.port";
|
public final static String PROP_BOB_PORT = "BOB.port";
|
||||||
public final static String PROP_BOB_HOST = "BOB.host";
|
public final static String PROP_BOB_HOST = "BOB.host";
|
||||||
private static int maxConnections = 0;
|
|
||||||
private static NamedDB database;
|
private static NamedDB database;
|
||||||
private static Properties props = new Properties();
|
private static Properties props = new Properties();
|
||||||
|
private static AtomicBoolean spin = new AtomicBoolean(true);
|
||||||
|
private static final String P_RUNNING = "RUNNING";
|
||||||
|
private static final String P_STARTING = "STARTING";
|
||||||
|
private static final String P_STOPPING = "STOPPING";
|
||||||
|
private static AtomicBoolean lock = new AtomicBoolean(false);
|
||||||
|
// no longer used.
|
||||||
|
// private static int maxConnections = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Log a warning
|
* Log a warning
|
||||||
@ -149,6 +160,13 @@ public class BOB {
|
|||||||
_log.error(arg);
|
_log.error(arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stop BOB gracefully
|
||||||
|
*/
|
||||||
|
public static void stop() {
|
||||||
|
spin.set(false);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Listen for incoming connections and handle them
|
* Listen for incoming connections and handle them
|
||||||
*
|
*
|
||||||
@ -156,6 +174,7 @@ public class BOB {
|
|||||||
*/
|
*/
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
database = new NamedDB();
|
database = new NamedDB();
|
||||||
|
ServerSocket listener = null;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
boolean save = false;
|
boolean save = false;
|
||||||
// Set up all defaults to be passed forward to other threads.
|
// Set up all defaults to be passed forward to other threads.
|
||||||
@ -168,77 +187,182 @@ public class BOB {
|
|||||||
i = Y.hashCode();
|
i = Y.hashCode();
|
||||||
i = Y1.hashCode();
|
i = Y1.hashCode();
|
||||||
i = Y2.hashCode();
|
i = Y2.hashCode();
|
||||||
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
FileInputStream fi = new FileInputStream(configLocation);
|
|
||||||
props.load(fi);
|
|
||||||
fi.close();
|
|
||||||
} catch(FileNotFoundException fnfe) {
|
|
||||||
warn("Unable to load up the BOB config file " + configLocation + ", Using defaults.");
|
|
||||||
warn(fnfe.toString());
|
|
||||||
save = true;
|
|
||||||
} catch(IOException ioe) {
|
|
||||||
warn("IOException on BOB config file " + configLocation + ", using defaults.");
|
|
||||||
warn(ioe.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Global router and client API configurations that are missing are set to defaults here.
|
|
||||||
if(!props.containsKey(I2PClient.PROP_TCP_HOST)) {
|
|
||||||
props.setProperty(I2PClient.PROP_TCP_HOST, "localhost");
|
|
||||||
}
|
|
||||||
if(!props.containsKey(I2PClient.PROP_TCP_PORT)) {
|
|
||||||
props.setProperty(I2PClient.PROP_TCP_PORT, "7654");
|
|
||||||
}
|
|
||||||
if(!props.containsKey(I2PClient.PROP_RELIABILITY)) {
|
|
||||||
props.setProperty(I2PClient.PROP_RELIABILITY, I2PClient.PROP_RELIABILITY_BEST_EFFORT);
|
|
||||||
}
|
|
||||||
if(!props.containsKey(PROP_BOB_PORT)) {
|
|
||||||
props.setProperty(PROP_BOB_PORT, "2827"); // 0xB0B
|
|
||||||
}
|
|
||||||
if(!props.containsKey("inbound.length")) {
|
|
||||||
props.setProperty("inbound.length", "1");
|
|
||||||
}
|
|
||||||
if(!props.containsKey("outbound.length")) {
|
|
||||||
props.setProperty("outbound.length", "1");
|
|
||||||
}
|
|
||||||
if(!props.containsKey("inbound.lengthVariance")) {
|
|
||||||
props.setProperty("inbound.lengthVariance", "0");
|
|
||||||
}
|
|
||||||
if(!props.containsKey("outbound.lengthVariance")) {
|
|
||||||
props.setProperty("outbound.lengthVariance", "0");
|
|
||||||
}
|
|
||||||
if(!props.containsKey(PROP_BOB_HOST)) {
|
|
||||||
props.setProperty(PROP_BOB_HOST, "localhost");
|
|
||||||
}
|
|
||||||
if(save) {
|
|
||||||
try {
|
|
||||||
warn("Writing new defaults file " + configLocation);
|
|
||||||
FileOutputStream fo = new FileOutputStream(configLocation);
|
|
||||||
props.store(fo, configLocation);
|
|
||||||
fo.close();
|
|
||||||
} catch(IOException ioe) {
|
|
||||||
error("IOException on BOB config file " + configLocation + ", " + ioe);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
i = 0;
|
|
||||||
try {
|
try {
|
||||||
info("BOB is now running.");
|
{
|
||||||
ServerSocket listener = new ServerSocket(Integer.parseInt(props.getProperty(PROP_BOB_PORT)), 10, InetAddress.getByName(props.getProperty(PROP_BOB_HOST)));
|
File cfg = new File(configLocation);
|
||||||
Socket server;
|
if (!cfg.isAbsolute()) {
|
||||||
|
cfg = new File(I2PAppContext.getGlobalContext().getConfigDir(), configLocation);
|
||||||
while((i++ < maxConnections) || (maxConnections == 0)) {
|
}
|
||||||
//DoCMDS connection;
|
try {
|
||||||
|
FileInputStream fi = new FileInputStream(cfg);
|
||||||
server = listener.accept();
|
props.load(fi);
|
||||||
DoCMDS conn_c = new DoCMDS(server, props, database, _log);
|
fi.close();
|
||||||
Thread t = new Thread(conn_c);
|
} catch (FileNotFoundException fnfe) {
|
||||||
t.start();
|
warn("Unable to load up the BOB config file " + cfg.getAbsolutePath() + ", Using defaults.");
|
||||||
|
warn(fnfe.toString());
|
||||||
|
save = true;
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
warn("IOException on BOB config file " + cfg.getAbsolutePath() + ", using defaults.");
|
||||||
|
warn(ioe.toString());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} catch(IOException ioe) {
|
// Global router and client API configurations that are missing are set to defaults here.
|
||||||
error("IOException on socket listen: " + ioe);
|
if (!props.containsKey(I2PClient.PROP_TCP_HOST)) {
|
||||||
ioe.printStackTrace();
|
props.setProperty(I2PClient.PROP_TCP_HOST, "localhost");
|
||||||
|
}
|
||||||
|
if (!props.containsKey(I2PClient.PROP_TCP_PORT)) {
|
||||||
|
props.setProperty(I2PClient.PROP_TCP_PORT, "7654");
|
||||||
|
}
|
||||||
|
if (!props.containsKey(I2PClient.PROP_RELIABILITY)) {
|
||||||
|
props.setProperty(I2PClient.PROP_RELIABILITY, I2PClient.PROP_RELIABILITY_BEST_EFFORT);
|
||||||
|
}
|
||||||
|
if (!props.containsKey(PROP_BOB_PORT)) {
|
||||||
|
props.setProperty(PROP_BOB_PORT, "2827"); // 0xB0B
|
||||||
|
}
|
||||||
|
if (!props.containsKey("inbound.length")) {
|
||||||
|
props.setProperty("inbound.length", "1");
|
||||||
|
}
|
||||||
|
if (!props.containsKey("outbound.length")) {
|
||||||
|
props.setProperty("outbound.length", "1");
|
||||||
|
}
|
||||||
|
if (!props.containsKey("inbound.lengthVariance")) {
|
||||||
|
props.setProperty("inbound.lengthVariance", "0");
|
||||||
|
}
|
||||||
|
if (!props.containsKey("outbound.lengthVariance")) {
|
||||||
|
props.setProperty("outbound.lengthVariance", "0");
|
||||||
|
}
|
||||||
|
if (!props.containsKey(PROP_BOB_HOST)) {
|
||||||
|
props.setProperty(PROP_BOB_HOST, "localhost");
|
||||||
|
}
|
||||||
|
if (save) {
|
||||||
|
File cfg = new File(configLocation);
|
||||||
|
if (!cfg.isAbsolute()) {
|
||||||
|
cfg = new File(I2PAppContext.getGlobalContext().getConfigDir(), configLocation);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
warn("Writing new defaults file " + cfg.getAbsolutePath());
|
||||||
|
FileOutputStream fo = new FileOutputStream(cfg);
|
||||||
|
props.store(fo, cfg.getAbsolutePath());
|
||||||
|
fo.close();
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
error("IOException on BOB config file " + cfg.getAbsolutePath() + ", " + ioe);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
boolean g = false;
|
||||||
|
try {
|
||||||
|
info("BOB is now running.");
|
||||||
|
listener = new ServerSocket(Integer.parseInt(props.getProperty(PROP_BOB_PORT)), 10, InetAddress.getByName(props.getProperty(PROP_BOB_HOST)));
|
||||||
|
Socket server = null;
|
||||||
|
listener.setSoTimeout(500); // .5 sec
|
||||||
|
while (spin.get()) {
|
||||||
|
//DoCMDS connection;
|
||||||
|
|
||||||
|
try {
|
||||||
|
server = listener.accept();
|
||||||
|
g = true;
|
||||||
|
} catch (ConnectException ce) {
|
||||||
|
g = false;
|
||||||
|
} catch (SocketTimeoutException ste) {
|
||||||
|
g = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g) {
|
||||||
|
DoCMDS conn_c = new DoCMDS(spin, lock, server, props, database, _log);
|
||||||
|
Thread t = new Thread(conn_c);
|
||||||
|
t.setName("BOB.DoCMDS " + i);
|
||||||
|
t.start();
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
error("IOException on socket listen: " + ioe);
|
||||||
|
ioe.printStackTrace();
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
info("BOB is now shutting down...");
|
||||||
|
// Clean up everything.
|
||||||
|
try {
|
||||||
|
listener.close();
|
||||||
|
} catch (Exception ex) {
|
||||||
|
// nop
|
||||||
|
}
|
||||||
|
// Find all our "BOB.DoCMDS" threads, wait for them to be finished.
|
||||||
|
// We could order them to stop, but that could cause nasty issues in the locks.
|
||||||
|
visitAllThreads();
|
||||||
|
database.getReadLock();
|
||||||
|
int all = database.getcount();
|
||||||
|
database.releaseReadLock();
|
||||||
|
NamedDB nickinfo;
|
||||||
|
for (i = 0; i < all; i++) {
|
||||||
|
database.getReadLock();
|
||||||
|
nickinfo = (NamedDB) database.getnext(i);
|
||||||
|
nickinfo.getReadLock();
|
||||||
|
if (nickinfo.get(P_RUNNING).equals(Boolean.TRUE) && nickinfo.get(P_STOPPING).equals(Boolean.FALSE) && nickinfo.get(P_STARTING).equals(Boolean.FALSE)) {
|
||||||
|
nickinfo.releaseReadLock();
|
||||||
|
database.releaseReadLock();
|
||||||
|
database.getWriteLock();
|
||||||
|
nickinfo.getWriteLock();
|
||||||
|
nickinfo.add(P_STOPPING, new Boolean(true));
|
||||||
|
nickinfo.releaseWriteLock();
|
||||||
|
database.releaseWriteLock();
|
||||||
|
} else {
|
||||||
|
nickinfo.releaseReadLock();
|
||||||
|
database.releaseReadLock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
info("BOB is now stopped.");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find the root thread group,
|
||||||
|
* then find all theads with certain names and wait for them all to be dead.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private static void visitAllThreads() {
|
||||||
|
ThreadGroup root = Thread.currentThread().getThreadGroup().getParent();
|
||||||
|
while (root.getParent() != null) {
|
||||||
|
root = root.getParent();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Visit each thread group
|
||||||
|
waitjoin(root, 0, root.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void waitjoin(ThreadGroup group, int level, String tn) {
|
||||||
|
// Get threads in `group'
|
||||||
|
int numThreads = group.activeCount();
|
||||||
|
Thread[] threads = new Thread[numThreads * 2];
|
||||||
|
numThreads = group.enumerate(threads, false);
|
||||||
|
// Enumerate each thread in `group' and wait for it to stop if it is one of ours.
|
||||||
|
for (int i = 0; i < numThreads; i++) {
|
||||||
|
// Get thread
|
||||||
|
Thread thread = threads[i];
|
||||||
|
if (thread.getName().startsWith("BOB.DoCMDS ")) {
|
||||||
|
try {
|
||||||
|
if (thread.isAlive()) {
|
||||||
|
try {
|
||||||
|
thread.join();
|
||||||
|
} catch (InterruptedException ex) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (SecurityException se) {
|
||||||
|
//nop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get thread subgroups of `group'
|
||||||
|
int numGroups = group.activeGroupCount();
|
||||||
|
ThreadGroup[] groups = new ThreadGroup[numGroups * 2];
|
||||||
|
numGroups = group.enumerate(groups, false);
|
||||||
|
|
||||||
|
// Recursively visit each subgroup
|
||||||
|
for (int i = 0; i < numGroups; i++) {
|
||||||
|
waitjoin(groups[i], level + 1, groups[i].getName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -25,6 +25,7 @@ package net.i2p.BOB;
|
|||||||
|
|
||||||
import java.net.ConnectException;
|
import java.net.ConnectException;
|
||||||
import java.net.SocketTimeoutException;
|
import java.net.SocketTimeoutException;
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import net.i2p.I2PException;
|
import net.i2p.I2PException;
|
||||||
import net.i2p.client.streaming.I2PServerSocket;
|
import net.i2p.client.streaming.I2PServerSocket;
|
||||||
import net.i2p.client.streaming.I2PSocket;
|
import net.i2p.client.streaming.I2PSocket;
|
||||||
@ -43,6 +44,7 @@ public class I2Plistener implements Runnable {
|
|||||||
// private int tgwatch;
|
// private int tgwatch;
|
||||||
public I2PSocketManager socketManager;
|
public I2PSocketManager socketManager;
|
||||||
public I2PServerSocket serverSocket;
|
public I2PServerSocket serverSocket;
|
||||||
|
private AtomicBoolean lives;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
@ -52,13 +54,14 @@ public class I2Plistener implements Runnable {
|
|||||||
* @param database
|
* @param database
|
||||||
* @param _log
|
* @param _log
|
||||||
*/
|
*/
|
||||||
I2Plistener(I2PServerSocket SS, I2PSocketManager S, NamedDB info, NamedDB database, Log _log) {
|
I2Plistener(I2PServerSocket SS, I2PSocketManager S, NamedDB info, NamedDB database, Log _log, AtomicBoolean lives) {
|
||||||
this.database = database;
|
this.database = database;
|
||||||
this.info = info;
|
this.info = info;
|
||||||
this._log = _log;
|
this._log = _log;
|
||||||
this.socketManager = S;
|
this.socketManager = S;
|
||||||
serverSocket = SS;
|
this.serverSocket = SS;
|
||||||
// tgwatch = 1;
|
// tgwatch = 1;
|
||||||
|
this.lives = lives;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void rlock() throws Exception {
|
private void rlock() throws Exception {
|
||||||
@ -78,91 +81,43 @@ public class I2Plistener implements Runnable {
|
|||||||
public void run() {
|
public void run() {
|
||||||
boolean g = false;
|
boolean g = false;
|
||||||
I2PSocket sessSocket = null;
|
I2PSocket sessSocket = null;
|
||||||
|
int conn = 0;
|
||||||
die: {
|
try {
|
||||||
|
die:
|
||||||
serverSocket.setSoTimeout(50);
|
{
|
||||||
// try {
|
|
||||||
// if (info.exists("INPORT")) {
|
|
||||||
// tgwatch = 2;
|
|
||||||
// }
|
|
||||||
// } catch (Exception e) {
|
|
||||||
// try {
|
|
||||||
// runlock();
|
|
||||||
// } catch (Exception e2) {
|
|
||||||
// break die;
|
|
||||||
// }
|
|
||||||
// break die;
|
|
||||||
// }
|
|
||||||
boolean spin = true;
|
|
||||||
while (spin) {
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
rlock();
|
serverSocket.setSoTimeout(50);
|
||||||
} catch (Exception e) {
|
|
||||||
break die;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
spin = info.get("RUNNING").equals(Boolean.TRUE);
|
|
||||||
} catch (Exception e) {
|
|
||||||
try {
|
|
||||||
runlock();
|
|
||||||
} catch (Exception e2) {
|
|
||||||
break die;
|
|
||||||
}
|
|
||||||
break die;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
try {
|
|
||||||
sessSocket = serverSocket.accept();
|
|
||||||
g = true;
|
|
||||||
} catch (ConnectException ce) {
|
|
||||||
g = false;
|
|
||||||
} catch (SocketTimeoutException ste) {
|
|
||||||
g = false;
|
|
||||||
}
|
|
||||||
if (g) {
|
|
||||||
g = false;
|
|
||||||
// toss the connection to a new thread.
|
|
||||||
I2PtoTCP conn_c = new I2PtoTCP(sessSocket, info, database);
|
|
||||||
Thread t = new Thread(conn_c, "BOBI2PtoTCP");
|
|
||||||
t.start();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
while (lives.get()) {
|
||||||
|
try {
|
||||||
|
sessSocket = serverSocket.accept();
|
||||||
|
g = true;
|
||||||
|
} catch (ConnectException ce) {
|
||||||
|
g = false;
|
||||||
|
} catch (SocketTimeoutException ste) {
|
||||||
|
g = false;
|
||||||
|
}
|
||||||
|
if (g) {
|
||||||
|
g = false;
|
||||||
|
conn++;
|
||||||
|
// toss the connection to a new thread.
|
||||||
|
I2PtoTCP conn_c = new I2PtoTCP(sessSocket, info, database, lives);
|
||||||
|
Thread t = new Thread(conn_c, Thread.currentThread().getName() + " I2PtoTCP " + conn);
|
||||||
|
t.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
} catch (I2PException e) {
|
} catch (I2PException e) {
|
||||||
// System.out.println("Exception " + e);
|
// bad shit
|
||||||
|
System.out.println("Exception " + e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} finally {
|
||||||
|
try {
|
||||||
|
serverSocket.close();
|
||||||
|
} catch (I2PException ex) {
|
||||||
|
}
|
||||||
// System.out.println("I2Plistener: Close");
|
// System.out.println("I2Plistener: Close");
|
||||||
|
}
|
||||||
|
|
||||||
// Previous level does this cleanup now.
|
|
||||||
//
|
|
||||||
// try {
|
|
||||||
// serverSocket.close();
|
|
||||||
// } catch (I2PException e) {
|
|
||||||
// nop
|
|
||||||
//}
|
|
||||||
// need to kill off the socket manager too.
|
|
||||||
// I2PSession session = socketManager.getSession();
|
|
||||||
// if (session != null) {
|
|
||||||
// System.out.println("I2Plistener: destroySession");
|
|
||||||
// try {
|
|
||||||
// session.destroySession();
|
|
||||||
// } catch (I2PSessionException ex) {
|
|
||||||
// nop
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
// System.out.println("I2Plistener: Waiting for children");
|
|
||||||
// while (Thread.activeCount() > tgwatch) { // wait for all threads in our threadgroup to finish
|
|
||||||
// try {
|
|
||||||
// Thread.sleep(100); //sleep for 100 ms (One tenth second)
|
|
||||||
// } catch (Exception e) {
|
|
||||||
// nop
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
// System.out.println("I2Plistener: Done.");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,10 +23,10 @@
|
|||||||
*/
|
*/
|
||||||
package net.i2p.BOB;
|
package net.i2p.BOB;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import net.i2p.client.streaming.I2PSocket;
|
import net.i2p.client.streaming.I2PSocket;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -39,6 +39,7 @@ public class I2PtoTCP implements Runnable {
|
|||||||
private I2PSocket I2P;
|
private I2PSocket I2P;
|
||||||
private NamedDB info, database;
|
private NamedDB info, database;
|
||||||
private Socket sock;
|
private Socket sock;
|
||||||
|
private AtomicBoolean lives;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
@ -47,18 +48,19 @@ public class I2PtoTCP implements Runnable {
|
|||||||
* @param info
|
* @param info
|
||||||
* @param database
|
* @param database
|
||||||
*/
|
*/
|
||||||
I2PtoTCP(I2PSocket I2Psock, NamedDB info, NamedDB database) {
|
I2PtoTCP(I2PSocket I2Psock, NamedDB info, NamedDB database, AtomicBoolean lives) {
|
||||||
this.I2P = I2Psock;
|
this.I2P = I2Psock;
|
||||||
this.info = info;
|
this.info = info;
|
||||||
this.database = database;
|
this.database = database;
|
||||||
|
this.lives = lives;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void rlock() throws Exception {
|
private void rlock() {
|
||||||
database.getReadLock();
|
database.getReadLock();
|
||||||
info.getReadLock();
|
info.getReadLock();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void runlock() throws Exception {
|
private void runlock() {
|
||||||
database.releaseReadLock();
|
database.releaseReadLock();
|
||||||
info.releaseReadLock();
|
info.releaseReadLock();
|
||||||
}
|
}
|
||||||
@ -71,90 +73,109 @@ public class I2PtoTCP implements Runnable {
|
|||||||
String host;
|
String host;
|
||||||
int port;
|
int port;
|
||||||
boolean tell;
|
boolean tell;
|
||||||
die: {
|
InputStream in = null;
|
||||||
try {
|
OutputStream out = null;
|
||||||
|
InputStream Iin = null;
|
||||||
|
OutputStream Iout = null;
|
||||||
|
Thread t = null;
|
||||||
|
Thread q = null;
|
||||||
|
try {
|
||||||
|
die:
|
||||||
|
{
|
||||||
try {
|
try {
|
||||||
rlock();
|
|
||||||
} catch(Exception e) {
|
|
||||||
break die;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
host = info.get("OUTHOST").toString();
|
|
||||||
port = Integer.parseInt(info.get("OUTPORT").toString());
|
|
||||||
tell = info.get("QUIET").equals(Boolean.FALSE);
|
|
||||||
} catch(Exception e) {
|
|
||||||
runlock();
|
|
||||||
break die;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
runlock();
|
|
||||||
} catch(Exception e) {
|
|
||||||
break die;
|
|
||||||
}
|
|
||||||
sock = new Socket(host, port);
|
|
||||||
// make readers/writers
|
|
||||||
InputStream in = sock.getInputStream();
|
|
||||||
OutputStream out = sock.getOutputStream();
|
|
||||||
InputStream Iin = I2P.getInputStream();
|
|
||||||
OutputStream Iout = I2P.getOutputStream();
|
|
||||||
I2P.setReadTimeout(0); // temp bugfix, this *SHOULD* be the default
|
|
||||||
|
|
||||||
if(tell) {
|
|
||||||
// tell who is connecting
|
|
||||||
out.write(I2P.getPeerDestination().toBase64().getBytes());
|
|
||||||
out.write(10); // nl
|
|
||||||
out.flush(); // not really needed, but...
|
|
||||||
}
|
|
||||||
// setup to cross the streams
|
|
||||||
TCPio conn_c = new TCPio(in, Iout /*, info, database */ ); // app -> I2P
|
|
||||||
TCPio conn_a = new TCPio(Iin, out /* , info, database */); // I2P -> app
|
|
||||||
Thread t = new Thread(conn_c, "TCPioA");
|
|
||||||
Thread q = new Thread(conn_a, "TCPioB");
|
|
||||||
// Fire!
|
|
||||||
t.start();
|
|
||||||
q.start();
|
|
||||||
while(t.isAlive() && q.isAlive()) { // AND is used here to kill off the other thread
|
|
||||||
try {
|
try {
|
||||||
Thread.sleep(10); //sleep for 10 ms
|
rlock();
|
||||||
} catch(InterruptedException e) {
|
} catch (Exception e) {
|
||||||
|
break die;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
host = info.get("OUTHOST").toString();
|
||||||
|
port = Integer.parseInt(info.get("OUTPORT").toString());
|
||||||
|
tell = info.get("QUIET").equals(Boolean.FALSE);
|
||||||
|
} catch (Exception e) {
|
||||||
|
runlock();
|
||||||
|
break die;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
runlock();
|
||||||
|
} catch (Exception e) {
|
||||||
|
break die;
|
||||||
|
}
|
||||||
|
sock = new Socket(host, port);
|
||||||
|
// make readers/writers
|
||||||
|
in = sock.getInputStream();
|
||||||
|
out = sock.getOutputStream();
|
||||||
|
Iin = I2P.getInputStream();
|
||||||
|
Iout = I2P.getOutputStream();
|
||||||
|
I2P.setReadTimeout(0); // temp bugfix, this *SHOULD* be the default
|
||||||
|
|
||||||
|
if (tell) {
|
||||||
|
// tell who is connecting
|
||||||
|
out.write(I2P.getPeerDestination().toBase64().getBytes());
|
||||||
|
out.write(10); // nl
|
||||||
|
out.flush(); // not really needed, but...
|
||||||
|
}
|
||||||
|
// setup to cross the streams
|
||||||
|
TCPio conn_c = new TCPio(in, Iout, lives); // app -> I2P
|
||||||
|
TCPio conn_a = new TCPio(Iin, out, lives); // I2P -> app
|
||||||
|
t = new Thread(conn_c, Thread.currentThread().getName() + " TCPioA");
|
||||||
|
q = new Thread(conn_a, Thread.currentThread().getName() + " TCPioB");
|
||||||
|
// Fire!
|
||||||
|
t.start();
|
||||||
|
q.start();
|
||||||
|
while (t.isAlive() && q.isAlive() && lives.get()) { // AND is used here to kill off the other thread
|
||||||
try {
|
try {
|
||||||
in.close();
|
Thread.sleep(10); //sleep for 10 ms
|
||||||
} catch(Exception ex) {
|
} catch (InterruptedException e) {
|
||||||
}
|
break die;
|
||||||
try {
|
|
||||||
out.close();
|
|
||||||
} catch(Exception ex) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
Iin.close();
|
|
||||||
} catch(Exception ex) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
Iout.close();
|
|
||||||
} catch(Exception ex) {
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
// System.out.println("I2PtoTCP: Going away...");
|
// System.out.println("I2PtoTCP: Going away...");
|
||||||
} catch(Exception e) {
|
} catch (Exception e) {
|
||||||
// System.out.println("I2PtoTCP: Owch! damn!");
|
// System.out.println("I2PtoTCP: Owch! damn!");
|
||||||
break die;
|
break die;
|
||||||
|
}
|
||||||
|
} // die
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
in.close();
|
||||||
|
} catch (Exception ex) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
out.close();
|
||||||
|
} catch (Exception ex) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Iin.close();
|
||||||
|
} catch (Exception ex) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Iout.close();
|
||||||
|
} catch (Exception ex) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
t.interrupt();
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
q.interrupt();
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
// System.out.println("I2PtoTCP: Close I2P");
|
||||||
|
I2P.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
tell = false;
|
||||||
|
}
|
||||||
|
//System.out.println("I2PtoTCP: Closed I2P");
|
||||||
|
try {
|
||||||
|
// System.out.println("I2PtoTCP: Close sock");
|
||||||
|
sock.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
tell = false;
|
||||||
}
|
}
|
||||||
} // die
|
|
||||||
try {
|
|
||||||
// System.out.println("I2PtoTCP: Close I2P");
|
|
||||||
I2P.close();
|
|
||||||
} catch(Exception e) {
|
|
||||||
tell = false;
|
|
||||||
}
|
|
||||||
//System.out.println("I2PtoTCP: Closed I2P");
|
|
||||||
try {
|
|
||||||
// System.out.println("I2PtoTCP: Close sock");
|
|
||||||
sock.close();
|
|
||||||
} catch(Exception e) {
|
|
||||||
tell = false;
|
|
||||||
}
|
|
||||||
// System.out.println("I2PtoTCP: Done");
|
// System.out.println("I2PtoTCP: Done");
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -28,9 +28,8 @@ import java.io.IOException;
|
|||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.net.ServerSocket;
|
import java.net.ServerSocket;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import net.i2p.I2PException;
|
import net.i2p.I2PException;
|
||||||
import net.i2p.client.I2PSession;
|
|
||||||
import net.i2p.client.I2PSessionException;
|
|
||||||
import net.i2p.client.streaming.I2PServerSocket;
|
import net.i2p.client.streaming.I2PServerSocket;
|
||||||
import net.i2p.client.streaming.I2PSocketManager;
|
import net.i2p.client.streaming.I2PSocketManager;
|
||||||
import net.i2p.client.streaming.I2PSocketManagerFactory;
|
import net.i2p.client.streaming.I2PSocketManagerFactory;
|
||||||
@ -50,10 +49,12 @@ public class MUXlisten implements Runnable {
|
|||||||
private ByteArrayInputStream prikey;
|
private ByteArrayInputStream prikey;
|
||||||
private ThreadGroup tg;
|
private ThreadGroup tg;
|
||||||
private String N;
|
private String N;
|
||||||
private ServerSocket listener;
|
private ServerSocket listener = null;
|
||||||
private int backlog = 50; // should this be more? less?
|
private int backlog = 50; // should this be more? less?
|
||||||
boolean go_out;
|
boolean go_out;
|
||||||
boolean come_in;
|
boolean come_in;
|
||||||
|
private AtomicBoolean lock;
|
||||||
|
private AtomicBoolean lives;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor Will fail if INPORT is occupied.
|
* Constructor Will fail if INPORT is occupied.
|
||||||
@ -64,47 +65,87 @@ public class MUXlisten implements Runnable {
|
|||||||
* @throws net.i2p.I2PException
|
* @throws net.i2p.I2PException
|
||||||
* @throws java.io.IOException
|
* @throws java.io.IOException
|
||||||
*/
|
*/
|
||||||
MUXlisten(NamedDB database, NamedDB info, Log _log) throws I2PException, IOException, RuntimeException {
|
MUXlisten(AtomicBoolean lock, NamedDB database, NamedDB info, Log _log) throws I2PException, IOException, RuntimeException {
|
||||||
int port = 0;
|
try {
|
||||||
InetAddress host = null;
|
int port = 0;
|
||||||
this.tg = null;
|
InetAddress host = null;
|
||||||
this.database = database;
|
this.lock = lock;
|
||||||
this.info = info;
|
this.tg = null;
|
||||||
this._log = _log;
|
this.database = database;
|
||||||
|
this.info = info;
|
||||||
|
this._log = _log;
|
||||||
|
lives = new AtomicBoolean(false);
|
||||||
|
|
||||||
this.database.getReadLock();
|
this.database.getWriteLock();
|
||||||
this.info.getReadLock();
|
this.info.getWriteLock();
|
||||||
N = this.info.get("NICKNAME").toString();
|
this.info.add("STARTING", new Boolean(true));
|
||||||
prikey = new ByteArrayInputStream((byte[]) info.get("KEYS"));
|
this.info.releaseWriteLock();
|
||||||
// Make a new copy so that anything else won't muck with our database.
|
this.database.releaseWriteLock();
|
||||||
Properties R = (Properties) info.get("PROPERTIES");
|
this.database.getReadLock();
|
||||||
Properties Q = new Properties();
|
this.info.getReadLock();
|
||||||
Lifted.copyProperties(R, Q);
|
|
||||||
this.database.releaseReadLock();
|
|
||||||
this.info.releaseReadLock();
|
|
||||||
|
|
||||||
this.database.getReadLock();
|
N = this.info.get("NICKNAME").toString();
|
||||||
this.info.getReadLock();
|
prikey = new ByteArrayInputStream((byte[]) info.get("KEYS"));
|
||||||
this.go_out = info.exists("OUTPORT");
|
// Make a new copy so that anything else won't muck with our database.
|
||||||
this.come_in = info.exists("INPORT");
|
Properties R = (Properties) info.get("PROPERTIES");
|
||||||
if (this.come_in) {
|
Properties Q = new Properties();
|
||||||
port = Integer.parseInt(info.get("INPORT").toString());
|
Lifted.copyProperties(R, Q);
|
||||||
host = InetAddress.getByName(info.get("INHOST").toString());
|
this.database.releaseReadLock();
|
||||||
|
this.info.releaseReadLock();
|
||||||
|
|
||||||
|
this.database.getReadLock();
|
||||||
|
this.info.getReadLock();
|
||||||
|
this.go_out = info.exists("OUTPORT");
|
||||||
|
this.come_in = info.exists("INPORT");
|
||||||
|
if (this.come_in) {
|
||||||
|
port = Integer.parseInt(info.get("INPORT").toString());
|
||||||
|
host = InetAddress.getByName(info.get("INHOST").toString());
|
||||||
|
}
|
||||||
|
this.database.releaseReadLock();
|
||||||
|
this.info.releaseReadLock();
|
||||||
|
|
||||||
|
socketManager = I2PSocketManagerFactory.createManager(prikey, Q);
|
||||||
|
if (this.come_in) {
|
||||||
|
this.listener = new ServerSocket(port, backlog, host);
|
||||||
|
}
|
||||||
|
// I2PException, IOException, RuntimeException
|
||||||
|
// To bad we can't just catch and enumerate....
|
||||||
|
// } catch (I2PException e) {
|
||||||
|
// Something went bad.
|
||||||
|
// this.database.getWriteLock();
|
||||||
|
// this.info.getWriteLock();
|
||||||
|
// this.info.add("STARTING", new Boolean(false));
|
||||||
|
// this.info.releaseWriteLock();
|
||||||
|
// this.database.releaseWriteLock();
|
||||||
|
// throw new I2PException(e);
|
||||||
|
} catch (IOException e) {
|
||||||
|
// Something went bad.
|
||||||
|
this.database.getWriteLock();
|
||||||
|
this.info.getWriteLock();
|
||||||
|
this.info.add("STARTING", new Boolean(false));
|
||||||
|
this.info.releaseWriteLock();
|
||||||
|
this.database.releaseWriteLock();
|
||||||
|
throw new IOException(e.toString());
|
||||||
|
} catch (RuntimeException e) {
|
||||||
|
// Something went bad.
|
||||||
|
this.database.getWriteLock();
|
||||||
|
this.info.getWriteLock();
|
||||||
|
this.info.add("STARTING", new Boolean(false));
|
||||||
|
this.info.releaseWriteLock();
|
||||||
|
this.database.releaseWriteLock();
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
} catch (Exception e) {
|
||||||
|
// Something else went bad.
|
||||||
|
this.database.getWriteLock();
|
||||||
|
this.info.getWriteLock();
|
||||||
|
this.info.add("STARTING", new Boolean(false));
|
||||||
|
this.info.releaseWriteLock();
|
||||||
|
this.database.releaseWriteLock();
|
||||||
|
// throw new Exception(e);
|
||||||
|
// Debugging, I guess.
|
||||||
|
e.printStackTrace();
|
||||||
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
this.database.releaseReadLock();
|
|
||||||
this.info.releaseReadLock();
|
|
||||||
|
|
||||||
socketManager = I2PSocketManagerFactory.createManager(prikey, Q);
|
|
||||||
if (this.come_in) {
|
|
||||||
this.listener = new ServerSocket(port, backlog, host);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Everything is OK as far as we can tell.
|
|
||||||
this.database.getWriteLock();
|
|
||||||
this.info.getWriteLock();
|
|
||||||
this.info.add("STARTING", new Boolean(true));
|
|
||||||
this.info.releaseWriteLock();
|
|
||||||
this.database.releaseWriteLock();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void rlock() throws Exception {
|
private void rlock() throws Exception {
|
||||||
@ -133,234 +174,212 @@ public class MUXlisten implements Runnable {
|
|||||||
*/
|
*/
|
||||||
public void run() {
|
public void run() {
|
||||||
I2PServerSocket SS = null;
|
I2PServerSocket SS = null;
|
||||||
int ticks = 1200; // Allow 120 seconds, no more.
|
Thread t = null;
|
||||||
|
Thread q = null;
|
||||||
try {
|
try {
|
||||||
wlock();
|
|
||||||
try {
|
try {
|
||||||
info.add("RUNNING", new Boolean(true));
|
wlock();
|
||||||
|
try {
|
||||||
|
info.add("RUNNING", new Boolean(true));
|
||||||
|
} catch (Exception e) {
|
||||||
|
lock.set(false);
|
||||||
|
wunlock();
|
||||||
|
return;
|
||||||
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
wunlock();
|
lock.set(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
wunlock();
|
|
||||||
} catch (Exception e) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// socketManager.addDisconnectListener(new DisconnectListener());
|
|
||||||
|
|
||||||
quit:
|
|
||||||
{
|
|
||||||
try {
|
try {
|
||||||
tg = new ThreadGroup(N);
|
wunlock();
|
||||||
die:
|
} catch (Exception e) {
|
||||||
{
|
lock.set(false);
|
||||||
// toss the connections to a new threads.
|
return;
|
||||||
// will wrap with TCP and UDP when UDP works
|
}
|
||||||
|
// socketManager.addDisconnectListener(new DisconnectListener());
|
||||||
|
lives.set(true);
|
||||||
|
lock.set(false);
|
||||||
|
quit:
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
tg = new ThreadGroup(N);
|
||||||
|
{
|
||||||
|
// toss the connections to a new threads.
|
||||||
|
// will wrap with TCP and UDP when UDP works
|
||||||
|
|
||||||
if (go_out) {
|
if (go_out) {
|
||||||
// I2P -> TCP
|
// I2P -> TCP
|
||||||
SS = socketManager.getServerSocket();
|
SS = socketManager.getServerSocket();
|
||||||
I2Plistener conn = new I2Plistener(SS, socketManager, info, database, _log);
|
I2Plistener conn = new I2Plistener(SS, socketManager, info, database, _log, lives);
|
||||||
Thread t = new Thread(tg, conn, "BOBI2Plistener " + N);
|
t = new Thread(tg, conn, "BOBI2Plistener " + N);
|
||||||
t.start();
|
t.start();
|
||||||
}
|
|
||||||
|
|
||||||
if (come_in) {
|
|
||||||
// TCP -> I2P
|
|
||||||
TCPlistener conn = new TCPlistener(listener, socketManager, info, database, _log);
|
|
||||||
Thread q = new Thread(tg, conn, "BOBTCPlistener" + N);
|
|
||||||
q.start();
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
wlock();
|
|
||||||
try {
|
|
||||||
info.add("STARTING", new Boolean(false));
|
|
||||||
} catch (Exception e) {
|
|
||||||
wunlock();
|
|
||||||
break die;
|
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
|
||||||
break die;
|
if (come_in) {
|
||||||
}
|
// TCP -> I2P
|
||||||
try {
|
TCPlistener conn = new TCPlistener(listener, socketManager, info, database, _log, lives);
|
||||||
wunlock();
|
q = new Thread(tg, conn, "BOBTCPlistener " + N);
|
||||||
} catch (Exception e) {
|
q.start();
|
||||||
break die;
|
|
||||||
}
|
|
||||||
boolean spin = true;
|
|
||||||
while (spin) {
|
|
||||||
try {
|
|
||||||
Thread.sleep(1000); //sleep for 1 second
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
break die;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
rlock();
|
wlock();
|
||||||
try {
|
try {
|
||||||
spin = info.get("STOPPING").equals(Boolean.FALSE);
|
info.add("STARTING", new Boolean(false));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
runlock();
|
wunlock();
|
||||||
break die;
|
break quit;
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
break die;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
runlock();
|
|
||||||
} catch (Exception e) {
|
|
||||||
break die;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
wlock();
|
|
||||||
try {
|
|
||||||
info.add("RUNNING", new Boolean(false));
|
|
||||||
} catch (Exception e) {
|
|
||||||
wunlock();
|
|
||||||
break die;
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
break die;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
wunlock();
|
|
||||||
} catch (Exception e) {
|
|
||||||
break die;
|
|
||||||
}
|
|
||||||
} // die
|
|
||||||
|
|
||||||
if (SS != null) {
|
|
||||||
try {
|
|
||||||
SS.close();
|
|
||||||
} catch (I2PException ex) {
|
|
||||||
//Logger.getLogger(MUXlisten.class.getName()).log(Level.SEVERE, null, ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (this.come_in) {
|
|
||||||
try {
|
|
||||||
listener.close();
|
|
||||||
} catch (IOException e) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
I2PSession session = socketManager.getSession();
|
|
||||||
if (session != null) {
|
|
||||||
// System.out.println("I2Plistener: destroySession");
|
|
||||||
try {
|
|
||||||
session.destroySession();
|
|
||||||
} catch (I2PSessionException ex) {
|
|
||||||
// nop
|
|
||||||
}
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
socketManager.destroySocketManager();
|
|
||||||
} catch (Exception e) {
|
|
||||||
// nop
|
|
||||||
}
|
|
||||||
// Wait for child threads and thread groups to die
|
|
||||||
// System.out.println("MUXlisten: waiting for children");
|
|
||||||
if (tg.activeCount() + tg.activeGroupCount() != 0) {
|
|
||||||
while ((tg.activeCount() + tg.activeGroupCount() != 0) && ticks != 0) {
|
|
||||||
tg.interrupt(); // unwedge any blocking threads.
|
|
||||||
ticks--;
|
|
||||||
try {
|
|
||||||
Thread.sleep(100); //sleep for 100 ms (One tenth second)
|
|
||||||
} catch (InterruptedException ex) {
|
|
||||||
break quit;
|
break quit;
|
||||||
}
|
}
|
||||||
}
|
try {
|
||||||
if (tg.activeCount() + tg.activeGroupCount() != 0) {
|
wunlock();
|
||||||
break quit; // Uh-oh.
|
} catch (Exception e) {
|
||||||
}
|
break quit;
|
||||||
}
|
}
|
||||||
tg.destroy();
|
boolean spin = true;
|
||||||
// Zap reference to the ThreadGroup so the JVM can GC it.
|
while (spin && lives.get()) {
|
||||||
tg = null;
|
try {
|
||||||
} catch (Exception e) {
|
Thread.sleep(1000); //sleep for 1 second
|
||||||
// System.out.println("MUXlisten: Caught an exception" + e);
|
} catch (InterruptedException e) {
|
||||||
break quit;
|
break quit;
|
||||||
}
|
}
|
||||||
} // quit
|
try {
|
||||||
|
rlock();
|
||||||
|
try {
|
||||||
|
spin = info.get("STOPPING").equals(Boolean.FALSE);
|
||||||
|
} catch (Exception e) {
|
||||||
|
runlock();
|
||||||
|
break quit;
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
break quit;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
runlock();
|
||||||
|
} catch (Exception e) {
|
||||||
|
break quit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // die
|
||||||
|
|
||||||
// This is here to catch when something fucks up REALLY bad.
|
} catch (Exception e) {
|
||||||
if (tg != null) {
|
// System.out.println("MUXlisten: Caught an exception" + e);
|
||||||
|
break quit;
|
||||||
|
}
|
||||||
|
} // quit
|
||||||
|
} finally {
|
||||||
|
lives.set(false);
|
||||||
|
// Some grace time.
|
||||||
|
try {
|
||||||
|
Thread.sleep(100);
|
||||||
|
} catch (InterruptedException ex) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
wlock();
|
||||||
|
try {
|
||||||
|
info.add("STARTING", new Boolean(false));
|
||||||
|
info.add("STOPPING", new Boolean(true));
|
||||||
|
info.add("RUNNING", new Boolean(false));
|
||||||
|
} catch (Exception e) {
|
||||||
|
lock.set(false);
|
||||||
|
wunlock();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
wunlock();
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
// Start cleanup.
|
||||||
|
while (!lock.compareAndSet(false, true)) {
|
||||||
|
// wait
|
||||||
|
}
|
||||||
if (SS != null) {
|
if (SS != null) {
|
||||||
try {
|
try {
|
||||||
SS.close();
|
SS.close();
|
||||||
} catch (I2PException ex) {
|
} catch (I2PException ex) {
|
||||||
//Logger.getLogger(MUXlisten.class.getName()).log(Level.SEVERE, null, ex);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (this.come_in) {
|
if (listener != null) {
|
||||||
try {
|
try {
|
||||||
listener.close();
|
listener.close();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Some grace time.
|
||||||
|
try {
|
||||||
|
Thread.sleep(100);
|
||||||
|
} catch (InterruptedException ex) {
|
||||||
|
}
|
||||||
|
|
||||||
|
// zero out everything.
|
||||||
|
try {
|
||||||
|
wlock();
|
||||||
|
try {
|
||||||
|
info.add("STARTING", new Boolean(false));
|
||||||
|
info.add("STOPPING", new Boolean(false));
|
||||||
|
info.add("RUNNING", new Boolean(false));
|
||||||
|
} catch (Exception e) {
|
||||||
|
lock.set(false);
|
||||||
|
wunlock();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
wunlock();
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
lock.set(false); // Should we force waiting for all threads??
|
||||||
|
|
||||||
|
// Wait around till all threads are collected.
|
||||||
|
if (tg != null) {
|
||||||
|
String boner = tg.getName();
|
||||||
|
// System.out.println("BOB: MUXlisten: Starting thread collection for: " + boner);
|
||||||
|
_log.warn("BOB: MUXlisten: Starting thread collection for: " + boner);
|
||||||
|
// tg.interrupt(); // give my stuff a small smack again.
|
||||||
|
if (tg.activeCount() + tg.activeGroupCount() != 0) {
|
||||||
|
// visit(tg, 0, boner);
|
||||||
|
int foo = tg.activeCount() + tg.activeGroupCount();
|
||||||
|
// hopefully no longer needed!
|
||||||
|
// int bar = lives;
|
||||||
|
// System.out.println("BOB: MUXlisten: Waiting on threads for " + boner);
|
||||||
|
// System.out.println("\nBOB: MUXlisten: ThreadGroup dump BEGIN " + boner);
|
||||||
|
// visit(tg, 0, boner);
|
||||||
|
// System.out.println("BOB: MUXlisten: ThreadGroup dump END " + boner + "\n");
|
||||||
|
// Happily spin forever :-(
|
||||||
|
while (foo != 0) {
|
||||||
|
foo = tg.activeCount() + tg.activeGroupCount();
|
||||||
|
// if (lives != bar && lives != 0) {
|
||||||
|
// System.out.println("\nBOB: MUXlisten: ThreadGroup dump BEGIN " + boner);
|
||||||
|
// visit(tg, 0, boner);
|
||||||
|
// System.out.println("BOB: MUXlisten: ThreadGroup dump END " + boner + "\n");
|
||||||
|
// }
|
||||||
|
// bar = lives;
|
||||||
|
try {
|
||||||
|
Thread.sleep(100); //sleep for 100 ms (One tenth second)
|
||||||
|
} catch (InterruptedException ex) {
|
||||||
|
// nop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// System.out.println("BOB: MUXlisten: Threads went away. Success: " + boner);
|
||||||
|
_log.warn("BOB: MUXlisten: Threads went away. Success: " + boner);
|
||||||
|
tg.destroy();
|
||||||
|
// Zap reference to the ThreadGroup so the JVM can GC it.
|
||||||
|
tg = null;
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
socketManager.destroySocketManager();
|
socketManager.destroySocketManager();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
// nop
|
// nop
|
||||||
}
|
}
|
||||||
ticks = 600; // 60 seconds
|
|
||||||
if (tg.activeCount() + tg.activeGroupCount() != 0) {
|
|
||||||
while ((tg.activeCount() + tg.activeGroupCount() != 0) && ticks != 0) {
|
|
||||||
tg.interrupt(); // unwedge any blocking threads.
|
|
||||||
ticks--;
|
|
||||||
try {
|
|
||||||
Thread.sleep(100); //sleep for 100 ms (One tenth second)
|
|
||||||
} catch (InterruptedException ex) {
|
|
||||||
// nop
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (tg.activeCount() + tg.activeGroupCount() == 0) {
|
|
||||||
tg.destroy();
|
|
||||||
// Zap reference to the ThreadGroup so the JVM can GC it.
|
|
||||||
tg = null;
|
|
||||||
} else {
|
|
||||||
System.out.println("BOB: MUXlisten: Can't kill threads. Please send the following dump to sponge@mail.i2p");
|
|
||||||
System.out.println("\n\nBOB: MUXlisten: ThreadGroup dump BEGIN");
|
|
||||||
visit(tg, 0);
|
|
||||||
System.out.println("BOB: MUXlisten: ThreadGroup dump END\n\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// This is here to catch when something fucks up REALLY bad.
|
|
||||||
// if (tg != null) {
|
|
||||||
// System.out.println("BOB: MUXlisten: Something fucked up REALLY bad!");
|
|
||||||
// System.out.println("BOB: MUXlisten: Please email the following dump to sponge@mail.i2p");
|
|
||||||
// WrapperManager.requestThreadDump();
|
|
||||||
// System.out.println("BOB: MUXlisten: Something fucked up REALLY bad!");
|
|
||||||
// System.out.println("BOB: MUXlisten: Please email the above dump to sponge@mail.i2p");
|
|
||||||
// }
|
|
||||||
// zero out everything.
|
|
||||||
try {
|
|
||||||
wlock();
|
|
||||||
try {
|
|
||||||
info.add("STARTING", new Boolean(false));
|
|
||||||
info.add("STOPPING", new Boolean(false));
|
|
||||||
info.add("RUNNING", new Boolean(false));
|
|
||||||
} catch (Exception e) {
|
|
||||||
wunlock();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
wunlock();
|
|
||||||
} catch (Exception e) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Debugging...
|
// Debugging... None of this is normally used.
|
||||||
|
/**
|
||||||
/**
|
|
||||||
* Find the root thread group and print them all.
|
* Find the root thread group and print them all.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@ -371,7 +390,7 @@ die:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Visit each thread group
|
// Visit each thread group
|
||||||
visit(root, 0);
|
visit(root, 0, root.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -379,7 +398,7 @@ die:
|
|||||||
* @param group ThreadGroup to visit
|
* @param group ThreadGroup to visit
|
||||||
* @param level Current level
|
* @param level Current level
|
||||||
*/
|
*/
|
||||||
private static void visit(ThreadGroup group, int level) {
|
private static void visit(ThreadGroup group, int level, String tn) {
|
||||||
// Get threads in `group'
|
// Get threads in `group'
|
||||||
int numThreads = group.activeCount();
|
int numThreads = group.activeCount();
|
||||||
Thread[] threads = new Thread[numThreads * 2];
|
Thread[] threads = new Thread[numThreads * 2];
|
||||||
@ -389,7 +408,7 @@ die:
|
|||||||
for (int i = 0; i < numThreads; i++) {
|
for (int i = 0; i < numThreads; i++) {
|
||||||
// Get thread
|
// Get thread
|
||||||
Thread thread = threads[i];
|
Thread thread = threads[i];
|
||||||
System.out.println("BOB: MUXlisten: " + indent + thread.toString());
|
System.out.println("BOB: MUXlisten: " + tn + ": " + indent + thread.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get thread subgroups of `group'
|
// Get thread subgroups of `group'
|
||||||
@ -399,7 +418,7 @@ die:
|
|||||||
|
|
||||||
// Recursively visit each subgroup
|
// Recursively visit each subgroup
|
||||||
for (int i = 0; i < numGroups; i++) {
|
for (int i = 0; i < numGroups; i++) {
|
||||||
visit(groups[i], level + 1);
|
visit(groups[i], level + 1, groups[i].getName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,7 @@ package net.i2p.BOB;
|
|||||||
import net.i2p.client.streaming.RetransmissionTimer;
|
import net.i2p.client.streaming.RetransmissionTimer;
|
||||||
import net.i2p.util.SimpleScheduler;
|
import net.i2p.util.SimpleScheduler;
|
||||||
import net.i2p.util.SimpleTimer2;
|
import net.i2p.util.SimpleTimer2;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Start from command line
|
* Start from command line
|
||||||
*
|
*
|
||||||
|
@ -43,10 +43,10 @@ public class NamedDB {
|
|||||||
}
|
}
|
||||||
|
|
||||||
synchronized public void getReadLock() {
|
synchronized public void getReadLock() {
|
||||||
while((writersWaiting != 0)) {
|
while ((writersWaiting != 0)) {
|
||||||
try {
|
try {
|
||||||
wait();
|
wait();
|
||||||
} catch(InterruptedException ie) {
|
} catch (InterruptedException ie) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
readers++;
|
readers++;
|
||||||
@ -59,10 +59,10 @@ public class NamedDB {
|
|||||||
|
|
||||||
synchronized public void getWriteLock() {
|
synchronized public void getWriteLock() {
|
||||||
writersWaiting++;
|
writersWaiting++;
|
||||||
while(readers != 0 && writersWaiting != 1 ) {
|
while (readers != 0 && writersWaiting != 1) {
|
||||||
try {
|
try {
|
||||||
wait();
|
wait();
|
||||||
} catch(InterruptedException ie) {
|
} catch (InterruptedException ie) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -79,8 +79,8 @@ public class NamedDB {
|
|||||||
* @throws ArrayIndexOutOfBoundsException when key does not exist
|
* @throws ArrayIndexOutOfBoundsException when key does not exist
|
||||||
*/
|
*/
|
||||||
public int idx(Object key) throws ArrayIndexOutOfBoundsException {
|
public int idx(Object key) throws ArrayIndexOutOfBoundsException {
|
||||||
for(int i = 0; i < index; i++) {
|
for (int i = 0; i < index; i++) {
|
||||||
if(key.equals(data[i][0])) {
|
if (key.equals(data[i][0])) {
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -100,17 +100,17 @@ public class NamedDB {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
k = idx(key);
|
k = idx(key);
|
||||||
} catch(ArrayIndexOutOfBoundsException b) {
|
} catch (ArrayIndexOutOfBoundsException b) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
olddata = new Object[index + 2][2];
|
olddata = new Object[index + 2][2];
|
||||||
// copy to olddata, skipping 'k'
|
// copy to olddata, skipping 'k'
|
||||||
for(i = 0 , l = 0; l < index; i++, l++) {
|
for (i = 0, l = 0; l < index; i++, l++) {
|
||||||
if(i == k) {
|
if (i == k) {
|
||||||
l++;
|
l++;
|
||||||
didsomething++;
|
didsomething++;
|
||||||
}
|
}
|
||||||
for(j = 0; j < 2; j++) {
|
for (j = 0; j < 2; j++) {
|
||||||
olddata[i][j] = data[l][j];
|
olddata[i][j] = data[l][j];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -132,13 +132,13 @@ public class NamedDB {
|
|||||||
|
|
||||||
olddata = new Object[index + 2][2];
|
olddata = new Object[index + 2][2];
|
||||||
// copy to olddata
|
// copy to olddata
|
||||||
for(i = 0; i < index; i++) {
|
for (i = 0; i < index; i++) {
|
||||||
for(j = 0; j < 2; j++) {
|
for (j = 0; j < 2; j++) {
|
||||||
olddata[i][j] = data[i][j];
|
olddata[i][j] = data[i][j];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
data = olddata;
|
data = olddata;
|
||||||
data[index++] = new Object[] {key, val};
|
data[index++] = new Object[]{key, val};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -149,8 +149,8 @@ public class NamedDB {
|
|||||||
* @throws java.lang.RuntimeException
|
* @throws java.lang.RuntimeException
|
||||||
*/
|
*/
|
||||||
public Object get(Object key) throws RuntimeException {
|
public Object get(Object key) throws RuntimeException {
|
||||||
for(int i = 0; i < index; i++) {
|
for (int i = 0; i < index; i++) {
|
||||||
if(key.equals(data[i][0])) {
|
if (key.equals(data[i][0])) {
|
||||||
return data[i][1];
|
return data[i][1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -164,8 +164,8 @@ public class NamedDB {
|
|||||||
* @return true if an object exists, else returns false
|
* @return true if an object exists, else returns false
|
||||||
*/
|
*/
|
||||||
public boolean exists(Object key) {
|
public boolean exists(Object key) {
|
||||||
for(int i = 0; i < index; i++) {
|
for (int i = 0; i < index; i++) {
|
||||||
if(key.equals(data[i][0])) {
|
if (key.equals(data[i][0])) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -180,7 +180,7 @@ public class NamedDB {
|
|||||||
* @throws java.lang.RuntimeException
|
* @throws java.lang.RuntimeException
|
||||||
*/
|
*/
|
||||||
public Object getnext(int i) throws RuntimeException {
|
public Object getnext(int i) throws RuntimeException {
|
||||||
if(i < index && i > -1) {
|
if (i < index && i > -1) {
|
||||||
return data[i][1];
|
return data[i][1];
|
||||||
}
|
}
|
||||||
throw new RuntimeException("No more data");
|
throw new RuntimeException("No more data");
|
||||||
|
@ -26,6 +26,7 @@ package net.i2p.BOB;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Shove data from one stream to the other.
|
* Shove data from one stream to the other.
|
||||||
@ -36,7 +37,7 @@ public class TCPio implements Runnable {
|
|||||||
|
|
||||||
private InputStream Ain;
|
private InputStream Ain;
|
||||||
private OutputStream Aout;
|
private OutputStream Aout;
|
||||||
// private NamedDB info, database;
|
private AtomicBoolean lives;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
@ -46,11 +47,10 @@ public class TCPio implements Runnable {
|
|||||||
*
|
*
|
||||||
* param database
|
* param database
|
||||||
*/
|
*/
|
||||||
TCPio(InputStream Ain, OutputStream Aout /*, NamedDB info , NamedDB database */) {
|
TCPio(InputStream Ain, OutputStream Aout, AtomicBoolean lives) {
|
||||||
this.Ain = Ain;
|
this.Ain = Ain;
|
||||||
this.Aout = Aout;
|
this.Aout = Aout;
|
||||||
// this.info = info;
|
this.lives = lives;
|
||||||
// this.database = database;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -84,57 +84,44 @@ public class TCPio implements Runnable {
|
|||||||
|
|
||||||
int b;
|
int b;
|
||||||
byte a[] = new byte[1];
|
byte a[] = new byte[1];
|
||||||
boolean spin = true;
|
|
||||||
try {
|
try {
|
||||||
while(spin) {
|
try {
|
||||||
// database.getReadLock();
|
while (lives.get()) {
|
||||||
// info.getReadLock();
|
b = Ain.read(a, 0, 1);
|
||||||
// spin = info.get("RUNNING").equals(Boolean.TRUE);
|
if (b > 0) {
|
||||||
// info.releaseReadLock();
|
Aout.write(a, 0, b);
|
||||||
// database.releaseReadLock();
|
} else if (b == 0) {
|
||||||
b = Ain.read(a, 0, 1);
|
Thread.yield(); // this should act like a mini sleep.
|
||||||
// System.out.println(info.get("NICKNAME").toString() + " " + b);
|
if (Ain.available() == 0) {
|
||||||
if(b > 0) {
|
|
||||||
Aout.write(a, 0, b);
|
|
||||||
} else if(b == 0) {
|
|
||||||
Thread.yield(); // this should act like a mini sleep.
|
|
||||||
if(Ain.available() == 0) {
|
|
||||||
// try {
|
|
||||||
// Thread.yield();
|
|
||||||
Thread.sleep(10);
|
Thread.sleep(10);
|
||||||
// } catch(InterruptedException ex) {
|
}
|
||||||
// }
|
} else {
|
||||||
|
/* according to the specs:
|
||||||
|
*
|
||||||
|
* The total number of bytes read into the buffer,
|
||||||
|
* or -1 if there is no more data because the end of
|
||||||
|
* the stream has been reached.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
// System.out.println("TCPio: End Of Stream");
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
/* according to the specs:
|
|
||||||
*
|
|
||||||
* The total number of bytes read into the buffer,
|
|
||||||
* or -1 if there is no more data because the end of
|
|
||||||
* the stream has been reached.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
// System.out.println("TCPio: End Of Stream");
|
|
||||||
Ain.close();
|
|
||||||
Aout.close();
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
}
|
}
|
||||||
// System.out.println("TCPio: RUNNING = false");
|
// System.out.println("TCPio: Leaving.");
|
||||||
} catch(Exception e) {
|
} finally {
|
||||||
// Eject!!! Eject!!!
|
// Eject!!! Eject!!!
|
||||||
//System.out.println("TCPio: Caught an exception " + e);
|
//System.out.println("TCPio: Caught an exception " + e);
|
||||||
try {
|
try {
|
||||||
Ain.close();
|
Ain.close();
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
// Logger.getLogger(TCPio.class.getName()).log(Level.SEVERE, null, ex);
|
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
Aout.close();
|
Aout.close();
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
// Logger.getLogger(TCPio.class.getName()).log(Level.SEVERE, null, ex);
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// System.out.println("TCPio: Leaving.");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,7 @@ import java.net.Socket;
|
|||||||
import java.net.SocketTimeoutException;
|
import java.net.SocketTimeoutException;
|
||||||
// import net.i2p.client.I2PSession;
|
// import net.i2p.client.I2PSession;
|
||||||
// import net.i2p.client.I2PSessionException;
|
// import net.i2p.client.I2PSessionException;
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import net.i2p.client.streaming.I2PServerSocket;
|
import net.i2p.client.streaming.I2PServerSocket;
|
||||||
import net.i2p.client.streaming.I2PSocketManager;
|
import net.i2p.client.streaming.I2PSocketManager;
|
||||||
import net.i2p.util.Log;
|
import net.i2p.util.Log;
|
||||||
@ -42,10 +43,10 @@ public class TCPlistener implements Runnable {
|
|||||||
|
|
||||||
private NamedDB info, database;
|
private NamedDB info, database;
|
||||||
private Log _log;
|
private Log _log;
|
||||||
private int tgwatch;
|
|
||||||
public I2PSocketManager socketManager;
|
public I2PSocketManager socketManager;
|
||||||
public I2PServerSocket serverSocket;
|
public I2PServerSocket serverSocket;
|
||||||
private ServerSocket listener;
|
private ServerSocket listener;
|
||||||
|
private AtomicBoolean lives;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
@ -54,13 +55,13 @@ public class TCPlistener implements Runnable {
|
|||||||
* @param database
|
* @param database
|
||||||
* @param _log
|
* @param _log
|
||||||
*/
|
*/
|
||||||
TCPlistener(ServerSocket listener, I2PSocketManager S, NamedDB info, NamedDB database, Log _log) {
|
TCPlistener(ServerSocket listener, I2PSocketManager S, NamedDB info, NamedDB database, Log _log, AtomicBoolean lives) {
|
||||||
this.database = database;
|
this.database = database;
|
||||||
this.info = info;
|
this.info = info;
|
||||||
this._log = _log;
|
this._log = _log;
|
||||||
this.socketManager = S;
|
this.socketManager = S;
|
||||||
this.listener = listener;
|
this.listener = listener;
|
||||||
tgwatch = 1;
|
this.lives = lives;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void rlock() throws Exception {
|
private void rlock() throws Exception {
|
||||||
@ -73,141 +74,44 @@ public class TCPlistener implements Runnable {
|
|||||||
info.releaseReadLock();
|
info.releaseReadLock();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void wlock() throws Exception {
|
|
||||||
database.getWriteLock();
|
|
||||||
info.getWriteLock();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void wunlock() throws Exception {
|
|
||||||
info.releaseWriteLock();
|
|
||||||
database.releaseWriteLock();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Simply listen on TCP port, and thread connections
|
* Simply listen on TCP port, and thread connections
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public void run() {
|
public void run() {
|
||||||
boolean g = false;
|
boolean g = false;
|
||||||
boolean spin = true;
|
int conn = 0;
|
||||||
|
try {
|
||||||
die: {
|
die:
|
||||||
try {
|
{
|
||||||
rlock();
|
|
||||||
} catch (Exception e) {
|
|
||||||
break die;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
if (info.exists("OUTPORT")) {
|
|
||||||
tgwatch = 2;
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
try {
|
try {
|
||||||
runlock();
|
Socket server = new Socket();
|
||||||
} catch (Exception e2) {
|
listener.setSoTimeout(50); // We don't block, we cycle and check.
|
||||||
break die;
|
while (lives.get()) {
|
||||||
}
|
|
||||||
break die;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
runlock();
|
|
||||||
} catch (Exception e) {
|
|
||||||
break die;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
Socket server = new Socket();
|
|
||||||
listener.setSoTimeout(50); // Half of the expected time from MUXlisten
|
|
||||||
while (spin) {
|
|
||||||
try {
|
|
||||||
rlock();
|
|
||||||
} catch (Exception e) {
|
|
||||||
break die;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
spin = info.get("RUNNING").equals(Boolean.TRUE);
|
|
||||||
} catch (Exception e) {
|
|
||||||
try {
|
try {
|
||||||
runlock();
|
server = listener.accept();
|
||||||
} catch (Exception e2) {
|
g = true;
|
||||||
break die;
|
} catch (SocketTimeoutException ste) {
|
||||||
|
g = false;
|
||||||
|
}
|
||||||
|
if (g) {
|
||||||
|
conn++;
|
||||||
|
// toss the connection to a new thread.
|
||||||
|
TCPtoI2P conn_c = new TCPtoI2P(socketManager, server, info, database, lives);
|
||||||
|
Thread t = new Thread(conn_c, Thread.currentThread().getName() + " TCPtoI2P " + conn);
|
||||||
|
t.start();
|
||||||
|
g = false;
|
||||||
}
|
}
|
||||||
break die;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
server = listener.accept();
|
|
||||||
g = true;
|
|
||||||
} catch (SocketTimeoutException ste) {
|
|
||||||
g = false;
|
|
||||||
}
|
|
||||||
if (g) {
|
|
||||||
// toss the connection to a new thread.
|
|
||||||
TCPtoI2P conn_c = new TCPtoI2P(socketManager, server /* , info, database */);
|
|
||||||
Thread t = new Thread(conn_c, "BOBTCPtoI2P");
|
|
||||||
t.start();
|
|
||||||
g = false;
|
|
||||||
}
|
}
|
||||||
|
} catch (IOException ioe) {
|
||||||
}
|
}
|
||||||
//System.out.println("TCPlistener: destroySession");
|
}
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
listener.close();
|
listener.close();
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ex) {
|
||||||
try {
|
|
||||||
listener.close();
|
|
||||||
} catch (IOException e) {
|
|
||||||
}
|
|
||||||
// Fatal failure, cause a stop event
|
|
||||||
try {
|
|
||||||
rlock();
|
|
||||||
try {
|
|
||||||
spin = info.get("RUNNING").equals(Boolean.TRUE);
|
|
||||||
} catch (Exception e) {
|
|
||||||
runlock();
|
|
||||||
break die;
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
break die;
|
|
||||||
}
|
|
||||||
if (spin) {
|
|
||||||
try {
|
|
||||||
wlock();
|
|
||||||
try {
|
|
||||||
info.add("STOPPING", new Boolean(true));
|
|
||||||
info.add("RUNNING", new Boolean(false));
|
|
||||||
} catch (Exception e) {
|
|
||||||
wunlock();
|
|
||||||
break die;
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
break die;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
wunlock();
|
|
||||||
} catch (Exception e) {
|
|
||||||
break die;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
//System.out.println("TCPlistener: " + Thread.currentThread().getName() + "Done.");
|
||||||
}
|
}
|
||||||
// Previous level does this cleanup now.
|
|
||||||
//
|
|
||||||
// need to kill off the socket manager too.
|
|
||||||
// I2PSession session = socketManager.getSession();
|
|
||||||
// if (session != null) {
|
|
||||||
// try {
|
|
||||||
// session.destroySession();
|
|
||||||
// } catch (I2PSessionException ex) {
|
|
||||||
// nop
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
//System.out.println("TCPlistener: Waiting for children");
|
|
||||||
//while (Thread.activeCount() > tgwatch) { // wait for all threads in our threadgroup to finish
|
|
||||||
// try {
|
|
||||||
// Thread.sleep(100); //sleep for 100 ms (One tenth second)
|
|
||||||
// } catch (Exception e) {
|
|
||||||
// // nop
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
//System.out.println("TCPlistener: Done.");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -30,9 +30,11 @@ import java.io.OutputStream;
|
|||||||
import java.net.ConnectException;
|
import java.net.ConnectException;
|
||||||
import java.net.NoRouteToHostException;
|
import java.net.NoRouteToHostException;
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
import net.i2p.I2PException;
|
import net.i2p.I2PException;
|
||||||
import net.i2p.client.streaming.I2PSocket;
|
import net.i2p.client.streaming.I2PSocket;
|
||||||
import net.i2p.client.streaming.I2PSocketManager;
|
import net.i2p.client.streaming.I2PSocketManager;
|
||||||
|
import net.i2p.data.DataFormatException;
|
||||||
import net.i2p.data.Destination;
|
import net.i2p.data.Destination;
|
||||||
import net.i2p.i2ptunnel.I2PTunnel;
|
import net.i2p.i2ptunnel.I2PTunnel;
|
||||||
|
|
||||||
@ -45,40 +47,10 @@ import net.i2p.i2ptunnel.I2PTunnel;
|
|||||||
public class TCPtoI2P implements Runnable {
|
public class TCPtoI2P implements Runnable {
|
||||||
|
|
||||||
private I2PSocket I2P;
|
private I2PSocket I2P;
|
||||||
// private NamedDB info, database;
|
private NamedDB info, database;
|
||||||
private Socket sock;
|
private Socket sock;
|
||||||
private I2PSocketManager socketManager;
|
private I2PSocketManager socketManager;
|
||||||
|
private AtomicBoolean lives;
|
||||||
/**
|
|
||||||
* This is a more forgiving readline,
|
|
||||||
* it works on unbuffered streams
|
|
||||||
*
|
|
||||||
* @param in
|
|
||||||
* @return line of text as a String
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
private static String lnRead(InputStream in) throws Exception {
|
|
||||||
String S;
|
|
||||||
int b;
|
|
||||||
char c;
|
|
||||||
|
|
||||||
S = new String();
|
|
||||||
|
|
||||||
while(true) {
|
|
||||||
b = in.read();
|
|
||||||
if(b == 13) {
|
|
||||||
//skip CR
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if(b < 20 || b > 126) {
|
|
||||||
// exit on anything not legal
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
c = (char)(b & 0x7f); // We only really give a fuck about ASCII
|
|
||||||
S = new String(S + c);
|
|
||||||
}
|
|
||||||
return S;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
@ -87,11 +59,43 @@ public class TCPtoI2P implements Runnable {
|
|||||||
* param info
|
* param info
|
||||||
* param database
|
* param database
|
||||||
*/
|
*/
|
||||||
TCPtoI2P(I2PSocketManager i2p, Socket socket /*, NamedDB info, NamedDB database */) {
|
TCPtoI2P(I2PSocketManager i2p, Socket socket, NamedDB info, NamedDB database, AtomicBoolean lives) {
|
||||||
this.sock = socket;
|
this.sock = socket;
|
||||||
// this.info = info;
|
this.info = info;
|
||||||
// this.database = database;
|
this.database = database;
|
||||||
this.socketManager = i2p;
|
this.socketManager = i2p;
|
||||||
|
this.lives = lives;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a more forgiving readline,
|
||||||
|
* it works on unbuffered streams
|
||||||
|
*
|
||||||
|
* @param in
|
||||||
|
* @return line of text as a String
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
private static String lnRead(InputStream in) throws IOException {
|
||||||
|
String S;
|
||||||
|
int b;
|
||||||
|
char c;
|
||||||
|
|
||||||
|
S = new String();
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
b = in.read();
|
||||||
|
if (b == 13) {
|
||||||
|
//skip CR
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (b < 20 || b > 126) {
|
||||||
|
// exit on anything not legal
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
c = (char) (b & 0x7f); // We only really give a fuck about ASCII
|
||||||
|
S = new String(S + c);
|
||||||
|
}
|
||||||
|
return S;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -103,11 +107,24 @@ public class TCPtoI2P implements Runnable {
|
|||||||
*/
|
*/
|
||||||
private void Emsg(String e, OutputStream out) throws IOException {
|
private void Emsg(String e, OutputStream out) throws IOException {
|
||||||
// Debugging System.out.println("ERROR TCPtoI2P: " + e);
|
// Debugging System.out.println("ERROR TCPtoI2P: " + e);
|
||||||
out.write("ERROR".concat(e).getBytes());
|
out.write("ERROR ".concat(e).getBytes());
|
||||||
out.write(13); // cr
|
out.write(13);
|
||||||
|
out.write(10);
|
||||||
out.flush();
|
out.flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// private void rlock() throws Exception {
|
||||||
|
private void rlock() {
|
||||||
|
database.getReadLock();
|
||||||
|
info.getReadLock();
|
||||||
|
}
|
||||||
|
|
||||||
|
// private void runlock() throws Exception {
|
||||||
|
private void runlock() {
|
||||||
|
info.releaseReadLock();
|
||||||
|
database.releaseReadLock();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TCP stream to I2P stream thread starter
|
* TCP stream to I2P stream thread starter
|
||||||
*
|
*
|
||||||
@ -118,17 +135,17 @@ public class TCPtoI2P implements Runnable {
|
|||||||
OutputStream Iout = null;
|
OutputStream Iout = null;
|
||||||
InputStream in = null;
|
InputStream in = null;
|
||||||
OutputStream out = null;
|
OutputStream out = null;
|
||||||
|
Thread t = null;
|
||||||
|
Thread q = null;
|
||||||
try {
|
try {
|
||||||
|
|
||||||
in = sock.getInputStream();
|
|
||||||
out = sock.getOutputStream();
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
|
in = sock.getInputStream();
|
||||||
|
out = sock.getOutputStream();
|
||||||
line = lnRead(in);
|
line = lnRead(in);
|
||||||
input = line.toLowerCase();
|
input = line.toLowerCase();
|
||||||
Destination dest = null;
|
Destination dest = null;
|
||||||
|
if (input.endsWith(".i2p")) {
|
||||||
if(input.endsWith(".i2p")) {
|
|
||||||
dest = I2PTunnel.destFromName(input);
|
dest = I2PTunnel.destFromName(input);
|
||||||
line = dest.toBase64();
|
line = dest.toBase64();
|
||||||
}
|
}
|
||||||
@ -143,65 +160,79 @@ public class TCPtoI2P implements Runnable {
|
|||||||
Iin = I2P.getInputStream();
|
Iin = I2P.getInputStream();
|
||||||
Iout = I2P.getOutputStream();
|
Iout = I2P.getOutputStream();
|
||||||
// setup to cross the streams
|
// setup to cross the streams
|
||||||
TCPio conn_c = new TCPio(in, Iout /*, info, database */); // app -> I2P
|
TCPio conn_c = new TCPio(in, Iout, lives); // app -> I2P
|
||||||
TCPio conn_a = new TCPio(Iin, out /*, info, database */); // I2P -> app
|
TCPio conn_a = new TCPio(Iin, out, lives); // I2P -> app
|
||||||
Thread t = new Thread(conn_c, "TCPioA");
|
t = new Thread(conn_c, Thread.currentThread().getName() + " TCPioA");
|
||||||
Thread q = new Thread(conn_a, "TCPioB");
|
q = new Thread(conn_a, Thread.currentThread().getName() + " TCPioB");
|
||||||
// Fire!
|
// Fire!
|
||||||
t.start();
|
t.start();
|
||||||
q.start();
|
q.start();
|
||||||
while(t.isAlive() && q.isAlive()) { // AND is used here to kill off the other thread
|
while (t.isAlive() && q.isAlive() && lives.get()) { // AND is used here to kill off the other thread
|
||||||
// try {
|
Thread.sleep(10); //sleep for 10 ms
|
||||||
Thread.sleep(10); //sleep for 10 ms
|
|
||||||
// } catch(InterruptedException e) {
|
|
||||||
// nop
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
// System.out.println("TCPtoI2P: Going away...");
|
} catch (I2PException e) {
|
||||||
|
Emsg(e.toString(), out);
|
||||||
} catch(I2PException e) {
|
} catch (ConnectException e) {
|
||||||
Emsg("ERROR " + e.toString(), out);
|
Emsg(e.toString(), out);
|
||||||
} catch(ConnectException e) {
|
} catch (NoRouteToHostException e) {
|
||||||
Emsg("ERROR " + e.toString(), out);
|
Emsg(e.toString(), out);
|
||||||
} catch(NoRouteToHostException e) {
|
|
||||||
Emsg("ERROR " + e.toString(), out);
|
|
||||||
} catch(InterruptedIOException e) {
|
|
||||||
Emsg("ERROR " + e.toString(), out);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch(Exception e) {
|
} catch (InterruptedIOException e) {
|
||||||
Emsg("ERROR " + e.toString(), out);
|
// We're breaking away.
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
// ditto
|
||||||
|
} catch (IOException e) {
|
||||||
|
try {
|
||||||
|
Emsg(e.toString(), out);
|
||||||
|
} catch (IOException ex) {
|
||||||
|
// ditto
|
||||||
|
}
|
||||||
|
} catch (DataFormatException e) {
|
||||||
|
try {
|
||||||
|
Emsg(e.toString(), out);
|
||||||
|
} catch (IOException ex) {
|
||||||
|
// ditto
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} catch(Exception e) {
|
|
||||||
// bail on anything else
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
in.close();
|
|
||||||
} catch(Exception e) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
out.close();
|
|
||||||
} catch(Exception e) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
Iin.close();
|
|
||||||
} catch(Exception e) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
Iout.close();
|
|
||||||
} catch(Exception e) {
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
// System.out.println("TCPtoI2P: Close I2P");
|
|
||||||
I2P.close();
|
|
||||||
} catch(Exception e) {
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
} finally {
|
||||||
// System.out.println("TCPtoI2P: Close sock");
|
try {
|
||||||
sock.close();
|
t.interrupt();
|
||||||
} catch(Exception e) {
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
q.interrupt();
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
in.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
out.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Iin.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Iout.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
// System.out.println("TCPtoI2P: Close I2P");
|
||||||
|
I2P.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
// System.out.println("TCPtoI2P: Close sock");
|
||||||
|
sock.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// System.out.println("TCPtoI2P: Done.");
|
// System.out.println("TCPtoI2P: Done.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -78,26 +78,26 @@ public class UDPIOthread implements I2PSessionListener, Runnable {
|
|||||||
try {
|
try {
|
||||||
in = new DataInputStream(socket.getInputStream());
|
in = new DataInputStream(socket.getInputStream());
|
||||||
out = new DataOutputStream(socket.getOutputStream());
|
out = new DataOutputStream(socket.getOutputStream());
|
||||||
while(up) {
|
while (up) {
|
||||||
int c = in.read(data);
|
int c = in.read(data);
|
||||||
// Note: could do a loopback test here with a wrapper.
|
// Note: could do a loopback test here with a wrapper.
|
||||||
boolean ok = _session.sendMessage(_peerDestination, data, 0, c);
|
boolean ok = _session.sendMessage(_peerDestination, data, 0, c);
|
||||||
|
|
||||||
if(!ok) {
|
if (!ok) {
|
||||||
up = false; // Is this the right thing to do??
|
up = false; // Is this the right thing to do??
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch(IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
_log.error("Error running", ioe);
|
_log.error("Error running", ioe);
|
||||||
} catch(I2PSessionException ise) {
|
} catch (I2PSessionException ise) {
|
||||||
_log.error("Error communicating", ise);
|
_log.error("Error communicating", ise);
|
||||||
// } catch(DataFormatException dfe) {
|
// } catch(DataFormatException dfe) {
|
||||||
// _log.error("Peer destination file is not valid", dfe);
|
// _log.error("Peer destination file is not valid", dfe);
|
||||||
} finally {
|
} finally {
|
||||||
if(_session != null) {
|
if (_session != null) {
|
||||||
try {
|
try {
|
||||||
_session.destroySession();
|
_session.destroySession();
|
||||||
} catch(I2PSessionException ise) {
|
} catch (I2PSessionException ise) {
|
||||||
// ignored
|
// ignored
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -116,9 +116,9 @@ public class UDPIOthread implements I2PSessionListener, Runnable {
|
|||||||
byte msg[] = session.receiveMessage(msgId);
|
byte msg[] = session.receiveMessage(msgId);
|
||||||
out.write(msg);
|
out.write(msg);
|
||||||
out.flush();
|
out.flush();
|
||||||
} catch(I2PSessionException ise) {
|
} catch (I2PSessionException ise) {
|
||||||
up = false;
|
up = false;
|
||||||
} catch(IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
up = false;
|
up = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
<property name="dist" location="dist"/>
|
<property name="dist" location="dist"/>
|
||||||
<property name="jar" value="addressbook.jar"/>
|
<property name="jar" value="addressbook.jar"/>
|
||||||
<property name="war" value="addressbook.war"/>
|
<property name="war" value="addressbook.war"/>
|
||||||
|
<property name="javac.compilerargs" value="" />
|
||||||
|
|
||||||
<target name="init">
|
<target name="init">
|
||||||
<mkdir dir="${build}"/>
|
<mkdir dir="${build}"/>
|
||||||
@ -38,6 +39,7 @@
|
|||||||
<target name="compile" depends="init, depend">
|
<target name="compile" depends="init, depend">
|
||||||
<javac debug="true" deprecation="on" source="1.5" target="1.5"
|
<javac debug="true" deprecation="on" source="1.5" target="1.5"
|
||||||
srcdir="${src}" destdir="${build}">
|
srcdir="${src}" destdir="${build}">
|
||||||
|
<compilerarg line="${javac.compilerargs}" />
|
||||||
<classpath>
|
<classpath>
|
||||||
<pathelement location="../../core/java/build/i2p.jar" />
|
<pathelement location="../../core/java/build/i2p.jar" />
|
||||||
<pathelement location="../jetty/jettylib/javax.servlet.jar" />
|
<pathelement location="../jetty/jettylib/javax.servlet.jar" />
|
||||||
|
@ -94,20 +94,21 @@ public class AddressBook {
|
|||||||
* @param proxyPort port number of proxy
|
* @param proxyPort port number of proxy
|
||||||
*/
|
*/
|
||||||
public AddressBook(Subscription subscription, String proxyHost, int proxyPort) {
|
public AddressBook(Subscription subscription, String proxyHost, int proxyPort) {
|
||||||
|
File tmp = new File(I2PAppContext.getGlobalContext().getTempDir(), "addressbook.tmp");
|
||||||
this.location = subscription.getLocation();
|
this.location = subscription.getLocation();
|
||||||
EepGet get = new EepGet(I2PAppContext.getGlobalContext(), true,
|
EepGet get = new EepGet(I2PAppContext.getGlobalContext(), true,
|
||||||
proxyHost, proxyPort, 0, -1l, MAX_SUB_SIZE, "addressbook.tmp", null,
|
proxyHost, proxyPort, 0, -1l, MAX_SUB_SIZE, tmp.getAbsolutePath(), null,
|
||||||
subscription.getLocation(), true, subscription.getEtag(), subscription.getLastModified(), null);
|
subscription.getLocation(), true, subscription.getEtag(), subscription.getLastModified(), null);
|
||||||
if (get.fetch()) {
|
if (get.fetch()) {
|
||||||
subscription.setEtag(get.getETag());
|
subscription.setEtag(get.getETag());
|
||||||
subscription.setLastModified(get.getLastModified());
|
subscription.setLastModified(get.getLastModified());
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
this.addresses = ConfigParser.parse(new File("addressbook.tmp"));
|
this.addresses = ConfigParser.parse(tmp);
|
||||||
} catch (IOException exp) {
|
} catch (IOException exp) {
|
||||||
this.addresses = new HashMap();
|
this.addresses = new HashMap();
|
||||||
}
|
}
|
||||||
new File("addressbook.tmp").delete();
|
tmp.delete();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -39,6 +39,9 @@ import java.util.Map;
|
|||||||
* Utility class providing methods to parse and write files in config file
|
* Utility class providing methods to parse and write files in config file
|
||||||
* format, and subscription file format.
|
* format, and subscription file format.
|
||||||
*
|
*
|
||||||
|
* TODO: Change file encoding from default to UTF-8?
|
||||||
|
* Or switch to the DataHelper loadProps/storeProps methods?
|
||||||
|
*
|
||||||
* @author Ragnarok
|
* @author Ragnarok
|
||||||
*/
|
*/
|
||||||
public class ConfigParser {
|
public class ConfigParser {
|
||||||
|
@ -28,6 +28,8 @@ import java.util.LinkedList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import net.i2p.I2PAppContext;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Main class of addressbook. Performs updates, and runs the main loop.
|
* Main class of addressbook. Performs updates, and runs the main loop.
|
||||||
*
|
*
|
||||||
@ -125,11 +127,13 @@ public class Daemon {
|
|||||||
|
|
||||||
public void run(String[] args) {
|
public void run(String[] args) {
|
||||||
String settingsLocation = "config.txt";
|
String settingsLocation = "config.txt";
|
||||||
String home;
|
File homeFile;
|
||||||
if (args.length > 0) {
|
if (args.length > 0) {
|
||||||
home = args[0];
|
homeFile = new File(args[0]);
|
||||||
|
if (!homeFile.isAbsolute())
|
||||||
|
homeFile = new File(I2PAppContext.getGlobalContext().getRouterDir(), args[0]);
|
||||||
} else {
|
} else {
|
||||||
home = ".";
|
homeFile = new File(System.getProperty("user.dir"));
|
||||||
}
|
}
|
||||||
|
|
||||||
Map defaultSettings = new HashMap();
|
Map defaultSettings = new HashMap();
|
||||||
@ -145,7 +149,6 @@ public class Daemon {
|
|||||||
defaultSettings.put("last_modified", "last_modified");
|
defaultSettings.put("last_modified", "last_modified");
|
||||||
defaultSettings.put("update_delay", "12");
|
defaultSettings.put("update_delay", "12");
|
||||||
|
|
||||||
File homeFile = new File(home);
|
|
||||||
if (!homeFile.exists()) {
|
if (!homeFile.exists()) {
|
||||||
boolean created = homeFile.mkdirs();
|
boolean created = homeFile.mkdirs();
|
||||||
if (created)
|
if (created)
|
||||||
@ -169,7 +172,7 @@ public class Daemon {
|
|||||||
delay = 1;
|
delay = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
update(settings, home);
|
update(settings, homeFile.getAbsolutePath());
|
||||||
try {
|
try {
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
wait(delay * 60 * 60 * 1000);
|
wait(delay * 60 * 60 * 1000);
|
||||||
|
@ -54,9 +54,10 @@ public class Servlet extends GenericServlet {
|
|||||||
args[0] = config.getInitParameter("home");
|
args[0] = config.getInitParameter("home");
|
||||||
DaemonThread thread = new DaemonThread(args);
|
DaemonThread thread = new DaemonThread(args);
|
||||||
thread.setDaemon(true);
|
thread.setDaemon(true);
|
||||||
|
thread.setName("Addressbook");
|
||||||
thread.start();
|
thread.start();
|
||||||
System.out.println("INFO: Starting Addressbook " + Daemon.VERSION);
|
System.out.println("INFO: Starting Addressbook " + Daemon.VERSION);
|
||||||
System.out.println("INFO: config root under " + args[0]);
|
System.out.println("INFO: config root under " + args[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -73,7 +73,7 @@ class AdminRunner implements Runnable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void reply(OutputStream out, String content) throws IOException {
|
private void reply(OutputStream out, String content) throws IOException {
|
||||||
StringBuffer reply = new StringBuffer(10240);
|
StringBuilder reply = new StringBuilder(10240);
|
||||||
reply.append("HTTP/1.1 200 OK\n");
|
reply.append("HTTP/1.1 200 OK\n");
|
||||||
reply.append("Connection: close\n");
|
reply.append("Connection: close\n");
|
||||||
reply.append("Cache-control: no-cache\n");
|
reply.append("Cache-control: no-cache\n");
|
||||||
@ -90,7 +90,7 @@ class AdminRunner implements Runnable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void replyText(OutputStream out, String content) throws IOException {
|
private void replyText(OutputStream out, String content) throws IOException {
|
||||||
StringBuffer reply = new StringBuffer(10240);
|
StringBuilder reply = new StringBuilder(10240);
|
||||||
reply.append("HTTP/1.1 200 OK\n");
|
reply.append("HTTP/1.1 200 OK\n");
|
||||||
reply.append("Connection: close\n");
|
reply.append("Connection: close\n");
|
||||||
reply.append("Cache-control: no-cache\n");
|
reply.append("Cache-control: no-cache\n");
|
@ -76,10 +76,14 @@
|
|||||||
<property name="build_dist" location="dist"/>
|
<property name="build_dist" location="dist"/>
|
||||||
<property name="build_lib" location="lib"/>
|
<property name="build_lib" location="lib"/>
|
||||||
<property name="build_i2pref" location="../../build"/>
|
<property name="build_i2pref" location="../../build"/>
|
||||||
|
<property name="build_routerconsole" location="../routerconsole/java/build/"/>
|
||||||
|
<property name="build_i2ptunnel" location="../i2ptunnel/java/build/"/>
|
||||||
|
|
||||||
<path id="build_classpath">
|
<path id="build_classpath">
|
||||||
<fileset dir="${build_lib}" includes="**/*.jar"/>
|
<fileset dir="${build_lib}" includes="**/*.jar"/>
|
||||||
<fileset dir="${build_i2pref}" includes="**/*.jar"/>
|
<fileset dir="${build_i2pref}" includes="**/*.jar"/>
|
||||||
|
<fileset dir="${build_routerconsole}" includes="**/*.jar"/>
|
||||||
|
<fileset dir="${build_i2ptunnel}" includes="**/*.jar"/>
|
||||||
</path>
|
</path>
|
||||||
<target name="build_init">
|
<target name="build_init">
|
||||||
<!-- Create the time stamp -->
|
<!-- Create the time stamp -->
|
||||||
|
@ -152,7 +152,7 @@ is divided into following sections:
|
|||||||
<attribute default="${includes}" name="includes"/>
|
<attribute default="${includes}" name="includes"/>
|
||||||
<attribute default="${excludes}" name="excludes"/>
|
<attribute default="${excludes}" name="excludes"/>
|
||||||
<attribute default="${javac.debug}" name="debug"/>
|
<attribute default="${javac.debug}" name="debug"/>
|
||||||
<attribute default="" name="sourcepath"/>
|
<attribute default="/does/not/exist" name="sourcepath"/>
|
||||||
<element name="customize" optional="true"/>
|
<element name="customize" optional="true"/>
|
||||||
<sequential>
|
<sequential>
|
||||||
<javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}">
|
<javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}">
|
||||||
@ -218,13 +218,13 @@ is divided into following sections:
|
|||||||
</sequential>
|
</sequential>
|
||||||
</macrodef>
|
</macrodef>
|
||||||
</target>
|
</target>
|
||||||
<target name="-init-macrodef-nbjpda">
|
<target depends="-init-debug-args" name="-init-macrodef-nbjpda">
|
||||||
<macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
|
<macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
|
||||||
<attribute default="${main.class}" name="name"/>
|
<attribute default="${main.class}" name="name"/>
|
||||||
<attribute default="${debug.classpath}" name="classpath"/>
|
<attribute default="${debug.classpath}" name="classpath"/>
|
||||||
<attribute default="" name="stopclassname"/>
|
<attribute default="" name="stopclassname"/>
|
||||||
<sequential>
|
<sequential>
|
||||||
<nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="dt_socket">
|
<nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="${debug-transport}">
|
||||||
<classpath>
|
<classpath>
|
||||||
<path path="@{classpath}"/>
|
<path path="@{classpath}"/>
|
||||||
</classpath>
|
</classpath>
|
||||||
@ -255,6 +255,12 @@ is divided into following sections:
|
|||||||
<condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
|
<condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
|
||||||
<istrue value="${have-jdk-older-than-1.4}"/>
|
<istrue value="${have-jdk-older-than-1.4}"/>
|
||||||
</condition>
|
</condition>
|
||||||
|
<condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem">
|
||||||
|
<os family="windows"/>
|
||||||
|
</condition>
|
||||||
|
<condition else="${debug-transport-by-os}" property="debug-transport" value="${debug.transport}">
|
||||||
|
<isset property="debug.transport"/>
|
||||||
|
</condition>
|
||||||
</target>
|
</target>
|
||||||
<target depends="-init-debug-args" name="-init-macrodef-debug">
|
<target depends="-init-debug-args" name="-init-macrodef-debug">
|
||||||
<macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
|
<macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
|
||||||
@ -264,7 +270,7 @@ is divided into following sections:
|
|||||||
<sequential>
|
<sequential>
|
||||||
<java classname="@{classname}" dir="${work.dir}" fork="true">
|
<java classname="@{classname}" dir="${work.dir}" fork="true">
|
||||||
<jvmarg line="${debug-args-line}"/>
|
<jvmarg line="${debug-args-line}"/>
|
||||||
<jvmarg value="-Xrunjdwp:transport=dt_socket,address=${jpda.address}"/>
|
<jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
|
||||||
<jvmarg line="${run.jvmargs}"/>
|
<jvmarg line="${run.jvmargs}"/>
|
||||||
<classpath>
|
<classpath>
|
||||||
<path path="@{classpath}"/>
|
<path path="@{classpath}"/>
|
||||||
@ -311,6 +317,13 @@ is divided into following sections:
|
|||||||
===================
|
===================
|
||||||
-->
|
-->
|
||||||
<target depends="init" name="deps-jar" unless="no.deps"/>
|
<target depends="init" name="deps-jar" unless="no.deps"/>
|
||||||
|
<target depends="init,-check-automatic-build,-clean-after-automatic-build" name="-verify-automatic-build"/>
|
||||||
|
<target depends="init" name="-check-automatic-build">
|
||||||
|
<available file="${build.classes.dir}/.netbeans_automatic_build" property="netbeans.automatic.build"/>
|
||||||
|
</target>
|
||||||
|
<target depends="init" if="netbeans.automatic.build" name="-clean-after-automatic-build">
|
||||||
|
<antcall target="clean"/>
|
||||||
|
</target>
|
||||||
<target depends="init,deps-jar" name="-pre-pre-compile">
|
<target depends="init,deps-jar" name="-pre-pre-compile">
|
||||||
<mkdir dir="${build.classes.dir}"/>
|
<mkdir dir="${build.classes.dir}"/>
|
||||||
</target>
|
</target>
|
||||||
@ -331,7 +344,7 @@ is divided into following sections:
|
|||||||
<!-- Empty placeholder for easier customization. -->
|
<!-- Empty placeholder for easier customization. -->
|
||||||
<!-- You can override this target in the ../build.xml file. -->
|
<!-- You can override this target in the ../build.xml file. -->
|
||||||
</target>
|
</target>
|
||||||
<target depends="init,deps-jar,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/>
|
<target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/>
|
||||||
<target name="-pre-compile-single">
|
<target name="-pre-compile-single">
|
||||||
<!-- Empty placeholder for easier customization. -->
|
<!-- Empty placeholder for easier customization. -->
|
||||||
<!-- You can override this target in the ../build.xml file. -->
|
<!-- You can override this target in the ../build.xml file. -->
|
||||||
@ -345,7 +358,7 @@ is divided into following sections:
|
|||||||
<!-- Empty placeholder for easier customization. -->
|
<!-- Empty placeholder for easier customization. -->
|
||||||
<!-- You can override this target in the ../build.xml file. -->
|
<!-- You can override this target in the ../build.xml file. -->
|
||||||
</target>
|
</target>
|
||||||
<target depends="init,deps-jar,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/>
|
<target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/>
|
||||||
<!--
|
<!--
|
||||||
====================
|
====================
|
||||||
JAR BUILDING SECTION
|
JAR BUILDING SECTION
|
||||||
|
@ -3,6 +3,6 @@ build.xml.script.CRC32=9785bb9a
|
|||||||
build.xml.stylesheet.CRC32=be360661
|
build.xml.stylesheet.CRC32=be360661
|
||||||
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
|
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
|
||||||
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
|
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
|
||||||
nbproject/build-impl.xml.data.CRC32=c4b345cd
|
nbproject/build-impl.xml.data.CRC32=f630f8db
|
||||||
nbproject/build-impl.xml.script.CRC32=74d3fda2
|
nbproject/build-impl.xml.script.CRC32=8c02c081
|
||||||
nbproject/build-impl.xml.stylesheet.CRC32=487672f9
|
nbproject/build-impl.xml.stylesheet.CRC32=65b8de21
|
||||||
|
@ -22,7 +22,9 @@ dist.javadoc.dir=${dist.dir}/javadoc
|
|||||||
excludes=
|
excludes=
|
||||||
file.reference.appframework.jar=lib/appframework.jar
|
file.reference.appframework.jar=lib/appframework.jar
|
||||||
file.reference.i2p.jar=../../core/java/build/i2p.jar
|
file.reference.i2p.jar=../../core/java/build/i2p.jar
|
||||||
|
file.reference.i2ptunnel.jar=../i2ptunnel/java/build/i2ptunnel.jar
|
||||||
file.reference.router.jar=../../router/java/build/router.jar
|
file.reference.router.jar=../../router/java/build/router.jar
|
||||||
|
file.reference.routerconsole.jar=../routerconsole/java/build/routerconsole.jar
|
||||||
file.reference.swing-worker.jar=lib/swing-worker.jar
|
file.reference.swing-worker.jar=lib/swing-worker.jar
|
||||||
includes=**
|
includes=**
|
||||||
jar.compress=false
|
jar.compress=false
|
||||||
@ -30,7 +32,9 @@ javac.classpath=\
|
|||||||
${file.reference.router.jar}:\
|
${file.reference.router.jar}:\
|
||||||
${file.reference.appframework.jar}:\
|
${file.reference.appframework.jar}:\
|
||||||
${file.reference.swing-worker.jar}:\
|
${file.reference.swing-worker.jar}:\
|
||||||
${file.reference.i2p.jar}
|
${file.reference.i2p.jar}:\
|
||||||
|
${file.reference.routerconsole.jar}:\
|
||||||
|
${file.reference.i2ptunnel.jar}
|
||||||
# Space-separated list of extra javac options
|
# Space-separated list of extra javac options
|
||||||
javac.compilerargs=
|
javac.compilerargs=
|
||||||
javac.deprecation=false
|
javac.deprecation=false
|
||||||
@ -58,7 +62,7 @@ jnlp.codebase.url=file:/home/mathias/Documenten/Programmeren/i2p_monotone/repo/i
|
|||||||
jnlp.enabled=false
|
jnlp.enabled=false
|
||||||
jnlp.offline-allowed=false
|
jnlp.offline-allowed=false
|
||||||
jnlp.signed=false
|
jnlp.signed=false
|
||||||
main.class=desktopgui.Main
|
main.class=net.i2p.desktopgui.desktopgui.Main
|
||||||
manifest.file=manifest.mf
|
manifest.file=manifest.mf
|
||||||
meta.inf.dir=${src.dir}/META-INF
|
meta.inf.dir=${src.dir}/META-INF
|
||||||
platform.active=default_platform
|
platform.active=default_platform
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
</test-roots>
|
</test-roots>
|
||||||
</data>
|
</data>
|
||||||
<swingapp xmlns="http://www.netbeans.org/ns/form-swingapp/1">
|
<swingapp xmlns="http://www.netbeans.org/ns/form-swingapp/1">
|
||||||
<application-class name="desktopgui.Main"/>
|
<application-class name="net.i2p.desktopgui.desktopgui.Main"/>
|
||||||
</swingapp>
|
</swingapp>
|
||||||
</configuration>
|
</configuration>
|
||||||
</project>
|
</project>
|
||||||
|
@ -1,376 +0,0 @@
|
|||||||
/*
|
|
||||||
* GeneralConfiguration.java
|
|
||||||
*
|
|
||||||
* Created on 10 april 2009, 19:04
|
|
||||||
*/
|
|
||||||
|
|
||||||
package gui;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author mathias
|
|
||||||
*/
|
|
||||||
public class GeneralConfiguration extends javax.swing.JFrame {
|
|
||||||
|
|
||||||
/** Creates new form GeneralConfiguration */
|
|
||||||
public GeneralConfiguration() {
|
|
||||||
initComponents();
|
|
||||||
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
|
|
||||||
this.setVisible(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** This method is called from within the constructor to
|
|
||||||
* initialize the form.
|
|
||||||
* WARNING: Do NOT modify this code. The content of this method is
|
|
||||||
* always regenerated by the Form Editor.
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
|
||||||
private void initComponents() {
|
|
||||||
|
|
||||||
jPanel1 = new javax.swing.JPanel();
|
|
||||||
cancel = new javax.swing.JToggleButton();
|
|
||||||
ok = new javax.swing.JToggleButton();
|
|
||||||
jTabbedPane1 = new javax.swing.JTabbedPane();
|
|
||||||
jPanel2 = new javax.swing.JPanel();
|
|
||||||
jLabel1 = new javax.swing.JLabel();
|
|
||||||
jLabel2 = new javax.swing.JLabel();
|
|
||||||
jTextField1 = new javax.swing.JTextField();
|
|
||||||
jTextField2 = new javax.swing.JTextField();
|
|
||||||
jComboBox1 = new javax.swing.JComboBox();
|
|
||||||
jComboBox2 = new javax.swing.JComboBox();
|
|
||||||
jLabel3 = new javax.swing.JLabel();
|
|
||||||
jLabel4 = new javax.swing.JLabel();
|
|
||||||
jTextField3 = new javax.swing.JTextField();
|
|
||||||
jTextField4 = new javax.swing.JTextField();
|
|
||||||
jLabel5 = new javax.swing.JLabel();
|
|
||||||
jLabel6 = new javax.swing.JLabel();
|
|
||||||
jLabel7 = new javax.swing.JLabel();
|
|
||||||
jPanel3 = new javax.swing.JPanel();
|
|
||||||
jLabel8 = new javax.swing.JLabel();
|
|
||||||
jRadioButton1 = new javax.swing.JRadioButton();
|
|
||||||
jRadioButton2 = new javax.swing.JRadioButton();
|
|
||||||
jRadioButton3 = new javax.swing.JRadioButton();
|
|
||||||
jToggleButton1 = new javax.swing.JToggleButton();
|
|
||||||
jToggleButton2 = new javax.swing.JToggleButton();
|
|
||||||
jToggleButton3 = new javax.swing.JToggleButton();
|
|
||||||
jPanel4 = new javax.swing.JPanel();
|
|
||||||
jScrollPane1 = new javax.swing.JScrollPane();
|
|
||||||
jScrollPane2 = new javax.swing.JScrollPane();
|
|
||||||
jLabel9 = new javax.swing.JLabel();
|
|
||||||
jLabel10 = new javax.swing.JLabel();
|
|
||||||
jLabel11 = new javax.swing.JLabel();
|
|
||||||
jPanel5 = new javax.swing.JPanel();
|
|
||||||
jPanel6 = new javax.swing.JPanel();
|
|
||||||
|
|
||||||
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
|
|
||||||
setName("Form"); // NOI18N
|
|
||||||
|
|
||||||
jPanel1.setName("jPanel1"); // NOI18N
|
|
||||||
|
|
||||||
org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(desktopgui.Main.class).getContext().getResourceMap(GeneralConfiguration.class);
|
|
||||||
cancel.setText(resourceMap.getString("cancel.text")); // NOI18N
|
|
||||||
cancel.setName("cancel"); // NOI18N
|
|
||||||
|
|
||||||
ok.setText(resourceMap.getString("ok.text")); // NOI18N
|
|
||||||
ok.setName("ok"); // NOI18N
|
|
||||||
|
|
||||||
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
|
|
||||||
jPanel1.setLayout(jPanel1Layout);
|
|
||||||
jPanel1Layout.setHorizontalGroup(
|
|
||||||
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
|
|
||||||
.addContainerGap(475, Short.MAX_VALUE)
|
|
||||||
.addComponent(ok)
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addComponent(cancel)
|
|
||||||
.addContainerGap())
|
|
||||||
);
|
|
||||||
jPanel1Layout.setVerticalGroup(
|
|
||||||
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addGroup(jPanel1Layout.createSequentialGroup()
|
|
||||||
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
||||||
.addComponent(cancel)
|
|
||||||
.addComponent(ok))
|
|
||||||
.addContainerGap(14, Short.MAX_VALUE))
|
|
||||||
);
|
|
||||||
|
|
||||||
jTabbedPane1.setName("jTabbedPane1"); // NOI18N
|
|
||||||
|
|
||||||
jPanel2.setName("jPanel2"); // NOI18N
|
|
||||||
jPanel2.setLayout(null);
|
|
||||||
|
|
||||||
jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N
|
|
||||||
jLabel1.setName("jLabel1"); // NOI18N
|
|
||||||
jPanel2.add(jLabel1);
|
|
||||||
jLabel1.setBounds(20, 20, 140, 30);
|
|
||||||
|
|
||||||
jLabel2.setText(resourceMap.getString("jLabel2.text")); // NOI18N
|
|
||||||
jLabel2.setName("jLabel2"); // NOI18N
|
|
||||||
jPanel2.add(jLabel2);
|
|
||||||
jLabel2.setBounds(20, 60, 140, 30);
|
|
||||||
|
|
||||||
jTextField1.setText(resourceMap.getString("jTextField1.text")); // NOI18N
|
|
||||||
jTextField1.setName("jTextField1"); // NOI18N
|
|
||||||
jPanel2.add(jTextField1);
|
|
||||||
jTextField1.setBounds(160, 20, 77, 27);
|
|
||||||
|
|
||||||
jTextField2.setText(resourceMap.getString("jTextField2.text")); // NOI18N
|
|
||||||
jTextField2.setName("jTextField2"); // NOI18N
|
|
||||||
jPanel2.add(jTextField2);
|
|
||||||
jTextField2.setBounds(160, 60, 77, 27);
|
|
||||||
|
|
||||||
jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
|
|
||||||
jComboBox1.setName("jComboBox1"); // NOI18N
|
|
||||||
jPanel2.add(jComboBox1);
|
|
||||||
jComboBox1.setBounds(240, 20, 78, 27);
|
|
||||||
|
|
||||||
jComboBox2.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
|
|
||||||
jComboBox2.setName("jComboBox2"); // NOI18N
|
|
||||||
jPanel2.add(jComboBox2);
|
|
||||||
jComboBox2.setBounds(240, 60, 78, 27);
|
|
||||||
|
|
||||||
jLabel3.setText(resourceMap.getString("jLabel3.text")); // NOI18N
|
|
||||||
jLabel3.setName("jLabel3"); // NOI18N
|
|
||||||
jPanel2.add(jLabel3);
|
|
||||||
jLabel3.setBounds(330, 20, 97, 30);
|
|
||||||
|
|
||||||
jLabel4.setText(resourceMap.getString("jLabel4.text")); // NOI18N
|
|
||||||
jLabel4.setName("jLabel4"); // NOI18N
|
|
||||||
jPanel2.add(jLabel4);
|
|
||||||
jLabel4.setBounds(330, 60, 97, 30);
|
|
||||||
|
|
||||||
jTextField3.setText(resourceMap.getString("jTextField3.text")); // NOI18N
|
|
||||||
jTextField3.setName("jTextField3"); // NOI18N
|
|
||||||
jPanel2.add(jTextField3);
|
|
||||||
jTextField3.setBounds(440, 20, 60, 27);
|
|
||||||
|
|
||||||
jTextField4.setText(resourceMap.getString("jTextField4.text")); // NOI18N
|
|
||||||
jTextField4.setName("jTextField4"); // NOI18N
|
|
||||||
jPanel2.add(jTextField4);
|
|
||||||
jTextField4.setBounds(440, 60, 60, 27);
|
|
||||||
|
|
||||||
jLabel5.setText(resourceMap.getString("jLabel5.text")); // NOI18N
|
|
||||||
jLabel5.setName("jLabel5"); // NOI18N
|
|
||||||
jPanel2.add(jLabel5);
|
|
||||||
jLabel5.setBounds(510, 20, 19, 30);
|
|
||||||
|
|
||||||
jLabel6.setText(resourceMap.getString("jLabel6.text")); // NOI18N
|
|
||||||
jLabel6.setName("jLabel6"); // NOI18N
|
|
||||||
jPanel2.add(jLabel6);
|
|
||||||
jLabel6.setBounds(510, 60, 19, 30);
|
|
||||||
|
|
||||||
jLabel7.setText(resourceMap.getString("jLabel7.text")); // NOI18N
|
|
||||||
jLabel7.setName("jLabel7"); // NOI18N
|
|
||||||
jPanel2.add(jLabel7);
|
|
||||||
jLabel7.setBounds(20, 100, 520, 70);
|
|
||||||
|
|
||||||
jTabbedPane1.addTab(resourceMap.getString("jPanel2.TabConstraints.tabTitle"), jPanel2); // NOI18N
|
|
||||||
|
|
||||||
jPanel3.setName("jPanel3"); // NOI18N
|
|
||||||
|
|
||||||
jLabel8.setText(resourceMap.getString("jLabel8.text")); // NOI18N
|
|
||||||
jLabel8.setName("jLabel8"); // NOI18N
|
|
||||||
|
|
||||||
jRadioButton1.setText(resourceMap.getString("jRadioButton1.text")); // NOI18N
|
|
||||||
jRadioButton1.setName("jRadioButton1"); // NOI18N
|
|
||||||
|
|
||||||
jRadioButton2.setText(resourceMap.getString("jRadioButton2.text")); // NOI18N
|
|
||||||
jRadioButton2.setName("jRadioButton2"); // NOI18N
|
|
||||||
|
|
||||||
jRadioButton3.setText(resourceMap.getString("jRadioButton3.text")); // NOI18N
|
|
||||||
jRadioButton3.setName("jRadioButton3"); // NOI18N
|
|
||||||
|
|
||||||
jToggleButton1.setText(resourceMap.getString("jToggleButton1.text")); // NOI18N
|
|
||||||
jToggleButton1.setName("jToggleButton1"); // NOI18N
|
|
||||||
|
|
||||||
jToggleButton2.setText(resourceMap.getString("jToggleButton2.text")); // NOI18N
|
|
||||||
jToggleButton2.setName("jToggleButton2"); // NOI18N
|
|
||||||
|
|
||||||
jToggleButton3.setText(resourceMap.getString("jToggleButton3.text")); // NOI18N
|
|
||||||
jToggleButton3.setName("jToggleButton3"); // NOI18N
|
|
||||||
|
|
||||||
javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
|
|
||||||
jPanel3.setLayout(jPanel3Layout);
|
|
||||||
jPanel3Layout.setHorizontalGroup(
|
|
||||||
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addGroup(jPanel3Layout.createSequentialGroup()
|
|
||||||
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addGroup(jPanel3Layout.createSequentialGroup()
|
|
||||||
.addGap(20, 20, 20)
|
|
||||||
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addComponent(jLabel8)
|
|
||||||
.addGroup(jPanel3Layout.createSequentialGroup()
|
|
||||||
.addComponent(jToggleButton1)
|
|
||||||
.addGap(18, 18, 18)
|
|
||||||
.addComponent(jToggleButton2))))
|
|
||||||
.addGroup(jPanel3Layout.createSequentialGroup()
|
|
||||||
.addGap(40, 40, 40)
|
|
||||||
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addComponent(jRadioButton2)
|
|
||||||
.addComponent(jRadioButton1)
|
|
||||||
.addComponent(jRadioButton3))))
|
|
||||||
.addGap(9, 9, 9))
|
|
||||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup()
|
|
||||||
.addContainerGap(339, Short.MAX_VALUE)
|
|
||||||
.addComponent(jToggleButton3)
|
|
||||||
.addContainerGap())
|
|
||||||
);
|
|
||||||
jPanel3Layout.setVerticalGroup(
|
|
||||||
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addGroup(jPanel3Layout.createSequentialGroup()
|
|
||||||
.addContainerGap()
|
|
||||||
.addComponent(jLabel8)
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
|
||||||
.addComponent(jRadioButton1)
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addComponent(jRadioButton2)
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addComponent(jRadioButton3)
|
|
||||||
.addGap(18, 18, 18)
|
|
||||||
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
|
||||||
.addComponent(jToggleButton1)
|
|
||||||
.addComponent(jToggleButton2))
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 181, Short.MAX_VALUE)
|
|
||||||
.addComponent(jToggleButton3)
|
|
||||||
.addContainerGap())
|
|
||||||
);
|
|
||||||
|
|
||||||
jTabbedPane1.addTab(resourceMap.getString("jPanel3.TabConstraints.tabTitle"), jPanel3); // NOI18N
|
|
||||||
|
|
||||||
jPanel4.setName("jPanel4"); // NOI18N
|
|
||||||
|
|
||||||
jScrollPane1.setName("jScrollPane1"); // NOI18N
|
|
||||||
|
|
||||||
jScrollPane2.setName("jScrollPane2"); // NOI18N
|
|
||||||
|
|
||||||
jLabel9.setText(resourceMap.getString("jLabel9.text")); // NOI18N
|
|
||||||
jLabel9.setName("jLabel9"); // NOI18N
|
|
||||||
|
|
||||||
jLabel10.setText(resourceMap.getString("jLabel10.text")); // NOI18N
|
|
||||||
jLabel10.setName("jLabel10"); // NOI18N
|
|
||||||
|
|
||||||
jLabel11.setText(resourceMap.getString("jLabel11.text")); // NOI18N
|
|
||||||
jLabel11.setName("jLabel11"); // NOI18N
|
|
||||||
|
|
||||||
javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
|
|
||||||
jPanel4.setLayout(jPanel4Layout);
|
|
||||||
jPanel4Layout.setHorizontalGroup(
|
|
||||||
jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addGroup(jPanel4Layout.createSequentialGroup()
|
|
||||||
.addContainerGap()
|
|
||||||
.addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addComponent(jScrollPane2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE)
|
|
||||||
.addComponent(jLabel9, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE)
|
|
||||||
.addComponent(jLabel10)
|
|
||||||
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE)
|
|
||||||
.addComponent(jLabel11))
|
|
||||||
.addContainerGap())
|
|
||||||
);
|
|
||||||
jPanel4Layout.setVerticalGroup(
|
|
||||||
jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addGroup(jPanel4Layout.createSequentialGroup()
|
|
||||||
.addContainerGap()
|
|
||||||
.addComponent(jLabel10)
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 119, Short.MAX_VALUE)
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addComponent(jLabel11)
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 122, Short.MAX_VALUE)
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addComponent(jLabel9, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE)
|
|
||||||
.addContainerGap())
|
|
||||||
);
|
|
||||||
|
|
||||||
jTabbedPane1.addTab(resourceMap.getString("jPanel4.TabConstraints.tabTitle"), jPanel4); // NOI18N
|
|
||||||
|
|
||||||
jPanel5.setName("jPanel5"); // NOI18N
|
|
||||||
|
|
||||||
javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5);
|
|
||||||
jPanel5.setLayout(jPanel5Layout);
|
|
||||||
jPanel5Layout.setHorizontalGroup(
|
|
||||||
jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addGap(0, 562, Short.MAX_VALUE)
|
|
||||||
);
|
|
||||||
jPanel5Layout.setVerticalGroup(
|
|
||||||
jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addGap(0, 388, Short.MAX_VALUE)
|
|
||||||
);
|
|
||||||
|
|
||||||
jTabbedPane1.addTab(resourceMap.getString("jPanel5.TabConstraints.tabTitle"), jPanel5); // NOI18N
|
|
||||||
|
|
||||||
jPanel6.setName("jPanel6"); // NOI18N
|
|
||||||
|
|
||||||
javax.swing.GroupLayout jPanel6Layout = new javax.swing.GroupLayout(jPanel6);
|
|
||||||
jPanel6.setLayout(jPanel6Layout);
|
|
||||||
jPanel6Layout.setHorizontalGroup(
|
|
||||||
jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addGap(0, 562, Short.MAX_VALUE)
|
|
||||||
);
|
|
||||||
jPanel6Layout.setVerticalGroup(
|
|
||||||
jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addGap(0, 388, Short.MAX_VALUE)
|
|
||||||
);
|
|
||||||
|
|
||||||
jTabbedPane1.addTab(resourceMap.getString("jPanel6.TabConstraints.tabTitle"), jPanel6); // NOI18N
|
|
||||||
|
|
||||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
|
|
||||||
getContentPane().setLayout(layout);
|
|
||||||
layout.setHorizontalGroup(
|
|
||||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
||||||
.addGroup(layout.createSequentialGroup()
|
|
||||||
.addGap(12, 12, 12)
|
|
||||||
.addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 566, Short.MAX_VALUE))
|
|
||||||
);
|
|
||||||
layout.setVerticalGroup(
|
|
||||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
|
||||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
|
||||||
.addComponent(jTabbedPane1)
|
|
||||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
|
||||||
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
|
||||||
);
|
|
||||||
|
|
||||||
pack();
|
|
||||||
}// </editor-fold>//GEN-END:initComponents
|
|
||||||
|
|
||||||
|
|
||||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
|
||||||
private javax.swing.JToggleButton cancel;
|
|
||||||
private javax.swing.JComboBox jComboBox1;
|
|
||||||
private javax.swing.JComboBox jComboBox2;
|
|
||||||
private javax.swing.JLabel jLabel1;
|
|
||||||
private javax.swing.JLabel jLabel10;
|
|
||||||
private javax.swing.JLabel jLabel11;
|
|
||||||
private javax.swing.JLabel jLabel2;
|
|
||||||
private javax.swing.JLabel jLabel3;
|
|
||||||
private javax.swing.JLabel jLabel4;
|
|
||||||
private javax.swing.JLabel jLabel5;
|
|
||||||
private javax.swing.JLabel jLabel6;
|
|
||||||
private javax.swing.JLabel jLabel7;
|
|
||||||
private javax.swing.JLabel jLabel8;
|
|
||||||
private javax.swing.JLabel jLabel9;
|
|
||||||
private javax.swing.JPanel jPanel1;
|
|
||||||
private javax.swing.JPanel jPanel2;
|
|
||||||
private javax.swing.JPanel jPanel3;
|
|
||||||
private javax.swing.JPanel jPanel4;
|
|
||||||
private javax.swing.JPanel jPanel5;
|
|
||||||
private javax.swing.JPanel jPanel6;
|
|
||||||
private javax.swing.JRadioButton jRadioButton1;
|
|
||||||
private javax.swing.JRadioButton jRadioButton2;
|
|
||||||
private javax.swing.JRadioButton jRadioButton3;
|
|
||||||
private javax.swing.JScrollPane jScrollPane1;
|
|
||||||
private javax.swing.JScrollPane jScrollPane2;
|
|
||||||
private javax.swing.JTabbedPane jTabbedPane1;
|
|
||||||
private javax.swing.JTextField jTextField1;
|
|
||||||
private javax.swing.JTextField jTextField2;
|
|
||||||
private javax.swing.JTextField jTextField3;
|
|
||||||
private javax.swing.JTextField jTextField4;
|
|
||||||
private javax.swing.JToggleButton jToggleButton1;
|
|
||||||
private javax.swing.JToggleButton jToggleButton2;
|
|
||||||
private javax.swing.JToggleButton jToggleButton3;
|
|
||||||
private javax.swing.JToggleButton ok;
|
|
||||||
// End of variables declaration//GEN-END:variables
|
|
||||||
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
|
|
||||||
jPanel2.TabConstraints.tabTitle=Speed
|
|
||||||
jPanel3.TabConstraints.tabTitle=Updates
|
|
||||||
jPanel4.TabConstraints.tabTitle=Tunnels/Services
|
|
||||||
jPanel5.TabConstraints.tabTitle=Network
|
|
||||||
jPanel6.TabConstraints.tabTitle=Advanced
|
|
||||||
cancel.text=Cancel
|
|
||||||
ok.text=OK
|
|
||||||
jLabel1.text=Upload speed:
|
|
||||||
jLabel2.text=Download speed:
|
|
||||||
jTextField1.text=jTextField1
|
|
||||||
jTextField2.text=jTextField2
|
|
||||||
jLabel3.text=Monthly usage:
|
|
||||||
jLabel4.text=Monthly usage:
|
|
||||||
jTextField3.text=jTextField3
|
|
||||||
jTextField4.text=jTextField4
|
|
||||||
jLabel5.text=GB
|
|
||||||
jLabel6.text=GB
|
|
||||||
jLabel7.text=Explanation ...
|
|
||||||
jLabel8.text=What is your preferred automatic update setting?
|
|
||||||
jRadioButton1.text=Only inform about updates
|
|
||||||
jRadioButton2.text=Download and verify update file, do not restart
|
|
||||||
jRadioButton3.text=Download, verify and restart
|
|
||||||
jToggleButton1.text=Check for updates now
|
|
||||||
jToggleButton2.text=Update available: update now
|
|
||||||
jToggleButton3.text=Advanced update configuration
|
|
||||||
jLabel9.text=Tunnel explanation
|
|
||||||
jLabel10.text=Client tunnels:
|
|
||||||
jLabel11.text=Server tunnels:
|
|
@ -3,12 +3,12 @@
|
|||||||
* and open the template in the editor.
|
* and open the template in the editor.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package desktopgui;
|
package net.i2p.desktopgui.desktopgui;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author mathias
|
* @author mathias
|
||||||
*/
|
*/
|
||||||
public class GUIVersion {
|
public class GUIVersion {
|
||||||
public static final String VERSION = "0.0.1.1";
|
public static final String VERSION = "0.0.2";
|
||||||
}
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package desktopgui;
|
package net.i2p.desktopgui.desktopgui;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Main.java
|
* Main.java
|
||||||
@ -6,8 +6,8 @@ package desktopgui;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
import gui.Tray;
|
import net.i2p.desktopgui.gui.Tray;
|
||||||
import gui.SpeedSelector;
|
import net.i2p.desktopgui.gui.SpeedSelector;
|
||||||
import java.awt.SystemTray;
|
import java.awt.SystemTray;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
@ -16,7 +16,7 @@ import javax.swing.UIManager;
|
|||||||
import javax.swing.UnsupportedLookAndFeelException;
|
import javax.swing.UnsupportedLookAndFeelException;
|
||||||
import org.jdesktop.application.Application;
|
import org.jdesktop.application.Application;
|
||||||
import org.jdesktop.application.SingleFrameApplication;
|
import org.jdesktop.application.SingleFrameApplication;
|
||||||
import persistence.PropertyManager;
|
import net.i2p.desktopgui.persistence.PropertyManager;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The main class of the application.
|
* The main class of the application.
|
@ -0,0 +1,396 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
|
||||||
|
<Form version="1.5" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
|
||||||
|
<Properties>
|
||||||
|
<Property name="defaultCloseOperation" type="int" value="3"/>
|
||||||
|
<Property name="title" type="java.lang.String" resourceKey="Form.title"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="Form" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<SyntheticProperties>
|
||||||
|
<SyntheticProperty name="formSizePolicy" type="int" value="1"/>
|
||||||
|
</SyntheticProperties>
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/>
|
||||||
|
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
|
||||||
|
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
|
||||||
|
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
||||||
|
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
||||||
|
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
||||||
|
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
||||||
|
<AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,2,48,0,0,2,48"/>
|
||||||
|
</AuxValues>
|
||||||
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
|
||||||
|
<Property name="useNullLayout" type="boolean" value="true"/>
|
||||||
|
</Layout>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JLabel" name="tunnelNameLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="tunnelNameLabel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="tunnelNameLabel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="20" y="20" width="120" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="tunnelTypeLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="tunnelTypeLabel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="tunnelTypeLabel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="20" y="50" width="120" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="tunnelPortLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="tunnelPortLabel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="tunnelPortLabel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="20" y="80" width="110" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="tunnelDestinationLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="tunnelDestinationLabel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="tunnelDestinationLabel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="20" y="110" width="110" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="tunnelProfileLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="tunnelProfileLabel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="tunnelProfileLabel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="20" y="140" width="110" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JCheckBox" name="delayConnect">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="delayConnect.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="delayConnect" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="20" y="170" width="160" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JCheckBox" name="sharedClient">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="sharedClient.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="sharedClient" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="20" y="200" width="160" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JCheckBox" name="autoStart">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="autoStart.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="autoStart" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="20" y="230" width="160" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JSeparator" name="jSeparator1">
|
||||||
|
<Properties>
|
||||||
|
<Property name="name" type="java.lang.String" value="jSeparator1" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="0" y="510" width="750" height="10"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="tunnelDepthLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="tunnelDepthLabel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="tunnelDepthLabel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="20" y="280" width="160" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="depthVarianceLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="depthVarianceLabel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="depthVarianceLabel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="20" y="310" width="160" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="tunnelCountLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="tunnelCountLabel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="tunnelCountLabel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="20" y="340" width="160" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="backupTunnelCountLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="backupTunnelCountLabel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="backupTunnelCountLabel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="20" y="370" width="170" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JSeparator" name="jSeparator2">
|
||||||
|
<Properties>
|
||||||
|
<Property name="name" type="java.lang.String" value="jSeparator2" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="0" y="260" width="750" height="10"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JCheckBox" name="reduceIdle">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="reduceIdle.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="reduceIdle" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="20" y="420" width="300" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JCheckBox" name="closeIdle">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="closeIdle.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="closeIdle" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="20" y="450" width="370" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JCheckBox" name="delayIdle">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="delayIdle.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="delayIdle" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="20" y="480" width="400" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JSeparator" name="jSeparator3">
|
||||||
|
<Properties>
|
||||||
|
<Property name="name" type="java.lang.String" value="jSeparator3" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="0" y="400" width="760" height="10"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JButton" name="save">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="save.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="save" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="saveActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="10" y="520" width="-1" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JButton" name="cancel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="cancel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="cancel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="cancelActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="60" y="520" width="-1" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JTextField" name="tunnelName">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="tunnelName.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="tunnelName" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="200" y="20" width="340" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="tunnelType">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="tunnelType.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="tunnelType" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="200" y="50" width="340" height="20"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JTextField" name="tunnelPort">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="tunnelPort.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="tunnelPort" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="200" y="70" width="340" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JTextField" name="tunnelDestination">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="tunnelDestination.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="tunnelDestination" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="200" y="100" width="340" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JComboBox" name="tunnelProfile">
|
||||||
|
<Properties>
|
||||||
|
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
|
||||||
|
<StringArray count="2">
|
||||||
|
<StringItem index="0" value="Interactive connection (Instant messaging)"/>
|
||||||
|
<StringItem index="1" value="Bulk connection (Downloads, websites...)"/>
|
||||||
|
</StringArray>
|
||||||
|
</Property>
|
||||||
|
<Property name="name" type="java.lang.String" value="tunnelProfile" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="200" y="130" width="340" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JComboBox" name="tunnelDepth">
|
||||||
|
<Properties>
|
||||||
|
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
|
||||||
|
<StringArray count="4">
|
||||||
|
<StringItem index="0" value="0 hop tunnel (no anonymity, low latency)"/>
|
||||||
|
<StringItem index="1" value="1 hop tunnel (low anonymity, low latency)"/>
|
||||||
|
<StringItem index="2" value="2 hop tunnel (medium anonymity, medium latency)"/>
|
||||||
|
<StringItem index="3" value="3 hop tunnel (high anonymity, high latency)"/>
|
||||||
|
</StringArray>
|
||||||
|
</Property>
|
||||||
|
<Property name="name" type="java.lang.String" value="tunnelDepth" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="200" y="280" width="350" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JComboBox" name="depthVariance">
|
||||||
|
<Properties>
|
||||||
|
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
|
||||||
|
<StringArray count="5">
|
||||||
|
<StringItem index="0" value="0 hop variance (no random, good performance)"/>
|
||||||
|
<StringItem index="1" value="+ 0-1 hop variance (slightly random, lower performance)"/>
|
||||||
|
<StringItem index="2" value="+ 0-2 hop variance (very random, lower performance)"/>
|
||||||
|
<StringItem index="3" value="+/- 0-1 hop variance (slightly random, standard performance)"/>
|
||||||
|
<StringItem index="4" value="+/- 0-2 hop variance (not recommended)"/>
|
||||||
|
</StringArray>
|
||||||
|
</Property>
|
||||||
|
<Property name="name" type="java.lang.String" value="depthVariance" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="200" y="310" width="350" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JComboBox" name="tunnelCount">
|
||||||
|
<Properties>
|
||||||
|
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
|
||||||
|
<StringArray count="3">
|
||||||
|
<StringItem index="0" value="1 tunnel (low bandwidth usage, low reliability)"/>
|
||||||
|
<StringItem index="1" value="2 tunnels (standard bandwidth usage, standard reliability)"/>
|
||||||
|
<StringItem index="2" value="3 tunnels (high bandwidth usage, high reliability)"/>
|
||||||
|
</StringArray>
|
||||||
|
</Property>
|
||||||
|
<Property name="name" type="java.lang.String" value="tunnelCount" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="200" y="340" width="350" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JComboBox" name="backupTunnelCount">
|
||||||
|
<Properties>
|
||||||
|
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
|
||||||
|
<StringArray count="4">
|
||||||
|
<StringItem index="0" value="0 backup tunnels (no redundancy, no resource usage)"/>
|
||||||
|
<StringItem index="1" value="1 backup tunnel (low redundancy, low resource usage)"/>
|
||||||
|
<StringItem index="2" value="2 backup tunnels (medium redundancy, medium resource usage)"/>
|
||||||
|
<StringItem index="3" value="3 backup tunnels (high redundancy, high resource usage)"/>
|
||||||
|
</StringArray>
|
||||||
|
</Property>
|
||||||
|
<Property name="name" type="java.lang.String" value="backupTunnelCount" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="200" y="370" width="350" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JButton" name="changeTunnelState">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="changeTunnelState.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="changeTunnelState" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="160" y="520" width="150" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Form>
|
@ -0,0 +1,434 @@
|
|||||||
|
/*
|
||||||
|
* ClientTunnelWindow.java
|
||||||
|
*
|
||||||
|
* Created on 10-jun-2009, 16:49:12
|
||||||
|
*/
|
||||||
|
|
||||||
|
package net.i2p.desktopgui.gui;
|
||||||
|
|
||||||
|
import net.i2p.i2ptunnel.web.EditBean;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author mathias
|
||||||
|
*/
|
||||||
|
public class ClientTunnelWindow extends javax.swing.JFrame {
|
||||||
|
|
||||||
|
/** Creates new form ClientTunnelWindow */
|
||||||
|
public ClientTunnelWindow(int tunnelNumber, ActionListener al) {
|
||||||
|
initComponents();
|
||||||
|
this.tunnelNumber = tunnelNumber;
|
||||||
|
this.al = al;
|
||||||
|
extraInitComponents();
|
||||||
|
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
|
||||||
|
this.setSize(600, 600);
|
||||||
|
this.setLocationRelativeTo(null);
|
||||||
|
this.requestFocus();
|
||||||
|
this.changeTunnelState.setVisible(false); //TODO: implement tunnel state change
|
||||||
|
this.setVisible(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void extraInitComponents() {
|
||||||
|
EditBean bean = new EditBean();
|
||||||
|
if(!bean.isClient(tunnelNumber)) {
|
||||||
|
this.dispose();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.tunnelName.setText(bean.getTunnelName(tunnelNumber));
|
||||||
|
this.tunnelType.setText(bean.getTunnelType(tunnelNumber));
|
||||||
|
this.tunnelPort.setText(bean.getClientPort(tunnelNumber));
|
||||||
|
this.tunnelDestination.setText(bean.getClientDestination(tunnelNumber));
|
||||||
|
|
||||||
|
if(bean.getTunnelType(tunnelNumber).equals(TYPE_STREAMR_CLIENT)) {
|
||||||
|
tunnelProfile.setVisible(false);
|
||||||
|
tunnelProfileLabel.setVisible(false);
|
||||||
|
this.delayConnect.setVisible(false);
|
||||||
|
this.sharedClient.setVisible(false);
|
||||||
|
this.autoStart.setVisible(false);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(bean.isInteractive(tunnelNumber)) {
|
||||||
|
tunnelProfile.setSelectedIndex(TUNNEL_INTERACTIVE);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
tunnelProfile.setSelectedIndex(TUNNEL_BULK);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.delayConnect.setSelected(bean.shouldDelay(tunnelNumber));
|
||||||
|
this.sharedClient.setSelected(bean.isSharedClient(tunnelNumber));
|
||||||
|
this.autoStart.setSelected(bean.startAutomatically(tunnelNumber));
|
||||||
|
}
|
||||||
|
|
||||||
|
this.tunnelDepth.setSelectedIndex(bean.getTunnelDepth(tunnelNumber, 2));
|
||||||
|
|
||||||
|
int variance = bean.getTunnelVariance(tunnelNumber, 0);
|
||||||
|
if(variance == 0) {
|
||||||
|
this.depthVariance.setSelectedIndex(0);
|
||||||
|
}
|
||||||
|
else if(variance == 1) {
|
||||||
|
this.depthVariance.setSelectedIndex(1);
|
||||||
|
}
|
||||||
|
else if(variance == 2) {
|
||||||
|
this.depthVariance.setSelectedIndex(2);
|
||||||
|
}
|
||||||
|
else if(variance == -1) {
|
||||||
|
this.depthVariance.setSelectedIndex(3);
|
||||||
|
}
|
||||||
|
else if(variance == -2) {
|
||||||
|
this.depthVariance.setSelectedIndex(4);
|
||||||
|
}
|
||||||
|
|
||||||
|
int tunnelQuantity = bean.getTunnelQuantity(tunnelNumber, 2) - 1;
|
||||||
|
if(tunnelQuantity >= 0 && tunnelQuantity <= 2) {
|
||||||
|
this.tunnelCount.setSelectedIndex(tunnelQuantity);
|
||||||
|
}
|
||||||
|
|
||||||
|
int backupTunnelQuantity = bean.getTunnelBackupQuantity(tunnelNumber, 0);
|
||||||
|
if(backupTunnelQuantity >= 0 && backupTunnelQuantity <= 3) {
|
||||||
|
this.backupTunnelCount.setSelectedIndex(backupTunnelQuantity);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(bean.getTunnelType(tunnelNumber).equals(TYPE_STREAMR_CLIENT)) {
|
||||||
|
this.reduceIdle.setVisible(false);
|
||||||
|
this.closeIdle.setVisible(false);
|
||||||
|
this.delayIdle.setVisible(false);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.reduceIdle.setSelected(bean.getReduce(tunnelNumber));
|
||||||
|
this.closeIdle.setSelected(bean.getClose(tunnelNumber));
|
||||||
|
this.delayIdle.setSelected(bean.getDelayOpen(tunnelNumber));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** This method is called from within the constructor to
|
||||||
|
* initialize the form.
|
||||||
|
* WARNING: Do NOT modify this code. The content of this method is
|
||||||
|
* always regenerated by the Form Editor.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||||
|
private void initComponents() {
|
||||||
|
|
||||||
|
tunnelNameLabel = new javax.swing.JLabel();
|
||||||
|
tunnelTypeLabel = new javax.swing.JLabel();
|
||||||
|
tunnelPortLabel = new javax.swing.JLabel();
|
||||||
|
tunnelDestinationLabel = new javax.swing.JLabel();
|
||||||
|
tunnelProfileLabel = new javax.swing.JLabel();
|
||||||
|
delayConnect = new javax.swing.JCheckBox();
|
||||||
|
sharedClient = new javax.swing.JCheckBox();
|
||||||
|
autoStart = new javax.swing.JCheckBox();
|
||||||
|
jSeparator1 = new javax.swing.JSeparator();
|
||||||
|
tunnelDepthLabel = new javax.swing.JLabel();
|
||||||
|
depthVarianceLabel = new javax.swing.JLabel();
|
||||||
|
tunnelCountLabel = new javax.swing.JLabel();
|
||||||
|
backupTunnelCountLabel = new javax.swing.JLabel();
|
||||||
|
jSeparator2 = new javax.swing.JSeparator();
|
||||||
|
reduceIdle = new javax.swing.JCheckBox();
|
||||||
|
closeIdle = new javax.swing.JCheckBox();
|
||||||
|
delayIdle = new javax.swing.JCheckBox();
|
||||||
|
jSeparator3 = new javax.swing.JSeparator();
|
||||||
|
save = new javax.swing.JButton();
|
||||||
|
cancel = new javax.swing.JButton();
|
||||||
|
tunnelName = new javax.swing.JTextField();
|
||||||
|
tunnelType = new javax.swing.JLabel();
|
||||||
|
tunnelPort = new javax.swing.JTextField();
|
||||||
|
tunnelDestination = new javax.swing.JTextField();
|
||||||
|
tunnelProfile = new javax.swing.JComboBox();
|
||||||
|
tunnelDepth = new javax.swing.JComboBox();
|
||||||
|
depthVariance = new javax.swing.JComboBox();
|
||||||
|
tunnelCount = new javax.swing.JComboBox();
|
||||||
|
backupTunnelCount = new javax.swing.JComboBox();
|
||||||
|
changeTunnelState = new javax.swing.JButton();
|
||||||
|
|
||||||
|
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
|
||||||
|
org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(ClientTunnelWindow.class);
|
||||||
|
setTitle(resourceMap.getString("Form.title")); // NOI18N
|
||||||
|
setName("Form"); // NOI18N
|
||||||
|
getContentPane().setLayout(null);
|
||||||
|
|
||||||
|
tunnelNameLabel.setText(resourceMap.getString("tunnelNameLabel.text")); // NOI18N
|
||||||
|
tunnelNameLabel.setName("tunnelNameLabel"); // NOI18N
|
||||||
|
getContentPane().add(tunnelNameLabel);
|
||||||
|
tunnelNameLabel.setBounds(20, 20, 120, 17);
|
||||||
|
|
||||||
|
tunnelTypeLabel.setText(resourceMap.getString("tunnelTypeLabel.text")); // NOI18N
|
||||||
|
tunnelTypeLabel.setName("tunnelTypeLabel"); // NOI18N
|
||||||
|
getContentPane().add(tunnelTypeLabel);
|
||||||
|
tunnelTypeLabel.setBounds(20, 50, 120, 17);
|
||||||
|
|
||||||
|
tunnelPortLabel.setText(resourceMap.getString("tunnelPortLabel.text")); // NOI18N
|
||||||
|
tunnelPortLabel.setName("tunnelPortLabel"); // NOI18N
|
||||||
|
getContentPane().add(tunnelPortLabel);
|
||||||
|
tunnelPortLabel.setBounds(20, 80, 110, 17);
|
||||||
|
|
||||||
|
tunnelDestinationLabel.setText(resourceMap.getString("tunnelDestinationLabel.text")); // NOI18N
|
||||||
|
tunnelDestinationLabel.setName("tunnelDestinationLabel"); // NOI18N
|
||||||
|
getContentPane().add(tunnelDestinationLabel);
|
||||||
|
tunnelDestinationLabel.setBounds(20, 110, 110, 17);
|
||||||
|
|
||||||
|
tunnelProfileLabel.setText(resourceMap.getString("tunnelProfileLabel.text")); // NOI18N
|
||||||
|
tunnelProfileLabel.setName("tunnelProfileLabel"); // NOI18N
|
||||||
|
getContentPane().add(tunnelProfileLabel);
|
||||||
|
tunnelProfileLabel.setBounds(20, 140, 110, 17);
|
||||||
|
|
||||||
|
delayConnect.setText(resourceMap.getString("delayConnect.text")); // NOI18N
|
||||||
|
delayConnect.setName("delayConnect"); // NOI18N
|
||||||
|
getContentPane().add(delayConnect);
|
||||||
|
delayConnect.setBounds(20, 170, 160, 22);
|
||||||
|
|
||||||
|
sharedClient.setText(resourceMap.getString("sharedClient.text")); // NOI18N
|
||||||
|
sharedClient.setName("sharedClient"); // NOI18N
|
||||||
|
getContentPane().add(sharedClient);
|
||||||
|
sharedClient.setBounds(20, 200, 160, 22);
|
||||||
|
|
||||||
|
autoStart.setText(resourceMap.getString("autoStart.text")); // NOI18N
|
||||||
|
autoStart.setName("autoStart"); // NOI18N
|
||||||
|
getContentPane().add(autoStart);
|
||||||
|
autoStart.setBounds(20, 230, 160, 22);
|
||||||
|
|
||||||
|
jSeparator1.setName("jSeparator1"); // NOI18N
|
||||||
|
getContentPane().add(jSeparator1);
|
||||||
|
jSeparator1.setBounds(0, 510, 750, 10);
|
||||||
|
|
||||||
|
tunnelDepthLabel.setText(resourceMap.getString("tunnelDepthLabel.text")); // NOI18N
|
||||||
|
tunnelDepthLabel.setName("tunnelDepthLabel"); // NOI18N
|
||||||
|
getContentPane().add(tunnelDepthLabel);
|
||||||
|
tunnelDepthLabel.setBounds(20, 280, 160, 17);
|
||||||
|
|
||||||
|
depthVarianceLabel.setText(resourceMap.getString("depthVarianceLabel.text")); // NOI18N
|
||||||
|
depthVarianceLabel.setName("depthVarianceLabel"); // NOI18N
|
||||||
|
getContentPane().add(depthVarianceLabel);
|
||||||
|
depthVarianceLabel.setBounds(20, 310, 160, 17);
|
||||||
|
|
||||||
|
tunnelCountLabel.setText(resourceMap.getString("tunnelCountLabel.text")); // NOI18N
|
||||||
|
tunnelCountLabel.setName("tunnelCountLabel"); // NOI18N
|
||||||
|
getContentPane().add(tunnelCountLabel);
|
||||||
|
tunnelCountLabel.setBounds(20, 340, 160, 17);
|
||||||
|
|
||||||
|
backupTunnelCountLabel.setText(resourceMap.getString("backupTunnelCountLabel.text")); // NOI18N
|
||||||
|
backupTunnelCountLabel.setName("backupTunnelCountLabel"); // NOI18N
|
||||||
|
getContentPane().add(backupTunnelCountLabel);
|
||||||
|
backupTunnelCountLabel.setBounds(20, 370, 170, 17);
|
||||||
|
|
||||||
|
jSeparator2.setName("jSeparator2"); // NOI18N
|
||||||
|
getContentPane().add(jSeparator2);
|
||||||
|
jSeparator2.setBounds(0, 260, 750, 10);
|
||||||
|
|
||||||
|
reduceIdle.setText(resourceMap.getString("reduceIdle.text")); // NOI18N
|
||||||
|
reduceIdle.setName("reduceIdle"); // NOI18N
|
||||||
|
getContentPane().add(reduceIdle);
|
||||||
|
reduceIdle.setBounds(20, 420, 300, 22);
|
||||||
|
|
||||||
|
closeIdle.setText(resourceMap.getString("closeIdle.text")); // NOI18N
|
||||||
|
closeIdle.setName("closeIdle"); // NOI18N
|
||||||
|
getContentPane().add(closeIdle);
|
||||||
|
closeIdle.setBounds(20, 450, 370, 22);
|
||||||
|
|
||||||
|
delayIdle.setText(resourceMap.getString("delayIdle.text")); // NOI18N
|
||||||
|
delayIdle.setName("delayIdle"); // NOI18N
|
||||||
|
getContentPane().add(delayIdle);
|
||||||
|
delayIdle.setBounds(20, 480, 400, 22);
|
||||||
|
|
||||||
|
jSeparator3.setName("jSeparator3"); // NOI18N
|
||||||
|
getContentPane().add(jSeparator3);
|
||||||
|
jSeparator3.setBounds(0, 400, 760, 10);
|
||||||
|
|
||||||
|
save.setText(resourceMap.getString("save.text")); // NOI18N
|
||||||
|
save.setName("save"); // NOI18N
|
||||||
|
save.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
saveActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
getContentPane().add(save);
|
||||||
|
save.setBounds(10, 520, 44, 29);
|
||||||
|
|
||||||
|
cancel.setText(resourceMap.getString("cancel.text")); // NOI18N
|
||||||
|
cancel.setName("cancel"); // NOI18N
|
||||||
|
cancel.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
cancelActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
getContentPane().add(cancel);
|
||||||
|
cancel.setBounds(60, 520, 55, 29);
|
||||||
|
|
||||||
|
tunnelName.setText(resourceMap.getString("tunnelName.text")); // NOI18N
|
||||||
|
tunnelName.setName("tunnelName"); // NOI18N
|
||||||
|
getContentPane().add(tunnelName);
|
||||||
|
tunnelName.setBounds(200, 20, 340, 27);
|
||||||
|
|
||||||
|
tunnelType.setText(resourceMap.getString("tunnelType.text")); // NOI18N
|
||||||
|
tunnelType.setName("tunnelType"); // NOI18N
|
||||||
|
getContentPane().add(tunnelType);
|
||||||
|
tunnelType.setBounds(200, 50, 340, 20);
|
||||||
|
|
||||||
|
tunnelPort.setText(resourceMap.getString("tunnelPort.text")); // NOI18N
|
||||||
|
tunnelPort.setName("tunnelPort"); // NOI18N
|
||||||
|
getContentPane().add(tunnelPort);
|
||||||
|
tunnelPort.setBounds(200, 70, 340, 27);
|
||||||
|
|
||||||
|
tunnelDestination.setText(resourceMap.getString("tunnelDestination.text")); // NOI18N
|
||||||
|
tunnelDestination.setName("tunnelDestination"); // NOI18N
|
||||||
|
getContentPane().add(tunnelDestination);
|
||||||
|
tunnelDestination.setBounds(200, 100, 340, 27);
|
||||||
|
|
||||||
|
tunnelProfile.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Interactive connection (Instant messaging)", "Bulk connection (Downloads, websites...)" }));
|
||||||
|
tunnelProfile.setName("tunnelProfile"); // NOI18N
|
||||||
|
getContentPane().add(tunnelProfile);
|
||||||
|
tunnelProfile.setBounds(200, 130, 340, 27);
|
||||||
|
|
||||||
|
tunnelDepth.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "0 hop tunnel (no anonymity, low latency)", "1 hop tunnel (low anonymity, low latency)", "2 hop tunnel (medium anonymity, medium latency)", "3 hop tunnel (high anonymity, high latency)" }));
|
||||||
|
tunnelDepth.setName("tunnelDepth"); // NOI18N
|
||||||
|
getContentPane().add(tunnelDepth);
|
||||||
|
tunnelDepth.setBounds(200, 280, 350, 27);
|
||||||
|
|
||||||
|
depthVariance.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "0 hop variance (no random, good performance)", "+ 0-1 hop variance (slightly random, lower performance)", "+ 0-2 hop variance (very random, lower performance)", "+/- 0-1 hop variance (slightly random, standard performance)", "+/- 0-2 hop variance (not recommended)" }));
|
||||||
|
depthVariance.setName("depthVariance"); // NOI18N
|
||||||
|
getContentPane().add(depthVariance);
|
||||||
|
depthVariance.setBounds(200, 310, 350, 27);
|
||||||
|
|
||||||
|
tunnelCount.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "1 tunnel (low bandwidth usage, low reliability)", "2 tunnels (standard bandwidth usage, standard reliability)", "3 tunnels (high bandwidth usage, high reliability)" }));
|
||||||
|
tunnelCount.setName("tunnelCount"); // NOI18N
|
||||||
|
getContentPane().add(tunnelCount);
|
||||||
|
tunnelCount.setBounds(200, 340, 350, 27);
|
||||||
|
|
||||||
|
backupTunnelCount.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "0 backup tunnels (no redundancy, no resource usage)", "1 backup tunnel (low redundancy, low resource usage)", "2 backup tunnels (medium redundancy, medium resource usage)", "3 backup tunnels (high redundancy, high resource usage)" }));
|
||||||
|
backupTunnelCount.setName("backupTunnelCount"); // NOI18N
|
||||||
|
getContentPane().add(backupTunnelCount);
|
||||||
|
backupTunnelCount.setBounds(200, 370, 350, 27);
|
||||||
|
|
||||||
|
changeTunnelState.setText(resourceMap.getString("changeTunnelState.text")); // NOI18N
|
||||||
|
changeTunnelState.setName("changeTunnelState"); // NOI18N
|
||||||
|
getContentPane().add(changeTunnelState);
|
||||||
|
changeTunnelState.setBounds(160, 520, 150, 29);
|
||||||
|
|
||||||
|
pack();
|
||||||
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
|
private void saveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_saveActionPerformed
|
||||||
|
EditBean bean = new EditBean();
|
||||||
|
if(!bean.isClient(tunnelNumber)) {
|
||||||
|
al.actionPerformed(evt);
|
||||||
|
this.dispose();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
bean.setTunnel("" + tunnelNumber);
|
||||||
|
bean.setName(tunnelName.getText());
|
||||||
|
bean.setPort(tunnelPort.getText());
|
||||||
|
bean.setTargetDestination(tunnelDestination.getText());
|
||||||
|
if(!bean.getTunnelType(tunnelNumber).equals(TYPE_STREAMR_CLIENT)) {
|
||||||
|
if(tunnelProfile.getSelectedIndex() == TUNNEL_INTERACTIVE) {
|
||||||
|
bean.setProfile("interactive");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
bean.setProfile("bulk");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(delayConnect.isSelected()) {
|
||||||
|
bean.setConnectDelay("true");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
bean.setConnectDelay("false");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(sharedClient.isSelected()) {
|
||||||
|
bean.setShared(true);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
bean.setShared(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(autoStart.isSelected()) {
|
||||||
|
bean.setStartOnLoad("true");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bean.setTunnelDepth("" + tunnelDepth.getSelectedIndex());
|
||||||
|
|
||||||
|
int variance = depthVariance.getSelectedIndex();
|
||||||
|
if(variance >= 0 && variance <= 2) {
|
||||||
|
bean.setTunnelVariance("" + variance);
|
||||||
|
}
|
||||||
|
else if(variance == 3) {
|
||||||
|
bean.setTunnelVariance("-1");
|
||||||
|
}
|
||||||
|
else if(variance == 4) {
|
||||||
|
bean.setTunnelVariance("-2");
|
||||||
|
}
|
||||||
|
|
||||||
|
bean.setTunnelQuantity("" + tunnelCount.getSelectedIndex() + 1);
|
||||||
|
|
||||||
|
bean.setTunnelBackupQuantity("" + backupTunnelCount.getSelectedIndex());
|
||||||
|
|
||||||
|
if(!bean.getTunnelType(tunnelNumber).equals(TYPE_STREAMR_CLIENT)) {
|
||||||
|
if(reduceIdle.isSelected()) {
|
||||||
|
bean.setReduce("true");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
}
|
||||||
|
|
||||||
|
if(closeIdle.isSelected()) {
|
||||||
|
bean.setClose("true");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
}
|
||||||
|
|
||||||
|
if(delayIdle.isSelected()) {
|
||||||
|
bean.setDelayOpen("true");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
al.actionPerformed(evt);
|
||||||
|
this.dispose();
|
||||||
|
}//GEN-LAST:event_saveActionPerformed
|
||||||
|
|
||||||
|
private void cancelActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cancelActionPerformed
|
||||||
|
al.actionPerformed(evt);
|
||||||
|
this.dispose();
|
||||||
|
}//GEN-LAST:event_cancelActionPerformed
|
||||||
|
|
||||||
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
|
private javax.swing.JCheckBox autoStart;
|
||||||
|
private javax.swing.JComboBox backupTunnelCount;
|
||||||
|
private javax.swing.JLabel backupTunnelCountLabel;
|
||||||
|
private javax.swing.JButton cancel;
|
||||||
|
private javax.swing.JButton changeTunnelState;
|
||||||
|
private javax.swing.JCheckBox closeIdle;
|
||||||
|
private javax.swing.JCheckBox delayConnect;
|
||||||
|
private javax.swing.JCheckBox delayIdle;
|
||||||
|
private javax.swing.JComboBox depthVariance;
|
||||||
|
private javax.swing.JLabel depthVarianceLabel;
|
||||||
|
private javax.swing.JSeparator jSeparator1;
|
||||||
|
private javax.swing.JSeparator jSeparator2;
|
||||||
|
private javax.swing.JSeparator jSeparator3;
|
||||||
|
private javax.swing.JCheckBox reduceIdle;
|
||||||
|
private javax.swing.JButton save;
|
||||||
|
private javax.swing.JCheckBox sharedClient;
|
||||||
|
private javax.swing.JComboBox tunnelCount;
|
||||||
|
private javax.swing.JLabel tunnelCountLabel;
|
||||||
|
private javax.swing.JComboBox tunnelDepth;
|
||||||
|
private javax.swing.JLabel tunnelDepthLabel;
|
||||||
|
private javax.swing.JTextField tunnelDestination;
|
||||||
|
private javax.swing.JLabel tunnelDestinationLabel;
|
||||||
|
private javax.swing.JTextField tunnelName;
|
||||||
|
private javax.swing.JLabel tunnelNameLabel;
|
||||||
|
private javax.swing.JTextField tunnelPort;
|
||||||
|
private javax.swing.JLabel tunnelPortLabel;
|
||||||
|
private javax.swing.JComboBox tunnelProfile;
|
||||||
|
private javax.swing.JLabel tunnelProfileLabel;
|
||||||
|
private javax.swing.JLabel tunnelType;
|
||||||
|
private javax.swing.JLabel tunnelTypeLabel;
|
||||||
|
// End of variables declaration//GEN-END:variables
|
||||||
|
private int tunnelNumber;
|
||||||
|
private ActionListener al;
|
||||||
|
private static final int TUNNEL_INTERACTIVE = 0;
|
||||||
|
private static final int TUNNEL_BULK = 1;
|
||||||
|
private static final String TYPE_STREAMR_CLIENT = "Streamr client";
|
||||||
|
}
|
@ -1,8 +1,13 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
|
||||||
<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
|
<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
|
||||||
|
<NonVisualComponents>
|
||||||
|
<Component class="javax.swing.ButtonGroup" name="updateButtonGroup">
|
||||||
|
</Component>
|
||||||
|
</NonVisualComponents>
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="defaultCloseOperation" type="int" value="3"/>
|
<Property name="defaultCloseOperation" type="int" value="3"/>
|
||||||
|
<Property name="title" type="java.lang.String" resourceKey="Form.title"/>
|
||||||
<Property name="name" type="java.lang.String" value="Form" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="Form" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
<SyntheticProperties>
|
<SyntheticProperties>
|
||||||
@ -11,6 +16,7 @@
|
|||||||
<AuxValues>
|
<AuxValues>
|
||||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/>
|
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/>
|
||||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/>
|
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
|
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
|
||||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
|
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
|
||||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
||||||
@ -22,27 +28,27 @@
|
|||||||
<Layout>
|
<Layout>
|
||||||
<DimensionLayout dim="0">
|
<DimensionLayout dim="0">
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Component id="jPanel1" alignment="0" max="32767" attributes="0"/>
|
<Component id="applyPanel" alignment="0" max="32767" attributes="0"/>
|
||||||
<Group type="102" attributes="0">
|
<Group type="102" attributes="0">
|
||||||
<EmptySpace min="12" pref="12" max="12" attributes="0"/>
|
<EmptySpace min="12" pref="12" max="12" attributes="0"/>
|
||||||
<Component id="jTabbedPane1" pref="566" max="32767" attributes="0"/>
|
<Component id="settingsPanel" pref="566" max="32767" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
<DimensionLayout dim="1">
|
<DimensionLayout dim="1">
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Group type="102" alignment="1" attributes="0">
|
<Group type="102" alignment="1" attributes="0">
|
||||||
<Component id="jTabbedPane1" max="32767" attributes="0"/>
|
<Component id="settingsPanel" max="32767" attributes="0"/>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
<Component id="jPanel1" min="-2" max="-2" attributes="0"/>
|
<Component id="applyPanel" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
</Layout>
|
</Layout>
|
||||||
<SubComponents>
|
<SubComponents>
|
||||||
<Container class="javax.swing.JPanel" name="jPanel1">
|
<Container class="javax.swing.JPanel" name="applyPanel">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="name" type="java.lang.String" value="jPanel1" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="applyPanel" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
|
|
||||||
<Layout>
|
<Layout>
|
||||||
@ -75,30 +81,36 @@
|
|||||||
<Property name="text" type="java.lang.String" resourceKey="cancel.text"/>
|
<Property name="text" type="java.lang.String" resourceKey="cancel.text"/>
|
||||||
<Property name="name" type="java.lang.String" value="cancel" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="cancel" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="cancelMouseClicked"/>
|
||||||
|
</Events>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JToggleButton" name="ok">
|
<Component class="javax.swing.JToggleButton" name="ok">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" resourceKey="ok.text"/>
|
<Property name="text" type="java.lang.String" resourceKey="ok.text"/>
|
||||||
<Property name="name" type="java.lang.String" value="ok" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="ok" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="okMouseClicked"/>
|
||||||
|
</Events>
|
||||||
</Component>
|
</Component>
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
</Container>
|
</Container>
|
||||||
<Container class="javax.swing.JTabbedPane" name="jTabbedPane1">
|
<Container class="javax.swing.JTabbedPane" name="settingsPanel">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="name" type="java.lang.String" value="jTabbedPane1" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="settingsPanel" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
|
|
||||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout"/>
|
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout"/>
|
||||||
<SubComponents>
|
<SubComponents>
|
||||||
<Container class="javax.swing.JPanel" name="jPanel2">
|
<Container class="javax.swing.JPanel" name="speedPanel">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="name" type="java.lang.String" value="jPanel2" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="speedPanel" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
||||||
<JTabbedPaneConstraints tabName="Speed">
|
<JTabbedPaneConstraints tabName="Speed">
|
||||||
<Property name="tabTitle" type="java.lang.String" resourceKey="jPanel2.TabConstraints.tabTitle"/>
|
<Property name="tabTitle" type="java.lang.String" resourceKey="speedPanel.TabConstraints.tabTitle"/>
|
||||||
</JTabbedPaneConstraints>
|
</JTabbedPaneConstraints>
|
||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
@ -107,10 +119,10 @@
|
|||||||
<Property name="useNullLayout" type="boolean" value="true"/>
|
<Property name="useNullLayout" type="boolean" value="true"/>
|
||||||
</Layout>
|
</Layout>
|
||||||
<SubComponents>
|
<SubComponents>
|
||||||
<Component class="javax.swing.JLabel" name="jLabel1">
|
<Component class="javax.swing.JLabel" name="uploadSpeedLabel">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" resourceKey="jLabel1.text"/>
|
<Property name="text" type="java.lang.String" resourceKey="uploadSpeedLabel.text"/>
|
||||||
<Property name="name" type="java.lang.String" value="jLabel1" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="uploadSpeedLabel" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
@ -118,10 +130,10 @@
|
|||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JLabel" name="jLabel2">
|
<Component class="javax.swing.JLabel" name="downloadSpeedLabel">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" resourceKey="jLabel2.text"/>
|
<Property name="text" type="java.lang.String" resourceKey="downloadSpeedLabel.text"/>
|
||||||
<Property name="name" type="java.lang.String" value="jLabel2" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="downloadSpeedLabel" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
@ -129,68 +141,76 @@
|
|||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JTextField" name="jTextField1">
|
<Component class="javax.swing.JTextField" name="uploadspeed">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" resourceKey="jTextField1.text"/>
|
<Property name="text" type="java.lang.String" resourceKey="uploadspeed.text"/>
|
||||||
<Property name="name" type="java.lang.String" value="jTextField1" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="uploadspeed" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="speedKeyReleased"/>
|
||||||
|
</Events>
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
<AbsoluteConstraints x="160" y="20" width="-1" height="-1"/>
|
<AbsoluteConstraints x="160" y="20" width="-1" height="-1"/>
|
||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JTextField" name="jTextField2">
|
<Component class="javax.swing.JTextField" name="downloadspeed">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" resourceKey="jTextField2.text"/>
|
<Property name="text" type="java.lang.String" resourceKey="downloadspeed.text"/>
|
||||||
<Property name="name" type="java.lang.String" value="jTextField2" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="downloadspeed" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="speedKeyReleased"/>
|
||||||
|
</Events>
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
<AbsoluteConstraints x="160" y="60" width="-1" height="-1"/>
|
<AbsoluteConstraints x="160" y="60" width="-1" height="-1"/>
|
||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JComboBox" name="jComboBox1">
|
<Component class="javax.swing.JComboBox" name="uploadkbps">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
|
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
|
||||||
<StringArray count="4">
|
<StringArray count="2">
|
||||||
<StringItem index="0" value="Item 1"/>
|
<StringItem index="0" value="kbps"/>
|
||||||
<StringItem index="1" value="Item 2"/>
|
<StringItem index="1" value="kBps"/>
|
||||||
<StringItem index="2" value="Item 3"/>
|
|
||||||
<StringItem index="3" value="Item 4"/>
|
|
||||||
</StringArray>
|
</StringArray>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="name" type="java.lang.String" value="jComboBox1" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="uploadkbps" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="uploadkbpsActionPerformed"/>
|
||||||
|
</Events>
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
<AbsoluteConstraints x="240" y="20" width="-1" height="-1"/>
|
<AbsoluteConstraints x="240" y="20" width="-1" height="-1"/>
|
||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JComboBox" name="jComboBox2">
|
<Component class="javax.swing.JComboBox" name="downloadkbps">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
|
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
|
||||||
<StringArray count="4">
|
<StringArray count="2">
|
||||||
<StringItem index="0" value="Item 1"/>
|
<StringItem index="0" value="kbps"/>
|
||||||
<StringItem index="1" value="Item 2"/>
|
<StringItem index="1" value="kBps"/>
|
||||||
<StringItem index="2" value="Item 3"/>
|
|
||||||
<StringItem index="3" value="Item 4"/>
|
|
||||||
</StringArray>
|
</StringArray>
|
||||||
</Property>
|
</Property>
|
||||||
<Property name="name" type="java.lang.String" value="jComboBox2" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="downloadkbps" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="downloadkbpsActionPerformed"/>
|
||||||
|
</Events>
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
<AbsoluteConstraints x="240" y="60" width="-1" height="-1"/>
|
<AbsoluteConstraints x="240" y="60" width="-1" height="-1"/>
|
||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JLabel" name="jLabel3">
|
<Component class="javax.swing.JLabel" name="uploadUsageLabel">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" resourceKey="jLabel3.text"/>
|
<Property name="text" type="java.lang.String" resourceKey="uploadUsageLabel.text"/>
|
||||||
<Property name="name" type="java.lang.String" value="jLabel3" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="uploadUsageLabel" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
@ -198,10 +218,10 @@
|
|||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JLabel" name="jLabel4">
|
<Component class="javax.swing.JLabel" name="downloadUsageLabel">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" resourceKey="jLabel4.text"/>
|
<Property name="text" type="java.lang.String" resourceKey="downloadUsageLabel.text"/>
|
||||||
<Property name="name" type="java.lang.String" value="jLabel4" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="downloadUsageLabel" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
@ -209,32 +229,38 @@
|
|||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JTextField" name="jTextField3">
|
<Component class="javax.swing.JTextField" name="uploadgb">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" resourceKey="jTextField3.text"/>
|
<Property name="text" type="java.lang.String" resourceKey="uploadgb.text"/>
|
||||||
<Property name="name" type="java.lang.String" value="jTextField3" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="uploadgb" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="monthKeyReleased"/>
|
||||||
|
</Events>
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
<AbsoluteConstraints x="440" y="20" width="60" height="-1"/>
|
<AbsoluteConstraints x="440" y="20" width="60" height="-1"/>
|
||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JTextField" name="jTextField4">
|
<Component class="javax.swing.JTextField" name="downloadgb">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" resourceKey="jTextField4.text"/>
|
<Property name="text" type="java.lang.String" resourceKey="downloadgb.text"/>
|
||||||
<Property name="name" type="java.lang.String" value="jTextField4" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="downloadgb" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="monthKeyReleased"/>
|
||||||
|
</Events>
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
<AbsoluteConstraints x="440" y="60" width="60" height="-1"/>
|
<AbsoluteConstraints x="440" y="60" width="60" height="-1"/>
|
||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JLabel" name="jLabel5">
|
<Component class="javax.swing.JLabel" name="gbUploadLabel">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" resourceKey="jLabel5.text"/>
|
<Property name="text" type="java.lang.String" resourceKey="gbUploadLabel.text"/>
|
||||||
<Property name="name" type="java.lang.String" value="jLabel5" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="gbUploadLabel" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
@ -242,10 +268,10 @@
|
|||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JLabel" name="jLabel6">
|
<Component class="javax.swing.JLabel" name="gbDownloadLabel">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" resourceKey="jLabel6.text"/>
|
<Property name="text" type="java.lang.String" resourceKey="gbDownloadLabel.text"/>
|
||||||
<Property name="name" type="java.lang.String" value="jLabel6" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="gbDownloadLabel" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
@ -253,10 +279,10 @@
|
|||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JLabel" name="jLabel7">
|
<Component class="javax.swing.JLabel" name="uploadDownloadExplanation">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" resourceKey="jLabel7.text"/>
|
<Property name="text" type="java.lang.String" resourceKey="uploadDownloadExplanation.text"/>
|
||||||
<Property name="name" type="java.lang.String" value="jLabel7" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="uploadDownloadExplanation" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
@ -266,14 +292,14 @@
|
|||||||
</Component>
|
</Component>
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
</Container>
|
</Container>
|
||||||
<Container class="javax.swing.JPanel" name="jPanel3">
|
<Container class="javax.swing.JPanel" name="updatesPanel">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="name" type="java.lang.String" value="jPanel3" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="updatesPanel" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
||||||
<JTabbedPaneConstraints tabName="Updates">
|
<JTabbedPaneConstraints tabName="Updates">
|
||||||
<Property name="tabTitle" type="java.lang.String" resourceKey="jPanel3.TabConstraints.tabTitle"/>
|
<Property name="tabTitle" type="java.lang.String" resourceKey="updatesPanel.TabConstraints.tabTitle"/>
|
||||||
</JTabbedPaneConstraints>
|
</JTabbedPaneConstraints>
|
||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
@ -286,28 +312,28 @@
|
|||||||
<Group type="102" alignment="0" attributes="0">
|
<Group type="102" alignment="0" attributes="0">
|
||||||
<EmptySpace min="-2" pref="20" max="-2" attributes="0"/>
|
<EmptySpace min="-2" pref="20" max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Component id="jLabel8" alignment="0" min="-2" max="-2" attributes="0"/>
|
<Component id="updateMethod" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
<Group type="102" alignment="0" attributes="0">
|
<Group type="102" alignment="0" attributes="0">
|
||||||
<Component id="jToggleButton1" min="-2" max="-2" attributes="0"/>
|
<Component id="checkUpdates" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
<Component id="jToggleButton2" min="-2" max="-2" attributes="0"/>
|
<Component id="updateNow" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
<Group type="102" alignment="0" attributes="0">
|
<Group type="102" alignment="0" attributes="0">
|
||||||
<EmptySpace min="40" pref="40" max="40" attributes="0"/>
|
<EmptySpace min="40" pref="40" max="40" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" max="-2" attributes="0">
|
||||||
<Component id="jRadioButton2" alignment="0" min="-2" max="-2" attributes="0"/>
|
<Component id="updateInform" alignment="0" pref="377" max="32767" attributes="1"/>
|
||||||
<Component id="jRadioButton1" alignment="0" min="-2" max="-2" attributes="0"/>
|
<Component id="updateDownload" alignment="0" max="32767" attributes="1"/>
|
||||||
<Component id="jRadioButton3" alignment="0" min="-2" max="-2" attributes="0"/>
|
<Component id="updateDownloadRestart" alignment="0" max="32767" attributes="1"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace min="-2" pref="9" max="-2" attributes="0"/>
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<Group type="102" alignment="1" attributes="0">
|
<Group type="102" alignment="1" attributes="0">
|
||||||
<EmptySpace pref="339" max="32767" attributes="0"/>
|
<EmptySpace pref="339" max="32767" attributes="0"/>
|
||||||
<Component id="jToggleButton3" min="-2" max="-2" attributes="0"/>
|
<Component id="advancedUpdateConfig" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
@ -316,78 +342,96 @@
|
|||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Group type="102" attributes="0">
|
<Group type="102" attributes="0">
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
<Component id="jLabel8" min="-2" max="-2" attributes="0"/>
|
<Component id="updateMethod" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||||
<Component id="jRadioButton1" min="-2" max="-2" attributes="0"/>
|
<Component id="updateInform" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
<Component id="jRadioButton2" min="-2" max="-2" attributes="0"/>
|
<Component id="updateDownload" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
<Component id="jRadioButton3" min="-2" max="-2" attributes="0"/>
|
<Component id="updateDownloadRestart" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="3" attributes="0">
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
<Component id="jToggleButton1" alignment="3" min="-2" max="-2" attributes="0"/>
|
<Component id="checkUpdates" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="jToggleButton2" alignment="3" min="-2" max="-2" attributes="0"/>
|
<Component id="updateNow" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace pref="181" max="32767" attributes="0"/>
|
<EmptySpace pref="181" max="32767" attributes="0"/>
|
||||||
<Component id="jToggleButton3" min="-2" max="-2" attributes="0"/>
|
<Component id="advancedUpdateConfig" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
</Layout>
|
</Layout>
|
||||||
<SubComponents>
|
<SubComponents>
|
||||||
<Component class="javax.swing.JLabel" name="jLabel8">
|
<Component class="javax.swing.JLabel" name="updateMethod">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" resourceKey="jLabel8.text"/>
|
<Property name="text" type="java.lang.String" resourceKey="updateMethod.text"/>
|
||||||
<Property name="name" type="java.lang.String" value="jLabel8" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="updateMethod" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JRadioButton" name="jRadioButton1">
|
<Component class="javax.swing.JRadioButton" name="updateInform">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" resourceKey="jRadioButton1.text"/>
|
<Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
|
||||||
<Property name="name" type="java.lang.String" value="jRadioButton1" noResource="true"/>
|
<ComponentRef name="updateButtonGroup"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="updateInform.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="updateInform" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JRadioButton" name="jRadioButton2">
|
<Component class="javax.swing.JRadioButton" name="updateDownload">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" resourceKey="jRadioButton2.text"/>
|
<Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
|
||||||
<Property name="name" type="java.lang.String" value="jRadioButton2" noResource="true"/>
|
<ComponentRef name="updateButtonGroup"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="updateDownload.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="updateDownload" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JRadioButton" name="jRadioButton3">
|
<Component class="javax.swing.JRadioButton" name="updateDownloadRestart">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" resourceKey="jRadioButton3.text"/>
|
<Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
|
||||||
<Property name="name" type="java.lang.String" value="jRadioButton3" noResource="true"/>
|
<ComponentRef name="updateButtonGroup"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="updateDownloadRestart.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="updateDownloadRestart" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JToggleButton" name="jToggleButton1">
|
<Component class="javax.swing.JToggleButton" name="checkUpdates">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" resourceKey="jToggleButton1.text"/>
|
<Property name="text" type="java.lang.String" resourceKey="checkUpdates.text"/>
|
||||||
<Property name="name" type="java.lang.String" value="jToggleButton1" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="checkUpdates" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="checkUpdatesActionPerformed"/>
|
||||||
|
</Events>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JToggleButton" name="jToggleButton2">
|
<Component class="javax.swing.JToggleButton" name="updateNow">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" resourceKey="jToggleButton2.text"/>
|
<Property name="text" type="java.lang.String" resourceKey="updateNow.text"/>
|
||||||
<Property name="name" type="java.lang.String" value="jToggleButton2" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="updateNow" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="updateNowActionPerformed"/>
|
||||||
|
</Events>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JToggleButton" name="jToggleButton3">
|
<Component class="javax.swing.JToggleButton" name="advancedUpdateConfig">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" resourceKey="jToggleButton3.text"/>
|
<Property name="text" type="java.lang.String" resourceKey="advancedUpdateConfig.text"/>
|
||||||
<Property name="name" type="java.lang.String" value="jToggleButton3" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="advancedUpdateConfig" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="advancedUpdateConfigActionPerformed"/>
|
||||||
|
</Events>
|
||||||
</Component>
|
</Component>
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
</Container>
|
</Container>
|
||||||
<Container class="javax.swing.JPanel" name="jPanel4">
|
<Container class="javax.swing.JPanel" name="tunnelPanel">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="name" type="java.lang.String" value="jPanel4" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="tunnelPanel" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
||||||
<JTabbedPaneConstraints tabName="Tunnels/Services">
|
<JTabbedPaneConstraints tabName="Tunnels/Services">
|
||||||
<Property name="tabTitle" type="java.lang.String" resourceKey="jPanel4.TabConstraints.tabTitle"/>
|
<Property name="tabTitle" type="java.lang.String" resourceKey="tunnelPanel.TabConstraints.tabTitle"/>
|
||||||
</JTabbedPaneConstraints>
|
</JTabbedPaneConstraints>
|
||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
@ -395,14 +439,14 @@
|
|||||||
<Layout>
|
<Layout>
|
||||||
<DimensionLayout dim="0">
|
<DimensionLayout dim="0">
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Group type="102" alignment="0" attributes="0">
|
<Group type="102" alignment="1" attributes="0">
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="1" attributes="0">
|
||||||
<Component id="jScrollPane2" alignment="1" pref="538" max="32767" attributes="0"/>
|
<Component id="tunnelsExplanation" alignment="0" pref="538" max="32767" attributes="0"/>
|
||||||
<Component id="jLabel9" alignment="0" pref="538" max="32767" attributes="0"/>
|
<Component id="serverFrame" alignment="1" pref="538" max="32767" attributes="0"/>
|
||||||
<Component id="jLabel10" alignment="0" min="-2" max="-2" attributes="0"/>
|
<Component id="clientTunnelLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="jScrollPane1" alignment="0" pref="538" max="32767" attributes="0"/>
|
<Component id="clientFrame" alignment="0" pref="538" max="32767" attributes="0"/>
|
||||||
<Component id="jLabel11" alignment="0" min="-2" max="-2" attributes="0"/>
|
<Component id="serverTunnelLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
@ -412,63 +456,147 @@
|
|||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Group type="102" alignment="0" attributes="0">
|
<Group type="102" alignment="0" attributes="0">
|
||||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="jLabel10" min="-2" max="-2" attributes="0"/>
|
<Component id="clientTunnelLabel" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="jScrollPane1" pref="119" max="32767" attributes="0"/>
|
<Component id="clientFrame" pref="119" max="32767" attributes="0"/>
|
||||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
<Component id="jLabel11" min="-2" max="-2" attributes="0"/>
|
<Component id="serverTunnelLabel" min="-2" max="-2" attributes="0"/>
|
||||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="jScrollPane2" pref="122" max="32767" attributes="0"/>
|
|
||||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
|
||||||
<Component id="jLabel9" min="-2" pref="65" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="serverFrame" pref="122" max="32767" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Component id="tunnelsExplanation" min="-2" pref="45" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace min="-2" pref="32" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
</Group>
|
</Group>
|
||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
</Layout>
|
</Layout>
|
||||||
<SubComponents>
|
<SubComponents>
|
||||||
<Container class="javax.swing.JScrollPane" name="jScrollPane1">
|
<Container class="javax.swing.JScrollPane" name="clientFrame">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="name" type="java.lang.String" value="jScrollPane1" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="clientFrame" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
|
|
||||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JTable" name="clientTable">
|
||||||
|
<Properties>
|
||||||
|
<Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.editors2.TableModelEditor">
|
||||||
|
<Table columnCount="4" rowCount="0">
|
||||||
|
<Column editable="true" title="Name" type="java.lang.Object"/>
|
||||||
|
<Column editable="true" title="Type" type="java.lang.Object"/>
|
||||||
|
<Column editable="true" title="Address" type="java.lang.Object"/>
|
||||||
|
<Column editable="true" title="Status" type="java.lang.Object"/>
|
||||||
|
</Table>
|
||||||
|
</Property>
|
||||||
|
<Property name="columnModel" type="javax.swing.table.TableColumnModel" editor="org.netbeans.modules.form.editors2.TableColumnModelEditor">
|
||||||
|
<TableColumnModel selectionModel="0">
|
||||||
|
<Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true">
|
||||||
|
<Title resourceKey="clientTable.columnModel.title0"/>
|
||||||
|
<Editor/>
|
||||||
|
<Renderer/>
|
||||||
|
</Column>
|
||||||
|
<Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true">
|
||||||
|
<Title resourceKey="clientTable.columnModel.title1"/>
|
||||||
|
<Editor/>
|
||||||
|
<Renderer/>
|
||||||
|
</Column>
|
||||||
|
<Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true">
|
||||||
|
<Title resourceKey="clientTable.columnModel.title2"/>
|
||||||
|
<Editor/>
|
||||||
|
<Renderer/>
|
||||||
|
</Column>
|
||||||
|
<Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true">
|
||||||
|
<Title resourceKey="clientTable.columnModel.title3"/>
|
||||||
|
<Editor/>
|
||||||
|
<Renderer/>
|
||||||
|
</Column>
|
||||||
|
</TableColumnModel>
|
||||||
|
</Property>
|
||||||
|
<Property name="name" type="java.lang.String" value="clientTable" noResource="true"/>
|
||||||
|
<Property name="tableHeader" type="javax.swing.table.JTableHeader" editor="org.netbeans.modules.form.editors2.JTableHeaderEditor">
|
||||||
|
<TableHeader reorderingAllowed="true" resizingAllowed="true"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="clientTableMouseClicked"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
</Container>
|
</Container>
|
||||||
<Container class="javax.swing.JScrollPane" name="jScrollPane2">
|
<Container class="javax.swing.JScrollPane" name="serverFrame">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="name" type="java.lang.String" value="jScrollPane2" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="serverFrame" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
|
|
||||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JTable" name="serverTable">
|
||||||
|
<Properties>
|
||||||
|
<Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.editors2.TableModelEditor">
|
||||||
|
<Table columnCount="3" rowCount="4">
|
||||||
|
<Column editable="true" title="Name" type="java.lang.Object"/>
|
||||||
|
<Column editable="true" title="Address" type="java.lang.Object"/>
|
||||||
|
<Column editable="true" title="Status" type="java.lang.Object"/>
|
||||||
|
</Table>
|
||||||
|
</Property>
|
||||||
|
<Property name="columnModel" type="javax.swing.table.TableColumnModel" editor="org.netbeans.modules.form.editors2.TableColumnModelEditor">
|
||||||
|
<TableColumnModel selectionModel="0">
|
||||||
|
<Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true">
|
||||||
|
<Title resourceKey="serverTable.columnModel.title0"/>
|
||||||
|
<Editor/>
|
||||||
|
<Renderer/>
|
||||||
|
</Column>
|
||||||
|
<Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true">
|
||||||
|
<Title resourceKey="serverTable.columnModel.title1"/>
|
||||||
|
<Editor/>
|
||||||
|
<Renderer/>
|
||||||
|
</Column>
|
||||||
|
<Column maxWidth="-1" minWidth="-1" prefWidth="-1" resizable="true">
|
||||||
|
<Title resourceKey="serverTable.columnModel.title2"/>
|
||||||
|
<Editor/>
|
||||||
|
<Renderer/>
|
||||||
|
</Column>
|
||||||
|
</TableColumnModel>
|
||||||
|
</Property>
|
||||||
|
<Property name="name" type="java.lang.String" value="serverTable" noResource="true"/>
|
||||||
|
<Property name="tableHeader" type="javax.swing.table.JTableHeader" editor="org.netbeans.modules.form.editors2.JTableHeaderEditor">
|
||||||
|
<TableHeader reorderingAllowed="true" resizingAllowed="true"/>
|
||||||
|
</Property>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="serverTableMouseClicked"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
</Container>
|
</Container>
|
||||||
<Component class="javax.swing.JLabel" name="jLabel9">
|
<Component class="javax.swing.JLabel" name="tunnelsExplanation">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" resourceKey="jLabel9.text"/>
|
<Property name="text" type="java.lang.String" resourceKey="tunnelsExplanation.text"/>
|
||||||
<Property name="name" type="java.lang.String" value="jLabel9" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="tunnelsExplanation" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JLabel" name="jLabel10">
|
<Component class="javax.swing.JLabel" name="clientTunnelLabel">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" resourceKey="jLabel10.text"/>
|
<Property name="text" type="java.lang.String" resourceKey="clientTunnelLabel.text"/>
|
||||||
<Property name="name" type="java.lang.String" value="jLabel10" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="clientTunnelLabel" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
<Component class="javax.swing.JLabel" name="jLabel11">
|
<Component class="javax.swing.JLabel" name="serverTunnelLabel">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="text" type="java.lang.String" resourceKey="jLabel11.text"/>
|
<Property name="text" type="java.lang.String" resourceKey="serverTunnelLabel.text"/>
|
||||||
<Property name="name" type="java.lang.String" value="jLabel11" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="serverTunnelLabel" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
</Component>
|
</Component>
|
||||||
</SubComponents>
|
</SubComponents>
|
||||||
</Container>
|
</Container>
|
||||||
<Container class="javax.swing.JPanel" name="jPanel5">
|
<Container class="javax.swing.JPanel" name="networkPanel">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="name" type="java.lang.String" value="jPanel5" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="networkPanel" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
||||||
<JTabbedPaneConstraints tabName="Network">
|
<JTabbedPaneConstraints tabName="Network">
|
||||||
<Property name="tabTitle" type="java.lang.String" resourceKey="jPanel5.TabConstraints.tabTitle"/>
|
<Property name="tabTitle" type="java.lang.String" resourceKey="networkPanel.TabConstraints.tabTitle"/>
|
||||||
</JTabbedPaneConstraints>
|
</JTabbedPaneConstraints>
|
||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
@ -486,14 +614,14 @@
|
|||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
</Layout>
|
</Layout>
|
||||||
</Container>
|
</Container>
|
||||||
<Container class="javax.swing.JPanel" name="jPanel6">
|
<Container class="javax.swing.JPanel" name="advancedPanel">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="name" type="java.lang.String" value="jPanel6" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="advancedPanel" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
||||||
<JTabbedPaneConstraints tabName="Advanced">
|
<JTabbedPaneConstraints tabName="Advanced">
|
||||||
<Property name="tabTitle" type="java.lang.String" resourceKey="jPanel6.TabConstraints.tabTitle"/>
|
<Property name="tabTitle" type="java.lang.String" resourceKey="advancedPanel.TabConstraints.tabTitle"/>
|
||||||
</JTabbedPaneConstraints>
|
</JTabbedPaneConstraints>
|
||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
@ -0,0 +1,839 @@
|
|||||||
|
/*
|
||||||
|
* GeneralConfiguration.java
|
||||||
|
*
|
||||||
|
* Created on 10 april 2009, 19:04
|
||||||
|
*/
|
||||||
|
|
||||||
|
package net.i2p.desktopgui.gui;
|
||||||
|
|
||||||
|
import java.awt.Desktop;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
import net.i2p.desktopgui.router.configuration.SpeedHelper;
|
||||||
|
import javax.swing.JComboBox;
|
||||||
|
import javax.swing.ButtonModel;
|
||||||
|
import javax.swing.JTextField;
|
||||||
|
import net.i2p.desktopgui.router.RouterHelper;
|
||||||
|
import net.i2p.desktopgui.router.configuration.SpeedHandler;
|
||||||
|
import net.i2p.desktopgui.router.configuration.UpdateHelper;
|
||||||
|
import net.i2p.router.web.NewsFetcher;
|
||||||
|
import net.i2p.desktopgui.router.configuration.UpdateHandler;
|
||||||
|
import java.util.Date;
|
||||||
|
import javax.swing.SwingWorker;
|
||||||
|
import net.i2p.i2ptunnel.web.IndexBean;
|
||||||
|
import javax.swing.table.DefaultTableModel;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author mathias
|
||||||
|
*/
|
||||||
|
public class GeneralConfiguration extends javax.swing.JFrame {
|
||||||
|
|
||||||
|
/** Creates new form GeneralConfiguration */
|
||||||
|
public GeneralConfiguration() {
|
||||||
|
initComponents();
|
||||||
|
extraInitComponents();
|
||||||
|
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
|
||||||
|
this.setLocationRelativeTo(null);
|
||||||
|
this.requestFocus();
|
||||||
|
this.setVisible(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void extraInitComponents() {
|
||||||
|
initSpeedTab();
|
||||||
|
initUpdateTab();
|
||||||
|
initTunnelTab();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initSpeedTab() {
|
||||||
|
try {
|
||||||
|
String inbound = SpeedHelper.getInboundBandwidth();
|
||||||
|
String outbound = SpeedHelper.getOutboundBandwidth();
|
||||||
|
|
||||||
|
initSpeeds("" + Integer.parseInt(inbound)*8, "" + Integer.parseInt(outbound)*8);
|
||||||
|
initUsage("" + Integer.parseInt(inbound), "" + Integer.parseInt(outbound));
|
||||||
|
}
|
||||||
|
catch(Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
System.out.println("Exception noticed, probably running desktopgui in a debugger instead of along with I2P!?");
|
||||||
|
initSpeeds("100", "100");
|
||||||
|
initUsage("12", "12");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initUpdateTab() {
|
||||||
|
//Set update policy
|
||||||
|
String updatePolicy = UpdateHelper.getUpdatePolicy();
|
||||||
|
if(updatePolicy.equals(UpdateHelper.NOTIFY_UPDATE_POLICY)) {
|
||||||
|
updateButtonGroup.setSelected(updateInform.getModel(), true);
|
||||||
|
}
|
||||||
|
else if(updatePolicy.equals(UpdateHelper.DOWNLOAD_UPDATE_POLICY)) {
|
||||||
|
updateButtonGroup.setSelected(updateDownload.getModel(), true);
|
||||||
|
}
|
||||||
|
else if(updatePolicy.equals(UpdateHelper.INSTALL_UPDATE_POLICY)) {
|
||||||
|
updateButtonGroup.setSelected(updateDownloadRestart.getModel(), true);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
System.out.println("desktopgui: no updates for you!");
|
||||||
|
}
|
||||||
|
|
||||||
|
//Check if an update is available
|
||||||
|
//TODO: move this method out of the routerconsole so desktopgui doesn't depend on routerconsole!!!
|
||||||
|
if(NewsFetcher.getInstance(RouterHelper.getContext()).updateAvailable()) {
|
||||||
|
updateNow.setVisible(true);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
updateNow.setVisible(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initTunnelTab() {
|
||||||
|
while(((DefaultTableModel) clientTable.getModel()).getRowCount() > 0) {
|
||||||
|
((DefaultTableModel) clientTable.getModel()).removeRow(0);
|
||||||
|
}
|
||||||
|
while(((DefaultTableModel) serverTable.getModel()).getRowCount() > 0) {
|
||||||
|
((DefaultTableModel) serverTable.getModel()).removeRow(0);
|
||||||
|
}
|
||||||
|
IndexBean bean = new IndexBean();
|
||||||
|
for(int i=0; i<bean.getTunnelCount(); i++) {
|
||||||
|
if(bean.isClient(i)) {
|
||||||
|
Object[] row = {bean.getTunnelName(i), bean.getTunnelType(i),
|
||||||
|
bean.getClientInterface(i) + ":" + bean.getClientPort(i),
|
||||||
|
getTunnelStatus(bean.getTunnelStatus(i))};
|
||||||
|
((DefaultTableModel) clientTable.getModel()).addRow(row);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Object[] row = {bean.getTunnelName(i),
|
||||||
|
bean.getServerTarget(i),
|
||||||
|
getTunnelStatus(bean.getTunnelStatus(i))};
|
||||||
|
((DefaultTableModel) serverTable.getModel()).addRow(row);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTunnelStatus(int status) {
|
||||||
|
if(status == IndexBean.NOT_RUNNING) {
|
||||||
|
return "Not running";
|
||||||
|
}
|
||||||
|
else if(status == IndexBean.RUNNING) {
|
||||||
|
return "Running";
|
||||||
|
}
|
||||||
|
else if(status == IndexBean.STANDBY) {
|
||||||
|
return "Standby";
|
||||||
|
}
|
||||||
|
else if(status == IndexBean.STARTING) {
|
||||||
|
return "Starting";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return "Error: status not found";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** This method is called from within the constructor to
|
||||||
|
* initialize the form.
|
||||||
|
* WARNING: Do NOT modify this code. The content of this method is
|
||||||
|
* always regenerated by the Form Editor.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||||
|
private void initComponents() {
|
||||||
|
|
||||||
|
updateButtonGroup = new javax.swing.ButtonGroup();
|
||||||
|
applyPanel = new javax.swing.JPanel();
|
||||||
|
cancel = new javax.swing.JToggleButton();
|
||||||
|
ok = new javax.swing.JToggleButton();
|
||||||
|
settingsPanel = new javax.swing.JTabbedPane();
|
||||||
|
speedPanel = new javax.swing.JPanel();
|
||||||
|
uploadSpeedLabel = new javax.swing.JLabel();
|
||||||
|
downloadSpeedLabel = new javax.swing.JLabel();
|
||||||
|
uploadspeed = new javax.swing.JTextField();
|
||||||
|
downloadspeed = new javax.swing.JTextField();
|
||||||
|
uploadkbps = new javax.swing.JComboBox();
|
||||||
|
downloadkbps = new javax.swing.JComboBox();
|
||||||
|
uploadUsageLabel = new javax.swing.JLabel();
|
||||||
|
downloadUsageLabel = new javax.swing.JLabel();
|
||||||
|
uploadgb = new javax.swing.JTextField();
|
||||||
|
downloadgb = new javax.swing.JTextField();
|
||||||
|
gbUploadLabel = new javax.swing.JLabel();
|
||||||
|
gbDownloadLabel = new javax.swing.JLabel();
|
||||||
|
uploadDownloadExplanation = new javax.swing.JLabel();
|
||||||
|
updatesPanel = new javax.swing.JPanel();
|
||||||
|
updateMethod = new javax.swing.JLabel();
|
||||||
|
updateInform = new javax.swing.JRadioButton();
|
||||||
|
updateDownload = new javax.swing.JRadioButton();
|
||||||
|
updateDownloadRestart = new javax.swing.JRadioButton();
|
||||||
|
checkUpdates = new javax.swing.JToggleButton();
|
||||||
|
updateNow = new javax.swing.JToggleButton();
|
||||||
|
advancedUpdateConfig = new javax.swing.JToggleButton();
|
||||||
|
tunnelPanel = new javax.swing.JPanel();
|
||||||
|
clientFrame = new javax.swing.JScrollPane();
|
||||||
|
clientTable = new javax.swing.JTable();
|
||||||
|
serverFrame = new javax.swing.JScrollPane();
|
||||||
|
serverTable = new javax.swing.JTable();
|
||||||
|
tunnelsExplanation = new javax.swing.JLabel();
|
||||||
|
clientTunnelLabel = new javax.swing.JLabel();
|
||||||
|
serverTunnelLabel = new javax.swing.JLabel();
|
||||||
|
networkPanel = new javax.swing.JPanel();
|
||||||
|
advancedPanel = new javax.swing.JPanel();
|
||||||
|
|
||||||
|
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
|
||||||
|
org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(GeneralConfiguration.class);
|
||||||
|
setTitle(resourceMap.getString("Form.title")); // NOI18N
|
||||||
|
setName("Form"); // NOI18N
|
||||||
|
|
||||||
|
applyPanel.setName("applyPanel"); // NOI18N
|
||||||
|
|
||||||
|
cancel.setText(resourceMap.getString("cancel.text")); // NOI18N
|
||||||
|
cancel.setName("cancel"); // NOI18N
|
||||||
|
cancel.addMouseListener(new java.awt.event.MouseAdapter() {
|
||||||
|
public void mouseClicked(java.awt.event.MouseEvent evt) {
|
||||||
|
cancelMouseClicked(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
ok.setText(resourceMap.getString("ok.text")); // NOI18N
|
||||||
|
ok.setName("ok"); // NOI18N
|
||||||
|
ok.addMouseListener(new java.awt.event.MouseAdapter() {
|
||||||
|
public void mouseClicked(java.awt.event.MouseEvent evt) {
|
||||||
|
okMouseClicked(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
javax.swing.GroupLayout applyPanelLayout = new javax.swing.GroupLayout(applyPanel);
|
||||||
|
applyPanel.setLayout(applyPanelLayout);
|
||||||
|
applyPanelLayout.setHorizontalGroup(
|
||||||
|
applyPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, applyPanelLayout.createSequentialGroup()
|
||||||
|
.addContainerGap(475, Short.MAX_VALUE)
|
||||||
|
.addComponent(ok)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(cancel)
|
||||||
|
.addContainerGap())
|
||||||
|
);
|
||||||
|
applyPanelLayout.setVerticalGroup(
|
||||||
|
applyPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(applyPanelLayout.createSequentialGroup()
|
||||||
|
.addGroup(applyPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(cancel)
|
||||||
|
.addComponent(ok))
|
||||||
|
.addContainerGap(14, Short.MAX_VALUE))
|
||||||
|
);
|
||||||
|
|
||||||
|
settingsPanel.setName("settingsPanel"); // NOI18N
|
||||||
|
|
||||||
|
speedPanel.setName("speedPanel"); // NOI18N
|
||||||
|
speedPanel.setLayout(null);
|
||||||
|
|
||||||
|
uploadSpeedLabel.setText(resourceMap.getString("uploadSpeedLabel.text")); // NOI18N
|
||||||
|
uploadSpeedLabel.setName("uploadSpeedLabel"); // NOI18N
|
||||||
|
speedPanel.add(uploadSpeedLabel);
|
||||||
|
uploadSpeedLabel.setBounds(20, 20, 140, 30);
|
||||||
|
|
||||||
|
downloadSpeedLabel.setText(resourceMap.getString("downloadSpeedLabel.text")); // NOI18N
|
||||||
|
downloadSpeedLabel.setName("downloadSpeedLabel"); // NOI18N
|
||||||
|
speedPanel.add(downloadSpeedLabel);
|
||||||
|
downloadSpeedLabel.setBounds(20, 60, 140, 30);
|
||||||
|
|
||||||
|
uploadspeed.setText(resourceMap.getString("uploadspeed.text")); // NOI18N
|
||||||
|
uploadspeed.setName("uploadspeed"); // NOI18N
|
||||||
|
uploadspeed.addKeyListener(new java.awt.event.KeyAdapter() {
|
||||||
|
public void keyReleased(java.awt.event.KeyEvent evt) {
|
||||||
|
speedKeyReleased(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
speedPanel.add(uploadspeed);
|
||||||
|
uploadspeed.setBounds(160, 20, 77, 27);
|
||||||
|
|
||||||
|
downloadspeed.setText(resourceMap.getString("downloadspeed.text")); // NOI18N
|
||||||
|
downloadspeed.setName("downloadspeed"); // NOI18N
|
||||||
|
downloadspeed.addKeyListener(new java.awt.event.KeyAdapter() {
|
||||||
|
public void keyReleased(java.awt.event.KeyEvent evt) {
|
||||||
|
speedKeyReleased(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
speedPanel.add(downloadspeed);
|
||||||
|
downloadspeed.setBounds(160, 60, 77, 27);
|
||||||
|
|
||||||
|
uploadkbps.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" }));
|
||||||
|
uploadkbps.setName("uploadkbps"); // NOI18N
|
||||||
|
uploadkbps.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
uploadkbpsActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
speedPanel.add(uploadkbps);
|
||||||
|
uploadkbps.setBounds(240, 20, 68, 27);
|
||||||
|
|
||||||
|
downloadkbps.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" }));
|
||||||
|
downloadkbps.setName("downloadkbps"); // NOI18N
|
||||||
|
downloadkbps.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
downloadkbpsActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
speedPanel.add(downloadkbps);
|
||||||
|
downloadkbps.setBounds(240, 60, 68, 27);
|
||||||
|
|
||||||
|
uploadUsageLabel.setText(resourceMap.getString("uploadUsageLabel.text")); // NOI18N
|
||||||
|
uploadUsageLabel.setName("uploadUsageLabel"); // NOI18N
|
||||||
|
speedPanel.add(uploadUsageLabel);
|
||||||
|
uploadUsageLabel.setBounds(330, 20, 97, 30);
|
||||||
|
|
||||||
|
downloadUsageLabel.setText(resourceMap.getString("downloadUsageLabel.text")); // NOI18N
|
||||||
|
downloadUsageLabel.setName("downloadUsageLabel"); // NOI18N
|
||||||
|
speedPanel.add(downloadUsageLabel);
|
||||||
|
downloadUsageLabel.setBounds(330, 60, 97, 30);
|
||||||
|
|
||||||
|
uploadgb.setText(resourceMap.getString("uploadgb.text")); // NOI18N
|
||||||
|
uploadgb.setName("uploadgb"); // NOI18N
|
||||||
|
uploadgb.addKeyListener(new java.awt.event.KeyAdapter() {
|
||||||
|
public void keyReleased(java.awt.event.KeyEvent evt) {
|
||||||
|
monthKeyReleased(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
speedPanel.add(uploadgb);
|
||||||
|
uploadgb.setBounds(440, 20, 60, 27);
|
||||||
|
|
||||||
|
downloadgb.setText(resourceMap.getString("downloadgb.text")); // NOI18N
|
||||||
|
downloadgb.setName("downloadgb"); // NOI18N
|
||||||
|
downloadgb.addKeyListener(new java.awt.event.KeyAdapter() {
|
||||||
|
public void keyReleased(java.awt.event.KeyEvent evt) {
|
||||||
|
monthKeyReleased(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
speedPanel.add(downloadgb);
|
||||||
|
downloadgb.setBounds(440, 60, 60, 27);
|
||||||
|
|
||||||
|
gbUploadLabel.setText(resourceMap.getString("gbUploadLabel.text")); // NOI18N
|
||||||
|
gbUploadLabel.setName("gbUploadLabel"); // NOI18N
|
||||||
|
speedPanel.add(gbUploadLabel);
|
||||||
|
gbUploadLabel.setBounds(510, 20, 19, 30);
|
||||||
|
|
||||||
|
gbDownloadLabel.setText(resourceMap.getString("gbDownloadLabel.text")); // NOI18N
|
||||||
|
gbDownloadLabel.setName("gbDownloadLabel"); // NOI18N
|
||||||
|
speedPanel.add(gbDownloadLabel);
|
||||||
|
gbDownloadLabel.setBounds(510, 60, 19, 30);
|
||||||
|
|
||||||
|
uploadDownloadExplanation.setText(resourceMap.getString("uploadDownloadExplanation.text")); // NOI18N
|
||||||
|
uploadDownloadExplanation.setName("uploadDownloadExplanation"); // NOI18N
|
||||||
|
speedPanel.add(uploadDownloadExplanation);
|
||||||
|
uploadDownloadExplanation.setBounds(20, 100, 520, 70);
|
||||||
|
|
||||||
|
settingsPanel.addTab(resourceMap.getString("speedPanel.TabConstraints.tabTitle"), speedPanel); // NOI18N
|
||||||
|
|
||||||
|
updatesPanel.setName("updatesPanel"); // NOI18N
|
||||||
|
|
||||||
|
updateMethod.setText(resourceMap.getString("updateMethod.text")); // NOI18N
|
||||||
|
updateMethod.setName("updateMethod"); // NOI18N
|
||||||
|
|
||||||
|
updateButtonGroup.add(updateInform);
|
||||||
|
updateInform.setText(resourceMap.getString("updateInform.text")); // NOI18N
|
||||||
|
updateInform.setName("updateInform"); // NOI18N
|
||||||
|
|
||||||
|
updateButtonGroup.add(updateDownload);
|
||||||
|
updateDownload.setText(resourceMap.getString("updateDownload.text")); // NOI18N
|
||||||
|
updateDownload.setName("updateDownload"); // NOI18N
|
||||||
|
|
||||||
|
updateButtonGroup.add(updateDownloadRestart);
|
||||||
|
updateDownloadRestart.setText(resourceMap.getString("updateDownloadRestart.text")); // NOI18N
|
||||||
|
updateDownloadRestart.setName("updateDownloadRestart"); // NOI18N
|
||||||
|
|
||||||
|
checkUpdates.setText(resourceMap.getString("checkUpdates.text")); // NOI18N
|
||||||
|
checkUpdates.setName("checkUpdates"); // NOI18N
|
||||||
|
checkUpdates.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
checkUpdatesActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
updateNow.setText(resourceMap.getString("updateNow.text")); // NOI18N
|
||||||
|
updateNow.setName("updateNow"); // NOI18N
|
||||||
|
updateNow.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
updateNowActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
advancedUpdateConfig.setText(resourceMap.getString("advancedUpdateConfig.text")); // NOI18N
|
||||||
|
advancedUpdateConfig.setName("advancedUpdateConfig"); // NOI18N
|
||||||
|
advancedUpdateConfig.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
advancedUpdateConfigActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
javax.swing.GroupLayout updatesPanelLayout = new javax.swing.GroupLayout(updatesPanel);
|
||||||
|
updatesPanel.setLayout(updatesPanelLayout);
|
||||||
|
updatesPanelLayout.setHorizontalGroup(
|
||||||
|
updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(updatesPanelLayout.createSequentialGroup()
|
||||||
|
.addGroup(updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(updatesPanelLayout.createSequentialGroup()
|
||||||
|
.addGap(20, 20, 20)
|
||||||
|
.addGroup(updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(updateMethod)
|
||||||
|
.addGroup(updatesPanelLayout.createSequentialGroup()
|
||||||
|
.addComponent(checkUpdates)
|
||||||
|
.addGap(18, 18, 18)
|
||||||
|
.addComponent(updateNow))))
|
||||||
|
.addGroup(updatesPanelLayout.createSequentialGroup()
|
||||||
|
.addGap(40, 40, 40)
|
||||||
|
.addGroup(updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
|
||||||
|
.addComponent(updateInform, javax.swing.GroupLayout.DEFAULT_SIZE, 377, Short.MAX_VALUE)
|
||||||
|
.addComponent(updateDownload, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
|
.addComponent(updateDownloadRestart, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
|
||||||
|
.addContainerGap())
|
||||||
|
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, updatesPanelLayout.createSequentialGroup()
|
||||||
|
.addContainerGap(339, Short.MAX_VALUE)
|
||||||
|
.addComponent(advancedUpdateConfig)
|
||||||
|
.addContainerGap())
|
||||||
|
);
|
||||||
|
updatesPanelLayout.setVerticalGroup(
|
||||||
|
updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(updatesPanelLayout.createSequentialGroup()
|
||||||
|
.addContainerGap()
|
||||||
|
.addComponent(updateMethod)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
|
.addComponent(updateInform)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(updateDownload)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(updateDownloadRestart)
|
||||||
|
.addGap(18, 18, 18)
|
||||||
|
.addGroup(updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(checkUpdates)
|
||||||
|
.addComponent(updateNow))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 181, Short.MAX_VALUE)
|
||||||
|
.addComponent(advancedUpdateConfig)
|
||||||
|
.addContainerGap())
|
||||||
|
);
|
||||||
|
|
||||||
|
settingsPanel.addTab(resourceMap.getString("updatesPanel.TabConstraints.tabTitle"), updatesPanel); // NOI18N
|
||||||
|
|
||||||
|
tunnelPanel.setName("tunnelPanel"); // NOI18N
|
||||||
|
|
||||||
|
clientFrame.setName("clientFrame"); // NOI18N
|
||||||
|
|
||||||
|
clientTable.setModel(new javax.swing.table.DefaultTableModel(
|
||||||
|
new Object [][] {
|
||||||
|
|
||||||
|
},
|
||||||
|
new String [] {
|
||||||
|
"Name", "Type", "Address", "Status"
|
||||||
|
}
|
||||||
|
));
|
||||||
|
clientTable.setName("clientTable"); // NOI18N
|
||||||
|
clientTable.addMouseListener(new java.awt.event.MouseAdapter() {
|
||||||
|
public void mouseClicked(java.awt.event.MouseEvent evt) {
|
||||||
|
clientTableMouseClicked(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
clientFrame.setViewportView(clientTable);
|
||||||
|
clientTable.getColumnModel().getColumn(0).setHeaderValue(resourceMap.getString("clientTable.columnModel.title0")); // NOI18N
|
||||||
|
clientTable.getColumnModel().getColumn(1).setHeaderValue(resourceMap.getString("clientTable.columnModel.title1")); // NOI18N
|
||||||
|
clientTable.getColumnModel().getColumn(2).setHeaderValue(resourceMap.getString("clientTable.columnModel.title2")); // NOI18N
|
||||||
|
clientTable.getColumnModel().getColumn(3).setHeaderValue(resourceMap.getString("clientTable.columnModel.title3")); // NOI18N
|
||||||
|
|
||||||
|
serverFrame.setName("serverFrame"); // NOI18N
|
||||||
|
|
||||||
|
serverTable.setModel(new javax.swing.table.DefaultTableModel(
|
||||||
|
new Object [][] {
|
||||||
|
{null, null, null},
|
||||||
|
{null, null, null},
|
||||||
|
{null, null, null},
|
||||||
|
{null, null, null}
|
||||||
|
},
|
||||||
|
new String [] {
|
||||||
|
"Name", "Address", "Status"
|
||||||
|
}
|
||||||
|
));
|
||||||
|
serverTable.setName("serverTable"); // NOI18N
|
||||||
|
serverTable.addMouseListener(new java.awt.event.MouseAdapter() {
|
||||||
|
public void mouseClicked(java.awt.event.MouseEvent evt) {
|
||||||
|
serverTableMouseClicked(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
serverFrame.setViewportView(serverTable);
|
||||||
|
serverTable.getColumnModel().getColumn(0).setHeaderValue(resourceMap.getString("serverTable.columnModel.title0")); // NOI18N
|
||||||
|
serverTable.getColumnModel().getColumn(1).setHeaderValue(resourceMap.getString("serverTable.columnModel.title1")); // NOI18N
|
||||||
|
serverTable.getColumnModel().getColumn(2).setHeaderValue(resourceMap.getString("serverTable.columnModel.title2")); // NOI18N
|
||||||
|
|
||||||
|
tunnelsExplanation.setText(resourceMap.getString("tunnelsExplanation.text")); // NOI18N
|
||||||
|
tunnelsExplanation.setName("tunnelsExplanation"); // NOI18N
|
||||||
|
|
||||||
|
clientTunnelLabel.setText(resourceMap.getString("clientTunnelLabel.text")); // NOI18N
|
||||||
|
clientTunnelLabel.setName("clientTunnelLabel"); // NOI18N
|
||||||
|
|
||||||
|
serverTunnelLabel.setText(resourceMap.getString("serverTunnelLabel.text")); // NOI18N
|
||||||
|
serverTunnelLabel.setName("serverTunnelLabel"); // NOI18N
|
||||||
|
|
||||||
|
javax.swing.GroupLayout tunnelPanelLayout = new javax.swing.GroupLayout(tunnelPanel);
|
||||||
|
tunnelPanel.setLayout(tunnelPanelLayout);
|
||||||
|
tunnelPanelLayout.setHorizontalGroup(
|
||||||
|
tunnelPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, tunnelPanelLayout.createSequentialGroup()
|
||||||
|
.addContainerGap()
|
||||||
|
.addGroup(tunnelPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
|
||||||
|
.addComponent(tunnelsExplanation, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE)
|
||||||
|
.addComponent(serverFrame, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE)
|
||||||
|
.addComponent(clientTunnelLabel, javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(clientFrame, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE)
|
||||||
|
.addComponent(serverTunnelLabel, javax.swing.GroupLayout.Alignment.LEADING))
|
||||||
|
.addContainerGap())
|
||||||
|
);
|
||||||
|
tunnelPanelLayout.setVerticalGroup(
|
||||||
|
tunnelPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(tunnelPanelLayout.createSequentialGroup()
|
||||||
|
.addContainerGap()
|
||||||
|
.addComponent(clientTunnelLabel)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(clientFrame, javax.swing.GroupLayout.DEFAULT_SIZE, 119, Short.MAX_VALUE)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(serverTunnelLabel)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(serverFrame, javax.swing.GroupLayout.DEFAULT_SIZE, 122, Short.MAX_VALUE)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(tunnelsExplanation, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addGap(32, 32, 32))
|
||||||
|
);
|
||||||
|
|
||||||
|
settingsPanel.addTab(resourceMap.getString("tunnelPanel.TabConstraints.tabTitle"), tunnelPanel); // NOI18N
|
||||||
|
|
||||||
|
networkPanel.setName("networkPanel"); // NOI18N
|
||||||
|
|
||||||
|
javax.swing.GroupLayout networkPanelLayout = new javax.swing.GroupLayout(networkPanel);
|
||||||
|
networkPanel.setLayout(networkPanelLayout);
|
||||||
|
networkPanelLayout.setHorizontalGroup(
|
||||||
|
networkPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGap(0, 562, Short.MAX_VALUE)
|
||||||
|
);
|
||||||
|
networkPanelLayout.setVerticalGroup(
|
||||||
|
networkPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGap(0, 388, Short.MAX_VALUE)
|
||||||
|
);
|
||||||
|
|
||||||
|
settingsPanel.addTab(resourceMap.getString("networkPanel.TabConstraints.tabTitle"), networkPanel); // NOI18N
|
||||||
|
|
||||||
|
advancedPanel.setName("advancedPanel"); // NOI18N
|
||||||
|
|
||||||
|
javax.swing.GroupLayout advancedPanelLayout = new javax.swing.GroupLayout(advancedPanel);
|
||||||
|
advancedPanel.setLayout(advancedPanelLayout);
|
||||||
|
advancedPanelLayout.setHorizontalGroup(
|
||||||
|
advancedPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGap(0, 562, Short.MAX_VALUE)
|
||||||
|
);
|
||||||
|
advancedPanelLayout.setVerticalGroup(
|
||||||
|
advancedPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGap(0, 388, Short.MAX_VALUE)
|
||||||
|
);
|
||||||
|
|
||||||
|
settingsPanel.addTab(resourceMap.getString("advancedPanel.TabConstraints.tabTitle"), advancedPanel); // NOI18N
|
||||||
|
|
||||||
|
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
|
||||||
|
getContentPane().setLayout(layout);
|
||||||
|
layout.setHorizontalGroup(
|
||||||
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(applyPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addGap(12, 12, 12)
|
||||||
|
.addComponent(settingsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 566, Short.MAX_VALUE))
|
||||||
|
);
|
||||||
|
layout.setVerticalGroup(
|
||||||
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
||||||
|
.addComponent(settingsPanel)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addComponent(applyPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||||
|
);
|
||||||
|
|
||||||
|
pack();
|
||||||
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
|
private void speedKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_speedKeyReleased
|
||||||
|
try {
|
||||||
|
String upload = "";
|
||||||
|
if(uploadkbps.getSelectedIndex() == KILOBIT)
|
||||||
|
upload = "" + Integer.parseInt(uploadspeed.getText())/8;
|
||||||
|
else
|
||||||
|
upload = uploadspeed.getText();
|
||||||
|
String download = "";
|
||||||
|
if(downloadkbps.getSelectedIndex() == KILOBIT)
|
||||||
|
download = "" + Integer.parseInt(downloadspeed.getText())/8;
|
||||||
|
else
|
||||||
|
download = downloadspeed.getText();
|
||||||
|
initUsage(upload, download);
|
||||||
|
}
|
||||||
|
catch(NumberFormatException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}//GEN-LAST:event_speedKeyReleased
|
||||||
|
|
||||||
|
private void uploadkbpsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_uploadkbpsActionPerformed
|
||||||
|
kbpsSwitchPerformed(uploadkbps, uploadspeed);
|
||||||
|
}//GEN-LAST:event_uploadkbpsActionPerformed
|
||||||
|
|
||||||
|
private void downloadkbpsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_downloadkbpsActionPerformed
|
||||||
|
kbpsSwitchPerformed(downloadkbps, downloadspeed);
|
||||||
|
}//GEN-LAST:event_downloadkbpsActionPerformed
|
||||||
|
|
||||||
|
private void monthKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_monthKeyReleased
|
||||||
|
try {
|
||||||
|
int uploadMonthValue = Integer.parseInt(uploadgb.getText());
|
||||||
|
int downloadMonthValue = Integer.parseInt(downloadgb.getText());
|
||||||
|
|
||||||
|
String upload = "";
|
||||||
|
String burstUpload = "";
|
||||||
|
String download = "";
|
||||||
|
String burstDownload = "";
|
||||||
|
|
||||||
|
if(uploadkbps.getSelectedIndex() == KILOBIT)
|
||||||
|
upload = "" + SpeedHelper.calculateSpeed(uploadMonthValue)*8; //kbit
|
||||||
|
else
|
||||||
|
upload = "" + SpeedHelper.calculateSpeed(uploadMonthValue); //kbyte
|
||||||
|
|
||||||
|
if(downloadkbps.getSelectedIndex() == KILOBIT)
|
||||||
|
download = "" + SpeedHelper.calculateSpeed(downloadMonthValue)*8; //kbit
|
||||||
|
else
|
||||||
|
download = "" + SpeedHelper.calculateSpeed(downloadMonthValue); //kbyte
|
||||||
|
|
||||||
|
initSpeeds(upload, download);
|
||||||
|
}
|
||||||
|
catch(NumberFormatException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}//GEN-LAST:event_monthKeyReleased
|
||||||
|
|
||||||
|
private void cancelMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_cancelMouseClicked
|
||||||
|
this.dispose();
|
||||||
|
}//GEN-LAST:event_cancelMouseClicked
|
||||||
|
|
||||||
|
private void okMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_okMouseClicked
|
||||||
|
saveSpeeds();
|
||||||
|
saveUpdatePolicy();
|
||||||
|
this.dispose();
|
||||||
|
}//GEN-LAST:event_okMouseClicked
|
||||||
|
|
||||||
|
private void checkUpdatesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkUpdatesActionPerformed
|
||||||
|
long current = new Date().getTime();
|
||||||
|
if(current < newsLastFetched + 5*60*1000) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
checkUpdates.setText("Checking for updates");
|
||||||
|
checkUpdates.setEnabled(false);
|
||||||
|
newsLastFetched = current;
|
||||||
|
SwingWorker sw = new SwingWorker() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Object doInBackground() throws Exception {
|
||||||
|
NewsFetcher.getInstance(RouterHelper.getContext()).fetchNews();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void done() {
|
||||||
|
checkUpdates.setText("Check for updates now");
|
||||||
|
checkUpdates.setEnabled(true);
|
||||||
|
if(NewsFetcher.getInstance(RouterHelper.getContext()).updateAvailable()) {
|
||||||
|
updateNow.setVisible(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
}//GEN-LAST:event_checkUpdatesActionPerformed
|
||||||
|
|
||||||
|
private void updateNowActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_updateNowActionPerformed
|
||||||
|
SwingWorker sw = new SwingWorker() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Object doInBackground() throws Exception {
|
||||||
|
new net.i2p.router.web.UpdateHandler().update();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
updateNow.setEnabled(false);
|
||||||
|
updateNow.setText("Updating...");
|
||||||
|
checkUpdates.setEnabled(false);
|
||||||
|
|
||||||
|
}//GEN-LAST:event_updateNowActionPerformed
|
||||||
|
|
||||||
|
private void advancedUpdateConfigActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_advancedUpdateConfigActionPerformed
|
||||||
|
try {
|
||||||
|
Desktop.getDesktop().browse(new URI("http://127.0.0.1:7657/configupdate.jsp"));
|
||||||
|
} catch (URISyntaxException ex) {
|
||||||
|
Logger.getLogger(GeneralConfiguration.class.getName()).log(Level.SEVERE, null, ex);
|
||||||
|
}
|
||||||
|
catch (IOException ex) {
|
||||||
|
Logger.getLogger(GeneralConfiguration.class.getName()).log(Level.SEVERE, null, ex);
|
||||||
|
}
|
||||||
|
}//GEN-LAST:event_advancedUpdateConfigActionPerformed
|
||||||
|
|
||||||
|
private void clientTableMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_clientTableMouseClicked
|
||||||
|
int row = clientTable.getSelectedRow();
|
||||||
|
if(row == -1) { //No selected row
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
IndexBean bean = new IndexBean();
|
||||||
|
/*
|
||||||
|
* TODO: This is not entirely good: if one adds/removes a tunnel without desktopgui, this number will be wrong
|
||||||
|
*/
|
||||||
|
int clientNumber = 0;
|
||||||
|
int i = 0;
|
||||||
|
for(clientNumber=0; clientNumber<bean.getTunnelCount(); clientNumber++) {
|
||||||
|
if(bean.isClient(clientNumber)) {
|
||||||
|
if(i == row) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
new ClientTunnelWindow(clientNumber, new ActionListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
initTunnelTab();
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}//GEN-LAST:event_clientTableMouseClicked
|
||||||
|
|
||||||
|
private void serverTableMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_serverTableMouseClicked
|
||||||
|
int row = serverTable.getSelectedRow();
|
||||||
|
if(row == -1) { //No selected row
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
IndexBean bean = new IndexBean();
|
||||||
|
/*
|
||||||
|
* TODO: This is not entirely good: if one adds/removes a tunnel without desktopgui, this number will be wrong
|
||||||
|
*/
|
||||||
|
int serverNumber = 0;
|
||||||
|
int i = 0;
|
||||||
|
for(serverNumber=0; serverNumber<bean.getTunnelCount(); serverNumber++) {
|
||||||
|
if(!bean.isClient(serverNumber)) {
|
||||||
|
if(i == row) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
new ServerTunnelWindow(serverNumber, new ActionListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
initTunnelTab();
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}//GEN-LAST:event_serverTableMouseClicked
|
||||||
|
|
||||||
|
protected void initUsage(String upload, String download) {
|
||||||
|
uploadgb.setText("" + SpeedHelper.calculateMonthlyUsage(Integer.parseInt(upload)));
|
||||||
|
downloadgb.setText("" + SpeedHelper.calculateMonthlyUsage(Integer.parseInt(download)));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void initSpeeds(String upload, String download) {
|
||||||
|
uploadspeed.setText(upload);
|
||||||
|
downloadspeed.setText(download);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void kbpsSwitchPerformed(JComboBox kbps, JTextField speed) {
|
||||||
|
int index = kbps.getSelectedIndex();
|
||||||
|
int previous = Integer.parseInt(speed.getText());
|
||||||
|
if(index == KILOBIT) {
|
||||||
|
speed.setText("" + previous*8);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
speed.setText("" + previous/8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void saveSpeeds() {
|
||||||
|
int maxDownload = Integer.parseInt(downloadspeed.getText());
|
||||||
|
int maxUpload = Integer.parseInt(uploadspeed.getText());
|
||||||
|
if(uploadkbps.getSelectedIndex() == KILOBIT) {
|
||||||
|
SpeedHandler.setOutboundBandwidth(maxUpload/8);
|
||||||
|
SpeedHandler.setOutboundBurstBandwidth(maxUpload/8);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SpeedHandler.setOutboundBandwidth(maxUpload);
|
||||||
|
SpeedHandler.setOutboundBurstBandwidth(maxUpload);
|
||||||
|
}
|
||||||
|
if(downloadkbps.getSelectedIndex() == KILOBIT) {
|
||||||
|
SpeedHandler.setInboundBandwidth(maxDownload/8);
|
||||||
|
SpeedHandler.setInboundBurstBandwidth(maxDownload/8);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
SpeedHandler.setInboundBandwidth(maxDownload);
|
||||||
|
SpeedHandler.setInboundBurstBandwidth(maxDownload);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void saveUpdatePolicy() {
|
||||||
|
ButtonModel policyButton = updateButtonGroup.getSelection();
|
||||||
|
if(policyButton.equals(updateInform.getModel())) {
|
||||||
|
UpdateHandler.setUpdatePolicy(UpdateHelper.NOTIFY_UPDATE_POLICY);
|
||||||
|
}
|
||||||
|
else if(policyButton.equals(updateDownload.getModel())) {
|
||||||
|
UpdateHandler.setUpdatePolicy(UpdateHelper.DOWNLOAD_UPDATE_POLICY);
|
||||||
|
}
|
||||||
|
else if(policyButton.equals(updateDownloadRestart.getModel())) {
|
||||||
|
UpdateHandler.setUpdatePolicy(UpdateHelper.INSTALL_UPDATE_POLICY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
|
private javax.swing.JPanel advancedPanel;
|
||||||
|
private javax.swing.JToggleButton advancedUpdateConfig;
|
||||||
|
private javax.swing.JPanel applyPanel;
|
||||||
|
private javax.swing.JToggleButton cancel;
|
||||||
|
private javax.swing.JToggleButton checkUpdates;
|
||||||
|
private javax.swing.JScrollPane clientFrame;
|
||||||
|
private javax.swing.JTable clientTable;
|
||||||
|
private javax.swing.JLabel clientTunnelLabel;
|
||||||
|
private javax.swing.JLabel downloadSpeedLabel;
|
||||||
|
private javax.swing.JLabel downloadUsageLabel;
|
||||||
|
private javax.swing.JTextField downloadgb;
|
||||||
|
private javax.swing.JComboBox downloadkbps;
|
||||||
|
private javax.swing.JTextField downloadspeed;
|
||||||
|
private javax.swing.JLabel gbDownloadLabel;
|
||||||
|
private javax.swing.JLabel gbUploadLabel;
|
||||||
|
private javax.swing.JPanel networkPanel;
|
||||||
|
private javax.swing.JToggleButton ok;
|
||||||
|
private javax.swing.JScrollPane serverFrame;
|
||||||
|
private javax.swing.JTable serverTable;
|
||||||
|
private javax.swing.JLabel serverTunnelLabel;
|
||||||
|
private javax.swing.JTabbedPane settingsPanel;
|
||||||
|
private javax.swing.JPanel speedPanel;
|
||||||
|
private javax.swing.JPanel tunnelPanel;
|
||||||
|
private javax.swing.JLabel tunnelsExplanation;
|
||||||
|
private javax.swing.ButtonGroup updateButtonGroup;
|
||||||
|
private javax.swing.JRadioButton updateDownload;
|
||||||
|
private javax.swing.JRadioButton updateDownloadRestart;
|
||||||
|
private javax.swing.JRadioButton updateInform;
|
||||||
|
private javax.swing.JLabel updateMethod;
|
||||||
|
private javax.swing.JToggleButton updateNow;
|
||||||
|
private javax.swing.JPanel updatesPanel;
|
||||||
|
private javax.swing.JLabel uploadDownloadExplanation;
|
||||||
|
private javax.swing.JLabel uploadSpeedLabel;
|
||||||
|
private javax.swing.JLabel uploadUsageLabel;
|
||||||
|
private javax.swing.JTextField uploadgb;
|
||||||
|
private javax.swing.JComboBox uploadkbps;
|
||||||
|
private javax.swing.JTextField uploadspeed;
|
||||||
|
// End of variables declaration//GEN-END:variables
|
||||||
|
|
||||||
|
public static final int KILOBIT = 0;
|
||||||
|
public static final int KILOBYTE = 1;
|
||||||
|
|
||||||
|
private long newsLastFetched = 0;
|
||||||
|
}
|
@ -24,7 +24,7 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package gui;
|
package net.i2p.desktopgui.gui;
|
||||||
|
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
import java.awt.Frame;
|
import java.awt.Frame;
|
||||||
@ -37,13 +37,12 @@ import java.awt.Window;
|
|||||||
import java.awt.event.MouseAdapter;
|
import java.awt.event.MouseAdapter;
|
||||||
import java.awt.event.MouseEvent;
|
import java.awt.event.MouseEvent;
|
||||||
import javax.swing.JDialog;
|
import javax.swing.JDialog;
|
||||||
import javax.swing.JFrame;
|
|
||||||
import javax.swing.JPanel;
|
|
||||||
import javax.swing.JPopupMenu;
|
import javax.swing.JPopupMenu;
|
||||||
import javax.swing.JWindow;
|
import javax.swing.JWindow;
|
||||||
import javax.swing.RootPaneContainer;
|
import javax.swing.RootPaneContainer;
|
||||||
import javax.swing.event.PopupMenuEvent;
|
import javax.swing.event.PopupMenuEvent;
|
||||||
import javax.swing.event.PopupMenuListener;
|
import javax.swing.event.PopupMenuListener;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -63,6 +62,10 @@ public class JPopupTrayIcon extends TrayIcon {
|
|||||||
|
|
||||||
private final static boolean IS_WINDOWS = System.getProperty("os.name").toLowerCase().contains("windows");
|
private final static boolean IS_WINDOWS = System.getProperty("os.name").toLowerCase().contains("windows");
|
||||||
|
|
||||||
|
private static MouseEvent previous = null;
|
||||||
|
private static Date previousTime = new Date();
|
||||||
|
private static Date time = new Date();
|
||||||
|
|
||||||
public JPopupTrayIcon(Image image) {
|
public JPopupTrayIcon(Image image) {
|
||||||
super(image);
|
super(image);
|
||||||
init();
|
init();
|
||||||
@ -92,12 +95,12 @@ public class JPopupTrayIcon extends TrayIcon {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
|
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
|
||||||
// System.out.println("popupMenuWillBecomeVisible");
|
//System.out.println("popupMenuWillBecomeVisible");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
|
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
|
||||||
// System.out.println("popupMenuWillBecomeInvisible");
|
//System.out.println("popupMenuWillBecomeInvisible");
|
||||||
if(window != null) {
|
if(window != null) {
|
||||||
window.dispose();
|
window.dispose();
|
||||||
window = null;
|
window = null;
|
||||||
@ -117,21 +120,27 @@ public class JPopupTrayIcon extends TrayIcon {
|
|||||||
addMouseListener(new MouseAdapter() {
|
addMouseListener(new MouseAdapter() {
|
||||||
@Override
|
@Override
|
||||||
public void mousePressed(MouseEvent e) {
|
public void mousePressed(MouseEvent e) {
|
||||||
// System.out.println(e.getPoint());
|
//System.out.println("Pressed " + e.getPoint());
|
||||||
showJPopupMenu(e);
|
showJPopupMenu(e, previous);
|
||||||
|
previous = e;
|
||||||
|
previousTime = time;
|
||||||
|
time = new Date();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void mouseReleased(MouseEvent e) {
|
public void mouseReleased(MouseEvent e) {
|
||||||
// System.out.println(e.getPoint());
|
//System.out.println("Released " + e.getPoint());
|
||||||
showJPopupMenu(e);
|
showJPopupMenu(e, previous);
|
||||||
|
previous = e;
|
||||||
|
previousTime = time;
|
||||||
|
time = new Date();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private final void showJPopupMenu(MouseEvent e) {
|
private final void showJPopupMenu(MouseEvent e, MouseEvent previous) {
|
||||||
if(e.isPopupTrigger() && menu != null) {
|
if((e.isPopupTrigger() || previous.isPopupTrigger()) && (time.getTime() - previousTime.getTime() < 1000) && menu != null) {
|
||||||
if (window == null) {
|
if (window == null) {
|
||||||
|
|
||||||
if(IS_WINDOWS) {
|
if(IS_WINDOWS) {
|
@ -3,6 +3,7 @@
|
|||||||
<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
|
<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="defaultCloseOperation" type="int" value="3"/>
|
<Property name="defaultCloseOperation" type="int" value="3"/>
|
||||||
|
<Property name="title" type="java.lang.String" resourceKey="Form.title"/>
|
||||||
<Property name="name" type="java.lang.String" value="Form" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="Form" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
<SyntheticProperties>
|
<SyntheticProperties>
|
||||||
@ -11,6 +12,7 @@
|
|||||||
<AuxValues>
|
<AuxValues>
|
||||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/>
|
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/>
|
||||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/>
|
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
|
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
|
||||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
|
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
|
||||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
@ -4,7 +4,7 @@
|
|||||||
* Created on 10 april 2009, 19:17
|
* Created on 10 april 2009, 19:17
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package gui;
|
package net.i2p.desktopgui.gui;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@ -73,6 +73,8 @@ public class LogViewer extends javax.swing.JFrame {
|
|||||||
clearButton = new javax.swing.JButton();
|
clearButton = new javax.swing.JButton();
|
||||||
|
|
||||||
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
|
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
|
||||||
|
org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(LogViewer.class);
|
||||||
|
setTitle(resourceMap.getString("Form.title")); // NOI18N
|
||||||
setName("Form"); // NOI18N
|
setName("Form"); // NOI18N
|
||||||
|
|
||||||
textScroll.setName("textScroll"); // NOI18N
|
textScroll.setName("textScroll"); // NOI18N
|
||||||
@ -82,7 +84,6 @@ public class LogViewer extends javax.swing.JFrame {
|
|||||||
logText.setName("logText"); // NOI18N
|
logText.setName("logText"); // NOI18N
|
||||||
textScroll.setViewportView(logText);
|
textScroll.setViewportView(logText);
|
||||||
|
|
||||||
org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(desktopgui.Main.class).getContext().getResourceMap(LogViewer.class);
|
|
||||||
explanationText.setText(resourceMap.getString("explanationText.text")); // NOI18N
|
explanationText.setText(resourceMap.getString("explanationText.text")); // NOI18N
|
||||||
explanationText.setName("explanationText"); // NOI18N
|
explanationText.setName("explanationText"); // NOI18N
|
||||||
|
|
@ -0,0 +1,40 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
|
||||||
|
<Form version="1.5" maxVersion="1.7" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
|
||||||
|
<Properties>
|
||||||
|
<Property name="defaultCloseOperation" type="int" value="3"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="Form" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<SyntheticProperties>
|
||||||
|
<SyntheticProperty name="formSizePolicy" type="int" value="1"/>
|
||||||
|
</SyntheticProperties>
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/>
|
||||||
|
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
|
||||||
|
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
|
||||||
|
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
||||||
|
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
|
||||||
|
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
|
||||||
|
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
|
||||||
|
<AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
|
||||||
|
</AuxValues>
|
||||||
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
|
||||||
|
<Property name="useNullLayout" type="boolean" value="true"/>
|
||||||
|
</Layout>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JLabel" name="jLabel1">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="jLabel1.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="jLabel1" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="10" y="10" width="-1" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Form>
|
@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* To change this template, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ServerTunnelWindow.java
|
||||||
|
*
|
||||||
|
* Created on 11-jun-2009, 14:55:53
|
||||||
|
*/
|
||||||
|
|
||||||
|
package net.i2p.desktopgui.gui;
|
||||||
|
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author mathias
|
||||||
|
*/
|
||||||
|
public class ServerTunnelWindow extends javax.swing.JFrame {
|
||||||
|
|
||||||
|
/** Creates new form ServerTunnelWindow */
|
||||||
|
public ServerTunnelWindow(int tunnelNumber, ActionListener al) {
|
||||||
|
initComponents();
|
||||||
|
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
|
||||||
|
this.setSize(600, 600);
|
||||||
|
this.setLocationRelativeTo(null);
|
||||||
|
this.requestFocus();
|
||||||
|
this.setVisible(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** This method is called from within the constructor to
|
||||||
|
* initialize the form.
|
||||||
|
* WARNING: Do NOT modify this code. The content of this method is
|
||||||
|
* always regenerated by the Form Editor.
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||||
|
private void initComponents() {
|
||||||
|
|
||||||
|
jLabel1 = new javax.swing.JLabel();
|
||||||
|
|
||||||
|
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
|
||||||
|
setName("Form"); // NOI18N
|
||||||
|
getContentPane().setLayout(null);
|
||||||
|
|
||||||
|
org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(ServerTunnelWindow.class);
|
||||||
|
jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N
|
||||||
|
jLabel1.setName("jLabel1"); // NOI18N
|
||||||
|
getContentPane().add(jLabel1);
|
||||||
|
jLabel1.setBounds(10, 10, 43, 17);
|
||||||
|
|
||||||
|
pack();
|
||||||
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
|
private javax.swing.JLabel jLabel1;
|
||||||
|
// End of variables declaration//GEN-END:variables
|
||||||
|
|
||||||
|
}
|
@ -16,6 +16,7 @@
|
|||||||
<AuxValues>
|
<AuxValues>
|
||||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/>
|
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/>
|
||||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/>
|
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
|
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
|
||||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
|
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
|
||||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
@ -4,15 +4,14 @@
|
|||||||
* Created on 3 april 2009, 13:57
|
* Created on 3 april 2009, 13:57
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package gui;
|
package net.i2p.desktopgui.gui;
|
||||||
|
|
||||||
import java.awt.Dimension;
|
|
||||||
import java.awt.Point;
|
import java.awt.Point;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import javax.swing.JComboBox;
|
import javax.swing.JComboBox;
|
||||||
import javax.swing.JTextField;
|
import javax.swing.JTextField;
|
||||||
import persistence.PropertyManager;
|
import net.i2p.desktopgui.persistence.PropertyManager;
|
||||||
import util.IntegerVerifier;
|
import net.i2p.desktopgui.util.IntegerVerifier;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@ -60,7 +59,7 @@ public class SpeedSelector extends javax.swing.JFrame {
|
|||||||
downloadkbps = new javax.swing.JComboBox();
|
downloadkbps = new javax.swing.JComboBox();
|
||||||
|
|
||||||
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
|
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
|
||||||
org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(desktopgui.Main.class).getContext().getResourceMap(SpeedSelector.class);
|
org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(SpeedSelector.class);
|
||||||
setTitle(resourceMap.getString("Form.title")); // NOI18N
|
setTitle(resourceMap.getString("Form.title")); // NOI18N
|
||||||
setMinimumSize(new java.awt.Dimension(610, 330));
|
setMinimumSize(new java.awt.Dimension(610, 330));
|
||||||
setName("Form"); // NOI18N
|
setName("Form"); // NOI18N
|
@ -20,6 +20,7 @@
|
|||||||
<AuxValues>
|
<AuxValues>
|
||||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/>
|
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/>
|
||||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/>
|
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
|
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
|
||||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
|
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
|
||||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
@ -4,14 +4,13 @@
|
|||||||
* Created on 3 april 2009, 14:36
|
* Created on 3 april 2009, 14:36
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package gui;
|
package net.i2p.desktopgui.gui;
|
||||||
|
|
||||||
import java.awt.Dimension;
|
|
||||||
import java.awt.Point;
|
import java.awt.Point;
|
||||||
import java.util.Enumeration;
|
import java.util.Enumeration;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import javax.swing.AbstractButton;
|
import javax.swing.AbstractButton;
|
||||||
import persistence.PropertyManager;
|
import net.i2p.desktopgui.persistence.PropertyManager;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@ -48,7 +47,7 @@ public class SpeedSelector2 extends javax.swing.JFrame {
|
|||||||
jLabel1 = new javax.swing.JLabel();
|
jLabel1 = new javax.swing.JLabel();
|
||||||
|
|
||||||
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
|
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
|
||||||
org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(desktopgui.Main.class).getContext().getResourceMap(SpeedSelector2.class);
|
org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(SpeedSelector2.class);
|
||||||
setTitle(resourceMap.getString("Form.title")); // NOI18N
|
setTitle(resourceMap.getString("Form.title")); // NOI18N
|
||||||
setMinimumSize(new java.awt.Dimension(610, 330));
|
setMinimumSize(new java.awt.Dimension(610, 330));
|
||||||
setName("Form"); // NOI18N
|
setName("Form"); // NOI18N
|
@ -16,6 +16,7 @@
|
|||||||
<AuxValues>
|
<AuxValues>
|
||||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/>
|
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/>
|
||||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/>
|
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
|
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
|
||||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
|
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
|
||||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
||||||
@ -318,7 +319,7 @@
|
|||||||
</Properties>
|
</Properties>
|
||||||
<Constraints>
|
<Constraints>
|
||||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
<AbsoluteConstraints x="580" y="150" width="-1" height="30"/>
|
<AbsoluteConstraints x="580" y="150" width="40" height="30"/>
|
||||||
</Constraint>
|
</Constraint>
|
||||||
</Constraints>
|
</Constraints>
|
||||||
</Component>
|
</Component>
|
@ -4,16 +4,16 @@
|
|||||||
* Created on 3 april 2009, 15:17
|
* Created on 3 april 2009, 15:17
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package gui;
|
package net.i2p.desktopgui.gui;
|
||||||
|
|
||||||
import java.awt.Dimension;
|
import java.awt.Dimension;
|
||||||
import java.awt.Point;
|
import java.awt.Point;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import javax.swing.JComboBox;
|
import javax.swing.JComboBox;
|
||||||
import javax.swing.JTextField;
|
import javax.swing.JTextField;
|
||||||
import persistence.PropertyManager;
|
import net.i2p.desktopgui.persistence.PropertyManager;
|
||||||
import router.configuration.SpeedHandler;
|
import net.i2p.desktopgui.router.configuration.SpeedHandler;
|
||||||
import router.configuration.SpeedHelper;
|
import net.i2p.desktopgui.router.configuration.SpeedHelper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@ -67,7 +67,7 @@ public class SpeedSelector3 extends javax.swing.JFrame {
|
|||||||
explanation = new javax.swing.JLabel();
|
explanation = new javax.swing.JLabel();
|
||||||
|
|
||||||
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
|
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
|
||||||
org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(desktopgui.Main.class).getContext().getResourceMap(SpeedSelector3.class);
|
org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(SpeedSelector3.class);
|
||||||
setTitle(resourceMap.getString("Form.title")); // NOI18N
|
setTitle(resourceMap.getString("Form.title")); // NOI18N
|
||||||
setMinimumSize(new java.awt.Dimension(670, 330));
|
setMinimumSize(new java.awt.Dimension(670, 330));
|
||||||
setName("Form"); // NOI18N
|
setName("Form"); // NOI18N
|
||||||
@ -231,7 +231,7 @@ public class SpeedSelector3 extends javax.swing.JFrame {
|
|||||||
downloadGB.setText(resourceMap.getString("downloadUsageLabel.text")); // NOI18N
|
downloadGB.setText(resourceMap.getString("downloadUsageLabel.text")); // NOI18N
|
||||||
downloadGB.setName("downloadUsageLabel"); // NOI18N
|
downloadGB.setName("downloadUsageLabel"); // NOI18N
|
||||||
getContentPane().add(downloadGB);
|
getContentPane().add(downloadGB);
|
||||||
downloadGB.setBounds(580, 150, 19, 30);
|
downloadGB.setBounds(580, 150, 40, 30);
|
||||||
|
|
||||||
explanation.setText(resourceMap.getString("explanation.text")); // NOI18N
|
explanation.setText(resourceMap.getString("explanation.text")); // NOI18N
|
||||||
explanation.setName("explanation"); // NOI18N
|
explanation.setName("explanation"); // NOI18N
|
@ -1,4 +1,4 @@
|
|||||||
package gui;
|
package net.i2p.desktopgui.gui;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
@ -3,9 +3,9 @@
|
|||||||
* and open the template in the editor.
|
* and open the template in the editor.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package gui;
|
package net.i2p.desktopgui.gui;
|
||||||
|
|
||||||
import desktopgui.*;
|
import net.i2p.desktopgui.desktopgui.*;
|
||||||
import java.awt.AWTException;
|
import java.awt.AWTException;
|
||||||
import java.awt.Desktop;
|
import java.awt.Desktop;
|
||||||
import java.awt.Image;
|
import java.awt.Image;
|
||||||
@ -23,9 +23,9 @@ import java.util.logging.Logger;
|
|||||||
import javax.swing.JMenu;
|
import javax.swing.JMenu;
|
||||||
import javax.swing.JMenuItem;
|
import javax.swing.JMenuItem;
|
||||||
import javax.swing.JPopupMenu;
|
import javax.swing.JPopupMenu;
|
||||||
import router.RouterHandler;
|
import net.i2p.desktopgui.router.RouterHandler;
|
||||||
import router.RouterHelper;
|
import net.i2p.desktopgui.router.RouterHelper;
|
||||||
import router.configuration.PeerHelper;
|
import net.i2p.desktopgui.router.configuration.PeerHelper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@ -151,7 +151,7 @@ public class Tray {
|
|||||||
public void actionPerformed(ActionEvent arg0) {
|
public void actionPerformed(ActionEvent arg0) {
|
||||||
RouterHandler.setStatus(RouterHandler.SHUTDOWN_GRACEFULLY);
|
RouterHandler.setStatus(RouterHandler.SHUTDOWN_GRACEFULLY);
|
||||||
long shutdownTime = RouterHelper.getGracefulShutdownTimeRemaining();
|
long shutdownTime = RouterHelper.getGracefulShutdownTimeRemaining();
|
||||||
System.out.println(shutdownTime);
|
System.out.println("Shutdowntime remaining: " + shutdownTime);
|
||||||
if(shutdownTime>0) {
|
if(shutdownTime>0) {
|
||||||
trayIcon.displayMessage("Shutting down...", "Shutdown time remaining: " + shutdownTime/1000 + " seconds."
|
trayIcon.displayMessage("Shutting down...", "Shutdown time remaining: " + shutdownTime/1000 + " seconds."
|
||||||
+ System.getProperty("line.separator") + "Shutdown will not happen immediately, because we are still participating in the network.", TrayIcon.MessageType.INFO);
|
+ System.getProperty("line.separator") + "Shutdown will not happen immediately, because we are still participating in the network.", TrayIcon.MessageType.INFO);
|
||||||
@ -170,7 +170,7 @@ public class Tray {
|
|||||||
popup.addSeparator();
|
popup.addSeparator();
|
||||||
|
|
||||||
config.add(speedConfig);
|
config.add(speedConfig);
|
||||||
//config.add(generalConfig);
|
config.add(generalConfig);
|
||||||
config.add(advancedConfig);
|
config.add(advancedConfig);
|
||||||
popup.add(config);
|
popup.add(config);
|
||||||
|
|
@ -3,6 +3,7 @@
|
|||||||
<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
|
<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
|
||||||
<Properties>
|
<Properties>
|
||||||
<Property name="defaultCloseOperation" type="int" value="2"/>
|
<Property name="defaultCloseOperation" type="int" value="2"/>
|
||||||
|
<Property name="title" type="java.lang.String" resourceKey="Form.title"/>
|
||||||
<Property name="name" type="java.lang.String" value="Form" noResource="true"/>
|
<Property name="name" type="java.lang.String" value="Form" noResource="true"/>
|
||||||
</Properties>
|
</Properties>
|
||||||
<SyntheticProperties>
|
<SyntheticProperties>
|
||||||
@ -11,6 +12,7 @@
|
|||||||
<AuxValues>
|
<AuxValues>
|
||||||
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/>
|
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/>
|
||||||
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/>
|
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/>
|
||||||
|
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
|
||||||
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
|
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
|
||||||
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
|
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
|
||||||
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
|
||||||
@ -22,24 +24,24 @@
|
|||||||
<Layout>
|
<Layout>
|
||||||
<DimensionLayout dim="0">
|
<DimensionLayout dim="0">
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Group type="102" alignment="0" attributes="0">
|
<Group type="102" attributes="0">
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
<Group type="103" groupAlignment="1" max="-2" attributes="0">
|
|
||||||
<Component id="I2Plabel" alignment="0" max="32767" attributes="0"/>
|
|
||||||
<Component id="GUILabel" alignment="0" max="32767" attributes="1"/>
|
|
||||||
</Group>
|
|
||||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
|
||||||
<Group type="103" groupAlignment="0" attributes="0">
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
<Component id="I2PVersion" pref="126" max="32767" attributes="0"/>
|
<Group type="102" alignment="0" attributes="0">
|
||||||
<Component id="GUIVersion" pref="126" max="32767" attributes="0"/>
|
<Group type="103" groupAlignment="1" max="-2" attributes="0">
|
||||||
|
<Component id="I2Plabel" alignment="0" max="32767" attributes="0"/>
|
||||||
|
<Component id="GUILabel" alignment="0" max="32767" attributes="1"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Component id="I2PVersion" pref="126" max="32767" attributes="0"/>
|
||||||
|
<Component id="GUIVersion" pref="126" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
<Component id="okButton" alignment="1" min="-2" max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
</Group>
|
</Group>
|
||||||
<Group type="102" alignment="1" attributes="0">
|
|
||||||
<EmptySpace pref="294" max="32767" attributes="0"/>
|
|
||||||
<Component id="okButton" min="-2" max="-2" attributes="0"/>
|
|
||||||
<EmptySpace max="-2" attributes="0"/>
|
|
||||||
</Group>
|
|
||||||
</Group>
|
</Group>
|
||||||
</DimensionLayout>
|
</DimensionLayout>
|
||||||
<DimensionLayout dim="1">
|
<DimensionLayout dim="1">
|
@ -4,10 +4,10 @@
|
|||||||
* Created on 13 april 2009, 13:48
|
* Created on 13 april 2009, 13:48
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package gui;
|
package net.i2p.desktopgui.gui;
|
||||||
|
|
||||||
import javax.swing.JFrame;
|
import javax.swing.JFrame;
|
||||||
import router.RouterHelper;
|
import net.i2p.desktopgui.router.RouterHelper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@ -24,7 +24,7 @@ public class Version extends javax.swing.JDialog {
|
|||||||
super(parent, modal);
|
super(parent, modal);
|
||||||
initComponents();
|
initComponents();
|
||||||
String i2pVersion = RouterHelper.getVersion();
|
String i2pVersion = RouterHelper.getVersion();
|
||||||
String guiVersion = desktopgui.GUIVersion.VERSION;
|
String guiVersion = net.i2p.desktopgui.desktopgui.GUIVersion.VERSION;
|
||||||
this.I2PVersion.setText("<html><h1>" + i2pVersion + "</h1></html>");
|
this.I2PVersion.setText("<html><h1>" + i2pVersion + "</h1></html>");
|
||||||
this.GUIVersion.setText("<html><h1>" + guiVersion + "</h1></html>");
|
this.GUIVersion.setText("<html><h1>" + guiVersion + "</h1></html>");
|
||||||
this.setVisible(true);
|
this.setVisible(true);
|
||||||
@ -46,9 +46,10 @@ public class Version extends javax.swing.JDialog {
|
|||||||
GUIVersion = new javax.swing.JLabel();
|
GUIVersion = new javax.swing.JLabel();
|
||||||
|
|
||||||
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
|
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
|
||||||
|
org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(net.i2p.desktopgui.desktopgui.Main.class).getContext().getResourceMap(Version.class);
|
||||||
|
setTitle(resourceMap.getString("Form.title")); // NOI18N
|
||||||
setName("Form"); // NOI18N
|
setName("Form"); // NOI18N
|
||||||
|
|
||||||
org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(desktopgui.Main.class).getContext().getResourceMap(Version.class);
|
|
||||||
okButton.setText(resourceMap.getString("okButton.text")); // NOI18N
|
okButton.setText(resourceMap.getString("okButton.text")); // NOI18N
|
||||||
okButton.setName("okButton"); // NOI18N
|
okButton.setName("okButton"); // NOI18N
|
||||||
okButton.addActionListener(new java.awt.event.ActionListener() {
|
okButton.addActionListener(new java.awt.event.ActionListener() {
|
||||||
@ -75,17 +76,16 @@ public class Version extends javax.swing.JDialog {
|
|||||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addGroup(layout.createSequentialGroup()
|
.addGroup(layout.createSequentialGroup()
|
||||||
.addContainerGap()
|
.addContainerGap()
|
||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
|
|
||||||
.addComponent(I2Plabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
|
||||||
.addComponent(GUILabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
|
||||||
.addGap(18, 18, 18)
|
|
||||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
.addComponent(I2PVersion, javax.swing.GroupLayout.DEFAULT_SIZE, 126, Short.MAX_VALUE)
|
.addGroup(layout.createSequentialGroup()
|
||||||
.addComponent(GUIVersion, javax.swing.GroupLayout.DEFAULT_SIZE, 126, Short.MAX_VALUE))
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
|
||||||
.addContainerGap())
|
.addComponent(I2Plabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
.addComponent(GUILabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
|
||||||
.addContainerGap(294, Short.MAX_VALUE)
|
.addGap(18, 18, 18)
|
||||||
.addComponent(okButton)
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(I2PVersion, javax.swing.GroupLayout.DEFAULT_SIZE, 126, Short.MAX_VALUE)
|
||||||
|
.addComponent(GUIVersion, javax.swing.GroupLayout.DEFAULT_SIZE, 126, Short.MAX_VALUE)))
|
||||||
|
.addComponent(okButton, javax.swing.GroupLayout.Alignment.TRAILING))
|
||||||
.addContainerGap())
|
.addContainerGap())
|
||||||
);
|
);
|
||||||
layout.setVerticalGroup(
|
layout.setVerticalGroup(
|
@ -0,0 +1,26 @@
|
|||||||
|
# To change this template, choose Tools | Templates
|
||||||
|
# and open the template in the editor.
|
||||||
|
|
||||||
|
Form.title=Client Tunnel Configuration
|
||||||
|
tunnelNameLabel.text=Name:
|
||||||
|
tunnelTypeLabel.text=Type:
|
||||||
|
tunnelType.text=jLabel10
|
||||||
|
tunnelName.text=jTextField1
|
||||||
|
tunnelPortLabel.text=Port:
|
||||||
|
tunnelPort.text=jTextField2
|
||||||
|
tunnelDestination.text=jTextField3
|
||||||
|
tunnelDestinationLabel.text=Destination:
|
||||||
|
tunnelProfileLabel.text=Profile:
|
||||||
|
delayConnect.text=Delay connect
|
||||||
|
sharedClient.text=Shared client
|
||||||
|
autoStart.text=Auto start
|
||||||
|
tunnelDepthLabel.text=Tunnel depth:
|
||||||
|
depthVarianceLabel.text=Depth variance:
|
||||||
|
tunnelCountLabel.text=Tunnel count:
|
||||||
|
backupTunnelCountLabel.text=Backup tunnel count:
|
||||||
|
reduceIdle.text=Reduce tunnel count when idle
|
||||||
|
closeIdle.text=Close tunnels when idle
|
||||||
|
delayIdle.text=Delay opening of tunnels when idle
|
||||||
|
save.text=Save
|
||||||
|
cancel.text=Cancel
|
||||||
|
changeTunnelState.text=Start Tunnel
|
@ -0,0 +1,37 @@
|
|||||||
|
cancel.text=Cancel
|
||||||
|
ok.text=OK
|
||||||
|
Form.title=General Configuration
|
||||||
|
speedPanel.TabConstraints.tabTitle=Speed
|
||||||
|
updatesPanel.TabConstraints.tabTitle=Updates
|
||||||
|
tunnelPanel.TabConstraints.tabTitle=Tunnels/Services
|
||||||
|
networkPanel.TabConstraints.tabTitle=Network
|
||||||
|
advancedPanel.TabConstraints.tabTitle=Advanced
|
||||||
|
uploadSpeedLabel.text=Upload speed:
|
||||||
|
downloadSpeedLabel.text=Download speed:
|
||||||
|
uploadspeed.text=jTextField1
|
||||||
|
downloadspeed.text=jTextField2
|
||||||
|
uploadgb.text=jTextField3
|
||||||
|
downloadgb.text=jTextField4
|
||||||
|
updateMethod.text=What is your preferred automatic update setting?
|
||||||
|
updateInform.text=Only inform about updates (not advised)
|
||||||
|
updateDownload.text=Download and verify update file, do not restart
|
||||||
|
updateDownloadRestart.text=Download, verify and restart
|
||||||
|
checkUpdates.text=Check for updates now
|
||||||
|
updateNow.text=Update available: update now
|
||||||
|
advancedUpdateConfig.text=Advanced update configuration
|
||||||
|
clientTunnelLabel.text=Client tunnels:
|
||||||
|
serverTunnelLabel.text=Server tunnels:
|
||||||
|
tunnelsExplanation.text=Click on a tunnel to view and change its configuration. + Tunnel explanation
|
||||||
|
uploadUsageLabel.text=Monthly usage:
|
||||||
|
downloadUsageLabel.text=Monthly usage:
|
||||||
|
gbUploadLabel.text=GB
|
||||||
|
gbDownloadLabel.text=GB
|
||||||
|
uploadDownloadExplanation.text=Explanation ...
|
||||||
|
clientTable.columnModel.title3=Status
|
||||||
|
clientTable.columnModel.title2=Address
|
||||||
|
clientTable.columnModel.title1=Type
|
||||||
|
clientTable.columnModel.title0=Name
|
||||||
|
serverTable.columnModel.title0=Name
|
||||||
|
serverTable.columnModel.title3=Title 4
|
||||||
|
serverTable.columnModel.title2=Status
|
||||||
|
serverTable.columnModel.title1=Address
|
@ -1,3 +1,4 @@
|
|||||||
refreshButton.text=Refresh
|
refreshButton.text=Refresh
|
||||||
clearButton.text=Clear
|
clearButton.text=Clear
|
||||||
explanationText.text=Explanation ...
|
explanationText.text=Explanation ...
|
||||||
|
Form.title=View Logs
|
@ -0,0 +1 @@
|
|||||||
|
jLabel1.text=Name:
|
@ -5,8 +5,8 @@ uploadLabel.text=Upload Speed:
|
|||||||
uploadBurstLabel.text=Burst Upload Speed:
|
uploadBurstLabel.text=Burst Upload Speed:
|
||||||
downloadLabel.text=Download Speed:
|
downloadLabel.text=Download Speed:
|
||||||
downloadBurstLabel.text=Burst Download Speed:
|
downloadBurstLabel.text=Burst Download Speed:
|
||||||
uploadUsageLabel.text=Monthly usage:
|
uploadUsageLabel.text=GB
|
||||||
downloadUsageLabel.text=Monthly usage:
|
downloadUsageLabel.text=GB
|
||||||
uploadField.text=jTextField1
|
uploadField.text=jTextField1
|
||||||
uploadBurstField.text=jTextField2
|
uploadBurstField.text=jTextField2
|
||||||
downloadField.text=jTextField4
|
downloadField.text=jTextField4
|
@ -3,3 +3,4 @@ I2Plabel.text=<html><h1>I2P Version:</h1></html>
|
|||||||
GUILabel.text=<html><h1>GUI Version:</h1></html>
|
GUILabel.text=<html><h1>GUI Version:</h1></html>
|
||||||
I2PVersion.text=jLabel3
|
I2PVersion.text=jLabel3
|
||||||
GUIVersion.text=jLabel4
|
GUIVersion.text=jLabel4
|
||||||
|
Form.title=Version
|
@ -1,4 +1,4 @@
|
|||||||
package persistence;
|
package net.i2p.desktopgui.persistence;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
@ -3,7 +3,7 @@
|
|||||||
* and open the template in the editor.
|
* and open the template in the editor.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package router;
|
package net.i2p.desktopgui.router;
|
||||||
|
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
@ -1,4 +1,4 @@
|
|||||||
package router;
|
package net.i2p.desktopgui.router;
|
||||||
|
|
||||||
import net.i2p.router.RouterContext;
|
import net.i2p.router.RouterContext;
|
||||||
import net.i2p.router.RouterVersion;
|
import net.i2p.router.RouterVersion;
|
@ -1,4 +1,4 @@
|
|||||||
package router.configuration;
|
package net.i2p.desktopgui.router.configuration;
|
||||||
|
|
||||||
import java.awt.event.ActionEvent;
|
import java.awt.event.ActionEvent;
|
||||||
import java.awt.event.ActionListener;
|
import java.awt.event.ActionListener;
|
||||||
@ -11,7 +11,7 @@ import net.i2p.router.CommSystemFacade;
|
|||||||
import net.i2p.router.RouterContext;
|
import net.i2p.router.RouterContext;
|
||||||
import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade;
|
import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade;
|
||||||
import net.i2p.router.transport.ntcp.NTCPAddress;
|
import net.i2p.router.transport.ntcp.NTCPAddress;
|
||||||
import router.RouterHelper;
|
import net.i2p.desktopgui.router.RouterHelper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Part of the code imported and adapted from the I2P Router Console (which is licensed as public domain)
|
* Part of the code imported and adapted from the I2P Router Console (which is licensed as public domain)
|
||||||
@ -49,7 +49,7 @@ public class PeerHelper {
|
|||||||
return "ERROR: The UDP port is already in use. Set i2np.udp.internalPort=xxxx to a different value in the advanced config and restart";
|
return "ERROR: The UDP port is already in use. Set i2np.udp.internalPort=xxxx to a different value in the advanced config and restart";
|
||||||
case CommSystemFacade.STATUS_UNKNOWN: // fallthrough
|
case CommSystemFacade.STATUS_UNKNOWN: // fallthrough
|
||||||
default:
|
default:
|
||||||
ra = context.router().getRouterInfo().getTargetAddress("UDP");
|
ra = context.router().getRouterInfo().getTargetAddress("SSU");
|
||||||
if (ra == null && context.router().getUptime() > 5*60*1000) {
|
if (ra == null && context.router().getUptime() > 5*60*1000) {
|
||||||
if (context.getProperty(PROP_I2NP_NTCP_HOSTNAME) == null ||
|
if (context.getProperty(PROP_I2NP_NTCP_HOSTNAME) == null ||
|
||||||
context.getProperty(PROP_I2NP_NTCP_PORT) == null)
|
context.getProperty(PROP_I2NP_NTCP_PORT) == null)
|
||||||
@ -160,6 +160,6 @@ public class PeerHelper {
|
|||||||
public final static String PROP_I2NP_INTERNAL_UDP_PORT = "i2np.udp.internalPort";
|
public final static String PROP_I2NP_INTERNAL_UDP_PORT = "i2np.udp.internalPort";
|
||||||
public final static String PROP_I2NP_NTCP_HOSTNAME = "i2np.ntcp.hostname";
|
public final static String PROP_I2NP_NTCP_HOSTNAME = "i2np.ntcp.hostname";
|
||||||
public final static String PROP_I2NP_NTCP_PORT = "i2np.ntcp.port";
|
public final static String PROP_I2NP_NTCP_PORT = "i2np.ntcp.port";
|
||||||
public final static String PROP_I2NP_NTCP_AUTO_PORT = "i2np.ntcp.autoip";
|
public final static String PROP_I2NP_NTCP_AUTO_PORT = "i2np.ntcp.autoport";
|
||||||
public final static String PROP_I2NP_NTCP_AUTO_IP = "i2np.ntcp.autoport";
|
public final static String PROP_I2NP_NTCP_AUTO_IP = "i2np.ntcp.autoip";
|
||||||
}
|
}
|
@ -1,8 +1,8 @@
|
|||||||
package router.configuration;
|
package net.i2p.desktopgui.router.configuration;
|
||||||
|
|
||||||
import net.i2p.router.RouterContext;
|
import net.i2p.router.RouterContext;
|
||||||
import net.i2p.router.transport.FIFOBandwidthRefiller;
|
import net.i2p.router.transport.FIFOBandwidthRefiller;
|
||||||
import router.RouterHelper;
|
import net.i2p.desktopgui.router.RouterHelper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
@ -1,4 +1,7 @@
|
|||||||
package router.configuration;
|
package net.i2p.desktopgui.router.configuration;
|
||||||
|
|
||||||
|
import net.i2p.router.transport.FIFOBandwidthRefiller;
|
||||||
|
import net.i2p.desktopgui.router.RouterHelper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@ -29,4 +32,12 @@ public class SpeedHelper {
|
|||||||
public static int calculateSpeed(int gigabytes) {
|
public static int calculateSpeed(int gigabytes) {
|
||||||
return (int) (((long)gigabytes)*1000000/31/24/3600);
|
return (int) (((long)gigabytes)*1000000/31/24/3600);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String getInboundBandwidth() {
|
||||||
|
return RouterHelper.getContext().router().getConfigSetting(FIFOBandwidthRefiller.PROP_INBOUND_BANDWIDTH);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getOutboundBandwidth() {
|
||||||
|
return RouterHelper.getContext().router().getConfigSetting(FIFOBandwidthRefiller.PROP_OUTBOUND_BANDWIDTH);
|
||||||
|
}
|
||||||
}
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* To change this template, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package net.i2p.desktopgui.router.configuration;
|
||||||
|
|
||||||
|
import net.i2p.desktopgui.router.RouterHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author mathias
|
||||||
|
*/
|
||||||
|
public class UpdateHandler {
|
||||||
|
public static void setUpdatePolicy(String policy) {
|
||||||
|
RouterHelper.getContext().router().setConfigSetting(UpdateHelper.PROP_UPDATE_POLICY, policy);
|
||||||
|
RouterHelper.getContext().router().saveConfig();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,65 @@
|
|||||||
|
package net.i2p.desktopgui.router.configuration;
|
||||||
|
|
||||||
|
import net.i2p.desktopgui.router.RouterHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author mathias
|
||||||
|
*/
|
||||||
|
public class UpdateHelper {
|
||||||
|
|
||||||
|
public static final String PROP_NEWS_URL = "router.newsURL";
|
||||||
|
public static final String DEFAULT_NEWS_URL = "http://echelon.i2p/i2p/news.xml";
|
||||||
|
|
||||||
|
public static final String PROP_REFRESH_FREQUENCY = "router.newsRefreshFrequency";
|
||||||
|
public static final String DEFAULT_REFRESH_FREQUENCY = 24*60*60*1000 + "";
|
||||||
|
|
||||||
|
public static final String PROP_UPDATE_POLICY = "router.updatePolicy";
|
||||||
|
public static final String NOTIFY_UPDATE_POLICY = "notify";
|
||||||
|
public static final String DOWNLOAD_UPDATE_POLICY = "download";
|
||||||
|
public static final String INSTALL_UPDATE_POLICY = "install";
|
||||||
|
public static final String DEFAULT_UPDATE_POLICY = DOWNLOAD_UPDATE_POLICY;
|
||||||
|
|
||||||
|
public static final String PROP_SHOULD_PROXY = "router.updateThroughProxy";
|
||||||
|
public static final String DEFAULT_SHOULD_PROXY = Boolean.TRUE.toString();
|
||||||
|
public static final String PROP_PROXY_HOST = "router.updateProxyHost";
|
||||||
|
public static final String DEFAULT_PROXY_HOST = "127.0.0.1";
|
||||||
|
public static final String PROP_PROXY_PORT = "router.updateProxyPort";
|
||||||
|
public static final String DEFAULT_PROXY_PORT = "4444";
|
||||||
|
|
||||||
|
public static final String PROP_UPDATE_URL = "router.updateURL";
|
||||||
|
public static final String DEFAULT_UPDATE_URL =
|
||||||
|
"http://echelon.i2p/i2p/i2pupdate.sud\r\n" +
|
||||||
|
"http://stats.i2p/i2p/i2pupdate.sud\r\n" +
|
||||||
|
"http://www.i2p2.i2p/_static/i2pupdate.sud\r\n" +
|
||||||
|
"http://update.postman.i2p/i2pupdate.sud" ;
|
||||||
|
|
||||||
|
public static final String PROP_TRUSTED_KEYS = "router.trustedUpdateKeys";
|
||||||
|
|
||||||
|
public static String getNewsURL() {
|
||||||
|
String url = RouterHelper.getContext().getProperty(PROP_NEWS_URL);
|
||||||
|
if(url == null) {
|
||||||
|
return DEFAULT_NEWS_URL;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getUpdatePolicy() {
|
||||||
|
String policy = null;
|
||||||
|
try {
|
||||||
|
policy = RouterHelper.getContext().getProperty(PROP_UPDATE_POLICY);
|
||||||
|
}
|
||||||
|
catch(Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
System.out.println("Policy: " + policy);
|
||||||
|
if(policy == null) {
|
||||||
|
return DEFAULT_UPDATE_POLICY;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return policy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package util;
|
package net.i2p.desktopgui.util;
|
||||||
|
|
||||||
import javax.swing.InputVerifier;
|
import javax.swing.InputVerifier;
|
||||||
import javax.swing.JComponent;
|
import javax.swing.JComponent;
|
@ -1 +1,7 @@
|
|||||||
|
# NOTE: This I2P config file must use UTF-8 encoding
|
||||||
|
#
|
||||||
|
# If you have a 'split' directory installation, with configuration
|
||||||
|
# files in ~/.i2p (Linux) or %APPDATA%\I2P (Windows), be sure to
|
||||||
|
# edit the file in the configuration directory, NOT the install directory.
|
||||||
|
#
|
||||||
i2psnark.dir=i2psnark
|
i2psnark.dir=i2psnark
|
||||||
|
@ -24,6 +24,7 @@
|
|||||||
</classpath>
|
</classpath>
|
||||||
</depend>
|
</depend>
|
||||||
</target>
|
</target>
|
||||||
|
<property name="javac.compilerargs" value="" />
|
||||||
<target name="compile" depends="depend">
|
<target name="compile" depends="depend">
|
||||||
<mkdir dir="./build" />
|
<mkdir dir="./build" />
|
||||||
<mkdir dir="./build/obj" />
|
<mkdir dir="./build/obj" />
|
||||||
@ -31,19 +32,28 @@
|
|||||||
srcdir="./src"
|
srcdir="./src"
|
||||||
debug="true" deprecation="on" source="1.5" target="1.5"
|
debug="true" deprecation="on" source="1.5" target="1.5"
|
||||||
destdir="./build/obj"
|
destdir="./build/obj"
|
||||||
classpath="../../../core/java/build/i2p.jar:../../jetty/jettylib/org.mortbay.jetty.jar:../../jetty/jettylib/javax.servlet.jar:../../ministreaming/java/build/mstreaming.jar" />
|
classpath="../../../core/java/build/i2p.jar:../../jetty/jettylib/org.mortbay.jetty.jar:../../jetty/jettylib/javax.servlet.jar:../../ministreaming/java/build/mstreaming.jar" >
|
||||||
|
<compilerarg line="${javac.compilerargs}" />
|
||||||
|
</javac>
|
||||||
</target>
|
</target>
|
||||||
<target name="jar" depends="builddep, compile">
|
<target name="jar" depends="builddep, compile">
|
||||||
<jar destfile="./build/i2psnark.jar" basedir="./build/obj" includes="**/*.class" excludes="**/*Servlet.class">
|
<jar destfile="./build/i2psnark.jar" basedir="./build/obj" includes="**/*.class" excludes="**/I2PSnarkServlet*.class">
|
||||||
<manifest>
|
<manifest>
|
||||||
<attribute name="Main-Class" value="org.klomp.snark.Snark" />
|
<attribute name="Main-Class" value="org.klomp.snark.Snark" />
|
||||||
<attribute name="Class-Path" value="i2p.jar mstreaming.jar streaming.jar" />
|
<attribute name="Class-Path" value="i2p.jar mstreaming.jar streaming.jar" />
|
||||||
</manifest>
|
</manifest>
|
||||||
</jar>
|
</jar>
|
||||||
</target>
|
</target>
|
||||||
|
<!-- Ideally we would include
|
||||||
|
- only include the servlet, everything else is in the jar.
|
||||||
|
- However, the wrapper.config classpath in existing installs
|
||||||
|
- does not include i2psnark.jar.
|
||||||
|
- So we must continue to duplicate everything in the war.
|
||||||
|
<classes dir="./build/obj" includes="**/I2PSnarkServlet*.class" />
|
||||||
|
-->
|
||||||
<target name="war" depends="jar">
|
<target name="war" depends="jar">
|
||||||
<war destfile="../i2psnark.war" webxml="../web.xml">
|
<war destfile="../i2psnark.war" webxml="../web.xml">
|
||||||
<classes dir="./build/obj" includes="**/*" />
|
<classes dir="./build/obj" includes="**/*.class" excludes="**/RunStandalone.class" />
|
||||||
</war>
|
</war>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
@ -53,30 +63,13 @@
|
|||||||
</zip>
|
</zip>
|
||||||
</target>
|
</target>
|
||||||
<target name="standalone_prep" depends="war">
|
<target name="standalone_prep" depends="war">
|
||||||
<javac debug="true" deprecation="on" source="1.5" target="1.5"
|
|
||||||
destdir="./build" srcdir="src/" includes="org/klomp/snark/web/RunStandalone.java" >
|
|
||||||
<classpath>
|
|
||||||
<pathelement location="../../jetty/jettylib/commons-logging.jar" />
|
|
||||||
<pathelement location="../../jetty/jettylib/commons-el.jar" />
|
|
||||||
<pathelement location="../../jetty/jettylib/org.mortbay.jetty.jar" />
|
|
||||||
<pathelement location="../../jetty/jettylib/javax.servlet.jar" />
|
|
||||||
<pathelement location="../../../core/java/build/i2p.jar" />
|
|
||||||
</classpath>
|
|
||||||
</javac>
|
|
||||||
|
|
||||||
<jar destfile="./build/launch-i2psnark.jar" basedir="./build/" includes="org/klomp/snark/web/RunStandalone.class">
|
|
||||||
<manifest>
|
|
||||||
<attribute name="Main-Class" value="org.klomp.snark.web.RunStandalone" />
|
|
||||||
<attribute name="Class-Path" value="lib/i2p.jar lib/mstreaming.jar lib/streaming.jar lib/commons-el.jar lib/commons-logging.jar lib/jasper-compiler.jar lib/jasper-runtime.jar lib/javax.servlet.jar lib/org.mortbay.jetty.jar" />
|
|
||||||
</manifest>
|
|
||||||
</jar>
|
|
||||||
|
|
||||||
<delete dir="./dist" />
|
<delete dir="./dist" />
|
||||||
<mkdir dir="./dist" />
|
<mkdir dir="./dist" />
|
||||||
<copy file="./build/launch-i2psnark.jar" tofile="./dist/launch-i2psnark.jar" />
|
<copy file="../launch-i2psnark" todir="./dist/" />
|
||||||
<mkdir dir="./dist/webapps" />
|
<mkdir dir="./dist/webapps" />
|
||||||
<copy file="../i2psnark.war" tofile="./dist/webapps/i2psnark.war" />
|
<copy file="../i2psnark.war" tofile="./dist/webapps/i2psnark.war" />
|
||||||
<mkdir dir="./dist/lib" />
|
<mkdir dir="./dist/lib" />
|
||||||
|
<copy file="./build/i2psnark.jar" tofile="./dist/lib/i2psnark.jar" />
|
||||||
<copy file="../../../core/java/build/i2p.jar" tofile="./dist/lib/i2p.jar" />
|
<copy file="../../../core/java/build/i2p.jar" tofile="./dist/lib/i2p.jar" />
|
||||||
<copy file="../../jetty/jettylib/commons-el.jar" tofile="./dist/lib/commons-el.jar" />
|
<copy file="../../jetty/jettylib/commons-el.jar" tofile="./dist/lib/commons-el.jar" />
|
||||||
<copy file="../../jetty/jettylib/commons-logging.jar" tofile="./dist/lib/commons-logging.jar" />
|
<copy file="../../jetty/jettylib/commons-logging.jar" tofile="./dist/lib/commons-logging.jar" />
|
||||||
@ -88,7 +81,6 @@
|
|||||||
<copy file="../../streaming/java/build/streaming.jar" tofile="./dist/lib/streaming.jar" />
|
<copy file="../../streaming/java/build/streaming.jar" tofile="./dist/lib/streaming.jar" />
|
||||||
<copy file="../jetty-i2psnark.xml" tofile="./dist/jetty-i2psnark.xml" />
|
<copy file="../jetty-i2psnark.xml" tofile="./dist/jetty-i2psnark.xml" />
|
||||||
<copy file="../readme-standalone.txt" tofile="./dist/readme.txt" />
|
<copy file="../readme-standalone.txt" tofile="./dist/readme.txt" />
|
||||||
<mkdir dir="./dist/work" />
|
|
||||||
<mkdir dir="./dist/logs" />
|
<mkdir dir="./dist/logs" />
|
||||||
|
|
||||||
<zip destfile="i2psnark-standalone.zip">
|
<zip destfile="i2psnark-standalone.zip">
|
||||||
@ -100,6 +92,7 @@
|
|||||||
<delete dir="./build" />
|
<delete dir="./build" />
|
||||||
<delete file="../i2psnark.war" />
|
<delete file="../i2psnark.war" />
|
||||||
<delete file="./i2psnark-standalone.zip" />
|
<delete file="./i2psnark-standalone.zip" />
|
||||||
|
<delete dir="./dist" />
|
||||||
</target>
|
</target>
|
||||||
<target name="cleandep" depends="clean">
|
<target name="cleandep" depends="clean">
|
||||||
<ant dir="../../ministreaming/java/" target="distclean" />
|
<ant dir="../../ministreaming/java/" target="distclean" />
|
||||||
|
@ -7,7 +7,6 @@ package org.klomp.snark;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
import net.i2p.I2PAppContext;
|
|
||||||
import net.i2p.client.I2PSessionException;
|
import net.i2p.client.I2PSessionException;
|
||||||
import net.i2p.client.I2PClient;
|
import net.i2p.client.I2PClient;
|
||||||
import net.i2p.client.I2PSession;
|
import net.i2p.client.I2PSession;
|
||||||
|
@ -137,10 +137,11 @@ public class BitField
|
|||||||
return count >= size;
|
return count >= size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public String toString()
|
public String toString()
|
||||||
{
|
{
|
||||||
// Not very efficient
|
// Not very efficient
|
||||||
StringBuffer sb = new StringBuffer("BitField(");
|
StringBuilder sb = new StringBuilder("BitField(");
|
||||||
sb.append(size).append(")[");
|
sb.append(size).append(")[");
|
||||||
for (int i = 0; i < size; i++)
|
for (int i = 0; i < size; i++)
|
||||||
if (get(i))
|
if (get(i))
|
||||||
|
@ -17,6 +17,7 @@ import net.i2p.I2PException;
|
|||||||
import net.i2p.client.I2PSession;
|
import net.i2p.client.I2PSession;
|
||||||
import net.i2p.client.streaming.I2PServerSocket;
|
import net.i2p.client.streaming.I2PServerSocket;
|
||||||
import net.i2p.client.streaming.I2PSocket;
|
import net.i2p.client.streaming.I2PSocket;
|
||||||
|
import net.i2p.client.streaming.I2PSocketEepGet;
|
||||||
import net.i2p.client.streaming.I2PSocketManager;
|
import net.i2p.client.streaming.I2PSocketManager;
|
||||||
import net.i2p.client.streaming.I2PSocketManagerFactory;
|
import net.i2p.client.streaming.I2PSocketManagerFactory;
|
||||||
import net.i2p.data.DataFormatException;
|
import net.i2p.data.DataFormatException;
|
||||||
@ -46,7 +47,7 @@ public class I2PSnarkUtil {
|
|||||||
private Map _opts;
|
private Map _opts;
|
||||||
private I2PSocketManager _manager;
|
private I2PSocketManager _manager;
|
||||||
private boolean _configured;
|
private boolean _configured;
|
||||||
private Set _shitlist;
|
private final Set _shitlist;
|
||||||
private int _maxUploaders;
|
private int _maxUploaders;
|
||||||
private int _maxUpBW;
|
private int _maxUpBW;
|
||||||
private int _maxConnections;
|
private int _maxConnections;
|
||||||
@ -73,7 +74,7 @@ public class I2PSnarkUtil {
|
|||||||
// This is used for both announce replies and .torrent file downloads,
|
// This is used for both announce replies and .torrent file downloads,
|
||||||
// so it must be available even if not connected to I2CP.
|
// so it must be available even if not connected to I2CP.
|
||||||
// so much for multiple instances
|
// so much for multiple instances
|
||||||
_tmpDir = new File("tmp", "i2psnark");
|
_tmpDir = new File(ctx.getTempDir(), "i2psnark");
|
||||||
FileUtil.rmdir(_tmpDir, false);
|
FileUtil.rmdir(_tmpDir, false);
|
||||||
_tmpDir.mkdirs();
|
_tmpDir.mkdirs();
|
||||||
}
|
}
|
||||||
@ -231,7 +232,13 @@ public class I2PSnarkUtil {
|
|||||||
if (rewrite)
|
if (rewrite)
|
||||||
fetchURL = rewriteAnnounce(url);
|
fetchURL = rewriteAnnounce(url);
|
||||||
//_log.debug("Rewritten url [" + fetchURL + "]");
|
//_log.debug("Rewritten url [" + fetchURL + "]");
|
||||||
EepGet get = new EepGet(_context, _shouldProxy, _proxyHost, _proxyPort, retries, out.getAbsolutePath(), fetchURL);
|
//EepGet get = new EepGet(_context, _shouldProxy, _proxyHost, _proxyPort, retries, out.getAbsolutePath(), fetchURL);
|
||||||
|
// Use our tunnel for announces and .torrent fetches too! Make sure we're connected first...
|
||||||
|
if (!connected()) {
|
||||||
|
if (!connect())
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
EepGet get = new I2PSocketEepGet(_context, _manager, retries, out.getAbsolutePath(), fetchURL);
|
||||||
if (get.fetch()) {
|
if (get.fetch()) {
|
||||||
_log.debug("Fetch successful [" + url + "]: size=" + out.length());
|
_log.debug("Fetch successful [" + url + "]: size=" + out.length());
|
||||||
return out;
|
return out;
|
||||||
@ -327,6 +334,11 @@ public class I2PSnarkUtil {
|
|||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @param ot non-null */
|
||||||
|
public void setOpenTrackerString(String ot) {
|
||||||
|
_opts.put(PROP_OPENTRACKERS, ot);
|
||||||
|
}
|
||||||
|
|
||||||
public String getOpenTrackerString() {
|
public String getOpenTrackerString() {
|
||||||
String rv = (String) _opts.get(PROP_OPENTRACKERS);
|
String rv = (String) _opts.get(PROP_OPENTRACKERS);
|
||||||
if (rv == null)
|
if (rv == null)
|
||||||
|
@ -110,6 +110,7 @@ class Message
|
|||||||
dos.write(data, off, len);
|
dos.write(data, off, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public String toString()
|
public String toString()
|
||||||
{
|
{
|
||||||
switch (type)
|
switch (type)
|
||||||
|
@ -345,6 +345,7 @@ public class MetaInfo
|
|||||||
return length;
|
return length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public String toString()
|
public String toString()
|
||||||
{
|
{
|
||||||
return "MetaInfo[info_hash='" + hexencode(info_hash)
|
return "MetaInfo[info_hash='" + hexencode(info_hash)
|
||||||
@ -362,7 +363,7 @@ public class MetaInfo
|
|||||||
*/
|
*/
|
||||||
private static String hexencode(byte[] bs)
|
private static String hexencode(byte[] bs)
|
||||||
{
|
{
|
||||||
StringBuffer sb = new StringBuffer(bs.length*2);
|
StringBuilder sb = new StringBuilder(bs.length*2);
|
||||||
for (int i = 0; i < bs.length; i++)
|
for (int i = 0; i < bs.length; i++)
|
||||||
{
|
{
|
||||||
int c = bs[i] & 0xFF;
|
int c = bs[i] & 0xFF;
|
||||||
@ -432,7 +433,7 @@ public class MetaInfo
|
|||||||
private byte[] calculateInfoHash()
|
private byte[] calculateInfoHash()
|
||||||
{
|
{
|
||||||
Map info = createInfoMap();
|
Map info = createInfoMap();
|
||||||
StringBuffer buf = new StringBuffer(128);
|
StringBuilder buf = new StringBuilder(128);
|
||||||
buf.append("info: ");
|
buf.append("info: ");
|
||||||
for (Iterator iter = info.entrySet().iterator(); iter.hasNext(); ) {
|
for (Iterator iter = info.entrySet().iterator(); iter.hasNext(); ) {
|
||||||
Map.Entry entry = (Map.Entry)iter.next();
|
Map.Entry entry = (Map.Entry)iter.next();
|
||||||
|
@ -106,6 +106,7 @@ public class Peer implements Comparable
|
|||||||
/**
|
/**
|
||||||
* Returns the String representation of the peerID.
|
* Returns the String representation of the peerID.
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public String toString()
|
public String toString()
|
||||||
{
|
{
|
||||||
if (peerID != null)
|
if (peerID != null)
|
||||||
@ -125,6 +126,7 @@ public class Peer implements Comparable
|
|||||||
/**
|
/**
|
||||||
* The hash code of a Peer is the hash code of the peerID.
|
* The hash code of a Peer is the hash code of the peerID.
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public int hashCode()
|
public int hashCode()
|
||||||
{
|
{
|
||||||
return peerID.hashCode() ^ (2 << _id);
|
return peerID.hashCode() ^ (2 << _id);
|
||||||
@ -134,6 +136,7 @@ public class Peer implements Comparable
|
|||||||
* Two Peers are equal when they have the same PeerID.
|
* Two Peers are equal when they have the same PeerID.
|
||||||
* All other properties are ignored.
|
* All other properties are ignored.
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public boolean equals(Object o)
|
public boolean equals(Object o)
|
||||||
{
|
{
|
||||||
if (o instanceof Peer)
|
if (o instanceof Peer)
|
||||||
|
@ -41,7 +41,7 @@ class PeerConnectionOut implements Runnable
|
|||||||
private boolean quit;
|
private boolean quit;
|
||||||
|
|
||||||
// Contains Messages.
|
// Contains Messages.
|
||||||
private List sendQueue = new ArrayList();
|
private final List sendQueue = new ArrayList();
|
||||||
|
|
||||||
private static long __id = 0;
|
private static long __id = 0;
|
||||||
private long _id;
|
private long _id;
|
||||||
|
@ -12,7 +12,7 @@ import java.util.Set;
|
|||||||
* from it there too)
|
* from it there too)
|
||||||
*/
|
*/
|
||||||
public class PeerCoordinatorSet {
|
public class PeerCoordinatorSet {
|
||||||
private Set _coordinators;
|
private final Set _coordinators;
|
||||||
|
|
||||||
public PeerCoordinatorSet() {
|
public PeerCoordinatorSet() {
|
||||||
_coordinators = new HashSet();
|
_coordinators = new HashSet();
|
||||||
|
@ -107,6 +107,7 @@ public class PeerID implements Comparable
|
|||||||
/**
|
/**
|
||||||
* The hash code of a PeerID is the exclusive or of all id bytes.
|
* The hash code of a PeerID is the exclusive or of all id bytes.
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public int hashCode()
|
public int hashCode()
|
||||||
{
|
{
|
||||||
return hash;
|
return hash;
|
||||||
@ -127,6 +128,7 @@ public class PeerID implements Comparable
|
|||||||
/**
|
/**
|
||||||
* Two PeerIDs are equal when they have the same id, address and port.
|
* Two PeerIDs are equal when they have the same id, address and port.
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public boolean equals(Object o)
|
public boolean equals(Object o)
|
||||||
{
|
{
|
||||||
if (o instanceof PeerID)
|
if (o instanceof PeerID)
|
||||||
@ -171,6 +173,7 @@ public class PeerID implements Comparable
|
|||||||
* and address is the base64 dest (was the base64 hash of the dest) which
|
* and address is the base64 dest (was the base64 hash of the dest) which
|
||||||
* should match what the bytemonsoon tracker reports on its web pages.
|
* should match what the bytemonsoon tracker reports on its web pages.
|
||||||
*/
|
*/
|
||||||
|
@Override
|
||||||
public String toString()
|
public String toString()
|
||||||
{
|
{
|
||||||
int nonZero = 0;
|
int nonZero = 0;
|
||||||
@ -190,7 +193,7 @@ public class PeerID implements Comparable
|
|||||||
{
|
{
|
||||||
boolean leading_zeros = true;
|
boolean leading_zeros = true;
|
||||||
|
|
||||||
StringBuffer sb = new StringBuffer(bs.length*2);
|
StringBuilder sb = new StringBuilder(bs.length*2);
|
||||||
for (int i = 0; i < bs.length; i++)
|
for (int i = 0; i < bs.length; i++)
|
||||||
{
|
{
|
||||||
int c = bs[i] & 0xFF;
|
int c = bs[i] & 0xFF;
|
||||||
|
@ -151,7 +151,7 @@ public interface PeerListener
|
|||||||
*
|
*
|
||||||
* @param state the PeerState for the peer
|
* @param state the PeerState for the peer
|
||||||
*/
|
*/
|
||||||
void savePeerPartial(PeerState state);
|
void savePeerPartial(PeerState state); /* FIXME Exporting non-public type through public API FIXME */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when a peer has connected and there may be a partially
|
* Called when a peer has connected and there may be a partially
|
||||||
@ -161,7 +161,7 @@ public interface PeerListener
|
|||||||
*
|
*
|
||||||
* @return request (contains the partial data and valid length)
|
* @return request (contains the partial data and valid length)
|
||||||
*/
|
*/
|
||||||
Request getPeerPartial(BitField havePieces);
|
Request getPeerPartial(BitField havePieces); /* FIXME Exporting non-public type through public API FIXME */
|
||||||
|
|
||||||
/** Mark a peer's requested pieces unrequested when it is disconnected
|
/** Mark a peer's requested pieces unrequested when it is disconnected
|
||||||
* This prevents premature end game
|
* This prevents premature end game
|
||||||
|
@ -23,6 +23,8 @@ package org.klomp.snark;
|
|||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.TimerTask;
|
import java.util.TimerTask;
|
||||||
|
|
||||||
|
import net.i2p.data.DataHelper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TimerTask that monitors the peers and total up/download speeds.
|
* TimerTask that monitors the peers and total up/download speeds.
|
||||||
* Works together with the main Snark class to report periodical statistics.
|
* Works together with the main Snark class to report periodical statistics.
|
||||||
@ -83,21 +85,12 @@ class PeerMonitorTask extends TimerTask
|
|||||||
|
|
||||||
// Print some statistics
|
// Print some statistics
|
||||||
long downloaded = coordinator.getDownloaded();
|
long downloaded = coordinator.getDownloaded();
|
||||||
String totalDown;
|
String totalDown = DataHelper.formatSize(downloaded) + "B";
|
||||||
if (downloaded >= 10 * 1024 * 1024)
|
|
||||||
totalDown = (downloaded / (1024 * 1024)) + "MB";
|
|
||||||
else
|
|
||||||
totalDown = (downloaded / 1024 )+ "KB";
|
|
||||||
long uploaded = coordinator.getUploaded();
|
long uploaded = coordinator.getUploaded();
|
||||||
String totalUp;
|
String totalUp = DataHelper.formatSize(uploaded) + "B";
|
||||||
if (uploaded >= 10 * 1024 * 1024)
|
|
||||||
totalUp = (uploaded / (1024 * 1024)) + "MB";
|
|
||||||
else
|
|
||||||
totalUp = (uploaded / 1024) + "KB";
|
|
||||||
|
|
||||||
int needP = coordinator.storage.needed();
|
int needP = coordinator.storage.needed();
|
||||||
long needMB
|
long needMB = needP * coordinator.metainfo.getPieceLength(0) / (1024 * 1024);
|
||||||
= needP * coordinator.metainfo.getPieceLength(0) / (1024 * 1024);
|
|
||||||
int totalP = coordinator.metainfo.getPieces();
|
int totalP = coordinator.metainfo.getPieces();
|
||||||
long totalMB = coordinator.metainfo.getTotalLength() / (1024 * 1024);
|
long totalMB = coordinator.metainfo.getTotalLength() / (1024 * 1024);
|
||||||
|
|
||||||
|
@ -60,9 +60,9 @@ class PeerState
|
|||||||
// If we have te resend outstanding requests (true after we got choked).
|
// If we have te resend outstanding requests (true after we got choked).
|
||||||
private boolean resend = false;
|
private boolean resend = false;
|
||||||
|
|
||||||
private final static int MAX_PIPELINE = 3; // this is for outbound requests
|
private final static int MAX_PIPELINE = 5; // this is for outbound requests
|
||||||
private final static int MAX_PIPELINE_BYTES = 128*1024; // this is for inbound requests
|
private final static int MAX_PIPELINE_BYTES = 128*1024; // this is for inbound requests
|
||||||
public final static int PARTSIZE = 32*1024; // Snark was 16K, i2p-bt uses 64KB
|
public final static int PARTSIZE = 16*1024; // outbound request
|
||||||
private final static int MAX_PARTSIZE = 64*1024; // Don't let anybody request more than this
|
private final static int MAX_PARTSIZE = 64*1024; // Don't let anybody request more than this
|
||||||
|
|
||||||
PeerState(Peer peer, PeerListener listener, MetaInfo metainfo,
|
PeerState(Peer peer, PeerListener listener, MetaInfo metainfo,
|
||||||
|
@ -20,13 +20,20 @@ public class Piece implements Comparable {
|
|||||||
return this.peers.size() - ((Piece)o).peers.size();
|
return this.peers.size() - ((Piece)o).peers.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public boolean equals(Object o) {
|
public boolean equals(Object o) {
|
||||||
if (o == null) return false;
|
if (o instanceof Piece) {
|
||||||
try {
|
if (o == null) return false;
|
||||||
return this.id == ((Piece)o).id;
|
return this.id == ((Piece)o).id;
|
||||||
} catch (ClassCastException cce) {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode() {
|
||||||
|
int hash = 5;
|
||||||
|
hash = 31 * hash + this.id;
|
||||||
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getId() { return this.id; }
|
public int getId() { return this.id; }
|
||||||
@ -36,6 +43,7 @@ public class Piece implements Comparable {
|
|||||||
public boolean isRequested() { return this.requested; }
|
public boolean isRequested() { return this.requested; }
|
||||||
public void setRequested(boolean requested) { this.requested = requested; }
|
public void setRequested(boolean requested) { this.requested = requested; }
|
||||||
|
|
||||||
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return String.valueOf(id);
|
return String.valueOf(id);
|
||||||
}
|
}
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user