org.spaceroots.jarmor
Class UUDecoder

java.lang.Object
  extended byjava.io.InputStream
      extended byjava.io.FilterInputStream
          extended byorg.spaceroots.jarmor.AbstractDecoder
              extended byorg.spaceroots.jarmor.UUDecoder

public class UUDecoder
extends org.spaceroots.jarmor.AbstractDecoder

This class decodes a text stream containing into a binary stream.

The UU encoding is suitable when binary data needs to be transmitted or stored as text. It was used to send binary data through UUCP (Unix to Unix Copy Protocol). The encoded text uses a subset of the ASCII character set.

The encoded data is preceded by a header line starting with the keyword begin and it is followed by two trailer lines, the last one starting with the keyword end. Lines preceding the header line or following the trailer lines are allowed and silently ignored.

The encoded stream is about 38% larger than the corresponding binary stream (6 binary bits are converted into 8 encoded bits, there are stream header and trailer, and each 60 encoded bytes chunk is started by a control character and ended by a newline).

Author:
Luc Maisonobe
See Also:
UUEncoder

Field Summary
protected  byte[] encoded
          Encoded bytes buffer.
protected  boolean endReached
          End indicator.
protected  int nEncoded
          Number of bytes already in the encoded array.
 
Fields inherited from class java.io.FilterInputStream
in
 
Constructor Summary
UUDecoder(InputStream in)
          Create a decoder wrapping a source of encoded data.
 
Method Summary
 int available()
          Get the number of bytes that can be read from this input stream without blocking.
 void close()
          Close the stream.
protected  int filterBytes()
          Filter some bytes from the underlying stream.
 int getGroupPerms()
          Get the access permissions for the group of the file.
 String getName()
          Get the name of the file.
 int getOthersPerms()
          Get the access permissions for others.
 int getUserPerms()
          Get the access permissions for the user (owner) of the file.
 boolean markSupported()
          Check if the FilterInputStream.mark(int) and FilterInputStream.reset() methods are supported.
protected  void putFilteredByte(int b)
          Put a filtered byte in the buffer.
 int read()
          Reads the next byte of data from this input stream.
 int read(byte[] b, int off, int len)
          Reads up to len bytes of data from this input stream into an array of bytes.
protected  int readEncodedBytes()
          Read new encoded bytes.
 long skip(long n)
          Skips over and discards n bytes of data from the input stream.
 
Methods inherited from class java.io.FilterInputStream
mark, read, reset
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

encoded

protected byte[] encoded
Encoded bytes buffer.


nEncoded

protected int nEncoded
Number of bytes already in the encoded array.


endReached

protected boolean endReached
End indicator.

Constructor Detail

UUDecoder

public UUDecoder(InputStream in)
Create a decoder wrapping a source of encoded data.

Parameters:
in - source of encoded data to decode
Method Detail

getName

public String getName()
Get the name of the file.

This name is relevant only if the decoded data is to be stored in a file, it is the name that was provided inside the stream by the encoder.

Returns:
the name of the file

getUserPerms

public int getUserPerms()
Get the access permissions for the user (owner) of the file.

These permissions are relevant only if the decoded data is to be stored in a file, the value returned was provided inside the stream by the encoder. They are specified by or-ing together the desired bits patterns UUEncoder.READ, UUEncoder.WRITE and UUEncoder.EXECUTE.

Returns:
access permissions for the user
See Also:
getGroupPerms(), getOthersPerms()

getGroupPerms

public int getGroupPerms()
Get the access permissions for the group of the file.

These permissions are relevant only if the decoded data is to be stored in a file, the value returned was provided inside the stream by the encoder. They are specified by or-ing together the desired bits patterns UUEncoder.READ, UUEncoder.WRITE and UUEncoder.EXECUTE.

Returns:
access permissions for the group
See Also:
getUserPerms(), getOthersPerms()

getOthersPerms

public int getOthersPerms()
Get the access permissions for others.

These permissions are relevant only if the decoded data is to be stored in a file, the value returned was provided inside the stream by the encoder. They are specified by or-ing together the desired bits patterns UUEncoder.READ, UUEncoder.WRITE and UUEncoder.EXECUTE.

Returns:
access permissions others
See Also:
getUserPerms(), getGroupPerms()

filterBytes

protected int filterBytes()
                   throws IOException
Filter some bytes from the underlying stream.

Returns:
number of bytes inserted in the filtered bytes buffer or -1 if the underlying stream has no bytes left
Throws:
IOException - if the underlying stream throws one
See Also:
AbstractDecoder.putFilteredByte(int)

available

public int available()
              throws IOException
Get the number of bytes that can be read from this input stream without blocking.

Returns:
number of bytes that can be read from this input stream without blocking
Throws:
IOException - if the underlying stream throws one

read

public int read()
         throws IOException
Reads the next byte of data from this input stream.

Returns:
the next byte of data, or -1 if the end of the stream is reached.
Throws:
IOException - if the underlying stream throws one

read

public int read(byte[] b,
                int off,
                int len)
         throws IOException
Reads up to len bytes of data from this input stream into an array of bytes.

Parameters:
b - the buffer into which the data is read.
off - the start offset of the data.
len - the maximum number of bytes read.
Returns:
the total number of bytes read into the buffer, or -1 if there is no more data because the end of the stream has been reached
Throws:
IOException - if the underlying stream throws one

skip

public long skip(long n)
          throws IOException
Skips over and discards n bytes of data from the input stream.

Parameters:
n - the number of bytes to be skipped
Returns:
the actual number of bytes skipped
Throws:
IOException - if the underlying stream throws one

close

public void close()
           throws IOException
Close the stream.

Throws:
IOException - if the underlying stream throws one

markSupported

public boolean markSupported()
Check if the FilterInputStream.mark(int) and FilterInputStream.reset() methods are supported.

Returns:
always false

readEncodedBytes

protected int readEncodedBytes()
                        throws IOException
Read new encoded bytes.

Returns:
number of bytes read or -1 if the underlying stream has no bytes left
Throws:
IOException - if the underlying stream throws one

putFilteredByte

protected void putFilteredByte(int b)
Put a filtered byte in the buffer.

The filtered bytes buffer will be expanded if it already contains too many pending bytes.

Parameters:
b - byte to put in the filtered buffer


Copyright © 2005-2006 Luc Maisonobe. All Rights Reserved.