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

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 "SWIinputStream.hpp"
  23. #include "SWIoutputStream.hpp"
  24. int SWIinputStream::read()
  25. {
  26.   unsigned char c;
  27.   int rc = readBytes(&c, sizeof c);
  28.   if (rc != sizeof c) return rc;
  29.   return c;
  30. }
  31. int SWIinputStream::skip(int n)
  32. {
  33.   if (n < 0)
  34.     return INVALID_ARGUMENT;
  35.   if (n == 0) return 0;
  36.   char *tmp = new char[n];
  37.   int nbSkip = readBytes(tmp, n);
  38.   delete [] tmp;
  39.   return nbSkip;
  40. }
  41. int SWIinputStream::readLine(SWIoutputStream& outstream)
  42. {
  43.   int rc = getLookAhead();
  44.   if (rc == 0)
  45.     return NOT_SUPPORTED;
  46.   if (rc < 0)
  47.     return rc;
  48.   int nbWritten = 0;
  49.   int c = 0;
  50.   for (;;)
  51.   {
  52.     if ((c = read()) < 0)
  53.     {
  54.       rc = c;
  55.       break;
  56.     }
  57.     switch (c)
  58.     {
  59.      case 'r':
  60.        if ((c = peek()) < 0 || (c == 'n' && (c = read()) < 0))
  61.          rc = c;
  62.        // no break: intentional
  63.      case 'n':
  64.        goto end;
  65.        break;
  66.      default:
  67.        outstream.printChar(c);
  68.        nbWritten++;
  69.        break;
  70.     }
  71.   }
  72.  end:
  73.   if (nbWritten == 0)
  74.     return rc > 0 ? 0 : rc;
  75.   return nbWritten;
  76. }
  77. int SWIinputStream::readLine(char *buffer, int bufSize)
  78. {
  79.   int rc = getLookAhead();
  80.   if (rc == 0)
  81.     return NOT_SUPPORTED;
  82.   if (rc < 0)
  83.     return rc;
  84.   char *p = buffer;
  85.   char *q = buffer + bufSize - 1; // keep one byte for ''
  86.   int c = 0;
  87.   while (p < q)
  88.   {
  89.     if ((c = read()) < 0)
  90.     {
  91.       rc = c;
  92.       break;
  93.     }
  94.     switch (c)
  95.     {
  96.      case 'r':
  97.       if ((c = peek()) < 0 || (c == 'n' && (c = read()) < 0))
  98.         rc = c;
  99.       // no break: intentional
  100.      case 'n':
  101.        goto end;
  102.        break;
  103.      default:
  104.        *p++ = c;
  105.        break;
  106.     }
  107.   }
  108.  end:
  109.   *p = '';
  110.   if (p == q)
  111.     return BUFFER_OVERFLOW;
  112.   int len = p - buffer;
  113.   if (len == 0)
  114.     return rc > 0 ? 0 : rc;
  115.   return len;
  116. }
  117. int SWIinputStream::peek(int offset) const
  118. {
  119.   return NOT_SUPPORTED;
  120. }
  121. int SWIinputStream::getLookAhead() const
  122. {
  123.   return 0;
  124. }
  125. bool SWIinputStream::isBuffered() const
  126. {
  127.   return false;
  128. }
  129. SWIstream::Result SWIinputStream::waitReady(long timeoutMs)
  130. {
  131.   return SUCCESS;
  132. }