diff options
Diffstat (limited to 'src/main/java/com/kitfox/svg/xml/Base64InputStream.java')
-rwxr-xr-x | src/main/java/com/kitfox/svg/xml/Base64InputStream.java | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/src/main/java/com/kitfox/svg/xml/Base64InputStream.java b/src/main/java/com/kitfox/svg/xml/Base64InputStream.java new file mode 100755 index 0000000..3851c39 --- /dev/null +++ b/src/main/java/com/kitfox/svg/xml/Base64InputStream.java @@ -0,0 +1,82 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ + +package com.kitfox.svg.xml; + +import java.io.FilterInputStream; +import java.io.IOException; +import java.io.InputStream; + +/** + * + * @author kitfox + */ +public class Base64InputStream extends FilterInputStream +{ + int buf; //Cached bytes to read + int bufSize; //Number of bytes waiting to be read from buffer + boolean drain = false; //After set, read no more chunks + + public Base64InputStream(InputStream in) + { + super(in); + } + + public int read() throws IOException + { + if (drain && bufSize == 0) + { + return -1; + } + + if (bufSize == 0) + { + //Read next chunk into 4 byte buffer + int chunk = in.read(); + if (chunk == -1) + { + drain = true; + return -1; + } + + //get remaining 3 bytes + for (int i = 0; i < 3; ++i) + { + int value = in.read(); + if (value == -1) + { + throw new IOException("Early termination of base64 stream"); + } + chunk = (chunk << 8) | (value & 0xff); + } + + //Check for special termination characters + if ((chunk & 0xffff) == (((byte)'=' << 8) | (byte)'=')) + { + bufSize = 1; + drain = true; + } + else if ((chunk & 0xff) == (byte)'=') + { + bufSize = 2; + drain = true; + } + else + { + bufSize = 3; + } + + //Fill buffer with decoded characters + for (int i = 0; i < bufSize + 1; ++i) + { + buf = (buf << 6) | Base64Util.decodeByte((chunk >> 24) & 0xff); + chunk <<= 8; + } + } + + //Return nth remaing bte & decrement counter + return (buf >> (--bufSize * 8)) & 0xff; + } +} |