Class FetchAndAdd

java.lang.Object
org.klomp.snark.Snark
org.klomp.snark.web.FetchAndAdd
All Implemented Interfaces:
Runnable, EepGet.StatusListener, CoordinatorListener, ShutdownListener, StorageListener

public class FetchAndAdd extends Snark implements EepGet.StatusListener, Runnable
A cancellable torrent file downloader. We extend Snark so its status may be easily listed in the web table without adding a lot of code there. Upon successful download, this Snark will be deleted and a "real" Snark created. The methods return values similar to a Snark in magnet mode. A fake info hash, which is the SHA1 of the URL, is returned to prevent duplicates. This Snark may be stopped and restarted, although a partially downloaded file is discarded.
Since:
0.9.1 Moved from I2PSnarkUtil
  • Constructor Details

    • FetchAndAdd

      public FetchAndAdd(I2PAppContext ctx, SnarkManager mgr, String url, File dataDir)
      Caller should call _mgr.addDownloader(this), which will start things off.
      Parameters:
      dataDir - null to default to snark data directory
  • Method Details

    • run

      public void run()
      Set off by startTorrent()
      Specified by:
      run in interface Runnable
    • startTorrent

      public void startTorrent()
      Description copied from class: Snark
      Start up contacting peers and querying the tracker. Blocks if tunnel is not yet open.
      Overrides:
      startTorrent in class Snark
    • stopTorrent

      public void stopTorrent()
      Description copied from class: Snark
      Stop contacting the tracker and talking with peers
      Overrides:
      stopTorrent in class Snark
    • isStopped

      public boolean isStopped()
      Overrides:
      isStopped in class Snark
    • getName

      public String getName()
      Overrides:
      getName in class Snark
      Returns:
      file name of .torrent file (should be full absolute path), or a fake name if in magnet mode.
    • getBaseName

      public String getBaseName()
      Overrides:
      getBaseName in class Snark
      Returns:
      base name of torrent [filtered version of getMetaInfo.getName()], or a fake name if in magnet mode
    • getInfoHash

      public byte[] getInfoHash()
      Overrides:
      getInfoHash in class Snark
      Returns:
      always will be valid even in magnet mode
    • getTotalLength

      public long getTotalLength()
      Overrides:
      getTotalLength in class Snark
      Returns:
      torrent file size or -1
    • getRemainingLength

      public long getRemainingLength()
      Description copied from class: Snark
      Bytes not yet in storage. Does NOT account for skipped files.
      Overrides:
      getRemainingLength in class Snark
      Returns:
      -1 when done so the web will list us as "complete" instead of "seeding"
    • getNeededLength

      public long getNeededLength()
      Description copied from class: Snark
      Bytes still wanted. DOES account for (i.e. does not include) skipped files. FIXME -1 when not running.
      Overrides:
      getNeededLength in class Snark
      Returns:
      torrent file bytes remaining or -1
    • getDownloadRate

      public long getDownloadRate()
      Overrides:
      getDownloadRate in class Snark
    • getDownloaded

      public long getDownloaded()
      Overrides:
      getDownloaded in class Snark
    • getPeerCount

      public int getPeerCount()
      Overrides:
      getPeerCount in class Snark
    • getTrackerSeenPeers

      public int getTrackerSeenPeers()
      Overrides:
      getTrackerSeenPeers in class Snark
      Returns:
      count returned from tracker
    • attemptFailed

      public void attemptFailed(String url, long bytesTransferred, long bytesRemaining, int currentAttempt, int numRetries, Exception cause)
      Specified by:
      attemptFailed in interface EepGet.StatusListener
      See Also:
    • bytesTransferred

      public void bytesTransferred(long alreadyTransferred, int currentWrite, long bytesTransferred, long bytesRemaining, String url)
      Description copied from interface: EepGet.StatusListener
      Total length should be == alreadyTransferred + currentWrite + bytesRemaining for all calls
      Specified by:
      bytesTransferred in interface EepGet.StatusListener
      Parameters:
      alreadyTransferred - total of all attempts, not including currentWrite If nonzero on the first call, a partial file of that length was found, _and_ the server supports resume. If zero on a subsequent call after some bytes are transferred (and presumably after an attemptFailed), the server does _not_ support resume and we had to start over. To track _actual_ transfer if the output file could already exist, the listener should keep its own counter, or subtract the initial alreadyTransferred value. And watch out for alreadyTransferred resetting if a resume failed...
      currentWrite - since last call to the listener
      bytesTransferred - includes headers, retries, redirects, discarded partial downloads, ...
      bytesRemaining - on this attempt only, currentWrite already subtracted - or -1 if chunked encoding or server does not return a length
    • transferComplete

      public void transferComplete(long alreadyTransferred, long bytesTransferred, long bytesRemaining, String url, String outputFile, boolean notModified)
      Specified by:
      transferComplete in interface EepGet.StatusListener
      Parameters:
      outputFile - null if unknown (output stream constructor)
      See Also:
    • transferFailed

      public void transferFailed(String url, long bytesTransferred, long bytesRemaining, int currentAttempt)
      Specified by:
      transferFailed in interface EepGet.StatusListener
      See Also:
    • headerReceived

      public void headerReceived(String url, int attemptNum, String key, String val)
      Description copied from interface: EepGet.StatusListener
      Note: Headers are not processed, and this is not called, for most error response codes, unless setWriteErrorToOutput() is called before fetch(). To be changed?
      Specified by:
      headerReceived in interface EepGet.StatusListener
    • attempting

      public void attempting(String url)
      Specified by:
      attempting in interface EepGet.StatusListener