--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/secureswitools/swisistools/source/xmlparser/xerces/include/xercesc/internal/XSerializeEngine.hpp Fri Jan 22 09:56:12 2010 +0200
@@ -0,0 +1,873 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
+ * $Id: XSerializeEngine.hpp 568078 2007-08-21 11:43:25Z amassari $
+ */
+
+#if !defined(XSERIALIZE_ENGINE_HPP)
+#define XSERIALIZE_ENGINE_HPP
+
+#include <xercesc/util/RefHashTableOf.hpp>
+#include <xercesc/util/ValueVectorOf.hpp>
+#include <xercesc/util/XMLExceptMsgs.hpp>
+
+#include <xercesc/internal/XSerializationException.hpp>
+
+XERCES_CPP_NAMESPACE_BEGIN
+
+class XSerializable;
+class XProtoType;
+class MemoryManager;
+class XSerializedObjectId;
+class BinOutputStream;
+class BinInputStream;
+class XMLGrammarPool;
+class XMLGrammarPoolImpl;
+class XMLStringPool;
+
+class XMLUTIL_EXPORT XSerializeEngine
+{
+public:
+
+ enum { mode_Store
+ , mode_Load
+ };
+
+
+ static const bool toReadBufferLen;
+
+ typedef unsigned int XSerializedObjectId_t;
+
+ /***
+ *
+ * Destructor
+ *
+ ***/
+ ~XSerializeEngine();
+
+ /***
+ *
+ * Constructor for de-serialization(loading)
+ *
+ * Application needs to make sure that the instance of
+ * BinInputStream, persists beyond the life of this
+ * SerializeEngine.
+ *
+ * Param
+ * inStream input stream
+ * gramPool Grammar Pool
+ * bufSize the size of the internal buffer
+ *
+ ***/
+ XSerializeEngine(BinInputStream* inStream
+ , XMLGrammarPool* const gramPool
+ , unsigned long bufSize = 8192 );
+
+
+ /***
+ *
+ * Constructor for serialization(storing)
+ *
+ * Application needs to make sure that the instance of
+ * BinOutputStream, persists beyond the life of this
+ * SerializeEngine.
+ *
+ * Param
+ * outStream output stream
+ * gramPool Grammar Pool
+ * bufSize the size of the internal buffer
+ *
+ ***/
+ XSerializeEngine(BinOutputStream* outStream
+ , XMLGrammarPool* const gramPool
+ , unsigned long bufSize = 8192 );
+
+
+ /***
+ *
+ * Deprecated
+ *
+ * Constructor for de-serialization(loading)
+ *
+ * Application needs to make sure that the instance of
+ * BinInputStream, persists beyond the life of this
+ * SerializeEngine.
+ *
+ * Param
+ * inStream input stream
+ * manager MemoryManager
+ * bufSize the size of the internal buffer
+ *
+ ***/
+ XSerializeEngine(BinInputStream* inStream
+ , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+ , unsigned long bufSize = 8192 );
+
+
+ /***
+ *
+ * Deprecated
+ *
+ * Constructor for serialization(storing)
+ *
+ * Application needs to make sure that the instance of
+ * BinOutputStream, persists beyond the life of this
+ * SerializeEngine.
+ *
+ * Param
+ * outStream output stream
+ * manager MemoryManager
+ * bufSize the size of the internal buffer
+ *
+ ***/
+ XSerializeEngine(BinOutputStream* outStream
+ , MemoryManager* const manager = XMLPlatformUtils::fgMemoryManager
+ , unsigned long bufSize = 8192 );
+
+ /***
+ *
+ * When serialization, flush out the internal buffer
+ *
+ * Return:
+ *
+ ***/
+ void flush();
+
+ /***
+ *
+ * Checking if the serialize engine is doing serialization(storing)
+ *
+ * Return: true, if it is
+ * false, otherwise
+ *
+ ***/
+ inline bool isStoring() const;
+
+ /***
+ *
+ * Checking if the serialize engine is doing de-serialization(loading)
+ *
+ * Return: true, if it is
+ * false, otherwise
+ *
+ ***/
+ inline bool isLoading() const;
+
+ /***
+ *
+ * Get the GrammarPool
+ *
+ * Return: XMLGrammarPool
+ *
+ ***/
+ XMLGrammarPool* getGrammarPool() const;
+
+ /***
+ *
+ * Get the StringPool
+ *
+ * Return: XMLStringPool
+ *
+ ***/
+ XMLStringPool* getStringPool() const;
+
+ /***
+ *
+ * Get the embeded Memory Manager
+ *
+ * Return: MemoryManager
+ *
+ ***/
+ MemoryManager* getMemoryManager() const;
+
+ /***
+ *
+ * Get the storer level (the level of the serialize engine
+ * which created the binary stream that this serialize engine
+ * is loading).
+ *
+ * The level returned is meaningful only when
+ * the engine isLoading.
+ *
+ * Return: level
+ *
+ ***/
+ inline unsigned short getStorerLevel() const;
+
+ /***
+ *
+ * Write object to the internal buffer.
+ *
+ * Param
+ * objectToWrite: the object to be serialized
+ *
+ * Return:
+ *
+ ***/
+ void write(XSerializable* const objectToWrite);
+
+ /***
+ *
+ * Write prototype info to the internal buffer.
+ *
+ * Param
+ * protoType: instance of prototype
+ *
+ * Return:
+ *
+ ***/
+ void write(XProtoType* const protoType);
+
+ /***
+ *
+ * Write a stream of XMLByte to the internal buffer.
+ *
+ * Param
+ * toWrite: the stream of XMLByte to write
+ * writeLen: the length of the stream
+ *
+ * Return:
+ *
+ ***/
+ void write(const XMLByte* const toWrite
+ , int writeLen);
+
+ /***
+ *
+ * Write a stream of XMLCh to the internal buffer.
+ *
+ * Param
+ * toWrite: the stream of XMLCh to write
+ * writeLen: the length of the stream
+ *
+ * Return:
+ *
+ ***/
+ void write(const XMLCh* const toWrite
+ , int writeLen);
+
+ /***
+ *
+ * Write a stream of XMLCh to the internal buffer.
+ *
+ * Write the bufferLen first if requested, then the length
+ * of the stream followed by the stream.
+ *
+ * Param
+ * toWrite: the stream of XMLCh to write
+ * bufferLen: the maximum size of the buffer
+ * toWriteBufLen: specify if the bufferLen need to be written or not
+ *
+ * Return:
+ *
+ ***/
+ void writeString(const XMLCh* const toWrite
+ , const int bufferLen = 0
+ , bool toWriteBufLen = false);
+
+ /***
+ *
+ * Write a stream of XMLByte to the internal buffer.
+ *
+ * Write the bufferLen first if requested, then the length
+ * of the stream followed by the stream.
+ *
+ * Param
+ * toWrite: the stream of XMLByte to write
+ * bufferLen: the maximum size of the buffer
+ * toWriteBufLen: specify if the bufferLen need to be written or not
+ *
+ * Return:
+ *
+ ***/
+ void writeString(const XMLByte* const toWrite
+ , const int bufferLen = 0
+ , bool toWriteBufLen = false);
+
+ static const bool toWriteBufferLen;
+
+ /***
+ *
+ * Read/Create object from the internal buffer.
+ *
+ * Param
+ * protoType: an instance of prototype of the object anticipated
+ *
+ * Return: to object read/created
+ *
+ ***/
+ XSerializable* read(XProtoType* const protoType);
+
+ /***
+ *
+ * Read prototype object from the internal buffer.
+ * Verify if the same prototype object found in buffer.
+ *
+ * Param
+ * protoType: an instance of prototype of the object anticipated
+ * objTag: the object Tag to an existing object
+ *
+ * Return: true : if matching found
+ * false : otherwise
+ *
+ ***/
+ bool read(XProtoType* const protoType
+ , XSerializedObjectId_t* objTag);
+
+ /***
+ *
+ * Read XMLByte stream from the internal buffer.
+ *
+ * Param
+ * toRead: the buffer to hold the XMLByte stream
+ * readLen: the length of the XMLByte to read in
+ *
+ * Return:
+ *
+ ***/
+ void read(XMLByte* const toRead
+ , int readLen);
+
+ /***
+ *
+ * Read XMLCh stream from the internal buffer.
+ *
+ * Param
+ * toRead: the buffer to hold the XMLCh stream
+ * readLen: the length of the XMLCh to read in
+ *
+ * Return:
+ *
+ ***/
+ void read(XMLCh* const toRead
+ , int readLen);
+
+ /***
+ *
+ * Read a stream of XMLCh from the internal buffer.
+ *
+ * Read the bufferLen first if requested, then the length
+ * of the stream followed by the stream.
+ *
+ * Param
+ * toRead: the pointer to the buffer to hold the XMLCh stream
+ * bufferLen: the size of the buffer created
+ * dataLen: the length of the stream
+ * toReadBufLen: specify if the bufferLen need to be read or not
+ *
+ * Return:
+ *
+ ***/
+ void readString(XMLCh*& toRead
+ , int& bufferLen
+ , int& dataLen
+ , bool toReadBufLen = false);
+
+ /***
+ *
+ * Read a stream of XMLCh from the internal buffer.
+ *
+ * Read the bufferLen first if requested, then the length
+ * of the stream followed by the stream.
+ *
+ * Param
+ * toRead: the pointer to the buffer to hold the XMLCh stream
+ * bufferLen: the size of the buffer created
+ *
+ * Return:
+ *
+ ***/
+ inline void readString(XMLCh*& toRead
+ , int& bufferLen);
+
+ /***
+ *
+ * Read a stream of XMLCh from the internal buffer.
+ *
+ * Param
+ * toRead: the pointer to the buffer to hold the XMLCh stream
+ *
+ * Return:
+ *
+ ***/
+ inline void readString(XMLCh*& toRead);
+
+ /***
+ *
+ * Read a stream of XMLByte from the internal buffer.
+ *
+ * Read the bufferLen first if requested, then the length
+ * of the stream followed by the stream.
+ *
+ * Param
+ * toRead: the pointer to the buffer to hold the XMLByte stream
+ * bufferLen: the size of the buffer created
+ * dataLen: the length of the stream
+ * toReadBufLen: specify if the bufferLen need to be read or not
+ *
+ * Return:
+ *
+ ***/
+ void readString(XMLByte*& toRead
+ , int& bufferLen
+ , int& dataLen
+ , bool toReadBufLen = false);
+
+
+ /***
+ *
+ * Read a stream of XMLByte from the internal buffer.
+ *
+ * Read the bufferLen first if requested, then the length
+ * of the stream followed by the stream.
+ *
+ * Param
+ * toRead: the pointer to the buffer to hold the XMLByte stream
+ * bufferLen: the size of the buffer created
+ *
+ * Return:
+ *
+ ***/
+ inline void readString(XMLByte*& toRead
+ , int& bufferLen);
+
+ /***
+ *
+ * Read a stream of XMLByte from the internal buffer.
+ *
+ * Read the bufferLen first if requested, then the length
+ * of the stream followed by the stream.
+ *
+ * Param
+ * toRead: the pointer to the buffer to hold the XMLByte stream
+ * bufferLen: the size of the buffer created
+ * dataLen: the length of the stream
+ * toReadBufLen: specify if the bufferLen need to be read or not
+ *
+ * Return:
+ *
+ ***/
+ inline void readString(XMLByte*& toRead);
+
+ /***
+ *
+ * Check if the template object has been stored or not
+ *
+ * Param
+ * objectPtr: the template object pointer
+ *
+ * Return: true : the object has NOT been stored yet
+ * false : otherwise
+ *
+ ***/
+ bool needToStoreObject(void* const templateObjectToWrite);
+
+ /***
+ *
+ * Check if the template object has been loaded or not
+ *
+ * Param
+ * objectPtr: the address of the template object pointer
+ *
+ * Return: true : the object has NOT been loaded yet
+ * false : otherwise
+ *
+ ***/
+ bool needToLoadObject(void** templateObjectToRead);
+
+ /***
+ *
+ * In the case of needToLoadObject() return true, the client
+ * application needs to instantiate an expected template object, and
+ * register the address to the engine.
+ *
+ * Param
+ * objectPtr: the template object pointer newly instantiated
+ *
+ * Return:
+ *
+ ***/
+ void registerObject(void* const templateObjectToRegister);
+
+ /***
+ *
+ * Insertion operator for serializable classes
+ *
+ ***/
+
+ friend XSerializeEngine& operator<<(XSerializeEngine&
+ , XSerializable* const );
+
+ /***
+ *
+ * Insertion operators for
+ * . basic Xerces data types
+ * . built-in types
+ *
+ ***/
+ XSerializeEngine& operator<<(XMLByte);
+ XSerializeEngine& operator<<(XMLCh);
+
+ XSerializeEngine& operator<<(char);
+ XSerializeEngine& operator<<(short);
+ XSerializeEngine& operator<<(int);
+ XSerializeEngine& operator<<(unsigned int);
+ XSerializeEngine& operator<<(long);
+ XSerializeEngine& operator<<(unsigned long);
+ XSerializeEngine& operator<<(float);
+ XSerializeEngine& operator<<(double);
+ XSerializeEngine& operator<<(bool);
+
+ /***
+ *
+ * Extraction operators for
+ * . basic Xerces data types
+ * . built-in types
+ *
+ ***/
+ XSerializeEngine& operator>>(XMLByte&);
+ XSerializeEngine& operator>>(XMLCh&);
+
+ XSerializeEngine& operator>>(char&);
+ XSerializeEngine& operator>>(short&);
+ XSerializeEngine& operator>>(int&);
+ XSerializeEngine& operator>>(unsigned int&);
+ XSerializeEngine& operator>>(long&);
+ XSerializeEngine& operator>>(unsigned long&);
+ XSerializeEngine& operator>>(float&);
+ XSerializeEngine& operator>>(double&);
+ XSerializeEngine& operator>>(bool&);
+
+ /***
+ *
+ * Getters
+ *
+ ***/
+ inline
+ XMLSize_t getBufSize() const;
+
+ inline
+ XMLSize_t getBufCur() const;
+
+ inline
+ XMLSize_t getBufCurAccumulated() const;
+
+ inline
+ XMLSize_t getBufCount() const;
+
+ void trace(char*) const;
+
+private:
+ // -----------------------------------------------------------------------
+ // Unimplemented constructors and operators
+ // -----------------------------------------------------------------------
+ XSerializeEngine();
+ XSerializeEngine(const XSerializeEngine&);
+ XSerializeEngine& operator=(const XSerializeEngine&);
+
+ /***
+ *
+ * Store Pool Opertions
+ *
+ ***/
+ XSerializedObjectId_t lookupStorePool(void* const objectPtr) const;
+ void addStorePool(void* const objectPtr);
+
+ /***
+ *
+ * Load Pool Opertions
+ *
+ ***/
+ XSerializable* lookupLoadPool(XSerializedObjectId_t objectTag) const;
+ void addLoadPool(void* const objectPtr);
+
+ /***
+ *
+ * Intenal Buffer Operations
+ *
+ ***/
+ inline void checkAndFillBuffer(int bytesNeedToRead);
+
+ inline void checkAndFlushBuffer(int bytesNeedToWrite);
+
+ void fillBuffer();
+
+ void flushBuffer();
+
+ void pumpCount();
+
+ inline void resetBuffer();
+
+ /***
+ *
+ * Helper
+ *
+ ***/
+ inline void ensureStoring() const;
+
+ inline void ensureLoading() const;
+
+ inline void ensureStoreBuffer() const;
+
+ inline void ensureLoadBuffer() const;
+
+ inline void ensurePointer(void* const) const;
+
+ inline void ensureBufferLen(int bufferLen) const;
+
+ inline void Assert(bool toEval
+ , const XMLExcepts::Codes toThrow) const;
+
+
+ inline XMLSize_t calBytesNeeded(XMLSize_t) const;
+
+ inline XMLSize_t alignAdjust(XMLSize_t) const;
+
+ inline void alignBufCur(XMLSize_t);
+
+ // Make XTemplateSerializer friend of XSerializeEngine so that
+ // we can call lookupStorePool and lookupLoadPool in the case of
+ // annotations.
+ friend class XTemplateSerializer;
+
+ // -------------------------------------------------------------------------------
+ // data
+ //
+ // fStoreLoad:
+ // Indicator: storing(serialization) or loading(de-serialization)
+ //
+ // fStorerLevel:
+ // The level of the serialize engine which created the binary
+ // stream that this serialize engine is loading
+ //
+ // It is set by GrammarPool when loading
+ //
+ // fGrammarPool:
+ // Thw owning GrammarPool which instantiate this SerializeEngine
+ // instance
+ //
+ // fInputStream:
+ // Binary stream to read from (de-serialization), provided
+ // by client application, not owned.
+ //
+ // fOutputStream:
+ // Binary stream to write to (serialization), provided
+ // by client application, not owned.
+ //
+ // fBufSize:
+ // The size of the internal buffer
+ //
+ // fBufStart/fBufEnd:
+ //
+ // The internal buffer.
+ // fBufEnd:
+ // one beyond the last valid cell
+ // fBufEnd === (fBufStart + fBufSize)
+ //
+ // fBufCur:
+ // The cursor of the buffer
+ //
+ // fBufLoadMax:
+ // Indicating the end of the valid content in the buffer
+ //
+ // fStorePool:
+ // Object collection for storing
+ //
+ // fLoadPool:
+ // Object collection for loading
+ //
+ // fMapCount:
+ // -------------------------------------------------------------------------------
+ const short fStoreLoad;
+ short fStorerLevel;
+
+ XMLGrammarPool* const fGrammarPool;
+ BinInputStream* const fInputStream;
+ BinOutputStream* const fOutputStream;
+
+ XMLSize_t fBufCount;
+
+ //buffer
+ const XMLSize_t fBufSize;
+ XMLByte* const fBufStart;
+ XMLByte* const fBufEnd;
+ XMLByte* fBufCur;
+ XMLByte* fBufLoadMax;
+
+
+
+ /***
+ * Map for storing object
+ *
+ * key: XSerializable*
+ * XProtoType*
+ *
+ * value: XMLInteger*, owned
+ *
+ ***/
+ RefHashTableOf<XSerializedObjectId>* fStorePool;
+
+ /***
+ * Vector for loading object, objects are NOT owned
+ *
+ * data: XSerializable*
+ * XProtoType*
+ *
+ ***/
+ ValueVectorOf<void*>* fLoadPool;
+
+ /***
+ * object counter
+ ***/
+ XSerializedObjectId_t fObjectCount;
+
+ //to allow grammar pool to set storer level when loading
+ friend class XMLGrammarPoolImpl;
+};
+
+inline bool XSerializeEngine::isStoring() const
+{
+ return (fStoreLoad == mode_Store);
+}
+
+inline bool XSerializeEngine::isLoading() const
+{
+ return (fStoreLoad == mode_Load);
+}
+
+inline XSerializeEngine& operator<<(XSerializeEngine& serEng
+ , XSerializable* const serObj)
+{
+ serEng.write(serObj);
+ return serEng;
+}
+
+inline void XSerializeEngine::ensureStoring() const
+{
+ Assert(isStoring(), XMLExcepts::XSer_Storing_Violation);
+}
+
+inline void XSerializeEngine::ensureLoading() const
+{
+ Assert(isLoading(), XMLExcepts::XSer_Loading_Violation);
+}
+
+
+
+inline void XSerializeEngine::Assert(bool toEval
+ , const XMLExcepts::Codes toThrow) const
+{
+ if (!toEval)
+ {
+ ThrowXMLwithMemMgr(XSerializationException, toThrow, getMemoryManager());
+ }
+
+}
+
+inline void XSerializeEngine::readString(XMLCh*& toRead
+ , int& bufferLen)
+{
+ int dummyDataLen;
+ readString(toRead, bufferLen, dummyDataLen);
+}
+
+inline void XSerializeEngine::readString(XMLCh*& toRead)
+{
+ int dummyBufferLen;
+ int dummyDataLen;
+ readString(toRead, dummyBufferLen, dummyDataLen);
+}
+
+inline void XSerializeEngine::readString(XMLByte*& toRead
+ , int& bufferLen)
+{
+ int dummyDataLen;
+ readString(toRead, bufferLen, dummyDataLen);
+}
+
+inline void XSerializeEngine::readString(XMLByte*& toRead)
+{
+ int dummyBufferLen;
+ int dummyDataLen;
+ readString(toRead, dummyBufferLen, dummyDataLen);
+}
+
+inline
+XMLSize_t XSerializeEngine::getBufSize() const
+{
+ return fBufSize;
+}
+
+inline
+XMLSize_t XSerializeEngine::getBufCur() const
+{
+ return XMLSize_t (fBufCur-fBufStart);
+}
+
+inline
+XMLSize_t XSerializeEngine::getBufCurAccumulated() const
+{
+ return (fBufCount - (isStoring() ? 0: 1)) * fBufSize + (fBufCur-fBufStart);
+}
+
+inline
+XMLSize_t XSerializeEngine::getBufCount() const
+{
+ return fBufCount;
+}
+
+inline
+unsigned short XSerializeEngine::getStorerLevel() const
+{
+ return fStorerLevel;
+}
+
+/***
+ * Ought to be nested class
+ ***/
+class XSerializedObjectId : public XMemory
+{
+public:
+
+ ~XSerializedObjectId(){};
+
+private:
+
+ inline XSerializedObjectId(XSerializeEngine::XSerializedObjectId_t val):
+ fData(val) { };
+
+ inline XSerializeEngine::XSerializedObjectId_t getValue() const {return fData; };
+
+ friend class XSerializeEngine;
+
+private:
+ // -----------------------------------------------------------------------
+ // Unimplemented constructors and operators
+ // -----------------------------------------------------------------------
+ XSerializedObjectId();
+ XSerializedObjectId(const XSerializedObjectId&);
+ XSerializedObjectId& operator=(const XSerializedObjectId&);
+
+ XSerializeEngine::XSerializedObjectId_t fData;
+
+};
+
+
+XERCES_CPP_NAMESPACE_END
+
+#endif