Compare commits
204 Commits
Author | SHA1 | Date | |
---|---|---|---|
fc9e3ee77d | |||
e6cecab0b6 | |||
c3f9e20247 | |||
d0376f82a5 | |||
834fdfe9b3 | |||
8eedcb039a | |||
fc9c479ed5 | |||
12978ba4fb | |||
548efed8d8 | |||
24b012a843 | |||
d493addf95 | |||
d8e502722e | |||
0835c05e89 | |||
429280e416 | |||
879404f7e0 | |||
56c6f41131 | |||
305fc7314f | |||
384d655b1a | |||
2a2d3c0fb5 | |||
977d6eec88 | |||
8f690a8f67 | |||
f9f9aa4498 | |||
ed259ac94c | |||
bb7884ca3b | |||
0cfbe9c28b | |||
85e5013dbd | |||
bf50695c93 | |||
0764e19441 | |||
2f1d93756d | |||
91de396821 | |||
f9efabba16 | |||
c03b519849 | |||
98617723a2 | |||
8c8a2deefc | |||
2c84cddda3 | |||
37667247c3 | |||
f5614c8a41 | |||
9e7dd238a4 | |||
495558a949 | |||
884663d077 | |||
bd489cf439 | |||
a4b5c63702 | |||
b1bedb565f | |||
3dd5950bd1 | |||
fe9b891b37 | |||
7804475698 | |||
8de5609817 | |||
bb0531053d | |||
e5b1450e83 | |||
0c7cb9d781 | |||
25d5883a0e | |||
c7d815b5b8 | |||
8c4800309e | |||
1aa7fbbba0 | |||
d2fc397295 | |||
a8e43ab552 | |||
3a12182838 | |||
49c7fc30c0 | |||
f6bc9e8707 | |||
53cb80636a | |||
0b89171abd | |||
f81a24a0cc | |||
58fc3a501d | |||
7b373743aa | |||
e692e18d44 | |||
0c98d1843a | |||
4a9543be78 | |||
fe0d0d6737 | |||
0343e8ffcd | |||
6a6cd14398 | |||
29df534161 | |||
5414d41de4 | |||
2695461bd4 | |||
186f2bc22f | |||
41718b47c1 | |||
bb51bf49b0 | |||
6c365bef85 | |||
e9063a22d5 | |||
47edc3c853 | |||
09d700e1d6 | |||
e5f19c98a8 | |||
0da964e47f | |||
98fda81b79 | |||
d0a969ca33 | |||
91b3889cbc | |||
33f4fac48f | |||
f70adf8da6 | |||
66eae60c48 | |||
cf02abd19c | |||
ca3b6eb00d | |||
ae2f48f55d | |||
5eda7c30fc | |||
f2bfa2e15c | |||
ee0aada892 | |||
7179a64fee | |||
f3ddf3fa93 | |||
91b8f7c2ae | |||
54f1c0ec66 | |||
1d690f46ae | |||
ca783caff1 | |||
c4fa0d894f | |||
03f16565fe | |||
5785f500ef | |||
8f5257d5dc | |||
c455fa6309 | |||
59b624a4a4 | |||
bfa02f3b82 | |||
60ab94689c | |||
7f33eb4959 | |||
467095f85e | |||
1fc890c6f0 | |||
3733b78ccf | |||
6648e182ae | |||
56473c6b65 | |||
d222c7a998 | |||
84bd8274ad | |||
0d2812db50 | |||
6484005569 | |||
559653f0ab | |||
7a684c160b | |||
7e21afe6a6 | |||
720aa704c4 | |||
532077a4c1 | |||
8bce2fd7a2 | |||
3603cc23ee | |||
f4c3607c4d | |||
fbe7e42f46 | |||
f3143d8b3d | |||
fd32d77976 | |||
39e8e93bfa | |||
e151ef74e1 | |||
609e70692d | |||
c5ac0981b5 | |||
129fc5b838 | |||
775ab9a7bf | |||
374360c7b4 | |||
cc3165bf72 | |||
6b0a2464dd | |||
7b12f700dd | |||
806e2f88c8 | |||
8591dfe71c | |||
7756e20b86 | |||
39a1958bf4 | |||
f9d8a2d79b | |||
cdab99bd25 | |||
f344c9e0be | |||
7acaa964af | |||
08deabb262 | |||
6504e1f91d | |||
b125276be9 | |||
dc9607024e | |||
06e1305df2 | |||
28a14782a6 | |||
e7bccb2f47 | |||
bdf7dda3b4 | |||
a7d4b3d6ba | |||
a82de3d1cf | |||
a6dc27adaf | |||
69f051da41 | |||
5946c35a88 | |||
3d8cb3b90d | |||
3b9fec1857 | |||
ececf5407d | |||
d236b9b44a | |||
7ec29b0c5a | |||
8d7340500f | |||
1ee2b5e899 | |||
6f948df089 | |||
b6b1491368 | |||
f70be29651 | |||
c48700216c | |||
45a2159290 | |||
ac7ea4ac4c | |||
2a96dde20b | |||
78d5080d78 | |||
395baf0274 | |||
951f082884 | |||
a5ab6f576d | |||
f7f93fda0c | |||
7365ca849f | |||
d75e1deae7 | |||
4aa9c7fdcf | |||
69e6393442 | |||
9d9d4093bc | |||
37f9d3afe1 | |||
82180592f9 | |||
d88cfae80d | |||
6235b49300 | |||
4682bb4147 | |||
6ed17c1a5f | |||
ae0bcc492d | |||
d8298c63ab | |||
9a089b7da0 | |||
e5d76a5a77 | |||
f7170aa00a | |||
c02711ccad | |||
9885779cab | |||
e105ca92f2 | |||
10e2c3832d | |||
c620420a6f | |||
6be54942ec | |||
ab92206b77 | |||
0e2a4227ef | |||
8d891b99d1 |
183
LICENSE.txt
Normal file
183
LICENSE.txt
Normal file
@ -0,0 +1,183 @@
|
||||
This product includes both public domain code and licensed code as described below.
|
||||
For all code, unless otherwise stated in the appropriate license, the following applies:
|
||||
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
|
||||
|
||||
LICENSES
|
||||
--------
|
||||
|
||||
Core:
|
||||
Public domain except as listed below:
|
||||
|
||||
ElGamal and DSA code:
|
||||
Copyright (c) 2003, TheCrypto
|
||||
See licenses/LICENSE-ElGamalDSA.txt
|
||||
|
||||
SHA256 and HMAC-SHA256:
|
||||
Copyright (c) 2000 - 2004 The Legion Of The Bouncy Castle
|
||||
See licenses/LICENSE-SHA256.txt
|
||||
|
||||
AES code:
|
||||
Under the Cryptix (MIT) license, written by the Cryptix team
|
||||
(That's what our website says but all our AES code looks like it is public domain)
|
||||
|
||||
Crypto filters:
|
||||
From the xlattice app - http://xlattice.sourceforge.net/
|
||||
See licenses/LICENSE-BSD.txt
|
||||
|
||||
SNTP code:
|
||||
Copyright (c) 2004, Adam Buckley
|
||||
See licenses/LICENSE-SNTP.txt
|
||||
|
||||
PRNG:
|
||||
Copyright (C) 2001, 2002, Free Software Foundation, Inc.
|
||||
See licenses/LICENSE-LGPLv2.1.txt
|
||||
|
||||
GMP 4.1.3:
|
||||
Copyright 1991, 1996, 1999, 2000 Free Software Foundation, Inc.
|
||||
See licenses/LICENSE-LGPLv2.1.txt
|
||||
|
||||
HashCash code:
|
||||
Copyright 2006 Gregory Rubin grrubin@gmail.com
|
||||
See licenses/LICENSE-HashCash.txt
|
||||
|
||||
|
||||
|
||||
Router:
|
||||
Public domain
|
||||
|
||||
|
||||
|
||||
Installer:
|
||||
Launch4j:
|
||||
Copyright (C) 2005 Grzegorz Kowal
|
||||
See licenses/LICENSE-GPLv2.txt
|
||||
|
||||
Izpack:
|
||||
See licenses/LICENSE-Apache1.1.txt
|
||||
|
||||
|
||||
|
||||
Wrapper:
|
||||
Copyright (c) 1999, 2004 Tanuki Software
|
||||
See licenses/LICENSE-Wrapper.txt
|
||||
|
||||
|
||||
|
||||
Applications:
|
||||
|
||||
Addressbook:
|
||||
Copyright (c) 2004 Ragnarok
|
||||
See licenses/LICENSE-Addressbook.txt
|
||||
|
||||
BOB:
|
||||
Copyright (C) sponge
|
||||
DWTFYWTPL
|
||||
|
||||
I2PSnark:
|
||||
Copyright (C) 2003 Mark J. Wielaard
|
||||
See licenses/LICENSE-GPLv2.txt
|
||||
|
||||
I2PTunnel:
|
||||
(c) 2003 - 2004 mihi
|
||||
GPLv2 with exception.
|
||||
See licenses/LICENSE-I2PTunnel.txt
|
||||
See licenses/LICENSE-GPLv2.txt
|
||||
|
||||
I2PTunnel SOCKS Proxy:
|
||||
Copyright (c) 2004 by human
|
||||
GPLv2 with exception.
|
||||
See licenses/LICENSE-I2PTunnel.txt
|
||||
See licenses/LICENSE-GPLv2.txt
|
||||
|
||||
I2PTunnel UDP and Streamr:
|
||||
By welterde.
|
||||
See licenses/LICENSE-GPLv2.txt
|
||||
|
||||
Jetty 5.1.12:
|
||||
Copyright 2000-2004 Mort Bay Consulting Pty. Ltd.
|
||||
See licenses/LICENSE-Apache1.1.txt
|
||||
See licenses/LICENSE-Apache2.0.txt
|
||||
See licenses/NOTICE-Ant.txt
|
||||
See licenses/NOTICE-Commons-Logging.txt
|
||||
|
||||
JRobin 1.4.0:
|
||||
See licenses/LICENSE-LGPLv2.1.txt
|
||||
|
||||
Ministreaming Lib:
|
||||
By mihi.
|
||||
See licenses/LICENSE-BSD.txt
|
||||
|
||||
Proxyscript:
|
||||
By Cervantes.
|
||||
Public domain.
|
||||
|
||||
Router console:
|
||||
Public domain.
|
||||
|
||||
SAM:
|
||||
Public domain.
|
||||
|
||||
Streaming Lib:
|
||||
Public domain.
|
||||
|
||||
SusiDNS:
|
||||
Copyright (C) 2005 <susi23@mail.i2p>
|
||||
See licenses/LICENSE-GPLv2.txt
|
||||
|
||||
SusiMail:
|
||||
Copyright (C) 2004-2005 <susi23@mail.i2p>
|
||||
See licenses/LICENSE-GPLv2.txt
|
||||
|
||||
Systray:
|
||||
Public domain.
|
||||
Bundles systray4j code:
|
||||
See licenses/LICENSE-GPLv2.txt
|
||||
|
||||
|
||||
|
||||
Other Applications and Libraries
|
||||
--------------------------------
|
||||
The following applications and libraries are not used or bundled in
|
||||
binary packages, therefore the licenses are not included in binary
|
||||
distributions. See the source package for the additional license information.
|
||||
|
||||
Atalk:
|
||||
Public domain
|
||||
|
||||
SAM C Library:
|
||||
Copyright (c) 2004, Matthew P. Cashdollar <mpc@innographx.com>
|
||||
See apps/sam/c/doc/license.txt
|
||||
|
||||
SAM C# Library:
|
||||
Public domain.
|
||||
See apps/sam/csharp/README
|
||||
|
||||
SAM Perl Library:
|
||||
See licenses/LICENSE-GPLv2.txt
|
||||
|
||||
SAM Python Library:
|
||||
Public domain.
|
29
README.txt
Normal file
29
README.txt
Normal file
@ -0,0 +1,29 @@
|
||||
Prerequisites to build from source:
|
||||
Java SDK (preferably Sun) 1.5.0 or higher (1.6 recommended)
|
||||
Apache Ant 1.7.0 or higher
|
||||
|
||||
To build:
|
||||
ant pkg
|
||||
Run 'ant' with no arguments to see other build options.
|
||||
See http://www.i2p2.de/download.html for installation instructions.
|
||||
|
||||
Documentation:
|
||||
http://www.i2p2.de/
|
||||
API: run 'ant javadoc' then start at build/javadoc/index.html
|
||||
|
||||
Latest release:
|
||||
http://www.i2p2.de/download.html
|
||||
|
||||
To get development branch from source control:
|
||||
http://www.i2p2.de/newdevelopers.html
|
||||
|
||||
FAQ:
|
||||
http://www.i2p2.de/faq.html
|
||||
|
||||
Need help?
|
||||
IRC irc.freenode.net #i2p
|
||||
http://forum.i2p2.de/
|
||||
|
||||
Licenses:
|
||||
See LICENSE.txt
|
||||
|
30
Slackware/README
Normal file
30
Slackware/README
Normal file
@ -0,0 +1,30 @@
|
||||
ou will need atleast monotone > = 0.41 to get the most recent build source
|
||||
and connect it to an already running i2p router.
|
||||
|
||||
OR:
|
||||
|
||||
You may download the actual "stable" source from
|
||||
http://code.google.com/p/i2p/downloads/list
|
||||
|
||||
You will need to follwing tools to build the i2p and i2p-base packages:
|
||||
|
||||
bash >= 3.1.017
|
||||
requiredbuilder >= 0.16.3 ( http://www.stabellini.net/requiredbuilder.html )
|
||||
jre >= 6u11
|
||||
jdk >= 6u11
|
||||
apache-ant >= 1.7.1
|
||||
perl >= 5.10.0
|
||||
python >= 2.5.2
|
||||
|
||||
Reccomended:
|
||||
monotone >= 0.41 ( http://pkgs.dr.ea.ms )
|
||||
|
||||
See also:
|
||||
|
||||
i2p/readme.txt
|
||||
|
||||
AND
|
||||
|
||||
i2p-base/readme.txt
|
||||
|
||||
for information and handy tips.
|
8
Slackware/i2p-base/build.xml
Normal file
8
Slackware/i2p-base/build.xml
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<project basedir="." default="slackpkg">
|
||||
<target name="slackpkg">
|
||||
<echo message="Building Slackware package." />
|
||||
<exec executable="./i2p-base.SlackBuild">
|
||||
</exec>
|
||||
</target>
|
||||
</project>
|
45
Slackware/i2p-base/doinst.sh
Normal file
45
Slackware/i2p-base/doinst.sh
Normal file
@ -0,0 +1,45 @@
|
||||
#!/bin/sh
|
||||
touch /etc/rc.d/rc.local
|
||||
touch /etc/rc.d/rc.local_shutdown
|
||||
|
||||
I2PRCA=`grep -c /etc/rc.d/rc.local -e i2p`
|
||||
I2PRCB=`grep -c /etc/rc.d/rc.local_shutdown -e i2p`
|
||||
|
||||
echo
|
||||
|
||||
if [ $I2PRCA -eq 0 ] ; then
|
||||
echo "if [ -x /etc/rc.d/rc.i2p ] ; then" >> /etc/rc.d/rc.local
|
||||
echo " sh /etc/rc.d/rc.i2p start" >> /etc/rc.d/rc.local
|
||||
echo "fi" >> /etc/rc.d/rc.local
|
||||
echo "/etc/rc.d/rc.local modified."
|
||||
else
|
||||
echo "/etc/rc.d/rc.local looks OK"
|
||||
fi
|
||||
|
||||
if [ $I2PRCB -eq 0 ] ; then
|
||||
echo "if [ -x /etc/rc.d/rc.i2p ] ; then" >> /etc/rc.d/rc.local_shutdown
|
||||
echo " sh /etc/rc.d/rc.i2p stop" >> /etc/rc.d/rc.local_shutdown
|
||||
echo "fi" >> /etc/rc.d/rc.local_shutdown
|
||||
echo "/etc/rc.d/rc.local_shutdown modified."
|
||||
else
|
||||
echo "/etc/rc.d/rc.local_shutdown looks OK"
|
||||
fi
|
||||
|
||||
if [ -f /etc/rc.d/rc.i2p ] ; then
|
||||
if [ -x /etc/rc.d/rc.i2p ] ; then
|
||||
chmod +x /etc/rc.d/rc.i2p.new
|
||||
fi
|
||||
echo
|
||||
echo "It apears that you already have /etc/rc.d/rc.i2p"
|
||||
echo "You may wish to replace it with /etc/rc.d/rc.i2p.new"
|
||||
echo
|
||||
else
|
||||
mv /etc/rc.d/rc.i2p.new /etc/rc.d/rc.i2p
|
||||
echo
|
||||
echo "Installation finished. The i2p start/stop script has been"
|
||||
echo "installed on /etc/rc.d directory. You should chmod +x"
|
||||
echo '/etc/rc.d/rc.i2p to start it on boot.'
|
||||
echo
|
||||
fi
|
||||
|
||||
exit
|
42
Slackware/i2p-base/i2p-base.SlackBuild
Normal file
42
Slackware/i2p-base/i2p-base.SlackBuild
Normal file
@ -0,0 +1,42 @@
|
||||
#!/bin/sh
|
||||
# Heavily based on the Slackware 12.1 SlackBuild
|
||||
# Slackware build script for i2p
|
||||
|
||||
# PLEASE READ THIS:
|
||||
# Probably you will never have to update i2p packages with upgradepkg,
|
||||
# just because i2p have an auto-update function.
|
||||
# How to start i2p:
|
||||
# After installpkg command, doinst.sh will execute a postinstallation script
|
||||
# needed by i2p. After that you have to chmod +x /etc/rc.d/rc.i2p and start
|
||||
# i2p service with /etc/rc.d/rc.i2p start.
|
||||
# Now tell your browser to user this proxy: localhost on port 4444 and open
|
||||
# this page: http://localhost:7657/index.jsp
|
||||
# Here you can configure i2p, watch network status and navigate anonimously.
|
||||
# It's suggested to subscribe to various dns host, like i2host.i2p
|
||||
# For any additional information, visit i2host.i2p and forum.i2p
|
||||
|
||||
CWD=$(pwd)
|
||||
TMP=/tmp
|
||||
PKG=/$TMP/package-base-i2p
|
||||
rm -rf $PKG
|
||||
mkdir -p $PKG
|
||||
# put here installation dir, without first and last /
|
||||
# es: usr/local
|
||||
NAME=i2p-base
|
||||
VERSION=0.0.1
|
||||
BUILD=1sim
|
||||
ARCH=noarch
|
||||
INSTALL_DIR=opt
|
||||
cd $PKG
|
||||
chown -R root:root .
|
||||
|
||||
mkdir -p $PKG/etc/rc.d
|
||||
mkdir -p $PKG/install
|
||||
sed "s|directory|/$INSTALL_DIR/i2p/i2prouter|g" $CWD/rc.i2p_def > $PKG/etc/rc.d/rc.i2p.new
|
||||
chmod 644 $PKG/etc/rc.d/rc.i2p.new
|
||||
sed "s|directory|/$INSTALL_DIR/i2p/|g" $CWD/doinst.sh > $PKG/install/doinst.sh
|
||||
cat $CWD/slack-desc > $PKG/install/slack-desc
|
||||
|
||||
cd $PKG
|
||||
requiredbuilder -v -y -s $CWD $PKG
|
||||
makepkg -l y -c n $CWD/${NAME}-$VERSION-$ARCH-$BUILD.tgz
|
27
Slackware/i2p-base/rc.i2p_def
Normal file
27
Slackware/i2p-base/rc.i2p_def
Normal file
@ -0,0 +1,27 @@
|
||||
#!/bin/sh
|
||||
# Start/stop i2p service.
|
||||
|
||||
i2p_start() {
|
||||
/bin/su - -c "( export PATH=\"$PATH:/usr/lib/java/bin:/usr/lib/java/jre/bin\"; directory start )"
|
||||
}
|
||||
|
||||
i2p_stop() {
|
||||
/bin/su - -c "( export PATH=\"$PATH:/usr/lib/java/bin:/usr/lib/java/jre/bin\"; directory stop )"
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
'start')
|
||||
i2p_start
|
||||
;;
|
||||
'stop')
|
||||
i2p_stop
|
||||
;;
|
||||
'restart')
|
||||
i2p_stop
|
||||
i2p_start
|
||||
;;
|
||||
*)
|
||||
echo "usage $0 start|stop|restart"
|
||||
;;
|
||||
esac
|
||||
|
10
Slackware/i2p-base/readme.txt
Normal file
10
Slackware/i2p-base/readme.txt
Normal file
@ -0,0 +1,10 @@
|
||||
An rc file called rc.i2p has been placed into the /etc/rc.d directory.
|
||||
If you want to change installation dir, change the variable INSTALL_DIR
|
||||
on base-i2p.SlackBuild and rebuild the package. You also will need to do the
|
||||
same for the i2p package.
|
||||
|
||||
The install script will insert everything needed into /etc/rc.d/rc.local and
|
||||
into /etc/rc.d/rc.local_shutdown automatically.
|
||||
|
||||
If you want to start I2P at boot you have to chmod +x /etc/rc.d/rc.i2p
|
||||
|
19
Slackware/i2p-base/slack-desc
Normal file
19
Slackware/i2p-base/slack-desc
Normal file
@ -0,0 +1,19 @@
|
||||
# HOW TO EDIT THIS FILE:
|
||||
# The "handy ruler" below makes it easier to edit a package description. Line
|
||||
# up the first '|' above the ':' following the base package name, and the '|' on
|
||||
# the right side marks the last column you can put a character in. You must make
|
||||
# exactly 11 lines for the formatting to be correct. It's also customary to
|
||||
# leave one space after the ':'.
|
||||
|
||||
|-----handy-ruler------------------------------------------------------|
|
||||
base-i2p: base-i2p (I2P anonymizing network base config files)
|
||||
base-i2p:
|
||||
base-i2p: I2P is an anonymizing network, offering a simple layer that
|
||||
base-i2p: identity-sensitive applications can use to securely communicate. All
|
||||
base-i2p: data is wrapped with several layers of encryption, and the network is
|
||||
base-i2p: both distributed and dynamic, with no trusted parties.
|
||||
base-i2p: Many applications are available that interface with I2P, including
|
||||
base-i2p: mail, peer-peer file sharing, IRC chat, and others.
|
||||
base-i2p:
|
||||
base-i2p: This package provides the startup files.
|
||||
base-i2p:
|
1
Slackware/i2p-base/slack-required
Normal file
1
Slackware/i2p-base/slack-required
Normal file
@ -0,0 +1 @@
|
||||
bash >= 3.1.017
|
8
Slackware/i2p/build.xml
Normal file
8
Slackware/i2p/build.xml
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||
<project basedir="." default="slackpkg">
|
||||
<target name="slackpkg">
|
||||
<echo message="Building Slackware package." />
|
||||
<exec executable="./i2p.SlackBuild">
|
||||
</exec>
|
||||
</target>
|
||||
</project>
|
67
Slackware/i2p/doinst.sh
Normal file
67
Slackware/i2p/doinst.sh
Normal file
@ -0,0 +1,67 @@
|
||||
#!/bin/sh
|
||||
|
||||
INST_DIR=directory
|
||||
|
||||
( cd install
|
||||
|
||||
echo
|
||||
for i in *.config ; {
|
||||
if [ -f $INST_DIR/$i ] ; then
|
||||
echo "Please check ${INST_DIR}${i}, as there is a new version."
|
||||
cp $i $INST_DIR/$i.new
|
||||
else
|
||||
cp $i $INST_DIR/$i
|
||||
fi
|
||||
}
|
||||
|
||||
)
|
||||
|
||||
( cd $INST_DIR
|
||||
if [ -f blocklist.txt ] ; then
|
||||
echo "Please check ${INST_DIR}blocklist.txt, as there is a new version."
|
||||
else
|
||||
mv blocklist.txt.new blocklist.txt
|
||||
fi
|
||||
)
|
||||
|
||||
( cd $INST_DIR/eepsite
|
||||
if [ -f jetty.xml ] ; then
|
||||
rm jetty.xml.new
|
||||
else
|
||||
mv jetty.xml.new jetty.xml
|
||||
fi
|
||||
)
|
||||
|
||||
( cd $INST_DIR/eepsite/docroot
|
||||
if [ -f index.html ] ; then
|
||||
rm index.html.new
|
||||
else
|
||||
mv index.html.new index.html
|
||||
fi
|
||||
if [ -f favicon.ico ] ; then
|
||||
rm favicon.ico.new
|
||||
else
|
||||
mv favicon.ico.new favicon.ico
|
||||
fi
|
||||
)
|
||||
|
||||
echo
|
||||
echo "FINISHING I2P INSTALLATION. PLEASE WAIT."
|
||||
|
||||
cd $INST_DIR
|
||||
sh postinstall.sh || (
|
||||
echo "ERROR: failed execution of postinstall.sh. Please"
|
||||
echo "cd into i2p installation directory and run "
|
||||
echo "postinstall.sh manually with ./postinstall.sh"
|
||||
exit 1
|
||||
)
|
||||
|
||||
sleep 10
|
||||
|
||||
sh i2prouter stop || exit 1
|
||||
|
||||
echo
|
||||
echo "Installation finished."
|
||||
echo
|
||||
|
||||
exit
|
88
Slackware/i2p/i2p.SlackBuild
Executable file
88
Slackware/i2p/i2p.SlackBuild
Executable file
@ -0,0 +1,88 @@
|
||||
#!/bin/sh
|
||||
# Heavily based on the Slackware 12.1 SlackBuild
|
||||
# Slackware build script for i2p
|
||||
|
||||
# PLEASE READ THIS:
|
||||
# Probably you will never have to update i2p packages with upgradepkg,
|
||||
# just because i2p have an auto-update function.
|
||||
# How to start i2p:
|
||||
# After installpkg command, doinst.sh will execute a postinstallation script
|
||||
# needed by i2p. After that you have to chmod +x /etc/rc.d/rc.i2p and start
|
||||
# i2p service with /etc/rc.d/rc.i2p start.
|
||||
# Now tell your browser to user this proxy: localhost on port 4444 and open
|
||||
# this page: http://localhost:7657/index.jsp
|
||||
# Here you can configure i2p, watch network status and navigate anonimously.
|
||||
# It's suggested to subscribe to various dns host, like i2host.i2p
|
||||
# For any additional information, visit i2host.i2p and forum.i2p
|
||||
|
||||
BUILD=1sim
|
||||
|
||||
# put here installation dir, without first and last /
|
||||
# es: usr/local
|
||||
INSTALL_DIR=opt
|
||||
NAME=i2p
|
||||
ARCH=noarch
|
||||
|
||||
|
||||
#
|
||||
# This mess is here due to the totally moronic way i2p does versioning.
|
||||
# We correct it here.
|
||||
#
|
||||
ROUTER=$(echo -ne "_")$(cat ../../router/java/src/net/i2p/router/RouterVersion.java | grep -e "public final static long BUILD" | cut -f2 -d"=" | cut -f1 -d";" | sed -re "s/ //g")
|
||||
if [ "$ROUTER" == "_" ] ; then
|
||||
ROUTER="_0"
|
||||
fi
|
||||
|
||||
#
|
||||
# That was the easy one, now for the tough one.
|
||||
#
|
||||
|
||||
CORE=$(cat ../../core/java/src/net/i2p/CoreVersion.java | grep -e "public final static String VERSION" | cut -f2 -d'"' | sed -re "s/ //g")
|
||||
CORE1=$(echo -n $CORE.x.x | sed -re "s/(.*)\.(.*)\.(.*)\.(.*)/\1/")
|
||||
CORE2=$(echo -n $CORE.x | sed -re "s/(.*)\.(.*)\.(.*)\.(.*)/\1/")
|
||||
|
||||
if [ "$CORE.x.x" == "$CORE1" ] ; then
|
||||
CORE=$(echo -ne $CORE".0.0")
|
||||
fi
|
||||
if [ "$CORE.x" == "$CORE2" ] ; then
|
||||
CORE=$(echo -ne $CORE".0")
|
||||
fi
|
||||
|
||||
VERSION=$(echo $CORE$ROUTER)
|
||||
#
|
||||
# Whew!
|
||||
# OK, let's build i2p
|
||||
#
|
||||
|
||||
CWD=$(pwd)
|
||||
TMP=/tmp
|
||||
|
||||
PKG=$TMP/package-i2p
|
||||
rm -rf $PKG
|
||||
mkdir -p $PKG
|
||||
|
||||
cd $CWD/../../
|
||||
|
||||
ant distclean
|
||||
ant dist
|
||||
|
||||
|
||||
tar xjvf i2p.tar.bz2 -C $TMP
|
||||
|
||||
cd $TMP/i2p
|
||||
chown -R root:root .
|
||||
|
||||
mkdir -p $PKG/$INSTALL_DIR/
|
||||
cp -a ../i2p $PKG/$INSTALL_DIR/
|
||||
|
||||
mkdir -p $PKG/install
|
||||
mv $PKG/$INSTALL_DIR/i2p/*.config $PKG/install
|
||||
mv $PKG/$INSTALL_DIR/i2p/blocklist.txt $PKG/$INSTALL_DIR/i2p/blocklist.txt.new
|
||||
mv $PKG/$INSTALL_DIR/i2p/eepsite/jetty.xml $PKG/$INSTALL_DIR/i2p/eepsite/jetty.xml.new
|
||||
mv $PKG/$INSTALL_DIR/i2p/eepsite/docroot/index.html $PKG/$INSTALL_DIR/i2p/eepsite/docroot/index.html.new
|
||||
mv $PKG/$INSTALL_DIR/i2p/eepsite/docroot/favicon.ico $PKG/$INSTALL_DIR/i2p/eepsite/docroot/favicon.ico.new
|
||||
sed "s|directory|/$INSTALL_DIR/i2p/|g" $CWD/doinst.sh > $PKG/install/doinst.sh
|
||||
cat $CWD/slack-desc > $PKG/install/slack-desc
|
||||
cd $PKG
|
||||
requiredbuilder -v -y -s $CWD $PKG
|
||||
makepkg -l y -c n $CWD/${NAME}-$VERSION-$ARCH-$BUILD.tgz
|
47
Slackware/i2p/readme.txt
Normal file
47
Slackware/i2p/readme.txt
Normal file
@ -0,0 +1,47 @@
|
||||
Building:
|
||||
The i2p package will be installed in /opt/i2p
|
||||
|
||||
If you want to change installation dir, change the variable INSTALL_DIR
|
||||
on i2p.SlackBuild and rebuild the package. You will also need to do the same
|
||||
in the base-i2p package.
|
||||
|
||||
Installation and Upgrade:
|
||||
Probably you will never have to update i2p packages. However if you do,
|
||||
be sure to installpkg first, then removepkg or custom config files can
|
||||
be lost with upgradepkg. I2P has an auto-update function. However using
|
||||
installpkg then removepkg lowers the demand on the I2P network as a
|
||||
whole, and is by far faster.
|
||||
|
||||
After installpkg command, doinst.sh will execute a postinstallation script
|
||||
needed by I2P. Be sure to also install the base-i2p package.
|
||||
|
||||
Optional:
|
||||
|
||||
chmod +x /etc/rc.d/rc.i2p only if you want it to start on boot and stop on
|
||||
shutdown.
|
||||
|
||||
How to start I2P:
|
||||
|
||||
Start I2P service with-
|
||||
sh /etc/rc.d/rc.i2p start
|
||||
|
||||
Now tell your browser to user this proxy: localhost on port 4444 and open
|
||||
this page: http://localhost:7657/index.jsp
|
||||
Here you can configure I2P, watch network status and navigate anonimously.
|
||||
It's suggested to subscribe to various addressbook hosts so that you can
|
||||
get to the many available eepsites and other service on I2P. These are not
|
||||
set up by default for security reasons.
|
||||
|
||||
Please see the faqs on http://www.i2p2.i2p/ or http://www.i2p2.de/ on how
|
||||
to subscribe to the various addressbook services.
|
||||
|
||||
To stop I2P:
|
||||
/etc/rc.d/rc.i2p stop
|
||||
|
||||
|
||||
For any additional information:
|
||||
|
||||
Within I2P- http://www.i2p2.i2p/, http://forum.i2p/, http://zzz.i2p
|
||||
|
||||
Internet (not reccomended!) - http://www.i2p2.de/, http://forum.i2p2.de/
|
||||
|
19
Slackware/i2p/slack-desc
Normal file
19
Slackware/i2p/slack-desc
Normal file
@ -0,0 +1,19 @@
|
||||
# HOW TO EDIT THIS FILE:
|
||||
# The "handy ruler" below makes it easier to edit a package description. Line
|
||||
# up the first '|' above the ':' following the base package name, and the '|' on
|
||||
# the right side marks the last column you can put a character in. You must make
|
||||
# exactly 11 lines for the formatting to be correct. It's also customary to
|
||||
# leave one space after the ':'.
|
||||
|
||||
|-----handy-ruler----------------------------------------------------------|
|
||||
i2p: i2p (an anonymizing network)
|
||||
i2p:
|
||||
i2p: I2P is an anonymizing network, offering a simple layer that
|
||||
i2p: identity-sensitive applications can use to securely communicate. All
|
||||
i2p: data is wrapped with several layers of encryption, and the network is
|
||||
i2p: both distributed and dynamic, with no trusted parties.
|
||||
i2p: Many applications are available that interface with I2P, including
|
||||
i2p: mail, peer-peer file sharing, IRC chat, and others.
|
||||
i2p: WARNING: To upgrade installpkg FIRST _THEN_ removepkg.
|
||||
i2p: For more information, see: http://www.i2p2.de/
|
||||
i2p:
|
2
Slackware/i2p/slack-required
Normal file
2
Slackware/i2p/slack-required
Normal file
@ -0,0 +1,2 @@
|
||||
glibc >= 2.7-i486-17 | glibc-solibs >= 2.7-i486-17
|
||||
perl >= 5.10.0-i486-1
|
@ -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
|
||||
|
@ -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}">
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -34,7 +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.SimpleTimer;
|
||||
import net.i2p.util.SimpleScheduler;
|
||||
import net.i2p.util.SimpleTimer2;
|
||||
|
||||
/**
|
||||
* <span style="font-size:8px;font-family:courier;color:#EEEEEE;background-color:#000000">
|
||||
* ################################################################################<br>
|
||||
@ -158,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.
|
||||
SimpleTimer Y = RetransmissionTimer.getInstance();
|
||||
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);
|
||||
@ -217,6 +222,7 @@ public class BOB {
|
||||
}
|
||||
}
|
||||
|
||||
i = 0;
|
||||
try {
|
||||
info("BOB is now running.");
|
||||
ServerSocket listener = new ServerSocket(Integer.parseInt(props.getProperty(PROP_BOB_PORT)), 10, InetAddress.getByName(props.getProperty(PROP_BOB_HOST)));
|
||||
|
@ -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 = "03", BEXT = "";
|
||||
public static final String BMAJ = "00", BMIN = "00", BREV = "05", 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();
|
||||
|
||||
|
@ -26,8 +26,6 @@ package net.i2p.BOB;
|
||||
import java.net.ConnectException;
|
||||
import java.net.SocketTimeoutException;
|
||||
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 +40,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();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -70,68 +79,90 @@ public class I2Plistener implements Runnable {
|
||||
boolean g = false;
|
||||
I2PSocket sessSocket = null;
|
||||
|
||||
serverSocket.setSoTimeout(100);
|
||||
database.getReadLock();
|
||||
info.getReadLock();
|
||||
if(info.exists("INPORT")) {
|
||||
tgwatch = 2;
|
||||
}
|
||||
info.releaseReadLock();
|
||||
database.releaseReadLock();
|
||||
boolean spin = true;
|
||||
while(spin) {
|
||||
die: {
|
||||
|
||||
serverSocket.setSoTimeout(50);
|
||||
// try {
|
||||
// if (info.exists("INPORT")) {
|
||||
// tgwatch = 2;
|
||||
// }
|
||||
// } catch (Exception e) {
|
||||
// try {
|
||||
// runlock();
|
||||
// } catch (Exception e2) {
|
||||
// break die;
|
||||
// }
|
||||
// break die;
|
||||
// }
|
||||
boolean spin = true;
|
||||
while (spin) {
|
||||
|
||||
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;
|
||||
rlock();
|
||||
} catch (Exception e) {
|
||||
break die;
|
||||
}
|
||||
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();
|
||||
try {
|
||||
spin = info.get("RUNNING").equals(Boolean.TRUE);
|
||||
} catch (Exception e) {
|
||||
try {
|
||||
runlock();
|
||||
} catch (Exception e2) {
|
||||
break die;
|
||||
}
|
||||
break die;
|
||||
}
|
||||
try {
|
||||
try {
|
||||
sessSocket = serverSocket.accept();
|
||||
g = true;
|
||||
} catch (ConnectException ce) {
|
||||
g = false;
|
||||
} catch (SocketTimeoutException ste) {
|
||||
g = false;
|
||||
}
|
||||
if (g) {
|
||||
g = false;
|
||||
// toss the connection to a new thread.
|
||||
I2PtoTCP conn_c = new I2PtoTCP(sessSocket, info, database);
|
||||
Thread t = new Thread(conn_c, "BOBI2PtoTCP");
|
||||
t.start();
|
||||
}
|
||||
|
||||
} catch(I2PException e) {
|
||||
// System.out.println("Exception " + e);
|
||||
} catch (I2PException e) {
|
||||
// System.out.println("Exception " + e);
|
||||
}
|
||||
}
|
||||
}
|
||||
// System.out.println("I2Plistener: Close");
|
||||
try {
|
||||
serverSocket.close();
|
||||
} catch(I2PException e) {
|
||||
// nop
|
||||
}
|
||||
// need to kill off the socket manager too.
|
||||
I2PSession session = socketManager.getSession();
|
||||
if(session != null) {
|
||||
// System.out.println("I2Plistener: destroySession");
|
||||
try {
|
||||
session.destroySession();
|
||||
} catch(I2PSessionException ex) {
|
||||
// nop
|
||||
}
|
||||
}
|
||||
// System.out.println("I2Plistener: Waiting for children");
|
||||
while(Thread.activeCount() > tgwatch) { // wait for all threads in our threadgroup to finish
|
||||
try {
|
||||
Thread.sleep(100); //sleep for 100 ms (One tenth second)
|
||||
} catch(Exception e) {
|
||||
// nop
|
||||
}
|
||||
}
|
||||
|
||||
// System.out.println("I2Plistener: Done.");
|
||||
|
||||
// Previous level does this cleanup now.
|
||||
//
|
||||
// try {
|
||||
// serverSocket.close();
|
||||
// } catch (I2PException e) {
|
||||
// nop
|
||||
//}
|
||||
// need to kill off the socket manager too.
|
||||
// I2PSession session = socketManager.getSession();
|
||||
// if (session != null) {
|
||||
// System.out.println("I2Plistener: destroySession");
|
||||
// try {
|
||||
// session.destroySession();
|
||||
// } catch (I2PSessionException ex) {
|
||||
// nop
|
||||
// }
|
||||
//}
|
||||
// System.out.println("I2Plistener: Waiting for children");
|
||||
// while (Thread.activeCount() > tgwatch) { // wait for all threads in our threadgroup to finish
|
||||
// try {
|
||||
// Thread.sleep(100); //sleep for 100 ms (One tenth second)
|
||||
// } catch (Exception e) {
|
||||
// nop
|
||||
// }
|
||||
//}
|
||||
|
||||
// System.out.println("I2Plistener: Done.");
|
||||
}
|
||||
}
|
||||
|
@ -23,6 +23,7 @@
|
||||
*/
|
||||
package net.i2p.BOB;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.net.Socket;
|
||||
@ -105,8 +106,8 @@ die: {
|
||||
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
|
||||
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!
|
||||
@ -116,7 +117,22 @@ die: {
|
||||
try {
|
||||
Thread.sleep(10); //sleep for 10 ms
|
||||
} catch(InterruptedException e) {
|
||||
// nop
|
||||
try {
|
||||
in.close();
|
||||
} catch(Exception ex) {
|
||||
}
|
||||
try {
|
||||
out.close();
|
||||
} catch(Exception ex) {
|
||||
}
|
||||
try {
|
||||
Iin.close();
|
||||
} catch(Exception ex) {
|
||||
}
|
||||
try {
|
||||
Iout.close();
|
||||
} catch(Exception ex) {
|
||||
}
|
||||
}
|
||||
}
|
||||
// System.out.println("I2PtoTCP: Going away...");
|
||||
|
@ -29,10 +29,12 @@ import java.net.InetAddress;
|
||||
import java.net.ServerSocket;
|
||||
import java.util.Properties;
|
||||
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.I2PSocketManager;
|
||||
import net.i2p.client.streaming.I2PSocketManagerFactory;
|
||||
import net.i2p.util.Log;
|
||||
import org.tanukisoftware.wrapper.WrapperManager;
|
||||
|
||||
/**
|
||||
*
|
||||
@ -56,8 +58,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 +75,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 +87,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 +95,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,67 +132,87 @@ public class MUXlisten implements Runnable {
|
||||
*
|
||||
*/
|
||||
public void run() {
|
||||
|
||||
I2PServerSocket SS = null;
|
||||
int ticks = 1200; // Allow 120 seconds, no more.
|
||||
try {
|
||||
wlock();
|
||||
try {
|
||||
info.add("RUNNING", Boolean.TRUE);
|
||||
info.add("STARTING", Boolean.FALSE);
|
||||
} catch(Exception e) {
|
||||
info.add("RUNNING", new Boolean(true));
|
||||
} catch (Exception e) {
|
||||
wunlock();
|
||||
return;
|
||||
}
|
||||
} catch(Exception e) {
|
||||
} catch (Exception e) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
wunlock();
|
||||
} catch(Exception e) {
|
||||
} catch (Exception e) {
|
||||
return;
|
||||
}
|
||||
// socketManager.addDisconnectListener(new DisconnectListener());
|
||||
|
||||
quit: {
|
||||
quit:
|
||||
{
|
||||
try {
|
||||
tg = new ThreadGroup(N);
|
||||
die: {
|
||||
die:
|
||||
{
|
||||
// toss the connections to a new threads.
|
||||
// will wrap with TCP and UDP when UDP works
|
||||
|
||||
if(go_out) {
|
||||
if (go_out) {
|
||||
// I2P -> TCP
|
||||
I2Plistener conn = new I2Plistener(socketManager, info, database, _log);
|
||||
SS = socketManager.getServerSocket();
|
||||
I2Plistener conn = new I2Plistener(SS, socketManager, info, database, _log);
|
||||
Thread t = new Thread(tg, conn, "BOBI2Plistener " + N);
|
||||
t.start();
|
||||
}
|
||||
|
||||
if(come_in) {
|
||||
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 {
|
||||
wlock();
|
||||
try {
|
||||
Thread.sleep(1000); //sleep for 1000 ms (One second)
|
||||
} catch(InterruptedException e) {
|
||||
// nop
|
||||
info.add("STARTING", new Boolean(false));
|
||||
} catch (Exception e) {
|
||||
wunlock();
|
||||
break die;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
break die;
|
||||
}
|
||||
try {
|
||||
wunlock();
|
||||
} catch (Exception e) {
|
||||
break 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) {
|
||||
} catch (Exception e) {
|
||||
runlock();
|
||||
break die;
|
||||
}
|
||||
} catch(Exception e) {
|
||||
} catch (Exception e) {
|
||||
break die;
|
||||
}
|
||||
try {
|
||||
runlock();
|
||||
} catch(Exception e) {
|
||||
} catch (Exception e) {
|
||||
break die;
|
||||
}
|
||||
}
|
||||
@ -198,79 +220,186 @@ die: {
|
||||
try {
|
||||
wlock();
|
||||
try {
|
||||
info.add("RUNNING", Boolean.FALSE);
|
||||
} catch(Exception e) {
|
||||
info.add("RUNNING", new Boolean(false));
|
||||
} catch (Exception e) {
|
||||
wunlock();
|
||||
break die;
|
||||
}
|
||||
} catch(Exception e) {
|
||||
} catch (Exception e) {
|
||||
break die;
|
||||
}
|
||||
try {
|
||||
wunlock();
|
||||
} catch(Exception e) {
|
||||
} catch (Exception e) {
|
||||
break die;
|
||||
}
|
||||
} // die
|
||||
|
||||
// wait for child threads and thread groups to die
|
||||
// System.out.println("MUXlisten: waiting for children");
|
||||
while(tg.activeCount() + tg.activeGroupCount() != 0) {
|
||||
tg.interrupt(); // unwedge any blocking threads.
|
||||
if (SS != null) {
|
||||
try {
|
||||
Thread.sleep(100); //sleep for 100 ms (One tenth second)
|
||||
} catch(InterruptedException ex) {
|
||||
// nop
|
||||
SS.close();
|
||||
} catch (I2PException ex) {
|
||||
//Logger.getLogger(MUXlisten.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
if (this.come_in) {
|
||||
try {
|
||||
listener.close();
|
||||
} catch (IOException e) {
|
||||
}
|
||||
}
|
||||
|
||||
I2PSession session = socketManager.getSession();
|
||||
if (session != null) {
|
||||
// System.out.println("I2Plistener: destroySession");
|
||||
try {
|
||||
session.destroySession();
|
||||
} catch (I2PSessionException ex) {
|
||||
// nop
|
||||
}
|
||||
}
|
||||
try {
|
||||
socketManager.destroySocketManager();
|
||||
} catch (Exception e) {
|
||||
// nop
|
||||
}
|
||||
// Wait for child threads and thread groups to die
|
||||
// System.out.println("MUXlisten: waiting for children");
|
||||
if (tg.activeCount() + tg.activeGroupCount() != 0) {
|
||||
while ((tg.activeCount() + tg.activeGroupCount() != 0) && ticks != 0) {
|
||||
tg.interrupt(); // unwedge any blocking threads.
|
||||
ticks--;
|
||||
try {
|
||||
Thread.sleep(100); //sleep for 100 ms (One tenth second)
|
||||
} catch (InterruptedException ex) {
|
||||
break quit;
|
||||
}
|
||||
}
|
||||
if (tg.activeCount() + tg.activeGroupCount() != 0) {
|
||||
break quit; // Uh-oh.
|
||||
}
|
||||
}
|
||||
tg.destroy();
|
||||
// Zap reference to the ThreadGroup so the JVM can GC it.
|
||||
tg = null;
|
||||
} catch(Exception e) {
|
||||
} 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
|
||||
if (tg != null) {
|
||||
if (SS != null) {
|
||||
try {
|
||||
SS.close();
|
||||
} catch (I2PException ex) {
|
||||
//Logger.getLogger(MUXlisten.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
}
|
||||
if (this.come_in) {
|
||||
try {
|
||||
listener.close();
|
||||
} catch (IOException e) {
|
||||
}
|
||||
}
|
||||
try {
|
||||
socketManager.destroySocketManager();
|
||||
} catch (Exception e) {
|
||||
// nop
|
||||
}
|
||||
ticks = 600; // 60 seconds
|
||||
if (tg.activeCount() + tg.activeGroupCount() != 0) {
|
||||
while ((tg.activeCount() + tg.activeGroupCount() != 0) && ticks != 0) {
|
||||
tg.interrupt(); // unwedge any blocking threads.
|
||||
ticks--;
|
||||
try {
|
||||
Thread.sleep(100); //sleep for 100 ms (One tenth second)
|
||||
} catch (InterruptedException ex) {
|
||||
// nop
|
||||
}
|
||||
}
|
||||
}
|
||||
if (tg.activeCount() + tg.activeGroupCount() == 0) {
|
||||
tg.destroy();
|
||||
// Zap reference to the ThreadGroup so the JVM can GC it.
|
||||
tg = null;
|
||||
} else {
|
||||
System.out.println("BOB: MUXlisten: Can't kill threads. Please send the following dump to sponge@mail.i2p");
|
||||
System.out.println("\n\nBOB: MUXlisten: ThreadGroup dump BEGIN");
|
||||
visit(tg, 0);
|
||||
System.out.println("BOB: MUXlisten: ThreadGroup dump END\n\n");
|
||||
}
|
||||
}
|
||||
|
||||
// This is here to catch when something fucks up REALLY bad.
|
||||
// if (tg != null) {
|
||||
// System.out.println("BOB: MUXlisten: Something fucked up REALLY bad!");
|
||||
// System.out.println("BOB: MUXlisten: Please email the following dump to sponge@mail.i2p");
|
||||
// WrapperManager.requestThreadDump();
|
||||
// System.out.println("BOB: MUXlisten: Something fucked up REALLY bad!");
|
||||
// System.out.println("BOB: MUXlisten: Please email the above dump to sponge@mail.i2p");
|
||||
// }
|
||||
// zero out everything.
|
||||
try {
|
||||
wlock();
|
||||
try {
|
||||
info.add("STARTING", Boolean.FALSE);
|
||||
info.add("STOPPING", Boolean.FALSE);
|
||||
info.add("RUNNING", Boolean.FALSE);
|
||||
} catch(Exception e) {
|
||||
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) {
|
||||
} catch (Exception e) {
|
||||
}
|
||||
// This is here to catch when something fucks up REALLY bad.
|
||||
if(tg != null) {
|
||||
while(tg.activeCount() + tg.activeGroupCount() != 0) {
|
||||
tg.interrupt(); // unwedge any blocking threads.
|
||||
try {
|
||||
Thread.sleep(100); //sleep for 100 ms (One tenth second)
|
||||
} catch(InterruptedException ex) {
|
||||
// nop
|
||||
}
|
||||
}
|
||||
tg.destroy();
|
||||
// Zap reference to the ThreadGroup so the JVM can GC it.
|
||||
tg = null;
|
||||
|
||||
}
|
||||
|
||||
|
||||
// Debugging...
|
||||
|
||||
/**
|
||||
* 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();
|
||||
}
|
||||
|
||||
// Visit each thread group
|
||||
visit(root, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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) {
|
||||
// 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: " + 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -24,8 +24,8 @@
|
||||
package net.i2p.BOB;
|
||||
|
||||
import net.i2p.client.streaming.RetransmissionTimer;
|
||||
import net.i2p.util.SimpleTimer;
|
||||
|
||||
import net.i2p.util.SimpleScheduler;
|
||||
import net.i2p.util.SimpleTimer2;
|
||||
/**
|
||||
* Start from command line
|
||||
*
|
||||
@ -39,8 +39,14 @@ public class Main {
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
// THINK THINK THINK THINK THINK THINK
|
||||
SimpleTimer Y = RetransmissionTimer.getInstance();
|
||||
RetransmissionTimer Y = RetransmissionTimer.getInstance();
|
||||
SimpleScheduler Y1 = SimpleScheduler.getInstance();
|
||||
SimpleTimer2 Y2 = SimpleTimer2.getInstance();
|
||||
|
||||
BOB.main(args);
|
||||
Y.removeSimpleTimer();
|
||||
|
||||
Y2.stop();
|
||||
Y1.stop();
|
||||
Y.stop();
|
||||
}
|
||||
}
|
||||
|
@ -23,6 +23,7 @@
|
||||
*/
|
||||
package net.i2p.BOB;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
|
||||
@ -35,40 +36,62 @@ 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;
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy from source to destination...
|
||||
* and yes, we are totally OK to block here on writes,
|
||||
* The OS has buffers, and I intend to use them.
|
||||
* We send an interrupt signal to the threadgroup to
|
||||
* unwedge any pending writes.
|
||||
*
|
||||
*/
|
||||
public void run() {
|
||||
/*
|
||||
* NOTE:
|
||||
* The write method of OutputStream calls the write method of
|
||||
* one argument on each of the bytes to be written out.
|
||||
* Subclasses are encouraged to override this method and provide
|
||||
* a more efficient implementation.
|
||||
*
|
||||
* So, is this really a performance problem?
|
||||
* Should we expand to several bytes?
|
||||
* I don't believe there would be any gain, since read method
|
||||
* has the same reccomendations. If anyone has a better way to
|
||||
* do this, I'm interested in performance improvements.
|
||||
*
|
||||
* --Sponge
|
||||
*
|
||||
* Tested with 128 bytes, and there was no performance gain.
|
||||
*
|
||||
* --Sponge
|
||||
*/
|
||||
|
||||
int b;
|
||||
byte a[] = new byte[1];
|
||||
boolean spin = true;
|
||||
try {
|
||||
while(spin) {
|
||||
database.getReadLock();
|
||||
info.getReadLock();
|
||||
spin = info.get("RUNNING").equals(Boolean.TRUE);
|
||||
info.releaseReadLock();
|
||||
database.releaseReadLock();
|
||||
// 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) {
|
||||
@ -76,11 +99,11 @@ public class TCPio implements Runnable {
|
||||
} else if(b == 0) {
|
||||
Thread.yield(); // this should act like a mini sleep.
|
||||
if(Ain.available() == 0) {
|
||||
try {
|
||||
// try {
|
||||
// Thread.yield();
|
||||
Thread.sleep(10);
|
||||
} catch(InterruptedException ex) {
|
||||
}
|
||||
// } catch(InterruptedException ex) {
|
||||
// }
|
||||
}
|
||||
} else {
|
||||
/* according to the specs:
|
||||
@ -91,13 +114,25 @@ 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) {
|
||||
// Logger.getLogger(TCPio.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
try {
|
||||
Aout.close();
|
||||
} catch (IOException ex) {
|
||||
// Logger.getLogger(TCPio.class.getName()).log(Level.SEVERE, null, ex);
|
||||
}
|
||||
return;
|
||||
}
|
||||
// System.out.println("TCPio: Leaving.");
|
||||
|
@ -27,8 +27,8 @@ 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 net.i2p.client.streaming.I2PServerSocket;
|
||||
import net.i2p.client.streaming.I2PSocketManager;
|
||||
import net.i2p.util.Log;
|
||||
@ -63,6 +63,26 @@ 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();
|
||||
}
|
||||
|
||||
private void wlock() throws Exception {
|
||||
database.getWriteLock();
|
||||
info.getWriteLock();
|
||||
}
|
||||
|
||||
private void wunlock() throws Exception {
|
||||
info.releaseWriteLock();
|
||||
database.releaseWriteLock();
|
||||
}
|
||||
|
||||
/**
|
||||
* Simply listen on TCP port, and thread connections
|
||||
*
|
||||
@ -70,77 +90,123 @@ public class TCPlistener implements Runnable {
|
||||
public void run() {
|
||||
boolean g = false;
|
||||
boolean spin = true;
|
||||
database.getReadLock();
|
||||
info.getReadLock();
|
||||
if(info.exists("OUTPORT")) {
|
||||
tgwatch = 2;
|
||||
}
|
||||
try {
|
||||
Socket server = new Socket();
|
||||
listener.setSoTimeout(1000);
|
||||
info.releaseReadLock();
|
||||
database.releaseReadLock();
|
||||
while(spin) {
|
||||
database.getReadLock();
|
||||
info.getReadLock();
|
||||
spin = info.get("RUNNING").equals(Boolean.TRUE);
|
||||
info.releaseReadLock();
|
||||
database.releaseReadLock();
|
||||
try {
|
||||
server = listener.accept();
|
||||
g = true;
|
||||
} catch(SocketTimeoutException ste) {
|
||||
g = false;
|
||||
}
|
||||
if(g) {
|
||||
// toss the connection to a new thread.
|
||||
TCPtoI2P conn_c = new TCPtoI2P(socketManager, server, info, database);
|
||||
Thread t = new Thread(conn_c, "BOBTCPtoI2P");
|
||||
t.start();
|
||||
g = false;
|
||||
}
|
||||
}
|
||||
//System.out.println("TCPlistener: destroySession");
|
||||
listener.close();
|
||||
} catch(IOException ioe) {
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
// need to kill off the socket manager too.
|
||||
I2PSession session = socketManager.getSession();
|
||||
if(session != null) {
|
||||
die: {
|
||||
try {
|
||||
session.destroySession();
|
||||
} catch(I2PSessionException ex) {
|
||||
// nop
|
||||
rlock();
|
||||
} catch (Exception e) {
|
||||
break die;
|
||||
}
|
||||
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); // Half of the expected time from MUXlisten
|
||||
while (spin) {
|
||||
try {
|
||||
rlock();
|
||||
} catch (Exception e) {
|
||||
break die;
|
||||
}
|
||||
try {
|
||||
spin = info.get("RUNNING").equals(Boolean.TRUE);
|
||||
} catch (Exception e) {
|
||||
try {
|
||||
runlock();
|
||||
} catch (Exception e2) {
|
||||
break die;
|
||||
}
|
||||
break die;
|
||||
}
|
||||
try {
|
||||
server = listener.accept();
|
||||
g = true;
|
||||
} catch (SocketTimeoutException ste) {
|
||||
g = false;
|
||||
}
|
||||
if (g) {
|
||||
// toss the connection to a new thread.
|
||||
TCPtoI2P conn_c = new TCPtoI2P(socketManager, server /* , info, database */);
|
||||
Thread t = new Thread(conn_c, "BOBTCPtoI2P");
|
||||
t.start();
|
||||
g = false;
|
||||
}
|
||||
}
|
||||
//System.out.println("TCPlistener: destroySession");
|
||||
listener.close();
|
||||
} catch (IOException ioe) {
|
||||
try {
|
||||
listener.close();
|
||||
} catch (IOException e) {
|
||||
}
|
||||
// Fatal failure, cause a stop event
|
||||
try {
|
||||
rlock();
|
||||
try {
|
||||
spin = info.get("RUNNING").equals(Boolean.TRUE);
|
||||
} catch (Exception e) {
|
||||
runlock();
|
||||
break die;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
break die;
|
||||
}
|
||||
if (spin) {
|
||||
try {
|
||||
wlock();
|
||||
try {
|
||||
info.add("STOPPING", new Boolean(true));
|
||||
info.add("RUNNING", new Boolean(false));
|
||||
} catch (Exception e) {
|
||||
wunlock();
|
||||
break die;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
break die;
|
||||
}
|
||||
try {
|
||||
wunlock();
|
||||
} catch (Exception e) {
|
||||
break die;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//System.out.println("TCPlistener: 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) {
|
||||
// Previous level does this cleanup now.
|
||||
//
|
||||
// need to kill off the socket manager too.
|
||||
// I2PSession session = socketManager.getSession();
|
||||
// if (session != null) {
|
||||
// try {
|
||||
// session.destroySession();
|
||||
// } catch (I2PSessionException ex) {
|
||||
// nop
|
||||
}
|
||||
}
|
||||
//System.out.println("TCPlistener: Done.");
|
||||
// }
|
||||
//}
|
||||
//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.");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
||||
@ -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,14 +110,19 @@ 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();
|
||||
in = sock.getInputStream();
|
||||
out = sock.getOutputStream();
|
||||
try {
|
||||
line = lnRead(in);
|
||||
input = line.toLowerCase();
|
||||
@ -135,22 +140,22 @@ public class TCPtoI2P implements Runnable {
|
||||
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();
|
||||
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
|
||||
TCPio conn_c = new TCPio(in, Iout /*, info, database */); // app -> I2P
|
||||
TCPio conn_a = new TCPio(Iin, out /*, info, database */); // I2P -> app
|
||||
Thread t = new Thread(conn_c, "TCPioA");
|
||||
Thread q = new Thread(conn_a, "TCPioB");
|
||||
// Fire!
|
||||
t.start();
|
||||
q.start();
|
||||
while(t.isAlive() && q.isAlive()) { // AND is used here to kill off the other thread
|
||||
try {
|
||||
// try {
|
||||
Thread.sleep(10); //sleep for 10 ms
|
||||
} catch(InterruptedException e) {
|
||||
// } catch(InterruptedException e) {
|
||||
// nop
|
||||
}
|
||||
// }
|
||||
}
|
||||
// System.out.println("TCPtoI2P: Going away...");
|
||||
|
||||
@ -167,7 +172,24 @@ public class TCPtoI2P implements Runnable {
|
||||
} catch(Exception e) {
|
||||
Emsg("ERROR " + e.toString(), out);
|
||||
}
|
||||
} catch(IOException ioe) {
|
||||
} catch(Exception e) {
|
||||
// bail on anything else
|
||||
}
|
||||
try {
|
||||
in.close();
|
||||
} catch(Exception e) {
|
||||
}
|
||||
try {
|
||||
out.close();
|
||||
} catch(Exception e) {
|
||||
}
|
||||
try {
|
||||
Iin.close();
|
||||
} catch(Exception e) {
|
||||
}
|
||||
try {
|
||||
Iout.close();
|
||||
} catch(Exception e) {
|
||||
}
|
||||
try {
|
||||
// System.out.println("TCPtoI2P: Close I2P");
|
||||
@ -181,6 +203,5 @@ public class TCPtoI2P implements Runnable {
|
||||
} catch(Exception e) {
|
||||
}
|
||||
// System.out.println("TCPtoI2P: Done.");
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -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");
|
||||
|
15
apps/desktopgui/LICENSE
Normal file
15
apps/desktopgui/LICENSE
Normal file
@ -0,0 +1,15 @@
|
||||
Desktop GUI: provides a simple GUI for I2P.
|
||||
Copyright (C) 2009 Mathias De Maré
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; only version 2 of the License.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
115
apps/desktopgui/build.xml
Normal file
115
apps/desktopgui/build.xml
Normal 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>
|
261
apps/desktopgui/desktopgui/resources/howto/howto.html
Normal file
261
apps/desktopgui/desktopgui/resources/howto/howto.html
Normal file
@ -0,0 +1,261 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Small Guide to I2P</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Small Guide to I2P</h1>
|
||||
|
||||
<h2>So, what's this all about?</h2>
|
||||
|
||||
<p>I2P builds up a new net inside the usual internet, connecting nodes together
|
||||
via encrypted connections.
|
||||
It is a JAVA prgram with its most used part (the encryption of the data) written
|
||||
in handoptimized assembler code.
|
||||
It will use your bandwith, your RAM and your CPU. It will use them all up if you
|
||||
do not limit it.
|
||||
I2P will route unknown traffic through your node, even stuff you dislike.
|
||||
As that data is encrypted, nobody knows whats data went to or drom your node.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
First, ALWAYS use the latest stable release.
|
||||
Development releases are called "mtn version" and are marked with a -, e.g.
|
||||
0.6.5-1. Those are usually useable by all but could do harm to your I2P
|
||||
experience.
|
||||
You can get the latest MTN builds from my eepsite echelon.i2p, but always
|
||||
remember: I built them, you need to trust me not to changed the code!
|
||||
After you get the right "i2pupdate.zip" file, put that file into the I2P
|
||||
directory and hit restart on the router console http://127.0.0.1:7657.
|
||||
Do NOT deflate the zip file!
|
||||
</p>
|
||||
|
||||
<p>
|
||||
I2P is very dynamic - after startup it tries to get known to other I2P routers
|
||||
and measures their speed - you need to wait some 10-120 minutes until your
|
||||
I2P router knows enough other ones to obtain full power of I2P.
|
||||
</p>
|
||||
|
||||
<h2>Filesharing</h2>
|
||||
|
||||
<p>
|
||||
I2P is able to do anonymous filesharing.
|
||||
But as there are NO gateways between real net and I2P, you can only share/
|
||||
download torrents from within I2P. Look e.g. postman.i2p or planet.i2p.
|
||||
You CANNOT use azureus, utorrent or any other usual client.
|
||||
You cannot download anonymous torrents from mininova, piratebay or else.
|
||||
You need to use I2P internal torrents and I2P aware programs like
|
||||
I2Psnark (builtin, suitable for 1-20 torrents)
|
||||
I2PRufus (external, python, high CPU load, suitable >20 torrents) http://echelon.i2p/i2prufus
|
||||
I2P-BT (external, python)
|
||||
I2PsnarkXL (mod of I2Psnark made by fwd)
|
||||
</p>
|
||||
|
||||
<p>
|
||||
There are also gnutella and edonkey clients:
|
||||
i2phex for gnutella (http://echelon.i2p/i2phex)
|
||||
imule for edonkey (http://echelon.i2p/imule)
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Remember, as I2P uses other routers to route your traffic via 1-6 other PCs,
|
||||
your transferrates in P2P are slower than in usual internet.
|
||||
But you are anonymous, no one can easily (within 2 months-2 years) get your IP!
|
||||
torrents inside of I2P reaches up to 50 kb/sec, usual are 10-20 kb/sec per torrent
|
||||
i2phex reaches up to 20 kb/sec, usually 5-10 kb/sec
|
||||
imule in times reaches 10 kb/sec, usually 5-10 kb/sec
|
||||
</p>
|
||||
|
||||
<p>
|
||||
In I2PHex and imule you can just tell "share file or directory", in torrent
|
||||
you need to create a .torrent file and upload that (and ONLY that small .torrent)
|
||||
file to the trackers like tracker.postman.i2p/
|
||||
</p>
|
||||
|
||||
<p>
|
||||
I2P is a smaller net (1000 users) which grows slowly. As of which amount of shared
|
||||
data will slowly rise.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
I2P is anonymous and it does not censor - there is no administrator.
|
||||
There IS unwanted stuff like kiddyporn, nazism, or else.
|
||||
If you dislike all this, do not use I2P.
|
||||
There is NO way to prohibite this stuff to appear in a anonymous net like I2P.
|
||||
(as that stuff is available shows the anonymity and transfer function of I2P
|
||||
is working well enough)
|
||||
You can delete the destinations in question from your local hosts.txt file (or
|
||||
deface them) which will partly prevent you to reach those bad sies by accident.
|
||||
</p>
|
||||
|
||||
<h2>Internet (the websites)</h2>
|
||||
|
||||
<p>
|
||||
Only one outproxy (gateway I2P - webpages in usual Internet) is working.
|
||||
It is NOT official from I2P, I2P does work without.
|
||||
If that outproxy is slow, offline, gone,.. I2P still works on and cannot do
|
||||
anything to change that failure.
|
||||
That outproxy translates usual internet webpages into the I2P net and you can
|
||||
reach them via your Router.
|
||||
The best way for usual webpages is TOR, not that outproxy.
|
||||
Remember: the owner of the outproxy got ALL traffic from all I2P users
|
||||
visiting Internet pages and will risk that into the police!
|
||||
</p>
|
||||
|
||||
<p>
|
||||
This proxy is false.i2p. In newer I2P routers it is enabled, but not in
|
||||
older ones. Go to http://127.0.0.1:7657/i2ptunnel/index.jsp tunnels page and
|
||||
click on the eepProxy tunnel. Change the entry for the "Outproxies" to false.i2p
|
||||
and save. On the tunnels page, stop the epproxy tunnel and start it again,
|
||||
now your router will use the false.i2p outproxy.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
No other (known) gateways are setup and running. No one we know will run
|
||||
the gateway for torrent or any other P2P data (and risk his life).
|
||||
</p>
|
||||
|
||||
<h2>Bandwidth</h2>
|
||||
|
||||
<p>http://127.0.0.1:7657/config.jsp</p>
|
||||
|
||||
<p>Setup your bandwith wisely. Know your linespeed!</p>
|
||||
|
||||
<p>
|
||||
E.g. most common terms are:
|
||||
1Mbit = roughly 100 kbyte/sec
|
||||
10 MBit = roughly 1100 kbyte/sec
|
||||
512 kbit = roughly 50 kbyte/sec
|
||||
or in germany:
|
||||
16000er = roughly 1500 kbyte/sec
|
||||
6000er = roughly 600 kbyte/sec
|
||||
1000er = roughly 100 kb/sec
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Set your bandwith limits to 10% under your line speed and burst rate to
|
||||
your line speed.
|
||||
Set the bandwith share percentage to:
|
||||
>80% if lowest bandwith setting is >50k
|
||||
>50% if lowest bandwith setting is >30k
|
||||
>20% if lowest bandwith setting is >16k
|
||||
</p>
|
||||
|
||||
<p>There is no shared bandwith under 16k.</p>
|
||||
|
||||
<p>
|
||||
Limit your participating tunnels (shared bandwith) on:
|
||||
http://127.0.0.1:7657/configadvanced.jsp
|
||||
with the line:
|
||||
router.maxParticipatingTunnels=500
|
||||
</p>
|
||||
|
||||
<p>
|
||||
2000 is for roughly 600 kb/sec - very high value with high CPU load
|
||||
1000 is for roughly 300 kb/sec
|
||||
600 is a good value for 150-200kb/sec
|
||||
300 is roughly 90 kb/sec
|
||||
150 roughly 50 kb/sec
|
||||
Remember: even failed tunnel requests will result in a part tunnel on the hops in between!
|
||||
Those said, there are far more part tunnels unused than used in the live net under load, which
|
||||
results in slower bandwith per tunnel in the end.
|
||||
It is wise to first limit the bandwith and afterwards the part tunnels, e.g. set some more part
|
||||
tunnels and let I2P reach the bandwith limit instead of the part tunnels limit!
|
||||
</p>
|
||||
|
||||
<h2>What is shared bandwidth?</h2>
|
||||
|
||||
<p>
|
||||
I2P transports your date from the client to the server through 1-6 hops
|
||||
(other I2P routers). Each of this hops sees the data from you as "participating
|
||||
tunnel" - which is the shared bandwith of them.
|
||||
With this in mind, I2P needs some amount of this shared bandwith at some
|
||||
amount of routers.
|
||||
Share as much as you are able of - others will thank you!
|
||||
</p>
|
||||
|
||||
<p>
|
||||
With the "share percentage" set like above, you will obtain enough speed for
|
||||
your own traffic and obtain some participating tunnels (if >16kb/sec) with some
|
||||
noise traffic to hide your traffic in the stream.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
With release 0.6.5 there is some method to prefer your own traffic ahead
|
||||
of shared traffic which will result in better experience to you!
|
||||
</p>
|
||||
|
||||
<h2>Addressbook</h2>
|
||||
|
||||
<p>
|
||||
I2P uses a local addressbook to link short DNS names with the internal used 512bit
|
||||
hashes (which are destination IDs).
|
||||
Those links are saved insside the hosts.txt and userhosts.txt files in the i2p
|
||||
directory.
|
||||
Hosts which are not in those files cannot be reached via the short DNS names
|
||||
and a error message with "jumper links" will appear. Those links will ask
|
||||
some hosts services and forward to the correct site (if the site is known to them).
|
||||
Those hosts services just made a form to add new "hosts" and those results public
|
||||
available.
|
||||
You can subscribe to those hosts service and let your hosts.txt file be updated
|
||||
automatic. Go to http://127.0.0.1:7657/susidns/subscriptions.jsp SusiDNS
|
||||
and enter the hosts services into the textbox (and save afterwards):
|
||||
http://www.i2p2.i2p/hosts.txt
|
||||
http://stats.i2p/cgi-bin/newhosts.txt
|
||||
http://tino.i2p/hosts.txt
|
||||
http://i2host.i2p/cgi-bin/i2hostag
|
||||
You can add one of them, two or all.
|
||||
SusiDNS will now ask those hosts for new entries to the hosts.txt and those
|
||||
will be added to your hosts.txt. The userhosts.txt will ONLY be updated by
|
||||
yourself (the user) and not be published into the net!
|
||||
Remember, names once set could not be changed! If you loose your key (destination
|
||||
ID) to your eepsite, service,..., there is no way to change the linking
|
||||
between the DNS name and the (lost) destination ID automatic! Only manual by each
|
||||
user itself - great topic to discuss of need to renew DNS hostnames.
|
||||
As this subscription will not update old entries, you can "deface" unwanted
|
||||
eepsites with a false key and if you hit the bad name in browser by accident,
|
||||
you will not see the bad stuff!
|
||||
</p>
|
||||
|
||||
<h2>Out of Memory errors </h2>
|
||||
|
||||
<p>
|
||||
If your router hits the Out of Memory error - check your logs!
|
||||
Usual point for OOM are to much torrents in i2psnark - i2psnark is a real
|
||||
memory hogg and >10 torrents it requiers hell a lot of memory!
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Maybe it is possible for you to increase the wrapper memory config.
|
||||
This ONLY works if you start the I2P service restartable with console
|
||||
(on Windows).
|
||||
In I2P directory edit the wrapper.config file and change the values:
|
||||
wrapper.java.maxmemory=256 (or even to 512, IF possible)
|
||||
Afterwards shutdown I2P complete (the service) and restart it.
|
||||
</p>
|
||||
|
||||
<h2>Blocklists</h2>
|
||||
|
||||
<p>
|
||||
Sometimes attackers trying to flood the I2P net and try to do some harm.
|
||||
And some folks setting localnet IPs as their internet reachable address.
|
||||
To prevent those bad router to harm the local router, I2P implemented
|
||||
a local blocklist system. It is NOT integrated automatic as it could
|
||||
really harm your I2P experience if setup the wrong way.
|
||||
The way to enable blocklists is:
|
||||
Get the file http://zzz.i2p/files/blocklist.txt and copy this file into the
|
||||
I2P directory.
|
||||
On http://127.0.0.1:7657/configadvanced.jsp set the option
|
||||
router.blocklist.enable=true - click on Apply and restart the router
|
||||
with the restart link left on router console.
|
||||
The blockfile.txt file follows a special order, you<6F>ll get it if you read it.
|
||||
The first entry is the reason to be shown on http://127.0.0.1:7657/profiles.jsp
|
||||
at the bottom in the shitlist section.
|
||||
The second entry is the IP or the dest ID of a router.
|
||||
Right now there are only private subnets in the blocklist AND one chinese router
|
||||
which floods the floodfill DB while restarting every few minutes with a different
|
||||
router ID and far to less bandwith for being a floodfill router.
|
||||
</p>
|
||||
|
||||
<p>(By echelon -- echelon.i2p )</p>
|
||||
</body>
|
||||
</html>
|
BIN
apps/desktopgui/desktopgui/resources/logo/logo.jpg
Normal file
BIN
apps/desktopgui/desktopgui/resources/logo/logo.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
BIN
apps/desktopgui/desktopgui/resources/logo/logo_green.jpg
Normal file
BIN
apps/desktopgui/desktopgui/resources/logo/logo_green.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
BIN
apps/desktopgui/desktopgui/resources/logo/logo_orange.jpg
Normal file
BIN
apps/desktopgui/desktopgui/resources/logo/logo_orange.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
BIN
apps/desktopgui/desktopgui/resources/logo/logo_red.jpg
Normal file
BIN
apps/desktopgui/desktopgui/resources/logo/logo_red.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.3 KiB |
BIN
apps/desktopgui/lib/appframework.jar
Normal file
BIN
apps/desktopgui/lib/appframework.jar
Normal file
Binary file not shown.
BIN
apps/desktopgui/lib/swing-worker.jar
Normal file
BIN
apps/desktopgui/lib/swing-worker.jar
Normal file
Binary file not shown.
3
apps/desktopgui/manifest.mf
Normal file
3
apps/desktopgui/manifest.mf
Normal file
@ -0,0 +1,3 @@
|
||||
Manifest-Version: 1.0
|
||||
X-COMMENT: Main-Class will be added automatically by build
|
||||
|
629
apps/desktopgui/nbproject/build-impl.xml
Normal file
629
apps/desktopgui/nbproject/build-impl.xml
Normal file
@ -0,0 +1,629 @@
|
||||
<?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="" 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 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="dt_socket">
|
||||
<classpath>
|
||||
<path path="@{classpath}"/>
|
||||
</classpath>
|
||||
</nbjpdastart>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
<macrodef name="nbjpdareload" uri="http://www.netbeans.org/ns/j2se-project/1">
|
||||
<attribute default="${build.classes.dir}" name="dir"/>
|
||||
<sequential>
|
||||
<nbjpdareload>
|
||||
<fileset dir="@{dir}" includes="${fix.classes}">
|
||||
<include name="${fix.includes}*.class"/>
|
||||
</fileset>
|
||||
</nbjpdareload>
|
||||
</sequential>
|
||||
</macrodef>
|
||||
</target>
|
||||
<target name="-init-debug-args">
|
||||
<property name="version-output" value="java version "${ant.java.version}"/>
|
||||
<condition property="have-jdk-older-than-1.4">
|
||||
<or>
|
||||
<contains string="${version-output}" substring="java version "1.0"/>
|
||||
<contains string="${version-output}" substring="java version "1.1"/>
|
||||
<contains string="${version-output}" substring="java version "1.2"/>
|
||||
<contains string="${version-output}" substring="java version "1.3"/>
|
||||
</or>
|
||||
</condition>
|
||||
<condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
|
||||
<istrue value="${have-jdk-older-than-1.4}"/>
|
||||
</condition>
|
||||
</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=dt_socket,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,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,-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,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/>
|
||||
<!--
|
||||
====================
|
||||
JAR BUILDING SECTION
|
||||
====================
|
||||
-->
|
||||
<target depends="init" name="-pre-pre-jar">
|
||||
<dirname file="${dist.jar}" property="dist.jar.dir"/>
|
||||
<mkdir dir="${dist.jar.dir}"/>
|
||||
</target>
|
||||
<target name="-pre-jar">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target depends="init,compile,-pre-pre-jar,-pre-jar" name="-do-jar-without-manifest" unless="manifest.available">
|
||||
<j2seproject1:jar/>
|
||||
</target>
|
||||
<target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available" name="-do-jar-with-manifest" unless="manifest.available+main.class">
|
||||
<j2seproject1:jar manifest="${manifest.file}"/>
|
||||
</target>
|
||||
<target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+main.class" name="-do-jar-with-mainclass" unless="manifest.available+main.class+mkdist.available">
|
||||
<j2seproject1:jar manifest="${manifest.file}">
|
||||
<j2seproject1:manifest>
|
||||
<j2seproject1:attribute name="Main-Class" value="${main.class}"/>
|
||||
</j2seproject1:manifest>
|
||||
</j2seproject1:jar>
|
||||
<echo>To run this application from the command line without Ant, try:</echo>
|
||||
<property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
|
||||
<property location="${dist.jar}" name="dist.jar.resolved"/>
|
||||
<pathconvert property="run.classpath.with.dist.jar">
|
||||
<path path="${run.classpath}"/>
|
||||
<map from="${build.classes.dir.resolved}" to="${dist.jar.resolved}"/>
|
||||
</pathconvert>
|
||||
<echo>java -cp "${run.classpath.with.dist.jar}" ${main.class}</echo>
|
||||
</target>
|
||||
<target depends="init,compile,-pre-pre-jar,-pre-jar" if="manifest.available+main.class+mkdist.available" name="-do-jar-with-libraries">
|
||||
<property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
|
||||
<pathconvert property="run.classpath.without.build.classes.dir">
|
||||
<path path="${run.classpath}"/>
|
||||
<map from="${build.classes.dir.resolved}" to=""/>
|
||||
</pathconvert>
|
||||
<pathconvert pathsep=" " property="jar.classpath">
|
||||
<path path="${run.classpath.without.build.classes.dir}"/>
|
||||
<chainedmapper>
|
||||
<flattenmapper/>
|
||||
<globmapper from="*" to="lib/*"/>
|
||||
</chainedmapper>
|
||||
</pathconvert>
|
||||
<taskdef classname="org.netbeans.modules.java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
|
||||
<copylibs compress="${jar.compress}" jarfile="${dist.jar}" manifest="${manifest.file}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
|
||||
<fileset dir="${build.classes.dir}"/>
|
||||
<manifest>
|
||||
<attribute name="Main-Class" value="${main.class}"/>
|
||||
<attribute name="Class-Path" value="${jar.classpath}"/>
|
||||
</manifest>
|
||||
</copylibs>
|
||||
<echo>To run this application from the command line without Ant, try:</echo>
|
||||
<property location="${dist.jar}" name="dist.jar.resolved"/>
|
||||
<echo>java -jar "${dist.jar.resolved}"</echo>
|
||||
</target>
|
||||
<target name="-post-jar">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target depends="init,compile,-pre-jar,-do-jar-with-manifest,-do-jar-without-manifest,-do-jar-with-mainclass,-do-jar-with-libraries,-post-jar" description="Build JAR." name="jar"/>
|
||||
<!--
|
||||
=================
|
||||
EXECUTION SECTION
|
||||
=================
|
||||
-->
|
||||
<target depends="init,compile" description="Run a main class." name="run">
|
||||
<j2seproject1:java>
|
||||
<customize>
|
||||
<arg line="${application.args}"/>
|
||||
</customize>
|
||||
</j2seproject1:java>
|
||||
</target>
|
||||
<target name="-do-not-recompile">
|
||||
<property name="javac.includes.binary" value=""/>
|
||||
</target>
|
||||
<target depends="init,-do-not-recompile,compile-single" name="run-single">
|
||||
<fail unless="run.class">Must select one file in the IDE or set run.class</fail>
|
||||
<j2seproject1:java classname="${run.class}"/>
|
||||
</target>
|
||||
<!--
|
||||
=================
|
||||
DEBUGGING SECTION
|
||||
=================
|
||||
-->
|
||||
<target depends="init" if="netbeans.home" name="-debug-start-debugger">
|
||||
<j2seproject1:nbjpdastart name="${debug.class}"/>
|
||||
</target>
|
||||
<target depends="init,compile" name="-debug-start-debuggee">
|
||||
<j2seproject3:debug>
|
||||
<customize>
|
||||
<arg line="${application.args}"/>
|
||||
</customize>
|
||||
</j2seproject3:debug>
|
||||
</target>
|
||||
<target depends="init,compile,-debug-start-debugger,-debug-start-debuggee" description="Debug project in IDE." if="netbeans.home" name="debug"/>
|
||||
<target depends="init" if="netbeans.home" name="-debug-start-debugger-stepinto">
|
||||
<j2seproject1:nbjpdastart stopclassname="${main.class}"/>
|
||||
</target>
|
||||
<target depends="init,compile,-debug-start-debugger-stepinto,-debug-start-debuggee" if="netbeans.home" name="debug-stepinto"/>
|
||||
<target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-single">
|
||||
<fail unless="debug.class">Must select one file in the IDE or set debug.class</fail>
|
||||
<j2seproject3:debug classname="${debug.class}"/>
|
||||
</target>
|
||||
<target depends="init,-do-not-recompile,compile-single,-debug-start-debugger,-debug-start-debuggee-single" if="netbeans.home" name="debug-single"/>
|
||||
<target depends="init" name="-pre-debug-fix">
|
||||
<fail unless="fix.includes">Must set fix.includes</fail>
|
||||
<property name="javac.includes" value="${fix.includes}.java"/>
|
||||
</target>
|
||||
<target depends="init,-pre-debug-fix,compile-single" if="netbeans.home" name="-do-debug-fix">
|
||||
<j2seproject1:nbjpdareload/>
|
||||
</target>
|
||||
<target depends="init,-pre-debug-fix,-do-debug-fix" if="netbeans.home" name="debug-fix"/>
|
||||
<!--
|
||||
===============
|
||||
JAVADOC SECTION
|
||||
===============
|
||||
-->
|
||||
<target depends="init" name="-javadoc-build">
|
||||
<mkdir dir="${dist.javadoc.dir}"/>
|
||||
<javadoc additionalparam="${javadoc.additionalparam}" author="${javadoc.author}" charset="UTF-8" destdir="${dist.javadoc.dir}" docencoding="UTF-8" encoding="${javadoc.encoding.used}" failonerror="true" noindex="${javadoc.noindex}" nonavbar="${javadoc.nonavbar}" notree="${javadoc.notree}" private="${javadoc.private}" source="${javac.source}" splitindex="${javadoc.splitindex}" use="${javadoc.use}" useexternalfile="true" version="${javadoc.version}" windowtitle="${javadoc.windowtitle}">
|
||||
<classpath>
|
||||
<path path="${javac.classpath}"/>
|
||||
</classpath>
|
||||
<fileset dir="${src.dir}" excludes="${excludes}" includes="${includes}">
|
||||
<filename name="**/*.java"/>
|
||||
</fileset>
|
||||
</javadoc>
|
||||
</target>
|
||||
<target depends="init,-javadoc-build" if="netbeans.home" name="-javadoc-browse" unless="no.javadoc.preview">
|
||||
<nbbrowse file="${dist.javadoc.dir}/index.html"/>
|
||||
</target>
|
||||
<target depends="init,-javadoc-build,-javadoc-browse" description="Build Javadoc." name="javadoc"/>
|
||||
<!--
|
||||
=========================
|
||||
JUNIT COMPILATION SECTION
|
||||
=========================
|
||||
-->
|
||||
<target depends="init,compile" if="have.tests" name="-pre-pre-compile-test">
|
||||
<mkdir dir="${build.test.classes.dir}"/>
|
||||
</target>
|
||||
<target name="-pre-compile-test">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target if="do.depend.true" name="-compile-test-depend">
|
||||
<j2seproject3:depend classpath="${javac.test.classpath}" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
|
||||
</target>
|
||||
<target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-compile-test-depend" if="have.tests" name="-do-compile-test">
|
||||
<j2seproject3:javac classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" srcdir="${test.src.dir}"/>
|
||||
<copy todir="${build.test.classes.dir}">
|
||||
<fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
|
||||
</copy>
|
||||
</target>
|
||||
<target name="-post-compile-test">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target depends="init,compile,-pre-pre-compile-test,-pre-compile-test,-do-compile-test,-post-compile-test" name="compile-test"/>
|
||||
<target name="-pre-compile-test-single">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single" if="have.tests" name="-do-compile-test-single">
|
||||
<fail unless="javac.includes">Must select some files in the IDE or set javac.includes</fail>
|
||||
<j2seproject3:force-recompile destdir="${build.test.classes.dir}"/>
|
||||
<j2seproject3:javac classpath="${javac.test.classpath}" debug="true" destdir="${build.test.classes.dir}" excludes="" includes="${javac.includes}" sourcepath="${test.src.dir}" srcdir="${test.src.dir}"/>
|
||||
<copy todir="${build.test.classes.dir}">
|
||||
<fileset dir="${test.src.dir}" excludes="${build.classes.excludes},${excludes}" includes="${includes}"/>
|
||||
</copy>
|
||||
</target>
|
||||
<target name="-post-compile-test-single">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target depends="init,compile,-pre-pre-compile-test,-pre-compile-test-single,-do-compile-test-single,-post-compile-test-single" name="compile-test-single"/>
|
||||
<!--
|
||||
=======================
|
||||
JUNIT EXECUTION SECTION
|
||||
=======================
|
||||
-->
|
||||
<target depends="init" if="have.tests" name="-pre-test-run">
|
||||
<mkdir dir="${build.test.results.dir}"/>
|
||||
</target>
|
||||
<target depends="init,compile-test,-pre-test-run" if="have.tests" name="-do-test-run">
|
||||
<j2seproject3:junit testincludes="**/*Test.java"/>
|
||||
</target>
|
||||
<target depends="init,compile-test,-pre-test-run,-do-test-run" if="have.tests" name="-post-test-run">
|
||||
<fail if="tests.failed">Some tests failed; see details above.</fail>
|
||||
</target>
|
||||
<target depends="init" if="have.tests" name="test-report"/>
|
||||
<target depends="init" if="netbeans.home+have.tests" name="-test-browse"/>
|
||||
<target depends="init,compile-test,-pre-test-run,-do-test-run,test-report,-post-test-run,-test-browse" description="Run unit tests." name="test"/>
|
||||
<target depends="init" if="have.tests" name="-pre-test-run-single">
|
||||
<mkdir dir="${build.test.results.dir}"/>
|
||||
</target>
|
||||
<target depends="init,compile-test-single,-pre-test-run-single" if="have.tests" name="-do-test-run-single">
|
||||
<fail unless="test.includes">Must select some files in the IDE or set test.includes</fail>
|
||||
<j2seproject3:junit excludes="" includes="${test.includes}"/>
|
||||
</target>
|
||||
<target depends="init,compile-test-single,-pre-test-run-single,-do-test-run-single" if="have.tests" name="-post-test-run-single">
|
||||
<fail if="tests.failed">Some tests failed; see details above.</fail>
|
||||
</target>
|
||||
<target depends="init,-do-not-recompile,compile-test-single,-pre-test-run-single,-do-test-run-single,-post-test-run-single" description="Run single unit test." name="test-single"/>
|
||||
<!--
|
||||
=======================
|
||||
JUNIT DEBUGGING SECTION
|
||||
=======================
|
||||
-->
|
||||
<target depends="init,compile-test" if="have.tests" name="-debug-start-debuggee-test">
|
||||
<fail unless="test.class">Must select one file in the IDE or set test.class</fail>
|
||||
<property location="${build.test.results.dir}/TEST-${test.class}.xml" name="test.report.file"/>
|
||||
<delete file="${test.report.file}"/>
|
||||
<mkdir dir="${build.test.results.dir}"/>
|
||||
<j2seproject3:debug classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner" classpath="${ant.home}/lib/ant.jar:${ant.home}/lib/ant-junit.jar:${debug.test.classpath}">
|
||||
<customize>
|
||||
<syspropertyset>
|
||||
<propertyref prefix="test-sys-prop."/>
|
||||
<mapper from="test-sys-prop.*" to="*" type="glob"/>
|
||||
</syspropertyset>
|
||||
<arg value="${test.class}"/>
|
||||
<arg value="showoutput=true"/>
|
||||
<arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.BriefJUnitResultFormatter"/>
|
||||
<arg value="formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter,${test.report.file}"/>
|
||||
</customize>
|
||||
</j2seproject3:debug>
|
||||
</target>
|
||||
<target depends="init,compile-test" if="netbeans.home+have.tests" name="-debug-start-debugger-test">
|
||||
<j2seproject1:nbjpdastart classpath="${debug.test.classpath}" name="${test.class}"/>
|
||||
</target>
|
||||
<target depends="init,-do-not-recompile,compile-test-single,-debug-start-debugger-test,-debug-start-debuggee-test" name="debug-test"/>
|
||||
<target depends="init,-pre-debug-fix,compile-test-single" if="netbeans.home" name="-do-debug-fix-test">
|
||||
<j2seproject1:nbjpdareload dir="${build.test.classes.dir}"/>
|
||||
</target>
|
||||
<target depends="init,-pre-debug-fix,-do-debug-fix-test" if="netbeans.home" name="debug-fix-test"/>
|
||||
<!--
|
||||
=========================
|
||||
APPLET EXECUTION SECTION
|
||||
=========================
|
||||
-->
|
||||
<target depends="init,compile-single" name="run-applet">
|
||||
<fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
|
||||
<j2seproject1:java classname="sun.applet.AppletViewer">
|
||||
<customize>
|
||||
<arg value="${applet.url}"/>
|
||||
</customize>
|
||||
</j2seproject1:java>
|
||||
</target>
|
||||
<!--
|
||||
=========================
|
||||
APPLET DEBUGGING SECTION
|
||||
=========================
|
||||
-->
|
||||
<target depends="init,compile-single" if="netbeans.home" name="-debug-start-debuggee-applet">
|
||||
<fail unless="applet.url">Must select one file in the IDE or set applet.url</fail>
|
||||
<j2seproject3:debug classname="sun.applet.AppletViewer">
|
||||
<customize>
|
||||
<arg value="${applet.url}"/>
|
||||
</customize>
|
||||
</j2seproject3:debug>
|
||||
</target>
|
||||
<target depends="init,compile-single,-debug-start-debugger,-debug-start-debuggee-applet" if="netbeans.home" name="debug-applet"/>
|
||||
<!--
|
||||
===============
|
||||
CLEANUP SECTION
|
||||
===============
|
||||
-->
|
||||
<target depends="init" name="deps-clean" unless="no.deps"/>
|
||||
<target depends="init" name="-do-clean">
|
||||
<delete dir="${build.dir}"/>
|
||||
<delete dir="${dist.dir}"/>
|
||||
</target>
|
||||
<target name="-post-clean">
|
||||
<!-- Empty placeholder for easier customization. -->
|
||||
<!-- You can override this target in the ../build.xml file. -->
|
||||
</target>
|
||||
<target depends="init,deps-clean,-do-clean,-post-clean" description="Clean build products." name="clean"/>
|
||||
</project>
|
8
apps/desktopgui/nbproject/genfiles.properties
Normal file
8
apps/desktopgui/nbproject/genfiles.properties
Normal file
@ -0,0 +1,8 @@
|
||||
build.xml.data.CRC32=c4b345cd
|
||||
build.xml.script.CRC32=9785bb9a
|
||||
build.xml.stylesheet.CRC32=be360661
|
||||
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
|
||||
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
|
||||
nbproject/build-impl.xml.data.CRC32=c4b345cd
|
||||
nbproject/build-impl.xml.script.CRC32=74d3fda2
|
||||
nbproject/build-impl.xml.stylesheet.CRC32=487672f9
|
77
apps/desktopgui/nbproject/project.properties
Normal file
77
apps/desktopgui/nbproject/project.properties
Normal 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=desktopgui.Main
|
||||
manifest.file=manifest.mf
|
||||
meta.inf.dir=${src.dir}/META-INF
|
||||
platform.active=default_platform
|
||||
run.classpath=\
|
||||
${javac.classpath}:\
|
||||
${build.classes.dir}
|
||||
# Space-separated list of JVM arguments used when running the project
|
||||
# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
|
||||
# or test-sys-prop.name=value to set system properties for unit tests):
|
||||
run.jvmargs=
|
||||
run.test.classpath=\
|
||||
${javac.test.classpath}:\
|
||||
${build.test.classes.dir}
|
||||
source.encoding=UTF-8
|
||||
src.dir=src
|
||||
test.src.dir=test
|
19
apps/desktopgui/nbproject/project.xml
Normal file
19
apps/desktopgui/nbproject/project.xml
Normal file
@ -0,0 +1,19 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://www.netbeans.org/ns/project/1">
|
||||
<type>org.netbeans.modules.java.j2seproject</type>
|
||||
<configuration>
|
||||
<data xmlns="http://www.netbeans.org/ns/j2se-project/3">
|
||||
<name>desktopgui</name>
|
||||
<minimum-ant-version>1.6.5</minimum-ant-version>
|
||||
<source-roots>
|
||||
<root id="src.dir"/>
|
||||
</source-roots>
|
||||
<test-roots>
|
||||
<root id="test.src.dir"/>
|
||||
</test-roots>
|
||||
</data>
|
||||
<swingapp xmlns="http://www.netbeans.org/ns/form-swingapp/1">
|
||||
<application-class name="desktopgui.Main"/>
|
||||
</swingapp>
|
||||
</configuration>
|
||||
</project>
|
@ -0,0 +1 @@
|
||||
desktopgui.Main
|
14
apps/desktopgui/src/desktopgui/GUIVersion.java
Normal file
14
apps/desktopgui/src/desktopgui/GUIVersion.java
Normal file
@ -0,0 +1,14 @@
|
||||
/*
|
||||
* To change this template, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
package desktopgui;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author mathias
|
||||
*/
|
||||
public class GUIVersion {
|
||||
public static final String VERSION = "0.0.1.1";
|
||||
}
|
109
apps/desktopgui/src/desktopgui/Main.java
Normal file
109
apps/desktopgui/src/desktopgui/Main.java
Normal file
@ -0,0 +1,109 @@
|
||||
package desktopgui;
|
||||
|
||||
/*
|
||||
* Main.java
|
||||
*/
|
||||
|
||||
|
||||
|
||||
import gui.Tray;
|
||||
import 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 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";
|
||||
}
|
11
apps/desktopgui/src/desktopgui/resources/Main.properties
Normal file
11
apps/desktopgui/src/desktopgui/resources/Main.properties
Normal 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
|
@ -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
|
517
apps/desktopgui/src/gui/GeneralConfiguration.form
Normal file
517
apps/desktopgui/src/gui/GeneralConfiguration.form
Normal file
@ -0,0 +1,517 @@
|
||||
<?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="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_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="jPanel1" alignment="0" max="32767" attributes="0"/>
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace min="12" pref="12" max="12" attributes="0"/>
|
||||
<Component id="jTabbedPane1" 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="jTabbedPane1" max="32767" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="jPanel1" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
</Layout>
|
||||
<SubComponents>
|
||||
<Container class="javax.swing.JPanel" name="jPanel1">
|
||||
<Properties>
|
||||
<Property name="name" type="java.lang.String" value="jPanel1" 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="jTabbedPane1">
|
||||
<Properties>
|
||||
<Property name="name" type="java.lang.String" value="jTabbedPane1" noResource="true"/>
|
||||
</Properties>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout"/>
|
||||
<SubComponents>
|
||||
<Container class="javax.swing.JPanel" name="jPanel2">
|
||||
<Properties>
|
||||
<Property name="name" type="java.lang.String" value="jPanel2" 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="jPanel2.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="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="20" y="20" width="140" height="30"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="jLabel2">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" resourceKey="jLabel2.text"/>
|
||||
<Property name="name" type="java.lang.String" value="jLabel2" 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="jTextField1">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" resourceKey="jTextField1.text"/>
|
||||
<Property name="name" type="java.lang.String" value="jTextField1" 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="20" width="-1" height="-1"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
</Component>
|
||||
<Component class="javax.swing.JTextField" name="jTextField2">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" resourceKey="jTextField2.text"/>
|
||||
<Property name="name" type="java.lang.String" value="jTextField2" 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="60" width="-1" height="-1"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
</Component>
|
||||
<Component class="javax.swing.JComboBox" name="jComboBox1">
|
||||
<Properties>
|
||||
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
|
||||
<StringArray count="4">
|
||||
<StringItem index="0" value="Item 1"/>
|
||||
<StringItem index="1" value="Item 2"/>
|
||||
<StringItem index="2" value="Item 3"/>
|
||||
<StringItem index="3" value="Item 4"/>
|
||||
</StringArray>
|
||||
</Property>
|
||||
<Property name="name" type="java.lang.String" value="jComboBox1" 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="20" width="-1" height="-1"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
</Component>
|
||||
<Component class="javax.swing.JComboBox" name="jComboBox2">
|
||||
<Properties>
|
||||
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
|
||||
<StringArray count="4">
|
||||
<StringItem index="0" value="Item 1"/>
|
||||
<StringItem index="1" value="Item 2"/>
|
||||
<StringItem index="2" value="Item 3"/>
|
||||
<StringItem index="3" value="Item 4"/>
|
||||
</StringArray>
|
||||
</Property>
|
||||
<Property name="name" type="java.lang.String" value="jComboBox2" 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="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="jTextField3">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" resourceKey="jTextField3.text"/>
|
||||
<Property name="name" type="java.lang.String" value="jTextField3" noResource="true"/>
|
||||
</Properties>
|
||||
<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="jTextField4">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" resourceKey="jTextField4.text"/>
|
||||
<Property name="name" type="java.lang.String" value="jTextField4" noResource="true"/>
|
||||
</Properties>
|
||||
<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="jPanel3">
|
||||
<Properties>
|
||||
<Property name="name" type="java.lang.String" value="jPanel3" 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="jPanel3.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="jLabel8" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Component id="jToggleButton1" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||
<Component id="jToggleButton2" 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="jRadioButton2" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="jRadioButton1" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="jRadioButton3" 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="jToggleButton3" 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="jLabel8" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace type="unrelated" max="-2" attributes="0"/>
|
||||
<Component id="jRadioButton1" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="jRadioButton2" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="jRadioButton3" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="3" attributes="0">
|
||||
<Component id="jToggleButton1" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="jToggleButton2" alignment="3" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace pref="181" max="32767" attributes="0"/>
|
||||
<Component id="jToggleButton3" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
</Layout>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JLabel" name="jLabel8">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" resourceKey="jLabel8.text"/>
|
||||
<Property name="name" type="java.lang.String" value="jLabel8" noResource="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JRadioButton" name="jRadioButton1">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" resourceKey="jRadioButton1.text"/>
|
||||
<Property name="name" type="java.lang.String" value="jRadioButton1" noResource="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JRadioButton" name="jRadioButton2">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" resourceKey="jRadioButton2.text"/>
|
||||
<Property name="name" type="java.lang.String" value="jRadioButton2" noResource="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JRadioButton" name="jRadioButton3">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" resourceKey="jRadioButton3.text"/>
|
||||
<Property name="name" type="java.lang.String" value="jRadioButton3" noResource="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JToggleButton" name="jToggleButton1">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" resourceKey="jToggleButton1.text"/>
|
||||
<Property name="name" type="java.lang.String" value="jToggleButton1" noResource="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JToggleButton" name="jToggleButton2">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" resourceKey="jToggleButton2.text"/>
|
||||
<Property name="name" type="java.lang.String" value="jToggleButton2" noResource="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JToggleButton" name="jToggleButton3">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" resourceKey="jToggleButton3.text"/>
|
||||
<Property name="name" type="java.lang.String" value="jToggleButton3" noResource="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
<Container class="javax.swing.JPanel" name="jPanel4">
|
||||
<Properties>
|
||||
<Property name="name" type="java.lang.String" value="jPanel4" 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="jPanel4.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="jScrollPane2" alignment="1" pref="538" max="32767" attributes="0"/>
|
||||
<Component id="jLabel9" alignment="0" pref="538" max="32767" attributes="0"/>
|
||||
<Component id="jLabel10" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="jScrollPane1" alignment="0" pref="538" max="32767" attributes="0"/>
|
||||
<Component id="jLabel11" 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="jLabel10" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||
<Component id="jScrollPane1" pref="119" max="32767" attributes="0"/>
|
||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||
<Component id="jLabel11" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||
<Component id="jScrollPane2" pref="122" max="32767" attributes="0"/>
|
||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||
<Component id="jLabel9" min="-2" pref="65" max="-2" attributes="0"/>
|
||||
<EmptySpace min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
</Layout>
|
||||
<SubComponents>
|
||||
<Container class="javax.swing.JScrollPane" name="jScrollPane1">
|
||||
<Properties>
|
||||
<Property name="name" type="java.lang.String" value="jScrollPane1" noResource="true"/>
|
||||
</Properties>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||
</Container>
|
||||
<Container class="javax.swing.JScrollPane" name="jScrollPane2">
|
||||
<Properties>
|
||||
<Property name="name" type="java.lang.String" value="jScrollPane2" noResource="true"/>
|
||||
</Properties>
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||
</Container>
|
||||
<Component class="javax.swing.JLabel" name="jLabel9">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" resourceKey="jLabel9.text"/>
|
||||
<Property name="name" type="java.lang.String" value="jLabel9" noResource="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="jLabel10">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" resourceKey="jLabel10.text"/>
|
||||
<Property name="name" type="java.lang.String" value="jLabel10" noResource="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="jLabel11">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" resourceKey="jLabel11.text"/>
|
||||
<Property name="name" type="java.lang.String" value="jLabel11" noResource="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Container>
|
||||
<Container class="javax.swing.JPanel" name="jPanel5">
|
||||
<Properties>
|
||||
<Property name="name" type="java.lang.String" value="jPanel5" 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="jPanel5.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="jPanel6">
|
||||
<Properties>
|
||||
<Property name="name" type="java.lang.String" value="jPanel6" 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="jPanel6.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>
|
376
apps/desktopgui/src/gui/GeneralConfiguration.java
Normal file
376
apps/desktopgui/src/gui/GeneralConfiguration.java
Normal file
@ -0,0 +1,376 @@
|
||||
/*
|
||||
* GeneralConfiguration.java
|
||||
*
|
||||
* Created on 10 april 2009, 19:04
|
||||
*/
|
||||
|
||||
package gui;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author mathias
|
||||
*/
|
||||
public class GeneralConfiguration extends javax.swing.JFrame {
|
||||
|
||||
/** Creates new form GeneralConfiguration */
|
||||
public GeneralConfiguration() {
|
||||
initComponents();
|
||||
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
|
||||
this.setVisible(true);
|
||||
}
|
||||
|
||||
/** This method is called from within the constructor to
|
||||
* initialize the form.
|
||||
* WARNING: Do NOT modify this code. The content of this method is
|
||||
* always regenerated by the Form Editor.
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
|
||||
private void initComponents() {
|
||||
|
||||
jPanel1 = new javax.swing.JPanel();
|
||||
cancel = new javax.swing.JToggleButton();
|
||||
ok = new javax.swing.JToggleButton();
|
||||
jTabbedPane1 = new javax.swing.JTabbedPane();
|
||||
jPanel2 = new javax.swing.JPanel();
|
||||
jLabel1 = new javax.swing.JLabel();
|
||||
jLabel2 = new javax.swing.JLabel();
|
||||
jTextField1 = new javax.swing.JTextField();
|
||||
jTextField2 = new javax.swing.JTextField();
|
||||
jComboBox1 = new javax.swing.JComboBox();
|
||||
jComboBox2 = new javax.swing.JComboBox();
|
||||
jLabel3 = new javax.swing.JLabel();
|
||||
jLabel4 = new javax.swing.JLabel();
|
||||
jTextField3 = new javax.swing.JTextField();
|
||||
jTextField4 = new javax.swing.JTextField();
|
||||
jLabel5 = new javax.swing.JLabel();
|
||||
jLabel6 = new javax.swing.JLabel();
|
||||
jLabel7 = new javax.swing.JLabel();
|
||||
jPanel3 = new javax.swing.JPanel();
|
||||
jLabel8 = new javax.swing.JLabel();
|
||||
jRadioButton1 = new javax.swing.JRadioButton();
|
||||
jRadioButton2 = new javax.swing.JRadioButton();
|
||||
jRadioButton3 = new javax.swing.JRadioButton();
|
||||
jToggleButton1 = new javax.swing.JToggleButton();
|
||||
jToggleButton2 = new javax.swing.JToggleButton();
|
||||
jToggleButton3 = new javax.swing.JToggleButton();
|
||||
jPanel4 = new javax.swing.JPanel();
|
||||
jScrollPane1 = new javax.swing.JScrollPane();
|
||||
jScrollPane2 = new javax.swing.JScrollPane();
|
||||
jLabel9 = new javax.swing.JLabel();
|
||||
jLabel10 = new javax.swing.JLabel();
|
||||
jLabel11 = new javax.swing.JLabel();
|
||||
jPanel5 = new javax.swing.JPanel();
|
||||
jPanel6 = new javax.swing.JPanel();
|
||||
|
||||
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
|
||||
setName("Form"); // NOI18N
|
||||
|
||||
jPanel1.setName("jPanel1"); // NOI18N
|
||||
|
||||
org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(desktopgui.Main.class).getContext().getResourceMap(GeneralConfiguration.class);
|
||||
cancel.setText(resourceMap.getString("cancel.text")); // NOI18N
|
||||
cancel.setName("cancel"); // NOI18N
|
||||
|
||||
ok.setText(resourceMap.getString("ok.text")); // NOI18N
|
||||
ok.setName("ok"); // NOI18N
|
||||
|
||||
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
|
||||
jPanel1.setLayout(jPanel1Layout);
|
||||
jPanel1Layout.setHorizontalGroup(
|
||||
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
|
||||
.addContainerGap(475, Short.MAX_VALUE)
|
||||
.addComponent(ok)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(cancel)
|
||||
.addContainerGap())
|
||||
);
|
||||
jPanel1Layout.setVerticalGroup(
|
||||
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(jPanel1Layout.createSequentialGroup()
|
||||
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(cancel)
|
||||
.addComponent(ok))
|
||||
.addContainerGap(14, Short.MAX_VALUE))
|
||||
);
|
||||
|
||||
jTabbedPane1.setName("jTabbedPane1"); // NOI18N
|
||||
|
||||
jPanel2.setName("jPanel2"); // NOI18N
|
||||
jPanel2.setLayout(null);
|
||||
|
||||
jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N
|
||||
jLabel1.setName("jLabel1"); // NOI18N
|
||||
jPanel2.add(jLabel1);
|
||||
jLabel1.setBounds(20, 20, 140, 30);
|
||||
|
||||
jLabel2.setText(resourceMap.getString("jLabel2.text")); // NOI18N
|
||||
jLabel2.setName("jLabel2"); // NOI18N
|
||||
jPanel2.add(jLabel2);
|
||||
jLabel2.setBounds(20, 60, 140, 30);
|
||||
|
||||
jTextField1.setText(resourceMap.getString("jTextField1.text")); // NOI18N
|
||||
jTextField1.setName("jTextField1"); // NOI18N
|
||||
jPanel2.add(jTextField1);
|
||||
jTextField1.setBounds(160, 20, 77, 27);
|
||||
|
||||
jTextField2.setText(resourceMap.getString("jTextField2.text")); // NOI18N
|
||||
jTextField2.setName("jTextField2"); // NOI18N
|
||||
jPanel2.add(jTextField2);
|
||||
jTextField2.setBounds(160, 60, 77, 27);
|
||||
|
||||
jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
|
||||
jComboBox1.setName("jComboBox1"); // NOI18N
|
||||
jPanel2.add(jComboBox1);
|
||||
jComboBox1.setBounds(240, 20, 78, 27);
|
||||
|
||||
jComboBox2.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));
|
||||
jComboBox2.setName("jComboBox2"); // NOI18N
|
||||
jPanel2.add(jComboBox2);
|
||||
jComboBox2.setBounds(240, 60, 78, 27);
|
||||
|
||||
jLabel3.setText(resourceMap.getString("jLabel3.text")); // NOI18N
|
||||
jLabel3.setName("jLabel3"); // NOI18N
|
||||
jPanel2.add(jLabel3);
|
||||
jLabel3.setBounds(330, 20, 97, 30);
|
||||
|
||||
jLabel4.setText(resourceMap.getString("jLabel4.text")); // NOI18N
|
||||
jLabel4.setName("jLabel4"); // NOI18N
|
||||
jPanel2.add(jLabel4);
|
||||
jLabel4.setBounds(330, 60, 97, 30);
|
||||
|
||||
jTextField3.setText(resourceMap.getString("jTextField3.text")); // NOI18N
|
||||
jTextField3.setName("jTextField3"); // NOI18N
|
||||
jPanel2.add(jTextField3);
|
||||
jTextField3.setBounds(440, 20, 60, 27);
|
||||
|
||||
jTextField4.setText(resourceMap.getString("jTextField4.text")); // NOI18N
|
||||
jTextField4.setName("jTextField4"); // NOI18N
|
||||
jPanel2.add(jTextField4);
|
||||
jTextField4.setBounds(440, 60, 60, 27);
|
||||
|
||||
jLabel5.setText(resourceMap.getString("jLabel5.text")); // NOI18N
|
||||
jLabel5.setName("jLabel5"); // NOI18N
|
||||
jPanel2.add(jLabel5);
|
||||
jLabel5.setBounds(510, 20, 19, 30);
|
||||
|
||||
jLabel6.setText(resourceMap.getString("jLabel6.text")); // NOI18N
|
||||
jLabel6.setName("jLabel6"); // NOI18N
|
||||
jPanel2.add(jLabel6);
|
||||
jLabel6.setBounds(510, 60, 19, 30);
|
||||
|
||||
jLabel7.setText(resourceMap.getString("jLabel7.text")); // NOI18N
|
||||
jLabel7.setName("jLabel7"); // NOI18N
|
||||
jPanel2.add(jLabel7);
|
||||
jLabel7.setBounds(20, 100, 520, 70);
|
||||
|
||||
jTabbedPane1.addTab(resourceMap.getString("jPanel2.TabConstraints.tabTitle"), jPanel2); // NOI18N
|
||||
|
||||
jPanel3.setName("jPanel3"); // NOI18N
|
||||
|
||||
jLabel8.setText(resourceMap.getString("jLabel8.text")); // NOI18N
|
||||
jLabel8.setName("jLabel8"); // NOI18N
|
||||
|
||||
jRadioButton1.setText(resourceMap.getString("jRadioButton1.text")); // NOI18N
|
||||
jRadioButton1.setName("jRadioButton1"); // NOI18N
|
||||
|
||||
jRadioButton2.setText(resourceMap.getString("jRadioButton2.text")); // NOI18N
|
||||
jRadioButton2.setName("jRadioButton2"); // NOI18N
|
||||
|
||||
jRadioButton3.setText(resourceMap.getString("jRadioButton3.text")); // NOI18N
|
||||
jRadioButton3.setName("jRadioButton3"); // NOI18N
|
||||
|
||||
jToggleButton1.setText(resourceMap.getString("jToggleButton1.text")); // NOI18N
|
||||
jToggleButton1.setName("jToggleButton1"); // NOI18N
|
||||
|
||||
jToggleButton2.setText(resourceMap.getString("jToggleButton2.text")); // NOI18N
|
||||
jToggleButton2.setName("jToggleButton2"); // NOI18N
|
||||
|
||||
jToggleButton3.setText(resourceMap.getString("jToggleButton3.text")); // NOI18N
|
||||
jToggleButton3.setName("jToggleButton3"); // NOI18N
|
||||
|
||||
javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
|
||||
jPanel3.setLayout(jPanel3Layout);
|
||||
jPanel3Layout.setHorizontalGroup(
|
||||
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(jPanel3Layout.createSequentialGroup()
|
||||
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(jPanel3Layout.createSequentialGroup()
|
||||
.addGap(20, 20, 20)
|
||||
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(jLabel8)
|
||||
.addGroup(jPanel3Layout.createSequentialGroup()
|
||||
.addComponent(jToggleButton1)
|
||||
.addGap(18, 18, 18)
|
||||
.addComponent(jToggleButton2))))
|
||||
.addGroup(jPanel3Layout.createSequentialGroup()
|
||||
.addGap(40, 40, 40)
|
||||
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(jRadioButton2)
|
||||
.addComponent(jRadioButton1)
|
||||
.addComponent(jRadioButton3))))
|
||||
.addGap(9, 9, 9))
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup()
|
||||
.addContainerGap(339, Short.MAX_VALUE)
|
||||
.addComponent(jToggleButton3)
|
||||
.addContainerGap())
|
||||
);
|
||||
jPanel3Layout.setVerticalGroup(
|
||||
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(jPanel3Layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(jLabel8)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
|
||||
.addComponent(jRadioButton1)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(jRadioButton2)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(jRadioButton3)
|
||||
.addGap(18, 18, 18)
|
||||
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
|
||||
.addComponent(jToggleButton1)
|
||||
.addComponent(jToggleButton2))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 181, Short.MAX_VALUE)
|
||||
.addComponent(jToggleButton3)
|
||||
.addContainerGap())
|
||||
);
|
||||
|
||||
jTabbedPane1.addTab(resourceMap.getString("jPanel3.TabConstraints.tabTitle"), jPanel3); // NOI18N
|
||||
|
||||
jPanel4.setName("jPanel4"); // NOI18N
|
||||
|
||||
jScrollPane1.setName("jScrollPane1"); // NOI18N
|
||||
|
||||
jScrollPane2.setName("jScrollPane2"); // NOI18N
|
||||
|
||||
jLabel9.setText(resourceMap.getString("jLabel9.text")); // NOI18N
|
||||
jLabel9.setName("jLabel9"); // NOI18N
|
||||
|
||||
jLabel10.setText(resourceMap.getString("jLabel10.text")); // NOI18N
|
||||
jLabel10.setName("jLabel10"); // NOI18N
|
||||
|
||||
jLabel11.setText(resourceMap.getString("jLabel11.text")); // NOI18N
|
||||
jLabel11.setName("jLabel11"); // NOI18N
|
||||
|
||||
javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
|
||||
jPanel4.setLayout(jPanel4Layout);
|
||||
jPanel4Layout.setHorizontalGroup(
|
||||
jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(jPanel4Layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(jScrollPane2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE)
|
||||
.addComponent(jLabel9, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE)
|
||||
.addComponent(jLabel10)
|
||||
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE)
|
||||
.addComponent(jLabel11))
|
||||
.addContainerGap())
|
||||
);
|
||||
jPanel4Layout.setVerticalGroup(
|
||||
jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(jPanel4Layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addComponent(jLabel10)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 119, Short.MAX_VALUE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(jLabel11)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 122, Short.MAX_VALUE)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(jLabel9, javax.swing.GroupLayout.PREFERRED_SIZE, 65, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addContainerGap())
|
||||
);
|
||||
|
||||
jTabbedPane1.addTab(resourceMap.getString("jPanel4.TabConstraints.tabTitle"), jPanel4); // NOI18N
|
||||
|
||||
jPanel5.setName("jPanel5"); // NOI18N
|
||||
|
||||
javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5);
|
||||
jPanel5.setLayout(jPanel5Layout);
|
||||
jPanel5Layout.setHorizontalGroup(
|
||||
jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGap(0, 562, Short.MAX_VALUE)
|
||||
);
|
||||
jPanel5Layout.setVerticalGroup(
|
||||
jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGap(0, 388, Short.MAX_VALUE)
|
||||
);
|
||||
|
||||
jTabbedPane1.addTab(resourceMap.getString("jPanel5.TabConstraints.tabTitle"), jPanel5); // NOI18N
|
||||
|
||||
jPanel6.setName("jPanel6"); // NOI18N
|
||||
|
||||
javax.swing.GroupLayout jPanel6Layout = new javax.swing.GroupLayout(jPanel6);
|
||||
jPanel6.setLayout(jPanel6Layout);
|
||||
jPanel6Layout.setHorizontalGroup(
|
||||
jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGap(0, 562, Short.MAX_VALUE)
|
||||
);
|
||||
jPanel6Layout.setVerticalGroup(
|
||||
jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGap(0, 388, Short.MAX_VALUE)
|
||||
);
|
||||
|
||||
jTabbedPane1.addTab(resourceMap.getString("jPanel6.TabConstraints.tabTitle"), jPanel6); // NOI18N
|
||||
|
||||
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
|
||||
getContentPane().setLayout(layout);
|
||||
layout.setHorizontalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addGap(12, 12, 12)
|
||||
.addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 566, Short.MAX_VALUE))
|
||||
);
|
||||
layout.setVerticalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
||||
.addComponent(jTabbedPane1)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||
);
|
||||
|
||||
pack();
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JToggleButton cancel;
|
||||
private javax.swing.JComboBox jComboBox1;
|
||||
private javax.swing.JComboBox jComboBox2;
|
||||
private javax.swing.JLabel jLabel1;
|
||||
private javax.swing.JLabel jLabel10;
|
||||
private javax.swing.JLabel jLabel11;
|
||||
private javax.swing.JLabel jLabel2;
|
||||
private javax.swing.JLabel jLabel3;
|
||||
private javax.swing.JLabel jLabel4;
|
||||
private javax.swing.JLabel jLabel5;
|
||||
private javax.swing.JLabel jLabel6;
|
||||
private javax.swing.JLabel jLabel7;
|
||||
private javax.swing.JLabel jLabel8;
|
||||
private javax.swing.JLabel jLabel9;
|
||||
private javax.swing.JPanel jPanel1;
|
||||
private javax.swing.JPanel jPanel2;
|
||||
private javax.swing.JPanel jPanel3;
|
||||
private javax.swing.JPanel jPanel4;
|
||||
private javax.swing.JPanel jPanel5;
|
||||
private javax.swing.JPanel jPanel6;
|
||||
private javax.swing.JRadioButton jRadioButton1;
|
||||
private javax.swing.JRadioButton jRadioButton2;
|
||||
private javax.swing.JRadioButton jRadioButton3;
|
||||
private javax.swing.JScrollPane jScrollPane1;
|
||||
private javax.swing.JScrollPane jScrollPane2;
|
||||
private javax.swing.JTabbedPane jTabbedPane1;
|
||||
private javax.swing.JTextField jTextField1;
|
||||
private javax.swing.JTextField jTextField2;
|
||||
private javax.swing.JTextField jTextField3;
|
||||
private javax.swing.JTextField jTextField4;
|
||||
private javax.swing.JToggleButton jToggleButton1;
|
||||
private javax.swing.JToggleButton jToggleButton2;
|
||||
private javax.swing.JToggleButton jToggleButton3;
|
||||
private javax.swing.JToggleButton ok;
|
||||
// End of variables declaration//GEN-END:variables
|
||||
|
||||
}
|
176
apps/desktopgui/src/gui/JPopupTrayIcon.java
Normal file
176
apps/desktopgui/src/gui/JPopupTrayIcon.java
Normal file
@ -0,0 +1,176 @@
|
||||
/*
|
||||
* 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 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.JFrame;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JPopupMenu;
|
||||
import javax.swing.JWindow;
|
||||
import javax.swing.RootPaneContainer;
|
||||
import javax.swing.event.PopupMenuEvent;
|
||||
import javax.swing.event.PopupMenuListener;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 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");
|
||||
|
||||
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(e.getPoint());
|
||||
showJPopupMenu(e);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseReleased(MouseEvent e) {
|
||||
// System.out.println(e.getPoint());
|
||||
showJPopupMenu(e);
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
private final void showJPopupMenu(MouseEvent e) {
|
||||
if(e.isPopupTrigger() && 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);
|
||||
}
|
||||
|
||||
}
|
101
apps/desktopgui/src/gui/LogViewer.form
Normal file
101
apps/desktopgui/src/gui/LogViewer.form
Normal file
@ -0,0 +1,101 @@
|
||||
<?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="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_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>
|
163
apps/desktopgui/src/gui/LogViewer.java
Normal file
163
apps/desktopgui/src/gui/LogViewer.java
Normal file
@ -0,0 +1,163 @@
|
||||
/*
|
||||
* LogViewer.java
|
||||
*
|
||||
* Created on 10 april 2009, 19:17
|
||||
*/
|
||||
|
||||
package 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);
|
||||
setName("Form"); // NOI18N
|
||||
|
||||
textScroll.setName("textScroll"); // NOI18N
|
||||
|
||||
logText.setColumns(20);
|
||||
logText.setRows(5);
|
||||
logText.setName("logText"); // NOI18N
|
||||
textScroll.setViewportView(logText);
|
||||
|
||||
org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(desktopgui.Main.class).getContext().getResourceMap(LogViewer.class);
|
||||
explanationText.setText(resourceMap.getString("explanationText.text")); // NOI18N
|
||||
explanationText.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";
|
||||
}
|
178
apps/desktopgui/src/gui/SpeedSelector.form
Normal file
178
apps/desktopgui/src/gui/SpeedSelector.form
Normal file
@ -0,0 +1,178 @@
|
||||
<?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_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>
|
195
apps/desktopgui/src/gui/SpeedSelector.java
Normal file
195
apps/desktopgui/src/gui/SpeedSelector.java
Normal file
@ -0,0 +1,195 @@
|
||||
/*
|
||||
* ProfileSelector.java
|
||||
*
|
||||
* Created on 3 april 2009, 13:57
|
||||
*/
|
||||
|
||||
package gui;
|
||||
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Point;
|
||||
import java.util.Properties;
|
||||
import javax.swing.JComboBox;
|
||||
import javax.swing.JTextField;
|
||||
import persistence.PropertyManager;
|
||||
import 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(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;
|
||||
}
|
117
apps/desktopgui/src/gui/SpeedSelector2.form
Normal file
117
apps/desktopgui/src/gui/SpeedSelector2.form
Normal file
@ -0,0 +1,117 @@
|
||||
<?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_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>
|
160
apps/desktopgui/src/gui/SpeedSelector2.java
Normal file
160
apps/desktopgui/src/gui/SpeedSelector2.java
Normal file
@ -0,0 +1,160 @@
|
||||
/*
|
||||
* ProfileSelector2.java
|
||||
*
|
||||
* Created on 3 april 2009, 14:36
|
||||
*/
|
||||
|
||||
package gui;
|
||||
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Point;
|
||||
import java.util.Enumeration;
|
||||
import java.util.Properties;
|
||||
import javax.swing.AbstractButton;
|
||||
import 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(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
|
||||
|
||||
}
|
337
apps/desktopgui/src/gui/SpeedSelector3.form
Normal file
337
apps/desktopgui/src/gui/SpeedSelector3.form
Normal file
@ -0,0 +1,337 @@
|
||||
<?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_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="-1" height="30"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="explanation">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" resourceKey="explanation.text"/>
|
||||
<Property name="name" type="java.lang.String" value="explanation" noResource="true"/>
|
||||
</Properties>
|
||||
<Constraints>
|
||||
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
|
||||
<AbsoluteConstraints x="20" y="180" width="600" height="70"/>
|
||||
</Constraint>
|
||||
</Constraints>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Form>
|
439
apps/desktopgui/src/gui/SpeedSelector3.java
Normal file
439
apps/desktopgui/src/gui/SpeedSelector3.java
Normal file
@ -0,0 +1,439 @@
|
||||
/*
|
||||
* ProfileSelector3.java
|
||||
*
|
||||
* Created on 3 april 2009, 15:17
|
||||
*/
|
||||
|
||||
package gui;
|
||||
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Point;
|
||||
import java.util.Properties;
|
||||
import javax.swing.JComboBox;
|
||||
import javax.swing.JTextField;
|
||||
import persistence.PropertyManager;
|
||||
import router.configuration.SpeedHandler;
|
||||
import 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(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, 19, 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;
|
||||
}
|
25
apps/desktopgui/src/gui/SpeedSelectorConstants.java
Normal file
25
apps/desktopgui/src/gui/SpeedSelectorConstants.java
Normal file
@ -0,0 +1,25 @@
|
||||
package gui;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author mathias
|
||||
*/
|
||||
public class SpeedSelectorConstants {
|
||||
///Maximum upload speed for the internet connection
|
||||
public static final String MAXUPLOADCAPABLE = "maxUploadCapable";
|
||||
///Maximum download speed for the internet connection
|
||||
public static final String MAXDOWNLOADCAPABLE = "maxDownloadCapable";
|
||||
|
||||
//User profile type: what behaviour does this user have while using IP2?
|
||||
public static final String USERTYPE = "userType";
|
||||
|
||||
//Maximum upload speed for I2P
|
||||
public static final String MAXUPLOAD = "maxUpload";
|
||||
//Maximum upload burst speed for I2P
|
||||
public static final String MAXUPLOADBURST = "maxUploadBurst";
|
||||
|
||||
//Maximum download speed for I2P
|
||||
public static final String MAXDOWNLOAD = "maxDownload";
|
||||
//Maximum download burst speed for I2P
|
||||
public static final String MAXDOWNLOADBURST = "maxDownloadBurst";
|
||||
}
|
228
apps/desktopgui/src/gui/Tray.java
Normal file
228
apps/desktopgui/src/gui/Tray.java
Normal file
@ -0,0 +1,228 @@
|
||||
/*
|
||||
* To change this template, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
package gui;
|
||||
|
||||
import 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 router.RouterHandler;
|
||||
import router.RouterHelper;
|
||||
import 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;
|
||||
|
||||
}
|
100
apps/desktopgui/src/gui/Version.form
Normal file
100
apps/desktopgui/src/gui/Version.form
Normal file
@ -0,0 +1,100 @@
|
||||
<?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="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_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 max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="1" max="-2" attributes="0">
|
||||
<Component id="I2Plabel" alignment="0" max="32767" attributes="0"/>
|
||||
<Component id="GUILabel" alignment="0" max="32767" attributes="1"/>
|
||||
</Group>
|
||||
<EmptySpace type="separate" max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="I2PVersion" pref="126" max="32767" attributes="0"/>
|
||||
<Component id="GUIVersion" pref="126" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="1" attributes="0">
|
||||
<EmptySpace pref="294" max="32767" attributes="0"/>
|
||||
<Component id="okButton" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
<DimensionLayout dim="1">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="I2Plabel" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="I2PVersion" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Component id="GUILabel" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="GUIVersion" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
<Component id="okButton" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
</Layout>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JButton" name="okButton">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" resourceKey="okButton.text"/>
|
||||
<Property name="name" type="java.lang.String" value="okButton" noResource="true"/>
|
||||
</Properties>
|
||||
<Events>
|
||||
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="okButtonActionPerformed"/>
|
||||
</Events>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="I2Plabel">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" resourceKey="I2Plabel.text"/>
|
||||
<Property name="name" type="java.lang.String" value="I2Plabel" noResource="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="GUILabel">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" resourceKey="GUILabel.text"/>
|
||||
<Property name="name" type="java.lang.String" value="GUILabel" noResource="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="I2PVersion">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" resourceKey="I2PVersion.text"/>
|
||||
<Property name="name" type="java.lang.String" value="I2PVersion" noResource="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
<Component class="javax.swing.JLabel" name="GUIVersion">
|
||||
<Properties>
|
||||
<Property name="text" type="java.lang.String" resourceKey="GUIVersion.text"/>
|
||||
<Property name="name" type="java.lang.String" value="GUIVersion" noResource="true"/>
|
||||
</Properties>
|
||||
</Component>
|
||||
</SubComponents>
|
||||
</Form>
|
123
apps/desktopgui/src/gui/Version.java
Normal file
123
apps/desktopgui/src/gui/Version.java
Normal file
@ -0,0 +1,123 @@
|
||||
/*
|
||||
* Version.java
|
||||
*
|
||||
* Created on 13 april 2009, 13:48
|
||||
*/
|
||||
|
||||
package gui;
|
||||
|
||||
import javax.swing.JFrame;
|
||||
import 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 = 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);
|
||||
setName("Form"); // NOI18N
|
||||
|
||||
org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(desktopgui.Main.class).getContext().getResourceMap(Version.class);
|
||||
okButton.setText(resourceMap.getString("okButton.text")); // NOI18N
|
||||
okButton.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.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))
|
||||
.addContainerGap())
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
||||
.addContainerGap(294, Short.MAX_VALUE)
|
||||
.addComponent(okButton)
|
||||
.addContainerGap())
|
||||
);
|
||||
layout.setVerticalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addContainerGap()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(I2Plabel)
|
||||
.addComponent(I2PVersion))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addComponent(GUILabel)
|
||||
.addComponent(GUIVersion))
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(okButton)
|
||||
.addContainerGap())
|
||||
);
|
||||
|
||||
pack();
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
private void okButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_okButtonActionPerformed
|
||||
this.dispose();
|
||||
}//GEN-LAST:event_okButtonActionPerformed
|
||||
|
||||
|
||||
// Variables declaration - do not modify//GEN-BEGIN:variables
|
||||
private javax.swing.JLabel GUILabel;
|
||||
private javax.swing.JLabel GUIVersion;
|
||||
private javax.swing.JLabel I2PVersion;
|
||||
private javax.swing.JLabel I2Plabel;
|
||||
private javax.swing.JButton okButton;
|
||||
// End of variables declaration//GEN-END:variables
|
||||
|
||||
}
|
@ -0,0 +1,29 @@
|
||||
|
||||
jPanel2.TabConstraints.tabTitle=Speed
|
||||
jPanel3.TabConstraints.tabTitle=Updates
|
||||
jPanel4.TabConstraints.tabTitle=Tunnels/Services
|
||||
jPanel5.TabConstraints.tabTitle=Network
|
||||
jPanel6.TabConstraints.tabTitle=Advanced
|
||||
cancel.text=Cancel
|
||||
ok.text=OK
|
||||
jLabel1.text=Upload speed:
|
||||
jLabel2.text=Download speed:
|
||||
jTextField1.text=jTextField1
|
||||
jTextField2.text=jTextField2
|
||||
jLabel3.text=Monthly usage:
|
||||
jLabel4.text=Monthly usage:
|
||||
jTextField3.text=jTextField3
|
||||
jTextField4.text=jTextField4
|
||||
jLabel5.text=GB
|
||||
jLabel6.text=GB
|
||||
jLabel7.text=Explanation ...
|
||||
jLabel8.text=What is your preferred automatic update setting?
|
||||
jRadioButton1.text=Only inform about updates
|
||||
jRadioButton2.text=Download and verify update file, do not restart
|
||||
jRadioButton3.text=Download, verify and restart
|
||||
jToggleButton1.text=Check for updates now
|
||||
jToggleButton2.text=Update available: update now
|
||||
jToggleButton3.text=Advanced update configuration
|
||||
jLabel9.text=Tunnel explanation
|
||||
jLabel10.text=Client tunnels:
|
||||
jLabel11.text=Server tunnels:
|
3
apps/desktopgui/src/gui/resources/LogViewer.properties
Normal file
3
apps/desktopgui/src/gui/resources/LogViewer.properties
Normal file
@ -0,0 +1,3 @@
|
||||
refreshButton.text=Refresh
|
||||
clearButton.text=Clear
|
||||
explanationText.text=Explanation ...
|
@ -0,0 +1,6 @@
|
||||
|
||||
Form.title=I2P Speed Configuration
|
||||
nextButton.text=Next
|
||||
uploadLabel.text=What is your maximum upload speed?
|
||||
downloadLabel.text=What is your maximum download speed?
|
||||
speedExplanation.text=<html>The maximum speed is set by your provider. It can be given in <b>kilobit (kbps)</b> or <b>kilobyte (kBps)</b>.<br />One kilobyte equals eight kilobit.</html>
|
@ -0,0 +1,9 @@
|
||||
returnButton.text=Previous
|
||||
Form.title=I2P Speed Configuration
|
||||
questionLabel.text=Which of these descriptions fits you best?
|
||||
browseButton.text=Browsing: I want to use I2P to browse websites anonymously, no heavy usage.
|
||||
downloadButton.text=Downloading: I want to use I2P for downloads and filesharing, heavy usage.
|
||||
nextButton.text=Next
|
||||
browseButton.actionCommand=Browsing
|
||||
downloadButton.actionCommand=Downloading
|
||||
jLabel1.text=<html>I2P can be used for many different purposes. Here, we present two possible descriptions. If you use a lot of bandwidth in I2P (for example using downloading), please check the <b>downloading</b> option. If your bandwidth usage is limited, please check the <b>browsing</b> option.</html>
|
17
apps/desktopgui/src/gui/resources/SpeedSelector3.properties
Normal file
17
apps/desktopgui/src/gui/resources/SpeedSelector3.properties
Normal 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=Monthly usage:
|
||||
downloadUsageLabel.text=Monthly usage:
|
||||
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>
|
5
apps/desktopgui/src/gui/resources/Version.properties
Normal file
5
apps/desktopgui/src/gui/resources/Version.properties
Normal file
@ -0,0 +1,5 @@
|
||||
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
|
72
apps/desktopgui/src/persistence/PropertyManager.java
Normal file
72
apps/desktopgui/src/persistence/PropertyManager.java
Normal file
@ -0,0 +1,72 @@
|
||||
package 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;
|
||||
}
|
38
apps/desktopgui/src/router/RouterHandler.java
Normal file
38
apps/desktopgui/src/router/RouterHandler.java
Normal file
@ -0,0 +1,38 @@
|
||||
/*
|
||||
* To change this template, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
|
||||
package 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();
|
||||
}
|
||||
}
|
||||
}
|
22
apps/desktopgui/src/router/RouterHelper.java
Normal file
22
apps/desktopgui/src/router/RouterHelper.java
Normal file
@ -0,0 +1,22 @@
|
||||
package 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);
|
||||
}
|
||||
}
|
165
apps/desktopgui/src/router/configuration/PeerHelper.java
Normal file
165
apps/desktopgui/src/router/configuration/PeerHelper.java
Normal file
@ -0,0 +1,165 @@
|
||||
package 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 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("UDP");
|
||||
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.autoip";
|
||||
public final static String PROP_I2NP_NTCP_AUTO_IP = "i2np.ntcp.autoport";
|
||||
}
|
34
apps/desktopgui/src/router/configuration/SpeedHandler.java
Normal file
34
apps/desktopgui/src/router/configuration/SpeedHandler.java
Normal file
@ -0,0 +1,34 @@
|
||||
package router.configuration;
|
||||
|
||||
import net.i2p.router.RouterContext;
|
||||
import net.i2p.router.transport.FIFOBandwidthRefiller;
|
||||
import 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();
|
||||
}
|
32
apps/desktopgui/src/router/configuration/SpeedHelper.java
Normal file
32
apps/desktopgui/src/router/configuration/SpeedHelper.java
Normal file
@ -0,0 +1,32 @@
|
||||
package router.configuration;
|
||||
|
||||
/**
|
||||
*
|
||||
* @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);
|
||||
}
|
||||
}
|
32
apps/desktopgui/src/util/IntegerVerifier.java
Normal file
32
apps/desktopgui/src/util/IntegerVerifier.java
Normal file
@ -0,0 +1,32 @@
|
||||
package util;
|
||||
|
||||
import javax.swing.InputVerifier;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.JTextField;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author mathias
|
||||
*/
|
||||
|
||||
public class IntegerVerifier extends InputVerifier {
|
||||
|
||||
@Override
|
||||
public boolean verify(JComponent arg0) {
|
||||
JTextField jtf = (JTextField) arg0;
|
||||
return verify(jtf.getText());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shouldYieldFocus(JComponent input) {
|
||||
return verify(input);
|
||||
}
|
||||
|
||||
public static boolean verify(String s) {
|
||||
for(int i=0;i<s.length();i++)
|
||||
if(s.charAt(i) > '9' || s.charAt(i) < '0')
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
@ -18,7 +18,6 @@
|
||||
<!-- 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" />
|
||||
@ -32,7 +31,7 @@
|
||||
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" />
|
||||
</target>
|
||||
<target name="jar" depends="builddep, compile">
|
||||
<jar destfile="./build/i2psnark.jar" basedir="./build/obj" includes="**/*.class" excludes="**/*Servlet.class">
|
||||
|
44
apps/i2psnark/java/src/org/klomp/snark/BWLimits.java
Normal file
44
apps/i2psnark/java/src/org/klomp/snark/BWLimits.java
Normal file
@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Released into the public domain
|
||||
* with no warranty of any kind, either expressed or implied.
|
||||
*/
|
||||
package org.klomp.snark;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.Properties;
|
||||
|
||||
import net.i2p.I2PAppContext;
|
||||
import net.i2p.client.I2PSessionException;
|
||||
import net.i2p.client.I2PClient;
|
||||
import net.i2p.client.I2PSession;
|
||||
import net.i2p.client.I2PSimpleClient;
|
||||
|
||||
/**
|
||||
* Connect via I2CP and ask the router the bandwidth limits.
|
||||
*
|
||||
* The call is blocking and returns null on failure.
|
||||
* Timeout is set to 5 seconds in I2PSimpleSession but it should be much faster.
|
||||
*
|
||||
* @author zzz
|
||||
*/
|
||||
class BWLimits {
|
||||
|
||||
public static int[] getBWLimits(String host, int port) {
|
||||
int[] rv = null;
|
||||
try {
|
||||
I2PClient client = new I2PSimpleClient();
|
||||
Properties opts = new Properties();
|
||||
opts.put(I2PClient.PROP_TCP_HOST, host);
|
||||
opts.put(I2PClient.PROP_TCP_PORT, "" + port);
|
||||
I2PSession session = client.createSession(null, opts);
|
||||
session.connect();
|
||||
rv = session.bandwidthLimits();
|
||||
session.destroySession();
|
||||
} catch (I2PSessionException ise) {}
|
||||
return rv;
|
||||
}
|
||||
|
||||
public static void main(String args[]) {
|
||||
System.out.println(Arrays.toString(getBWLimits("127.0.0.1", 7654)));
|
||||
}
|
||||
}
|
@ -152,6 +152,7 @@ public class ConnectionAcceptor implements Runnable
|
||||
_util.debug("Error while accepting: " + ioe, Snark.ERROR);
|
||||
stop = true;
|
||||
}
|
||||
// catch oom?
|
||||
}
|
||||
|
||||
try
|
||||
|
@ -23,7 +23,9 @@ import net.i2p.data.DataFormatException;
|
||||
import net.i2p.data.Destination;
|
||||
import net.i2p.data.Hash;
|
||||
import net.i2p.util.EepGet;
|
||||
import net.i2p.util.FileUtil;
|
||||
import net.i2p.util.Log;
|
||||
import net.i2p.util.SimpleScheduler;
|
||||
import net.i2p.util.SimpleTimer;
|
||||
|
||||
/**
|
||||
@ -48,6 +50,7 @@ public class I2PSnarkUtil {
|
||||
private int _maxUploaders;
|
||||
private int _maxUpBW;
|
||||
private int _maxConnections;
|
||||
private File _tmpDir;
|
||||
|
||||
public static final String PROP_USE_OPENTRACKERS = "i2psnark.useOpentrackers";
|
||||
public static final boolean DEFAULT_USE_OPENTRACKERS = true;
|
||||
@ -67,6 +70,12 @@ public class I2PSnarkUtil {
|
||||
_maxUploaders = Snark.MAX_TOTAL_UPLOADERS;
|
||||
_maxUpBW = DEFAULT_MAX_UP_BW;
|
||||
_maxConnections = MAX_CONNECTIONS;
|
||||
// This is used for both announce replies and .torrent file downloads,
|
||||
// so it must be available even if not connected to I2CP.
|
||||
// so much for multiple instances
|
||||
_tmpDir = new File("tmp", "i2psnark");
|
||||
FileUtil.rmdir(_tmpDir, false);
|
||||
_tmpDir.mkdirs();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -94,6 +103,7 @@ public class I2PSnarkUtil {
|
||||
_i2cpHost = i2cpHost;
|
||||
if (i2cpPort > 0)
|
||||
_i2cpPort = i2cpPort;
|
||||
// can't remove any options this way...
|
||||
if (opts != null)
|
||||
_opts.putAll(opts);
|
||||
_configured = true;
|
||||
@ -166,6 +176,10 @@ public class I2PSnarkUtil {
|
||||
_manager = null;
|
||||
_shitlist.clear();
|
||||
mgr.destroySocketManager();
|
||||
// this will delete a .torrent file d/l in progress so don't do that...
|
||||
FileUtil.rmdir(_tmpDir, false);
|
||||
// in case the user will d/l a .torrent file next...
|
||||
_tmpDir.mkdirs();
|
||||
}
|
||||
|
||||
/** connect to the given destination */
|
||||
@ -183,7 +197,7 @@ public class I2PSnarkUtil {
|
||||
synchronized (_shitlist) {
|
||||
_shitlist.add(dest);
|
||||
}
|
||||
SimpleTimer.getInstance().addEvent(new Unshitlist(dest), 10*60*1000);
|
||||
SimpleScheduler.getInstance().addEvent(new Unshitlist(dest), 10*60*1000);
|
||||
throw new IOException("Unable to reach the peer " + peer + ": " + ie.getMessage());
|
||||
}
|
||||
}
|
||||
@ -204,7 +218,8 @@ public class I2PSnarkUtil {
|
||||
_log.debug("Fetching [" + url + "] proxy=" + _proxyHost + ":" + _proxyPort + ": " + _shouldProxy);
|
||||
File out = null;
|
||||
try {
|
||||
out = File.createTempFile("i2psnark", "url", new File("."));
|
||||
// we could use the system tmp dir but deleteOnExit() doesn't seem to work on all platforms...
|
||||
out = File.createTempFile("i2psnark", null, _tmpDir);
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
if (out != null)
|
||||
|
@ -28,6 +28,7 @@ import java.util.List;
|
||||
|
||||
import net.i2p.util.I2PAppThread;
|
||||
import net.i2p.util.Log;
|
||||
import net.i2p.util.SimpleScheduler;
|
||||
import net.i2p.util.SimpleTimer;
|
||||
|
||||
class PeerConnectionOut implements Runnable
|
||||
@ -215,7 +216,7 @@ class PeerConnectionOut implements Runnable
|
||||
private void addMessage(Message m)
|
||||
{
|
||||
if (m.type == Message.PIECE)
|
||||
SimpleTimer.getInstance().addEvent(new RemoveTooSlow(m), SEND_TIMEOUT);
|
||||
SimpleScheduler.getInstance().addEvent(new RemoveTooSlow(m), SEND_TIMEOUT);
|
||||
synchronized(sendQueue)
|
||||
{
|
||||
sendQueue.add(m);
|
||||
|
@ -60,7 +60,7 @@ class PeerState
|
||||
// If we have te resend outstanding requests (true after we got choked).
|
||||
private boolean resend = false;
|
||||
|
||||
private final static int MAX_PIPELINE = 2; // this is for outbound requests
|
||||
private final static int MAX_PIPELINE = 3; // 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
|
||||
private final static int MAX_PARTSIZE = 64*1024; // Don't let anybody request more than this
|
||||
|
@ -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;
|
||||
@ -232,7 +231,7 @@ public class Snark
|
||||
}
|
||||
|
||||
// Explicit shutdown.
|
||||
Runtime.getRuntime().removeShutdownHook(snarkhook);
|
||||
//Runtime.getRuntime().removeShutdownHook(snarkhook);
|
||||
snarkhook.start();
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
@ -81,8 +80,7 @@ public class SnarkManager implements Snark.CompleteListener {
|
||||
I2PAppThread monitor = new I2PAppThread(new DirMonitor(), "Snark DirMonitor");
|
||||
monitor.setDaemon(true);
|
||||
monitor.start();
|
||||
if (_context instanceof RouterContext)
|
||||
((RouterContext)_context).router().addShutdownTask(new SnarkManagerShutdown());
|
||||
_context.addShutdownTask(new SnarkManagerShutdown());
|
||||
}
|
||||
|
||||
/** hook to I2PSnarkUtil for the servlet */
|
||||
@ -137,27 +135,17 @@ 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");
|
||||
_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))
|
||||
@ -165,6 +153,15 @@ public class SnarkManager implements Snark.CompleteListener {
|
||||
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);
|
||||
int i2cpPort = getInt(PROP_I2CP_PORT, 7654);
|
||||
@ -539,7 +536,7 @@ public class SnarkManager implements Snark.CompleteListener {
|
||||
String announce = info.getAnnounce();
|
||||
// basic validation of url
|
||||
if ((!announce.startsWith("http://")) ||
|
||||
(announce.indexOf(".i2p/") < 0))
|
||||
(announce.indexOf(".i2p/") < 0)) // need to do better than this
|
||||
return "Non-i2p tracker in " + info.getName() + ", deleting it";
|
||||
List files = info.getFiles();
|
||||
if ( (files != null) && (files.size() > MAX_FILES_PER_TORRENT) ) {
|
||||
@ -620,6 +617,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());
|
||||
|
@ -63,7 +63,7 @@ public class I2PSnarkServlet extends HttpServlet {
|
||||
req.setCharacterEncoding("UTF-8");
|
||||
resp.setCharacterEncoding("UTF-8");
|
||||
resp.setContentType("text/html; charset=UTF-8");
|
||||
long stats[] = {0,0,0,0};
|
||||
long stats[] = {0,0,0,0,0};
|
||||
|
||||
String nonce = req.getParameter("nonce");
|
||||
if ( (nonce != null) && (nonce.equals(String.valueOf(_nonce))) )
|
||||
@ -143,8 +143,10 @@ public class I2PSnarkServlet extends HttpServlet {
|
||||
if (snarks.size() <= 0) {
|
||||
out.write(TABLE_EMPTY);
|
||||
} else if (snarks.size() > 1) {
|
||||
out.write(TABLE_TOTAL);
|
||||
out.write(" <th align=\"right\" valign=\"top\">" + formatSize(stats[0]) + "</th>\n" +
|
||||
out.write("<tfoot><tr>\n" +
|
||||
" <th align=\"left\" valign=\"top\" colspan=\"2\">Totals (" + snarks.size() + " torrents, " + stats[4] + " connected peers)</th>\n" +
|
||||
" <th> </th>\n" +
|
||||
" <th align=\"right\" valign=\"top\">" + formatSize(stats[0]) + "</th>\n" +
|
||||
" <th align=\"right\" valign=\"top\">" + formatSize(stats[1]) + "</th>\n" +
|
||||
" <th align=\"right\" valign=\"top\">" + formatSize(stats[2]) + "ps</th>\n" +
|
||||
" <th align=\"right\" valign=\"top\">" + formatSize(stats[3]) + "ps</th>\n" +
|
||||
@ -200,10 +202,14 @@ public class I2PSnarkServlet extends HttpServlet {
|
||||
} catch (IOException ioe) {
|
||||
_log.warn("hrm: " + local, ioe);
|
||||
}
|
||||
} else if ( (newURL != null) && (newURL.trim().length() > "http://.i2p/".length()) ) {
|
||||
_manager.addMessage("Fetching " + newURL);
|
||||
I2PAppThread fetch = new I2PAppThread(new FetchAndAdd(_manager, newURL), "Fetch and add");
|
||||
fetch.start();
|
||||
} else if (newURL != null) {
|
||||
if (newURL.startsWith("http://")) {
|
||||
_manager.addMessage("Fetching " + newURL);
|
||||
I2PAppThread fetch = new I2PAppThread(new FetchAndAdd(_manager, newURL), "Fetch and add");
|
||||
fetch.start();
|
||||
} else {
|
||||
_manager.addMessage("Invalid URL - must start with http://");
|
||||
}
|
||||
} else {
|
||||
// no file or URL specified
|
||||
}
|
||||
@ -439,6 +445,7 @@ public class I2PSnarkServlet extends HttpServlet {
|
||||
if (snark.coordinator != null) {
|
||||
err = snark.coordinator.trackerProblems;
|
||||
curPeers = snark.coordinator.getPeerCount();
|
||||
stats[4] += curPeers;
|
||||
knownPeers = snark.coordinator.trackerSeenPeers;
|
||||
}
|
||||
|
||||
@ -577,10 +584,10 @@ public class I2PSnarkServlet extends HttpServlet {
|
||||
client = "Azureus";
|
||||
else if ("CwsL".equals(ch))
|
||||
client = "I2PSnarkXL";
|
||||
else if ("AUZV".equals(ch) || "AkZV".equals(ch) || "A0ZV".equals(ch))
|
||||
else if ("ZV".equals(ch.substring(2,4)))
|
||||
client = "Robert";
|
||||
else
|
||||
client = "Unknown";
|
||||
client = "Unknown (" + ch + ')';
|
||||
out.write("<font size=-1>" + client + "</font> <tt>" + peer.toString().substring(5, 9) + "</tt>");
|
||||
if (showDebug)
|
||||
out.write(" inactive " + (peer.getInactiveTime() / 1000) + "s");
|
||||
@ -641,7 +648,7 @@ public class I2PSnarkServlet extends HttpServlet {
|
||||
private void writeAddForm(PrintWriter out, HttpServletRequest req) throws IOException {
|
||||
String uri = req.getRequestURI();
|
||||
String newURL = req.getParameter("newURL");
|
||||
if ( (newURL == null) || (newURL.trim().length() <= 0) ) newURL = "http://";
|
||||
if ( (newURL == null) || (newURL.trim().length() <= 0) ) newURL = "";
|
||||
String newFile = req.getParameter("newFile");
|
||||
if ( (newFile == null) || (newFile.trim().length() <= 0) ) newFile = "";
|
||||
|
||||
@ -769,7 +776,7 @@ public class I2PSnarkServlet extends HttpServlet {
|
||||
return bytes + "B";
|
||||
else if (bytes < 5*1024*1024)
|
||||
return ((bytes + 512)/1024) + "KB";
|
||||
else if (bytes < 5*1024*1024*1024l)
|
||||
else if (bytes < 10*1024*1024*1024l)
|
||||
return ((bytes + 512*1024)/(1024*1024)) + "MB";
|
||||
else
|
||||
return ((bytes + 512*1024*1024)/(1024*1024*1024)) + "GB";
|
||||
@ -858,11 +865,6 @@ public class I2PSnarkServlet extends HttpServlet {
|
||||
" <th align=\"right\" valign=\"top\">Down Rate</th>\n" +
|
||||
" <th align=\"right\" valign=\"top\">Up Rate</th>\n";
|
||||
|
||||
private static final String TABLE_TOTAL = "<tfoot>\n" +
|
||||
"<tr><th align=\"left\" valign=\"top\">Totals</th>\n" +
|
||||
" <th> </th>\n" +
|
||||
" <th> </th>\n";
|
||||
|
||||
private static final String TABLE_EMPTY = "<tr class=\"snarkTorrentEven\">" +
|
||||
"<td class=\"snarkTorrentEven\" align=\"left\"" +
|
||||
" valign=\"top\" colspan=\"8\">No torrents</td></tr>\n";
|
||||
|
@ -42,7 +42,7 @@
|
||||
</target>
|
||||
<target name="war" depends="precompilejsp">
|
||||
<war destfile="build/i2ptunnel.war" webxml="../jsp/web-out.xml"
|
||||
basedir="../jsp/" excludes="web.xml, *.java, *.jsp">
|
||||
basedir="../jsp/" excludes="web.xml, **/*.java, *.jsp">
|
||||
</war>
|
||||
</target>
|
||||
<target name="precompilejsp" unless="precompilejsp.uptodate">
|
||||
|
@ -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;
|
||||
|
||||
/**
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -62,6 +62,8 @@ import net.i2p.data.DataFormatException;
|
||||
import net.i2p.data.DataHelper;
|
||||
import net.i2p.data.Destination;
|
||||
import net.i2p.i2ptunnel.socks.I2PSOCKSTunnel;
|
||||
import net.i2p.i2ptunnel.streamr.StreamrConsumer;
|
||||
import net.i2p.i2ptunnel.streamr.StreamrProducer;
|
||||
import net.i2p.util.EventDispatcher;
|
||||
import net.i2p.util.EventDispatcherImpl;
|
||||
import net.i2p.util.Log;
|
||||
@ -73,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;
|
||||
|
||||
@ -87,7 +89,7 @@ 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();
|
||||
@ -234,6 +236,8 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
runServer(args, l);
|
||||
} else if ("httpserver".equals(cmdname)) {
|
||||
runHttpServer(args, l);
|
||||
} else if ("ircserver".equals(cmdname)) {
|
||||
runIrcServer(args, l);
|
||||
} else if ("textserver".equals(cmdname)) {
|
||||
runTextServer(args, l);
|
||||
} else if ("client".equals(cmdname)) {
|
||||
@ -244,6 +248,12 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
runIrcClient(args, l);
|
||||
} else if ("sockstunnel".equals(cmdname)) {
|
||||
runSOCKSTunnel(args, l);
|
||||
} else if ("connectclient".equals(cmdname)) {
|
||||
runConnectClient(args, l);
|
||||
} else if ("streamrclient".equals(cmdname)) {
|
||||
runStreamrClient(args, l);
|
||||
} else if ("streamrserver".equals(cmdname)) {
|
||||
runStreamrServer(args, l);
|
||||
} else if ("config".equals(cmdname)) {
|
||||
runConfig(args, l);
|
||||
} else if ("listen_on".equals(cmdname)) {
|
||||
@ -296,6 +306,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
l.log("client <port> <pubkey>[,<pubkey,...]|file:<pubkeyfile> [<sharedClient>]");
|
||||
l.log("ircclient <port> <pubkey>[,<pubkey,...]|file:<pubkeyfile> [<sharedClient>]");
|
||||
l.log("httpclient <port> [<sharedClient>] [<proxy>]");
|
||||
l.log("connectclient <port> [<sharedClient>] [<proxy>]");
|
||||
l.log("lookup <name>");
|
||||
l.log("quit");
|
||||
l.log("close [forced] <jobnumber>|all");
|
||||
@ -380,6 +391,53 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Same args as runServer
|
||||
* (we should stop duplicating all this code...)
|
||||
*/
|
||||
public void runIrcServer(String args[], Logging l) {
|
||||
if (args.length == 3) {
|
||||
InetAddress serverHost = null;
|
||||
int portNum = -1;
|
||||
File privKeyFile = null;
|
||||
try {
|
||||
serverHost = InetAddress.getByName(args[0]);
|
||||
} catch (UnknownHostException uhe) {
|
||||
l.log("unknown host");
|
||||
_log.error(getPrefix() + "Error resolving " + args[0], uhe);
|
||||
notifyEvent("serverTaskId", Integer.valueOf(-1));
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
portNum = Integer.parseInt(args[1]);
|
||||
} catch (NumberFormatException nfe) {
|
||||
l.log("invalid port");
|
||||
_log.error(getPrefix() + "Port specified is not valid: " + args[1], nfe);
|
||||
notifyEvent("serverTaskId", Integer.valueOf(-1));
|
||||
return;
|
||||
}
|
||||
|
||||
privKeyFile = new File(args[2]);
|
||||
if (!privKeyFile.canRead()) {
|
||||
l.log("private key file does not exist");
|
||||
_log.error(getPrefix() + "Private key file does not exist or is not readable: " + args[2]);
|
||||
notifyEvent("serverTaskId", Integer.valueOf(-1));
|
||||
return;
|
||||
}
|
||||
I2PTunnelServer serv = new I2PTunnelIRCServer(serverHost, portNum, privKeyFile, args[2], l, (EventDispatcher) this, this);
|
||||
serv.setReadTimeout(readTimeout);
|
||||
serv.startRunning();
|
||||
addtask(serv);
|
||||
notifyEvent("serverTaskId", Integer.valueOf(serv.getId()));
|
||||
return;
|
||||
} else {
|
||||
l.log("server <host> <port> <privkeyfile>");
|
||||
l.log(" creates a server that sends all incoming data\n" + " of its destination to host:port.");
|
||||
notifyEvent("serverTaskId", Integer.valueOf(-1));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Run the HTTP server pointing at the host and port specified using the private i2p
|
||||
* destination loaded from the specified file, replacing the HTTP headers
|
||||
@ -494,14 +552,14 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
* Integer port number if the client is listening
|
||||
* sharedClient parameter is a String "true" or "false"
|
||||
*
|
||||
* @param args {portNumber, destinationBase64 or "file:filename"[, sharedClient]}
|
||||
* @param args {portNumber, destinationBase64 or "file:filename"[, sharedClient [, privKeyFile]]}
|
||||
* @param l logger to receive events and output
|
||||
*/
|
||||
public void runClient(String args[], Logging l) {
|
||||
boolean isShared = true;
|
||||
if (args.length == 3)
|
||||
if (args.length >= 3)
|
||||
isShared = Boolean.valueOf(args[2].trim()).booleanValue();
|
||||
if ( (args.length == 2) || (args.length == 3) ) {
|
||||
if (args.length >= 2) {
|
||||
int portNum = -1;
|
||||
try {
|
||||
portNum = Integer.parseInt(args[0]);
|
||||
@ -514,7 +572,10 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
I2PTunnelTask task;
|
||||
ownDest = !isShared;
|
||||
try {
|
||||
task = new I2PTunnelClient(portNum, args[1], l, ownDest, (EventDispatcher) this, this);
|
||||
String privateKeyFile = null;
|
||||
if (args.length >= 4)
|
||||
privateKeyFile = args[3];
|
||||
task = new I2PTunnelClient(portNum, args[1], l, ownDest, (EventDispatcher) this, this, privateKeyFile);
|
||||
addtask(task);
|
||||
notifyEvent("clientTaskId", Integer.valueOf(task.getId()));
|
||||
} catch (IllegalArgumentException iae) {
|
||||
@ -523,7 +584,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
notifyEvent("clientTaskId", Integer.valueOf(-1));
|
||||
}
|
||||
} else {
|
||||
l.log("client <port> <pubkey>[,<pubkey>]|file:<pubkeyfile>[ <sharedClient>]");
|
||||
l.log("client <port> <pubkey>[,<pubkey>]|file:<pubkeyfile>[ <sharedClient>] [<privKeyFile>]");
|
||||
l.log(" creates a client that forwards port to the pubkey.\n"
|
||||
+ " use 0 as port to get a free port assigned. If you specify\n"
|
||||
+ " a comma delimited list of pubkeys, it will rotate among them\n"
|
||||
@ -545,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);
|
||||
@ -555,7 +616,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
return;
|
||||
}
|
||||
|
||||
String proxy = "squid.i2p";
|
||||
String proxy = "";
|
||||
boolean isShared = true;
|
||||
if (args.length > 1) {
|
||||
if ("true".equalsIgnoreCase(args[1].trim())) {
|
||||
@ -581,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 {
|
||||
@ -595,11 +656,66 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
l.log(" <sharedClient> (optional) indicates if this client shares tunnels with other clients (true of false)");
|
||||
l.log(" <proxy> (optional) indicates a proxy server to be used");
|
||||
l.log(" when trying to access an address out of the .i2p domain");
|
||||
l.log(" (the default proxy is squid.i2p).");
|
||||
notifyEvent("httpclientTaskId", Integer.valueOf(-1));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Run a CONNECT client on the given port number
|
||||
*
|
||||
* @param args {portNumber[, sharedClient][, proxy to be used for the WWW]}
|
||||
* @param l logger to receive events and output
|
||||
*/
|
||||
public void runConnectClient(String args[], Logging l) {
|
||||
if (args.length >= 1 && args.length <= 3) {
|
||||
int port = -1;
|
||||
try {
|
||||
port = Integer.parseInt(args[0]);
|
||||
} catch (NumberFormatException nfe) {
|
||||
_log.error(getPrefix() + "Port specified is not valid: " + args[0], nfe);
|
||||
return;
|
||||
}
|
||||
|
||||
String proxy = "";
|
||||
boolean isShared = true;
|
||||
if (args.length > 1) {
|
||||
if ("true".equalsIgnoreCase(args[1].trim())) {
|
||||
isShared = true;
|
||||
if (args.length == 3)
|
||||
proxy = args[2];
|
||||
} else if ("false".equalsIgnoreCase(args[1].trim())) {
|
||||
_log.warn("args[1] == [" + args[1] + "] and rejected explicitly");
|
||||
isShared = false;
|
||||
if (args.length == 3)
|
||||
proxy = args[2];
|
||||
} else if (args.length == 3) {
|
||||
isShared = false; // not "true"
|
||||
proxy = args[2];
|
||||
_log.warn("args[1] == [" + args[1] + "] but rejected");
|
||||
} else {
|
||||
// isShared not specified, default to true
|
||||
isShared = true;
|
||||
proxy = args[1];
|
||||
}
|
||||
}
|
||||
|
||||
I2PTunnelTask task;
|
||||
ownDest = !isShared;
|
||||
try {
|
||||
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);
|
||||
}
|
||||
} else {
|
||||
l.log("connectclient <port> [<sharedClient>] [<proxy>]");
|
||||
l.log(" creates a client that for SSL/HTTPS requests.");
|
||||
l.log(" <sharedClient> (optional) indicates if this client shares tunnels with other clients (true of false)");
|
||||
l.log(" <proxy> (optional) indicates a proxy server to be used");
|
||||
l.log(" when trying to access an address out of the .i2p domain");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Run an IRC client on the given port number
|
||||
*
|
||||
@ -607,11 +723,11 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
* Also sets "ircclientStatus" = "ok" or "error" after the client tunnel has started.
|
||||
* parameter sharedClient is a String, either "true" or "false"
|
||||
*
|
||||
* @param args {portNumber,destinationBase64 or "file:filename" [, sharedClient]}
|
||||
* @param args {portNumber,destinationBase64 or "file:filename" [, sharedClient [, privKeyFile]]}
|
||||
* @param l logger to receive events and output
|
||||
*/
|
||||
public void runIrcClient(String args[], Logging l) {
|
||||
if (args.length >= 2 && args.length <= 3) {
|
||||
if (args.length >= 2) {
|
||||
int port = -1;
|
||||
try {
|
||||
port = Integer.parseInt(args[0]);
|
||||
@ -638,7 +754,10 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
I2PTunnelTask task;
|
||||
ownDest = !isShared;
|
||||
try {
|
||||
task = new I2PTunnelIRCClient(port, args[1],l, ownDest, (EventDispatcher) this, this);
|
||||
String privateKeyFile = null;
|
||||
if (args.length >= 4)
|
||||
privateKeyFile = args[3];
|
||||
task = new I2PTunnelIRCClient(port, args[1], l, ownDest, (EventDispatcher) this, this, privateKeyFile);
|
||||
addtask(task);
|
||||
notifyEvent("ircclientTaskId", Integer.valueOf(task.getId()));
|
||||
} catch (IllegalArgumentException iae) {
|
||||
@ -647,7 +766,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
notifyEvent("ircclientTaskId", Integer.valueOf(-1));
|
||||
}
|
||||
} else {
|
||||
l.log("ircclient <port> [<sharedClient>]");
|
||||
l.log("ircclient <port> [<sharedClient> [<privKeyFile>]]");
|
||||
l.log(" creates a client that filter IRC protocol.");
|
||||
l.log(" <sharedClient> (optional) indicates if this client shares tunnels with other clients (true of false)");
|
||||
notifyEvent("ircclientTaskId", Integer.valueOf(-1));
|
||||
@ -662,7 +781,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
* "openSOCKSTunnelResult" = "ok" or "error" after the client tunnel has
|
||||
* started.
|
||||
*
|
||||
* @param args {portNumber}
|
||||
* @param args {portNumber [, sharedClient]}
|
||||
* @param l logger to receive events and output
|
||||
*/
|
||||
public void runSOCKSTunnel(String args[], Logging l) {
|
||||
@ -677,6 +796,11 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
return;
|
||||
}
|
||||
|
||||
boolean isShared = false;
|
||||
if (args.length > 1)
|
||||
isShared = "true".equalsIgnoreCase(args[1].trim());
|
||||
|
||||
ownDest = !isShared;
|
||||
I2PTunnelTask task;
|
||||
task = new I2PSOCKSTunnel(port, l, ownDest, (EventDispatcher) this, this);
|
||||
addtask(task);
|
||||
@ -688,6 +812,82 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Streamr client
|
||||
*
|
||||
* @param args {targethost, targetport, destinationString}
|
||||
* @param l logger to receive events and output
|
||||
*/
|
||||
public void runStreamrClient(String args[], Logging l) {
|
||||
if (args.length == 3) {
|
||||
InetAddress host;
|
||||
try {
|
||||
host = InetAddress.getByName(args[0]);
|
||||
} catch (UnknownHostException uhe) {
|
||||
l.log("unknown host");
|
||||
_log.error(getPrefix() + "Error resolving " + args[0], uhe);
|
||||
notifyEvent("streamrtunnelTaskId", Integer.valueOf(-1));
|
||||
return;
|
||||
}
|
||||
|
||||
int port = -1;
|
||||
try {
|
||||
port = Integer.parseInt(args[1]);
|
||||
} catch (NumberFormatException nfe) {
|
||||
l.log("invalid port");
|
||||
_log.error(getPrefix() + "Port specified is not valid: " + args[0], nfe);
|
||||
notifyEvent("streamrtunnelTaskId", Integer.valueOf(-1));
|
||||
return;
|
||||
}
|
||||
|
||||
StreamrConsumer task = new StreamrConsumer(host, port, args[2], l, (EventDispatcher) this, this);
|
||||
task.startRunning();
|
||||
addtask(task);
|
||||
notifyEvent("streamrtunnelTaskId", Integer.valueOf(task.getId()));
|
||||
} else {
|
||||
l.log("streamrclient <host> <port> <destination>");
|
||||
l.log(" creates a tunnel that receives streaming data.");
|
||||
notifyEvent("streamrtunnelTaskId", Integer.valueOf(-1));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Streamr server
|
||||
*
|
||||
* @param args {port, privkeyfile}
|
||||
* @param l logger to receive events and output
|
||||
*/
|
||||
public void runStreamrServer(String args[], Logging l) {
|
||||
if (args.length == 2) {
|
||||
int port = -1;
|
||||
try {
|
||||
port = Integer.parseInt(args[0]);
|
||||
} catch (NumberFormatException nfe) {
|
||||
l.log("invalid port");
|
||||
_log.error(getPrefix() + "Port specified is not valid: " + args[0], nfe);
|
||||
notifyEvent("streamrtunnelTaskId", Integer.valueOf(-1));
|
||||
return;
|
||||
}
|
||||
|
||||
File privKeyFile = new File(args[1]);
|
||||
if (!privKeyFile.canRead()) {
|
||||
l.log("private key file does not exist");
|
||||
_log.error(getPrefix() + "Private key file does not exist or is not readable: " + args[3]);
|
||||
notifyEvent("serverTaskId", Integer.valueOf(-1));
|
||||
return;
|
||||
}
|
||||
|
||||
StreamrProducer task = new StreamrProducer(port, privKeyFile, args[1], l, (EventDispatcher) this, this);
|
||||
task.startRunning();
|
||||
addtask(task);
|
||||
notifyEvent("streamrtunnelTaskId", Integer.valueOf(task.getId()));
|
||||
} else {
|
||||
l.log("streamrserver <port> <privkeyfile>");
|
||||
l.log(" creates a tunnel that sends streaming data.");
|
||||
notifyEvent("streamrtunnelTaskId", Integer.valueOf(-1));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Specify the i2cp host and port
|
||||
*
|
||||
|
@ -31,8 +31,8 @@ public class I2PTunnelClient extends I2PTunnelClientBase {
|
||||
*/
|
||||
public I2PTunnelClient(int localPort, String destinations, Logging l,
|
||||
boolean ownDest, EventDispatcher notifyThis,
|
||||
I2PTunnel tunnel) throws IllegalArgumentException {
|
||||
super(localPort, ownDest, l, notifyThis, "SynSender", tunnel);
|
||||
I2PTunnel tunnel, String pkf) throws IllegalArgumentException {
|
||||
super(localPort, ownDest, l, notifyThis, "SynSender", tunnel, pkf);
|
||||
|
||||
if (waitEventValue("openBaseClientResult").equals("error")) {
|
||||
notifyEvent("openClientResult", "error");
|
||||
@ -44,11 +44,11 @@ public class I2PTunnelClient extends I2PTunnelClientBase {
|
||||
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) {
|
||||
|
@ -3,6 +3,7 @@
|
||||
*/
|
||||
package net.i2p.i2ptunnel;
|
||||
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InterruptedIOException;
|
||||
import java.net.ConnectException;
|
||||
@ -27,6 +28,7 @@ import net.i2p.data.Destination;
|
||||
import net.i2p.util.EventDispatcher;
|
||||
import net.i2p.util.I2PThread;
|
||||
import net.i2p.util.Log;
|
||||
import net.i2p.util.SimpleScheduler;
|
||||
import net.i2p.util.SimpleTimer;
|
||||
|
||||
public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runnable {
|
||||
@ -39,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;
|
||||
@ -50,19 +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? */
|
||||
@ -90,18 +93,28 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
// I2PTunnelClientBase(localPort, ownDest, l, (EventDispatcher)null);
|
||||
//}
|
||||
|
||||
public I2PTunnelClientBase(int localPort, boolean ownDest, Logging l,
|
||||
EventDispatcher notifyThis, String handlerName,
|
||||
I2PTunnel tunnel) throws IllegalArgumentException {
|
||||
this(localPort, ownDest, l, notifyThis, handlerName, tunnel, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param pkf null to generate a transient key
|
||||
*
|
||||
* @throws IllegalArgumentException if the I2CP configuration is b0rked so
|
||||
* badly that we cant create a socketManager
|
||||
*/
|
||||
public I2PTunnelClientBase(int localPort, boolean ownDest, Logging l,
|
||||
EventDispatcher notifyThis, String handlerName,
|
||||
I2PTunnel tunnel) throws IllegalArgumentException{
|
||||
I2PTunnel tunnel, String pkf) throws IllegalArgumentException{
|
||||
super(localPort + " (uninitialized)", notifyThis, tunnel);
|
||||
_clientId = ++__clientId;
|
||||
this.localPort = localPort;
|
||||
this.l = l;
|
||||
this.handlerName = handlerName + _clientId;
|
||||
this.privKeyFile = pkf;
|
||||
|
||||
|
||||
_context = tunnel.getContext();
|
||||
_context.statManager().createRateStat("i2ptunnel.client.closeBacklog", "How many pending sockets remain when we close one due to backlog?", "I2PTunnel", new long[] { 60*1000, 10*60*1000, 60*60*1000 });
|
||||
@ -113,26 +126,28 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
// be looked up
|
||||
tunnel.getClientOptions().setProperty("i2cp.dontPublishLeaseSet", "true");
|
||||
|
||||
while (sockMgr == null) {
|
||||
synchronized (sockLock) {
|
||||
if (ownDest) {
|
||||
sockMgr = buildSocketManager();
|
||||
} else {
|
||||
sockMgr = getSocketManager();
|
||||
boolean openNow = !Boolean.valueOf(tunnel.getClientOptions().getProperty("i2cp.delayOpen")).booleanValue();
|
||||
if (openNow) {
|
||||
while (sockMgr == null) {
|
||||
synchronized (sockLock) {
|
||||
if (ownDest) {
|
||||
sockMgr = buildSocketManager();
|
||||
} else {
|
||||
sockMgr = getSocketManager();
|
||||
}
|
||||
}
|
||||
if (sockMgr == null) {
|
||||
_log.log(Log.CRIT, "Unable to create socket manager (our own? " + ownDest + ")");
|
||||
try { Thread.sleep(10*1000); } catch (InterruptedException ie) {}
|
||||
}
|
||||
}
|
||||
if (sockMgr == null) {
|
||||
_log.log(Log.CRIT, "Unable to create socket manager (our own? " + ownDest + ")");
|
||||
try { Thread.sleep(10*1000); } catch (InterruptedException ie) {}
|
||||
l.log("Invalid I2CP configuration");
|
||||
throw new IllegalArgumentException("Socket manager could not be created");
|
||||
}
|
||||
}
|
||||
if (sockMgr == null) {
|
||||
l.log("Invalid I2CP configuration");
|
||||
throw new IllegalArgumentException("Socket manager could not be created");
|
||||
}
|
||||
l.log("I2P session created");
|
||||
l.log("I2P session created");
|
||||
|
||||
getTunnel().addSession(sockMgr.getSession());
|
||||
} // else delay creating session until createI2PSocket() is called
|
||||
|
||||
Thread t = new I2PThread(this);
|
||||
t.setName("Client " + _clientId);
|
||||
@ -152,7 +167,10 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
configurePool(tunnel);
|
||||
|
||||
if (open && listenerReady) {
|
||||
l.log("Ready! Port " + getLocalPort());
|
||||
if (openNow)
|
||||
l.log("Ready! Port " + getLocalPort());
|
||||
else
|
||||
l.log("Listening on port " + getLocalPort() + ", delaying tunnel open until required");
|
||||
notifyEvent("openBaseClientResult", "ok");
|
||||
} else {
|
||||
l.log("Error listening - please see the logs!");
|
||||
@ -194,28 +212,36 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
private static I2PSocketManager socketManager;
|
||||
|
||||
protected synchronized I2PSocketManager getSocketManager() {
|
||||
return getSocketManager(getTunnel());
|
||||
return getSocketManager(getTunnel(), this.privKeyFile);
|
||||
}
|
||||
protected static synchronized I2PSocketManager getSocketManager(I2PTunnel tunnel) {
|
||||
return getSocketManager(tunnel, null);
|
||||
}
|
||||
protected static synchronized I2PSocketManager getSocketManager(I2PTunnel tunnel, String pkf) {
|
||||
if (socketManager != null) {
|
||||
I2PSession s = socketManager.getSession();
|
||||
if ( (s == null) || (s.isClosed()) ) {
|
||||
_log.info("Building a new socket manager since the old one closed [s=" + s + "]");
|
||||
socketManager = buildSocketManager(tunnel);
|
||||
if (s != null)
|
||||
tunnel.removeSession(s);
|
||||
socketManager = buildSocketManager(tunnel, pkf);
|
||||
} else {
|
||||
_log.info("Not building a new socket manager since the old one is open [s=" + s + "]");
|
||||
}
|
||||
} else {
|
||||
_log.info("Building a new socket manager since there is no other one");
|
||||
socketManager = buildSocketManager(tunnel);
|
||||
socketManager = buildSocketManager(tunnel, pkf);
|
||||
}
|
||||
return socketManager;
|
||||
}
|
||||
|
||||
protected I2PSocketManager buildSocketManager() {
|
||||
return buildSocketManager(getTunnel());
|
||||
return buildSocketManager(getTunnel(), this.privKeyFile);
|
||||
}
|
||||
protected static I2PSocketManager buildSocketManager(I2PTunnel tunnel) {
|
||||
return buildSocketManager(tunnel, null);
|
||||
}
|
||||
protected static I2PSocketManager buildSocketManager(I2PTunnel tunnel, String pkf) {
|
||||
Properties props = new Properties();
|
||||
props.putAll(tunnel.getClientOptions());
|
||||
int portNum = 7654;
|
||||
@ -229,7 +255,22 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
|
||||
I2PSocketManager sockManager = null;
|
||||
while (sockManager == null) {
|
||||
sockManager = I2PSocketManagerFactory.createManager(tunnel.host, portNum, props);
|
||||
if (pkf != null) {
|
||||
// Persistent client dest
|
||||
FileInputStream fis = null;
|
||||
try {
|
||||
fis = new FileInputStream(pkf);
|
||||
sockManager = I2PSocketManagerFactory.createManager(fis, tunnel.host, portNum, props);
|
||||
} catch (IOException ioe) {
|
||||
_log.error("Error opening key file", ioe);
|
||||
// this is going to loop but if we break we'll get a NPE
|
||||
} finally {
|
||||
if (fis != null)
|
||||
try { fis.close(); } catch (IOException ioe) {}
|
||||
}
|
||||
} else {
|
||||
sockManager = I2PSocketManagerFactory.createManager(tunnel.host, portNum, props);
|
||||
}
|
||||
|
||||
if (sockManager == null) {
|
||||
_log.log(Log.CRIT, "Unable to create socket manager");
|
||||
@ -237,6 +278,7 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
}
|
||||
}
|
||||
sockManager.setName("Client");
|
||||
tunnel.addSession(sockManager.getSession());
|
||||
return sockManager;
|
||||
}
|
||||
|
||||
@ -301,6 +343,10 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
* @return a new I2PSocket
|
||||
*/
|
||||
public I2PSocket createI2PSocket(Destination dest) throws I2PException, ConnectException, NoRouteToHostException, InterruptedIOException {
|
||||
if (sockMgr == null) {
|
||||
// we need this before getDefaultOptions()
|
||||
sockMgr = getSocketManager();
|
||||
}
|
||||
return createI2PSocket(dest, getDefaultOptions());
|
||||
}
|
||||
|
||||
@ -321,6 +367,19 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
public I2PSocket createI2PSocket(Destination dest, I2PSocketOptions opt) throws I2PException, ConnectException, NoRouteToHostException, InterruptedIOException {
|
||||
I2PSocket i2ps;
|
||||
|
||||
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) {
|
||||
I2PSocketManager oldSockMgr = sockMgr;
|
||||
// This will build a new socket manager and a new dest if the session is closed.
|
||||
sockMgr = getSocketManager();
|
||||
if (oldSockMgr != sockMgr) {
|
||||
_log.warn("Built a new destination on resume");
|
||||
}
|
||||
}
|
||||
} // else the old socket manager will reconnect the old session if necessary
|
||||
i2ps = sockMgr.connect(dest, opt);
|
||||
synchronized (sockLock) {
|
||||
mySockets.add(i2ps);
|
||||
@ -373,8 +432,10 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
_context.statManager().addRateData("i2ptunnel.client.manageTime", total, total);
|
||||
}
|
||||
} catch (IOException ex) {
|
||||
_log.error("Error listening for connections on " + localPort, ex);
|
||||
notifyEvent("openBaseClientResult", "error");
|
||||
if (open) {
|
||||
_log.error("Error listening for connections on " + localPort, ex);
|
||||
notifyEvent("openBaseClientResult", "error");
|
||||
}
|
||||
synchronized (sockLock) {
|
||||
mySockets.clear();
|
||||
}
|
||||
@ -401,7 +462,7 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
}
|
||||
|
||||
if (_maxWaitTime > 0)
|
||||
SimpleTimer.getInstance().addEvent(new CloseEvent(s), _maxWaitTime);
|
||||
SimpleScheduler.getInstance().addEvent(new CloseEvent(s), _maxWaitTime);
|
||||
|
||||
synchronized (_waitingSockets) {
|
||||
_waitingSockets.add(s);
|
||||
@ -455,20 +516,23 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
// might risk to create an orphan socket. Would be better
|
||||
// to return with an error in that situation quickly.
|
||||
synchronized (sockLock) {
|
||||
mySockets.retainAll(sockMgr.listSockets());
|
||||
if (!forced && mySockets.size() != 0) {
|
||||
l.log("There are still active connections!");
|
||||
_log.debug("can't close: there are still active connections!");
|
||||
for (Iterator it = mySockets.iterator(); it.hasNext();) {
|
||||
l.log("->" + it.next());
|
||||
if (sockMgr != null) {
|
||||
mySockets.retainAll(sockMgr.listSockets());
|
||||
if (!forced && mySockets.size() != 0) {
|
||||
l.log("There are still active connections!");
|
||||
_log.debug("can't close: there are still active connections!");
|
||||
for (Iterator it = mySockets.iterator(); it.hasNext();) {
|
||||
l.log("->" + it.next());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
I2PSession session = sockMgr.getSession();
|
||||
if (session != null) {
|
||||
getTunnel().removeSession(session);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
I2PSession session = sockMgr.getSession();
|
||||
if (session != null) {
|
||||
getTunnel().removeSession(session);
|
||||
}
|
||||
l.log("Closing client " + toString());
|
||||
open = false;
|
||||
try {
|
||||
if (ss != null) ss.close();
|
||||
} catch (IOException ex) {
|
||||
@ -476,7 +540,6 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
||||
return false;
|
||||
}
|
||||
l.log("Client closed.");
|
||||
open = false;
|
||||
}
|
||||
|
||||
synchronized (_waitingSockets) { _waitingSockets.notifyAll(); }
|
||||
|
@ -0,0 +1,368 @@
|
||||
/* I2PTunnel is GPL'ed (with the exception mentioned in I2PTunnel.java)
|
||||
* (c) 2003 - 2004 mihi
|
||||
*/
|
||||
package net.i2p.i2ptunnel;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.net.Socket;
|
||||
import java.net.SocketException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
import net.i2p.I2PAppContext;
|
||||
import net.i2p.I2PException;
|
||||
import net.i2p.client.streaming.I2PSocket;
|
||||
import net.i2p.client.streaming.I2PSocketOptions;
|
||||
import net.i2p.data.DataHelper;
|
||||
import net.i2p.data.Destination;
|
||||
import net.i2p.util.EventDispatcher;
|
||||
import net.i2p.util.FileUtil;
|
||||
import net.i2p.util.Log;
|
||||
|
||||
/**
|
||||
* Supports the following:
|
||||
* (where protocol is generally HTTP/1.1 but is ignored)
|
||||
* (where host is one of:
|
||||
* example.i2p
|
||||
* 52chars.b32.i2p
|
||||
* 516+charsbase64
|
||||
* example.com (sent to one of the configured proxies)
|
||||
* )
|
||||
*
|
||||
* (port and protocol are ignored for i2p destinations)
|
||||
* CONNECT host
|
||||
* CONNECT host protocol
|
||||
* CONNECT host:port
|
||||
* CONNECT host:port protocol (this is the standard)
|
||||
*
|
||||
* Additional lines after the CONNECT line but before the blank line are ignored and stripped.
|
||||
* The CONNECT line is removed for .i2p accesses
|
||||
* but passed along for outproxy accesses.
|
||||
*
|
||||
* Ref:
|
||||
* INTERNET-DRAFT Ari Luotonen
|
||||
* Expires: September 26, 1997 Netscape Communications Corporation
|
||||
* <draft-luotonen-ssl-tunneling-03.txt> March 26, 1997
|
||||
* Tunneling SSL Through a WWW Proxy
|
||||
*
|
||||
* @author zzz a stripped-down I2PTunnelHTTPClient
|
||||
*/
|
||||
public class I2PTunnelConnectClient extends I2PTunnelClientBase implements Runnable {
|
||||
private static final Log _log = new Log(I2PTunnelConnectClient.class);
|
||||
|
||||
private final List<String> _proxyList;
|
||||
|
||||
private final static byte[] ERR_DESTINATION_UNKNOWN =
|
||||
("HTTP/1.1 503 Service Unavailable\r\n"+
|
||||
"Content-Type: text/html; charset=iso-8859-1\r\n"+
|
||||
"Cache-control: no-cache\r\n"+
|
||||
"\r\n"+
|
||||
"<html><body><H1>I2P ERROR: DESTINATION NOT FOUND</H1>"+
|
||||
"That I2P Destination was not found. "+
|
||||
"The host (or the outproxy, if you're using one) could also "+
|
||||
"be temporarily offline. You may want to <b>retry</b>. "+
|
||||
"Could not find the following Destination:<BR><BR><div>")
|
||||
.getBytes();
|
||||
|
||||
private final static byte[] ERR_NO_OUTPROXY =
|
||||
("HTTP/1.1 503 Service Unavailable\r\n"+
|
||||
"Content-Type: text/html; charset=iso-8859-1\r\n"+
|
||||
"Cache-control: no-cache\r\n"+
|
||||
"\r\n"+
|
||||
"<html><body><H1>I2P ERROR: No outproxy found</H1>"+
|
||||
"Your request was for a site outside of I2P, but you have no "+
|
||||
"HTTP outproxy configured. Please configure an outproxy in I2PTunnel")
|
||||
.getBytes();
|
||||
|
||||
private final static byte[] ERR_BAD_PROTOCOL =
|
||||
("HTTP/1.1 405 Bad Method\r\n"+
|
||||
"Content-Type: text/html; charset=iso-8859-1\r\n"+
|
||||
"Cache-control: no-cache\r\n"+
|
||||
"\r\n"+
|
||||
"<html><body><H1>I2P ERROR: METHOD NOT ALLOWED</H1>"+
|
||||
"The request uses a bad protocol. "+
|
||||
"The Connect Proxy supports CONNECT requests ONLY. Other methods such as GET are not allowed - Maybe you wanted the HTTP Proxy?.<BR>")
|
||||
.getBytes();
|
||||
|
||||
private final static byte[] ERR_LOCALHOST =
|
||||
("HTTP/1.1 403 Access Denied\r\n"+
|
||||
"Content-Type: text/html; charset=iso-8859-1\r\n"+
|
||||
"Cache-control: no-cache\r\n"+
|
||||
"\r\n"+
|
||||
"<html><body><H1>I2P ERROR: REQUEST DENIED</H1>"+
|
||||
"Your browser is misconfigured. Do not use the proxy to access the router console or other localhost destinations.<BR>")
|
||||
.getBytes();
|
||||
|
||||
private final static byte[] SUCCESS_RESPONSE =
|
||||
("HTTP/1.1 200 Connection Established\r\n"+
|
||||
"Proxy-agent: I2P\r\n"+
|
||||
"\r\n")
|
||||
.getBytes();
|
||||
|
||||
/** used to assign unique IDs to the threads / clients. no logic or functionality */
|
||||
private static volatile long __clientId = 0;
|
||||
|
||||
/**
|
||||
* @throws IllegalArgumentException if the I2PTunnel does not contain
|
||||
* valid config to contact the router
|
||||
*/
|
||||
public I2PTunnelConnectClient(int localPort, Logging l, boolean ownDest,
|
||||
String wwwProxy, EventDispatcher notifyThis,
|
||||
I2PTunnel tunnel) throws IllegalArgumentException {
|
||||
super(localPort, ownDest, l, notifyThis, "HTTPHandler " + (++__clientId), tunnel);
|
||||
|
||||
_proxyList = new ArrayList();
|
||||
if (waitEventValue("openBaseClientResult").equals("error")) {
|
||||
notifyEvent("openConnectClientResult", "error");
|
||||
return;
|
||||
}
|
||||
|
||||
if (wwwProxy != null) {
|
||||
StringTokenizer tok = new StringTokenizer(wwwProxy, ",");
|
||||
while (tok.hasMoreTokens())
|
||||
_proxyList.add(tok.nextToken().trim());
|
||||
}
|
||||
|
||||
setName(getLocalPort() + " -> ConnectClient [Outproxy list: " + wwwProxy + "]");
|
||||
|
||||
startRunning();
|
||||
}
|
||||
|
||||
private String getPrefix(long requestId) { return "Client[" + _clientId + "/" + requestId + "]: "; }
|
||||
|
||||
private String selectProxy() {
|
||||
synchronized (_proxyList) {
|
||||
int size = _proxyList.size();
|
||||
if (size <= 0)
|
||||
return null;
|
||||
int index = I2PAppContext.getGlobalContext().random().nextInt(size);
|
||||
return _proxyList.get(index);
|
||||
}
|
||||
}
|
||||
|
||||
private static final int DEFAULT_READ_TIMEOUT = 60*1000;
|
||||
|
||||
/**
|
||||
* create the default options (using the default timeout, etc)
|
||||
*
|
||||
*/
|
||||
protected I2PSocketOptions getDefaultOptions() {
|
||||
Properties defaultOpts = getTunnel().getClientOptions();
|
||||
if (!defaultOpts.contains(I2PSocketOptions.PROP_READ_TIMEOUT))
|
||||
defaultOpts.setProperty(I2PSocketOptions.PROP_READ_TIMEOUT, ""+DEFAULT_READ_TIMEOUT);
|
||||
if (!defaultOpts.contains("i2p.streaming.inactivityTimeout"))
|
||||
defaultOpts.setProperty("i2p.streaming.inactivityTimeout", ""+DEFAULT_READ_TIMEOUT);
|
||||
I2PSocketOptions opts = sockMgr.buildOptions(defaultOpts);
|
||||
if (!defaultOpts.containsKey(I2PSocketOptions.PROP_CONNECT_TIMEOUT))
|
||||
opts.setConnectTimeout(DEFAULT_CONNECT_TIMEOUT);
|
||||
return opts;
|
||||
}
|
||||
|
||||
private static long __requestId = 0;
|
||||
protected void clientConnectionRun(Socket s) {
|
||||
InputStream in = null;
|
||||
OutputStream out = null;
|
||||
String targetRequest = null;
|
||||
boolean usingWWWProxy = false;
|
||||
String currentProxy = null;
|
||||
long requestId = ++__requestId;
|
||||
try {
|
||||
out = s.getOutputStream();
|
||||
in = s.getInputStream();
|
||||
String line, method = null, host = null, destination = null, restofline = null;
|
||||
StringBuffer newRequest = new StringBuffer();
|
||||
int ahelper = 0;
|
||||
while (true) {
|
||||
// Use this rather than BufferedReader because we can't have readahead,
|
||||
// since we are passing the stream on to I2PTunnelRunner
|
||||
line = DataHelper.readLine(in);
|
||||
line = line.trim();
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getPrefix(requestId) + "Line=[" + line + "]");
|
||||
|
||||
if (method == null) { // first line CONNECT blah.i2p:80 HTTP/1.1
|
||||
int pos = line.indexOf(" ");
|
||||
if (pos == -1) break; // empty first line
|
||||
method = line.substring(0, pos);
|
||||
String request = line.substring(pos + 1);
|
||||
|
||||
pos = request.indexOf(":");
|
||||
if (pos == -1)
|
||||
pos = request.indexOf(" ");
|
||||
if (pos == -1) {
|
||||
host = request;
|
||||
restofline = "";
|
||||
} else {
|
||||
host = request.substring(0, pos);
|
||||
restofline = request.substring(pos); // ":80 HTTP/1.1" or " HTTP/1.1"
|
||||
}
|
||||
|
||||
if (host.toLowerCase().endsWith(".i2p")) {
|
||||
// Destination gets the host name
|
||||
destination = host;
|
||||
} else if (host.indexOf(".") != -1) {
|
||||
// The request must be forwarded to a outproxy
|
||||
currentProxy = selectProxy();
|
||||
if (currentProxy == null) {
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn(getPrefix(requestId) + "Host wants to be outproxied, but we dont have any!");
|
||||
writeErrorMessage(ERR_NO_OUTPROXY, out);
|
||||
s.close();
|
||||
return;
|
||||
}
|
||||
destination = currentProxy;
|
||||
usingWWWProxy = true;
|
||||
newRequest.append("CONNECT ").append(host).append(restofline).append("\r\n\r\n"); // HTTP spec
|
||||
} else if (host.toLowerCase().equals("localhost")) {
|
||||
writeErrorMessage(ERR_LOCALHOST, out);
|
||||
s.close();
|
||||
return;
|
||||
} else { // full b64 address (hopefully)
|
||||
destination = host;
|
||||
}
|
||||
targetRequest = host;
|
||||
|
||||
if (_log.shouldLog(Log.DEBUG)) {
|
||||
_log.debug(getPrefix(requestId) + "METHOD:" + method + ":");
|
||||
_log.debug(getPrefix(requestId) + "HOST :" + host + ":");
|
||||
_log.debug(getPrefix(requestId) + "REST :" + restofline + ":");
|
||||
_log.debug(getPrefix(requestId) + "DEST :" + destination + ":");
|
||||
}
|
||||
|
||||
} else if (line.length() > 0) {
|
||||
// Additional lines - shouldn't be too many. Firefox sends:
|
||||
// User-Agent: blabla
|
||||
// Proxy-Connection: keep-alive
|
||||
// Host: blabla.i2p
|
||||
//
|
||||
// We could send these (filtered like in HTTPClient) on to the outproxy,
|
||||
// but for now just chomp them all.
|
||||
line = null;
|
||||
} else {
|
||||
// do it
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (destination == null || !"CONNECT".equalsIgnoreCase(method)) {
|
||||
writeErrorMessage(ERR_BAD_PROTOCOL, out);
|
||||
s.close();
|
||||
return;
|
||||
}
|
||||
|
||||
Destination dest = I2PTunnel.destFromName(destination);
|
||||
if (dest == null) {
|
||||
String str;
|
||||
byte[] header;
|
||||
if (usingWWWProxy)
|
||||
str = FileUtil.readTextFile("docs/dnfp-header.ht", 100, true);
|
||||
else
|
||||
str = FileUtil.readTextFile("docs/dnfh-header.ht", 100, true);
|
||||
if (str != null)
|
||||
header = str.getBytes();
|
||||
else
|
||||
header = ERR_DESTINATION_UNKNOWN;
|
||||
writeErrorMessage(header, out, targetRequest, usingWWWProxy, destination);
|
||||
s.close();
|
||||
return;
|
||||
}
|
||||
|
||||
I2PSocket i2ps = createI2PSocket(dest, getDefaultOptions());
|
||||
byte[] data = null;
|
||||
byte[] response = null;
|
||||
if (usingWWWProxy)
|
||||
data = newRequest.toString().getBytes("ISO-8859-1");
|
||||
else
|
||||
response = SUCCESS_RESPONSE;
|
||||
Runnable onTimeout = new OnTimeout(s, s.getOutputStream(), targetRequest, usingWWWProxy, currentProxy, requestId);
|
||||
I2PTunnelRunner runner = new I2PTunnelRunner(s, i2ps, sockLock, data, response, mySockets, onTimeout);
|
||||
} catch (SocketException ex) {
|
||||
_log.info(getPrefix(requestId) + "Error trying to connect", ex);
|
||||
handleConnectClientException(ex, out, targetRequest, usingWWWProxy, currentProxy, requestId);
|
||||
closeSocket(s);
|
||||
} catch (IOException ex) {
|
||||
_log.info(getPrefix(requestId) + "Error trying to connect", ex);
|
||||
handleConnectClientException(ex, out, targetRequest, usingWWWProxy, currentProxy, requestId);
|
||||
closeSocket(s);
|
||||
} catch (I2PException ex) {
|
||||
_log.info("getPrefix(requestId) + Error trying to connect", ex);
|
||||
handleConnectClientException(ex, out, targetRequest, usingWWWProxy, currentProxy, requestId);
|
||||
closeSocket(s);
|
||||
} catch (OutOfMemoryError oom) {
|
||||
IOException ex = new IOException("OOM");
|
||||
_log.info("getPrefix(requestId) + Error trying to connect", ex);
|
||||
handleConnectClientException(ex, out, targetRequest, usingWWWProxy, currentProxy, requestId);
|
||||
closeSocket(s);
|
||||
}
|
||||
}
|
||||
|
||||
private static class OnTimeout implements Runnable {
|
||||
private Socket _socket;
|
||||
private OutputStream _out;
|
||||
private String _target;
|
||||
private boolean _usingProxy;
|
||||
private String _wwwProxy;
|
||||
private long _requestId;
|
||||
public OnTimeout(Socket s, OutputStream out, String target, boolean usingProxy, String wwwProxy, long id) {
|
||||
_socket = s;
|
||||
_out = out;
|
||||
_target = target;
|
||||
_usingProxy = usingProxy;
|
||||
_wwwProxy = wwwProxy;
|
||||
_requestId = id;
|
||||
}
|
||||
public void run() {
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("Timeout occured requesting " + _target);
|
||||
handleConnectClientException(new RuntimeException("Timeout"), _out,
|
||||
_target, _usingProxy, _wwwProxy, _requestId);
|
||||
closeSocket(_socket);
|
||||
}
|
||||
}
|
||||
|
||||
private static void writeErrorMessage(byte[] errMessage, OutputStream out) throws IOException {
|
||||
if (out == null)
|
||||
return;
|
||||
out.write(errMessage);
|
||||
out.write("\n</body></html>\n".getBytes());
|
||||
out.flush();
|
||||
}
|
||||
|
||||
private static void writeErrorMessage(byte[] errMessage, OutputStream out, String targetRequest,
|
||||
boolean usingWWWProxy, String wwwProxy) throws IOException {
|
||||
if (out != null) {
|
||||
out.write(errMessage);
|
||||
if (targetRequest != null) {
|
||||
out.write(targetRequest.getBytes());
|
||||
if (usingWWWProxy)
|
||||
out.write(("<br>WWW proxy: " + wwwProxy).getBytes());
|
||||
}
|
||||
out.write("</div>".getBytes());
|
||||
out.write("\n</body></html>\n".getBytes());
|
||||
out.flush();
|
||||
}
|
||||
}
|
||||
|
||||
private static void handleConnectClientException(Exception ex, OutputStream out, String targetRequest,
|
||||
boolean usingWWWProxy, String wwwProxy, long requestId) {
|
||||
if (out == null)
|
||||
return;
|
||||
try {
|
||||
String str;
|
||||
byte[] header;
|
||||
if (usingWWWProxy)
|
||||
str = FileUtil.readTextFile("docs/dnfp-header.ht", 100, true);
|
||||
else
|
||||
str = FileUtil.readTextFile("docs/dnf-header.ht", 100, true);
|
||||
if (str != null)
|
||||
header = str.getBytes();
|
||||
else
|
||||
header = ERR_DESTINATION_UNKNOWN;
|
||||
writeErrorMessage(header, out, targetRequest, usingWWWProxy, wwwProxy);
|
||||
} catch (IOException ioe) {}
|
||||
}
|
||||
}
|
@ -5,6 +5,7 @@ package net.i2p.i2ptunnel;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStream;
|
||||
import java.net.Socket;
|
||||
@ -21,6 +22,7 @@ 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;
|
||||
import net.i2p.util.FileUtil;
|
||||
@ -48,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();
|
||||
|
||||
@ -131,16 +133,6 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
|
||||
"Your browser is misconfigured. Do not use the proxy to access the router console or other localhost destinations.<BR>")
|
||||
.getBytes();
|
||||
|
||||
private final static int MAX_POSTBYTES = 20*1024*1024; // arbitrary but huge - all in memory, no temp file
|
||||
private final static byte[] ERR_MAXPOST =
|
||||
("HTTP/1.1 503 Bad POST\r\n"+
|
||||
"Content-Type: text/html; charset=iso-8859-1\r\n"+
|
||||
"Cache-control: no-cache\r\n"+
|
||||
"\r\n"+
|
||||
"<html><body><H1>I2P ERROR: REQUEST DENIED</H1>"+
|
||||
"The maximum POST size is " + MAX_POSTBYTES + " bytes.<BR>")
|
||||
.getBytes();
|
||||
|
||||
/** used to assign unique IDs to the threads / clients. no logic or functionality */
|
||||
private static volatile long __clientId = 0;
|
||||
|
||||
@ -153,12 +145,12 @@ 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, ",");
|
||||
while (tok.hasMoreTokens())
|
||||
@ -193,7 +185,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
|
||||
|
||||
/**
|
||||
* create the default options (using the default timeout, etc)
|
||||
*
|
||||
* unused?
|
||||
*/
|
||||
protected I2PSocketOptions getDefaultOptions() {
|
||||
Properties defaultOpts = getTunnel().getClientOptions();
|
||||
@ -218,6 +210,9 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
|
||||
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)
|
||||
sockMgr = getSocketManager();
|
||||
I2PSocketOptions opts = sockMgr.buildOptions(defaultOpts);
|
||||
if (!defaultOpts.containsKey(I2PSocketOptions.PROP_CONNECT_TIMEOUT))
|
||||
opts.setConnectTimeout(DEFAULT_CONNECT_TIMEOUT);
|
||||
@ -232,6 +227,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
|
||||
|
||||
private static long __requestId = 0;
|
||||
protected void clientConnectionRun(Socket s) {
|
||||
InputStream in = null;
|
||||
OutputStream out = null;
|
||||
String targetRequest = null;
|
||||
boolean usingWWWProxy = false;
|
||||
@ -239,11 +235,12 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
|
||||
long requestId = ++__requestId;
|
||||
try {
|
||||
out = s.getOutputStream();
|
||||
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream(), "ISO-8859-1"));
|
||||
InputReader reader = new InputReader(s.getInputStream());
|
||||
String line, method = null, protocol = null, host = null, destination = null;
|
||||
StringBuffer newRequest = new StringBuffer();
|
||||
int ahelper = 0;
|
||||
while ((line = br.readLine()) != null) {
|
||||
while ((line = reader.readLine(method)) != null) {
|
||||
line = line.trim();
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getPrefix(requestId) + "Line=[" + line + "]");
|
||||
|
||||
@ -257,7 +254,6 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getPrefix(requestId) + "Method is null for [" + line + "]");
|
||||
|
||||
line = line.trim();
|
||||
int pos = line.indexOf(" ");
|
||||
if (pos == -1) break;
|
||||
method = line.substring(0, pos);
|
||||
@ -293,6 +289,19 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
|
||||
}
|
||||
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
|
||||
@ -393,6 +402,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);
|
||||
@ -514,31 +525,12 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
|
||||
newRequest.append("Connection: close\r\n\r\n");
|
||||
break;
|
||||
} else {
|
||||
newRequest.append(line.trim()).append("\r\n"); // HTTP spec
|
||||
newRequest.append(line).append("\r\n"); // HTTP spec
|
||||
}
|
||||
}
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getPrefix(requestId) + "NewRequest header: [" + newRequest.toString() + "]");
|
||||
|
||||
int postbytes = 0;
|
||||
while (br.ready()) { // empty the buffer (POST requests)
|
||||
int i = br.read();
|
||||
if (i != -1) {
|
||||
newRequest.append((char) i);
|
||||
if (++postbytes > MAX_POSTBYTES) {
|
||||
if (out != null) {
|
||||
out.write(ERR_MAXPOST);
|
||||
out.write("<p /><i>Generated on: ".getBytes());
|
||||
out.write(new Date().toString().getBytes());
|
||||
out.write("</i></body></html>\n".getBytes());
|
||||
out.flush();
|
||||
}
|
||||
s.close();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (method == null || destination == null) {
|
||||
l.log("No HTTP method found in the request.");
|
||||
if (out != null) {
|
||||
@ -560,7 +552,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
|
||||
|
||||
Destination dest = I2PTunnel.destFromName(destination);
|
||||
if (dest == null) {
|
||||
l.log("Could not resolve " + destination + ".");
|
||||
//l.log("Could not resolve " + destination + ".");
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Unable to resolve " + destination + " (proxy? " + usingWWWProxy + ", request: " + targetRequest);
|
||||
String str;
|
||||
@ -570,6 +562,8 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
|
||||
str = FileUtil.readTextFile("docs/dnfp-header.ht", 100, true);
|
||||
else if(ahelper != 0)
|
||||
str = FileUtil.readTextFile("docs/dnfb-header.ht", 100, true);
|
||||
else if (destination.length() == 60 && destination.endsWith(".b32.i2p"))
|
||||
str = FileUtil.readTextFile("docs/dnf-header.ht", 100, true);
|
||||
else {
|
||||
str = FileUtil.readTextFile("docs/dnfh-header.ht", 100, true);
|
||||
showAddrHelper = true;
|
||||
@ -608,8 +602,8 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
|
||||
l.log(ex.getMessage());
|
||||
handleHTTPClientException(ex, out, targetRequest, usingWWWProxy, currentProxy, requestId);
|
||||
closeSocket(s);
|
||||
} catch (OutOfMemoryError oom) { // mainly for huge POSTs
|
||||
IOException ex = new IOException("OOM (in POST?)");
|
||||
} catch (OutOfMemoryError oom) {
|
||||
IOException ex = new IOException("OOM");
|
||||
_log.info("getPrefix(requestId) + Error trying to connect", ex);
|
||||
l.log(ex.getMessage());
|
||||
handleHTTPClientException(ex, out, targetRequest, usingWWWProxy, currentProxy, requestId);
|
||||
@ -617,6 +611,29 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Read the first line unbuffered.
|
||||
* After that, switch to a BufferedReader, unless the method is "POST".
|
||||
* We can't use BufferedReader for POST because we can't have readahead,
|
||||
* since we are passing the stream on to I2PTunnelRunner for the POST data.
|
||||
*
|
||||
*/
|
||||
private static class InputReader {
|
||||
BufferedReader _br;
|
||||
InputStream _s;
|
||||
public InputReader(InputStream s) {
|
||||
_br = null;
|
||||
_s = s;
|
||||
}
|
||||
String readLine(String method) throws IOException {
|
||||
if (method == null || "POST".equals(method))
|
||||
return DataHelper.readLine(_s);
|
||||
if (_br == null)
|
||||
_br = new BufferedReader(new InputStreamReader(_s, "ISO-8859-1"));
|
||||
return _br.readLine();
|
||||
}
|
||||
}
|
||||
|
||||
private final static String getHostName(String host) {
|
||||
if (host == null) return null;
|
||||
try {
|
||||
@ -628,7 +645,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
|
||||
}
|
||||
}
|
||||
|
||||
private class OnTimeout implements Runnable {
|
||||
private static class OnTimeout implements Runnable {
|
||||
private Socket _socket;
|
||||
private OutputStream _out;
|
||||
private String _target;
|
||||
@ -706,11 +723,12 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
|
||||
}
|
||||
}
|
||||
|
||||
private void handleHTTPClientException(Exception ex, OutputStream out, String targetRequest,
|
||||
private static void handleHTTPClientException(Exception ex, OutputStream out, String targetRequest,
|
||||
boolean usingWWWProxy, String wwwProxy, long requestId) {
|
||||
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn(getPrefix(requestId) + "Error sending to " + wwwProxy + " (proxy? " + usingWWWProxy + ", request: " + targetRequest, ex);
|
||||
// static
|
||||
//if (_log.shouldLog(Log.WARN))
|
||||
// _log.warn(getPrefix(requestId) + "Error sending to " + wwwProxy + " (proxy? " + usingWWWProxy + ", request: " + targetRequest, ex);
|
||||
if (out != null) {
|
||||
try {
|
||||
String str;
|
||||
@ -725,16 +743,18 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
|
||||
header = ERR_DESTINATION_UNKNOWN;
|
||||
writeErrorMessage(header, out, targetRequest, usingWWWProxy, wwwProxy, false);
|
||||
} catch (IOException ioe) {
|
||||
_log.warn(getPrefix(requestId) + "Error writing out the 'destination was unknown' " + "message", ioe);
|
||||
// static
|
||||
//_log.warn(getPrefix(requestId) + "Error writing out the 'destination was unknown' " + "message", ioe);
|
||||
}
|
||||
} else {
|
||||
_log.warn(getPrefix(requestId) + "Client disconnected before we could say that destination " + "was unknown", ex);
|
||||
// static
|
||||
//_log.warn(getPrefix(requestId) + "Client disconnected before we could say that destination " + "was unknown", ex);
|
||||
}
|
||||
}
|
||||
|
||||
private final static String SUPPORTED_HOSTS[] = { "i2p", "www.i2p.com", "i2p."};
|
||||
|
||||
private boolean isSupportedAddress(String host, String protocol) {
|
||||
private static boolean isSupportedAddress(String host, String protocol) {
|
||||
if ((host == null) || (protocol == null)) return false;
|
||||
boolean found = false;
|
||||
String lcHost = host.toLowerCase();
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
@ -124,8 +125,17 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
|
||||
_log.error("Error while closing the received i2p con", ex);
|
||||
}
|
||||
} catch (IOException ex) {
|
||||
try {
|
||||
socket.close();
|
||||
} catch (IOException ioe) {}
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Error while receiving the new HTTP request", ex);
|
||||
} catch (OutOfMemoryError oom) {
|
||||
try {
|
||||
socket.close();
|
||||
} catch (IOException ioe) {}
|
||||
if (_log.shouldLog(Log.ERROR))
|
||||
_log.error("OOM in HTTP server", oom);
|
||||
}
|
||||
|
||||
long afterHandle = getTunnel().getContext().clock().now();
|
||||
@ -162,7 +172,24 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
|
||||
sender.start();
|
||||
|
||||
browserout = _browser.getOutputStream();
|
||||
serverin = _webserver.getInputStream();
|
||||
// NPE seen here in 0.7-7, caused by addition of socket.close() in the
|
||||
// catch (IOException ioe) block above in blockingHandle() ???
|
||||
// CRIT [ad-130280.hc] net.i2p.util.I2PThread : Killing thread Thread-130280.hc
|
||||
// java.lang.NullPointerException
|
||||
// at java.io.FileInputStream.<init>(FileInputStream.java:131)
|
||||
// at java.net.SocketInputStream.<init>(SocketInputStream.java:44)
|
||||
// at java.net.PlainSocketImpl.getInputStream(PlainSocketImpl.java:401)
|
||||
// at java.net.Socket$2.run(Socket.java:779)
|
||||
// at java.security.AccessController.doPrivileged(Native Method)
|
||||
// at java.net.Socket.getInputStream(Socket.java:776)
|
||||
// at net.i2p.i2ptunnel.I2PTunnelHTTPServer$CompressedRequestor.run(I2PTunnelHTTPServer.java:174)
|
||||
// at java.lang.Thread.run(Thread.java:619)
|
||||
// at net.i2p.util.I2PThread.run(I2PThread.java:71)
|
||||
try {
|
||||
serverin = _webserver.getInputStream();
|
||||
} catch (NullPointerException npe) {
|
||||
throw new IOException("getInputStream NPE");
|
||||
}
|
||||
CompressedResponseOutputStream compressedOut = new CompressedResponseOutputStream(browserout);
|
||||
Sender s = new Sender(compressedOut, serverin, "server: server to browser");
|
||||
if (_log.shouldLog(Log.INFO))
|
||||
@ -221,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");
|
||||
@ -229,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");
|
||||
|
@ -39,23 +39,23 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable
|
||||
Logging l,
|
||||
boolean ownDest,
|
||||
EventDispatcher notifyThis,
|
||||
I2PTunnel tunnel) throws IllegalArgumentException {
|
||||
I2PTunnel tunnel, String pkf) throws IllegalArgumentException {
|
||||
super(localPort,
|
||||
ownDest,
|
||||
l,
|
||||
notifyThis,
|
||||
"IRCHandler " + (++__clientId), tunnel);
|
||||
"IRCHandler " + (++__clientId), tunnel, pkf);
|
||||
|
||||
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 + "\"");
|
||||
}
|
||||
@ -83,9 +83,9 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable
|
||||
i2ps = createI2PSocket(dest);
|
||||
i2ps.setReadTimeout(readTimeout);
|
||||
StringBuffer expectedPong = new StringBuffer();
|
||||
Thread in = new I2PThread(new IrcInboundFilter(s,i2ps, expectedPong));
|
||||
Thread in = new I2PThread(new IrcInboundFilter(s,i2ps, expectedPong), "IRC Client " + __clientId + " in");
|
||||
in.start();
|
||||
Thread out = new I2PThread(new IrcOutboundFilter(s,i2ps, expectedPong));
|
||||
Thread out = new I2PThread(new IrcOutboundFilter(s,i2ps, expectedPong), "IRC Client " + __clientId + " out");
|
||||
out.start();
|
||||
} catch (Exception ex) {
|
||||
if (_log.shouldLog(Log.ERROR))
|
||||
|
@ -0,0 +1,188 @@
|
||||
package net.i2p.i2ptunnel;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.InetAddress;
|
||||
import java.net.Socket;
|
||||
import java.net.SocketException;
|
||||
import java.util.Properties;
|
||||
|
||||
import net.i2p.client.streaming.I2PSocket;
|
||||
import net.i2p.crypto.SHA256Generator;
|
||||
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.Log;
|
||||
|
||||
/**
|
||||
* Simple extension to the I2PTunnelServer that filters the registration
|
||||
* sequence to pass the destination hash of the client through as the hostname,
|
||||
* so an IRC Server may track users across nick changes.
|
||||
*
|
||||
* Of course, this requires the ircd actually use the hostname sent by
|
||||
* the client rather than the IP. It is common for ircds to ignore the
|
||||
* hostname in the USER message (unless it's coming from another server)
|
||||
* since it is easily spoofed. So you have to fix or, if you are lucky,
|
||||
* configure your ircd first. At least in unrealircd and ngircd this is
|
||||
* not configurable.
|
||||
*
|
||||
* There are three options for mangling the desthash. Put the option in the
|
||||
* "custom options" section of i2ptunnel.
|
||||
* - ircserver.cloakKey unset: Cloak with a random value that is persistent for
|
||||
* the life of this tunnel. This is the default.
|
||||
* - ircserver.cloakKey=somepassphrase: Cloak with the hash of the passphrase. Use this to
|
||||
* have consistent mangling across restarts, or to
|
||||
* have multiple IRC servers cloak consistently to
|
||||
* be able to track users even when they switch servers.
|
||||
* Note: don't quote or put spaces in the passphrase,
|
||||
* the i2ptunnel gui can't handle it.
|
||||
* - ircserver.fakeHostname=%f.b32.i2p: Set the fake hostname sent by I2PTunnel,
|
||||
* %f is the full B32 destination hash
|
||||
* %c is the cloaked hash.
|
||||
*
|
||||
* There is no outbound filtering.
|
||||
*
|
||||
* @author zzz
|
||||
*/
|
||||
public class I2PTunnelIRCServer extends I2PTunnelServer implements Runnable {
|
||||
public static final String PROP_CLOAK="ircserver.cloakKey";
|
||||
public static final String PROP_HOSTNAME="ircserver.fakeHostname";
|
||||
public static final String PROP_HOSTNAME_DEFAULT="%f.b32.i2p";
|
||||
|
||||
private static final Log _log = new Log(I2PTunnelIRCServer.class);
|
||||
|
||||
|
||||
/**
|
||||
* @throws IllegalArgumentException if the I2PTunnel does not contain
|
||||
* valid config to contact the router
|
||||
*/
|
||||
|
||||
public I2PTunnelIRCServer(InetAddress host, int port, File privkey, String privkeyname, Logging l, EventDispatcher notifyThis, I2PTunnel tunnel) {
|
||||
super(host, port, privkey, privkeyname, l, notifyThis, tunnel);
|
||||
initCloak(tunnel);
|
||||
}
|
||||
|
||||
/** generate a random 32 bytes, or the hash of the passphrase */
|
||||
private void initCloak(I2PTunnel tunnel) {
|
||||
Properties opts = tunnel.getClientOptions();
|
||||
String passphrase = opts.getProperty(PROP_CLOAK);
|
||||
if (passphrase == null) {
|
||||
this.cloakKey = new byte[Hash.HASH_LENGTH];
|
||||
tunnel.getContext().random().nextBytes(this.cloakKey);
|
||||
} else {
|
||||
this.cloakKey = SHA256Generator.getInstance().calculateHash(passphrase.trim().getBytes()).getData();
|
||||
}
|
||||
|
||||
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
|
||||
socket.setReadTimeout(15*1000);
|
||||
InputStream in = socket.getInputStream();
|
||||
String modifiedRegistration = filterRegistration(in, cloakDest(socket.getPeerDestination()));
|
||||
socket.setReadTimeout(readTimeout);
|
||||
Socket s = new Socket(remoteHost, remotePort);
|
||||
new I2PTunnelRunner(s, socket, slock, null, modifiedRegistration.getBytes(), null);
|
||||
} catch (SocketException ex) {
|
||||
try {
|
||||
socket.close();
|
||||
} catch (IOException ioe) {
|
||||
if (_log.shouldLog(Log.ERROR))
|
||||
_log.error("Error while closing the received i2p con", ex);
|
||||
}
|
||||
} catch (IOException ex) {
|
||||
try {
|
||||
socket.close();
|
||||
} catch (IOException ioe) {}
|
||||
if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Error while receiving the new IRC Connection", ex);
|
||||
} catch (OutOfMemoryError oom) {
|
||||
try {
|
||||
socket.close();
|
||||
} catch (IOException ioe) {}
|
||||
if (_log.shouldLog(Log.ERROR))
|
||||
_log.error("OOM in IRC server", oom);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* (Optionally) append 32 bytes of crap to the destination then return
|
||||
* the first few characters of the hash of the whole thing, + ".i2p".
|
||||
* Or do we want the full hash if the ircd is going to use this for
|
||||
* nickserv auto-login? Or even Base32 if it will be used in a
|
||||
* case-insensitive manner?
|
||||
*
|
||||
*/
|
||||
String cloakDest(Destination d) {
|
||||
String hf;
|
||||
String hc;
|
||||
|
||||
byte[] b = new byte[d.size() + this.cloakKey.length];
|
||||
System.arraycopy(b, 0, d.toByteArray(), 0, d.size());
|
||||
System.arraycopy(b, d.size(), this.cloakKey, 0, this.cloakKey.length);
|
||||
hc = Base32.encode(SHA256Generator.getInstance().calculateHash(b).getData());
|
||||
|
||||
hf = Base32.encode(d.calculateHash().getData());
|
||||
|
||||
return this.hostname.replace("%f", hf).replace("%c", hc);
|
||||
}
|
||||
|
||||
/** keep reading until we see USER or SERVER */
|
||||
private String filterRegistration(InputStream in, String newHostname) throws IOException {
|
||||
StringBuffer buf = new StringBuffer(128);
|
||||
int lineCount = 0;
|
||||
|
||||
while (true) {
|
||||
String s = DataHelper.readLine(in);
|
||||
if (s == null)
|
||||
throw new IOException("EOF reached before the end of the headers [" + buf.toString() + "]");
|
||||
if (++lineCount > 10)
|
||||
throw new IOException("Too many lines before USER or SERVER, giving up");
|
||||
s = s.trim();
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("Got line: " + s);
|
||||
|
||||
String field[]=s.split(" ",5);
|
||||
String command;
|
||||
int idx=0;
|
||||
|
||||
if(field[0].charAt(0)==':')
|
||||
idx++;
|
||||
|
||||
try {
|
||||
command = field[idx++];
|
||||
} catch (IndexOutOfBoundsException ioobe) {
|
||||
// wtf, server sent borked command?
|
||||
throw new IOException("Dropping defective message: index out of bounds while extracting command.");
|
||||
}
|
||||
|
||||
if ("USER".equalsIgnoreCase(command)) {
|
||||
if (field.length < idx + 4)
|
||||
throw new IOException("Too few parameters in USER message: " + s);
|
||||
// USER zzz1 hostname localhost :zzz
|
||||
// =>
|
||||
// USER zzz1 abcd1234.i2p localhost :zzz
|
||||
// this whole class is for these two lines...
|
||||
buf.append("USER ").append(field[idx]).append(' ').append(newHostname);
|
||||
buf.append(' ');
|
||||
buf.append(field[idx+2]).append(' ').append(field[idx+3]).append("\r\n");
|
||||
break;
|
||||
}
|
||||
buf.append(s).append("\r\n");
|
||||
if ("SERVER".equalsIgnoreCase(command))
|
||||
break;
|
||||
}
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug("All done, sending: " + buf.toString());
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
private byte[] cloakKey; // 32 bytes of stuff to scramble the dest with
|
||||
private String hostname;
|
||||
}
|
@ -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);
|
||||
|
@ -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) {
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user