151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 248faf4ee21028b39dac2b459f0b560d743426801Przemyslaw Szczepaniak * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage sun.misc; 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.OutputStream; 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.ByteArrayOutputStream; 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.InputStream; 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.PushbackInputStream; 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.ByteArrayInputStream; 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.io.IOException; 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.nio.ByteBuffer; 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This class defines the decoding half of character encoders. 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * A character decoder is an algorithim for transforming 8 bit 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * binary data that has been encoded into text by a character 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * encoder, back into original binary form. 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The character encoders, in general, have been structured 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * around a central theme that binary data can be encoded into 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * text that has the form: 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <pre> 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * [Buffer Prefix] 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * [Line Prefix][encoded data atoms][Line Suffix] 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * [Buffer Suffix] 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </pre> 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Of course in the simplest encoding schemes, the buffer has no 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * distinct prefix of suffix, however all have some fixed relationship 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * between the text in an 'atom' and the binary data itself. 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * In the CharacterEncoder and CharacterDecoder classes, one complete 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * chunk of data is referred to as a <i>buffer</i>. Encoded buffers 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * are all text, and decoded buffers (sometimes just referred to as 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * buffers) are binary octets. 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * To create a custom decoder, you must, at a minimum, overide three 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * abstract methods in this class. 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <DL> 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <DD>bytesPerAtom which tells the decoder how many bytes to 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * expect from decodeAtom 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <DD>decodeAtom which decodes the bytes sent to it as text. 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <DD>bytesPerLine which tells the encoder the maximum number of 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * bytes per line. 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </DL> 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * In general, the character decoders return error in the form of a 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * CEFormatException. The syntax of the detail string is 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <pre> 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DecoderClassName: Error message. 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </pre> 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Several useful decoders have already been written and are 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * referenced in the See Also list below. 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author Chuck McManis 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see CEFormatException 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see CharacterEncoder 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see UCDecoder 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see UUDecoder 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see BASE64Decoder 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic abstract class CharacterDecoder { 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** Return the number of bytes per atom of decoding */ 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski abstract protected int bytesPerAtom(); 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** Return the maximum number of bytes that can be encoded per line */ 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski abstract protected int bytesPerLine(); 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** decode the beginning of the buffer, by default this is a NOP. */ 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected void decodeBufferPrefix(PushbackInputStream aStream, OutputStream bStream) throws IOException { } 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** decode the buffer suffix, again by default it is a NOP. */ 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected void decodeBufferSuffix(PushbackInputStream aStream, OutputStream bStream) throws IOException { } 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This method should return, if it knows, the number of bytes 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * that will be decoded. Many formats such as uuencoding provide 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * this information. By default we return the maximum bytes that 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * could have been encoded on the line. 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected int decodeLinePrefix(PushbackInputStream aStream, OutputStream bStream) throws IOException { 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return (bytesPerLine()); 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This method post processes the line, if there are error detection 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or correction codes in a line, they are generally processed by 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * this method. The simplest version of this method looks for the 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (newline) character. 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected void decodeLineSuffix(PushbackInputStream aStream, OutputStream bStream) throws IOException { } 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This method does an actual decode. It takes the decoded bytes and 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * writes them to the OutputStream. The integer <i>l</i> tells the 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * method how many bytes are required. This is always <= bytesPerAtom(). 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected void decodeAtom(PushbackInputStream aStream, OutputStream bStream, int l) throws IOException { 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new CEStreamExhausted(); 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This method works around the bizarre semantics of BufferedInputStream's 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * read method. 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected int readFully(InputStream in, byte buffer[], int offset, int len) 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws java.io.IOException { 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (int i = 0; i < len; i++) { 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int q = in.read(); 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (q == -1) 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return ((i == 0) ? -1 : i); 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski buffer[i+offset] = (byte)q; 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return len; 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Decode the text from the InputStream and write the decoded 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * octets to the OutputStream. This method runs until the stream 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is exhausted. 14848faf4ee21028b39dac2b459f0b560d743426801Przemyslaw Szczepaniak * @exception CEFormatException An error has occurred while decoding 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception CEStreamExhausted The input stream is unexpectedly out of data 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void decodeBuffer(InputStream aStream, OutputStream bStream) throws IOException { 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int i; 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int totalBytes = 0; 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski PushbackInputStream ps = new PushbackInputStream (aStream); 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski decodeBufferPrefix(ps, bStream); 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (true) { 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski int length; 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski length = decodeLinePrefix(ps, bStream); 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for (i = 0; (i+bytesPerAtom()) < length; i += bytesPerAtom()) { 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski decodeAtom(ps, bStream, bytesPerAtom()); 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski totalBytes += bytesPerAtom(); 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if ((i + bytesPerAtom()) == length) { 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski decodeAtom(ps, bStream, bytesPerAtom()); 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski totalBytes += bytesPerAtom(); 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } else { 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski decodeAtom(ps, bStream, length - i); 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski totalBytes += (length - i); 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski decodeLineSuffix(ps, bStream); 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (CEStreamExhausted e) { 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski break; 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski decodeBufferSuffix(ps, bStream); 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Alternate decode interface that takes a String containing the encoded 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * buffer and returns a byte array containing the data. 18448faf4ee21028b39dac2b459f0b560d743426801Przemyslaw Szczepaniak * @exception CEFormatException An error has occurred while decoding 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public byte decodeBuffer(String inputString)[] throws IOException { 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski byte inputBuffer[] = new byte[inputString.length()]; 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ByteArrayInputStream inStream; 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ByteArrayOutputStream outStream; 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski inputString.getBytes(0, inputString.length(), inputBuffer, 0); 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski inStream = new ByteArrayInputStream(inputBuffer); 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski outStream = new ByteArrayOutputStream(); 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski decodeBuffer(inStream, outStream); 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return (outStream.toByteArray()); 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Decode the contents of the inputstream into a buffer. 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public byte decodeBuffer(InputStream in)[] throws IOException { 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ByteArrayOutputStream outStream = new ByteArrayOutputStream(); 20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski decodeBuffer(in, outStream); 20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return (outStream.toByteArray()); 20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Decode the contents of the String into a ByteBuffer. 20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public ByteBuffer decodeBufferToByteBuffer(String inputString) 21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws IOException { 21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return ByteBuffer.wrap(decodeBuffer(inputString)); 21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Decode the contents of the inputStream into a ByteBuffer. 21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public ByteBuffer decodeBufferToByteBuffer(InputStream in) 21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws IOException { 22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return ByteBuffer.wrap(decodeBuffer(in)); 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 223