Compare commits

...

644 Commits

Author SHA1 Message Date
zzz
7ffb3f46b5 0.7.6 2009-07-30 21:58:29 +00:00
zzz
ad6cd05295 last minute fixes 2009-07-30 17:44:08 +00:00
z3d
6e7ad3ecdb Internet Explorer fixes and kludges for the classic console theme. 2009-07-29 15:54:39 +00:00
z3d
a6243d14c0 IE classic theme fix. 2009-07-29 15:28:17 +00:00
z3d
b0a477c5ca Internet Explorer fix for classic console theme. 2009-07-29 15:03:41 +00:00
z3d
1d655c7abc Mostly last-minute enhancements to the classic theme. 2009-07-29 14:46:47 +00:00
z3d
abf2bead33 I2PTunnels CSS tweaks. 2009-07-29 10:24:52 +00:00
z3d
f1103bec7b I2PTunnels theme css tweaks. 2009-07-29 09:07:00 +00:00
z3d
fb1a6534dc Give the stats page some consideration. 2009-07-28 22:53:33 +00:00
zzz
22b1d5fe75 new reseed url 2009-07-28 13:28:13 +00:00
zzz
d2c939bc09 typo 2009-07-28 13:27:44 +00:00
z3d
73f8cb4819 Remove redundant html markup and refashion table display a la fois. 2009-07-28 13:06:19 +00:00
zzz
256bb771e1 * Add flag dimensions to speed up profiles.jsp rendering
* Fix typos in proxy error files
    * Catch i2psnark create torrent with no data entered error
      http://forum.i2p/viewtopic.php?t=3763
2009-07-27 02:53:37 +00:00
zzz
cc533b0431 * Add wrapper.config and i2prouter comments for 'portable'
* Recognize same base and config dir in WorkingDir
    * Reformat XInfoPanel in installer for clarity
2009-07-26 14:55:01 +00:00
z3d
3c76fda8d9 Ensure that both timed and event based graphs are suitably div'd up. 2009-07-25 23:46:42 +00:00
z3d
c5555350ae Get /graphs.jsp looking a bit more presentable. 2009-07-25 19:47:16 +00:00
z3d
22744084dc Theme fixes, minor graphical tweaks, fixed max-width for i2psnark console. 2009-07-25 13:56:03 +00:00
z3d
e4b212ec90 Add 'missing' reflection effect to I2PSnark logo. 2009-07-25 11:42:49 +00:00
z3d
4be0af5de5 I2PSnark UI refinements, mostly, and some tunnels page enhancements. 2009-07-25 05:24:37 +00:00
zzz
d771745981 * Throttle: Decrease default max tunnels to 2500 2009-07-24 23:10:15 +00:00
z3d
7628842b0a Version bump to -21rc. 2009-07-24 22:51:02 +00:00
z3d
6bcdb7fd92 I2PSnark: Revert to 60 seconds refresh, replace red panel with dark blue,
revert centering of torrents table centering; fix susimail centering issues (thanks postman!)
2009-07-24 22:41:23 +00:00
zzz
27561fb632 merge of '84672f771b3eea3cded1e752ce188c22ce8e6eed'
and 'aac7937e34b380e2cade781fda5e2bff4b58439f'
2009-07-24 19:23:21 +00:00
zzz
f6ec3f66f8 * Router: Support i2p.dir.base and i2p.dir.config passed in via properties 2009-07-24 15:35:58 +00:00
zzz
2f0b9a8f94 * Eepsite: Add Deutsch index page and css (thanks sperrbezirk!) 2009-07-24 14:16:16 +00:00
z3d
3fb1a4ebc5 Console and I2P tunnels tweaks: more stealth, less color clash! 2009-07-24 11:17:53 +00:00
z3d
9abb0a1581 I2PSnark: Fix bad button behaviour. 2009-07-24 01:07:07 +00:00
z3d
e60e29b70f Tidy up jobs.jsp a little and other to various ui elements. 2009-07-24 00:08:08 +00:00
z3d
d84352896f I2PSnark: Modify border decoration on messages pane. 2009-07-23 19:08:04 +00:00
z3d
ee419454f4 Remove superfluous and slightly irritating display:inline from orderered lists in light theme. 2009-07-23 18:56:12 +00:00
z3d
68445fe195 I2PSnark: Fix mouseover image margin discrepancy. 2009-07-23 18:25:22 +00:00
z3d
12b2d4c00b I2PSnark: Lose 10 whitespace vertical pixels from header. 2009-07-23 18:18:51 +00:00
z3d
fbb4d3a636 I2PSnark: Hither and yon tweaks. 2009-07-23 17:55:26 +00:00
z3d
ca415376c7 I2PSnark: Opacity fade on header logo etc. 2009-07-23 17:22:05 +00:00
z3d
718f73ebb1 I2PSnark UI changes: add a splash of color! Fix for light i2ptunnels theme. 2009-07-23 17:01:43 +00:00
z3d
fb47eef218 merge of '6a60796453a654fe4227ac80133b8d78ceea2119'
and 'ee3198caba6a88f9c23e82ba3fc5100e339803c2'
2009-07-23 12:12:42 +00:00
87dd473148 2009-07-23 sponge
* Add bob.i2p and sponge.i2p keys to hosts.txt
2009-07-23 06:57:03 +00:00
z3d
9bbbccee1a Add header graphic to i2psnark and fill out the panel colors a touch. 2009-07-23 04:28:28 +00:00
0088750b16 2009-07-23 sponge
* Fix jdk 1.6izm in BOB as per zzz
2009-07-23 00:09:32 +00:00
z3d
0aae2deb58 Swap over margin to bottom of section div lose (some of the) header whitespace. 2009-07-22 22:31:21 +00:00
z3d
0d62b37c13 Bump to 0.7.5-18 with history.txt doodle. 2009-07-22 21:49:02 +00:00
z3d
64ece1080c Ensure links don't revert to underlined and unbold after visitation in dark theme. 2009-07-22 21:37:56 +00:00
z3d
b4256e484a I2PSnark layout, themes, tunnel tables.. 2009-07-22 21:07:46 +00:00
z3d
b0ea204be5 Add a couple o' lines to history.txt to indicate updates to webapps ui's, mostly. 2009-07-21 17:17:40 +00:00
z3d
118d7fce09 Remove redundant table generation code for header links in i2psnark. (Thanks zzz!)
Also, add snark.css to the file manifest.
2009-07-21 16:37:44 +00:00
zzz
5e498e0bd6 * Console: Drop top-level css, unused now
* Eepsite: Add default robots.txt (thanks v1v4)
2009-07-21 15:46:47 +00:00
zzz
c312fa869b merge of '98b80575def2548ebf853a03d8029a40e9546ec8'
and 'e7693976cb5a07bd0477aa2d8fef1ecc9c56c3d8'
2009-07-21 15:19:37 +00:00
z3d
fe394b0b46 Add a preliminary undercoat to I2PSnark UI. 2009-07-21 04:33:13 +00:00
zzz
6039f3931d additional proxy.i2p defenses 2009-07-20 17:29:25 +00:00
zzz
71d72b426f close anchor 2009-07-20 17:24:26 +00:00
zzz
7d5042c507 add geoip license (thx Arsene) 2009-07-20 17:23:20 +00:00
zzz
e2b0e14771 drop unused class 2009-07-20 17:22:44 +00:00
z3d
0e9bfba84d Mostly cosmetic tweaks to SusiMail UI. 2009-07-20 15:37:11 +00:00
z3d
99f53413a6 More SusiDNS css and layout tweaks. 2009-07-20 12:33:07 +00:00
z3d
f46600d7fe merge of '536c1f34e7cf7013b6721728eba84470c550d50d'
and 'eed8cd82284703473ad336f20ed84fd2d22e549d'
2009-07-20 11:22:19 +00:00
z3d
0607a87514 More CSS tweaks and an intial stab at taming susidns' unruly layout! 2009-07-20 11:18:31 +00:00
zzz
1658690b97 -16 2009-07-20 02:36:10 +00:00
zzz
eae0f3273b merge of '2ecacf99140948d67649a417e7df4e2069254a43'
and 'ca7c2c0a050c4fe7bedb305b9dba557d0e2a6e69'
2009-07-20 02:35:45 +00:00
zzz
508beb2fc7 * Transports: Reduce the number of Rates 2009-07-20 01:58:43 +00:00
z3d
0de2f492d1 console.css fixes and fiddles for all 3 themes. 2009-07-20 01:27:22 +00:00
zzz
72a7393844 - Delay start of PeerTestJob 2009-07-20 00:59:02 +00:00
zzz
99f8468f63 * Stats: Increase coalesce time to 50s (was 20s) to reduce CPU use
* Peer Profiles:
      - Increase reorganize time to 45s (was 30s) to reduce CPU use
        and lock contention
      - Remove some stat rates
2009-07-20 00:39:57 +00:00
zzz
a9e8fc2f1f * Peer Profiles:
- Reduce max age for display to 2h (was 3h)
      - Drop unused Persist classes
      - Dynamically adjust expire time to control memory use
2009-07-20 00:02:34 +00:00
zzz
e225244887 * BuildHandler: Increase threshold for dropping instead
of rejecting to 81% (was 75%)
2009-07-20 00:00:49 +00:00
zzz
cbde15b00f cleanup 2009-07-19 23:59:21 +00:00
zzz
8e38047d43 add a msg for IE ppl 2009-07-19 23:59:03 +00:00
zzz
dc1d0195eb drop dup png 2009-07-19 22:35:04 +00:00
zzz
7d7f264bc0 * I2PSnark: Remove Postman tracker 2009-07-19 22:32:54 +00:00
zzz
b3c30b4fd2 * HTTP Proxy: Fix proxy.i2p "home page" (thanks dr|z3d) 2009-07-19 22:32:29 +00:00
zzz
6c87005eeb * graphs.jsp: Reduce refresh time to eliminate double iframe load 2009-07-19 22:32:01 +00:00
zzz
8d2a516044 * GeoIP: Fix minor bugs (thanks Arsene) 2009-07-19 22:31:35 +00:00
zzz
dc0cc49dbf * Console: Hide configui.jsp from IE 2009-07-19 22:31:10 +00:00
z3d
497bc5a414 Add some horizontal rules underneath I2P logo on proxy error pages. 2009-07-19 13:12:54 +00:00
z3d
2a71baef90 Proxy Error page tweaks 2009-07-19 01:16:14 +00:00
z3d
49a74e8610 merge of '65fd23854899b035bddfc78ab8f0ac486d264400'
and '6d0877ff05f02660f738c81627789087bc813cc7'
2009-07-18 23:40:59 +00:00
z3d
6340fbb3d4 Proxy Error visual enhancements, mostly. And a version bump we go, to -15! 2009-07-18 23:39:03 +00:00
z3d
748203f4e7 Intitial proxy error tweaks, readme alt tag fixology. <b>(Blame the French!) </b> 2009-07-18 21:27:57 +00:00
z3d
a91cc94228 After much ado, fix the borked i2ptunnels page. 2009-07-18 10:16:33 +00:00
zzz
029ac71e58 close anchors 2009-07-18 04:06:12 +00:00
z3d
e830b46173 Remove nasty file:// references inserted by overeager editor. 2009-07-17 23:55:27 +00:00
z3d
a4d053f555 Revert i2ptunnels main page to previous version in attempt to fix borkage. 2009-07-17 22:56:06 +00:00
z3d
b298796060 Attempting fixage of borked i2ptunnels main page. 2009-07-17 22:21:01 +00:00
z3d
895490df3d Insert some <h3>'s into various config pages and minor meddling with the css. 2009-07-17 20:57:18 +00:00
z3d
a09c06849b Introducing tr:last-child {} for last table row color differential. 2009-07-17 19:36:12 +00:00
z3d
37c494bf0a Possibly inconsequential light console.css prod. 2009-07-17 18:32:53 +00:00
z3d
d6fccc07be Prettify graphs.jsp a little. 2009-07-17 18:26:00 +00:00
z3d
819efc132b merge of '4e512b2f1429925fa1e4151b3a78ab25a74fce03'
and 'dea62f5479c0cfbb6bde3b6de73cf71b38e22304'
2009-07-17 17:33:35 +00:00
z3d
8ffdae4182 More work on the config pages. 2009-07-17 17:30:11 +00:00
zzz
efd6dcc8df drop nav.jsp 2009-07-17 16:55:00 +00:00
zzz
70a17ecfaf provide a refresh link since the refresh button brings up a POST dialog 2009-07-17 16:53:53 +00:00
z3d
15dbf67983 Config page(s) tweaked. 2009-07-17 16:52:08 +00:00
z3d
a43df30051 merge of 'c2d95c40c32ee34dcd02be699ef6ebf6f36ce971'
and 'd6b0769149a1fa18328e86f05dd4bf97d8a3ef4d'
2009-07-17 16:41:48 +00:00
z3d
1bff5a7b9e Visual overhaul of config pages. 2009-07-17 16:28:38 +00:00
z3d
ec49d9becf configstats.jsp layout tweak. 2009-07-17 15:33:18 +00:00
zzz
bc49f51dbb use custom toolbar.html in the summary bar if it exists 2009-07-17 14:54:58 +00:00
z3d
b869860a83 Restore accidentally reverted <h3> styling. Apply some polish to <code>configtunnels.jsp </code>. 2009-07-17 13:40:34 +00:00
z3d
2772a0e5e4 More I2Ptunnels page surgery. Not out of the woods yet! 2009-07-17 13:09:05 +00:00
z3d
46970f5a4a I2P Tunnels shakeup. 2009-07-17 12:26:29 +00:00
z3d
ccf9cd3f71 Dark I2PTunnels cross-browser css tweaks. 2009-07-17 04:18:48 +00:00
z3d
b9c464f8cb Light I2PTunnels theme compatibility enhancements & cosmetic tweaks. 2009-07-17 04:00:50 +00:00
z3d
48510c1157 Just when you thought it was safe. Light I2Ptunnels css jiggle.. 2009-07-17 01:10:54 +00:00
z3d
3035fcf080 Reduce wrapper.restart.delay from 60 to 15 seconds. 2009-07-16 20:15:00 +00:00
z3d
930f402eb9 merge of '024eee796b3a4a68a0e55c63997c0d76bd2cfcea'
and 'ecb5fa93e45ec4c0635cd5665d81767627da1279'
2009-07-16 19:21:28 +00:00
z3d
4e93191312 Cherry on the Chinese cake. Add an <hr> to the end of the document. 2009-07-16 19:13:38 +00:00
zzz
9bc4f6bacb Themes for HTTP Proxy error pages 2009-07-16 19:11:58 +00:00
z3d
9b42129fea Add some newlines to the Chinese readme to enhance legibility. 2009-07-16 19:06:47 +00:00
z3d
0650137e32 Minor theme tweaks. 2009-07-16 18:56:56 +00:00
z3d
a13e528972 Moderate layout changes to news.xml and initialNews.xml, customary css tweaks,
and zzz's fix for the Chinese readme issues.
2009-07-16 18:44:24 +00:00
z3d
82f8dd5635 Insert a <h2>Welcome to I2P!</h2> in the Chinese readme, in the abssence of
a native translation.
2009-07-16 17:23:08 +00:00
z3d
7f93cb22ce Apply some css love to the light theme I2P tunnel dropdowns. Insert flags
into Chinese readme.
2009-07-16 17:16:32 +00:00
z3d
e6738053b2 Fix button hover colors on Opera/webkit. 2009-07-16 16:02:29 +00:00
z3d
b74ab51438 Tidy up I2PTunnels default.css, more Konqueror compliant now. Also ensure
we're using Bitstream Vera family where possible.
2009-07-16 15:35:05 +00:00
z3d
d7a591ce3a Ensure border-radius and variants employed consistently in default.css 2009-07-16 14:17:37 +00:00
z3d
cfe33a8bbd Ensure border-radius and variants are universally applied. 2009-07-16 14:07:34 +00:00
z3d
ca7593cdf2 merge of '23804a4a389ba2bddf86a2f90989489059f43d23'
and 'c75933fb2ffbc2e40dd422af605cff9e0703d689'
2009-07-16 13:13:09 +00:00
z3d
b185d11daf Lose <h4> for confignav, and replace -webkit- with -khtml- for provisional css3 classes. 2009-07-16 12:36:31 +00:00
5106c37ac4 * ministreaming:
- small pedantic fix
    * streaming:
      - Fix a deadly race condition.
      - Some small pedantic fixes.
    * core:
      - Fix a deadly race condition.
    * BOB:
      - Fixed some races that occured from fixing races in streaming and core.
      - Some badly needed code refactoring to depend less on the database.
2009-07-16 03:03:33 +00:00
z3d
5d40ad1749 Add <code> tags to location(s) for logs. 2009-07-16 02:48:44 +00:00
z3d
24edce3daf Whitespace removal team in effect. 2009-07-16 02:28:50 +00:00
z3d
cfd1ab7d78 Refresh successful theme change message; make more context specific, indicate page refresh needed . 2009-07-16 02:26:56 +00:00
z3d
bfaa648edd Whitespace removal service. 2009-07-16 02:18:18 +00:00
z3d
fd19210bce merge of '190d75864ece264849a59ab577e727896beef958'
and 'eacae4019ad4aa25c458d7757ba38cee4ea2aaa4'
2009-07-16 02:03:16 +00:00
z3d
9a3b103324 Reduce size of log level overrides writeable area so it dosen't overflow the page. 2009-07-16 02:01:26 +00:00
zzz
0ee5c905e4 merge of '5f552b9cd9f53addefd86c744aa05bd620028649'
and '7bf5ea7cfe5da14f19ed0be2af63fcad3e2e54c1'
2009-07-16 01:57:39 +00:00
zzz
5f22a226cc fix compile error 2009-07-16 01:55:14 +00:00
z3d
56b3144c56 Cosmetic tweaks to configui and config pages. 2009-07-16 01:44:56 +00:00
z3d
dad4bef70c merge of '3b23dcff9410a7f2e8443cdaa410ead6d9694f29'
and 'fd87a1b95a60a0e5c18d75aed057344e8ce5aa87'
2009-07-16 00:10:58 +00:00
z3d
13a04dba71 Upgrade <h4> to <h3> in logs.jsp. 2009-07-16 00:07:25 +00:00
z3d
ab66dfcb65 Cosmetic tweaks and under the radar flag sabotage. 2009-07-15 23:57:28 +00:00
z3d
ab349a5303 Return of the nth-child! 2009-07-15 23:32:46 +00:00
zzz
53a68ff5a3 Make light the default theme 2009-07-15 22:56:53 +00:00
zzz
29f13868b7 * Console: Convert readme_zh.html from GB2312 to UTF-8 2009-07-15 16:28:54 +00:00
zzz
8ce71d724c * Installer: Don't launch the router from the postinstall.sh script
on linux anymore; add a panel to the installer to provide launch instructions.
2009-07-15 15:29:37 +00:00
e3de3dcc1d * Slackware SlackBuild fixes. 2009-07-15 08:51:51 +00:00
z3d
fa6a6fa4ef Remove redundant indents in English readme.html. 2009-07-15 04:19:22 +00:00
z3d
e78e4c93c0 Override left justify for links in config.jsp. Tame the beast! 2009-07-15 03:53:53 +00:00
z3d
0173f5877b More .jsp meddling. 2009-07-15 03:42:37 +00:00
z3d
32e829da74 Layout tweaks to config.jsp & help.jsp & customary css updates. 2009-07-15 03:27:29 +00:00
z3d
68e81fa8c8 Slight reordering of config.jsp content, and promotion of help sections to <h3>. 2009-07-15 02:25:49 +00:00
z3d
9f84d13542 Formatting tweaks to help.jsp & theme mods. 2009-07-15 01:59:41 +00:00
z3d
48f591eea8 Add some <hr>'s in some places. 2009-07-15 00:21:28 +00:00
z3d
cb6dce4e03 Help page tweaks, css fiddlery, and a version bump to -10! 2009-07-14 01:22:03 +00:00
z3d
e5e7f01e84 Mostly layout updates to the readme files. 2009-07-14 00:40:44 +00:00
z3d
f90a320d95 Mods to the configupdate table, throw in a couple of <hr>'s for good measure. 2009-07-13 22:52:31 +00:00
z3d
96c94a294e Bash the textarea sizes about a bit and tidy configupdate.jsp table. 2009-07-13 21:48:44 +00:00
z3d
ab81887138 merge of '12cc77e1d7d2318fa071cb9fa3741d9f64abf475'
and '7b7931f18c15ffa3b7afb35470d5d0dfd5714f30'
2009-07-13 20:32:14 +00:00
z3d
d13e3d95d3 The taming of the textarea. Part 1. 2009-07-13 20:30:16 +00:00
z3d
64f1fe0b51 Minor tweaks to make Opera experience more enjoyabale. 2009-07-13 19:52:04 +00:00
z3d
0a77f88229 <h1> and <h2> dark theme letter spacing tweak (to match light theme +-). 2009-07-13 19:27:36 +00:00
z3d
12d34a50ff Modest cosmetic enhancements to dark/light console themes. 2009-07-13 18:23:43 +00:00
zzz
92daa920d2 add dependency to get the version number right in the wrapper log 2009-07-13 17:10:51 +00:00
z3d
091d03b9d8 More theme spit 'n polish. Remove redundant themes from configui.jsp for now. 2009-07-13 16:13:22 +00:00
z3d
f7ee11cb44 More enhancements to the css.. also, let's try to use Bitstream Vera fonts on Linux
where available..
2009-07-13 13:25:18 +00:00
zzz
6226b8ae6d -9 2009-07-13 03:07:16 +00:00
zzz
a6a61421d9 merge of '1d3fdcc1394982ef7bc5c12b7aa163919c533096'
and '7069e4dcedf5578597d00177dd220e02ded3634e'
2009-07-13 03:06:06 +00:00
zzz
5c20574044 add readme files to the updater 2009-07-13 03:04:17 +00:00
zzz
aca006253a * Build Handler: Don't reject for conn limits if class O,
under the assumption that they are already talking
      to most of the routers, so there's no reason to reject. This may drive them
      to their conn. limits, but it's hopefully a temporary solution to the
      tunnel build congestion. As the net grows this will have to be revisited.
2009-07-13 02:58:54 +00:00
zzz
7a752cc7a2 * Throttle: Increase default max tunnels to 3000,
to give us more capacity during congestion
2009-07-13 02:56:35 +00:00
zzz
de7dc2c1f7 * Tunnels: Change the default variance from 1 to 0.
Under the one-packet-enough theory, and the fact that most
      tunnels in a x+1 pool are of length x, variable lengths
      don't really help that much. Also, a default of 1 led
      to all sorts of problems with iMule/SAM, who was not
      setting the variance properties.
      This will affect exploratory tunnels for new users,
      and those that have never saved a change on configtunnels.jsp,
      and iMule users 1.4.5 and earlier.
2009-07-13 02:54:47 +00:00
z3d
35b5bf187e Those pesky critters keep messing with mah code! 2009-07-13 01:15:33 +00:00
z3d
efbc4c5184 Red line removals. 2009-07-13 00:59:36 +00:00
z3d
711c2b7dfd Add some tinsel to the css. 2009-07-12 21:25:55 +00:00
z3d
a4adb4709b Commencement of tidying up of css phase. 2009-07-12 20:08:05 +00:00
z3d
7121b5fa31 merge of 'c9f62429ff1da5dab2645a23c311297bb5060a5a'
and 'd3f05848c1bb55868499e9e7d65fbf878b731f1a'
2009-07-12 03:27:18 +00:00
zzz
c944648b99 * Add configui.jsp
* orange flash remove take 2
2009-07-12 03:21:20 +00:00
z3d
45cdd556c7 Remove extraneous "other". 2009-07-11 23:22:17 +00:00
zzz
429bd0a4e3 * netdb.jsp: Fix bad tag causing orange mouseovers
* Merge as -7
2009-07-11 22:38:39 +00:00
zzz
135f8c1be2 merge of '565f0421784f8f71177ebf0bd682750f98bce67b'
and 'e9067362adb090ff1e3d8ae327fb313ded00e9c6'
2009-07-11 22:32:29 +00:00
z3d
7b7a590e21 Version bump to 0.7.5-6. 2009-07-11 21:07:02 +00:00
z3d
95728ef29f More console tweakage. 2009-07-11 20:49:01 +00:00
z3d
021b44724e Cosmetic enhancements to the router console. 2009-07-11 20:41:21 +00:00
z3d
ba0efe64c7 Minor I2Ptunnels page tweakage.. 2009-07-11 20:11:16 +00:00
zzz
1a247d8d3a -6 2009-07-11 19:44:25 +00:00
zzz
21b03e8e8a fix comment 2009-07-11 19:43:58 +00:00
zzz
03790e3e4d Remove notes about editing readme*.html, since we're probably going to start including them in the updates 2009-07-11 19:21:24 +00:00
zzz
9af239aa65 merge of '5e3805e16ba810425b936134bb3ea92c08a8b0eb'
and 'f232d5bc50d8723d65c9fcb1092ebcb8333a83e4'
2009-07-11 19:16:04 +00:00
zzz
02fc700ac0 propagate from branch 'i2p.i2p.zzz.test3' (head 20e0d7777d70412d2787ea16c8eb1ddc5fcfceae)
to branch 'i2p.i2p' (head a3189032197fadc3ecba67c5568b8841e8a6105e)
2009-07-11 19:14:26 +00:00
zzz
1fb5238642 * I2PSnark:
- Bring back details links for Postman2 B64 torrents
2009-07-11 18:49:54 +00:00
zzz
461af7d0a2 Increase SSU conn limits a little more 2009-07-11 18:47:11 +00:00
zzz
cf3efc11ba * Profile Organizer:
- Allow NTCP-only peers in inbound tunnels
2009-07-11 18:04:08 +00:00
zzz
b6e24b5094 * I2PTunnel:
- Make reduce-on-idle the default for all the shared clients
        for new installs (15m)
2009-07-11 17:59:32 +00:00
zzz
0b590763f3 * Transports:
- Move from a single connection limit threshold (80%) to
        two (75% and 87%), and only start rejecting tunnels
        at the higher threshold, to increase build success
      - Move some limit methods from the transports to TransportImpl
      - Add limit methods with a threshold argument
2009-07-11 17:00:46 +00:00
z3d
3cc4ee7199 More enhancements to the console themes. 2009-07-11 15:30:44 +00:00
z3d
4828cd2f16 Increase <h4> bottom margin. 2009-07-11 14:31:42 +00:00
z3d
45da7e8704 More spit 'n polish for the I2PTunnels page. 2009-07-11 14:28:45 +00:00
z3d
e00b88ca32 Updates to the I2PTunnel themes, mostly. 2009-07-11 12:48:07 +00:00
z3d
e497680ca8 I2PTunnels updates to dark theme, start of enhancements to "service not found"
dialogs.
2009-07-11 03:35:39 +00:00
z3d
dbb9eefe70 Comment out link to zzz's domain addkey page. 2009-07-10 21:35:09 +00:00
z3d
7388fdf820 Let's add some flags to the various translations to the console homepage readme. 2009-07-10 21:17:53 +00:00
z3d
0c46d561ec Add some alt tags to the flags on the readme.html (English only for now). 2009-07-10 15:34:22 +00:00
z3d
4248ab936c Dark console theme tweaks. 2009-07-10 14:44:38 +00:00
zzz
e5139113b1 * Build Handler: Drop rather than reject requests when near
conn limits and the next hop is not connected, to reduce
      connection congestion
2009-07-10 13:41:29 +00:00
zzz
0f1a4ad4cd * Console: Force IE to the classic theme 2009-07-10 13:38:09 +00:00
z3d
00d99fb1a9 Enhancements to the dark blue I2P tunnel theme. 2009-07-09 20:43:59 +00:00
z3d
ee8dc4af2d Remove <centre> tags from sidepanel content to restore left justification to
classic theme, whilst retaining centering for new themes.
2009-07-09 19:14:02 +00:00
z3d
d7b4be1e74 Minor futzing with the dark console theme. 2009-07-09 18:57:58 +00:00
z3d
7ed509b76a Reorder panel slightly, bring I2P services to top. 2009-07-09 09:32:34 +00:00
z3d
c616f66e83 Modifications to readme.html to include country flags; also add link to
http://stats.i2p/i2p/addkey.html
2009-07-08 10:49:16 +00:00
z3d
e8bfac27aa Tweak button css to ensure visited links don't change color (IE-fix). 2009-07-08 10:10:03 +00:00
z3d
df3b3bfc8f Light theme update, bg textures for I2PTunnel config page. 2009-07-08 09:59:51 +00:00
z3d
ac358502ce Consolidate confignav, remove extraneous title and <hr>. 2009-07-08 09:46:32 +00:00
z3d
2b905d2ed5 Dark theme updates for I2Ptunnel page. 2009-07-08 09:33:23 +00:00
z3d
49c55ae12a Move reference to i2plogo to themes/console/images/i2plogo.png (sidepanel). 2009-07-07 17:37:00 +00:00
z3d
d280d7a389 Tweaks to classic theme css to hide navbar and logo, now they're residing
in the side panel; iframe size tweaks.
2009-07-07 15:17:31 +00:00
z3d
19ccdcd951 Tweak help.jsp layout some more. *tweak tweak* 2009-07-07 08:50:33 +00:00
z3d
cac9b2e1f1 Correct <h1> oversize that crept in, somewhow. 2009-07-07 08:48:48 +00:00
z3d
e0e42a0f87 Remove tabs, replace with spaces for history.txt. Should fix formatting issues. 2009-07-07 08:22:10 +00:00
z3d
1d845dab03 Layout tweak to help page, and clarification of volunteers request. 2009-07-07 08:20:56 +00:00
z3d
71b9bb67a6 Modify visited link color to be better legible in dark console theme. 2009-07-07 08:18:13 +00:00
z3d
06be251032 Bump to 0.7.5-5 2009-07-07 01:57:49 +00:00
z3d
454a6ab177 0.7.5-5 updates. 2009-07-07 01:55:58 +00:00
z3d
1e1c3cdff0 Tweaks to light router console css. 2009-07-07 01:25:37 +00:00
z3d
52de5e569c Tweaks to dark router console css. 2009-07-07 01:24:53 +00:00
z3d
2f97942286 *facepalm* Drop pkg-temp accidentally :/ 2009-07-07 01:12:17 +00:00
z3d
4b1eabf1fc merge of '8a3fab47a669f61548d9807e8e047b19248a23ab'
and 'a3189032197fadc3ecba67c5568b8841e8a6105e'
2009-07-07 00:04:03 +00:00
z3d
6c7f1cbf8a Tidy up help page a 'lil. 2009-07-06 22:41:07 +00:00
z3d
ffc582093b Light and dark themes added. 2009-07-06 16:51:28 +00:00
z3d
cc833f3ca4 Uhoh, "ah.,". Removed. 2009-07-06 16:18:42 +00:00
z3d
00d0aa7830 Fix some glaring typos on the help page. 2009-07-06 16:03:38 +00:00
z3d
54f649a4b4 Tweaks to help page. Replace apology for sparse docs with request for voluntary contributions. 2009-07-06 13:40:20 +00:00
z3d
1c2cd4dcb2 Overhaul console layout. Add <h1> header to most pages. Etc. 2009-07-06 13:29:35 +00:00
zzz
43d6851199 -4 2009-07-06 13:11:53 +00:00
zzz
9527684cf7 propagate from branch 'i2p.i2p.zzz.test3' (head d4461db52b7de97b89dafa6d6a2b18d9dc075b38)
to branch 'i2p.i2p' (head 5529edcb3dd730aa750302bb4267116c56c354da)
2009-07-06 13:09:05 +00:00
zzz
1965815d7d fix postman2 details link 2009-07-05 21:02:54 +00:00
zzz
cc2be105a6 * I2PTunnel:
- Add edit text
      - Fix broken favicon
2009-07-05 21:00:29 +00:00
zzz
e4c599b756 * I2PSnark:
- Change postman2 announce URL to use hostname rather than B64
      - Shorten torrent name to fit better on one line
2009-07-05 19:22:58 +00:00
zzz
a8a21ddb73 * Transport: Implement NTCP auto-transition from an
address to no address, so that inbound NTCP is disabled
      after SSU detects a firewall. When UPnP was apparently successful
      but the router is still firewalled (due to an additional
      software firewall or a bad UPnP indication, for example)
      the router will now remove the NTCP address.
2009-07-05 18:48:10 +00:00
942c31621b 2009-07-05 sponge
* Added X-I2P-DestB64 and X-I2P-DestB32 http headers
2009-07-05 05:06:06 +00:00
zzz
ca14002bd1 * Startup: Log clients.config problems 2009-07-04 16:35:36 +00:00
zzz
5eec098e2b * Reseed:
- Fix console status messages broken by global replace
      - Remove tino, add b.netdb.i2p2.de
2009-07-04 14:20:03 +00:00
z3d
37043195ba merge of '25ef664ae94fb608b457b601780f6774ede7b39a'
and 'c71ada3c23327bd4f17070d019a448c0289bae63'
2009-07-04 02:52:25 +00:00
z3d
ab8e2cf34d Router console updates. Opening shots. 2009-07-04 02:39:37 +00:00
z3d
882e08fc4f Start on the console update. 2009-07-04 01:56:53 +00:00
zzz
714fe82d2f Dont send X-Accept-Encoding when not proxied 2009-07-02 19:09:36 +00:00
zzz
1724e5b499 Fix small textareas on Opera 2009-07-02 19:08:55 +00:00
zzz
a5fa6acf5d * SSUDemo: Move to the router/java/test directory 2009-07-01 17:42:55 +00:00
zzz
59105a9ad6 * HTTP Proxy: Limit proxy.i2p to /themes/ directory 2009-07-01 16:50:35 +00:00
zzz
abc23e9a49 * Move almost all uses of StringBuffer to StringBuilder,
for efficiency (thanks Arsene for the suggestion)
2009-07-01 16:00:43 +00:00
zzz
72071566e7 javadoc fix 2009-06-30 17:56:51 +00:00
zzz
055cd99dde -2 2009-06-30 13:14:31 +00:00
zzz
d2c52e5c94 merge of '44eff3cb8553cf29a7e4eb6c02f624648f91b124'
and 'f400e9b73f924edf556205f9f75b4e2c58e92998'
2009-06-30 13:11:11 +00:00
c7541f819a 2009-06-30 sponge
* General cleanup on streaming and ministreaming.
      This fixes some compile warnings, and prepares for a larger fix.
      There is no code-flow changes, just lint. One warning remains as I am
      unsure exactly how to solve the problem yet.
2009-06-30 04:44:13 +00:00
zzz
a9345953f3 remove complication as update source 2009-06-29 13:29:35 +00:00
zzz
eb324d7652 remove trailing newline (again) 2009-06-29 04:50:16 +00:00
zzz
85adfc40fb build fixup, history for prop from test branch 2009-06-29 04:20:21 +00:00
zzz
f1bb8910cb propagate from branch 'i2p.i2p.zzz.test' (head 104b5c1cea8683af30650a55d5b63141e988bb4c)
to branch 'i2p.i2p' (head 8d35e0858095b3eed3fb6d8f4ecee23cbdadfbb1)
2009-06-29 04:13:38 +00:00
zzz
8ca794dc57 history for prop from test2 branch 2009-06-29 03:21:12 +00:00
zzz
fe3cd65c62 propagate from branch 'i2p.i2p.zzz.test2' (head 91f7c17a08ea873ff7bb40835a43ba857ee7fe46)
to branch 'i2p.i2p' (head 3d86e500d1550fccc2ac29371555a1a5af2c5c2b)
2009-06-29 03:18:19 +00:00
9e1181900b * Update versions, package release
* Remove the last reference to my eepsite as a "news.xml" source,
  and likewise stop my public key from being included
  among valid release signing keys.
2009-06-29 01:07:51 +00:00
zzz
256c5356fb Add router log location to logs.jsp 2009-06-28 17:40:17 +00:00
zzz
0bc6fd246f * HTTP Proxy:
- Take CSS out of the error pages; use internal server
        for CSS, image, and favicon
2009-06-28 12:55:10 +00:00
zzz
77ce768cb4 * Console: Move favicon.ico and i2plogo.png out of the .war
so that the HTTP proxy can use them directly;
      proxy error pages must be updated next
2009-06-28 12:50:33 +00:00
zzz
b23256dc4e * HTTP Proxy:
- Add simple web server for "proxy.i2p" to serve
        images and CSS for the error pages
z
2009-06-27 17:52:08 +00:00
zzz
5906fb7139 * Console CSS: Move css file, make a classic theme to prep for CSS changes 2009-06-27 01:11:53 +00:00
zzz
0606050231 * NetDb stats: Normalize tunnel build stats for increased anonymity,
effective in 0.7.6
2009-06-27 01:08:40 +00:00
56a700e82d 2009-06-25 sponge
* Summary frame layout change so it makes sense.
2009-06-25 00:16:19 +00:00
zzz
47cd9beefa Change table headings to th tags to prep for css changes 2009-06-24 18:47:17 +00:00
zzz
b93aada213 -4 2009-06-23 15:59:30 +00:00
zzz
0ce6872693 propagate from branch 'i2p.i2p.zzz.test2' (head 42f7b1b8a91a44aed4bcc09170bbcdc52be5ff74)
to branch 'i2p.i2p' (head 84f8e11c39666abc7fac5c6cd14ab1f9532d721c)
2009-06-23 15:52:07 +00:00
zzz
1c9d84771e configupdate.jsp cleanup 2009-06-23 01:35:55 +00:00
zzz
6699366597 * Browser Launch: Add sensible-browser, x-www-browser, defaultbrowser, and
www-browser in an attempt to launch the user's preferred browser
2009-06-22 19:56:03 +00:00
zzz
5d0d7aca58 minor cleanup 2009-06-22 17:01:56 +00:00
zzz
29d0c19b0e Update: increase max retries 2009-06-22 14:50:59 +00:00
zzz
917e1023e4 Catch AIOOBE reported by tuna http://zzz.i2p/topics/332 2009-06-22 14:16:52 +00:00
zzz
1fd5a20373 Include console.css in new installs! 2009-06-22 14:07:31 +00:00
zzz
abc83362e7 Try again to prevent two EventPumpers 2009-06-22 12:57:38 +00:00
zzz
9792336b33 -3 2009-06-21 00:23:14 +00:00
zzz
4a6d0e4ba2 Fix wrapper.config installs on windows 2009-06-21 00:06:54 +00:00
zzz
bc38ca4f91 Pluck of revision 45a25185236e38606e761060427ee8fa60144a8c from branch i2p.i2p.zzz.test
---------------------------------------------------------------------------------------
    * netdb.jsp: Add country chart at bottom, clean up version chart
2009-06-21 00:03:59 +00:00
zzz
306b3017e4 Pluck of revision 493986d03c43bac019996ea0b10b8a6a40e92a32 from branch i2p.i2p.zzz.test
---------------------------------------------------------------------------------------
    * Browser Launch: Wait until the routerconsole is up before launching the browser
2009-06-21 00:01:14 +00:00
zzz
ce92b6cb66 Pluck of revision 0dc8693b99a852b0183ffc6cd06804878f37ec89 from branch i2p.i2p.zzz.test
---------------------------------------------------------------------------------------
Treat 5.0.0.0/8 (Hamachi) as local
2009-06-21 00:01:02 +00:00
zzz
8e2df567d8 Pluck of revision 546257906e9b26c3a35e38967ebcaa54098d969f from branch i2p.i2p.zzz.test
---------------------------------------------------------------------------------------
    * ReseedHandler:
      - check for upper case HREF to be compatible with apache indexes
2009-06-21 00:00:54 +00:00
zzz
4622f369c3 Pluck of revision aad5b15235be51189b696e6cabb7cc04e1b5e89f from branch i2p.i2p.zzz.test
---------------------------------------------------------------------------------------
post-0.7.4 cleanup
2009-06-21 00:00:39 +00:00
zzz
1eb4473e9d * News Fetcher:
- Change default news URL, use it instead of the old one even if
        the old one is saved in the configuration, to assist in the transition
2009-06-19 00:04:19 +00:00
22c2829714 * desktopgui:
- Added client and server tunnel view
        (saving does not work yet)
2009-06-17 21:54:29 +00:00
zzz
a87f8e8687 propagate from branch 'i2p.i2p' (head 6fddab77462a92759305edee8fe5a944d6865375)
to branch 'i2p.i2p.zzz.test' (head 45a25185236e38606e761060427ee8fa60144a8c)
2009-06-17 12:40:33 +00:00
zzz
c89fb9ad73 * PeerSelector:
- Limit exploratory tunnels to connected peers when over
        half the connection limit (was 80%)
      - Have the high capacity tier fall back to a new connected tier
        before moving on to the not failing tier
        so that tunnel build success doesn't collapse
    * PeerTestJob:
      - Limit to connected peers
2009-06-17 12:37:03 +00:00
zzz
978de73351 * netdb.jsp: Add country chart at bottom, clean up version chart 2009-06-16 18:01:43 +00:00
zzz
a1ec01ec2d * Browser Launch: Wait until the routerconsole is up before launching the browser 2009-06-16 17:38:23 +00:00
zzz
7aa9949332 * Reseeding / NetDb:
- Move reseeding from the routerconsole app to
        the router, so that we can bootstrap an embedded router lacking a routerconsole
        (iMule or android for example), without additional modifications.
        This allows better integration between the reseeding function
        and the netDb.
      - Call reseed from PersistentDataStore, not from the
        routerconsole init, and start seeding as soon as the netdb has read
        the netDb/ directory, not when the console starts.
      - Wake up the netdb reader as soon as reseeding is done,
        rather than waiting up to 60s.
      - Don't display the reseed button on the console until the
        netdb initialization is done.
    * NetDb:
      - Fix an NPE on early shutdown
    * RouterConsoleRunner:
      - Catch a class not found error better
2009-06-15 21:58:28 +00:00
zzz
71f3cd648f Fix wrapper.config issues on windows 2009-06-15 21:28:36 +00:00
zzz
7f379027ca * i2psnark build:
- Put the duplicate classes back in the war, because
        the jar is not in the wrapper.config classpath in existing
        installs. We could take them out of the jar, but then
        they won't be available for standalone snark and future
        updates via snark.
      - Delete the dist/ dir in distclean
2009-06-15 21:27:38 +00:00
zzz
279f3e4934 dont make the new dir unless we are going to move there 2009-06-15 21:20:52 +00:00
zzz
bdd75793bc cleanup 2009-06-15 15:35:25 +00:00
zzz
58660bed3c fix webapps path 2009-06-15 15:32:27 +00:00
zzz
2ca0ae7529 * i2psnark build:
- Move FetchAndAdd to static inner class
      - Remove duplicate classes from i2psnark.war (120KB);
        fixes sporadic FetchAndAdd IllegalAccessError
      - Fix standalone build to include i2psnark.jar since classes
        aren't in the .war anymore
      - Have standalone jetty use I2PAppContext temp directory
      - Replace launch-i2psnark.jar with launch-i2psnark script,
        since RunStandalone is in i2p.jar
      - Clean up jetty-i2psnark.xml, turn off jetty logging
      - Remove standalone build from the pkg target in the main build.xml
2009-06-15 15:22:51 +00:00
zzz
3ee09df6ce Treat 5.0.0.0/8 (Hamachi) as local 2009-06-15 02:41:28 +00:00
zzz
9b866b8e06 * I2PTunnel:
- fix i2ptunnel.config save location
2009-06-14 14:49:37 +00:00
zzz
4d4954c5b8 * ReseedHandler:
- check for upper case HREF to be compatible with apache indexes
2009-06-14 14:19:05 +00:00
zzz
17751ffd57 * news.xml:
- move from base to router dir
2009-06-14 13:00:23 +00:00
zzz
e8773f6a98 fix NPE for non-router invocations 2009-06-14 02:35:41 +00:00
zzz
112ddc7156 * jbigi, cpuid:
- Extract files from jar to temp dir, load from that dir, then
        copy to the base dir if we have permissions (and failing silently
        if we don't), so we have optimized libs and no complaints
        when we have a read-only base dir.
2009-06-14 01:49:27 +00:00
zzz
e5ec72b09b * ConsoleRunner:
- Fix webapps file path
    * SusiDNS:
      - Fix addressbook file path
    * Systray:
      - Fix NPE if no config file
      - Fix config file path
    * WorkingDir:
      - Modify clients.config so jetty can find the jetty.xml file
      - Rip out all the existing-installation migration code
      - Rip out migration code now done by izpack parsable
      - Fix copy of empty directories
2009-06-13 23:47:08 +00:00
zzz
24daf00616 * i2prouter:
- Don't cd to script location, no longer required
    * RouterLaunch:
      - If no wrapper, put wrapper.log in system temp dir
        unless specified with -Dwrapper.logfile=/path/to/wrapper.log
        or it already exists in CWD (for backward compatibility)
      - Append rather than replace wrapper.log
      - Pass wrapper log location to router as a property, so that logs.jsp can find it
    * logs.jsp:
      - Get wrapper log location from a property too
    * runplain.sh:
      - Add path substitution to runplain.sh on install
      - Pass I2P base dir to the router as a property
    * wrapper.config:
      - Put wrapper.log in system temp dir for new installs
      - Pass I2P base dir to the router as a property
    * WorkingDir:
      - Don't migrate an existing install by default
      - Never migrate the data (too hard)
2009-06-13 21:04:27 +00:00
zzz
718375419e propagate from branch 'i2p.i2p.zzz.dir' (head a871493662f67163f823576ba26e98322d3f896f)
to branch 'i2p.i2p.zzz.test' (head 1168ac4132d737382bf24ba8458a53a9db002ffa)
2009-06-13 14:20:17 +00:00
zzz
a16bcf8e51 pid dir defaults to system temp dir 2009-06-13 14:16:12 +00:00
zzz
5c28125350 add install path to eepget 2009-06-13 13:46:11 +00:00
zzz
937de87dbf post-0.7.4 cleanup 2009-06-13 13:34:37 +00:00
zzz
cadbe2c2c0 back to updaterWithJettyFixes 2009-06-13 13:24:03 +00:00
zzz
7c646f8693 -1 2009-06-12 13:05:35 +00:00
zzz
1479ef9a6a propagate from branch 'i2p.i2p.zzz.test' (head 1d4b529f1b52692195f1547338e186819dbd0cab)
to branch 'i2p.i2p' (head 1b8226cb70a7d72f0f674908d8213f8d29eb64eb)
2009-06-12 12:58:33 +00:00
zzz
daf078d4d7 * Installer:
- Add install and temp path substitution to wrapper.config and
        i2prouter on install
2009-06-12 12:23:25 +00:00
c0fd1dbcbc * Update versions, package release 2009-06-12 06:52:09 +00:00
zzz
821dcddda0 * Installer:
- Change the wrapper.config classpath to one line: lib/*.jar
        This means we lose control of classpath load order, so move the windows installer
        jars copy.jar, delete.jar, and exec.jar to a new installer/ directory so
        these jars won't be in the classpath or potentially conflict, since
        copy.jar and delete.jar include FileUtil.class, and we don't want to have
        to remember to add them to the updater if we ever change FileUtil.class.
        Delete the installer/ directory in postinstall.sh since it is windows-only.
2009-06-11 23:38:15 +00:00
zzz
d9cb4e2620 * Console:
- Move the console css from default.css in the .war to docs/themes/console/console.css,
        and support console themes in the main console with routerconsole.theme=foo
2009-06-11 18:05:05 +00:00
zzz
290af4c187 fix typo 2009-06-11 17:51:07 +00:00
zzz
11ad98e7bd Remove unused NoticeHelper 2009-06-11 16:24:44 +00:00
zzz
ce50a9ca44 Upgrade to izpack 4.3.0 and add a short script to fix Vista install problems.
(previous izpack was 3.7.2 from 2005-04-22)

izpack 4.3.0 from :
http://dist.codehaus.org/izpack/releases/4.3.0/IzPack-install-4.3.0.jar
SHA1 f06da6b26ac2c68fed64ab38980352989b8d8841
(no signatures or sha1sums found on website, and the jar is unsigned)
License: Apache 2.0

upack izpack:
java -jar IzPack-install-4.3.0.jar
or
java -jar IzPack-install-4.3.0.jar -console

get the standalone-compiler.jar from the installation lib/ directory:
SHA1 6d2b4a5657bfb864a333b1c4b1c0f8223aa57d80
(no signatures or sha1sums found on website, and the jar is unsigned)

This fixes the bug with the install windows centered in all the
workspaces, not the current workspace. And who knows what other
bugs in the last 4 years.

To fix Vista (and presumably Windows 7) permissiom problems,
add a run-privileged flag for those, and run the new fixperms.bat
which calls icacls to add the privileges to the install directory.

Add support for 6 more language packs found in the new release.
Change from ISO3 codes to native language names.

Disable creation of the i2p.tar.bz2 file in build.xml
(distributed as i2pheadless-0.7.x.tar.bz2), as izpack 4.3.0 now
supports headless installation with java -jar i2pinstall.exe -console.
Update INSTALL.txt and INSTALL-headless.txt accordingly.
2009-06-11 13:31:27 +00:00
zzz
b7d581b412 Dont try to dump threads unless there is a wrapper and we arent on windows 2009-06-11 13:22:56 +00:00
zzz
a08dd4aefa * NTCP: Fix startup race NPE 2009-06-09 03:06:18 +00:00
be52b5930c 2009-06-08 sponge
* Last commit for this cycle. All debugging except for WARN removed.
      I can use the visit command to debug now anyway.
2009-06-08 14:42:44 +00:00
0382120363 2009-06-08 sponge
* Removed BOB debugging as-per zzz
2009-06-08 12:24:20 +00:00
7151590abc 2009-06-08 sponge
* Fixed NPE and some other goofups in BOB.
    * BOB bump version
2009-06-08 08:34:54 +00:00
zzz
51faed2c4d -15 2009-06-07 17:40:18 +00:00
zzz
c1a8c8a3fd propagate from branch 'i2p.i2p.zzz.test' (head ff346bd41de699648bb66488ec9c0f1f4b5300b1)
to branch 'i2p.i2p' (head 2914d3356f892de25a745f061129704f8b943fc5)
2009-06-07 17:35:02 +00:00
zzz
4975d30714 * ExploratoryPeerSelector: Limit to connected peers when near connection limit 2009-06-07 17:34:27 +00:00
zzz
45d9f9d07d -14 2009-06-07 14:47:04 +00:00
zzz
9b0e553ece propagate from branch 'i2p.i2p.zzz.test' (head f92f40cceea44a063e48db07d10fd8cf7df3e348)
to branch 'i2p.i2p' (head c497aec52c49d2e03430b88d8d73148ee73e59a5)
2009-06-07 14:45:33 +00:00
zzz
dcaa0594f1 Add updaterWithJettyFixesAndGeoIP, use it for pkg for one release 2009-06-07 14:13:01 +00:00
zzz
1202a303b7 Fix UPnP deprecation 2009-06-06 18:40:49 +00:00
ed8fd0bde2 Fixed bug causing congestion-avoidance code to not get executed. 2009-06-06 17:42:33 +00:00
zzz
834bfde45c * Timestamper: Use locale country if geoip unavailable 2009-06-06 16:34:32 +00:00
zzz
fd4e57aafc * Console:
- More conversions to getBaseDir()
    * Router:
      - Improve installUpdates() error handling
    * BrowserLauncher:
      - Use temp dir
2009-06-06 15:36:06 +00:00
zzz
4c4b3b776c Try to alleviate connection-limit network collapse:
* Transport:
      - Lower min NTCP idle time to 3m (was 5m)
      - Increase SSU conn limit by 33%
    * Watchdog:
      - Defang him again
2009-06-06 15:14:05 +00:00
eee160503b 2009-06-06 sponge
* Added BOB's liscense to liscenses
    * Janitorial javadoc fixes *sigh*
    * bump to -13
2009-06-06 06:27:29 +00:00
bef55b25ea Javadocs cleanup *sigh* 2009-06-06 06:18:50 +00:00
623f972e8b Branching 2009-06-06 05:54:55 +00:00
zzz
7e651d53a0 netdb.jsp cleanup 2009-06-05 23:43:10 +00:00
zzz
5d212d3cea propagate from branch 'i2p.i2p' (head 06964a7526a814c5adc7baf4d273f57fe832afc2)
to branch 'i2p.i2p.zzz.test' (head 177659fa31e4f1807874564c921152601bbf420f)
2009-06-05 23:17:48 +00:00
zzz
3e31de1602 tunnels.jsp cleanup 2009-06-05 23:17:15 +00:00
245b7168ab 2009-06-05 sponge
* Merge and bump to -12
2009-06-05 20:32:49 +00:00
4a9b567ebd merge of 'ba538963b768e5137d3807a155360420640806bd'
and 'e10df19521ce47ba4fa825a910fdd0aef26892e2'
2009-06-05 19:59:07 +00:00
2f6ae99452 2009-06-05 sponge
* BOB now cleans up tunnels, although they can take up to 5 minutes to
      disapear. This is due to the fact that the streaming lib doesn't
      actually remove the connections properly and kill them off when the
      manager is destroyed. I'm not certain if this is a bug, or a feature,
      but it sure is annoying, and you have to wait for the connections to
      time out. What should happen is the streaming lib should cause an IO
      error to the pending read or write.
2009-06-05 19:46:26 +00:00
zzz
1538ba0cc3 16x11 transparent flags for ch and np, thanks anonim! 2009-06-05 15:46:02 +00:00
zzz
06a3417124 Add some licenses for launch4j includes, clean up build.xml some more 2009-06-05 00:59:44 +00:00
zzz
524a25eb2c Big directory rework.
Eliminate all uses of the current working directory, and
set up multiple directories specified by absolute paths for various uses.

Add a WorkingDir class to create a user config directory and
migrate files to it for new installs.
The directory will be $HOME/.i2p on linux and %APPDIR%\I2P on Windows,
or as specified in the system property -Di2p.dir.config=/path/to/i2pdir
All files except for the base install and temp files will be
in the config directory by default.
Temp files will be in a i2p-xxxxx subdirectory of the system temp directory
specified by the system property java.io.tmpdir.

Convert all file opens in the code to be relative to a specific directory,
as specified in the context. Code and applications should never open
files relative to the current working directory (e.g. new File("foo")).
All files should be accessed in the appropriate context directory,
e.g. new File(_context.getAppDir(), "foo").

The router.config file location may be specified as a system property on the
java command line with -Drouter.configLocation=/path/to/router.config
All directories may be specified as properties in the router.config file.

The migration will copy all files from an existing installation,
except i2psnark/, with the system property -Di2p.dir.migrate=true.
Otherwise it will just set up a new directory with a minimal configuration.

The migration will also create a modified wrapper.config and (on linux only)
a modified i2prouter script, and place them in the config directory.

There are no changes to the installer or the default i2prouter, i2prouter.bat,
i2prouter, wrapper.config, runplain.sh, windows service installer/uninstaller,
etc. in this checkin.


    *  Directories. These are all set at instantiation and will not be changed by
    *  subsequent property changes.
    *  All properties, if set, should be absolute paths.
    *
    *  Name	Property 	Method		Files
    *  -----	-------- 	-----		-----
    *  Base	i2p.dir.base	getBaseDir()	lib/, webapps/, docs/, geoip/, licenses/, ...
    *  Temp	i2p.dir.temp	getTempDir()	Temporary files
    *  Config	i2p.dir.config	getConfigDir()	*.config, hosts.txt, addressbook/, ...
    *
    *  (the following all default to the same as Config)
    *
    *  Router	i2p.dir.router	getRouterDir()	netDb/, peerProfiles/, router.*, keyBackup/, ...
    *  Log	i2p.dir.log	getLogDir()	wrapper.log*, logs/
    *  PID	i2p.dir.pid	getPIDDir()	wrapper *.pid files, router.ping
    *  App	i2p.dir.app	getAppDir()	eepsite/, ...
    *
    *  Note that we can't control where the wrapper actually puts its files.

All these will be set appropriately in a Router Context.
In an I2P App Context, all except Temp will be the current working directory.

Lightly tested so far, needs much more testing.
2009-06-04 19:14:40 +00:00
zzz
8ff2724213 Update geoip files from the June 3 release 2009-06-04 17:40:25 +00:00
zzz
a9a2d2debb -11 2009-06-04 16:37:29 +00:00
zzz
0070abc04c propagate from branch 'i2p.i2p.zzz.test' (head be1a2452acf68a8a0137f98f5aeb797055321d6e)
to branch 'i2p.i2p' (head bd6b02d1ae8a99afcea7fdffedf699a6e5c85fbf)
2009-06-04 16:28:32 +00:00
zzz
936a338e0e watchdog logging tweaks, allow disable by property 2009-06-04 16:23:51 +00:00
zzz
6c349d0ec4 Add standby indication to i2ptunnel page 2009-06-04 16:06:39 +00:00
zzz
7e1e3c3c32 * I2PTunnel:
- Fix bug where delayed-open and close-on-idle tunnels would
        use a different tunnel pool instead of building their own
2009-06-04 15:14:41 +00:00
zzz
ce23d76c72 If we dont know any good floodfills, try to connect to one 2009-06-04 14:42:27 +00:00
zzz
cb488ebf7b merge of 'cb50ec528ada3d7afd3bf8353d474599872fe931'
and 'd64f30fdfc808f4fa609db468a497e8fc005f116'
2009-06-03 19:07:36 +00:00
zzz
7931451a49 * Reseed: Limit to 200 per URL, shuffle selection, add some logging 2009-06-03 19:05:55 +00:00
zzz
59449cf513 change startup no-ff errror to warn 2009-06-03 15:32:08 +00:00
zzz
39e5ff7eaa add checklist step to look for untrusted revs 2009-06-02 21:33:15 +00:00
zzz
b430b02021 make default bw 96/40 2009-06-01 23:36:11 +00:00
zzz
0bc67f5a89 Rename install*txt files 2009-06-01 20:03:00 +00:00
zzz
56dc96de1e Report average tx and rx rates, effective in next release 2009-06-01 19:55:36 +00:00
zzz
3ccbf37b41 hide some things if no wrapper 2009-06-01 19:52:55 +00:00
zzz
7725b9e8a1 -10 2009-05-30 16:34:58 +00:00
zzz
f511c9bc90 propagate from branch 'i2p.i2p.zzz.test' (head 177f3f7dbb937e60486cb90da7bbcdf9987ffced)
to branch 'i2p.i2p' (head d2424406b9f3877644a1334df71313b6cba018e4)
2009-05-30 16:28:51 +00:00
zzz
56b768fe19 cleanup 2009-05-30 16:15:17 +00:00
zzz
f8901e94a9 cleanup 2009-05-30 15:51:55 +00:00
zzz
ec5cc7e4d3 cleanup 2009-05-30 15:48:56 +00:00
zzz
2413bcd99a configadvanced cleanup, clarification 2009-05-30 15:48:16 +00:00
zzz
1838ad4ae7 * UPnP:
- Retry port forward if it fails
      - Make peers.jsp display faster
      - Lengthen POST timeout
      - More comments
2009-05-30 15:47:20 +00:00
26c4f983d7 * added big fat start/stop lock into BOB
* added zap command to shut down BOB... now we need a way to start it
      after it stops. :-)
2009-05-29 21:14:08 +00:00
zzz
22609bbfdb * SessionKeyManager:
- More stubs for per-destination managers.
        No functional changes yet.
2009-05-29 13:57:50 +00:00
zzz
0a8cbcbfb6 * LoadTestManager: Delete, unused
* SendGarlicMessageJob: Delete, unused
    * config.jsp: Comment out unused burst config code
2009-05-29 12:08:36 +00:00
zzz
7f33051fe1 Add Serbia 2009-05-29 12:06:53 +00:00
zzz
e65c2e279b * Session Keys:
- Don't instantiate unused SessionKeyPersistenceHelper
      - Use TransientSessionKeyManager instead of PersistentSessionKeyManager
      - Add generics to TransientSessionKeyManager to help understand it
      - Change initial session map size to 64 (was 1024)
      - Prepare for per-destination SessionKeyManagers in ElGamalAESEngine
2009-05-29 10:00:06 +00:00
zzz
b43338bd63 * Transports:
- Adjust bids when near conn capacity
      - peers.jsp HTML fixes
2009-05-28 16:19:55 +00:00
zzz
65ae9138ef * Console:
- config.jsp now cause graceful restart
    * UPnP:
      - Tweak to help startup problems
   * UDP:
      - Only save IP when it changes
2009-05-28 13:49:57 +00:00
zzz
665b691711 UPnP: Prevent NPE after ParserException 2009-05-28 03:35:54 +00:00
zzz
87953c4b93 * Peer Selector: Make strict order opaque to hash value 2009-05-27 16:59:38 +00:00
zzz
be480d577c more peers.jsp and profiles.jsp cleanup 2009-05-27 16:27:57 +00:00
zzz
32566a43bd remove some unused UDP stats and test code 2009-05-27 15:47:49 +00:00
fd598dea5b * Increase sendProcessingTime some more, add a property to configure.
Configure with 'router.defaultProcessingTimeThrottle'.
2009-05-27 13:26:51 +00:00
8fef5d9a06 * Increased sendProcessingTime limits and added testSuccessTime
to avoid unwanted throttling
2009-05-27 09:01:14 +00:00
zzz
2f1d6e3f90 * Console:
- Use CSS for form messages
      - Goodbye nonce spoof message
      - tunnels.jsp improvements
2009-05-26 20:04:20 +00:00
53f62bd8dd * Throttling extension by looking at sendProcessingTime 2009-05-26 17:24:31 +00:00
zzz
e6c87c54be -7 2009-05-26 15:05:39 +00:00
zzz
ee3edc9661 propagate from branch 'i2p.i2p.zzz.test' (head dc817d70812b80e35a7c37eaa881e4b866435838)
to branch 'i2p.i2p' (head 5551e9b0487e14e901cd1081ce3e1ffd33c4a354)
2009-05-26 15:02:52 +00:00
zzz
32dddac75b * Streaming:
- Fix infinite loop through the SYN queue caused by race,
        resulting in high CPU, OOMs, etc.
2009-05-26 14:50:16 +00:00
zzz
906482823c Flags fixup 2009-05-26 14:48:58 +00:00
zzz
91c389777a clean up configlogging.jsp 2009-05-26 01:04:34 +00:00
zzz
042a08b90e * NetDb:
- Don't send our own hash in the don't-include list when exploring
      - Remove any pending write when removing a RouterInfo
      - Cleanup to use routerHash()
2009-05-25 16:34:26 +00:00
zzz
7f4c23a038 -6 2009-05-25 03:49:36 +00:00
zzz
e7b0691116 propagate from branch 'i2p.i2p.zzz.test' (head ea09c1bd1791674541854e77592153db6678aabb)
to branch 'i2p.i2p' (head 7ea5131c7a02f28ac2d3e23a8bf22558effb30ee)
2009-05-25 03:45:09 +00:00
zzz
235058eab1 * NTCP:
- Increasse routerinfo send frequency to every 90m (was 9h)
      - Don't send 3 floodfill infos at startup or with routerinfo
2009-05-25 03:34:58 +00:00
zzz
85963a5c72 more fast peers when more local dests 2009-05-25 03:22:01 +00:00
zzz
c639525c1d * Timestamper:
- Use GeoIP to query a closer ntp source if available
      - Lengthen query time if well-synced
      - Cleanup
2009-05-24 20:50:38 +00:00
zzz
de18ebbb73 save our own geoip location in the config 2009-05-24 18:30:47 +00:00
zzz
47e32c82fc fix geoip scan of all routerinfos at startup 2009-05-24 17:03:50 +00:00
71b708b0f2 -1
-5
merge of '8dc3dbded4d489ddca319052bf3cdb0c4d5a13cc'
     and 'afcd808741bf31d75eee2639e19d5e8946b62756'
2009-05-24 16:20:28 +00:00
ab9fee260f -5
SAMv1 and SAMv3 : logging some exception at INFO level
2009-05-24 16:12:39 +00:00
e86e42818a SAMv1 and SAMv3 : logging some exception at INFO level 2009-05-24 16:04:57 +00:00
zzz
067e76c1b0 -4 2009-05-24 14:40:27 +00:00
zzz
13b3bb4490 propagate from branch 'i2p.i2p.zzz.test' (head 4f0b8b8bb59f1a8e2181123c16c4099ea223e527)
to branch 'i2p.i2p' (head b977f0e1e1ca57e78d599943dcbf492e474c631a)
2009-05-24 14:37:27 +00:00
zzz
e82898c988 * Console - add readme_zh.html:
- Submitter (walking) reports encoding as GB2312, and tested on windows
        with ff, IE6, chrome and opera. UTF-8 doesn't work. Still don't know why.
2009-05-24 14:30:55 +00:00
zzz
f4fdbceb3b * SSU: Don't offer to introduce when near connection limit 2009-05-24 00:29:18 +00:00
zzz
c75ff538a3 a little peers.jsp cleanup 2009-05-23 20:23:28 +00:00
zzz
7e71ead3e9 * Connection limits / throttle:
- Better limits when no inbound TCP
        (limit inbound and outbound separately)
    * GeoIP:
      - Check netDb SSU IP too
      - Check whole netDb at startup
2009-05-23 19:43:02 +00:00
29489ad198 Error in the geoip html. 2009-05-23 17:24:44 +00:00
eac45256aa * Router netDB:
- Added flags to the netDB page
2009-05-23 16:40:18 +00:00
zzz
7feb97e415 more info than just nuh uh 2009-05-23 14:37:25 +00:00
zzz
695752629d Move upnp logging from wrapper log to router log 2009-05-23 14:09:37 +00:00
zzz
c3c20ceca4 fix comments 2009-05-22 15:17:47 +00:00
zzz
aa04820fd1 move icons/ to docs/ 2009-05-22 13:23:52 +00:00
3208b7289e * desktopgui:
- Updating works in general config
      - Switched to Swingworker threads for improved responsiveness
      - version increase to 0.1.3
2009-05-21 22:32:34 +00:00
zzz
b4336fdec7 -3 w/ watchdog changes 2009-05-21 15:44:05 +00:00
zzz
e0652a4607 propagate from branch 'i2p.i2p.zzz.test' (head 326752c8c7ce00bc6787fe25e315448ce7124aff)
to branch 'i2p.i2p' (head b73ed9af5ee4f058a2b84f96de92f7cdc7ee0196)
2009-05-21 15:40:50 +00:00
zzz
4ab46b1de8 * Watchdog:
- Log memory stats
      - Dump threads on linux
      - Restart after 20 minutes (give the dog his teeth back)
2009-05-21 15:40:33 +00:00
zzz
d7122cdad7 -2 2009-05-21 13:43:23 +00:00
zzz
9c3eac58f1 propagate from branch 'i2p.i2p.zzz.test' (head 97efbce521018c26030e229181a53adce5774ab6)
to branch 'i2p.i2p' (head e9c81b8ce06374554965eacae3ae64df995b26df)
2009-05-21 13:25:04 +00:00
zzz
79954cec68 increase eepsite hops to 3+0 for new installs 2009-05-21 13:19:34 +00:00
zzz
d927f8bcb0 message tweaks if no wrapperr 2009-05-21 13:12:47 +00:00
zzz
4426cc359c * ExpireRoutersJob:
- Rewrite, not enabled yet
    * TunnelManager:
      - Remove now-unused isInUse()
2009-05-21 00:34:10 +00:00
zzz
b1465b7dff * Console:
- Add a little color to confignav
      - Remove 'no skew' indication
2009-05-20 22:50:14 +00:00
zzz
438ea1b269 fix db writes to disk broken in last checkin 2009-05-20 22:35:56 +00:00
f10bfda115 * General configuration enabled by default
* General configuration speed tab works completely
2009-05-20 19:58:55 +00:00
zzz
b7e2d3a10b add some comments 2009-05-20 18:12:17 +00:00
zzz
846c5fcfc3 * Console:
- Use flags for shitlist and peers.jsp too
      - Tweak tunnels.jsp to show class letters
      - Hide in-progress details on tunnels.jsp
2009-05-20 15:49:39 +00:00
zzz
31cd726b7b * UPnP:
- Fix up port handling, add some logging on bind fails
      - Force IPv4 only for binds
2009-05-20 15:01:43 +00:00
zzz
3ba43a77f4 Add geoip support and flag icons 2009-05-19 18:07:19 +00:00
zzz
cb5390b2fb propagate from branch 'i2p.i2p' (head 31ab45aaed880aa1d8295541b813adb312582f17)
to branch 'i2p.i2p.zzz.test' (head 8f1820175b7df8fc1f880c4fe1104f1b0e633483)
2009-05-18 18:22:24 +00:00
zzz
fae7262d31 * DataStore:
- Adjust interface to have persistent and non-persistent methods,
        to prepare for partial storage in RAM
    * PersistentDataStore:
      - Cleanup, simplify, and concurrentify
      - Tweak stats
      - Remove write limit
      - Flush to disk on shutdown
      - Don't write out what we just read in
2009-05-18 18:21:56 +00:00
zzz
9b6abc1e19 add all the languages izpack has to the installer 2009-05-17 15:45:14 +00:00
zzz
631cd37f8b -1 2009-05-17 12:35:45 +00:00
zzz
b59a38ffad propagate from branch 'i2p.i2p.zzz.upnp' (head 348acc252da725bc621791ef811a43943e889833)
to branch 'i2p.i2p' (head 264d0119a37e276dce2996f360f9c8e065b30008)
2009-05-17 12:28:27 +00:00
zzz
9a6a993a81 history for prop 2009-05-17 12:23:51 +00:00
zzz
9234a94da9 propagate from branch 'i2p.i2p.zzz.test' (head f402c08d0b2796653b559711cb1ea8c3c0204372)
to branch 'i2p.i2p' (head 4d0babb75e3c5237b10ff49f57599c53c581bb83)
2009-05-17 12:20:34 +00:00
zzz
aa2f9e34c0 - Rework UDP peers.jsp table a little
- Don't let UDP bid on messages that are too long
- Clean up the max fragments code in UDP
2009-05-17 11:52:49 +00:00
87eafa30d0 * Update versions, package release 2009-05-16 19:48:12 +00:00
zzz
287eff50b7 dont bundle unneeded ant.jar (900KB) 2009-05-16 04:06:01 +00:00
zzz
8514e7962d stop build on jsp compile errors 2009-05-16 00:52:21 +00:00
zzz
9bed2bde3c disable button disabling 2009-05-15 20:00:56 +00:00
zzz
9e003a9f93 bye nibble 2009-05-14 20:10:26 +00:00
zzz
86f02691a8 propagate from branch 'i2p.i2p' (head 9044c668fe6fdfcca38a20b557b870c993852c52)
to branch 'i2p.i2p.zzz.test' (head 88a5133b796e83cd8d5864a0a16bcd75e8e34ab5)
2009-05-13 20:53:27 +00:00
zzz
3ad3988937 Add warning for 1-hop tunnels 2009-05-13 19:20:49 +00:00
zzz
757855a5c9 logs.jsp: Add link to config 2009-05-13 18:06:31 +00:00
zzz
ccab73ff66 * FloodfillVerifyJob: Don't consider an older search resulthi* as verified 2009-05-13 17:42:24 +00:00
zzz
9df04724c4 Reduce routerinfo expiration again 2009-05-13 17:38:30 +00:00
zzz
94c2ba7fc5 * SusiDNS:
- Reduce displayed entries from 300 to 100
      - Add ability to go forward or back
      - Make textareas bigger
      - Clean up file names
      - Clarify messages about filter and search
2009-05-13 17:21:34 +00:00
a267fcc9cc merge of '476489c04057318947e2947393aa6a10aa382af8'
and 'd38ab82268c3643119e5c226a3f97c23fb794e93'
2009-05-12 22:32:49 +00:00
66a292a9c6 2009-05-12 sponge
* BOB clean up, change println's to _log.warn, bump BOB version
    * I2PSessionMuxedImpl.java changes as per zzz, and they test OK for me.
2009-05-12 21:10:42 +00:00
7cd0112211 SAM: fix: warnings when generating javadoc 2009-05-12 13:33:09 +00:00
9195e754cf propagate from branch 'i2p.i2p' (head 790894dc16c840512c99302fbb75136042cbeb65)
to branch 'i2p.i2p.sam3' (head 66136bbdb44136e3756944cb7d8147d2ab07ff23)
2009-05-12 13:27:17 +00:00
965b183d9e fix: warnings when generating javadoc 2009-05-12 10:46:34 +00:00
zzz
7372a18cec Give the clients friendlier names 2009-05-11 18:19:56 +00:00
zzz
c5ba5f3a5b -13 2009-05-11 16:46:38 +00:00
zzz
90251b8545 propagate from branch 'i2p.i2p.zzz.test' (head eaf123d687259d0dee558845508cfeec05f55915)
to branch 'i2p.i2p' (head 16158c16ac8422809a9bf3919831e5700ed74a51)
2009-05-11 16:43:02 +00:00
zzz
a8c97053c7 * logs.jsp: Put critical log at the top 2009-05-11 16:41:37 +00:00
zzz
117d3a5614 * NetDb: Don't accept stores of our own LeaseSets or RouterInfo 2009-05-11 16:35:30 +00:00
zzz
70a2e48a72 Dont instantiate unused AdminManager 2009-05-11 16:34:05 +00:00
a6f106ed6d update history.txt 2009-05-11 09:05:10 +00:00
47dd1b6168 * SAMv3 : correct a null pointer exception check before it gets caught and logged as an error 2009-05-10 20:31:14 +00:00
bc7a963f5c correct a null pointer exception check before it gets caught and logged as an error 2009-05-10 20:23:08 +00:00
zzz
47fc3b0d0b - Don't start UPnP if we have a public interface address
- Fix setting IP to a local interface address
- Work on the configuration help some more
2009-05-10 15:40:50 +00:00
zzz
3d7b9560cb Connect client: fix NPE when used with advanced i2ptunnel features 2009-05-09 21:44:48 +00:00
9bd3bea90a * merged branches 2009-05-09 18:26:03 +00:00
9541abc0a4 merge of '4ad028f436647b957e6531243fb3348156d5eb51'
and 'ef760639d59a6ab522ec50a95cc848e09bf11bd8'
2009-05-09 18:24:17 +00:00
0be28c1701 2009-05-09 sponge
* fixed OOM on lock (woops! my bad!)
2009-05-09 18:19:03 +00:00
8bb28ea825 propagate from branch 'i2p.i2p.sam3' (head fa9e8f7d5cacabb84eaae8cc6b569b334f2e0238)
to branch 'i2p.i2p' (head 9cdab8e186f77c375fd81913d3b3c20e5ca69ca2)
2009-05-08 14:37:48 +00:00
85382863d2 merge of '38d57079bc08f5efdaccfb785e39789a7e6f1969'
and 'a0a87038370fb791c619419d56a3133ee7ccec5f'
2009-05-08 14:33:23 +00:00
ef737415c5 SAMv3: bug corrected: sending datagrams through the datagram session socket works (like in v1 and v2) 2009-05-08 14:33:03 +00:00
72e4dabd30 * desktopgui: moved files to stop polluting the namespace
(everything now in net.i2p.desktopgui)
    * desktopgui: some variable renaming in general configuration
2009-05-08 10:23:24 +00:00
6bcd547ca0 * SAM: version 3 added
* SAM: blocking case corrected on simultaneous client connection (v.1-3)
2009-05-07 19:31:27 +00:00
283f7a3f37 merge of '4238d44d0006a302c8a1fedf06a3789061b71672'
and '44b9f7b1bcd59acc89551681bfab2709ab5e9972'
2009-05-07 19:19:04 +00:00
zzz
d9a2e024ee add nibble 2009-05-07 17:27:50 +00:00
zzz
fe4e76a7f8 -9 2009-05-07 13:08:49 +00:00
zzz
9c4a7c02fd propagate from branch 'i2p.i2p.zzz.test' (head 29f20f786fbf565798b094a46ac9036dc39fb606)
to branch 'i2p.i2p' (head 622324a8f0f863b7b4eaaa26385228a65c71edf0)
2009-05-07 13:07:07 +00:00
a516d6474e * Improvements to popup menu rightclick action
* Added general configuration options (still not available by default)
    * General fixes
    * Added ant build options (irc says eche|on would like that ;))
2009-05-06 16:17:58 +00:00
eba6ca5430 2009-05-06 sponge
* Hopefully the last fixes for BOB.
    * Fixes to prevent race in client-side I2CP and Notifier.
2009-05-06 05:34:33 +00:00
zzz
ee7e70b98a more config ui tweaks 2009-05-06 03:47:38 +00:00
zzz
0b7fb21263 - Simplify config.jsp some more
- No longer use i2np.udp.forceIntroducers
- Tweak UDP port qualification
- Fix allowing low ports again
- Add option to completely disable NTCP, for those behind nasty firewalls
- Use SSU reachability rather than global reachability for determining NTCP reachability,
  since we are now reporting NTCP reachability too
2009-05-06 00:54:24 +00:00
zzz
95a38779de * Console: Disable idle options for streamr client, it will never be
idle because it pings the server
2009-05-05 22:24:19 +00:00
zzz
e7913061e9 * Console: More IE button fixes, try harder to not 404 the iframe 2009-05-05 21:04:46 +00:00
zzz
7d91bdba1e * Throttle: Throttle at 90% so we throttle before we WRED 2009-05-05 21:03:36 +00:00
zzz
29fe221fe6 name the addressbook thread 2009-05-05 21:02:03 +00:00
30b73ffe6d changed samv3 because of reverted streaming and mstreaming libs 2009-05-05 12:39:14 +00:00
fceec5c129 reverted changes to mstreaming and streaming 2009-05-05 09:46:17 +00:00
e42f7ab8fc apps/sam/java/build.xml reflects dependancy upon streaming.jar 2009-05-05 09:28:10 +00:00
54b80d6724 merge of '40606168f4086dbe122e96b533df4f24b5e4d87d'
and '44a775450f24ec5d2e921ab01b94546968f81851'
2009-05-05 09:24:26 +00:00
zzz
e82f173f85 - Don't notify for non-changed options on config.jsp 2009-05-04 19:54:33 +00:00
zzz
b45dfb85f0 - Change UPnP listener port defaults, allow configuration option 2009-05-04 16:24:31 +00:00
zzz
3db244f5d2 - Detect UPnP start failure
- Sort local addresses
- Store last IP for future laptop mode
- Subscribe to device service, doesn't seem to do anything though,
  need to test it more
2009-05-04 13:57:56 +00:00
zzz
65a41908ec - Make short timeouts for the XML parser so we don't hang when
the UPnP device goes away - same as for HTTP POST
- Stuff the port mapping requester into a thread so it doesn't
  delay everything for several seconds
- Handle UPnP devices that return IP = 0.0.0.0
- Better HTML output when no IP found
- Tweak logging
- Set Disposer thread name
- Keep the control point running after we find an IGD,
  so that we get notifications of it leaving or
  coming back or replaced.
2009-05-03 18:35:27 +00:00
7e3bda9d4d 2009-05-03 sponge
* More hopeful fixes for BOB.
    * Added new Robert ID to snark
2009-05-03 16:02:07 +00:00
zzz
c6b2492e73 - Make short timeouts for UPnP HTTP POST so we don't hang when
the UPnP device goes away
- Fix a bug in UPnP HTTP Server, but we don't use it anyway
2009-05-03 02:27:41 +00:00
zzz
d41afc0c43 - UPnP defaults to on - I didn't do all this for nothing
- Set Status to OK for local public addresses or UPnP port open
- Allow UDP address changes after we transition to firewalled
- Have NTCP start reporting reachability status, this will
  get OK on the console more often and mask UDP problems,
  which might be good or bad...
- Fix UDP port configuration
- Reword and rearrange configuration options again
- Rearrange configuration help
- More right-alignment on config
- Prevent Concurrent modification exception in UPnP
- UPnP HTML output tweaks - remove "plugin" references
- Move UDP message failed log from WARN to INFO
- Short-circuit message history call in UDP
2009-05-02 18:23:41 +00:00
zzz
40637e0f28 slow down the ff volunteers 2009-05-02 03:38:01 +00:00
zzz
0e4c846942 - Simplify bw form
- Add config link to UPnP status
2009-05-01 15:26:49 +00:00
zzz
6dc5d0f8d7 add postman2 2009-05-01 13:20:19 +00:00
zzz
7688df6fe5 -6 2009-05-01 13:03:59 +00:00
zzz
32b6c77156 propagate from branch 'i2p.i2p.zzz.test' (head eb755dae363d71808cb93ae1c6c976c1ec5df5d2)
to branch 'i2p.i2p' (head 25097fabfedcbe372d42dcddaf89b5279e9285e4)
2009-05-01 12:56:10 +00:00
zzz
a8a0e2a91c * I2PTunnel:
- Try to fix locking to prevent duplicate destinations when using
    the new option new-dest-on-resume. Still not right for shared clients
    but should be better for non-shared.
2009-05-01 12:43:19 +00:00
zzz
4c396e5b95 Console: fix ERR-UDP Disabled and Inbound TCP host/port not set 2009-05-01 12:31:38 +00:00
zzz
d3181e53cc prevent race NPE 2009-05-01 12:14:31 +00:00
zzz
4139b36eac fix race NPE 2009-05-01 11:58:14 +00:00
zzz
becc6dc0fc extend browser launch delay from 5s to 15s 2009-05-01 00:54:09 +00:00
zzz
79a963fcab - Implement config save of new IP address options
- Implement local address and UPnP configuration of UDP address
- Limit received port to 1024 minimum
2009-05-01 00:42:31 +00:00
zzz
b21e011203 - i2np.ntcp.autoip=true redefined to enable inbound only if
SSU reachability is OK. i2np.ntcp.autoip=always for the old behavior.
  autoip default is now "true".
  i2np.ntcp.hostname=xxx now trumps i2np.tcp.autoip.
- SSU always tells NTCP when status changes.
2009-04-30 21:03:00 +00:00
zzz
5a6b65d20c * URL Launcher:
- Launcher on linux was stopping after trying opera, whether it succeeded or failed.
    Now it keeps going to try firefox, etc. as designed.
2009-04-30 18:06:51 +00:00
zzz
5b44bcb44f - NTCP Port must now be either auto or configured;
now defaults to auto; and configured now trumps auto.
  Port configuration now does not affect whether inbound
  NTCP is enabled - the host configuration alone can do that.
2009-04-30 16:50:47 +00:00
zzz
c3bafcab05 put jbigi info on logs.jsp 2009-04-30 14:56:25 +00:00
zzz
9ae4fce0db new consoleDocs target 2009-04-30 14:53:46 +00:00
zzz
4929a7e635 - Add getRequestedPort() to transports 2009-04-29 20:42:42 +00:00
zzz
b61861f840 - Tweak UPnP warning messages
- Remove unused verifyupdate.jsp
- Start of callbacks from UPnP to transports
- Tell UDP local addresses at startup
2009-04-29 18:23:15 +00:00
zzz
35b5eb74f6 start of new address configuration 2009-04-29 03:12:19 +00:00
zzz
fc10031ff0 - Start to rework inbound configuration 2009-04-28 22:45:26 +00:00
zzz
accf3dbf3f - Implement UPnP enable/disable 2009-04-28 19:49:09 +00:00
zzz
c2fedf8538 - Add UDP Port configuration to config.jsp
- Don't restart router when configs change on config.jsp;
  simply rebuild router info.
- Clean up some port config code in UDP
2009-04-28 19:01:52 +00:00
zzz
3b19afe7ed propagate from branch 'i2p.i2p' (head 25097fabfedcbe372d42dcddaf89b5279e9285e4)
to branch 'i2p.i2p.zzz.upnp' (head d994c7d73b83aa689c3538efd7ebb6981ea33ba5)
2009-04-28 18:45:50 +00:00
zzz
64ada538f4 propagate from branch 'i2p.i2p' (head 5401181de2088780f15a018566a65ee35a25c92e)
to branch 'i2p.i2p.zzz.upnp' (head 223e91cc8e45fd22a53e30e839059e0ec4060e02)
2009-04-28 15:34:55 +00:00
zzz
a0c4e79c8a allow an extra part appended to the router version 2009-04-28 14:13:05 +00:00
zzz
34249e3dca merge of 'a41cc279bb8c70c8beb8b372e306affba56317a1'
and 'f59c86f21a1941949b9797e766708900eed053a6'
2009-04-28 13:45:03 +00:00
zzz
f5bd10207b log before a hang maybe (SWAG) 2009-04-28 13:43:48 +00:00
zzz
9cc1511863 fix up susidns build file so it will work with gcj 2009-04-27 17:37:29 +00:00
c1d7562331 2009-04-27 sponge
* more BOB fixes, complete with warnings when things go wrong, and
      success messages when things turn around and go right. Terminates
      early so that applications wait no more than 10 seconds or so.
    * Reversed a few earlier patches that caused some odd behavior.
    * Changed some core println()'s to debugging messages.
2009-04-27 17:09:47 +00:00
zzz
542e0f2ed3 -4 2009-04-27 15:02:05 +00:00
zzz
ab33b52f23 propagate from branch 'i2p.i2p.zzz.test' (head 28f0df7ddfdda1df49f30016359dcb77836b06df)
to branch 'i2p.i2p' (head 40618503ea9748aedee73aaf002482424adc1f72)
2009-04-27 14:59:15 +00:00
zzz
a223c7ac75 reduce bundled tags from 100 to 40 2009-04-27 14:58:43 +00:00
zzz
c32c9a2391 noob warning 2009-04-27 14:50:10 +00:00
zzz
798e1422c6 postman2 supports details link 2009-04-27 14:08:16 +00:00
zzz
e05b46002b add postman2 tracker 2009-04-27 13:49:45 +00:00
zzz
fa6aa44a86 quiet the ghost of jrandom 2009-04-27 13:33:22 +00:00
zzz
4f0013e8da Consolidate the details and config links to shrink the summary bar a little 2009-04-26 21:52:00 +00:00
zzz
b2e5e14bc6 extend the min expiration a little 2009-04-26 21:14:53 +00:00
zzz
e15b469833 * NTCP:
- Correct the meanings of the i2np.ntcp.autoip and i2np.ntcp.autoport
    advanced config. If you have one of these set but not the other, you
    will have to adjust your configuration on config.jsp.
2009-04-26 20:16:35 +00:00
zzz
c9b6d72c5a * Tunnel Pool:
- Clean up some tunnel removal code
  - Don't try to build a LeaseSet with more than 6 leases,
    no matter what the setting
2009-04-26 18:32:57 +00:00
zzz
a279f8d530 add some jetty help 2009-04-26 18:02:07 +00:00
zzz
89f0f09b86 new updaterWithJettyFixes target, build it for pkg 2009-04-26 16:27:44 +00:00
zzz
157b85b11b pass compiler args down from top build.xml 2009-04-26 15:54:51 +00:00
7b15cc8113 propagate from branch 'i2p.i2p' (head 982dc8adf7d5c10608e572f285c2eb196d25a64e)
to branch 'i2p.i2p.sam3' (head a455f4d173b9c8c18698ed182407e152848dc8de)
2009-04-26 10:38:28 +00:00
8d4c332987 merge of '40618503ea9748aedee73aaf002482424adc1f72'
and '81ec1b16687e7276a752db7f600a525a6e289458'
2009-04-26 10:36:41 +00:00
4ffa2450c2 * SAMv3 : doc/sam.3.0-protocol.txt updated
* SAMv3 : SAMv3StreamSession.java: thread naming for debugging purpose
2009-04-26 10:14:23 +00:00
zzz
d670d98e60 stats cleanup 2009-04-26 04:15:48 +00:00
zzz
33b2762003 more reachability help 2009-04-25 02:47:28 +00:00
zzz
507b6d45d5 longer iframe 2009-04-25 02:46:45 +00:00
f331dad72d 2009-04-25 sponge
* I2PSessionMuxedImpl atomic fixes
    * BOB fixes. This should be the final bug wack. Good Luck to everybody!
2009-04-25 00:02:38 +00:00
zzz
5b41827a7b allow spaces in dest and proxy lists 2009-04-24 16:38:44 +00:00
zzz
178b5996a5 * NetDb:
- Adjust RouterInfo expiration down to control memory usage
  - Display LeaseSets and RouterInfos on separate console pages
2009-04-23 22:34:25 +00:00
zzz
8054078b9e -2 2009-04-23 20:20:37 +00:00
zzz
452adfa860 logs.jsp: fix layout problem on IE, move version info to the top 2009-04-23 20:00:33 +00:00
zzz
833ebd0714 Jetty: Fix temp dir handling, which was causing susidns not to start on windows.
Jetty forms the temp directory name from, among other things, the bound
address. The patch in 0.7.2 to bind to IPV6 addresses led to ':' in the
directory name, which is not allowed on windows. Change these to '_'.
2009-04-23 18:29:46 +00:00
zzz
b430abf172 add i2p version for easy cut-n-paste 2009-04-23 18:22:55 +00:00
zzz
939311d2de css fixes from badger 2009-04-23 18:21:25 +00:00
0c738e2c6f SAMv3: stream session stop listening when the forwarding session closes. Doc has to be changed to reflect this. 2009-04-23 00:55:12 +00:00
zzz
48e544c014 RouterConsole: Make summary bar a refreshing iframe 2009-04-23 00:39:49 +00:00
zzz
08b186aa24 propagate from branch 'i2p.i2p' (head 28b73161ea8915467ac9a4a8eb910d8fef1d42cd)
to branch 'i2p.i2p.zzz.test' (head 4470e8eb34649523d9f0055e754d90226f0d7bcb)
2009-04-23 00:27:54 +00:00
zzz
2f46efe78d * Blocklist: cleanup
* PeerProfile:
     - Replace a hot lock with concurrent RW lock
     - Rewrite ugly IP Restriction code
     - Also use transport IP in restriction code
   * Transport: Start the previously unused CleanupUnreachable
2009-04-23 00:23:29 +00:00
zzz
3ddd5f2a51 * Fragmenter: don't re-throw the corrupt fragment IllegalStateException,
to limit the damage - root cause still not found
2009-04-22 19:21:21 +00:00
zzz
29a58cb030 * NTCP: Hopefully prevent this:
java.lang.IllegalStateException: Unable to serialize the message (net.i2p.data.i2np.DatabaseStoreMessage): Invalid key type
	at net.i2p.data.i2np.I2NPMessageImpl.toByteArray(I2NPMessageImpl.java:238)
	at net.i2p.router.transport.ntcp.NTCPConnection.bufferedPrepare(NTCPConnection.java:668)
	at net.i2p.router.transport.ntcp.NTCPConnection.send(NTCPConnection.java:295)
	at net.i2p.router.transport.ntcp.NTCPConnection.enqueueFloodfillMessage(NTCPConnection.java:412)
	at net.i2p.router.transport.ntcp.NTCPConnection.enqueueInfoMessage(NTCPConnection.java:373)
	at net.i2p.router.transport.ntcp.NTCPTransport.outboundMessageReady(NTCPTransport.java:179)
	at net.i2p.router.transport.TransportImpl.send(TransportImpl.java:339)
      ...
2009-04-22 18:53:57 +00:00
zzz
0bcbe6ae05 * i2psnark: (http://forum.i2p/viewtopic.php?t=3317)
- Change file limit to 512 (was 256)
      - Change size limit to 10GB (was 5GB)
      - Change request size to 16KB (was 32KB)
      - Change pipeline to 5 (was 3)
2009-04-22 13:54:59 +00:00
dev
3944688829 merge of '2fe56e848564fc4e006771a6cb807c8dec370bab'
and 'a2a447dc9fe4d0a9bdefccc5263eed665bedb84f'
2009-04-21 20:17:45 +00:00
dev
e126233fbc hope i have fixed that bug, where the "download $version" kept showing, while already having downloaded it 2009-04-21 20:17:07 +00:00
zzz
ae83b4202d recognize -h, --help, etc 2009-04-21 17:44:16 +00:00
7cdfe45acf propagate from branch 'i2p.i2p' (head 81ec1b16687e7276a752db7f600a525a6e289458)
to branch 'i2p.i2p.sam3' (head bf43c21d57d97df61e863a41783aaae968381d00)
2009-04-21 04:15:32 +00:00
eae4362181 SAMv3: NAMING ME request now work on stream sessions 2009-04-21 04:14:53 +00:00
f2e9e2cc23 2009-04-21 sponge
* Code janator work, basic corrections involving @Override, and
      appling final where it is important. Also fixed some equals methods
      and commented places that need fixing.
2009-04-21 03:32:38 +00:00
dev
311ec4eb54 merge of '401f2e769d7507a315783ec22c880a0e866194bd'
and 'eba7e55d7a69ed23fcce7f004a39fb2847ab66f5'
2009-04-19 11:16:21 +00:00
f4254659ea * Fix typo in "news.xml", no build number increase. 2009-04-18 23:08:40 +00:00
fc9e3ee77d * Update versions, package release 2009-04-18 22:33:00 +00:00
dev
b542f17194 removed code unused since 75fadec23097a196f56cd8d7932dca0de5da5583 (0.5.0.5) 2009-04-18 15:08:48 +00:00
dev
ddf5cf80b2 propagate from branch 'i2p.i2p' (head e26fa9cbcc023c4c1d8bdc4eb8dbd4a964bb6148)
to branch 'i2p.i2p.zzz.upnp' (head b712f92f4dce03ce1f7d1b2ffc95b559b9b66140)
2009-04-18 14:58:10 +00:00
e6cecab0b6 2009-04-17 sponge
* fixed setIP, just be sure to distclean before building :-)
    * more lint taken care of as well.
2009-04-17 13:45:47 +00:00
c3f9e20247 2009-04-17 sponge
* setIP wants to be a static method in the class, but it produces
      warnings about it being static from other code.
2009-04-17 13:28:05 +00:00
d0376f82a5 2009-04-17 sponge
* Catch NPE in NTCP.
      This possibly augments fix 2009-04-11 welterde below.
    * Various LINT on NTCP sources, and removal of space-wasting
      spaces at end of lines in sources touched.
2009-04-17 13:11:16 +00:00
834fdfe9b3 * Bugfix on tray icon updating
* Some more work on the general configuration menu
      (currently not added to the tray icon menu yet, needs more work)
    * Tweaked the desktopgui logo
2009-04-13 17:27:35 +00:00
8eedcb039a * Added I2P version and GUI version to desktopgui
* Tweaks to the tray icon menu
    * Some starting work on a GUI general configuration menu
    * Bugfix allowing spaces in directory structure
2009-04-13 15:02:46 +00:00
dev
fc9c479ed5 merge of '227107019f384da18e4670a405831faa8ba32555'
and 'a089ba5e81e51182c61fd5a1db8ac057001a24dc'
2009-04-13 13:20:50 +00:00
dev
12978ba4fb fixed the fix.. 2009-04-13 13:20:43 +00:00
dev
548efed8d8 -18 2009-04-13 12:28:16 +00:00
dev
24b012a843 don't send somehost.i2p:8080 requests to outproxy 2009-04-13 12:09:52 +00:00
dev
d493addf95 added netbeans freeform project files for core and router 2009-04-11 20:38:19 +00:00
dev
d8e502722e -17 2009-04-11 20:35:36 +00:00
dev
0835c05e89 merge of '3534b3e357a365476c2deeb8470ae794595cf1a8'
and 'c06ed6aab297ea837746dfa5dacb1a8f78d8d3dc'
2009-04-11 20:28:28 +00:00
dev
429280e416 fix a NPE 2009-04-11 20:28:15 +00:00
879404f7e0 2009-04-11 sponge
* i2ptunnel janitorial work and fixes on most locks.
      Some locks still need work, and are marked with LINT in the comment.
      Just grep for "LINT" to see where the remaining places are.
2009-04-11 13:55:38 +00:00
56c6f41131 merge of '7298248358ee266b5c8c7383cd1ef06e343fe42a'
and '8aacbbbacb79ee5a65534a5601eea1246c51866c'
2009-04-11 13:35:34 +00:00
305fc7314f Added text explaining the different speeds.
Tray icon colours indicates active peers (and tooltip indicates reachability).
The menu now uses Swing instead of Awt, so it looks a lot better.
2009-04-11 13:35:22 +00:00
384d655b1a 2009-04-10 sponge
* More BOB threadgroup fixes, plus debug dump when things go wrong.
    * Fixes to streaminglib, I2CP, which are related to the TG problem.
    * JavaDocs fixups.
2009-04-10 23:12:41 +00:00
2a2d3c0fb5 Added log viewer.
Added shutdown informational messages.
2009-04-10 18:56:56 +00:00
977d6eec88 Dropdown available for kb versus kB issues.
Bandwidth calculation available from 2 directions (added from GB -> kbps).
Layout manager switched for easier development.
2009-04-09 20:36:22 +00:00
0f1f33eaa4 merge of '798b531efac76d62154df2a99a91a32ccd97ab47'
and '9b73a50d356f49e9aadaae4cf86681b718c0d56b'
2009-04-09 19:12:06 +00:00
8f690a8f67 2009-04-08 sponge
* More hopeful fixups to the infamous orpahned tunnel problem. *Sigh*
2009-04-08 11:55:51 +00:00
f9f9aa4498 Added distWithDesktopgui target, to build everything at once. 2009-04-08 10:13:56 +00:00
18a475eff3 merge of '9666f5fdfc24a7fc2ca3a99a95ea5dfef5583b1b'
and 'e76b1962963aa7cadb74aacc32f90adf31db3761'
2009-04-08 06:41:53 +00:00
zzz
ed259ac94c -13 2009-04-08 01:37:38 +00:00
zzz
bb7884ca3b propagate from branch 'i2p.i2p.zzz.test' (head 589c4b0b77bdcbb49a965e39ec971c9b4bdd98c5)
to branch 'i2p.i2p' (head 32ebd10f2f86f14b3739dc699e016349a85bb8e4)
2009-04-08 01:34:40 +00:00
zzz
0cfbe9c28b * IPV6/localhost:
- Enable IPv6 stack in the JVM, hopefully won't break anything
      - Patch Jetty to support binding to IPv6 addresses
      - Allow multiple bind addresses for the router console
        in the clients.config file; for new installs the
        default is now "127.0.0.1,::1"
      - Change most instances of "localhost" to "127.0.0.1"
        throughout the code
    * Router:
      - Move some classes to private static inner
2009-04-08 01:34:12 +00:00
85e5013dbd Fixed overflow problem when calculating monthly usage. It now works well (without
getting too wide for the window) up to 1 Tbps.
2009-04-07 20:09:59 +00:00
bf50695c93 Patching build.xml so it's possible to build an installer and updater with desktopgui. 2009-04-07 19:18:51 +00:00
0764e19441 New build file for desktopgui. Should work fine for anyone using java 1.6. 2009-04-07 17:55:59 +00:00
2f1d93756d merge of '4e3d0e106395f9bbb24c33d6a980c707831ad40e'
and '578c30cf4a84f25eb899ab6d4278207bddeba259'
2009-04-07 13:49:12 +00:00
91de396821 added echelon.i2p to readme of I2P router 2009-04-07 12:05:00 +00:00
f9efabba16 Fixed build.xml (removed desktopgui for now). 2009-04-07 08:26:47 +00:00
54255cab4a merge of '91bd86329a458a5e064af7aa5abf3662aec61dab'
and 'a09513bb83b827232b24950613986dcb6d5e713c'
2009-04-07 05:47:04 +00:00
c03b519849 2009-04-07 sponge
* BOB prevent jvac from optimizing out thread-group code from -10
2009-04-07 03:01:39 +00:00
zzz
98617723a2 -11 2009-04-07 02:47:23 +00:00
zzz
8c8a2deefc propagate from branch 'i2p.i2p.zzz.test' (head 1b0258b9825aa2952987c3221b8c45aa06b8c3b1)
to branch 'i2p.i2p' (head 2dc7a484f328618103dca0f5a9510e15e19f98c7)
2009-04-07 02:34:43 +00:00
2c84cddda3 2009-04-07 sponge
* SimpleTimer2, SimpleScheduler fixed so that the threads all run from
      The main threadgroup, not in the current possible child threadgroup.
      So long as any SimpleTimer2/SimpleScheduler is started *BEFORE* any
      child threadgroups, the constructors are threadgroup safe. What would
      be super cool is if they were to be all jailed within thier very own
      threadgroup too, but, I2P isn't up to the task of this yet.
    * Fixes to BOB to ensure the above is true.
2009-04-07 02:24:04 +00:00
37667247c3 2009-04-06 sponge
SimpleScheduler SimpleTimer2 debugging added.
Fix build files for desktopgui.
2009-04-06 22:40:22 +00:00
zzz
f5614c8a41 synchronize datagram maker in I2PSinks 2009-04-06 19:44:47 +00:00
zzz
9e7dd238a4 prevent NPE 2009-04-06 19:43:54 +00:00
495558a949 New application for I2P: desktopgui. Should eventually replace systray, and have more functionality.
To use the application, you need to (by default) add the following to clients.config :
# desktopgui
clientApp.6.args=
clientApp.6.delay=5
clientApp.6.main=desktopgui.Main
clientApp.6.name=desktopgui
clientApp.6.startOnLoad=true
2009-04-06 17:53:32 +00:00
bc831d3c35 Changelog: SAM : big bug in SAMv1Handler corrected 2009-04-06 09:53:01 +00:00
d54695e542 add dependency to streaming lib to apps/sam/java/build.xml 2009-04-06 08:16:19 +00:00
12625a46c2 comment added in net.i2p.client.streaming.ConnectionHanler 2009-04-06 07:54:19 +00:00
ab84a5ce8e propagate from branch 'i2p.i2p' (head ac3b23a1d65017e99af5231a8248590c278c136f)
to branch 'i2p.i2p.sam3' (head e257c0c2a8456c229d12a8de2c5339b2e981fd80)
2009-04-06 07:45:57 +00:00
fcbfd7554f SAMv3: alternate form of calling SAMBridge.main. Usage message updated. 2009-04-06 06:39:30 +00:00
4d27f18710 SAMv3: rawTests Demos scripts updated 2009-04-06 05:29:03 +00:00
1bc4cb382e SAMv3 : protocol better specified, and small changes in the code reflecting the new protocol 2009-04-05 21:35:56 +00:00
6b825fbe25 SAMv3 : protocol better specified, and small changes in the code reflecting the new protocol 2009-04-05 21:32:43 +00:00
884663d077 Forgot the history.txt entry, oops!! 2009-04-04 19:48:27 +00:00
bd489cf439 2009-04-04 sponge
* Hopeful fixups to the infamous orpahned tunnel problem.
    * BOB now 0.0.5
2009-04-04 19:47:36 +00:00
zzz
a4b5c63702 -7 2009-04-04 17:17:34 +00:00
zzz
b1bedb565f propagate from branch 'i2p.i2p.zzz.test' (head 8eb14086613c349e9f2e820ca3ffdca924dbf1bd)
to branch 'i2p.i2p' (head a4b03a4320a1bf09574f0b338a89f2bd3819ca81)
2009-04-04 17:10:16 +00:00
zzz
3dd5950bd1 Don't let NTCP bid on msgs too big to handle 2009-04-04 17:08:20 +00:00
2cf5221620 minimize differences with mainstream apps/streaming 2009-04-04 12:37:19 +00:00
de6edc6a99 2009-04-04 10:28:31 +00:00
zzz
fe9b891b37 -6 2009-04-03 21:46:10 +00:00
zzz
7804475698 propagate from branch 'i2p.i2p.zzz.test' (head 6cf4504f7338b177bfd4a0ceef7d3549bfeec6fe)
to branch 'i2p.i2p' (head d78bd9f06c2779f8bcf2f713dbb8679004aef101)
2009-04-03 21:44:46 +00:00
zzz
8de5609817 * Update:
- Change default to "Download and verify"
      - Change news fetch default to 24h (was 12h)
2009-04-03 21:42:48 +00:00
zzz
bb0531053d Console: Fix bug with IE buttons not working, because it sends the label instead of the value 2009-04-03 21:33:35 +00:00
e5b1450e83 2009-04-03 sponge
* Router build version incremented to 5 now that the build succeeds.
2009-04-03 15:33:51 +00:00
zzz
0c7cb9d781 put java version on logs.jsp 2009-04-03 14:26:48 +00:00
25d5883a0e 2009-04-03 sponge
* Fix broken dependencies for BOB.jar
2009-04-03 13:31:41 +00:00
zzz
c7d815b5b8 -4 (-3 didnt build) 2009-04-02 22:08:39 +00:00
zzz
8c4800309e propagate from branch 'i2p.i2p.zzz.test' (head ef7e2c611e0eaa2f92b31c0b364d39ec023eb135)
to branch 'i2p.i2p' (head 928500dd1439f4cf359ea90cb5349bfaa7d2194b)
2009-04-02 22:07:48 +00:00
zzz
1aa7fbbba0 -3 didnt build 2009-04-02 22:07:25 +00:00
zzz
d2fc397295 -3 2009-04-02 21:00:26 +00:00
zzz
a8e43ab552 propagate from branch 'i2p.i2p.zzz.test' (head 8f379e4e28d926cbde0cad8f11274b8ae1fcd820)
to branch 'i2p.i2p' (head fc678c3fcf2b704921a3b8f4d8c35b5d68397f3b)
2009-04-02 20:59:01 +00:00
zzz
3a12182838 Transport:
- Maintain a router hash -> IP map in transport,
    to support additional IP checks
    (unused for now)
  - Catch error on pre-2.6 kernels
  - Some concurrent conversion
  - Fix an HTML error on peers.jsp
2009-04-02 20:33:54 +00:00
zzz
49c7fc30c0 cleanup 2009-04-02 19:01:26 +00:00
zzz
f6bc9e8707 Profiles:
- Remove unused calculators and RateStats:
    CapacityCalculator, StrictSpeedCalculator, IsFailingCalculator;
    sendFailureSize, processSuccessRate, processfailureRate, commErrorRate,
    tunnelTestResponseTimeSlow
  - Reduced number of Rates in these RateStats:
    sendSuccessSize, receiveSize, rejectRate, failRate
  - ~5KB/profile savings total
  - Deflate speed calculation once an hour instead of once a day,
    to improve fast tier selection
2009-04-02 18:55:40 +00:00
zzz
53cb80636a remove dup comment in persisted profiles 2009-04-02 18:12:38 +00:00
bc086a78eb explicit merge of '7bae8d314209ec279a4da918dc3255e31bda7e45'
and '3b133e76d8124df27791cb78006e7c2b9a8b6430'
2009-04-02 08:57:46 +00:00
e0dccb5970 2009-04-02 08:54:28 +00:00
a4d16af95d SAM version 3 :
- Raw and Datagram sessions implemented
      - option "SILENT=true" added to the stream protocol
      - java 6 warnings removed
   ministreaming :
      - java 6 warnings removed
   ministreaming and streaming :
      -  added functions : 
      	I2PServerSocket.waitIncoming(long timeout)
      	I2PServerSocket.accept(boolean block)
2009-04-02 08:22:31 +00:00
zzz
0b89171abd StatisticsManager - effective in 0.7.2:
- Spoof uptime to 90m for all
    - Change tunnel stats from 10m to 60m
2009-04-01 20:17:25 +00:00
zzz
f81a24a0cc I2PTunnel: Fix tunnel close http://forum.i2p/viewtopic.php?t=3231 broken in 0.7-8 2009-04-01 04:54:49 +00:00
zzz
58fc3a501d -1 2009-03-30 16:13:58 +00:00
zzz
7b373743aa propagate from branch 'i2p.i2p.zzz.next' (head e89194f845a2a74dbf00f0f9e3c25a8f96ec36e4)
to branch 'i2p.i2p' (head 9cb2795f19efeae08b9ecffa5137fd944de120c7)
2009-03-30 16:07:13 +00:00
zzz
e692e18d44 Peer Selection:
- Limit peers to a max % of all tunnels with
       router.maxTunnelPercentage=nn, default 33
     - Add chart to tunnels.jsp to see results
2009-03-30 16:05:48 +00:00
0c98d1843a Sponge fixes and additions patch:
* 3 New jbigi build scripts and old ones fixed to work properly.
    * Some trivial BOB work.
2009-03-30 05:31:40 +00:00
zzz
5414d41de4 I2PSnark: Use new BW Limits message, remove router.jar dependencies 2009-03-25 23:19:37 +00:00
zzz
5eda7c30fc bw limits msg 2009-03-10 06:09:50 +00:00
zzz
06aeff9a30 drop file accidentally checked in 2009-02-20 19:00:01 +00:00
zzz
78075cb3aa Add upnp html output, fix up logging 2009-02-20 18:51:39 +00:00
zzz
312e6071d7 upnp first cut 2009-02-19 21:42:59 +00:00
1037 changed files with 139523 additions and 8595 deletions

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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."

View File

@ -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

View File

@ -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

View File

@ -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}">

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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");
}
} }
} }

View File

@ -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");
}
} }
} }

View File

@ -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());
}
} }
} }

View File

@ -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();
} }
} }

View File

@ -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");

View File

@ -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.");
} }
} }

View File

@ -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.");
} }
} }

View File

@ -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.");
} }
} }

View File

@ -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;
} }
} }

View File

@ -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" />

View File

@ -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();
} }
/** /**

View File

@ -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);

View File

@ -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
View 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
View 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>

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,3 @@
Manifest-Version: 1.0
X-COMMENT: Main-Class will be added automatically by build

View 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 &quot;${ant.java.version}"/>
<condition property="have-jdk-older-than-1.4">
<or>
<contains string="${version-output}" substring="java version &quot;1.0"/>
<contains string="${version-output}" substring="java version &quot;1.1"/>
<contains string="${version-output}" substring="java version &quot;1.2"/>
<contains string="${version-output}" substring="java version &quot;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>

View 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

View 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

View 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>

View File

@ -0,0 +1 @@
desktopgui.Main

View File

@ -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";
}

View 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";
}

View File

@ -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

View File

@ -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

View File

@ -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>

View File

@ -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";
}

View File

@ -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>

View File

@ -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;
}

View 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);
}
}

View 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>

View 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";
}

View File

@ -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>

View File

@ -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
}

View 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>

View 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;
}

View 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>

View 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
}

View 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>

View 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;
}

View File

@ -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";
}

View 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;
}

View 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>

View 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
}

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,4 @@
refreshButton.text=Refresh
clearButton.text=Clear
explanationText.text=Explanation ...
Form.title=View Logs

View File

@ -0,0 +1 @@
jLabel1.text=Name:

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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

View File

@ -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;
}

View File

@ -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();
}
}
}

View File

@ -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);
}
}

View File

@ -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";
}

View File

@ -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();
}

View File

@ -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);
}
}

View File

@ -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();
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}

View File

@ -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" />

View 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)));
}
}

View File

@ -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))

View File

@ -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();
} }

View File

@ -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();

View File

@ -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;

View File

@ -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);

View File

@ -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,

View File

@ -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);

View File

@ -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 */

View File

@ -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();

View File

@ -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;

View File

@ -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>&nbsp;\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>&nbsp;</th>\n" + " <th>&nbsp;</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>&nbsp;</th></tr>\n" + " <th>&nbsp;</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("&nbsp;&nbsp;&nbsp;(<a href=\"" + baseURL + "details.php?dllist=1&filelist=1&info_hash="); out.write("&nbsp;&nbsp;&nbsp;[<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>&nbsp;&nbsp;<tt>" + peer.toString().substring(5, 9) + "</tt>"); out.write("<font size=-1>" + client + "</font>&nbsp;&nbsp;<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&nbsp;: <input type=\"text\" name=\"newURL\" size=\"80\" value=\"" + newURL + "\" /> \n"); out.write("From URL&nbsp;: <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 {
} }
} }
} }
}

View File

@ -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();

View File

@ -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
View 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 "$@"

View File

@ -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/

View File

@ -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" />

View File

@ -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;
/** /**

View File

@ -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;
} }

View File

@ -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