Compare commits

..

186 Commits

Author SHA1 Message Date
complication
87eafa30d0 * Update versions, package release 2009-05-16 19:48:12 +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
mkvore-commit
a267fcc9cc merge of '476489c04057318947e2947393aa6a10aa382af8'
and 'd38ab82268c3643119e5c226a3f97c23fb794e93'
2009-05-12 22:32:49 +00:00
sponge
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
mkvore-commit
7cd0112211 SAM: fix: warnings when generating javadoc 2009-05-12 13:33:09 +00:00
mkvore-commit
9195e754cf propagate from branch 'i2p.i2p' (head 790894dc16c840512c99302fbb75136042cbeb65)
to branch 'i2p.i2p.sam3' (head 66136bbdb44136e3756944cb7d8147d2ab07ff23)
2009-05-12 13:27:17 +00:00
mkvore-commit
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
mkvore-commit
a6f106ed6d update history.txt 2009-05-11 09:05:10 +00:00
mkvore-commit
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
mkvore-commit
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
3d7b9560cb Connect client: fix NPE when used with advanced i2ptunnel features 2009-05-09 21:44:48 +00:00
sponge
9bd3bea90a * merged branches 2009-05-09 18:26:03 +00:00
sponge
9541abc0a4 merge of '4ad028f436647b957e6531243fb3348156d5eb51'
and 'ef760639d59a6ab522ec50a95cc848e09bf11bd8'
2009-05-09 18:24:17 +00:00
sponge
0be28c1701 2009-05-09 sponge
* fixed OOM on lock (woops! my bad!)
2009-05-09 18:19:03 +00:00
mkvore-commit
8bb28ea825 propagate from branch 'i2p.i2p.sam3' (head fa9e8f7d5cacabb84eaae8cc6b569b334f2e0238)
to branch 'i2p.i2p' (head 9cdab8e186f77c375fd81913d3b3c20e5ca69ca2)
2009-05-08 14:37:48 +00:00
mkvore-commit
85382863d2 merge of '38d57079bc08f5efdaccfb785e39789a7e6f1969'
and 'a0a87038370fb791c619419d56a3133ee7ccec5f'
2009-05-08 14:33:23 +00:00
mkvore-commit
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
mathiasdm
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
mkvore-commit
6bcd547ca0 * SAM: version 3 added
* SAM: blocking case corrected on simultaneous client connection (v.1-3)
2009-05-07 19:31:27 +00:00
mkvore-commit
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
mathiasdm
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
sponge
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
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
mkvore-commit
30b73ffe6d changed samv3 because of reverted streaming and mstreaming libs 2009-05-05 12:39:14 +00:00
mkvore-commit
fceec5c129 reverted changes to mstreaming and streaming 2009-05-05 09:46:17 +00:00
mkvore-commit
e42f7ab8fc apps/sam/java/build.xml reflects dependancy upon streaming.jar 2009-05-05 09:28:10 +00:00
mkvore-commit
54b80d6724 merge of '40606168f4086dbe122e96b533df4f24b5e4d87d'
and '44a775450f24ec5d2e921ab01b94546968f81851'
2009-05-05 09:24:26 +00:00
sponge
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
40637e0f28 slow down the ff volunteers 2009-05-02 03:38:01 +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
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
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
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
sponge
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
mkvore-commit
7b15cc8113 propagate from branch 'i2p.i2p' (head 982dc8adf7d5c10608e572f285c2eb196d25a64e)
to branch 'i2p.i2p.sam3' (head a455f4d173b9c8c18698ed182407e152848dc8de)
2009-04-26 10:38:28 +00:00
mkvore-commit
8d4c332987 merge of '40618503ea9748aedee73aaf002482424adc1f72'
and '81ec1b16687e7276a752db7f600a525a6e289458'
2009-04-26 10:36:41 +00:00
mkvore-commit
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
sponge
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
mkvore-commit
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
mkvore-commit
7cdfe45acf propagate from branch 'i2p.i2p' (head 81ec1b16687e7276a752db7f600a525a6e289458)
to branch 'i2p.i2p.sam3' (head bf43c21d57d97df61e863a41783aaae968381d00)
2009-04-21 04:15:32 +00:00
mkvore-commit
eae4362181 SAMv3: NAMING ME request now work on stream sessions 2009-04-21 04:14:53 +00:00
sponge
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
complication
f4254659ea * Fix typo in "news.xml", no build number increase. 2009-04-18 23:08:40 +00:00
complication
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
sponge
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
sponge
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
sponge
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
mathiasdm
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
mathiasdm
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
sponge
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
mathiasdm
56c6f41131 merge of '7298248358ee266b5c8c7383cd1ef06e343fe42a'
and '8aacbbbacb79ee5a65534a5601eea1246c51866c'
2009-04-11 13:35:34 +00:00
mathiasdm
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
sponge
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
mathiasdm
2a2d3c0fb5 Added log viewer.
Added shutdown informational messages.
2009-04-10 18:56:56 +00:00
mathiasdm
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
mkvore-commit
0f1f33eaa4 merge of '798b531efac76d62154df2a99a91a32ccd97ab47'
and '9b73a50d356f49e9aadaae4cf86681b718c0d56b'
2009-04-09 19:12:06 +00:00
sponge
8f690a8f67 2009-04-08 sponge
* More hopeful fixups to the infamous orpahned tunnel problem. *Sigh*
2009-04-08 11:55:51 +00:00
mathiasdm
f9f9aa4498 Added distWithDesktopgui target, to build everything at once. 2009-04-08 10:13:56 +00:00
mkvore-commit
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
mathiasdm
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
mathiasdm
bf50695c93 Patching build.xml so it's possible to build an installer and updater with desktopgui. 2009-04-07 19:18:51 +00:00
mathiasdm
0764e19441 New build file for desktopgui. Should work fine for anyone using java 1.6. 2009-04-07 17:55:59 +00:00
mathiasdm
2f1d93756d merge of '4e3d0e106395f9bbb24c33d6a980c707831ad40e'
and '578c30cf4a84f25eb899ab6d4278207bddeba259'
2009-04-07 13:49:12 +00:00
amiga4000
91de396821 added echelon.i2p to readme of I2P router 2009-04-07 12:05:00 +00:00
mathiasdm
f9efabba16 Fixed build.xml (removed desktopgui for now). 2009-04-07 08:26:47 +00:00
mkvore-commit
54255cab4a merge of '91bd86329a458a5e064af7aa5abf3662aec61dab'
and 'a09513bb83b827232b24950613986dcb6d5e713c'
2009-04-07 05:47:04 +00:00
sponge
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
sponge
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
sponge
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
mathiasdm
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
mkvore-commit
bc831d3c35 Changelog: SAM : big bug in SAMv1Handler corrected 2009-04-06 09:53:01 +00:00
mkvore-commit
d54695e542 add dependency to streaming lib to apps/sam/java/build.xml 2009-04-06 08:16:19 +00:00
mkvore-commit
12625a46c2 comment added in net.i2p.client.streaming.ConnectionHanler 2009-04-06 07:54:19 +00:00
mkvore-commit
ab84a5ce8e propagate from branch 'i2p.i2p' (head ac3b23a1d65017e99af5231a8248590c278c136f)
to branch 'i2p.i2p.sam3' (head e257c0c2a8456c229d12a8de2c5339b2e981fd80)
2009-04-06 07:45:57 +00:00
mkvore-commit
fcbfd7554f SAMv3: alternate form of calling SAMBridge.main. Usage message updated. 2009-04-06 06:39:30 +00:00
mkvore-commit
4d27f18710 SAMv3: rawTests Demos scripts updated 2009-04-06 05:29:03 +00:00
mkvore-commit
1bc4cb382e SAMv3 : protocol better specified, and small changes in the code reflecting the new protocol 2009-04-05 21:35:56 +00:00
mkvore-commit
6b825fbe25 SAMv3 : protocol better specified, and small changes in the code reflecting the new protocol 2009-04-05 21:32:43 +00:00
sponge
884663d077 Forgot the history.txt entry, oops!! 2009-04-04 19:48:27 +00:00
sponge
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
mkvore-commit
2cf5221620 minimize differences with mainstream apps/streaming 2009-04-04 12:37:19 +00:00
mkvore-commit
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
sponge
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
sponge
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
mkvore-commit
bc086a78eb explicit merge of '7bae8d314209ec279a4da918dc3255e31bda7e45'
and '3b133e76d8124df27791cb78006e7c2b9a8b6430'
2009-04-02 08:57:46 +00:00
mkvore-commit
e0dccb5970 2009-04-02 08:54:28 +00:00
mkvore-commit
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
sponge
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
390 changed files with 14189 additions and 2345 deletions

View File

@@ -7,7 +7,7 @@ i2cp.tcp.port=7654
BOB.host=localhost
inbound.lengthVariance=0
i2cp.messageReliability=BestEffort
BOB.port=45067
BOB.port=45678
outbound.length=1
inbound.length=1
outbound.lengthVariance=0

View File

@@ -152,7 +152,7 @@ is divided into following sections:
<attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/>
<attribute default="${javac.debug}" name="debug"/>
<attribute default="" name="sourcepath"/>
<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}">

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.
# 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.script.CRC32=75fac64c
nbproject/build-impl.xml.stylesheet.CRC32=e55b27f5
nbproject/build-impl.xml.script.CRC32=c51e188e
nbproject/build-impl.xml.stylesheet.CRC32=65b8de21

View File

@@ -24,43 +24,24 @@ dist.dir=dist
dist.jar=${dist.dir}/BOB.jar
dist.javadoc.dir=${dist.dir}/javadoc
excludes=
file.reference.core.jar=../i2p.i2p/core/dist/core.jar
file.reference.i2p.jar=../../bob/i2p/i2p.i2p/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.build-javadoc=../../i2p.i2p/build/javadoc
file.reference.i2p.jar=../../core/java/build/i2p.jar
file.reference.i2ptunnel.jar=../i2ptunnel/java/build/i2ptunnel.jar
file.reference.java-src=../i2p.i2p/core/java/src/
file.reference.jbigi.jar=../../bob/i2p/i2p.i2p/build/jbigi.jar
file.reference.mstreaming.jar=../../bob/i2p/i2p.i2p/build/mstreaming.jar
file.reference.mstreaming.jar-1=../ministreaming/java/build/mstreaming.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.jbigi.jar=../../installer/lib/jbigi/jbigi.jar
file.reference.mstreaming.jar=../ministreaming/java/build/mstreaming.jar
file.reference.router.jar=../../router/java/build/router.jar
file.reference.streaming.jar=../streaming/java/build/streaming.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=**
jar.compress=false
javac.classpath=\
${file.reference.i2p.jar-1}:\
${file.reference.router.jar}:\
${file.reference.i2ptunnel.jar}:\
${file.reference.mstreaming.jar-1}:\
${file.reference.streaming.jar-1}:\
${file.reference.wrapper.jar-1}:\
${file.reference.mstreaming.jar}:\
${file.reference.streaming.jar}:\
${file.reference.wrapper.jar}:\
${file.reference.wrapper.jar-2}:\
${file.reference.wrapper.jar-3}:\
${file.reference.wrapper.jar-4}:\
${file.reference.wrapper.jar-5}
${file.reference.i2p.jar}:\
${file.reference.router.jar}
# Space-separated list of extra javac options
javac.compilerargs=
javac.deprecation=false

View File

@@ -34,6 +34,9 @@ import java.util.Properties;
import net.i2p.client.I2PClient;
import net.i2p.client.streaming.RetransmissionTimer;
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">
* ################################################################################<br>
@@ -157,12 +160,15 @@ public class BOB {
boolean save = false;
// Set up all defaults to be passed forward to other threads.
// 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");
// This is here just to ensure there is no interference with our threadgroups.
RetransmissionTimer Y = RetransmissionTimer.getInstance();
SimpleScheduler Y1 = SimpleScheduler.getInstance();
SimpleTimer2 Y2 = SimpleTimer2.getInstance();
i = Y.hashCode();
i = Y1.hashCode();
i = Y2.hashCode();
{
try {
FileInputStream fi = new FileInputStream(configLocation);

View File

@@ -46,7 +46,7 @@ public class DoCMDS implements Runnable {
// FIX ME
// I need a better way to do versioning, but this will do for now.
public static final String BMAJ = "00", BMIN = "00", BREV = "04", BEXT = "";
public static final String BMAJ = "00", BMIN = "00", BREV = "06", BEXT = "";
public static final String BOBversion = BMAJ + "." + BMIN + "." + BREV + BEXT;
private Socket server;
private Properties props;
@@ -748,14 +748,12 @@ public class DoCMDS implements Runnable {
nickinfo = (NamedDB) database.get(Arg);
if (!tunnelactive(nickinfo)) {
nickinfo = null;
ns =
true;
ns = true;
}
} catch (Exception b) {
nickinfo = null;
ns =
true;
ns = true;
}
try {
@@ -775,10 +773,10 @@ public class DoCMDS implements Runnable {
try {
database.add(Arg, nickinfo);
nickinfo.add(P_NICKNAME, Arg);
nickinfo.add(P_STARTING, Boolean.FALSE);
nickinfo.add(P_RUNNING, Boolean.FALSE);
nickinfo.add(P_STOPPING, Boolean.FALSE);
nickinfo.add(P_QUIET, Boolean.FALSE);
nickinfo.add(P_STARTING, new Boolean(false));
nickinfo.add(P_RUNNING, new Boolean(false));
nickinfo.add(P_STOPPING, new Boolean(false));
nickinfo.add(P_QUIET, new Boolean(false));
nickinfo.add(P_INHOST, "localhost");
nickinfo.add(P_OUTHOST, "localhost");
Properties Q = new Properties();
@@ -1265,13 +1263,17 @@ public class DoCMDS implements Runnable {
tunnel = new MUXlisten(database, nickinfo, _log);
Thread t = new Thread(tunnel);
t.start();
// try {
// Thread.sleep(1000 * 10); // Slow down the startup.
// } catch(InterruptedException ie) {
// // ignore it
// }
out.println("OK tunnel starting");
} catch (I2PException e) {
out.println("ERROR starting tunnel: " + e);
} catch (IOException e) {
out.println("ERROR starting tunnel: " + e);
}
}
} catch (Exception ex) {
break die;
@@ -1304,7 +1306,7 @@ public class DoCMDS implements Runnable {
break die;
}
nickinfo.add(P_STOPPING, Boolean.TRUE);
nickinfo.add(P_STOPPING, new Boolean(true));
try {
wunlock();

View File

@@ -25,9 +25,9 @@ package net.i2p.BOB;
import java.net.ConnectException;
import java.net.SocketTimeoutException;
import java.util.logging.Level;
import java.util.logging.Logger;
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.I2PSocket;
import net.i2p.client.streaming.I2PSocketManager;
@@ -42,24 +42,35 @@ public class I2Plistener implements Runnable {
private NamedDB info, database;
private Log _log;
private int tgwatch;
// private int tgwatch;
public I2PSocketManager socketManager;
public I2PServerSocket serverSocket;
/**
* Constructor
* @param SS
* @param S
* @param info
* @param database
* @param _log
*/
I2Plistener(I2PSocketManager S, NamedDB info, NamedDB database, Log _log) {
I2Plistener(I2PServerSocket SS, I2PSocketManager S, NamedDB info, NamedDB database, Log _log) {
this.database = database;
this.info = info;
this._log = _log;
this.socketManager = S;
serverSocket = this.socketManager.getServerSocket();
tgwatch = 1;
serverSocket = SS;
// tgwatch = 1;
}
private void rlock() throws Exception {
database.getReadLock();
info.getReadLock();
}
private void runlock() throws Exception {
database.releaseReadLock();
info.releaseReadLock();
}
/**
@@ -69,69 +80,59 @@ public class I2Plistener implements Runnable {
public void run() {
boolean g = false;
I2PSocket sessSocket = null;
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");
int conn = 0;
try {
serverSocket.close();
} catch(I2PException e) {
// nop
}
// need to kill off the socket manager too.
I2PSession session = socketManager.getSession();
if(session != null) {
// System.out.println("I2Plistener: destroySession");
try {
session.destroySession();
} catch(I2PSessionException ex) {
// nop
}
}
// System.out.println("I2Plistener: Waiting for children");
while(Thread.activeCount() > tgwatch) { // wait for all threads in our threadgroup to finish
try {
Thread.sleep(100); //sleep for 100 ms (One tenth second)
} catch(Exception e) {
// nop
}
}
die:
{
// System.out.println("I2Plistener: Done.");
serverSocket.setSoTimeout(50);
boolean spin = true;
while (spin) {
try {
rlock();
} catch (Exception e) {
break die;
}
try {
spin = info.get("RUNNING").equals(Boolean.TRUE);
} catch (Exception e) {
try {
runlock();
} catch (Exception e2) {
break die;
}
break die;
}
try {
try {
sessSocket = serverSocket.accept();
g = true;
} catch (ConnectException ce) {
g = false;
} catch (SocketTimeoutException ste) {
g = false;
}
if (g) {
g = false;
conn++;
// toss the connection to a new thread.
I2PtoTCP conn_c = new I2PtoTCP(sessSocket, info, database);
Thread t = new Thread(conn_c, Thread.currentThread().getName() + " I2PtoTCP " + conn);
t.start();
}
} catch (Exception e) {
// System.out.println("Exception " + e);
}
}
}
} finally {
try {
serverSocket.close();
} catch (I2PException ex) {
}
// System.out.println("I2Plistener: Close");
}
}
}

View File

@@ -70,75 +70,99 @@ public class I2PtoTCP implements Runnable {
String host;
int port;
boolean tell;
die: {
try {
InputStream in = null;
OutputStream out = null;
InputStream Iin = null;
OutputStream Iout = null;
try {
die:
{
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 {
Thread.sleep(10); //sleep for 10 ms
} catch(InterruptedException e) {
// nop
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
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 /*, info, database */); // app -> I2P
TCPio conn_a = new TCPio(Iin, out /* , info, database */); // I2P -> app
Thread t = new Thread(conn_c, Thread.currentThread().getName() + " TCPioA");
Thread q = new Thread(conn_a, Thread.currentThread().getName() + " TCPioB");
// Fire!
t.start();
q.start();
while (t.isAlive() && q.isAlive()) { // 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...");
} catch(Exception e) {
// System.out.println("I2PtoTCP: Owch! damn!");
break die;
} catch (Exception e) {
// System.out.println("I2PtoTCP: Owch! damn!");
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 {
// 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");
}
}
}

View File

@@ -29,10 +29,10 @@ import java.net.InetAddress;
import java.net.ServerSocket;
import java.util.Properties;
import net.i2p.I2PException;
import net.i2p.client.streaming.I2PServerSocket;
import net.i2p.client.streaming.I2PSocketManager;
import net.i2p.client.streaming.I2PSocketManagerFactory;
import net.i2p.util.Log;
import org.tanukisoftware.wrapper.WrapperManager;
/**
*
@@ -48,7 +48,7 @@ public class MUXlisten implements Runnable {
private ByteArrayInputStream prikey;
private ThreadGroup tg;
private String N;
private ServerSocket listener;
private ServerSocket listener = null;
private int backlog = 50; // should this be more? less?
boolean go_out;
boolean come_in;
@@ -56,8 +56,8 @@ public class MUXlisten implements Runnable {
/**
* Constructor Will fail if INPORT is occupied.
*
* @param info
* @param database
* @param info DB entry for this tunnel
* @param database master database of tunnels
* @param _log
* @throws net.i2p.I2PException
* @throws java.io.IOException
@@ -73,9 +73,9 @@ public class MUXlisten implements Runnable {
this.database.getReadLock();
this.info.getReadLock();
N = this.info.get("NICKNAME").toString();
prikey = new ByteArrayInputStream((byte[])info.get("KEYS"));
prikey = new ByteArrayInputStream((byte[]) info.get("KEYS"));
// Make a new copy so that anything else won't muck with our database.
Properties R = (Properties)info.get("PROPERTIES");
Properties R = (Properties) info.get("PROPERTIES");
Properties Q = new Properties();
Lifted.copyProperties(R, Q);
this.database.releaseReadLock();
@@ -85,7 +85,7 @@ public class MUXlisten implements Runnable {
this.info.getReadLock();
this.go_out = info.exists("OUTPORT");
this.come_in = info.exists("INPORT");
if(this.come_in) {
if (this.come_in) {
port = Integer.parseInt(info.get("INPORT").toString());
host = InetAddress.getByName(info.get("INHOST").toString());
}
@@ -93,14 +93,14 @@ public class MUXlisten implements Runnable {
this.info.releaseReadLock();
socketManager = I2PSocketManagerFactory.createManager(prikey, Q);
if(this.come_in) {
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.add("STARTING", new Boolean(true));
this.info.releaseWriteLock();
this.database.releaseWriteLock();
}
@@ -130,170 +130,271 @@ public class MUXlisten implements Runnable {
*
*/
public void run() {
I2PServerSocket SS = null;
Thread t = null;
Thread q = null;
try {
wlock();
try {
info.add("RUNNING", Boolean.TRUE);
info.add("STARTING", Boolean.FALSE);
} catch(Exception e) {
wunlock();
wlock();
try {
info.add("RUNNING", new Boolean(true));
} catch (Exception e) {
wunlock();
return;
}
} catch (Exception e) {
return;
}
} catch(Exception e) {
return;
}
try {
wunlock();
} catch(Exception e) {
return;
}
quit: {
try {
tg = new ThreadGroup(N);
die: {
// toss the connections to a new threads.
// will wrap with TCP and UDP when UDP works
wunlock();
} catch (Exception e) {
return;
}
// socketManager.addDisconnectListener(new DisconnectListener());
if(go_out) {
// I2P -> TCP
I2Plistener conn = new I2Plistener(socketManager, info, database, _log);
Thread t = new Thread(tg, conn, "BOBI2Plistener " + N);
t.start();
}
quit:
{
try {
tg = new ThreadGroup(N);
die:
{
// toss the connections to a new threads.
// will wrap with TCP and UDP when UDP works
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
if (go_out) {
// I2P -> TCP
SS = socketManager.getServerSocket();
I2Plistener conn = new I2Plistener(SS, socketManager, info, database, _log);
t = new Thread(tg, conn, "BOBI2Plistener " + N);
t.start();
}
if (come_in) {
// TCP -> I2P
TCPlistener conn = new TCPlistener(listener, socketManager, info, database, _log);
q = new Thread(tg, conn, "BOBTCPlistener " + N);
q.start();
}
try {
rlock();
wlock();
try {
spin = info.get("STOPPING").equals(Boolean.FALSE);
} catch(Exception e) {
runlock();
info.add("STARTING", new Boolean(false));
} catch (Exception e) {
wunlock();
break die;
}
} catch(Exception e) {
} catch (Exception e) {
break die;
}
try {
runlock();
} catch(Exception e) {
break die;
}
}
try {
wlock();
try {
info.add("RUNNING", Boolean.FALSE);
} catch(Exception e) {
wunlock();
} catch (Exception e) {
break die;
}
} catch(Exception e) {
break die;
}
try {
wunlock();
} catch(Exception e) {
break die;
}
} // die
boolean spin = true;
while (spin) {
try {
Thread.sleep(1000); //sleep for 1 second
} catch (InterruptedException e) {
break die;
}
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 {
Thread.sleep(500); //sleep for 500 ms (One half second)
} catch(InterruptedException ex) {
// nop
try {
wlock();
try {
info.add("RUNNING", new Boolean(false));
} catch (Exception e) {
wunlock();
break die;
}
} catch (Exception e) {
break die;
}
try {
wunlock();
} catch (Exception e) {
break die;
}
} // die
} catch (Exception e) {
// System.out.println("MUXlisten: Caught an exception" + e);
break quit;
}
// wait for child threads and thread groups to die
// System.out.println("MUXlisten: waiting for children");
if(tg.activeCount() + tg.activeGroupCount() != 0) {
tg.interrupt(); // unwedge any blocking threads.
while(tg.activeCount() + tg.activeGroupCount() != 0) {
} // quit
} finally {
// Start cleanup. Allow threads above this one to catch the stop signal.
try {
Thread.sleep(250);
} 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) {
wunlock();
return;
}
wunlock();
} catch (Exception e) {
}
if (SS != null) {
try {
SS.close();
} catch (I2PException ex) {
}
}
if (listener != null) {
try {
listener.close();
} catch (IOException e) {
}
}
try {
socketManager.destroySocketManager();
} catch (Exception e) {
// nop
}
// Wait around till all threads are collected.
if (tg != null) {
String boner = tg.getName();
_log.warn("BOB: MUXlisten: Starting thread collection for: " + boner);
// tg.interrupt(); // give my stuff a small smack again.
if (tg.activeCount() + tg.activeGroupCount() != 0) {
int foo = tg.activeCount() + tg.activeGroupCount();
// hopefully no longer needed!
// int bar = foo;
// 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 (foo != bar) {
// System.out.println("\nBOB: MUXlisten: ThreadGroup dump BEGIN " + boner);
// visit(tg, 0, boner);
// System.out.println("BOB: MUXlisten: ThreadGroup dump END " + boner + "\n");
// }
// bar = foo;
try {
Thread.sleep(100); //sleep for 100 ms (One tenth second)
} catch(InterruptedException ex) {
} catch (InterruptedException ex) {
// nop
}
}
}
_log.warn("BOB: MUXlisten: Threads went away. Success: " + boner);
tg.destroy();
// Zap reference to the ThreadGroup so the JVM can GC it.
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
}
// Debugging... None of this is normally used.
/**
* Find the root thread group and print them all.
*
*/
private void visitAllThreads() {
ThreadGroup root = Thread.currentThread().getThreadGroup().getParent();
while (root.getParent() != null) {
root = root.getParent();
}
try {
wlock();
// Visit each thread group
visit(root, 0, root.getName());
}
/**
* Recursively visits all thread groups under `group' and dumps them.
* @param group ThreadGroup to visit
* @param level Current level
*/
private static void visit(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);
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());
}
}
private static void nuke(ThreadGroup group, int level) {
// 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 stop it.
for (int i = 0; i < numThreads; i++) {
// Get thread
Thread thread = threads[i];
try {
info.add("STARTING", Boolean.FALSE);
info.add("STOPPING", Boolean.FALSE);
info.add("RUNNING", Boolean.FALSE);
} 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.
while(tg.activeCount() + tg.activeGroupCount() != 0) {
try {
Thread.sleep(100); //sleep for 100 ms (One tenth second)
} catch(InterruptedException ex) {
// nop
}
if (thread.isAlive()) {
thread.stop();
}
} catch (SecurityException se) {
//nop
}
tg.destroy();
// Zap reference to the ThreadGroup so the JVM can GC it.
tg = null;
}
// Lastly try to close things again.
if(this.come_in) {
try {
listener.close();
} catch(IOException e) {
}
// 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++) {
nuke(groups[i], level + 1);
}
try {
socketManager.destroySocketManager();
} catch(Exception e) {
// nop
group.destroy();
} catch (IllegalThreadStateException IE) {
//nop
} catch (SecurityException se) {
//nop
}
}
}

View File

@@ -24,7 +24,8 @@
package net.i2p.BOB;
import net.i2p.client.streaming.RetransmissionTimer;
import net.i2p.util.SimpleScheduler;
import net.i2p.util.SimpleTimer2;
/**
* Start from command line
*
@@ -39,7 +40,13 @@ public class Main {
public static void main(String[] args) {
// THINK THINK THINK THINK THINK THINK
RetransmissionTimer Y = RetransmissionTimer.getInstance();
SimpleScheduler Y1 = SimpleScheduler.getInstance();
SimpleTimer2 Y2 = SimpleTimer2.getInstance();
BOB.main(args);
Y2.stop();
Y1.stop();
Y.stop();
}
}

View File

@@ -23,6 +23,7 @@
*/
package net.i2p.BOB;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -35,21 +36,21 @@ public class TCPio implements Runnable {
private InputStream Ain;
private OutputStream Aout;
private NamedDB info, database;
// private NamedDB info, database;
/**
* Constructor
*
* @param Ain
* @param Aout
* @param info
* @param database
* @param Ain InputStream
* @param Aout OutputStream
*
* param database
*/
TCPio(InputStream Ain, OutputStream Aout, NamedDB info, NamedDB database) {
TCPio(InputStream Ain, OutputStream Aout /*, NamedDB info , NamedDB database */) {
this.Ain = Ain;
this.Aout = Aout;
this.info = info;
this.database = database;
// this.info = info;
// this.database = database;
}
/**
@@ -76,6 +77,9 @@ public class TCPio implements Runnable {
*
* --Sponge
*
* Tested with 128 bytes, and there was no performance gain.
*
* --Sponge
*/
int b;
@@ -83,23 +87,13 @@ public class TCPio implements Runnable {
boolean spin = true;
try {
while(spin) {
database.getReadLock();
info.getReadLock();
spin = info.get("RUNNING").equals(Boolean.TRUE);
info.releaseReadLock();
database.releaseReadLock();
b = Ain.read(a, 0, 1);
// System.out.println(info.get("NICKNAME").toString() + " " + b);
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);
} catch(InterruptedException ex) {
}
}
} else {
/* according to the specs:
@@ -110,13 +104,22 @@ public class TCPio implements Runnable {
*
*/
// System.out.println("TCPio: End Of Stream");
Ain.close();
Aout.close();
return;
}
}
// System.out.println("TCPio: RUNNING = false");
} catch(Exception e) {
// 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;
}
// System.out.println("TCPio: Leaving.");

View File

@@ -27,8 +27,10 @@ import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
import net.i2p.client.I2PSession;
import net.i2p.client.I2PSessionException;
// import net.i2p.client.I2PSession;
// import net.i2p.client.I2PSessionException;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.i2p.client.streaming.I2PServerSocket;
import net.i2p.client.streaming.I2PSocketManager;
import net.i2p.util.Log;
@@ -63,6 +65,16 @@ public class TCPlistener implements Runnable {
tgwatch = 1;
}
private void rlock() throws Exception {
database.getReadLock();
info.getReadLock();
}
private void runlock() throws Exception {
database.releaseReadLock();
info.releaseReadLock();
}
/**
* Simply listen on TCP port, and thread connections
*
@@ -70,78 +82,80 @@ public class TCPlistener implements Runnable {
public void run() {
boolean g = false;
boolean spin = true;
database.getReadLock();
info.getReadLock();
if(info.exists("OUTPORT")) {
tgwatch = 2;
}
int conn = 0;
try {
Socket server = new Socket();
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();
die:
{
try {
server = listener.accept();
g = true;
} catch(SocketTimeoutException ste) {
g = false;
rlock();
} catch (Exception e) {
break die;
}
if(g) {
// toss the connection to a new thread.
TCPtoI2P conn_c = new TCPtoI2P(socketManager, server, info, database);
Thread t = new Thread(conn_c, "BOBTCPtoI2P");
t.start();
g = false;
try {
if (info.exists("OUTPORT")) {
tgwatch = 2;
}
} catch (Exception e) {
try {
runlock();
} catch (Exception e2) {
break die;
}
break die;
}
try {
runlock();
} catch (Exception e) {
break die;
}
try {
Socket server = new Socket();
listener.setSoTimeout(50); // We don't block, we cycle and check.
while (spin) {
try {
rlock();
} catch (Exception e) {
break die;
}
try {
spin = info.get("RUNNING").equals(Boolean.TRUE);
} catch (Exception e) {
try {
runlock();
} catch (Exception e2) {
break die;
}
break die;
}
try {
server = listener.accept();
g = true;
} catch (SocketTimeoutException ste) {
g = false;
}
if (g) {
conn++;
// toss the connection to a new thread.
TCPtoI2P conn_c = new TCPtoI2P(socketManager, server);
Thread t = new Thread(conn_c, Thread.currentThread().getName() + " TCPtoI2P " + conn);
t.start();
g = false;
}
}
listener.close();
} catch (IOException ioe) {
try {
listener.close();
} catch (IOException e) {
}
}
}
//System.out.println("TCPlistener: destroySession");
listener.close();
} catch(IOException ioe) {
} finally {
try {
listener.close();
} catch(IOException e) {
}
// 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();
} catch (IOException ex) {
}
//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

@@ -45,7 +45,7 @@ import net.i2p.i2ptunnel.I2PTunnel;
public class TCPtoI2P implements Runnable {
private I2PSocket I2P;
private NamedDB info, database;
// private NamedDB info, database;
private Socket sock;
private I2PSocketManager socketManager;
@@ -64,17 +64,17 @@ public class TCPtoI2P implements Runnable {
S = new String();
while(true) {
while (true) {
b = in.read();
if(b == 13) {
if (b == 13) {
//skip CR
continue;
}
if(b < 20 || b > 126) {
if (b < 20 || b > 126) {
// exit on anything not legal
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);
}
return S;
@@ -84,13 +84,13 @@ public class TCPtoI2P implements Runnable {
* Constructor
* @param i2p
* @param socket
* @param info
* @param database
* param info
* param database
*/
TCPtoI2P(I2PSocketManager i2p, Socket socket, NamedDB info, NamedDB database) {
TCPtoI2P(I2PSocketManager i2p, Socket socket /*, NamedDB info, NamedDB database */) {
this.sock = socket;
this.info = info;
this.database = database;
// this.info = info;
// this.database = database;
this.socketManager = i2p;
}
@@ -110,77 +110,95 @@ public class TCPtoI2P implements Runnable {
/**
* TCP stream to I2P stream thread starter
*
*/
public void run() {
String line, input;
InputStream Iin = null;
OutputStream Iout = null;
InputStream in = null;
OutputStream out = null;
try {
InputStream in = sock.getInputStream();
OutputStream out = sock.getOutputStream();
try {
line = lnRead(in);
input = line.toLowerCase();
Destination dest = null;
if(input.endsWith(".i2p")) {
dest = I2PTunnel.destFromName(input);
line = dest.toBase64();
}
dest = new Destination();
dest.fromBase64(line);
in = sock.getInputStream();
out = sock.getOutputStream();
try {
// get a client socket
I2P = socketManager.connect(dest);
I2P.setReadTimeout(0); // temp bugfix, this *SHOULD* be the default
// make readers/writers
InputStream Iin = I2P.getInputStream();
OutputStream Iout = I2P.getOutputStream();
// 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 {
Thread.sleep(10); //sleep for 10 ms
} catch(InterruptedException e) {
// nop
}
}
// System.out.println("TCPtoI2P: Going away...");
line = lnRead(in);
input = line.toLowerCase();
Destination dest = null;
} catch(I2PException e) {
Emsg("ERROR " + e.toString(), out);
} catch(ConnectException e) {
Emsg("ERROR " + e.toString(), out);
} catch(NoRouteToHostException e) {
Emsg("ERROR " + e.toString(), out);
} catch(InterruptedIOException e) {
if (input.endsWith(".i2p")) {
dest = I2PTunnel.destFromName(input);
line = dest.toBase64();
}
dest = new Destination();
dest.fromBase64(line);
try {
// get a client socket
I2P = socketManager.connect(dest);
I2P.setReadTimeout(0); // temp bugfix, this *SHOULD* be the default
// make readers/writers
Iin = I2P.getInputStream();
Iout = I2P.getOutputStream();
// 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, Thread.currentThread().getName() + " TCPioA");
Thread q = new Thread(conn_a, Thread.currentThread().getName() + " TCPioB");
// Fire!
t.start();
q.start();
while (t.isAlive() && q.isAlive()) { // AND is used here to kill off the other thread
Thread.sleep(10); //sleep for 10 ms
}
} catch (I2PException e) {
Emsg("ERROR " + e.toString(), out);
} catch (ConnectException e) {
Emsg("ERROR " + e.toString(), out);
} catch (NoRouteToHostException e) {
Emsg("ERROR " + e.toString(), out);
} catch (InterruptedIOException e) {
// We're breaking away.
}
} catch (Exception e) {
Emsg("ERROR " + e.toString(), out);
}
} catch(Exception e) {
Emsg("ERROR " + e.toString(), out);
} catch (Exception e) {
// bail on anything else
}
} finally {
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) {
}
} catch(IOException ioe) {
}
try {
// System.out.println("TCPtoI2P: Close I2P");
I2P.close();
} catch(Exception e) {
}
try {
// System.out.println("TCPtoI2P: Close sock");
sock.close();
} catch(Exception e) {
try {
// System.out.println("TCPtoI2P: Close sock");
sock.close();
} catch (Exception e) {
}
}
// System.out.println("TCPtoI2P: Done.");
// System.out.println("TCPtoI2P: Done.");
}
}

View File

@@ -6,6 +6,7 @@
<property name="dist" location="dist"/>
<property name="jar" value="addressbook.jar"/>
<property name="war" value="addressbook.war"/>
<property name="javac.compilerargs" value="" />
<target name="init">
<mkdir dir="${build}"/>
@@ -38,6 +39,7 @@
<target name="compile" depends="init, depend">
<javac debug="true" deprecation="on" source="1.5" target="1.5"
srcdir="${src}" destdir="${build}">
<compilerarg line="${javac.compilerargs}" />
<classpath>
<pathelement location="../../core/java/build/i2p.jar" />
<pathelement location="../jetty/jettylib/javax.servlet.jar" />

View File

@@ -133,7 +133,7 @@ public class Daemon {
}
Map defaultSettings = new HashMap();
defaultSettings.put("proxy_host", "localhost");
defaultSettings.put("proxy_host", "127.0.0.1");
defaultSettings.put("proxy_port", "4444");
defaultSettings.put("master_addressbook", "../userhosts.txt");
defaultSettings.put("router_addressbook", "../hosts.txt");

View File

@@ -54,9 +54,10 @@ public class Servlet extends GenericServlet {
args[0] = config.getInitParameter("home");
DaemonThread thread = new DaemonThread(args);
thread.setDaemon(true);
thread.setName("Addressbook");
thread.start();
System.out.println("INFO: Starting Addressbook " + Daemon.VERSION);
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.

115
apps/desktopgui/build.xml Normal file
View File

@@ -0,0 +1,115 @@
<?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"/>
<path id="build_classpath">
<fileset dir="${build_lib}" includes="**/*.jar"/>
<fileset dir="${build_i2pref}" 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,77 @@
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.router.jar=../../router/java/build/router.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}
# 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.1.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,546 @@
<?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="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>
</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>
</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="keyTyped" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="speedKeyTyped"/>
</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="keyTyped" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="speedKeyTyped"/>
</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="jLabel3">
<Properties>
<Property name="text" type="java.lang.String" resourceKey="jLabel3.text"/>
<Property name="name" type="java.lang.String" value="jLabel3" 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="jLabel4">
<Properties>
<Property name="text" type="java.lang.String" resourceKey="jLabel4.text"/>
<Property name="name" type="java.lang.String" value="jLabel4" 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="keyTyped" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="uploadgbKeyTyped"/>
</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="keyTyped" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="downloadgbKeyTyped"/>
</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="jLabel5">
<Properties>
<Property name="text" type="java.lang.String" resourceKey="jLabel5.text"/>
<Property name="name" type="java.lang.String" value="jLabel5" 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="jLabel6">
<Properties>
<Property name="text" type="java.lang.String" resourceKey="jLabel6.text"/>
<Property name="name" type="java.lang.String" value="jLabel6" 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="jLabel7">
<Properties>
<Property name="text" type="java.lang.String" resourceKey="jLabel7.text"/>
<Property name="name" type="java.lang.String" value="jLabel7" 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" attributes="0">
<Component id="updateDownload" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="updateInform" alignment="0" min="-2" max="-2" attributes="0"/>
<Component id="updateDownloadRestart" alignment="0" min="-2" max="-2" attributes="0"/>
</Group>
</Group>
</Group>
<EmptySpace min="-2" pref="9" 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="buttonGroup1"/>
</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="buttonGroup1"/>
</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="buttonGroup1"/>
</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>
</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>
</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>
</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="0" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Component id="serverFrame" alignment="1" pref="538" max="32767" attributes="0"/>
<Component id="tunnelsExplanation" alignment="0" 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 min="-2" max="-2" attributes="0"/>
<Component id="tunnelsExplanation" min="-2" pref="65" max="-2" attributes="0"/>
<EmptySpace min="-2" 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"/>
</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"/>
</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,461 @@
/*
* GeneralConfiguration.java
*
* Created on 10 april 2009, 19:04
*/
package net.i2p.desktopgui.gui;
import net.i2p.desktopgui.router.configuration.SpeedHelper;
/**
*
* @author mathias
*/
public class GeneralConfiguration extends javax.swing.JFrame {
/** Creates new form GeneralConfiguration */
public GeneralConfiguration() {
initComponents();
extraInitComponents();
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.setVisible(true);
}
private void extraInitComponents() {
downloadspeed.setText(SpeedHelper.getInboundBandwidth());
}
/** 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();
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();
jLabel3 = new javax.swing.JLabel();
jLabel4 = new javax.swing.JLabel();
uploadgb = new javax.swing.JTextField();
downloadgb = new javax.swing.JTextField();
jLabel5 = new javax.swing.JLabel();
jLabel6 = new javax.swing.JLabel();
jLabel7 = 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();
serverFrame = new javax.swing.JScrollPane();
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
ok.setText(resourceMap.getString("ok.text")); // NOI18N
ok.setName("ok"); // NOI18N
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 keyTyped(java.awt.event.KeyEvent evt) {
speedKeyTyped(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 keyTyped(java.awt.event.KeyEvent evt) {
speedKeyTyped(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);
jLabel3.setText(resourceMap.getString("jLabel3.text")); // NOI18N
jLabel3.setName("jLabel3"); // NOI18N
speedPanel.add(jLabel3);
jLabel3.setBounds(330, 20, 97, 30);
jLabel4.setText(resourceMap.getString("jLabel4.text")); // NOI18N
jLabel4.setName("jLabel4"); // NOI18N
speedPanel.add(jLabel4);
jLabel4.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 keyTyped(java.awt.event.KeyEvent evt) {
uploadgbKeyTyped(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 keyTyped(java.awt.event.KeyEvent evt) {
downloadgbKeyTyped(evt);
}
});
speedPanel.add(downloadgb);
downloadgb.setBounds(440, 60, 60, 27);
jLabel5.setText(resourceMap.getString("jLabel5.text")); // NOI18N
jLabel5.setName("jLabel5"); // NOI18N
speedPanel.add(jLabel5);
jLabel5.setBounds(510, 20, 19, 30);
jLabel6.setText(resourceMap.getString("jLabel6.text")); // NOI18N
jLabel6.setName("jLabel6"); // NOI18N
speedPanel.add(jLabel6);
jLabel6.setBounds(510, 60, 19, 30);
jLabel7.setText(resourceMap.getString("jLabel7.text")); // NOI18N
jLabel7.setName("jLabel7"); // NOI18N
speedPanel.add(jLabel7);
jLabel7.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
buttonGroup1.add(updateInform);
updateInform.setText(resourceMap.getString("updateInform.text")); // NOI18N
updateInform.setName("updateInform"); // NOI18N
buttonGroup1.add(updateDownload);
updateDownload.setText(resourceMap.getString("updateDownload.text")); // NOI18N
updateDownload.setName("updateDownload"); // NOI18N
buttonGroup1.add(updateDownloadRestart);
updateDownloadRestart.setText(resourceMap.getString("updateDownloadRestart.text")); // NOI18N
updateDownloadRestart.setName("updateDownloadRestart"); // NOI18N
checkUpdates.setText(resourceMap.getString("checkUpdates.text")); // NOI18N
checkUpdates.setName("checkUpdates"); // NOI18N
updateNow.setText(resourceMap.getString("updateNow.text")); // NOI18N
updateNow.setName("updateNow"); // NOI18N
advancedUpdateConfig.setText(resourceMap.getString("advancedUpdateConfig.text")); // NOI18N
advancedUpdateConfig.setName("advancedUpdateConfig"); // NOI18N
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)
.addComponent(updateDownload)
.addComponent(updateInform)
.addComponent(updateDownloadRestart))))
.addGap(9, 9, 9))
.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
serverFrame.setName("serverFrame"); // 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(tunnelPanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(tunnelPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(serverFrame, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE)
.addComponent(tunnelsExplanation, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE)
.addComponent(clientTunnelLabel)
.addComponent(clientFrame, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE)
.addComponent(serverTunnelLabel))
.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, 65, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
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 speedKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_speedKeyTyped
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_speedKeyTyped
private void uploadkbpsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_uploadkbpsActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_uploadkbpsActionPerformed
private void downloadkbpsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_downloadkbpsActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_downloadkbpsActionPerformed
private void uploadgbKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_uploadgbKeyTyped
// TODO add your handling code here:
}//GEN-LAST:event_uploadgbKeyTyped
private void downloadgbKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_downloadgbKeyTyped
// TODO add your handling code here:
}//GEN-LAST:event_downloadgbKeyTyped
protected void initUsage(String upload, String download) {
uploadgb.setText("" + SpeedHelper.calculateMonthlyUsage(Integer.parseInt(upload)));
downloadgb.setText("" + SpeedHelper.calculateMonthlyUsage(Integer.parseInt(download)));
}
// 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.ButtonGroup buttonGroup1;
private javax.swing.JToggleButton cancel;
private javax.swing.JToggleButton checkUpdates;
private javax.swing.JScrollPane clientFrame;
private javax.swing.JLabel clientTunnelLabel;
private javax.swing.JLabel downloadSpeedLabel;
private javax.swing.JTextField downloadgb;
private javax.swing.JComboBox downloadkbps;
private javax.swing.JTextField downloadspeed;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JLabel jLabel7;
private javax.swing.JPanel networkPanel;
private javax.swing.JToggleButton ok;
private javax.swing.JScrollPane serverFrame;
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.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 uploadSpeedLabel;
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;
}

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,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);
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,29 @@
cancel.text=Cancel
ok.text=OK
jLabel3.text=Monthly usage:
jLabel4.text=Monthly usage:
jLabel5.text=GB
jLabel6.text=GB
jLabel7.text=Explanation ...
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
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=Tunnel explanation

View File

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

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

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 -->
<classpath>
<pathelement location="../../../core/java/build/obj" />
<pathelement location="../../../router/java/build/obj" />
<pathelement location="../../ministreaming/java/build/obj" />
<pathelement location="../../jetty/jettylib/org.mortbay.jetty.jar" />
<pathelement location="../../jetty/jettylib/javax.servlet.jar" />
</classpath>
</depend>
</target>
<property name="javac.compilerargs" value="" />
<target name="compile" depends="depend">
<mkdir dir="./build" />
<mkdir dir="./build/obj" />
@@ -32,7 +32,9 @@
srcdir="./src"
debug="true" deprecation="on" source="1.5" target="1.5"
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 name="jar" depends="builddep, compile">
<jar destfile="./build/i2psnark.jar" basedir="./build/obj" includes="**/*.class" excludes="**/*Servlet.class">
@@ -56,6 +58,7 @@
<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" >
<compilerarg line="${javac.compilerargs}" />
<classpath>
<pathelement location="../../jetty/jettylib/commons-logging.jar" />
<pathelement location="../../jetty/jettylib/commons-el.jar" />

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

@@ -23,6 +23,8 @@ package org.klomp.snark;
import java.util.Iterator;
import java.util.TimerTask;
import net.i2p.data.DataHelper;
/**
* TimerTask that monitors the peers and total up/download speeds.
* Works together with the main Snark class to report periodical statistics.
@@ -83,21 +85,12 @@ class PeerMonitorTask extends TimerTask
// Print some statistics
long downloaded = coordinator.getDownloaded();
String totalDown;
if (downloaded >= 10 * 1024 * 1024)
totalDown = (downloaded / (1024 * 1024)) + "MB";
else
totalDown = (downloaded / 1024 )+ "KB";
String totalDown = DataHelper.formatSize(downloaded) + "B";
long uploaded = coordinator.getUploaded();
String totalUp;
if (uploaded >= 10 * 1024 * 1024)
totalUp = (uploaded / (1024 * 1024)) + "MB";
else
totalUp = (uploaded / 1024) + "KB";
String totalUp = DataHelper.formatSize(uploaded) + "B";
int needP = coordinator.storage.needed();
long needMB
= needP * coordinator.metainfo.getPieceLength(0) / (1024 * 1024);
long needMB = needP * coordinator.metainfo.getPieceLength(0) / (1024 * 1024);
int totalP = coordinator.metainfo.getPieces();
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).
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
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
PeerState(Peer peer, PeerListener listener, MetaInfo metainfo,

View File

@@ -36,7 +36,6 @@ import java.util.Timer;
import java.util.TimerTask;
import net.i2p.I2PAppContext;
import net.i2p.router.client.ClientManagerFacadeImpl;
import net.i2p.client.streaming.I2PServerSocket;
import net.i2p.data.Destination;
import net.i2p.util.I2PThread;
@@ -261,9 +260,9 @@ public class Snark
public Snark(I2PAppContext ctx, Properties opts, String torrent,
StorageListener slistener, boolean start, String 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;
String s = opts.getProperty(ClientManagerFacadeImpl.PROP_CLIENT_PORT);
String s = opts.getProperty("i2cp.port");
if (s != null) {
try {
port = Integer.parseInt(s);

View File

@@ -18,7 +18,6 @@ import java.util.TreeMap;
import net.i2p.I2PAppContext;
import net.i2p.data.Base64;
import net.i2p.data.DataHelper;
import net.i2p.router.RouterContext;
import net.i2p.util.I2PAppThread;
import net.i2p.util.Log;
@@ -136,33 +135,32 @@ public class SnarkManager implements Snark.CompleteListener {
}
// now add sane defaults
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))
_config.setProperty(PROP_I2CP_PORT, "7654");
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");
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))
_config.setProperty(PROP_EEP_PORT, "4444");
if (!_config.containsKey(PROP_UPLOADERS_TOTAL))
_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))
_config.setProperty(PROP_DIR, "i2psnark");
if (!_config.containsKey(PROP_AUTO_START))
_config.setProperty(PROP_AUTO_START, DEFAULT_AUTO_START);
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() {
String i2cpHost = _config.getProperty(PROP_I2CP_HOST);
@@ -364,7 +362,7 @@ public class SnarkManager implements Snark.CompleteListener {
public Properties getConfig() { return _config; }
/** 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 */
public Set listTorrentFiles() { synchronized (_snarks) { return new HashSet(_snarks.keySet()); } }
@@ -545,16 +543,18 @@ public class SnarkManager implements Snark.CompleteListener {
return "Too many files in " + info.getName() + " (" + files.size() + "), deleting it";
} else if (info.getPieces() <= 0) {
return "No pieces in " + info.getName() + "? deleting it";
} else if (info.getPieceLength(0) > 1*1024*1024) {
return "Pieces are too large in " + info.getName() + " (" + info.getPieceLength(0)/1024 + "KB), deleting it";
} else if (info.getTotalLength() > 10*1024*1024*1024l) {
} else if (info.getPieceLength(0) > Storage.MAX_PIECE_SIZE) {
return "Pieces are too large in " + info.getName() + " (" + DataHelper.formatSize(info.getPieceLength(0)) +
"B), deleting it";
} else if (info.getTotalLength() > Storage.MAX_TOTAL_SIZE) {
System.out.println("torrent info: " + info.toString());
List lengths = info.getLengths();
if (lengths != null)
for (int i = 0; i < lengths.size(); i++)
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 {
// ok
return null;
@@ -619,6 +619,9 @@ public class SnarkManager implements Snark.CompleteListener {
_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) {
File dir = getDataDir();
_log.debug("Directory Monitor loop over " + dir.getAbsolutePath());
@@ -636,8 +639,7 @@ public class SnarkManager implements Snark.CompleteListener {
public void torrentComplete(Snark snark) {
File f = new File(snark.torrent);
long len = snark.meta.getTotalLength();
addMessage("Download complete of " + f.getName()
+ (len < 5*1024*1024 ? " (size: " + (len/1024) + "KB)" : " (size: " + (len/(1024*1024l)) + "MB)"));
addMessage("Download complete of " + f.getName() + " (size: " + DataHelper.formatSize(len) + "B)");
updateStatus(snark);
}
@@ -693,6 +695,7 @@ public class SnarkManager implements Snark.CompleteListener {
// , "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/"
, "crstrack", "http://b4G9sCdtfvccMAXh~SaZrPqVQNyGQbhbYMbw6supq2XGzbjU4NcOmjFI0vxQ8w1L05twmkOvg5QERcX6Mi8NQrWnR0stLExu2LucUXg1aYjnggxIR8TIOGygZVIMV3STKH4UQXD--wz0BUrqaLxPhrm2Eh9Hwc8TdB6Na4ShQUq5Xm8D4elzNUVdpM~RtChEyJWuQvoGAHY3ppX-EJJLkiSr1t77neS4Lc-KofMVmgI9a2tSSpNAagBiNI6Ak9L1T0F9uxeDfEG9bBSQPNMOSUbAoEcNxtt7xOW~cNOAyMyGydwPMnrQ5kIYPY8Pd3XudEko970vE0D6gO19yoBMJpKx6Dh50DGgybLQ9CpRaynh2zPULTHxm8rneOGRcQo8D3mE7FQ92m54~SvfjXjD2TwAVGI~ae~n9HDxt8uxOecAAvjjJ3TD4XM63Q9TmB38RmGNzNLDBQMEmJFpqQU8YeuhnS54IVdUoVQFqui5SfDeLXlSkh4vYoMU66pvBfWbAAAA.i2p/tracker/announce.php=http://crstrack.i2p/tracker/"
, "Postman2", "http://lnQ6yoBTxQuQU8EQ1FlF395ITIQF-HGJxUeFvzETLFnoczNjQvKDbtSB7aHhn853zjVXrJBgwlB9sO57KakBDaJ50lUZgVPhjlI19TgJ-CxyHhHSCeKx5JzURdEW-ucdONMynr-b2zwhsx8VQCJwCEkARvt21YkOyQDaB9IdV8aTAmP~PUJQxRwceaTMn96FcVenwdXqleE16fI8CVFOV18jbJKrhTOYpTtcZKV4l1wNYBDwKgwPx5c0kcrRzFyw5~bjuAKO~GJ5dR7BQsL7AwBoQUS4k1lwoYrG1kOIBeDD3XF8BWb6K3GOOoyjc1umYKpur3G~FxBuqtHAsDRICkEbKUqJ9mPYQlTSujhNxiRIW-oLwMtvayCFci99oX8MvazPS7~97x0Gsm-onEK1Td9nBdmq30OqDxpRtXBimbzkLbR1IKObbg9HvrKs3L-kSyGwTUmHG9rSQSoZEvFMA-S0EXO~o4g21q1oikmxPMhkeVwQ22VHB0-LZJfmLr4SAAAA.i2p/announce.php=http://tracker2.postman.i2p/"
};
/** comma delimited list of name=announceURL=baseURL for the trackers to be displayed */

View File

@@ -56,10 +56,11 @@ public class Storage
boolean changed;
/** The default piece size. */
private static int MIN_PIECE_SIZE = 256*1024;
private static int MAX_PIECE_SIZE = 1024*1024;
private static final int MIN_PIECE_SIZE = 256*1024;
public static final int MAX_PIECE_SIZE = 1024*1024;
/** 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

View File

@@ -502,9 +502,10 @@ public class I2PSnarkServlet extends HttpServlet {
out.write(filename);
if (remaining == 0)
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();
if (announce.startsWith("http://YRgrgTLG") || announce.startsWith("http://8EoJZIKr")) {
if (announce.startsWith("http://YRgrgTLG") || announce.startsWith("http://8EoJZIKr") ||
announce.startsWith("http://lnQ6yoBT")) {
Map trackers = _manager.getTrackers();
for (Iterator iter = trackers.entrySet().iterator(); iter.hasNext(); ) {
Map.Entry entry = (Map.Entry)iter.next();
@@ -586,6 +587,8 @@ public class I2PSnarkServlet extends HttpServlet {
client = "I2PSnarkXL";
else if ("ZV".equals(ch.substring(2,4)))
client = "Robert";
else if ("VUZP".equals(ch))
client = "Robert";
else
client = "Unknown (" + ch + ')';
out.write("<font size=-1>" + client + "</font>&nbsp;&nbsp;<tt>" + peer.toString().substring(5, 9) + "</tt>");

View File

@@ -22,6 +22,7 @@
</classpath>
</depend>
</target>
<property name="javac.compilerargs" value="" />
<target name="compile" depends="depend">
<mkdir dir="./build" />
<mkdir dir="./build/obj" />
@@ -29,7 +30,9 @@
srcdir="./src"
debug="true" deprecation="on" source="1.5" target="1.5"
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 name="jar" depends="builddep, compile">
<jar destfile="./build/i2ptunnel.jar" basedir="./build/obj" includes="**/*.class">
@@ -73,6 +76,7 @@
</java>
<javac debug="true" deprecation="on" source="1.5" target="1.5"
destdir="../jsp/WEB-INF/classes/" srcdir="../jsp/WEB-INF/classes" includes="**/*.java">
<compilerarg line="${javac.compilerargs}" />
<classpath>
<pathelement location="../../jetty/jettylib/jasper-runtime.jar" />
<pathelement location="../../jetty/jettylib/javax.servlet.jar" />

View File

@@ -14,7 +14,7 @@ import net.i2p.util.Log;
*/
class BufferLogger implements Logging {
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;
/**

View File

@@ -59,13 +59,16 @@ class HTTPResponseOutputStream extends FilterOutputStream {
_buf1 = new byte[1];
}
@Override
public void write(int c) throws IOException {
_buf1[0] = (byte)c;
write(_buf1, 0, 1);
}
@Override
public void write(byte buf[]) throws IOException {
write(buf, 0, buf.length);
}
@Override
public void write(byte buf[], int off, int len) throws IOException {
if (_headerWritten) {
out.write(buf, off, len);
@@ -207,6 +210,7 @@ class HTTPResponseOutputStream extends FilterOutputStream {
out.write("\r\n".getBytes()); // end of the headers
}
@Override
public void close() throws IOException {
out.close();
}
@@ -303,11 +307,13 @@ class HTTPResponseOutputStream extends FilterOutputStream {
return true;
}
}
@Override
public String toString() {
return "Read: " + getTotalRead() + " expanded: " + getTotalExpanded() + " remaining: " + getRemaining() + " finished: " + getFinished();
}
}
@Override
public String toString() {
return super.toString() + ": " + _in;
}

View File

@@ -75,7 +75,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
private static long __tunnelId = 0;
private long _tunnelId;
private Properties _clientOptions;
private List _sessions;
private final List _sessions;
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 List tasks = new ArrayList();
private final List tasks = new ArrayList();
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 {
new I2PTunnel(args);
@@ -606,9 +606,9 @@ public class I2PTunnel implements Logging, EventDispatcher {
*/
public void runHttpClient(String args[], Logging l) {
if (args.length >= 1 && args.length <= 3) {
int port = -1;
int clientPort = -1;
try {
port = Integer.parseInt(args[0]);
clientPort = Integer.parseInt(args[0]);
} catch (NumberFormatException nfe) {
l.log("invalid port");
_log.error(getPrefix() + "Port specified is not valid: " + args[0], nfe);
@@ -642,12 +642,12 @@ public class I2PTunnel implements Logging, EventDispatcher {
I2PTunnelTask task;
ownDest = !isShared;
try {
task = new I2PTunnelHTTPClient(port, l, ownDest, proxy, (EventDispatcher) this, this);
task = new I2PTunnelHTTPClient(clientPort, l, ownDest, proxy, (EventDispatcher) this, this);
addtask(task);
notifyEvent("httpclientTaskId", Integer.valueOf(task.getId()));
} catch (IllegalArgumentException iae) {
_log.error(getPrefix() + "Invalid I2PTunnel config to create an httpclient [" + host + ":"+ port + "]", iae);
l.log("Invalid I2PTunnel configuration [" + host + ":" + port + "]");
_log.error(getPrefix() + "Invalid I2PTunnel config to create an httpclient [" + host + ":"+ clientPort + "]", iae);
l.log("Invalid I2PTunnel configuration [" + host + ":" + clientPort + "]");
notifyEvent("httpclientTaskId", Integer.valueOf(-1));
}
} else {
@@ -668,9 +668,9 @@ public class I2PTunnel implements Logging, EventDispatcher {
*/
public void runConnectClient(String args[], Logging l) {
if (args.length >= 1 && args.length <= 3) {
int port = -1;
int _port = -1;
try {
port = Integer.parseInt(args[0]);
_port = Integer.parseInt(args[0]);
} catch (NumberFormatException nfe) {
_log.error(getPrefix() + "Port specified is not valid: " + args[0], nfe);
return;
@@ -702,10 +702,10 @@ public class I2PTunnel implements Logging, EventDispatcher {
I2PTunnelTask task;
ownDest = !isShared;
try {
task = new I2PTunnelConnectClient(port, l, ownDest, proxy, (EventDispatcher) this, this);
task = new I2PTunnelConnectClient(_port, l, ownDest, proxy, (EventDispatcher) this, this);
addtask(task);
} 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 {
l.log("connectclient <port> [<sharedClient>] [<proxy>]");
@@ -728,9 +728,9 @@ public class I2PTunnel implements Logging, EventDispatcher {
*/
public void runIrcClient(String args[], Logging l) {
if (args.length >= 2) {
int port = -1;
int _port = -1;
try {
port = Integer.parseInt(args[0]);
_port = Integer.parseInt(args[0]);
} catch (NumberFormatException nfe) {
l.log("invalid port");
_log.error(getPrefix() + "Port specified is not valid: " + args[0], nfe);
@@ -757,12 +757,12 @@ public class I2PTunnel implements Logging, EventDispatcher {
String privateKeyFile = null;
if (args.length >= 4)
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);
notifyEvent("ircclientTaskId", Integer.valueOf(task.getId()));
} catch (IllegalArgumentException iae) {
_log.error(getPrefix() + "Invalid I2PTunnel config to create an ircclient [" + host + ":"+ port + "]", iae);
l.log("Invalid I2PTunnel configuration [" + host + ":" + port + "]");
_log.error(getPrefix() + "Invalid I2PTunnel config to create an ircclient [" + host + ":"+ _port + "]", iae);
l.log("Invalid I2PTunnel configuration [" + host + ":" + _port + "]");
notifyEvent("ircclientTaskId", Integer.valueOf(-1));
}
} else {
@@ -786,9 +786,9 @@ public class I2PTunnel implements Logging, EventDispatcher {
*/
public void runSOCKSTunnel(String args[], Logging l) {
if (args.length >= 1 && args.length <= 2) {
int port = -1;
int _port = -1;
try {
port = Integer.parseInt(args[0]);
_port = Integer.parseInt(args[0]);
} catch (NumberFormatException nfe) {
l.log("invalid port");
_log.error(getPrefix() + "Port specified is not valid: " + args[0], nfe);
@@ -802,7 +802,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
ownDest = !isShared;
I2PTunnelTask task;
task = new I2PSOCKSTunnel(port, l, ownDest, (EventDispatcher) this, this);
task = new I2PSOCKSTunnel(_port, l, ownDest, (EventDispatcher) this, this);
addtask(task);
notifyEvent("sockstunnelTaskId", Integer.valueOf(task.getId()));
} else {
@@ -820,9 +820,9 @@ public class I2PTunnel implements Logging, EventDispatcher {
*/
public void runStreamrClient(String args[], Logging l) {
if (args.length == 3) {
InetAddress host;
InetAddress _host;
try {
host = InetAddress.getByName(args[0]);
_host = InetAddress.getByName(args[0]);
} catch (UnknownHostException uhe) {
l.log("unknown host");
_log.error(getPrefix() + "Error resolving " + args[0], uhe);
@@ -830,9 +830,9 @@ public class I2PTunnel implements Logging, EventDispatcher {
return;
}
int port = -1;
int _port = -1;
try {
port = Integer.parseInt(args[1]);
_port = Integer.parseInt(args[1]);
} catch (NumberFormatException nfe) {
l.log("invalid port");
_log.error(getPrefix() + "Port specified is not valid: " + args[0], nfe);
@@ -840,7 +840,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
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();
addtask(task);
notifyEvent("streamrtunnelTaskId", Integer.valueOf(task.getId()));
@@ -859,9 +859,9 @@ public class I2PTunnel implements Logging, EventDispatcher {
*/
public void runStreamrServer(String args[], Logging l) {
if (args.length == 2) {
int port = -1;
int _port = -1;
try {
port = Integer.parseInt(args[0]);
_port = Integer.parseInt(args[0]);
} catch (NumberFormatException nfe) {
l.log("invalid port");
_log.error(getPrefix() + "Port specified is not valid: " + args[0], nfe);
@@ -877,7 +877,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
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();
addtask(task);
notifyEvent("streamrtunnelTaskId", Integer.valueOf(task.getId()));

View File

@@ -39,16 +39,16 @@ public class I2PTunnelClient extends I2PTunnelClientBase {
return;
}
StringTokenizer tok = new StringTokenizer(destinations, ",");
StringTokenizer tok = new StringTokenizer(destinations, ", ");
dests = new ArrayList(1);
while (tok.hasMoreTokens()) {
String destination = tok.nextToken();
try {
Destination dest = I2PTunnel.destFromName(destination);
if (dest == null)
Destination destN = I2PTunnel.destFromName(destination);
if (destN == null)
l.log("Could not resolve " + destination);
else
dests.add(dest);
dests.add(destN);
} catch (DataFormatException dfe) {
l.log("Bad format parsing \"" + destination + "\"");
}
@@ -71,10 +71,10 @@ public class I2PTunnelClient extends I2PTunnelClientBase {
public long getReadTimeout() { return readTimeout; }
protected void clientConnectionRun(Socket s) {
Destination dest = pickDestination();
Destination destN = pickDestination();
I2PSocket i2ps = null;
try {
i2ps = createI2PSocket(dest);
i2ps = createI2PSocket(destN);
i2ps.setReadTimeout(readTimeout);
new I2PTunnelRunner(s, i2ps, sockLock, null, mySockets);
} catch (Exception ex) {

View File

@@ -41,8 +41,8 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
private static volatile long __clientId = 0;
protected long _clientId;
protected Object sockLock = new Object(); // Guards sockMgr and mySockets
protected I2PSocketManager sockMgr;
protected final Object sockLock = new Object(); // Guards sockMgr and mySockets
protected I2PSocketManager sockMgr; // should be final and use a factory. LINT
protected List mySockets = new ArrayList();
protected Destination dest = null;
@@ -52,20 +52,20 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
private ServerSocket ss;
private Object startLock = new Object();
private final Object startLock = new Object();
private boolean startRunning = false;
private Object closeLock = new Object();
// private Object closeLock = new Object();
private byte[] pubkey;
// private byte[] pubkey;
private String handlerName;
private String privKeyFile;
private Object conLock = new Object();
// private Object conLock = new Object();
/** List of Socket for those accept()ed but not yet started up */
private List _waitingSockets = new ArrayList();
private List _waitingSockets = new ArrayList(); // should be final and use a factory. LINT
/** How many connections will we allow to be in the process of being built at once? */
private int _numConnectionBuilders;
/** How long will we allow sockets to sit in the _waitingSockets map before killing them? */
@@ -100,7 +100,7 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
}
/**
* @param privKeyFile null to generate a transient key
* @param pkf null to generate a transient key
*
* @throws IllegalArgumentException if the I2CP configuration is b0rked so
* badly that we cant create a socketManager
@@ -278,6 +278,7 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
}
}
sockManager.setName("Client");
tunnel.addSession(sockManager.getSession());
return sockManager;
}
@@ -344,7 +345,9 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
public I2PSocket createI2PSocket(Destination dest) throws I2PException, ConnectException, NoRouteToHostException, InterruptedIOException {
if (sockMgr == null) {
// we need this before getDefaultOptions()
sockMgr = getSocketManager();
synchronized(sockLock) {
sockMgr = getSocketManager();
}
}
return createI2PSocket(dest, getDefaultOptions());
}
@@ -368,9 +371,12 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
if (sockMgr == null) {
// delayed open - call get instead of build because the locking is up there
sockMgr = getSocketManager();
} else if (Boolean.valueOf(getTunnel().getClientOptions().getProperty("i2cp.newDestOnResume")).booleanValue()) {
synchronized(sockMgr) {
synchronized(sockLock) {
sockMgr = getSocketManager();
}
} else if (Boolean.valueOf(getTunnel().getClientOptions().getProperty("i2cp.closeOnIdle")).booleanValue() &&
Boolean.valueOf(getTunnel().getClientOptions().getProperty("i2cp.newDestOnResume")).booleanValue()) {
synchronized(sockLock) {
I2PSocketManager oldSockMgr = sockMgr;
// This will build a new socket manager and a new dest if the session is closed.
sockMgr = getSocketManager();

View File

@@ -17,7 +17,6 @@ import net.i2p.I2PAppContext;
import net.i2p.I2PException;
import net.i2p.client.streaming.I2PSocket;
import net.i2p.client.streaming.I2PSocketOptions;
import net.i2p.data.DataFormatException;
import net.i2p.data.DataHelper;
import net.i2p.data.Destination;
import net.i2p.util.EventDispatcher;
@@ -55,7 +54,7 @@ import net.i2p.util.Log;
public class I2PTunnelConnectClient extends I2PTunnelClientBase implements Runnable {
private static final Log _log = new Log(I2PTunnelConnectClient.class);
private List<String> _proxyList;
private final List<String> _proxyList;
private final static byte[] ERR_DESTINATION_UNKNOWN =
("HTTP/1.1 503 Service Unavailable\r\n"+
@@ -116,14 +115,14 @@ public class I2PTunnelConnectClient extends I2PTunnelClientBase implements Runna
I2PTunnel tunnel) throws IllegalArgumentException {
super(localPort, ownDest, l, notifyThis, "HTTPHandler " + (++__clientId), tunnel);
_proxyList = new ArrayList();
if (waitEventValue("openBaseClientResult").equals("error")) {
notifyEvent("openConnectClientResult", "error");
return;
}
_proxyList = new ArrayList();
if (wwwProxy != null) {
StringTokenizer tok = new StringTokenizer(wwwProxy, ",");
StringTokenizer tok = new StringTokenizer(wwwProxy, ", ");
while (tok.hasMoreTokens())
_proxyList.add(tok.nextToken().trim());
}
@@ -157,6 +156,12 @@ public class I2PTunnelConnectClient extends I2PTunnelClientBase implements Runna
defaultOpts.setProperty(I2PSocketOptions.PROP_READ_TIMEOUT, ""+DEFAULT_READ_TIMEOUT);
if (!defaultOpts.contains("i2p.streaming.inactivityTimeout"))
defaultOpts.setProperty("i2p.streaming.inactivityTimeout", ""+DEFAULT_READ_TIMEOUT);
// delayed start
if (sockMgr == null) {
synchronized(sockLock) {
sockMgr = getSocketManager();
}
}
I2PSocketOptions opts = sockMgr.buildOptions(defaultOpts);
if (!defaultOpts.containsKey(I2PSocketOptions.PROP_CONNECT_TIMEOUT))
opts.setConnectTimeout(DEFAULT_CONNECT_TIMEOUT);

View File

@@ -50,7 +50,7 @@ import net.i2p.util.Log;
public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable {
private static final Log _log = new Log(I2PTunnelHTTPClient.class);
private List proxyList;
private final List proxyList;
private HashMap addressHelpers = new HashMap();
@@ -145,14 +145,14 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
I2PTunnel tunnel) throws IllegalArgumentException {
super(localPort, ownDest, l, notifyThis, "HTTPHandler " + (++__clientId), tunnel);
proxyList = new ArrayList();
if (waitEventValue("openBaseClientResult").equals("error")) {
notifyEvent("openHTTPClientResult", "error");
return;
}
proxyList = new ArrayList();
if (wwwProxy != null) {
StringTokenizer tok = new StringTokenizer(wwwProxy, ",");
StringTokenizer tok = new StringTokenizer(wwwProxy, ", ");
while (tok.hasMoreTokens())
proxyList.add(tok.nextToken().trim());
}
@@ -211,8 +211,11 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
if (!defaultOpts.contains("i2p.streaming.inactivityTimeout"))
defaultOpts.setProperty("i2p.streaming.inactivityTimeout", ""+DEFAULT_READ_TIMEOUT);
// delayed start
if (sockMgr == null)
sockMgr = getSocketManager();
if (sockMgr == null) {
synchronized(sockLock) {
sockMgr = getSocketManager();
}
}
I2PSocketOptions opts = sockMgr.buildOptions(defaultOpts);
if (!defaultOpts.containsKey(I2PSocketOptions.PROP_CONNECT_TIMEOUT))
opts.setConnectTimeout(DEFAULT_CONNECT_TIMEOUT);
@@ -288,7 +291,20 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
break;
}
host = request.substring(0, pos);
// parse port
int posPort = host.indexOf(":");
int port = 80;
if(posPort != -1) {
String[] parts = host.split(":");
host = parts[0];
try {
port = Integer.parseInt(parts[1]);
} catch(Exception exc) {
// TODO: log this
}
}
// Quick hack for foo.bar.i2p
if (host.toLowerCase().endsWith(".i2p")) {
// Destination gets the host name
@@ -389,6 +405,8 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
line = method + " " + request.substring(pos);
} else if (host.indexOf(".") != -1) {
// rebuild host
host = host + ":" + port;
// The request must be forwarded to a WWW proxy
if (_log.shouldLog(Log.DEBUG))
_log.debug("Before selecting outproxy for " + host);

View File

@@ -30,11 +30,13 @@ public class I2PTunnelHTTPClientRunner extends I2PTunnelRunner {
_log = I2PAppContext.getGlobalContext().logManager().getLog(I2PTunnelHTTPClientRunner.class);
}
@Override
protected OutputStream getSocketOut() throws IOException {
OutputStream raw = super.getSocketOut();
return new HTTPResponseOutputStream(raw);
}
@Override
protected void close(OutputStream out, InputStream in, OutputStream i2pout, InputStream i2pin, Socket s, I2PSocket i2ps, Thread t1, Thread t2) throws InterruptedException, IOException {
try {
i2pin.close();

View File

@@ -59,6 +59,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
* Called by the thread pool of I2PSocket handlers
*
*/
@Override
protected void blockingHandle(I2PSocket socket) {
long afterAccept = getTunnel().getContext().clock().now();
long afterSocket = -1;
@@ -247,7 +248,9 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
super(o);
}
@Override
protected boolean shouldCompress() { return true; }
@Override
protected void finishHeaders() throws IOException {
if (_log.shouldLog(Log.INFO))
_log.info("Including x-i2p-gzip as the content encoding in the response");
@@ -255,6 +258,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
super.finishHeaders();
}
@Override
protected void beginProcessing() throws IOException {
if (_log.shouldLog(Log.INFO))
_log.info("Beginning compression processing");

View File

@@ -46,16 +46,16 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable
notifyThis,
"IRCHandler " + (++__clientId), tunnel, pkf);
StringTokenizer tok = new StringTokenizer(destinations, ",");
StringTokenizer tok = new StringTokenizer(destinations, ", ");
dests = new ArrayList(1);
while (tok.hasMoreTokens()) {
String destination = tok.nextToken();
try {
Destination dest = I2PTunnel.destFromName(destination);
if (dest == null)
Destination destN = I2PTunnel.destFromName(destination);
if (destN == null)
l.log("Could not resolve " + destination);
else
dests.add(dest);
dests.add(destN);
} catch (DataFormatException dfe) {
l.log("Bad format parsing \"" + destination + "\"");
}

View File

@@ -3,22 +3,18 @@ package net.i2p.i2ptunnel;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.SocketException;
import java.util.Properties;
import net.i2p.I2PAppContext;
import net.i2p.client.streaming.I2PSocket;
import net.i2p.crypto.SHA256Generator;
import net.i2p.data.DataFormatException;
import net.i2p.data.DataHelper;
import net.i2p.data.Destination;
import net.i2p.data.Hash;
import net.i2p.data.Base32;
import net.i2p.util.EventDispatcher;
import net.i2p.util.I2PThread;
import net.i2p.util.Log;
/**
@@ -83,6 +79,7 @@ public class I2PTunnelIRCServer extends I2PTunnelServer implements Runnable {
this.hostname = opts.getProperty(PROP_HOSTNAME, PROP_HOSTNAME_DEFAULT);
}
@Override
protected void blockingHandle(I2PSocket socket) {
try {
// give them 15 seconds to send in the request

View File

@@ -36,7 +36,7 @@ public class I2PTunnelRunner extends I2PThread implements I2PSocket.SocketErrorL
private Socket s;
private I2PSocket i2ps;
Object slock, finishLock = new Object();
final Object slock, finishLock = new Object();
boolean finished = false;
HashMap ostreams, sockets;
byte[] initialI2PData;
@@ -114,6 +114,7 @@ public class I2PTunnelRunner extends I2PThread implements I2PSocket.SocketErrorL
protected InputStream getSocketIn() throws IOException { return s.getInputStream(); }
protected OutputStream getSocketOut() throws IOException { return s.getOutputStream(); }
@Override
public void run() {
try {
InputStream in = getSocketIn();
@@ -239,6 +240,7 @@ public class I2PTunnelRunner extends I2PThread implements I2PSocket.SocketErrorL
start();
}
@Override
public void run() {
String from = i2ps.getThisDestination().calculateHash().toBase64().substring(0,6);
String to = i2ps.getPeerDestination().calculateHash().toBase64().substring(0,6);

View File

@@ -18,8 +18,6 @@ import java.util.Properties;
import net.i2p.I2PAppContext;
import net.i2p.I2PException;
import net.i2p.client.I2PClient;
import net.i2p.client.I2PClientFactory;
import net.i2p.client.streaming.I2PServerSocket;
import net.i2p.client.streaming.I2PSocket;
import net.i2p.client.streaming.I2PSocketManager;
@@ -36,8 +34,8 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
protected I2PSocketManager sockMgr;
protected I2PServerSocket i2pss;
private Object lock = new Object();
protected Object slock = new Object();
private final Object lock = new Object();
protected final Object slock = new Object();
protected InetAddress remoteHost;
protected int remotePort;
@@ -203,17 +201,17 @@ public class I2PTunnelServer extends I2PTunnelTask implements Runnable {
public void run() {
if (shouldUsePool()) {
I2PServerSocket i2pss = sockMgr.getServerSocket();
I2PServerSocket i2pS_S = sockMgr.getServerSocket();
int handlers = getHandlerCount();
for (int i = 0; i < handlers; i++) {
I2PThread handler = new I2PThread(new Handler(i2pss), "Handle Server " + i);
I2PThread handler = new I2PThread(new Handler(i2pS_S), "Handle Server " + i);
handler.start();
}
} else {
I2PServerSocket i2pss = sockMgr.getServerSocket();
I2PServerSocket i2pS_S = sockMgr.getServerSocket();
while (true) {
try {
final I2PSocket i2ps = i2pss.accept();
final I2PSocket i2ps = i2pS_S.accept();
if (i2ps == null) throw new I2PException("I2PServerSocket closed");
new I2PThread(new Runnable() { public void run() { blockingHandle(i2ps); } }).start();
} catch (I2PException ipe) {

View File

@@ -73,6 +73,7 @@ public abstract class I2PTunnelTask implements EventDispatcher {
public void reportAbuse(I2PSession session, int severity) {
}
@Override
public String toString() {
return name;
}

View File

@@ -37,11 +37,11 @@ public class I2Ping extends I2PTunnelTask implements Runnable {
private String command;
private long timeout = PING_TIMEOUT;
private Object simulLock = new Object();
private final Object simulLock = new Object();
private int simulPings = 0;
private long lastPingTime = 0;
private Object lock = new Object(), slock = new Object();
private final Object lock = new Object(), slock = new Object();
//public I2Ping(String cmd, Logging l,
// boolean ownDest) {
@@ -197,6 +197,7 @@ public class I2Ping extends I2PTunnelTask implements Runnable {
start();
}
@Override
public void run() {
try {
Destination dest = I2PTunnel.destFromName(destination);

View File

@@ -40,7 +40,7 @@ public class TunnelControllerGroup {
* no more tunnels are using it)
*
*/
private Map _sessions;
private final Map _sessions;
public static TunnelControllerGroup getInstance() {
synchronized (TunnelControllerGroup.class) {

View File

@@ -1,6 +1,5 @@
package net.i2p.i2ptunnel.socks;
import java.util.concurrent.ConcurrentHashMap;
import java.util.Map;
import net.i2p.data.Destination;

View File

@@ -379,7 +379,7 @@ public class SOCKS5Server extends SOCKSServer {
// This isn't really the right place for this, we can't stop the tunnel once it starts.
static SOCKSUDPTunnel _tunnel;
static Object _startLock = new Object();
static final Object _startLock = new Object();
static byte[] dummyIP = new byte[4];
/**
* We got a UDP associate command.

View File

@@ -9,7 +9,6 @@ package net.i2p.i2ptunnel.socks;
import java.net.Socket;
import net.i2p.client.streaming.I2PSocket;
import net.i2p.i2ptunnel.I2PTunnel;
import net.i2p.util.Log;
/**

View File

@@ -7,10 +7,7 @@ import java.util.Map;
import net.i2p.data.Destination;
import net.i2p.i2ptunnel.I2PTunnel;
import net.i2p.i2ptunnel.Logging;
import net.i2p.i2ptunnel.udp.*;
import net.i2p.i2ptunnel.udpTunnel.I2PTunnelUDPClientBase;
import net.i2p.util.EventDispatcher;
/**
* A Datagram Tunnel that can have multiple bidirectional ports on the UDP side.
@@ -63,12 +60,14 @@ public class SOCKSUDPTunnel extends I2PTunnelUDPClientBase {
}
}
@Override
public final void startRunning() {
super.startRunning();
// demuxer start() doesn't do anything
startall();
}
@Override
public boolean close(boolean forced) {
stopall();
return super.close(forced);

View File

@@ -54,6 +54,6 @@ public class Pinger implements Source, Runnable {
protected Sink sink;
protected Thread thread;
protected Object waitlock;
protected Object waitlock; // should be final and use a factory. LINT
protected boolean running;
}

View File

@@ -7,7 +7,6 @@ package net.i2p.i2ptunnel.streamr;
import java.net.InetAddress;
import net.i2p.data.Destination;
import net.i2p.i2ptunnel.I2PTunnel;
import net.i2p.i2ptunnel.Logging;
import net.i2p.i2ptunnel.udp.*;
@@ -38,6 +37,7 @@ public class StreamrConsumer extends I2PTunnelUDPClientBase {
this.pinger.setSink(this);
}
@Override
public final void startRunning() {
super.startRunning();
// send subscribe-message
@@ -45,6 +45,7 @@ public class StreamrConsumer extends I2PTunnelUDPClientBase {
l.log("Streamr client ready");
}
@Override
public boolean close(boolean forced) {
// send unsubscribe-message
this.pinger.stop();

View File

@@ -9,7 +9,6 @@ package net.i2p.i2ptunnel.streamr;
import java.io.File;
// i2p
import net.i2p.client.I2PSession;
import net.i2p.i2ptunnel.I2PTunnel;
import net.i2p.i2ptunnel.Logging;
import net.i2p.i2ptunnel.udp.*;
@@ -45,12 +44,14 @@ public class StreamrProducer extends I2PTunnelUDPServerBase {
this.server.setSink(this.multi);
}
@Override
public final void startRunning() {
super.startRunning();
this.server.start();
l.log("Streamr server ready");
}
@Override
public boolean close(boolean forced) {
this.server.stop();
this.multi.stop();

View File

@@ -6,17 +6,12 @@
package net.i2p.i2ptunnel.streamr;
// system
import java.io.File;
import java.util.Set;
// i2p
import net.i2p.client.I2PSession;
import net.i2p.data.Destination;
import net.i2p.i2ptunnel.I2PTunnel;
import net.i2p.i2ptunnel.Logging;
import net.i2p.i2ptunnel.udp.*;
import net.i2p.i2ptunnel.udpTunnel.I2PTunnelUDPServerBase;
import net.i2p.util.EventDispatcher;
import net.i2p.util.ConcurrentHashSet;
/**

View File

@@ -37,9 +37,11 @@ public class I2PSink implements Sink {
//System.out.print("w");
// create payload
byte[] payload;
if(!this.raw)
payload = this.maker.makeI2PDatagram(data);
else
if(!this.raw) {
synchronized(this.maker) {
payload = this.maker.makeI2PDatagram(data);
}
} else
payload = data;
// send message
@@ -67,5 +69,5 @@ public class I2PSink implements Sink {
protected boolean raw;
protected I2PSession sess;
protected Destination dest;
protected I2PDatagramMaker maker;
protected I2PDatagramMaker maker; // should be final and use a factory. LINT
}

View File

@@ -35,9 +35,11 @@ public class I2PSinkAnywhere implements Sink {
public synchronized void send(Destination to, byte[] data) {
// create payload
byte[] payload;
if(!this.raw)
payload = this.maker.makeI2PDatagram(data);
else
if(!this.raw) {
synchronized(this.maker) {
payload = this.maker.makeI2PDatagram(data);
}
} else
payload = data;
// send message
@@ -65,5 +67,5 @@ public class I2PSinkAnywhere implements Sink {
protected boolean raw;
protected I2PSession sess;
protected Destination dest;
protected I2PDatagramMaker maker;
protected I2PDatagramMaker maker; // should be final and use a factory. LINT
}

View File

@@ -5,21 +5,9 @@ package net.i2p.i2ptunnel.udpTunnel;
import java.io.ByteArrayOutputStream;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.ConnectException;
import java.net.InetAddress;
import java.net.NoRouteToHostException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import net.i2p.I2PAppContext;
import net.i2p.I2PException;
import net.i2p.client.I2PClient;
import net.i2p.client.I2PClientFactory;
import net.i2p.client.I2PSession;
@@ -31,10 +19,31 @@ import net.i2p.i2ptunnel.I2PTunnelTask;
import net.i2p.i2ptunnel.Logging;
import net.i2p.i2ptunnel.udp.*;
import net.i2p.util.EventDispatcher;
import net.i2p.util.I2PThread;
import net.i2p.util.Log;
public abstract class I2PTunnelUDPClientBase extends I2PTunnelTask implements Source, Sink {
/**
* Base client class that sets up an I2P Datagram client destination.
* The UDP side is not implemented here, as there are at least
* two possibilities:
*
* 1) UDP side is a "server"
* Example: Streamr Consumer
* - Configure a destination host and port
* - External application sends no data
* - Extending class must have a constructor with host and port arguments
*
* 2) UDP side is a client/server
* Example: SOCKS UDP (DNS requests?)
* - configure an inbound port and a destination host and port
* - External application sends and receives data
* - Extending class must have a constructor with host and 2 port arguments
*
* So the implementing class must create a UDPSource and/or UDPSink,
* and must call setSink().
*
* @author zzz with portions from welterde's streamr
*/
public abstract class I2PTunnelUDPClientBase extends I2PTunnelTask implements Source, Sink {
private static final Log _log = new Log(I2PTunnelUDPClientBase.class);
protected I2PAppContext _context;
@@ -69,33 +78,11 @@ public abstract class I2PTunnelUDPClientBase extends I2PTunnelTask implements So
private Source _i2pSource;
private Sink _i2pSink;
private Destination _otherDest;
/**
* Base client class that sets up an I2P Datagram client destination.
* The UDP side is not implemented here, as there are at least
* two possibilities:
*
* 1) UDP side is a "server"
* Example: Streamr Consumer
* - Configure a destination host and port
* - External application sends no data
* - Extending class must have a constructor with host and port arguments
*
* 2) UDP side is a client/server
* Example: SOCKS UDP (DNS requests?)
* - configure an inbound port and a destination host and port
* - External application sends and receives data
* - Extending class must have a constructor with host and 2 port arguments
*
* So the implementing class must create a UDPSource and/or UDPSink,
* and must call setSink().
*
* @throws IllegalArgumentException if the I2CP configuration is b0rked so
* badly that we cant create a socketManager
*
* @author zzz with portions from welterde's streamr
*/
public I2PTunnelUDPClientBase(String destination, Logging l, EventDispatcher notifyThis,
public I2PTunnelUDPClientBase(String destination, Logging l, EventDispatcher notifyThis,
I2PTunnel tunnel) throws IllegalArgumentException {
super("UDPServer", notifyThis, tunnel);
_clientId = ++__clientId;
@@ -107,11 +94,11 @@ public abstract class I2PTunnelUDPClientBase extends I2PTunnelTask implements So
// create i2pclient and destination
I2PClient client = I2PClientFactory.createClient();
Destination dest;
Destination destN;
byte[] key;
try {
ByteArrayOutputStream out = new ByteArrayOutputStream(512);
dest = client.createDestination(out);
destN = client.createDestination(out);
key = out.toByteArray();
} catch(Exception exc) {
throw new RuntimeException("failed to create i2p-destination", exc);

View File

@@ -3,54 +3,24 @@
*/
package net.i2p.i2ptunnel.udpTunnel;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ConnectException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.util.Iterator;
import java.util.Properties;
import net.i2p.I2PAppContext;
import net.i2p.I2PException;
import net.i2p.client.I2PClient;
import net.i2p.client.I2PClientFactory;
import net.i2p.client.I2PSession;
import net.i2p.client.I2PSessionException;
import net.i2p.data.Base64;
import net.i2p.data.Destination;
import net.i2p.i2ptunnel.I2PTunnel;
import net.i2p.i2ptunnel.I2PTunnelTask;
import net.i2p.i2ptunnel.Logging;
import net.i2p.i2ptunnel.udp.*;
import net.i2p.util.EventDispatcher;
import net.i2p.util.I2PThread;
import net.i2p.util.Log;
public class I2PTunnelUDPServerBase extends I2PTunnelTask implements Source, Sink {
private final static Log _log = new Log(I2PTunnelUDPServerBase.class);
private Object lock = new Object();
protected Object slock = new Object();
private static volatile long __serverId = 0;
protected Logging l;
private static final long DEFAULT_READ_TIMEOUT = -1; // 3*60*1000;
/** default timeout to 3 minutes - override if desired */
protected long readTimeout = DEFAULT_READ_TIMEOUT;
private I2PSession _session;
private Source _i2pSource;
private Sink _i2pSink;
/**
* Base client class that sets up an I2P Datagram server destination.
* The UDP side is not implemented here, as there are at least
@@ -70,11 +40,34 @@ public class I2PTunnelUDPServerBase extends I2PTunnelTask implements Source, Sin
*
* So the implementing class must create a UDPSource and/or UDPSink,
* and must call setSink().
*
* @author zzz with portions from welterde's streamr
*/
public class I2PTunnelUDPServerBase extends I2PTunnelTask implements Source, Sink {
private final static Log _log = new Log(I2PTunnelUDPServerBase.class);
private final Object lock = new Object();
protected Object slock = new Object();
private static volatile long __serverId = 0;
protected Logging l;
private static final long DEFAULT_READ_TIMEOUT = -1; // 3*60*1000;
/** default timeout to 3 minutes - override if desired */
protected long readTimeout = DEFAULT_READ_TIMEOUT;
private I2PSession _session;
private Source _i2pSource;
private Sink _i2pSink;
/**
*
* @throws IllegalArgumentException if the I2CP configuration is b0rked so
* badly that we cant create a socketManager
*
* @author zzz with portions from welterde's streamr
*/
public I2PTunnelUDPServerBase(boolean verify, File privkey, String privkeyname, Logging l,

Some files were not shown because too many files have changed in this diff Show More