propagate from branch 'i2p.i2p.zzz.test' (head 29f20f786fbf565798b094a46ac9036dc39fb606)

to branch 'i2p.i2p' (head 622324a8f0f863b7b4eaaa26385228a65c71edf0)
This commit is contained in:
zzz
2009-05-07 13:07:07 +00:00
35 changed files with 1015 additions and 830 deletions

View File

@ -1263,11 +1263,11 @@ public class DoCMDS implements Runnable {
tunnel = new MUXlisten(database, nickinfo, _log); tunnel = new MUXlisten(database, nickinfo, _log);
Thread t = new Thread(tunnel); Thread t = new Thread(tunnel);
t.start(); t.start();
try { // try {
Thread.sleep(1000 * 10); // Slow down the startup. // Thread.sleep(1000 * 10); // Slow down the startup.
} catch(InterruptedException ie) { // } catch(InterruptedException ie) {
// ignore it // // ignore it
} // }
out.println("OK tunnel starting"); out.println("OK tunnel starting");
} catch (I2PException e) { } catch (I2PException e) {
out.println("ERROR starting tunnel: " + e); out.println("ERROR starting tunnel: " + e);

View File

@ -25,6 +25,8 @@ package net.i2p.BOB;
import java.net.ConnectException; import java.net.ConnectException;
import java.net.SocketTimeoutException; import java.net.SocketTimeoutException;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.i2p.I2PException; import net.i2p.I2PException;
import net.i2p.client.streaming.I2PServerSocket; import net.i2p.client.streaming.I2PServerSocket;
import net.i2p.client.streaming.I2PSocket; import net.i2p.client.streaming.I2PSocket;
@ -78,22 +80,12 @@ public class I2Plistener implements Runnable {
public void run() { public void run() {
boolean g = false; boolean g = false;
I2PSocket sessSocket = null; I2PSocket sessSocket = null;
int conn = 0;
die: { try {
die:
{
serverSocket.setSoTimeout(50); serverSocket.setSoTimeout(50);
// try {
// if (info.exists("INPORT")) {
// tgwatch = 2;
// }
// } catch (Exception e) {
// try {
// runlock();
// } catch (Exception e2) {
// break die;
// }
// break die;
// }
boolean spin = true; boolean spin = true;
while (spin) { while (spin) {
@ -123,46 +115,24 @@ die: {
} }
if (g) { if (g) {
g = false; g = false;
conn++;
// toss the connection to a new thread. // toss the connection to a new thread.
I2PtoTCP conn_c = new I2PtoTCP(sessSocket, info, database); I2PtoTCP conn_c = new I2PtoTCP(sessSocket, info, database);
Thread t = new Thread(conn_c, "BOBI2PtoTCP"); Thread t = new Thread(conn_c, Thread.currentThread().getName() + " I2PtoTCP " + conn);
t.start(); t.start();
} }
} catch (I2PException e) { } catch (Exception e) {
// System.out.println("Exception " + e); // System.out.println("Exception " + e);
} }
} }
} }
} finally {
try {
serverSocket.close();
} catch (I2PException ex) {
}
// System.out.println("I2Plistener: Close"); // System.out.println("I2Plistener: Close");
}
// Previous level does this cleanup now.
//
// try {
// serverSocket.close();
// } catch (I2PException e) {
// nop
//}
// need to kill off the socket manager too.
// I2PSession session = socketManager.getSession();
// if (session != null) {
// System.out.println("I2Plistener: destroySession");
// try {
// session.destroySession();
// } catch (I2PSessionException ex) {
// nop
// }
//}
// System.out.println("I2Plistener: Waiting for children");
// while (Thread.activeCount() > tgwatch) { // wait for all threads in our threadgroup to finish
// try {
// Thread.sleep(100); //sleep for 100 ms (One tenth second)
// } catch (Exception e) {
// nop
// }
//}
// System.out.println("I2Plistener: Done.");
} }
} }

View File

@ -23,7 +23,6 @@
*/ */
package net.i2p.BOB; package net.i2p.BOB;
import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.net.Socket; import java.net.Socket;
@ -71,90 +70,99 @@ public class I2PtoTCP implements Runnable {
String host; String host;
int port; int port;
boolean tell; boolean tell;
die: { InputStream in = null;
OutputStream out = null;
InputStream Iin = null;
OutputStream Iout = null;
try {
die:
{
try { try {
try { try {
rlock(); rlock();
} catch(Exception e) { } catch (Exception e) {
break die; break die;
} }
try { try {
host = info.get("OUTHOST").toString(); host = info.get("OUTHOST").toString();
port = Integer.parseInt(info.get("OUTPORT").toString()); port = Integer.parseInt(info.get("OUTPORT").toString());
tell = info.get("QUIET").equals(Boolean.FALSE); tell = info.get("QUIET").equals(Boolean.FALSE);
} catch(Exception e) { } catch (Exception e) {
runlock(); runlock();
break die; break die;
} }
try { try {
runlock(); runlock();
} catch(Exception e) { } catch (Exception e) {
break die; break die;
} }
sock = new Socket(host, port); sock = new Socket(host, port);
// make readers/writers // make readers/writers
InputStream in = sock.getInputStream(); in = sock.getInputStream();
OutputStream out = sock.getOutputStream(); out = sock.getOutputStream();
InputStream Iin = I2P.getInputStream(); Iin = I2P.getInputStream();
OutputStream Iout = I2P.getOutputStream(); Iout = I2P.getOutputStream();
I2P.setReadTimeout(0); // temp bugfix, this *SHOULD* be the default I2P.setReadTimeout(0); // temp bugfix, this *SHOULD* be the default
if(tell) { if (tell) {
// tell who is connecting // tell who is connecting
out.write(I2P.getPeerDestination().toBase64().getBytes()); out.write(I2P.getPeerDestination().toBase64().getBytes());
out.write(10); // nl out.write(10); // nl
out.flush(); // not really needed, but... out.flush(); // not really needed, but...
} }
// setup to cross the streams // setup to cross the streams
TCPio conn_c = new TCPio(in, Iout /*, info, database */ ); // app -> I2P TCPio conn_c = new TCPio(in, Iout /*, info, database */); // app -> I2P
TCPio conn_a = new TCPio(Iin, out /* , info, database */); // I2P -> app TCPio conn_a = new TCPio(Iin, out /* , info, database */); // I2P -> app
Thread t = new Thread(conn_c, "TCPioA"); Thread t = new Thread(conn_c, Thread.currentThread().getName() + " TCPioA");
Thread q = new Thread(conn_a, "TCPioB"); Thread q = new Thread(conn_a, Thread.currentThread().getName() + " TCPioB");
// Fire! // Fire!
t.start(); t.start();
q.start(); q.start();
while(t.isAlive() && q.isAlive()) { // AND is used here to kill off the other thread while (t.isAlive() && q.isAlive()) { // AND is used here to kill off the other thread
try { try {
Thread.sleep(10); //sleep for 10 ms Thread.sleep(10); //sleep for 10 ms
} catch(InterruptedException e) { } catch (InterruptedException e) {
try { break die;
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..."); // System.out.println("I2PtoTCP: Going away...");
} catch(Exception e) { } catch (Exception e) {
// System.out.println("I2PtoTCP: Owch! damn!"); // System.out.println("I2PtoTCP: Owch! damn!");
break die; break die;
} }
} // die } // die
} finally {
try {
in.close();
} catch (Exception ex) {
}
try {
out.close();
} catch (Exception ex) {
}
try {
Iin.close();
} catch (Exception ex) {
}
try {
Iout.close();
} catch (Exception ex) {
}
try { try {
// System.out.println("I2PtoTCP: Close I2P"); // System.out.println("I2PtoTCP: Close I2P");
I2P.close(); I2P.close();
} catch(Exception e) { } catch (Exception e) {
tell = false; tell = false;
} }
//System.out.println("I2PtoTCP: Closed I2P"); //System.out.println("I2PtoTCP: Closed I2P");
try { try {
// System.out.println("I2PtoTCP: Close sock"); // System.out.println("I2PtoTCP: Close sock");
sock.close(); sock.close();
} catch(Exception e) { } catch (Exception e) {
tell = false; tell = false;
} }
// System.out.println("I2PtoTCP: Done"); // System.out.println("I2PtoTCP: Done");
} }
}
} }

View File

@ -29,8 +29,6 @@ import java.net.InetAddress;
import java.net.ServerSocket; import java.net.ServerSocket;
import java.util.Properties; import java.util.Properties;
import net.i2p.I2PException; import net.i2p.I2PException;
import net.i2p.client.I2PSession;
import net.i2p.client.I2PSessionException;
import net.i2p.client.streaming.I2PServerSocket; import net.i2p.client.streaming.I2PServerSocket;
import net.i2p.client.streaming.I2PSocketManager; import net.i2p.client.streaming.I2PSocketManager;
import net.i2p.client.streaming.I2PSocketManagerFactory; import net.i2p.client.streaming.I2PSocketManagerFactory;
@ -50,7 +48,7 @@ public class MUXlisten implements Runnable {
private ByteArrayInputStream prikey; private ByteArrayInputStream prikey;
private ThreadGroup tg; private ThreadGroup tg;
private String N; private String N;
private ServerSocket listener; private ServerSocket listener = null;
private int backlog = 50; // should this be more? less? private int backlog = 50; // should this be more? less?
boolean go_out; boolean go_out;
boolean come_in; boolean come_in;
@ -133,7 +131,9 @@ public class MUXlisten implements Runnable {
*/ */
public void run() { public void run() {
I2PServerSocket SS = null; I2PServerSocket SS = null;
int ticks = 1200; // Allow 120 seconds, no more. Thread t = null;
Thread q = null;
try {
try { try {
wlock(); wlock();
try { try {
@ -152,11 +152,11 @@ public class MUXlisten implements Runnable {
} }
// socketManager.addDisconnectListener(new DisconnectListener()); // socketManager.addDisconnectListener(new DisconnectListener());
quit: quit:
{ {
try { try {
tg = new ThreadGroup(N); tg = new ThreadGroup(N);
die: die:
{ {
// toss the connections to a new threads. // toss the connections to a new threads.
// will wrap with TCP and UDP when UDP works // will wrap with TCP and UDP when UDP works
@ -165,14 +165,14 @@ die:
// I2P -> TCP // I2P -> TCP
SS = socketManager.getServerSocket(); SS = socketManager.getServerSocket();
I2Plistener conn = new I2Plistener(SS, socketManager, info, database, _log); I2Plistener conn = new I2Plistener(SS, socketManager, info, database, _log);
Thread t = new Thread(tg, conn, "BOBI2Plistener " + N); t = new Thread(tg, conn, "BOBI2Plistener " + N);
t.start(); t.start();
} }
if (come_in) { if (come_in) {
// TCP -> I2P // TCP -> I2P
TCPlistener conn = new TCPlistener(listener, socketManager, info, database, _log); TCPlistener conn = new TCPlistener(listener, socketManager, info, database, _log);
Thread q = new Thread(tg, conn, "BOBTCPlistener" + N); q = new Thread(tg, conn, "BOBTCPlistener " + N);
q.start(); q.start();
} }
@ -235,111 +235,31 @@ die:
} }
} // die } // die
if (SS != null) { // I2PSession session = socketManager.getSession();
try { // if (session != null) {
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"); // System.out.println("I2Plistener: destroySession");
try { // try {
session.destroySession(); // session.destroySession();
} catch (I2PSessionException ex) { // } catch (I2PSessionException ex) {
// nop // nop
} // }
} // }
try { // try {
socketManager.destroySocketManager(); // socketManager.destroySocketManager();
} catch (Exception e) { //} catch (Exception e) {
// nop // nop
} //}
// Wait for child threads and thread groups to die
// System.out.println("MUXlisten: waiting for children");
if (tg.activeCount() + tg.activeGroupCount() != 0) {
while ((tg.activeCount() + tg.activeGroupCount() != 0) && ticks != 0) {
tg.interrupt(); // unwedge any blocking threads.
ticks--;
try {
Thread.sleep(100); //sleep for 100 ms (One tenth second)
} catch (InterruptedException ex) {
break quit;
}
}
if (tg.activeCount() + tg.activeGroupCount() != 0) {
break quit; // Uh-oh.
}
}
tg.destroy();
// Zap reference to the ThreadGroup so the JVM can GC it.
tg = null;
} catch (Exception e) { } catch (Exception e) {
// System.out.println("MUXlisten: Caught an exception" + e); // System.out.println("MUXlisten: Caught an exception" + e);
break quit; break quit;
} }
} // quit } // quit
} finally {
// This is here to catch when something fucks up REALLY bad. // allow threads above this one to catch the stop signal.
if (tg != null) {
if (SS != null) {
try { try {
SS.close(); Thread.sleep(250);
} catch (I2PException ex) {
//Logger.getLogger(MUXlisten.class.getName()).log(Level.SEVERE, null, ex);
}
}
if (this.come_in) {
try {
listener.close();
} catch (IOException e) {
}
}
try {
socketManager.destroySocketManager();
} catch (Exception e) {
// nop
}
ticks = 600; // 60 seconds
if (tg.activeCount() + tg.activeGroupCount() != 0) {
while ((tg.activeCount() + tg.activeGroupCount() != 0) && ticks != 0) {
tg.interrupt(); // unwedge any blocking threads.
ticks--;
try {
Thread.sleep(100); //sleep for 100 ms (One tenth second)
} catch (InterruptedException ex) { } 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. // zero out everything.
try { try {
wlock(); wlock();
@ -355,11 +275,66 @@ die:
} catch (Exception e) { } catch (Exception e) {
} }
//try {
// Thread.sleep(1000 * 20); // how long?? is this even needed??
//} catch (InterruptedException ex) {
//}
if (SS != null) {
try {
SS.close();
} catch (I2PException ex) {
}
}
if (listener != null) {
try {
listener.close();
} catch (IOException e) {
}
}
try {
socketManager.destroySocketManager();
} catch (Exception e) {
// nop
}
// This is here to catch when something fucks up REALLY bad, like those annoying stuck threads!
if (tg != null) {
String boner = tg.getName();
// tg.interrupt(); // give my stuff a small smack again.
if (tg.activeCount() + tg.activeGroupCount() != 0) {
int foo = tg.activeCount() + tg.activeGroupCount();
int bar = foo;
// hopefully no longer needed!
// System.out.println("BOB: MUXlisten: Waiting on threads for " + boner);
// System.out.println("\n\nBOB: MUXlisten: ThreadGroup dump BEGIN " + boner);
// visit(tg, 0, boner);
// System.out.println("BOB: MUXlisten: ThreadGroup dump END " + boner + "\n\n");
// Happily spin forever :-(
while ((tg.activeCount() + tg.activeGroupCount() != 0)) {
foo = tg.activeCount() + tg.activeGroupCount();
// if (foo != bar) {
// System.out.println("\n\nBOB: MUXlisten: ThreadGroup dump BEGIN " + boner);
// visit(tg, 0, boner);
// System.out.println("BOB: MUXlisten: ThreadGroup dump END " + boner + "\n\n");
// }
bar = foo;
try {
Thread.sleep(100); //sleep for 100 ms (One tenth second)
} catch (InterruptedException ex) {
// nop
}
}
}
System.out.println("BOB: MUXlisten: Threads went away. Success: " + boner);
tg.destroy();
// Zap reference to the ThreadGroup so the JVM can GC it.
tg = null;
}
}
} }
// Debugging... // Debugging...
/** /**
* Find the root thread group and print them all. * Find the root thread group and print them all.
* *
@ -371,7 +346,7 @@ die:
} }
// Visit each thread group // Visit each thread group
visit(root, 0); visit(root, 0, root.getName());
} }
/** /**
@ -379,7 +354,7 @@ die:
* @param group ThreadGroup to visit * @param group ThreadGroup to visit
* @param level Current level * @param level Current level
*/ */
private static void visit(ThreadGroup group, int level) { private static void visit(ThreadGroup group, int level, String tn) {
// Get threads in `group' // Get threads in `group'
int numThreads = group.activeCount(); int numThreads = group.activeCount();
Thread[] threads = new Thread[numThreads * 2]; Thread[] threads = new Thread[numThreads * 2];
@ -389,7 +364,7 @@ die:
for (int i = 0; i < numThreads; i++) { for (int i = 0; i < numThreads; i++) {
// Get thread // Get thread
Thread thread = threads[i]; Thread thread = threads[i];
System.out.println("BOB: MUXlisten: " + indent + thread.toString()); System.out.println("BOB: MUXlisten: " + tn + ": " + indent + thread.toString());
} }
// Get thread subgroups of `group' // Get thread subgroups of `group'
@ -399,7 +374,43 @@ die:
// Recursively visit each subgroup // Recursively visit each subgroup
for (int i = 0; i < numGroups; i++) { for (int i = 0; i < numGroups; i++) {
visit(groups[i], level + 1); visit(groups[i], level + 1, groups[i].getName());
}
}
private static void nuke(ThreadGroup group, int level) {
// Get threads in `group'
int numThreads = group.activeCount();
Thread[] threads = new Thread[numThreads * 2];
numThreads = group.enumerate(threads, false);
// Enumerate each thread in `group' and stop it.
for (int i = 0; i < numThreads; i++) {
// Get thread
Thread thread = threads[i];
try {
if (thread.isAlive()) {
thread.stop();
}
} catch (SecurityException se) {
//nop
}
}
// Get thread subgroups of `group'
int numGroups = group.activeGroupCount();
ThreadGroup[] groups = new ThreadGroup[numGroups * 2];
numGroups = group.enumerate(groups, false);
// Recursively visit each subgroup
for (int i = 0; i < numGroups; i++) {
nuke(groups[i], level + 1);
}
try {
group.destroy();
} catch (IllegalThreadStateException IE) {
//nop
} catch (SecurityException se) {
//nop
} }
} }
} }

View File

@ -87,23 +87,13 @@ public class TCPio implements Runnable {
boolean spin = true; boolean spin = true;
try { try {
while(spin) { while(spin) {
// database.getReadLock();
// info.getReadLock();
// spin = info.get("RUNNING").equals(Boolean.TRUE);
// info.releaseReadLock();
// database.releaseReadLock();
b = Ain.read(a, 0, 1); b = Ain.read(a, 0, 1);
// System.out.println(info.get("NICKNAME").toString() + " " + b);
if(b > 0) { if(b > 0) {
Aout.write(a, 0, b); Aout.write(a, 0, b);
} else if(b == 0) { } else if(b == 0) {
Thread.yield(); // this should act like a mini sleep. Thread.yield(); // this should act like a mini sleep.
if(Ain.available() == 0) { if(Ain.available() == 0) {
// try {
// Thread.yield();
Thread.sleep(10); Thread.sleep(10);
// } catch(InterruptedException ex) {
// }
} }
} else { } else {
/* according to the specs: /* according to the specs:
@ -119,19 +109,16 @@ public class TCPio implements Runnable {
return; return;
} }
} }
// System.out.println("TCPio: RUNNING = false");
} catch(Exception e) { } catch(Exception e) {
// Eject!!! Eject!!! // Eject!!! Eject!!!
//System.out.println("TCPio: Caught an exception " + e); //System.out.println("TCPio: Caught an exception " + e);
try { try {
Ain.close(); Ain.close();
} catch (IOException ex) { } catch (IOException ex) {
// Logger.getLogger(TCPio.class.getName()).log(Level.SEVERE, null, ex);
} }
try { try {
Aout.close(); Aout.close();
} catch (IOException ex) { } catch (IOException ex) {
// Logger.getLogger(TCPio.class.getName()).log(Level.SEVERE, null, ex);
} }
return; return;
} }

View File

@ -29,6 +29,8 @@ import java.net.Socket;
import java.net.SocketTimeoutException; import java.net.SocketTimeoutException;
// import net.i2p.client.I2PSession; // import net.i2p.client.I2PSession;
// import net.i2p.client.I2PSessionException; // import net.i2p.client.I2PSessionException;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.i2p.client.streaming.I2PServerSocket; import net.i2p.client.streaming.I2PServerSocket;
import net.i2p.client.streaming.I2PSocketManager; import net.i2p.client.streaming.I2PSocketManager;
import net.i2p.util.Log; import net.i2p.util.Log;
@ -73,16 +75,6 @@ public class TCPlistener implements Runnable {
info.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 * Simply listen on TCP port, and thread connections
* *
@ -90,8 +82,10 @@ public class TCPlistener implements Runnable {
public void run() { public void run() {
boolean g = false; boolean g = false;
boolean spin = true; boolean spin = true;
int conn = 0;
die: { try {
die:
{
try { try {
rlock(); rlock();
} catch (Exception e) { } catch (Exception e) {
@ -116,7 +110,7 @@ die: {
} }
try { try {
Socket server = new Socket(); Socket server = new Socket();
listener.setSoTimeout(50); // Half of the expected time from MUXlisten listener.setSoTimeout(50); // We don't block, we cycle and check.
while (spin) { while (spin) {
try { try {
rlock(); rlock();
@ -140,74 +134,28 @@ die: {
g = false; g = false;
} }
if (g) { if (g) {
conn++;
// toss the connection to a new thread. // toss the connection to a new thread.
TCPtoI2P conn_c = new TCPtoI2P(socketManager, server /* , info, database */); TCPtoI2P conn_c = new TCPtoI2P(socketManager, server);
Thread t = new Thread(conn_c, "BOBTCPtoI2P"); Thread t = new Thread(conn_c, Thread.currentThread().getName() + " TCPtoI2P " + conn);
t.start(); t.start();
g = false; g = false;
} }
} }
//System.out.println("TCPlistener: destroySession");
listener.close(); listener.close();
} catch (IOException ioe) { } catch (IOException ioe) {
try { try {
listener.close(); listener.close();
} catch (IOException e) { } catch (IOException e) {
} }
// Fatal failure, cause a stop event }
}
} finally {
try { try {
rlock(); listener.close();
try { } catch (IOException ex) {
spin = info.get("RUNNING").equals(Boolean.TRUE);
} catch (Exception e) {
runlock();
break die;
} }
} catch (Exception e) { //System.out.println("TCPlistener: " + Thread.currentThread().getName() + "Done.");
break die;
} }
if (spin) {
try {
wlock();
try {
info.add("STOPPING", new Boolean(true));
info.add("RUNNING", new Boolean(false));
} catch (Exception e) {
wunlock();
break die;
}
} catch (Exception e) {
break die;
}
try {
wunlock();
} catch (Exception e) {
break die;
}
}
}
}
// 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

@ -64,17 +64,17 @@ public class TCPtoI2P implements Runnable {
S = new String(); S = new String();
while(true) { while (true) {
b = in.read(); b = in.read();
if(b == 13) { if (b == 13) {
//skip CR //skip CR
continue; continue;
} }
if(b < 20 || b > 126) { if (b < 20 || b > 126) {
// exit on anything not legal // exit on anything not legal
break; break;
} }
c = (char)(b & 0x7f); // We only really give a fuck about ASCII c = (char) (b & 0x7f); // We only really give a fuck about ASCII
S = new String(S + c); S = new String(S + c);
} }
return S; return S;
@ -118,7 +118,7 @@ public class TCPtoI2P implements Runnable {
OutputStream Iout = null; OutputStream Iout = null;
InputStream in = null; InputStream in = null;
OutputStream out = null; OutputStream out = null;
try {
try { try {
in = sock.getInputStream(); in = sock.getInputStream();
@ -128,7 +128,7 @@ public class TCPtoI2P implements Runnable {
input = line.toLowerCase(); input = line.toLowerCase();
Destination dest = null; Destination dest = null;
if(input.endsWith(".i2p")) { if (input.endsWith(".i2p")) {
dest = I2PTunnel.destFromName(input); dest = I2PTunnel.destFromName(input);
line = dest.toBase64(); line = dest.toBase64();
} }
@ -145,62 +145,59 @@ public class TCPtoI2P implements Runnable {
// setup to cross the streams // setup to cross the streams
TCPio conn_c = new TCPio(in, Iout /*, info, database */); // app -> I2P TCPio conn_c = new TCPio(in, Iout /*, info, database */); // app -> I2P
TCPio conn_a = new TCPio(Iin, out /*, info, database */); // I2P -> app TCPio conn_a = new TCPio(Iin, out /*, info, database */); // I2P -> app
Thread t = new Thread(conn_c, "TCPioA"); Thread t = new Thread(conn_c, Thread.currentThread().getName() + " TCPioA");
Thread q = new Thread(conn_a, "TCPioB"); Thread q = new Thread(conn_a, Thread.currentThread().getName() + " TCPioB");
// Fire! // Fire!
t.start(); t.start();
q.start(); q.start();
while(t.isAlive() && q.isAlive()) { // AND is used here to kill off the other thread while (t.isAlive() && q.isAlive()) { // AND is used here to kill off the other thread
// try {
Thread.sleep(10); //sleep for 10 ms Thread.sleep(10); //sleep for 10 ms
// } catch(InterruptedException e) {
// nop
// }
}
// System.out.println("TCPtoI2P: Going away...");
} catch(I2PException e) {
Emsg("ERROR " + e.toString(), out);
} catch(ConnectException e) {
Emsg("ERROR " + e.toString(), out);
} catch(NoRouteToHostException e) {
Emsg("ERROR " + e.toString(), out);
} catch(InterruptedIOException e) {
Emsg("ERROR " + e.toString(), out);
} }
} catch(Exception e) { } catch (I2PException e) {
Emsg("ERROR " + e.toString(), out);
} catch (ConnectException e) {
Emsg("ERROR " + e.toString(), out);
} catch (NoRouteToHostException e) {
Emsg("ERROR " + e.toString(), out);
} catch (InterruptedIOException e) {
// We're breaking away.
}
} catch (Exception e) {
Emsg("ERROR " + e.toString(), out); Emsg("ERROR " + e.toString(), out);
} }
} catch(Exception e) { } catch (Exception e) {
// bail on anything else // bail on anything else
} }
} finally {
try { try {
in.close(); in.close();
} catch(Exception e) { } catch (Exception e) {
} }
try { try {
out.close(); out.close();
} catch(Exception e) { } catch (Exception e) {
} }
try { try {
Iin.close(); Iin.close();
} catch(Exception e) { } catch (Exception e) {
} }
try { try {
Iout.close(); Iout.close();
} catch(Exception e) { } catch (Exception e) {
} }
try { try {
// System.out.println("TCPtoI2P: Close I2P"); // System.out.println("TCPtoI2P: Close I2P");
I2P.close(); I2P.close();
} catch(Exception e) { } catch (Exception e) {
} }
try { try {
// System.out.println("TCPtoI2P: Close sock"); // System.out.println("TCPtoI2P: Close sock");
sock.close(); sock.close();
} catch(Exception e) { } catch (Exception e) {
}
} }
// System.out.println("TCPtoI2P: Done."); // System.out.println("TCPtoI2P: Done.");
} }

View File

@ -152,7 +152,7 @@ is divided into following sections:
<attribute default="${includes}" name="includes"/> <attribute default="${includes}" name="includes"/>
<attribute default="${excludes}" name="excludes"/> <attribute default="${excludes}" name="excludes"/>
<attribute default="${javac.debug}" name="debug"/> <attribute default="${javac.debug}" name="debug"/>
<attribute default="" name="sourcepath"/> <attribute default="/does/not/exist" name="sourcepath"/>
<element name="customize" optional="true"/> <element name="customize" optional="true"/>
<sequential> <sequential>
<javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}"> <javac debug="@{debug}" deprecation="${javac.deprecation}" destdir="@{destdir}" encoding="${source.encoding}" excludes="@{excludes}" includeantruntime="false" includes="@{includes}" source="${javac.source}" sourcepath="@{sourcepath}" srcdir="@{srcdir}" target="${javac.target}">
@ -218,13 +218,13 @@ is divided into following sections:
</sequential> </sequential>
</macrodef> </macrodef>
</target> </target>
<target name="-init-macrodef-nbjpda"> <target depends="-init-debug-args" name="-init-macrodef-nbjpda">
<macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1"> <macrodef name="nbjpdastart" uri="http://www.netbeans.org/ns/j2se-project/1">
<attribute default="${main.class}" name="name"/> <attribute default="${main.class}" name="name"/>
<attribute default="${debug.classpath}" name="classpath"/> <attribute default="${debug.classpath}" name="classpath"/>
<attribute default="" name="stopclassname"/> <attribute default="" name="stopclassname"/>
<sequential> <sequential>
<nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="dt_socket"> <nbjpdastart addressproperty="jpda.address" name="@{name}" stopclassname="@{stopclassname}" transport="${debug-transport}">
<classpath> <classpath>
<path path="@{classpath}"/> <path path="@{classpath}"/>
</classpath> </classpath>
@ -255,6 +255,12 @@ is divided into following sections:
<condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none"> <condition else="-Xdebug" property="debug-args-line" value="-Xdebug -Xnoagent -Djava.compiler=none">
<istrue value="${have-jdk-older-than-1.4}"/> <istrue value="${have-jdk-older-than-1.4}"/>
</condition> </condition>
<condition else="dt_socket" property="debug-transport-by-os" value="dt_shmem">
<os family="windows"/>
</condition>
<condition else="${debug-transport-by-os}" property="debug-transport" value="${debug.transport}">
<isset property="debug.transport"/>
</condition>
</target> </target>
<target depends="-init-debug-args" name="-init-macrodef-debug"> <target depends="-init-debug-args" name="-init-macrodef-debug">
<macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3"> <macrodef name="debug" uri="http://www.netbeans.org/ns/j2se-project/3">
@ -264,7 +270,7 @@ is divided into following sections:
<sequential> <sequential>
<java classname="@{classname}" dir="${work.dir}" fork="true"> <java classname="@{classname}" dir="${work.dir}" fork="true">
<jvmarg line="${debug-args-line}"/> <jvmarg line="${debug-args-line}"/>
<jvmarg value="-Xrunjdwp:transport=dt_socket,address=${jpda.address}"/> <jvmarg value="-Xrunjdwp:transport=${debug-transport},address=${jpda.address}"/>
<jvmarg line="${run.jvmargs}"/> <jvmarg line="${run.jvmargs}"/>
<classpath> <classpath>
<path path="@{classpath}"/> <path path="@{classpath}"/>
@ -311,6 +317,13 @@ is divided into following sections:
=================== ===================
--> -->
<target depends="init" name="deps-jar" unless="no.deps"/> <target depends="init" name="deps-jar" unless="no.deps"/>
<target depends="init,-check-automatic-build,-clean-after-automatic-build" name="-verify-automatic-build"/>
<target depends="init" name="-check-automatic-build">
<available file="${build.classes.dir}/.netbeans_automatic_build" property="netbeans.automatic.build"/>
</target>
<target depends="init" if="netbeans.automatic.build" name="-clean-after-automatic-build">
<antcall target="clean"/>
</target>
<target depends="init,deps-jar" name="-pre-pre-compile"> <target depends="init,deps-jar" name="-pre-pre-compile">
<mkdir dir="${build.classes.dir}"/> <mkdir dir="${build.classes.dir}"/>
</target> </target>
@ -331,7 +344,7 @@ is divided into following sections:
<!-- Empty placeholder for easier customization. --> <!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. --> <!-- You can override this target in the ../build.xml file. -->
</target> </target>
<target depends="init,deps-jar,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/> <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile,-do-compile,-post-compile" description="Compile project." name="compile"/>
<target name="-pre-compile-single"> <target name="-pre-compile-single">
<!-- Empty placeholder for easier customization. --> <!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. --> <!-- You can override this target in the ../build.xml file. -->
@ -345,7 +358,7 @@ is divided into following sections:
<!-- Empty placeholder for easier customization. --> <!-- Empty placeholder for easier customization. -->
<!-- You can override this target in the ../build.xml file. --> <!-- You can override this target in the ../build.xml file. -->
</target> </target>
<target depends="init,deps-jar,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/> <target depends="init,deps-jar,-verify-automatic-build,-pre-pre-compile,-pre-compile-single,-do-compile-single,-post-compile-single" name="compile-single"/>
<!-- <!--
==================== ====================
JAR BUILDING SECTION JAR BUILDING SECTION

View File

@ -4,5 +4,5 @@ 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. # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
nbproject/build-impl.xml.data.CRC32=c4b345cd nbproject/build-impl.xml.data.CRC32=c4b345cd
nbproject/build-impl.xml.script.CRC32=74d3fda2 nbproject/build-impl.xml.script.CRC32=8c02c081
nbproject/build-impl.xml.stylesheet.CRC32=487672f9 nbproject/build-impl.xml.stylesheet.CRC32=65b8de21

View File

@ -10,5 +10,5 @@ package desktopgui;
* @author mathias * @author mathias
*/ */
public class GUIVersion { public class GUIVersion {
public static final String VERSION = "0.0.1.1"; public static final String VERSION = "0.0.1.2";
} }

View File

@ -1,8 +1,13 @@
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8" ?>
<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JFrameFormInfo"> <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> <Properties>
<Property name="defaultCloseOperation" type="int" value="3"/> <Property name="defaultCloseOperation" type="int" value="3"/>
<Property name="title" type="java.lang.String" resourceKey="Form.title"/>
<Property name="name" type="java.lang.String" value="Form" noResource="true"/> <Property name="name" type="java.lang.String" value="Form" noResource="true"/>
</Properties> </Properties>
<SyntheticProperties> <SyntheticProperties>
@ -22,27 +27,27 @@
<Layout> <Layout>
<DimensionLayout dim="0"> <DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Component id="jPanel1" alignment="0" max="32767" attributes="0"/> <Component id="applyPanel" alignment="0" max="32767" attributes="0"/>
<Group type="102" attributes="0"> <Group type="102" attributes="0">
<EmptySpace min="12" pref="12" max="12" attributes="0"/> <EmptySpace min="12" pref="12" max="12" attributes="0"/>
<Component id="jTabbedPane1" pref="566" max="32767" attributes="0"/> <Component id="settingsPanel" pref="566" max="32767" attributes="0"/>
</Group> </Group>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
<DimensionLayout dim="1"> <DimensionLayout dim="1">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="1" attributes="0"> <Group type="102" alignment="1" attributes="0">
<Component id="jTabbedPane1" max="32767" attributes="0"/> <Component id="settingsPanel" max="32767" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Component id="jPanel1" min="-2" max="-2" attributes="0"/> <Component id="applyPanel" min="-2" max="-2" attributes="0"/>
</Group> </Group>
</Group> </Group>
</DimensionLayout> </DimensionLayout>
</Layout> </Layout>
<SubComponents> <SubComponents>
<Container class="javax.swing.JPanel" name="jPanel1"> <Container class="javax.swing.JPanel" name="applyPanel">
<Properties> <Properties>
<Property name="name" type="java.lang.String" value="jPanel1" noResource="true"/> <Property name="name" type="java.lang.String" value="applyPanel" noResource="true"/>
</Properties> </Properties>
<Layout> <Layout>
@ -84,21 +89,21 @@
</Component> </Component>
</SubComponents> </SubComponents>
</Container> </Container>
<Container class="javax.swing.JTabbedPane" name="jTabbedPane1"> <Container class="javax.swing.JTabbedPane" name="settingsPanel">
<Properties> <Properties>
<Property name="name" type="java.lang.String" value="jTabbedPane1" noResource="true"/> <Property name="name" type="java.lang.String" value="settingsPanel" noResource="true"/>
</Properties> </Properties>
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout"/> <Layout class="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout"/>
<SubComponents> <SubComponents>
<Container class="javax.swing.JPanel" name="jPanel2"> <Container class="javax.swing.JPanel" name="speedPanel">
<Properties> <Properties>
<Property name="name" type="java.lang.String" value="jPanel2" noResource="true"/> <Property name="name" type="java.lang.String" value="speedPanel" noResource="true"/>
</Properties> </Properties>
<Constraints> <Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription"> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
<JTabbedPaneConstraints tabName="Speed"> <JTabbedPaneConstraints tabName="Speed">
<Property name="tabTitle" type="java.lang.String" resourceKey="jPanel2.TabConstraints.tabTitle"/> <Property name="tabTitle" type="java.lang.String" resourceKey="speedPanel.TabConstraints.tabTitle"/>
</JTabbedPaneConstraints> </JTabbedPaneConstraints>
</Constraint> </Constraint>
</Constraints> </Constraints>
@ -107,10 +112,10 @@
<Property name="useNullLayout" type="boolean" value="true"/> <Property name="useNullLayout" type="boolean" value="true"/>
</Layout> </Layout>
<SubComponents> <SubComponents>
<Component class="javax.swing.JLabel" name="jLabel1"> <Component class="javax.swing.JLabel" name="uploadSpeedLabel">
<Properties> <Properties>
<Property name="text" type="java.lang.String" resourceKey="jLabel1.text"/> <Property name="text" type="java.lang.String" resourceKey="uploadSpeedLabel.text"/>
<Property name="name" type="java.lang.String" value="jLabel1" noResource="true"/> <Property name="name" type="java.lang.String" value="uploadSpeedLabel" noResource="true"/>
</Properties> </Properties>
<Constraints> <Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
@ -118,10 +123,10 @@
</Constraint> </Constraint>
</Constraints> </Constraints>
</Component> </Component>
<Component class="javax.swing.JLabel" name="jLabel2"> <Component class="javax.swing.JLabel" name="downloadSpeedLabel">
<Properties> <Properties>
<Property name="text" type="java.lang.String" resourceKey="jLabel2.text"/> <Property name="text" type="java.lang.String" resourceKey="downloadSpeedLabel.text"/>
<Property name="name" type="java.lang.String" value="jLabel2" noResource="true"/> <Property name="name" type="java.lang.String" value="downloadSpeedLabel" noResource="true"/>
</Properties> </Properties>
<Constraints> <Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
@ -129,58 +134,66 @@
</Constraint> </Constraint>
</Constraints> </Constraints>
</Component> </Component>
<Component class="javax.swing.JTextField" name="jTextField1"> <Component class="javax.swing.JTextField" name="uploadspeed">
<Properties> <Properties>
<Property name="text" type="java.lang.String" resourceKey="jTextField1.text"/> <Property name="text" type="java.lang.String" resourceKey="uploadspeed.text"/>
<Property name="name" type="java.lang.String" value="jTextField1" noResource="true"/> <Property name="name" type="java.lang.String" value="uploadspeed" noResource="true"/>
</Properties> </Properties>
<Events>
<EventHandler event="keyTyped" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="speedKeyTyped"/>
</Events>
<Constraints> <Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
<AbsoluteConstraints x="160" y="20" width="-1" height="-1"/> <AbsoluteConstraints x="160" y="20" width="-1" height="-1"/>
</Constraint> </Constraint>
</Constraints> </Constraints>
</Component> </Component>
<Component class="javax.swing.JTextField" name="jTextField2"> <Component class="javax.swing.JTextField" name="downloadspeed">
<Properties> <Properties>
<Property name="text" type="java.lang.String" resourceKey="jTextField2.text"/> <Property name="text" type="java.lang.String" resourceKey="downloadspeed.text"/>
<Property name="name" type="java.lang.String" value="jTextField2" noResource="true"/> <Property name="name" type="java.lang.String" value="downloadspeed" noResource="true"/>
</Properties> </Properties>
<Events>
<EventHandler event="keyTyped" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="speedKeyTyped"/>
</Events>
<Constraints> <Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
<AbsoluteConstraints x="160" y="60" width="-1" height="-1"/> <AbsoluteConstraints x="160" y="60" width="-1" height="-1"/>
</Constraint> </Constraint>
</Constraints> </Constraints>
</Component> </Component>
<Component class="javax.swing.JComboBox" name="jComboBox1"> <Component class="javax.swing.JComboBox" name="uploadkbps">
<Properties> <Properties>
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
<StringArray count="4"> <StringArray count="2">
<StringItem index="0" value="Item 1"/> <StringItem index="0" value="kbps"/>
<StringItem index="1" value="Item 2"/> <StringItem index="1" value="kBps"/>
<StringItem index="2" value="Item 3"/>
<StringItem index="3" value="Item 4"/>
</StringArray> </StringArray>
</Property> </Property>
<Property name="name" type="java.lang.String" value="jComboBox1" noResource="true"/> <Property name="name" type="java.lang.String" value="uploadkbps" noResource="true"/>
</Properties> </Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="uploadkbpsActionPerformed"/>
</Events>
<Constraints> <Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
<AbsoluteConstraints x="240" y="20" width="-1" height="-1"/> <AbsoluteConstraints x="240" y="20" width="-1" height="-1"/>
</Constraint> </Constraint>
</Constraints> </Constraints>
</Component> </Component>
<Component class="javax.swing.JComboBox" name="jComboBox2"> <Component class="javax.swing.JComboBox" name="downloadkbps">
<Properties> <Properties>
<Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor"> <Property name="model" type="javax.swing.ComboBoxModel" editor="org.netbeans.modules.form.editors2.ComboBoxModelEditor">
<StringArray count="4"> <StringArray count="2">
<StringItem index="0" value="Item 1"/> <StringItem index="0" value="kbps"/>
<StringItem index="1" value="Item 2"/> <StringItem index="1" value="kBps"/>
<StringItem index="2" value="Item 3"/>
<StringItem index="3" value="Item 4"/>
</StringArray> </StringArray>
</Property> </Property>
<Property name="name" type="java.lang.String" value="jComboBox2" noResource="true"/> <Property name="name" type="java.lang.String" value="downloadkbps" noResource="true"/>
</Properties> </Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="downloadkbpsActionPerformed"/>
</Events>
<Constraints> <Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
<AbsoluteConstraints x="240" y="60" width="-1" height="-1"/> <AbsoluteConstraints x="240" y="60" width="-1" height="-1"/>
@ -209,22 +222,28 @@
</Constraint> </Constraint>
</Constraints> </Constraints>
</Component> </Component>
<Component class="javax.swing.JTextField" name="jTextField3"> <Component class="javax.swing.JTextField" name="uploadgb">
<Properties> <Properties>
<Property name="text" type="java.lang.String" resourceKey="jTextField3.text"/> <Property name="text" type="java.lang.String" resourceKey="uploadgb.text"/>
<Property name="name" type="java.lang.String" value="jTextField3" noResource="true"/> <Property name="name" type="java.lang.String" value="uploadgb" noResource="true"/>
</Properties> </Properties>
<Events>
<EventHandler event="keyTyped" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="uploadgbKeyTyped"/>
</Events>
<Constraints> <Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
<AbsoluteConstraints x="440" y="20" width="60" height="-1"/> <AbsoluteConstraints x="440" y="20" width="60" height="-1"/>
</Constraint> </Constraint>
</Constraints> </Constraints>
</Component> </Component>
<Component class="javax.swing.JTextField" name="jTextField4"> <Component class="javax.swing.JTextField" name="downloadgb">
<Properties> <Properties>
<Property name="text" type="java.lang.String" resourceKey="jTextField4.text"/> <Property name="text" type="java.lang.String" resourceKey="downloadgb.text"/>
<Property name="name" type="java.lang.String" value="jTextField4" noResource="true"/> <Property name="name" type="java.lang.String" value="downloadgb" noResource="true"/>
</Properties> </Properties>
<Events>
<EventHandler event="keyTyped" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="downloadgbKeyTyped"/>
</Events>
<Constraints> <Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription">
<AbsoluteConstraints x="440" y="60" width="60" height="-1"/> <AbsoluteConstraints x="440" y="60" width="60" height="-1"/>
@ -266,14 +285,14 @@
</Component> </Component>
</SubComponents> </SubComponents>
</Container> </Container>
<Container class="javax.swing.JPanel" name="jPanel3"> <Container class="javax.swing.JPanel" name="updatesPanel">
<Properties> <Properties>
<Property name="name" type="java.lang.String" value="jPanel3" noResource="true"/> <Property name="name" type="java.lang.String" value="updatesPanel" noResource="true"/>
</Properties> </Properties>
<Constraints> <Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription"> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
<JTabbedPaneConstraints tabName="Updates"> <JTabbedPaneConstraints tabName="Updates">
<Property name="tabTitle" type="java.lang.String" resourceKey="jPanel3.TabConstraints.tabTitle"/> <Property name="tabTitle" type="java.lang.String" resourceKey="updatesPanel.TabConstraints.tabTitle"/>
</JTabbedPaneConstraints> </JTabbedPaneConstraints>
</Constraint> </Constraint>
</Constraints> </Constraints>
@ -344,18 +363,27 @@
</Component> </Component>
<Component class="javax.swing.JRadioButton" name="jRadioButton1"> <Component class="javax.swing.JRadioButton" name="jRadioButton1">
<Properties> <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="jRadioButton1.text"/> <Property name="text" type="java.lang.String" resourceKey="jRadioButton1.text"/>
<Property name="name" type="java.lang.String" value="jRadioButton1" noResource="true"/> <Property name="name" type="java.lang.String" value="jRadioButton1" noResource="true"/>
</Properties> </Properties>
</Component> </Component>
<Component class="javax.swing.JRadioButton" name="jRadioButton2"> <Component class="javax.swing.JRadioButton" name="jRadioButton2">
<Properties> <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="jRadioButton2.text"/> <Property name="text" type="java.lang.String" resourceKey="jRadioButton2.text"/>
<Property name="name" type="java.lang.String" value="jRadioButton2" noResource="true"/> <Property name="name" type="java.lang.String" value="jRadioButton2" noResource="true"/>
</Properties> </Properties>
</Component> </Component>
<Component class="javax.swing.JRadioButton" name="jRadioButton3"> <Component class="javax.swing.JRadioButton" name="jRadioButton3">
<Properties> <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="jRadioButton3.text"/> <Property name="text" type="java.lang.String" resourceKey="jRadioButton3.text"/>
<Property name="name" type="java.lang.String" value="jRadioButton3" noResource="true"/> <Property name="name" type="java.lang.String" value="jRadioButton3" noResource="true"/>
</Properties> </Properties>
@ -380,14 +408,14 @@
</Component> </Component>
</SubComponents> </SubComponents>
</Container> </Container>
<Container class="javax.swing.JPanel" name="jPanel4"> <Container class="javax.swing.JPanel" name="tunnelPanel">
<Properties> <Properties>
<Property name="name" type="java.lang.String" value="jPanel4" noResource="true"/> <Property name="name" type="java.lang.String" value="tunnelPanel" noResource="true"/>
</Properties> </Properties>
<Constraints> <Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription"> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
<JTabbedPaneConstraints tabName="Tunnels/Services"> <JTabbedPaneConstraints tabName="Tunnels/Services">
<Property name="tabTitle" type="java.lang.String" resourceKey="jPanel4.TabConstraints.tabTitle"/> <Property name="tabTitle" type="java.lang.String" resourceKey="tunnelPanel.TabConstraints.tabTitle"/>
</JTabbedPaneConstraints> </JTabbedPaneConstraints>
</Constraint> </Constraint>
</Constraints> </Constraints>
@ -461,14 +489,14 @@
</Component> </Component>
</SubComponents> </SubComponents>
</Container> </Container>
<Container class="javax.swing.JPanel" name="jPanel5"> <Container class="javax.swing.JPanel" name="networkPanel">
<Properties> <Properties>
<Property name="name" type="java.lang.String" value="jPanel5" noResource="true"/> <Property name="name" type="java.lang.String" value="networkPanel" noResource="true"/>
</Properties> </Properties>
<Constraints> <Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription"> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
<JTabbedPaneConstraints tabName="Network"> <JTabbedPaneConstraints tabName="Network">
<Property name="tabTitle" type="java.lang.String" resourceKey="jPanel5.TabConstraints.tabTitle"/> <Property name="tabTitle" type="java.lang.String" resourceKey="networkPanel.TabConstraints.tabTitle"/>
</JTabbedPaneConstraints> </JTabbedPaneConstraints>
</Constraint> </Constraint>
</Constraints> </Constraints>
@ -486,14 +514,14 @@
</DimensionLayout> </DimensionLayout>
</Layout> </Layout>
</Container> </Container>
<Container class="javax.swing.JPanel" name="jPanel6"> <Container class="javax.swing.JPanel" name="advancedPanel">
<Properties> <Properties>
<Property name="name" type="java.lang.String" value="jPanel6" noResource="true"/> <Property name="name" type="java.lang.String" value="advancedPanel" noResource="true"/>
</Properties> </Properties>
<Constraints> <Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription"> <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout" value="org.netbeans.modules.form.compat2.layouts.support.JTabbedPaneSupportLayout$JTabbedPaneConstraintsDescription">
<JTabbedPaneConstraints tabName="Advanced"> <JTabbedPaneConstraints tabName="Advanced">
<Property name="tabTitle" type="java.lang.String" resourceKey="jPanel6.TabConstraints.tabTitle"/> <Property name="tabTitle" type="java.lang.String" resourceKey="advancedPanel.TabConstraints.tabTitle"/>
</JTabbedPaneConstraints> </JTabbedPaneConstraints>
</Constraint> </Constraint>
</Constraints> </Constraints>

View File

@ -6,6 +6,8 @@
package gui; package gui;
import router.configuration.SpeedHelper;
/** /**
* *
* @author mathias * @author mathias
@ -15,10 +17,15 @@ public class GeneralConfiguration extends javax.swing.JFrame {
/** Creates new form GeneralConfiguration */ /** Creates new form GeneralConfiguration */
public GeneralConfiguration() { public GeneralConfiguration() {
initComponents(); initComponents();
extraInitComponents();
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.setVisible(true); this.setVisible(true);
} }
private void extraInitComponents() {
downloadspeed.setText(SpeedHelper.getInboundBandwidth());
}
/** This method is called from within the constructor to /** This method is called from within the constructor to
* initialize the form. * initialize the form.
* WARNING: Do NOT modify this code. The content of this method is * WARNING: Do NOT modify this code. The content of this method is
@ -28,25 +35,26 @@ public class GeneralConfiguration extends javax.swing.JFrame {
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() { private void initComponents() {
jPanel1 = new javax.swing.JPanel(); buttonGroup1 = new javax.swing.ButtonGroup();
applyPanel = new javax.swing.JPanel();
cancel = new javax.swing.JToggleButton(); cancel = new javax.swing.JToggleButton();
ok = new javax.swing.JToggleButton(); ok = new javax.swing.JToggleButton();
jTabbedPane1 = new javax.swing.JTabbedPane(); settingsPanel = new javax.swing.JTabbedPane();
jPanel2 = new javax.swing.JPanel(); speedPanel = new javax.swing.JPanel();
jLabel1 = new javax.swing.JLabel(); uploadSpeedLabel = new javax.swing.JLabel();
jLabel2 = new javax.swing.JLabel(); downloadSpeedLabel = new javax.swing.JLabel();
jTextField1 = new javax.swing.JTextField(); uploadspeed = new javax.swing.JTextField();
jTextField2 = new javax.swing.JTextField(); downloadspeed = new javax.swing.JTextField();
jComboBox1 = new javax.swing.JComboBox(); uploadkbps = new javax.swing.JComboBox();
jComboBox2 = new javax.swing.JComboBox(); downloadkbps = new javax.swing.JComboBox();
jLabel3 = new javax.swing.JLabel(); jLabel3 = new javax.swing.JLabel();
jLabel4 = new javax.swing.JLabel(); jLabel4 = new javax.swing.JLabel();
jTextField3 = new javax.swing.JTextField(); uploadgb = new javax.swing.JTextField();
jTextField4 = new javax.swing.JTextField(); downloadgb = new javax.swing.JTextField();
jLabel5 = new javax.swing.JLabel(); jLabel5 = new javax.swing.JLabel();
jLabel6 = new javax.swing.JLabel(); jLabel6 = new javax.swing.JLabel();
jLabel7 = new javax.swing.JLabel(); jLabel7 = new javax.swing.JLabel();
jPanel3 = new javax.swing.JPanel(); updatesPanel = new javax.swing.JPanel();
jLabel8 = new javax.swing.JLabel(); jLabel8 = new javax.swing.JLabel();
jRadioButton1 = new javax.swing.JRadioButton(); jRadioButton1 = new javax.swing.JRadioButton();
jRadioButton2 = new javax.swing.JRadioButton(); jRadioButton2 = new javax.swing.JRadioButton();
@ -54,130 +62,164 @@ public class GeneralConfiguration extends javax.swing.JFrame {
jToggleButton1 = new javax.swing.JToggleButton(); jToggleButton1 = new javax.swing.JToggleButton();
jToggleButton2 = new javax.swing.JToggleButton(); jToggleButton2 = new javax.swing.JToggleButton();
jToggleButton3 = new javax.swing.JToggleButton(); jToggleButton3 = new javax.swing.JToggleButton();
jPanel4 = new javax.swing.JPanel(); tunnelPanel = new javax.swing.JPanel();
jScrollPane1 = new javax.swing.JScrollPane(); jScrollPane1 = new javax.swing.JScrollPane();
jScrollPane2 = new javax.swing.JScrollPane(); jScrollPane2 = new javax.swing.JScrollPane();
jLabel9 = new javax.swing.JLabel(); jLabel9 = new javax.swing.JLabel();
jLabel10 = new javax.swing.JLabel(); jLabel10 = new javax.swing.JLabel();
jLabel11 = new javax.swing.JLabel(); jLabel11 = new javax.swing.JLabel();
jPanel5 = new javax.swing.JPanel(); networkPanel = new javax.swing.JPanel();
jPanel6 = new javax.swing.JPanel(); advancedPanel = new javax.swing.JPanel();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(desktopgui.Main.class).getContext().getResourceMap(GeneralConfiguration.class);
setTitle(resourceMap.getString("Form.title")); // NOI18N
setName("Form"); // NOI18N setName("Form"); // NOI18N
jPanel1.setName("jPanel1"); // NOI18N applyPanel.setName("applyPanel"); // NOI18N
org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(desktopgui.Main.class).getContext().getResourceMap(GeneralConfiguration.class);
cancel.setText(resourceMap.getString("cancel.text")); // NOI18N cancel.setText(resourceMap.getString("cancel.text")); // NOI18N
cancel.setName("cancel"); // NOI18N cancel.setName("cancel"); // NOI18N
ok.setText(resourceMap.getString("ok.text")); // NOI18N ok.setText(resourceMap.getString("ok.text")); // NOI18N
ok.setName("ok"); // NOI18N ok.setName("ok"); // NOI18N
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); javax.swing.GroupLayout applyPanelLayout = new javax.swing.GroupLayout(applyPanel);
jPanel1.setLayout(jPanel1Layout); applyPanel.setLayout(applyPanelLayout);
jPanel1Layout.setHorizontalGroup( applyPanelLayout.setHorizontalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) applyPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, applyPanelLayout.createSequentialGroup()
.addContainerGap(475, Short.MAX_VALUE) .addContainerGap(475, Short.MAX_VALUE)
.addComponent(ok) .addComponent(ok)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(cancel) .addComponent(cancel)
.addContainerGap()) .addContainerGap())
); );
jPanel1Layout.setVerticalGroup( applyPanelLayout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) applyPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel1Layout.createSequentialGroup() .addGroup(applyPanelLayout.createSequentialGroup()
.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addGroup(applyPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(cancel) .addComponent(cancel)
.addComponent(ok)) .addComponent(ok))
.addContainerGap(14, Short.MAX_VALUE)) .addContainerGap(14, Short.MAX_VALUE))
); );
jTabbedPane1.setName("jTabbedPane1"); // NOI18N settingsPanel.setName("settingsPanel"); // NOI18N
jPanel2.setName("jPanel2"); // NOI18N speedPanel.setName("speedPanel"); // NOI18N
jPanel2.setLayout(null); speedPanel.setLayout(null);
jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N uploadSpeedLabel.setText(resourceMap.getString("uploadSpeedLabel.text")); // NOI18N
jLabel1.setName("jLabel1"); // NOI18N uploadSpeedLabel.setName("uploadSpeedLabel"); // NOI18N
jPanel2.add(jLabel1); speedPanel.add(uploadSpeedLabel);
jLabel1.setBounds(20, 20, 140, 30); uploadSpeedLabel.setBounds(20, 20, 140, 30);
jLabel2.setText(resourceMap.getString("jLabel2.text")); // NOI18N downloadSpeedLabel.setText(resourceMap.getString("downloadSpeedLabel.text")); // NOI18N
jLabel2.setName("jLabel2"); // NOI18N downloadSpeedLabel.setName("downloadSpeedLabel"); // NOI18N
jPanel2.add(jLabel2); speedPanel.add(downloadSpeedLabel);
jLabel2.setBounds(20, 60, 140, 30); downloadSpeedLabel.setBounds(20, 60, 140, 30);
jTextField1.setText(resourceMap.getString("jTextField1.text")); // NOI18N uploadspeed.setText(resourceMap.getString("uploadspeed.text")); // NOI18N
jTextField1.setName("jTextField1"); // NOI18N uploadspeed.setName("uploadspeed"); // NOI18N
jPanel2.add(jTextField1); uploadspeed.addKeyListener(new java.awt.event.KeyAdapter() {
jTextField1.setBounds(160, 20, 77, 27); public void keyTyped(java.awt.event.KeyEvent evt) {
speedKeyTyped(evt);
}
});
speedPanel.add(uploadspeed);
uploadspeed.setBounds(160, 20, 77, 27);
jTextField2.setText(resourceMap.getString("jTextField2.text")); // NOI18N downloadspeed.setText(resourceMap.getString("downloadspeed.text")); // NOI18N
jTextField2.setName("jTextField2"); // NOI18N downloadspeed.setName("downloadspeed"); // NOI18N
jPanel2.add(jTextField2); downloadspeed.addKeyListener(new java.awt.event.KeyAdapter() {
jTextField2.setBounds(160, 60, 77, 27); public void keyTyped(java.awt.event.KeyEvent evt) {
speedKeyTyped(evt);
}
});
speedPanel.add(downloadspeed);
downloadspeed.setBounds(160, 60, 77, 27);
jComboBox1.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); uploadkbps.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" }));
jComboBox1.setName("jComboBox1"); // NOI18N uploadkbps.setName("uploadkbps"); // NOI18N
jPanel2.add(jComboBox1); uploadkbps.addActionListener(new java.awt.event.ActionListener() {
jComboBox1.setBounds(240, 20, 78, 27); public void actionPerformed(java.awt.event.ActionEvent evt) {
uploadkbpsActionPerformed(evt);
}
});
speedPanel.add(uploadkbps);
uploadkbps.setBounds(240, 20, 68, 27);
jComboBox2.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" })); downloadkbps.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "kbps", "kBps" }));
jComboBox2.setName("jComboBox2"); // NOI18N downloadkbps.setName("downloadkbps"); // NOI18N
jPanel2.add(jComboBox2); downloadkbps.addActionListener(new java.awt.event.ActionListener() {
jComboBox2.setBounds(240, 60, 78, 27); public void actionPerformed(java.awt.event.ActionEvent evt) {
downloadkbpsActionPerformed(evt);
}
});
speedPanel.add(downloadkbps);
downloadkbps.setBounds(240, 60, 68, 27);
jLabel3.setText(resourceMap.getString("jLabel3.text")); // NOI18N jLabel3.setText(resourceMap.getString("jLabel3.text")); // NOI18N
jLabel3.setName("jLabel3"); // NOI18N jLabel3.setName("jLabel3"); // NOI18N
jPanel2.add(jLabel3); speedPanel.add(jLabel3);
jLabel3.setBounds(330, 20, 97, 30); jLabel3.setBounds(330, 20, 97, 30);
jLabel4.setText(resourceMap.getString("jLabel4.text")); // NOI18N jLabel4.setText(resourceMap.getString("jLabel4.text")); // NOI18N
jLabel4.setName("jLabel4"); // NOI18N jLabel4.setName("jLabel4"); // NOI18N
jPanel2.add(jLabel4); speedPanel.add(jLabel4);
jLabel4.setBounds(330, 60, 97, 30); jLabel4.setBounds(330, 60, 97, 30);
jTextField3.setText(resourceMap.getString("jTextField3.text")); // NOI18N uploadgb.setText(resourceMap.getString("uploadgb.text")); // NOI18N
jTextField3.setName("jTextField3"); // NOI18N uploadgb.setName("uploadgb"); // NOI18N
jPanel2.add(jTextField3); uploadgb.addKeyListener(new java.awt.event.KeyAdapter() {
jTextField3.setBounds(440, 20, 60, 27); public void keyTyped(java.awt.event.KeyEvent evt) {
uploadgbKeyTyped(evt);
}
});
speedPanel.add(uploadgb);
uploadgb.setBounds(440, 20, 60, 27);
jTextField4.setText(resourceMap.getString("jTextField4.text")); // NOI18N downloadgb.setText(resourceMap.getString("downloadgb.text")); // NOI18N
jTextField4.setName("jTextField4"); // NOI18N downloadgb.setName("downloadgb"); // NOI18N
jPanel2.add(jTextField4); downloadgb.addKeyListener(new java.awt.event.KeyAdapter() {
jTextField4.setBounds(440, 60, 60, 27); public void keyTyped(java.awt.event.KeyEvent evt) {
downloadgbKeyTyped(evt);
}
});
speedPanel.add(downloadgb);
downloadgb.setBounds(440, 60, 60, 27);
jLabel5.setText(resourceMap.getString("jLabel5.text")); // NOI18N jLabel5.setText(resourceMap.getString("jLabel5.text")); // NOI18N
jLabel5.setName("jLabel5"); // NOI18N jLabel5.setName("jLabel5"); // NOI18N
jPanel2.add(jLabel5); speedPanel.add(jLabel5);
jLabel5.setBounds(510, 20, 19, 30); jLabel5.setBounds(510, 20, 19, 30);
jLabel6.setText(resourceMap.getString("jLabel6.text")); // NOI18N jLabel6.setText(resourceMap.getString("jLabel6.text")); // NOI18N
jLabel6.setName("jLabel6"); // NOI18N jLabel6.setName("jLabel6"); // NOI18N
jPanel2.add(jLabel6); speedPanel.add(jLabel6);
jLabel6.setBounds(510, 60, 19, 30); jLabel6.setBounds(510, 60, 19, 30);
jLabel7.setText(resourceMap.getString("jLabel7.text")); // NOI18N jLabel7.setText(resourceMap.getString("jLabel7.text")); // NOI18N
jLabel7.setName("jLabel7"); // NOI18N jLabel7.setName("jLabel7"); // NOI18N
jPanel2.add(jLabel7); speedPanel.add(jLabel7);
jLabel7.setBounds(20, 100, 520, 70); jLabel7.setBounds(20, 100, 520, 70);
jTabbedPane1.addTab(resourceMap.getString("jPanel2.TabConstraints.tabTitle"), jPanel2); // NOI18N settingsPanel.addTab(resourceMap.getString("speedPanel.TabConstraints.tabTitle"), speedPanel); // NOI18N
jPanel3.setName("jPanel3"); // NOI18N updatesPanel.setName("updatesPanel"); // NOI18N
jLabel8.setText(resourceMap.getString("jLabel8.text")); // NOI18N jLabel8.setText(resourceMap.getString("jLabel8.text")); // NOI18N
jLabel8.setName("jLabel8"); // NOI18N jLabel8.setName("jLabel8"); // NOI18N
buttonGroup1.add(jRadioButton1);
jRadioButton1.setText(resourceMap.getString("jRadioButton1.text")); // NOI18N jRadioButton1.setText(resourceMap.getString("jRadioButton1.text")); // NOI18N
jRadioButton1.setName("jRadioButton1"); // NOI18N jRadioButton1.setName("jRadioButton1"); // NOI18N
buttonGroup1.add(jRadioButton2);
jRadioButton2.setText(resourceMap.getString("jRadioButton2.text")); // NOI18N jRadioButton2.setText(resourceMap.getString("jRadioButton2.text")); // NOI18N
jRadioButton2.setName("jRadioButton2"); // NOI18N jRadioButton2.setName("jRadioButton2"); // NOI18N
buttonGroup1.add(jRadioButton3);
jRadioButton3.setText(resourceMap.getString("jRadioButton3.text")); // NOI18N jRadioButton3.setText(resourceMap.getString("jRadioButton3.text")); // NOI18N
jRadioButton3.setName("jRadioButton3"); // NOI18N jRadioButton3.setName("jRadioButton3"); // NOI18N
@ -190,35 +232,35 @@ public class GeneralConfiguration extends javax.swing.JFrame {
jToggleButton3.setText(resourceMap.getString("jToggleButton3.text")); // NOI18N jToggleButton3.setText(resourceMap.getString("jToggleButton3.text")); // NOI18N
jToggleButton3.setName("jToggleButton3"); // NOI18N jToggleButton3.setName("jToggleButton3"); // NOI18N
javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3); javax.swing.GroupLayout updatesPanelLayout = new javax.swing.GroupLayout(updatesPanel);
jPanel3.setLayout(jPanel3Layout); updatesPanel.setLayout(updatesPanelLayout);
jPanel3Layout.setHorizontalGroup( updatesPanelLayout.setHorizontalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup() .addGroup(updatesPanelLayout.createSequentialGroup()
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup() .addGroup(updatesPanelLayout.createSequentialGroup()
.addGap(20, 20, 20) .addGap(20, 20, 20)
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jLabel8) .addComponent(jLabel8)
.addGroup(jPanel3Layout.createSequentialGroup() .addGroup(updatesPanelLayout.createSequentialGroup()
.addComponent(jToggleButton1) .addComponent(jToggleButton1)
.addGap(18, 18, 18) .addGap(18, 18, 18)
.addComponent(jToggleButton2)))) .addComponent(jToggleButton2))))
.addGroup(jPanel3Layout.createSequentialGroup() .addGroup(updatesPanelLayout.createSequentialGroup()
.addGap(40, 40, 40) .addGap(40, 40, 40)
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jRadioButton2) .addComponent(jRadioButton2)
.addComponent(jRadioButton1) .addComponent(jRadioButton1)
.addComponent(jRadioButton3)))) .addComponent(jRadioButton3))))
.addGap(9, 9, 9)) .addGap(9, 9, 9))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup() .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, updatesPanelLayout.createSequentialGroup()
.addContainerGap(339, Short.MAX_VALUE) .addContainerGap(339, Short.MAX_VALUE)
.addComponent(jToggleButton3) .addComponent(jToggleButton3)
.addContainerGap()) .addContainerGap())
); );
jPanel3Layout.setVerticalGroup( updatesPanelLayout.setVerticalGroup(
jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel3Layout.createSequentialGroup() .addGroup(updatesPanelLayout.createSequentialGroup()
.addContainerGap() .addContainerGap()
.addComponent(jLabel8) .addComponent(jLabel8)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
@ -228,7 +270,7 @@ public class GeneralConfiguration extends javax.swing.JFrame {
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jRadioButton3) .addComponent(jRadioButton3)
.addGap(18, 18, 18) .addGap(18, 18, 18)
.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addGroup(updatesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jToggleButton1) .addComponent(jToggleButton1)
.addComponent(jToggleButton2)) .addComponent(jToggleButton2))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 181, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 181, Short.MAX_VALUE)
@ -236,9 +278,9 @@ public class GeneralConfiguration extends javax.swing.JFrame {
.addContainerGap()) .addContainerGap())
); );
jTabbedPane1.addTab(resourceMap.getString("jPanel3.TabConstraints.tabTitle"), jPanel3); // NOI18N settingsPanel.addTab(resourceMap.getString("updatesPanel.TabConstraints.tabTitle"), updatesPanel); // NOI18N
jPanel4.setName("jPanel4"); // NOI18N tunnelPanel.setName("tunnelPanel"); // NOI18N
jScrollPane1.setName("jScrollPane1"); // NOI18N jScrollPane1.setName("jScrollPane1"); // NOI18N
@ -253,13 +295,13 @@ public class GeneralConfiguration extends javax.swing.JFrame {
jLabel11.setText(resourceMap.getString("jLabel11.text")); // NOI18N jLabel11.setText(resourceMap.getString("jLabel11.text")); // NOI18N
jLabel11.setName("jLabel11"); // NOI18N jLabel11.setName("jLabel11"); // NOI18N
javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4); javax.swing.GroupLayout tunnelPanelLayout = new javax.swing.GroupLayout(tunnelPanel);
jPanel4.setLayout(jPanel4Layout); tunnelPanel.setLayout(tunnelPanelLayout);
jPanel4Layout.setHorizontalGroup( tunnelPanelLayout.setHorizontalGroup(
jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) tunnelPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel4Layout.createSequentialGroup() .addGroup(tunnelPanelLayout.createSequentialGroup()
.addContainerGap() .addContainerGap()
.addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(tunnelPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jScrollPane2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE) .addComponent(jScrollPane2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE)
.addComponent(jLabel9, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE) .addComponent(jLabel9, javax.swing.GroupLayout.DEFAULT_SIZE, 538, Short.MAX_VALUE)
.addComponent(jLabel10) .addComponent(jLabel10)
@ -267,9 +309,9 @@ public class GeneralConfiguration extends javax.swing.JFrame {
.addComponent(jLabel11)) .addComponent(jLabel11))
.addContainerGap()) .addContainerGap())
); );
jPanel4Layout.setVerticalGroup( tunnelPanelLayout.setVerticalGroup(
jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) tunnelPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanel4Layout.createSequentialGroup() .addGroup(tunnelPanelLayout.createSequentialGroup()
.addContainerGap() .addContainerGap()
.addComponent(jLabel10) .addComponent(jLabel10)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
@ -283,67 +325,110 @@ public class GeneralConfiguration extends javax.swing.JFrame {
.addContainerGap()) .addContainerGap())
); );
jTabbedPane1.addTab(resourceMap.getString("jPanel4.TabConstraints.tabTitle"), jPanel4); // NOI18N settingsPanel.addTab(resourceMap.getString("tunnelPanel.TabConstraints.tabTitle"), tunnelPanel); // NOI18N
jPanel5.setName("jPanel5"); // NOI18N networkPanel.setName("networkPanel"); // NOI18N
javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5); javax.swing.GroupLayout networkPanelLayout = new javax.swing.GroupLayout(networkPanel);
jPanel5.setLayout(jPanel5Layout); networkPanel.setLayout(networkPanelLayout);
jPanel5Layout.setHorizontalGroup( networkPanelLayout.setHorizontalGroup(
jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) networkPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 562, Short.MAX_VALUE) .addGap(0, 562, Short.MAX_VALUE)
); );
jPanel5Layout.setVerticalGroup( networkPanelLayout.setVerticalGroup(
jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) networkPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 388, Short.MAX_VALUE) .addGap(0, 388, Short.MAX_VALUE)
); );
jTabbedPane1.addTab(resourceMap.getString("jPanel5.TabConstraints.tabTitle"), jPanel5); // NOI18N settingsPanel.addTab(resourceMap.getString("networkPanel.TabConstraints.tabTitle"), networkPanel); // NOI18N
jPanel6.setName("jPanel6"); // NOI18N advancedPanel.setName("advancedPanel"); // NOI18N
javax.swing.GroupLayout jPanel6Layout = new javax.swing.GroupLayout(jPanel6); javax.swing.GroupLayout advancedPanelLayout = new javax.swing.GroupLayout(advancedPanel);
jPanel6.setLayout(jPanel6Layout); advancedPanel.setLayout(advancedPanelLayout);
jPanel6Layout.setHorizontalGroup( advancedPanelLayout.setHorizontalGroup(
jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) advancedPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 562, Short.MAX_VALUE) .addGap(0, 562, Short.MAX_VALUE)
); );
jPanel6Layout.setVerticalGroup( advancedPanelLayout.setVerticalGroup(
jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) advancedPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 388, Short.MAX_VALUE) .addGap(0, 388, Short.MAX_VALUE)
); );
jTabbedPane1.addTab(resourceMap.getString("jPanel6.TabConstraints.tabTitle"), jPanel6); // NOI18N settingsPanel.addTab(resourceMap.getString("advancedPanel.TabConstraints.tabTitle"), advancedPanel); // NOI18N
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout); getContentPane().setLayout(layout);
layout.setHorizontalGroup( layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(applyPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(layout.createSequentialGroup() .addGroup(layout.createSequentialGroup()
.addGap(12, 12, 12) .addGap(12, 12, 12)
.addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 566, Short.MAX_VALUE)) .addComponent(settingsPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 566, Short.MAX_VALUE))
); );
layout.setVerticalGroup( layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addComponent(jTabbedPane1) .addComponent(settingsPanel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent(applyPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
); );
pack(); pack();
}// </editor-fold>//GEN-END:initComponents }// </editor-fold>//GEN-END:initComponents
private void speedKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_speedKeyTyped
try {
String upload = "";
if(uploadkbps.getSelectedIndex() == KILOBIT)
upload = "" + Integer.parseInt(uploadspeed.getText())/8;
else
upload = uploadspeed.getText();
String download = "";
if(downloadkbps.getSelectedIndex() == KILOBIT)
download = "" + Integer.parseInt(downloadspeed.getText())/8;
else
download = downloadspeed.getText();
initUsage(upload, download);
}
catch(NumberFormatException e) {
e.printStackTrace();
return;
}
}//GEN-LAST:event_speedKeyTyped
private void uploadkbpsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_uploadkbpsActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_uploadkbpsActionPerformed
private void downloadkbpsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_downloadkbpsActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_downloadkbpsActionPerformed
private void uploadgbKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_uploadgbKeyTyped
// TODO add your handling code here:
}//GEN-LAST:event_uploadgbKeyTyped
private void downloadgbKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_downloadgbKeyTyped
// TODO add your handling code here:
}//GEN-LAST:event_downloadgbKeyTyped
protected void initUsage(String upload, String download) {
uploadgb.setText("" + SpeedHelper.calculateMonthlyUsage(Integer.parseInt(upload)));
downloadgb.setText("" + SpeedHelper.calculateMonthlyUsage(Integer.parseInt(download)));
}
// Variables declaration - do not modify//GEN-BEGIN:variables // Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel advancedPanel;
private javax.swing.JPanel applyPanel;
private javax.swing.ButtonGroup buttonGroup1;
private javax.swing.JToggleButton cancel; private javax.swing.JToggleButton cancel;
private javax.swing.JComboBox jComboBox1; private javax.swing.JLabel downloadSpeedLabel;
private javax.swing.JComboBox jComboBox2; private javax.swing.JTextField downloadgb;
private javax.swing.JLabel jLabel1; private javax.swing.JComboBox downloadkbps;
private javax.swing.JTextField downloadspeed;
private javax.swing.JLabel jLabel10; private javax.swing.JLabel jLabel10;
private javax.swing.JLabel jLabel11; private javax.swing.JLabel jLabel11;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3; private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4; private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5; private javax.swing.JLabel jLabel5;
@ -351,26 +436,26 @@ public class GeneralConfiguration extends javax.swing.JFrame {
private javax.swing.JLabel jLabel7; private javax.swing.JLabel jLabel7;
private javax.swing.JLabel jLabel8; private javax.swing.JLabel jLabel8;
private javax.swing.JLabel jLabel9; private javax.swing.JLabel jLabel9;
private javax.swing.JPanel jPanel1;
private javax.swing.JPanel jPanel2;
private javax.swing.JPanel jPanel3;
private javax.swing.JPanel jPanel4;
private javax.swing.JPanel jPanel5;
private javax.swing.JPanel jPanel6;
private javax.swing.JRadioButton jRadioButton1; private javax.swing.JRadioButton jRadioButton1;
private javax.swing.JRadioButton jRadioButton2; private javax.swing.JRadioButton jRadioButton2;
private javax.swing.JRadioButton jRadioButton3; private javax.swing.JRadioButton jRadioButton3;
private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2; private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JTabbedPane jTabbedPane1;
private javax.swing.JTextField jTextField1;
private javax.swing.JTextField jTextField2;
private javax.swing.JTextField jTextField3;
private javax.swing.JTextField jTextField4;
private javax.swing.JToggleButton jToggleButton1; private javax.swing.JToggleButton jToggleButton1;
private javax.swing.JToggleButton jToggleButton2; private javax.swing.JToggleButton jToggleButton2;
private javax.swing.JToggleButton jToggleButton3; private javax.swing.JToggleButton jToggleButton3;
private javax.swing.JPanel networkPanel;
private javax.swing.JToggleButton ok; private javax.swing.JToggleButton ok;
private javax.swing.JTabbedPane settingsPanel;
private javax.swing.JPanel speedPanel;
private javax.swing.JPanel tunnelPanel;
private javax.swing.JPanel updatesPanel;
private javax.swing.JLabel uploadSpeedLabel;
private javax.swing.JTextField uploadgb;
private javax.swing.JComboBox uploadkbps;
private javax.swing.JTextField uploadspeed;
// End of variables declaration//GEN-END:variables // End of variables declaration//GEN-END:variables
public static final int KILOBIT = 0;
public static final int KILOBYTE = 1;
} }

View File

@ -37,13 +37,12 @@ import java.awt.Window;
import java.awt.event.MouseAdapter; import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import javax.swing.JDialog; import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JPopupMenu; import javax.swing.JPopupMenu;
import javax.swing.JWindow; import javax.swing.JWindow;
import javax.swing.RootPaneContainer; import javax.swing.RootPaneContainer;
import javax.swing.event.PopupMenuEvent; import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener; import javax.swing.event.PopupMenuListener;
import java.util.Date;
@ -63,6 +62,10 @@ public class JPopupTrayIcon extends TrayIcon {
private final static boolean IS_WINDOWS = System.getProperty("os.name").toLowerCase().contains("windows"); private final static boolean IS_WINDOWS = System.getProperty("os.name").toLowerCase().contains("windows");
private static MouseEvent previous = null;
private static Date previousTime = new Date();
private static Date time = new Date();
public JPopupTrayIcon(Image image) { public JPopupTrayIcon(Image image) {
super(image); super(image);
init(); init();
@ -92,12 +95,12 @@ public class JPopupTrayIcon extends TrayIcon {
@Override @Override
public void popupMenuWillBecomeVisible(PopupMenuEvent e) { public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
// System.out.println("popupMenuWillBecomeVisible"); //System.out.println("popupMenuWillBecomeVisible");
} }
@Override @Override
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
// System.out.println("popupMenuWillBecomeInvisible"); //System.out.println("popupMenuWillBecomeInvisible");
if(window != null) { if(window != null) {
window.dispose(); window.dispose();
window = null; window = null;
@ -117,21 +120,27 @@ public class JPopupTrayIcon extends TrayIcon {
addMouseListener(new MouseAdapter() { addMouseListener(new MouseAdapter() {
@Override @Override
public void mousePressed(MouseEvent e) { public void mousePressed(MouseEvent e) {
// System.out.println(e.getPoint()); //System.out.println("Pressed " + e.getPoint());
showJPopupMenu(e); showJPopupMenu(e, previous);
previous = e;
previousTime = time;
time = new Date();
} }
@Override @Override
public void mouseReleased(MouseEvent e) { public void mouseReleased(MouseEvent e) {
// System.out.println(e.getPoint()); //System.out.println("Released " + e.getPoint());
showJPopupMenu(e); showJPopupMenu(e, previous);
previous = e;
previousTime = time;
time = new Date();
} }
}); });
} }
private final void showJPopupMenu(MouseEvent e) { private final void showJPopupMenu(MouseEvent e, MouseEvent previous) {
if(e.isPopupTrigger() && menu != null) { if((e.isPopupTrigger() || previous.isPopupTrigger()) && (time.getTime() - previousTime.getTime() < 1000) && menu != null) {
if (window == null) { if (window == null) {
if(IS_WINDOWS) { if(IS_WINDOWS) {

View File

@ -3,6 +3,7 @@
<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JFrameFormInfo"> <Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
<Properties> <Properties>
<Property name="defaultCloseOperation" type="int" value="3"/> <Property name="defaultCloseOperation" type="int" value="3"/>
<Property name="title" type="java.lang.String" resourceKey="Form.title"/>
<Property name="name" type="java.lang.String" value="Form" noResource="true"/> <Property name="name" type="java.lang.String" value="Form" noResource="true"/>
</Properties> </Properties>
<SyntheticProperties> <SyntheticProperties>

View File

@ -73,6 +73,8 @@ public class LogViewer extends javax.swing.JFrame {
clearButton = new javax.swing.JButton(); clearButton = new javax.swing.JButton();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(desktopgui.Main.class).getContext().getResourceMap(LogViewer.class);
setTitle(resourceMap.getString("Form.title")); // NOI18N
setName("Form"); // NOI18N setName("Form"); // NOI18N
textScroll.setName("textScroll"); // NOI18N textScroll.setName("textScroll"); // NOI18N
@ -82,7 +84,6 @@ public class LogViewer extends javax.swing.JFrame {
logText.setName("logText"); // NOI18N logText.setName("logText"); // NOI18N
textScroll.setViewportView(logText); 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.setText(resourceMap.getString("explanationText.text")); // NOI18N
explanationText.setName("explanationText"); // NOI18N explanationText.setName("explanationText"); // NOI18N

View File

@ -16,6 +16,7 @@
<AuxValues> <AuxValues>
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/> <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="2"/>
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/> <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/> <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_i18nAutoMode" 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_layoutCodeTarget" type="java.lang.Integer" value="1"/>
@ -318,7 +319,7 @@
</Properties> </Properties>
<Constraints> <Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout" value="org.netbeans.modules.form.compat2.layouts.DesignAbsoluteLayout$AbsoluteConstraintsDescription"> <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"/> <AbsoluteConstraints x="580" y="150" width="40" height="30"/>
</Constraint> </Constraint>
</Constraints> </Constraints>
</Component> </Component>

View File

@ -231,7 +231,7 @@ public class SpeedSelector3 extends javax.swing.JFrame {
downloadGB.setText(resourceMap.getString("downloadUsageLabel.text")); // NOI18N downloadGB.setText(resourceMap.getString("downloadUsageLabel.text")); // NOI18N
downloadGB.setName("downloadUsageLabel"); // NOI18N downloadGB.setName("downloadUsageLabel"); // NOI18N
getContentPane().add(downloadGB); getContentPane().add(downloadGB);
downloadGB.setBounds(580, 150, 19, 30); downloadGB.setBounds(580, 150, 40, 30);
explanation.setText(resourceMap.getString("explanation.text")); // NOI18N explanation.setText(resourceMap.getString("explanation.text")); // NOI18N
explanation.setName("explanation"); // NOI18N explanation.setName("explanation"); // NOI18N

View File

@ -3,6 +3,7 @@
<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JDialogFormInfo"> <Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JDialogFormInfo">
<Properties> <Properties>
<Property name="defaultCloseOperation" type="int" value="2"/> <Property name="defaultCloseOperation" type="int" value="2"/>
<Property name="title" type="java.lang.String" resourceKey="Form.title"/>
<Property name="name" type="java.lang.String" value="Form" noResource="true"/> <Property name="name" type="java.lang.String" value="Form" noResource="true"/>
</Properties> </Properties>
<SyntheticProperties> <SyntheticProperties>
@ -22,8 +23,10 @@
<Layout> <Layout>
<DimensionLayout dim="0"> <DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0"> <Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0"> <Group type="102" attributes="0">
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" alignment="0" attributes="0">
<Group type="103" groupAlignment="1" max="-2" attributes="0"> <Group type="103" groupAlignment="1" max="-2" attributes="0">
<Component id="I2Plabel" alignment="0" max="32767" attributes="0"/> <Component id="I2Plabel" alignment="0" max="32767" attributes="0"/>
<Component id="GUILabel" alignment="0" max="32767" attributes="1"/> <Component id="GUILabel" alignment="0" max="32767" attributes="1"/>
@ -33,11 +36,9 @@
<Component id="I2PVersion" pref="126" max="32767" attributes="0"/> <Component id="I2PVersion" pref="126" max="32767" attributes="0"/>
<Component id="GUIVersion" pref="126" max="32767" attributes="0"/> <Component id="GUIVersion" pref="126" max="32767" attributes="0"/>
</Group> </Group>
<EmptySpace max="-2" attributes="0"/>
</Group> </Group>
<Group type="102" alignment="1" attributes="0"> <Component id="okButton" alignment="1" min="-2" max="-2" attributes="0"/>
<EmptySpace pref="294" max="32767" attributes="0"/> </Group>
<Component id="okButton" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/> <EmptySpace max="-2" attributes="0"/>
</Group> </Group>
</Group> </Group>

View File

@ -46,9 +46,10 @@ public class Version extends javax.swing.JDialog {
GUIVersion = new javax.swing.JLabel(); GUIVersion = new javax.swing.JLabel();
setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(desktopgui.Main.class).getContext().getResourceMap(Version.class);
setTitle(resourceMap.getString("Form.title")); // NOI18N
setName("Form"); // NOI18N setName("Form"); // NOI18N
org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(desktopgui.Main.class).getContext().getResourceMap(Version.class);
okButton.setText(resourceMap.getString("okButton.text")); // NOI18N okButton.setText(resourceMap.getString("okButton.text")); // NOI18N
okButton.setName("okButton"); // NOI18N okButton.setName("okButton"); // NOI18N
okButton.addActionListener(new java.awt.event.ActionListener() { okButton.addActionListener(new java.awt.event.ActionListener() {
@ -75,17 +76,16 @@ public class Version extends javax.swing.JDialog {
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup() .addGroup(layout.createSequentialGroup()
.addContainerGap() .addContainerGap()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
.addComponent(I2Plabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(I2Plabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(GUILabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addComponent(GUILabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGap(18, 18, 18) .addGap(18, 18, 18)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(I2PVersion, javax.swing.GroupLayout.DEFAULT_SIZE, 126, Short.MAX_VALUE) .addComponent(I2PVersion, javax.swing.GroupLayout.DEFAULT_SIZE, 126, Short.MAX_VALUE)
.addComponent(GUIVersion, javax.swing.GroupLayout.DEFAULT_SIZE, 126, Short.MAX_VALUE)) .addComponent(GUIVersion, javax.swing.GroupLayout.DEFAULT_SIZE, 126, Short.MAX_VALUE)))
.addContainerGap()) .addComponent(okButton, javax.swing.GroupLayout.Alignment.TRAILING))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(294, Short.MAX_VALUE)
.addComponent(okButton)
.addContainerGap()) .addContainerGap())
); );
layout.setVerticalGroup( layout.setVerticalGroup(

View File

@ -1,19 +1,7 @@
jPanel2.TabConstraints.tabTitle=Speed
jPanel3.TabConstraints.tabTitle=Updates
jPanel4.TabConstraints.tabTitle=Tunnels/Services
jPanel5.TabConstraints.tabTitle=Network
jPanel6.TabConstraints.tabTitle=Advanced
cancel.text=Cancel cancel.text=Cancel
ok.text=OK ok.text=OK
jLabel1.text=Upload speed:
jLabel2.text=Download speed:
jTextField1.text=jTextField1
jTextField2.text=jTextField2
jLabel3.text=Monthly usage: jLabel3.text=Monthly usage:
jLabel4.text=Monthly usage: jLabel4.text=Monthly usage:
jTextField3.text=jTextField3
jTextField4.text=jTextField4
jLabel5.text=GB jLabel5.text=GB
jLabel6.text=GB jLabel6.text=GB
jLabel7.text=Explanation ... jLabel7.text=Explanation ...
@ -27,3 +15,15 @@ jToggleButton3.text=Advanced update configuration
jLabel9.text=Tunnel explanation jLabel9.text=Tunnel explanation
jLabel10.text=Client tunnels: jLabel10.text=Client tunnels:
jLabel11.text=Server tunnels: jLabel11.text=Server tunnels:
Form.title=General Configuration
speedPanel.TabConstraints.tabTitle=Speed
updatesPanel.TabConstraints.tabTitle=Updates
tunnelPanel.TabConstraints.tabTitle=Tunnels/Services
networkPanel.TabConstraints.tabTitle=Network
advancedPanel.TabConstraints.tabTitle=Advanced
uploadSpeedLabel.text=Upload speed:
downloadSpeedLabel.text=Download speed:
uploadspeed.text=jTextField1
downloadspeed.text=jTextField2
uploadgb.text=jTextField3
downloadgb.text=jTextField4

View File

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

View File

@ -5,8 +5,8 @@ uploadLabel.text=Upload Speed:
uploadBurstLabel.text=Burst Upload Speed: uploadBurstLabel.text=Burst Upload Speed:
downloadLabel.text=Download Speed: downloadLabel.text=Download Speed:
downloadBurstLabel.text=Burst Download Speed: downloadBurstLabel.text=Burst Download Speed:
uploadUsageLabel.text=Monthly usage: uploadUsageLabel.text=GB
downloadUsageLabel.text=Monthly usage: downloadUsageLabel.text=GB
uploadField.text=jTextField1 uploadField.text=jTextField1
uploadBurstField.text=jTextField2 uploadBurstField.text=jTextField2
downloadField.text=jTextField4 downloadField.text=jTextField4

View File

@ -3,3 +3,4 @@ I2Plabel.text=<html><h1>I2P Version:</h1></html>
GUILabel.text=<html><h1>GUI Version:</h1></html> GUILabel.text=<html><h1>GUI Version:</h1></html>
I2PVersion.text=jLabel3 I2PVersion.text=jLabel3
GUIVersion.text=jLabel4 GUIVersion.text=jLabel4
Form.title=Version

View File

@ -1,5 +1,8 @@
package router.configuration; package router.configuration;
import net.i2p.router.transport.FIFOBandwidthRefiller;
import router.RouterHelper;
/** /**
* *
* @author mathias * @author mathias
@ -29,4 +32,8 @@ public class SpeedHelper {
public static int calculateSpeed(int gigabytes) { public static int calculateSpeed(int gigabytes) {
return (int) (((long)gigabytes)*1000000/31/24/3600); return (int) (((long)gigabytes)*1000000/31/24/3600);
} }
public static String getInboundBandwidth() {
return RouterHelper.getContext().router().getConfigSetting(FIFOBandwidthRefiller.PROP_INBOUND_BANDWIDTH);
}
} }

View File

@ -587,6 +587,8 @@ public class I2PSnarkServlet extends HttpServlet {
client = "I2PSnarkXL"; client = "I2PSnarkXL";
else if ("ZV".equals(ch.substring(2,4))) else if ("ZV".equals(ch.substring(2,4)))
client = "Robert"; client = "Robert";
else if ("VUZP".equals(ch))
client = "Robert";
else else
client = "Unknown (" + ch + ')'; client = "Unknown (" + ch + ')';
out.write("<font size=-1>" + client + "</font>&nbsp;&nbsp;<tt>" + peer.toString().substring(5, 9) + "</tt>"); out.write("<font size=-1>" + client + "</font>&nbsp;&nbsp;<tt>" + peer.toString().substring(5, 9) + "</tt>");

View File

@ -2,8 +2,6 @@ package net.i2p.client.streaming;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.ArrayList;
import java.util.List;
import net.i2p.I2PAppContext; import net.i2p.I2PAppContext;
import net.i2p.util.Log; import net.i2p.util.Log;
@ -126,7 +124,7 @@ class ConnectionHandler {
if (timeoutMs <= 0) { if (timeoutMs <= 0) {
try { try {
syn = _synQueue.take(); // waits forever syn = _synQueue.take(); // waits forever
} catch (InterruptedException ie) { break;} } catch (InterruptedException ie) { } // { break;}
} else { } else {
long remaining = expiration - _context.clock().now(); long remaining = expiration - _context.clock().now();
// (dont think this applies anymore for LinkedBlockingQueue) // (dont think this applies anymore for LinkedBlockingQueue)

View File

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

View File

@ -25,6 +25,10 @@
<echo message=" javadoc: generate javadoc for the entire project into ./build/javadoc" /> <echo message=" javadoc: generate javadoc for the entire project into ./build/javadoc" />
<echo message=" slackpkg: generate Slackware packages in ./Slackware/i2p and ./Slackware/i2p-base" /> <echo message=" slackpkg: generate Slackware packages in ./Slackware/i2p and ./Slackware/i2p-base" />
<echo message=" debianhowto: instructions on building Debian packages" /> <echo message=" debianhowto: instructions on building Debian packages" />
<echo message=" updaterWithDesktopgui: tar the built files and desktopgui in an i2pupdate.zip" />
<echo message=" pkgWithDesktopgui: distclean then package everything up with the desktopgui" />
<echo message=" distWithDesktopgui: pkgWithDesktopgui and javadoc" />
<echo message=" distcleanWithDesktopgui: clean up all derived files (including desktopgui files)" />
</target> </target>
<target name="debianhowto"> <target name="debianhowto">
<echo message="To build debian packages, you must run dpkg-buildpackage as root in the source directory. It will then run ant for you. dpkg-buildpackage is found in the 'dpkg-dev' package. Also it should work fine to use the 'fakeroot' package with dpkg-buildpackage, if you don't want to run as root. Please read 'man dpkg-buildpackage' before building any packages yourself." /> <echo message="To build debian packages, you must run dpkg-buildpackage as root in the source directory. It will then run ant for you. dpkg-buildpackage is found in the 'dpkg-dev' package. Also it should work fine to use the 'fakeroot' package with dpkg-buildpackage, if you don't want to run as root. Please read 'man dpkg-buildpackage' before building any packages yourself." />

View File

@ -16,7 +16,6 @@ import java.net.Socket;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
@ -90,7 +89,7 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
protected I2PAppContext _context; protected I2PAppContext _context;
/** monitor for waiting until a lease set has been granted */ /** monitor for waiting until a lease set has been granted */
private Object _leaseSetWait = new Object(); private final Object _leaseSetWait = new Object();
/** whether the session connection has already been closed (or not yet opened) */ /** whether the session connection has already been closed (or not yet opened) */
protected boolean _closed; protected boolean _closed;
@ -101,7 +100,7 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
/** have we received the current date from the router yet? */ /** have we received the current date from the router yet? */
private boolean _dateReceived; private boolean _dateReceived;
/** lock that we wait upon, that the SetDateMessageHandler notifies */ /** lock that we wait upon, that the SetDateMessageHandler notifies */
private Object _dateReceivedLock = new Object(); private final Object _dateReceivedLock = new Object();
/** /**
* thread that we tell when new messages are available who then tells us * thread that we tell when new messages are available who then tells us
@ -253,6 +252,7 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
try { try {
if (_log.shouldLog(Log.DEBUG)) _log.debug(getPrefix() + "connect begin to " + _hostname + ":" + _portNum); if (_log.shouldLog(Log.DEBUG)) _log.debug(getPrefix() + "connect begin to " + _hostname + ":" + _portNum);
_socket = new Socket(_hostname, _portNum); _socket = new Socket(_hostname, _portNum);
// _socket.setSoTimeout(1000000); // Uhmmm we could really-really use a real timeout, and handle it.
_out = _socket.getOutputStream(); _out = _socket.getOutputStream();
synchronized (_out) { synchronized (_out) {
_out.write(I2PClient.PROTOCOL_BYTE); _out.write(I2PClient.PROTOCOL_BYTE);

View File

@ -4,18 +4,16 @@ package net.i2p.client;
* public domain * public domain
*/ */
import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
import java.util.HashSet;
import java.util.Properties; import java.util.Properties;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
import net.i2p.I2PAppContext; import net.i2p.I2PAppContext;
import net.i2p.data.DataHelper; import net.i2p.data.DataHelper;
import net.i2p.data.Destination; import net.i2p.data.Destination;
import net.i2p.data.SessionKey; import net.i2p.data.SessionKey;
import net.i2p.data.SessionTag;
import net.i2p.data.i2cp.MessagePayloadMessage; import net.i2p.data.i2cp.MessagePayloadMessage;
import net.i2p.util.Log; import net.i2p.util.Log;
import net.i2p.util.SimpleScheduler; import net.i2p.util.SimpleScheduler;
@ -97,6 +95,7 @@ class I2PSessionMuxedImpl extends I2PSessionImpl2 implements I2PSession {
* 255 disallowed * 255 disallowed
* @param port 1-65535 or PORT_ANY for all * @param port 1-65535 or PORT_ANY for all
*/ */
@Override
public void addSessionListener(I2PSessionListener lsnr, int proto, int port) { public void addSessionListener(I2PSessionListener lsnr, int proto, int port) {
_demultiplexer.addListener(lsnr, proto, port); _demultiplexer.addListener(lsnr, proto, port);
} }
@ -107,11 +106,13 @@ class I2PSessionMuxedImpl extends I2PSessionImpl2 implements I2PSession {
* @param proto 1-254 or 0 for all; 255 disallowed * @param proto 1-254 or 0 for all; 255 disallowed
* @param port 1-65535 or 0 for all * @param port 1-65535 or 0 for all
*/ */
@Override
public void addMuxedSessionListener(I2PSessionMuxedListener l, int proto, int port) { public void addMuxedSessionListener(I2PSessionMuxedListener l, int proto, int port) {
_demultiplexer.addMuxedListener(l, proto, port); _demultiplexer.addMuxedListener(l, proto, port);
} }
/** removes the specified listener (only) */ /** removes the specified listener (only) */
@Override
public void removeListener(int proto, int port) { public void removeListener(int proto, int port) {
_demultiplexer.removeListener(proto, port); _demultiplexer.removeListener(proto, port);
} }
@ -149,6 +150,7 @@ class I2PSessionMuxedImpl extends I2PSessionImpl2 implements I2PSession {
* @param fromPort 1-65535 or 0 for unset * @param fromPort 1-65535 or 0 for unset
* @param toPort 1-65535 or 0 for unset * @param toPort 1-65535 or 0 for unset
*/ */
@Override
public boolean sendMessage(Destination dest, byte[] payload, int offset, int size, public boolean sendMessage(Destination dest, byte[] payload, int offset, int size,
SessionKey keyUsed, Set tagsSent, long expires, SessionKey keyUsed, Set tagsSent, long expires,
int proto, int fromPort, int toPort) int proto, int fromPort, int toPort)
@ -198,24 +200,40 @@ class I2PSessionMuxedImpl extends I2PSessionImpl2 implements I2PSession {
protected class MuxedAvailabilityNotifier extends AvailabilityNotifier { protected class MuxedAvailabilityNotifier extends AvailabilityNotifier {
private LinkedBlockingQueue<MsgData> _msgs; private LinkedBlockingQueue<MsgData> _msgs;
private boolean _alive; private AtomicBoolean _alive = new AtomicBoolean(false);
private static final int POISON_SIZE = -99999; private static final int POISON_SIZE = -99999;
private AtomicBoolean stopping = new AtomicBoolean(false);
public MuxedAvailabilityNotifier() { public MuxedAvailabilityNotifier() {
_msgs = new LinkedBlockingQueue(); _msgs = new LinkedBlockingQueue();
} }
@Override
public void stopNotifying() { public void stopNotifying() {
if(stopping.get()) return;
stopping.set(true);
boolean again = true;
// _msgs.clear();
// Thread.yield();
if (_alive.get()) {
// System.out.println("I2PSessionMuxedImpl.stopNotifying()");
_msgs.clear(); _msgs.clear();
if (_alive) { while(again) {
_alive = false;
try { try {
_msgs.put(new MsgData(0, POISON_SIZE, 0, 0, 0)); _msgs.put(new MsgData(0, POISON_SIZE, 0, 0, 0));
} catch (InterruptedException ie) {} again = false;
// System.out.println("I2PSessionMuxedImpl.stopNotifying() success.");
} catch (InterruptedException ie) {
continue;
} }
} }
}
_alive.set(false);
stopping.set(false); // Do we need this?
}
/** unused */ /** unused */
@Override
public void available(long msgId, int size) { throw new IllegalArgumentException("no"); } public void available(long msgId, int size) { throw new IllegalArgumentException("no"); }
public void available(long msgId, int size, int proto, int fromPort, int toPort) { public void available(long msgId, int size, int proto, int fromPort, int toPort) {
@ -224,20 +242,24 @@ class I2PSessionMuxedImpl extends I2PSessionImpl2 implements I2PSession {
} catch (InterruptedException ie) {} } catch (InterruptedException ie) {}
} }
@Override
public void run() { public void run() {
_alive = true;
while (true) {
MsgData msg; MsgData msg;
_alive.set(true);
while (_alive.get()) {
try { try {
msg = _msgs.take(); msg = _msgs.take();
} catch (InterruptedException ie) { } catch (InterruptedException ie) {
_log.debug("I2PSessionMuxedImpl.run() InterruptedException " + String.valueOf(_msgs.size()) + " Messages, Alive " + _alive.toString());
continue; continue;
} }
if (msg.size == POISON_SIZE) if (msg.size == POISON_SIZE) {
// System.out.println("I2PSessionMuxedImpl.run() POISONED");
break; break;
}
try { try {
_demultiplexer.messageAvailable(I2PSessionMuxedImpl.this, msg.id, _demultiplexer.messageAvailable(I2PSessionMuxedImpl.this,
msg.size, msg.proto, msg.fromPort, msg.toPort); msg.id, msg.size, msg.proto, msg.fromPort, msg.toPort);
} catch (Exception e) { } catch (Exception e) {
_log.error("Error notifying app of message availability"); _log.error("Error notifying app of message availability");
} }

View File

@ -115,8 +115,8 @@ public class I2CPMessageReader {
} }
private class I2CPMessageReaderRunner implements Runnable { private class I2CPMessageReaderRunner implements Runnable {
private boolean _doRun; private volatile boolean _doRun;
private boolean _stayAlive; private volatile boolean _stayAlive;
public I2CPMessageReaderRunner() { public I2CPMessageReaderRunner() {
_doRun = true; _doRun = true;

View File

@ -1,5 +1,91 @@
2009-05-06 Mathiasdm
* Improvements to popup menu rightclick action
* Added general configuration options (still not available by default)
* General fixes
* Added ant build options (irc says eche|on would like that ;))
2009-05-06 sponge
* Hopefully the last fixes for BOB.
* Fixes to prevent race in client-side I2CP and Notifier.
2009-05-03 sponge
* More hopeful fixes for BOB.
* Added new Robert ID to snark
2009-05-01 zzz
* Build files:
- Fix up susidns build file so it will work with gcj
- Add consoleDocs target
* Client: Fix race NPE (thanks sponge)
* Console: fix ERR-UDP Disabled and Inbound TCP host/port not set
* I2CP: Fix race NPE
* I2PTunnel:
- Try to fix locking to prevent duplicate destinations when using
the new option new-dest-on-resume. Still not right for shared clients
but should be better for non-shared.
* Router console:
- Add jbigi and cpu info to logs.jsp
* Session key manager:
- Log before a hang maybe
* URL Launcher:
- Launcher on linux was stopping after trying opera, whether it succeeded or failed.
Now it keeps going to try firefox, etc. as designed.
- Extend default delay from 5s to 15s so it will reliably start
2009-04-27 sponge
* more BOB fixes, complete with warnings when things go wrong, and
success messages when things turn around and go right. Terminates
early so that applications wait no more than 10 seconds or so.
* Reversed a few earlier patches that caused some odd behavior.
* Changed some core println()'s to debugging messages.
2009-04-27 zzz
* Build files:
- New updaterWithJettyFixes target, build it for pkg
- Pass compiler args down from top build.xml
* GarlicMessageBuilder: Reduce bundled tags to 40 (was 100)
* i2psnark: Add Postman2 tracker
* I2PTunnel: Allow spaces in dest and proxy lists
* NetDb:
- Adjust RouterInfo expiration down to control memory usage
- Display LeaseSets and RouterInfos on separate console pages
* NTCP:
- Correct the meanings of the i2np.ntcp.autoip and i2np.ntcp.autoport
advanced config. If you have one of these set but not the other, you
will have to adjust your configuration on config.jsp.
* RouterConsole: iframe tweaks
* StatisticsManager: Cleanup
* Streaming: Don't let jrandom yell so loud
2009-04-25 sponge
* I2PSessionMuxedImpl atomic fixes
* BOB fixes. This should be the final bug wack. Good Luck to everybody!
2009-04-23 zzz
* Blocklist: cleanup
* eepget: handle -h, --help, bad options, etc.
(http://forum.i2p/viewtopic.php?p=16261#16261)
* Fragmenter: don't re-throw the corrupt fragment IllegalStateException,
to limit the damage - root cause still not found
* i2psnark: (http://forum.i2p/viewtopic.php?t=3317)
- Change file limit to 512 (was 256)
- Change size limit to 10GB (was 5GB)
- Change request size to 16KB (was 32KB)
- Change pipeline to 5 (was 3)
* logs.jsp: Move version info to the top
* Jetty: Fix temp dir name handling on windows, which was
causing susidns not to start
(http://forum.i2p/viewtopic.php?t=3364)
* NTCP: Prevent IllegalStateException
* PeerProfile:
- Replace a hot lock with concurrent RW lock
- Rewrite ugly IP Restriction code
- Also use transport IP in restriction code
* RouterConsole: Make summary bar a refreshing iframe
* Transport: Start the previously unused CleanupUnreachable
2009-04-21 sponge 2009-04-21 sponge
* Code janator work, basic corrections involving @Override, and * Code janitor work, basic corrections involving @Override, and
appling final where it is important. Also fixed some equals methods appling final where it is important. Also fixed some equals methods
and commented places that need fixing. and commented places that need fixing.

View File

@ -313,3 +313,4 @@ tracker.mastertracker.i2p=VzXD~stRKbL3MOmeTn1iaCQ0CFyTmuFHiKYyo0Rd~dFPZFCYH-22rT
codevoid.i2p=tV-4GJjgYIoCDTTJ91nfDbhSnT8B2o3v-TUfHtiAAjJJdroCAEDbmJWFPUQJEEispvrjNe~fP7VAYkk9fAhSrmdBLtEGB3NUESdiZEPsDtKJBdxijPGb1erZF2Z6eYHoK-t5g7MWWTsgLz~4xn211Jpfa-T4pqL2tcjsa7ixsaMpHF8NXFrITdyxSJRPz8OnHYgDR~ULFyzroi255MpiSUBzGcUZEiQSFLHLhjT5D5tP~gfJirFnfgOHvzWBK9L7y91qY~gYvM2eDcxMxq4Ac1gw0JeahkzAk3j6Spco3LHW3bJvELopf1QmLFu3nfPaegH1Hejt9AhXEH~FV-~M9F1BePipcIYlm7nKyre3aVPLYDZSCvkUx~8nnD3HEpMijD8fdfqSFPU7aZQe19a7rZJUbX~a4M3rBDO-C4uAid6Uznb1tLu2XR1GVVITGHaLwmumImXjlU~1nEnluBQB6iBQPZ9xJccArlYgWSooR9gpyN93PwTPsPe5cPkxCFuxAAAA codevoid.i2p=tV-4GJjgYIoCDTTJ91nfDbhSnT8B2o3v-TUfHtiAAjJJdroCAEDbmJWFPUQJEEispvrjNe~fP7VAYkk9fAhSrmdBLtEGB3NUESdiZEPsDtKJBdxijPGb1erZF2Z6eYHoK-t5g7MWWTsgLz~4xn211Jpfa-T4pqL2tcjsa7ixsaMpHF8NXFrITdyxSJRPz8OnHYgDR~ULFyzroi255MpiSUBzGcUZEiQSFLHLhjT5D5tP~gfJirFnfgOHvzWBK9L7y91qY~gYvM2eDcxMxq4Ac1gw0JeahkzAk3j6Spco3LHW3bJvELopf1QmLFu3nfPaegH1Hejt9AhXEH~FV-~M9F1BePipcIYlm7nKyre3aVPLYDZSCvkUx~8nnD3HEpMijD8fdfqSFPU7aZQe19a7rZJUbX~a4M3rBDO-C4uAid6Uznb1tLu2XR1GVVITGHaLwmumImXjlU~1nEnluBQB6iBQPZ9xJccArlYgWSooR9gpyN93PwTPsPe5cPkxCFuxAAAA
echelon.i2p=w6zK9m4fqSfvJck9EGIR1wRIbWsEQ2DkjZ-VI57ESFqLqbTIA1cD5nOfSSbpELqPyhjifdrNiBNAsSdyil3C0a2B7CGtwUcTS2dCG0tKf2nAbvpsbcCK17nI4Xbu5KqZU0y3hJ~l7rcJqQBR0nfV5cU30ZDrpQV6VL875cihGlnmwLFq6qSzNcEb88Nw6wFG~FIgB2PJ6A3jJyuTnLrdiMvwqgD6nSyeOylOgBCsNxXh8-drrhASjladfNrwjlGRCZTiQ~H92HIyOwiabDiG3TUugMaFWs87yuXnZ~ni9jgjoAMFo8xV8Od2BiRgCxkZoMU07FhgUjew9qtXNa04wkexf3gx77nVPhqE0GHqCuwHwmBVf92RdYEys76u~akaOMq5UhayDpCBCaHiYLkKDNqmh47tfMCwxf6z8VIcR4zv25QfJDIWPs~RA~9U7m4raytiAs5PvYZBn4B3SqOL8XdkL9sDT54sQXbsYCJr3olu6ieMtNWlmos0uohYXNUyAAAA echelon.i2p=w6zK9m4fqSfvJck9EGIR1wRIbWsEQ2DkjZ-VI57ESFqLqbTIA1cD5nOfSSbpELqPyhjifdrNiBNAsSdyil3C0a2B7CGtwUcTS2dCG0tKf2nAbvpsbcCK17nI4Xbu5KqZU0y3hJ~l7rcJqQBR0nfV5cU30ZDrpQV6VL875cihGlnmwLFq6qSzNcEb88Nw6wFG~FIgB2PJ6A3jJyuTnLrdiMvwqgD6nSyeOylOgBCsNxXh8-drrhASjladfNrwjlGRCZTiQ~H92HIyOwiabDiG3TUugMaFWs87yuXnZ~ni9jgjoAMFo8xV8Od2BiRgCxkZoMU07FhgUjew9qtXNa04wkexf3gx77nVPhqE0GHqCuwHwmBVf92RdYEys76u~akaOMq5UhayDpCBCaHiYLkKDNqmh47tfMCwxf6z8VIcR4zv25QfJDIWPs~RA~9U7m4raytiAs5PvYZBn4B3SqOL8XdkL9sDT54sQXbsYCJr3olu6ieMtNWlmos0uohYXNUyAAAA
crstrack.i2p=b4G9sCdtfvccMAXh~SaZrPqVQNyGQbhbYMbw6supq2XGzbjU4NcOmjFI0vxQ8w1L05twmkOvg5QERcX6Mi8NQrWnR0stLExu2LucUXg1aYjnggxIR8TIOGygZVIMV3STKH4UQXD--wz0BUrqaLxPhrm2Eh9Hwc8TdB6Na4ShQUq5Xm8D4elzNUVdpM~RtChEyJWuQvoGAHY3ppX-EJJLkiSr1t77neS4Lc-KofMVmgI9a2tSSpNAagBiNI6Ak9L1T0F9uxeDfEG9bBSQPNMOSUbAoEcNxtt7xOW~cNOAyMyGydwPMnrQ5kIYPY8Pd3XudEko970vE0D6gO19yoBMJpKx6Dh50DGgybLQ9CpRaynh2zPULTHxm8rneOGRcQo8D3mE7FQ92m54~SvfjXjD2TwAVGI~ae~n9HDxt8uxOecAAvjjJ3TD4XM63Q9TmB38RmGNzNLDBQMEmJFpqQU8YeuhnS54IVdUoVQFqui5SfDeLXlSkh4vYoMU66pvBfWbAAAA crstrack.i2p=b4G9sCdtfvccMAXh~SaZrPqVQNyGQbhbYMbw6supq2XGzbjU4NcOmjFI0vxQ8w1L05twmkOvg5QERcX6Mi8NQrWnR0stLExu2LucUXg1aYjnggxIR8TIOGygZVIMV3STKH4UQXD--wz0BUrqaLxPhrm2Eh9Hwc8TdB6Na4ShQUq5Xm8D4elzNUVdpM~RtChEyJWuQvoGAHY3ppX-EJJLkiSr1t77neS4Lc-KofMVmgI9a2tSSpNAagBiNI6Ak9L1T0F9uxeDfEG9bBSQPNMOSUbAoEcNxtt7xOW~cNOAyMyGydwPMnrQ5kIYPY8Pd3XudEko970vE0D6gO19yoBMJpKx6Dh50DGgybLQ9CpRaynh2zPULTHxm8rneOGRcQo8D3mE7FQ92m54~SvfjXjD2TwAVGI~ae~n9HDxt8uxOecAAvjjJ3TD4XM63Q9TmB38RmGNzNLDBQMEmJFpqQU8YeuhnS54IVdUoVQFqui5SfDeLXlSkh4vYoMU66pvBfWbAAAA
tracker2.postman.i2p=lnQ6yoBTxQuQU8EQ1FlF395ITIQF-HGJxUeFvzETLFnoczNjQvKDbtSB7aHhn853zjVXrJBgwlB9sO57KakBDaJ50lUZgVPhjlI19TgJ-CxyHhHSCeKx5JzURdEW-ucdONMynr-b2zwhsx8VQCJwCEkARvt21YkOyQDaB9IdV8aTAmP~PUJQxRwceaTMn96FcVenwdXqleE16fI8CVFOV18jbJKrhTOYpTtcZKV4l1wNYBDwKgwPx5c0kcrRzFyw5~bjuAKO~GJ5dR7BQsL7AwBoQUS4k1lwoYrG1kOIBeDD3XF8BWb6K3GOOoyjc1umYKpur3G~FxBuqtHAsDRICkEbKUqJ9mPYQlTSujhNxiRIW-oLwMtvayCFci99oX8MvazPS7~97x0Gsm-onEK1Td9nBdmq30OqDxpRtXBimbzkLbR1IKObbg9HvrKs3L-kSyGwTUmHG9rSQSoZEvFMA-S0EXO~o4g21q1oikmxPMhkeVwQ22VHB0-LZJfmLr4SAAAA

View File

@ -999,8 +999,7 @@ public class Router {
} }
public static void main(String args[]) { public static void main(String args[]) {
System.out.println("Starting I2P " + RouterVersion.VERSION + "-" + RouterVersion.BUILD); System.out.println("Starting I2P " + RouterVersion.FULL_VERSION);
System.out.println(RouterVersion.ID);
installUpdates(); installUpdates();
verifyWrapperConfig(); verifyWrapperConfig();
Router r = new Router(); Router r = new Router();

View File

@ -15,11 +15,15 @@ import net.i2p.CoreVersion;
* *
*/ */
public class RouterVersion { public class RouterVersion {
public final static String ID = "$Revision: 1.548 $ $Date: 2008-06-07 23:00:00 $"; /** deprecated */
public final static String ID = "Monotone";
public final static String VERSION = CoreVersion.VERSION; public final static String VERSION = CoreVersion.VERSION;
public final static long BUILD = 1; public final static long BUILD = 8;
/** for example "-test" */
public final static String EXTRA = "";
public final static String FULL_VERSION = VERSION + "-" + BUILD + EXTRA;
public static void main(String args[]) { public static void main(String args[]) {
System.out.println("I2P Router version: " + VERSION + "-" + BUILD); System.out.println("I2P Router version: " + FULL_VERSION);
System.out.println("Router ID: " + RouterVersion.ID); System.out.println("Router ID: " + RouterVersion.ID);
System.out.println("I2P Core version: " + CoreVersion.VERSION); System.out.println("I2P Core version: " + CoreVersion.VERSION);
System.out.println("Core ID: " + CoreVersion.ID); System.out.println("Core ID: " + CoreVersion.ID);