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

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 <SWIdataOutputStream.hpp>
  23. #include <cstddef>
  24. #include <memory.h>
  25. SWIdataOutputStream::SWIdataOutputStream(int initialCapacity):
  26.   _bufferSize(0)
  27. {
  28.   _capacity = initialCapacity;
  29.   if (_capacity < 1) _capacity = 1;
  30.   _buffer = new char[_capacity];
  31. }
  32. SWIdataOutputStream::~SWIdataOutputStream()
  33. {
  34.   delete [] _buffer;
  35. }
  36. /**
  37.  * @see SWIdataOutputStream::write documentation.  Warning, this method
  38.  * is not thread-safe.  Only one thread will write to the stream.  If it is
  39.  * not the case, one should derive a sub-class from this one, and re-implement
  40.  * its write method.
  41.  **/
  42. int SWIdataOutputStream::writeBytes(const void* data,
  43.                                     int dataSize)
  44. {
  45.   // Nothing to write.
  46.   if (dataSize == 0)
  47.     return 0;
  48.   // Inconsistent data and dataSize
  49.   if (dataSize < 0 || data == NULL)
  50.     return INVALID_ARGUMENT;
  51.   // No existing buffer.  Can't write.
  52.   if (_buffer == NULL)
  53.   {
  54.     return WRITE_ERROR;
  55.   }
  56.   int requiredCapacity = dataSize + _bufferSize;
  57.   Result rc = ensureCapacity(requiredCapacity);
  58.   if (rc != SUCCESS) return rc;
  59.   // copy the bytes from data into the dataBuffer.
  60.   ::memcpy(_buffer + _bufferSize, data, dataSize);
  61.   // set the new size of the buffer.
  62.   _bufferSize = requiredCapacity;
  63.   return dataSize;
  64. }
  65. SWIstream::Result SWIdataOutputStream::ensureCapacity(int requiredCapacity) const
  66. {
  67.   if (requiredCapacity > _capacity)
  68.   {
  69.     // Make the capacity twice as much as the required capacity.  This
  70.     // ensures an amortized linear running time.
  71.     int oldCapacity = _capacity;
  72.     _capacity = requiredCapacity * 2;
  73.     // Create a new buffer to hold the data.
  74.     char *tmpBuffer = new char[_capacity];
  75.     if (tmpBuffer == NULL)
  76.     {
  77.       _capacity = oldCapacity;
  78.       return WRITE_ERROR;
  79.     }
  80.     // transfer the data from the existing buffer to the new buffer, and make
  81.     // the new buffer the current one.
  82.     ::memcpy(tmpBuffer, _buffer, _bufferSize);
  83.     delete [] _buffer;
  84.     _buffer = tmpBuffer;
  85.   }
  86.   return SUCCESS;
  87. }
  88. const char * SWIdataOutputStream::getString() const
  89. {
  90.   if (ensureCapacity(_bufferSize + 1) != SUCCESS)
  91.     return NULL;
  92.   _buffer[_bufferSize] = '';
  93.   return _buffer;
  94. }
  95. SWIstream::Result SWIdataOutputStream::close()
  96. {
  97.   return SUCCESS;
  98. }
  99. bool SWIdataOutputStream::isBuffered() const
  100. {
  101.   return true;
  102. }