org.klomp.snark.bencode
Class BDecoder

java.lang.Object
  extended by org.klomp.snark.bencode.BDecoder

public class BDecoder
extends java.lang.Object

Decodes a bencoded stream to BEValues. A bencoded byte stream can represent byte arrays, numbers, lists and maps (dictionaries). It currently contains a hack to indicate a name of a dictionary of which a SHA-1 digest hash should be calculated (the hash over the original bencoded bytes).

Author:
Mark Wielaard (mark@klomp.org).

Constructor Summary
BDecoder(java.io.InputStream in)
          Initalizes a new BDecoder.
 
Method Summary
 BEValue bdecode()
          Gets the next indicator and returns either null when the stream has ended or bdecodes the rest of the stream and returns the appropriate BEValue encoded object.
static BEValue bdecode(java.io.InputStream in)
          Creates a new BDecoder and immediatly decodes the first value it sees.
 BEValue bdecodeBytes()
          Returns the next bencoded value on the stream and makes sure it is a byte array.
 BEValue bdecodeList()
          Returns the next bencoded value on the stream and makes sure it is a list.
 BEValue bdecodeMap()
          Returns the next bencoded value on the stream and makes sure it is a map (dictonary).
 BEValue bdecodeNumber()
          Returns the next bencoded value on the stream and makes sure it is a number.
 byte[] get_special_map_digest()
           
 int getNextIndicator()
          Returns what the next bencoded object will be on the stream or -1 when the end of stream has been reached.
 void set_special_map_name(java.lang.String name)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

BDecoder

public BDecoder(java.io.InputStream in)
Initalizes a new BDecoder. Nothing is read from the given InputStream yet.

Method Detail

get_special_map_digest

public byte[] get_special_map_digest()

set_special_map_name

public void set_special_map_name(java.lang.String name)

bdecode

public static BEValue bdecode(java.io.InputStream in)
                       throws java.io.IOException
Creates a new BDecoder and immediatly decodes the first value it sees.

Returns:
The first BEValue on the stream or null when the stream has ended.
Throws:
InvalidBEncoding - when the stream doesn't start with a bencoded value or the stream isn't a bencoded stream at all.
java.io.IOException - when somthing bad happens with the stream to read from.

getNextIndicator

public int getNextIndicator()
                     throws java.io.IOException
Returns what the next bencoded object will be on the stream or -1 when the end of stream has been reached. Can return something unexpected (not '0' .. '9', 'i', 'l' or 'd') when the stream isn't bencoded. This might or might not read one extra byte from the stream.

Throws:
java.io.IOException

bdecode

public BEValue bdecode()
                throws java.io.IOException
Gets the next indicator and returns either null when the stream has ended or bdecodes the rest of the stream and returns the appropriate BEValue encoded object.

Throws:
java.io.IOException

bdecodeBytes

public BEValue bdecodeBytes()
                     throws java.io.IOException
Returns the next bencoded value on the stream and makes sure it is a byte array. If it is not a bencoded byte array it will throw InvalidBEncodingException.

Throws:
java.io.IOException

bdecodeNumber

public BEValue bdecodeNumber()
                      throws java.io.IOException
Returns the next bencoded value on the stream and makes sure it is a number. If it is not a number it will throw InvalidBEncodingException.

Throws:
java.io.IOException

bdecodeList

public BEValue bdecodeList()
                    throws java.io.IOException
Returns the next bencoded value on the stream and makes sure it is a list. If it is not a list it will throw InvalidBEncodingException.

Throws:
java.io.IOException

bdecodeMap

public BEValue bdecodeMap()
                   throws java.io.IOException
Returns the next bencoded value on the stream and makes sure it is a map (dictonary). If it is not a map it will throw InvalidBEncodingException.

Throws:
java.io.IOException