diff --git a/apps/i2psnark/java/src/org/klomp/snark/Snark.java b/apps/i2psnark/java/src/org/klomp/snark/Snark.java index 85cbd82e25..b02a8293f1 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Snark.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Snark.java @@ -283,6 +283,11 @@ public class Snark int port; IOException lastException = null; +/* + * Don't start a tunnel if the torrent isn't going to be started. + * If we are starting, + * startTorrent() will call trackerclient.start() which will force a connect. + * boolean ok = I2PSnarkUtil.instance().connect(); if (!ok) fatal("Unable to connect to I2P"); I2PServerSocket serversocket = I2PSnarkUtil.instance().getServerSocket(); @@ -292,6 +297,7 @@ public class Snark Destination d = serversocket.getManager().getSession().getMyDestination(); debug("Listening on I2P destination " + d.toBase64() + " / " + d.calculateHash().toBase64(), NOTICE); } +*/ // Figure out what the torrent argument represents. meta = null; @@ -371,12 +377,17 @@ public class Snark } } + activity = "Collecting pieces"; coordinator = new PeerCoordinator(id, meta, storage, clistener, this); PeerCoordinatorSet set = PeerCoordinatorSet.instance(); set.add(coordinator); +/* + * see comment above + * ConnectionAcceptor acceptor = ConnectionAcceptor.instance(); acceptor.startAccepting(set, serversocket); +*/ trackerclient = new TrackerClient(meta, coordinator); if (start) @@ -402,6 +413,17 @@ public class Snark if (!trackerclient.started() && !coordinatorChanged) { trackerclient.start(); } else if (trackerclient.halted() || coordinatorChanged) { + try + { + storage.reopen(rootDataDir); + } + catch (IOException ioe) + { + try { storage.close(); } catch (IOException ioee) { + ioee.printStackTrace(); + } + fatal("Could not reopen storage", ioe); + } TrackerClient newClient = new TrackerClient(coordinator.getMetaInfo(), coordinator); if (!trackerclient.halted()) trackerclient.halt(); diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index 1e1e47dba8..8c3c72da88 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -39,7 +39,7 @@ public class SnarkManager implements Snark.CompleteListener { _messages = new ArrayList(16); loadConfig("i2psnark.config"); int minutes = getStartupDelayMinutes(); - _messages.add("Starting up torrents in " + minutes + (minutes == 1 ? " minute" : " minutes")); + _messages.add("Adding torrents in " + minutes + (minutes == 1 ? " minute" : " minutes")); I2PThread monitor = new I2PThread(new DirMonitor(), "Snark DirMonitor"); monitor.setDaemon(true); monitor.start(); @@ -269,7 +269,7 @@ public class SnarkManager implements Snark.CompleteListener { public Snark getTorrent(String filename) { synchronized (_snarks) { return (Snark)_snarks.get(filename); } } public void addTorrent(String filename) { addTorrent(filename, false); } public void addTorrent(String filename, boolean dontAutoStart) { - if (!I2PSnarkUtil.instance().connected()) { + if ((!dontAutoStart) && !I2PSnarkUtil.instance().connected()) { addMessage("Connecting to I2P"); boolean ok = I2PSnarkUtil.instance().connect(); if (!ok) { @@ -446,10 +446,9 @@ public class SnarkManager implements Snark.CompleteListener { if (existingNames.contains(foundNames.get(i))) { // already known. noop } else { - if (I2PSnarkUtil.instance().connect()) - addTorrent((String)foundNames.get(i)); - else + if (shouldAutoStart() && !I2PSnarkUtil.instance().connect()) addMessage("Unable to connect to I2P"); + addTorrent((String)foundNames.get(i), !shouldAutoStart()); } } // now lets see which ones have been removed... diff --git a/apps/i2psnark/java/src/org/klomp/snark/Storage.java b/apps/i2psnark/java/src/org/klomp/snark/Storage.java index 0cf43fffcd..c16fb878be 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Storage.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Storage.java @@ -337,6 +337,49 @@ public class Storage checkCreateFiles(); } + /** + * Reopen the file descriptors for a restart + * Do existence check but no length check or data reverification + */ + public void reopen(String rootDir) throws IOException + { + File base = new File(rootDir, filterName(metainfo.getName())); + + List files = metainfo.getFiles(); + if (files == null) + { + // Reopen base as file. + Snark.debug("Reopening file: " + base, Snark.NOTICE); + if (!base.exists()) + throw new IOException("Could not reopen file " + base); + + if (!base.canWrite()) // hope we can get away with this, if we are only seeding... + rafs[0] = new RandomAccessFile(base, "r"); + else + rafs[0] = new RandomAccessFile(base, "rw"); + } + else + { + // Reopen base as dir. + Snark.debug("Reopening directory: " + base, Snark.NOTICE); + if (!base.isDirectory()) + throw new IOException("Could not reopen directory " + base); + + int size = files.size(); + for (int i = 0; i < size; i++) + { + File f = createFileFromNames(base, (List)files.get(i)); + if (!f.exists()) + throw new IOException("Could not reopen file " + f); + if (!f.canWrite()) // see above re: only seeding + rafs[i] = new RandomAccessFile(f, "r"); + else + rafs[i] = new RandomAccessFile(f, "rw"); + } + + } + } + /** * Removes 'suspicious' characters from the give file name. */ diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java index 320dc5f314..37f78516dd 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -56,10 +56,17 @@ public class I2PSnarkServlet extends HttpServlet { out.write(HEADER); out.write("\n"); - out.write("
"); + out.write("
"); out.write("I2PSnark
\n"); - out.write("Refresh\n"); - out.write("
");
+        out.write("\n");
+        out.write("
Refresh
\n"); + out.write("
Forum
\n"); + out.write("
eBook
\n"); + out.write("
GayTorrents
\n"); + out.write("
Orion
\n"); + out.write("
Postman
\n"); + out.write("
\n"); + out.write("
");
         List msgs = _manager.getMessages();
         for (int i = msgs.size()-1; i >= 0; i--) {
             String msg = (String)msgs.get(i);
@@ -67,10 +74,16 @@ public class I2PSnarkServlet extends HttpServlet {
         }
         out.write("
\n"); - out.write(TABLE_HEADER); - List snarks = getSortedSnarks(req); String uri = req.getRequestURI(); + out.write(TABLE_HEADER); + out.write(""); + if (I2PSnarkUtil.instance().connected()) + out.write("Stop All"); + else + out.write(" "); + out.write("\n"); for (int i = 0; i < snarks.size(); i++) { Snark snark = (Snark)snarks.get(i); displaySnark(out, snark, uri, i, stats); @@ -273,6 +286,18 @@ public class I2PSnarkServlet extends HttpServlet { _manager.addMessage("Cannot create a torrent for the nonexistent data: " + baseFile.getAbsolutePath()); } } + } else if ("StopAll".equals(action)) { + _manager.addMessage("Stopping all torrents and closing the I2P tunnel"); + List snarks = getSortedSnarks(req); + for (int i = 0; i < snarks.size(); i++) { + Snark snark = (Snark)snarks.get(i); + if (!snark.stopped) + _manager.stopTorrent(snark.torrent, false); + } + if (I2PSnarkUtil.instance().connected()) { + I2PSnarkUtil.instance().disconnect(); + _manager.addMessage("I2P tunnel closed"); + } } } @@ -616,9 +641,7 @@ public class I2PSnarkServlet extends HttpServlet { " Downloaded\n" + " Uploaded\n" + " Down Rate\n" + - " Up Rate\n" + - "  \n" + - "\n"; + " Up Rate\n"; private static final String TABLE_TOTAL = "\n" + "Totals\n" + diff --git a/history.txt b/history.txt index 8f8213aa56..3c9da714f2 100644 --- a/history.txt +++ b/history.txt @@ -1,4 +1,10 @@ -$Id: history.txt,v 1.534 2006-11-09 20:44:36 zzz Exp $ +$Id: history.txt,v 1.535 2007-01-14 14:49:35 zzz Exp $ + +2007-01-15 zzz + * i2psnark: Add 'Stop All' link on web page + * Add some links to trackers and forum on web page + * Don't start tunnel if 'Autostart' unchecked + * Fix torrent restart bug by reopening file descriptors 2007-01-14 zzz * i2psnark: Improvements for torrents with > 4 leechers: diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index afe0ce9372..0d8184e1a1 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -15,9 +15,9 @@ import net.i2p.CoreVersion; * */ public class RouterVersion { - public final static String ID = "$Revision: 1.469 $ $Date: 2006-11-09 20:44:35 $"; + public final static String ID = "$Revision: 1.470 $ $Date: 2007-01-14 14:49:33 $"; public final static String VERSION = "0.6.1.26"; - public final static long BUILD = 3; + public final static long BUILD = 4; public static void main(String args[]) { System.out.println("I2P Router version: " + VERSION + "-" + BUILD); System.out.println("Router ID: " + RouterVersion.ID);