VXICacheStream.hpp
上传用户: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. /***********************************************************************
  23.  *
  24.  * Routines to handle caching of documents and resources.
  25.  *
  26.  ***********************************************************************/
  27. #include "VXMLDocument.hpp"         // For SerializerInput, SerializerOutput
  28. #include "VXIcache.h"
  29. /*
  30. // VXICacheStream: Manages cache stream creation, access, and destruction.
  31. //
  32. // The typical usage will look something like this.  The stream is created from
  33. // a VXIcacheInterface and a VXIbyte array of specified length.
  34. //
  35. //     VXICacheStream stream(cacheInterface, buffer, bufferSize);
  36. //
  37. //     if (stream.IsValid()) {
  38. //       if (stream.IsWritable()) {
  39. //         Process_And_Write_New_Entry();
  40. //         stream.CommitEntry();
  41. //       }
  42. //       else Read_Existing_Entry();
  43. //     }
  44. //     else Handle_Error();
  45. //
  46. // There are two utility functions to determine if creation succeeded
  47. // (IsInvalid) and if the stream is writable (IsWritable).  If the entry is
  48. // successfully written, it may be committed.  Finally, the stream is closed
  49. // automatically by the destructor.
  50. */
  51. class VXICacheStream : public SerializerOutput, public SerializerInput {
  52. public:
  53.   // SerializerOutput & public SerializerInput functions.
  54.   virtual void Write(const VXIbyte * data, VXIulong size);
  55.   virtual VXIulong Read(VXIbyte * buffer, VXIulong bufSize);
  56.   void CommitEntry();
  57.   // The entry was successfully written.  This will close the stream.
  58.   void DiscardEntry();
  59.   // A failure occured while writing the entry; discard it.  This will close
  60.   // the stream.
  61.   bool IsValid() const     { return !bad; }
  62.   bool IsWritable() const  { return writable; }
  63.   // Status checks after stream creation.
  64.   VXICacheStream(VXIcacheInterface *, const VXIbyte * buffer, VXIulong size);
  65.   ~VXICacheStream();
  66. private:
  67.   VXICacheStream(const VXICacheStream &);                // not defined
  68.   VXICacheStream & operator=(const VXICacheStream &);    // not defined
  69.   bool writable;
  70.   bool bad;
  71.   VXIcacheStream * stream;
  72.   VXIcacheInterface * cache;
  73. };
  74. inline void VXICacheStream::Write(const VXIbyte * data, VXIulong size)
  75. {
  76.   VXIulong temp;
  77.   if (cache->Write(cache, data, size, &temp, stream) != VXIcache_RESULT_SUCCESS
  78.       || temp != size)
  79.     throw VXMLDocument::SerializationError();
  80. }
  81. inline VXIulong VXICacheStream::Read(VXIbyte * buffer, VXIulong bufSize)
  82. {
  83.   VXIulong temp;
  84.   switch( cache->Read(cache, buffer, bufSize, &temp, stream) )
  85.   {
  86.     case VXIcache_RESULT_SUCCESS:
  87.     case VXIcache_RESULT_END_OF_STREAM:
  88.       break;
  89.     default:
  90.       throw VXMLDocument::SerializationError();
  91.   }
  92.   return temp;
  93. }