home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 1995 November
/
PCWK1195.iso
/
inne
/
win95
/
sieciowe
/
hotja32.lzh
/
hotjava
/
classsrc
/
java
/
util
/
characterdecoder.java
< prev
next >
Wrap
Text File
|
1995-08-11
|
6KB
|
179 lines
/*
* @(#)CharacterDecoder.java 1.2 95/03/29 Chuck McManis
*
* Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved.
*
* Permission to use, copy, modify, and distribute this software
* and its documentation for NON-COMMERCIAL purposes and without
* fee is hereby granted provided that this copyright notice
* appears in all copies. Please refer to the file "copyright.html"
* for further important copyright and licensing information.
*
* SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
* THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
* TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
* ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
* DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
*/
package java.util;
import java.io.OutputStream;
import java.io.OutputStreamBuffer;
import java.io.InputStream;
import java.io.InputStreamBuffer;
/**
* This class defines the decoding half of character encoders.
* A character decoder is an algorithim for transforming 8 bit
* binary data that has been encoded into text by a character
* encoder, back into original binary form.
*
* The character encoders, in general, have been structured
* around a central theme that binary data can be encoded into
* text that has the form:
*
* <pre>
* [Buffer Prefix]
* [Line Prefix][encoded data atoms][Line Suffix]
* [Buffer Suffix]
* </pre>
*
* Of course in the simplest encoding schemes, the buffer has no
* distinct prefix of suffix, however all have some fixed relationship
* between the text in an 'atom' and the binary data itself.
*
* In the CharacterEncoder and CharacterDecoder classes, one complete
* chunk of data is referred to as a <i>buffer</i>. Encoded buffers
* are all text, and decoded buffers (sometimes just referred to as
* buffers) are binary octets.
*
* To create a custom decoder, you must, at a minimum, overide three
* abstract methods in this class.
* <DL>
* <DD>bytesPerAtom which tells the decoder how many bytes to
* expect from decodeAtom
* <DD>decodeAtom which decodes the bytes sent to it as text.
* <DD>bytesPerLine which tells the encoder the maximum number of
* bytes per line.
* </DL>
*
* In general, the character decoders return error in the form of a
* CEFormatException. The syntax of the detail string is
* <pre>
* DecoderClassName: Error message.
* </pre>
*
* Several useful decoders have already been written and are
* referenced in the See Also list below.
*
* @version 29 Mar 1995, 1.2
* @author Chuck McManis
* @see CEFormatException
* @see CharacterEncoder
* @see UCDecoder
* @see UUDecoder
* @see BASE64Decoder
*/
public class CharacterDecoder {
/** Return the number of bytes per atom of decoding */
abstract int bytesPerAtom();
/** Return the maximum number of bytes that can be encoded per line */
abstract int bytesPerLine();
/** decode the beginning of the buffer, by default this is a NOP. */
void decodeBufferPrefix(InputStream aStream, OutputStream bStream) { }
/** decode the buffer suffix, again by default it is a NOP. */
void decodeBufferSuffix(InputStream aStream, OutputStream bStream) { }
/**
* This method should return, if it knows, the number of bytes
* that will be decoded. Many formats such as uuencoding provide
* this information. By default we return the maximum bytes that
* could have been encoded on the line.
*/
int decodeLinePrefix(InputStream aStream, OutputStream bStream) {
return (bytesPerLine());
}
/**
* This method post processes the line, if there are error detection
* or correction codes in a line, they are generally processed by
* this method. The simplest version of this method looks for the
* (newline) character.
*/
void decodeLineSuffix(InputStream aStream, OutputStream bStream) { }
/**
* This method does an actual decode. It takes the decoded bytes and
* writes them to the OuputStream. The integer <i>l</i> tells the
* method how many bytes are required. This is always <= bytesPerAtom().
*/
void decodeAtom(InputStream aStream, OutputStream bStream, int l) {
throw new CEStreamExhausted();
}
/**
* Decode the text from the InputStream and write the decoded
* octets to the OutputStream. This method runs until the stream
* is exhausted.
* @exception CEFormatException An error has occured while decoding
* @exception CEStreamExhausted The input stream is unexpectedly out of data
*/
public void decodeBuffer(InputStream aStream, OutputStream bStream) {
int i;
decodeBufferPrefix(aStream, bStream);
while (true) {
int length;
try {
length = decodeLinePrefix(aStream, bStream);
for (i = 0; (i+bytesPerAtom()) < length; i += bytesPerAtom()) {
decodeAtom(aStream, bStream, bytesPerAtom());
}
if ((i + bytesPerAtom()) == length) {
decodeAtom(aStream, bStream, bytesPerAtom());
} else {
decodeAtom(aStream, bStream, (i + bytesPerAtom()) - length);
}
decodeLineSuffix(aStream, bStream);
} catch (CEStreamExhausted e) {
break;
}
}
decodeBufferSuffix(aStream, bStream);
}
/**
* Alternate decode interface that takes a String containing the encoded
* buffer and returns a byte array containing the data.
* @exception CEFormatException An error has occured while decoding
*/
public byte decodeBuffer(String inputString)[] {
byte inputBuffer[] = new byte[inputString.length()];
InputStreamBuffer inStream;
OutputStreamBuffer outStream;
inputString.getBytes(0, inputString.length(), inputBuffer, 0);
inStream = new InputStreamBuffer(inputBuffer);
outStream = new OutputStreamBuffer();
decodeBuffer(inStream, outStream);
return (outStream.toByteArray());
}
/**
* Decode the contents of the inputstream into a buffer.
*/
public byte decodeBuffer(InputStream in)[] {
OutputStreamBuffer outStream = new OutputStreamBuffer();
decodeBuffer(in, outStream);
return (outStream.toByteArray());
}
}