Changeset 4b3ccab


Ignore:
Timestamp:
Jun 18, 2012 9:07:34 PM (8 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
d368937b
Parents:
4dcfe3e
Message:
  • Thread task to open tunnel and improve UI feedback while open is pending
Location:
apps/i2psnark/java/src/org/klomp/snark
Files:
4 edited

Legend:

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

    r4dcfe3e r4b3ccab  
    5656    private int _i2cpPort;
    5757    private final Map<String, String> _opts;
    58     private I2PSocketManager _manager;
     58    private volatile I2PSocketManager _manager;
    5959    private boolean _configured;
     60    private volatile boolean _connecting;
    6061    private final Set<Hash> _shitlist;
    6162    private int _maxUploaders;
     
    199200    synchronized public boolean connect() {
    200201        if (_manager == null) {
     202            _connecting = true;
    201203            // try to find why reconnecting after stop
    202204            if (_log.shouldLog(Log.DEBUG))
     
    238240                opts.setProperty("i2p.streaming.maxConnsPerHour", "20");
    239241            _manager = I2PSocketManagerFactory.createManager(_i2cpHost, _i2cpPort, opts);
     242            _connecting = false;
    240243        }
    241244        // FIXME this only instantiates krpc once, left stuck with old manager
     
    252255
    253256    public boolean connected() { return _manager != null; }
     257
     258    /** @since 0.9.1 */
     259    public boolean isConnecting() { return _manager == null && _connecting; }
    254260
    255261    /**
  • apps/i2psnark/java/src/org/klomp/snark/Snark.java

    r4dcfe3e r4b3ccab  
    251251  private final CompleteListener completeListener;
    252252  private boolean stopped;
     253  private boolean starting;
    253254  private byte[] id;
    254255  private byte[] infoHash;
     
    510511
    511512  /**
    512    * Start up contacting peers and querying the tracker
     513   * Start up contacting peers and querying the tracker.
     514   * Blocks if tunnel is not yet open.
    513515   */
    514   public void startTorrent() {
     516  public synchronized void startTorrent() {
     517      starting = true;
     518      try {
     519          x_startTorrent();
     520      } finally {
     521          starting = false;
     522      }
     523  }
     524
     525  private void x_startTorrent() {
    515526    boolean ok = _util.connect();
    516527    if (!ok) fatal("Unable to connect to I2P");
     
    586597   * @since 0.9.1
    587598   */
    588   public void stopTorrent(boolean fast) {
     599  public synchronized void stopTorrent(boolean fast) {
    589600    stopped = true;
    590601    TrackerClient tc = trackerclient;
     
    679690    public boolean isStopped() {
    680691        return stopped;
     692    }
     693
     694    /**
     695     *  Startup in progress.
     696     *  @since 0.9.1
     697     */
     698    public boolean isStarting() {
     699        return starting && stopped;
     700    }
     701
     702    /**
     703     *  Set startup in progress.
     704     *  @since 0.9.1
     705     */
     706    public void setStarting() {
     707        starting = true;
    681708    }
    682709
  • apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java

    r4dcfe3e r4b3ccab  
    868868            addMessage(_("Fetching {0}", name));
    869869            boolean haveSavedPeers = false;
    870             if ((!util().connected()) && !haveSavedPeers) {
     870            if ((_util.connected()) && !haveSavedPeers) {
    871871                addMessage(_("We have no saved peers and no other torrents are running. " +
    872872                             "Fetch of {0} will not succeed until you start another torrent.", name));
     
    16011601
    16021602    /**
     1603     *  If not connected, thread it, otherwise inline
     1604     *  @since 0.9.1
     1605     */
     1606    public void startTorrent(byte[] infoHash) {
     1607        for (Snark snark : _snarks.values()) {
     1608            if (DataHelper.eq(infoHash, snark.getInfoHash())) {
     1609                if (snark.isStarting() || !snark.isStopped()) {
     1610                    addMessage("Torrent already started");
     1611                    return;
     1612                }
     1613                boolean connected = _util.connected();
     1614                if ((!connected) && !_util.isConnecting())
     1615                    addMessage(_("Opening the I2P tunnel"));
     1616                addMessage(_("Starting up torrent {0}", snark.getBaseName()));
     1617                if (connected) {
     1618                    snark.startTorrent();
     1619                } else {
     1620                    // mark it for the UI
     1621                    snark.setStarting();
     1622                    (new I2PAppThread(new ThreadedStarter(snark), "TorrentStarter", true)).start();
     1623                    try { Thread.sleep(200); } catch (InterruptedException ie) {}
     1624                }
     1625                return;
     1626            }
     1627        }
     1628        addMessage("Torrent not found?");
     1629    }
     1630
     1631    /**
     1632     *  If not connected, thread it, otherwise inline
     1633     *  @since 0.9.1
     1634     */
     1635    public void startAllTorrents() {
     1636        if (_util.connected()) {
     1637            startAll();
     1638        } else {
     1639            addMessage(_("Opening the I2P tunnel and starting all torrents."));
     1640            for (Snark snark : _snarks.values()) {
     1641                // mark it for the UI
     1642                snark.setStarting();
     1643            }
     1644            (new I2PAppThread(new ThreadedStarter(null), "TorrentStarterAll", true)).start();
     1645            try { Thread.sleep(200); } catch (InterruptedException ie) {}
     1646        }
     1647    }
     1648
     1649    /**
     1650     *  Use null constructor param for all
     1651     *  @since 0.9.1
     1652     */
     1653    private class ThreadedStarter implements Runnable {
     1654        private final Snark snark;
     1655        public ThreadedStarter(Snark s) { snark = s; }
     1656        public void run() {
     1657            if (snark != null) {
     1658                if (snark.isStopped())
     1659                    snark.startTorrent();
     1660            } else {
     1661                startAll();
     1662            }
     1663        }
     1664    }
     1665
     1666    /**
     1667     *  Inline
     1668     *  @since 0.9.1
     1669     */
     1670    private void startAll() {
     1671        for (Snark snark : _snarks.values()) {
     1672            if (snark.isStopped())
     1673                snark.startTorrent();
     1674        }
     1675    }
     1676
     1677    /**
    16031678     * Stop all running torrents, and close the tunnel after a delay
    16041679     * to allow for announces.
     
    16321707                // that it's just this webapp that is stopping.
    16331708                SimpleScheduler.getInstance().addEvent(new Disconnector(), 60*1000);
    1634                 addMessage(_("Closing I2P tunnel after announces to trackers."));
     1709                addMessage(_("Closing I2P tunnel after notifying trackers."));
    16351710                if (finalShutdown) {
    16361711                    try { Thread.sleep(5*1000); } catch (InterruptedException ie) {}
  • apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java

    r4dcfe3e r4b3ccab  
    423423            if (isDegraded)
    424424                out.write("</a>");
    425         } else if (!snarks.isEmpty()) {
     425        } else if ((!_manager.util().isConnecting()) && !snarks.isEmpty()) {
    426426            if (isDegraded)
    427427                out.write("<a href=\"/i2psnark/?action=StartAll&amp;nonce=" + _nonce + "\"><img title=\"");
     
    574574                byte infoHash[] = Base64.decode(torrent);
    575575                if ( (infoHash != null) && (infoHash.length == 20) ) { // valid sha1
    576                     for (String name : _manager.listTorrentFiles()) {
    577                         Snark snark = _manager.getTorrent(name);
    578                         if ( (snark != null) && (DataHelper.eq(infoHash, snark.getInfoHash())) ) {
    579                             snark.startTorrent();
    580                             _manager.addMessage(_("Starting up torrent {0}", snark.getBaseName()));
    581                             break;
    582                         }
    583                     }
     576                    _manager.startTorrent(infoHash);
    584577                }
    585578            }
     
    748741            _manager.stopAllTorrents(false);
    749742        } else if ("StartAll".equals(action)) {
    750             _manager.addMessage(_("Opening the I2P tunnel and starting all torrents."));
    751             List<Snark> snarks = getSortedSnarks(req);
    752             for (int i = 0; i < snarks.size(); i++) {
    753                 Snark snark = snarks.get(i);
    754                 if (snark.isStopped())
    755                     snark.startTorrent();
    756             }
     743            _manager.startAllTorrents();
    757744        } else if ("Clear".equals(action)) {
    758745            _manager.clearMessages();
     
    990977                "<br>" + err;
    991978            }
     979        } else if (snark.isStarting()) {
     980            statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "stalled.png\" ></td><td class=\"snarkTorrentStatus " + rowClass + "\">" + _("Starting");
    992981        } else if (remaining == 0 || needed == 0) {  // < 0 means no meta size yet
    993982            // partial complete or seeding
     
    11421131            parameters = parameters + "&p=1";
    11431132        if (isRunning) {
     1133            // Stop Button
    11441134            if (isDegraded)
    11451135                out.write("<a href=\"/i2psnark/?action=Stop_" + b64 + "&amp;nonce=" + _nonce + "\"><img title=\"");
     
    11521142            if (isDegraded)
    11531143                out.write("</a>");
    1154         } else {
     1144        } else if (!snark.isStarting()) {
     1145                // Start Button
    11551146                // This works in Opera but it's displayed a little differently, so use noThinsp here too so all 3 icons are consistent
    11561147                if (noThinsp)
     
    11661157
    11671158            if (isValid) {
     1159                // Remove Button
    11681160                // Doesnt work with Opera so use noThinsp instead of isDegraded
    11691161                if (noThinsp)
     
    11851177            }
    11861178
     1179            // Delete Button
    11871180            // Doesnt work with Opera so use noThinsp instead of isDegraded
    11881181            if (noThinsp)
Note: See TracChangeset for help on using the changeset viewer.