001 /*
002 * Copyright (c) Andrey Kuznetsov. All Rights Reserved.
003 *
004 * http://res.imagero.com
005 *
006 * Redistribution and use in source and binary forms, with or without
007 * modification, are permitted provided that the following conditions are met:
008 *
009 * o Redistributions of source code must retain the above copyright notice,
010 * this list of conditions and the following disclaimer.
011 *
012 * o Redistributions in binary form must reproduce the above copyright notice,
013 * this list of conditions and the following disclaimer in the documentation
014 * and/or other materials provided with the distribution.
015 *
016 * o Neither the name of Andrey Kuznetsov nor the names of
017 * its contributors may be used to endorse or promote products derived
018 * from this software without specific prior written permission.
019 *
020 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
021 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
022 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
023 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
024 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
025 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
026 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
027 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
028 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
029 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
030 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
031 */
032
033 package com.imagero.uio.io;
034
035 import java.io.IOException;
036 import java.io.InputStream;
037
038 /**
039 * InputStream for decoding data from base64 encoded String array
040 * @author Andrey Kuznetsov
041 */
042 public class Base64DInputStream extends InputStream {
043
044 boolean finished;
045
046 protected byte[] buffer;
047 String[] s;
048
049 int current;
050
051 int p;
052
053 public Base64DInputStream(String[] s) {
054 this.s = s;
055 }
056
057 /**
058 * decode next byte
059 * @return int
060 * @throws IOException
061 */
062 public int read() throws IOException {
063 if (finished) {
064 return -1;
065 }
066 if (buffer == null || p >= buffer.length) {
067 next();
068 }
069 if (buffer == null) {
070 finished = true;
071 return -1;
072 }
073 try {
074 return buffer[p++] & 0xFF;
075 }
076 catch (ArrayIndexOutOfBoundsException ex) {
077 System.err.println(p + " " + buffer.length);
078 throw ex;
079 }
080 }
081
082 /**
083 * switch to next String
084 */
085 protected void next() throws IOException {
086 if (finished) {
087 buffer = null;
088 p = 0;
089 return;
090 }
091 if (current < s.length) {
092 String s = this.s[current++];
093 buffer = Base64.base64Decode(s);
094 p = 0;
095 }
096 else {
097 finished = true;
098 buffer = null;
099 p = 0;
100 }
101 }
102 }