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

Constructors
Constructor and Description
`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

Methods
`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