/* 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 <warrenl@cygnus.com>
 * @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)
  {
    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;

    if (enum != null)
      {
        if (enum.hasMoreElements())
	  nextIn = (InputStream) enum.nextElement();
      }
    else
      if (in2 != null)
	{
	  nextIn = in2;
	  in2 = null;
	}

    return nextIn;
  }
}
