Changeset 4899a6d


Ignore:
Timestamp:
Dec 19, 2010 10:14:02 PM (9 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
7602999
Parents:
afe5751
Message:

Refactor fields to private and replace with getters,
and lots of prep for lack of metainfo and storage.

Location:
apps/i2psnark/java/src/org/klomp/snark
Files:
8 edited

Legend:

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

    rafe5751 r4899a6d  
    121121                  {
    122122                    if (_log.shouldLog(Log.DEBUG))
    123                       _log.debug("Rejecting new peer for " + cur.snark.torrent);
     123                      _log.debug("Rejecting new peer for " + cur.getName());
    124124                    socket.close();
    125125                    return;
  • apps/i2psnark/java/src/org/klomp/snark/PeerCheckerTask.java

    rafe5751 r4899a6d  
    5252        List<Peer> peerList = coordinator.peerList();
    5353        if (peerList.isEmpty() || coordinator.halted()) {
    54           coordinator.peerCount = 0;
    55           coordinator.interestedAndChoking = 0;
    5654          coordinator.setRateHistory(0, 0);
    57           coordinator.uploaders = 0;
    5855          if (coordinator.halted())
    5956            cancel();
  • apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java

    rafe5751 r4899a6d  
    4343{
    4444  private final Log _log = I2PAppContext.getGlobalContext().logManager().getLog(PeerCoordinator.class);
     45
     46  /**
     47   * External use by PeerMonitorTask only.
     48   */
    4549  final MetaInfo metainfo;
     50
     51  /**
     52   * External use by PeerMonitorTask only.
     53   */
    4654  final Storage storage;
    47   final Snark snark;
     55  private final Snark snark;
    4856
    4957  // package local for access by CheckDownLoadersTask
     
    5159  final static int MAX_UPLOADERS = 6;
    5260
    53   // Approximation of the number of current uploaders.
    54   // Resynced by PeerChecker once in a while.
    55   int uploaders = 0;
    56   int interestedAndChoking = 0;
     61  /**
     62   * Approximation of the number of current uploaders.
     63   * Resynced by PeerChecker once in a while.
     64   * External use by PeerCheckerTask only.
     65   */
     66  int uploaders;
     67
     68  /**
     69   * External use by PeerCheckerTask only.
     70   */
     71  int interestedAndChoking;
    5772
    5873  // final static int MAX_DOWNLOADERS = MAX_CONNECTIONS;
     
    6277  private long downloaded;
    6378  final static int RATE_DEPTH = 3; // make following arrays RATE_DEPTH long
    64   private long uploaded_old[] = {-1,-1,-1};
    65   private long downloaded_old[] = {-1,-1,-1};
    66 
    67   // synchronize on this when changing peers or downloaders
    68   // This is a Queue, not a Set, because PeerCheckerTask keeps things in order for choking/unchoking
     79  private final long uploaded_old[] = {-1,-1,-1};
     80  private final long downloaded_old[] = {-1,-1,-1};
     81
     82  /**
     83   * synchronize on this when changing peers or downloaders.
     84   * This is a Queue, not a Set, because PeerCheckerTask keeps things in order for choking/unchoking.
     85   * External use by PeerMonitorTask only.
     86   */
    6987  final Queue<Peer> peers;
     88
    7089  /** estimate of the peers, without requiring any synchronization */
    71   volatile int peerCount;
     90  private volatile int peerCount;
    7291
    7392  /** Timer to handle all periodical tasks. */
     
    87106
    88107  private final CoordinatorListener listener;
    89   public I2PSnarkUtil _util;
     108  private final I2PSnarkUtil _util;
    90109  private static final Random _random = I2PAppContext.getGlobalContext().random();
    91110 
    92   public String trackerProblems = null;
    93   public int trackerSeenPeers = 0;
    94 
    95111  public PeerCoordinator(I2PSnarkUtil util, byte[] id, MetaInfo metainfo, Storage storage,
    96112                         CoordinatorListener listener, Snark torrent)
     
    154170
    155171  public Storage getStorage() { return storage; }
    156   public CoordinatorListener getListener() { return listener; }
    157172
    158173  // for web page detailed stats
     
    165180  {
    166181    return id;
     182  }
     183
     184  public String getName()
     185  {
     186    return snark.getName();
    167187  }
    168188
     
    11081128  }
    11091129
     1130  /**
     1131   *  @return current
     1132   *  @since 0.8.4
     1133   */
     1134  public int getUploaders() {
     1135      return uploaders;
     1136  }
     1137
    11101138  public boolean overUpBWLimit()
    11111139  {
  • apps/i2psnark/java/src/org/klomp/snark/Snark.java

    rafe5751 r4899a6d  
    2727import java.io.InputStream;
    2828import java.io.InputStreamReader;
     29import java.util.Collections;
    2930import java.util.Iterator;
    3031import java.util.List;
     
    113114  }
    114115 
     116/******** No, not maintaining a command-line client
     117
    115118  public static void main(String[] args)
    116119  {
     
    236239  }
    237240
     241***********/
     242
    238243  public static final String PROP_MAX_CONNECTIONS = "i2psnark.maxConnections";
    239   public String torrent;
    240   public MetaInfo meta;
    241   public Storage storage;
    242   public PeerCoordinator coordinator;
    243   public ConnectionAcceptor acceptor;
    244   public TrackerClient trackerclient;
    245   public String rootDataDir = ".";
    246   public CompleteListener completeListener;
    247   public boolean stopped;
    248   byte[] id;
    249   public I2PSnarkUtil _util;
    250   private PeerCoordinatorSet _peerCoordinatorSet;
     244
     245  /** most of these used to be public, use accessors below instead */
     246  private final String torrent;
     247  private MetaInfo meta;
     248  private Storage storage;
     249  private PeerCoordinator coordinator;
     250  private ConnectionAcceptor acceptor;
     251  private TrackerClient trackerclient;
     252  private String rootDataDir = ".";
     253  private final CompleteListener completeListener;
     254  private boolean stopped;
     255  private byte[] id;
     256  private byte[] infoHash;
     257  private final I2PSnarkUtil _util;
     258  private final PeerCoordinatorSet _peerCoordinatorSet;
     259  private String trackerProblems;
     260  private int trackerSeenPeers;
     261
    251262
    252263  /** from main() via parseArguments() single torrent */
     
    487498            acceptor = new ConnectionAcceptor(_util, serversocket, new PeerAcceptor(coordinator));
    488499        }
    489         trackerclient = new TrackerClient(_util, meta, coordinator);
     500        trackerclient = new TrackerClient(_util, meta, coordinator, this);
    490501    }
    491502
     
    497508        if (_peerCoordinatorSet != null)
    498509            _peerCoordinatorSet.remove(coordinator);
    499         PeerCoordinator newCoord = new PeerCoordinator(_util, coordinator.getID(), coordinator.getMetaInfo(),
    500                                                        coordinator.getStorage(), coordinator.getListener(), this);
     510        PeerCoordinator newCoord = new PeerCoordinator(_util, id, meta, storage, this, this);
    501511        if (_peerCoordinatorSet != null)
    502512            _peerCoordinatorSet.add(newCoord);
     
    518528            fatal("Could not reopen storage", ioe);
    519529          }
    520         TrackerClient newClient = new TrackerClient(_util, coordinator.getMetaInfo(), coordinator);
     530        TrackerClient newClient = new TrackerClient(_util, coordinator.getMetaInfo(), coordinator, this);
    521531        if (!trackerclient.halted())
    522532            trackerclient.halt();
     
    554564  }
    555565
    556   static Snark parseArguments(String[] args)
     566  private static Snark parseArguments(String[] args)
    557567  {
    558568    return parseArguments(args, null, null);
    559569  }
     570
     571    // Accessors
     572
     573    /**
     574     *  @return file name of .torrent file (should be full absolute path), or a fake name if in magnet mode.
     575     *  @since 0.8.4
     576     */
     577    public String getName() {
     578        return torrent;
     579    }
     580
     581    /**
     582     *  @return base name of torrent [filtered version of getMetaInfo.getName()], or a fake name if in magnet mode
     583     *  @since 0.8.4
     584     */
     585    public String getBaseName() {
     586        if (storage != null)
     587            return storage.getBaseName();
     588        return torrent;
     589    }
     590
     591    /**
     592     *  @return always will be valid even in magnet mode
     593     *  @since 0.8.4
     594     */
     595    public byte[] getID() {
     596        return id;
     597    }
     598
     599    /**
     600     *  @return always will be valid even in magnet mode
     601     *  @since 0.8.4
     602     */
     603    public byte[] getInfoHash() {
     604        if (meta != null)
     605            return meta.getInfoHash();
     606        return infoHash;
     607    }
     608
     609    /**
     610     *  @return may be null if in magnet mode
     611     *  @since 0.8.4
     612     */
     613    public MetaInfo getMetaInfo() {
     614        return meta;
     615    }
     616
     617    /**
     618     *  @return may be null if in magnet mode
     619     *  @since 0.8.4
     620     */
     621    public Storage getStorage() {
     622        return storage;
     623    }
     624
     625    /**
     626     *  @since 0.8.4
     627     */
     628    public boolean isStopped() {
     629        return stopped;
     630    }
     631
     632    /**
     633     *  @since 0.8.4
     634     */
     635    public long getDownloadRate() {
     636        PeerCoordinator coord = coordinator;
     637        if (coord != null)
     638            return coord.getDownloadRate();
     639        return 0;
     640    }
     641
     642    /**
     643     *  @since 0.8.4
     644     */
     645    public long getUploadRate() {
     646        PeerCoordinator coord = coordinator;
     647        if (coord != null)
     648            return coord.getUploadRate();
     649        return 0;
     650    }
     651
     652    /**
     653     *  @since 0.8.4
     654     */
     655    public long getDownloaded() {
     656        PeerCoordinator coord = coordinator;
     657        if (coord != null)
     658            return coord.getDownloaded();
     659        return 0;
     660    }
     661
     662    /**
     663     *  @since 0.8.4
     664     */
     665    public long getUploaded() {
     666        PeerCoordinator coord = coordinator;
     667        if (coord != null)
     668            return coord.getUploaded();
     669        return 0;
     670    }
     671
     672    /**
     673     *  @since 0.8.4
     674     */
     675    public int getPeerCount() {
     676        PeerCoordinator coord = coordinator;
     677        if (coord != null)
     678            return coord.getPeerCount();
     679        return 0;
     680    }
     681
     682    /**
     683     *  @since 0.8.4
     684     */
     685    public List<Peer> getPeerList() {
     686        PeerCoordinator coord = coordinator;
     687        if (coord != null)
     688            return coord.peerList();
     689        return Collections.EMPTY_LIST;
     690    }
     691
     692    /**
     693     *  @return String returned from tracker, or null if no error
     694     *  @since 0.8.4
     695     */
     696    public String getTrackerProblems() {
     697        return trackerProblems;
     698    }
     699
     700    /**
     701     *  @param p tracker error string or null
     702     *  @since 0.8.4
     703     */
     704    public void setTrackerProblems(String p) {
     705        trackerProblems = p;
     706    }
     707
     708    /**
     709     *  @return count returned from tracker
     710     *  @since 0.8.4
     711     */
     712    public int getTrackerSeenPeers() {
     713        return trackerSeenPeers;
     714    }
     715
     716    /**
     717     *  @since 0.8.4
     718     */
     719    public void setTrackerSeenPeers(int p) {
     720        trackerSeenPeers = p;
     721    }
     722
     723    /**
     724     *  @since 0.8.4
     725     */
     726    public void updatePiecePriorities() {
     727        PeerCoordinator coord = coordinator;
     728        if (coord != null)
     729            coord.updatePiecePriorities();
     730    }
     731
     732    /**
     733     *  @return total of all torrent files, or total of metainfo file if fetching magnet, or -1
     734     *  @since 0.8.4
     735     */
     736    public long getTotalLength() {
     737        if (meta != null)
     738            return meta.getTotalLength();
     739        // FIXME else return metainfo length if available
     740        return -1;
     741    }
     742
     743    /**
     744     *  @return needed of all torrent files, or total of metainfo file if fetching magnet, or -1
     745     *  @since 0.8.4
     746     */
     747    public long getNeeded() {
     748        if (storage != null)
     749            return storage.needed();
     750        // FIXME else return metainfo length if available
     751        return -1;
     752    }
     753
     754    /**
     755     *  @param p the piece number
     756     *  @return metainfo piece length or 16K if fetching magnet
     757     *  @since 0.8.4
     758     */
     759    public int getPieceLength(int p) {
     760        if (meta != null)
     761            return meta.getPieceLength(p);
     762        return 16*1024;
     763    }
     764
     765    /**
     766     *  @return true if restarted
     767     *  @since 0.8.4
     768     */
     769    public boolean restartAcceptor() {
     770        if (acceptor == null)
     771            return false;
     772        acceptor.restart();
     773        return true;
     774    }
    560775
    561776  /**
     
    565780   * passed to all components that take one.
    566781   */
    567   static Snark parseArguments(String[] args,
     782  private static Snark parseArguments(String[] args,
    568783                              StorageListener slistener,
    569784                              CoordinatorListener clistener)
     
    720935   * Aborts program abnormally.
    721936   */
    722   public void fatal(String s)
     937  private void fatal(String s)
    723938  {
    724939    fatal(s, null);
     
    728943   * Aborts program abnormally.
    729944   */
    730   public void fatal(String s, Throwable t)
     945  private void fatal(String s, Throwable t)
    731946  {
    732947    _util.debug(s, ERROR, t);
     
    752967  }
    753968 
    754   boolean allocating = false;
     969  private boolean allocating = false;
    755970  public void storageCreateFile(Storage storage, String name, long length)
    756971  {
     
    775990  }
    776991
    777   boolean allChecked = false;
    778   boolean checking = false;
    779   boolean prechecking = true;
     992  private boolean allChecked = false;
     993  private boolean checking = false;
     994  private boolean prechecking = true;
    780995  public void storageChecked(Storage storage, int num, boolean checked)
    781996  {
  • apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java

    rafe5751 r4899a6d  
    360360                for (Iterator iter = names.iterator(); iter.hasNext(); ) {
    361361                    Snark snark = getTorrent((String)iter.next());
    362                     if ( (snark != null) && (!snark.stopped) ) {
     362                    if ( (snark != null) && (!snark.isStopped()) ) {
    363363                        snarksActive = true;
    364364                        break;
     
    399399                            String name = (String)iter.next();
    400400                            Snark snark = getTorrent(name);
    401                             if ( (snark != null) && (snark.acceptor != null) ) {
    402                                 snark.acceptor.restart();
    403                                 addMessage(_("I2CP listener restarted for \"{0}\"", snark.meta.getName()));
     401                            if (snark != null && snark.restartAcceptor()) {
     402                                addMessage(_("I2CP listener restarted for \"{0}\"", snark.getBaseName()));
    404403                            }
    405404                        }
     
    479478        synchronized (_snarks) {
    480479            for (Snark s : _snarks.values()) {
    481                 if (s.storage.getBaseName().equals(filename))
     480                if (s.getBaseName().equals(filename))
    482481                    return s;
    483482            }
     
    555554                                            false, dataDir.getPath());
    556555                        loadSavedFilePriorities(torrent);
    557                         torrent.completeListener = this;
    558556                        synchronized (_snarks) {
    559557                            _snarks.put(filename, torrent);
     
    573571        }
    574572        // ok, snark created, now lets start it up or configure it further
    575         File f = new File(filename);
    576573        if (!dontAutoStart && shouldAutoStart()) {
    577574            torrent.startTorrent();
    578             addMessage(_("Torrent added and started: \"{0}\"", torrent.storage.getBaseName()));
     575            addMessage(_("Torrent added and started: \"{0}\"", torrent.getBaseName()));
    579576        } else {
    580             addMessage(_("Torrent added: \"{0}\"", torrent.storage.getBaseName()));
     577            addMessage(_("Torrent added: \"{0}\"", torrent.getBaseName()));
    581578        }
    582579    }
     
    586583     */
    587584    public long getSavedTorrentTime(Snark snark) {
    588         MetaInfo metainfo = snark.meta;
    589         byte[] ih = metainfo.getInfoHash();
     585        byte[] ih = snark.getInfoHash();
    590586        String infohash = Base64.encode(ih);
    591587        infohash = infohash.replace('=', '$');
     
    606602     */
    607603    public BitField getSavedTorrentBitField(Snark snark) {
    608         MetaInfo metainfo = snark.meta;
    609         byte[] ih = metainfo.getInfoHash();
     604        MetaInfo metainfo = snark.getMetaInfo();
     605        if (metainfo == null)
     606            return null;
     607        byte[] ih = snark.getInfoHash();
    610608        String infohash = Base64.encode(ih);
    611609        infohash = infohash.replace('=', '$');
     
    637635     */
    638636    public void loadSavedFilePriorities(Snark snark) {
    639         MetaInfo metainfo = snark.meta;
     637        MetaInfo metainfo = snark.getMetaInfo();
     638        Storage storage = snark.getStorage();
     639        if (metainfo == null || storage == null)
     640            return;
    640641        if (metainfo.getFiles() == null)
    641642            return;
    642         byte[] ih = metainfo.getInfoHash();
     643        byte[] ih = snark.getInfoHash();
    643644        String infohash = Base64.encode(ih);
    644645        infohash = infohash.replace('=', '$');
     
    656657            }
    657658        }
    658         snark.storage.setFilePriorities(rv);
     659        storage.setFilePriorities(rv);
    659660    }
    660661   
     
    778779        }
    779780        if (torrent != null) {
    780             boolean wasStopped = torrent.stopped;
     781            boolean wasStopped = torrent.isStopped();
    781782            torrent.stopTorrent();
    782783            if (remaining == 0) {
     
    785786                ////_util.
    786787            }
    787             String name;
    788             if (torrent.storage != null) {
    789                 name = torrent.storage.getBaseName();
    790             } else {
    791                 name = sfile.getName();
    792             }
    793788            if (!wasStopped)
    794                 addMessage(_("Torrent stopped: \"{0}\"", name));
     789                addMessage(_("Torrent stopped: \"{0}\"", torrent.getBaseName()));
    795790        }
    796791        return torrent;
     
    805800            File torrentFile = new File(filename);
    806801            torrentFile.delete();
    807             String name;
    808             if (torrent.storage != null) {
    809                 removeTorrentStatus(torrent.storage.getMetaInfo());
    810                 name = torrent.storage.getBaseName();
    811             } else {
    812                 name = torrentFile.getName();
    813             }
    814             addMessage(_("Torrent removed: \"{0}\"", name));
     802            Storage storage = torrent.getStorage();
     803            if (storage != null)
     804                removeTorrentStatus(storage.getMetaInfo());
     805            addMessage(_("Torrent removed: \"{0}\"", torrent.getBaseName()));
    815806        }
    816807    }
     
    844835    /** two listeners */
    845836    public void torrentComplete(Snark snark) {
     837        MetaInfo meta = snark.getMetaInfo();
     838        Storage storage = snark.getStorage();
     839        if (meta == null || storage == null)
     840            return;
    846841        StringBuilder buf = new StringBuilder(256);
    847         buf.append("<a href=\"/i2psnark/").append(snark.storage.getBaseName());
    848         if (snark.meta.getFiles() != null)
     842        buf.append("<a href=\"/i2psnark/").append(storage.getBaseName());
     843        if (meta.getFiles() != null)
    849844            buf.append('/');
    850         buf.append("\">").append(snark.storage.getBaseName()).append("</a>");
    851         long len = snark.meta.getTotalLength();
     845        buf.append("\">").append(storage.getBaseName()).append("</a>");
    852846        addMessage(_("Download finished: {0}", buf.toString())); //  + " (" + _("size: {0}B", DataHelper.formatSize2(len)) + ')');
    853847        updateStatus(snark);
     
    855849   
    856850    public void updateStatus(Snark snark) {
    857         saveTorrentStatus(snark.meta, snark.storage.getBitField(), snark.storage.getFilePriorities());
     851        MetaInfo meta = snark.getMetaInfo();
     852        Storage storage = snark.getStorage();
     853        if (meta != null && storage != null)
     854            saveTorrentStatus(meta, storage.getBitField(), storage.getFilePriorities());
    858855    }
    859856   
     
    985982            for (Iterator iter = names.iterator(); iter.hasNext(); ) {
    986983                Snark snark = getTorrent((String)iter.next());
    987                 if ( (snark != null) && (!snark.stopped) )
     984                if ( (snark != null) && (!snark.isStopped()) )
    988985                    snark.stopTorrent();
    989986            }
  • apps/i2psnark/java/src/org/klomp/snark/StaticSnark.java

    rafe5751 r4899a6d  
    3939
    4040    // And finally call the normal starting point.
    41     Snark.main(args);
     41    //Snark.main(args);
     42    System.err.println("unsupported");
    4243  }
    4344}
  • apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java

    rafe5751 r4899a6d  
    3535
    3636import net.i2p.I2PAppContext;
     37import net.i2p.data.Hash;
    3738import net.i2p.util.I2PAppThread;
    3839import net.i2p.util.Log;
     40
    3941
    4042/**
     
    6466  private final MetaInfo meta;
    6567  private final PeerCoordinator coordinator;
     68  private final Snark snark;
    6669  private final int port;
    6770
     
    7174  private List trackers;
    7275
    73   public TrackerClient(I2PSnarkUtil util, MetaInfo meta, PeerCoordinator coordinator)
     76  public TrackerClient(I2PSnarkUtil util, MetaInfo meta, PeerCoordinator coordinator, Snark snark)
    7477  {
    7578    super();
    7679    // Set unique name.
    77     String id = urlencode(coordinator.getID());
     80    String id = urlencode(snark.getID());
    7881    setName("TrackerClient " + id.substring(id.length() - 12));
    7982    _util = util;
    8083    this.meta = meta;
    8184    this.coordinator = coordinator;
     85    this.snark = snark;
    8286
    8387    this.port = 6881; //(port == -1) ? 9 : port;
     
    120124  {
    121125    String infoHash = urlencode(meta.getInfoHash());
    122     String peerID = urlencode(coordinator.getID());
     126    String peerID = urlencode(snark.getID());
    123127
    124128    _log.debug("Announce: [" + meta.getAnnounce() + "] infoHash: " + infoHash);
    125    
     129
    126130    // Construct the list of trackers for this torrent,
    127131    // starting with the primary one listed in the metainfo,
     
    201205                } else if (completed && runStarted)
    202206                  delay = 3*SLEEP*60*1000 + random;
    203                 else if (coordinator.trackerProblems != null && ++consecutiveFails < MAX_CONSEC_FAILS)
     207                else if (snark.getTrackerProblems() != null && ++consecutiveFails < MAX_CONSEC_FAILS)
    204208                  delay = INITIAL_SLEEP;
    205209                else
     
    252256                                                 event);
    253257
    254                     coordinator.trackerProblems = null;
     258                    snark.setTrackerProblems(null);
    255259                    tr.trackerProblems = null;
    256260                    tr.registerFails = 0;
     
    263267                    Set peers = info.getPeers();
    264268                    tr.seenPeers = info.getPeerCount();
    265                     if (coordinator.trackerSeenPeers < tr.seenPeers) // update rising number quickly
    266                         coordinator.trackerSeenPeers = tr.seenPeers;
     269                    if (snark.getTrackerSeenPeers() < tr.seenPeers) // update rising number quickly
     270                        snark.setTrackerSeenPeers(tr.seenPeers);
    267271                    if ( (left > 0) && (!completed) ) {
    268272                        // we only want to talk to new people if we need things
     
    294298                    // don't show secondary tracker problems to the user
    295299                    if (tr.isPrimary)
    296                       coordinator.trackerProblems = tr.trackerProblems;
     300                      snark.setTrackerProblems(tr.trackerProblems);
    297301                    if (tr.trackerProblems.toLowerCase().startsWith(NOT_REGISTERED)) {
    298302                      // Give a guy some time to register it if using opentrackers too
    299303                      if (trackers.size() == 1) {
    300304                        stop = true;
    301                         coordinator.snark.stopTorrent();
     305                        snark.stopTorrent();
    302306                      } else { // hopefully each on the opentrackers list is really open
    303307                        if (tr.registerFails++ > MAX_REGISTER_FAILS)
     
    317321
    318322            // we could try and total the unique peers but that's too hard for now
    319             coordinator.trackerSeenPeers = maxSeenPeers;
     323            snark.setTrackerSeenPeers(maxSeenPeers);
    320324            if (!runStarted)
    321325                _util.debug("         Retrying in one minute...", Snark.DEBUG);
     
    378382        in = new FileInputStream(fetched);
    379383
    380         TrackerInfo info = new TrackerInfo(in, coordinator.getID(),
    381                                            coordinator.getMetaInfo());
     384        TrackerInfo info = new TrackerInfo(in, snark.getID(),
     385                                           snark.getMetaInfo());
    382386        _util.debug("TrackerClient response: " + info, Snark.INFO);
    383387
  • apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java

    rafe5751 r4899a6d  
    2727
    2828import net.i2p.I2PAppContext;
     29import net.i2p.data.Base32;
    2930import net.i2p.data.Base64;
    3031import net.i2p.data.DataHelper;
     
    362363            Snark snark = (Snark)snarks.get(i);
    363364            boolean showDebug = "2".equals(peerParam);
    364             boolean showPeers = showDebug || "1".equals(peerParam) || Base64.encode(snark.meta.getInfoHash()).equals(peerParam);
     365            boolean showPeers = showDebug || "1".equals(peerParam) || Base64.encode(snark.getInfoHash()).equals(peerParam);
    365366            displaySnark(out, snark, uri, i, stats, showPeers, isDegraded, showDebug);
    366367        }
     
    453454                if (newURL.startsWith("http://")) {
    454455                    _manager.addMessage(_("Fetching {0}", urlify(newURL)));
    455                     I2PAppThread fetch = new I2PAppThread(new FetchAndAdd(_manager, newURL), "Fetch and add");
     456                    I2PAppThread fetch = new I2PAppThread(new FetchAndAdd(_manager, newURL), "Fetch and add", true);
    456457                    fetch.start();
    457458                } else {
     
    469470                        String name = (String)iter.next();
    470471                        Snark snark = _manager.getTorrent(name);
    471                         if ( (snark != null) && (DataHelper.eq(infoHash, snark.meta.getInfoHash())) ) {
     472                        if ( (snark != null) && (DataHelper.eq(infoHash, snark.getInfoHash())) ) {
    472473                            _manager.stopTorrent(name, false);
    473474                            break;
     
    483484                    for (String name : _manager.listTorrentFiles()) {
    484485                        Snark snark = _manager.getTorrent(name);
    485                         if ( (snark != null) && (DataHelper.eq(infoHash, snark.meta.getInfoHash())) ) {
     486                        if ( (snark != null) && (DataHelper.eq(infoHash, snark.getInfoHash())) ) {
    486487                            snark.startTorrent();
    487                             if (snark.storage != null)
    488                                 name = snark.storage.getBaseName();
    489                             _manager.addMessage(_("Starting up torrent {0}", name));
     488                            _manager.addMessage(_("Starting up torrent {0}", snark.getBaseName()));
    490489                            break;
    491490                        }
     
    501500                        String name = (String)iter.next();
    502501                        Snark snark = _manager.getTorrent(name);
    503                         if ( (snark != null) && (DataHelper.eq(infoHash, snark.meta.getInfoHash())) ) {
     502                        if ( (snark != null) && (DataHelper.eq(infoHash, snark.getInfoHash())) ) {
    504503                            _manager.stopTorrent(name, true);
     504                            MetaInfo meta = snark.getMetaInfo();
     505                            if (meta == null) {
     506                                return;
     507                            }
    505508                            // should we delete the torrent file?
    506509                            // yeah, need to, otherwise it'll get autoadded again (at the moment
     
    521524                        String name = (String)iter.next();
    522525                        Snark snark = _manager.getTorrent(name);
    523                         if ( (snark != null) && (DataHelper.eq(infoHash, snark.meta.getInfoHash())) ) {
     526                        if ( (snark != null) && (DataHelper.eq(infoHash, snark.getInfoHash())) ) {
    524527                            _manager.stopTorrent(name, true);
     528                            MetaInfo meta = snark.getMetaInfo();
     529                            if (meta == null) {
     530                                return;
     531                            }
    525532                            File f = new File(name);
    526533                            f.delete();
    527534                            _manager.addMessage(_("Torrent file deleted: {0}", f.getAbsolutePath()));
    528                             List files = snark.meta.getFiles();
    529                             String dataFile = snark.meta.getName();
     535                            List files = meta.getFiles();
     536                            String dataFile = snark.getBaseName();
    530537                            f = new File(_manager.getDataDir(), dataFile);
    531538                            if (files == null) { // single file torrent
     
    618625            for (int i = 0; i < snarks.size(); i++) {
    619626                Snark snark = (Snark)snarks.get(i);
    620                 if (!snark.stopped)
    621                     _manager.stopTorrent(snark.torrent, false);
     627                if (!snark.isStopped())
     628                    _manager.stopTorrent(snark.getName(), false);
    622629            }
    623630            if (_manager.util().connected()) {
     
    632639            for (int i = 0; i < snarks.size(); i++) {
    633640                Snark snark = (Snark)snarks.get(i);
    634                 if (snark.stopped)
     641                if (snark.isStopped())
    635642                    snark.startTorrent();
    636643            }
     
    700707    private void displaySnark(PrintWriter out, Snark snark, String uri, int row, long stats[], boolean showPeers,
    701708                              boolean isDegraded, boolean showDebug) throws IOException {
    702         String filename = snark.torrent;
     709        String filename = snark.getName();
    703710        File f = new File(filename);
    704711        filename = f.getName(); // the torrent may be the canonical name, so lets just grab the local name
     
    711718            filename = filename.substring(0, MAX_DISPLAYED_FILENAME_LENGTH) + "&hellip;";
    712719        }
    713         long total = snark.meta.getTotalLength();
     720        long total = snark.getTotalLength();
    714721        // Early typecast, avoid possibly overflowing a temp integer
    715         long remaining = (long) snark.storage.needed() * (long) snark.meta.getPieceLength(0);
     722        long remaining = (long) snark.getNeeded() * (long) snark.getPieceLength(0);
    716723        if (remaining > total)
    717724            remaining = total;
    718         long downBps = 0;
    719         long upBps = 0;
    720         if (snark.coordinator != null) {
    721             downBps = snark.coordinator.getDownloadRate();
    722             upBps = snark.coordinator.getUploadRate();
    723         }
     725        long downBps = snark.getDownloadRate();
     726        long upBps = snark.getUploadRate();
    724727        long remainingSeconds;
    725728        if (downBps > 0)
     
    727730        else
    728731            remainingSeconds = -1;
    729         boolean isRunning = !snark.stopped;
    730         long uploaded = 0;
    731         if (snark.coordinator != null) {
    732             uploaded = snark.coordinator.getUploaded();
    733             stats[0] += snark.coordinator.getDownloaded();
    734         }
     732        boolean isRunning = !snark.isStopped();
     733        long uploaded = snark.getUploaded();
     734        stats[0] += snark.getDownloaded();
    735735        stats[1] += uploaded;
    736736        if (isRunning) {
     
    740740        stats[5] += total;
    741741       
    742         boolean isValid = snark.meta != null;
    743         boolean singleFile = snark.meta.getFiles() == null;
     742        MetaInfo meta = snark.getMetaInfo();
     743        boolean isValid = meta != null;
     744        boolean singleFile = (!isValid) || meta.getFiles() == null;
    744745       
    745         String err = null;
    746         int curPeers = 0;
    747         int knownPeers = 0;
    748         if (snark.coordinator != null) {
    749             err = snark.coordinator.trackerProblems;
    750             curPeers = snark.coordinator.getPeerCount();
    751             stats[4] += curPeers;
    752             knownPeers = Math.max(curPeers, snark.coordinator.trackerSeenPeers);
    753         }
     746        String err = snark.getTrackerProblems();
     747        int curPeers = snark.getPeerCount();
     748        stats[4] += curPeers;
     749        int knownPeers = Math.max(curPeers, snark.getTrackerSeenPeers());
    754750       
    755751        String rowClass = (row % 2 == 0 ? "snarkTorrentEven" : "snarkTorrentOdd");
     
    758754            if (isRunning && curPeers > 0 && !showPeers)
    759755                statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "trackererror.png\" title=\"" + err + "\"></td><td class=\"snarkTorrentStatus " + rowClass + "\">" + _("Tracker Error") +
    760                                ": <a href=\"" + uri + "?p=" + Base64.encode(snark.meta.getInfoHash()) + "\">" +
     756                               ": <a href=\"" + uri + "?p=" + Base64.encode(snark.getInfoHash()) + "\">" +
    761757                               curPeers + thinsp(isDegraded) +
    762758                               ngettext("1 peer", "{0} peers", knownPeers) + "</a>";
     
    774770            if (isRunning && curPeers > 0 && !showPeers)
    775771                statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "seeding.png\" ></td><td class=\"snarkTorrentStatus " + rowClass + "\">" + _("Seeding") +
    776                                ": <a href=\"" + uri + "?p=" + Base64.encode(snark.meta.getInfoHash()) + "\">" +
     772                               ": <a href=\"" + uri + "?p=" + Base64.encode(snark.getInfoHash()) + "\">" +
    777773                               curPeers + thinsp(isDegraded) +
    778774                               ngettext("1 peer", "{0} peers", knownPeers) + "</a>";
     
    786782            if (isRunning && curPeers > 0 && downBps > 0 && !showPeers)
    787783                statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "downloading.png\" ></td><td class=\"snarkTorrentStatus " + rowClass + "\">" + _("OK") +
    788                                ": <a href=\"" + uri + "?p=" + Base64.encode(snark.meta.getInfoHash()) + "\">" +
     784                               ": <a href=\"" + uri + "?p=" + Base64.encode(snark.getInfoHash()) + "\">" +
    789785                               curPeers + thinsp(isDegraded) +
    790786                               ngettext("1 peer", "{0} peers", knownPeers) + "</a>";
     
    795791            else if (isRunning && curPeers > 0 && !showPeers)
    796792                statusString = "<img alt=\"\" border=\"0\" src=\"" + _imgPath + "stalled.png\" ></td><td class=\"snarkTorrentStatus " + rowClass + "\">" + _("Stalled") +
    797                                ": <a href=\"" + uri + "?p=" + Base64.encode(snark.meta.getInfoHash()) + "\">" +
     793                               ": <a href=\"" + uri + "?p=" + Base64.encode(snark.getInfoHash()) + "\">" +
    798794                               curPeers + thinsp(isDegraded) +
    799795                               ngettext("1 peer", "{0} peers", knownPeers) + "</a>";
     
    817813        out.write("<td class=\"" + rowClass + "\">");
    818814        // temporarily hardcoded for postman* and anonymity, requires bytemonsoon patch for lookup by info_hash
    819         String announce = snark.meta.getAnnounce();
     815        String announce = meta.getAnnounce();
    820816        if (announce.startsWith("http://YRgrgTLG") || announce.startsWith("http://8EoJZIKr") ||
    821817            announce.startsWith("http://lnQ6yoBT") || announce.startsWith("http://tracker2.postman.i2p/") || announce.startsWith("http://ahsplxkbhemefwvvml7qovzl5a2b5xo5i7lyai7ntdunvcyfdtna.b32.i2p/")) {
     
    834830                baseURL = baseURL.substring(e + 1);
    835831                out.write("<a href=\"" + baseURL + "details.php?dllist=1&amp;filelist=1&amp;info_hash=");
    836                 out.write(TrackerClient.urlencode(snark.meta.getInfoHash()));
     832                out.write(TrackerClient.urlencode(snark.getInfoHash()));
    837833                out.write("\" title=\"" + _("Details at {0} tracker", name) + "\" target=\"_blank\">");
    838834                out.write("<img alt=\"" + _("Info") + "\" border=\"0\" src=\"" + _imgPath + "details.png\">");
     
    844840        out.write("</td>\n<td class=\"" + rowClass + "\">");
    845841        StringBuilder buf = null;
    846         if (remaining == 0 || snark.meta.getFiles() != null) {
     842        if (remaining == 0 || meta.getFiles() != null) {
    847843            buf = new StringBuilder(128);
    848             buf.append("<a href=\"").append(snark.storage.getBaseName());
    849             if (snark.meta.getFiles() != null)
     844            buf.append("<a href=\"").append(snark.getBaseName());
     845            if (meta.getFiles() != null)
    850846                buf.append('/');
    851847            buf.append("\" title=\"");
    852             if (snark.meta.getFiles() != null)
     848            if (meta.getFiles() != null)
    853849                buf.append(_("View files"));
    854850            else
     
    858854        }
    859855        String icon;
    860         if (snark.meta.getFiles() != null)
     856        if (meta.getFiles() != null)
    861857            icon = "folder";
    862858        else
    863             icon = toIcon(snark.meta.getName());
    864         if (remaining == 0 || snark.meta.getFiles() != null) {
     859            icon = toIcon(meta.getName());
     860        if (remaining == 0 || meta.getFiles() != null) {
    865861            out.write(toImg(icon, _("Open")));
    866862            out.write("</a>");
     
    869865        }
    870866        out.write("</td><td class=\"snarkTorrentName " + rowClass + "\">");
    871         if (remaining == 0 || snark.meta.getFiles() != null)
     867        if (remaining == 0 || meta.getFiles() != null)
    872868            out.write(buf.toString());
    873869        out.write(filename);
    874         if (remaining == 0 || snark.meta.getFiles() != null)
     870        if (remaining == 0 || meta.getFiles() != null)
    875871            out.write("</a>");
    876872
     
    898894        out.write("</td>\n\t");
    899895        out.write("<td align=\"center\" class=\"snarkTorrentAction " + rowClass + "\">");
    900         String parameters = "&nonce=" + _nonce + "&torrent=" + Base64.encode(snark.meta.getInfoHash());
    901         String b64 = Base64.encode(snark.meta.getInfoHash());
     896        String parameters = "&nonce=" + _nonce + "&torrent=" + Base64.encode(snark.getInfoHash());
     897        String b64 = Base64.encode(snark.getInfoHash());
    902898        if (showPeers)
    903899            parameters = parameters + "&p=1";
     
    964960
    965961        if(showPeers && isRunning && curPeers > 0) {
    966             List<Peer> peers = snark.coordinator.peerList();
     962            List<Peer> peers = snark.getPeerList();
    967963            if (!showDebug)
    968964                Collections.sort(peers, new PeerComparator());
     
    997993                out.write("</td>\n\t");
    998994                out.write("<td align=\"right\" class=\"snarkTorrentStatus " + rowClass + "\">");
    999                 float pct = (float) (100.0 * (float) peer.completed() / snark.meta.getPieces());
     995                float pct = (float) (100.0 * (float) peer.completed() / meta.getPieces());
    1000996                if (pct == 100.0)
    1001997                    out.write(_("Seed"));
     
    13591355    }
    13601356
     1357    /** translate */
     1358    private String _(String s, Object o, Object o2) {
     1359        return _manager.util().getString(s, o, o2);
     1360    }
     1361
    13611362    /** translate (ngettext) @since 0.7.14 */
    13621363    private String ngettext(String s, String p, int n) {
     
    14701471        if (parent)  // always true
    14711472            buf.append("<div class=\"page\"><div class=\"mainsection\">");
    1472         boolean showPriority = snark != null && !snark.storage.complete();
     1473        boolean showPriority = snark != null && snark.getStorage() != null && !snark.getStorage().complete();
    14731474        if (showPriority)
    14741475            buf.append("<form action=\"").append(base).append("\" method=\"POST\">\n");
     
    15171518                status = toImg("tick") + ' ' + _("Directory");
    15181519            } else {
    1519                 if (snark == null) {
     1520                if (snark == null || snark.getStorage() == null) {
    15201521                    // Assume complete, perhaps he removed a completed torrent but kept a bookmark
    15211522                    complete = true;
    15221523                    status = toImg("cancel") + ' ' + _("Torrent not found?");
    15231524                } else {
     1525                    Storage storage = snark.getStorage();
    15241526                    try {
    15251527                        File f = item.getFile();
    15261528                        if (f != null) {
    1527                             long remaining = snark.storage.remaining(f.getCanonicalPath());
     1529                            long remaining = storage.remaining(f.getCanonicalPath());
    15281530                            if (remaining < 0) {
    15291531                                complete = true;
     
    15331535                                status = toImg("tick") + ' ' + _("Complete");
    15341536                            } else {
    1535                                 int priority = snark.storage.getPriority(f.getCanonicalPath());
     1537                                int priority = storage.getPriority(f.getCanonicalPath());
    15361538                                if (priority < 0)
    15371539                                    status = toImg("cancel");
     
    15891591                File f = item.getFile();
    15901592                if ((!complete) && (!item.isDirectory()) && f != null) {
    1591                     int pri = snark.storage.getPriority(f.getCanonicalPath());
     1593                    int pri = snark.getStorage().getPriority(f.getCanonicalPath());
    15921594                    buf.append("<input type=\"radio\" value=\"5\" name=\"pri.").append(f.getCanonicalPath()).append("\" ");
    15931595                    if (pri > 0)
     
    16911693    /** @since 0.8.1 */
    16921694    private void savePriorities(Snark snark, Map postParams) {
     1695        Storage storage = snark.getStorage();
     1696        if (storage == null)
     1697            return;
    16931698        Set<Map.Entry> entries = postParams.entrySet();
    16941699        for (Map.Entry entry : entries) {
     
    16991704                    String val = ((String[])entry.getValue())[0];   // jetty arrays
    17001705                    int pri = Integer.parseInt(val);
    1701                     snark.storage.setPriority(file, pri);
     1706                    storage.setPriority(file, pri);
    17021707                    //System.err.println("Priority now " + pri + " for " + file);
    17031708                } catch (Throwable t) { t.printStackTrace(); }
    17041709            }
    17051710        }
    1706         if (snark.coordinator != null)
    1707             snark.coordinator.updatePiecePriorities();
    1708         _manager.saveTorrentStatus(snark.storage.getMetaInfo(), snark.storage.getBitField(), snark.storage.getFilePriorities());
     1711         snark.updatePiecePriorities();
     1712        _manager.saveTorrentStatus(snark.getMetaInfo(), storage.getBitField(), storage.getFilePriorities());
    17091713    }
    17101714
Note: See TracChangeset for help on using the changeset viewer.