/* Copyright (C) 1998, 1999 Cygnus Solutions This file is part of libgcj. This software is copyrighted work licensed under the terms of the Libgcj License. Please consult the file "LIBGCJ_LICENSE" for details. */ package java.io; import java.util.Enumeration; /** * @author Warren Levy * @date November 3, 1998. */ /* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status: Believed complete and correct. */ public class SequenceInputStream extends InputStream { /* The handle for the current input stream. */ private InputStream in; /* Secondary input stream; not used if constructed w/ enumeration. */ private InputStream in2; /* The enum handle; not used if constructed w/ 2 explicit input streams. */ private Enumeration enum; public SequenceInputStream(Enumeration e) { // FIXME: Assumes that enum contains only InputStreams. enum = e; in = (InputStream) enum.nextElement(); in2 = null; } public SequenceInputStream(InputStream s1, InputStream s2) { in = s1; in2 = s2; } public int available() throws IOException { if (in == null) return 0; return in.available(); } public void close() throws IOException { while (in != null) { in.close(); in = getNextStream (); } } public int read() throws IOException { int ch = -1; while (in != null && (ch = in.read()) < 0) { in.close(); in = getNextStream(); } return ch; } public int read(byte[] b, int off, int len) throws IOException { int ch = -1; // The validity of the parameters will be checked by in.read so // don't bother doing it here. while (in != null && (ch = in.read(b, off, len)) < 0) { in.close(); in = getNextStream(); } return ch; } private InputStream getNextStream() { InputStream nextIn = null; // FIXME: Assumes that enum contains only InputStreams. if (enum != null) { if (enum.hasMoreElements()) nextIn = (InputStream) enum.nextElement(); } else if (in2 != null) { nextIn = in2; in2 = null; } return nextIn; } }