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("
"); + out.write(" | ||||||||
");
out.write("I2PSnark \n"); - out.write("Refresh\n"); - out.write(" | "); + 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(" |