org.klomp.snark
Class Snark

java.lang.Object
  extended by org.klomp.snark.Snark
All Implemented Interfaces:
CoordinatorListener, ShutdownListener, StorageListener
Direct Known Subclasses:
FetchAndAdd

public class Snark
extends Object
implements StorageListener, CoordinatorListener, ShutdownListener

Main Snark program startup class.

Author:
Mark Wielaard (mark@klomp.org)

Field Summary
protected  I2PSnarkUtil _util
           
(package private) static int MAX_TOTAL_UPLOADERS
           
(package private) static int MIN_TOTAL_UPLOADERS
          Maintain a configurable total uploader cap coordinatorListener
static String PROP_MAX_CONNECTIONS
          No, not maintaining a command-line client public static void main(String[] args) { System.out.println(copyright); System.out.println(); if ( (args.length > 0) && ("--config".equals(args[0])) ) { I2PThread.addOOMEventListener(new OOMListener()); SnarkManager sm = SnarkManager.instance(); if (args.length > 1) sm.loadConfig(args[1]); System.out.println("Running in multitorrent mode"); while (true) { try { synchronized (sm) { sm.wait(); } } catch (InterruptedException ie) {} } } // Parse debug, share/ip and torrent file options.
 
Constructor Summary
Snark(I2PSnarkUtil util, String torrent, byte[] ih, String trackerURL, CompleteListener complistener, PeerCoordinatorSet peerCoordinatorSet, ConnectionAcceptor connectionAcceptor, boolean start, String rootDir)
          multitorrent, magnet
Snark(I2PSnarkUtil util, String torrent, String ip, int user_port, StorageListener slistener, CoordinatorListener clistener, CompleteListener complistener, PeerCoordinatorSet peerCoordinatorSet, ConnectionAcceptor connectionAcceptor, boolean start, String rootDir)
          multitorrent
Snark(I2PSnarkUtil util, String torrent, String ip, int user_port, StorageListener slistener, CoordinatorListener clistener, CompleteListener complistener, PeerCoordinatorSet peerCoordinatorSet, ConnectionAcceptor connectionAcceptor, boolean start, String rootDir, File baseFile)
          multitorrent
 
Method Summary
 void addMessage(String message)
          StorageListener and CoordinatorListener callback
 String getBaseName()
           
 long getDownloaded()
           
 long getDownloadRate()
           
 byte[] getID()
           
 byte[] getInfoHash()
           
 MetaInfo getMetaInfo()
           
 String getName()
           
 long getNeeded()
          Does not account (i.e.
 long getNeededLength()
          Bytes still wanted.
 int getPeerCount()
           
 List<Peer> getPeerList()
           
 int getPieceLength(int p)
           
 int getPieces()
           
 long getRemainingLength()
          Bytes not yet in storage.
 Storage getStorage()
           
 long getTotalLength()
           
 String getTrackerProblems()
          Not HTML escaped.
 int getTrackerSeenPeers()
           
 String getTrackerURL()
           
 long getUploaded()
           
 long getUploadRate()
           
 void gotMetaInfo(PeerCoordinator coordinator, MetaInfo metainfo)
          Called when the PeerCoordinator got the MetaInfo via magnet.
 boolean isAllocating()
          Disk allocation (ballooning) in progress.
 boolean isAutoStoppable()
           
 boolean isChecking()
          File checking in progress.
 boolean isStarting()
          Startup in progress.
 boolean isStopped()
           
 boolean overUpBWLimit()
          Are we currently over the upstream bandwidth limit?
 boolean overUpBWLimit(long total)
          Is the total (in Bps) over the upstream bandwidth limit?
 boolean overUploadLimit(int uploaders)
          Is this number of uploaders over the per-torrent limit?
 void peerChange(PeerCoordinator coordinator, Peer peer)
          CoordinatorListener - this does nothing
 boolean restartAcceptor()
           
 void setAutoStoppable(boolean yes)
           
 void setStarting()
          Set startup in progress.
 void setTrackerProblems(String p)
           
 void setTrackerSeenPeers(int p)
           
 void setWantedPieces(Storage storage)
          Reset the peer's wanted pieces table Call after the storage double-check fails
 void shutdown()
          SnarkSnutdown callback unused
 void startTorrent()
          Start up contacting peers and querying the tracker.
 void stopTorrent()
          Stop contacting the tracker and talking with peers
 void stopTorrent(boolean fast)
          Stop contacting the tracker and talking with peers
 void storageAllChecked(Storage storage)
          Called when all pieces in the storage have been checked.
 void storageAllocated(Storage storage, long length)
          does nothing
 void storageChecked(Storage storage, int num, boolean checked)
          Called when storage is being checked and the num piece of that total pieces has been checked.
 void storageCompleted(Storage storage)
          Called the one time when the data is completely received and checked.
 void storageCreateFile(Storage storage, String name, long length)
          does nothing
 void updatePiecePriorities()
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

PROP_MAX_CONNECTIONS

public static final String PROP_MAX_CONNECTIONS
No, not maintaining a command-line client public static void main(String[] args) { System.out.println(copyright); System.out.println(); if ( (args.length > 0) && ("--config".equals(args[0])) ) { I2PThread.addOOMEventListener(new OOMListener()); SnarkManager sm = SnarkManager.instance(); if (args.length > 1) sm.loadConfig(args[1]); System.out.println("Running in multitorrent mode"); while (true) { try { synchronized (sm) { sm.wait(); } } catch (InterruptedException ie) {} } } // Parse debug, share/ip and torrent file options. Snark snark = parseArguments(args); SnarkShutdown snarkhook = new SnarkShutdown(snark.storage, snark.coordinator, snark.acceptor, snark.trackerclient, snark); //Runtime.getRuntime().addShutdownHook(snarkhook); Timer timer = new Timer(true); TimerTask monitor = new PeerMonitorTask(snark.coordinator); timer.schedule(monitor, PeerMonitorTask.MONITOR_PERIOD, PeerMonitorTask.MONITOR_PERIOD); // Start command interpreter if (Snark.command_interpreter) { boolean quit = false; System.out.println(); System.out.println(usage); System.out.println(); try { BufferedReader br = new BufferedReader (new InputStreamReader(System.in)); String line = br.readLine(); while(!quit && line != null) { line = line.toLowerCase(); if ("quit".equals(line)) quit = true; else if ("list".equals(line)) { synchronized(snark.coordinator.peers) { System.out.println(snark.coordinator.peers.size() + " peers -" + " (i)nterested," + " (I)nteresting," + " (c)hoking," + " (C)hoked:"); Iterator it = snark.coordinator.peers.iterator(); while (it.hasNext()) { Peer peer = (Peer)it.next(); System.out.println(peer); System.out.println("\ti: " + peer.isInterested() + " I: " + peer.isInteresting() + " c: " + peer.isChoking() + " C: " + peer.isChoked()); } } } else if ("info".equals(line)) { System.out.println("Name: " + snark.meta.getName()); System.out.println("Torrent: " + snark.torrent); System.out.println("Tracker: " + snark.meta.getAnnounce()); List files = snark.meta.getFiles(); System.out.println("Files: " + ((files == null) ? 1 : files.size())); System.out.println("Pieces: " + snark.meta.getPieces()); System.out.println("Piece size: " + snark.meta.getPieceLength(0) / 1024 + " KB"); System.out.println("Total size: " + snark.meta.getTotalLength() / (1024 * 1024) + " MB"); } else if ("".equals(line) || "help".equals(line)) { System.out.println(usage); System.out.println(help); } else { System.out.println("Unknown command: " + line); System.out.println(usage); } if (!quit) { System.out.println(); line = br.readLine(); } } } catch(IOException ioe) { System.out.println("ERROR while reading stdin: " + ioe); } // Explicit shutdown. //Runtime.getRuntime().removeShutdownHook(snarkhook); snarkhook.start(); } }

See Also:
Constant Field Values

_util

protected final I2PSnarkUtil _util

MIN_TOTAL_UPLOADERS

static final int MIN_TOTAL_UPLOADERS
Maintain a configurable total uploader cap coordinatorListener

See Also:
Constant Field Values

MAX_TOTAL_UPLOADERS

static final int MAX_TOTAL_UPLOADERS
See Also:
Constant Field Values
Constructor Detail

Snark

public Snark(I2PSnarkUtil util,
             String torrent,
             String ip,
             int user_port,
             StorageListener slistener,
             CoordinatorListener clistener,
             CompleteListener complistener,
             PeerCoordinatorSet peerCoordinatorSet,
             ConnectionAcceptor connectionAcceptor,
             boolean start,
             String rootDir)
multitorrent

Throws:
RuntimeException - via fatal()

Snark

public Snark(I2PSnarkUtil util,
             String torrent,
             String ip,
             int user_port,
             StorageListener slistener,
             CoordinatorListener clistener,
             CompleteListener complistener,
             PeerCoordinatorSet peerCoordinatorSet,
             ConnectionAcceptor connectionAcceptor,
             boolean start,
             String rootDir,
             File baseFile)
multitorrent

Parameters:
baseFile - if null, use rootDir/torrentName; if non-null, use it instead
Throws:
RuntimeException - via fatal()
Since:
0.9.11

Snark

public Snark(I2PSnarkUtil util,
             String torrent,
             byte[] ih,
             String trackerURL,
             CompleteListener complistener,
             PeerCoordinatorSet peerCoordinatorSet,
             ConnectionAcceptor connectionAcceptor,
             boolean start,
             String rootDir)
multitorrent, magnet

Parameters:
torrent - a fake name for now (not a file name)
ih - 20-byte info hash
trackerURL - may be null
Throws:
RuntimeException - via fatal()
Since:
0.8.4
Method Detail

startTorrent

public void startTorrent()
Start up contacting peers and querying the tracker. Blocks if tunnel is not yet open.

Throws:
RuntimeException - via fatal()

stopTorrent

public void stopTorrent()
Stop contacting the tracker and talking with peers


stopTorrent

public void stopTorrent(boolean fast)
Stop contacting the tracker and talking with peers

Parameters:
fast - if true, limit the life of the unannounce threads
Since:
0.9.1

getName

public String getName()
Returns:
file name of .torrent file (should be full absolute path), or a fake name if in magnet mode.
Since:
0.8.4

getBaseName

public String getBaseName()
Returns:
base name of torrent [filtered version of getMetaInfo.getName()], or a fake name if in magnet mode
Since:
0.8.4

getID

public byte[] getID()
Returns:
always will be valid even in magnet mode
Since:
0.8.4

getInfoHash

public byte[] getInfoHash()
Returns:
always will be valid even in magnet mode
Since:
0.8.4

getMetaInfo

public MetaInfo getMetaInfo()
Returns:
may be null if in magnet mode
Since:
0.8.4

getStorage

public Storage getStorage()
Returns:
may be null if in magnet mode
Since:
0.8.4

isStopped

public boolean isStopped()
Since:
0.8.4

isStarting

public boolean isStarting()
Startup in progress.

Since:
0.9.1

setStarting

public void setStarting()
Set startup in progress.

Since:
0.9.1

isChecking

public boolean isChecking()
File checking in progress.

Since:
0.9.3

isAllocating

public boolean isAllocating()
Disk allocation (ballooning) in progress.

Since:
0.9.3

getDownloadRate

public long getDownloadRate()
Since:
0.8.4

getUploadRate

public long getUploadRate()
Since:
0.8.4

getDownloaded

public long getDownloaded()
Since:
0.8.4

getUploaded

public long getUploaded()
Since:
0.8.4

getPeerCount

public int getPeerCount()
Since:
0.8.4

getPeerList

public List<Peer> getPeerList()
Since:
0.8.4

getTrackerProblems

public String getTrackerProblems()
Not HTML escaped.

Returns:
String returned from tracker, or null if no error
Since:
0.8.4

setTrackerProblems

public void setTrackerProblems(String p)
Parameters:
p - tracker error string or null
Since:
0.8.4

getTrackerSeenPeers

public int getTrackerSeenPeers()
Returns:
count returned from tracker
Since:
0.8.4

setTrackerSeenPeers

public void setTrackerSeenPeers(int p)
Since:
0.8.4

updatePiecePriorities

public void updatePiecePriorities()
Since:
0.8.4

getTotalLength

public long getTotalLength()
Returns:
total of all torrent files, or total of metainfo file if fetching magnet, or -1
Since:
0.8.4

getRemainingLength

public long getRemainingLength()
Bytes not yet in storage. Does NOT account for skipped files.

Returns:
exact value. or -1 if no storage yet. getNeeded() * pieceLength(0) isn't accurate if last piece is still needed.
Since:
0.8.9

getNeededLength

public long getNeededLength()
Bytes still wanted. DOES account for (i.e. does not include) skipped files. FIXME -1 when not running.

Returns:
exact value. or -1 if no storage yet or when not running.
Since:
0.9.1

getNeeded

public long getNeeded()
Does not account (i.e. includes) for skipped files.

Returns:
number of pieces still needed (magnet mode or not), or -1 if unknown
Since:
0.8.4

getPieceLength

public int getPieceLength(int p)
Parameters:
p - the piece number
Returns:
metainfo piece length or 16K if fetching magnet
Since:
0.8.4

getPieces

public int getPieces()
Returns:
number of pieces
Since:
0.8.4

restartAcceptor

public boolean restartAcceptor()
Returns:
true if restarted
Since:
0.8.4

getTrackerURL

public String getTrackerURL()
Returns:
trackerURL string from magnet-mode constructor, may be null
Since:
0.8.4

isAutoStoppable

public boolean isAutoStoppable()
Since:
0.9.9

setAutoStoppable

public void setAutoStoppable(boolean yes)
Since:
0.9.9

peerChange

public void peerChange(PeerCoordinator coordinator,
                       Peer peer)
CoordinatorListener - this does nothing

Specified by:
peerChange in interface CoordinatorListener

gotMetaInfo

public void gotMetaInfo(PeerCoordinator coordinator,
                        MetaInfo metainfo)
Called when the PeerCoordinator got the MetaInfo via magnet. CoordinatorListener. Create the storage, tell SnarkManager, and give the storage back to the coordinator.

Specified by:
gotMetaInfo in interface CoordinatorListener
Throws:
RuntimeException - via fatal()
Since:
0.8.4

storageCreateFile

public void storageCreateFile(Storage storage,
                              String name,
                              long length)
does nothing

Specified by:
storageCreateFile in interface StorageListener

storageAllocated

public void storageAllocated(Storage storage,
                             long length)
does nothing

Specified by:
storageAllocated in interface StorageListener

storageChecked

public void storageChecked(Storage storage,
                           int num,
                           boolean checked)
Description copied from interface: StorageListener
Called when storage is being checked and the num piece of that total pieces has been checked. When the piece hash matches the expected piece hash checked will be true, otherwise it will be false.

Specified by:
storageChecked in interface StorageListener

storageAllChecked

public void storageAllChecked(Storage storage)
Description copied from interface: StorageListener
Called when all pieces in the storage have been checked. Does not mean that the storage is complete, just that the state of the storage is known.

Specified by:
storageAllChecked in interface StorageListener

storageCompleted

public void storageCompleted(Storage storage)
Description copied from interface: StorageListener
Called the one time when the data is completely received and checked.

Specified by:
storageCompleted in interface StorageListener

setWantedPieces

public void setWantedPieces(Storage storage)
Description copied from interface: StorageListener
Reset the peer's wanted pieces table Call after the storage double-check fails

Specified by:
setWantedPieces in interface StorageListener

shutdown

public void shutdown()
SnarkSnutdown callback unused

Specified by:
shutdown in interface ShutdownListener

addMessage

public void addMessage(String message)
StorageListener and CoordinatorListener callback

Specified by:
addMessage in interface CoordinatorListener
Specified by:
addMessage in interface StorageListener
Since:
0.9.2

overUploadLimit

public boolean overUploadLimit(int uploaders)
Description copied from interface: CoordinatorListener
Is this number of uploaders over the per-torrent limit?

Specified by:
overUploadLimit in interface CoordinatorListener

overUpBWLimit

public boolean overUpBWLimit()
Description copied from interface: CoordinatorListener
Are we currently over the upstream bandwidth limit?

Specified by:
overUpBWLimit in interface CoordinatorListener

overUpBWLimit

public boolean overUpBWLimit(long total)
Description copied from interface: CoordinatorListener
Is the total (in Bps) over the upstream bandwidth limit?

Specified by:
overUpBWLimit in interface CoordinatorListener