Compare commits
644 Commits
Author | SHA1 | Date | |
---|---|---|---|
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 | |||
714fe82d2f | |||
1724e5b499 | |||
a5fa6acf5d | |||
59105a9ad6 | |||
abc23e9a49 | |||
72071566e7 | |||
055cd99dde | |||
d2c52e5c94 | |||
c7541f819a | |||
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 | |||
fc9e3ee77d | |||
b542f17194 | |||
ddf5cf80b2 | |||
e6cecab0b6 | |||
c3f9e20247 | |||
d0376f82a5 | |||
834fdfe9b3 | |||
8eedcb039a | |||
fc9c479ed5 | |||
12978ba4fb | |||
548efed8d8 | |||
24b012a843 | |||
d493addf95 | |||
d8e502722e | |||
0835c05e89 | |||
429280e416 | |||
879404f7e0 | |||
56c6f41131 | |||
305fc7314f | |||
384d655b1a | |||
2a2d3c0fb5 | |||
977d6eec88 | |||
0f1f33eaa4 | |||
8f690a8f67 | |||
f9f9aa4498 | |||
18a475eff3 | |||
ed259ac94c | |||
bb7884ca3b | |||
0cfbe9c28b | |||
85e5013dbd | |||
bf50695c93 | |||
0764e19441 | |||
2f1d93756d | |||
91de396821 | |||
f9efabba16 | |||
54255cab4a | |||
c03b519849 | |||
98617723a2 | |||
8c8a2deefc | |||
2c84cddda3 | |||
37667247c3 | |||
f5614c8a41 | |||
9e7dd238a4 | |||
495558a949 | |||
bc831d3c35 | |||
d54695e542 | |||
12625a46c2 | |||
ab84a5ce8e | |||
fcbfd7554f | |||
4d27f18710 | |||
1bc4cb382e | |||
6b825fbe25 | |||
884663d077 | |||
bd489cf439 | |||
a4b5c63702 | |||
b1bedb565f | |||
3dd5950bd1 | |||
2cf5221620 | |||
de6edc6a99 | |||
fe9b891b37 | |||
7804475698 | |||
8de5609817 | |||
bb0531053d | |||
e5b1450e83 | |||
0c7cb9d781 | |||
25d5883a0e | |||
c7d815b5b8 | |||
8c4800309e | |||
1aa7fbbba0 | |||
d2fc397295 | |||
a8e43ab552 | |||
3a12182838 | |||
49c7fc30c0 | |||
f6bc9e8707 | |||
53cb80636a | |||
bc086a78eb | |||
e0dccb5970 | |||
a4d16af95d | |||
0b89171abd | |||
f81a24a0cc | |||
58fc3a501d | |||
7b373743aa | |||
e692e18d44 | |||
0c98d1843a | |||
5414d41de4 | |||
5eda7c30fc | |||
06aeff9a30 | |||
78075cb3aa | |||
312e6071d7 |
@ -1,13 +1,17 @@
|
|||||||
$Id: install-headless.txt,v 1.5 2005/09/29 14:19:23 jrandom Exp $
|
|
||||||
Headless I2P installation instructions
|
Headless I2P installation instructions
|
||||||
|
|
||||||
1) tar xjf i2p.tar.bz2 (you've already done this)
|
1) java -jar i2pinstall.exe -console (you've already done this)
|
||||||
2) cd i2p ; vi install-headless.txt (you're doing this now)
|
|
||||||
3) sh postinstall.sh (this launches the router)
|
|
||||||
4) lynx http://localhost:7657/index.jsp (configure the router)
|
|
||||||
|
|
||||||
If you're having trouble, swing by http://forum.i2p.net/, check the
|
This will run the installer in text mode, including running the postinstall.sh
|
||||||
website at http://www.i2p.net/, or get on irc://irc.freenode.net/#i2p
|
script, which will start the router and launch a browser.
|
||||||
|
|
||||||
|
If you do not have an X server running, the browser launch will 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
|
||||||
|
|
||||||
To run I2P explicitly:
|
To run I2P explicitly:
|
||||||
(*nix): sh i2prouter start
|
(*nix): sh i2prouter start
|
@ -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)
|
65
LICENSE.txt
65
LICENSE.txt
@ -67,23 +67,64 @@ 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
|
||||||
|
|
||||||
|
XMLPull library used by UPnP:
|
||||||
|
See licenses/LICENSE-Apache2.0.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 +162,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 +177,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 +213,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
|
||||||
|
@ -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."
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
BUILD=1sim
|
BUILD=1sim
|
||||||
|
|
||||||
# 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,7 @@ 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 -v -y -s $CWD $PKG
|
||||||
makepkg -l y -c n $CWD/${NAME}-$VERSION-$ARCH-$BUILD.tgz
|
makepkg -l y -c n $CWD/${NAME}-$VERSION-$ARCH-$BUILD.tgz
|
||||||
|
@ -7,7 +7,7 @@ i2cp.tcp.port=7654
|
|||||||
BOB.host=localhost
|
BOB.host=localhost
|
||||||
inbound.lengthVariance=0
|
inbound.lengthVariance=0
|
||||||
i2cp.messageReliability=BestEffort
|
i2cp.messageReliability=BestEffort
|
||||||
BOB.port=45067
|
BOB.port=45678
|
||||||
outbound.length=1
|
outbound.length=1
|
||||||
inbound.length=1
|
inbound.length=1
|
||||||
outbound.lengthVariance=0
|
outbound.lengthVariance=0
|
||||||
|
@ -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}">
|
||||||
|
@ -4,5 +4,5 @@ build.xml.stylesheet.CRC32=958a1d3e
|
|||||||
# 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=209349b6
|
nbproject/build-impl.xml.data.CRC32=209349b6
|
||||||
nbproject/build-impl.xml.script.CRC32=75fac64c
|
nbproject/build-impl.xml.script.CRC32=c51e188e
|
||||||
nbproject/build-impl.xml.stylesheet.CRC32=e55b27f5
|
nbproject/build-impl.xml.stylesheet.CRC32=65b8de21
|
||||||
|
@ -24,43 +24,24 @@ dist.dir=dist
|
|||||||
dist.jar=${dist.dir}/BOB.jar
|
dist.jar=${dist.dir}/BOB.jar
|
||||||
dist.javadoc.dir=${dist.dir}/javadoc
|
dist.javadoc.dir=${dist.dir}/javadoc
|
||||||
excludes=
|
excludes=
|
||||||
file.reference.core.jar=../i2p.i2p/core/dist/core.jar
|
file.reference.build-javadoc=../../i2p.i2p/build/javadoc
|
||||||
file.reference.i2p.jar=../../bob/i2p/i2p.i2p/build/i2p.jar
|
file.reference.i2p.jar=../../core/java/build/i2p.jar
|
||||||
file.reference.i2p.jar-1=../../core/java/build/i2p.jar
|
|
||||||
file.reference.i2p.jar-2=../i2p.i2p/core/java/build/i2p.jar
|
|
||||||
file.reference.i2ptunnel.jar=../i2ptunnel/java/build/i2ptunnel.jar
|
file.reference.i2ptunnel.jar=../i2ptunnel/java/build/i2ptunnel.jar
|
||||||
file.reference.java-src=../i2p.i2p/core/java/src/
|
file.reference.jbigi.jar=../../installer/lib/jbigi/jbigi.jar
|
||||||
file.reference.jbigi.jar=../../bob/i2p/i2p.i2p/build/jbigi.jar
|
file.reference.mstreaming.jar=../ministreaming/java/build/mstreaming.jar
|
||||||
file.reference.mstreaming.jar=../../bob/i2p/i2p.i2p/build/mstreaming.jar
|
file.reference.router.jar=../../router/java/build/router.jar
|
||||||
file.reference.mstreaming.jar-1=../ministreaming/java/build/mstreaming.jar
|
file.reference.streaming.jar=../streaming/java/build/streaming.jar
|
||||||
file.reference.NetBeansProjects-i2p.i2p=../i2p.i2p/
|
|
||||||
file.reference.streaming.jar=../../bob/i2p/i2p.i2p/build/streaming.jar
|
|
||||||
file.reference.streaming.jar-1=../streaming/java/build/streaming.jar
|
|
||||||
file.reference.wrapper-freebsd=../../installer/lib/wrapper/freebsd/
|
|
||||||
file.reference.wrapper-linux=../../installer/lib/wrapper/linux/
|
|
||||||
file.reference.wrapper-linux64=../../installer/lib/wrapper/linux64/
|
|
||||||
file.reference.wrapper-macosx=../../installer/lib/wrapper/macosx/
|
|
||||||
file.reference.wrapper-solaris=../../installer/lib/wrapper/solaris/
|
|
||||||
file.reference.wrapper-win32=../../installer/lib/wrapper/win32/
|
|
||||||
file.reference.wrapper.jar=../../installer/lib/wrapper/linux/wrapper.jar
|
file.reference.wrapper.jar=../../installer/lib/wrapper/linux/wrapper.jar
|
||||||
file.reference.wrapper.jar-1=../../installer/lib/wrapper/freebsd/wrapper.jar
|
|
||||||
file.reference.wrapper.jar-2=../../installer/lib/wrapper/linux64/wrapper.jar
|
|
||||||
file.reference.wrapper.jar-3=../../installer/lib/wrapper/macosx/wrapper.jar
|
|
||||||
file.reference.wrapper.jar-4=../../installer/lib/wrapper/solaris/wrapper.jar
|
|
||||||
file.reference.wrapper.jar-5=../../installer/lib/wrapper/win32/wrapper.jar
|
|
||||||
includes=**
|
includes=**
|
||||||
jar.compress=false
|
jar.compress=false
|
||||||
javac.classpath=\
|
javac.classpath=\
|
||||||
${file.reference.i2p.jar-1}:\
|
${file.reference.router.jar}:\
|
||||||
${file.reference.i2ptunnel.jar}:\
|
${file.reference.i2ptunnel.jar}:\
|
||||||
${file.reference.mstreaming.jar-1}:\
|
${file.reference.mstreaming.jar}:\
|
||||||
${file.reference.streaming.jar-1}:\
|
${file.reference.streaming.jar}:\
|
||||||
${file.reference.wrapper.jar-1}:\
|
|
||||||
${file.reference.wrapper.jar}:\
|
${file.reference.wrapper.jar}:\
|
||||||
${file.reference.wrapper.jar-2}:\
|
${file.reference.i2p.jar}:\
|
||||||
${file.reference.wrapper.jar-3}:\
|
${file.reference.router.jar}
|
||||||
${file.reference.wrapper.jar-4}:\
|
|
||||||
${file.reference.wrapper.jar-5}
|
|
||||||
# Space-separated list of extra javac options
|
# Space-separated list of extra javac options
|
||||||
javac.compilerargs=
|
javac.compilerargs=
|
||||||
javac.deprecation=false
|
javac.deprecation=false
|
||||||
|
@ -23,17 +23,26 @@
|
|||||||
*/
|
*/
|
||||||
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;
|
||||||
|
import net.i2p.util.SimpleScheduler;
|
||||||
|
import net.i2p.util.SimpleTimer2;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <span style="font-size:8px;font-family:courier;color:#EEEEEE;background-color:#000000">
|
* <span style="font-size:8px;font-family:courier;color:#EEEEEE;background-color:#000000">
|
||||||
* ################################################################################<br>
|
* ################################################################################<br>
|
||||||
@ -111,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
|
||||||
@ -146,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
|
||||||
*
|
*
|
||||||
@ -153,86 +174,195 @@ 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.
|
||||||
// Re-reading the config file in each thread is pretty damn stupid.
|
// Re-reading the config file in each thread is pretty damn stupid.
|
||||||
// I2PClient client = I2PClientFactory.createClient();
|
|
||||||
String configLocation = System.getProperty(PROP_CONFIG_LOCATION, "bob.config");
|
String configLocation = System.getProperty(PROP_CONFIG_LOCATION, "bob.config");
|
||||||
|
|
||||||
// This is here just to ensure there is no interference with our threadgroups.
|
// This is here just to ensure there is no interference with our threadgroups.
|
||||||
RetransmissionTimer Y = RetransmissionTimer.getInstance();
|
RetransmissionTimer Y = RetransmissionTimer.getInstance();
|
||||||
|
SimpleScheduler Y1 = SimpleScheduler.getInstance();
|
||||||
|
SimpleTimer2 Y2 = SimpleTimer2.getInstance();
|
||||||
i = Y.hashCode();
|
i = Y.hashCode();
|
||||||
{
|
i = Y1.hashCode();
|
||||||
try {
|
i = Y2.hashCode();
|
||||||
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,9 +25,8 @@ 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.I2PSession;
|
|
||||||
import net.i2p.client.I2PSessionException;
|
|
||||||
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.I2PSocketManager;
|
import net.i2p.client.streaming.I2PSocketManager;
|
||||||
@ -42,24 +41,37 @@ public class I2Plistener implements Runnable {
|
|||||||
|
|
||||||
private NamedDB info, database;
|
private NamedDB info, database;
|
||||||
private Log _log;
|
private Log _log;
|
||||||
private int tgwatch;
|
// private int tgwatch;
|
||||||
public I2PSocketManager socketManager;
|
public I2PSocketManager socketManager;
|
||||||
public I2PServerSocket serverSocket;
|
public I2PServerSocket serverSocket;
|
||||||
|
private AtomicBoolean lives;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
|
* @param SS
|
||||||
* @param S
|
* @param S
|
||||||
* @param info
|
* @param info
|
||||||
* @param database
|
* @param database
|
||||||
* @param _log
|
* @param _log
|
||||||
*/
|
*/
|
||||||
I2Plistener(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 = this.socketManager.getServerSocket();
|
this.serverSocket = SS;
|
||||||
tgwatch = 1;
|
// tgwatch = 1;
|
||||||
|
this.lives = lives;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void rlock() throws Exception {
|
||||||
|
database.getReadLock();
|
||||||
|
info.getReadLock();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void runlock() throws Exception {
|
||||||
|
database.releaseReadLock();
|
||||||
|
info.releaseReadLock();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -69,69 +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;
|
||||||
serverSocket.setSoTimeout(50);
|
|
||||||
database.getReadLock();
|
|
||||||
info.getReadLock();
|
|
||||||
if(info.exists("INPORT")) {
|
|
||||||
tgwatch = 2;
|
|
||||||
}
|
|
||||||
info.releaseReadLock();
|
|
||||||
database.releaseReadLock();
|
|
||||||
boolean spin = true;
|
|
||||||
while(spin) {
|
|
||||||
|
|
||||||
database.getReadLock();
|
|
||||||
info.getReadLock();
|
|
||||||
spin = info.get("RUNNING").equals(Boolean.TRUE);
|
|
||||||
info.releaseReadLock();
|
|
||||||
database.releaseReadLock();
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
|
|
||||||
} catch(I2PException e) {
|
|
||||||
// System.out.println("Exception " + e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// System.out.println("I2Plistener: Close");
|
|
||||||
try {
|
try {
|
||||||
serverSocket.close();
|
die:
|
||||||
} catch(I2PException e) {
|
{
|
||||||
// nop
|
try {
|
||||||
}
|
serverSocket.setSoTimeout(50);
|
||||||
// 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.");
|
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) {
|
||||||
|
// bad shit
|
||||||
|
System.out.println("Exception " + e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
try {
|
||||||
|
serverSocket.close();
|
||||||
|
} catch (I2PException ex) {
|
||||||
|
}
|
||||||
|
// System.out.println("I2Plistener: Close");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,7 @@ package net.i2p.BOB;
|
|||||||
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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -38,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
|
||||||
@ -46,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();
|
||||||
}
|
}
|
||||||
@ -70,75 +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) {
|
||||||
// nop
|
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 {
|
||||||
|
Thread.sleep(10); //sleep for 10 ms
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
break die;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
// 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,11 +28,12 @@ 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.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;
|
||||||
import net.i2p.util.Log;
|
import net.i2p.util.Log;
|
||||||
import org.tanukisoftware.wrapper.WrapperManager;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@ -48,61 +49,103 @@ 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.
|
||||||
*
|
*
|
||||||
* @param info
|
* @param info DB entry for this tunnel
|
||||||
* @param database
|
* @param database master database of tunnels
|
||||||
* @param _log
|
* @param _log
|
||||||
* @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", Boolean.TRUE);
|
|
||||||
this.info.releaseWriteLock();
|
|
||||||
this.database.releaseWriteLock();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void rlock() throws Exception {
|
private void rlock() throws Exception {
|
||||||
@ -130,170 +173,252 @@ public class MUXlisten implements Runnable {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public void run() {
|
public void run() {
|
||||||
|
I2PServerSocket SS = null;
|
||||||
|
Thread t = null;
|
||||||
|
Thread q = null;
|
||||||
try {
|
try {
|
||||||
wlock();
|
|
||||||
try {
|
try {
|
||||||
info.add("RUNNING", Boolean.TRUE);
|
wlock();
|
||||||
info.add("STARTING", Boolean.FALSE);
|
try {
|
||||||
} catch(Exception e) {
|
info.add("RUNNING", new Boolean(true));
|
||||||
wunlock();
|
} catch (Exception e) {
|
||||||
|
lock.set(false);
|
||||||
|
wunlock();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
lock.set(false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} catch(Exception e) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
wunlock();
|
|
||||||
} catch(Exception e) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
quit: {
|
|
||||||
try {
|
try {
|
||||||
tg = new ThreadGroup(N);
|
wunlock();
|
||||||
die: {
|
} catch (Exception e) {
|
||||||
// toss the connections to a new threads.
|
lock.set(false);
|
||||||
// will wrap with TCP and UDP when UDP works
|
return;
|
||||||
|
}
|
||||||
if(go_out) {
|
// socketManager.addDisconnectListener(new DisconnectListener());
|
||||||
// I2P -> TCP
|
lives.set(true);
|
||||||
I2Plistener conn = new I2Plistener(socketManager, info, database, _log);
|
lock.set(false);
|
||||||
Thread t = new Thread(tg, conn, "BOBI2Plistener " + N);
|
quit:
|
||||||
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();
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean spin = true;
|
|
||||||
while(spin) {
|
|
||||||
try {
|
|
||||||
Thread.sleep(200); //sleep for 200 ms (Two thenths second)
|
|
||||||
} catch(InterruptedException e) {
|
|
||||||
// nop
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
rlock();
|
|
||||||
try {
|
|
||||||
spin = info.get("STOPPING").equals(Boolean.FALSE);
|
|
||||||
} catch(Exception e) {
|
|
||||||
runlock();
|
|
||||||
break die;
|
|
||||||
}
|
|
||||||
} catch(Exception e) {
|
|
||||||
break die;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
runlock();
|
|
||||||
} catch(Exception e) {
|
|
||||||
break die;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
wlock();
|
|
||||||
try {
|
|
||||||
info.add("RUNNING", Boolean.FALSE);
|
|
||||||
} catch(Exception e) {
|
|
||||||
wunlock();
|
|
||||||
break die;
|
|
||||||
}
|
|
||||||
} catch(Exception e) {
|
|
||||||
break die;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
wunlock();
|
|
||||||
} catch(Exception e) {
|
|
||||||
break die;
|
|
||||||
}
|
|
||||||
} // die
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Thread.sleep(500); //sleep for 500 ms (One half second)
|
tg = new ThreadGroup(N);
|
||||||
} catch(InterruptedException ex) {
|
{
|
||||||
// nop
|
// toss the connections to a new threads.
|
||||||
|
// will wrap with TCP and UDP when UDP works
|
||||||
|
|
||||||
|
if (go_out) {
|
||||||
|
// I2P -> TCP
|
||||||
|
SS = socketManager.getServerSocket();
|
||||||
|
I2Plistener conn = new I2Plistener(SS, socketManager, info, database, _log, lives);
|
||||||
|
t = new Thread(tg, conn, "BOBI2Plistener " + N);
|
||||||
|
t.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (come_in) {
|
||||||
|
// TCP -> I2P
|
||||||
|
TCPlistener conn = new TCPlistener(listener, socketManager, info, database, _log, lives);
|
||||||
|
q = new Thread(tg, conn, "BOBTCPlistener " + N);
|
||||||
|
q.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
wlock();
|
||||||
|
try {
|
||||||
|
info.add("STARTING", new Boolean(false));
|
||||||
|
} catch (Exception e) {
|
||||||
|
wunlock();
|
||||||
|
break quit;
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
break quit;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
wunlock();
|
||||||
|
} catch (Exception e) {
|
||||||
|
break quit;
|
||||||
|
}
|
||||||
|
boolean spin = true;
|
||||||
|
while (spin && lives.get()) {
|
||||||
|
try {
|
||||||
|
Thread.sleep(1000); //sleep for 1 second
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
break 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
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
// System.out.println("MUXlisten: Caught an exception" + e);
|
||||||
|
break quit;
|
||||||
}
|
}
|
||||||
// wait for child threads and thread groups to die
|
} // quit
|
||||||
// System.out.println("MUXlisten: waiting for children");
|
} finally {
|
||||||
if(tg.activeCount() + tg.activeGroupCount() != 0) {
|
lives.set(false);
|
||||||
tg.interrupt(); // unwedge any blocking threads.
|
// Some grace time.
|
||||||
while(tg.activeCount() + tg.activeGroupCount() != 0) {
|
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) {
|
||||||
|
try {
|
||||||
|
SS.close();
|
||||||
|
} catch (I2PException ex) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (listener != null) {
|
||||||
|
try {
|
||||||
|
listener.close();
|
||||||
|
} 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 {
|
try {
|
||||||
Thread.sleep(100); //sleep for 100 ms (One tenth second)
|
Thread.sleep(100); //sleep for 100 ms (One tenth second)
|
||||||
} catch(InterruptedException ex) {
|
} catch (InterruptedException ex) {
|
||||||
// nop
|
// nop
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// System.out.println("BOB: MUXlisten: Threads went away. Success: " + boner);
|
||||||
|
_log.warn("BOB: MUXlisten: Threads went away. Success: " + boner);
|
||||||
tg.destroy();
|
tg.destroy();
|
||||||
// Zap reference to the ThreadGroup so the JVM can GC it.
|
// Zap reference to the ThreadGroup so the JVM can GC it.
|
||||||
tg = null;
|
tg = null;
|
||||||
} catch(Exception e) {
|
|
||||||
// System.out.println("MUXlisten: Caught an exception" + e);
|
|
||||||
break quit;
|
|
||||||
}
|
}
|
||||||
} // quit
|
|
||||||
// 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, just incase.
|
|
||||||
try {
|
|
||||||
socketManager.destroySocketManager();
|
|
||||||
} catch(Exception e) {
|
|
||||||
// nop
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
wlock();
|
|
||||||
try {
|
try {
|
||||||
info.add("STARTING", Boolean.FALSE);
|
socketManager.destroySocketManager();
|
||||||
info.add("STOPPING", Boolean.FALSE);
|
} catch (Exception e) {
|
||||||
info.add("RUNNING", Boolean.FALSE);
|
// nop
|
||||||
} catch(Exception e) {
|
|
||||||
wunlock();
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
wunlock();
|
|
||||||
} catch(Exception e) {
|
|
||||||
}
|
}
|
||||||
// This is here to catch when something fucks up REALLY bad.
|
}
|
||||||
if(tg != null) {
|
|
||||||
if(tg.activeCount() + tg.activeGroupCount() != 0) {
|
|
||||||
tg.interrupt(); // unwedge any blocking threads.
|
// Debugging... None of this is normally used.
|
||||||
while(tg.activeCount() + tg.activeGroupCount() != 0) {
|
/**
|
||||||
try {
|
* Find the root thread group and print them all.
|
||||||
Thread.sleep(100); //sleep for 100 ms (One tenth second)
|
*
|
||||||
} catch(InterruptedException ex) {
|
*/
|
||||||
// nop
|
private void visitAllThreads() {
|
||||||
}
|
ThreadGroup root = Thread.currentThread().getThreadGroup().getParent();
|
||||||
}
|
while (root.getParent() != null) {
|
||||||
}
|
root = root.getParent();
|
||||||
tg.destroy();
|
|
||||||
// Zap reference to the ThreadGroup so the JVM can GC it.
|
|
||||||
tg = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Lastly try to close things again.
|
// Visit each thread group
|
||||||
if(this.come_in) {
|
visit(root, 0, root.getName());
|
||||||
try {
|
}
|
||||||
listener.close();
|
|
||||||
} catch(IOException e) {
|
/**
|
||||||
}
|
* Recursively visits all thread groups under `group' and dumps them.
|
||||||
}
|
* @param group ThreadGroup to visit
|
||||||
try {
|
* @param level Current level
|
||||||
socketManager.destroySocketManager();
|
*/
|
||||||
} catch(Exception e) {
|
private static void visit(ThreadGroup group, int level, String tn) {
|
||||||
// nop
|
// Get threads in `group'
|
||||||
|
int numThreads = group.activeCount();
|
||||||
|
Thread[] threads = new Thread[numThreads * 2];
|
||||||
|
numThreads = group.enumerate(threads, false);
|
||||||
|
String indent = "------------------------------------".substring(0, level) + "-> ";
|
||||||
|
// Enumerate each thread in `group' and print it.
|
||||||
|
for (int i = 0; i < numThreads; i++) {
|
||||||
|
// Get thread
|
||||||
|
Thread thread = threads[i];
|
||||||
|
System.out.println("BOB: MUXlisten: " + tn + ": " + indent + thread.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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++) {
|
||||||
|
visit(groups[i], level + 1, groups[i].getName());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,8 @@
|
|||||||
package net.i2p.BOB;
|
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.SimpleTimer2;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Start from command line
|
* Start from command line
|
||||||
@ -39,7 +41,13 @@ public class Main {
|
|||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
// THINK THINK THINK THINK THINK THINK
|
// THINK THINK THINK THINK THINK THINK
|
||||||
RetransmissionTimer Y = RetransmissionTimer.getInstance();
|
RetransmissionTimer Y = RetransmissionTimer.getInstance();
|
||||||
|
SimpleScheduler Y1 = SimpleScheduler.getInstance();
|
||||||
|
SimpleTimer2 Y2 = SimpleTimer2.getInstance();
|
||||||
|
|
||||||
BOB.main(args);
|
BOB.main(args);
|
||||||
|
|
||||||
|
Y2.stop();
|
||||||
|
Y1.stop();
|
||||||
Y.stop();
|
Y.stop();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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");
|
||||||
|
@ -23,8 +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.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Shove data from one stream to the other.
|
* Shove data from one stream to the other.
|
||||||
@ -35,21 +37,20 @@ 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
|
||||||
*
|
*
|
||||||
* @param Ain
|
* @param Ain InputStream
|
||||||
* @param Aout
|
* @param Aout OutputStream
|
||||||
* @param info
|
*
|
||||||
* @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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -76,49 +77,51 @@ public class TCPio implements Runnable {
|
|||||||
*
|
*
|
||||||
* --Sponge
|
* --Sponge
|
||||||
*
|
*
|
||||||
|
* Tested with 128 bytes, and there was no performance gain.
|
||||||
|
*
|
||||||
|
* --Sponge
|
||||||
*/
|
*/
|
||||||
|
|
||||||
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");
|
|
||||||
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 {
|
||||||
|
Ain.close();
|
||||||
|
} catch (IOException ex) {
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
Aout.close();
|
||||||
|
} catch (IOException ex) {
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// System.out.println("TCPio: Leaving.");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,8 +27,9 @@ import java.io.IOException;
|
|||||||
import java.net.ServerSocket;
|
import java.net.ServerSocket;
|
||||||
import java.net.Socket;
|
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,23 @@ 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 {
|
||||||
|
database.getReadLock();
|
||||||
|
info.getReadLock();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void runlock() throws Exception {
|
||||||
|
database.releaseReadLock();
|
||||||
|
info.releaseReadLock();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -69,79 +80,38 @@ public class TCPlistener implements Runnable {
|
|||||||
*/
|
*/
|
||||||
public void run() {
|
public void run() {
|
||||||
boolean g = false;
|
boolean g = false;
|
||||||
boolean spin = true;
|
int conn = 0;
|
||||||
database.getReadLock();
|
|
||||||
info.getReadLock();
|
|
||||||
if(info.exists("OUTPORT")) {
|
|
||||||
tgwatch = 2;
|
|
||||||
}
|
|
||||||
try {
|
try {
|
||||||
Socket server = new Socket();
|
die:
|
||||||
listener.setSoTimeout(50); // Half of the expected time from MUXlisten
|
{
|
||||||
info.releaseReadLock();
|
|
||||||
database.releaseReadLock();
|
|
||||||
while(spin) {
|
|
||||||
database.getReadLock();
|
|
||||||
info.getReadLock();
|
|
||||||
spin = info.get("RUNNING").equals(Boolean.TRUE);
|
|
||||||
info.releaseReadLock();
|
|
||||||
database.releaseReadLock();
|
|
||||||
try {
|
try {
|
||||||
server = listener.accept();
|
Socket server = new Socket();
|
||||||
g = true;
|
listener.setSoTimeout(50); // We don't block, we cycle and check.
|
||||||
} catch(SocketTimeoutException ste) {
|
while (lives.get()) {
|
||||||
g = false;
|
try {
|
||||||
}
|
server = listener.accept();
|
||||||
if(g) {
|
g = true;
|
||||||
// toss the connection to a new thread.
|
} catch (SocketTimeoutException ste) {
|
||||||
TCPtoI2P conn_c = new TCPtoI2P(socketManager, server, info, database);
|
g = false;
|
||||||
Thread t = new Thread(conn_c, "BOBTCPtoI2P");
|
}
|
||||||
t.start();
|
if (g) {
|
||||||
g = false;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (IOException ioe) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//System.out.println("TCPlistener: destroySession");
|
} finally {
|
||||||
listener.close();
|
|
||||||
} catch(IOException ioe) {
|
|
||||||
try {
|
try {
|
||||||
listener.close();
|
listener.close();
|
||||||
} catch(IOException e) {
|
} catch (IOException ex) {
|
||||||
}
|
|
||||||
// Fatal failure, cause a stop event
|
|
||||||
database.getReadLock();
|
|
||||||
info.getReadLock();
|
|
||||||
spin = info.get("RUNNING").equals(Boolean.TRUE);
|
|
||||||
info.releaseReadLock();
|
|
||||||
database.releaseReadLock();
|
|
||||||
if(spin) {
|
|
||||||
database.getWriteLock();
|
|
||||||
info.getWriteLock();
|
|
||||||
info.add("STOPPING", new Boolean(true));
|
|
||||||
info.add("RUNNING", new Boolean(false));
|
|
||||||
info.releaseWriteLock();
|
|
||||||
database.releaseWriteLock();
|
|
||||||
}
|
}
|
||||||
|
//System.out.println("TCPlistener: " + Thread.currentThread().getName() + "Done.");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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;
|
||||||
|
|
||||||
@ -48,6 +50,22 @@ public class TCPtoI2P implements Runnable {
|
|||||||
private NamedDB info, database;
|
private NamedDB info, database;
|
||||||
private Socket sock;
|
private Socket sock;
|
||||||
private I2PSocketManager socketManager;
|
private I2PSocketManager socketManager;
|
||||||
|
private AtomicBoolean lives;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* @param i2p
|
||||||
|
* @param socket
|
||||||
|
* param info
|
||||||
|
* param database
|
||||||
|
*/
|
||||||
|
TCPtoI2P(I2PSocketManager i2p, Socket socket, NamedDB info, NamedDB database, AtomicBoolean lives) {
|
||||||
|
this.sock = socket;
|
||||||
|
this.info = info;
|
||||||
|
this.database = database;
|
||||||
|
this.socketManager = i2p;
|
||||||
|
this.lives = lives;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is a more forgiving readline,
|
* This is a more forgiving readline,
|
||||||
@ -55,45 +73,31 @@ public class TCPtoI2P implements Runnable {
|
|||||||
*
|
*
|
||||||
* @param in
|
* @param in
|
||||||
* @return line of text as a String
|
* @return line of text as a String
|
||||||
* @throws Exception
|
* @throws IOException
|
||||||
*/
|
*/
|
||||||
private static String lnRead(InputStream in) throws Exception {
|
private static String lnRead(InputStream in) throws IOException {
|
||||||
String S;
|
String S;
|
||||||
int b;
|
int b;
|
||||||
char c;
|
char c;
|
||||||
|
|
||||||
S = new String();
|
S = new String();
|
||||||
|
|
||||||
while(true) {
|
while (true) {
|
||||||
b = in.read();
|
b = in.read();
|
||||||
if(b == 13) {
|
if (b == 13) {
|
||||||
//skip CR
|
//skip CR
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(b < 20 || b > 126) {
|
if (b < 20 || b > 126) {
|
||||||
// exit on anything not legal
|
// exit on anything not legal
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
c = (char)(b & 0x7f); // We only really give a fuck about ASCII
|
c = (char) (b & 0x7f); // We only really give a fuck about ASCII
|
||||||
S = new String(S + c);
|
S = new String(S + c);
|
||||||
}
|
}
|
||||||
return S;
|
return S;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
* @param i2p
|
|
||||||
* @param socket
|
|
||||||
* @param info
|
|
||||||
* @param database
|
|
||||||
*/
|
|
||||||
TCPtoI2P(I2PSocketManager i2p, Socket socket, NamedDB info, NamedDB database) {
|
|
||||||
this.sock = socket;
|
|
||||||
this.info = info;
|
|
||||||
this.database = database;
|
|
||||||
this.socketManager = i2p;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Print an error message to out
|
* Print an error message to out
|
||||||
*
|
*
|
||||||
@ -103,27 +107,45 @@ 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
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
public void run() {
|
public void run() {
|
||||||
String line, input;
|
String line, input;
|
||||||
|
InputStream Iin = null;
|
||||||
|
OutputStream Iout = null;
|
||||||
|
InputStream in = null;
|
||||||
|
OutputStream out = null;
|
||||||
|
Thread t = null;
|
||||||
|
Thread q = null;
|
||||||
try {
|
try {
|
||||||
|
|
||||||
InputStream in = sock.getInputStream();
|
|
||||||
OutputStream 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();
|
||||||
}
|
}
|
||||||
@ -135,52 +157,82 @@ public class TCPtoI2P implements Runnable {
|
|||||||
I2P = socketManager.connect(dest);
|
I2P = socketManager.connect(dest);
|
||||||
I2P.setReadTimeout(0); // temp bugfix, this *SHOULD* be the default
|
I2P.setReadTimeout(0); // temp bugfix, this *SHOULD* be the default
|
||||||
// make readers/writers
|
// make readers/writers
|
||||||
InputStream Iin = I2P.getInputStream();
|
Iin = I2P.getInputStream();
|
||||||
OutputStream 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(IOException ioe) {
|
|
||||||
}
|
|
||||||
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) {
|
||||||
}
|
}
|
||||||
// System.out.println("TCPtoI2P: Done.");
|
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.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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,15 +127,17 @@ 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();
|
||||||
defaultSettings.put("proxy_host", "localhost");
|
defaultSettings.put("proxy_host", "127.0.0.1");
|
||||||
defaultSettings.put("proxy_port", "4444");
|
defaultSettings.put("proxy_port", "4444");
|
||||||
defaultSettings.put("master_addressbook", "../userhosts.txt");
|
defaultSettings.put("master_addressbook", "../userhosts.txt");
|
||||||
defaultSettings.put("router_addressbook", "../hosts.txt");
|
defaultSettings.put("router_addressbook", "../hosts.txt");
|
||||||
@ -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]);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
15
apps/desktopgui/LICENSE
Normal file
15
apps/desktopgui/LICENSE
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
Desktop GUI: provides a simple GUI for I2P.
|
||||||
|
Copyright (C) 2009 Mathias De Maré
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; only version 2 of the License.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
119
apps/desktopgui/build.xml
Normal file
119
apps/desktopgui/build.xml
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!-- You may freely edit this file. See commented blocks below for -->
|
||||||
|
<!-- some examples of how to customize the build. -->
|
||||||
|
<!-- (If you delete it and reopen the project it will be recreated.) -->
|
||||||
|
<!-- By default, only the Clean and Build commands use this build script. -->
|
||||||
|
<!-- Commands such as Run, Debug, and Test only use this build script if -->
|
||||||
|
<!-- the Compile on Save feature is turned off for the project. -->
|
||||||
|
<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
|
||||||
|
<!-- in the project's Project Properties dialog box.-->
|
||||||
|
<project name="desktopgui" default="default" basedir=".">
|
||||||
|
<description>Builds, tests, and runs the project desktopgui.</description>
|
||||||
|
<import file="nbproject/build-impl.xml"/>
|
||||||
|
<!--
|
||||||
|
|
||||||
|
There exist several targets which are by default empty and which can be
|
||||||
|
used for execution of your tasks. These targets are usually executed
|
||||||
|
before and after some main targets. They are:
|
||||||
|
|
||||||
|
-pre-init: called before initialization of project properties
|
||||||
|
-post-init: called after initialization of project properties
|
||||||
|
-pre-compile: called before javac compilation
|
||||||
|
-post-compile: called after javac compilation
|
||||||
|
-pre-compile-single: called before javac compilation of single file
|
||||||
|
-post-compile-single: called after javac compilation of single file
|
||||||
|
-pre-compile-test: called before javac compilation of JUnit tests
|
||||||
|
-post-compile-test: called after javac compilation of JUnit tests
|
||||||
|
-pre-compile-test-single: called before javac compilation of single JUnit test
|
||||||
|
-post-compile-test-single: called after javac compilation of single JUunit test
|
||||||
|
-pre-jar: called before JAR building
|
||||||
|
-post-jar: called after JAR building
|
||||||
|
-post-clean: called after cleaning build products
|
||||||
|
|
||||||
|
(Targets beginning with '-' are not intended to be called on their own.)
|
||||||
|
|
||||||
|
Example of inserting an obfuscator after compilation could look like this:
|
||||||
|
|
||||||
|
<target name="-post-compile">
|
||||||
|
<obfuscate>
|
||||||
|
<fileset dir="${build.classes.dir}"/>
|
||||||
|
</obfuscate>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
For list of available properties check the imported
|
||||||
|
nbproject/build-impl.xml file.
|
||||||
|
|
||||||
|
|
||||||
|
Another way to customize the build is by overriding existing main targets.
|
||||||
|
The targets of interest are:
|
||||||
|
|
||||||
|
-init-macrodef-javac: defines macro for javac compilation
|
||||||
|
-init-macrodef-junit: defines macro for junit execution
|
||||||
|
-init-macrodef-debug: defines macro for class debugging
|
||||||
|
-init-macrodef-java: defines macro for class execution
|
||||||
|
-do-jar-with-manifest: JAR building (if you are using a manifest)
|
||||||
|
-do-jar-without-manifest: JAR building (if you are not using a manifest)
|
||||||
|
run: execution of project
|
||||||
|
-javadoc-build: Javadoc generation
|
||||||
|
test-report: JUnit report generation
|
||||||
|
|
||||||
|
An example of overriding the target for project execution could look like this:
|
||||||
|
|
||||||
|
<target name="run" depends="BOB-impl.jar">
|
||||||
|
<exec dir="bin" executable="launcher.exe">
|
||||||
|
<arg file="${dist.jar}"/>
|
||||||
|
</exec>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
Notice that the overridden target depends on the jar target and not only on
|
||||||
|
the compile target as the regular run target does. Again, for a list of available
|
||||||
|
properties which you can use, check the target you are overriding in the
|
||||||
|
nbproject/build-impl.xml file.
|
||||||
|
|
||||||
|
-->
|
||||||
|
<property name="build_src" location="src"/>
|
||||||
|
<property name="build_bin" location="bin"/>
|
||||||
|
<property name="build_dist" location="dist"/>
|
||||||
|
<property name="build_lib" location="lib"/>
|
||||||
|
<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">
|
||||||
|
<fileset dir="${build_lib}" includes="**/*.jar"/>
|
||||||
|
<fileset dir="${build_i2pref}" includes="**/*.jar"/>
|
||||||
|
<fileset dir="${build_routerconsole}" includes="**/*.jar"/>
|
||||||
|
<fileset dir="${build_i2ptunnel}" includes="**/*.jar"/>
|
||||||
|
</path>
|
||||||
|
<target name="build_init">
|
||||||
|
<!-- Create the time stamp -->
|
||||||
|
<tstamp/>
|
||||||
|
<mkdir dir="${build_dist}"/>
|
||||||
|
<mkdir dir="${build_bin}"/>
|
||||||
|
</target>
|
||||||
|
<target name="build_compile" depends="build_init"
|
||||||
|
description="compile the source " >
|
||||||
|
<!-- Compile the java code from ${src} into ${bin} -->
|
||||||
|
<javac srcdir="${build_src}" destdir="${build_bin}" classpathref="build_classpath"/>
|
||||||
|
<copy todir="${build_bin}">
|
||||||
|
<fileset dir="${build_src}">
|
||||||
|
<exclude name="**/*.java"/>
|
||||||
|
</fileset>
|
||||||
|
</copy>
|
||||||
|
</target>
|
||||||
|
<target name="build_jar" depends="build_compile"
|
||||||
|
description="generate the distribution" >
|
||||||
|
<!-- Create the distribution directory -->
|
||||||
|
<mkdir dir="${build_dist}/lib"/>
|
||||||
|
|
||||||
|
<!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->
|
||||||
|
<zip destfile="${build_dist}/desktopgui.jar" basedir="${build_bin}" />
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="build_clean"
|
||||||
|
description="clean up" >
|
||||||
|
<!-- Delete the ${build} and ${dist} directory trees -->
|
||||||
|
<delete dir="${build_bin}"/>
|
||||||
|
<delete dir="${build_dist}"/>
|
||||||
|
</target>
|
||||||
|
</project>
|
261
apps/desktopgui/desktopgui/resources/howto/howto.html
Normal file
261
apps/desktopgui/desktopgui/resources/howto/howto.html
Normal file
@ -0,0 +1,261 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Small Guide to I2P</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Small Guide to I2P</h1>
|
||||||
|
|
||||||
|
<h2>So, what's this all about?</h2>
|
||||||
|
|
||||||
|
<p>I2P builds up a new net inside the usual internet, connecting nodes together
|
||||||
|
via encrypted connections.
|
||||||
|
It is a JAVA prgram with its most used part (the encryption of the data) written
|
||||||
|
in handoptimized assembler code.
|
||||||
|
It will use your bandwith, your RAM and your CPU. It will use them all up if you
|
||||||
|
do not limit it.
|
||||||
|
I2P will route unknown traffic through your node, even stuff you dislike.
|
||||||
|
As that data is encrypted, nobody knows whats data went to or drom your node.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
First, ALWAYS use the latest stable release.
|
||||||
|
Development releases are called "mtn version" and are marked with a -, e.g.
|
||||||
|
0.6.5-1. Those are usually useable by all but could do harm to your I2P
|
||||||
|
experience.
|
||||||
|
You can get the latest MTN builds from my eepsite echelon.i2p, but always
|
||||||
|
remember: I built them, you need to trust me not to changed the code!
|
||||||
|
After you get the right "i2pupdate.zip" file, put that file into the I2P
|
||||||
|
directory and hit restart on the router console http://127.0.0.1:7657.
|
||||||
|
Do NOT deflate the zip file!
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
I2P is very dynamic - after startup it tries to get known to other I2P routers
|
||||||
|
and measures their speed - you need to wait some 10-120 minutes until your
|
||||||
|
I2P router knows enough other ones to obtain full power of I2P.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>Filesharing</h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
I2P is able to do anonymous filesharing.
|
||||||
|
But as there are NO gateways between real net and I2P, you can only share/
|
||||||
|
download torrents from within I2P. Look e.g. postman.i2p or planet.i2p.
|
||||||
|
You CANNOT use azureus, utorrent or any other usual client.
|
||||||
|
You cannot download anonymous torrents from mininova, piratebay or else.
|
||||||
|
You need to use I2P internal torrents and I2P aware programs like
|
||||||
|
I2Psnark (builtin, suitable for 1-20 torrents)
|
||||||
|
I2PRufus (external, python, high CPU load, suitable >20 torrents) http://echelon.i2p/i2prufus
|
||||||
|
I2P-BT (external, python)
|
||||||
|
I2PsnarkXL (mod of I2Psnark made by fwd)
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
There are also gnutella and edonkey clients:
|
||||||
|
i2phex for gnutella (http://echelon.i2p/i2phex)
|
||||||
|
imule for edonkey (http://echelon.i2p/imule)
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Remember, as I2P uses other routers to route your traffic via 1-6 other PCs,
|
||||||
|
your transferrates in P2P are slower than in usual internet.
|
||||||
|
But you are anonymous, no one can easily (within 2 months-2 years) get your IP!
|
||||||
|
torrents inside of I2P reaches up to 50 kb/sec, usual are 10-20 kb/sec per torrent
|
||||||
|
i2phex reaches up to 20 kb/sec, usually 5-10 kb/sec
|
||||||
|
imule in times reaches 10 kb/sec, usually 5-10 kb/sec
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
In I2PHex and imule you can just tell "share file or directory", in torrent
|
||||||
|
you need to create a .torrent file and upload that (and ONLY that small .torrent)
|
||||||
|
file to the trackers like tracker.postman.i2p/
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
I2P is a smaller net (1000 users) which grows slowly. As of which amount of shared
|
||||||
|
data will slowly rise.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
I2P is anonymous and it does not censor - there is no administrator.
|
||||||
|
There IS unwanted stuff like kiddyporn, nazism, or else.
|
||||||
|
If you dislike all this, do not use I2P.
|
||||||
|
There is NO way to prohibite this stuff to appear in a anonymous net like I2P.
|
||||||
|
(as that stuff is available shows the anonymity and transfer function of I2P
|
||||||
|
is working well enough)
|
||||||
|
You can delete the destinations in question from your local hosts.txt file (or
|
||||||
|
deface them) which will partly prevent you to reach those bad sies by accident.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>Internet (the websites)</h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Only one outproxy (gateway I2P - webpages in usual Internet) is working.
|
||||||
|
It is NOT official from I2P, I2P does work without.
|
||||||
|
If that outproxy is slow, offline, gone,.. I2P still works on and cannot do
|
||||||
|
anything to change that failure.
|
||||||
|
That outproxy translates usual internet webpages into the I2P net and you can
|
||||||
|
reach them via your Router.
|
||||||
|
The best way for usual webpages is TOR, not that outproxy.
|
||||||
|
Remember: the owner of the outproxy got ALL traffic from all I2P users
|
||||||
|
visiting Internet pages and will risk that into the police!
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
This proxy is false.i2p. In newer I2P routers it is enabled, but not in
|
||||||
|
older ones. Go to http://127.0.0.1:7657/i2ptunnel/index.jsp tunnels page and
|
||||||
|
click on the eepProxy tunnel. Change the entry for the "Outproxies" to false.i2p
|
||||||
|
and save. On the tunnels page, stop the epproxy tunnel and start it again,
|
||||||
|
now your router will use the false.i2p outproxy.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
No other (known) gateways are setup and running. No one we know will run
|
||||||
|
the gateway for torrent or any other P2P data (and risk his life).
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>Bandwidth</h2>
|
||||||
|
|
||||||
|
<p>http://127.0.0.1:7657/config.jsp</p>
|
||||||
|
|
||||||
|
<p>Setup your bandwith wisely. Know your linespeed!</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
E.g. most common terms are:
|
||||||
|
1Mbit = roughly 100 kbyte/sec
|
||||||
|
10 MBit = roughly 1100 kbyte/sec
|
||||||
|
512 kbit = roughly 50 kbyte/sec
|
||||||
|
or in germany:
|
||||||
|
16000er = roughly 1500 kbyte/sec
|
||||||
|
6000er = roughly 600 kbyte/sec
|
||||||
|
1000er = roughly 100 kb/sec
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Set your bandwith limits to 10% under your line speed and burst rate to
|
||||||
|
your line speed.
|
||||||
|
Set the bandwith share percentage to:
|
||||||
|
>80% if lowest bandwith setting is >50k
|
||||||
|
>50% if lowest bandwith setting is >30k
|
||||||
|
>20% if lowest bandwith setting is >16k
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>There is no shared bandwith under 16k.</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Limit your participating tunnels (shared bandwith) on:
|
||||||
|
http://127.0.0.1:7657/configadvanced.jsp
|
||||||
|
with the line:
|
||||||
|
router.maxParticipatingTunnels=500
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
2000 is for roughly 600 kb/sec - very high value with high CPU load
|
||||||
|
1000 is for roughly 300 kb/sec
|
||||||
|
600 is a good value for 150-200kb/sec
|
||||||
|
300 is roughly 90 kb/sec
|
||||||
|
150 roughly 50 kb/sec
|
||||||
|
Remember: even failed tunnel requests will result in a part tunnel on the hops in between!
|
||||||
|
Those said, there are far more part tunnels unused than used in the live net under load, which
|
||||||
|
results in slower bandwith per tunnel in the end.
|
||||||
|
It is wise to first limit the bandwith and afterwards the part tunnels, e.g. set some more part
|
||||||
|
tunnels and let I2P reach the bandwith limit instead of the part tunnels limit!
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>What is shared bandwidth?</h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
I2P transports your date from the client to the server through 1-6 hops
|
||||||
|
(other I2P routers). Each of this hops sees the data from you as "participating
|
||||||
|
tunnel" - which is the shared bandwith of them.
|
||||||
|
With this in mind, I2P needs some amount of this shared bandwith at some
|
||||||
|
amount of routers.
|
||||||
|
Share as much as you are able of - others will thank you!
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
With the "share percentage" set like above, you will obtain enough speed for
|
||||||
|
your own traffic and obtain some participating tunnels (if >16kb/sec) with some
|
||||||
|
noise traffic to hide your traffic in the stream.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
With release 0.6.5 there is some method to prefer your own traffic ahead
|
||||||
|
of shared traffic which will result in better experience to you!
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>Addressbook</h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
I2P uses a local addressbook to link short DNS names with the internal used 512bit
|
||||||
|
hashes (which are destination IDs).
|
||||||
|
Those links are saved insside the hosts.txt and userhosts.txt files in the i2p
|
||||||
|
directory.
|
||||||
|
Hosts which are not in those files cannot be reached via the short DNS names
|
||||||
|
and a error message with "jumper links" will appear. Those links will ask
|
||||||
|
some hosts services and forward to the correct site (if the site is known to them).
|
||||||
|
Those hosts services just made a form to add new "hosts" and those results public
|
||||||
|
available.
|
||||||
|
You can subscribe to those hosts service and let your hosts.txt file be updated
|
||||||
|
automatic. Go to http://127.0.0.1:7657/susidns/subscriptions.jsp SusiDNS
|
||||||
|
and enter the hosts services into the textbox (and save afterwards):
|
||||||
|
http://www.i2p2.i2p/hosts.txt
|
||||||
|
http://stats.i2p/cgi-bin/newhosts.txt
|
||||||
|
http://tino.i2p/hosts.txt
|
||||||
|
http://i2host.i2p/cgi-bin/i2hostag
|
||||||
|
You can add one of them, two or all.
|
||||||
|
SusiDNS will now ask those hosts for new entries to the hosts.txt and those
|
||||||
|
will be added to your hosts.txt. The userhosts.txt will ONLY be updated by
|
||||||
|
yourself (the user) and not be published into the net!
|
||||||
|
Remember, names once set could not be changed! If you loose your key (destination
|
||||||
|
ID) to your eepsite, service,..., there is no way to change the linking
|
||||||
|
between the DNS name and the (lost) destination ID automatic! Only manual by each
|
||||||
|
user itself - great topic to discuss of need to renew DNS hostnames.
|
||||||
|
As this subscription will not update old entries, you can "deface" unwanted
|
||||||
|
eepsites with a false key and if you hit the bad name in browser by accident,
|
||||||
|
you will not see the bad stuff!
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>Out of Memory errors </h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
If your router hits the Out of Memory error - check your logs!
|
||||||
|
Usual point for OOM are to much torrents in i2psnark - i2psnark is a real
|
||||||
|
memory hogg and >10 torrents it requiers hell a lot of memory!
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Maybe it is possible for you to increase the wrapper memory config.
|
||||||
|
This ONLY works if you start the I2P service restartable with console
|
||||||
|
(on Windows).
|
||||||
|
In I2P directory edit the wrapper.config file and change the values:
|
||||||
|
wrapper.java.maxmemory=256 (or even to 512, IF possible)
|
||||||
|
Afterwards shutdown I2P complete (the service) and restart it.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>Blocklists</h2>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Sometimes attackers trying to flood the I2P net and try to do some harm.
|
||||||
|
And some folks setting localnet IPs as their internet reachable address.
|
||||||
|
To prevent those bad router to harm the local router, I2P implemented
|
||||||
|
a local blocklist system. It is NOT integrated automatic as it could
|
||||||
|
really harm your I2P experience if setup the wrong way.
|
||||||
|
The way to enable blocklists is:
|
||||||
|
Get the file http://zzz.i2p/files/blocklist.txt and copy this file into the
|
||||||
|
I2P directory.
|
||||||
|
On http://127.0.0.1:7657/configadvanced.jsp set the option
|
||||||
|
router.blocklist.enable=true - click on Apply and restart the router
|
||||||
|
with the restart link left on router console.
|
||||||
|
The blockfile.txt file follows a special order, you<6F>ll get it if you read it.
|
||||||
|
The first entry is the reason to be shown on http://127.0.0.1:7657/profiles.jsp
|
||||||
|
at the bottom in the shitlist section.
|
||||||
|
The second entry is the IP or the dest ID of a router.
|
||||||
|
Right now there are only private subnets in the blocklist AND one chinese router
|
||||||
|
which floods the floodfill DB while restarting every few minutes with a different
|
||||||
|
router ID and far to less bandwith for being a floodfill router.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p>(By echelon -- echelon.i2p )</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
BIN
apps/desktopgui/desktopgui/resources/logo/logo.jpg
Normal file
BIN
apps/desktopgui/desktopgui/resources/logo/logo.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
BIN
apps/desktopgui/desktopgui/resources/logo/logo_green.jpg
Normal file
BIN
apps/desktopgui/desktopgui/resources/logo/logo_green.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
BIN
apps/desktopgui/desktopgui/resources/logo/logo_orange.jpg
Normal file
BIN
apps/desktopgui/desktopgui/resources/logo/logo_orange.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
BIN
apps/desktopgui/desktopgui/resources/logo/logo_red.jpg
Normal file
BIN
apps/desktopgui/desktopgui/resources/logo/logo_red.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
BIN
apps/desktopgui/lib/appframework.jar
Normal file
BIN
apps/desktopgui/lib/appframework.jar
Normal file
Binary file not shown.
BIN
apps/desktopgui/lib/swing-worker.jar
Normal file
BIN
apps/desktopgui/lib/swing-worker.jar
Normal file
Binary file not shown.
3
apps/desktopgui/manifest.mf
Normal file
3
apps/desktopgui/manifest.mf
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
Manifest-Version: 1.0
|
||||||
|
X-COMMENT: Main-Class will be added automatically by build
|
||||||
|
|
642
apps/desktopgui/nbproject/build-impl.xml
Normal file
642
apps/desktopgui/nbproject/build-impl.xml
Normal file
@ -0,0 +1,642 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
*** GENERATED FROM project.xml - DO NOT EDIT ***
|
||||||
|
*** EDIT ../build.xml INSTEAD ***
|
||||||
|
|
||||||
|
For the purpose of easier reading the script
|
||||||
|
is divided into following sections:
|
||||||
|
|
||||||
|
- initialization
|
||||||
|
- compilation
|
||||||
|
- jar
|
||||||
|
- execution
|
||||||
|
- debugging
|
||||||
|
- javadoc
|
||||||
|
- junit compilation
|
||||||
|
- junit execution
|
||||||
|
- junit debugging
|
||||||
|
- applet
|
||||||
|
- cleanup
|
||||||
|
|
||||||
|
-->
|
||||||
|
<project xmlns:j2seproject1="http://www.netbeans.org/ns/j2se-project/1" xmlns:j2seproject3="http://www.netbeans.org/ns/j2se-project/3" xmlns:jaxrpc="http://www.netbeans.org/ns/j2se-project/jax-rpc" basedir=".." default="default" name="desktopgui-impl">
|
||||||
|
<target depends="test,jar,javadoc" description="Build and test whole project." name="default"/>
|
||||||
|
<!--
|
||||||
|
======================
|
||||||
|
INITIALIZATION SECTION
|
||||||
|
======================
|
||||||
|
-->
|
||||||
|
<target name="-pre-init">
|
||||||
|
<!-- Empty placeholder for easier customization. -->
|
||||||
|
<!-- You can override this target in the ../build.xml file. -->
|
||||||
|
</target>
|
||||||
|
<target depends="-pre-init" name="-init-private">
|
||||||
|
<property file="nbproject/private/config.properties"/>
|
||||||
|
<property file="nbproject/private/configs/${config}.properties"/>
|
||||||
|
<property file="nbproject/private/private.properties"/>
|
||||||
|
</target>
|
||||||
|
<target depends="-pre-init,-init-private" name="-init-user">
|
||||||
|
<property file="${user.properties.file}"/>
|
||||||
|
<!-- The two properties below are usually overridden -->
|
||||||
|
<!-- by the active platform. Just a fallback. -->
|
||||||
|
<property name="default.javac.source" value="1.4"/>
|
||||||
|
<property name="default.javac.target" value="1.4"/>
|
||||||
|
</target>
|
||||||
|
<target depends="-pre-init,-init-private,-init-user" name="-init-project">
|
||||||
|
<property file="nbproject/configs/${config}.properties"/>
|
||||||
|
<property file="nbproject/project.properties"/>
|
||||||
|
</target>
|
||||||
|
<target depends="-pre-init,-init-private,-init-user,-init-project,-init-macrodef-property" name="-do-init">
|
||||||
|
<available file="${manifest.file}" property="manifest.available"/>
|
||||||
|
<condition property="manifest.available+main.class">
|
||||||
|
<and>
|
||||||
|
<isset property="manifest.available"/>
|
||||||
|
<isset property="main.class"/>
|
||||||
|
<not>
|
||||||
|
<equals arg1="${main.class}" arg2="" trim="true"/>
|
||||||
|
</not>
|
||||||
|
</and>
|
||||||
|
</condition>
|
||||||
|
<condition property="manifest.available+main.class+mkdist.available">
|
||||||
|
<and>
|
||||||
|
<istrue value="${manifest.available+main.class}"/>
|
||||||
|
<isset property="libs.CopyLibs.classpath"/>
|
||||||
|
</and>
|
||||||
|
</condition>
|
||||||
|
<condition property="have.tests">
|
||||||
|
<or>
|
||||||
|
<available file="${test.src.dir}"/>
|
||||||
|
</or>
|
||||||
|
</condition>
|
||||||
|
<condition property="have.sources">
|
||||||
|
<or>
|
||||||
|
<available file="${src.dir}"/>
|
||||||
|
</or>
|
||||||
|
</condition>
|
||||||
|
<condition property="netbeans.home+have.tests">
|
||||||
|
<and>
|
||||||
|
<isset property="netbeans.home"/>
|
||||||
|
<isset property="have.tests"/>
|
||||||
|
</and>
|
||||||
|
</condition>
|
||||||
|
<condition property="no.javadoc.preview">
|
||||||
|
<and>
|
||||||
|
<isset property="javadoc.preview"/>
|
||||||
|
<isfalse value="${javadoc.preview}"/>
|
||||||
|
</and>
|
||||||
|
</condition>
|
||||||
|
<property name="run.jvmargs" value=""/>
|
||||||
|
<property name="javac.compilerargs" value=""/>
|
||||||
|
<property name="work.dir" value="${basedir}"/>
|
||||||
|
<condition property="no.deps">
|
||||||
|
<and>
|
||||||
|
<istrue value="${no.dependencies}"/>
|
||||||
|
</and>
|
||||||
|
</condition>
|
||||||
|
<property name="javac.debug" value="true"/>
|
||||||
|
<property name="javadoc.preview" value="true"/>
|
||||||
|
<property name="application.args" value=""/>
|
||||||
|
<property name="source.encoding" value="${file.encoding}"/>
|
||||||
|
<condition property="javadoc.encoding.used" value="${javadoc.encoding}">
|
||||||
|
<and>
|
||||||
|
<isset property="javadoc.encoding"/>
|
||||||
|
<not>
|
||||||
|
<equals arg1="${javadoc.encoding}" arg2=""/>
|
||||||
|
</not>
|
||||||
|
</and>
|
||||||
|
</condition>
|
||||||
|
<property name="javadoc.encoding.used" value="${source.encoding}"/>
|
||||||
|
<property name="includes" value="**"/>
|
||||||
|
<property name="excludes" value=""/>
|
||||||
|
<property name="do.depend" value="false"/>
|
||||||
|
<condition property="do.depend.true">
|
||||||
|
<istrue value="${do.depend}"/>
|
||||||
|
</condition>
|
||||||
|
<condition else="" property="javac.compilerargs.jaxws" value="-Djava.endorsed.dirs='${jaxws.endorsed.dir}'">
|
||||||
|
<and>
|
||||||
|
<isset property="jaxws.endorsed.dir"/>
|
||||||
|
<available file="nbproject/jaxws-build.xml"/>
|
||||||
|
</and>
|
||||||
|
</condition>
|
||||||
|
</target>
|
||||||
|
<target name="-post-init">
|
||||||
|
<!-- Empty placeholder for easier customization. -->
|
||||||
|
<!-- You can override this target in the ../build.xml file. -->
|
||||||
|
</target>
|
||||||
|
<target depends="-pre-init,-init-private,-init-user,-init-project,-do-init" name="-init-check">
|
||||||
|
<fail unless="src.dir">Must set src.dir</fail>
|
||||||
|
<fail unless="test.src.dir">Must set test.src.dir</fail>
|
||||||
|
<fail unless="build.dir">Must set build.dir</fail>
|
||||||
|
<fail unless="dist.dir">Must set dist.dir</fail>
|
||||||
|
<fail unless="build.classes.dir">Must set build.classes.dir</fail>
|
||||||
|
<fail unless="dist.javadoc.dir">Must set dist.javadoc.dir</fail>
|
||||||
|
<fail unless="build.test.classes.dir">Must set build.test.classes.dir</fail>
|
||||||
|
<fail unless="build.test.results.dir">Must set build.test.results.dir</fail>
|
||||||
|
<fail unless="build.classes.excludes">Must set build.classes.excludes</fail>
|
||||||
|
<fail unless="dist.jar">Must set dist.jar</fail>
|
||||||
|
</target>
|
||||||
|
<target name="-init-macrodef-property">
|
||||||
|
<macrodef name="property" uri="http://www.netbeans.org/ns/j2se-project/1">
|
||||||
|
<attribute name="name"/>
|
||||||
|
<attribute name="value"/>
|
||||||
|
<sequential>
|
||||||
|
<property name="@{name}" value="${@{value}}"/>
|
||||||
|
</sequential>
|
||||||
|
</macrodef>
|
||||||
|
</target>
|
||||||
|
<target name="-init-macrodef-javac">
|
||||||
|
<macrodef name="javac" uri="http://www.netbeans.org/ns/j2se-project/3">
|
||||||
|
<attribute default="${src.dir}" name="srcdir"/>
|
||||||
|
<attribute default="${build.classes.dir}" name="destdir"/>
|
||||||
|
<attribute default="${javac.classpath}" name="classpath"/>
|
||||||
|
<attribute default="${includes}" name="includes"/>
|
||||||
|
<attribute default="${excludes}" name="excludes"/>
|
||||||
|
<attribute default="${javac.debug}" name="debug"/>
|
||||||
|
<attribute default="/does/not/exist" name="sourcepath"/>
|
||||||
|
<element name="customize" optional="true"/>
|
||||||
|
<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}">
|
||||||
|
<classpath>
|
||||||
|
<path path="@{classpath}"/>
|
||||||
|
</classpath>
|
||||||
|
<compilerarg line="${javac.compilerargs} ${javac.compilerargs.jaxws}"/>
|
||||||
|
<customize/>
|
||||||
|
</javac>
|
||||||
|
</sequential>
|
||||||
|
</macrodef>
|
||||||
|
<macrodef name="depend" uri="http://www.netbeans.org/ns/j2se-project/3">
|
||||||
|
<attribute default="${src.dir}" name="srcdir"/>
|
||||||
|
<attribute default="${build.classes.dir}" name="destdir"/>
|
||||||
|
<attribute default="${javac.classpath}" name="classpath"/>
|
||||||
|
<sequential>
|
||||||
|
<depend cache="${build.dir}/depcache" destdir="@{destdir}" excludes="${excludes}" includes="${includes}" srcdir="@{srcdir}">
|
||||||
|
<classpath>
|
||||||
|
<path path="@{classpath}"/>
|
||||||
|
</classpath>
|
||||||
|
</depend>
|
||||||
|
</sequential>
|
||||||
|
</macrodef>
|
||||||
|
<macrodef name="force-recompile" uri="http://www.netbeans.org/ns/j2se-project/3">
|
||||||
|
<attribute default="${build.classes.dir}" name="destdir"/>
|
||||||
|
<sequential>
|
||||||
|
<fail unless="javac.includes">Must set javac.includes</fail>
|
||||||
|
<pathconvert pathsep="," property="javac.includes.binary">
|
||||||
|
<path>
|
||||||
|
<filelist dir="@{destdir}" files="${javac.includes}"/>
|
||||||
|
</path>
|
||||||
|
<globmapper from="*.java" to="*.class"/>
|
||||||
|
</pathconvert>
|
||||||
|
<delete>
|
||||||
|
<files includes="${javac.includes.binary}"/>
|
||||||
|
</delete>
|
||||||
|
</sequential>
|
||||||
|
</macrodef>
|
||||||
|
</target>
|
||||||
|
<target name="-init-macrodef-junit">
|
||||||
|
<macrodef name="junit" uri="http://www.netbeans.org/ns/j2se-project/3">
|
||||||
|
<attribute default="${includes}" name="includes"/>
|
||||||
|
<attribute default="${excludes}" name="excludes"/>
|
||||||
|
<attribute default="**" name="testincludes"/>
|
||||||
|
<sequential>
|
||||||
|
<junit dir="${work.dir}" errorproperty="tests.failed" failureproperty="tests.failed" fork="true" showoutput="true">
|
||||||
|
<batchtest todir="${build.test.results.dir}">
|
||||||
|
<fileset dir="${test.src.dir}" excludes="@{excludes},${excludes}" includes="@{includes}">
|
||||||
|
<filename name="@{testincludes}"/>
|
||||||
|
</fileset>
|
||||||
|
</batchtest>
|
||||||
|
<classpath>
|
||||||
|
<path path="${run.test.classpath}"/>
|
||||||
|
</classpath>
|
||||||
|
<syspropertyset>
|
||||||
|
<propertyref prefix="test-sys-prop."/>
|
||||||
|
<mapper from="test-sys-prop.*" to="*" type="glob"/>
|
||||||
|
</syspropertyset>
|
||||||
|
<formatter type="brief" usefile="false"/>
|
||||||
|
<formatter type="xml"/>
|
||||||
|
<jvmarg line="${run.jvmargs}"/>
|
||||||
|
</junit>
|
||||||
|
</sequential>
|
||||||
|
</macrodef>
|
||||||
|
</target>
|
||||||
|
<target depends="-init-debug-args" name="-init-macrodef-nbjpda">
|
||||||
|
<macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
|
||||||
|
<attribute default="${main.class}" name="name"/>
|
||||||
|
<attribute default="${debug.classpath}" name="classpath"/>
|
||||||
|
<attribute default="" name="stopclassname"/>
|
||||||
|
<sequential>
|
||||||
|
<nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="${debug-transport}">
|
||||||
|
<classpath>
|
||||||
|
<path path="@{classpath}"/>
|
||||||
|
</classpath>
|
||||||
|
</nbjpdastart>
|
||||||
|
</sequential>
|
||||||
|
</macrodef>
|
||||||
|
<macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1">
|
||||||
|
<attribute default="${build.classes.dir}" name="dir"/>
|
||||||
|
<sequential>
|
||||||
|
<nbjpdareload>
|
||||||
|
<fileset dir="@{dir}" includes="${fix.classes}">
|
||||||
|
<include name="${fix.includes}*.class"/>
|
||||||
|
</fileset>
|
||||||
|
</nbjpdareload>
|
||||||
|
</sequential>
|
||||||
|
</macrodef>
|
||||||
|
</target>
|
||||||
|
<target name="-init-debug-args">
|
||||||
|
<property name="version-output" value="java version "${ant.java.version}"/>
|
||||||
|
<condition property="have-jdk-older-than-1.4">
|
||||||
|
<or>
|
||||||
|
<contains string="${version-output}" substring="java version "1.0"/>
|
||||||
|
<contains string="${version-output}" substring="java version "1.1"/>
|
||||||
|
<contains string="${version-output}" substring="java version "1.2"/>
|
||||||
|
<contains string="${version-output}" substring="java version "1.3"/>
|
||||||
|
</or>
|
||||||
|
</condition>
|
||||||
|
<condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
|
||||||
|
<istrue value="${have-jdk-older-than-1.4}"/>
|
||||||
|
</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 depends="-init-debug-args" name="-init-macrodef-debug">
|
||||||
|
<macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
|
||||||
|
<attribute default="${main.class}" name="classname"/>
|
||||||
|
<attribute default="${debug.classpath}" name="classpath"/>
|
||||||
|
<element name="customize" optional="true"/>
|
||||||
|
<sequential>
|
||||||
|
<java classname="@{classname}" dir="${work.dir}" fork="true">
|
||||||
|
<jvmarg line="${debug-args-line}"/>
|
||||||
|
<jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
|
||||||
|
<jvmarg line="${run.jvmargs}"/>
|
||||||
|
<classpath>
|
||||||
|
<path path="@{classpath}"/>
|
||||||
|
</classpath>
|
||||||
|
<syspropertyset>
|
||||||
|
<propertyref prefix="run-sys-prop."/>
|
||||||
|
<mapper from="run-sys-prop.*" to="*" type="glob"/>
|
||||||
|
</syspropertyset>
|
||||||
|
<customize/>
|
||||||
|
</java>
|
||||||
|
</sequential>
|
||||||
|
</macrodef>
|
||||||
|
</target>
|
||||||
|
<target name="-init-macrodef-java">
|
||||||
|
<macrodef name="java" uri="http://www.netbeans.org/ns/j2se-project/1">
|
||||||
|
<attribute default="${main.class}" name="classname"/>
|
||||||
|
<element name="customize" optional="true"/>
|
||||||
|
<sequential>
|
||||||
|
<java classname="@{classname}" dir="${work.dir}" fork="true">
|
||||||
|
<jvmarg line="${run.jvmargs}"/>
|
||||||
|
<classpath>
|
||||||
|
<path path="${run.classpath}"/>
|
||||||
|
</classpath>
|
||||||
|
<syspropertyset>
|
||||||
|
<propertyref prefix="run-sys-prop."/>
|
||||||
|
<mapper from="run-sys-prop.*" to="*" type="glob"/>
|
||||||
|
</syspropertyset>
|
||||||
|
<customize/>
|
||||||
|
</java>
|
||||||
|
</sequential>
|
||||||
|
</macrodef>
|
||||||
|
</target>
|
||||||
|
<target name="-init-presetdef-jar">
|
||||||
|
<presetdef name="jar" uri="http://www.netbeans.org/ns/j2se-project/1">
|
||||||
|
<jar compress="${jar.compress}" jarfile="${dist.jar}">
|
||||||
|
<j2seproject1:fileset dir="${build.classes.dir}"/>
|
||||||
|
</jar>
|
||||||
|
</presetdef>
|
||||||
|
</target>
|
||||||
|
<target depends="-pre-init,-init-private,-init-user,-init-project,-do-init,-post-init,-init-check,-init-macrodef-property,-init-macrodef-javac,-init-macrodef-junit,-init-macrodef-nbjpda,-init-macrodef-debug,-init-macrodef-java,-init-presetdef-jar" name="init"/>
|
||||||
|
<!--
|
||||||
|
===================
|
||||||
|
COMPILATION SECTION
|
||||||
|
===================
|
||||||
|
-->
|
||||||
|
<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">
|
||||||
|
<mkdir dir="${build.classes.dir}"/>
|
||||||
|
</target>
|
||||||
|
<target name="-pre-compile">
|
||||||
|
<!-- Empty placeholder for easier customization. -->
|
||||||
|
<!-- You can override this target in the ../build.xml file. -->
|
||||||
|
</target>
|
||||||
|
<target if="do.depend.true" name="-compile-depend">
|
||||||
|
<j2seproject3:depend/>
|
||||||
|
</target>
|
||||||
|
<target depends="init,deps-jar,-pre-pre-compile,-pre-compile,-compile-depend" if="have.sources" name="-do-compile">
|
||||||
|
<j2seproject3:javac/>
|
||||||
|
<copy todir="${build.classes.dir}">
|
||||||
|
<fileset dir="${src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
|
||||||
|
</copy>
|
||||||
|
</target>
|
||||||
|
<target name="-post-compile">
|
||||||
|
<!-- Empty placeholder for easier customization. -->
|
||||||
|
<!-- You can override this target in the ../build.xml file. -->
|
||||||
|
</target>
|
||||||
|
<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">
|
||||||
|
<!-- Empty placeholder for easier customization. -->
|
||||||
|
<!-- You can override this target in the ../build.xml file. -->
|
||||||
|
</target>
|
||||||
|
<target depends="init,deps-jar,-pre-pre-compile" name="-do-compile-single">
|
||||||
|
<fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
|
||||||
|
<j2seproject3:force-recompile/>
|
||||||
|
<j2seproject3:javac excludes="" includes="${javac.includes}" sourcepath="${src.dir}"/>
|
||||||
|
</target>
|
||||||
|
<target name="-post-compile-single">
|
||||||
|
<!-- Empty placeholder for easier customization. -->
|
||||||
|
<!-- You can override this target in the ../build.xml file. -->
|
||||||
|
</target>
|
||||||
|
<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
|
||||||
|
====================
|
||||||
|
-->
|
||||||
|
<target depends="init" name="-pre-pre-jar">
|
||||||
|
<dirname file="${dist.jar}" property="dist.jar.dir"/>
|
||||||
|
<mkdir dir="${dist.jar.dir}"/>
|
||||||
|
</target>
|
||||||
|
<target name="-pre-jar">
|
||||||
|
<!-- Empty placeholder for easier customization. -->
|
||||||
|
<!-- You can override this target in the ../build.xml file. -->
|
||||||
|
</target>
|
||||||
|
<target depends="init,compile,-pre-pre-jar,-pre-jar" name="-do-jar-without-manifest" unless="manifest.available">
|
||||||
|
<j2seproject1:jar/>
|
||||||
|
</target>
|
||||||
|
<target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available" name="-do-jar-with-manifest" unless="manifest.available+main.class">
|
||||||
|
<j2seproject1:jar manifest="${manifest.file}"/>
|
||||||
|
</target>
|
||||||
|
<target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+main.class" name="-do-jar-with-mainclass" unless="manifest.available+main.class+mkdist.available">
|
||||||
|
<j2seproject1:jar manifest="${manifest.file}">
|
||||||
|
<j2seproject1:manifest>
|
||||||
|
<j2seproject1:attribute name="Main-Class" value="${main.class}"/>
|
||||||
|
</j2seproject1:manifest>
|
||||||
|
</j2seproject1:jar>
|
||||||
|
<echo>To run this application from the command line without Ant, try:</echo>
|
||||||
|
<property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
|
||||||
|
<property location="${dist.jar}" name="dist.jar.resolved"/>
|
||||||
|
<pathconvert property="run.classpath.with.dist.jar">
|
||||||
|
<path path="${run.classpath}"/>
|
||||||
|
<map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
|
||||||
|
</pathconvert>
|
||||||
|
<echo>java -cp "${run.classpath.with.dist.jar}" ${main.class}</echo>
|
||||||
|
</target>
|
||||||
|
<target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+main.class+mkdist.available" name="-do-jar-with-libraries">
|
||||||
|
<property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
|
||||||
|
<pathconvert property="run.classpath.without.build.classes.dir">
|
||||||
|
<path path="${run.classpath}"/>
|
||||||
|
<map from="${build.classes.dir.resolved}" to=""/>
|
||||||
|
</pathconvert>
|
||||||
|
<pathconvert pathsep=" " property="jar.classpath">
|
||||||
|
<path path="${run.classpath.without.build.classes.dir}"/>
|
||||||
|
<chainedmapper>
|
||||||
|
<flattenmapper/>
|
||||||
|
<globmapper from="*" to="lib/*"/>
|
||||||
|
</chainedmapper>
|
||||||
|
</pathconvert>
|
||||||
|
<taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
|
||||||
|
<copylibs compress="${jar.compress}" jarfile="${dist.jar}" manifest="${manifest.file}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
|
||||||
|
<fileset dir="${build.classes.dir}"/>
|
||||||
|
<manifest>
|
||||||
|
<attribute name="Main-Class" value="${main.class}"/>
|
||||||
|
<attribute name="Class-Path" value="${jar.classpath}"/>
|
||||||
|
</manifest>
|
||||||
|
</copylibs>
|
||||||
|
<echo>To run this application from the command line without Ant, try:</echo>
|
||||||
|
<property location="${dist.jar}" name="dist.jar.resolved"/>
|
||||||
|
<echo>java -jar "${dist.jar.resolved}"</echo>
|
||||||
|
</target>
|
||||||
|
<target name="-post-jar">
|
||||||
|
<!-- Empty placeholder for easier customization. -->
|
||||||
|
<!-- You can override this target in the ../build.xml file. -->
|
||||||
|
</target>
|
||||||
|
<target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries,-post-jar" description="Build JAR." name="jar"/>
|
||||||
|
<!--
|
||||||
|
=================
|
||||||
|
EXECUTION SECTION
|
||||||
|
=================
|
||||||
|
-->
|
||||||
|
<target depends="init,compile" description="Run a main class." name="run">
|
||||||
|
<j2seproject1:java>
|
||||||
|
<customize>
|
||||||
|
<arg line="${application.args}"/>
|
||||||
|
</customize>
|
||||||
|
</j2seproject1:java>
|
||||||
|
</target>
|
||||||
|
<target name="-do-not-recompile">
|
||||||
|
<property name="javac.includes.binary" value=""/>
|
||||||
|
</target>
|
||||||
|
<target depends="init,-do-not-recompile,compile-single" name="run-single">
|
||||||
|
<fail unless="run.class">Must select one file in the IDE or set run.class</fail>
|
||||||
|
<j2seproject1:java classname="${run.class}"/>
|
||||||
|
</target>
|
||||||
|
<!--
|
||||||
|
=================
|
||||||
|
DEBUGGING SECTION
|
||||||
|
=================
|
||||||
|
-->
|
||||||
|
<target depends="init" if="netbeans.home" name="-debug-start-debugger">
|
||||||
|
<j2seproject1:nbjpdastart name="${debug.class}"/>
|
||||||
|
</target>
|
||||||
|
<target depends="init,compile" name="-debug-start-debuggee">
|
||||||
|
<j2seproject3:debug>
|
||||||
|
<customize>
|
||||||
|
<arg line="${application.args}"/>
|
||||||
|
</customize>
|
||||||
|
</j2seproject3:debug>
|
||||||
|
</target>
|
||||||
|
<target depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE." if="netbeans.home" name="debug"/>
|
||||||
|
<target depends="init" if="netbeans.home" name="-debug-start-debugger-stepinto">
|
||||||
|
<j2seproject1:nbjpdastart stopclassname="${main.class}"/>
|
||||||
|
</target>
|
||||||
|
<target depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee" if="netbeans.home" name="debug-stepinto"/>
|
||||||
|
<target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-single">
|
||||||
|
<fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
|
||||||
|
<j2seproject3:debug classname="${debug.class}"/>
|
||||||
|
</target>
|
||||||
|
<target depends="init,-do-not-recompile,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/>
|
||||||
|
<target depends="init" name="-pre-debug-fix">
|
||||||
|
<fail unless="fix.includes">Must set fix.includes</fail>
|
||||||
|
<property name="javac.includes" value="${fix.includes}.java"/>
|
||||||
|
</target>
|
||||||
|
<target depends="init,-pre-debug-fix,compile-single" if="netbeans.home" name="-do-debug-fix">
|
||||||
|
<j2seproject1:nbjpdareload/>
|
||||||
|
</target>
|
||||||
|
<target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/>
|
||||||
|
<!--
|
||||||
|
===============
|
||||||
|
JAVADOC SECTION
|
||||||
|
===============
|
||||||
|
-->
|
||||||
|
<target depends="init" name="-javadoc-build">
|
||||||
|
<mkdir dir="${dist.javadoc.dir}"/>
|
||||||
|
<javadoc additionalparam="${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}">
|
||||||
|
<classpath>
|
||||||
|
<path path="${javac.classpath}"/>
|
||||||
|
</classpath>
|
||||||
|
<fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
|
||||||
|
<filename name="**/*.java"/>
|
||||||
|
</fileset>
|
||||||
|
</javadoc>
|
||||||
|
</target>
|
||||||
|
<target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview">
|
||||||
|
<nbbrowse file="${dist.javadoc.dir}/index.html"/>
|
||||||
|
</target>
|
||||||
|
<target depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc." name="javadoc"/>
|
||||||
|
<!--
|
||||||
|
=========================
|
||||||
|
JUNIT COMPILATION SECTION
|
||||||
|
=========================
|
||||||
|
-->
|
||||||
|
<target depends="init,compile" if="have.tests" name="-pre-pre-compile-test">
|
||||||
|
<mkdir dir="${build.test.classes.dir}"/>
|
||||||
|
</target>
|
||||||
|
<target name="-pre-compile-test">
|
||||||
|
<!-- Empty placeholder for easier customization. -->
|
||||||
|
<!-- You can override this target in the ../build.xml file. -->
|
||||||
|
</target>
|
||||||
|
<target if="do.depend.true" name="-compile-test-depend">
|
||||||
|
<j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
|
||||||
|
</target>
|
||||||
|
<target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test">
|
||||||
|
<j2seproject3:javac classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
|
||||||
|
<copy todir="${build.test.classes.dir}">
|
||||||
|
<fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
|
||||||
|
</copy>
|
||||||
|
</target>
|
||||||
|
<target name="-post-compile-test">
|
||||||
|
<!-- Empty placeholder for easier customization. -->
|
||||||
|
<!-- You can override this target in the ../build.xml file. -->
|
||||||
|
</target>
|
||||||
|
<target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test" name="compile-test"/>
|
||||||
|
<target name="-pre-compile-test-single">
|
||||||
|
<!-- Empty placeholder for easier customization. -->
|
||||||
|
<!-- You can override this target in the ../build.xml file. -->
|
||||||
|
</target>
|
||||||
|
<target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
|
||||||
|
<fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
|
||||||
|
<j2seproject3:force-recompile destdir="${build.test.classes.dir}"/>
|
||||||
|
<j2seproject3:javac classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" sourcepath="${test.src.dir}" srcdir="${test.src.dir}"/>
|
||||||
|
<copy todir="${build.test.classes.dir}">
|
||||||
|
<fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
|
||||||
|
</copy>
|
||||||
|
</target>
|
||||||
|
<target name="-post-compile-test-single">
|
||||||
|
<!-- Empty placeholder for easier customization. -->
|
||||||
|
<!-- You can override this target in the ../build.xml file. -->
|
||||||
|
</target>
|
||||||
|
<target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/>
|
||||||
|
<!--
|
||||||
|
=======================
|
||||||
|
JUNIT EXECUTION SECTION
|
||||||
|
=======================
|
||||||
|
-->
|
||||||
|
<target depends="init" if="have.tests" name="-pre-test-run">
|
||||||
|
<mkdir dir="${build.test.results.dir}"/>
|
||||||
|
</target>
|
||||||
|
<target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run">
|
||||||
|
<j2seproject3:junit testincludes="**/*Test.java"/>
|
||||||
|
</target>
|
||||||
|
<target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
|
||||||
|
<fail if="tests.failed">Some tests failed; see details above.</fail>
|
||||||
|
</target>
|
||||||
|
<target depends="init" if="have.tests" name="test-report"/>
|
||||||
|
<target depends="init" if="netbeans.home+have.tests" name="-test-browse"/>
|
||||||
|
<target depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests." name="test"/>
|
||||||
|
<target depends="init" if="have.tests" name="-pre-test-run-single">
|
||||||
|
<mkdir dir="${build.test.results.dir}"/>
|
||||||
|
</target>
|
||||||
|
<target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
|
||||||
|
<fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
|
||||||
|
<j2seproject3:junit excludes="" includes="${test.includes}"/>
|
||||||
|
</target>
|
||||||
|
<target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
|
||||||
|
<fail if="tests.failed">Some tests failed; see details above.</fail>
|
||||||
|
</target>
|
||||||
|
<target depends="init,-do-not-recompile,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
|
||||||
|
<!--
|
||||||
|
=======================
|
||||||
|
JUNIT DEBUGGING SECTION
|
||||||
|
=======================
|
||||||
|
-->
|
||||||
|
<target depends="init,compile-test" if="have.tests" name="-debug-start-debuggee-test">
|
||||||
|
<fail unless="test.class">Must select one file in the IDE or set test.class</fail>
|
||||||
|
<property location="${build.test.results.dir}/TEST-${test.class}.xml" name="test.report.file"/>
|
||||||
|
<delete file="${test.report.file}"/>
|
||||||
|
<mkdir dir="${build.test.results.dir}"/>
|
||||||
|
<j2seproject3:debug classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner" classpath="${ant.home}/lib/ant.jar:${ant.home}/lib/ant-junit.jar:${debug.test.classpath}">
|
||||||
|
<customize>
|
||||||
|
<syspropertyset>
|
||||||
|
<propertyref prefix="test-sys-prop."/>
|
||||||
|
<mapper from="test-sys-prop.*" to="*" type="glob"/>
|
||||||
|
</syspropertyset>
|
||||||
|
<arg value="${test.class}"/>
|
||||||
|
<arg value="showoutput=true"/>
|
||||||
|
<arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.BriefJUnitResultFormatter"/>
|
||||||
|
<arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter,${test.report.file}"/>
|
||||||
|
</customize>
|
||||||
|
</j2seproject3:debug>
|
||||||
|
</target>
|
||||||
|
<target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test">
|
||||||
|
<j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/>
|
||||||
|
</target>
|
||||||
|
<target depends="init,-do-not-recompile,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
|
||||||
|
<target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test">
|
||||||
|
<j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
|
||||||
|
</target>
|
||||||
|
<target depends="init,-pre-debug-fix,-do-debug-fix-test" if="netbeans.home" name="debug-fix-test"/>
|
||||||
|
<!--
|
||||||
|
=========================
|
||||||
|
APPLET EXECUTION SECTION
|
||||||
|
=========================
|
||||||
|
-->
|
||||||
|
<target depends="init,compile-single" name="run-applet">
|
||||||
|
<fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
|
||||||
|
<j2seproject1:java classname="sun.applet.AppletViewer">
|
||||||
|
<customize>
|
||||||
|
<arg value="${applet.url}"/>
|
||||||
|
</customize>
|
||||||
|
</j2seproject1:java>
|
||||||
|
</target>
|
||||||
|
<!--
|
||||||
|
=========================
|
||||||
|
APPLET DEBUGGING SECTION
|
||||||
|
=========================
|
||||||
|
-->
|
||||||
|
<target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-applet">
|
||||||
|
<fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
|
||||||
|
<j2seproject3:debug classname="sun.applet.AppletViewer">
|
||||||
|
<customize>
|
||||||
|
<arg value="${applet.url}"/>
|
||||||
|
</customize>
|
||||||
|
</j2seproject3:debug>
|
||||||
|
</target>
|
||||||
|
<target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet" if="netbeans.home" name="debug-applet"/>
|
||||||
|
<!--
|
||||||
|
===============
|
||||||
|
CLEANUP SECTION
|
||||||
|
===============
|
||||||
|
-->
|
||||||
|
<target depends="init" name="deps-clean" unless="no.deps"/>
|
||||||
|
<target depends="init" name="-do-clean">
|
||||||
|
<delete dir="${build.dir}"/>
|
||||||
|
<delete dir="${dist.dir}"/>
|
||||||
|
</target>
|
||||||
|
<target name="-post-clean">
|
||||||
|
<!-- Empty placeholder for easier customization. -->
|
||||||
|
<!-- You can override this target in the ../build.xml file. -->
|
||||||
|
</target>
|
||||||
|
<target depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products." name="clean"/>
|
||||||
|
</project>
|
8
apps/desktopgui/nbproject/genfiles.properties
Normal file
8
apps/desktopgui/nbproject/genfiles.properties
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
build.xml.data.CRC32=c4b345cd
|
||||||
|
build.xml.script.CRC32=9785bb9a
|
||||||
|
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.
|
||||||
|
# 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=f630f8db
|
||||||
|
nbproject/build-impl.xml.script.CRC32=8c02c081
|
||||||
|
nbproject/build-impl.xml.stylesheet.CRC32=65b8de21
|
81
apps/desktopgui/nbproject/project.properties
Normal file
81
apps/desktopgui/nbproject/project.properties
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
application.desc=An anonymous communication network.
|
||||||
|
application.homepage=http://www.i2p2.de
|
||||||
|
application.title=I2P Desktop GUI
|
||||||
|
application.vendor=I2P Developers
|
||||||
|
build.classes.dir=${build.dir}/classes
|
||||||
|
build.classes.excludes=**/*.java,**/*.form
|
||||||
|
# This directory is removed when the project is cleaned:
|
||||||
|
build.dir=build
|
||||||
|
build.generated.dir=${build.dir}/generated
|
||||||
|
# Only compile against the classpath explicitly listed here:
|
||||||
|
build.sysclasspath=ignore
|
||||||
|
build.test.classes.dir=${build.dir}/test/classes
|
||||||
|
build.test.results.dir=${build.dir}/test/results
|
||||||
|
debug.classpath=\
|
||||||
|
${run.classpath}
|
||||||
|
debug.test.classpath=\
|
||||||
|
${run.test.classpath}
|
||||||
|
# This directory is removed when the project is cleaned:
|
||||||
|
dist.dir=dist
|
||||||
|
dist.jar=${dist.dir}/desktopgui.jar
|
||||||
|
dist.javadoc.dir=${dist.dir}/javadoc
|
||||||
|
excludes=
|
||||||
|
file.reference.appframework.jar=lib/appframework.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.routerconsole.jar=../routerconsole/java/build/routerconsole.jar
|
||||||
|
file.reference.swing-worker.jar=lib/swing-worker.jar
|
||||||
|
includes=**
|
||||||
|
jar.compress=false
|
||||||
|
javac.classpath=\
|
||||||
|
${file.reference.router.jar}:\
|
||||||
|
${file.reference.appframework.jar}:\
|
||||||
|
${file.reference.swing-worker.jar}:\
|
||||||
|
${file.reference.i2p.jar}:\
|
||||||
|
${file.reference.routerconsole.jar}:\
|
||||||
|
${file.reference.i2ptunnel.jar}
|
||||||
|
# Space-separated list of extra javac options
|
||||||
|
javac.compilerargs=
|
||||||
|
javac.deprecation=false
|
||||||
|
javac.source=1.6
|
||||||
|
javac.target=1.6
|
||||||
|
javac.test.classpath=\
|
||||||
|
${javac.classpath}:\
|
||||||
|
${build.classes.dir}:\
|
||||||
|
${libs.junit.classpath}:\
|
||||||
|
${libs.junit_4.classpath}
|
||||||
|
javadoc.additionalparam=
|
||||||
|
javadoc.author=false
|
||||||
|
javadoc.encoding=${source.encoding}
|
||||||
|
javadoc.encoding.used=${javadoc.encoding}
|
||||||
|
javadoc.noindex=false
|
||||||
|
javadoc.nonavbar=false
|
||||||
|
javadoc.notree=false
|
||||||
|
javadoc.private=false
|
||||||
|
javadoc.splitindex=true
|
||||||
|
javadoc.use=true
|
||||||
|
javadoc.version=false
|
||||||
|
javadoc.windowtitle=
|
||||||
|
jnlp.codebase.type=local
|
||||||
|
jnlp.codebase.url=file:/home/mathias/Documenten/Programmeren/i2p_monotone/repo/i2p.i2p/apps/desktopgui/dist/
|
||||||
|
jnlp.enabled=false
|
||||||
|
jnlp.offline-allowed=false
|
||||||
|
jnlp.signed=false
|
||||||
|
main.class=net.i2p.desktopgui.desktopgui.Main
|
||||||
|
manifest.file=manifest.mf
|
||||||
|
meta.inf.dir=${src.dir}/META-INF
|
||||||
|
platform.active=default_platform
|
||||||
|
run.classpath=\
|
||||||
|
${javac.classpath}:\
|
||||||
|
${build.classes.dir}
|
||||||
|
# Space-separated list of JVM arguments used when running the project
|
||||||
|
# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
|
||||||
|
# or test-sys-prop.name=value to set system properties for unit tests):
|
||||||
|
run.jvmargs=
|
||||||
|
run.test.classpath=\
|
||||||
|
${javac.test.classpath}:\
|
||||||
|
${build.test.classes.dir}
|
||||||
|
source.encoding=UTF-8
|
||||||
|
src.dir=src
|
||||||
|
test.src.dir=test
|
19
apps/desktopgui/nbproject/project.xml
Normal file
19
apps/desktopgui/nbproject/project.xml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://www.netbeans.org/ns/project/1">
|
||||||
|
<type>org.netbeans.modules.java.j2seproject</type>
|
||||||
|
<configuration>
|
||||||
|
<data xmlns="http://www.netbeans.org/ns/j2se-project/3">
|
||||||
|
<name>desktopgui</name>
|
||||||
|
<minimum-ant-version>1.6.5</minimum-ant-version>
|
||||||
|
<source-roots>
|
||||||
|
<root id="src.dir"/>
|
||||||
|
</source-roots>
|
||||||
|
<test-roots>
|
||||||
|
<root id="test.src.dir"/>
|
||||||
|
</test-roots>
|
||||||
|
</data>
|
||||||
|
<swingapp xmlns="http://www.netbeans.org/ns/form-swingapp/1">
|
||||||
|
<application-class name="net.i2p.desktopgui.desktopgui.Main"/>
|
||||||
|
</swingapp>
|
||||||
|
</configuration>
|
||||||
|
</project>
|
@ -0,0 +1 @@
|
|||||||
|
desktopgui.Main
|
@ -0,0 +1,14 @@
|
|||||||
|
/*
|
||||||
|
* To change this template, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package net.i2p.desktopgui.desktopgui;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author mathias
|
||||||
|
*/
|
||||||
|
public class GUIVersion {
|
||||||
|
public static final String VERSION = "0.0.2";
|
||||||
|
}
|
109
apps/desktopgui/src/net/i2p/desktopgui/desktopgui/Main.java
Normal file
109
apps/desktopgui/src/net/i2p/desktopgui/desktopgui/Main.java
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
package net.i2p.desktopgui.desktopgui;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Main.java
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import net.i2p.desktopgui.gui.Tray;
|
||||||
|
import net.i2p.desktopgui.gui.SpeedSelector;
|
||||||
|
import java.awt.SystemTray;
|
||||||
|
import java.util.Properties;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
import javax.swing.UIManager;
|
||||||
|
import javax.swing.UnsupportedLookAndFeelException;
|
||||||
|
import org.jdesktop.application.Application;
|
||||||
|
import org.jdesktop.application.SingleFrameApplication;
|
||||||
|
import net.i2p.desktopgui.persistence.PropertyManager;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The main class of the application.
|
||||||
|
*/
|
||||||
|
public class Main extends SingleFrameApplication {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* At startup create and show the main frame of the application.
|
||||||
|
*/
|
||||||
|
@Override protected void startup() {
|
||||||
|
Properties props = PropertyManager.loadProps();
|
||||||
|
|
||||||
|
//First load: present screen with information (to help choose I2P settings)
|
||||||
|
if(props.getProperty(FIRSTLOAD).equals("true")) {
|
||||||
|
props.setProperty(FIRSTLOAD, "false");
|
||||||
|
PropertyManager.saveProps(props);
|
||||||
|
new SpeedSelector(); //Start speed selector GUI
|
||||||
|
}
|
||||||
|
|
||||||
|
if(SystemTray.isSupported()) {
|
||||||
|
tray = new Tray();
|
||||||
|
}
|
||||||
|
else { //Alternative if SystemTray is not supported on the platform
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is to initialize the specified window by injecting resources.
|
||||||
|
* Windows shown in our application come fully initialized from the GUI
|
||||||
|
* builder, so this additional configuration is not needed.
|
||||||
|
*/
|
||||||
|
@Override protected void configureWindow(java.awt.Window root) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A convenient static getter for the application instance.
|
||||||
|
* @return the instance of Main
|
||||||
|
*/
|
||||||
|
public static Main getApplication() {
|
||||||
|
return Application.getInstance(Main.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main method launching the application.
|
||||||
|
*/
|
||||||
|
public static void main(String[] args) {
|
||||||
|
System.setProperty("java.awt.headless", "false"); //Make sure I2P is running in GUI mode for our application
|
||||||
|
try {
|
||||||
|
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
|
||||||
|
} catch (ClassNotFoundException ex) {
|
||||||
|
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
|
||||||
|
} catch (InstantiationException ex) {
|
||||||
|
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
|
||||||
|
} catch (IllegalAccessException ex) {
|
||||||
|
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
|
||||||
|
} catch (UnsupportedLookAndFeelException ex) {
|
||||||
|
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
Main main = getApplication();
|
||||||
|
main.launchForeverLoop();
|
||||||
|
main.startup();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Avoids the app terminating because no Window is opened anymore.
|
||||||
|
* More info: http://java.sun.com/javase/6/docs/api/java/awt/doc-files/AWTThreadIssues.html#Autoshutdown
|
||||||
|
*/
|
||||||
|
public void launchForeverLoop() {
|
||||||
|
Runnable r = new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
Object o = new Object();
|
||||||
|
synchronized (o) {
|
||||||
|
o.wait();
|
||||||
|
}
|
||||||
|
} catch (InterruptedException ie) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Thread t = new Thread(r);
|
||||||
|
t.setDaemon(false);
|
||||||
|
t.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Tray tray = null;
|
||||||
|
///Indicates if this is the first time the application loads
|
||||||
|
///(is only true at the very start of loading the first time!)
|
||||||
|
private static final String FIRSTLOAD = "firstLoad";
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
# Application global resources
|
||||||
|
|
||||||
|
Application.name = desktopgui
|
||||||
|
Application.title = I2P Desktop GUI
|
||||||
|
Application.version = 0.7.1
|
||||||
|
Application.vendor = I2P Developers
|
||||||
|
Application.homepage = http://www.i2p2.de
|
||||||
|
Application.description = An anonymous communication network.
|
||||||
|
Application.vendorId = I2P
|
||||||
|
Application.id = desktopgui
|
||||||
|
Application.lookAndFeel = system
|
@ -0,0 +1,11 @@
|
|||||||
|
# Application global resources
|
||||||
|
|
||||||
|
Application.name = desktopgui
|
||||||
|
Application.title = I2P Desktop GUI
|
||||||
|
Application.version = 0.7.1
|
||||||
|
Application.vendor = I2P Ontwikkelaars
|
||||||
|
Application.homepage = http://www.i2p2.de
|
||||||
|
Application.description = Een anoniem communicatienetwerk.
|
||||||
|
Application.vendorId = I2P
|
||||||
|
Application.id = desktopgui
|
||||||
|
Application.lookAndFeel = system
|
@ -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";
|
||||||
|
}
|
@ -0,0 +1,645 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
|
||||||
|
<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>
|
||||||
|
<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"/>
|
||||||
|
</AuxValues>
|
||||||
|
|
||||||
|
<Layout>
|
||||||
|
<DimensionLayout dim="0">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Component id="applyPanel" alignment="0" max="32767" attributes="0"/>
|
||||||
|
<Group type="102" attributes="0">
|
||||||
|
<EmptySpace min="12" pref="12" max="12" attributes="0"/>
|
||||||
|
<Component id="settingsPanel" pref="566" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
<DimensionLayout dim="1">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" alignment="1" attributes="0">
|
||||||
|
<Component id="settingsPanel" max="32767" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Component id="applyPanel" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
</Layout>
|
||||||
|
<SubComponents>
|
||||||
|
<Container class="javax.swing.JPanel" name="applyPanel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="name" type="java.lang.String" value="applyPanel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
|
||||||
|
<Layout>
|
||||||
|
<DimensionLayout dim="0">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" alignment="1" attributes="0">
|
||||||
|
<EmptySpace pref="475" max="32767" attributes="0"/>
|
||||||
|
<Component id="ok" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Component id="cancel" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
<DimensionLayout dim="1">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" alignment="0" attributes="0">
|
||||||
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="cancel" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="ok" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace pref="14" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
</Layout>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JToggleButton" 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="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="cancelMouseClicked"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JToggleButton" name="ok">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="ok.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="ok" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="okMouseClicked"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
|
<Container class="javax.swing.JTabbedPane" name="settingsPanel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="name" type="java.lang.String" value="settingsPanel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout"/>
|
||||||
|
<SubComponents>
|
||||||
|
<Container class="javax.swing.JPanel" name="speedPanel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="name" type="java.lang.String" value="speedPanel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
||||||
|
<JTabbedPaneConstraints tabName="Speed">
|
||||||
|
<Property name="tabTitle" type="java.lang.String" resourceKey="speedPanel.TabConstraints.tabTitle"/>
|
||||||
|
</JTabbedPaneConstraints>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
|
||||||
|
<Property name="useNullLayout" type="boolean" value="true"/>
|
||||||
|
</Layout>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JLabel" name="uploadSpeedLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="uploadSpeedLabel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="uploadSpeedLabel" 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="140" height="30"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="downloadSpeedLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="downloadSpeedLabel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="downloadSpeedLabel" 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="60" width="140" height="30"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JTextField" name="uploadspeed">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="uploadspeed.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="uploadspeed" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="speedKeyReleased"/>
|
||||||
|
</Events>
|
||||||
|
<Constraints>
|
||||||
|
<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"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JTextField" name="downloadspeed">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="downloadspeed.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="downloadspeed" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="speedKeyReleased"/>
|
||||||
|
</Events>
|
||||||
|
<Constraints>
|
||||||
|
<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"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JComboBox" name="uploadkbps">
|
||||||
|
<Properties>
|
||||||
|
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
|
||||||
|
<StringArray count="2">
|
||||||
|
<StringItem index="0" value="kbps"/>
|
||||||
|
<StringItem index="1" value="kBps"/>
|
||||||
|
</StringArray>
|
||||||
|
</Property>
|
||||||
|
<Property name="name" type="java.lang.String" value="uploadkbps" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="uploadkbpsActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
<Constraints>
|
||||||
|
<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"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JComboBox" name="downloadkbps">
|
||||||
|
<Properties>
|
||||||
|
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
|
||||||
|
<StringArray count="2">
|
||||||
|
<StringItem index="0" value="kbps"/>
|
||||||
|
<StringItem index="1" value="kBps"/>
|
||||||
|
</StringArray>
|
||||||
|
</Property>
|
||||||
|
<Property name="name" type="java.lang.String" value="downloadkbps" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="downloadkbpsActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
<Constraints>
|
||||||
|
<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"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="uploadUsageLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="uploadUsageLabel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="uploadUsageLabel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="330" y="20" width="-1" height="30"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="downloadUsageLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="downloadUsageLabel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="downloadUsageLabel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="330" y="60" width="-1" height="30"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JTextField" name="uploadgb">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="uploadgb.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="uploadgb" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="monthKeyReleased"/>
|
||||||
|
</Events>
|
||||||
|
<Constraints>
|
||||||
|
<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"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JTextField" name="downloadgb">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="downloadgb.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="downloadgb" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="monthKeyReleased"/>
|
||||||
|
</Events>
|
||||||
|
<Constraints>
|
||||||
|
<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"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="gbUploadLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="gbUploadLabel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="gbUploadLabel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="510" y="20" width="-1" height="30"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="gbDownloadLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="gbDownloadLabel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="gbDownloadLabel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="510" y="60" width="-1" height="30"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="uploadDownloadExplanation">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="uploadDownloadExplanation.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="uploadDownloadExplanation" 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="100" width="520" height="70"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
|
<Container class="javax.swing.JPanel" name="updatesPanel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="name" type="java.lang.String" value="updatesPanel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
||||||
|
<JTabbedPaneConstraints tabName="Updates">
|
||||||
|
<Property name="tabTitle" type="java.lang.String" resourceKey="updatesPanel.TabConstraints.tabTitle"/>
|
||||||
|
</JTabbedPaneConstraints>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
|
||||||
|
<Layout>
|
||||||
|
<DimensionLayout dim="0">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" attributes="0">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" alignment="0" attributes="0">
|
||||||
|
<EmptySpace min="-2" pref="20" max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Component id="updateMethod" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Group type="102" alignment="0" attributes="0">
|
||||||
|
<Component id="checkUpdates" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
|
<Component id="updateNow" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
<Group type="102" alignment="0" attributes="0">
|
||||||
|
<EmptySpace min="40" pref="40" max="40" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="0" max="-2" attributes="0">
|
||||||
|
<Component id="updateInform" alignment="0" pref="377" max="32767" attributes="1"/>
|
||||||
|
<Component id="updateDownload" alignment="0" max="32767" attributes="1"/>
|
||||||
|
<Component id="updateDownloadRestart" alignment="0" max="32767" attributes="1"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<Group type="102" alignment="1" attributes="0">
|
||||||
|
<EmptySpace pref="339" max="32767" attributes="0"/>
|
||||||
|
<Component id="advancedUpdateConfig" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
<DimensionLayout dim="1">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" attributes="0">
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Component id="updateMethod" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||||
|
<Component id="updateInform" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Component id="updateDownload" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Component id="updateDownloadRestart" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="checkUpdates" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="updateNow" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace pref="181" max="32767" attributes="0"/>
|
||||||
|
<Component id="advancedUpdateConfig" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
</Layout>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JLabel" name="updateMethod">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="updateMethod.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="updateMethod" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JRadioButton" name="updateInform">
|
||||||
|
<Properties>
|
||||||
|
<Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
|
||||||
|
<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>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JRadioButton" name="updateDownload">
|
||||||
|
<Properties>
|
||||||
|
<Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
|
||||||
|
<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>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JRadioButton" name="updateDownloadRestart">
|
||||||
|
<Properties>
|
||||||
|
<Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
|
||||||
|
<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>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JToggleButton" name="checkUpdates">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="checkUpdates.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="checkUpdates" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="checkUpdatesActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JToggleButton" name="updateNow">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="updateNow.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="updateNow" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="updateNowActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JToggleButton" name="advancedUpdateConfig">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="advancedUpdateConfig.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="advancedUpdateConfig" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="advancedUpdateConfigActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
|
<Container class="javax.swing.JPanel" name="tunnelPanel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="name" type="java.lang.String" value="tunnelPanel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
||||||
|
<JTabbedPaneConstraints tabName="Tunnels/Services">
|
||||||
|
<Property name="tabTitle" type="java.lang.String" resourceKey="tunnelPanel.TabConstraints.tabTitle"/>
|
||||||
|
</JTabbedPaneConstraints>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
|
||||||
|
<Layout>
|
||||||
|
<DimensionLayout dim="0">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" alignment="1" attributes="0">
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="1" attributes="0">
|
||||||
|
<Component id="tunnelsExplanation" alignment="0" pref="538" max="32767" attributes="0"/>
|
||||||
|
<Component id="serverFrame" alignment="1" pref="538" max="32767" attributes="0"/>
|
||||||
|
<Component id="clientTunnelLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="clientFrame" alignment="0" pref="538" max="32767" attributes="0"/>
|
||||||
|
<Component id="serverTunnelLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
<DimensionLayout dim="1">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" alignment="0" attributes="0">
|
||||||
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="clientTunnelLabel" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="clientFrame" pref="119" max="32767" attributes="0"/>
|
||||||
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="serverTunnelLabel" 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>
|
||||||
|
</DimensionLayout>
|
||||||
|
</Layout>
|
||||||
|
<SubComponents>
|
||||||
|
<Container class="javax.swing.JScrollPane" name="clientFrame">
|
||||||
|
<Properties>
|
||||||
|
<Property name="name" type="java.lang.String" value="clientFrame" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
|
||||||
|
<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 class="javax.swing.JScrollPane" name="serverFrame">
|
||||||
|
<Properties>
|
||||||
|
<Property name="name" type="java.lang.String" value="serverFrame" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
|
||||||
|
<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>
|
||||||
|
<Component class="javax.swing.JLabel" name="tunnelsExplanation">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="tunnelsExplanation.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="tunnelsExplanation" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="clientTunnelLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="clientTunnelLabel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="clientTunnelLabel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="serverTunnelLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="serverTunnelLabel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="serverTunnelLabel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
|
<Container class="javax.swing.JPanel" name="networkPanel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="name" type="java.lang.String" value="networkPanel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
||||||
|
<JTabbedPaneConstraints tabName="Network">
|
||||||
|
<Property name="tabTitle" type="java.lang.String" resourceKey="networkPanel.TabConstraints.tabTitle"/>
|
||||||
|
</JTabbedPaneConstraints>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
|
||||||
|
<Layout>
|
||||||
|
<DimensionLayout dim="0">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<EmptySpace min="0" pref="562" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
<DimensionLayout dim="1">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<EmptySpace min="0" pref="388" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
</Layout>
|
||||||
|
</Container>
|
||||||
|
<Container class="javax.swing.JPanel" name="advancedPanel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="name" type="java.lang.String" value="advancedPanel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
|
||||||
|
<JTabbedPaneConstraints tabName="Advanced">
|
||||||
|
<Property name="tabTitle" type="java.lang.String" resourceKey="advancedPanel.TabConstraints.tabTitle"/>
|
||||||
|
</JTabbedPaneConstraints>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
|
||||||
|
<Layout>
|
||||||
|
<DimensionLayout dim="0">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<EmptySpace min="0" pref="562" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
<DimensionLayout dim="1">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<EmptySpace min="0" pref="388" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
</Layout>
|
||||||
|
</Container>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
|
</SubComponents>
|
||||||
|
</Form>
|
@ -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;
|
||||||
|
}
|
185
apps/desktopgui/src/net/i2p/desktopgui/gui/JPopupTrayIcon.java
Normal file
185
apps/desktopgui/src/net/i2p/desktopgui/gui/JPopupTrayIcon.java
Normal file
@ -0,0 +1,185 @@
|
|||||||
|
/*
|
||||||
|
* Created on Sep 15, 2008 5:51:33 PM
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This class is part of fishfarm project: https://fishfarm.dev.java.net/
|
||||||
|
* It is licensed under the GPL version 2.0 with Classpath Exception.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2008 Michael Bien
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package net.i2p.desktopgui.gui;
|
||||||
|
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import java.awt.Frame;
|
||||||
|
import java.awt.GraphicsEnvironment;
|
||||||
|
import java.awt.Image;
|
||||||
|
import java.awt.Point;
|
||||||
|
import java.awt.PopupMenu;
|
||||||
|
import java.awt.TrayIcon;
|
||||||
|
import java.awt.Window;
|
||||||
|
import java.awt.event.MouseAdapter;
|
||||||
|
import java.awt.event.MouseEvent;
|
||||||
|
import javax.swing.JDialog;
|
||||||
|
import javax.swing.JPopupMenu;
|
||||||
|
import javax.swing.JWindow;
|
||||||
|
import javax.swing.RootPaneContainer;
|
||||||
|
import javax.swing.event.PopupMenuEvent;
|
||||||
|
import javax.swing.event.PopupMenuListener;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* JPopupMenu compatible TrayIcon based on Alexander Potochkin's JXTrayIcon
|
||||||
|
* (http://weblogs.java.net/blog/alexfromsun/archive/2008/02/jtrayicon_updat.html)
|
||||||
|
* but uses a JWindow instead of a JDialog to workaround some bugs on linux.
|
||||||
|
*
|
||||||
|
* @author Michael Bien
|
||||||
|
*/
|
||||||
|
public class JPopupTrayIcon extends TrayIcon {
|
||||||
|
|
||||||
|
private JPopupMenu menu;
|
||||||
|
|
||||||
|
private Window window;
|
||||||
|
private PopupMenuListener popupListener;
|
||||||
|
|
||||||
|
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) {
|
||||||
|
super(image);
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
public JPopupTrayIcon(Image image, String tooltip) {
|
||||||
|
super(image, tooltip);
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
public JPopupTrayIcon(Image image, String tooltip, PopupMenu popup) {
|
||||||
|
super(image, tooltip, popup);
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
public JPopupTrayIcon(Image image, String tooltip, JPopupMenu popup) {
|
||||||
|
super(image, tooltip);
|
||||||
|
init();
|
||||||
|
setJPopupMenu(popup);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private final void init() {
|
||||||
|
|
||||||
|
|
||||||
|
popupListener = new PopupMenuListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
|
||||||
|
//System.out.println("popupMenuWillBecomeVisible");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
|
||||||
|
//System.out.println("popupMenuWillBecomeInvisible");
|
||||||
|
if(window != null) {
|
||||||
|
window.dispose();
|
||||||
|
window = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void popupMenuCanceled(PopupMenuEvent e) {
|
||||||
|
// System.out.println("popupMenuCanceled");
|
||||||
|
if(window != null) {
|
||||||
|
window.dispose();
|
||||||
|
window = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
addMouseListener(new MouseAdapter() {
|
||||||
|
@Override
|
||||||
|
public void mousePressed(MouseEvent e) {
|
||||||
|
//System.out.println("Pressed " + e.getPoint());
|
||||||
|
showJPopupMenu(e, previous);
|
||||||
|
previous = e;
|
||||||
|
previousTime = time;
|
||||||
|
time = new Date();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mouseReleased(MouseEvent e) {
|
||||||
|
//System.out.println("Released " + e.getPoint());
|
||||||
|
showJPopupMenu(e, previous);
|
||||||
|
previous = e;
|
||||||
|
previousTime = time;
|
||||||
|
time = new Date();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private final void showJPopupMenu(MouseEvent e, MouseEvent previous) {
|
||||||
|
if((e.isPopupTrigger() || previous.isPopupTrigger()) && (time.getTime() - previousTime.getTime() < 1000) && menu != null) {
|
||||||
|
if (window == null) {
|
||||||
|
|
||||||
|
if(IS_WINDOWS) {
|
||||||
|
window = new JDialog((Frame)null);
|
||||||
|
((JDialog)window).setUndecorated(true);
|
||||||
|
}else{
|
||||||
|
window = new JWindow((Frame)null);
|
||||||
|
}
|
||||||
|
window.setAlwaysOnTop(true);
|
||||||
|
Dimension size = menu.getPreferredSize();
|
||||||
|
|
||||||
|
Point centerPoint = GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint();
|
||||||
|
if(e.getY() > centerPoint.getY())
|
||||||
|
window.setLocation(e.getX(), e.getY() - size.height);
|
||||||
|
else
|
||||||
|
window.setLocation(e.getX(), e.getY());
|
||||||
|
|
||||||
|
window.setVisible(true);
|
||||||
|
|
||||||
|
menu.show(((RootPaneContainer)window).getContentPane(), 0, 0);
|
||||||
|
|
||||||
|
// popup works only for focused windows
|
||||||
|
window.toFront();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public final JPopupMenu getJPopupMenu() {
|
||||||
|
return menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final void setJPopupMenu(JPopupMenu menu) {
|
||||||
|
if (this.menu != null) {
|
||||||
|
this.menu.removePopupMenuListener(popupListener);
|
||||||
|
}
|
||||||
|
this.menu = menu;
|
||||||
|
menu.addPopupMenuListener(popupListener);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
103
apps/desktopgui/src/net/i2p/desktopgui/gui/LogViewer.form
Normal file
103
apps/desktopgui/src/net/i2p/desktopgui/gui/LogViewer.form
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
|
||||||
|
<Form version="1.5" maxVersion="1.6" 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"/>
|
||||||
|
</AuxValues>
|
||||||
|
|
||||||
|
<Layout>
|
||||||
|
<DimensionLayout dim="0">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" alignment="0" attributes="0">
|
||||||
|
<EmptySpace min="12" pref="12" max="12" attributes="0"/>
|
||||||
|
<Component id="explanationText" min="-2" pref="561" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<Component id="textScroll" alignment="1" pref="722" max="32767" attributes="0"/>
|
||||||
|
<Group type="102" alignment="0" attributes="0">
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Component id="refreshButton" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||||
|
<Component id="clearButton" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace pref="587" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
<DimensionLayout dim="1">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" alignment="0" attributes="0">
|
||||||
|
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="explanationText" min="-2" pref="45" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="3" attributes="0">
|
||||||
|
<Component id="refreshButton" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="clearButton" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace min="-2" pref="14" max="-2" attributes="0"/>
|
||||||
|
<Component id="textScroll" pref="330" max="32767" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
</Layout>
|
||||||
|
<SubComponents>
|
||||||
|
<Container class="javax.swing.JScrollPane" name="textScroll">
|
||||||
|
<Properties>
|
||||||
|
<Property name="name" type="java.lang.String" value="textScroll" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<AuxValues>
|
||||||
|
<AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
|
||||||
|
</AuxValues>
|
||||||
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JTextArea" name="logText">
|
||||||
|
<Properties>
|
||||||
|
<Property name="columns" type="int" value="20"/>
|
||||||
|
<Property name="rows" type="int" value="5"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="logText" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Container>
|
||||||
|
<Component class="javax.swing.JLabel" name="explanationText">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="explanationText.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="explanationText" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JButton" name="refreshButton">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="refreshButton.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="refreshButton" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="refreshButtonActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JButton" name="clearButton">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="clearButton.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="clearButton" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="clearButtonActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Form>
|
164
apps/desktopgui/src/net/i2p/desktopgui/gui/LogViewer.java
Normal file
164
apps/desktopgui/src/net/i2p/desktopgui/gui/LogViewer.java
Normal file
@ -0,0 +1,164 @@
|
|||||||
|
/*
|
||||||
|
* LogViewer.java
|
||||||
|
*
|
||||||
|
* Created on 10 april 2009, 19:17
|
||||||
|
*/
|
||||||
|
|
||||||
|
package net.i2p.desktopgui.gui;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
import javax.swing.WindowConstants;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author mathias
|
||||||
|
*/
|
||||||
|
public class LogViewer extends javax.swing.JFrame {
|
||||||
|
|
||||||
|
/** Creates new form LogViewer */
|
||||||
|
public LogViewer() {
|
||||||
|
initComponents();
|
||||||
|
readLogText();
|
||||||
|
this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
|
||||||
|
this.setVisible(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void readLogText() {
|
||||||
|
Thread t = new Thread(new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
String s = "";
|
||||||
|
File f = new File(LOGLOCATION);
|
||||||
|
if(f.exists()) {
|
||||||
|
try {
|
||||||
|
BufferedReader br = new BufferedReader(new FileReader(f));
|
||||||
|
while(true) {
|
||||||
|
String line = br.readLine();
|
||||||
|
if(line != null)
|
||||||
|
s += JTEXTNEWLINE + line;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch(Exception e) {
|
||||||
|
s = "An error has occurred while loading the logfiles:" + JTEXTNEWLINE + e.getMessage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
logText.setText(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
t.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 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() {
|
||||||
|
|
||||||
|
textScroll = new javax.swing.JScrollPane();
|
||||||
|
logText = new javax.swing.JTextArea();
|
||||||
|
explanationText = new javax.swing.JLabel();
|
||||||
|
refreshButton = new javax.swing.JButton();
|
||||||
|
clearButton = 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(LogViewer.class);
|
||||||
|
setTitle(resourceMap.getString("Form.title")); // NOI18N
|
||||||
|
setName("Form"); // NOI18N
|
||||||
|
|
||||||
|
textScroll.setName("textScroll"); // NOI18N
|
||||||
|
|
||||||
|
logText.setColumns(20);
|
||||||
|
logText.setRows(5);
|
||||||
|
logText.setName("logText"); // NOI18N
|
||||||
|
textScroll.setViewportView(logText);
|
||||||
|
|
||||||
|
explanationText.setText(resourceMap.getString("explanationText.text")); // NOI18N
|
||||||
|
explanationText.setName("explanationText"); // NOI18N
|
||||||
|
|
||||||
|
refreshButton.setText(resourceMap.getString("refreshButton.text")); // NOI18N
|
||||||
|
refreshButton.setName("refreshButton"); // NOI18N
|
||||||
|
refreshButton.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
refreshButtonActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
clearButton.setText(resourceMap.getString("clearButton.text")); // NOI18N
|
||||||
|
clearButton.setName("clearButton"); // NOI18N
|
||||||
|
clearButton.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
clearButtonActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
|
||||||
|
getContentPane().setLayout(layout);
|
||||||
|
layout.setHorizontalGroup(
|
||||||
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addGap(12, 12, 12)
|
||||||
|
.addComponent(explanationText, javax.swing.GroupLayout.PREFERRED_SIZE, 561, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addContainerGap())
|
||||||
|
.addComponent(textScroll, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 722, Short.MAX_VALUE)
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addContainerGap()
|
||||||
|
.addComponent(refreshButton)
|
||||||
|
.addGap(18, 18, 18)
|
||||||
|
.addComponent(clearButton)
|
||||||
|
.addContainerGap(587, Short.MAX_VALUE))
|
||||||
|
);
|
||||||
|
layout.setVerticalGroup(
|
||||||
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addContainerGap()
|
||||||
|
.addComponent(explanationText, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||||
|
.addComponent(refreshButton)
|
||||||
|
.addComponent(clearButton))
|
||||||
|
.addGap(14, 14, 14)
|
||||||
|
.addComponent(textScroll, javax.swing.GroupLayout.DEFAULT_SIZE, 330, Short.MAX_VALUE))
|
||||||
|
);
|
||||||
|
|
||||||
|
pack();
|
||||||
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
|
private void clearButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_clearButtonActionPerformed
|
||||||
|
File f = new File(LOGLOCATION);
|
||||||
|
f.delete();
|
||||||
|
try {
|
||||||
|
f.createNewFile();//GEN-LAST:event_clearButtonActionPerformed
|
||||||
|
} catch (IOException ex) {
|
||||||
|
Logger.getLogger(LogViewer.class.getName()).log(Level.SEVERE, null, ex);
|
||||||
|
}
|
||||||
|
readLogText();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void refreshButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_refreshButtonActionPerformed
|
||||||
|
readLogText();
|
||||||
|
}//GEN-LAST:event_refreshButtonActionPerformed
|
||||||
|
|
||||||
|
|
||||||
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
|
private javax.swing.JButton clearButton;
|
||||||
|
private javax.swing.JLabel explanationText;
|
||||||
|
private javax.swing.JTextArea logText;
|
||||||
|
private javax.swing.JButton refreshButton;
|
||||||
|
private javax.swing.JScrollPane textScroll;
|
||||||
|
// End of variables declaration//GEN-END:variables
|
||||||
|
|
||||||
|
private static final String LOGLOCATION = "wrapper.log";
|
||||||
|
private static final String JTEXTNEWLINE = "\n";
|
||||||
|
}
|
@ -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
|
||||||
|
|
||||||
|
}
|
179
apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector.form
Normal file
179
apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector.form
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
|
||||||
|
<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
|
||||||
|
<Properties>
|
||||||
|
<Property name="defaultCloseOperation" type="int" value="2"/>
|
||||||
|
<Property name="title" type="java.lang.String" resourceKey="Form.title"/>
|
||||||
|
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[610, 330]"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="name" type="java.lang.String" value="Form" noResource="true"/>
|
||||||
|
<Property name="resizable" type="boolean" value="false"/>
|
||||||
|
</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,56,0,0,2,102"/>
|
||||||
|
</AuxValues>
|
||||||
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
|
||||||
|
<Property name="useNullLayout" type="boolean" value="true"/>
|
||||||
|
</Layout>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JButton" name="nextButton">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="nextButton.text"/>
|
||||||
|
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[72, 29]"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[72, 29]"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="name" type="java.lang.String" value="nextButton" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="nextButtonMouseClicked"/>
|
||||||
|
</Events>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="440" y="250" width="90" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="uploadLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="uploadLabel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="uploadLabel" 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="60" width="-1" height="30"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="downloadLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="downloadLabel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="downloadLabel" 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="-1" height="30"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JComboBox" name="uploadChoice">
|
||||||
|
<Properties>
|
||||||
|
<Property name="editable" type="boolean" value="true"/>
|
||||||
|
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
|
||||||
|
<StringArray count="11">
|
||||||
|
<StringItem index="0" value="100"/>
|
||||||
|
<StringItem index="1" value="200"/>
|
||||||
|
<StringItem index="2" value="500"/>
|
||||||
|
<StringItem index="3" value="1000"/>
|
||||||
|
<StringItem index="4" value="2000"/>
|
||||||
|
<StringItem index="5" value="4000"/>
|
||||||
|
<StringItem index="6" value="8000"/>
|
||||||
|
<StringItem index="7" value="10000"/>
|
||||||
|
<StringItem index="8" value="20000"/>
|
||||||
|
<StringItem index="9" value="50000"/>
|
||||||
|
<StringItem index="10" value="100000"/>
|
||||||
|
</StringArray>
|
||||||
|
</Property>
|
||||||
|
<Property name="selectedIndex" type="int" value="3"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="uploadChoice" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="300" y="60" width="-1" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JComboBox" name="downloadChoice">
|
||||||
|
<Properties>
|
||||||
|
<Property name="editable" type="boolean" value="true"/>
|
||||||
|
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
|
||||||
|
<StringArray count="11">
|
||||||
|
<StringItem index="0" value="100"/>
|
||||||
|
<StringItem index="1" value="200"/>
|
||||||
|
<StringItem index="2" value="500"/>
|
||||||
|
<StringItem index="3" value="1000"/>
|
||||||
|
<StringItem index="4" value="2000"/>
|
||||||
|
<StringItem index="5" value="4000"/>
|
||||||
|
<StringItem index="6" value="8000"/>
|
||||||
|
<StringItem index="7" value="10000"/>
|
||||||
|
<StringItem index="8" value="20000"/>
|
||||||
|
<StringItem index="9" value="50000"/>
|
||||||
|
<StringItem index="10" value="100000"/>
|
||||||
|
</StringArray>
|
||||||
|
</Property>
|
||||||
|
<Property name="selectedIndex" type="int" value="3"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="downloadChoice" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="300" y="110" width="-1" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="speedExplanation">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="speedExplanation.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="speedExplanation" 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="160" width="570" height="60"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JComboBox" name="uploadkbps">
|
||||||
|
<Properties>
|
||||||
|
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
|
||||||
|
<StringArray count="2">
|
||||||
|
<StringItem index="0" value="kbps"/>
|
||||||
|
<StringItem index="1" value="kBps"/>
|
||||||
|
</StringArray>
|
||||||
|
</Property>
|
||||||
|
<Property name="name" type="java.lang.String" value="uploadKbit" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="uploadkbpsActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="470" y="60" width="-1" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JComboBox" name="downloadkbps">
|
||||||
|
<Properties>
|
||||||
|
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
|
||||||
|
<StringArray count="2">
|
||||||
|
<StringItem index="0" value="kbps"/>
|
||||||
|
<StringItem index="1" value="kBps"/>
|
||||||
|
</StringArray>
|
||||||
|
</Property>
|
||||||
|
<Property name="name" type="java.lang.String" value="downloadKbit" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="downloadkbpsActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="470" y="110" width="-1" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Form>
|
194
apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector.java
Normal file
194
apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector.java
Normal file
@ -0,0 +1,194 @@
|
|||||||
|
/*
|
||||||
|
* ProfileSelector.java
|
||||||
|
*
|
||||||
|
* Created on 3 april 2009, 13:57
|
||||||
|
*/
|
||||||
|
|
||||||
|
package net.i2p.desktopgui.gui;
|
||||||
|
|
||||||
|
import java.awt.Point;
|
||||||
|
import java.util.Properties;
|
||||||
|
import javax.swing.JComboBox;
|
||||||
|
import javax.swing.JTextField;
|
||||||
|
import net.i2p.desktopgui.persistence.PropertyManager;
|
||||||
|
import net.i2p.desktopgui.util.IntegerVerifier;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author mathias
|
||||||
|
*/
|
||||||
|
public class SpeedSelector extends javax.swing.JFrame {
|
||||||
|
|
||||||
|
/** Creates new form ProfileSelector */
|
||||||
|
public SpeedSelector() {
|
||||||
|
this.props = PropertyManager.getProps();
|
||||||
|
initComponents();
|
||||||
|
initComponentsCustom();
|
||||||
|
initSpeeds(props);
|
||||||
|
this.setVisible(true);
|
||||||
|
this.setLocationRelativeTo(null);
|
||||||
|
this.requestFocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
public SpeedSelector(Point point) {
|
||||||
|
this();
|
||||||
|
this.setLocation(point);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void initComponentsCustom() {
|
||||||
|
((JTextField)uploadChoice.getEditor().getEditorComponent()).setInputVerifier(new IntegerVerifier());
|
||||||
|
((JTextField)downloadChoice.getEditor().getEditorComponent()).setInputVerifier(new IntegerVerifier());
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 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() {
|
||||||
|
|
||||||
|
nextButton = new javax.swing.JButton();
|
||||||
|
uploadLabel = new javax.swing.JLabel();
|
||||||
|
downloadLabel = new javax.swing.JLabel();
|
||||||
|
uploadChoice = new javax.swing.JComboBox();
|
||||||
|
downloadChoice = new javax.swing.JComboBox();
|
||||||
|
speedExplanation = new javax.swing.JLabel();
|
||||||
|
uploadkbps = new javax.swing.JComboBox();
|
||||||
|
downloadkbps = new javax.swing.JComboBox();
|
||||||
|
|
||||||
|
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(SpeedSelector.class);
|
||||||
|
setTitle(resourceMap.getString("Form.title")); // NOI18N
|
||||||
|
setMinimumSize(new java.awt.Dimension(610, 330));
|
||||||
|
setName("Form"); // NOI18N
|
||||||
|
setResizable(false);
|
||||||
|
getContentPane().setLayout(null);
|
||||||
|
|
||||||
|
nextButton.setText(resourceMap.getString("nextButton.text")); // NOI18N
|
||||||
|
nextButton.setMaximumSize(new java.awt.Dimension(72, 29));
|
||||||
|
nextButton.setMinimumSize(new java.awt.Dimension(72, 29));
|
||||||
|
nextButton.setName("nextButton"); // NOI18N
|
||||||
|
nextButton.addMouseListener(new java.awt.event.MouseAdapter() {
|
||||||
|
public void mouseClicked(java.awt.event.MouseEvent evt) {
|
||||||
|
nextButtonMouseClicked(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
getContentPane().add(nextButton);
|
||||||
|
nextButton.setBounds(440, 250, 90, 29);
|
||||||
|
|
||||||
|
uploadLabel.setText(resourceMap.getString("uploadLabel.text")); // NOI18N
|
||||||
|
uploadLabel.setName("uploadLabel"); // NOI18N
|
||||||
|
getContentPane().add(uploadLabel);
|
||||||
|
uploadLabel.setBounds(20, 60, 246, 30);
|
||||||
|
|
||||||
|
downloadLabel.setText(resourceMap.getString("downloadLabel.text")); // NOI18N
|
||||||
|
downloadLabel.setName("downloadLabel"); // NOI18N
|
||||||
|
getContentPane().add(downloadLabel);
|
||||||
|
downloadLabel.setBounds(20, 110, 263, 30);
|
||||||
|
|
||||||
|
uploadChoice.setEditable(true);
|
||||||
|
uploadChoice.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "100", "200", "500", "1000", "2000", "4000", "8000", "10000", "20000", "50000", "100000" }));
|
||||||
|
uploadChoice.setSelectedIndex(3);
|
||||||
|
uploadChoice.setName("uploadChoice"); // NOI18N
|
||||||
|
getContentPane().add(uploadChoice);
|
||||||
|
uploadChoice.setBounds(300, 60, 154, 27);
|
||||||
|
|
||||||
|
downloadChoice.setEditable(true);
|
||||||
|
downloadChoice.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "100", "200", "500", "1000", "2000", "4000", "8000", "10000", "20000", "50000", "100000" }));
|
||||||
|
downloadChoice.setSelectedIndex(3);
|
||||||
|
downloadChoice.setName("downloadChoice"); // NOI18N
|
||||||
|
getContentPane().add(downloadChoice);
|
||||||
|
downloadChoice.setBounds(300, 110, 154, 27);
|
||||||
|
|
||||||
|
speedExplanation.setText(resourceMap.getString("speedExplanation.text")); // NOI18N
|
||||||
|
speedExplanation.setName("speedExplanation"); // NOI18N
|
||||||
|
getContentPane().add(speedExplanation);
|
||||||
|
speedExplanation.setBounds(20, 160, 570, 60);
|
||||||
|
|
||||||
|
uploadkbps.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" }));
|
||||||
|
uploadkbps.setName("uploadKbit"); // NOI18N
|
||||||
|
uploadkbps.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
uploadkbpsActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
getContentPane().add(uploadkbps);
|
||||||
|
uploadkbps.setBounds(470, 60, 68, 27);
|
||||||
|
|
||||||
|
downloadkbps.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" }));
|
||||||
|
downloadkbps.setName("downloadKbit"); // NOI18N
|
||||||
|
downloadkbps.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
downloadkbpsActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
getContentPane().add(downloadkbps);
|
||||||
|
downloadkbps.setBounds(470, 110, 68, 27);
|
||||||
|
|
||||||
|
pack();
|
||||||
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
|
private void nextButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_nextButtonMouseClicked
|
||||||
|
if(uploadkbps.getSelectedIndex() == KILOBIT)
|
||||||
|
props.setProperty(SpeedSelectorConstants.MAXUPLOADCAPABLE, uploadChoice.getSelectedItem().toString());
|
||||||
|
else
|
||||||
|
props.setProperty(SpeedSelectorConstants.MAXUPLOADCAPABLE, "" + Integer.parseInt(uploadChoice.getSelectedItem().toString())*8);
|
||||||
|
if(downloadkbps.getSelectedIndex() == KILOBIT)
|
||||||
|
props.setProperty(SpeedSelectorConstants.MAXDOWNLOADCAPABLE, downloadChoice.getSelectedItem().toString());
|
||||||
|
else
|
||||||
|
props.setProperty(SpeedSelectorConstants.MAXDOWNLOADCAPABLE, "" + Integer.parseInt(downloadChoice.getSelectedItem().toString())*8);
|
||||||
|
PropertyManager.saveProps(props);
|
||||||
|
new SpeedSelector2(this.getLocationOnScreen());
|
||||||
|
this.dispose();
|
||||||
|
}//GEN-LAST:event_nextButtonMouseClicked
|
||||||
|
|
||||||
|
private void uploadkbpsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_uploadkbpsActionPerformed
|
||||||
|
kbpsSwitchPerformed(uploadkbps, uploadChoice);
|
||||||
|
}//GEN-LAST:event_uploadkbpsActionPerformed
|
||||||
|
|
||||||
|
private void downloadkbpsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_downloadkbpsActionPerformed
|
||||||
|
kbpsSwitchPerformed(downloadkbps, downloadChoice);
|
||||||
|
}//GEN-LAST:event_downloadkbpsActionPerformed
|
||||||
|
|
||||||
|
private void kbpsSwitchPerformed(JComboBox kbps, JComboBox speed) {
|
||||||
|
int index = kbps.getSelectedIndex();
|
||||||
|
int previous = Integer.parseInt(speed.getSelectedItem().toString());
|
||||||
|
if(index == KILOBIT) {
|
||||||
|
speed.setSelectedItem("" + previous*8);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
speed.setSelectedItem("" + previous/8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initSpeeds(Properties props) {
|
||||||
|
String up = props.getProperty(SpeedSelectorConstants.MAXUPLOADCAPABLE);
|
||||||
|
String down = props.getProperty(SpeedSelectorConstants.MAXDOWNLOADCAPABLE);
|
||||||
|
|
||||||
|
if(up == null)
|
||||||
|
props.setProperty(SpeedSelectorConstants.MAXUPLOADCAPABLE, "1000");
|
||||||
|
if(down == null)
|
||||||
|
props.setProperty(SpeedSelectorConstants.MAXDOWNLOADCAPABLE, "1000");
|
||||||
|
|
||||||
|
uploadChoice.setSelectedItem(props.getProperty(SpeedSelectorConstants.MAXUPLOADCAPABLE));
|
||||||
|
downloadChoice.setSelectedItem(props.getProperty(SpeedSelectorConstants.MAXDOWNLOADCAPABLE));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
|
private javax.swing.JComboBox downloadChoice;
|
||||||
|
private javax.swing.JLabel downloadLabel;
|
||||||
|
private javax.swing.JComboBox downloadkbps;
|
||||||
|
private javax.swing.JButton nextButton;
|
||||||
|
private javax.swing.JLabel speedExplanation;
|
||||||
|
private javax.swing.JComboBox uploadChoice;
|
||||||
|
private javax.swing.JLabel uploadLabel;
|
||||||
|
private javax.swing.JComboBox uploadkbps;
|
||||||
|
// End of variables declaration//GEN-END:variables
|
||||||
|
|
||||||
|
Properties props;
|
||||||
|
private static final int KILOBIT = 0;
|
||||||
|
private static final int KILOBYTE = 1;
|
||||||
|
}
|
118
apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector2.form
Normal file
118
apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector2.form
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
|
||||||
|
<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
|
||||||
|
<NonVisualComponents>
|
||||||
|
<Component class="javax.swing.ButtonGroup" name="buttonGroup1">
|
||||||
|
</Component>
|
||||||
|
</NonVisualComponents>
|
||||||
|
<Properties>
|
||||||
|
<Property name="defaultCloseOperation" type="int" value="2"/>
|
||||||
|
<Property name="title" type="java.lang.String" resourceKey="Form.title"/>
|
||||||
|
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[610, 330]"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="name" type="java.lang.String" value="Form" noResource="true"/>
|
||||||
|
<Property name="resizable" type="boolean" value="false"/>
|
||||||
|
</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,2,105"/>
|
||||||
|
</AuxValues>
|
||||||
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
|
||||||
|
<Property name="useNullLayout" type="boolean" value="true"/>
|
||||||
|
</Layout>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JButton" name="nextButton">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="nextButton.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="nextButton" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="nextButtonMouseClicked"/>
|
||||||
|
</Events>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="440" y="250" width="90" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JButton" name="returnButton">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="returnButton.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="returnButton" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="returnButtonMouseClicked"/>
|
||||||
|
</Events>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="336" y="250" width="90" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="questionLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="questionLabel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="questionLabel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="30" y="40" width="-1" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JRadioButton" name="browseButton">
|
||||||
|
<Properties>
|
||||||
|
<Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
|
||||||
|
<ComponentRef name="buttonGroup1"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="browseButton.text"/>
|
||||||
|
<Property name="actionCommand" type="java.lang.String" resourceKey="browseButton.actionCommand"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="browseButton" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="40" y="120" width="-1" height="40"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JRadioButton" name="downloadButton">
|
||||||
|
<Properties>
|
||||||
|
<Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
|
||||||
|
<ComponentRef name="buttonGroup1"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="downloadButton.text"/>
|
||||||
|
<Property name="actionCommand" type="java.lang.String" resourceKey="downloadButton.actionCommand"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="downloadButton" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="40" y="70" width="-1" height="40"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<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="30" y="170" width="530" height="70"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Form>
|
159
apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector2.java
Normal file
159
apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector2.java
Normal file
@ -0,0 +1,159 @@
|
|||||||
|
/*
|
||||||
|
* ProfileSelector2.java
|
||||||
|
*
|
||||||
|
* Created on 3 april 2009, 14:36
|
||||||
|
*/
|
||||||
|
|
||||||
|
package net.i2p.desktopgui.gui;
|
||||||
|
|
||||||
|
import java.awt.Point;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.Properties;
|
||||||
|
import javax.swing.AbstractButton;
|
||||||
|
import net.i2p.desktopgui.persistence.PropertyManager;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author mathias
|
||||||
|
*/
|
||||||
|
public class SpeedSelector2 extends javax.swing.JFrame {
|
||||||
|
Properties props;
|
||||||
|
|
||||||
|
/** Creates new form ProfileSelector2 */
|
||||||
|
public SpeedSelector2(Point point) {
|
||||||
|
this.props = PropertyManager.getProps();
|
||||||
|
initComponents();
|
||||||
|
this.setLocation(point);
|
||||||
|
loadButtonSelection();
|
||||||
|
this.setVisible(true);
|
||||||
|
this.requestFocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 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() {
|
||||||
|
|
||||||
|
buttonGroup1 = new javax.swing.ButtonGroup();
|
||||||
|
nextButton = new javax.swing.JButton();
|
||||||
|
returnButton = new javax.swing.JButton();
|
||||||
|
questionLabel = new javax.swing.JLabel();
|
||||||
|
browseButton = new javax.swing.JRadioButton();
|
||||||
|
downloadButton = new javax.swing.JRadioButton();
|
||||||
|
jLabel1 = new javax.swing.JLabel();
|
||||||
|
|
||||||
|
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(SpeedSelector2.class);
|
||||||
|
setTitle(resourceMap.getString("Form.title")); // NOI18N
|
||||||
|
setMinimumSize(new java.awt.Dimension(610, 330));
|
||||||
|
setName("Form"); // NOI18N
|
||||||
|
setResizable(false);
|
||||||
|
getContentPane().setLayout(null);
|
||||||
|
|
||||||
|
nextButton.setText(resourceMap.getString("nextButton.text")); // NOI18N
|
||||||
|
nextButton.setName("nextButton"); // NOI18N
|
||||||
|
nextButton.addMouseListener(new java.awt.event.MouseAdapter() {
|
||||||
|
public void mouseClicked(java.awt.event.MouseEvent evt) {
|
||||||
|
nextButtonMouseClicked(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
getContentPane().add(nextButton);
|
||||||
|
nextButton.setBounds(440, 250, 90, 29);
|
||||||
|
|
||||||
|
returnButton.setText(resourceMap.getString("returnButton.text")); // NOI18N
|
||||||
|
returnButton.setName("returnButton"); // NOI18N
|
||||||
|
returnButton.addMouseListener(new java.awt.event.MouseAdapter() {
|
||||||
|
public void mouseClicked(java.awt.event.MouseEvent evt) {
|
||||||
|
returnButtonMouseClicked(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
getContentPane().add(returnButton);
|
||||||
|
returnButton.setBounds(336, 250, 90, 29);
|
||||||
|
|
||||||
|
questionLabel.setText(resourceMap.getString("questionLabel.text")); // NOI18N
|
||||||
|
questionLabel.setName("questionLabel"); // NOI18N
|
||||||
|
getContentPane().add(questionLabel);
|
||||||
|
questionLabel.setBounds(30, 40, 265, 17);
|
||||||
|
|
||||||
|
buttonGroup1.add(browseButton);
|
||||||
|
browseButton.setText(resourceMap.getString("browseButton.text")); // NOI18N
|
||||||
|
browseButton.setActionCommand(resourceMap.getString("browseButton.actionCommand")); // NOI18N
|
||||||
|
browseButton.setName("browseButton"); // NOI18N
|
||||||
|
getContentPane().add(browseButton);
|
||||||
|
browseButton.setBounds(40, 120, 520, 40);
|
||||||
|
|
||||||
|
buttonGroup1.add(downloadButton);
|
||||||
|
downloadButton.setText(resourceMap.getString("downloadButton.text")); // NOI18N
|
||||||
|
downloadButton.setActionCommand(resourceMap.getString("downloadButton.actionCommand")); // NOI18N
|
||||||
|
downloadButton.setName("downloadButton"); // NOI18N
|
||||||
|
getContentPane().add(downloadButton);
|
||||||
|
downloadButton.setBounds(40, 70, 499, 40);
|
||||||
|
|
||||||
|
jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N
|
||||||
|
jLabel1.setName("jLabel1"); // NOI18N
|
||||||
|
getContentPane().add(jLabel1);
|
||||||
|
jLabel1.setBounds(30, 170, 530, 70);
|
||||||
|
|
||||||
|
pack();
|
||||||
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
|
private void returnButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_returnButtonMouseClicked
|
||||||
|
saveButtonSelection();
|
||||||
|
PropertyManager.saveProps(props);
|
||||||
|
new SpeedSelector(this.getLocationOnScreen());
|
||||||
|
this.dispose();
|
||||||
|
}//GEN-LAST:event_returnButtonMouseClicked
|
||||||
|
|
||||||
|
private void nextButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_nextButtonMouseClicked
|
||||||
|
saveButtonSelection();
|
||||||
|
PropertyManager.saveProps(props);
|
||||||
|
new SpeedSelector3(this.getLocationOnScreen(), this.getSize());
|
||||||
|
this.dispose();
|
||||||
|
}//GEN-LAST:event_nextButtonMouseClicked
|
||||||
|
|
||||||
|
private void loadButtonSelection() {
|
||||||
|
|
||||||
|
Enumeration<AbstractButton> elements = buttonGroup1.getElements();
|
||||||
|
while(elements.hasMoreElements()) {
|
||||||
|
AbstractButton button = elements.nextElement();
|
||||||
|
if(button == null)
|
||||||
|
continue;
|
||||||
|
if(props.getProperty(SpeedSelectorConstants.USERTYPE) == null)
|
||||||
|
break;
|
||||||
|
String type = button.getActionCommand();
|
||||||
|
if(type.equals(props.getProperty(SpeedSelectorConstants.USERTYPE))) {
|
||||||
|
button.setSelected(true);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void saveButtonSelection() {
|
||||||
|
Enumeration<AbstractButton> elements = buttonGroup1.getElements();
|
||||||
|
while(elements.hasMoreElements()) {
|
||||||
|
AbstractButton button = elements.nextElement();
|
||||||
|
if(button == null)
|
||||||
|
continue;
|
||||||
|
if(button.isSelected()) {
|
||||||
|
String type = button.getActionCommand();
|
||||||
|
props.setProperty(SpeedSelectorConstants.USERTYPE, type);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
|
private javax.swing.JRadioButton browseButton;
|
||||||
|
private javax.swing.ButtonGroup buttonGroup1;
|
||||||
|
private javax.swing.JRadioButton downloadButton;
|
||||||
|
private javax.swing.JLabel jLabel1;
|
||||||
|
private javax.swing.JButton nextButton;
|
||||||
|
private javax.swing.JLabel questionLabel;
|
||||||
|
private javax.swing.JButton returnButton;
|
||||||
|
// End of variables declaration//GEN-END:variables
|
||||||
|
|
||||||
|
}
|
338
apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector3.form
Normal file
338
apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector3.form
Normal file
@ -0,0 +1,338 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
|
||||||
|
<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
|
||||||
|
<Properties>
|
||||||
|
<Property name="defaultCloseOperation" type="int" value="2"/>
|
||||||
|
<Property name="title" type="java.lang.String" resourceKey="Form.title"/>
|
||||||
|
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[670, 330]"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="name" type="java.lang.String" value="Form" noResource="true"/>
|
||||||
|
<Property name="resizable" type="boolean" value="false"/>
|
||||||
|
</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,74,0,0,2,-108"/>
|
||||||
|
</AuxValues>
|
||||||
|
|
||||||
|
<Layout class="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout">
|
||||||
|
<Property name="useNullLayout" type="boolean" value="true"/>
|
||||||
|
</Layout>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JButton" name="finishButton">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="finishButton.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="finishButton" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="finishButtonMouseClicked"/>
|
||||||
|
</Events>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="440" y="250" width="90" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JButton" name="previousButton">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="previousButton.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="previousButton" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="previousButtonMouseClicked"/>
|
||||||
|
</Events>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="336" y="250" width="90" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="settingsInfo">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="settingsInfo.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="settingsInfo" 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="30" width="-1" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="uploadLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="uploadLabel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="uploadLabel" 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="70" width="140" height="30"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="downloadLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="downloadLabel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="downloadLabel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="340" y="70" width="160" height="30"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="uploadBurstLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="uploadBurstLabel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="uploadBurstLabel" 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="140" height="30"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="downloadBurstLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="downloadBurstLabel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="downloadBurstLabel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="340" y="110" width="160" height="30"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="uploadUsageLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="uploadUsageLabel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="uploadUsageLabel" 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="150" width="140" height="30"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="downloadUsageLabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="downloadUsageLabel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="downloadUsageLabel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="340" y="150" width="160" height="30"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JTextField" name="uploadField">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="uploadField.text"/>
|
||||||
|
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[77, 27]"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="name" type="java.lang.String" value="uploadField" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="speedFieldKeyReleased"/>
|
||||||
|
</Events>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="160" y="70" width="-1" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JTextField" name="uploadBurstField">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="uploadBurstField.text"/>
|
||||||
|
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[77, 27]"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="name" type="java.lang.String" value="uploadBurstField" 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="110" width="-1" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JTextField" name="downloadField">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="downloadField.text"/>
|
||||||
|
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[77, 27]"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="name" type="java.lang.String" value="downloadField" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="speedFieldKeyReleased"/>
|
||||||
|
</Events>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="500" y="70" width="-1" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JTextField" name="downloadBurstField">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="downloadBurstField.text"/>
|
||||||
|
<Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||||
|
<Dimension value="[77, 27]"/>
|
||||||
|
</Property>
|
||||||
|
<Property name="name" type="java.lang.String" value="downloadBurstField" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="500" y="110" width="-1" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JComboBox" name="kbpsBurstDownload">
|
||||||
|
<Properties>
|
||||||
|
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
|
||||||
|
<StringArray count="2">
|
||||||
|
<StringItem index="0" value="kbps"/>
|
||||||
|
<StringItem index="1" value="kBps"/>
|
||||||
|
</StringArray>
|
||||||
|
</Property>
|
||||||
|
<Property name="name" type="java.lang.String" value="kbpsBurstDownload" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="kbpsBurstDownloadActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="580" y="110" width="-1" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JComboBox" name="kbpsUpload">
|
||||||
|
<Properties>
|
||||||
|
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
|
||||||
|
<StringArray count="2">
|
||||||
|
<StringItem index="0" value="kbps"/>
|
||||||
|
<StringItem index="1" value="kBps"/>
|
||||||
|
</StringArray>
|
||||||
|
</Property>
|
||||||
|
<Property name="name" type="java.lang.String" value="kbpsUpload" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="kbpsUploadActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="240" y="70" width="-1" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JComboBox" name="kbpsBurstUpload">
|
||||||
|
<Properties>
|
||||||
|
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
|
||||||
|
<StringArray count="2">
|
||||||
|
<StringItem index="0" value="kbps"/>
|
||||||
|
<StringItem index="1" value="kBps"/>
|
||||||
|
</StringArray>
|
||||||
|
</Property>
|
||||||
|
<Property name="name" type="java.lang.String" value="kbpsBurstUpload" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="kbpsBurstUploadActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="240" y="110" width="-1" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JComboBox" name="kbpsDownload">
|
||||||
|
<Properties>
|
||||||
|
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
|
||||||
|
<StringArray count="2">
|
||||||
|
<StringItem index="0" value="kbps"/>
|
||||||
|
<StringItem index="1" value="kBps"/>
|
||||||
|
</StringArray>
|
||||||
|
</Property>
|
||||||
|
<Property name="name" type="java.lang.String" value="kbpsDownload" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="kbpsDownloadActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="580" y="70" width="-1" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="uploadGB">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="uploadUsageLabel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="uploadUsageLabel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="240" y="150" width="45" height="30"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JTextField" name="uploadMonth">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="uploadMonth.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="uploadMonth" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="monthKeyReleased"/>
|
||||||
|
</Events>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="160" y="150" width="-1" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JTextField" name="downloadMonth">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="downloadMonth.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="downloadMonth" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="monthKeyReleased"/>
|
||||||
|
</Events>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="500" y="150" width="-1" height="-1"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="downloadGB">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="downloadUsageLabel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="downloadUsageLabel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Constraints>
|
||||||
|
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||||
|
<AbsoluteConstraints x="580" y="150" width="40" height="30"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="explanation">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="explanation.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="explanation" 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="180" width="600" height="70"/>
|
||||||
|
</Constraint>
|
||||||
|
</Constraints>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Form>
|
439
apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector3.java
Normal file
439
apps/desktopgui/src/net/i2p/desktopgui/gui/SpeedSelector3.java
Normal file
@ -0,0 +1,439 @@
|
|||||||
|
/*
|
||||||
|
* ProfileSelector3.java
|
||||||
|
*
|
||||||
|
* Created on 3 april 2009, 15:17
|
||||||
|
*/
|
||||||
|
|
||||||
|
package net.i2p.desktopgui.gui;
|
||||||
|
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import java.awt.Point;
|
||||||
|
import java.util.Properties;
|
||||||
|
import javax.swing.JComboBox;
|
||||||
|
import javax.swing.JTextField;
|
||||||
|
import net.i2p.desktopgui.persistence.PropertyManager;
|
||||||
|
import net.i2p.desktopgui.router.configuration.SpeedHandler;
|
||||||
|
import net.i2p.desktopgui.router.configuration.SpeedHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author mathias
|
||||||
|
*/
|
||||||
|
public class SpeedSelector3 extends javax.swing.JFrame {
|
||||||
|
Properties props;
|
||||||
|
|
||||||
|
/** Creates new form ProfileSelector3 */
|
||||||
|
public SpeedSelector3(Point point, Dimension dimension) {
|
||||||
|
this.props = PropertyManager.getProps();
|
||||||
|
initComponents();
|
||||||
|
this.setLocation(point);
|
||||||
|
this.setSize(dimension);
|
||||||
|
initSpeeds();
|
||||||
|
initUsage();
|
||||||
|
this.setVisible(true);
|
||||||
|
this.requestFocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 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() {
|
||||||
|
|
||||||
|
finishButton = new javax.swing.JButton();
|
||||||
|
previousButton = new javax.swing.JButton();
|
||||||
|
settingsInfo = new javax.swing.JLabel();
|
||||||
|
uploadLabel = new javax.swing.JLabel();
|
||||||
|
downloadLabel = new javax.swing.JLabel();
|
||||||
|
uploadBurstLabel = new javax.swing.JLabel();
|
||||||
|
downloadBurstLabel = new javax.swing.JLabel();
|
||||||
|
uploadUsageLabel = new javax.swing.JLabel();
|
||||||
|
downloadUsageLabel = new javax.swing.JLabel();
|
||||||
|
uploadField = new javax.swing.JTextField();
|
||||||
|
uploadBurstField = new javax.swing.JTextField();
|
||||||
|
downloadField = new javax.swing.JTextField();
|
||||||
|
downloadBurstField = new javax.swing.JTextField();
|
||||||
|
kbpsBurstDownload = new javax.swing.JComboBox();
|
||||||
|
kbpsUpload = new javax.swing.JComboBox();
|
||||||
|
kbpsBurstUpload = new javax.swing.JComboBox();
|
||||||
|
kbpsDownload = new javax.swing.JComboBox();
|
||||||
|
uploadGB = new javax.swing.JLabel();
|
||||||
|
uploadMonth = new javax.swing.JTextField();
|
||||||
|
downloadMonth = new javax.swing.JTextField();
|
||||||
|
downloadGB = new javax.swing.JLabel();
|
||||||
|
explanation = new javax.swing.JLabel();
|
||||||
|
|
||||||
|
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(SpeedSelector3.class);
|
||||||
|
setTitle(resourceMap.getString("Form.title")); // NOI18N
|
||||||
|
setMinimumSize(new java.awt.Dimension(670, 330));
|
||||||
|
setName("Form"); // NOI18N
|
||||||
|
setResizable(false);
|
||||||
|
getContentPane().setLayout(null);
|
||||||
|
|
||||||
|
finishButton.setText(resourceMap.getString("finishButton.text")); // NOI18N
|
||||||
|
finishButton.setName("finishButton"); // NOI18N
|
||||||
|
finishButton.addMouseListener(new java.awt.event.MouseAdapter() {
|
||||||
|
public void mouseClicked(java.awt.event.MouseEvent evt) {
|
||||||
|
finishButtonMouseClicked(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
getContentPane().add(finishButton);
|
||||||
|
finishButton.setBounds(440, 250, 90, 29);
|
||||||
|
|
||||||
|
previousButton.setText(resourceMap.getString("previousButton.text")); // NOI18N
|
||||||
|
previousButton.setName("previousButton"); // NOI18N
|
||||||
|
previousButton.addMouseListener(new java.awt.event.MouseAdapter() {
|
||||||
|
public void mouseClicked(java.awt.event.MouseEvent evt) {
|
||||||
|
previousButtonMouseClicked(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
getContentPane().add(previousButton);
|
||||||
|
previousButton.setBounds(336, 250, 90, 29);
|
||||||
|
|
||||||
|
settingsInfo.setText(resourceMap.getString("settingsInfo.text")); // NOI18N
|
||||||
|
settingsInfo.setName("settingsInfo"); // NOI18N
|
||||||
|
getContentPane().add(settingsInfo);
|
||||||
|
settingsInfo.setBounds(20, 30, 532, 17);
|
||||||
|
|
||||||
|
uploadLabel.setText(resourceMap.getString("uploadLabel.text")); // NOI18N
|
||||||
|
uploadLabel.setName("uploadLabel"); // NOI18N
|
||||||
|
getContentPane().add(uploadLabel);
|
||||||
|
uploadLabel.setBounds(20, 70, 140, 30);
|
||||||
|
|
||||||
|
downloadLabel.setText(resourceMap.getString("downloadLabel.text")); // NOI18N
|
||||||
|
downloadLabel.setName("downloadLabel"); // NOI18N
|
||||||
|
getContentPane().add(downloadLabel);
|
||||||
|
downloadLabel.setBounds(340, 70, 160, 30);
|
||||||
|
|
||||||
|
uploadBurstLabel.setText(resourceMap.getString("uploadBurstLabel.text")); // NOI18N
|
||||||
|
uploadBurstLabel.setName("uploadBurstLabel"); // NOI18N
|
||||||
|
getContentPane().add(uploadBurstLabel);
|
||||||
|
uploadBurstLabel.setBounds(20, 110, 140, 30);
|
||||||
|
|
||||||
|
downloadBurstLabel.setText(resourceMap.getString("downloadBurstLabel.text")); // NOI18N
|
||||||
|
downloadBurstLabel.setName("downloadBurstLabel"); // NOI18N
|
||||||
|
getContentPane().add(downloadBurstLabel);
|
||||||
|
downloadBurstLabel.setBounds(340, 110, 160, 30);
|
||||||
|
|
||||||
|
uploadUsageLabel.setText(resourceMap.getString("uploadUsageLabel.text")); // NOI18N
|
||||||
|
uploadUsageLabel.setName("uploadUsageLabel"); // NOI18N
|
||||||
|
getContentPane().add(uploadUsageLabel);
|
||||||
|
uploadUsageLabel.setBounds(20, 150, 140, 30);
|
||||||
|
|
||||||
|
downloadUsageLabel.setText(resourceMap.getString("downloadUsageLabel.text")); // NOI18N
|
||||||
|
downloadUsageLabel.setName("downloadUsageLabel"); // NOI18N
|
||||||
|
getContentPane().add(downloadUsageLabel);
|
||||||
|
downloadUsageLabel.setBounds(340, 150, 160, 30);
|
||||||
|
|
||||||
|
uploadField.setText(resourceMap.getString("uploadField.text")); // NOI18N
|
||||||
|
uploadField.setMinimumSize(new java.awt.Dimension(77, 27));
|
||||||
|
uploadField.setName("uploadField"); // NOI18N
|
||||||
|
uploadField.addKeyListener(new java.awt.event.KeyAdapter() {
|
||||||
|
public void keyReleased(java.awt.event.KeyEvent evt) {
|
||||||
|
speedFieldKeyReleased(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
getContentPane().add(uploadField);
|
||||||
|
uploadField.setBounds(160, 70, 77, 27);
|
||||||
|
|
||||||
|
uploadBurstField.setText(resourceMap.getString("uploadBurstField.text")); // NOI18N
|
||||||
|
uploadBurstField.setMinimumSize(new java.awt.Dimension(77, 27));
|
||||||
|
uploadBurstField.setName("uploadBurstField"); // NOI18N
|
||||||
|
getContentPane().add(uploadBurstField);
|
||||||
|
uploadBurstField.setBounds(160, 110, 77, 27);
|
||||||
|
|
||||||
|
downloadField.setText(resourceMap.getString("downloadField.text")); // NOI18N
|
||||||
|
downloadField.setMinimumSize(new java.awt.Dimension(77, 27));
|
||||||
|
downloadField.setName("downloadField"); // NOI18N
|
||||||
|
downloadField.addKeyListener(new java.awt.event.KeyAdapter() {
|
||||||
|
public void keyReleased(java.awt.event.KeyEvent evt) {
|
||||||
|
speedFieldKeyReleased(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
getContentPane().add(downloadField);
|
||||||
|
downloadField.setBounds(500, 70, 77, 27);
|
||||||
|
|
||||||
|
downloadBurstField.setText(resourceMap.getString("downloadBurstField.text")); // NOI18N
|
||||||
|
downloadBurstField.setMinimumSize(new java.awt.Dimension(77, 27));
|
||||||
|
downloadBurstField.setName("downloadBurstField"); // NOI18N
|
||||||
|
getContentPane().add(downloadBurstField);
|
||||||
|
downloadBurstField.setBounds(500, 110, 77, 27);
|
||||||
|
|
||||||
|
kbpsBurstDownload.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" }));
|
||||||
|
kbpsBurstDownload.setName("kbpsBurstDownload"); // NOI18N
|
||||||
|
kbpsBurstDownload.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
kbpsBurstDownloadActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
getContentPane().add(kbpsBurstDownload);
|
||||||
|
kbpsBurstDownload.setBounds(580, 110, 68, 27);
|
||||||
|
|
||||||
|
kbpsUpload.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" }));
|
||||||
|
kbpsUpload.setName("kbpsUpload"); // NOI18N
|
||||||
|
kbpsUpload.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
kbpsUploadActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
getContentPane().add(kbpsUpload);
|
||||||
|
kbpsUpload.setBounds(240, 70, 68, 27);
|
||||||
|
|
||||||
|
kbpsBurstUpload.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" }));
|
||||||
|
kbpsBurstUpload.setName("kbpsBurstUpload"); // NOI18N
|
||||||
|
kbpsBurstUpload.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
kbpsBurstUploadActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
getContentPane().add(kbpsBurstUpload);
|
||||||
|
kbpsBurstUpload.setBounds(240, 110, 68, 27);
|
||||||
|
|
||||||
|
kbpsDownload.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" }));
|
||||||
|
kbpsDownload.setName("kbpsDownload"); // NOI18N
|
||||||
|
kbpsDownload.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
kbpsDownloadActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
getContentPane().add(kbpsDownload);
|
||||||
|
kbpsDownload.setBounds(580, 70, 68, 27);
|
||||||
|
|
||||||
|
uploadGB.setText(resourceMap.getString("uploadUsageLabel.text")); // NOI18N
|
||||||
|
uploadGB.setName("uploadUsageLabel"); // NOI18N
|
||||||
|
getContentPane().add(uploadGB);
|
||||||
|
uploadGB.setBounds(240, 150, 45, 30);
|
||||||
|
|
||||||
|
uploadMonth.setText(resourceMap.getString("uploadMonth.text")); // NOI18N
|
||||||
|
uploadMonth.setName("uploadMonth"); // NOI18N
|
||||||
|
uploadMonth.addKeyListener(new java.awt.event.KeyAdapter() {
|
||||||
|
public void keyReleased(java.awt.event.KeyEvent evt) {
|
||||||
|
monthKeyReleased(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
getContentPane().add(uploadMonth);
|
||||||
|
uploadMonth.setBounds(160, 150, 77, 27);
|
||||||
|
|
||||||
|
downloadMonth.setText(resourceMap.getString("downloadMonth.text")); // NOI18N
|
||||||
|
downloadMonth.setName("downloadMonth"); // NOI18N
|
||||||
|
downloadMonth.addKeyListener(new java.awt.event.KeyAdapter() {
|
||||||
|
public void keyReleased(java.awt.event.KeyEvent evt) {
|
||||||
|
monthKeyReleased(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
getContentPane().add(downloadMonth);
|
||||||
|
downloadMonth.setBounds(500, 150, 77, 27);
|
||||||
|
|
||||||
|
downloadGB.setText(resourceMap.getString("downloadUsageLabel.text")); // NOI18N
|
||||||
|
downloadGB.setName("downloadUsageLabel"); // NOI18N
|
||||||
|
getContentPane().add(downloadGB);
|
||||||
|
downloadGB.setBounds(580, 150, 40, 30);
|
||||||
|
|
||||||
|
explanation.setText(resourceMap.getString("explanation.text")); // NOI18N
|
||||||
|
explanation.setName("explanation"); // NOI18N
|
||||||
|
getContentPane().add(explanation);
|
||||||
|
explanation.setBounds(20, 180, 600, 70);
|
||||||
|
|
||||||
|
pack();
|
||||||
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
|
private void previousButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_previousButtonMouseClicked
|
||||||
|
saveSpeeds();
|
||||||
|
PropertyManager.saveProps(props);
|
||||||
|
new SpeedSelector2(this.getLocationOnScreen());
|
||||||
|
this.dispose();
|
||||||
|
}//GEN-LAST:event_previousButtonMouseClicked
|
||||||
|
|
||||||
|
private void finishButtonMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_finishButtonMouseClicked
|
||||||
|
saveSpeeds();
|
||||||
|
PropertyManager.saveProps(props);
|
||||||
|
|
||||||
|
int maxDownload = Integer.parseInt(props.getProperty(SpeedSelectorConstants.MAXDOWNLOAD));
|
||||||
|
int maxUpload = Integer.parseInt(props.getProperty(SpeedSelectorConstants.MAXUPLOAD));
|
||||||
|
int maxUploadBurst = Integer.parseInt(props.getProperty(SpeedSelectorConstants.MAXUPLOADBURST));
|
||||||
|
int maxDownloadBurst = Integer.parseInt(props.getProperty(SpeedSelectorConstants.MAXDOWNLOADBURST));
|
||||||
|
|
||||||
|
//Working in kB, not kb!
|
||||||
|
SpeedHandler.setInboundBandwidth(maxDownload/8);
|
||||||
|
SpeedHandler.setOutboundBandwidth(maxUpload/8);
|
||||||
|
SpeedHandler.setInboundBurstBandwidth(maxDownloadBurst/8);
|
||||||
|
SpeedHandler.setOutboundBurstBandwidth(maxUploadBurst/8);
|
||||||
|
|
||||||
|
this.dispose();
|
||||||
|
}//GEN-LAST:event_finishButtonMouseClicked
|
||||||
|
|
||||||
|
private void speedFieldKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_speedFieldKeyReleased
|
||||||
|
try {
|
||||||
|
String upload = "";
|
||||||
|
if(kbpsUpload.getSelectedIndex() == KILOBIT)
|
||||||
|
upload = uploadField.getText();
|
||||||
|
else
|
||||||
|
upload = "" + Integer.parseInt(uploadField.getText())*8;
|
||||||
|
String download = "";
|
||||||
|
if(kbpsDownload.getSelectedIndex() == KILOBIT)
|
||||||
|
download = downloadField.getText();
|
||||||
|
else
|
||||||
|
download = "" + Integer.parseInt(downloadField.getText())*8;
|
||||||
|
initUsage(upload, download);
|
||||||
|
}
|
||||||
|
catch(NumberFormatException e) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}//GEN-LAST:event_speedFieldKeyReleased
|
||||||
|
|
||||||
|
private void kbpsUploadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_kbpsUploadActionPerformed
|
||||||
|
kbpsSwitchPerformed(kbpsUpload, uploadField);
|
||||||
|
}//GEN-LAST:event_kbpsUploadActionPerformed
|
||||||
|
|
||||||
|
private void kbpsBurstUploadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_kbpsBurstUploadActionPerformed
|
||||||
|
kbpsSwitchPerformed(kbpsBurstUpload, uploadBurstField);
|
||||||
|
}//GEN-LAST:event_kbpsBurstUploadActionPerformed
|
||||||
|
|
||||||
|
private void kbpsDownloadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_kbpsDownloadActionPerformed
|
||||||
|
kbpsSwitchPerformed(kbpsDownload, downloadField);
|
||||||
|
}//GEN-LAST:event_kbpsDownloadActionPerformed
|
||||||
|
|
||||||
|
private void kbpsBurstDownloadActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_kbpsBurstDownloadActionPerformed
|
||||||
|
kbpsSwitchPerformed(kbpsBurstDownload, downloadBurstField);
|
||||||
|
}//GEN-LAST:event_kbpsBurstDownloadActionPerformed
|
||||||
|
|
||||||
|
private void monthKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_monthKeyReleased
|
||||||
|
try {
|
||||||
|
int uploadMonthValue = Integer.parseInt(uploadMonth.getText());
|
||||||
|
int downloadMonthValue = Integer.parseInt(downloadMonth.getText());
|
||||||
|
|
||||||
|
String upload = "";
|
||||||
|
String burstUpload = "";
|
||||||
|
String download = "";
|
||||||
|
String burstDownload = "";
|
||||||
|
|
||||||
|
if(kbpsUpload.getSelectedIndex() == KILOBIT)
|
||||||
|
upload = "" + SpeedHelper.calculateSpeed(uploadMonthValue)*8; //kbit
|
||||||
|
else
|
||||||
|
upload = "" + SpeedHelper.calculateSpeed(uploadMonthValue); //kbyte
|
||||||
|
|
||||||
|
if(kbpsBurstUpload.getSelectedIndex() == KILOBIT)
|
||||||
|
burstUpload = "" + SpeedHelper.calculateSpeed(uploadMonthValue)*8; //kbit
|
||||||
|
else
|
||||||
|
burstUpload = "" + SpeedHelper.calculateSpeed(uploadMonthValue); //kbyte
|
||||||
|
|
||||||
|
if(kbpsDownload.getSelectedIndex() == KILOBIT)
|
||||||
|
download = "" + SpeedHelper.calculateSpeed(downloadMonthValue)*8; //kbit
|
||||||
|
else
|
||||||
|
download = "" + SpeedHelper.calculateSpeed(downloadMonthValue); //kbyte
|
||||||
|
|
||||||
|
if(kbpsBurstDownload.getSelectedIndex() == KILOBIT)
|
||||||
|
burstDownload = "" + SpeedHelper.calculateSpeed(downloadMonthValue)*8; //kbit
|
||||||
|
else
|
||||||
|
burstDownload = "" + SpeedHelper.calculateSpeed(downloadMonthValue); //kbyte
|
||||||
|
|
||||||
|
initSpeeds(upload, burstUpload, download, burstDownload);
|
||||||
|
}
|
||||||
|
catch(NumberFormatException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}//GEN-LAST:event_monthKeyReleased
|
||||||
|
|
||||||
|
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 initSpeeds() {
|
||||||
|
String up = "" + SpeedHelper.calculateSpeed(
|
||||||
|
props.getProperty(SpeedSelectorConstants.MAXUPLOADCAPABLE), props.getProperty(SpeedSelectorConstants.USERTYPE));
|
||||||
|
String upBurst = "" + SpeedHelper.calculateSpeed(
|
||||||
|
props.getProperty(SpeedSelectorConstants.MAXUPLOADCAPABLE), props.getProperty(SpeedSelectorConstants.USERTYPE));
|
||||||
|
String down = "" + SpeedHelper.calculateSpeed(
|
||||||
|
props.getProperty(SpeedSelectorConstants.MAXDOWNLOADCAPABLE), props.getProperty(SpeedSelectorConstants.USERTYPE));
|
||||||
|
String downBurst = "" + SpeedHelper.calculateSpeed(
|
||||||
|
props.getProperty(SpeedSelectorConstants.MAXDOWNLOADCAPABLE), props.getProperty(SpeedSelectorConstants.USERTYPE));
|
||||||
|
String userType = props.getProperty(SpeedSelectorConstants.USERTYPE);
|
||||||
|
|
||||||
|
initSpeeds(up, upBurst, down, downBurst);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void initSpeeds(String up, String upBurst, String down, String downBurst) {
|
||||||
|
uploadField.setText(up);
|
||||||
|
uploadBurstField.setText(upBurst);
|
||||||
|
downloadField.setText(down);
|
||||||
|
downloadBurstField.setText(downBurst);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void saveSpeeds() {
|
||||||
|
if(kbpsUpload.getSelectedIndex() == KILOBIT)
|
||||||
|
props.setProperty(SpeedSelectorConstants.MAXUPLOAD, uploadField.getText());
|
||||||
|
else
|
||||||
|
props.setProperty(SpeedSelectorConstants.MAXUPLOAD, "" + Integer.parseInt(uploadField.getText())*8);
|
||||||
|
if(kbpsBurstUpload.getSelectedIndex() == KILOBIT)
|
||||||
|
props.setProperty(SpeedSelectorConstants.MAXUPLOADBURST, uploadBurstField.getText());
|
||||||
|
else
|
||||||
|
props.setProperty(SpeedSelectorConstants.MAXUPLOADBURST, "" + Integer.parseInt(uploadBurstField.getText())*8);
|
||||||
|
if(kbpsDownload.getSelectedIndex() == KILOBIT)
|
||||||
|
props.setProperty(SpeedSelectorConstants.MAXDOWNLOAD, downloadField.getText());
|
||||||
|
else
|
||||||
|
props.setProperty(SpeedSelectorConstants.MAXDOWNLOAD, "" + Integer.parseInt(downloadField.getText())*8);
|
||||||
|
if(kbpsBurstDownload.getSelectedIndex() == KILOBIT)
|
||||||
|
props.setProperty(SpeedSelectorConstants.MAXDOWNLOADBURST, downloadBurstField.getText());
|
||||||
|
else
|
||||||
|
props.setProperty(SpeedSelectorConstants.MAXDOWNLOADBURST, "" + Integer.parseInt(downloadBurstField.getText())*8);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void initUsage(String upload, String download) {
|
||||||
|
uploadMonth.setText("" + SpeedHelper.calculateMonthlyUsage(Integer.parseInt(upload)/8));
|
||||||
|
downloadMonth.setText("" + SpeedHelper.calculateMonthlyUsage(Integer.parseInt(download)/8));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void initUsage() {
|
||||||
|
String upload = "";
|
||||||
|
if(kbpsUpload.getSelectedIndex() == KILOBIT)
|
||||||
|
upload = uploadField.getText();
|
||||||
|
else
|
||||||
|
upload = "" + Integer.parseInt(uploadField.getText())/8;
|
||||||
|
String download = "";
|
||||||
|
if(kbpsDownload.getSelectedIndex() == KILOBIT)
|
||||||
|
download = downloadField.getText();
|
||||||
|
else
|
||||||
|
download = "" + Integer.parseInt(downloadField.getText())/8;
|
||||||
|
initUsage(upload, download);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
|
private javax.swing.JTextField downloadBurstField;
|
||||||
|
private javax.swing.JLabel downloadBurstLabel;
|
||||||
|
private javax.swing.JTextField downloadField;
|
||||||
|
private javax.swing.JLabel downloadGB;
|
||||||
|
private javax.swing.JLabel downloadLabel;
|
||||||
|
private javax.swing.JTextField downloadMonth;
|
||||||
|
private javax.swing.JLabel downloadUsageLabel;
|
||||||
|
private javax.swing.JLabel explanation;
|
||||||
|
private javax.swing.JButton finishButton;
|
||||||
|
private javax.swing.JComboBox kbpsBurstDownload;
|
||||||
|
private javax.swing.JComboBox kbpsBurstUpload;
|
||||||
|
private javax.swing.JComboBox kbpsDownload;
|
||||||
|
private javax.swing.JComboBox kbpsUpload;
|
||||||
|
private javax.swing.JButton previousButton;
|
||||||
|
private javax.swing.JLabel settingsInfo;
|
||||||
|
private javax.swing.JTextField uploadBurstField;
|
||||||
|
private javax.swing.JLabel uploadBurstLabel;
|
||||||
|
private javax.swing.JTextField uploadField;
|
||||||
|
private javax.swing.JLabel uploadGB;
|
||||||
|
private javax.swing.JLabel uploadLabel;
|
||||||
|
private javax.swing.JTextField uploadMonth;
|
||||||
|
private javax.swing.JLabel uploadUsageLabel;
|
||||||
|
// End of variables declaration//GEN-END:variables
|
||||||
|
|
||||||
|
private static final int KILOBIT = 0;
|
||||||
|
private static final int KILOBYTE = 1;
|
||||||
|
}
|
@ -0,0 +1,25 @@
|
|||||||
|
package net.i2p.desktopgui.gui;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author mathias
|
||||||
|
*/
|
||||||
|
public class SpeedSelectorConstants {
|
||||||
|
///Maximum upload speed for the internet connection
|
||||||
|
public static final String MAXUPLOADCAPABLE = "maxUploadCapable";
|
||||||
|
///Maximum download speed for the internet connection
|
||||||
|
public static final String MAXDOWNLOADCAPABLE = "maxDownloadCapable";
|
||||||
|
|
||||||
|
//User profile type: what behaviour does this user have while using IP2?
|
||||||
|
public static final String USERTYPE = "userType";
|
||||||
|
|
||||||
|
//Maximum upload speed for I2P
|
||||||
|
public static final String MAXUPLOAD = "maxUpload";
|
||||||
|
//Maximum upload burst speed for I2P
|
||||||
|
public static final String MAXUPLOADBURST = "maxUploadBurst";
|
||||||
|
|
||||||
|
//Maximum download speed for I2P
|
||||||
|
public static final String MAXDOWNLOAD = "maxDownload";
|
||||||
|
//Maximum download burst speed for I2P
|
||||||
|
public static final String MAXDOWNLOADBURST = "maxDownloadBurst";
|
||||||
|
}
|
228
apps/desktopgui/src/net/i2p/desktopgui/gui/Tray.java
Normal file
228
apps/desktopgui/src/net/i2p/desktopgui/gui/Tray.java
Normal file
@ -0,0 +1,228 @@
|
|||||||
|
/*
|
||||||
|
* To change this template, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package net.i2p.desktopgui.gui;
|
||||||
|
|
||||||
|
import net.i2p.desktopgui.desktopgui.*;
|
||||||
|
import java.awt.AWTException;
|
||||||
|
import java.awt.Desktop;
|
||||||
|
import java.awt.Image;
|
||||||
|
import java.awt.SystemTray;
|
||||||
|
import java.awt.Toolkit;
|
||||||
|
import java.awt.TrayIcon;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
import javax.swing.JMenu;
|
||||||
|
import javax.swing.JMenuItem;
|
||||||
|
import javax.swing.JPopupMenu;
|
||||||
|
import net.i2p.desktopgui.router.RouterHandler;
|
||||||
|
import net.i2p.desktopgui.router.RouterHelper;
|
||||||
|
import net.i2p.desktopgui.router.configuration.PeerHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author mathias
|
||||||
|
*/
|
||||||
|
public class Tray {
|
||||||
|
|
||||||
|
public Tray() {
|
||||||
|
tray = SystemTray.getSystemTray();
|
||||||
|
loadSystemTray();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void loadSystemTray() {
|
||||||
|
|
||||||
|
Image image = Toolkit.getDefaultToolkit().getImage("desktopgui/resources/logo/logo.jpg");
|
||||||
|
|
||||||
|
final JPopupMenu popup = new JPopupMenu();
|
||||||
|
|
||||||
|
//Create menu items to put in the popup menu
|
||||||
|
JMenuItem browserLauncher = new JMenuItem("Launch browser");
|
||||||
|
browserLauncher.addActionListener(new ActionListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent arg0) {
|
||||||
|
if(Desktop.isDesktopSupported()) {
|
||||||
|
Desktop desktop = Desktop.getDesktop();
|
||||||
|
try {
|
||||||
|
if(desktop.isSupported(Desktop.Action.BROWSE)) {
|
||||||
|
desktop.browse(new URI("http://localhost:7657"));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
trayIcon.displayMessage("Browser not found", "The default browser for your system was not found.", TrayIcon.MessageType.WARNING);
|
||||||
|
}
|
||||||
|
} catch (URISyntaxException ex) {
|
||||||
|
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
|
||||||
|
} catch(IOException ex) {
|
||||||
|
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
JMenuItem howto = new JMenuItem("How to use I2P");
|
||||||
|
howto.addActionListener(new ActionListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent arg0) {
|
||||||
|
if(Desktop.isDesktopSupported()) {
|
||||||
|
Desktop desktop = Desktop.getDesktop();
|
||||||
|
try {
|
||||||
|
File f = new File("desktopgui/resources/howto/howto.html");
|
||||||
|
System.out.println(new URI(null, null, null, 0, "file://" + f.getAbsolutePath(), null, null));
|
||||||
|
desktop.browse(new URI(null, null, null, 0, "file://" + f.getAbsolutePath(), null, null));
|
||||||
|
//desktop.browse(new URI("file://" + f.getAbsolutePath()));
|
||||||
|
} catch (URISyntaxException ex) {
|
||||||
|
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
|
||||||
|
} catch(IOException ex) {
|
||||||
|
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
JMenu config = new JMenu("Configuration");
|
||||||
|
JMenuItem speedConfig = new JMenuItem("Speed");
|
||||||
|
speedConfig.addActionListener(new ActionListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent arg0) {
|
||||||
|
(new SpeedSelector()).setVisible(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
JMenuItem generalConfig = new JMenuItem("General Configuration");
|
||||||
|
generalConfig.addActionListener(new ActionListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent arg0) {
|
||||||
|
new GeneralConfiguration();
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
JMenuItem advancedConfig = new JMenuItem("Advanced Configuration");
|
||||||
|
advancedConfig.addActionListener(new ActionListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent arg0) {
|
||||||
|
if(Desktop.isDesktopSupported()) {
|
||||||
|
Desktop desktop = Desktop.getDesktop();
|
||||||
|
try {
|
||||||
|
desktop.browse(new URI("http://localhost:7657/config.jsp"));
|
||||||
|
} catch (URISyntaxException ex) {
|
||||||
|
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
|
||||||
|
} catch(IOException ex) {
|
||||||
|
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
JMenuItem viewLog = new JMenuItem("View log");
|
||||||
|
viewLog.addActionListener(new ActionListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent arg0) {
|
||||||
|
new LogViewer();
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
JMenuItem version = new JMenuItem("Version");
|
||||||
|
version.addActionListener(new ActionListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent arg0) {
|
||||||
|
new Version();
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
JMenuItem shutdown = new JMenuItem("Shutdown I2P");
|
||||||
|
shutdown.addActionListener(new ActionListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent arg0) {
|
||||||
|
RouterHandler.setStatus(RouterHandler.SHUTDOWN_GRACEFULLY);
|
||||||
|
long shutdownTime = RouterHelper.getGracefulShutdownTimeRemaining();
|
||||||
|
System.out.println("Shutdowntime remaining: " + shutdownTime);
|
||||||
|
if(shutdownTime>0) {
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
trayIcon.displayMessage("Shutting down...", "Shutting down immediately.", TrayIcon.MessageType.INFO);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
//Add menu items to popup menu
|
||||||
|
popup.add(browserLauncher);
|
||||||
|
popup.add(howto);
|
||||||
|
|
||||||
|
popup.addSeparator();
|
||||||
|
|
||||||
|
config.add(speedConfig);
|
||||||
|
config.add(generalConfig);
|
||||||
|
config.add(advancedConfig);
|
||||||
|
popup.add(config);
|
||||||
|
|
||||||
|
popup.addSeparator();
|
||||||
|
|
||||||
|
popup.add(viewLog);
|
||||||
|
popup.add(version);
|
||||||
|
|
||||||
|
popup.addSeparator();
|
||||||
|
|
||||||
|
popup.add(shutdown);
|
||||||
|
|
||||||
|
//Add tray icon
|
||||||
|
trayIcon = new JPopupTrayIcon(image, "I2P: the anonymous network", popup);
|
||||||
|
|
||||||
|
try {
|
||||||
|
tray.add(trayIcon);
|
||||||
|
} catch (AWTException ex) {
|
||||||
|
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
PeerHelper.addReachabilityListener(new ActionListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent arg0) {
|
||||||
|
updateTooltip();
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
PeerHelper.addActivePeerListener(new ActionListener() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void actionPerformed(ActionEvent arg0) {
|
||||||
|
updateTooltip();
|
||||||
|
int activePeers = PeerHelper.getActivePeers();
|
||||||
|
if(activePeers == 0)
|
||||||
|
trayIcon.setImage(Toolkit.getDefaultToolkit().getImage("desktopgui/resources/logo/logo_red.jpg"));
|
||||||
|
else if(activePeers < 10)
|
||||||
|
trayIcon.setImage(Toolkit.getDefaultToolkit().getImage("desktopgui/resources/logo/logo_orange.jpg"));
|
||||||
|
else
|
||||||
|
trayIcon.setImage(Toolkit.getDefaultToolkit().getImage("desktopgui/resources/logo/logo_green.jpg"));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateTooltip() {
|
||||||
|
trayIcon.setToolTip("I2P Network status: " + PeerHelper.getReachability() + " / " + "Active Peers: " + PeerHelper.getActivePeers());
|
||||||
|
}
|
||||||
|
|
||||||
|
private SystemTray tray = null;
|
||||||
|
private JPopupTrayIcon trayIcon = null;
|
||||||
|
|
||||||
|
}
|
102
apps/desktopgui/src/net/i2p/desktopgui/gui/Version.form
Normal file
102
apps/desktopgui/src/net/i2p/desktopgui/gui/Version.form
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
|
||||||
|
<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
|
||||||
|
<Properties>
|
||||||
|
<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"/>
|
||||||
|
</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"/>
|
||||||
|
</AuxValues>
|
||||||
|
|
||||||
|
<Layout>
|
||||||
|
<DimensionLayout dim="0">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" attributes="0">
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" alignment="0" 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>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
<DimensionLayout dim="1">
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Group type="102" alignment="0" attributes="0">
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Component id="I2Plabel" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="I2PVersion" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
<Group type="103" groupAlignment="0" attributes="0">
|
||||||
|
<Component id="GUILabel" min="-2" max="-2" attributes="0"/>
|
||||||
|
<Component id="GUIVersion" min="-2" max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
<EmptySpace max="32767" attributes="0"/>
|
||||||
|
<Component id="okButton" min="-2" max="-2" attributes="0"/>
|
||||||
|
<EmptySpace max="-2" attributes="0"/>
|
||||||
|
</Group>
|
||||||
|
</Group>
|
||||||
|
</DimensionLayout>
|
||||||
|
</Layout>
|
||||||
|
<SubComponents>
|
||||||
|
<Component class="javax.swing.JButton" name="okButton">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="okButton.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="okButton" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
<Events>
|
||||||
|
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="okButtonActionPerformed"/>
|
||||||
|
</Events>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="I2Plabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="I2Plabel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="I2Plabel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="GUILabel">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="GUILabel.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="GUILabel" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="I2PVersion">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="I2PVersion.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="I2PVersion" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
<Component class="javax.swing.JLabel" name="GUIVersion">
|
||||||
|
<Properties>
|
||||||
|
<Property name="text" type="java.lang.String" resourceKey="GUIVersion.text"/>
|
||||||
|
<Property name="name" type="java.lang.String" value="GUIVersion" noResource="true"/>
|
||||||
|
</Properties>
|
||||||
|
</Component>
|
||||||
|
</SubComponents>
|
||||||
|
</Form>
|
123
apps/desktopgui/src/net/i2p/desktopgui/gui/Version.java
Normal file
123
apps/desktopgui/src/net/i2p/desktopgui/gui/Version.java
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
/*
|
||||||
|
* Version.java
|
||||||
|
*
|
||||||
|
* Created on 13 april 2009, 13:48
|
||||||
|
*/
|
||||||
|
|
||||||
|
package net.i2p.desktopgui.gui;
|
||||||
|
|
||||||
|
import javax.swing.JFrame;
|
||||||
|
import net.i2p.desktopgui.router.RouterHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author mathias
|
||||||
|
*/
|
||||||
|
public class Version extends javax.swing.JDialog {
|
||||||
|
|
||||||
|
public Version() {
|
||||||
|
this(new JFrame(), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private Version(java.awt.Frame parent, boolean modal) {
|
||||||
|
super(parent, modal);
|
||||||
|
initComponents();
|
||||||
|
String i2pVersion = RouterHelper.getVersion();
|
||||||
|
String guiVersion = net.i2p.desktopgui.desktopgui.GUIVersion.VERSION;
|
||||||
|
this.I2PVersion.setText("<html><h1>" + i2pVersion + "</h1></html>");
|
||||||
|
this.GUIVersion.setText("<html><h1>" + guiVersion + "</h1></html>");
|
||||||
|
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() {
|
||||||
|
|
||||||
|
okButton = new javax.swing.JButton();
|
||||||
|
I2Plabel = new javax.swing.JLabel();
|
||||||
|
GUILabel = new javax.swing.JLabel();
|
||||||
|
I2PVersion = new javax.swing.JLabel();
|
||||||
|
GUIVersion = new javax.swing.JLabel();
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
okButton.setText(resourceMap.getString("okButton.text")); // NOI18N
|
||||||
|
okButton.setName("okButton"); // NOI18N
|
||||||
|
okButton.addActionListener(new java.awt.event.ActionListener() {
|
||||||
|
public void actionPerformed(java.awt.event.ActionEvent evt) {
|
||||||
|
okButtonActionPerformed(evt);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
I2Plabel.setText(resourceMap.getString("I2Plabel.text")); // NOI18N
|
||||||
|
I2Plabel.setName("I2Plabel"); // NOI18N
|
||||||
|
|
||||||
|
GUILabel.setText(resourceMap.getString("GUILabel.text")); // NOI18N
|
||||||
|
GUILabel.setName("GUILabel"); // NOI18N
|
||||||
|
|
||||||
|
I2PVersion.setText(resourceMap.getString("I2PVersion.text")); // NOI18N
|
||||||
|
I2PVersion.setName("I2PVersion"); // NOI18N
|
||||||
|
|
||||||
|
GUIVersion.setText(resourceMap.getString("GUIVersion.text")); // NOI18N
|
||||||
|
GUIVersion.setName("GUIVersion"); // NOI18N
|
||||||
|
|
||||||
|
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
|
||||||
|
getContentPane().setLayout(layout);
|
||||||
|
layout.setHorizontalGroup(
|
||||||
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addContainerGap()
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.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)
|
||||||
|
.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())
|
||||||
|
);
|
||||||
|
layout.setVerticalGroup(
|
||||||
|
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addGroup(layout.createSequentialGroup()
|
||||||
|
.addContainerGap()
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(I2Plabel)
|
||||||
|
.addComponent(I2PVersion))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||||
|
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||||
|
.addComponent(GUILabel)
|
||||||
|
.addComponent(GUIVersion))
|
||||||
|
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||||
|
.addComponent(okButton)
|
||||||
|
.addContainerGap())
|
||||||
|
);
|
||||||
|
|
||||||
|
pack();
|
||||||
|
}// </editor-fold>//GEN-END:initComponents
|
||||||
|
|
||||||
|
private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed
|
||||||
|
this.dispose();
|
||||||
|
}//GEN-LAST:event_okButtonActionPerformed
|
||||||
|
|
||||||
|
|
||||||
|
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||||
|
private javax.swing.JLabel GUILabel;
|
||||||
|
private javax.swing.JLabel GUIVersion;
|
||||||
|
private javax.swing.JLabel I2PVersion;
|
||||||
|
private javax.swing.JLabel I2Plabel;
|
||||||
|
private javax.swing.JButton okButton;
|
||||||
|
// End of variables declaration//GEN-END:variables
|
||||||
|
|
||||||
|
}
|
@ -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
|
@ -0,0 +1,4 @@
|
|||||||
|
refreshButton.text=Refresh
|
||||||
|
clearButton.text=Clear
|
||||||
|
explanationText.text=Explanation ...
|
||||||
|
Form.title=View Logs
|
@ -0,0 +1 @@
|
|||||||
|
jLabel1.text=Name:
|
@ -0,0 +1,6 @@
|
|||||||
|
|
||||||
|
Form.title=I2P Speed Configuration
|
||||||
|
nextButton.text=Next
|
||||||
|
uploadLabel.text=What is your maximum upload speed?
|
||||||
|
downloadLabel.text=What is your maximum download speed?
|
||||||
|
speedExplanation.text=<html>The maximum speed is set by your provider. It can be given in <b>kilobit (kbps)</b> or <b>kilobyte (kBps)</b>.<br />One kilobyte equals eight kilobit.</html>
|
@ -0,0 +1,9 @@
|
|||||||
|
returnButton.text=Previous
|
||||||
|
Form.title=I2P Speed Configuration
|
||||||
|
questionLabel.text=Which of these descriptions fits you best?
|
||||||
|
browseButton.text=Browsing: I want to use I2P to browse websites anonymously, no heavy usage.
|
||||||
|
downloadButton.text=Downloading: I want to use I2P for downloads and filesharing, heavy usage.
|
||||||
|
nextButton.text=Next
|
||||||
|
browseButton.actionCommand=Browsing
|
||||||
|
downloadButton.actionCommand=Downloading
|
||||||
|
jLabel1.text=<html>I2P can be used for many different purposes. Here, we present two possible descriptions. If you use a lot of bandwidth in I2P (for example using downloading), please check the <b>downloading</b> option. If your bandwidth usage is limited, please check the <b>browsing</b> option.</html>
|
@ -0,0 +1,17 @@
|
|||||||
|
Form.title=I2P Configuration
|
||||||
|
previousButton.text=Previous
|
||||||
|
finishButton.text=Finish
|
||||||
|
uploadLabel.text=Upload Speed:
|
||||||
|
uploadBurstLabel.text=Burst Upload Speed:
|
||||||
|
downloadLabel.text=Download Speed:
|
||||||
|
downloadBurstLabel.text=Burst Download Speed:
|
||||||
|
uploadUsageLabel.text=GB
|
||||||
|
downloadUsageLabel.text=GB
|
||||||
|
uploadField.text=jTextField1
|
||||||
|
uploadBurstField.text=jTextField2
|
||||||
|
downloadField.text=jTextField4
|
||||||
|
downloadBurstField.text=jTextField5
|
||||||
|
uploadMonth.text=jTextField1
|
||||||
|
downloadMonth.text=jTextField2
|
||||||
|
settingsInfo.text=The profile information your entered, indicates that these are your optimal settings:
|
||||||
|
explanation.text=<html>We give a suggested upload and download speed. If your provider imposes a monthly bandwidth limit (usually given in <b>gigabyte (GB)</b>), please enter a value lower than that limit. If you run I2P only 50% of the time, you can double the bandwidth limit to use the same amount as when you are online 100% of the time.</html>
|
@ -0,0 +1,6 @@
|
|||||||
|
okButton.text=OK
|
||||||
|
I2Plabel.text=<html><h1>I2P Version:</h1></html>
|
||||||
|
GUILabel.text=<html><h1>GUI Version:</h1></html>
|
||||||
|
I2PVersion.text=jLabel3
|
||||||
|
GUIVersion.text=jLabel4
|
||||||
|
Form.title=Version
|
@ -0,0 +1,72 @@
|
|||||||
|
package net.i2p.desktopgui.persistence;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Properties;
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author mathias
|
||||||
|
*/
|
||||||
|
public class PropertyManager {
|
||||||
|
|
||||||
|
public static void setProps(Properties props) {
|
||||||
|
PropertyManager.props = props;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Properties getProps() {
|
||||||
|
return props;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Properties loadProps() {
|
||||||
|
Properties defaultProps = new Properties();
|
||||||
|
defaultProps.setProperty("firstLoad", "true");
|
||||||
|
|
||||||
|
// create application properties with default
|
||||||
|
Properties applicationProps = new Properties(defaultProps);
|
||||||
|
|
||||||
|
// now load properties from last invocation
|
||||||
|
FileInputStream in;
|
||||||
|
try {
|
||||||
|
in = new FileInputStream(PROPSLOCATION);
|
||||||
|
applicationProps.load(in);
|
||||||
|
in.close();
|
||||||
|
} catch (FileNotFoundException ex) {
|
||||||
|
//Nothing serious, just means it's being loaded for the first time.
|
||||||
|
} catch(IOException ex) {
|
||||||
|
Logger.getLogger(PropertyManager.class.getName()).log(Level.INFO, null, ex);
|
||||||
|
}
|
||||||
|
props = applicationProps;
|
||||||
|
return applicationProps;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void saveProps(Properties props) {
|
||||||
|
FileOutputStream out;
|
||||||
|
try {
|
||||||
|
File d = new File(PROPSDIRECTORY);
|
||||||
|
if(!d.exists())
|
||||||
|
d.mkdir();
|
||||||
|
File f = new File(PROPSLOCATION);
|
||||||
|
if(!f.exists())
|
||||||
|
f.createNewFile();
|
||||||
|
out = new FileOutputStream(f);
|
||||||
|
props.store(out, PROPSLOCATION);
|
||||||
|
} catch (FileNotFoundException ex) {
|
||||||
|
Logger.getLogger(PropertyManager.class.getName()).log(Level.SEVERE, null, ex);
|
||||||
|
} catch(IOException ex) {
|
||||||
|
Logger.getLogger(PropertyManager.class.getName()).log(Level.SEVERE, null, ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Properties props;
|
||||||
|
|
||||||
|
///Location where we store the Application Properties
|
||||||
|
public static final String PROPSDIRECTORY = "desktopgui";
|
||||||
|
public static final String PROPSFILENAME = "appProperties";
|
||||||
|
public static final String PROPSLOCATION = PROPSDIRECTORY + File.separator + PROPSFILENAME;
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
/*
|
||||||
|
* To change this template, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package net.i2p.desktopgui.router;
|
||||||
|
|
||||||
|
import java.util.logging.Level;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
import net.i2p.router.RouterContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author mathias
|
||||||
|
*/
|
||||||
|
public class RouterHandler {
|
||||||
|
public static final int SHUTDOWN_GRACEFULLY = 0;
|
||||||
|
public static void setStatus(int status) {
|
||||||
|
if(status == SHUTDOWN_GRACEFULLY) {
|
||||||
|
Thread t = new Thread(new Runnable() {
|
||||||
|
|
||||||
|
public void run() {
|
||||||
|
RouterContext context = RouterHelper.getContext();
|
||||||
|
context.router().shutdownGracefully();
|
||||||
|
while(context.router().getShutdownTimeRemaining()>0)
|
||||||
|
try {
|
||||||
|
Thread.sleep(context.router().getShutdownTimeRemaining());
|
||||||
|
} catch (InterruptedException ex) {
|
||||||
|
Logger.getLogger(RouterHandler.class.getName()).log(Level.SEVERE, null, ex);
|
||||||
|
}
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
t.start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
package net.i2p.desktopgui.router;
|
||||||
|
|
||||||
|
import net.i2p.router.RouterContext;
|
||||||
|
import net.i2p.router.RouterVersion;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author mathias
|
||||||
|
*/
|
||||||
|
public class RouterHelper {
|
||||||
|
public static RouterContext getContext() {
|
||||||
|
return (RouterContext) RouterContext.listContexts().get(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static long getGracefulShutdownTimeRemaining() {
|
||||||
|
return RouterHelper.getContext().router().getShutdownTimeRemaining();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getVersion() {
|
||||||
|
return (RouterVersion.VERSION + "-" + RouterVersion.BUILD);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,165 @@
|
|||||||
|
package net.i2p.desktopgui.router.configuration;
|
||||||
|
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Timer;
|
||||||
|
import java.util.TimerTask;
|
||||||
|
import net.i2p.data.RouterAddress;
|
||||||
|
import net.i2p.router.CommSystemFacade;
|
||||||
|
import net.i2p.router.RouterContext;
|
||||||
|
import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade;
|
||||||
|
import net.i2p.router.transport.ntcp.NTCPAddress;
|
||||||
|
import net.i2p.desktopgui.router.RouterHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Part of the code imported and adapted from the I2P Router Console (which is licensed as public domain)
|
||||||
|
*/
|
||||||
|
public class PeerHelper {
|
||||||
|
public static String getReachability() {
|
||||||
|
RouterContext context = RouterHelper.getContext();
|
||||||
|
if (context.router().getUptime() > 60*1000
|
||||||
|
&& (!context.router().gracefulShutdownInProgress())
|
||||||
|
&& !context.clientManager().isAlive())
|
||||||
|
return "ERROR: Client Manager I2CP Error - check logs"; // not a router problem but the user should know
|
||||||
|
if (!context.clock().getUpdatedSuccessfully())
|
||||||
|
return "ERROR: ClockSkew";
|
||||||
|
if (context.router().isHidden())
|
||||||
|
return "Hidden";
|
||||||
|
|
||||||
|
int status = context.commSystem().getReachabilityStatus();
|
||||||
|
switch (status) {
|
||||||
|
case CommSystemFacade.STATUS_OK:
|
||||||
|
RouterAddress ra = context.router().getRouterInfo().getTargetAddress("NTCP");
|
||||||
|
if (ra == null || (new NTCPAddress(ra)).isPubliclyRoutable())
|
||||||
|
return "OK";
|
||||||
|
return "ERROR: Private TCP Address";
|
||||||
|
case CommSystemFacade.STATUS_DIFFERENT:
|
||||||
|
return "ERROR: You are behind a symmetric NAT.";
|
||||||
|
case CommSystemFacade.STATUS_REJECT_UNSOLICITED:
|
||||||
|
if (context.router().getRouterInfo().getTargetAddress("NTCP") != null)
|
||||||
|
return "WARNING: You are behind a firewall and have Inbound TCP Enabled";
|
||||||
|
if (((FloodfillNetworkDatabaseFacade)context.netDb()).floodfillEnabled())
|
||||||
|
return "WARNING: You are behind a firewall and are a floodfill router";
|
||||||
|
if (context.router().getRouterInfo().getCapabilities().indexOf('O') >= 0)
|
||||||
|
return "WARNING: You are behind a firewall and are a fast router";
|
||||||
|
return "Firewalled";
|
||||||
|
case CommSystemFacade.STATUS_HOSED:
|
||||||
|
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
|
||||||
|
default:
|
||||||
|
ra = context.router().getRouterInfo().getTargetAddress("SSU");
|
||||||
|
if (ra == null && context.router().getUptime() > 5*60*1000) {
|
||||||
|
if (context.getProperty(PROP_I2NP_NTCP_HOSTNAME) == null ||
|
||||||
|
context.getProperty(PROP_I2NP_NTCP_PORT) == null)
|
||||||
|
return "ERROR: UDP is disabled and the inbound TCP host/port combination is not set";
|
||||||
|
else
|
||||||
|
return "WARNING: You are behind a firewall and have UDP Disabled";
|
||||||
|
}
|
||||||
|
return "Testing";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* How many peers we are talking to now
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public static int getActivePeers() {
|
||||||
|
RouterContext context = RouterHelper.getContext();
|
||||||
|
if (context == null)
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
return context.commSystem().countActivePeers();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void addActivePeerListener(ActionListener listener) {
|
||||||
|
synchronized(activePeerListeners) {
|
||||||
|
activePeerListeners.add(listener);
|
||||||
|
if(activePeerTimer == null) {
|
||||||
|
activePeerTimer = new Timer();
|
||||||
|
TimerTask t = new TimerTask() {
|
||||||
|
private int activePeers = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
int newActivePeers = getActivePeers();
|
||||||
|
if(!(activePeers == newActivePeers)) {
|
||||||
|
synchronized(activePeerListeners) {
|
||||||
|
for(int i=0; i<activePeerListeners.size(); i++) {
|
||||||
|
activePeerListeners.get(i).actionPerformed(new ActionEvent(this, 0, ""));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
activePeers = newActivePeers;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
activePeerTimer.schedule(t, 0, 60*1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void removeActivePeerListener(ActionListener listener) {
|
||||||
|
synchronized(activePeerListeners) {
|
||||||
|
activePeerListeners.remove(listener);
|
||||||
|
if(activePeerListeners.size() == 0) {
|
||||||
|
activePeerTimer.cancel();
|
||||||
|
activePeerTimer = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public static void addReachabilityListener(ActionListener listener) {
|
||||||
|
synchronized(reachabilityListeners) {
|
||||||
|
reachabilityListeners.add(listener);
|
||||||
|
if(reachabilityTimer == null) {
|
||||||
|
reachabilityTimer = new Timer();
|
||||||
|
TimerTask t = new TimerTask() {
|
||||||
|
|
||||||
|
private String reachability = "";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
String newReachability = getReachability();
|
||||||
|
if(!reachability.equals(newReachability)) {
|
||||||
|
synchronized(reachabilityListeners) {
|
||||||
|
for(int i=0; i<reachabilityListeners.size(); i++) {
|
||||||
|
reachabilityListeners.get(i).actionPerformed(new ActionEvent(this, 0, ""));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
reachability = newReachability;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
reachabilityTimer.schedule(t, 0, 60*1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void removeReachabilityListener(ActionListener listener) {
|
||||||
|
synchronized(reachabilityListeners) {
|
||||||
|
reachabilityListeners.remove(listener);
|
||||||
|
if(reachabilityListeners.size() == 0) {
|
||||||
|
reachabilityTimer.cancel();
|
||||||
|
reachabilityTimer = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<ActionListener> reachabilityListeners = new ArrayList<ActionListener>();
|
||||||
|
private static Timer reachabilityTimer = null;
|
||||||
|
|
||||||
|
private static List<ActionListener> activePeerListeners = new ArrayList<ActionListener>();
|
||||||
|
private static Timer activePeerTimer = null;
|
||||||
|
|
||||||
|
/** copied from various private components */
|
||||||
|
public final static String PROP_I2NP_UDP_PORT = "i2np.udp.port";
|
||||||
|
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_PORT = "i2np.ntcp.port";
|
||||||
|
public final static String PROP_I2NP_NTCP_AUTO_PORT = "i2np.ntcp.autoport";
|
||||||
|
public final static String PROP_I2NP_NTCP_AUTO_IP = "i2np.ntcp.autoip";
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
package net.i2p.desktopgui.router.configuration;
|
||||||
|
|
||||||
|
import net.i2p.router.RouterContext;
|
||||||
|
import net.i2p.router.transport.FIFOBandwidthRefiller;
|
||||||
|
import net.i2p.desktopgui.router.RouterHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author mathias
|
||||||
|
*/
|
||||||
|
public class SpeedHandler {
|
||||||
|
|
||||||
|
public static void setInboundBandwidth(int kbytes) {
|
||||||
|
context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_INBOUND_BANDWIDTH, "" + kbytes);
|
||||||
|
context.router().saveConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setOutboundBandwidth(int kbytes) {
|
||||||
|
context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_OUTBOUND_BANDWIDTH, "" + kbytes);
|
||||||
|
context.router().saveConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setInboundBurstBandwidth(int kbytes) {
|
||||||
|
context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_INBOUND_BURST_BANDWIDTH, "" + kbytes);
|
||||||
|
context.router().saveConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setOutboundBurstBandwidth(int kbytes) {
|
||||||
|
context.router().setConfigSetting(FIFOBandwidthRefiller.PROP_OUTBOUND_BURST_BANDWIDTH, "" + kbytes);
|
||||||
|
context.router().saveConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final RouterContext context = RouterHelper.getContext();
|
||||||
|
}
|
@ -0,0 +1,43 @@
|
|||||||
|
package net.i2p.desktopgui.router.configuration;
|
||||||
|
|
||||||
|
import net.i2p.router.transport.FIFOBandwidthRefiller;
|
||||||
|
import net.i2p.desktopgui.router.RouterHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author mathias
|
||||||
|
*/
|
||||||
|
public class SpeedHelper {
|
||||||
|
public static final String USERTYPE_BROWSING = "Browsing";
|
||||||
|
public static final String USERTYPE_DOWNLOADING = "Downloading";
|
||||||
|
|
||||||
|
public static int calculateSpeed(String capable, String profile) {
|
||||||
|
int capableSpeed = Integer.parseInt(capable);
|
||||||
|
int advisedSpeed = capableSpeed;
|
||||||
|
if(capableSpeed > 1000) {
|
||||||
|
if(profile.equals(USERTYPE_BROWSING)) //Don't overdo usage for people just wanting to browse (we don't want to drive them away due to resource hogging)
|
||||||
|
advisedSpeed *= 0.6;
|
||||||
|
else if(profile.equals(USERTYPE_DOWNLOADING))
|
||||||
|
advisedSpeed *= 0.8;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
advisedSpeed *= 0.6; //Lower available bandwidth: don't hog all the bandwidth
|
||||||
|
return advisedSpeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int calculateMonthlyUsage(int kbytes) {
|
||||||
|
return (int) ((((long)kbytes)*3600*24*31)/1000000);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int calculateSpeed(int gigabytes) {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
package net.i2p.desktopgui.util;
|
||||||
|
|
||||||
|
import javax.swing.InputVerifier;
|
||||||
|
import javax.swing.JComponent;
|
||||||
|
import javax.swing.JTextField;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author mathias
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class IntegerVerifier extends InputVerifier {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean verify(JComponent arg0) {
|
||||||
|
JTextField jtf = (JTextField) arg0;
|
||||||
|
return verify(jtf.getText());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean shouldYieldFocus(JComponent input) {
|
||||||
|
return verify(input);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean verify(String s) {
|
||||||
|
for(int i=0;i<s.length();i++)
|
||||||
|
if(s.charAt(i) > '9' || s.charAt(i) < '0')
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -18,13 +18,13 @@
|
|||||||
<!-- Depend on classes instead of jars where available -->
|
<!-- Depend on classes instead of jars where available -->
|
||||||
<classpath>
|
<classpath>
|
||||||
<pathelement location="../../../core/java/build/obj" />
|
<pathelement location="../../../core/java/build/obj" />
|
||||||
<pathelement location="../../../router/java/build/obj" />
|
|
||||||
<pathelement location="../../ministreaming/java/build/obj" />
|
<pathelement location="../../ministreaming/java/build/obj" />
|
||||||
<pathelement location="../../jetty/jettylib/org.mortbay.jetty.jar" />
|
<pathelement location="../../jetty/jettylib/org.mortbay.jetty.jar" />
|
||||||
<pathelement location="../../jetty/jettylib/javax.servlet.jar" />
|
<pathelement location="../../jetty/jettylib/javax.servlet.jar" />
|
||||||
</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" />
|
||||||
@ -32,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:../../../router/java/build/router.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>
|
||||||
|
|
||||||
@ -54,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" />
|
||||||
@ -89,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">
|
||||||
@ -101,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" />
|
||||||
|
44
apps/i2psnark/java/src/org/klomp/snark/BWLimits.java
Normal file
44
apps/i2psnark/java/src/org/klomp/snark/BWLimits.java
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* Released into the public domain
|
||||||
|
* with no warranty of any kind, either expressed or implied.
|
||||||
|
*/
|
||||||
|
package org.klomp.snark;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
import net.i2p.I2PAppContext;
|
||||||
|
import net.i2p.client.I2PSessionException;
|
||||||
|
import net.i2p.client.I2PClient;
|
||||||
|
import net.i2p.client.I2PSession;
|
||||||
|
import net.i2p.client.I2PSimpleClient;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Connect via I2CP and ask the router the bandwidth limits.
|
||||||
|
*
|
||||||
|
* The call is blocking and returns null on failure.
|
||||||
|
* Timeout is set to 5 seconds in I2PSimpleSession but it should be much faster.
|
||||||
|
*
|
||||||
|
* @author zzz
|
||||||
|
*/
|
||||||
|
class BWLimits {
|
||||||
|
|
||||||
|
public static int[] getBWLimits(String host, int port) {
|
||||||
|
int[] rv = null;
|
||||||
|
try {
|
||||||
|
I2PClient client = new I2PSimpleClient();
|
||||||
|
Properties opts = new Properties();
|
||||||
|
opts.put(I2PClient.PROP_TCP_HOST, host);
|
||||||
|
opts.put(I2PClient.PROP_TCP_PORT, "" + port);
|
||||||
|
I2PSession session = client.createSession(null, opts);
|
||||||
|
session.connect();
|
||||||
|
rv = session.bandwidthLimits();
|
||||||
|
session.destroySession();
|
||||||
|
} catch (I2PSessionException ise) {}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(String args[]) {
|
||||||
|
System.out.println(Arrays.toString(getBWLimits("127.0.0.1", 7654)));
|
||||||
|
}
|
||||||
|
}
|
@ -140,7 +140,7 @@ public class BitField
|
|||||||
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))
|
||||||
|
@ -73,7 +73,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();
|
||||||
}
|
}
|
||||||
|
@ -362,7 +362,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 +432,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();
|
||||||
|
@ -190,7 +190,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;
|
||||||
|
@ -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,
|
||||||
|
@ -36,7 +36,6 @@ import java.util.Timer;
|
|||||||
import java.util.TimerTask;
|
import java.util.TimerTask;
|
||||||
|
|
||||||
import net.i2p.I2PAppContext;
|
import net.i2p.I2PAppContext;
|
||||||
import net.i2p.router.client.ClientManagerFacadeImpl;
|
|
||||||
import net.i2p.client.streaming.I2PServerSocket;
|
import net.i2p.client.streaming.I2PServerSocket;
|
||||||
import net.i2p.data.Destination;
|
import net.i2p.data.Destination;
|
||||||
import net.i2p.util.I2PThread;
|
import net.i2p.util.I2PThread;
|
||||||
@ -261,9 +260,9 @@ public class Snark
|
|||||||
public Snark(I2PAppContext ctx, Properties opts, String torrent,
|
public Snark(I2PAppContext ctx, Properties opts, String torrent,
|
||||||
StorageListener slistener, boolean start, String rootDir) {
|
StorageListener slistener, boolean start, String rootDir) {
|
||||||
this(new I2PSnarkUtil(ctx), torrent, null, -1, slistener, null, null, null, null, false, rootDir);
|
this(new I2PSnarkUtil(ctx), torrent, null, -1, slistener, null, null, null, null, false, rootDir);
|
||||||
String host = opts.getProperty(ClientManagerFacadeImpl.PROP_CLIENT_HOST);
|
String host = opts.getProperty("i2cp.hostname");
|
||||||
int port = 0;
|
int port = 0;
|
||||||
String s = opts.getProperty(ClientManagerFacadeImpl.PROP_CLIENT_PORT);
|
String s = opts.getProperty("i2cp.port");
|
||||||
if (s != null) {
|
if (s != null) {
|
||||||
try {
|
try {
|
||||||
port = Integer.parseInt(s);
|
port = Integer.parseInt(s);
|
||||||
|
@ -18,7 +18,6 @@ import java.util.TreeMap;
|
|||||||
import net.i2p.I2PAppContext;
|
import net.i2p.I2PAppContext;
|
||||||
import net.i2p.data.Base64;
|
import net.i2p.data.Base64;
|
||||||
import net.i2p.data.DataHelper;
|
import net.i2p.data.DataHelper;
|
||||||
import net.i2p.router.RouterContext;
|
|
||||||
import net.i2p.util.I2PAppThread;
|
import net.i2p.util.I2PAppThread;
|
||||||
import net.i2p.util.Log;
|
import net.i2p.util.Log;
|
||||||
|
|
||||||
@ -32,7 +31,7 @@ public class SnarkManager implements Snark.CompleteListener {
|
|||||||
/** map of (canonical) filename to Snark instance (unsynchronized) */
|
/** map of (canonical) filename to Snark instance (unsynchronized) */
|
||||||
private Map _snarks;
|
private Map _snarks;
|
||||||
private Object _addSnarkLock;
|
private Object _addSnarkLock;
|
||||||
private String _configFile = "i2psnark.config";
|
private File _configFile;
|
||||||
private Properties _config;
|
private Properties _config;
|
||||||
private I2PAppContext _context;
|
private I2PAppContext _context;
|
||||||
private Log _log;
|
private Log _log;
|
||||||
@ -52,6 +51,7 @@ public class SnarkManager implements Snark.CompleteListener {
|
|||||||
public static final String PROP_META_PREFIX = "i2psnark.zmeta.";
|
public static final String PROP_META_PREFIX = "i2psnark.zmeta.";
|
||||||
public static final String PROP_META_BITFIELD_SUFFIX = ".bitfield";
|
public static final String PROP_META_BITFIELD_SUFFIX = ".bitfield";
|
||||||
|
|
||||||
|
private static final String CONFIG_FILE = "i2psnark.config";
|
||||||
public static final String PROP_AUTO_START = "i2snark.autoStart"; // oops
|
public static final String PROP_AUTO_START = "i2snark.autoStart"; // oops
|
||||||
public static final String DEFAULT_AUTO_START = "false";
|
public static final String DEFAULT_AUTO_START = "false";
|
||||||
public static final String PROP_LINK_PREFIX = "i2psnark.linkPrefix";
|
public static final String PROP_LINK_PREFIX = "i2psnark.linkPrefix";
|
||||||
@ -67,6 +67,9 @@ public class SnarkManager implements Snark.CompleteListener {
|
|||||||
_log = _context.logManager().getLog(SnarkManager.class);
|
_log = _context.logManager().getLog(SnarkManager.class);
|
||||||
_messages = new ArrayList(16);
|
_messages = new ArrayList(16);
|
||||||
_util = new I2PSnarkUtil(_context);
|
_util = new I2PSnarkUtil(_context);
|
||||||
|
_configFile = new File(CONFIG_FILE);
|
||||||
|
if (!_configFile.isAbsolute())
|
||||||
|
_configFile = new File(_context.getConfigDir(), CONFIG_FILE);
|
||||||
loadConfig(null);
|
loadConfig(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -113,10 +116,11 @@ public class SnarkManager implements Snark.CompleteListener {
|
|||||||
}
|
}
|
||||||
private int getStartupDelayMinutes() { return 3; }
|
private int getStartupDelayMinutes() { return 3; }
|
||||||
public File getDataDir() {
|
public File getDataDir() {
|
||||||
String dir = _config.getProperty(PROP_DIR);
|
String dir = _config.getProperty(PROP_DIR, "i2psnark");
|
||||||
if ( (dir == null) || (dir.trim().length() <= 0) )
|
File f = new File(dir);
|
||||||
dir = "i2psnark";
|
if (!f.isAbsolute())
|
||||||
return new File(dir);
|
f = new File(_context.getAppDir(), dir);
|
||||||
|
return f;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** null to set initial defaults */
|
/** null to set initial defaults */
|
||||||
@ -124,8 +128,10 @@ public class SnarkManager implements Snark.CompleteListener {
|
|||||||
if (_config == null)
|
if (_config == null)
|
||||||
_config = new Properties();
|
_config = new Properties();
|
||||||
if (filename != null) {
|
if (filename != null) {
|
||||||
_configFile = filename;
|
|
||||||
File cfg = new File(filename);
|
File cfg = new File(filename);
|
||||||
|
if (!cfg.isAbsolute())
|
||||||
|
cfg = new File(_context.getConfigDir(), filename);
|
||||||
|
_configFile = cfg;
|
||||||
if (cfg.exists()) {
|
if (cfg.exists()) {
|
||||||
try {
|
try {
|
||||||
DataHelper.loadProps(_config, cfg);
|
DataHelper.loadProps(_config, cfg);
|
||||||
@ -136,33 +142,32 @@ public class SnarkManager implements Snark.CompleteListener {
|
|||||||
}
|
}
|
||||||
// now add sane defaults
|
// now add sane defaults
|
||||||
if (!_config.containsKey(PROP_I2CP_HOST))
|
if (!_config.containsKey(PROP_I2CP_HOST))
|
||||||
_config.setProperty(PROP_I2CP_HOST, "localhost");
|
_config.setProperty(PROP_I2CP_HOST, "127.0.0.1");
|
||||||
if (!_config.containsKey(PROP_I2CP_PORT))
|
if (!_config.containsKey(PROP_I2CP_PORT))
|
||||||
_config.setProperty(PROP_I2CP_PORT, "7654");
|
_config.setProperty(PROP_I2CP_PORT, "7654");
|
||||||
if (!_config.containsKey(PROP_I2CP_OPTS))
|
if (!_config.containsKey(PROP_I2CP_OPTS))
|
||||||
_config.setProperty(PROP_I2CP_OPTS, "inbound.length=2 inbound.lengthVariance=0 outbound.length=2 outbound.lengthVariance=0 inbound.quantity=3 outbound.quantity=3");
|
_config.setProperty(PROP_I2CP_OPTS, "inbound.length=2 inbound.lengthVariance=0 outbound.length=2 outbound.lengthVariance=0 inbound.quantity=3 outbound.quantity=3");
|
||||||
if (!_config.containsKey(PROP_EEP_HOST))
|
if (!_config.containsKey(PROP_EEP_HOST))
|
||||||
_config.setProperty(PROP_EEP_HOST, "localhost");
|
_config.setProperty(PROP_EEP_HOST, "127.0.0.1");
|
||||||
if (!_config.containsKey(PROP_EEP_PORT))
|
if (!_config.containsKey(PROP_EEP_PORT))
|
||||||
_config.setProperty(PROP_EEP_PORT, "4444");
|
_config.setProperty(PROP_EEP_PORT, "4444");
|
||||||
if (!_config.containsKey(PROP_UPLOADERS_TOTAL))
|
if (!_config.containsKey(PROP_UPLOADERS_TOTAL))
|
||||||
_config.setProperty(PROP_UPLOADERS_TOTAL, "" + Snark.MAX_TOTAL_UPLOADERS);
|
_config.setProperty(PROP_UPLOADERS_TOTAL, "" + Snark.MAX_TOTAL_UPLOADERS);
|
||||||
if (!_config.containsKey(PROP_UPBW_MAX)) {
|
|
||||||
try {
|
|
||||||
if (_context instanceof RouterContext)
|
|
||||||
_config.setProperty(PROP_UPBW_MAX, "" + (((RouterContext)_context).bandwidthLimiter().getOutboundKBytesPerSecond() / 2));
|
|
||||||
else
|
|
||||||
_config.setProperty(PROP_UPBW_MAX, "" + DEFAULT_MAX_UP_BW);
|
|
||||||
} catch (NoClassDefFoundError ncdfe) {
|
|
||||||
_config.setProperty(PROP_UPBW_MAX, "" + DEFAULT_MAX_UP_BW);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!_config.containsKey(PROP_DIR))
|
if (!_config.containsKey(PROP_DIR))
|
||||||
_config.setProperty(PROP_DIR, "i2psnark");
|
_config.setProperty(PROP_DIR, "i2psnark");
|
||||||
if (!_config.containsKey(PROP_AUTO_START))
|
if (!_config.containsKey(PROP_AUTO_START))
|
||||||
_config.setProperty(PROP_AUTO_START, DEFAULT_AUTO_START);
|
_config.setProperty(PROP_AUTO_START, DEFAULT_AUTO_START);
|
||||||
updateConfig();
|
updateConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** call from DirMonitor since loadConfig() is called before router I2CP is up */
|
||||||
|
private void getBWLimit() {
|
||||||
|
if (!_config.containsKey(PROP_UPBW_MAX)) {
|
||||||
|
int[] limits = BWLimits.getBWLimits(_util.getI2CPHost(), _util.getI2CPPort());
|
||||||
|
if (limits != null && limits[1] > 0)
|
||||||
|
_util.setMaxUpBW(limits[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void updateConfig() {
|
private void updateConfig() {
|
||||||
String i2cpHost = _config.getProperty(PROP_I2CP_HOST);
|
String i2cpHost = _config.getProperty(PROP_I2CP_HOST);
|
||||||
@ -334,37 +339,37 @@ public class SnarkManager implements Snark.CompleteListener {
|
|||||||
}
|
}
|
||||||
if (_util.shouldUseOpenTrackers() != useOpenTrackers) {
|
if (_util.shouldUseOpenTrackers() != useOpenTrackers) {
|
||||||
_config.setProperty(I2PSnarkUtil.PROP_USE_OPENTRACKERS, useOpenTrackers + "");
|
_config.setProperty(I2PSnarkUtil.PROP_USE_OPENTRACKERS, useOpenTrackers + "");
|
||||||
addMessage((useOpenTrackers ? "En" : "Dis") + "abled open trackers - torrent restart required to take effect");
|
addMessage((useOpenTrackers ? "En" : "Dis") + "abled open trackers - torrent restart required to take effect.");
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
if (openTrackers != null) {
|
if (openTrackers != null) {
|
||||||
if (openTrackers.trim().length() > 0 && !openTrackers.trim().equals(_util.getOpenTrackerString())) {
|
if (openTrackers.trim().length() > 0 && !openTrackers.trim().equals(_util.getOpenTrackerString())) {
|
||||||
_config.setProperty(I2PSnarkUtil.PROP_OPENTRACKERS, openTrackers.trim());
|
_config.setProperty(I2PSnarkUtil.PROP_OPENTRACKERS, openTrackers.trim());
|
||||||
addMessage("Open Tracker list changed - torrent restart required to take effect");
|
addMessage("Open Tracker list changed - torrent restart required to take effect.");
|
||||||
changed = true;
|
changed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (changed) {
|
if (changed) {
|
||||||
saveConfig();
|
saveConfig();
|
||||||
} else {
|
} else {
|
||||||
addMessage("Configuration unchanged");
|
addMessage("Configuration unchanged.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void saveConfig() {
|
public void saveConfig() {
|
||||||
try {
|
try {
|
||||||
synchronized (_configFile) {
|
synchronized (_configFile) {
|
||||||
DataHelper.storeProps(_config, new File(_configFile));
|
DataHelper.storeProps(_config, _configFile);
|
||||||
}
|
}
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
addMessage("Unable to save the config to '" + _configFile + "'");
|
addMessage("Unable to save the config to '" + _configFile.getAbsolutePath() + "'.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Properties getConfig() { return _config; }
|
public Properties getConfig() { return _config; }
|
||||||
|
|
||||||
/** hardcoded for sanity. perhaps this should be customizable, for people who increase their ulimit, etc. */
|
/** hardcoded for sanity. perhaps this should be customizable, for people who increase their ulimit, etc. */
|
||||||
private static final int MAX_FILES_PER_TORRENT = 256;
|
private static final int MAX_FILES_PER_TORRENT = 512;
|
||||||
|
|
||||||
/** set of filenames that we are dealing with */
|
/** set of filenames that we are dealing with */
|
||||||
public Set listTorrentFiles() { synchronized (_snarks) { return new HashSet(_snarks.keySet()); } }
|
public Set listTorrentFiles() { synchronized (_snarks) { return new HashSet(_snarks.keySet()); } }
|
||||||
@ -378,7 +383,7 @@ public class SnarkManager implements Snark.CompleteListener {
|
|||||||
addMessage("Connecting to I2P");
|
addMessage("Connecting to I2P");
|
||||||
boolean ok = _util.connect();
|
boolean ok = _util.connect();
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
addMessage("Error connecting to I2P - check your I2CP settings");
|
addMessage("Error connecting to I2P - check your I2CP settings!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -441,9 +446,9 @@ public class SnarkManager implements Snark.CompleteListener {
|
|||||||
File f = new File(filename);
|
File f = new File(filename);
|
||||||
if (!dontAutoStart && shouldAutoStart()) {
|
if (!dontAutoStart && shouldAutoStart()) {
|
||||||
torrent.startTorrent();
|
torrent.startTorrent();
|
||||||
addMessage("Torrent added and started: '" + f.getName() + "'");
|
addMessage("Torrent added and started: '" + f.getName() + "'.");
|
||||||
} else {
|
} else {
|
||||||
addMessage("Torrent added: '" + f.getName() + "'");
|
addMessage("Torrent added: '" + f.getName() + "'.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -539,22 +544,24 @@ public class SnarkManager implements Snark.CompleteListener {
|
|||||||
// basic validation of url
|
// basic validation of url
|
||||||
if ((!announce.startsWith("http://")) ||
|
if ((!announce.startsWith("http://")) ||
|
||||||
(announce.indexOf(".i2p/") < 0)) // need to do better than this
|
(announce.indexOf(".i2p/") < 0)) // need to do better than this
|
||||||
return "Non-i2p tracker in " + info.getName() + ", deleting it";
|
return "Non-i2p tracker in " + info.getName() + ", deleting it from our list of trackers!";
|
||||||
List files = info.getFiles();
|
List files = info.getFiles();
|
||||||
if ( (files != null) && (files.size() > MAX_FILES_PER_TORRENT) ) {
|
if ( (files != null) && (files.size() > MAX_FILES_PER_TORRENT) ) {
|
||||||
return "Too many files in " + info.getName() + " (" + files.size() + "), deleting it";
|
return "Too many files in " + info.getName() + " (" + files.size() + "), deleting it!";
|
||||||
} else if (info.getPieces() <= 0) {
|
} else if (info.getPieces() <= 0) {
|
||||||
return "No pieces in " + info.getName() + "? deleting it";
|
return "No pieces in " + info.getName() + "? deleting it!";
|
||||||
} else if (info.getPieceLength(0) > 1*1024*1024) {
|
} else if (info.getPieceLength(0) > Storage.MAX_PIECE_SIZE) {
|
||||||
return "Pieces are too large in " + info.getName() + " (" + info.getPieceLength(0)/1024 + "KB), deleting it";
|
return "Pieces are too large in " + info.getName() + " (" + DataHelper.formatSize(info.getPieceLength(0)) +
|
||||||
} else if (info.getTotalLength() > 10*1024*1024*1024l) {
|
"B), deleting it.";
|
||||||
|
} else if (info.getTotalLength() > Storage.MAX_TOTAL_SIZE) {
|
||||||
System.out.println("torrent info: " + info.toString());
|
System.out.println("torrent info: " + info.toString());
|
||||||
List lengths = info.getLengths();
|
List lengths = info.getLengths();
|
||||||
if (lengths != null)
|
if (lengths != null)
|
||||||
for (int i = 0; i < lengths.size(); i++)
|
for (int i = 0; i < lengths.size(); i++)
|
||||||
System.out.println("File " + i + " is " + lengths.get(i) + " long");
|
System.out.println("File " + i + " is " + lengths.get(i) + " long.");
|
||||||
|
|
||||||
return "Torrents larger than 10GB are not supported yet (because we're paranoid): " + info.getName() + ", deleting it";
|
return "Torrents larger than " + DataHelper.formatSize(Storage.MAX_TOTAL_SIZE) +
|
||||||
|
"B are not supported yet (because we're paranoid): " + info.getName() + ", deleting it!";
|
||||||
} else {
|
} else {
|
||||||
// ok
|
// ok
|
||||||
return null;
|
return null;
|
||||||
@ -591,7 +598,7 @@ public class SnarkManager implements Snark.CompleteListener {
|
|||||||
////_util.
|
////_util.
|
||||||
}
|
}
|
||||||
if (!wasStopped)
|
if (!wasStopped)
|
||||||
addMessage("Torrent stopped: '" + sfile.getName() + "'");
|
addMessage("Torrent stopped: '" + sfile.getName() + "'.");
|
||||||
}
|
}
|
||||||
return torrent;
|
return torrent;
|
||||||
}
|
}
|
||||||
@ -606,7 +613,7 @@ public class SnarkManager implements Snark.CompleteListener {
|
|||||||
torrentFile.delete();
|
torrentFile.delete();
|
||||||
if (torrent.storage != null)
|
if (torrent.storage != null)
|
||||||
removeTorrentStatus(torrent.storage.getMetaInfo());
|
removeTorrentStatus(torrent.storage.getMetaInfo());
|
||||||
addMessage("Torrent removed: '" + torrentFile.getName() + "'");
|
addMessage("Torrent removed: '" + torrentFile.getName() + "'.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -619,6 +626,9 @@ public class SnarkManager implements Snark.CompleteListener {
|
|||||||
_messages.remove(0);
|
_messages.remove(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// here because we need to delay until I2CP is up
|
||||||
|
// although the user will see the default until then
|
||||||
|
getBWLimit();
|
||||||
while (true) {
|
while (true) {
|
||||||
File dir = getDataDir();
|
File dir = getDataDir();
|
||||||
_log.debug("Directory Monitor loop over " + dir.getAbsolutePath());
|
_log.debug("Directory Monitor loop over " + dir.getAbsolutePath());
|
||||||
@ -636,8 +646,7 @@ public class SnarkManager implements Snark.CompleteListener {
|
|||||||
public void torrentComplete(Snark snark) {
|
public void torrentComplete(Snark snark) {
|
||||||
File f = new File(snark.torrent);
|
File f = new File(snark.torrent);
|
||||||
long len = snark.meta.getTotalLength();
|
long len = snark.meta.getTotalLength();
|
||||||
addMessage("Download complete of " + f.getName()
|
addMessage("Download finished: " + f.getName() + " (size: " + DataHelper.formatSize(len) + "B)");
|
||||||
+ (len < 5*1024*1024 ? " (size: " + (len/1024) + "KB)" : " (size: " + (len/(1024*1024l)) + "MB)"));
|
|
||||||
updateStatus(snark);
|
updateStatus(snark);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -665,7 +674,7 @@ public class SnarkManager implements Snark.CompleteListener {
|
|||||||
// already known. noop
|
// already known. noop
|
||||||
} else {
|
} else {
|
||||||
if (shouldAutoStart() && !_util.connect())
|
if (shouldAutoStart() && !_util.connect())
|
||||||
addMessage("Unable to connect to I2P");
|
addMessage("Unable to connect to I2P!");
|
||||||
addTorrent((String)foundNames.get(i), !shouldAutoStart());
|
addTorrent((String)foundNames.get(i), !shouldAutoStart());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -682,17 +691,19 @@ public class SnarkManager implements Snark.CompleteListener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static final String DEFAULT_TRACKERS[] = {
|
private static final String DEFAULT_TRACKERS[] = {
|
||||||
"Postman", "http://YRgrgTLGnbTq2aZOZDJQ~o6Uk5k6TK-OZtx0St9pb0G-5EGYURZioxqYG8AQt~LgyyI~NCj6aYWpPO-150RcEvsfgXLR~CxkkZcVpgt6pns8SRc3Bi-QSAkXpJtloapRGcQfzTtwllokbdC-aMGpeDOjYLd8b5V9Im8wdCHYy7LRFxhEtGb~RL55DA8aYOgEXcTpr6RPPywbV~Qf3q5UK55el6Kex-6VCxreUnPEe4hmTAbqZNR7Fm0hpCiHKGoToRcygafpFqDw5frLXToYiqs9d4liyVB-BcOb0ihORbo0nS3CLmAwZGvdAP8BZ7cIYE3Z9IU9D1G8JCMxWarfKX1pix~6pIA-sp1gKlL1HhYhPMxwyxvuSqx34o3BqU7vdTYwWiLpGM~zU1~j9rHL7x60pVuYaXcFQDR4-QVy26b6Pt6BlAZoFmHhPcAuWfu-SFhjyZYsqzmEmHeYdAwa~HojSbofg0TMUgESRXMw6YThK1KXWeeJVeztGTz25sL8AAAA.i2p/announce.php=http://tracker.postman.i2p/"
|
// "Postman", "http://YRgrgTLGnbTq2aZOZDJQ~o6Uk5k6TK-OZtx0St9pb0G-5EGYURZioxqYG8AQt~LgyyI~NCj6aYWpPO-150RcEvsfgXLR~CxkkZcVpgt6pns8SRc3Bi-QSAkXpJtloapRGcQfzTtwllokbdC-aMGpeDOjYLd8b5V9Im8wdCHYy7LRFxhEtGb~RL55DA8aYOgEXcTpr6RPPywbV~Qf3q5UK55el6Kex-6VCxreUnPEe4hmTAbqZNR7Fm0hpCiHKGoToRcygafpFqDw5frLXToYiqs9d4liyVB-BcOb0ihORbo0nS3CLmAwZGvdAP8BZ7cIYE3Z9IU9D1G8JCMxWarfKX1pix~6pIA-sp1gKlL1HhYhPMxwyxvuSqx34o3BqU7vdTYwWiLpGM~zU1~j9rHL7x60pVuYaXcFQDR4-QVy26b6Pt6BlAZoFmHhPcAuWfu-SFhjyZYsqzmEmHeYdAwa~HojSbofg0TMUgESRXMw6YThK1KXWeeJVeztGTz25sL8AAAA.i2p/announce.php=http://tracker.postman.i2p/"
|
||||||
// , "eBook", "http://E71FRom6PZNEqTN2Lr8P-sr23b7HJVC32KoGnVQjaX6zJiXwhJy2HsXob36Qmj81TYFZdewFZa9mSJ533UZgGyQkXo2ahctg82JKYZfDe5uDxAn1E9YPjxZCWJaFJh0S~UwSs~9AZ7UcauSJIoNtpxrtbmRNVFLqnkEDdLZi26TeucfOmiFmIWnVblLniWv3tG1boE9Abd-6j3FmYVrRucYuepAILYt6katmVNOk6sXmno1Eynrp~~MBuFq0Ko6~jsc2E2CRVYXDhGHEMdt-j6JUz5D7S2RIVzDRqQyAZLKJ7OdQDmI31przzmne1vOqqqLC~1xUumZVIvF~yOeJUGNjJ1Vx0J8i2BQIusn1pQJ6UCB~ZtZZLQtEb8EPVCfpeRi2ri1M5CyOuxN0V5ekmPHrYIBNevuTCRC26NP7ZS5VDgx1~NaC3A-CzJAE6f1QXi0wMI9aywNG5KGzOPifcsih8eyGyytvgLtrZtV7ykzYpPCS-rDfITncpn5hliPUAAAA.i2p/pub/bt/announce.php=http://de-ebook-archiv.i2p/pub/bt/"
|
// , "eBook", "http://E71FRom6PZNEqTN2Lr8P-sr23b7HJVC32KoGnVQjaX6zJiXwhJy2HsXob36Qmj81TYFZdewFZa9mSJ533UZgGyQkXo2ahctg82JKYZfDe5uDxAn1E9YPjxZCWJaFJh0S~UwSs~9AZ7UcauSJIoNtpxrtbmRNVFLqnkEDdLZi26TeucfOmiFmIWnVblLniWv3tG1boE9Abd-6j3FmYVrRucYuepAILYt6katmVNOk6sXmno1Eynrp~~MBuFq0Ko6~jsc2E2CRVYXDhGHEMdt-j6JUz5D7S2RIVzDRqQyAZLKJ7OdQDmI31przzmne1vOqqqLC~1xUumZVIvF~yOeJUGNjJ1Vx0J8i2BQIusn1pQJ6UCB~ZtZZLQtEb8EPVCfpeRi2ri1M5CyOuxN0V5ekmPHrYIBNevuTCRC26NP7ZS5VDgx1~NaC3A-CzJAE6f1QXi0wMI9aywNG5KGzOPifcsih8eyGyytvgLtrZtV7ykzYpPCS-rDfITncpn5hliPUAAAA.i2p/pub/bt/announce.php=http://de-ebook-archiv.i2p/pub/bt/"
|
||||||
// , "Gaytorrents", "http://uxPWHbK1OIj9HxquaXuhMiIvi21iK0~ZiG9d8G0840ZXIg0r6CbiV71xlsqmdnU6wm0T2LySriM0doW2gUigo-5BNkUquHwOjLROiETnB3ZR0Ml4IGa6QBPn1aAq2d9~g1r1nVjLE~pcFnXB~cNNS7kIhX1d6nLgYVZf0C2cZopEow2iWVUggGGnAA9mHjE86zLEnTvAyhbAMTqDQJhEuLa0ZYSORqzJDMkQt90MV4YMjX1ICY6RfUSFmxEqu0yWTrkHsTtRw48l~dz9wpIgc0a0T9C~eeWvmBFTqlJPtQZwntpNeH~jF7nlYzB58olgV2HHFYpVYD87DYNzTnmNWxCJ5AfDorm6AIUCV2qaE7tZtI1h6fbmGpGlPyW~Kw5GXrRfJwNvr6ajwAVi~bPVnrBwDZezHkfW4slOO8FACPR28EQvaTu9nwhAbqESxV2hCTq6vQSGjuxHeOuzBOEvRWkLKOHWTC09t2DbJ94FSqETmZopTB1ukEmaxRWbKSIaAAAA.i2p/announce.php=http://gaytorrents.i2p/"
|
// , "Gaytorrents", "http://uxPWHbK1OIj9HxquaXuhMiIvi21iK0~ZiG9d8G0840ZXIg0r6CbiV71xlsqmdnU6wm0T2LySriM0doW2gUigo-5BNkUquHwOjLROiETnB3ZR0Ml4IGa6QBPn1aAq2d9~g1r1nVjLE~pcFnXB~cNNS7kIhX1d6nLgYVZf0C2cZopEow2iWVUggGGnAA9mHjE86zLEnTvAyhbAMTqDQJhEuLa0ZYSORqzJDMkQt90MV4YMjX1ICY6RfUSFmxEqu0yWTrkHsTtRw48l~dz9wpIgc0a0T9C~eeWvmBFTqlJPtQZwntpNeH~jF7nlYzB58olgV2HHFYpVYD87DYNzTnmNWxCJ5AfDorm6AIUCV2qaE7tZtI1h6fbmGpGlPyW~Kw5GXrRfJwNvr6ajwAVi~bPVnrBwDZezHkfW4slOO8FACPR28EQvaTu9nwhAbqESxV2hCTq6vQSGjuxHeOuzBOEvRWkLKOHWTC09t2DbJ94FSqETmZopTB1ukEmaxRWbKSIaAAAA.i2p/announce.php=http://gaytorrents.i2p/"
|
||||||
// , "NickyB", "http://9On6d3cZ27JjwYCtyJJbowe054d5tFnfMjv4PHsYs-EQn4Y4mk2zRixatvuAyXz2MmRfXG-NAUfhKr0KCxRNZbvHmlckYfT-WBzwwpiMAl0wDFY~Pl8cqXuhfikSG5WrqdPfDNNIBuuznS0dqaczf~OyVaoEOpvuP3qV6wKqbSSLpjOwwAaQPHjlRtNIW8-EtUZp-I0LT45HSoowp~6b7zYmpIyoATvIP~sT0g0MTrczWhbVTUZnEkZeLhOR0Duw1-IRXI2KHPbA24wLO9LdpKKUXed05RTz0QklW5ROgR6TYv7aXFufX8kC0-DaKvQ5JKG~h8lcoHvm1RCzNqVE-2aiZnO2xH08H-iCWoLNJE-Td2kT-Tsc~3QdQcnEUcL5BF-VT~QYRld2--9r0gfGl-yDrJZrlrihHGr5J7ImahelNn9PpkVp6eIyABRmJHf2iicrk3CtjeG1j9OgTSwaNmEpUpn4aN7Kx0zNLdH7z6uTgCGD9Kmh1MFYrsoNlTp4AAAA.i2p/bittorrent/announce.php=http://nickyb.i2p/bittorrent/"
|
// , "NickyB", "http://9On6d3cZ27JjwYCtyJJbowe054d5tFnfMjv4PHsYs-EQn4Y4mk2zRixatvuAyXz2MmRfXG-NAUfhKr0KCxRNZbvHmlckYfT-WBzwwpiMAl0wDFY~Pl8cqXuhfikSG5WrqdPfDNNIBuuznS0dqaczf~OyVaoEOpvuP3qV6wKqbSSLpjOwwAaQPHjlRtNIW8-EtUZp-I0LT45HSoowp~6b7zYmpIyoATvIP~sT0g0MTrczWhbVTUZnEkZeLhOR0Duw1-IRXI2KHPbA24wLO9LdpKKUXed05RTz0QklW5ROgR6TYv7aXFufX8kC0-DaKvQ5JKG~h8lcoHvm1RCzNqVE-2aiZnO2xH08H-iCWoLNJE-Td2kT-Tsc~3QdQcnEUcL5BF-VT~QYRld2--9r0gfGl-yDrJZrlrihHGr5J7ImahelNn9PpkVp6eIyABRmJHf2iicrk3CtjeG1j9OgTSwaNmEpUpn4aN7Kx0zNLdH7z6uTgCGD9Kmh1MFYrsoNlTp4AAAA.i2p/bittorrent/announce.php=http://nickyb.i2p/bittorrent/"
|
||||||
// , "Orion", "http://gKik1lMlRmuroXVGTZ~7v4Vez3L3ZSpddrGZBrxVriosCQf7iHu6CIk8t15BKsj~P0JJpxrofeuxtm7SCUAJEr0AIYSYw8XOmp35UfcRPQWyb1LsxUkMT4WqxAT3s1ClIICWlBu5An~q-Mm0VFlrYLIPBWlUFnfPR7jZ9uP5ZMSzTKSMYUWao3ejiykr~mtEmyls6g-ZbgKZawa9II4zjOy-hdxHgP-eXMDseFsrym4Gpxvy~3Fv9TuiSqhpgm~UeTo5YBfxn6~TahKtE~~sdCiSydqmKBhxAQ7uT9lda7xt96SS09OYMsIWxLeQUWhns-C~FjJPp1D~IuTrUpAFcVEGVL-BRMmdWbfOJEcWPZ~CBCQSO~VkuN1ebvIOr9JBerFMZSxZtFl8JwcrjCIBxeKPBmfh~xYh16BJm1BBBmN1fp2DKmZ2jBNkAmnUbjQOqWvUcehrykWk5lZbE7bjJMDFH48v3SXwRuDBiHZmSbsTY6zhGY~GkMQHNGxPMMSIAAAA.i2p/bt/announce.php=http://orion.i2p/bt/"
|
// , "Orion", "http://gKik1lMlRmuroXVGTZ~7v4Vez3L3ZSpddrGZBrxVriosCQf7iHu6CIk8t15BKsj~P0JJpxrofeuxtm7SCUAJEr0AIYSYw8XOmp35UfcRPQWyb1LsxUkMT4WqxAT3s1ClIICWlBu5An~q-Mm0VFlrYLIPBWlUFnfPR7jZ9uP5ZMSzTKSMYUWao3ejiykr~mtEmyls6g-ZbgKZawa9II4zjOy-hdxHgP-eXMDseFsrym4Gpxvy~3Fv9TuiSqhpgm~UeTo5YBfxn6~TahKtE~~sdCiSydqmKBhxAQ7uT9lda7xt96SS09OYMsIWxLeQUWhns-C~FjJPp1D~IuTrUpAFcVEGVL-BRMmdWbfOJEcWPZ~CBCQSO~VkuN1ebvIOr9JBerFMZSxZtFl8JwcrjCIBxeKPBmfh~xYh16BJm1BBBmN1fp2DKmZ2jBNkAmnUbjQOqWvUcehrykWk5lZbE7bjJMDFH48v3SXwRuDBiHZmSbsTY6zhGY~GkMQHNGxPMMSIAAAA.i2p/bt/announce.php=http://orion.i2p/bt/"
|
||||||
// , "anonymity", "http://8EoJZIKrWgGuDrxA3nRJs1jsPfiGwmFWL91hBrf0HA7oKhEvAna4Ocx47VLUR9retVEYBAyWFK-eZTPcvhnz9XffBEiJQQ~kFSCqb1fV6IfPiV3HySqi9U5Caf6~hC46fRd~vYnxmaBLICT3N160cxBETqH3v2rdxdJpvYt8q4nMk9LUeVXq7zqCTFLLG5ig1uKgNzBGe58iNcsvTEYlnbYcE930ABmrzj8G1qQSgSwJ6wx3tUQNl1z~4wSOUMan~raZQD60lRK70GISjoX0-D0Po9WmPveN3ES3g72TIET3zc3WPdK2~lgmKGIs8GgNLES1cXTolvbPhdZK1gxddRMbJl6Y6IPFyQ9o4-6Rt3Lp-RMRWZ2TG7j2OMcNSiOmATUhKEFBDfv-~SODDyopGBmfeLw16F4NnYednvn4qP10dyMHcUASU6Zag4mfc2-WivrOqeWhD16fVAh8MoDpIIT~0r9XmwdaVFyLcjbXObabJczxCAW3fodQUnvuSkwzAAAA.i2p/anonymityTracker/announce.php=http://anonymityweb.i2p/anonymityTracker/"
|
// , "anonymity", "http://8EoJZIKrWgGuDrxA3nRJs1jsPfiGwmFWL91hBrf0HA7oKhEvAna4Ocx47VLUR9retVEYBAyWFK-eZTPcvhnz9XffBEiJQQ~kFSCqb1fV6IfPiV3HySqi9U5Caf6~hC46fRd~vYnxmaBLICT3N160cxBETqH3v2rdxdJpvYt8q4nMk9LUeVXq7zqCTFLLG5ig1uKgNzBGe58iNcsvTEYlnbYcE930ABmrzj8G1qQSgSwJ6wx3tUQNl1z~4wSOUMan~raZQD60lRK70GISjoX0-D0Po9WmPveN3ES3g72TIET3zc3WPdK2~lgmKGIs8GgNLES1cXTolvbPhdZK1gxddRMbJl6Y6IPFyQ9o4-6Rt3Lp-RMRWZ2TG7j2OMcNSiOmATUhKEFBDfv-~SODDyopGBmfeLw16F4NnYednvn4qP10dyMHcUASU6Zag4mfc2-WivrOqeWhD16fVAh8MoDpIIT~0r9XmwdaVFyLcjbXObabJczxCAW3fodQUnvuSkwzAAAA.i2p/anonymityTracker/announce.php=http://anonymityweb.i2p/anonymityTracker/"
|
||||||
// , "The freak's tracker", "http://mHKva9x24E5Ygfey2llR1KyQHv5f8hhMpDMwJDg1U-hABpJ2NrQJd6azirdfaR0OKt4jDlmP2o4Qx0H598~AteyD~RJU~xcWYdcOE0dmJ2e9Y8-HY51ie0B1yD9FtIV72ZI-V3TzFDcs6nkdX9b81DwrAwwFzx0EfNvK1GLVWl59Ow85muoRTBA1q8SsZImxdyZ-TApTVlMYIQbdI4iQRwU9OmmtefrCe~ZOf4UBS9-KvNIqUL0XeBSqm0OU1jq-D10Ykg6KfqvuPnBYT1BYHFDQJXW5DdPKwcaQE4MtAdSGmj1epDoaEBUa9btQlFsM2l9Cyn1hzxqNWXELmx8dRlomQLlV4b586dRzW~fLlOPIGC13ntPXogvYvHVyEyptXkv890jC7DZNHyxZd5cyrKC36r9huKvhQAmNABT2Y~pOGwVrb~RpPwT0tBuPZ3lHYhBFYmD8y~AOhhNHKMLzea1rfwTvovBMByDdFps54gMN1mX4MbCGT4w70vIopS9yAAAA.i2p/bytemonsoon/announce.php"
|
// , "The freak's tracker", "http://mHKva9x24E5Ygfey2llR1KyQHv5f8hhMpDMwJDg1U-hABpJ2NrQJd6azirdfaR0OKt4jDlmP2o4Qx0H598~AteyD~RJU~xcWYdcOE0dmJ2e9Y8-HY51ie0B1yD9FtIV72ZI-V3TzFDcs6nkdX9b81DwrAwwFzx0EfNvK1GLVWl59Ow85muoRTBA1q8SsZImxdyZ-TApTVlMYIQbdI4iQRwU9OmmtefrCe~ZOf4UBS9-KvNIqUL0XeBSqm0OU1jq-D10Ykg6KfqvuPnBYT1BYHFDQJXW5DdPKwcaQE4MtAdSGmj1epDoaEBUa9btQlFsM2l9Cyn1hzxqNWXELmx8dRlomQLlV4b586dRzW~fLlOPIGC13ntPXogvYvHVyEyptXkv890jC7DZNHyxZd5cyrKC36r9huKvhQAmNABT2Y~pOGwVrb~RpPwT0tBuPZ3lHYhBFYmD8y~AOhhNHKMLzea1rfwTvovBMByDdFps54gMN1mX4MbCGT4w70vIopS9yAAAA.i2p/bytemonsoon/announce.php"
|
||||||
, "welterde", "http://BGKmlDOoH3RzFbPRfRpZV2FjpVj8~3moFftw5-dZfDf2070TOe8Tf2~DAVeaM6ZRLdmFEt~9wyFL8YMLMoLoiwGEH6IGW6rc45tstN68KsBDWZqkTohV1q9XFgK9JnCwE~Oi89xLBHsLMTHOabowWM6dkC8nI6QqJC2JODqLPIRfOVrDdkjLwtCrsckzLybNdFmgfoqF05UITDyczPsFVaHtpF1sRggOVmdvCM66otyonlzNcJbn59PA-R808vUrCPMGU~O9Wys0i-NoqtIbtWfOKnjCRFMNw5ex4n9m5Sxm9e20UkpKG6qzEuvKZWi8vTLe1NW~CBrj~vG7I3Ok4wybUFflBFOaBabxYJLlx4xTE1zJIVxlsekmAjckB4v-cQwulFeikR4LxPQ6mCQknW2HZ4JQIq6hL9AMabxjOlYnzh7kjOfRGkck8YgeozcyTvcDUcUsOuSTk06L4kdrv8h2Cozjbloi5zl6KTbj5ZTciKCxi73Pn9grICn-HQqEAAAA.i2p/a=http://tracker.welterde.i2p/stats?mode=top5"
|
|
||||||
// , "mastertracker", "http://VzXD~stRKbL3MOmeTn1iaCQ0CFyTmuFHiKYyo0Rd~dFPZFCYH-22rT8JD7i-C2xzYFa4jT5U2aqHzHI-Jre4HL3Ri5hFtZrLk2ax3ji7Qfb6qPnuYkuiF2E2UDmKUOppI8d9Ye7tjdhQVCy0izn55tBaB-U7UWdcvSK2i85sauyw3G0Gfads1Rvy5-CAe2paqyYATcDmGjpUNLoxbfv9KH1KmwRTNH6k1v4PyWYYnhbT39WfKMbBjSxVQRdi19cyJrULSWhjxaQfJHeWx5Z8Ev4bSPByBeQBFl2~4vqy0S5RypINsRSa3MZdbiAAyn5tr5slWR6QdoqY3qBQgBJFZppy-3iWkFqqKgSxCPundF8gdDLC5ddizl~KYcYKl42y9SGFHIukH-TZs8~em0~iahzsqWVRks3zRG~tlBcX2U3M2~OJs~C33-NKhyfZT7-XFBREvb8Szmd~p66jDxrwOnKaku-G6DyoQipJqIz4VHmY9-y5T8RrUcJcM-5lVoMpAAAA.i2p/announce.php=http://tracker.mastertracker.i2p/"
|
// , "mastertracker", "http://VzXD~stRKbL3MOmeTn1iaCQ0CFyTmuFHiKYyo0Rd~dFPZFCYH-22rT8JD7i-C2xzYFa4jT5U2aqHzHI-Jre4HL3Ri5hFtZrLk2ax3ji7Qfb6qPnuYkuiF2E2UDmKUOppI8d9Ye7tjdhQVCy0izn55tBaB-U7UWdcvSK2i85sauyw3G0Gfads1Rvy5-CAe2paqyYATcDmGjpUNLoxbfv9KH1KmwRTNH6k1v4PyWYYnhbT39WfKMbBjSxVQRdi19cyJrULSWhjxaQfJHeWx5Z8Ev4bSPByBeQBFl2~4vqy0S5RypINsRSa3MZdbiAAyn5tr5slWR6QdoqY3qBQgBJFZppy-3iWkFqqKgSxCPundF8gdDLC5ddizl~KYcYKl42y9SGFHIukH-TZs8~em0~iahzsqWVRks3zRG~tlBcX2U3M2~OJs~C33-NKhyfZT7-XFBREvb8Szmd~p66jDxrwOnKaku-G6DyoQipJqIz4VHmY9-y5T8RrUcJcM-5lVoMpAAAA.i2p/announce.php=http://tracker.mastertracker.i2p/"
|
||||||
// , "Galen", "http://5jpwQMI5FT303YwKa5Rd38PYSX04pbIKgTaKQsWbqoWjIfoancFdWCShXHLI5G5ofOb0Xu11vl2VEMyPsg1jUFYSVnu4-VfMe3y4TKTR6DTpetWrnmEK6m2UXh91J5DZJAKlgmO7UdsFlBkQfR2rY853-DfbJtQIFl91tbsmjcA5CGQi4VxMFyIkBzv-pCsuLQiZqOwWasTlnzey8GcDAPG1LDcvfflGV~6F5no9mnuisZPteZKlrv~~TDoXTj74QjByWc4EOYlwqK8sbU9aOvz~s31XzErbPTfwiawiaZ0RUI-IDrKgyvmj0neuFTWgjRGVTH8bz7cBZIc3viy6ioD-eMQOrXaQL0TCWZUelRwHRvgdPiQrxdYQs7ixkajeHzxi-Pq0EMm5Vbh3j3Q9kfUFW3JjFDA-MLB4g6XnjCbM5J1rC0oOBDCIEfhQkszru5cyLjHiZ5yeA0VThgu~c7xKHybv~OMXION7V8pBKOgET7ZgAkw1xgYe3Kkyq5syAAAA.i2p/tr/announce.php=http://galen.i2p/tr/"
|
// , "Galen", "http://5jpwQMI5FT303YwKa5Rd38PYSX04pbIKgTaKQsWbqoWjIfoancFdWCShXHLI5G5ofOb0Xu11vl2VEMyPsg1jUFYSVnu4-VfMe3y4TKTR6DTpetWrnmEK6m2UXh91J5DZJAKlgmO7UdsFlBkQfR2rY853-DfbJtQIFl91tbsmjcA5CGQi4VxMFyIkBzv-pCsuLQiZqOwWasTlnzey8GcDAPG1LDcvfflGV~6F5no9mnuisZPteZKlrv~~TDoXTj74QjByWc4EOYlwqK8sbU9aOvz~s31XzErbPTfwiawiaZ0RUI-IDrKgyvmj0neuFTWgjRGVTH8bz7cBZIc3viy6ioD-eMQOrXaQL0TCWZUelRwHRvgdPiQrxdYQs7ixkajeHzxi-Pq0EMm5Vbh3j3Q9kfUFW3JjFDA-MLB4g6XnjCbM5J1rC0oOBDCIEfhQkszru5cyLjHiZ5yeA0VThgu~c7xKHybv~OMXION7V8pBKOgET7ZgAkw1xgYe3Kkyq5syAAAA.i2p/tr/announce.php=http://galen.i2p/tr/"
|
||||||
, "crstrack", "http://b4G9sCdtfvccMAXh~SaZrPqVQNyGQbhbYMbw6supq2XGzbjU4NcOmjFI0vxQ8w1L05twmkOvg5QERcX6Mi8NQrWnR0stLExu2LucUXg1aYjnggxIR8TIOGygZVIMV3STKH4UQXD--wz0BUrqaLxPhrm2Eh9Hwc8TdB6Na4ShQUq5Xm8D4elzNUVdpM~RtChEyJWuQvoGAHY3ppX-EJJLkiSr1t77neS4Lc-KofMVmgI9a2tSSpNAagBiNI6Ak9L1T0F9uxeDfEG9bBSQPNMOSUbAoEcNxtt7xOW~cNOAyMyGydwPMnrQ5kIYPY8Pd3XudEko970vE0D6gO19yoBMJpKx6Dh50DGgybLQ9CpRaynh2zPULTHxm8rneOGRcQo8D3mE7FQ92m54~SvfjXjD2TwAVGI~ae~n9HDxt8uxOecAAvjjJ3TD4XM63Q9TmB38RmGNzNLDBQMEmJFpqQU8YeuhnS54IVdUoVQFqui5SfDeLXlSkh4vYoMU66pvBfWbAAAA.i2p/tracker/announce.php=http://crstrack.i2p/tracker/"
|
"POSTMAN", "http://tracker2.postman.i2p/announce.php=http://tracker2.postman.i2p/"
|
||||||
|
,"WELTERDE", "http://BGKmlDOoH3RzFbPRfRpZV2FjpVj8~3moFftw5-dZfDf2070TOe8Tf2~DAVeaM6ZRLdmFEt~9wyFL8YMLMoLoiwGEH6IGW6rc45tstN68KsBDWZqkTohV1q9XFgK9JnCwE~Oi89xLBHsLMTHOabowWM6dkC8nI6QqJC2JODqLPIRfOVrDdkjLwtCrsckzLybNdFmgfoqF05UITDyczPsFVaHtpF1sRggOVmdvCM66otyonlzNcJbn59PA-R808vUrCPMGU~O9Wys0i-NoqtIbtWfOKnjCRFMNw5ex4n9m5Sxm9e20UkpKG6qzEuvKZWi8vTLe1NW~CBrj~vG7I3Ok4wybUFflBFOaBabxYJLlx4xTE1zJIVxlsekmAjckB4v-cQwulFeikR4LxPQ6mCQknW2HZ4JQIq6hL9AMabxjOlYnzh7kjOfRGkck8YgeozcyTvcDUcUsOuSTk06L4kdrv8h2Cozjbloi5zl6KTbj5ZTciKCxi73Pn9grICn-HQqEAAAA.i2p/a=http://tracker.welterde.i2p/stats?mode=top5"
|
||||||
|
, "CRSTRACK", "http://b4G9sCdtfvccMAXh~SaZrPqVQNyGQbhbYMbw6supq2XGzbjU4NcOmjFI0vxQ8w1L05twmkOvg5QERcX6Mi8NQrWnR0stLExu2LucUXg1aYjnggxIR8TIOGygZVIMV3STKH4UQXD--wz0BUrqaLxPhrm2Eh9Hwc8TdB6Na4ShQUq5Xm8D4elzNUVdpM~RtChEyJWuQvoGAHY3ppX-EJJLkiSr1t77neS4Lc-KofMVmgI9a2tSSpNAagBiNI6Ak9L1T0F9uxeDfEG9bBSQPNMOSUbAoEcNxtt7xOW~cNOAyMyGydwPMnrQ5kIYPY8Pd3XudEko970vE0D6gO19yoBMJpKx6Dh50DGgybLQ9CpRaynh2zPULTHxm8rneOGRcQo8D3mE7FQ92m54~SvfjXjD2TwAVGI~ae~n9HDxt8uxOecAAvjjJ3TD4XM63Q9TmB38RmGNzNLDBQMEmJFpqQU8YeuhnS54IVdUoVQFqui5SfDeLXlSkh4vYoMU66pvBfWbAAAA.i2p/tracker/announce.php=http://crstrack.i2p/tracker/"
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/** comma delimited list of name=announceURL=baseURL for the trackers to be displayed */
|
/** comma delimited list of name=announceURL=baseURL for the trackers to be displayed */
|
||||||
|
@ -56,10 +56,11 @@ public class Storage
|
|||||||
boolean changed;
|
boolean changed;
|
||||||
|
|
||||||
/** The default piece size. */
|
/** The default piece size. */
|
||||||
private static int MIN_PIECE_SIZE = 256*1024;
|
private static final int MIN_PIECE_SIZE = 256*1024;
|
||||||
private static int MAX_PIECE_SIZE = 1024*1024;
|
public static final int MAX_PIECE_SIZE = 1024*1024;
|
||||||
/** The maximum number of pieces in a torrent. */
|
/** The maximum number of pieces in a torrent. */
|
||||||
private static long MAX_PIECES = 100*1024/20;
|
public static final int MAX_PIECES = 10*1024;
|
||||||
|
public static final long MAX_TOTAL_SIZE = MAX_PIECE_SIZE * (long) MAX_PIECES;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new storage based on the supplied MetaInfo. This will
|
* Creates a new storage based on the supplied MetaInfo. This will
|
||||||
@ -189,6 +190,9 @@ public class Storage
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/** FIXME we can run out of fd's doing this,
|
||||||
|
* maybe some sort of global close-RAF-right-away flag
|
||||||
|
* would do the trick */
|
||||||
private void fast_digestCreate() throws IOException {
|
private void fast_digestCreate() throws IOException {
|
||||||
// Calculate piece_hashes
|
// Calculate piece_hashes
|
||||||
SHA1 digest = new SHA1();
|
SHA1 digest = new SHA1();
|
||||||
|
@ -373,7 +373,7 @@ public class TrackerClient extends I2PAppThread
|
|||||||
*/
|
*/
|
||||||
public static String urlencode(byte[] bs)
|
public static String urlencode(byte[] bs)
|
||||||
{
|
{
|
||||||
StringBuffer sb = new StringBuffer(bs.length*3);
|
StringBuilder sb = new StringBuilder(bs.length*3);
|
||||||
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;
|
||||||
|
@ -82,14 +82,9 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
// we want it to go to the base URI so we don't refresh with some funky action= value
|
// we want it to go to the base URI so we don't refresh with some funky action= value
|
||||||
out.write("<meta http-equiv=\"refresh\" content=\"60;" + req.getRequestURI() + peerString + "\">\n");
|
out.write("<meta http-equiv=\"refresh\" content=\"60;" + req.getRequestURI() + peerString + "\">\n");
|
||||||
out.write(HEADER);
|
out.write(HEADER);
|
||||||
|
out.write("</head><body>");
|
||||||
out.write("<table border=\"0\" width=\"100%\">\n");
|
out.write("<center><div class=\"page\"><table border=\"0\" width=\"100%\"><tr><td align=\"center\" class=\"snarkTitle\"><a href=\"" + req.getRequestURI() + peerString + "\" title=\"I2PSnark (Manual Page Refresh)\"><img src=\"/themes/console/images/i2psnark.png\" alt=\"I2PSnark Anonymous BitTorrent Client\" border=\"0\" class=\"snarklogo\"></a></table>");
|
||||||
out.write("<tr><td width=\"20%\" class=\"snarkTitle\" valign=\"top\" align=\"left\">");
|
out.write("<div class=\"snarknavbar\"><a href=\"http://forum.i2p/viewforum.php?f=21\" class=\"snarkRefresh\" target=\"_blank\">Forum</a>\n");
|
||||||
out.write("I2PSnark<br />\n");
|
|
||||||
out.write("<table border=\"0\" width=\"100%\">\n");
|
|
||||||
out.write("<tr><td><a href=\"" + req.getRequestURI() + peerString + "\" class=\"snarkRefresh\">Refresh</a>\n");
|
|
||||||
out.write("<td><a href=\"http://forum.i2p/viewforum.php?f=21\" class=\"snarkRefresh\">Forum</a>\n");
|
|
||||||
int count = 0;
|
|
||||||
Map trackers = _manager.getTrackers();
|
Map trackers = _manager.getTrackers();
|
||||||
for (Iterator iter = trackers.entrySet().iterator(); iter.hasNext(); ) {
|
for (Iterator iter = trackers.entrySet().iterator(); iter.hasNext(); ) {
|
||||||
Map.Entry entry = (Map.Entry)iter.next();
|
Map.Entry entry = (Map.Entry)iter.next();
|
||||||
@ -99,20 +94,16 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
if (e < 0)
|
if (e < 0)
|
||||||
continue;
|
continue;
|
||||||
baseURL = baseURL.substring(e + 1);
|
baseURL = baseURL.substring(e + 1);
|
||||||
if (count++ % 2 == 0)
|
out.write("<a href=\"" + baseURL + "\" class=\"snarkRefresh\" target=\"_blank\">" + name + "</a>");
|
||||||
out.write("<tr>");
|
|
||||||
out.write("<td><a href=\"" + baseURL + "\" class=\"snarkRefresh\">" + name + "</a>\n");
|
|
||||||
}
|
}
|
||||||
if (count % 2 == 1)
|
out.write("</div>\n");
|
||||||
out.write("<td> \n");
|
out.write("<div class=\"mainsection\"><div class=\"snarkMessages\"><table><tr><td align=\"left\"><pre>");
|
||||||
out.write("</table>\n");
|
|
||||||
out.write("</td><td width=\"80%\" class=\"snarkMessages\" valign=\"top\" align=\"left\"><pre>");
|
|
||||||
List msgs = _manager.getMessages();
|
List msgs = _manager.getMessages();
|
||||||
for (int i = msgs.size()-1; i >= 0; i--) {
|
for (int i = msgs.size()-1; i >= 0; i--) {
|
||||||
String msg = (String)msgs.get(i);
|
String msg = (String)msgs.get(i);
|
||||||
out.write(msg + "\n");
|
out.write(msg + "\n");
|
||||||
}
|
}
|
||||||
out.write("</pre></td></tr></table>\n");
|
out.write("</pre></td></tr></table></div>");
|
||||||
|
|
||||||
List snarks = getSortedSnarks(req);
|
List snarks = getSortedSnarks(req);
|
||||||
String uri = req.getRequestURI();
|
String uri = req.getRequestURI();
|
||||||
@ -124,7 +115,7 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
out.write("(<a href=\"" + req.getRequestURI() + "?p=1" + "\">Show Peers</a>)<br />\n");
|
out.write("(<a href=\"" + req.getRequestURI() + "?p=1" + "\">Show Peers</a>)<br />\n");
|
||||||
}
|
}
|
||||||
out.write(TABLE_HEADER2);
|
out.write(TABLE_HEADER2);
|
||||||
out.write("<th align=\"left\" valign=\"top\">");
|
out.write("<th align=\"left\">");
|
||||||
if (_manager.util().connected())
|
if (_manager.util().connected())
|
||||||
out.write("<a href=\"" + uri + "?action=StopAll&nonce=" + _nonce +
|
out.write("<a href=\"" + uri + "?action=StopAll&nonce=" + _nonce +
|
||||||
"\" title=\"Stop all torrents and the i2p tunnel\">Stop All</a>");
|
"\" title=\"Stop all torrents and the i2p tunnel\">Stop All</a>");
|
||||||
@ -144,12 +135,12 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
out.write(TABLE_EMPTY);
|
out.write(TABLE_EMPTY);
|
||||||
} else if (snarks.size() > 1) {
|
} else if (snarks.size() > 1) {
|
||||||
out.write("<tfoot><tr>\n" +
|
out.write("<tfoot><tr>\n" +
|
||||||
" <th align=\"left\" valign=\"top\" colspan=\"2\">Totals (" + snarks.size() + " torrents, " + stats[4] + " connected peers)</th>\n" +
|
" <th align=\"left\" colspan=\"2\">Totals (" + snarks.size() + " torrents, " + stats[4] + " connected peers)</th>\n" +
|
||||||
" <th> </th>\n" +
|
" <th> </th>\n" +
|
||||||
" <th align=\"right\" valign=\"top\">" + formatSize(stats[0]) + "</th>\n" +
|
" <th align=\"right\">" + formatSize(stats[0]) + "</th>\n" +
|
||||||
" <th align=\"right\" valign=\"top\">" + formatSize(stats[1]) + "</th>\n" +
|
" <th align=\"right\">" + formatSize(stats[1]) + "</th>\n" +
|
||||||
" <th align=\"right\" valign=\"top\">" + formatSize(stats[2]) + "ps</th>\n" +
|
" <th align=\"right\">" + formatSize(stats[2]) + "ps</th>\n" +
|
||||||
" <th align=\"right\" valign=\"top\">" + formatSize(stats[3]) + "ps</th>\n" +
|
" <th align=\"right\">" + formatSize(stats[3]) + "ps</th>\n" +
|
||||||
" <th> </th></tr>\n" +
|
" <th> </th></tr>\n" +
|
||||||
"</tfoot>\n");
|
"</tfoot>\n");
|
||||||
}
|
}
|
||||||
@ -173,6 +164,7 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
} else if ("Add torrent".equals(action)) {
|
} else if ("Add torrent".equals(action)) {
|
||||||
String newFile = req.getParameter("newFile");
|
String newFile = req.getParameter("newFile");
|
||||||
String newURL = req.getParameter("newURL");
|
String newURL = req.getParameter("newURL");
|
||||||
|
// NOTE - newFile currently disabled in HTML form - see below
|
||||||
File f = null;
|
File f = null;
|
||||||
if ( (newFile != null) && (newFile.trim().length() > 0) )
|
if ( (newFile != null) && (newFile.trim().length() > 0) )
|
||||||
f = new File(newFile.trim());
|
f = new File(newFile.trim());
|
||||||
@ -326,7 +318,7 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
_manager.updateConfig(dataDir, autoStart, seedPct, eepHost, eepPort, i2cpHost, i2cpPort, i2cpOpts, upLimit, upBW, useOpenTrackers, openTrackers);
|
_manager.updateConfig(dataDir, autoStart, seedPct, eepHost, eepPort, i2cpHost, i2cpPort, i2cpOpts, upLimit, upBW, useOpenTrackers, openTrackers);
|
||||||
} else if ("Create torrent".equals(action)) {
|
} else if ("Create torrent".equals(action)) {
|
||||||
String baseData = req.getParameter("baseFile");
|
String baseData = req.getParameter("baseFile");
|
||||||
if (baseData != null) {
|
if (baseData != null && baseData.trim().length() > 0) {
|
||||||
File baseFile = new File(_manager.getDataDir(), baseData);
|
File baseFile = new File(_manager.getDataDir(), baseData);
|
||||||
String announceURL = req.getParameter("announceURL");
|
String announceURL = req.getParameter("announceURL");
|
||||||
String announceURLOther = req.getParameter("announceURLOther");
|
String announceURLOther = req.getParameter("announceURLOther");
|
||||||
@ -359,9 +351,11 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
} else {
|
} else {
|
||||||
_manager.addMessage("Cannot create a torrent for the nonexistent data: " + baseFile.getAbsolutePath());
|
_manager.addMessage("Cannot create a torrent for the nonexistent data: " + baseFile.getAbsolutePath());
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
_manager.addMessage("Error creating torrent - you must enter a file or directory");
|
||||||
}
|
}
|
||||||
} else if ("StopAll".equals(action)) {
|
} else if ("StopAll".equals(action)) {
|
||||||
_manager.addMessage("Stopping all torrents and closing the I2P tunnel");
|
_manager.addMessage("Stopping all torrents and closing the I2P tunnel.");
|
||||||
List snarks = getSortedSnarks(req);
|
List snarks = getSortedSnarks(req);
|
||||||
for (int i = 0; i < snarks.size(); i++) {
|
for (int i = 0; i < snarks.size(); i++) {
|
||||||
Snark snark = (Snark)snarks.get(i);
|
Snark snark = (Snark)snarks.get(i);
|
||||||
@ -370,10 +364,10 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
}
|
}
|
||||||
if (_manager.util().connected()) {
|
if (_manager.util().connected()) {
|
||||||
_manager.util().disconnect();
|
_manager.util().disconnect();
|
||||||
_manager.addMessage("I2P tunnel closed");
|
_manager.addMessage("I2P tunnel closed.");
|
||||||
}
|
}
|
||||||
} else if ("StartAll".equals(action)) {
|
} else if ("StartAll".equals(action)) {
|
||||||
_manager.addMessage("Opening the I2P tunnel and starting all torrents");
|
_manager.addMessage("Opening the I2P tunnel and starting all torrents.");
|
||||||
List snarks = getSortedSnarks(req);
|
List snarks = getSortedSnarks(req);
|
||||||
for (int i = 0; i < snarks.size(); i++) {
|
for (int i = 0; i < snarks.size(); i++) {
|
||||||
Snark snark = (Snark)snarks.get(i);
|
Snark snark = (Snark)snarks.get(i);
|
||||||
@ -397,7 +391,7 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final int MAX_DISPLAYED_FILENAME_LENGTH = 60;
|
private static final int MAX_DISPLAYED_FILENAME_LENGTH = 44;
|
||||||
private static final int MAX_DISPLAYED_ERROR_LENGTH = 40;
|
private static final int MAX_DISPLAYED_ERROR_LENGTH = 40;
|
||||||
private void displaySnark(PrintWriter out, Snark snark, String uri, int row, long stats[], boolean showPeers, boolean showDebug) throws IOException {
|
private void displaySnark(PrintWriter out, Snark snark, String uri, int row, long stats[], boolean showPeers, boolean showDebug) throws IOException {
|
||||||
String filename = snark.torrent;
|
String filename = snark.torrent;
|
||||||
@ -492,59 +486,61 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
|
|
||||||
String rowClass = (row % 2 == 0 ? "snarkTorrentEven" : "snarkTorrentOdd");
|
String rowClass = (row % 2 == 0 ? "snarkTorrentEven" : "snarkTorrentOdd");
|
||||||
out.write("<tr class=\"" + rowClass + "\">");
|
out.write("<tr class=\"" + rowClass + "\">");
|
||||||
out.write("<td valign=\"top\" align=\"left\" class=\"snarkTorrentStatus " + rowClass + "\">");
|
out.write("<td align=\"left\" class=\"snarkTorrentStatus " + rowClass + "\">");
|
||||||
out.write(statusString + "</td>\n\t");
|
out.write(statusString + "</td>\n\t");
|
||||||
out.write("<td valign=\"top\" align=\"left\" class=\"snarkTorrentName " + rowClass + "\">");
|
out.write("<td align=\"left\" class=\"snarkTorrentName " + rowClass + "\">");
|
||||||
|
|
||||||
if (remaining == 0)
|
if (remaining == 0)
|
||||||
out.write("<a href=\"" + _manager.linkPrefix() + snark.meta.getName()
|
out.write("<a href=\"" + _manager.linkPrefix() + snark.meta.getName()
|
||||||
+ "\" title=\"Download the completed file\">");
|
+ "\" title=\"Click to access completed downloaded..\">");
|
||||||
out.write(filename);
|
out.write(filename);
|
||||||
if (remaining == 0)
|
if (remaining == 0)
|
||||||
out.write("</a>");
|
out.write("</a>");
|
||||||
// temporarily hardcoded for postman and anonymity, requires bytemonsoon patch for lookup by info_hash
|
// temporarily hardcoded for postman* and anonymity, requires bytemonsoon patch for lookup by info_hash
|
||||||
String announce = snark.meta.getAnnounce();
|
String announce = snark.meta.getAnnounce();
|
||||||
if (announce.startsWith("http://YRgrgTLG") || announce.startsWith("http://8EoJZIKr")) {
|
if (announce.startsWith("http://YRgrgTLG") || announce.startsWith("http://8EoJZIKr") ||
|
||||||
|
announce.startsWith("http://lnQ6yoBT") || announce.startsWith("http://tracker2.postman.i2p/")) {
|
||||||
Map trackers = _manager.getTrackers();
|
Map trackers = _manager.getTrackers();
|
||||||
for (Iterator iter = trackers.entrySet().iterator(); iter.hasNext(); ) {
|
for (Iterator iter = trackers.entrySet().iterator(); iter.hasNext(); ) {
|
||||||
Map.Entry entry = (Map.Entry)iter.next();
|
Map.Entry entry = (Map.Entry)iter.next();
|
||||||
String name = (String)entry.getKey();
|
String name = (String)entry.getKey();
|
||||||
String baseURL = (String)entry.getValue();
|
String baseURL = (String)entry.getValue();
|
||||||
if (!baseURL.startsWith(announce))
|
if (!(baseURL.startsWith(announce) || // vvv hack for non-b64 announce in list vvv
|
||||||
|
(announce.startsWith("http://lnQ6yoBT") && baseURL.startsWith("http://tracker2.postman.i2p/"))))
|
||||||
continue;
|
continue;
|
||||||
int e = baseURL.indexOf('=');
|
int e = baseURL.indexOf('=');
|
||||||
if (e < 0)
|
if (e < 0)
|
||||||
continue;
|
continue;
|
||||||
baseURL = baseURL.substring(e + 1);
|
baseURL = baseURL.substring(e + 1);
|
||||||
out.write(" (<a href=\"" + baseURL + "details.php?dllist=1&filelist=1&info_hash=");
|
out.write(" [<a href=\"" + baseURL + "details.php?dllist=1&filelist=1&info_hash=");
|
||||||
out.write(TrackerClient.urlencode(snark.meta.getInfoHash()));
|
out.write(TrackerClient.urlencode(snark.meta.getInfoHash()));
|
||||||
out.write("\" title=\"" + name + " Tracker\">Details</a>)");
|
out.write("\" title=\"" + name + " Tracker\">Details</a>]");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
out.write("</td>\n\t");
|
out.write("</td>\n\t");
|
||||||
|
|
||||||
out.write("<td valign=\"top\" align=\"right\" class=\"snarkTorrentETA " + rowClass + "\">");
|
out.write("<td align=\"right\" class=\"snarkTorrentETA " + rowClass + "\">");
|
||||||
if(isRunning && remainingSeconds > 0)
|
if(isRunning && remainingSeconds > 0)
|
||||||
out.write(DataHelper.formatDuration(remainingSeconds*1000)); // (eta 6h)
|
out.write(DataHelper.formatDuration(remainingSeconds*1000)); // (eta 6h)
|
||||||
out.write("</td>\n\t");
|
out.write("</td>\n\t");
|
||||||
out.write("<td valign=\"top\" align=\"right\" class=\"snarkTorrentDownloaded " + rowClass + "\">");
|
out.write("<td align=\"right\" class=\"snarkTorrentDownloaded " + rowClass + "\">");
|
||||||
if (remaining > 0)
|
if (remaining > 0)
|
||||||
out.write(formatSize(total-remaining) + "/" + formatSize(total)); // 18MB/3GB
|
out.write(formatSize(total-remaining) + "/" + formatSize(total)); // 18MB/3GB
|
||||||
else
|
else
|
||||||
out.write(formatSize(total)); // 3GB
|
out.write(formatSize(total)); // 3GB
|
||||||
out.write("</td>\n\t");
|
out.write("</td>\n\t");
|
||||||
out.write("<td valign=\"top\" align=\"right\" class=\"snarkTorrentUploaded " + rowClass
|
out.write("<td align=\"right\" class=\"snarkTorrentUploaded " + rowClass
|
||||||
+ "\">" + formatSize(uploaded) + "</td>\n\t");
|
+ "\">" + formatSize(uploaded) + "</td>\n\t");
|
||||||
out.write("<td valign=\"top\" align=\"right\" class=\"snarkTorrentRate\">");
|
out.write("<td align=\"right\" class=\"snarkTorrentRate\">");
|
||||||
if(isRunning && remaining > 0)
|
if(isRunning && remaining > 0)
|
||||||
out.write(formatSize(downBps) + "ps");
|
out.write(formatSize(downBps) + "ps");
|
||||||
out.write("</td>\n\t");
|
out.write("</td>\n\t");
|
||||||
out.write("<td valign=\"top\" align=\"right\" class=\"snarkTorrentRate\">");
|
out.write("<td align=\"right\" class=\"snarkTorrentRate\">");
|
||||||
if(isRunning)
|
if(isRunning)
|
||||||
out.write(formatSize(upBps) + "ps");
|
out.write(formatSize(upBps) + "ps");
|
||||||
out.write("</td>\n\t");
|
out.write("</td>\n\t");
|
||||||
out.write("<td valign=\"top\" align=\"left\" class=\"snarkTorrentAction " + rowClass + "\">");
|
out.write("<td align=\"left\" class=\"snarkTorrentAction " + rowClass + "\">");
|
||||||
String parameters = "&nonce=" + _nonce + "&torrent=" + Base64.encode(snark.meta.getInfoHash());
|
String parameters = "&nonce=" + _nonce + "&torrent=" + Base64.encode(snark.meta.getInfoHash());
|
||||||
if (showPeers)
|
if (showPeers)
|
||||||
parameters = parameters + "&p=1";
|
parameters = parameters + "&p=1";
|
||||||
@ -571,7 +567,7 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
out.write("<tr class=\"" + rowClass + "\">");
|
out.write("<tr class=\"" + rowClass + "\">");
|
||||||
out.write("<td class=\"snarkTorrentStatus " + rowClass + "\">");
|
out.write("<td class=\"snarkTorrentStatus " + rowClass + "\">");
|
||||||
out.write("</td>\n\t");
|
out.write("</td>\n\t");
|
||||||
out.write("<td valign=\"top\" align=\"right\" class=\"snarkTorrentStatus " + rowClass + "\">");
|
out.write("<td align=\"right\" class=\"snarkTorrentStatus " + rowClass + "\">");
|
||||||
String ch = peer.toString().substring(0, 4);
|
String ch = peer.toString().substring(0, 4);
|
||||||
String client;
|
String client;
|
||||||
if ("AwMD".equals(ch))
|
if ("AwMD".equals(ch))
|
||||||
@ -586,6 +582,8 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
client = "I2PSnarkXL";
|
client = "I2PSnarkXL";
|
||||||
else if ("ZV".equals(ch.substring(2,4)))
|
else if ("ZV".equals(ch.substring(2,4)))
|
||||||
client = "Robert";
|
client = "Robert";
|
||||||
|
else if ("VUZP".equals(ch))
|
||||||
|
client = "Robert";
|
||||||
else
|
else
|
||||||
client = "Unknown (" + ch + ')';
|
client = "Unknown (" + ch + ')';
|
||||||
out.write("<font size=-1>" + client + "</font> <tt>" + peer.toString().substring(5, 9) + "</tt>");
|
out.write("<font size=-1>" + client + "</font> <tt>" + peer.toString().substring(5, 9) + "</tt>");
|
||||||
@ -594,7 +592,7 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
out.write("</td>\n\t");
|
out.write("</td>\n\t");
|
||||||
out.write("<td class=\"snarkTorrentStatus " + rowClass + "\">");
|
out.write("<td class=\"snarkTorrentStatus " + rowClass + "\">");
|
||||||
out.write("</td>\n\t");
|
out.write("</td>\n\t");
|
||||||
out.write("<td valign=\"top\" align=\"right\" class=\"snarkTorrentStatus " + rowClass + "\">");
|
out.write("<td align=\"right\" class=\"snarkTorrentStatus " + rowClass + "\">");
|
||||||
float pct = (float) (100.0 * (float) peer.completed() / snark.meta.getPieces());
|
float pct = (float) (100.0 * (float) peer.completed() / snark.meta.getPieces());
|
||||||
if (pct == 100.0)
|
if (pct == 100.0)
|
||||||
out.write("<font size=-1>Seed</font>");
|
out.write("<font size=-1>Seed</font>");
|
||||||
@ -607,7 +605,7 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
out.write("</td>\n\t");
|
out.write("</td>\n\t");
|
||||||
out.write("<td class=\"snarkTorrentStatus " + rowClass + "\">");
|
out.write("<td class=\"snarkTorrentStatus " + rowClass + "\">");
|
||||||
out.write("</td>\n\t");
|
out.write("</td>\n\t");
|
||||||
out.write("<td valign=\"top\" align=\"right\" class=\"snarkTorrentStatus " + rowClass + "\">");
|
out.write("<td align=\"right\" class=\"snarkTorrentStatus " + rowClass + "\">");
|
||||||
if (remaining > 0) {
|
if (remaining > 0) {
|
||||||
if (peer.isInteresting() && !peer.isChoked()) {
|
if (peer.isInteresting() && !peer.isChoked()) {
|
||||||
out.write("<font color=#008000>");
|
out.write("<font color=#008000>");
|
||||||
@ -622,7 +620,7 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
out.write("</td>\n\t");
|
out.write("</td>\n\t");
|
||||||
out.write("<td valign=\"top\" align=\"right\" class=\"snarkTorrentStatus " + rowClass + "\">");
|
out.write("<td align=\"right\" class=\"snarkTorrentStatus " + rowClass + "\">");
|
||||||
if (pct != 100.0) {
|
if (pct != 100.0) {
|
||||||
if (peer.isInterested() && !peer.isChoking()) {
|
if (peer.isInterested() && !peer.isChoking()) {
|
||||||
out.write("<font color=#008000>");
|
out.write("<font color=#008000>");
|
||||||
@ -656,14 +654,14 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
// *not* enctype="multipart/form-data", so that the input type=file sends the filename, not the file
|
// *not* enctype="multipart/form-data", so that the input type=file sends the filename, not the file
|
||||||
out.write("<form action=\"" + uri + "\" method=\"POST\">\n");
|
out.write("<form action=\"" + uri + "\" method=\"POST\">\n");
|
||||||
out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" />\n");
|
out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" />\n");
|
||||||
out.write("<span class=\"snarkConfigTitle\">Add Torrent:</span><br />\n");
|
out.write("<div class=\"addtorrentsection\"><span class=\"snarkConfigTitle\">Add Torrent:</span><br />\n");
|
||||||
out.write("From URL : <input type=\"text\" name=\"newURL\" size=\"80\" value=\"" + newURL + "\" /> \n");
|
out.write("From URL : <input type=\"text\" name=\"newURL\" size=\"80\" value=\"" + newURL + "\" /> \n");
|
||||||
// not supporting from file at the moment, since the file name passed isn't always absolute (so it may not resolve)
|
// not supporting from file at the moment, since the file name passed isn't always absolute (so it may not resolve)
|
||||||
//out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br />\n");
|
//out.write("From file: <input type=\"file\" name=\"newFile\" size=\"50\" value=\"" + newFile + "\" /><br />\n");
|
||||||
out.write("<input type=\"submit\" value=\"Add torrent\" name=\"action\" /><br />\n");
|
out.write("<input type=\"submit\" value=\"Add torrent\" name=\"action\" /><br />\n");
|
||||||
out.write("<span class=\"snarkAddInfo\">Alternately, you can copy .torrent files to " + _manager.getDataDir().getAbsolutePath() + "<br />\n");
|
out.write("<span class=\"snarkAddInfo\">Alternately, you can copy .torrent files to " + _manager.getDataDir().getAbsolutePath() + "<br />\n");
|
||||||
out.write("Removing that .torrent file will cause the torrent to stop.<br /></span>\n");
|
out.write("Removing that .torrent file will cause the torrent to stop.<br /></span>\n");
|
||||||
out.write("</form>\n</span>\n");
|
out.write("</form>\n</span></div>");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void writeSeedForm(PrintWriter out, HttpServletRequest req) throws IOException {
|
private void writeSeedForm(PrintWriter out, HttpServletRequest req) throws IOException {
|
||||||
@ -672,7 +670,7 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
if (baseFile == null)
|
if (baseFile == null)
|
||||||
baseFile = "";
|
baseFile = "";
|
||||||
|
|
||||||
out.write("<span class=\"snarkNewTorrent\"><hr />\n");
|
out.write("<div class=\"newtorrentsection\"><span class=\"snarkNewTorrent\">\n");
|
||||||
// *not* enctype="multipart/form-data", so that the input type=file sends the filename, not the file
|
// *not* enctype="multipart/form-data", so that the input type=file sends the filename, not the file
|
||||||
out.write("<form action=\"" + uri + "\" method=\"POST\">\n");
|
out.write("<form action=\"" + uri + "\" method=\"POST\">\n");
|
||||||
out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" />\n");
|
out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" />\n");
|
||||||
@ -696,7 +694,7 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
out.write("or <input type=\"text\" name=\"announceURLOther\" size=\"50\" value=\"http://\" " +
|
out.write("or <input type=\"text\" name=\"announceURLOther\" size=\"50\" value=\"http://\" " +
|
||||||
"title=\"Custom tracker URL\" /> ");
|
"title=\"Custom tracker URL\" /> ");
|
||||||
out.write("<input type=\"submit\" value=\"Create torrent\" name=\"action\" />\n");
|
out.write("<input type=\"submit\" value=\"Create torrent\" name=\"action\" />\n");
|
||||||
out.write("</form>\n</span>\n");
|
out.write("</form>\n</span></div>");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void writeConfigForm(PrintWriter out, HttpServletRequest req) throws IOException {
|
private void writeConfigForm(PrintWriter out, HttpServletRequest req) throws IOException {
|
||||||
@ -708,7 +706,7 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
//int seedPct = 0;
|
//int seedPct = 0;
|
||||||
|
|
||||||
out.write("<form action=\"" + uri + "\" method=\"POST\">\n");
|
out.write("<form action=\"" + uri + "\" method=\"POST\">\n");
|
||||||
out.write("<span class=\"snarkConfig\"><hr />\n");
|
out.write("<div class=\"configsection\"><span class=\"snarkConfig\">\n");
|
||||||
out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" />\n");
|
out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" />\n");
|
||||||
out.write("<span class=\"snarkConfigTitle\">Configuration:</span><br />\n");
|
out.write("<span class=\"snarkConfigTitle\">Configuration:</span><br />\n");
|
||||||
out.write("Data directory: <input type=\"text\" size=\"40\" name=\"dataDir\" value=\"" + dataDir + "\" ");
|
out.write("Data directory: <input type=\"text\" size=\"40\" name=\"dataDir\" value=\"" + dataDir + "\" ");
|
||||||
@ -738,7 +736,7 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
out.write("Total uploader limit: <input type=\"text\" name=\"upLimit\" value=\""
|
out.write("Total uploader limit: <input type=\"text\" name=\"upLimit\" value=\""
|
||||||
+ _manager.util().getMaxUploaders() + "\" size=\"3\" maxlength=\"3\" /> peers<br />\n");
|
+ _manager.util().getMaxUploaders() + "\" size=\"3\" maxlength=\"3\" /> peers<br />\n");
|
||||||
out.write("Up bandwidth limit: <input type=\"text\" name=\"upBW\" value=\""
|
out.write("Up bandwidth limit: <input type=\"text\" name=\"upBW\" value=\""
|
||||||
+ _manager.util().getMaxUpBW() + "\" size=\"3\" maxlength=\"3\" /> KBps <i>(Router Up BW / 2 recommended)</i><br />\n");
|
+ _manager.util().getMaxUpBW() + "\" size=\"3\" maxlength=\"3\" /> KBps <i>(Half <a href=\"/config.jsp\" target=\"blank\">available bandwidth</a> recommended.)</i><br />\n");
|
||||||
|
|
||||||
out.write("Use open trackers also: <input type=\"checkbox\" name=\"useOpenTrackers\" value=\"true\" "
|
out.write("Use open trackers also: <input type=\"checkbox\" name=\"useOpenTrackers\" value=\"true\" "
|
||||||
+ (useOpenTrackers ? "checked " : "")
|
+ (useOpenTrackers ? "checked " : "")
|
||||||
@ -746,7 +744,7 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
out.write("Announce URLs: <input type=\"text\" name=\"openTrackers\" value=\""
|
out.write("Announce URLs: <input type=\"text\" name=\"openTrackers\" value=\""
|
||||||
+ openTrackers + "\" size=\"50\" /><br />\n");
|
+ openTrackers + "\" size=\"50\" /><br />\n");
|
||||||
|
|
||||||
//out.write("<hr />\n");
|
//out.write("\n");
|
||||||
out.write("EepProxy host: <input type=\"text\" name=\"eepHost\" value=\""
|
out.write("EepProxy host: <input type=\"text\" name=\"eepHost\" value=\""
|
||||||
+ _manager.util().getEepProxyHost() + "\" size=\"15\" /> ");
|
+ _manager.util().getEepProxyHost() + "\" size=\"15\" /> ");
|
||||||
out.write("port: <input type=\"text\" name=\"eepPort\" value=\""
|
out.write("port: <input type=\"text\" name=\"eepPort\" value=\""
|
||||||
@ -755,7 +753,7 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
+ _manager.util().getI2CPHost() + "\" size=\"15\" /> ");
|
+ _manager.util().getI2CPHost() + "\" size=\"15\" /> ");
|
||||||
out.write("port: <input type=\"text\" name=\"i2cpPort\" value=\"" +
|
out.write("port: <input type=\"text\" name=\"i2cpPort\" value=\"" +
|
||||||
+ _manager.util().getI2CPPort() + "\" size=\"5\" maxlength=\"5\" /> <br />\n");
|
+ _manager.util().getI2CPPort() + "\" size=\"5\" maxlength=\"5\" /> <br />\n");
|
||||||
StringBuffer opts = new StringBuffer(64);
|
StringBuilder opts = new StringBuilder(64);
|
||||||
Map options = new TreeMap(_manager.util().getI2CPOptions());
|
Map options = new TreeMap(_manager.util().getI2CPOptions());
|
||||||
for (Iterator iter = options.entrySet().iterator(); iter.hasNext(); ) {
|
for (Iterator iter = options.entrySet().iterator(); iter.hasNext(); ) {
|
||||||
Map.Entry entry = (Map.Entry)iter.next();
|
Map.Entry entry = (Map.Entry)iter.next();
|
||||||
@ -767,7 +765,7 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
+ opts.toString() + "\" /><br />\n");
|
+ opts.toString() + "\" /><br />\n");
|
||||||
out.write("<input type=\"submit\" value=\"Save configuration\" name=\"action\" />\n");
|
out.write("<input type=\"submit\" value=\"Save configuration\" name=\"action\" />\n");
|
||||||
out.write("</span>\n");
|
out.write("</span>\n");
|
||||||
out.write("</form>\n");
|
out.write("</form></div>");
|
||||||
}
|
}
|
||||||
|
|
||||||
// rounding makes us look faster :)
|
// rounding makes us look faster :)
|
||||||
@ -784,98 +782,33 @@ public class I2PSnarkServlet extends HttpServlet {
|
|||||||
|
|
||||||
private static final String HEADER_BEGIN = "<html>\n" +
|
private static final String HEADER_BEGIN = "<html>\n" +
|
||||||
"<head>\n" +
|
"<head>\n" +
|
||||||
"<title>I2PSnark - anonymous bittorrent</title>\n";
|
"<title>I2PSnark - Anonymous BitTorrent Client</title>\n";
|
||||||
|
|
||||||
private static final String HEADER = "<style>\n" +
|
private static final String HEADER = "<link href=\"../themes/console/snark.css\" rel=\"stylesheet\" type=\"text/css\" />";
|
||||||
"body {\n" +
|
|
||||||
" background-color: #C7CFB4;\n" +
|
|
||||||
"}\n" +
|
|
||||||
".snarkTitle {\n" +
|
|
||||||
" text-align: left;\n" +
|
|
||||||
" float: left;\n" +
|
|
||||||
" margin: 0px 0px 5px 5px;\n" +
|
|
||||||
" display: inline;\n" +
|
|
||||||
" font-size: 16pt;\n" +
|
|
||||||
" font-weight: bold;\n" +
|
|
||||||
"}\n" +
|
|
||||||
".snarkRefresh {\n" +
|
|
||||||
" font-size: 10pt;\n" +
|
|
||||||
"}\n" +
|
|
||||||
".snarkMessages {\n" +
|
|
||||||
" border: none;\n" +
|
|
||||||
" background-color: #CECFC6;\n" +
|
|
||||||
" font-family: monospace;\n" +
|
|
||||||
" font-size: 10pt;\n" +
|
|
||||||
" font-weight: 100;\n" +
|
|
||||||
" width: 100%;\n" +
|
|
||||||
" text-align: left;\n" +
|
|
||||||
" margin: 0px 0px 0px 0px;\n" +
|
|
||||||
" border: 0px;\n" +
|
|
||||||
" padding: 5px;\n" +
|
|
||||||
" border-width: 0px;\n" +
|
|
||||||
" border-spacing: 0px;\n" +
|
|
||||||
"}\n" +
|
|
||||||
"table {\n" +
|
|
||||||
" margin: 0px 0px 0px 0px;\n" +
|
|
||||||
" border: 0px;\n" +
|
|
||||||
" padding: 0px;\n" +
|
|
||||||
" border-width: 0px;\n" +
|
|
||||||
" border-spacing: 0px;\n" +
|
|
||||||
"}\n" +
|
|
||||||
"th {\n" +
|
|
||||||
" background-color: #C7D5D5;\n" +
|
|
||||||
" padding: 0px 7px 0px 3px;\n" +
|
|
||||||
"}\n" +
|
|
||||||
"td {\n" +
|
|
||||||
" padding: 0px 7px 0px 3px;\n" +
|
|
||||||
"}\n" +
|
|
||||||
".snarkTorrentEven {\n" +
|
|
||||||
" background-color: #E7E7E7;\n" +
|
|
||||||
"}\n" +
|
|
||||||
".snarkTorrentOdd {\n" +
|
|
||||||
" background-color: #DDDDCC;\n" +
|
|
||||||
"}\n" +
|
|
||||||
".snarkNewTorrent {\n" +
|
|
||||||
" font-size: 10pt;\n" +
|
|
||||||
"}\n" +
|
|
||||||
".snarkAddInfo {\n" +
|
|
||||||
" font-size: 10pt;\n" +
|
|
||||||
"}\n" +
|
|
||||||
".snarkConfigTitle {\n" +
|
|
||||||
" font-size: 12pt;\n" +
|
|
||||||
" font-weight: bold;\n" +
|
|
||||||
"}\n" +
|
|
||||||
".snarkConfig {\n" +
|
|
||||||
" font-size: 10pt;\n" +
|
|
||||||
"}\n" +
|
|
||||||
"</style>\n" +
|
|
||||||
"</head>\n" +
|
|
||||||
"<body>\n";
|
|
||||||
|
|
||||||
|
|
||||||
private static final String TABLE_HEADER = "<table border=\"0\" class=\"snarkTorrents\" width=\"100%\" cellpadding=\"0 10px\">\n" +
|
private static final String TABLE_HEADER = "<table border=\"0\" class=\"snarkTorrents\" width=\"100%\" cellpadding=\"0 10px\">\n" +
|
||||||
"<thead>\n" +
|
"<thead>\n" +
|
||||||
"<tr><th align=\"left\" valign=\"top\">Status \n";
|
"<tr><th align=\"left\">Status \n";
|
||||||
|
|
||||||
private static final String TABLE_HEADER2 = "</th>\n" +
|
private static final String TABLE_HEADER2 = "</th>\n" +
|
||||||
" <th align=\"left\" valign=\"top\">Torrent</th>\n" +
|
" <th align=\"left\">Torrent</th>\n" +
|
||||||
" <th align=\"right\" valign=\"top\">ETA</th>\n" +
|
" <th align=\"right\">ETA</th>\n" +
|
||||||
" <th align=\"right\" valign=\"top\">Downloaded</th>\n" +
|
" <th align=\"right\">Downloaded</th>\n" +
|
||||||
" <th align=\"right\" valign=\"top\">Uploaded</th>\n" +
|
" <th align=\"right\">Uploaded</th>\n" +
|
||||||
" <th align=\"right\" valign=\"top\">Down Rate</th>\n" +
|
" <th align=\"right\">Down Rate</th>\n" +
|
||||||
" <th align=\"right\" valign=\"top\">Up Rate</th>\n";
|
" <th align=\"right\">Up Rate</th>\n";
|
||||||
|
|
||||||
private static final String TABLE_EMPTY = "<tr class=\"snarkTorrentEven\">" +
|
private static final String TABLE_EMPTY = "<tr class=\"snarkTorrentEven\">" +
|
||||||
"<td class=\"snarkTorrentEven\" align=\"left\"" +
|
"<td class=\"snarkTorrentEven\" align=\"center\"" +
|
||||||
" valign=\"top\" colspan=\"8\">No torrents</td></tr>\n";
|
" colspan=\"8\"><i>No torrents loaded.</i></td></tr>\n";
|
||||||
|
|
||||||
private static final String TABLE_FOOTER = "</table>\n";
|
private static final String TABLE_FOOTER = "</table></div>\n";
|
||||||
|
|
||||||
private static final String FOOTER = "</body></html>";
|
private static final String FOOTER = "</div></div></div></center></body></html>";
|
||||||
}
|
|
||||||
|
|
||||||
|
/** inner class, don't bother reindenting */
|
||||||
class FetchAndAdd implements Runnable {
|
private static class FetchAndAdd implements Runnable {
|
||||||
private SnarkManager _manager;
|
private SnarkManager _manager;
|
||||||
private String _url;
|
private String _url;
|
||||||
public FetchAndAdd(SnarkManager mgr, String url) {
|
public FetchAndAdd(SnarkManager mgr, String url) {
|
||||||
@ -927,3 +860,5 @@ class FetchAndAdd implements Runnable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -2,6 +2,7 @@ package org.klomp.snark.web;
|
|||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
|
import net.i2p.I2PAppContext;
|
||||||
import net.i2p.util.FileUtil;
|
import net.i2p.util.FileUtil;
|
||||||
|
|
||||||
import org.mortbay.jetty.Server;
|
import org.mortbay.jetty.Server;
|
||||||
@ -22,7 +23,7 @@ public class RunStandalone {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void start() {
|
public void start() {
|
||||||
File workDir = new File("work");
|
File workDir = new File(I2PAppContext.getGlobalContext().getTempDir(), "jetty-work");
|
||||||
boolean workDirRemoved = FileUtil.rmdir(workDir, false);
|
boolean workDirRemoved = FileUtil.rmdir(workDir, false);
|
||||||
if (!workDirRemoved)
|
if (!workDirRemoved)
|
||||||
System.err.println("ERROR: Unable to remove Jetty temporary work directory");
|
System.err.println("ERROR: Unable to remove Jetty temporary work directory");
|
||||||
@ -32,6 +33,8 @@ public class RunStandalone {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
_server = new Server("jetty-i2psnark.xml");
|
_server = new Server("jetty-i2psnark.xml");
|
||||||
|
// just blow up NPE if we don't have a context
|
||||||
|
(_server.getContexts()[0]).setTempDirectory(workDir);
|
||||||
_server.start();
|
_server.start();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
@ -1,6 +1,12 @@
|
|||||||
<?xml version="1.0" encoding="ISO-8859-1" ?>
|
<?xml version="1.0" encoding="ISO-8859-1" ?>
|
||||||
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure 1.2//EN" "http://jetty.mortbay.org/configure_1_2.dtd">
|
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure 1.2//EN" "http://jetty.mortbay.org/configure_1_2.dtd">
|
||||||
|
|
||||||
|
<!-- =============================================================== -->
|
||||||
|
<!-- This is the configuration for a standalone i2psnark and -->
|
||||||
|
<!-- jetty instance connecting to a router in another jvm. -->
|
||||||
|
<!-- Run it with the launch-i2psnark script. -->
|
||||||
|
<!-- i2psnark will be accessed at http://127.0.0.1:8002/ -->
|
||||||
|
<!-- =============================================================== -->
|
||||||
|
|
||||||
<!-- =============================================================== -->
|
<!-- =============================================================== -->
|
||||||
<!-- Configure the Jetty Server -->
|
<!-- Configure the Jetty Server -->
|
||||||
@ -12,7 +18,7 @@
|
|||||||
<!-- =============================================================== -->
|
<!-- =============================================================== -->
|
||||||
|
|
||||||
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
||||||
<!-- Add and configure a HTTP listener to port 8080 -->
|
<!-- Add and configure a HTTP listener to port 8002 -->
|
||||||
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
||||||
<Call name="addListener">
|
<Call name="addListener">
|
||||||
<Arg>
|
<Arg>
|
||||||
@ -23,7 +29,7 @@
|
|||||||
<Set name="port">8002</Set>
|
<Set name="port">8002</Set>
|
||||||
</New>
|
</New>
|
||||||
</Arg>
|
</Arg>
|
||||||
<Set name="MinThreads">3</Set>
|
<Set name="MinThreads">1</Set>
|
||||||
<Set name="MaxThreads">10</Set>
|
<Set name="MaxThreads">10</Set>
|
||||||
<Set name="MaxIdleTimeMs">30000</Set>
|
<Set name="MaxIdleTimeMs">30000</Set>
|
||||||
<Set name="LowResourcePersistTimeMs">1000</Set>
|
<Set name="LowResourcePersistTimeMs">1000</Set>
|
||||||
@ -34,45 +40,6 @@
|
|||||||
</Arg>
|
</Arg>
|
||||||
</Call>
|
</Call>
|
||||||
|
|
||||||
|
|
||||||
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
|
||||||
<!-- Add a HTTPS SSL listener on port 8443 -->
|
|
||||||
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
|
||||||
<!-- UNCOMMENT TO ACTIVATE
|
|
||||||
<Call name="addListener">
|
|
||||||
<Arg>
|
|
||||||
<New class="org.mortbay.http.SunJsseListener">
|
|
||||||
<Set name="Port">8443</Set>
|
|
||||||
<Set name="PoolName">main</Set>
|
|
||||||
<Set name="Keystore"><SystemProperty name="jetty.home" default="."/>/etc/demokeystore</Set>
|
|
||||||
<Set name="Password">OBF:1vny1zlo1x8e1vnw1vn61x8g1zlu1vn4</Set>
|
|
||||||
<Set name="KeyPassword">OBF:1u2u1wml1z7s1z7a1wnl1u2g</Set>
|
|
||||||
<Set name="NonPersistentUserAgent">MSIE 5</Set>
|
|
||||||
</New>
|
|
||||||
</Arg>
|
|
||||||
</Call>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
|
||||||
<!-- Add a AJP13 listener on port 8009 -->
|
|
||||||
<!-- This protocol can be used with mod_jk in apache, IIS etc. -->
|
|
||||||
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
|
||||||
<!--
|
|
||||||
<Call name="addListener">
|
|
||||||
<Arg>
|
|
||||||
<New class="org.mortbay.http.ajp.AJP13Listener">
|
|
||||||
<Set name="PoolName">ajp</Set>
|
|
||||||
<Set name="Port">8009</Set>
|
|
||||||
<Set name="MinThreads">3</Set>
|
|
||||||
<Set name="MaxThreads">20</Set>
|
|
||||||
<Set name="MaxIdleTimeMs">0</Set>
|
|
||||||
<Set name="confidentialPort">443</Set>
|
|
||||||
</New>
|
|
||||||
</Arg>
|
|
||||||
</Call>
|
|
||||||
-->
|
|
||||||
|
|
||||||
|
|
||||||
<!-- =============================================================== -->
|
<!-- =============================================================== -->
|
||||||
<!-- Configure the Contexts -->
|
<!-- Configure the Contexts -->
|
||||||
<!-- =============================================================== -->
|
<!-- =============================================================== -->
|
||||||
@ -91,20 +58,6 @@
|
|||||||
<Arg>webapps/i2psnark.war</Arg>
|
<Arg>webapps/i2psnark.war</Arg>
|
||||||
</Call>
|
</Call>
|
||||||
|
|
||||||
<!-- =============================================================== -->
|
|
||||||
<!-- Configure the Request Log -->
|
|
||||||
<!-- =============================================================== -->
|
|
||||||
<Set name="RequestLog">
|
|
||||||
<New class="org.mortbay.http.NCSARequestLog">
|
|
||||||
<Arg>./logs/yyyy_mm_dd.i2psnark-request.log</Arg>
|
|
||||||
<Set name="retainDays">90</Set>
|
|
||||||
<Set name="append">true</Set>
|
|
||||||
<Set name="extended">false</Set>
|
|
||||||
<Set name="buffered">false</Set>
|
|
||||||
<Set name="LogTimeZone">GMT</Set>
|
|
||||||
</New>
|
|
||||||
</Set>
|
|
||||||
|
|
||||||
<!-- =============================================================== -->
|
<!-- =============================================================== -->
|
||||||
<!-- Configure the Other Server Options -->
|
<!-- Configure the Other Server Options -->
|
||||||
<!-- =============================================================== -->
|
<!-- =============================================================== -->
|
||||||
|
8
apps/i2psnark/launch-i2psnark
Executable file
8
apps/i2psnark/launch-i2psnark
Executable file
@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# This launches i2psnark and jetty in a separate jvm.
|
||||||
|
# The file jetty-i2psnark.xml must be present in the current directory.
|
||||||
|
# i2psnark will be accessed at http://127.0.0.1:8002/
|
||||||
|
#
|
||||||
|
I2P="."
|
||||||
|
java -cp "$I2P/lib/i2psnark.jar:$I2P/lib/i2p.jar:$I2P/lib/mstreaming.jar:$I2P/lib/streaming.jar:$I2P/lib/commons-el.jar:$I2P/lib/commons-logging.jar:$I2P/lib/jasper-compiler.jar:$I2P/lib/jasper-runtime.jar:$I2P/lib/javax.servlet.jar:$I2P/lib/org.mortbay.jetty.jar" org.klomp.snark.web.RunStandalone "$@"
|
@ -1,6 +1,6 @@
|
|||||||
To run I2PSnark from the command line, run "java -jar lib/i2psnark.jar", but
|
To run I2PSnark from the command line, run "java -jar lib/i2psnark.jar", but
|
||||||
to run it with the web UI, run "java -jar launch-i2psnark.jar". I2PSnark is
|
to run it with the web UI, run "launch-i2psnark". I2PSnark is
|
||||||
GPL'ed software, based on Snark (http://www.klomp.org/) to run on top of I2P
|
GPL'ed software, based on Snark (http://www.klomp.org/) to run on top of I2P
|
||||||
(http://www.i2p.net/) within a webserver (such as the bundled Jetty from
|
(http://www.i2p2.de/) within a webserver (such as the bundled Jetty from
|
||||||
http://jetty.mortbay.org/). For more information about I2PSnark, get in touch
|
http://jetty.mortbay.org/). For more information about I2PSnark, get in touch
|
||||||
with the folks at http://forum.i2p.net/
|
with the folks at http://forum.i2p2.de/
|
||||||
|
@ -22,6 +22,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" />
|
||||||
@ -29,7 +30,9 @@
|
|||||||
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:../../ministreaming/java/build/mstreaming.jar" />
|
classpath="../../../core/java/build/i2p.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/i2ptunnel.jar" basedir="./build/obj" includes="**/*.class">
|
<jar destfile="./build/i2ptunnel.jar" basedir="./build/obj" includes="**/*.class">
|
||||||
@ -52,7 +55,7 @@
|
|||||||
<mkdir dir="../jsp/WEB-INF/" />
|
<mkdir dir="../jsp/WEB-INF/" />
|
||||||
<mkdir dir="../jsp/WEB-INF/classes" />
|
<mkdir dir="../jsp/WEB-INF/classes" />
|
||||||
<!-- there are various jspc ant tasks, but they all seem a bit flakey -->
|
<!-- there are various jspc ant tasks, but they all seem a bit flakey -->
|
||||||
<java classname="org.apache.jasper.JspC" fork="true" >
|
<java classname="org.apache.jasper.JspC" fork="true" failonerror="true">
|
||||||
<classpath>
|
<classpath>
|
||||||
<pathelement location="../../jetty/jettylib/jasper-compiler.jar" />
|
<pathelement location="../../jetty/jettylib/jasper-compiler.jar" />
|
||||||
<pathelement location="../../jetty/jettylib/jasper-runtime.jar" />
|
<pathelement location="../../jetty/jettylib/jasper-runtime.jar" />
|
||||||
@ -73,6 +76,7 @@
|
|||||||
</java>
|
</java>
|
||||||
<javac debug="true" deprecation="on" source="1.5" target="1.5"
|
<javac debug="true" deprecation="on" source="1.5" target="1.5"
|
||||||
destdir="../jsp/WEB-INF/classes/" srcdir="../jsp/WEB-INF/classes" includes="**/*.java">
|
destdir="../jsp/WEB-INF/classes/" srcdir="../jsp/WEB-INF/classes" includes="**/*.java">
|
||||||
|
<compilerarg line="${javac.compilerargs}" />
|
||||||
<classpath>
|
<classpath>
|
||||||
<pathelement location="../../jetty/jettylib/jasper-runtime.jar" />
|
<pathelement location="../../jetty/jettylib/jasper-runtime.jar" />
|
||||||
<pathelement location="../../jetty/jettylib/javax.servlet.jar" />
|
<pathelement location="../../jetty/jettylib/javax.servlet.jar" />
|
||||||
|
@ -14,7 +14,7 @@ import net.i2p.util.Log;
|
|||||||
*/
|
*/
|
||||||
class BufferLogger implements Logging {
|
class BufferLogger implements Logging {
|
||||||
private final static Log _log = new Log(BufferLogger.class);
|
private final static Log _log = new Log(BufferLogger.class);
|
||||||
private ByteArrayOutputStream _baos;
|
private ByteArrayOutputStream _baos; // should be final and use a factory. LINT
|
||||||
private boolean _ignore;
|
private boolean _ignore;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -59,13 +59,16 @@ class HTTPResponseOutputStream extends FilterOutputStream {
|
|||||||
_buf1 = new byte[1];
|
_buf1 = new byte[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void write(int c) throws IOException {
|
public void write(int c) throws IOException {
|
||||||
_buf1[0] = (byte)c;
|
_buf1[0] = (byte)c;
|
||||||
write(_buf1, 0, 1);
|
write(_buf1, 0, 1);
|
||||||
}
|
}
|
||||||
|
@Override
|
||||||
public void write(byte buf[]) throws IOException {
|
public void write(byte buf[]) throws IOException {
|
||||||
write(buf, 0, buf.length);
|
write(buf, 0, buf.length);
|
||||||
}
|
}
|
||||||
|
@Override
|
||||||
public void write(byte buf[], int off, int len) throws IOException {
|
public void write(byte buf[], int off, int len) throws IOException {
|
||||||
if (_headerWritten) {
|
if (_headerWritten) {
|
||||||
out.write(buf, off, len);
|
out.write(buf, off, len);
|
||||||
@ -207,6 +210,7 @@ class HTTPResponseOutputStream extends FilterOutputStream {
|
|||||||
out.write("\r\n".getBytes()); // end of the headers
|
out.write("\r\n".getBytes()); // end of the headers
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void close() throws IOException {
|
public void close() throws IOException {
|
||||||
out.close();
|
out.close();
|
||||||
}
|
}
|
||||||
@ -303,11 +307,13 @@ class HTTPResponseOutputStream extends FilterOutputStream {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "Read: " + getTotalRead() + " expanded: " + getTotalExpanded() + " remaining: " + getRemaining() + " finished: " + getFinished();
|
return "Read: " + getTotalRead() + " expanded: " + getTotalExpanded() + " remaining: " + getRemaining() + " finished: " + getFinished();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return super.toString() + ": " + _in;
|
return super.toString() + ": " + _in;
|
||||||
}
|
}
|
||||||
|
@ -75,7 +75,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
|||||||
private static long __tunnelId = 0;
|
private static long __tunnelId = 0;
|
||||||
private long _tunnelId;
|
private long _tunnelId;
|
||||||
private Properties _clientOptions;
|
private Properties _clientOptions;
|
||||||
private List _sessions;
|
private final List<I2PSession> _sessions;
|
||||||
|
|
||||||
public static final int PACKET_DELAY = 100;
|
public static final int PACKET_DELAY = 100;
|
||||||
|
|
||||||
@ -89,10 +89,10 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
|||||||
|
|
||||||
private static final String nocli_args[] = { "-nocli", "-die"};
|
private static final String nocli_args[] = { "-nocli", "-die"};
|
||||||
|
|
||||||
private List tasks = new ArrayList();
|
private final List tasks = new ArrayList();
|
||||||
private int next_task_id = 1;
|
private int next_task_id = 1;
|
||||||
|
|
||||||
private Set listeners = new HashSet();
|
private final Set listeners = new HashSet();
|
||||||
|
|
||||||
public static void main(String[] args) throws IOException {
|
public static void main(String[] args) throws IOException {
|
||||||
new I2PTunnel(args);
|
new I2PTunnel(args);
|
||||||
@ -179,7 +179,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
List getSessions() {
|
List<I2PSession> getSessions() {
|
||||||
synchronized (_sessions) {
|
synchronized (_sessions) {
|
||||||
return new ArrayList(_sessions);
|
return new ArrayList(_sessions);
|
||||||
}
|
}
|
||||||
@ -372,6 +372,8 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
|||||||
}
|
}
|
||||||
|
|
||||||
privKeyFile = new File(args[2]);
|
privKeyFile = new File(args[2]);
|
||||||
|
if (!privKeyFile.isAbsolute())
|
||||||
|
privKeyFile = new File(_context.getAppDir(), args[2]);
|
||||||
if (!privKeyFile.canRead()) {
|
if (!privKeyFile.canRead()) {
|
||||||
l.log("private key file does not exist");
|
l.log("private key file does not exist");
|
||||||
_log.error(getPrefix() + "Private key file does not exist or is not readable: " + args[2]);
|
_log.error(getPrefix() + "Private key file does not exist or is not readable: " + args[2]);
|
||||||
@ -419,6 +421,8 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
|||||||
}
|
}
|
||||||
|
|
||||||
privKeyFile = new File(args[2]);
|
privKeyFile = new File(args[2]);
|
||||||
|
if (!privKeyFile.isAbsolute())
|
||||||
|
privKeyFile = new File(_context.getAppDir(), args[2]);
|
||||||
if (!privKeyFile.canRead()) {
|
if (!privKeyFile.canRead()) {
|
||||||
l.log("private key file does not exist");
|
l.log("private key file does not exist");
|
||||||
_log.error(getPrefix() + "Private key file does not exist or is not readable: " + args[2]);
|
_log.error(getPrefix() + "Private key file does not exist or is not readable: " + args[2]);
|
||||||
@ -476,6 +480,8 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
|||||||
String spoofedHost = args[2];
|
String spoofedHost = args[2];
|
||||||
|
|
||||||
privKeyFile = new File(args[3]);
|
privKeyFile = new File(args[3]);
|
||||||
|
if (!privKeyFile.isAbsolute())
|
||||||
|
privKeyFile = new File(_context.getAppDir(), args[3]);
|
||||||
if (!privKeyFile.canRead()) {
|
if (!privKeyFile.canRead()) {
|
||||||
l.log("private key file does not exist");
|
l.log("private key file does not exist");
|
||||||
_log.error(getPrefix() + "Private key file does not exist or is not readable: " + args[3]);
|
_log.error(getPrefix() + "Private key file does not exist or is not readable: " + args[3]);
|
||||||
@ -606,9 +612,9 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
|||||||
*/
|
*/
|
||||||
public void runHttpClient(String args[], Logging l) {
|
public void runHttpClient(String args[], Logging l) {
|
||||||
if (args.length >= 1 && args.length <= 3) {
|
if (args.length >= 1 && args.length <= 3) {
|
||||||
int port = -1;
|
int clientPort = -1;
|
||||||
try {
|
try {
|
||||||
port = Integer.parseInt(args[0]);
|
clientPort = Integer.parseInt(args[0]);
|
||||||
} catch (NumberFormatException nfe) {
|
} catch (NumberFormatException nfe) {
|
||||||
l.log("invalid port");
|
l.log("invalid port");
|
||||||
_log.error(getPrefix() + "Port specified is not valid: " + args[0], nfe);
|
_log.error(getPrefix() + "Port specified is not valid: " + args[0], nfe);
|
||||||
@ -642,12 +648,12 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
|||||||
I2PTunnelTask task;
|
I2PTunnelTask task;
|
||||||
ownDest = !isShared;
|
ownDest = !isShared;
|
||||||
try {
|
try {
|
||||||
task = new I2PTunnelHTTPClient(port, l, ownDest, proxy, (EventDispatcher) this, this);
|
task = new I2PTunnelHTTPClient(clientPort, l, ownDest, proxy, (EventDispatcher) this, this);
|
||||||
addtask(task);
|
addtask(task);
|
||||||
notifyEvent("httpclientTaskId", Integer.valueOf(task.getId()));
|
notifyEvent("httpclientTaskId", Integer.valueOf(task.getId()));
|
||||||
} catch (IllegalArgumentException iae) {
|
} catch (IllegalArgumentException iae) {
|
||||||
_log.error(getPrefix() + "Invalid I2PTunnel config to create an httpclient [" + host + ":"+ port + "]", iae);
|
_log.error(getPrefix() + "Invalid I2PTunnel config to create an httpclient [" + host + ":"+ clientPort + "]", iae);
|
||||||
l.log("Invalid I2PTunnel configuration [" + host + ":" + port + "]");
|
l.log("Invalid I2PTunnel configuration [" + host + ":" + clientPort + "]");
|
||||||
notifyEvent("httpclientTaskId", Integer.valueOf(-1));
|
notifyEvent("httpclientTaskId", Integer.valueOf(-1));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -668,9 +674,9 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
|||||||
*/
|
*/
|
||||||
public void runConnectClient(String args[], Logging l) {
|
public void runConnectClient(String args[], Logging l) {
|
||||||
if (args.length >= 1 && args.length <= 3) {
|
if (args.length >= 1 && args.length <= 3) {
|
||||||
int port = -1;
|
int _port = -1;
|
||||||
try {
|
try {
|
||||||
port = Integer.parseInt(args[0]);
|
_port = Integer.parseInt(args[0]);
|
||||||
} catch (NumberFormatException nfe) {
|
} catch (NumberFormatException nfe) {
|
||||||
_log.error(getPrefix() + "Port specified is not valid: " + args[0], nfe);
|
_log.error(getPrefix() + "Port specified is not valid: " + args[0], nfe);
|
||||||
return;
|
return;
|
||||||
@ -702,10 +708,10 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
|||||||
I2PTunnelTask task;
|
I2PTunnelTask task;
|
||||||
ownDest = !isShared;
|
ownDest = !isShared;
|
||||||
try {
|
try {
|
||||||
task = new I2PTunnelConnectClient(port, l, ownDest, proxy, (EventDispatcher) this, this);
|
task = new I2PTunnelConnectClient(_port, l, ownDest, proxy, (EventDispatcher) this, this);
|
||||||
addtask(task);
|
addtask(task);
|
||||||
} catch (IllegalArgumentException iae) {
|
} catch (IllegalArgumentException iae) {
|
||||||
_log.error(getPrefix() + "Invalid I2PTunnel config to create an httpclient [" + host + ":"+ port + "]", iae);
|
_log.error(getPrefix() + "Invalid I2PTunnel config to create an httpclient [" + host + ":"+ _port + "]", iae);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
l.log("connectclient <port> [<sharedClient>] [<proxy>]");
|
l.log("connectclient <port> [<sharedClient>] [<proxy>]");
|
||||||
@ -728,9 +734,9 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
|||||||
*/
|
*/
|
||||||
public void runIrcClient(String args[], Logging l) {
|
public void runIrcClient(String args[], Logging l) {
|
||||||
if (args.length >= 2) {
|
if (args.length >= 2) {
|
||||||
int port = -1;
|
int _port = -1;
|
||||||
try {
|
try {
|
||||||
port = Integer.parseInt(args[0]);
|
_port = Integer.parseInt(args[0]);
|
||||||
} catch (NumberFormatException nfe) {
|
} catch (NumberFormatException nfe) {
|
||||||
l.log("invalid port");
|
l.log("invalid port");
|
||||||
_log.error(getPrefix() + "Port specified is not valid: " + args[0], nfe);
|
_log.error(getPrefix() + "Port specified is not valid: " + args[0], nfe);
|
||||||
@ -757,12 +763,12 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
|||||||
String privateKeyFile = null;
|
String privateKeyFile = null;
|
||||||
if (args.length >= 4)
|
if (args.length >= 4)
|
||||||
privateKeyFile = args[3];
|
privateKeyFile = args[3];
|
||||||
task = new I2PTunnelIRCClient(port, args[1], l, ownDest, (EventDispatcher) this, this, privateKeyFile);
|
task = new I2PTunnelIRCClient(_port, args[1], l, ownDest, (EventDispatcher) this, this, privateKeyFile);
|
||||||
addtask(task);
|
addtask(task);
|
||||||
notifyEvent("ircclientTaskId", Integer.valueOf(task.getId()));
|
notifyEvent("ircclientTaskId", Integer.valueOf(task.getId()));
|
||||||
} catch (IllegalArgumentException iae) {
|
} catch (IllegalArgumentException iae) {
|
||||||
_log.error(getPrefix() + "Invalid I2PTunnel config to create an ircclient [" + host + ":"+ port + "]", iae);
|
_log.error(getPrefix() + "Invalid I2PTunnel config to create an ircclient [" + host + ":"+ _port + "]", iae);
|
||||||
l.log("Invalid I2PTunnel configuration [" + host + ":" + port + "]");
|
l.log("Invalid I2PTunnel configuration [" + host + ":" + _port + "]");
|
||||||
notifyEvent("ircclientTaskId", Integer.valueOf(-1));
|
notifyEvent("ircclientTaskId", Integer.valueOf(-1));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -786,9 +792,9 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
|||||||
*/
|
*/
|
||||||
public void runSOCKSTunnel(String args[], Logging l) {
|
public void runSOCKSTunnel(String args[], Logging l) {
|
||||||
if (args.length >= 1 && args.length <= 2) {
|
if (args.length >= 1 && args.length <= 2) {
|
||||||
int port = -1;
|
int _port = -1;
|
||||||
try {
|
try {
|
||||||
port = Integer.parseInt(args[0]);
|
_port = Integer.parseInt(args[0]);
|
||||||
} catch (NumberFormatException nfe) {
|
} catch (NumberFormatException nfe) {
|
||||||
l.log("invalid port");
|
l.log("invalid port");
|
||||||
_log.error(getPrefix() + "Port specified is not valid: " + args[0], nfe);
|
_log.error(getPrefix() + "Port specified is not valid: " + args[0], nfe);
|
||||||
@ -802,7 +808,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
|||||||
|
|
||||||
ownDest = !isShared;
|
ownDest = !isShared;
|
||||||
I2PTunnelTask task;
|
I2PTunnelTask task;
|
||||||
task = new I2PSOCKSTunnel(port, l, ownDest, (EventDispatcher) this, this);
|
task = new I2PSOCKSTunnel(_port, l, ownDest, (EventDispatcher) this, this);
|
||||||
addtask(task);
|
addtask(task);
|
||||||
notifyEvent("sockstunnelTaskId", Integer.valueOf(task.getId()));
|
notifyEvent("sockstunnelTaskId", Integer.valueOf(task.getId()));
|
||||||
} else {
|
} else {
|
||||||
@ -820,9 +826,9 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
|||||||
*/
|
*/
|
||||||
public void runStreamrClient(String args[], Logging l) {
|
public void runStreamrClient(String args[], Logging l) {
|
||||||
if (args.length == 3) {
|
if (args.length == 3) {
|
||||||
InetAddress host;
|
InetAddress _host;
|
||||||
try {
|
try {
|
||||||
host = InetAddress.getByName(args[0]);
|
_host = InetAddress.getByName(args[0]);
|
||||||
} catch (UnknownHostException uhe) {
|
} catch (UnknownHostException uhe) {
|
||||||
l.log("unknown host");
|
l.log("unknown host");
|
||||||
_log.error(getPrefix() + "Error resolving " + args[0], uhe);
|
_log.error(getPrefix() + "Error resolving " + args[0], uhe);
|
||||||
@ -830,9 +836,9 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int port = -1;
|
int _port = -1;
|
||||||
try {
|
try {
|
||||||
port = Integer.parseInt(args[1]);
|
_port = Integer.parseInt(args[1]);
|
||||||
} catch (NumberFormatException nfe) {
|
} catch (NumberFormatException nfe) {
|
||||||
l.log("invalid port");
|
l.log("invalid port");
|
||||||
_log.error(getPrefix() + "Port specified is not valid: " + args[0], nfe);
|
_log.error(getPrefix() + "Port specified is not valid: " + args[0], nfe);
|
||||||
@ -840,7 +846,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
StreamrConsumer task = new StreamrConsumer(host, port, args[2], l, (EventDispatcher) this, this);
|
StreamrConsumer task = new StreamrConsumer(_host, _port, args[2], l, (EventDispatcher) this, this);
|
||||||
task.startRunning();
|
task.startRunning();
|
||||||
addtask(task);
|
addtask(task);
|
||||||
notifyEvent("streamrtunnelTaskId", Integer.valueOf(task.getId()));
|
notifyEvent("streamrtunnelTaskId", Integer.valueOf(task.getId()));
|
||||||
@ -859,9 +865,9 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
|||||||
*/
|
*/
|
||||||
public void runStreamrServer(String args[], Logging l) {
|
public void runStreamrServer(String args[], Logging l) {
|
||||||
if (args.length == 2) {
|
if (args.length == 2) {
|
||||||
int port = -1;
|
int _port = -1;
|
||||||
try {
|
try {
|
||||||
port = Integer.parseInt(args[0]);
|
_port = Integer.parseInt(args[0]);
|
||||||
} catch (NumberFormatException nfe) {
|
} catch (NumberFormatException nfe) {
|
||||||
l.log("invalid port");
|
l.log("invalid port");
|
||||||
_log.error(getPrefix() + "Port specified is not valid: " + args[0], nfe);
|
_log.error(getPrefix() + "Port specified is not valid: " + args[0], nfe);
|
||||||
@ -870,6 +876,8 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
|||||||
}
|
}
|
||||||
|
|
||||||
File privKeyFile = new File(args[1]);
|
File privKeyFile = new File(args[1]);
|
||||||
|
if (!privKeyFile.isAbsolute())
|
||||||
|
privKeyFile = new File(_context.getAppDir(), args[1]);
|
||||||
if (!privKeyFile.canRead()) {
|
if (!privKeyFile.canRead()) {
|
||||||
l.log("private key file does not exist");
|
l.log("private key file does not exist");
|
||||||
_log.error(getPrefix() + "Private key file does not exist or is not readable: " + args[3]);
|
_log.error(getPrefix() + "Private key file does not exist or is not readable: " + args[3]);
|
||||||
@ -877,7 +885,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
StreamrProducer task = new StreamrProducer(port, privKeyFile, args[1], l, (EventDispatcher) this, this);
|
StreamrProducer task = new StreamrProducer(_port, privKeyFile, args[1], l, (EventDispatcher) this, this);
|
||||||
task.startRunning();
|
task.startRunning();
|
||||||
addtask(task);
|
addtask(task);
|
||||||
notifyEvent("streamrtunnelTaskId", Integer.valueOf(task.getId()));
|
notifyEvent("streamrtunnelTaskId", Integer.valueOf(task.getId()));
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user