## org.klomp.snark
Class MetaInfo

    java.lang.Object
      org.klomp.snark.MetaInfo

    public class MetaInfo

extends Object

Note: this class is buggy, as it doesn't propogate custom meta fields into the bencoded info data, and from there to the info_hash. At the moment, though, it seems to work with torrents created by I2P-BT, I2PRufus and Azureus.

Constructor Summary
`MetaInfo(InputStream in)` Creates a new MetaInfo from the given InputStream.
`MetaInfo(Map<String,BEValue> m)` Creates a new MetaInfo from a Map of BEValues and the SHA1 over the original bencoded info dictonary (this is a hack, we could reconstruct the bencoded stream and recalculate the hash).
`MetaInfo(String announce, String name, String name_utf8, List<List<String>> files, List<Long> lengths, int piece_length, byte[] piece_hashes, long length)` Called by Storage when creating a new torrent from local data

Method Summary
`boolean` `checkPiece(int piece, byte[] bs, int off, int length)` Checks that the given piece has the same SHA1 hash as the given byte array.
`String` `getAnnounce()` Returns the string representing the URL of the tracker for this torrent.
`List<List<String>>` `getFiles()` Returns a list of lists of file name hierarchies or null if it is a single name.
`byte[]` `getInfoBytes()`
`byte[]` `getInfoHash()` Returns the original 20 byte SHA1 hash over the bencoded info map.
`List<Long>` `getLengths()` Returns a list of Longs indication the size of the individual files, or null if it is a single file.
`String` `getName()` Returns the requested name for the file or toplevel directory.
`static String` `getNameAndInfoHash(InputStream in, byte[] infoHashOut)` Efficiently returns the name and the 20 byte SHA1 hash of the info dictionary in a torrent file Caller must close stream.
`(package private) byte[]` `getPieceHashes()` Returns the piece hashes.
`int` `getPieceLength(int piece)` Return the length of a piece.
`int` `getPieces()` Returns the number of pieces.
`byte[]` `getTorrentData()` Called by servlet to save a new torrent file generated from local data
`long` `getTotalLength()` Returns the total length of the torrent in bytes.
`static void` `main(String[] args)`
`MetaInfo` `reannounce(String announce)` Creates a copy of this MetaInfo that shares everything except the announce URL.
`String` `toString()`

Methods inherited from class java.lang.Object
`clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

Constructor Detail

### MetaInfo

    MetaInfo(String announce,
             String name,
             String name_utf8,
             List<List<String>> files,
             List<Long> lengths,
             int piece_length,
             byte[] piece_hashes,
             long length)

  Called by Storage when creating a new torrent from local data

  Parameters:
    `announce` - may be null
    `files` - null for single-file torrent
    `lengths` - null for single-file torrent

### MetaInfo

    public MetaInfo(InputStream in)
             throws IOException

  Creates a new MetaInfo from the given InputStream. The InputStream must start with a correctly bencoded dictonary describing the torrent. Caller must close the stream.

  Throws:
    `IOException`

### MetaInfo

    public MetaInfo(Map<String,BEValue> m)
             throws InvalidBEncodingException

  Creates a new MetaInfo from a Map of BEValues and the SHA1 over the original bencoded info dictonary (this is a hack, we could reconstruct the bencoded stream and recalculate the hash). Will NOT throw a InvalidBEncodingException if the given map does not contain a valid announce string. WILL throw a InvalidBEncodingException if the given map does not contain a valid info dictionary.

  Throws:
    `InvalidBEncodingException`

Method Detail

### getNameAndInfoHash

    public static String getNameAndInfoHash(InputStream in,
                                            byte[] infoHashOut)
                                     throws IOException

  Efficiently returns the name and the 20 byte SHA1 hash of the info dictionary in a torrent file Caller must close stream.

  Parameters:
    `infoHashOut` - 20-byte out parameter
  Throws:
    `IOException`
  Since:
    0.8.5

### getAnnounce

    public String getAnnounce()

  Returns the string representing the URL of the tracker for this torrent.

  Returns:
    may be null!

### getInfoHash

    public byte[] getInfoHash()

  Returns the original 20 byte SHA1 hash over the bencoded info map.

### getPieceHashes

    byte[] getPieceHashes()

  Returns the piece hashes. Only used by storage so package local.

### getName

    public String getName()

  Returns the requested name for the file or toplevel directory. If it is a toplevel directory name getFiles() will return a non-null List of file name hierarchy name.

### getFiles

    public List<List<String>> getFiles()

  Returns a list of lists of file name hierarchies or null if it is a single name. It has the same size as the list returned by getLengths().

### getLengths

    public List<Long> getLengths()

  Returns a list of Longs indication the size of the individual files, or null if it is a single file. It has the same size as the list returned by getFiles().

### getPieces

    public int getPieces()

  Returns the number of pieces.

### getPieceLength

    public int getPieceLength(int piece)

  Return the length of a piece. All pieces are of equal length except for the last one (`getPieces()-1`).

  Throws:
    `IndexOutOfBoundsException` - when piece is equal to or greater then the number of pieces in the torrent.

### checkPiece

    public boolean checkPiece(int piece,
                              byte[] bs,
                              int off,
                              int length)

  Checks that the given piece has the same SHA1 hash as the given byte array. Returns random results or IndexOutOfBoundsExceptions when the piece number is unknown.

### getTotalLength

    public long getTotalLength()

  Returns the total length of the torrent in bytes.

### toString

    public String toString()

  Overrides:
    `toString` in class `Object`

### reannounce

    public MetaInfo reannounce(String announce)

  Creates a copy of this MetaInfo that shares everything except the announce URL.

### getTorrentData

    public byte[] getTorrentData()

  Called by servlet to save a new torrent file generated from local data

### getInfoBytes

    public byte[] getInfoBytes()

  Since:
    0.8.4

### main

    public static void main(String[] args)

  Since:
    0.8.5