SWIbufferedInputStream.cpp
上传用户:xqtpzdz
上传日期:2022-05-21
资源大小:1764k
文件大小:6k
源码类别:

xml/soap/webservice

开发平台:

Visual C++

  1. /****************License************************************************
  2.  * Vocalocity OpenVXI
  3.  * Copyright (C) 2004-2005 by Vocalocity, Inc. All Rights Reserved.
  4.  * This program is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU General Public License
  6.  * as published by the Free Software Foundation; either version 2
  7.  * of the License, or (at your option) any later version.
  8.  *  
  9.  * This program is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  * GNU General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  17.  * Vocalocity, the Vocalocity logo, and VocalOS are trademarks or 
  18.  * registered trademarks of Vocalocity, Inc. 
  19.  * OpenVXI is a trademark of Scansoft, Inc. and used under license 
  20.  * by Vocalocity.
  21.  ***********************************************************************/
  22. #include "SWIbufferedInputStream.hpp"
  23. #include "SWIoutputStream.hpp"
  24. #include <string.h>
  25. SWIbufferedInputStream::SWIbufferedInputStream(SWIinputStream *stream,
  26.                                      int bufSize, int lookAhead,
  27.                                      bool ownStream):
  28.   SWIfilterInputStream(stream, ownStream),
  29.   _eofSeen(false), _buffer(NULL)
  30. {
  31.   _lookAhead = (lookAhead < 1) ? 1 : lookAhead;
  32.   if (bufSize < 1) bufSize = 1;
  33.   _readSize = bufSize > _lookAhead ? bufSize : _lookAhead;
  34.   _pos = _end = _buffer =
  35.     new unsigned char[bufSize + _lookAhead - 1];
  36. }
  37. SWIbufferedInputStream::~SWIbufferedInputStream()
  38. {
  39.   close();
  40. }
  41. int SWIbufferedInputStream::read()
  42. {
  43.   if (_buffer == NULL) return ILLEGAL_STATE;
  44.   if (_pos < _end) return *_pos++;
  45.   int rc = fillBuffer();
  46.   if (rc < 0) return rc;
  47.   rc = *_pos++;
  48.   return rc;
  49. }
  50. int SWIbufferedInputStream::readBytes(void *data, int dataSize)
  51. {
  52.   if (_buffer == NULL) return ILLEGAL_STATE;
  53.   if (dataSize  < 0 ) return INVALID_ARGUMENT;
  54.   if (data == NULL && dataSize > 0) return INVALID_ARGUMENT;
  55.   unsigned char *p0 = static_cast<unsigned char *>(data);
  56.   unsigned char *p = p0;
  57.   unsigned char *q = p0 + dataSize;
  58.   int rc = SWIstream::SUCCESS;
  59.   for (;;)
  60.   {
  61.     while (_pos < _end && p < q) *p++ = *_pos++;
  62.     // Have we read the required number of bytes?
  63.     if (p == q) break;
  64.     // Ran out of bytes in our buffer.  Only fill the buffer if that would
  65.     // not block and we haven't read a byte yet.
  66.     if (p > p0 && SWIfilterInputStream::waitReady(0) != SUCCESS) break;
  67.     // Bail out if an error occurs while filling the buffer.
  68.     if ((rc = fillBuffer()) < 0) break;
  69.   }
  70.   int nbRead = p - p0;
  71.   return nbRead > 0 ? nbRead : rc;
  72. }
  73. int SWIbufferedInputStream::peek(int offset) const
  74. {
  75.   if (offset < 0 || offset >= _lookAhead)
  76.     return INVALID_ARGUMENT;
  77.   if (_buffer == NULL) return ILLEGAL_STATE;
  78.   if (_end - _pos > offset) return _pos[offset];
  79.   int remaining =
  80.     const_cast<SWIbufferedInputStream *>(this)->fillBuffer(offset);
  81.   if (remaining < 0) return remaining;
  82.   if (remaining > offset) return _pos[offset];
  83.   return END_OF_FILE;
  84. }
  85. int SWIbufferedInputStream::getLookAhead() const
  86. {
  87.   return _lookAhead;
  88. }
  89. int SWIbufferedInputStream::readLine(SWIoutputStream& outstream)
  90. {
  91.   if (_buffer == NULL) return ILLEGAL_STATE;
  92.   int rc = 0;
  93.   int nbWritten = 0;
  94.   for (;;)
  95.   {
  96.     unsigned char *p = _pos;
  97.     while (p < _end && *p != 'r' && *p != 'n') p++;
  98.     int len = p - _pos;
  99.     if (len > 0)
  100.     {
  101.       if ((rc = outstream.writeBytes(_pos, len)) != len)
  102.         break;
  103.       nbWritten += len;
  104.       _pos = p;
  105.     }
  106.     if (_pos < _end)
  107.     {
  108.       if (*_pos == 'r')
  109.       {
  110.         _pos++;
  111.         if ((rc = fillBuffer()) < 0)
  112.           break;
  113.       }
  114.       if (*_pos == 'n')
  115.         _pos++;
  116.       break;
  117.     }
  118.     else if ((rc = fillBuffer()) < 0)
  119.       break;
  120.   }
  121.   if (nbWritten == 0)
  122.     return rc > 0 ? 0 : rc;
  123.   return nbWritten;
  124. }
  125. int SWIbufferedInputStream::readLine(char *buffer, int bufSize)
  126. {
  127.   if (_buffer == NULL) return ILLEGAL_STATE;
  128.   int rc = 0;
  129.   char *p = buffer;
  130.   char *q = buffer + bufSize - 1; // keep one byte for ''
  131.   while (p < q)
  132.   {
  133.     while (_pos < _end && p < q)
  134.     {
  135.       switch (*_pos)
  136.       {
  137.        case 'r':
  138.          _pos++;
  139.          rc = fillBuffer();
  140.          if (rc <= 0) goto terminateString;
  141.          if (*_pos != 'n') goto terminateString;
  142.          // no break: intentional
  143.        case 'n':
  144.          _pos++;
  145.          goto terminateString;
  146.        default:
  147.          *p++ = *_pos++;
  148.          break;
  149.       }
  150.     }
  151.     rc = fillBuffer();
  152.     if (rc <= 0) break;
  153.   }
  154.  terminateString:
  155.   *p = '';
  156.   if (p == q)
  157.     return BUFFER_OVERFLOW;
  158.   int len = p - buffer;
  159.   if (len == 0)
  160.     return rc > 0 ? 0 : rc;
  161.   return len;
  162. }
  163. bool SWIbufferedInputStream::isBuffered() const
  164. {
  165.   return true;
  166. }
  167. SWIstream::Result SWIbufferedInputStream::waitReady(long timeoutMs)
  168. {
  169.   if (_buffer == NULL) return ILLEGAL_STATE;
  170.   if (_pos < _end) return SUCCESS;
  171.   return SWIfilterInputStream::waitReady(timeoutMs);
  172. }
  173. SWIstream::Result SWIbufferedInputStream::close()
  174. {
  175.   delete [] _buffer;
  176.   _end = _pos = _buffer = NULL;
  177.   return SWIfilterInputStream::close();
  178. }
  179. /**
  180.  * Returns the number of bytes available in the buffer.
  181.  **/
  182. int SWIbufferedInputStream::fillBuffer(int lowBound)
  183. {
  184.   int remaining = _end - _pos;
  185.   // If there are enough remaining characters, return them so that we won't
  186.   // block trying to fill the look-ahead buffer.
  187.   if (remaining > lowBound) return remaining;
  188.   if (remaining == 0 && _eofSeen) return END_OF_FILE;
  189.   // shift data at the beginning of the buffer.
  190.   memmove(_buffer, _pos, remaining);
  191.   _pos = _buffer;
  192.   _end = _pos + remaining;
  193.   // Now read from the stream.
  194.   int rc = SWIfilterInputStream::readBytes(_end, _readSize - remaining);
  195.   switch (rc)
  196.   {
  197.    case END_OF_FILE:
  198.      _eofSeen = true;
  199.      return remaining;
  200.    case 0:
  201.      // This should not really happen, it should either return TIMED_OUT or
  202.      // WOULD_BLOCK.
  203.      return TIMED_OUT;
  204.    default:
  205.      if (rc > 0)
  206.      {
  207.        _end += rc;
  208.        return remaining + rc;
  209.      }
  210.      return rc;
  211.   }
  212. }