diff options
Diffstat (limited to 'simple/simple-common/src/main/java/org/simpleframework/common/encode/Base64InputStream.java')
-rw-r--r-- | simple/simple-common/src/main/java/org/simpleframework/common/encode/Base64InputStream.java | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/simple/simple-common/src/main/java/org/simpleframework/common/encode/Base64InputStream.java b/simple/simple-common/src/main/java/org/simpleframework/common/encode/Base64InputStream.java new file mode 100644 index 0000000..8aa28af --- /dev/null +++ b/simple/simple-common/src/main/java/org/simpleframework/common/encode/Base64InputStream.java @@ -0,0 +1,123 @@ +/* + * Base64InputStream.java February 2014 + * + * Copyright (C) 2014, Niall Gallagher <niallg@users.sf.net> + * + * 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 org.simpleframework.common.encode; + +import java.io.IOException; +import java.io.InputStream; + +/** + * The <code>Base64InputStream</code> is used to read base64 text in + * the form of a string through a conventional input stream. This is + * provided for convenience so that it is possible to encode and + * decode binary data as base64 for implementations that would + * normally use a binary format. + * + * @author Niall Gallagher + * + * @see org.simpleframework.common.encode.Base64Encoder + */ +public class Base64InputStream extends InputStream { + + /** + * This is that original base64 text that is to be decoded. + */ + private char[] encoded; + + /** + * This is used to accumulate the decoded text as an array. + */ + private byte[] decoded; + + /** + * This is a temporary buffer used to read one byte at a time. + */ + private byte[] temp; + + /** + * This is the total number of bytes that have been read. + */ + private int count; + + /** + * Constructor for the <code>Base64InputStream</code> object. + * This takes an encoded string and reads it as binary data. + * + * @param source this string containing the encoded data + */ + public Base64InputStream(String source) { + this.encoded = source.toCharArray(); + this.temp = new byte[1]; + } + + /** + * This is used to read the next byte decoded from the text. If + * the data has been fully consumed then this will return the + * standard -1. + * + * @return this returns the next octet decoded + */ + @Override + public int read() throws IOException { + int count = read(temp); + + if (count == -1) { + return -1; + } + return temp[0] & 0xff; + } + + /** + * This is used to read the next byte decoded from the text. If + * the data has been fully consumed then this will return the + * standard -1. + * + * @param array this is the array to decode the text to + * @param offset this is the offset to decode in to the array + * @param this is the number of bytes available to decode to + * + * @return this returns the number of octets decoded + */ + @Override + public int read(byte[] array, int offset, int length) throws IOException { + if (decoded == null) { + decoded = Base64Encoder.decode(encoded); + } + if (count >= decoded.length) { + return -1; + } + int size = Math.min(length, decoded.length - count); + + if (size > 0) { + System.arraycopy(decoded, count, array, offset, size); + count += size; + } + return size; + } + + /** + * This returns the original base64 text that was encoded. This + * is useful for debugging purposes to see the source data. + * + * @return this returns the original base64 text to decode + */ + @Override + public String toString() { + return new String(encoded); + } +} |