diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index 36b099f38..a79ec3e49 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -161,8 +161,10 @@ public class SnarkManager implements CompleteListener { _connectionAcceptor = new ConnectionAcceptor(_util); _monitor = new I2PAppThread(new DirMonitor(), "Snark DirMonitor", true); _monitor.start(); - // delay until UpdateManager is there - _context.simpleScheduler().addEvent(new Register(), 4*60*1000); + // only if default instance + if ("i2psnark".equals(_contextName)) + // delay until UpdateManager is there + _context.simpleScheduler().addEvent(new Register(), 4*60*1000); // Not required, Jetty has a shutdown hook //_context.addShutdownTask(new SnarkManagerShutdown()); } 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 518d1ef3a..af36f010d 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -61,6 +61,7 @@ public class I2PSnarkServlet extends BasicServlet { private static final String DEFAULT_NAME = "i2psnark"; public static final String PROP_CONFIG_FILE = "i2psnark.configFile"; + private static final int PAGE_SIZE = 20; public I2PSnarkServlet() { super(); @@ -163,6 +164,7 @@ public class I2PSnarkServlet extends BasicServlet { resp.setHeader("X-Frame-Options", "SAMEORIGIN"); String peerParam = req.getParameter("p"); + String stParam = req.getParameter("st"); String peerString; if (peerParam == null || (!_manager.util().connected()) || peerParam.replaceAll("[a-zA-Z0-9~=-]", "").length() > 0) { // XSS @@ -170,6 +172,12 @@ public class I2PSnarkServlet extends BasicServlet { } else { peerString = "?p=" + peerParam; } + if (stParam != null && !stParam.equals("0")) { + if (peerString.length() > 0) + peerString += "&st=" + stParam; + else + peerString = "?st="+ stParam; + } // AJAX for mainsection if ("/.ajax/xhr1.html".equals(path)) { @@ -351,6 +359,7 @@ public class I2PSnarkServlet extends BasicServlet { /** dl, ul, down rate, up rate, peers, size */ final long stats[] = {0,0,0,0,0,0}; String peerParam = req.getParameter("p"); + String stParam = req.getParameter("st"); List snarks = getSortedSnarks(req); boolean isForm = _manager.util().connected() || !snarks.isEmpty(); @@ -360,6 +369,9 @@ public class I2PSnarkServlet extends BasicServlet { // don't lose peer setting if (peerParam != null) out.write("\n"); + // ...or st setting + if (stParam != null) + out.write("\n"); } out.write(TABLE_HEADER); out.write(""); out.write(""); } else { - out.write("?p=1\">"); + out.write("?p=1"); + if (stParam != null) { + out.write("&st="); + out.write(stParam); + } + out.write("\">"); out.write("\"");\n"); String uri = _contextPath + '/'; boolean showDebug = "2".equals(peerParam); + + int start = 0; + if (stParam != null) { + try { + start = Math.max(0, Math.min(snarks.size() - 1, Integer.parseInt(stParam))); + } catch (NumberFormatException nfe) {} + } for (int i = 0; i < snarks.size(); i++) { Snark snark = (Snark)snarks.get(i); boolean showPeers = showDebug || "1".equals(peerParam) || Base64.encode(snark.getInfoHash()).equals(peerParam); - displaySnark(out, snark, uri, i, stats, showPeers, isDegraded, noThinsp, showDebug); + boolean hide = i < start || i >= start + PAGE_SIZE; + displaySnark(out, snark, uri, i, stats, showPeers, isDegraded, noThinsp, showDebug, hide); } if (snarks.isEmpty()) { @@ -493,6 +522,27 @@ public class I2PSnarkServlet extends BasicServlet { } else /** if (snarks.size() > 1) */ { out.write("\n" + " "); + if (start > 0) { + int prev = Math.max(0, start - PAGE_SIZE); + out.write(" " + + "\""" + + " "); + } + if (start + PAGE_SIZE < snarks.size()) { + int next = start + PAGE_SIZE; + out.write(" " + + "\""" + + " "); + } + out.write(" "); out.write(_("Totals")); out.write(": "); out.write(ngettext("1 torrent", "{0} torrents", snarks.size())); @@ -1015,8 +1065,34 @@ public class I2PSnarkServlet extends BasicServlet { private static final int MAX_DISPLAYED_FILENAME_LENGTH = 50; private static final int MAX_DISPLAYED_ERROR_LENGTH = 43; + + /** + * Display one snark (one line in table, unless showPeers is true) + * + * @param stats in/out param (totals) + * @param statsOnly if true, output nothing, update stats only + */ private void displaySnark(PrintWriter out, Snark snark, String uri, int row, long stats[], boolean showPeers, - boolean isDegraded, boolean noThinsp, boolean showDebug) throws IOException { + boolean isDegraded, boolean noThinsp, boolean showDebug, boolean statsOnly) throws IOException { + // stats + long uploaded = snark.getUploaded(); + stats[0] += snark.getDownloaded(); + stats[1] += uploaded; + long downBps = snark.getDownloadRate(); + long upBps = snark.getUploadRate(); + boolean isRunning = !snark.isStopped(); + if (isRunning) { + stats[2] += downBps; + stats[3] += upBps; + } + int curPeers = snark.getPeerCount(); + stats[4] += curPeers; + long total = snark.getTotalLength(); + if (total > 0) + stats[5] += total; + if (statsOnly) + return; + String filename = snark.getName(); if (snark.getMetaInfo() != null) { // Only do this if not a magnet or torrent download @@ -1036,7 +1112,6 @@ public class I2PSnarkServlet extends BasicServlet { filename = start + "…"; } } - long total = snark.getTotalLength(); // includes skipped files, -1 for magnet mode long remaining = snark.getRemainingLength(); if (remaining > total) @@ -1045,22 +1120,11 @@ public class I2PSnarkServlet extends BasicServlet { long needed = snark.getNeededLength(); if (needed > total) needed = total; - long downBps = snark.getDownloadRate(); - long upBps = snark.getUploadRate(); long remainingSeconds; if (downBps > 0 && needed > 0) remainingSeconds = needed / downBps; else remainingSeconds = -1; - boolean isRunning = !snark.isStopped(); - long uploaded = snark.getUploaded(); - stats[0] += snark.getDownloaded(); - stats[1] += uploaded; - if (isRunning) { - stats[2] += downBps; - stats[3] += upBps; - } - stats[5] += total; MetaInfo meta = snark.getMetaInfo(); // isValid means isNotMagnet @@ -1068,8 +1132,6 @@ public class I2PSnarkServlet extends BasicServlet { boolean isMultiFile = isValid && meta.getFiles() != null; String err = snark.getTrackerProblems(); - int curPeers = snark.getPeerCount(); - stats[4] += curPeers; int knownPeers = Math.max(curPeers, snark.getTrackerSeenPeers()); String rowClass = (row % 2 == 0 ? "snarkTorrentEven" : "snarkTorrentOdd"); diff --git a/installer/resources/themes/snark/light/images/control_fastforward_blue.png b/installer/resources/themes/snark/light/images/control_fastforward_blue.png new file mode 100644 index 000000000..4a2f9d4e4 Binary files /dev/null and b/installer/resources/themes/snark/light/images/control_fastforward_blue.png differ diff --git a/installer/resources/themes/snark/light/images/control_rewind_blue.png b/installer/resources/themes/snark/light/images/control_rewind_blue.png new file mode 100644 index 000000000..15d1584bd Binary files /dev/null and b/installer/resources/themes/snark/light/images/control_rewind_blue.png differ diff --git a/installer/resources/themes/snark/ubergine/images/control_fastforward_blue.png b/installer/resources/themes/snark/ubergine/images/control_fastforward_blue.png new file mode 100644 index 000000000..4a2f9d4e4 Binary files /dev/null and b/installer/resources/themes/snark/ubergine/images/control_fastforward_blue.png differ diff --git a/installer/resources/themes/snark/ubergine/images/control_rewind_blue.png b/installer/resources/themes/snark/ubergine/images/control_rewind_blue.png new file mode 100644 index 000000000..15d1584bd Binary files /dev/null and b/installer/resources/themes/snark/ubergine/images/control_rewind_blue.png differ diff --git a/installer/resources/themes/snark/vanilla/images/control_fastforward_blue.png b/installer/resources/themes/snark/vanilla/images/control_fastforward_blue.png new file mode 100644 index 000000000..4a2f9d4e4 Binary files /dev/null and b/installer/resources/themes/snark/vanilla/images/control_fastforward_blue.png differ diff --git a/installer/resources/themes/snark/vanilla/images/control_rewind_blue.png b/installer/resources/themes/snark/vanilla/images/control_rewind_blue.png new file mode 100644 index 000000000..15d1584bd Binary files /dev/null and b/installer/resources/themes/snark/vanilla/images/control_rewind_blue.png differ