home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 November / PCWorld_2000-11_cd.bin / Komunik / sambar444 / _SETUP.1 / javaeng.jar / javax / servlet / ServletInputStream.java < prev    next >
Text File  |  2000-08-09  |  4KB  |  120 lines

  1. /*
  2.  * ServletInputStream.java -- InputStream for reading servlet requests
  3.  *
  4.  * Copyright (c) 1998, 1999 by Free Software Foundation, Inc.
  5.  * Written by Paul Siegmann (pauls@euronet.nl)
  6.  *
  7.  * This program is free software; you can redistribute it and/or modify
  8.  * it under the terms of the GNU Library General Public License as published
  9.  * by the Free Software Foundation, version 2. (see COPYING.LIB)
  10.  *
  11.  * This program is distributed in the hope that it will be useful, but
  12.  * WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program; if not, write to the Free Software Foundation
  18.  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307 USA
  19.  */
  20.  
  21. package javax.servlet;
  22.  
  23. import java.io.InputStream;
  24. import java.io.IOException;
  25.  
  26.  
  27. /**
  28.  * This class serves as a stream where servlets can read data supplied by
  29.  * the client from.
  30.  *
  31.  * @version Servlet API 2.2
  32.  * @since Servlet API 1.0
  33.  * @author Paul Siegmann (pauls@euronet.nl)
  34.  */
  35. public abstract class ServletInputStream
  36.     extends InputStream 
  37. {
  38.     /**
  39.      * Does nothing.
  40.      *
  41.      * @since Servlet API 1.0
  42.      */
  43.     protected ServletInputStream() {
  44.     }
  45.  
  46.     /**
  47.      * This method read bytes from a stream and stores them into a caller
  48.      * supplied buffer.  It starts storing the data at index
  49.      * <code>offset</code> into the buffer and attempts to read until a 
  50.      * end of line ('\n') is encountered or <code>length</code> bytes are
  51.      * read.
  52.      * This method can return before reading the number of bytes requested.
  53.      * The actual number of bytes read is returned as an int.
  54.      * A -1 is returned to indicate the end of the stream.
  55.      * 
  56.      * This method will block until some data can be read.
  57.      *
  58.      * This method operates by calling the single byte <code>read()</code>
  59.      * method in a loop until the desired number of bytes are read.
  60.      * The read loop stops short if the end of the stream is encountered
  61.      * or if an IOException is encountered on any read operation except
  62.      * the first.  If the first attempt to read a bytes fails, the
  63.      * IOException is allowed to propagate upward. And subsequent
  64.      * IOException is caught and treated identically to an end of stream
  65.      * condition.  Subclasses can (and should if possible)
  66.      * override this method to provide a more efficient implementation.
  67.      *
  68.      * @since Servlet API 1.0
  69.      *
  70.      * @param buffer The array into which the bytes read should be stored
  71.      * @param offset The offset into the array to start storing bytes
  72.      * @param length The maximum number of bytes to read
  73.      *
  74.      * @return The actual number of bytes read, or -1 if end of stream.
  75.      *
  76.      * @exception IOException If an error occurs.
  77.      */
  78.     public int readLine(byte[] buffer, int offset, int length) throws IOException {
  79.     /* Note:
  80.         Both the code and the javadocs are originally from Aaron
  81.         M. Renn's (arenn@urbanophile.com) java.io.InputStream code.
  82.         I have adapted it to my coding style and added the '\n'
  83.         detection. I like free software!
  84.     */
  85.         if (length == 0) {
  86.             return(0);
  87.         }
  88.  
  89.         // Read the first byte here in order to allow IOException's to 
  90.         // propagate up
  91.         int readChar = read();
  92.         if (readChar == -1) {
  93.             return(-1);
  94.         }
  95.         buffer[offset] = (byte)readChar;
  96.  
  97.         int totalRead = 1;
  98.  
  99.         // Read the rest of the bytes
  100.         try {
  101.             for (int i = 1; i < length; i++) {
  102.                 if(readChar == '\n') {
  103.  
  104.                     return(totalRead);
  105.                 }
  106.                 readChar = read();
  107.                 if (readChar == -1) {
  108.                     return(totalRead);
  109.                 }
  110.                 buffer[offset + i] = (byte)readChar;
  111.                 totalRead++;
  112.             }
  113.         } catch (IOException e) {
  114.             return(totalRead);
  115.         }
  116.  
  117.         return(totalRead);
  118.     }
  119. }
  120.