summaryrefslogtreecommitdiffstats
path: root/simple/simple-common/src/main/java/org/simpleframework/common/encode/Base64InputStream.java
diff options
context:
space:
mode:
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.java123
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);
+ }
+}