forked from I2P_Developers/i2p.i2p
* i2psnark:
- More listing fixes - Revert choker change thx 'backup' !
This commit is contained in:
@ -118,7 +118,7 @@ class PeerCheckerTask extends TimerTask
|
|||||||
// Choke a percentage of them rather than all so it isn't so drastic...
|
// Choke a percentage of them rather than all so it isn't so drastic...
|
||||||
// unless this torrent is over the limit all by itself.
|
// unless this torrent is over the limit all by itself.
|
||||||
boolean overBWLimitChoke = upload > 0 &&
|
boolean overBWLimitChoke = upload > 0 &&
|
||||||
((overBWLimit && random.nextInt(5) < 2) ||
|
((overBWLimit && random.nextBoolean()) ||
|
||||||
(coordinator.overUpBWLimit(uploaded)));
|
(coordinator.overUpBWLimit(uploaded)));
|
||||||
|
|
||||||
// If we are at our max uploaders and we have lots of other
|
// If we are at our max uploaders and we have lots of other
|
||||||
|
@ -29,7 +29,7 @@ public class SnarkManager implements Snark.CompleteListener {
|
|||||||
private static SnarkManager _instance = new SnarkManager();
|
private static SnarkManager _instance = new SnarkManager();
|
||||||
public static SnarkManager instance() { return _instance; }
|
public static SnarkManager instance() { return _instance; }
|
||||||
|
|
||||||
/** map of (canonical) filename to Snark instance (unsynchronized) */
|
/** map of (canonical) filename of the .torrent file to Snark instance (unsynchronized) */
|
||||||
private final Map<String, Snark> _snarks;
|
private final Map<String, Snark> _snarks;
|
||||||
private final Object _addSnarkLock;
|
private final Object _addSnarkLock;
|
||||||
private /* FIXME final FIXME */ File _configFile;
|
private /* FIXME final FIXME */ File _configFile;
|
||||||
@ -396,12 +396,30 @@ public class SnarkManager implements Snark.CompleteListener {
|
|||||||
/** hardcoded for sanity. perhaps this should be customizable, for people who increase their ulimit, etc. */
|
/** hardcoded for sanity. perhaps this should be customizable, for people who increase their ulimit, etc. */
|
||||||
private static final int MAX_FILES_PER_TORRENT = 512;
|
private static final int MAX_FILES_PER_TORRENT = 512;
|
||||||
|
|
||||||
/** set of filenames that we are dealing with */
|
/** set of canonical .torrent filenames that we are dealing with */
|
||||||
public Set<String> listTorrentFiles() { synchronized (_snarks) { return new HashSet(_snarks.keySet()); } }
|
public Set<String> listTorrentFiles() { synchronized (_snarks) { return new HashSet(_snarks.keySet()); } }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Grab the torrent given the (canonical) filename
|
* Grab the torrent given the (canonical) filename of the .torrent file
|
||||||
|
* @return Snark or null
|
||||||
*/
|
*/
|
||||||
public Snark getTorrent(String filename) { synchronized (_snarks) { return (Snark)_snarks.get(filename); } }
|
public Snark getTorrent(String filename) { synchronized (_snarks) { return (Snark)_snarks.get(filename); } }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Grab the torrent given the base name of the storage
|
||||||
|
* @return Snark or null
|
||||||
|
* @since 0.7.14
|
||||||
|
*/
|
||||||
|
public Snark getTorrentByBaseName(String filename) {
|
||||||
|
synchronized (_snarks) {
|
||||||
|
for (Snark s : _snarks.values()) {
|
||||||
|
if (s.storage.getBaseName().equals(filename))
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public void addTorrent(String filename) { addTorrent(filename, false); }
|
public void addTorrent(String filename) { addTorrent(filename, false); }
|
||||||
public void addTorrent(String filename, boolean dontAutoStart) {
|
public void addTorrent(String filename, boolean dontAutoStart) {
|
||||||
if ((!dontAutoStart) && !_util.connected()) {
|
if ((!dontAutoStart) && !_util.connected()) {
|
||||||
@ -595,8 +613,8 @@ public class SnarkManager implements Snark.CompleteListener {
|
|||||||
} else if (info.getPieces() > Storage.MAX_PIECES) {
|
} else if (info.getPieces() > Storage.MAX_PIECES) {
|
||||||
return _("Too many pieces in \"{0}\", limit is {1}, deleting it!", info.getName(), Storage.MAX_PIECES);
|
return _("Too many pieces in \"{0}\", limit is {1}, deleting it!", info.getName(), Storage.MAX_PIECES);
|
||||||
} else if (info.getPieceLength(0) > Storage.MAX_PIECE_SIZE) {
|
} else if (info.getPieceLength(0) > Storage.MAX_PIECE_SIZE) {
|
||||||
return _("Pieces are too large in \"{0}\" ({1}B), deleting it.", info.getName(), DataHelper.formatSize(info.getPieceLength(0))) + ' ' +
|
return _("Pieces are too large in \"{0}\" ({1}B), deleting it.", info.getName(), DataHelper.formatSize2(info.getPieceLength(0))) + ' ' +
|
||||||
_("Limit is {0}B", DataHelper.formatSize(Storage.MAX_PIECE_SIZE));
|
_("Limit is {0}B", DataHelper.formatSize2(Storage.MAX_PIECE_SIZE));
|
||||||
} else if (info.getTotalLength() > Storage.MAX_TOTAL_SIZE) {
|
} else if (info.getTotalLength() > Storage.MAX_TOTAL_SIZE) {
|
||||||
System.out.println("torrent info: " + info.toString());
|
System.out.println("torrent info: " + info.toString());
|
||||||
List lengths = info.getLengths();
|
List lengths = info.getLengths();
|
||||||
@ -689,7 +707,7 @@ public class SnarkManager implements Snark.CompleteListener {
|
|||||||
public void torrentComplete(Snark snark) {
|
public void torrentComplete(Snark snark) {
|
||||||
File f = new File(snark.torrent);
|
File f = new File(snark.torrent);
|
||||||
long len = snark.meta.getTotalLength();
|
long len = snark.meta.getTotalLength();
|
||||||
addMessage(_("Download finished: \"{0}\"", f.getName()) + " (" + _("size: {0}B", DataHelper.formatSize(len)) + ')');
|
addMessage(_("Download finished: \"{0}\"", f.getName()) + " (" + _("size: {0}B", DataHelper.formatSize2(len)) + ')');
|
||||||
updateStatus(snark);
|
updateStatus(snark);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -315,12 +315,12 @@ public class Storage
|
|||||||
if (!bitfield.get(pc))
|
if (!bitfield.get(pc))
|
||||||
rv = Math.min(psz - (start % psz), lengths[i]);
|
rv = Math.min(psz - (start % psz), lengths[i]);
|
||||||
int pieces = metainfo.getPieces();
|
int pieces = metainfo.getPieces();
|
||||||
for (int j = pc + 1; j * psz < end && j < pieces; j++) {
|
for (int j = pc + 1; (((long)j) * psz) < end && j < pieces; j++) {
|
||||||
if (!bitfield.get(j)) {
|
if (!bitfield.get(j)) {
|
||||||
if ((j+1)*psz < end)
|
if (((long)(j+1))*psz < end)
|
||||||
rv += psz;
|
rv += psz;
|
||||||
else
|
else
|
||||||
rv += end - (j * psz);
|
rv += end - (((long)j) * psz);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return rv;
|
return rv;
|
||||||
@ -339,6 +339,18 @@ public class Storage
|
|||||||
return bitfield;
|
return bitfield;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The base file or directory name of the data,
|
||||||
|
* as specified in the .torrent file, but filtered to remove
|
||||||
|
* illegal characters. This is where the data actually is,
|
||||||
|
* relative to the snark base dir.
|
||||||
|
*
|
||||||
|
* @since 0.7.14
|
||||||
|
*/
|
||||||
|
public String getBaseName() {
|
||||||
|
return filterName(metainfo.getName());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates (and/or checks) all files from the metainfo file list.
|
* Creates (and/or checks) all files from the metainfo file list.
|
||||||
*/
|
*/
|
||||||
|
@ -547,9 +547,11 @@ public class I2PSnarkServlet extends Default {
|
|||||||
l = l.substring(skip.length());
|
l = l.substring(skip.length());
|
||||||
if (r.startsWith(skip))
|
if (r.startsWith(skip))
|
||||||
r = r.substring(skip.length());
|
r = r.substring(skip.length());
|
||||||
if (l.toLowerCase().startsWith("the "))
|
String llc = l.toLowerCase();
|
||||||
|
if (llc.startsWith("the ") || llc.startsWith("the."))
|
||||||
l = l.substring(4);
|
l = l.substring(4);
|
||||||
if (r.toLowerCase().startsWith("the "))
|
String rlc = r.toLowerCase();
|
||||||
|
if (rlc.startsWith("the ") || rlc.startsWith("the."))
|
||||||
r = r.substring(4);
|
r = r.substring(4);
|
||||||
return collator.compare(l, r);
|
return collator.compare(l, r);
|
||||||
}
|
}
|
||||||
@ -681,7 +683,7 @@ public class I2PSnarkServlet extends Default {
|
|||||||
out.write("<td align=\"left\" class=\"snarkTorrentName " + rowClass + "\">");
|
out.write("<td align=\"left\" class=\"snarkTorrentName " + rowClass + "\">");
|
||||||
|
|
||||||
if (remaining == 0 || snark.meta.getFiles() != null) {
|
if (remaining == 0 || snark.meta.getFiles() != null) {
|
||||||
out.write("<a href=\"" + snark.meta.getName());
|
out.write("<a href=\"" + snark.storage.getBaseName());
|
||||||
if (snark.meta.getFiles() != null)
|
if (snark.meta.getFiles() != null)
|
||||||
out.write("/");
|
out.write("/");
|
||||||
out.write("\" title=\"");
|
out.write("\" title=\"");
|
||||||
@ -1091,6 +1093,9 @@ public class I2PSnarkServlet extends Default {
|
|||||||
/** dummies for translation */
|
/** dummies for translation */
|
||||||
private static final String HOPS = ngettext("1 hop", "{0} hops");
|
private static final String HOPS = ngettext("1 hop", "{0} hops");
|
||||||
private static final String TUNNELS = ngettext("1 tunnel", "{0} tunnels");
|
private static final String TUNNELS = ngettext("1 tunnel", "{0} tunnels");
|
||||||
|
/** prevents the ngettext line below from getting tagged */
|
||||||
|
private static final String DUMMY0 = "{0} ";
|
||||||
|
private static final String DUMMY1 = "1 ";
|
||||||
|
|
||||||
/** modded from ConfigTunnelsHelper @since 0.7.14 */
|
/** modded from ConfigTunnelsHelper @since 0.7.14 */
|
||||||
private String renderOptions(int min, int max, String strNow, String selName, String name) {
|
private String renderOptions(int min, int max, String strNow, String selName, String name) {
|
||||||
@ -1104,7 +1109,8 @@ public class I2PSnarkServlet extends Default {
|
|||||||
buf.append("<option value=\"").append(i).append("\" ");
|
buf.append("<option value=\"").append(i).append("\" ");
|
||||||
if (i == now)
|
if (i == now)
|
||||||
buf.append("selected=\"true\" ");
|
buf.append("selected=\"true\" ");
|
||||||
buf.append(">").append(ngettext("1 " + name, "{0} " + name + 's', i));
|
// constants to prevent tagging
|
||||||
|
buf.append(">").append(ngettext(DUMMY1 + name, DUMMY0 + name + 's', i));
|
||||||
buf.append("</option>\n");
|
buf.append("</option>\n");
|
||||||
}
|
}
|
||||||
buf.append("</select>\n");
|
buf.append("</select>\n");
|
||||||
@ -1208,18 +1214,13 @@ public class I2PSnarkServlet extends Default {
|
|||||||
title = title.substring("/i2psnark/".length());
|
title = title.substring("/i2psnark/".length());
|
||||||
|
|
||||||
// Get the snark associated with this directory
|
// Get the snark associated with this directory
|
||||||
Snark snark = null;
|
String torrentName;
|
||||||
try {
|
int slash = title.indexOf('/');
|
||||||
String torrentName;
|
if (slash > 0)
|
||||||
int slash = title.indexOf('/');
|
torrentName = title.substring(0, slash);
|
||||||
if (slash > 0)
|
else
|
||||||
torrentName = title.substring(0, slash) + ".torrent";
|
torrentName = title;
|
||||||
else
|
Snark snark = _manager.getTorrentByBaseName(torrentName);
|
||||||
torrentName = title + ".torrent";
|
|
||||||
File dataDir = _manager.getDataDir();
|
|
||||||
String torrentAbsPath = (new File(dataDir, torrentName)).getCanonicalPath();
|
|
||||||
snark = _manager.getTorrent(torrentAbsPath);
|
|
||||||
} catch (IOException ioe) {}
|
|
||||||
if (title.endsWith("/"))
|
if (title.endsWith("/"))
|
||||||
title = title.substring(0, title.length() - 1);
|
title = title.substring(0, title.length() - 1);
|
||||||
title = _("Torrent") + ": " + title;
|
title = _("Torrent") + ": " + title;
|
||||||
@ -1371,7 +1372,7 @@ public class I2PSnarkServlet extends Default {
|
|||||||
plc.endsWith(".ape"))
|
plc.endsWith(".ape"))
|
||||||
icon = "music";
|
icon = "music";
|
||||||
else if (mime.startsWith("video/") || plc.endsWith(".mkv") || plc.endsWith(".m4v") ||
|
else if (mime.startsWith("video/") || plc.endsWith(".mkv") || plc.endsWith(".m4v") ||
|
||||||
plc.endsWith(".mp4"))
|
plc.endsWith(".mp4") || plc.endsWith(".wmv"))
|
||||||
icon = "film";
|
icon = "film";
|
||||||
else if (mime.equals("application/zip") || mime.equals("application/x-gtar") ||
|
else if (mime.equals("application/zip") || mime.equals("application/x-gtar") ||
|
||||||
mime.equals("application/compress") || mime.equals("application/gzip") ||
|
mime.equals("application/compress") || mime.equals("application/gzip") ||
|
||||||
|
Reference in New Issue
Block a user