Changeset 4b3ccab
- Timestamp:
- Jun 18, 2012 9:07:34 PM (9 years ago)
- Branches:
- master
- Children:
- d368937b
- Parents:
- 4dcfe3e
- 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 56 56 private int _i2cpPort; 57 57 private final Map<String, String> _opts; 58 private I2PSocketManager _manager;58 private volatile I2PSocketManager _manager; 59 59 private boolean _configured; 60 private volatile boolean _connecting; 60 61 private final Set<Hash> _shitlist; 61 62 private int _maxUploaders; … … 199 200 synchronized public boolean connect() { 200 201 if (_manager == null) { 202 _connecting = true; 201 203 // try to find why reconnecting after stop 202 204 if (_log.shouldLog(Log.DEBUG)) … … 238 240 opts.setProperty("i2p.streaming.maxConnsPerHour", "20"); 239 241 _manager = I2PSocketManagerFactory.createManager(_i2cpHost, _i2cpPort, opts); 242 _connecting = false; 240 243 } 241 244 // FIXME this only instantiates krpc once, left stuck with old manager … … 252 255 253 256 public boolean connected() { return _manager != null; } 257 258 /** @since 0.9.1 */ 259 public boolean isConnecting() { return _manager == null && _connecting; } 254 260 255 261 /** -
apps/i2psnark/java/src/org/klomp/snark/Snark.java
r4dcfe3e r4b3ccab 251 251 private final CompleteListener completeListener; 252 252 private boolean stopped; 253 private boolean starting; 253 254 private byte[] id; 254 255 private byte[] infoHash; … … 510 511 511 512 /** 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. 513 515 */ 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() { 515 526 boolean ok = _util.connect(); 516 527 if (!ok) fatal("Unable to connect to I2P"); … … 586 597 * @since 0.9.1 587 598 */ 588 public void stopTorrent(boolean fast) {599 public synchronized void stopTorrent(boolean fast) { 589 600 stopped = true; 590 601 TrackerClient tc = trackerclient; … … 679 690 public boolean isStopped() { 680 691 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; 681 708 } 682 709 -
apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java
r4dcfe3e r4b3ccab 868 868 addMessage(_("Fetching {0}", name)); 869 869 boolean haveSavedPeers = false; 870 if (( !util().connected()) && !haveSavedPeers) {870 if ((_util.connected()) && !haveSavedPeers) { 871 871 addMessage(_("We have no saved peers and no other torrents are running. " + 872 872 "Fetch of {0} will not succeed until you start another torrent.", name)); … … 1601 1601 1602 1602 /** 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 /** 1603 1678 * Stop all running torrents, and close the tunnel after a delay 1604 1679 * to allow for announces. … … 1632 1707 // that it's just this webapp that is stopping. 1633 1708 SimpleScheduler.getInstance().addEvent(new Disconnector(), 60*1000); 1634 addMessage(_("Closing I2P tunnel after announces totrackers."));1709 addMessage(_("Closing I2P tunnel after notifying trackers.")); 1635 1710 if (finalShutdown) { 1636 1711 try { Thread.sleep(5*1000); } catch (InterruptedException ie) {} -
apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
r4dcfe3e r4b3ccab 423 423 if (isDegraded) 424 424 out.write("</a>"); 425 } else if ( !snarks.isEmpty()) {425 } else if ((!_manager.util().isConnecting()) && !snarks.isEmpty()) { 426 426 if (isDegraded) 427 427 out.write("<a href=\"/i2psnark/?action=StartAll&nonce=" + _nonce + "\"><img title=\""); … … 574 574 byte infoHash[] = Base64.decode(torrent); 575 575 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); 584 577 } 585 578 } … … 748 741 _manager.stopAllTorrents(false); 749 742 } 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(); 757 744 } else if ("Clear".equals(action)) { 758 745 _manager.clearMessages(); … … 990 977 "<br>" + err; 991 978 } 979 } else if (snark.isStarting()) { 980 statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "stalled.png\" ></td><td class=\"snarkTorrentStatus " + rowClass + "\">" + _("Starting"); 992 981 } else if (remaining == 0 || needed == 0) { // < 0 means no meta size yet 993 982 // partial complete or seeding … … 1142 1131 parameters = parameters + "&p=1"; 1143 1132 if (isRunning) { 1133 // Stop Button 1144 1134 if (isDegraded) 1145 1135 out.write("<a href=\"/i2psnark/?action=Stop_" + b64 + "&nonce=" + _nonce + "\"><img title=\""); … … 1152 1142 if (isDegraded) 1153 1143 out.write("</a>"); 1154 } else { 1144 } else if (!snark.isStarting()) { 1145 // Start Button 1155 1146 // This works in Opera but it's displayed a little differently, so use noThinsp here too so all 3 icons are consistent 1156 1147 if (noThinsp) … … 1166 1157 1167 1158 if (isValid) { 1159 // Remove Button 1168 1160 // Doesnt work with Opera so use noThinsp instead of isDegraded 1169 1161 if (noThinsp) … … 1185 1177 } 1186 1178 1179 // Delete Button 1187 1180 // Doesnt work with Opera so use noThinsp instead of isDegraded 1188 1181 if (noThinsp)
Note: See TracChangeset
for help on using the changeset viewer.