diff --git a/apps/i2psnark/java/src/org/klomp/snark/Snark.java b/apps/i2psnark/java/src/org/klomp/snark/Snark.java index 83c839fd2..453a68332 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Snark.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Snark.java @@ -1031,6 +1031,8 @@ public class Snark stopTorrent(); if (t != null) s += ": " + t; + if (completeListener != null) + completeListener.fatal(this, s); throw new RuntimeException(s, t); } @@ -1058,10 +1060,12 @@ public class Snark * @since 0.8.4 */ public void gotMetaInfo(PeerCoordinator coordinator, MetaInfo metainfo) { - meta = metainfo; try { - storage = new Storage(_util, meta, this); + // The following two may throw IOE... + storage = new Storage(_util, metainfo, this); storage.check(rootDataDir); + // ... so don't set meta until here + meta = metainfo; if (completeListener != null) { String newName = completeListener.gotMetaInfo(this); if (newName != null) @@ -1169,6 +1173,11 @@ public class Snark */ public String gotMetaInfo(Snark snark); + /** + * @since 0.9 + */ + public void fatal(Snark snark, String error); + // not really listeners but the easiest way to get back to an optional SnarkManager public long getSavedTorrentTime(Snark snark); public BitField getSavedTorrentBitField(Snark snark); diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index f08e07c71..48969f410 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -1280,8 +1280,11 @@ public class SnarkManager implements Snark.CompleteListener { return null; } saveTorrentStatus(meta, storage.getBitField(), null); // no file priorities - String name = (new File(getDataDir(), storage.getBaseName() + ".torrent")).getAbsolutePath(); + // temp for addMessage() in case canonical throws + String name = storage.getBaseName(); try { + // _snarks must use canonical + name = (new File(getDataDir(), storage.getBaseName() + ".torrent")).getCanonicalPath(); // put the announce URL in the file String announce = snark.getTrackerURL(); if (announce != null) @@ -1305,6 +1308,14 @@ public class SnarkManager implements Snark.CompleteListener { return null; } + /** + * A Snark.CompleteListener method. + * @since 0.9 + */ + public void fatal(Snark snark, String error) { + addMessage(_("Error on torrent {0}", snark.getName()) + ": " + error); + } + // End Snark.CompleteListeners /** diff --git a/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java b/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java index dd3b8665b..9b774c133 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java +++ b/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java @@ -348,7 +348,7 @@ public class TrackerClient extends I2PAppThread } // *** end of trackers loop here // Get peers from PEX - if (left > 0 && coordinator.needPeers() && (!meta.isPrivate()) && !stop) { + if (left > 0 && coordinator.needPeers() && (meta == null || !meta.isPrivate()) && !stop) { Set pids = coordinator.getPEXPeers(); if (!pids.isEmpty()) { _util.debug("Got " + pids.size() + " from PEX", Snark.INFO); @@ -370,7 +370,7 @@ public class TrackerClient extends I2PAppThread // Get peers from DHT // FIXME this needs to be in its own thread - if (_util.getDHT() != null && (!meta.isPrivate()) && !stop) { + if (_util.getDHT() != null && (meta == null || !meta.isPrivate()) && !stop) { int numwant; if (left == 0 || event.equals(STOPPED_EVENT) || !coordinator.needPeers()) numwant = 1; 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 db4827dfc..bcf45635e 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -544,6 +544,8 @@ public class I2PSnarkServlet extends DefaultServlet { fetch.start(); } else if (newURL.startsWith(MAGNET) || newURL.startsWith(MAGGOT)) { addMagnet(newURL); + } else if (newURL.length() == 40 && newURL.replaceAll("[a-fA-F0-9]", "").length() == 0) { + addMagnet(MAGNET_FULL + newURL); } else { _manager.addMessage(_("Invalid URL: Must start with \"http://\", \"{0}\", or \"{1}\"", MAGNET, MAGGOT)); } @@ -1316,7 +1318,7 @@ public class I2PSnarkServlet extends DefaultServlet { out.write(_("From URL")); out.write(": \n"); // not supporting from file at the moment, since the file name passed isn't always absolute (so it may not resolve) //out.write("From file:
"); @@ -1509,11 +1511,11 @@ public class I2PSnarkServlet extends DefaultServlet { ""); out.write(_("Up bandwidth limit")); out.write(": KBps ("); + + _manager.util().getMaxUpBW() + "\" size=\"3\" maxlength=\"3\" > KBps "); out.write(_("Half available bandwidth recommended.")); - out.write(" "); + out.write("
"); out.write(_("View or change router bandwidth")); - out.write(")

\n" + + out.write("

\n" + ""); out.write(_("Use open trackers also")); diff --git a/history.txt b/history.txt index 5c66bf9bb..379d01c4c 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,13 @@ +2012-03-24 zzz + * GarlicConfig: Remove more unused methods + * i2psnark: + - Fix dup torrent msg with magnets (tickets #433 and #504) + - Fix state when storage dies during transition out of magnet mode + - Fix NPE in magnet mode + - Error logging improvements + - Support add-torrent with infohash alone + - CSS tweaks + 2012-03-22 zzz * Home page: CSS tweaks * Reseeder: Get rid of static instance, root in netDB, diff --git a/installer/resources/themes/snark/ubergine/snark.css b/installer/resources/themes/snark/ubergine/snark.css index 2a870c83f..5462a2e4f 100644 --- a/installer/resources/themes/snark/ubergine/snark.css +++ b/installer/resources/themes/snark/ubergine/snark.css @@ -93,7 +93,7 @@ body { border: 1px solid #000; overflow: auto; color: #26f; - max-height: 76px; + max-height: 82px; min-height: 45px; width: auto; background: #2a192a url('/themes/snark/ubergine/images/hat.png') no-repeat scroll right center; diff --git a/installer/resources/themes/snark/vanilla/snark.css b/installer/resources/themes/snark/vanilla/snark.css index 29190dca7..ad17393c5 100644 --- a/installer/resources/themes/snark/vanilla/snark.css +++ b/installer/resources/themes/snark/vanilla/snark.css @@ -92,7 +92,7 @@ body { border: 1px solid #000; overflow: auto; color: #26f; - max-height: 76px; + max-height: 82px; min-height: 45px; width: auto; background: #eda url('/themes/snark/ubergine/images/hat.png') no-repeat scroll right center; diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index f5c926454..43dca9240 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 20; + public final static long BUILD = 21; /** for example "-test" */ public final static String EXTRA = "";