Changeset 287f94a


Ignore:
Timestamp:
Sep 19, 2015 5:05:09 PM (4 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
2a3b55f
Parents:
462c882
Message:

i2psnark: Add recheck/start/stop buttons to details page (ticket #372)
remove dup CSS item

Files:
8 edited

Legend:

Unmodified
Added
Removed
  • apps/i2psnark/java/src/org/klomp/snark/Snark.java

    r462c882 r287f94a  
    12651265  public void setWantedPieces(Storage storage)
    12661266  {
    1267     coordinator.setWantedPieces();
     1267    if (coordinator != null)
     1268        coordinator.setWantedPieces();
    12681269  }
    12691270
  • apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java

    r462c882 r287f94a  
    99import java.io.OutputStream;
    1010import java.io.Serializable;
     11import java.text.DecimalFormat;
    1112import java.util.ArrayList;
    1213import java.util.Arrays;
     
    23652366        for (Snark snark : _snarks.values()) {
    23662367            if (DataHelper.eq(infoHash, snark.getInfoHash())) {
    2367                 if (snark.isStarting() || !snark.isStopped()) {
    2368                     addMessage("Torrent already started");
    2369                     return;
    2370                 }
    2371                 boolean connected = _util.connected();
    2372                 if ((!connected) && !_util.isConnecting())
    2373                     addMessage(_("Opening the I2P tunnel"));
    2374                 addMessage(_("Starting up torrent {0}", snark.getBaseName()));
    2375                 if (connected) {
    2376                     snark.startTorrent();
    2377                 } else {
    2378                     // mark it for the UI
    2379                     snark.setStarting();
    2380                     (new I2PAppThread(new ThreadedStarter(snark), "TorrentStarter", true)).start();
    2381                     try { Thread.sleep(200); } catch (InterruptedException ie) {}
    2382                 }
     2368                startTorrent(snark);
    23832369                return;
    23842370            }
    23852371        }
    23862372        addMessage("Torrent not found?");
     2373    }
     2374
     2375    /**
     2376     *  If not connected, thread it, otherwise inline
     2377     *  @since 0.9.23
     2378     */
     2379    public void startTorrent(Snark snark) {
     2380        if (snark.isStarting() || !snark.isStopped()) {
     2381            addMessage("Torrent already started");
     2382            return;
     2383        }
     2384        boolean connected = _util.connected();
     2385        if ((!connected) && !_util.isConnecting())
     2386            addMessage(_("Opening the I2P tunnel"));
     2387        addMessage(_("Starting up torrent {0}", snark.getBaseName()));
     2388        if (connected) {
     2389            snark.startTorrent();
     2390        } else {
     2391            // mark it for the UI
     2392            snark.setStarting();
     2393            (new I2PAppThread(new ThreadedStarter(snark), "TorrentStarter", true)).start();
     2394            try { Thread.sleep(200); } catch (InterruptedException ie) {}
     2395        }
    23872396    }
    23882397
     
    24992508        }
    25002509    }
     2510
     2511    /**
     2512     *  Threaded. Torrent must be stopped.
     2513     *  @since 0.9.23
     2514     */
     2515    public void recheckTorrent(Snark snark) {
     2516        if (snark.isStarting() || !snark.isStopped()) {
     2517            addMessage("Cannot check " + snark.getBaseName() + ", torrent already started");
     2518            return;
     2519        }
     2520        Storage storage = snark.getStorage();
     2521        if (storage == null) {
     2522            addMessage("Cannot check " + snark.getBaseName() + ", no storage");
     2523            return;
     2524        }
     2525        (new I2PAppThread(new ThreadedRechecker(snark), "TorrentRechecker", true)).start();
     2526        try { Thread.sleep(200); } catch (InterruptedException ie) {}
     2527    }
     2528
     2529    /**
     2530     *  @since 0.9.23
     2531     */
     2532    private class ThreadedRechecker implements Runnable {
     2533        private final Snark snark;
     2534        /** must have non-null storage */
     2535        public ThreadedRechecker(Snark s) { snark = s; }
     2536        public void run() {
     2537            try {
     2538                if (_log.shouldWarn())
     2539                    _log.warn("Starting recheck of " + snark.getBaseName());
     2540                boolean changed = snark.getStorage().recheck();
     2541                if (changed)
     2542                    updateStatus(snark);
     2543                if (_log.shouldWarn())
     2544                    _log.warn("Finished recheck of " + snark.getBaseName() + " changed? " + changed);
     2545                if (changed) {
     2546                    int pieces = snark.getPieces();
     2547                    double completion = (pieces - snark.getNeeded()) / (double) pieces;
     2548                    String complete = (new DecimalFormat("0.00%")).format(completion);
     2549                    addMessage(_("Finished recheck of torrent {0}, now {1} complete", snark.getBaseName(), complete));
     2550                } else {
     2551                    addMessage(_("Finished recheck of torrent {0}, unchanged", snark.getBaseName()));
     2552                }
     2553            } catch (Exception e) {
     2554                _log.error("Error rechecking " + snark.getBaseName(), e);
     2555                addMessage(_("Error checking the torrent {0}", snark.getBaseName()) + ": " + e);
     2556            }
     2557        }
     2558    }
    25012559   
    25022560    /**
  • apps/i2psnark/java/src/org/klomp/snark/Storage.java

    r462c882 r287f94a  
    534534   * Creates (and/or checks) all files from the metainfo file list.
    535535   * Only call this once, and only after the constructor with the metainfo.
     536   * Use recheck() to check again later.
     537   *
     538   * @throws IllegalStateException if called more than once
    536539   */
    537540  public void check() throws IOException
     
    544547   * Use a saved bitfield and timestamp from a config file.
    545548   * Only call this once, and only after the constructor with the metainfo.
     549   * Use recheck() to check again later.
     550   *
     551   * @throws IllegalStateException if called more than once
    546552   */
    547553  public void check(long savedTime, BitField savedBitField) throws IOException
     
    820826      }
    821827      return rv;
     828  }
     829
     830  /**
     831   *  Blocking. Holds lock.
     832   *  Recommend running only when stopped.
     833   *  Caller should thread.
     834   *  Calls listener.setWantedPieces() on completion if anything changed.
     835   *
     836   *  @return true if anything changed, false otherwise
     837   *  @since 0.9.23
     838   */
     839  public boolean recheck() throws IOException {
     840      int previousNeeded = needed;
     841      checkCreateFiles(true);
     842      boolean changed = previousNeeded != needed;
     843      if (listener != null && changed)
     844          listener.setWantedPieces(this);
     845      return changed;
    822846  }
    823847
  • apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java

    r462c882 r287f94a  
    26142614            if (val != null) {
    26152615                String nonce = val[0];
    2616                 if (String.valueOf(_nonce).equals(nonce))
    2617                     savePriorities(snark, postParams);
    2618                 else
     2616                if (String.valueOf(_nonce).equals(nonce)) {
     2617                    if (postParams.get("savepri") != null) {
     2618                        savePriorities(snark, postParams);
     2619                    } else if (postParams.get("stop") != null) {
     2620                        _manager.stopTorrent(snark, false);
     2621                    } else if (postParams.get("start") != null) {
     2622                        _manager.startTorrent(snark);
     2623                    } else if (postParams.get("recheck") != null) {
     2624                        _manager.recheckTorrent(snark);
     2625                    } else {
     2626                        _manager.addMessage("Unknown command");
     2627                    }
     2628                } else {
    26192629                    _manager.addMessage("Please retry form submission (bad nonce)");
     2630                }
    26202631            }
    26212632            return null;
     
    26402651        }
    26412652
     2653        boolean showStopStart = snark != null;
    26422654        boolean showPriority = snark != null && snark.getStorage() != null && !snark.getStorage().complete() &&
    26432655                               r.isDirectory();
     
    26692681        if (parent)  // always true
    26702682            buf.append("<div class=\"page\"><div class=\"mainsection\">");
    2671         if (showPriority) {
     2683        // for stop/start/check
     2684        if (showStopStart || showPriority) {
    26722685            buf.append("<form action=\"").append(base).append("\" method=\"POST\">\n");
    26732686            buf.append("<input type=\"hidden\" name=\"nonce\" value=\"").append(_nonce).append("\" >\n");
     
    29062919               .append(formatSize(snark.getPieceLength(0)))
    29072920               .append("</td></tr>\n");
     2921
     2922            // buttons
     2923            if (showStopStart) {
     2924                buf.append("<tr><td>");
     2925                toThemeImg(buf, "file");
     2926                if (snark.isChecking()) {
     2927                    buf.append("&nbsp;<b>").append(_("Checking")).append("&hellip;</b>&nbsp;&nbsp;&nbsp;")
     2928                       .append("<a href=\"").append(base).append("\">")
     2929                       .append(_("Refresh page for results")).append("</a>");
     2930                } else if (snark.isStarting()) {
     2931                    buf.append("&nbsp;<b>").append(_("Starting")).append("&hellip;</b>");
     2932                } else if (snark.isAllocating()) {
     2933                    buf.append("&nbsp;<b>").append(_("Allocating")).append("&hellip;</b>");
     2934                } else {
     2935                    boolean isRunning = !snark.isStopped();
     2936                    buf.append(" <input type=\"submit\" value=\"");
     2937                    if (isRunning)
     2938                        buf.append(_("Stop")).append("\" name=\"stop\" class=\"stoptorrent\">\n");
     2939                    else
     2940                        buf.append(_("Start")).append("\" name=\"start\" class=\"starttorrent\">\n");
     2941                    buf.append("&nbsp;&nbsp;&nbsp;<input type=\"submit\" name=\"recheck\" value=\"").append(_("Force Recheck"));
     2942                    if (isRunning)
     2943                        buf.append("\" class=\"disabled\" disabled=\"disabled\">\n");
     2944                    else
     2945                        buf.append("\" class=\"reload\">\n");
     2946                }
     2947                buf.append("</td></tr>\n");
     2948            }
    29082949        } else {
     2950            // snark == null
    29092951            // shouldn't happen
    29102952            buf.append("<tr><th>Not found<br>resource=\"").append(r.toString())
     
    31593201        }
    31603202        buf.append("</table>\n");
    3161         if (showPriority)
     3203        // for stop/start/check
     3204        if (showStopStart || showPriority)
    31623205            buf.append("</form>");
    31633206        buf.append("</div></div></BODY></HTML>\n");
  • history.txt

    r462c882 r287f94a  
     12015-09-19 zzz
     2 * i2psnark: Add recheck/start/stop buttons to details page (ticket #372)
     3
    142015-09-18 zzz
    25 * EepGet:
  • installer/resources/themes/snark/ubergine/snark.css

    r462c882 r287f94a  
    657657}
    658658
     659input.cancel {
     660     background: #989 url('../../console/images/cancel.png') no-repeat 2px center;
     661     padding: 2px 3px 2px 20px !important;
     662     min-height: 22px;
     663}
     664
    659665input.create {
    660666     background: #989 url('images/create.png') no-repeat 2px center;
     
    663669}
    664670
    665 input.cancel {
    666      background: #989 url('../../console/images/cancel.png') no-repeat 2px center;
    667      padding: 2px 3px 2px 20px !important;
    668      min-height: 22px;
    669 }
    670 
    671 input.create {
    672      background: #989 url('images/create.png') no-repeat 2px center;
    673      padding: 2px 3px 2px 20px !important;
    674      min-height: 22px;
    675 }
    676 
    677671input.delete {
    678672     background: #989 url('../../console/images/delete.png') no-repeat 2px center;
     
    683677input.reload {
    684678     background: #989 url('../../console/images/arrow_refresh.png') no-repeat 2px center;
     679     padding: 2px 3px 2px 20px !important;
     680     min-height: 22px;
     681}
     682
     683input.starttorrent {
     684     background: #989 url('images/start.png') no-repeat 2px center;
     685     padding: 2px 3px 2px 20px !important;
     686     min-height: 22px;
     687}
     688
     689input.stoptorrent {
     690     background: #989 url('images/stop.png') no-repeat 2px center;
    685691     padding: 2px 3px 2px 20px !important;
    686692     min-height: 22px;
  • installer/resources/themes/snark/vanilla/snark.css

    r462c882 r287f94a  
    695695}
    696696
     697input.starttorrent {
     698     background: #f3efc7 url('images/start.png') no-repeat 2px center;
     699     padding: 2px 3px 2px 20px !important;
     700     min-height: 22px;
     701}
     702
     703input.stoptorrent {
     704     background: #f3efc7 url('images/stop.png') no-repeat 2px center;
     705     padding: 2px 3px 2px 20px !important;
     706     min-height: 22px;
     707}
     708
    697709select {
    698710     background: #fff;
  • router/java/src/net/i2p/router/RouterVersion.java

    r462c882 r287f94a  
    1919    public final static String ID = "Monotone";
    2020    public final static String VERSION = CoreVersion.VERSION;
    21     public final static long BUILD = 6;
     21    public final static long BUILD = 7;
    2222
    2323    /** for example "-test" */
Note: See TracChangeset for help on using the changeset viewer.