Changeset f511c9b


Ignore:
Timestamp:
May 30, 2009 4:28:51 PM (11 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
7725b9e
Parents:
56b768f (diff), 26c4f98 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

propagate from branch 'i2p.i2p.zzz.test' (head 177f3f7dbb937e60486cb90da7bbcdf9987ffced)

to branch 'i2p.i2p' (head d2424406b9f3877644a1334df71313b6cba018e4)

Files:
2 added
25 edited

Legend:

Unmodified
Added
Removed
  • LICENSE.txt

    r56b768f rf511c9b  
    180180   Public domain
    181181
     182   Desktopgui
     183   Copyright (c) Mathias De Maré
     184   See apps/desktopgui/LICENSE
     185
    182186   SAM C Library:
    183187   Copyright (c) 2004, Matthew P. Cashdollar <mpc@innographx.com>
  • apps/BOB/src/net/i2p/BOB/BOB.java

    r56b768f rf511c9b  
    2828import java.io.FileOutputStream;
    2929import java.io.IOException;
     30import java.net.ConnectException;
    3031import java.net.InetAddress;
    3132import java.net.ServerSocket;
    3233import java.net.Socket;
     34import java.net.SocketTimeoutException;
    3335import java.util.Properties;
     36import java.util.concurrent.atomic.AtomicBoolean;
    3437import net.i2p.client.I2PClient;
    3538import net.i2p.client.streaming.RetransmissionTimer;
    3639import net.i2p.util.Log;
    3740import net.i2p.util.SimpleScheduler;
     41import net.i2p.util.SimpleStore;
    3842import net.i2p.util.SimpleTimer2;
    3943
     
    115119        public final static String PROP_BOB_PORT = "BOB.port";
    116120        public final static String PROP_BOB_HOST = "BOB.host";
    117         private static int maxConnections = 0;
    118121        private static NamedDB database;
    119122        private static Properties props = new Properties();
    120 
     123        private static AtomicBoolean spin = new AtomicBoolean(true);
     124        private static final String P_RUNNING = "RUNNING";
     125        private static final String P_STARTING = "STARTING";
     126        private static final String P_STOPPING = "STOPPING";
     127        private static AtomicBoolean lock = new AtomicBoolean(false);
     128        // no longer used.
     129        // private static int maxConnections = 0;
    121130
    122131        /**
     
    151160
    152161        /**
     162         * Stop BOB gracefully
     163         */
     164        public static void stop() {
     165                spin.set(false);
     166        }
     167        /**
    153168         * Listen for incoming connections and handle them
    154169         *
     
    157172        public static void main(String[] args) {
    158173                database = new NamedDB();
     174                ServerSocket listener = null;
    159175                int i = 0;
    160176                boolean save = false;
     
    169185                i = Y1.hashCode();
    170186                i = Y2.hashCode();
    171 
    172                 {
     187                try {
     188                        {
     189                                try {
     190                                        FileInputStream fi = new FileInputStream(configLocation);
     191                                        props.load(fi);
     192                                        fi.close();
     193                                } catch (FileNotFoundException fnfe) {
     194                                        warn("Unable to load up the BOB config file " + configLocation + ", Using defaults.");
     195                                        warn(fnfe.toString());
     196                                        save = true;
     197                                } catch (IOException ioe) {
     198                                        warn("IOException on BOB config file " + configLocation + ", using defaults.");
     199                                        warn(ioe.toString());
     200                                }
     201                        }
     202                        // Global router and client API configurations that are missing are set to defaults here.
     203                        if (!props.containsKey(I2PClient.PROP_TCP_HOST)) {
     204                                props.setProperty(I2PClient.PROP_TCP_HOST, "localhost");
     205                        }
     206                        if (!props.containsKey(I2PClient.PROP_TCP_PORT)) {
     207                                props.setProperty(I2PClient.PROP_TCP_PORT, "7654");
     208                        }
     209                        if (!props.containsKey(I2PClient.PROP_RELIABILITY)) {
     210                                props.setProperty(I2PClient.PROP_RELIABILITY, I2PClient.PROP_RELIABILITY_BEST_EFFORT);
     211                        }
     212                        if (!props.containsKey(PROP_BOB_PORT)) {
     213                                props.setProperty(PROP_BOB_PORT, "2827"); // 0xB0B
     214                        }
     215                        if (!props.containsKey("inbound.length")) {
     216                                props.setProperty("inbound.length", "1");
     217                        }
     218                        if (!props.containsKey("outbound.length")) {
     219                                props.setProperty("outbound.length", "1");
     220                        }
     221                        if (!props.containsKey("inbound.lengthVariance")) {
     222                                props.setProperty("inbound.lengthVariance", "0");
     223                        }
     224                        if (!props.containsKey("outbound.lengthVariance")) {
     225                                props.setProperty("outbound.lengthVariance", "0");
     226                        }
     227                        if (!props.containsKey(PROP_BOB_HOST)) {
     228                                props.setProperty(PROP_BOB_HOST, "localhost");
     229                        }
     230                        if (save) {
     231                                try {
     232                                        warn("Writing new defaults file " + configLocation);
     233                                        FileOutputStream fo = new FileOutputStream(configLocation);
     234                                        props.store(fo, configLocation);
     235                                        fo.close();
     236                                } catch (IOException ioe) {
     237                                        error("IOException on BOB config file " + configLocation + ", " + ioe);
     238                                }
     239                        }
     240
     241                        i = 0;
     242                        boolean g = false;
    173243                        try {
    174                                 FileInputStream fi = new FileInputStream(configLocation);
    175                                 props.load(fi);
    176                                 fi.close();
    177                         } catch(FileNotFoundException fnfe) {
    178                                 warn("Unable to load up the BOB config file " + configLocation + ", Using defaults.");
    179                                 warn(fnfe.toString());
    180                                 save = true;
    181                         } catch(IOException ioe) {
    182                                 warn("IOException on BOB config file " + configLocation + ", using defaults.");
    183                                 warn(ioe.toString());
    184                         }
     244                                info("BOB is now running.");
     245                                listener = new ServerSocket(Integer.parseInt(props.getProperty(PROP_BOB_PORT)), 10, InetAddress.getByName(props.getProperty(PROP_BOB_HOST)));
     246                                Socket server = null;
     247                                listener.setSoTimeout(500); // .5 sec
     248                                while (spin.get()) {
     249                                        //DoCMDS connection;
     250
     251                                        try {
     252                                                server = listener.accept();
     253                                                g = true;
     254                                        } catch (ConnectException ce) {
     255                                                g = false;
     256                                        } catch (SocketTimeoutException ste) {
     257                                                g = false;
     258                                        }
     259
     260                                        if (g) {
     261                                                DoCMDS conn_c = new DoCMDS(spin, lock, server, props, database, _log);
     262                                                Thread t = new Thread(conn_c);
     263                                                t.setName("BOB.DoCMDS " + i);
     264                                                t.start();
     265                                                i++;
     266                                        }
     267                                }
     268                        } catch (IOException ioe) {
     269                                error("IOException on socket listen: " + ioe);
     270                                ioe.printStackTrace();
     271                        }
     272                } finally {
     273                        info("BOB is now shutting down...");
     274                        // Clean up everything.
     275                        try {
     276                                listener.close();
     277                        } catch (Exception ex) {
     278                                // nop
     279                        }
     280                        // Find all our "BOB.DoCMDS" threads, wait for them to be finished.
     281                        // We could order them to stop, but that could cause nasty issues in the locks.
     282                        visitAllThreads();
     283                        database.getReadLock();
     284                        int all = database.getcount();
     285                        database.releaseReadLock();
     286                        NamedDB nickinfo;
     287                        for (i = 0; i < all; i++) {
     288                                database.getReadLock();
     289                                nickinfo = (NamedDB) database.getnext(i);
     290                                nickinfo.getReadLock();
     291                                if (nickinfo.get(P_RUNNING).equals(Boolean.TRUE) && nickinfo.get(P_STOPPING).equals(Boolean.FALSE) && nickinfo.get(P_STARTING).equals(Boolean.FALSE)) {
     292                                        nickinfo.releaseReadLock();
     293                                        database.releaseReadLock();
     294                                        database.getWriteLock();
     295                                        nickinfo.getWriteLock();
     296                                        nickinfo.add(P_STOPPING, new Boolean(true));
     297                                        nickinfo.releaseWriteLock();
     298                                        database.releaseWriteLock();
     299                                } else {
     300                                        nickinfo.releaseReadLock();
     301                                        database.releaseReadLock();
     302                                }
     303                        }
     304                        info("BOB is now stopped.");
     305
    185306                }
    186                 // Global router and client API configurations that are missing are set to defaults here.
    187                 if(!props.containsKey(I2PClient.PROP_TCP_HOST)) {
    188                         props.setProperty(I2PClient.PROP_TCP_HOST, "localhost");
     307        }
     308
     309        /**
     310         *      Find the root thread group,
     311         *      then find all theads with certain names and wait for them all to be dead.
     312         *
     313         */
     314        private static void visitAllThreads() {
     315                ThreadGroup root = Thread.currentThread().getThreadGroup().getParent();
     316                while (root.getParent() != null) {
     317                        root = root.getParent();
    189318                }
    190                 if(!props.containsKey(I2PClient.PROP_TCP_PORT)) {
    191                         props.setProperty(I2PClient.PROP_TCP_PORT, "7654");
     319
     320                // Visit each thread group
     321                waitjoin(root, 0, root.getName());
     322        }
     323
     324        private static void waitjoin(ThreadGroup group, int level, String tn) {
     325                // Get threads in `group'
     326                int numThreads = group.activeCount();
     327                Thread[] threads = new Thread[numThreads * 2];
     328                numThreads = group.enumerate(threads, false);
     329                // Enumerate each thread in `group' and wait for it to stop if it is one of ours.
     330                for (int i = 0; i < numThreads; i++) {
     331                        // Get thread
     332                        Thread thread = threads[i];
     333                        if (thread.getName().startsWith("BOB.DoCMDS ")) {
     334                                try {
     335                                        if (thread.isAlive()) {
     336                                                try {
     337                                                        thread.join();
     338                                                } catch (InterruptedException ex) {
     339                                                }
     340                                        }
     341                                } catch (SecurityException se) {
     342                                        //nop
     343                                }
     344                        }
    192345                }
    193                 if(!props.containsKey(I2PClient.PROP_RELIABILITY)) {
    194                         props.setProperty(I2PClient.PROP_RELIABILITY, I2PClient.PROP_RELIABILITY_BEST_EFFORT);
     346
     347                // Get thread subgroups of `group'
     348                int numGroups = group.activeGroupCount();
     349                ThreadGroup[] groups = new ThreadGroup[numGroups * 2];
     350                numGroups = group.enumerate(groups, false);
     351
     352                // Recursively visit each subgroup
     353                for (int i = 0; i < numGroups; i++) {
     354                        waitjoin(groups[i], level + 1, groups[i].getName());
    195355                }
    196                 if(!props.containsKey(PROP_BOB_PORT)) {
    197                         props.setProperty(PROP_BOB_PORT, "2827"); // 0xB0B
    198                 }
    199                 if(!props.containsKey("inbound.length")) {
    200                         props.setProperty("inbound.length", "1");
    201                 }
    202                 if(!props.containsKey("outbound.length")) {
    203                         props.setProperty("outbound.length", "1");
    204                 }
    205                 if(!props.containsKey("inbound.lengthVariance")) {
    206                         props.setProperty("inbound.lengthVariance", "0");
    207                 }
    208                 if(!props.containsKey("outbound.lengthVariance")) {
    209                         props.setProperty("outbound.lengthVariance", "0");
    210                 }
    211                 if(!props.containsKey(PROP_BOB_HOST)) {
    212                         props.setProperty(PROP_BOB_HOST, "localhost");
    213                 }
    214                 if(save) {
    215                         try {
    216                                 warn("Writing new defaults file " + configLocation);
    217                                 FileOutputStream fo = new FileOutputStream(configLocation);
    218                                 props.store(fo, configLocation);
    219                                 fo.close();
    220                         } catch(IOException ioe) {
    221                                 error("IOException on BOB config file " + configLocation + ", " + ioe);
    222                         }
    223                 }
    224 
    225                 i = 0;
    226                 try {
    227                         info("BOB is now running.");
    228                         ServerSocket listener = new ServerSocket(Integer.parseInt(props.getProperty(PROP_BOB_PORT)), 10, InetAddress.getByName(props.getProperty(PROP_BOB_HOST)));
    229                         Socket server;
    230 
    231                         while((i++ < maxConnections) || (maxConnections == 0)) {
    232                                 //DoCMDS connection;
    233 
    234                                 server = listener.accept();
    235                                 DoCMDS conn_c = new DoCMDS(server, props, database, _log);
    236                                 Thread t = new Thread(conn_c);
    237                                 t.start();
    238                         }
    239                 } catch(IOException ioe) {
    240                         error("IOException on socket listen: " + ioe);
    241                         ioe.printStackTrace();
    242                 }
    243356        }
    244357}
  • apps/BOB/src/net/i2p/BOB/DoCMDS.java

    r56b768f rf511c9b  
    3232import java.util.Properties;
    3333import java.util.StringTokenizer;
     34import java.util.concurrent.atomic.AtomicBoolean;
    3435import net.i2p.I2PException;
    3536import net.i2p.client.I2PClientFactory;
    3637import net.i2p.data.Destination;
    3738import net.i2p.util.Log;
     39import net.i2p.util.SimpleStore;
    3840
    3941/**
     
    5860        private NamedDB nickinfo;
    5961        private Log _log;
     62        private AtomicBoolean LIVE;
     63        private AtomicBoolean lock;
    6064        /* database strings */
    6165        private static final String P_DEST = "DESTINATION";
     
    9599        private static final String C_stop = "stop";
    96100        private static final String C_verify = "verify";
     101        private static final String C_zap = "zap";
    97102
    98103        /* all the coomands available, plus description */
     
    120125                {C_stop, C_stop + " * Stops the current nicknamed tunnel."},
    121126                {C_verify, C_verify + " BASE64_key * Verifies BASE64 destination."},
     127                {C_zap, C_zap + " * Shuts down BOB."},
    122128                {"", "COMMANDS: " + // this is ugly, but...
    123129                        C_help + " " +
     
    142148                        C_status + " " +
    143149                        C_stop + " " +
    144                         C_verify
     150                        C_verify + " " +
     151                        C_zap
    145152                },
    146153                {" ", " "} // end of list
     
    148155
    149156        /**
    150          *
     157         * @parm LIVE
    151158         * @param server
    152159         * @param props
     
    154161         * @param _log
    155162         */
    156         DoCMDS(Socket server, Properties props, NamedDB database, Log _log) {
     163        DoCMDS(AtomicBoolean LIVE, AtomicBoolean lock, Socket server, Properties props, NamedDB database, Log _log) {
     164                this.lock = lock;
     165                this.LIVE = LIVE;
    157166                this.server = server;
    158167                this.props = new Properties();
     
    510519                                                                // End the command session
    511520                                                                break quit;
     521                                                        } else if (Command.equals(C_zap)) {
     522                                                                // Kill BOB!! (let's hope this works!)
     523                                                                LIVE.set(false);
     524                                                                // End the command session
     525                                                                break quit;
    512526                                                        } else if (Command.equals(C_newkeys)) {
    513527                                                                if (ns) {
     
    12611275                                                                                        MUXlisten tunnel;
    12621276                                                                                        try {
    1263                                                                                                 tunnel = new MUXlisten(database, nickinfo, _log);
     1277                                                                                                while(!lock.compareAndSet(false, true)) {
     1278                                                                                                        // wait
     1279                                                                                                }
     1280                                                                                                tunnel = new MUXlisten(lock, database, nickinfo, _log);
    12641281                                                                                                Thread t = new Thread(tunnel);
    12651282                                                                                                t.start();
     
    12711288                                                                                                out.println("OK tunnel starting");
    12721289                                                                                        } catch (I2PException e) {
     1290                                                                                                lock.set(false);
    12731291                                                                                                out.println("ERROR starting tunnel: " + e);
    12741292                                                                                        } catch (IOException e) {
     1293                                                                                                lock.set(false);
    12751294                                                                                                out.println("ERROR starting tunnel: " + e);
    12761295                                                                                        }
  • apps/BOB/src/net/i2p/BOB/I2Plistener.java

    r56b768f rf511c9b  
    2626import java.net.ConnectException;
    2727import java.net.SocketTimeoutException;
    28 import java.util.logging.Level;
    29 import java.util.logging.Logger;
    3028import net.i2p.I2PException;
    3129import net.i2p.client.streaming.I2PServerSocket;
  • apps/BOB/src/net/i2p/BOB/MUXlisten.java

    r56b768f rf511c9b  
    2929import java.net.ServerSocket;
    3030import java.util.Properties;
     31import java.util.concurrent.atomic.AtomicBoolean;
    3132import net.i2p.I2PException;
    3233import net.i2p.client.streaming.I2PServerSocket;
     
    5354        boolean go_out;
    5455        boolean come_in;
     56        private AtomicBoolean lock;
    5557
    5658        /**
     
    6365         * @throws java.io.IOException
    6466         */
    65         MUXlisten(NamedDB database, NamedDB info, Log _log) throws I2PException, IOException, RuntimeException {
     67        MUXlisten(AtomicBoolean lock, NamedDB database, NamedDB info, Log _log) throws I2PException, IOException, RuntimeException {
    6668                int port = 0;
    6769                InetAddress host = null;
     70                this.lock = lock;
    6871                this.tg = null;
    6972                this.database = database;
     
    152155                        }
    153156//              socketManager.addDisconnectListener(new DisconnectListener());
    154 
     157                        lock.set(false);
    155158                        quit:
    156159                        {
     
    217220                                                        }
    218221                                                }
    219 
     222                                                /* cleared in the finally...
    220223                                                try {
    221224                                                        wlock();
     
    234237                                                        break die;
    235238                                                }
     239                                                */
    236240                                        } // die
    237241
     
    242246                        } // quit
    243247                } finally {
    244                         // Start cleanup. Allow threads above this one to catch the stop signal.
    245                         try {
    246                                 Thread.sleep(250);
    247                         } catch (InterruptedException ex) {
    248                         }
     248                        // Start cleanup.
     249                        while (!lock.compareAndSet(false, true)) {
     250                                // wait
     251                        }
     252
    249253                        // zero out everything.
    250254                        try {
     
    262266                        }
    263267
    264 
    265268                        if (SS != null) {
    266269                                try {
     
    280283                        } catch (Exception e) {
    281284                                // nop
    282                                 }
     285                        }
     286                        // Some grace time.
     287                        try {
     288                                Thread.sleep(250);
     289                        } catch (InterruptedException ex) {
     290                        }
     291
     292                        lock.set(false); // Should we force waiting for all threads??
    283293                        // Wait around till all threads are collected.
    284294                        if (tg != null) {
     
    363373        }
    364374
     375        /*
    365376        private static void nuke(ThreadGroup group, int level) {
    366                 // Get threads in `group'
    367                 int numThreads = group.activeCount();
    368                 Thread[] threads = new Thread[numThreads * 2];
    369                 numThreads = group.enumerate(threads, false);
    370                 // Enumerate each thread in `group' and stop it.
    371                 for (int i = 0; i < numThreads; i++) {
    372                         // Get thread
    373                         Thread thread = threads[i];
    374                         try {
    375                                 if (thread.isAlive()) {
    376                                         thread.stop();
    377                                 }
    378                         } catch (SecurityException se) {
    379                                 //nop
    380                         }
    381                 }
    382 
    383                 // Get thread subgroups of `group'
    384                 int numGroups = group.activeGroupCount();
    385                 ThreadGroup[] groups = new ThreadGroup[numGroups * 2];
    386                 numGroups = group.enumerate(groups, false);
    387 
    388                 // Recursively visit each subgroup
    389                 for (int i = 0; i < numGroups; i++) {
    390                         nuke(groups[i], level + 1);
    391                 }
    392                 try {
    393                         group.destroy();
    394                 } catch (IllegalThreadStateException IE) {
    395                         //nop
    396                 } catch (SecurityException se) {
    397                         //nop
    398                 }
    399         }
     377        // Get threads in `group'
     378        int numThreads = group.activeCount();
     379        Thread[] threads = new Thread[numThreads * 2];
     380        numThreads = group.enumerate(threads, false);
     381        // Enumerate each thread in `group' and stop it.
     382        for (int i = 0; i < numThreads; i++) {
     383        // Get thread
     384        Thread thread = threads[i];
     385        try {
     386        if (thread.isAlive()) {
     387        thread.stop();
     388        }
     389        } catch (SecurityException se) {
     390        //nop
     391        }
     392        }
     393
     394        // Get thread subgroups of `group'
     395        int numGroups = group.activeGroupCount();
     396        ThreadGroup[] groups = new ThreadGroup[numGroups * 2];
     397        numGroups = group.enumerate(groups, false);
     398
     399        // Recursively visit each subgroup
     400        for (int i = 0; i < numGroups; i++) {
     401        nuke(groups[i], level + 1);
     402        }
     403        try {
     404        group.destroy();
     405        } catch (IllegalThreadStateException IE) {
     406        //nop
     407        } catch (SecurityException se) {
     408        //nop
     409        }
     410        }
     411         */
    400412}
  • apps/BOB/src/net/i2p/BOB/TCPio.java

    r56b768f rf511c9b  
    5050                this.Ain = Ain;
    5151                this.Aout = Aout;
    52                 // this.info = info;
    53                 // this.database = database;
     52        // this.info = info;
     53        // this.database = database;
    5454        }
    5555
     
    8787                boolean spin = true;
    8888                try {
    89                         while(spin) {
    90                                 b = Ain.read(a, 0, 1);
    91                                 if(b > 0) {
    92                                         Aout.write(a, 0, b);
    93                                 } else if(b == 0) {
    94                                         Thread.yield(); // this should act like a mini sleep.
    95                                         if(Ain.available() == 0) {
     89                        try {
     90                                while (spin) {
     91                                        b = Ain.read(a, 0, 1);
     92                                        if (b > 0) {
     93                                                Aout.write(a, 0, b);
     94                                        } else if (b == 0) {
     95                                                Thread.yield(); // this should act like a mini sleep.
     96                                                if (Ain.available() == 0) {
    9697                                                        Thread.sleep(10);
     98                                                }
     99                                        } else {
     100                                                /* according to the specs:
     101                                                 *
     102                                                 * The total number of bytes read into the buffer,
     103                                                 * or -1 if there is no more data because the end of
     104                                                 * the stream has been reached.
     105                                                 *
     106                                                 */
     107                                                // System.out.println("TCPio: End Of Stream");
     108                                                // Ain.close();
     109                                                // Aout.close();
     110                                                //return;
     111                                                break;
    97112                                        }
    98                                 } else {
    99                                         /* according to the specs:
    100                                          *
    101                                          * The total number of bytes read into the buffer,
    102                                          * or -1 if there is no more data because the end of
    103                                          * the stream has been reached.
    104                                          *
    105                                          */
    106                                         // System.out.println("TCPio: End Of Stream");
    107                                         Ain.close();
    108                                         Aout.close();
    109                                         return;
    110113                                }
     114                        } catch (Exception e) {
    111115                        }
    112                 } catch(Exception e) {
     116                // System.out.println("TCPio: Leaving.");
     117                } finally {
    113118                        // Eject!!! Eject!!!
    114119                        //System.out.println("TCPio: Caught an exception " + e);
     
    123128                        return;
    124129                }
    125                 // System.out.println("TCPio: Leaving.");
    126130        }
    127131}
  • apps/BOB/src/net/i2p/BOB/TCPlistener.java

    r56b768f rf511c9b  
    3030// import net.i2p.client.I2PSession;
    3131// import net.i2p.client.I2PSessionException;
    32 import java.util.logging.Level;
    33 import java.util.logging.Logger;
    3432import net.i2p.client.streaming.I2PServerSocket;
    3533import net.i2p.client.streaming.I2PSocketManager;
     
    143141                                                }
    144142                                        }
    145                                         listener.close();
    146143                                } catch (IOException ioe) {
    147                                         try {
    148                                                 listener.close();
    149                                         } catch (IOException e) {
    150                                         }
    151144                                }
    152145                        }
  • apps/desktopgui/build.xml

    r56b768f rf511c9b  
    7777    <property name="build_lib" location="lib"/>
    7878    <property name="build_i2pref" location="../../build"/>
     79    <property name="build_routerconsole" location="../routerconsole/java/build/"/>
    7980       
    8081    <path id="build_classpath">
    8182        <fileset dir="${build_lib}" includes="**/*.jar"/>
    8283        <fileset dir="${build_i2pref}" includes="**/*.jar"/>
     84        <fileset dir="${build_routerconsole}" includes="**/*.jar"/>
    8385    </path>
    8486    <target name="build_init">
  • apps/desktopgui/nbproject/project.properties

    r56b768f rf511c9b  
    2424file.reference.i2p.jar=../../core/java/build/i2p.jar
    2525file.reference.router.jar=../../router/java/build/router.jar
     26file.reference.routerconsole.jar=../routerconsole/java/build/routerconsole.jar
    2627file.reference.swing-worker.jar=lib/swing-worker.jar
    2728includes=**
     
    3132    ${file.reference.appframework.jar}:\
    3233    ${file.reference.swing-worker.jar}:\
    33     ${file.reference.i2p.jar}
     34    ${file.reference.i2p.jar}:\
     35    ${file.reference.routerconsole.jar}
    3436# Space-separated list of extra javac options
    3537javac.compilerargs=
  • apps/desktopgui/src/net/i2p/desktopgui/desktopgui/GUIVersion.java

    r56b768f rf511c9b  
    1111 */
    1212public class GUIVersion {
    13     public static final String VERSION = "0.0.1.2";
     13    public static final String VERSION = "0.0.1.3";
    1414}
  • apps/desktopgui/src/net/i2p/desktopgui/gui/GeneralConfiguration.form

    r56b768f rf511c9b  
    33<Form version="1.5" maxVersion="1.6" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
    44  <NonVisualComponents>
    5     <Component class="javax.swing.ButtonGroup" name="buttonGroup1">
     5    <Component class="javax.swing.ButtonGroup" name="updateButtonGroup">
    66    </Component>
    77  </NonVisualComponents>
     
    8282            <Property name="name" type="java.lang.String" value="cancel" noResource="true"/>
    8383          </Properties>
     84          <Events>
     85            <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="cancelMouseClicked"/>
     86          </Events>
    8487        </Component>
    8588        <Component class="javax.swing.JToggleButton" name="ok">
     
    8891            <Property name="name" type="java.lang.String" value="ok" noResource="true"/>
    8992          </Properties>
     93          <Events>
     94            <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="okMouseClicked"/>
     95          </Events>
    9096        </Component>
    9197      </SubComponents>
     
    142148              </Properties>
    143149              <Events>
    144                 <EventHandler event="keyTyped" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="speedKeyTyped"/>
     150                <EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="speedKeyReleased"/>
    145151              </Events>
    146152              <Constraints>
     
    156162              </Properties>
    157163              <Events>
    158                 <EventHandler event="keyTyped" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="speedKeyTyped"/>
     164                <EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="speedKeyReleased"/>
    159165              </Events>
    160166              <Constraints>
     
    202208              </Constraints>
    203209            </Component>
    204             <Component class="javax.swing.JLabel" name="jLabel3">
    205               <Properties>
    206                 <Property name="text" type="java.lang.String" resourceKey="jLabel3.text"/>
    207                 <Property name="name" type="java.lang.String" value="jLabel3" noResource="true"/>
     210            <Component class="javax.swing.JLabel" name="uploadUsageLabel">
     211              <Properties>
     212                <Property name="text" type="java.lang.String" resourceKey="uploadUsageLabel.text"/>
     213                <Property name="name" type="java.lang.String" value="uploadUsageLabel" noResource="true"/>
    208214              </Properties>
    209215              <Constraints>
     
    213219              </Constraints>
    214220            </Component>
    215             <Component class="javax.swing.JLabel" name="jLabel4">
    216               <Properties>
    217                 <Property name="text" type="java.lang.String" resourceKey="jLabel4.text"/>
    218                 <Property name="name" type="java.lang.String" value="jLabel4" noResource="true"/>
     221            <Component class="javax.swing.JLabel" name="downloadUsageLabel">
     222              <Properties>
     223                <Property name="text" type="java.lang.String" resourceKey="downloadUsageLabel.text"/>
     224                <Property name="name" type="java.lang.String" value="downloadUsageLabel" noResource="true"/>
    219225              </Properties>
    220226              <Constraints>
     
    230236              </Properties>
    231237              <Events>
    232                 <EventHandler event="keyTyped" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="uploadgbKeyTyped"/>
     238                <EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="monthKeyReleased"/>
    233239              </Events>
    234240              <Constraints>
     
    244250              </Properties>
    245251              <Events>
    246                 <EventHandler event="keyTyped" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="downloadgbKeyTyped"/>
     252                <EventHandler event="keyReleased" listener="java.awt.event.KeyListener" parameters="java.awt.event.KeyEvent" handler="monthKeyReleased"/>
    247253              </Events>
    248254              <Constraints>
     
    252258              </Constraints>
    253259            </Component>
    254             <Component class="javax.swing.JLabel" name="jLabel5">
    255               <Properties>
    256                 <Property name="text" type="java.lang.String" resourceKey="jLabel5.text"/>
    257                 <Property name="name" type="java.lang.String" value="jLabel5" noResource="true"/>
     260            <Component class="javax.swing.JLabel" name="gbUploadLabel">
     261              <Properties>
     262                <Property name="text" type="java.lang.String" resourceKey="gbUploadLabel.text"/>
     263                <Property name="name" type="java.lang.String" value="gbUploadLabel" noResource="true"/>
    258264              </Properties>
    259265              <Constraints>
     
    263269              </Constraints>
    264270            </Component>
    265             <Component class="javax.swing.JLabel" name="jLabel6">
    266               <Properties>
    267                 <Property name="text" type="java.lang.String" resourceKey="jLabel6.text"/>
    268                 <Property name="name" type="java.lang.String" value="jLabel6" noResource="true"/>
     271            <Component class="javax.swing.JLabel" name="gbDownloadLabel">
     272              <Properties>
     273                <Property name="text" type="java.lang.String" resourceKey="gbDownloadLabel.text"/>
     274                <Property name="name" type="java.lang.String" value="gbDownloadLabel" noResource="true"/>
    269275              </Properties>
    270276              <Constraints>
     
    274280              </Constraints>
    275281            </Component>
    276             <Component class="javax.swing.JLabel" name="jLabel7">
    277               <Properties>
    278                 <Property name="text" type="java.lang.String" resourceKey="jLabel7.text"/>
    279                 <Property name="name" type="java.lang.String" value="jLabel7" noResource="true"/>
     282            <Component class="javax.swing.JLabel" name="uploadDownloadExplanation">
     283              <Properties>
     284                <Property name="text" type="java.lang.String" resourceKey="uploadDownloadExplanation.text"/>
     285                <Property name="name" type="java.lang.String" value="uploadDownloadExplanation" noResource="true"/>
    280286              </Properties>
    281287              <Constraints>
     
    366372              <Properties>
    367373                <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
    368                   <ComponentRef name="buttonGroup1"/>
     374                  <ComponentRef name="updateButtonGroup"/>
    369375                </Property>
    370376                <Property name="text" type="java.lang.String" resourceKey="updateInform.text"/>
     
    375381              <Properties>
    376382                <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
    377                   <ComponentRef name="buttonGroup1"/>
     383                  <ComponentRef name="updateButtonGroup"/>
    378384                </Property>
    379385                <Property name="text" type="java.lang.String" resourceKey="updateDownload.text"/>
     
    384390              <Properties>
    385391                <Property name="buttonGroup" type="javax.swing.ButtonGroup" editor="org.netbeans.modules.form.RADComponent$ButtonGroupPropertyEditor">
    386                   <ComponentRef name="buttonGroup1"/>
     392                  <ComponentRef name="updateButtonGroup"/>
    387393                </Property>
    388394                <Property name="text" type="java.lang.String" resourceKey="updateDownloadRestart.text"/>
     
    395401                <Property name="name" type="java.lang.String" value="checkUpdates" noResource="true"/>
    396402              </Properties>
     403              <Events>
     404                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="checkUpdatesActionPerformed"/>
     405              </Events>
    397406            </Component>
    398407            <Component class="javax.swing.JToggleButton" name="updateNow">
     
    401410                <Property name="name" type="java.lang.String" value="updateNow" noResource="true"/>
    402411              </Properties>
     412              <Events>
     413                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="updateNowActionPerformed"/>
     414              </Events>
    403415            </Component>
    404416            <Component class="javax.swing.JToggleButton" name="advancedUpdateConfig">
     
    407419                <Property name="name" type="java.lang.String" value="advancedUpdateConfig" noResource="true"/>
    408420              </Properties>
     421              <Events>
     422                <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="advancedUpdateConfigActionPerformed"/>
     423              </Events>
    409424            </Component>
    410425          </SubComponents>
  • apps/desktopgui/src/net/i2p/desktopgui/gui/GeneralConfiguration.java

    r56b768f rf511c9b  
    77package net.i2p.desktopgui.gui;
    88
     9import java.awt.Desktop;
     10import java.io.IOException;
     11import java.net.URI;
     12import java.net.URISyntaxException;
     13import java.util.logging.Level;
     14import java.util.logging.Logger;
    915import net.i2p.desktopgui.router.configuration.SpeedHelper;
     16import javax.swing.JComboBox;
     17import javax.swing.ButtonModel;
     18import javax.swing.JTextField;
     19import net.i2p.desktopgui.router.RouterHelper;
     20import net.i2p.desktopgui.router.configuration.SpeedHandler;
     21import net.i2p.desktopgui.router.configuration.UpdateHelper;
     22import net.i2p.router.web.NewsFetcher;
     23import net.i2p.desktopgui.router.configuration.UpdateHandler;
     24import java.util.Date;
     25import javax.swing.SwingWorker;
    1026
    1127/**
     
    2036        extraInitComponents();
    2137        this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
     38        this.setLocationRelativeTo(null);
     39        this.requestFocus();
    2240        this.setVisible(true);
    2341    }
    2442   
    2543    private void extraInitComponents() {
    26         downloadspeed.setText(SpeedHelper.getInboundBandwidth());
     44        initSpeedTab();
     45        initUpdateTab();
     46    }
     47
     48    private void initSpeedTab() {
     49        try {
     50            String inbound = SpeedHelper.getInboundBandwidth();
     51            String outbound = SpeedHelper.getOutboundBandwidth();
     52
     53            initSpeeds("" + Integer.parseInt(inbound)*8, "" + Integer.parseInt(outbound)*8);
     54            initUsage("" + Integer.parseInt(inbound), "" + Integer.parseInt(outbound));
     55        }
     56        catch(Exception e) {
     57            e.printStackTrace();
     58            System.out.println("Exception noticed, probably running desktopgui in a debugger instead of along with I2P!?");
     59            initSpeeds("100", "100");
     60            initUsage("12", "12");
     61        }
     62    }
     63
     64    private void initUpdateTab() {
     65        //Set update policy
     66        String updatePolicy = UpdateHelper.getUpdatePolicy();
     67        if(updatePolicy.equals(UpdateHelper.NOTIFY_UPDATE_POLICY)) {
     68            updateButtonGroup.setSelected(updateInform.getModel(), true);
     69        }
     70        else if(updatePolicy.equals(UpdateHelper.DOWNLOAD_UPDATE_POLICY)) {
     71            updateButtonGroup.setSelected(updateDownload.getModel(), true);
     72        }
     73        else if(updatePolicy.equals(UpdateHelper.INSTALL_UPDATE_POLICY)) {
     74            updateButtonGroup.setSelected(updateDownloadRestart.getModel(), true);
     75        }
     76        else {
     77            System.out.println("desktopgui: no updates for you!");
     78        }
     79
     80        //Check if an update is available
     81        //TODO: move this method out of the routerconsole so desktopgui doesn't depend on routerconsole!!!
     82        if(NewsFetcher.getInstance(RouterHelper.getContext()).updateAvailable()) {
     83            updateNow.setVisible(true);
     84        }
     85        else {
     86            updateNow.setVisible(false);
     87        }
    2788    }
    2889
     
    3697    private void initComponents() {
    3798
    38         buttonGroup1 = new javax.swing.ButtonGroup();
     99        updateButtonGroup = new javax.swing.ButtonGroup();
    39100        applyPanel = new javax.swing.JPanel();
    40101        cancel = new javax.swing.JToggleButton();
     
    48109        uploadkbps = new javax.swing.JComboBox();
    49110        downloadkbps = new javax.swing.JComboBox();
    50         jLabel3 = new javax.swing.JLabel();
    51         jLabel4 = new javax.swing.JLabel();
     111        uploadUsageLabel = new javax.swing.JLabel();
     112        downloadUsageLabel = new javax.swing.JLabel();
    52113        uploadgb = new javax.swing.JTextField();
    53114        downloadgb = new javax.swing.JTextField();
    54         jLabel5 = new javax.swing.JLabel();
    55         jLabel6 = new javax.swing.JLabel();
    56         jLabel7 = new javax.swing.JLabel();
     115        gbUploadLabel = new javax.swing.JLabel();
     116        gbDownloadLabel = new javax.swing.JLabel();
     117        uploadDownloadExplanation = new javax.swing.JLabel();
    57118        updatesPanel = new javax.swing.JPanel();
    58119        updateMethod = new javax.swing.JLabel();
     
    81142        cancel.setText(resourceMap.getString("cancel.text")); // NOI18N
    82143        cancel.setName("cancel"); // NOI18N
     144        cancel.addMouseListener(new java.awt.event.MouseAdapter() {
     145            public void mouseClicked(java.awt.event.MouseEvent evt) {
     146                cancelMouseClicked(evt);
     147            }
     148        });
    83149
    84150        ok.setText(resourceMap.getString("ok.text")); // NOI18N
    85151        ok.setName("ok"); // NOI18N
     152        ok.addMouseListener(new java.awt.event.MouseAdapter() {
     153            public void mouseClicked(java.awt.event.MouseEvent evt) {
     154                okMouseClicked(evt);
     155            }
     156        });
    86157
    87158        javax.swing.GroupLayout applyPanelLayout = new javax.swing.GroupLayout(applyPanel);
     
    123194        uploadspeed.setName("uploadspeed"); // NOI18N
    124195        uploadspeed.addKeyListener(new java.awt.event.KeyAdapter() {
    125             public void keyTyped(java.awt.event.KeyEvent evt) {
    126                 speedKeyTyped(evt);
     196            public void keyReleased(java.awt.event.KeyEvent evt) {
     197                speedKeyReleased(evt);
    127198            }
    128199        });
     
    133204        downloadspeed.setName("downloadspeed"); // NOI18N
    134205        downloadspeed.addKeyListener(new java.awt.event.KeyAdapter() {
    135             public void keyTyped(java.awt.event.KeyEvent evt) {
    136                 speedKeyTyped(evt);
     206            public void keyReleased(java.awt.event.KeyEvent evt) {
     207                speedKeyReleased(evt);
    137208            }
    138209        });
     
    160231        downloadkbps.setBounds(240, 60, 68, 27);
    161232
    162         jLabel3.setText(resourceMap.getString("jLabel3.text")); // NOI18N
    163         jLabel3.setName("jLabel3"); // NOI18N
    164         speedPanel.add(jLabel3);
    165         jLabel3.setBounds(330, 20, 97, 30);
    166 
    167         jLabel4.setText(resourceMap.getString("jLabel4.text")); // NOI18N
    168         jLabel4.setName("jLabel4"); // NOI18N
    169         speedPanel.add(jLabel4);
    170         jLabel4.setBounds(330, 60, 97, 30);
     233        uploadUsageLabel.setText(resourceMap.getString("uploadUsageLabel.text")); // NOI18N
     234        uploadUsageLabel.setName("uploadUsageLabel"); // NOI18N
     235        speedPanel.add(uploadUsageLabel);
     236        uploadUsageLabel.setBounds(330, 20, 97, 30);
     237
     238        downloadUsageLabel.setText(resourceMap.getString("downloadUsageLabel.text")); // NOI18N
     239        downloadUsageLabel.setName("downloadUsageLabel"); // NOI18N
     240        speedPanel.add(downloadUsageLabel);
     241        downloadUsageLabel.setBounds(330, 60, 97, 30);
    171242
    172243        uploadgb.setText(resourceMap.getString("uploadgb.text")); // NOI18N
    173244        uploadgb.setName("uploadgb"); // NOI18N
    174245        uploadgb.addKeyListener(new java.awt.event.KeyAdapter() {
    175             public void keyTyped(java.awt.event.KeyEvent evt) {
    176                 uploadgbKeyTyped(evt);
     246            public void keyReleased(java.awt.event.KeyEvent evt) {
     247                monthKeyReleased(evt);
    177248            }
    178249        });
     
    183254        downloadgb.setName("downloadgb"); // NOI18N
    184255        downloadgb.addKeyListener(new java.awt.event.KeyAdapter() {
    185             public void keyTyped(java.awt.event.KeyEvent evt) {
    186                 downloadgbKeyTyped(evt);
     256            public void keyReleased(java.awt.event.KeyEvent evt) {
     257                monthKeyReleased(evt);
    187258            }
    188259        });
     
    190261        downloadgb.setBounds(440, 60, 60, 27);
    191262
    192         jLabel5.setText(resourceMap.getString("jLabel5.text")); // NOI18N
    193         jLabel5.setName("jLabel5"); // NOI18N
    194         speedPanel.add(jLabel5);
    195         jLabel5.setBounds(510, 20, 19, 30);
    196 
    197         jLabel6.setText(resourceMap.getString("jLabel6.text")); // NOI18N
    198         jLabel6.setName("jLabel6"); // NOI18N
    199         speedPanel.add(jLabel6);
    200         jLabel6.setBounds(510, 60, 19, 30);
    201 
    202         jLabel7.setText(resourceMap.getString("jLabel7.text")); // NOI18N
    203         jLabel7.setName("jLabel7"); // NOI18N
    204         speedPanel.add(jLabel7);
    205         jLabel7.setBounds(20, 100, 520, 70);
     263        gbUploadLabel.setText(resourceMap.getString("gbUploadLabel.text")); // NOI18N
     264        gbUploadLabel.setName("gbUploadLabel"); // NOI18N
     265        speedPanel.add(gbUploadLabel);
     266        gbUploadLabel.setBounds(510, 20, 19, 30);
     267
     268        gbDownloadLabel.setText(resourceMap.getString("gbDownloadLabel.text")); // NOI18N
     269        gbDownloadLabel.setName("gbDownloadLabel"); // NOI18N
     270        speedPanel.add(gbDownloadLabel);
     271        gbDownloadLabel.setBounds(510, 60, 19, 30);
     272
     273        uploadDownloadExplanation.setText(resourceMap.getString("uploadDownloadExplanation.text")); // NOI18N
     274        uploadDownloadExplanation.setName("uploadDownloadExplanation"); // NOI18N
     275        speedPanel.add(uploadDownloadExplanation);
     276        uploadDownloadExplanation.setBounds(20, 100, 520, 70);
    206277
    207278        settingsPanel.addTab(resourceMap.getString("speedPanel.TabConstraints.tabTitle"), speedPanel); // NOI18N
     
    212283        updateMethod.setName("updateMethod"); // NOI18N
    213284
    214         buttonGroup1.add(updateInform);
     285        updateButtonGroup.add(updateInform);
    215286        updateInform.setText(resourceMap.getString("updateInform.text")); // NOI18N
    216287        updateInform.setName("updateInform"); // NOI18N
    217288
    218         buttonGroup1.add(updateDownload);
     289        updateButtonGroup.add(updateDownload);
    219290        updateDownload.setText(resourceMap.getString("updateDownload.text")); // NOI18N
    220291        updateDownload.setName("updateDownload"); // NOI18N
    221292
    222         buttonGroup1.add(updateDownloadRestart);
     293        updateButtonGroup.add(updateDownloadRestart);
    223294        updateDownloadRestart.setText(resourceMap.getString("updateDownloadRestart.text")); // NOI18N
    224295        updateDownloadRestart.setName("updateDownloadRestart"); // NOI18N
     
    226297        checkUpdates.setText(resourceMap.getString("checkUpdates.text")); // NOI18N
    227298        checkUpdates.setName("checkUpdates"); // NOI18N
     299        checkUpdates.addActionListener(new java.awt.event.ActionListener() {
     300            public void actionPerformed(java.awt.event.ActionEvent evt) {
     301                checkUpdatesActionPerformed(evt);
     302            }
     303        });
    228304
    229305        updateNow.setText(resourceMap.getString("updateNow.text")); // NOI18N
    230306        updateNow.setName("updateNow"); // NOI18N
     307        updateNow.addActionListener(new java.awt.event.ActionListener() {
     308            public void actionPerformed(java.awt.event.ActionEvent evt) {
     309                updateNowActionPerformed(evt);
     310            }
     311        });
    231312
    232313        advancedUpdateConfig.setText(resourceMap.getString("advancedUpdateConfig.text")); // NOI18N
    233314        advancedUpdateConfig.setName("advancedUpdateConfig"); // NOI18N
     315        advancedUpdateConfig.addActionListener(new java.awt.event.ActionListener() {
     316            public void actionPerformed(java.awt.event.ActionEvent evt) {
     317                advancedUpdateConfigActionPerformed(evt);
     318            }
     319        });
    234320
    235321        javax.swing.GroupLayout updatesPanelLayout = new javax.swing.GroupLayout(updatesPanel);
     
    378464    }// </editor-fold>//GEN-END:initComponents
    379465
    380 private void speedKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_speedKeyTyped
     466    private void speedKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_speedKeyReleased
    381467    try {
    382468        String upload = "";
     
    396482        return;
    397483    }
    398 }//GEN-LAST:event_speedKeyTyped
     484}//GEN-LAST:event_speedKeyReleased
    399485
    400486private void uploadkbpsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_uploadkbpsActionPerformed
    401     // TODO add your handling code here:
     487    kbpsSwitchPerformed(uploadkbps, uploadspeed);
    402488}//GEN-LAST:event_uploadkbpsActionPerformed
    403489
    404490private void downloadkbpsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_downloadkbpsActionPerformed
    405     // TODO add your handling code here:
     491    kbpsSwitchPerformed(downloadkbps, downloadspeed);
    406492}//GEN-LAST:event_downloadkbpsActionPerformed
    407493
    408 private void uploadgbKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_uploadgbKeyTyped
    409     // TODO add your handling code here:
    410 }//GEN-LAST:event_uploadgbKeyTyped
    411 
    412 private void downloadgbKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_downloadgbKeyTyped
    413     // TODO add your handling code here:
    414 }//GEN-LAST:event_downloadgbKeyTyped
     494private void monthKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_monthKeyReleased
     495    try {
     496        int uploadMonthValue = Integer.parseInt(uploadgb.getText());
     497        int downloadMonthValue = Integer.parseInt(downloadgb.getText());
     498
     499        String upload = "";
     500        String burstUpload = "";
     501        String download = "";
     502        String burstDownload = "";
     503
     504        if(uploadkbps.getSelectedIndex() == KILOBIT)
     505            upload = "" + SpeedHelper.calculateSpeed(uploadMonthValue)*8; //kbit
     506        else
     507            upload = "" + SpeedHelper.calculateSpeed(uploadMonthValue); //kbyte
     508
     509        if(downloadkbps.getSelectedIndex() == KILOBIT)
     510            download = "" + SpeedHelper.calculateSpeed(downloadMonthValue)*8; //kbit
     511        else
     512            download = "" + SpeedHelper.calculateSpeed(downloadMonthValue); //kbyte
     513
     514        initSpeeds(upload, download);
     515    }
     516    catch(NumberFormatException e) {
     517        e.printStackTrace();
     518        return;
     519    }
     520}//GEN-LAST:event_monthKeyReleased
     521
     522private void cancelMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_cancelMouseClicked
     523    this.dispose();
     524}//GEN-LAST:event_cancelMouseClicked
     525
     526private void okMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_okMouseClicked
     527    saveSpeeds();
     528    saveUpdatePolicy();
     529    this.dispose();
     530}//GEN-LAST:event_okMouseClicked
     531
     532private void checkUpdatesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_checkUpdatesActionPerformed
     533    long current = new Date().getTime();
     534    if(current < newsLastFetched + 5*60*1000) {
     535        return;
     536    }
     537    checkUpdates.setText("Checking for updates");
     538    checkUpdates.setEnabled(false);
     539    newsLastFetched = current;
     540    SwingWorker sw = new SwingWorker() {
     541
     542            @Override
     543            protected Object doInBackground() throws Exception {
     544                NewsFetcher.getInstance(RouterHelper.getContext()).fetchNews();
     545                return null;
     546            }
     547
     548            @Override
     549            protected void done() {
     550                checkUpdates.setText("Check for updates now");
     551                checkUpdates.setEnabled(true);
     552                if(NewsFetcher.getInstance(RouterHelper.getContext()).updateAvailable()) {
     553                    updateNow.setVisible(true);
     554                }
     555            }
     556
     557    };
     558}//GEN-LAST:event_checkUpdatesActionPerformed
     559
     560private void updateNowActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_updateNowActionPerformed
     561    SwingWorker sw = new SwingWorker() {
     562
     563            @Override
     564            protected Object doInBackground() throws Exception {
     565                new net.i2p.router.web.UpdateHandler().update();
     566                return null;
     567            }
     568       
     569    };
     570    updateNow.setEnabled(false);
     571    updateNow.setText("Updating...");
     572    checkUpdates.setEnabled(false);
     573
     574}//GEN-LAST:event_updateNowActionPerformed
     575
     576private void advancedUpdateConfigActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_advancedUpdateConfigActionPerformed
     577    try {
     578        Desktop.getDesktop().browse(new URI("http://127.0.0.1:7657/configupdate.jsp"));
     579    } catch (URISyntaxException ex) {
     580        Logger.getLogger(GeneralConfiguration.class.getName()).log(Level.SEVERE, null, ex);
     581    }
     582    catch (IOException ex) {
     583            Logger.getLogger(GeneralConfiguration.class.getName()).log(Level.SEVERE, null, ex);
     584    }
     585}//GEN-LAST:event_advancedUpdateConfigActionPerformed
    415586
    416587    protected void initUsage(String upload, String download) {
    417588        uploadgb.setText("" + SpeedHelper.calculateMonthlyUsage(Integer.parseInt(upload)));
    418589        downloadgb.setText("" + SpeedHelper.calculateMonthlyUsage(Integer.parseInt(download)));
     590    }
     591
     592    protected void initSpeeds(String upload, String download) {
     593        uploadspeed.setText(upload);
     594        downloadspeed.setText(download);
     595    }
     596
     597    private void kbpsSwitchPerformed(JComboBox kbps, JTextField speed) {
     598        int index = kbps.getSelectedIndex();
     599        int previous = Integer.parseInt(speed.getText());
     600        if(index == KILOBIT) {
     601            speed.setText("" + previous*8);
     602        }
     603        else {
     604            speed.setText("" + previous/8);
     605        }
     606    }
     607
     608    protected void saveSpeeds() {
     609        int maxDownload = Integer.parseInt(downloadspeed.getText());
     610        int maxUpload = Integer.parseInt(uploadspeed.getText());
     611        if(uploadkbps.getSelectedIndex() == KILOBIT) {
     612            SpeedHandler.setOutboundBandwidth(maxUpload/8);
     613            SpeedHandler.setOutboundBurstBandwidth(maxUpload/8);
     614        }
     615        else {
     616            SpeedHandler.setOutboundBandwidth(maxUpload);
     617            SpeedHandler.setOutboundBurstBandwidth(maxUpload);
     618        }
     619        if(downloadkbps.getSelectedIndex() == KILOBIT) {
     620            SpeedHandler.setInboundBandwidth(maxDownload/8);
     621            SpeedHandler.setInboundBurstBandwidth(maxDownload/8);
     622        }
     623        else {
     624            SpeedHandler.setInboundBandwidth(maxDownload);
     625            SpeedHandler.setInboundBurstBandwidth(maxDownload);
     626        }
     627    }
     628
     629    protected void saveUpdatePolicy() {
     630        ButtonModel policyButton = updateButtonGroup.getSelection();
     631        if(policyButton.equals(updateInform.getModel())) {
     632            UpdateHandler.setUpdatePolicy(UpdateHelper.NOTIFY_UPDATE_POLICY);
     633        }
     634        else if(policyButton.equals(updateDownload.getModel())) {
     635            UpdateHandler.setUpdatePolicy(UpdateHelper.DOWNLOAD_UPDATE_POLICY);
     636        }
     637        else if(policyButton.equals(updateDownloadRestart.getModel())) {
     638            UpdateHandler.setUpdatePolicy(UpdateHelper.INSTALL_UPDATE_POLICY);
     639        }
    419640    }
    420641
     
    423644    private javax.swing.JToggleButton advancedUpdateConfig;
    424645    private javax.swing.JPanel applyPanel;
    425     private javax.swing.ButtonGroup buttonGroup1;
    426646    private javax.swing.JToggleButton cancel;
    427647    private javax.swing.JToggleButton checkUpdates;
     
    429649    private javax.swing.JLabel clientTunnelLabel;
    430650    private javax.swing.JLabel downloadSpeedLabel;
     651    private javax.swing.JLabel downloadUsageLabel;
    431652    private javax.swing.JTextField downloadgb;
    432653    private javax.swing.JComboBox downloadkbps;
    433654    private javax.swing.JTextField downloadspeed;
    434     private javax.swing.JLabel jLabel3;
    435     private javax.swing.JLabel jLabel4;
    436     private javax.swing.JLabel jLabel5;
    437     private javax.swing.JLabel jLabel6;
    438     private javax.swing.JLabel jLabel7;
     655    private javax.swing.JLabel gbDownloadLabel;
     656    private javax.swing.JLabel gbUploadLabel;
    439657    private javax.swing.JPanel networkPanel;
    440658    private javax.swing.JToggleButton ok;
     
    445663    private javax.swing.JPanel tunnelPanel;
    446664    private javax.swing.JLabel tunnelsExplanation;
     665    private javax.swing.ButtonGroup updateButtonGroup;
    447666    private javax.swing.JRadioButton updateDownload;
    448667    private javax.swing.JRadioButton updateDownloadRestart;
     
    451670    private javax.swing.JToggleButton updateNow;
    452671    private javax.swing.JPanel updatesPanel;
     672    private javax.swing.JLabel uploadDownloadExplanation;
    453673    private javax.swing.JLabel uploadSpeedLabel;
     674    private javax.swing.JLabel uploadUsageLabel;
    454675    private javax.swing.JTextField uploadgb;
    455676    private javax.swing.JComboBox uploadkbps;
     
    459680    public static final int KILOBIT = 0;
    460681    public static final int KILOBYTE = 1;
     682
     683    private long newsLastFetched = 0;
    461684}
  • apps/desktopgui/src/net/i2p/desktopgui/gui/Tray.java

    r56b768f rf511c9b  
    152152                RouterHandler.setStatus(RouterHandler.SHUTDOWN_GRACEFULLY);
    153153                long shutdownTime = RouterHelper.getGracefulShutdownTimeRemaining();
    154                 System.out.println(shutdownTime);
     154                System.out.println("Shutdowntime remaining: " + shutdownTime);
    155155                if(shutdownTime>0) {
    156156                    trayIcon.displayMessage("Shutting down...", "Shutdown time remaining: " + shutdownTime/1000 + " seconds."
     
    171171       
    172172        config.add(speedConfig);
    173         //config.add(generalConfig);
     173        config.add(generalConfig);
    174174        config.add(advancedConfig);
    175175        popup.add(config);
  • apps/desktopgui/src/net/i2p/desktopgui/gui/resources/GeneralConfiguration.properties

    r56b768f rf511c9b  
    11cancel.text=Cancel
    22ok.text=OK
    3 jLabel3.text=Monthly usage:
    4 jLabel4.text=Monthly usage:
    5 jLabel5.text=GB
    6 jLabel6.text=GB
    7 jLabel7.text=Explanation ...
    83Form.title=General Configuration
    94speedPanel.TabConstraints.tabTitle=Speed
     
    2823serverTunnelLabel.text=Server tunnels:
    2924tunnelsExplanation.text=Tunnel explanation
     25uploadUsageLabel.text=Monthly usage:
     26downloadUsageLabel.text=Monthly usage:
     27gbUploadLabel.text=GB
     28gbDownloadLabel.text=GB
     29uploadDownloadExplanation.text=Explanation ...
  • apps/desktopgui/src/net/i2p/desktopgui/router/configuration/SpeedHelper.java

    r56b768f rf511c9b  
    3737        return RouterHelper.getContext().router().getConfigSetting(FIFOBandwidthRefiller.PROP_INBOUND_BANDWIDTH);
    3838    }
     39
     40    public static String getOutboundBandwidth() {
     41        return RouterHelper.getContext().router().getConfigSetting(FIFOBandwidthRefiller.PROP_OUTBOUND_BANDWIDTH);
     42    }
    3943}
  • apps/sam/java/src/net/i2p/sam/SAMv1Handler.java

    r56b768f rf511c9b  
    108108                }
    109109
    110                 msg = DataHelper.readLine(getClientSocket().socket().getInputStream()).trim();
     110                SocketChannel clientSocketChannel = getClientSocket() ;
     111                if (clientSocketChannel == null) {
     112                        _log.info("Connection closed by client");
     113                        break;
     114                }
     115                if (clientSocketChannel.socket() == null) {
     116                        _log.info("Connection closed by client");
     117                        break;
     118                }
     119                java.io.InputStream is = clientSocketChannel.socket().getInputStream();
     120                if (is == null) {
     121                        _log.info("Connection closed by client");
     122                        break;
     123                }
     124                msg = DataHelper.readLine(is);
    111125                if (msg == null) {
    112                     _log.debug("Connection closed by client");
     126                    _log.info("Connection closed by client (line read : null)");
    113127                    break;
    114128                }
     129                msg = msg.trim();
    115130
    116131                if (_log.shouldLog(Log.DEBUG)) {
  • apps/sam/java/src/net/i2p/sam/SAMv3DatagramSession.java

    r56b768f rf511c9b  
    3939         */
    4040        public SAMv3DatagramSession(String nick)
    41         throws IOException, DataFormatException, I2PSessionException {
     41        throws IOException, DataFormatException, I2PSessionException, SAMException {
    4242               
    4343                super(SAMv3Handler.sSessionsHash.get(nick).getDest(),
     
    5050
    5151                SAMv3Handler.SessionRecord rec = SAMv3Handler.sSessionsHash.get(nick);
    52         if ( rec==null ) throw new InterruptedIOException() ;
     52        if ( rec==null ) throw new SAMException("Record disappeared for nickname : \""+nick+"\"") ;
    5353
    5454        this.handler = rec.getHandler();
  • apps/sam/java/src/net/i2p/sam/SAMv3Handler.java

    r56b768f rf511c9b  
    565565                        return writeString("SESSION STATUS RESULT=I2P_ERROR DESTINATION=" + dest + " MESSAGE=\"" + e.getMessage() + "\"\n");
    566566                } catch (SAMException e) {
    567                         _log.error("Unexpected SAM error", e);
     567                        _log.info("Funny SAM error", e);
    568568                        return writeString("SESSION STATUS RESULT=I2P_ERROR DESTINATION=" + dest + " MESSAGE=\"" + e.getMessage() + "\"\n");
    569569                } catch (IOException e) {
  • apps/sam/java/src/net/i2p/sam/SAMv3StreamSession.java

    r56b768f rf511c9b  
    198198                SAMv3Handler.SessionRecord rec = SAMv3Handler.sSessionsHash.get(nick);
    199199               
    200                 if ( rec==null ) throw new InterruptedIOException() ;
     200                if ( rec==null || i2ps==null ) throw new InterruptedIOException() ;
    201201               
    202202                        if (verbose)
  • build.xml

    r56b768f rf511c9b  
    521521        <echo message="Findbugs output stored in findbugs.xml" />
    522522    </target>
    523     <target name="buildWithDesktopgui" depends="buildrouter">
     523    <target name="buildWithDesktopgui" depends="buildrouter,builddepSmall">
    524524        <ant dir="apps/desktopgui" target="build_jar" />
    525525    </target>
  • history.txt

    r56b768f rf511c9b  
     12009-05-29 sponge
     2    * added big fat start/stop lock into BOB
     3    * added zap command to shut down BOB... now we need a way to start it
     4      after it stops. :-)
     5
     62009-05-27 Mathiasdm
     7    * Increase sendProcessingTime some more, add a property to configure.
     8      Configure with 'router.defaultProcessingTimeThrottle'.
     9
     102009-05-27 Mathiasdm
     11    * Increased sendProcessingTime limits and added testSuccessTime
     12      to avoid unwanted throttling
     13
     142009-05-26 Mathiasdm
     15    * Throttling extension by looking at sendProcessingTime
     16
     172009-05-26 zzz
     18    * Console:
     19      - configlogging.jsp cleanup
     20      - Flags tweak
     21    * NetDb:
     22      - Don't send our own hash in the don't-include list when exploring
     23      - Remove any pending write when removing a RouterInfo
     24      - Cleanup to use routerHash()
     25    * Streaming: Hopefuly fix infinite loop in the SYN queue handler
     26
     272009-05-25 zzz
     28    * GeoIP:
     29      - Save our own location in the config
     30      - Check whole netDb at startup (last try didn't work)
     31    * NTCP:
     32      - Increase routerinfo send frequency to every 90m (was 9h)
     33      - Don't send 3 floodfill infos at startup or with routerinfo
     34    * Profile Organizer: Increase min fast peers based on
     35      number of local destinations
     36    * Timestamper:
     37      - Use GeoIP to query a closer ntp source if available
     38      - Lengthen query time if well-synced
     39      - Cleanup
     40
     412009-05-24 mkvore
     42    * SAM: logging some exceptions at INFO level instead of ERROR
     43
     442009-05-24 zzz
     45    * Connection limits / throttle:
     46      - Better limits when no inbound TCP
     47        (limit inbound and outbound separately)
     48      - Don't offer to SSU introduce when near connection limit
     49    * Console:
     50      - Move flags from icons/ to docs/icons
     51      - peers.jsp cleanup
     52      - Add readme_zh.html
     53    * GeoIP:
     54      - Check netDb SSU IP too
     55      - Check whole netDb at startup
     56    * NTCP: Log who is sending us big messages
     57    * UPnP: Move logging from wrapper log to router log
     58
     592009-05-23 Mathiasdm
     60    * Router netDB:
     61      - Added flags to the netDB page
     62
     632009-05-22 Mathiasdm
     64    * desktopgui:
     65      - Updating works in general config
     66      - Switched to Swingworker threads for improved responsiveness
     67
     682009-05-21 zzz
     69    * Router Watchdog:
     70      - Log memory stats
     71      - Dump threads on linux
     72      - Restart after 20 minutes (give the dog his teeth back)
     73
     742009-05-21 zzz
     75    * DataStore:
     76      - Adjust interface to have persistent and non-persistent methods,
     77        to prepare for partial storage in RAM
     78    * ExpireRoutersJob:
     79      - Rewrite, not enabled yet
     80    * I2Punnel:
     81      - Increase eepsite default to 3+0 for new installs
     82    * PersistentDataStore:
     83      - Cleanup, simplify, and concurrentify
     84      - Tweak stats
     85      - Remove write limit
     86      - Flush to disk on shutdown
     87      - Don't write out what we just read in
     88    * Router and console:
     89      - Bundle geoIP files and flags in new installs,
     90        spiff up tunnels.jsp and profiles.jsp.
     91        Existing installs can get files with 'ant updaterWIthGeoIP'
     92        or in the console docs bundle 'ant consoleDocs'
     93      - Use flags for shitlist and peers.jsp too
     94      - Tweak tunnels.jsp to show class letters
     95      - Hide in-progress details on tunnels.jsp
     96      - Add a little color to confignav
     97      - Remove 'no skew' message
     98      - More message tweaks if no wrapper
     99    * TunnelManager:
     100      - Remove now-unused isInUse()
     101    * UPnP:
     102      - Fix up port binding, add some logging on bind fails
     103      - Force IPv4 only for binds
     104
     1052009-05-20 Mathiasdm
     106    * General configuration enabled by default
     107    * General configuration speed tab works completely
     108
    11092009-05-17 zzz
    2110    * Merge i2p.i2p.zzz.upnp branch
  • router/java/nbproject/project.xml

    r56b768f rf511c9b  
    1212            <folders>
    1313                <source-folder>
     14                    <label>i2p_router</label>
     15                    <location>.</location>
     16                    <encoding>UTF-8</encoding>
     17                </source-folder>
     18                <source-folder>
    1419                    <label>src</label>
    1520                    <type>java</type>
     
    2126                    <type>java</type>
    2227                    <location>test</location>
    23                     <encoding>UTF-8</encoding>
    24                 </source-folder>
    25                 <source-folder>
    26                     <label>i2p_router</label>
    27                     <location>.</location>
    2828                    <encoding>UTF-8</encoding>
    2929                </source-folder>
     
    7474                </context-menu>
    7575            </view>
     76            <subprojects/>
    7677        </general-data>
    7778        <java-data xmlns="http://www.netbeans.org/ns/freeform-project-java/2">
  • router/java/src/net/i2p/router/RouterThrottleImpl.java

    r56b768f rf511c9b  
    3434    private static final int DEFAULT_MAX_TUNNELS = 2000;
    3535    private static final String PROP_DEFAULT_KBPS_THROTTLE = "router.defaultKBpsThrottle";
     36    private static final String PROP_MAX_PROCESSINGTIME = "router.defaultProcessingTimeThrottle";
     37    private static final int DEFAULT_MAX_PROCESSINGTIME = 1500;
    3638
    3739    /** tunnel acceptance */
     
    9799
    98100        long lag = _context.jobQueue().getMaxLag();
    99 // reject here if lag too high???
     101        // reject here if lag too high???
     102       
    100103        RateStat rs = _context.statManager().getRate("transport.sendProcessingTime");
    101104        Rate r = null;
    102         if (rs != null)
    103             r = rs.getRate(60*1000);
    104         double processTime = (r != null ? r.getAverageValue() : 0);
    105         if (processTime > 5000) {
    106             if (_log.shouldLog(Log.DEBUG))
    107                 _log.debug("Refusing tunnel request with the job lag of " + lag
    108                            + "since the 1 minute message processing time is too slow (" + processTime + ")");
    109             _context.statManager().addRateData("router.throttleTunnelProcessingTime1m", (long)processTime, (long)processTime);
    110             setTunnelStatus("Rejecting tunnels: High message delay");
    111             return TunnelHistory.TUNNEL_REJECT_TRANSIENT_OVERLOAD;
     105
     106        //Reject tunnels if the time to process messages and send them is too large. Too much time implies congestion.
     107        if(r != null) {
     108            double totalSendProcessingTimeEvents = r.getCurrentEventCount() + r.getLastEventCount();
     109            double avgSendProcessingTime = 0;
     110            double currentSendProcessingTime = 0;
     111            double lastSendProcessingTime = 0;
     112           
     113            //Calculate times
     114            if(r.getCurrentEventCount() > 0) {
     115                currentSendProcessingTime = r.getCurrentTotalValue()/r.getCurrentEventCount();
     116            }
     117            if(r.getLastEventCount() > 0) {
     118                lastSendProcessingTime = r.getLastTotalValue()/r.getLastEventCount();
     119            }
     120            if(totalSendProcessingTimeEvents > 0) {
     121                avgSendProcessingTime =  (r.getCurrentTotalValue() + r.getLastTotalValue())/totalSendProcessingTimeEvents;
     122            }
     123            else {
     124                avgSendProcessingTime = r.getAverageValue();
     125                if(_log.shouldLog(Log.WARN)) {
     126                    _log.warn("No events occurred. Using 1 minute average to look at message delay.");
     127                }
     128            }
     129
     130            int maxProcessingTime = _context.getProperty(PROP_MAX_PROCESSINGTIME, DEFAULT_MAX_PROCESSINGTIME);
     131
     132            //Set throttling if necessary
     133            if((avgSendProcessingTime > maxProcessingTime*0.9
     134                    || currentSendProcessingTime > maxProcessingTime
     135                    || lastSendProcessingTime > maxProcessingTime)) {
     136                if(_log.shouldLog(Log.WARN)) {
     137                    _log.warn("Refusing tunnel request due to sendProcessingTime of " + avgSendProcessingTime
     138                            + " ms over the last two minutes, which is too much.");
     139                }
     140                setTunnelStatus("Rejecting tunnels: congestion");
     141                return TunnelHistory.TUNNEL_REJECT_BANDWIDTH;
     142            }
    112143        }
    113144       
  • router/java/src/net/i2p/router/RouterVersion.java

    r56b768f rf511c9b  
    1919    public final static String ID = "Monotone";
    2020    public final static String VERSION = CoreVersion.VERSION;
    21     public final static long BUILD = 1;
     21    public final static long BUILD = 9;
    2222    /** for example "-test" */
    2323    public final static String EXTRA = "";
  • router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java

    r56b768f rf511c9b  
    10681068            buf.append("Published: <i>in ").append(DataHelper.formatDuration(0-age)).append("???</i><br />\n");
    10691069        buf.append("Address(es): <i>");
     1070        String country = _context.commSystem().getCountry(info.getIdentity().getHash());
     1071        if(country != null) {
     1072            buf.append(" <img alt=\"").append(country.toUpperCase()).append("\"");
     1073            buf.append(" src=\"/flags.jsp?c=").append(country).append("\">");
     1074        }
    10701075        for (Iterator iter = info.getAddresses().iterator(); iter.hasNext(); ) {
    10711076            RouterAddress addr = (RouterAddress)iter.next();
Note: See TracChangeset for help on using the changeset viewer.