merge of '3534b3e357a365476c2deeb8470ae794595cf1a8'

and 'c06ed6aab297ea837746dfa5dacb1a8f78d8d3dc'
This commit is contained in:
dev
2009-04-11 20:28:28 +00:00
97 changed files with 4804 additions and 438 deletions

View File

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

View File

@ -34,6 +34,9 @@ import java.util.Properties;
import net.i2p.client.I2PClient;
import net.i2p.client.streaming.RetransmissionTimer;
import net.i2p.util.Log;
import net.i2p.util.SimpleScheduler;
import net.i2p.util.SimpleTimer2;
/**
* <span style="font-size:8px;font-family:courier;color:#EEEEEE;background-color:#000000">
* ################################################################################<br>
@ -157,12 +160,15 @@ public class BOB {
boolean save = false;
// Set up all defaults to be passed forward to other threads.
// Re-reading the config file in each thread is pretty damn stupid.
// I2PClient client = I2PClientFactory.createClient();
String configLocation = System.getProperty(PROP_CONFIG_LOCATION, "bob.config");
// This is here just to ensure there is no interference with our threadgroups.
RetransmissionTimer Y = RetransmissionTimer.getInstance();
SimpleScheduler Y1 = SimpleScheduler.getInstance();
SimpleTimer2 Y2 = SimpleTimer2.getInstance();
i = Y.hashCode();
i = Y1.hashCode();
i = Y2.hashCode();
{
try {
FileInputStream fi = new FileInputStream(configLocation);

View File

@ -46,7 +46,7 @@ public class DoCMDS implements Runnable {
// FIX ME
// I need a better way to do versioning, but this will do for now.
public static final String BMAJ = "00", BMIN = "00", BREV = "04", BEXT = "";
public static final String BMAJ = "00", BMIN = "00", BREV = "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();

View File

@ -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,22 +79,39 @@ public class I2Plistener implements Runnable {
boolean g = false;
I2PSocket sessSocket = null;
die: {
serverSocket.setSoTimeout(50);
database.getReadLock();
info.getReadLock();
if(info.exists("INPORT")) {
tgwatch = 2;
}
info.releaseReadLock();
database.releaseReadLock();
// 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();
try {
rlock();
} catch (Exception e) {
break die;
}
try {
spin = info.get("RUNNING").equals(Boolean.TRUE);
info.releaseReadLock();
database.releaseReadLock();
} catch (Exception e) {
try {
runlock();
} catch (Exception e2) {
break die;
}
break die;
}
try {
try {
sessSocket = serverSocket.accept();
@ -107,30 +133,35 @@ public class I2Plistener implements Runnable {
// System.out.println("Exception " + e);
}
}
}
// System.out.println("I2Plistener: Close");
try {
serverSocket.close();
} catch(I2PException e) {
// 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) {
// I2PSession session = socketManager.getSession();
// if (session != null) {
// System.out.println("I2Plistener: destroySession");
try {
session.destroySession();
} catch(I2PSessionException ex) {
// 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) {
// 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.");
}

View File

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

View File

@ -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
@ -100,7 +102,7 @@ public class MUXlisten implements Runnable {
// 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,12 +132,12 @@ 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);
info.add("RUNNING", new Boolean(true));
} catch (Exception e) {
wunlock();
return;
@ -148,17 +150,21 @@ public class MUXlisten implements Runnable {
} 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) {
// 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();
}
@ -170,12 +176,28 @@ die: {
q.start();
}
try {
wlock();
try {
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(200); //sleep for 200 ms (Two thenths second)
Thread.sleep(1000); //sleep for 1 second
} catch (InterruptedException e) {
// nop
break die;
}
try {
rlock();
@ -198,7 +220,7 @@ die: {
try {
wlock();
try {
info.add("RUNNING", Boolean.FALSE);
info.add("RUNNING", new Boolean(false));
} catch (Exception e) {
wunlock();
break die;
@ -213,22 +235,49 @@ die: {
}
} // die
if (SS != null) {
try {
Thread.sleep(500); //sleep for 500 ms (One half second)
} catch(InterruptedException ex) {
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
}
// wait for child threads and thread groups to die
}
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.
while(tg.activeCount() + tg.activeGroupCount() != 0) {
ticks--;
try {
Thread.sleep(100); //sleep for 100 ms (One tenth second)
} catch (InterruptedException ex) {
// nop
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.
@ -238,51 +287,16 @@ die: {
break quit;
}
} // quit
// This is here to catch when something fucks up REALLY bad.
if(tg != null) {
System.out.println("BOB: MUXlisten: Something fucked up REALLY bad!");
System.out.println("BOB: MUXlisten: Please email the following dump to sponge@mail.i2p");
WrapperManager.requestThreadDump();
System.out.println("BOB: MUXlisten: Something fucked up REALLY bad!");
System.out.println("BOB: MUXlisten: Please email the above dump to sponge@mail.i2p");
}
// zero out everything, just incase.
try {
socketManager.destroySocketManager();
} catch(Exception e) {
// nop
}
try {
wlock();
try {
info.add("STARTING", Boolean.FALSE);
info.add("STOPPING", Boolean.FALSE);
info.add("RUNNING", Boolean.FALSE);
} catch(Exception e) {
wunlock();
return;
}
wunlock();
} catch(Exception e) {
}
// This is here to catch when something fucks up REALLY bad.
if(tg != null) {
if(tg.activeCount() + tg.activeGroupCount() != 0) {
tg.interrupt(); // unwedge any blocking threads.
while(tg.activeCount() + tg.activeGroupCount() != 0) {
try {
Thread.sleep(100); //sleep for 100 ms (One tenth second)
} catch(InterruptedException ex) {
// nop
}
}
}
tg.destroy();
// Zap reference to the ThreadGroup so the JVM can GC it.
tg = null;
}
// Lastly try to close things again.
// This is here to catch when something fucks up REALLY bad.
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();
@ -294,6 +308,98 @@ die: {
} 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", new Boolean(false));
info.add("STOPPING", new Boolean(false));
info.add("RUNNING", new Boolean(false));
} catch (Exception e) {
wunlock();
return;
}
wunlock();
} catch (Exception e) {
}
}
// Debugging...
/**
* 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);
}
}
}

View File

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

View File

@ -23,6 +23,7 @@
*/
package net.i2p.BOB;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@ -35,21 +36,21 @@ public class TCPio implements Runnable {
private InputStream Ain;
private OutputStream Aout;
private NamedDB info, database;
// private NamedDB info, database;
/**
* Constructor
*
* @param Ain
* @param Aout
* @param info
* @param database
* @param Ain InputStream
* @param Aout OutputStream
*
* param database
*/
TCPio(InputStream Ain, OutputStream Aout, NamedDB info, NamedDB database) {
TCPio(InputStream Ain, OutputStream Aout /*, NamedDB info , NamedDB database */) {
this.Ain = Ain;
this.Aout = Aout;
this.info = info;
this.database = database;
// this.info = info;
// this.database = database;
}
/**
@ -86,11 +87,11 @@ public class TCPio implements Runnable {
boolean spin = true;
try {
while(spin) {
database.getReadLock();
info.getReadLock();
spin = info.get("RUNNING").equals(Boolean.TRUE);
info.releaseReadLock();
database.releaseReadLock();
// 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) {
@ -98,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:
@ -113,6 +114,8 @@ public class TCPio implements Runnable {
*
*/
// System.out.println("TCPio: End Of Stream");
Ain.close();
Aout.close();
return;
}
}
@ -120,6 +123,16 @@ public class TCPio implements Runnable {
} catch(Exception e) {
// Eject!!! Eject!!!
//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.");

View File

@ -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,22 +90,49 @@ public class TCPlistener implements Runnable {
public void run() {
boolean g = false;
boolean spin = true;
database.getReadLock();
info.getReadLock();
die: {
try {
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
info.releaseReadLock();
database.releaseReadLock();
while (spin) {
database.getReadLock();
info.getReadLock();
try {
rlock();
} catch (Exception e) {
break die;
}
try {
spin = info.get("RUNNING").equals(Boolean.TRUE);
info.releaseReadLock();
database.releaseReadLock();
} catch (Exception e) {
try {
runlock();
} catch (Exception e2) {
break die;
}
break die;
}
try {
server = listener.accept();
g = true;
@ -94,7 +141,7 @@ public class TCPlistener implements Runnable {
}
if (g) {
// toss the connection to a new thread.
TCPtoI2P conn_c = new TCPtoI2P(socketManager, server, info, database);
TCPtoI2P conn_c = new TCPtoI2P(socketManager, server /* , info, database */);
Thread t = new Thread(conn_c, "BOBTCPtoI2P");
t.start();
g = false;
@ -108,38 +155,57 @@ public class TCPlistener implements Runnable {
} catch (IOException e) {
}
// Fatal failure, cause a stop event
database.getReadLock();
info.getReadLock();
try {
rlock();
try {
spin = info.get("RUNNING").equals(Boolean.TRUE);
info.releaseReadLock();
database.releaseReadLock();
} catch (Exception e) {
runlock();
break die;
}
} catch (Exception e) {
break die;
}
if (spin) {
database.getWriteLock();
info.getWriteLock();
try {
wlock();
try {
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) {
try {
session.destroySession();
} catch(I2PSessionException ex) {
// nop
}
}
//System.out.println("TCPlistener: Waiting for children");
while(Thread.activeCount() > tgwatch) { // wait for all threads in our threadgroup to finish
try {
Thread.sleep(100); //sleep for 100 ms (One tenth second)
} catch (Exception e) {
wunlock();
break die;
}
} catch (Exception e) {
break die;
}
try {
wunlock();
} catch (Exception e) {
break die;
}
}
}
}
// Previous level does this cleanup now.
//
// need to kill off the socket manager too.
// I2PSession session = socketManager.getSession();
// if (session != null) {
// try {
// session.destroySession();
// } catch (I2PSessionException ex) {
// nop
}
}
// }
//}
//System.out.println("TCPlistener: Waiting for children");
//while (Thread.activeCount() > tgwatch) { // wait for all threads in our threadgroup to finish
// try {
// Thread.sleep(100); //sleep for 100 ms (One tenth second)
// } catch (Exception e) {
// // nop
// }
//}
//System.out.println("TCPlistener: Done.");
}
}

View File

@ -45,7 +45,7 @@ import net.i2p.i2ptunnel.I2PTunnel;
public class TCPtoI2P implements Runnable {
private I2PSocket I2P;
private NamedDB info, database;
// private NamedDB info, database;
private Socket sock;
private I2PSocketManager socketManager;
@ -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.");
}
}

15
apps/desktopgui/LICENSE Normal file
View File

@ -0,0 +1,15 @@
Desktop GUI: provides a simple GUI for I2P.
Copyright (C) 2009 Mathias De Maré
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; only version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

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

@ -0,0 +1,115 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- You may freely edit this file. See commented blocks below for -->
<!-- some examples of how to customize the build. -->
<!-- (If you delete it and reopen the project it will be recreated.) -->
<!-- By default, only the Clean and Build commands use this build script. -->
<!-- Commands such as Run, Debug, and Test only use this build script if -->
<!-- the Compile on Save feature is turned off for the project. -->
<!-- You can turn off the Compile on Save (or Deploy on Save) setting -->
<!-- in the project's Project Properties dialog box.-->
<project name="desktopgui" default="default" basedir=".">
<description>Builds, tests, and runs the project desktopgui.</description>
<import file="nbproject/build-impl.xml"/>
<!--
There exist several targets which are by default empty and which can be
used for execution of your tasks. These targets are usually executed
before and after some main targets. They are:
-pre-init: called before initialization of project properties
-post-init: called after initialization of project properties
-pre-compile: called before javac compilation
-post-compile: called after javac compilation
-pre-compile-single: called before javac compilation of single file
-post-compile-single: called after javac compilation of single file
-pre-compile-test: called before javac compilation of JUnit tests
-post-compile-test: called after javac compilation of JUnit tests
-pre-compile-test-single: called before javac compilation of single JUnit test
-post-compile-test-single: called after javac compilation of single JUunit test
-pre-jar: called before JAR building
-post-jar: called after JAR building
-post-clean: called after cleaning build products
(Targets beginning with '-' are not intended to be called on their own.)
Example of inserting an obfuscator after compilation could look like this:
<target name="-post-compile">
<obfuscate>
<fileset dir="${build.classes.dir}"/>
</obfuscate>
</target>
For list of available properties check the imported
nbproject/build-impl.xml file.
Another way to customize the build is by overriding existing main targets.
The targets of interest are:
-init-macrodef-javac: defines macro for javac compilation
-init-macrodef-junit: defines macro for junit execution
-init-macrodef-debug: defines macro for class debugging
-init-macrodef-java: defines macro for class execution
-do-jar-with-manifest: JAR building (if you are using a manifest)
-do-jar-without-manifest: JAR building (if you are not using a manifest)
run: execution of project
-javadoc-build: Javadoc generation
test-report: JUnit report generation
An example of overriding the target for project execution could look like this:
<target name="run" depends="BOB-impl.jar">
<exec dir="bin" executable="launcher.exe">
<arg file="${dist.jar}"/>
</exec>
</target>
Notice that the overridden target depends on the jar target and not only on
the compile target as the regular run target does. Again, for a list of available
properties which you can use, check the target you are overriding in the
nbproject/build-impl.xml file.
-->
<property name="build_src" location="src"/>
<property name="build_bin" location="bin"/>
<property name="build_dist" location="dist"/>
<property name="build_lib" location="lib"/>
<property name="build_i2pref" location="../../build"/>
<path id="build_classpath">
<fileset dir="${build_lib}" includes="**/*.jar"/>
<fileset dir="${build_i2pref}" includes="**/*.jar"/>
</path>
<target name="build_init">
<!-- Create the time stamp -->
<tstamp/>
<mkdir dir="${build_dist}"/>
<mkdir dir="${build_bin}"/>
</target>
<target name="build_compile" depends="build_init"
description="compile the source " >
<!-- Compile the java code from ${src} into ${bin} -->
<javac srcdir="${build_src}" destdir="${build_bin}" classpathref="build_classpath"/>
<copy todir="${build_bin}">
<fileset dir="${build_src}">
<exclude name="**/*.java"/>
</fileset>
</copy>
</target>
<target name="build_jar" depends="build_compile"
description="generate the distribution" >
<!-- Create the distribution directory -->
<mkdir dir="${build_dist}/lib"/>
<!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->
<zip destfile="${build_dist}/desktopgui.jar" basedir="${build_bin}" />
</target>
<target name="build_clean"
description="clean up" >
<!-- Delete the ${build} and ${dist} directory trees -->
<delete dir="${build_bin}"/>
<delete dir="${build_dist}"/>
</target>
</project>

View File

@ -0,0 +1,261 @@
<html>
<head>
<title>Small Guide to I2P</title>
</head>
<body>
<h1>Small Guide to I2P</h1>
<h2>So, what's this all about?</h2>
<p>I2P builds up a new net inside the usual internet, connecting nodes together
via encrypted connections.
It is a JAVA prgram with its most used part (the encryption of the data) written
in handoptimized assembler code.
It will use your bandwith, your RAM and your CPU. It will use them all up if you
do not limit it.
I2P will route unknown traffic through your node, even stuff you dislike.
As that data is encrypted, nobody knows whats data went to or drom your node.
</p>
<p>
First, ALWAYS use the latest stable release.
Development releases are called "mtn version" and are marked with a -, e.g.
0.6.5-1. Those are usually useable by all but could do harm to your I2P
experience.
You can get the latest MTN builds from my eepsite echelon.i2p, but always
remember: I built them, you need to trust me not to changed the code!
After you get the right "i2pupdate.zip" file, put that file into the I2P
directory and hit restart on the router console http://127.0.0.1:7657.
Do NOT deflate the zip file!
</p>
<p>
I2P is very dynamic - after startup it tries to get known to other I2P routers
and measures their speed - you need to wait some 10-120 minutes until your
I2P router knows enough other ones to obtain full power of I2P.
</p>
<h2>Filesharing</h2>
<p>
I2P is able to do anonymous filesharing.
But as there are NO gateways between real net and I2P, you can only share/
download torrents from within I2P. Look e.g. postman.i2p or planet.i2p.
You CANNOT use azureus, utorrent or any other usual client.
You cannot download anonymous torrents from mininova, piratebay or else.
You need to use I2P internal torrents and I2P aware programs like
I2Psnark (builtin, suitable for 1-20 torrents)
I2PRufus (external, python, high CPU load, suitable >20 torrents) http://echelon.i2p/i2prufus
I2P-BT (external, python)
I2PsnarkXL (mod of I2Psnark made by fwd)
</p>
<p>
There are also gnutella and edonkey clients:
i2phex for gnutella (http://echelon.i2p/i2phex)
imule for edonkey (http://echelon.i2p/imule)
</p>
<p>
Remember, as I2P uses other routers to route your traffic via 1-6 other PCs,
your transferrates in P2P are slower than in usual internet.
But you are anonymous, no one can easily (within 2 months-2 years) get your IP!
torrents inside of I2P reaches up to 50 kb/sec, usual are 10-20 kb/sec per torrent
i2phex reaches up to 20 kb/sec, usually 5-10 kb/sec
imule in times reaches 10 kb/sec, usually 5-10 kb/sec
</p>
<p>
In I2PHex and imule you can just tell "share file or directory", in torrent
you need to create a .torrent file and upload that (and ONLY that small .torrent)
file to the trackers like tracker.postman.i2p/
</p>
<p>
I2P is a smaller net (1000 users) which grows slowly. As of which amount of shared
data will slowly rise.
</p>
<p>
I2P is anonymous and it does not censor - there is no administrator.
There IS unwanted stuff like kiddyporn, nazism, or else.
If you dislike all this, do not use I2P.
There is NO way to prohibite this stuff to appear in a anonymous net like I2P.
(as that stuff is available shows the anonymity and transfer function of I2P
is working well enough)
You can delete the destinations in question from your local hosts.txt file (or
deface them) which will partly prevent you to reach those bad sies by accident.
</p>
<h2>Internet (the websites)</h2>
<p>
Only one outproxy (gateway I2P - webpages in usual Internet) is working.
It is NOT official from I2P, I2P does work without.
If that outproxy is slow, offline, gone,.. I2P still works on and cannot do
anything to change that failure.
That outproxy translates usual internet webpages into the I2P net and you can
reach them via your Router.
The best way for usual webpages is TOR, not that outproxy.
Remember: the owner of the outproxy got ALL traffic from all I2P users
visiting Internet pages and will risk that into the police!
</p>
<p>
This proxy is false.i2p. In newer I2P routers it is enabled, but not in
older ones. Go to http://127.0.0.1:7657/i2ptunnel/index.jsp tunnels page and
click on the eepProxy tunnel. Change the entry for the "Outproxies" to false.i2p
and save. On the tunnels page, stop the epproxy tunnel and start it again,
now your router will use the false.i2p outproxy.
</p>
<p>
No other (known) gateways are setup and running. No one we know will run
the gateway for torrent or any other P2P data (and risk his life).
</p>
<h2>Bandwidth</h2>
<p>http://127.0.0.1:7657/config.jsp</p>
<p>Setup your bandwith wisely. Know your linespeed!</p>
<p>
E.g. most common terms are:
1Mbit = roughly 100 kbyte/sec
10 MBit = roughly 1100 kbyte/sec
512 kbit = roughly 50 kbyte/sec
or in germany:
16000er = roughly 1500 kbyte/sec
6000er = roughly 600 kbyte/sec
1000er = roughly 100 kb/sec
</p>
<p>
Set your bandwith limits to 10% under your line speed and burst rate to
your line speed.
Set the bandwith share percentage to:
>80% if lowest bandwith setting is >50k
>50% if lowest bandwith setting is >30k
>20% if lowest bandwith setting is >16k
</p>
<p>There is no shared bandwith under 16k.</p>
<p>
Limit your participating tunnels (shared bandwith) on:
http://127.0.0.1:7657/configadvanced.jsp
with the line:
router.maxParticipatingTunnels=500
</p>
<p>
2000 is for roughly 600 kb/sec - very high value with high CPU load
1000 is for roughly 300 kb/sec
600 is a good value for 150-200kb/sec
300 is roughly 90 kb/sec
150 roughly 50 kb/sec
Remember: even failed tunnel requests will result in a part tunnel on the hops in between!
Those said, there are far more part tunnels unused than used in the live net under load, which
results in slower bandwith per tunnel in the end.
It is wise to first limit the bandwith and afterwards the part tunnels, e.g. set some more part
tunnels and let I2P reach the bandwith limit instead of the part tunnels limit!
</p>
<h2>What is shared bandwidth?</h2>
<p>
I2P transports your date from the client to the server through 1-6 hops
(other I2P routers). Each of this hops sees the data from you as "participating
tunnel" - which is the shared bandwith of them.
With this in mind, I2P needs some amount of this shared bandwith at some
amount of routers.
Share as much as you are able of - others will thank you!
</p>
<p>
With the "share percentage" set like above, you will obtain enough speed for
your own traffic and obtain some participating tunnels (if >16kb/sec) with some
noise traffic to hide your traffic in the stream.
</p>
<p>
With release 0.6.5 there is some method to prefer your own traffic ahead
of shared traffic which will result in better experience to you!
</p>
<h2>Addressbook</h2>
<p>
I2P uses a local addressbook to link short DNS names with the internal used 512bit
hashes (which are destination IDs).
Those links are saved insside the hosts.txt and userhosts.txt files in the i2p
directory.
Hosts which are not in those files cannot be reached via the short DNS names
and a error message with "jumper links" will appear. Those links will ask
some hosts services and forward to the correct site (if the site is known to them).
Those hosts services just made a form to add new "hosts" and those results public
available.
You can subscribe to those hosts service and let your hosts.txt file be updated
automatic. Go to http://127.0.0.1:7657/susidns/subscriptions.jsp SusiDNS
and enter the hosts services into the textbox (and save afterwards):
http://www.i2p2.i2p/hosts.txt
http://stats.i2p/cgi-bin/newhosts.txt
http://tino.i2p/hosts.txt
http://i2host.i2p/cgi-bin/i2hostag
You can add one of them, two or all.
SusiDNS will now ask those hosts for new entries to the hosts.txt and those
will be added to your hosts.txt. The userhosts.txt will ONLY be updated by
yourself (the user) and not be published into the net!
Remember, names once set could not be changed! If you loose your key (destination
ID) to your eepsite, service,..., there is no way to change the linking
between the DNS name and the (lost) destination ID automatic! Only manual by each
user itself - great topic to discuss of need to renew DNS hostnames.
As this subscription will not update old entries, you can "deface" unwanted
eepsites with a false key and if you hit the bad name in browser by accident,
you will not see the bad stuff!
</p>
<h2>Out of Memory errors </h2>
<p>
If your router hits the Out of Memory error - check your logs!
Usual point for OOM are to much torrents in i2psnark - i2psnark is a real
memory hogg and >10 torrents it requiers hell a lot of memory!
</p>
<p>
Maybe it is possible for you to increase the wrapper memory config.
This ONLY works if you start the I2P service restartable with console
(on Windows).
In I2P directory edit the wrapper.config file and change the values:
wrapper.java.maxmemory=256 (or even to 512, IF possible)
Afterwards shutdown I2P complete (the service) and restart it.
</p>
<h2>Blocklists</h2>
<p>
Sometimes attackers trying to flood the I2P net and try to do some harm.
And some folks setting localnet IPs as their internet reachable address.
To prevent those bad router to harm the local router, I2P implemented
a local blocklist system. It is NOT integrated automatic as it could
really harm your I2P experience if setup the wrong way.
The way to enable blocklists is:
Get the file http://zzz.i2p/files/blocklist.txt and copy this file into the
I2P directory.
On http://127.0.0.1:7657/configadvanced.jsp set the option
router.blocklist.enable=true - click on Apply and restart the router
with the restart link left on router console.
The blockfile.txt file follows a special order, you<6F>ll get it if you read it.
The first entry is the reason to be shown on http://127.0.0.1:7657/profiles.jsp
at the bottom in the shitlist section.
The second entry is the IP or the dest ID of a router.
Right now there are only private subnets in the blocklist AND one chinese router
which floods the floodfill DB while restarting every few minutes with a different
router ID and far to less bandwith for being a floodfill router.
</p>
<p>(By echelon -- echelon.i2p )</p>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Binary file not shown.

View File

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

View File

@ -0,0 +1,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 &quot;${ant.java.version}"/>
<condition property="have-jdk-older-than-1.4">
<or>
<contains string="${version-output}" substring="java version &quot;1.0"/>
<contains string="${version-output}" substring="java version &quot;1.1"/>
<contains string="${version-output}" substring="java version &quot;1.2"/>
<contains string="${version-output}" substring="java version &quot;1.3"/>
</or>
</condition>
<condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
<istrue value="${have-jdk-older-than-1.4}"/>
</condition>
</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>

View File

@ -0,0 +1,8 @@
build.xml.data.CRC32=c4b345cd
build.xml.script.CRC32=9785bb9a
build.xml.stylesheet.CRC32=be360661
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
nbproject/build-impl.xml.data.CRC32=c4b345cd
nbproject/build-impl.xml.script.CRC32=74d3fda2
nbproject/build-impl.xml.stylesheet.CRC32=487672f9

View File

@ -0,0 +1,77 @@
application.desc=An anonymous communication network.
application.homepage=http://www.i2p2.de
application.title=I2P Desktop GUI
application.vendor=I2P Developers
build.classes.dir=${build.dir}/classes
build.classes.excludes=**/*.java,**/*.form
# This directory is removed when the project is cleaned:
build.dir=build
build.generated.dir=${build.dir}/generated
# Only compile against the classpath explicitly listed here:
build.sysclasspath=ignore
build.test.classes.dir=${build.dir}/test/classes
build.test.results.dir=${build.dir}/test/results
debug.classpath=\
${run.classpath}
debug.test.classpath=\
${run.test.classpath}
# This directory is removed when the project is cleaned:
dist.dir=dist
dist.jar=${dist.dir}/desktopgui.jar
dist.javadoc.dir=${dist.dir}/javadoc
excludes=
file.reference.appframework.jar=lib/appframework.jar
file.reference.i2p.jar=../../core/java/build/i2p.jar
file.reference.router.jar=../../router/java/build/router.jar
file.reference.swing-worker.jar=lib/swing-worker.jar
includes=**
jar.compress=false
javac.classpath=\
${file.reference.router.jar}:\
${file.reference.appframework.jar}:\
${file.reference.swing-worker.jar}:\
${file.reference.i2p.jar}
# Space-separated list of extra javac options
javac.compilerargs=
javac.deprecation=false
javac.source=1.6
javac.target=1.6
javac.test.classpath=\
${javac.classpath}:\
${build.classes.dir}:\
${libs.junit.classpath}:\
${libs.junit_4.classpath}
javadoc.additionalparam=
javadoc.author=false
javadoc.encoding=${source.encoding}
javadoc.encoding.used=${javadoc.encoding}
javadoc.noindex=false
javadoc.nonavbar=false
javadoc.notree=false
javadoc.private=false
javadoc.splitindex=true
javadoc.use=true
javadoc.version=false
javadoc.windowtitle=
jnlp.codebase.type=local
jnlp.codebase.url=file:/home/mathias/Documenten/Programmeren/i2p_monotone/repo/i2p.i2p/apps/desktopgui/dist/
jnlp.enabled=false
jnlp.offline-allowed=false
jnlp.signed=false
main.class=desktopgui.Main
manifest.file=manifest.mf
meta.inf.dir=${src.dir}/META-INF
platform.active=default_platform
run.classpath=\
${javac.classpath}:\
${build.classes.dir}
# Space-separated list of JVM arguments used when running the project
# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value
# or test-sys-prop.name=value to set system properties for unit tests):
run.jvmargs=
run.test.classpath=\
${javac.test.classpath}:\
${build.test.classes.dir}
source.encoding=UTF-8
src.dir=src
test.src.dir=test

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://www.netbeans.org/ns/project/1">
<type>org.netbeans.modules.java.j2seproject</type>
<configuration>
<data xmlns="http://www.netbeans.org/ns/j2se-project/3">
<name>desktopgui</name>
<minimum-ant-version>1.6.5</minimum-ant-version>
<source-roots>
<root id="src.dir"/>
</source-roots>
<test-roots>
<root id="test.src.dir"/>
</test-roots>
</data>
<swingapp xmlns="http://www.netbeans.org/ns/form-swingapp/1">
<application-class name="desktopgui.Main"/>
</swingapp>
</configuration>
</project>

View File

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

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

View File

@ -0,0 +1,11 @@
# Application global resources
Application.name = desktopgui
Application.title = I2P Desktop GUI
Application.version = 0.7.1
Application.vendor = I2P Developers
Application.homepage = http://www.i2p2.de
Application.description = An anonymous communication network.
Application.vendorId = I2P
Application.id = desktopgui
Application.lookAndFeel = system

View File

@ -0,0 +1,11 @@
# Application global resources
Application.name = desktopgui
Application.title = I2P Desktop GUI
Application.version = 0.7.1
Application.vendor = I2P Ontwikkelaars
Application.homepage = http://www.i2p2.de
Application.description = Een anoniem communicatienetwerk.
Application.vendorId = I2P
Application.id = desktopgui
Application.lookAndFeel = system

View File

@ -0,0 +1,103 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
<Properties>
<Property name="defaultCloseOperation" type="int" value="3"/>
<Property name="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="1" attributes="0">
<EmptySpace max="32767" attributes="0"/>
<Component id="jTabbedPane1" min="-2" pref="478" 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="1" attributes="0">
<EmptySpace max="32767" attributes="0"/>
<Component id="jTabbedPane1" min="-2" pref="369" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
</Group>
</Group>
</DimensionLayout>
</Layout>
<SubComponents>
<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="jPanel1">
<Properties>
<Property name="name" type="java.lang.String" value="jPanel1" 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="tab1">
<Property name="tabTitle" type="java.lang.String" resourceKey="jPanel1.TabConstraints.tabTitle"/>
</JTabbedPaneConstraints>
</Constraint>
</Constraints>
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<EmptySpace min="0" pref="474" max="32767" attributes="0"/>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<EmptySpace min="0" pref="338" max="32767" attributes="0"/>
</Group>
</DimensionLayout>
</Layout>
</Container>
<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="tab2">
<Property name="tabTitle" type="java.lang.String" resourceKey="jPanel2.TabConstraints.tabTitle"/>
</JTabbedPaneConstraints>
</Constraint>
</Constraints>
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<EmptySpace min="0" pref="474" max="32767" attributes="0"/>
</Group>
</DimensionLayout>
<DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0">
<EmptySpace min="0" pref="338" max="32767" attributes="0"/>
</Group>
</DimensionLayout>
</Layout>
</Container>
</SubComponents>
</Container>
</SubComponents>
</Form>

View File

@ -0,0 +1,106 @@
/*
* 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 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() {
jTabbedPane1 = new javax.swing.JTabbedPane();
jPanel1 = new javax.swing.JPanel();
jPanel2 = new javax.swing.JPanel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setName("Form"); // NOI18N
jTabbedPane1.setName("jTabbedPane1"); // NOI18N
jPanel1.setName("jPanel1"); // NOI18N
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 474, Short.MAX_VALUE)
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 338, Short.MAX_VALUE)
);
org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(desktopgui.Main.class).getContext().getResourceMap(GeneralConfiguration.class);
jTabbedPane1.addTab(resourceMap.getString("jPanel1.TabConstraints.tabTitle"), jPanel1); // NOI18N
jPanel2.setName("jPanel2"); // NOI18N
javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
jPanel2.setLayout(jPanel2Layout);
jPanel2Layout.setHorizontalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 474, Short.MAX_VALUE)
);
jPanel2Layout.setVerticalGroup(
jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 338, Short.MAX_VALUE)
);
jTabbedPane1.addTab(resourceMap.getString("jPanel2.TabConstraints.tabTitle"), jPanel2); // NOI18N
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jTabbedPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 478, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(jTabbedPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 369, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
pack();
}// </editor-fold>//GEN-END:initComponents
/**
* @param args the command line arguments
*/
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new GeneralConfiguration().setVisible(true);
}
});
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JTabbedPane jTabbedPane1;
// End of variables declaration//GEN-END:variables
}

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

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

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

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

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

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

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

View 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="-1" height="30"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JLabel" name="downloadUsageLabel">
<Properties>
<Property name="text" type="java.lang.String" resourceKey="downloadUsageLabel.text"/>
<Property name="name" type="java.lang.String" value="downloadUsageLabel" noResource="true"/>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
<AbsoluteConstraints x="340" y="150" width="-1" 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>

View 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, 19, 30);
downloadUsageLabel.setText(resourceMap.getString("downloadUsageLabel.text")); // NOI18N
downloadUsageLabel.setName("downloadUsageLabel"); // NOI18N
getContentPane().add(downloadUsageLabel);
downloadUsageLabel.setBounds(340, 150, 19, 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;
}

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

View File

@ -0,0 +1,194 @@
/*
* 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");
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 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 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);
config.add(speedConfig);
config.add(advancedConfig);
popup.add(config);
popup.add(viewLog);
popup.add(shutdown);
//Add tray icon
trayIcon = new JPopupTrayIcon(image, "I2P: the anonymous network", popup);
PeerHelper.addReachabilityListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
trayIcon.setToolTip("I2P Network status: " + PeerHelper.getReachability());
}
});
PeerHelper.addActivePeerListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
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"));
}
});
try {
tray.add(trayIcon);
} catch (AWTException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
private SystemTray tray = null;
private JPopupTrayIcon trayIcon = null;
}

View File

@ -0,0 +1,3 @@
refreshButton.text=Refresh
clearButton.text=Clear
explanationText.text=Explanation ...

View File

@ -0,0 +1,6 @@
Form.title=I2P Speed Configuration
nextButton.text=Next
uploadLabel.text=What is your maximum upload speed?
downloadLabel.text=What is your maximum download speed?
speedExplanation.text=<html>The maximum speed is set by your provider. It can be given in <b>kilobit (kbps)</b> or <b>kilobyte (kBps)</b>.<br />One kilobyte equals eight kilobit.</html>

View File

@ -0,0 +1,9 @@
returnButton.text=Previous
Form.title=I2P Speed Configuration
questionLabel.text=Which of these descriptions fits you best?
browseButton.text=Browsing: I want to use I2P to browse websites anonymously, no heavy usage.
downloadButton.text=Downloading: I want to use I2P for downloads and filesharing, heavy usage.
nextButton.text=Next
browseButton.actionCommand=Browsing
downloadButton.actionCommand=Downloading
jLabel1.text=<html>I2P can be used for many different purposes. Here, we present two possible descriptions. If you use a lot of bandwidth in I2P (for example using downloading), please check the <b>downloading</b> option. If your bandwidth usage is limited, please check the <b>browsing</b> option.</html>

View File

@ -0,0 +1,17 @@
Form.title=I2P Configuration
previousButton.text=Previous
finishButton.text=Finish
uploadLabel.text=Upload Speed:
uploadBurstLabel.text=Burst Upload Speed:
downloadLabel.text=Download Speed:
downloadBurstLabel.text=Burst Download Speed:
uploadUsageLabel.text=GB
downloadUsageLabel.text=GB
uploadField.text=jTextField1
uploadBurstField.text=jTextField2
downloadField.text=jTextField4
downloadBurstField.text=jTextField5
uploadMonth.text=jTextField1
downloadMonth.text=jTextField2
settingsInfo.text=The profile information your entered, indicates that these are your optimal settings:
explanation.text=<html>We give a suggested upload and download speed. If your provider imposes a monthly bandwidth limit (usually given in <b>gigabyte (GB)</b>), please enter a value lower than that limit. If you run I2P only 50% of the time, you can double the bandwidth limit to use the same amount as when you are online 100% of the time.</html>

View File

@ -0,0 +1,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;
}

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

View File

@ -0,0 +1,17 @@
package router;
import net.i2p.router.RouterContext;
/**
*
* @author mathias
*/
public class RouterHelper {
public static RouterContext getContext() {
return (RouterContext) RouterContext.listContexts().get(0);
}
public static long getGracefulShutdownTimeRemaining() {
return RouterHelper.getContext().router().getShutdownTimeRemaining();
}
}

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

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

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

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

View File

@ -14,7 +14,7 @@ import net.i2p.util.Log;
*/
class BufferLogger implements Logging {
private final static Log _log = new Log(BufferLogger.class);
private ByteArrayOutputStream _baos;
private ByteArrayOutputStream _baos; // should be final and use a factory. LINT
private boolean _ignore;
/**

View File

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

View File

@ -75,7 +75,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
private static long __tunnelId = 0;
private long _tunnelId;
private Properties _clientOptions;
private List _sessions;
private final List _sessions;
public static final int PACKET_DELAY = 100;
@ -89,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();
@ -606,9 +606,9 @@ public class I2PTunnel implements Logging, EventDispatcher {
*/
public void runHttpClient(String args[], Logging l) {
if (args.length >= 1 && args.length <= 3) {
int port = -1;
int clientPort = -1;
try {
port = Integer.parseInt(args[0]);
clientPort = Integer.parseInt(args[0]);
} catch (NumberFormatException nfe) {
l.log("invalid port");
_log.error(getPrefix() + "Port specified is not valid: " + args[0], nfe);
@ -642,12 +642,12 @@ public class I2PTunnel implements Logging, EventDispatcher {
I2PTunnelTask task;
ownDest = !isShared;
try {
task = new I2PTunnelHTTPClient(port, l, ownDest, proxy, (EventDispatcher) this, this);
task = new I2PTunnelHTTPClient(clientPort, l, ownDest, proxy, (EventDispatcher) this, this);
addtask(task);
notifyEvent("httpclientTaskId", Integer.valueOf(task.getId()));
} catch (IllegalArgumentException iae) {
_log.error(getPrefix() + "Invalid I2PTunnel config to create an httpclient [" + host + ":"+ port + "]", iae);
l.log("Invalid I2PTunnel configuration [" + host + ":" + port + "]");
_log.error(getPrefix() + "Invalid I2PTunnel config to create an httpclient [" + host + ":"+ clientPort + "]", iae);
l.log("Invalid I2PTunnel configuration [" + host + ":" + clientPort + "]");
notifyEvent("httpclientTaskId", Integer.valueOf(-1));
}
} else {

View File

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

View File

@ -41,8 +41,8 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
private static volatile long __clientId = 0;
protected long _clientId;
protected Object sockLock = new Object(); // Guards sockMgr and mySockets
protected I2PSocketManager sockMgr;
protected final Object sockLock = new Object(); // Guards sockMgr and mySockets
protected I2PSocketManager sockMgr; // should be final and use a factory. LINT
protected List mySockets = new ArrayList();
protected Destination dest = null;
@ -52,20 +52,20 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
private ServerSocket ss;
private Object startLock = new Object();
private final Object startLock = new Object();
private boolean startRunning = false;
private Object closeLock = new Object();
// private Object closeLock = new Object();
private byte[] pubkey;
// private byte[] pubkey;
private String handlerName;
private String privKeyFile;
private Object conLock = new Object();
// private Object conLock = new Object();
/** List of Socket for those accept()ed but not yet started up */
private List _waitingSockets = new ArrayList();
private List _waitingSockets = new ArrayList(); // should be final and use a factory. LINT
/** How many connections will we allow to be in the process of being built at once? */
private int _numConnectionBuilders;
/** How long will we allow sockets to sit in the _waitingSockets map before killing them? */
@ -100,7 +100,7 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
}
/**
* @param privKeyFile null to generate a transient key
* @param pkf null to generate a transient key
*
* @throws IllegalArgumentException if the I2CP configuration is b0rked so
* badly that we cant create a socketManager
@ -278,6 +278,7 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
}
}
sockManager.setName("Client");
tunnel.addSession(sockManager.getSession());
return sockManager;
}

View File

@ -17,7 +17,6 @@ import net.i2p.I2PAppContext;
import net.i2p.I2PException;
import net.i2p.client.streaming.I2PSocket;
import net.i2p.client.streaming.I2PSocketOptions;
import net.i2p.data.DataFormatException;
import net.i2p.data.DataHelper;
import net.i2p.data.Destination;
import net.i2p.util.EventDispatcher;
@ -55,7 +54,7 @@ import net.i2p.util.Log;
public class I2PTunnelConnectClient extends I2PTunnelClientBase implements Runnable {
private static final Log _log = new Log(I2PTunnelConnectClient.class);
private List<String> _proxyList;
private final List<String> _proxyList;
private final static byte[] ERR_DESTINATION_UNKNOWN =
("HTTP/1.1 503 Service Unavailable\r\n"+
@ -116,12 +115,12 @@ public class I2PTunnelConnectClient extends I2PTunnelClientBase implements Runna
I2PTunnel tunnel) throws IllegalArgumentException {
super(localPort, ownDest, l, notifyThis, "HTTPHandler " + (++__clientId), tunnel);
_proxyList = new ArrayList();
if (waitEventValue("openBaseClientResult").equals("error")) {
notifyEvent("openConnectClientResult", "error");
return;
}
_proxyList = new ArrayList();
if (wwwProxy != null) {
StringTokenizer tok = new StringTokenizer(wwwProxy, ",");
while (tok.hasMoreTokens())

View File

@ -50,7 +50,7 @@ import net.i2p.util.Log;
public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable {
private static final Log _log = new Log(I2PTunnelHTTPClient.class);
private List proxyList;
private final List proxyList;
private HashMap addressHelpers = new HashMap();
@ -145,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())

View File

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

View File

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

View File

@ -51,11 +51,11 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable
while (tok.hasMoreTokens()) {
String destination = tok.nextToken();
try {
Destination dest = I2PTunnel.destFromName(destination);
if (dest == null)
Destination destN = I2PTunnel.destFromName(destination);
if (destN == null)
l.log("Could not resolve " + destination);
else
dests.add(dest);
dests.add(destN);
} catch (DataFormatException dfe) {
l.log("Bad format parsing \"" + destination + "\"");
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -69,5 +69,5 @@ public class I2PSink implements Sink {
protected boolean raw;
protected I2PSession sess;
protected Destination dest;
protected I2PDatagramMaker maker;
protected I2PDatagramMaker maker; // should be final and use a factory. LINT
}

View File

@ -67,5 +67,5 @@ public class I2PSinkAnywhere implements Sink {
protected boolean raw;
protected I2PSession sess;
protected Destination dest;
protected I2PDatagramMaker maker;
protected I2PDatagramMaker maker; // should be final and use a factory. LINT
}

View File

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

View File

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

View File

@ -8,7 +8,6 @@ package net.i2p.i2ptunnel.web;
*
*/
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;

View File

@ -187,12 +187,12 @@ public class Connection {
if (_log.shouldLog(Log.DEBUG))
_log.debug("Outbound window is full (" + _outboundPackets.size() + "/" + _options.getWindowSize() + "/"
+ _activeResends + "), waiting " + timeLeft);
try { _outboundPackets.wait(Math.min(timeLeft,250l)); } catch (InterruptedException ie) {}
try { _outboundPackets.wait(Math.min(timeLeft,250l)); } catch (InterruptedException ie) { if (_log.shouldLog(Log.DEBUG)) _log.debug("InterruptedException while Outbound window is full (" + _outboundPackets.size() + "/" + _activeResends +")"); return false;}
} else {
if (_log.shouldLog(Log.DEBUG))
_log.debug("Outbound window is full (" + _outboundPackets.size() + "/" + _activeResends
+ "), waiting indefinitely");
try { _outboundPackets.wait(250); } catch (InterruptedException ie) {} //10*1000
try { _outboundPackets.wait(250); } catch (InterruptedException ie) {if (_log.shouldLog(Log.DEBUG)) _log.debug("InterruptedException while Outbound window is full (" + _outboundPackets.size() + "/" + _activeResends + ")"); return false;} //10*1000
}
} else {
_context.statManager().addRateData("stream.chokeSizeEnd", _outboundPackets.size(), _context.clock().now() - start);
@ -810,7 +810,11 @@ public class Connection {
synchronized (_connectLock) {
_connectLock.wait(timeLeft);
}
} catch (InterruptedException ie) {}
} catch (InterruptedException ie) {
if (_log.shouldLog(Log.DEBUG)) _log.debug("waitForConnect(): InterruptedException");
_connectionError = "InterruptedException";
return;
}
}
}

View File

@ -126,7 +126,7 @@ class ConnectionHandler {
if (timeoutMs <= 0) {
try {
syn = _synQueue.take(); // waits forever
} catch (InterruptedException ie) {}
} catch (InterruptedException ie) { break;}
} else {
long remaining = expiration - _context.clock().now();
// (dont think this applies anymore for LinkedBlockingQueue)

View File

@ -213,7 +213,7 @@ public class PacketLocal extends Packet implements MessageOutputStream.WriteStat
timeRemaining = 10*1000;
wait(timeRemaining);
}
} catch (InterruptedException ie) {}
} catch (InterruptedException ie) { break; }
}
if (!writeSuccessful())
releasePayload();

View File

@ -487,4 +487,32 @@
</exec>
<echo message="Findbugs output stored in findbugs.xml" />
</target>
<target name="buildWithDesktopgui" depends="buildrouter">
<ant dir="apps/desktopgui" target="build_jar" />
</target>
<target name="preppkgWithDesktopgui" depends="buildWithDesktopgui,preppkg">
<copy file="apps/desktopgui/dist/desktopgui.jar" todir="pkg-temp/lib/" />
<copy file="apps/desktopgui/lib/swing-worker.jar" todir="pkg-temp/lib/" />
<copy file="apps/desktopgui/lib/appframework.jar" todir="pkg-temp/lib/" />
<mkdir dir="pkg-temp/desktopgui/resources/" />
<copy todir="pkg-temp/desktopgui/resources/">
<fileset dir="apps/desktopgui/desktopgui/resources/" />
</copy>
</target>
<target name="installerWithDesktopgui" depends="preppkgWithDesktopgui,installer" />
<target name="prepupdateWithDesktopgui" depends="buildWithDesktopgui,prepupdate">
<copy file="apps/desktopgui/dist/desktopgui.jar" todir="pkg-temp/lib/" />
<copy file="apps/desktopgui/lib/swing-worker.jar" todir="pkg-temp/lib/" />
<copy file="apps/desktopgui/lib/appframework.jar" todir="pkg-temp/lib/" />
<mkdir dir="pkg-temp/desktopgui/resources/" />
<copy todir="pkg-temp/desktopgui/resources/">
<fileset dir="apps/desktopgui/desktopgui/resources/" />
</copy>
</target>
<target name="updaterWithDesktopgui" depends="prepupdateWithDesktopgui,updater" />
<target name="pkgWithDesktopgui" depends="distclean, updaterWithDesktopgui, installerWithDesktopgui, tarball" />
<target name="distWithDesktopgui" depends="pkgWithDesktopgui, javadoc" />
<target name="distcleanWithDesktopgui" depends="distclean">
<ant dir="apps/desktopgui" target="build_clean" />
</target>
</project>

View File

@ -146,8 +146,8 @@ class I2PSessionMuxedImpl extends I2PSessionImpl2 implements I2PSession {
* I2PSession.PROTO_STREAMING
* I2PSession.PROTO_DATAGRAM
* 255 disallowed
* @param fromport 1-65535 or 0 for unset
* @param toport 1-65535 or 0 for unset
* @param fromPort 1-65535 or 0 for unset
* @param toPort 1-65535 or 0 for unset
*/
public boolean sendMessage(Destination dest, byte[] payload, int offset, int size,
SessionKey keyUsed, Set tagsSent, long expires,

View File

@ -178,7 +178,11 @@ public class I2CPMessageReader {
// pause .5 secs when we're paused
try {
Thread.sleep(500);
} catch (InterruptedException ie) { // nop
} catch (InterruptedException ie) {
// we should break away here.
_log.warn("Breaking away stream", ie);
_listener.disconnected(I2CPMessageReader.this);
cancelRunner();
}
}
}

View File

@ -16,12 +16,15 @@ import net.i2p.data.Hash;
* Base32 desthash.b32.i2p
* example.i2p
*
* @return null on failure
*
* @author zzz
*/
public class ConvertToHash {
/**
* Convert any kind of destination String to a hash
*
* @return null on failure
*/
public static Hash getHash(String peer) {
if (peer == null)
return null;

View File

@ -1,7 +1,6 @@
package net.i2p.util;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.ThreadFactory;
@ -43,6 +42,7 @@ public class SimpleScheduler {
_name = name;
_count = 0;
_executor = new ScheduledThreadPoolExecutor(THREADS, new CustomThreadFactory());
_executor.prestartAllCoreThreads();
}
/**
@ -91,6 +91,11 @@ public class SimpleScheduler {
public Thread newThread(Runnable r) {
Thread rv = Executors.defaultThreadFactory().newThread(r);
rv.setName(_name + ' ' + (++_count) + '/' + THREADS);
// Uncomment this to test threadgrouping, but we should be all safe now that the constructor preallocates!
// String name = rv.getThreadGroup().getName();
// if(!name.equals("main")) {
// (new Exception("OWCH! DAMN! Wrong ThreadGroup `" + name +"', `" + rv.getName() + "'")).printStackTrace();
// }
rv.setDaemon(true);
return rv;
}
@ -144,9 +149,11 @@ public class SimpleScheduler {
_timeoutMs = timeoutMs;
_scheduled = initialDelay + System.currentTimeMillis();
}
@Override
public void schedule() {
_executor.scheduleWithFixedDelay(this, _initialDelay, _timeoutMs, TimeUnit.MILLISECONDS);
}
@Override
public void run() {
super.run();
_scheduled = _timeoutMs + System.currentTimeMillis();

View File

@ -5,7 +5,6 @@ import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.ThreadFactory;
import java.util.Map;
import net.i2p.I2PAppContext;
@ -42,6 +41,7 @@ public class SimpleTimer2 {
_name = name;
_count = 0;
_executor = new CustomScheduledThreadPoolExecutor(THREADS, new CustomThreadFactory());
_executor.prestartAllCoreThreads();
}
/**
@ -56,6 +56,7 @@ public class SimpleTimer2 {
super(threads, factory);
}
@Override
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
if (t != null) // shoudn't happen, caught in RunnableEvent.run()
@ -67,6 +68,11 @@ public class SimpleTimer2 {
public Thread newThread(Runnable r) {
Thread rv = Executors.defaultThreadFactory().newThread(r);
rv.setName(_name + ' ' + (++_count) + '/' + THREADS);
// Uncomment this to test threadgrouping, but we should be all safe now that the constructor preallocates!
// String name = rv.getThreadGroup().getName();
// if(!name.equals("main")) {
// (new Exception("OWCH! DAMN! Wrong ThreadGroup `" + name +"', `" + rv.getName() + "'")).printStackTrace();
// }
rv.setDaemon(true);
return rv;
}
@ -232,6 +238,7 @@ public class SimpleTimer2 {
public abstract void timeReached();
}
@Override
public String toString() {
return _name;
}

View File

@ -1,3 +1,94 @@
2009-04-11 sponge
* i2ptunnel janitorial work and fixes on most locks.
Some locks still need work, and are marked with LINT in the comment.
Just grep for "LINT" to see where the remaining places are.
2009-04-10 sponge
* More BOB threadgroup fixes, plus debug dump when things go wrong.
* Fixes to streaminglib, I2CP, which are related to the TG problem.
* JavaDocs fixups.
2009-04-08 sponge
* More hopeful fixups to the infamous orpahned tunnel problem. *Sigh*
2009-04-08 zzz
* IPV6/localhost:
- Enable IPv6 stack in the JVM, hopefully won't break anything
- Patch Jetty to support binding to IPv6 addresses
- Allow multiple bind addresses for the router console
in the clients.config file; for new installs the
default is now "127.0.0.1,::1"
- Change most instances of "localhost" to "127.0.0.1"
throughout the code
* Router:
- Move some classes to private static inner
2009-04-07 sponge
* BOB prevent jvac from optimizing out thread-group code from -10
2009-04-07 zzz
* NTCP: Prevent occasional NPE introduced in -4
* streamr: Synchronize DatagramMaker
2009-04-07 sponge
* SimpleTimer2, SimpleScheduler fixed so that the threads all run from
The main threadgroup, not in the current possible child threadgroup.
So long as any SimpleTimer2/SimpleScheduler is started *BEFORE* any
child threadgroups, the constructors are threadgroup safe. What would
be super cool is if they were to be all jailed within thier very own
threadgroup too, but, I2P isn't up to the task of this yet.
* Fixes to BOB to ensure the above is true.
2009-04-06 sponge
* Debugging to make SimpleTimer2 and SimpleScheduler easier to debug.
* Fix for the config files in the GUI from mathiasdm
2009-04-04 sponge
* Hopeful fixups to the infamous orpahned tunnel problem.
* BOB now 0.0.5
2009-04-04 zzz
* NTCP: Don't bid on messages too big to handle
2009-04-03 zzz
* Console:
- Fix bug with IE buttons not working,
because it sends the label instead of the value
- Display version of downloaded update
* Update:
- Change default to "Download and verify"
- Change news fetch default to 24h (was 12h)
2009-04-03 sponge
* Fix broken dependencies for BOB.jar
* Router build version incremented to 5.
2009-04-02 zzz
* Profiles:
- Remove unused calculators and RateStats:
CapacityCalculator, StrictSpeedCalculator, IsFailingCalculator;
sendFailureSize, processSuccessRate, processfailureRate, commErrorRate,
tunnelTestResponseTimeSlow
- Reduced number of Rates in these RateStats:
sendSuccessSize, receiveSize, rejectRate, failRate
- ~5KB/profile savings total
- Deflate speed calculation once an hour instead of once a day,
to improve fast tier selection
- Remove dup comment in persisted files
* StatisticsManager - effective in 0.7.2:
- Spoof uptime to 90m for all
- Change tunnel stats from 10m to 60m
* Transport:
- Maintain a router hash -> IP map in transport,
to support additional IP checks (unused for now)
- Catch error on pre-2.6 kernels
- Some concurrent conversion
- Fix an HTML error on peers.jsp
2009-04-01 zzz
* I2PTunnel: Fix tunnel close
http://forum.i2p/viewtopic.php?t=3231
2009-03-30 zzz
* I2CP:
- Implement BandwidthLimitsMessage

View File

@ -54,6 +54,10 @@ wrapper.java.classpath.17=lib/systray.jar
wrapper.java.classpath.18=lib/systray4j.jar
# BOB
wrapper.java.classpath.19=lib/BOB.jar
# desktopgui
wrapper.java.classpath.20=lib/appframework.jar
wrapper.java.classpath.21=lib/swing-worker.jar
wrapper.java.classpath.22=lib/desktopgui.jar
# Java Library Path (location of Wrapper.DLL or libwrapper.so)
wrapper.java.library.path.1=.

View File

@ -16,6 +16,7 @@ you can:</p>
<li><a href="http://eepsites.i2p/">eepsites.i2p</a>: an anonymously hosted search engine of eepsites</li>
<li><a href="http://ugha.i2p/">ugha.i2p</a>: ugha's eepsite, a wiki that anyone can edit, and lots of links</li>
<li><a href="http://fproxy.tino.i2p">fproxy.tino.i2p</a>: Freenet proxy</li>
<li><a href="http://echelon.i2p">echelon.i2p</a>: software archive and information for I2P</li>
</ul>
There are many more eepsites - just follow the links from the ones you see,
bookmark your favorites, and visit them often!</li>

View File

@ -12,6 +12,7 @@
<li><a href="http://eepsites.i2p/">eepsites.i2p</a>: Eine anonym gehostete Suchseite f&uuml;r Eepsites</li>
<li><a href="http://ugha.i2p/">ugha.i2p</a>: Ugha's Eepsite, ein &ouml;ffentliches Wiki mit vielen Links</li>
<li><a href="http://fproxy.tino.i2p">fproxy.tino.i2p</a>: Freenet proxy</li>
<li><a href="http://echelon.i2p">echelon.i2p</a>: Software Archive und Informationen zu I2P</li>
</ul>
Es gibt viel mehr Eepsites - folge einfach den Links die du findest,
bookmarke Deine Favoriten und besuche sie oft!</li>

View File

@ -11,6 +11,7 @@
<li><a href="http://eepsites.i2p/">eepsites.i2p</a>: un moteur de recherche d'eepsites</li>
<li><a href="http://ugha.i2p/">ugha.i2p</a>: l'eepsite d'ugha, un wiki que chaucun peut &eacute;diter ainsi que</li>
<li><a href="http://fproxy.tino.i2p">fproxy.tino.i2p</a>: un proxy Freenet 0.5</li>
<li><a href="http://echelon.i2p">echelon.i2p</a>: archive</li>
</ul>
Il y a bien plus d'eepsites - suivez juste les liens au d&eacute;part de ceux sur lesquels vous &ecirc;tes, mettez-les dans vos favoris et visitez-les souvent!</li>
<li><b>Parcourez le web</b> - Il y a pour l'instant un outproxy HTTP sur I2P attach&eacute; &agrave; votre propre proxy HTTP sur le port 4444 - vous devez simplement configurer le proxy de votre navigateur pour l'utiliser (comme expliqu&eacute; ci-dessus) et aller sur n'importe quel URL normale - vos requ&ecirc;tes seront relay&eacute;es par le r&eacute;seau i2p.</li>

View File

@ -27,6 +27,7 @@ s&ouml;kmotor</li>
wiki som alla kan f&ouml;r&auml;ndra, inneh&aring;ller m&aring;nga l&auml;nkar</li>
<li><a href="http://fproxy.tino.i2p">fproxy.tino.i2p</a>:
Freenet proxy</li>
<li><a href="http://echelon.i2p">echelon.i2p</a>: software archive and information for I2P</li>
</ul>
Det finns m&aring;nga fler eepsidor - f&ouml;lj bara l&auml;nkarna fr&aring;n dom du ser,
spara dina favoriter och bes&ouml;k dom ofta!</li>

View File

@ -17,7 +17,7 @@ import net.i2p.CoreVersion;
public class RouterVersion {
public final static String ID = "$Revision: 1.548 $ $Date: 2008-06-07 23:00:00 $";
public final static String VERSION = CoreVersion.VERSION;
public final static long BUILD = 1;
public final static long BUILD = 16;
public static void main(String args[]) {
System.out.println("I2P Router version: " + VERSION + "-" + BUILD);
System.out.println("Router ID: " + RouterVersion.ID);