X-Git-Url: http://git.nikiroo.be/?p=fanfix.git;a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2Fstreams%2FBase64InputStream.java;fp=src%2Fbe%2Fnikiroo%2Futils%2Fstreams%2FBase64InputStream.java;h=0000000000000000000000000000000000000000;hp=a3afaefc66191d1bdb5f742d609f1af9ce5eabf5;hb=46add0670fdee4bd936a13fe2448c5e20a7ffd0a;hpb=1b5197ed4ceec2025a9a40c417b37c646b756138 diff --git a/src/be/nikiroo/utils/streams/Base64InputStream.java b/src/be/nikiroo/utils/streams/Base64InputStream.java deleted file mode 100644 index a3afaef..0000000 --- a/src/be/nikiroo/utils/streams/Base64InputStream.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package be.nikiroo.utils.streams; - -import java.io.FilterInputStream; -import java.io.IOException; -import java.io.InputStream; - -/** - * An InputStream that does Base64 decoding on the data read through - * it. - */ -public class Base64InputStream extends FilterInputStream { - private final Base64.Coder coder; - - private static byte[] EMPTY = new byte[0]; - - private static final int BUFFER_SIZE = 2048; - private boolean eof; - private byte[] inputBuffer; - private int outputStart; - private int outputEnd; - - /** - * An InputStream that performs Base64 decoding on the data read - * from the wrapped stream. - * - * @param in the InputStream to read the source data from - */ - public Base64InputStream(InputStream in) { - this(in, false); - } - - /** - * Performs Base64 encoding or decoding on the data read from the - * wrapped InputStream. - * - * @param in the InputStream to read the source data from - * @param flags bit flags for controlling the decoder; see the - * constants in {@link Base64} - * @param encode true to encode, false to decode - * - * @hide - */ - public Base64InputStream(InputStream in, boolean encode) { - super(in); - eof = false; - inputBuffer = new byte[BUFFER_SIZE]; - if (encode) { - coder = new Base64.Encoder(Base64.NO_WRAP, null); - } else { - coder = new Base64.Decoder(Base64.NO_WRAP, null); - } - coder.output = new byte[coder.maxOutputSize(BUFFER_SIZE)]; - outputStart = 0; - outputEnd = 0; - } - - @Override - public boolean markSupported() { - return false; - } - - @SuppressWarnings("sync-override") - @Override - public void mark(int readlimit) { - throw new UnsupportedOperationException(); - } - - @SuppressWarnings("sync-override") - @Override - public void reset() { - throw new UnsupportedOperationException(); - } - - @Override - public void close() throws IOException { - in.close(); - inputBuffer = null; - } - - @Override - public int available() { - return outputEnd - outputStart; - } - - @Override - public long skip(long n) throws IOException { - if (outputStart >= outputEnd) { - refill(); - } - if (outputStart >= outputEnd) { - return 0; - } - long bytes = Math.min(n, outputEnd-outputStart); - outputStart += bytes; - return bytes; - } - - @Override - public int read() throws IOException { - if (outputStart >= outputEnd) { - refill(); - } - if (outputStart >= outputEnd) { - return -1; - } - - return coder.output[outputStart++] & 0xff; - } - - @Override - public int read(byte[] b, int off, int len) throws IOException { - if (outputStart >= outputEnd) { - refill(); - } - if (outputStart >= outputEnd) { - return -1; - } - int bytes = Math.min(len, outputEnd-outputStart); - System.arraycopy(coder.output, outputStart, b, off, bytes); - outputStart += bytes; - return bytes; - } - - /** - * Read data from the input stream into inputBuffer, then - * decode/encode it into the empty coder.output, and reset the - * outputStart and outputEnd pointers. - */ - private void refill() throws IOException { - if (eof) return; - int bytesRead = in.read(inputBuffer); - boolean success; - if (bytesRead == -1) { - eof = true; - success = coder.process(EMPTY, 0, 0, true); - } else { - success = coder.process(inputBuffer, 0, bytesRead, false); - } - if (!success) { - throw new IOException("bad base-64"); - } - outputEnd = coder.op; - outputStart = 0; - } -}