peiyongz 2003/09/25 15:22:01 Modified: c/src/xercesc/internal XSerializeEngine.cpp XSerializeEngine.hpp Log: Introduction of readString/writeString Revision Changes Path 1.5 +149 -2 xml-xerces/c/src/xercesc/internal/XSerializeEngine.cpp Index: XSerializeEngine.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XSerializeEngine.cpp,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- XSerializeEngine.cpp 25 Sep 2003 15:21:12 -0000 1.4 +++ XSerializeEngine.cpp 25 Sep 2003 22:22:00 -0000 1.5 @@ -57,6 +57,9 @@ /* * $Id$ * $Log$ + * Revision 1.5 2003/09/25 22:22:00 peiyongz + * Introduction of readString/writeString + * * Revision 1.4 2003/09/25 15:21:12 peiyongz * Loose the assert condition so that Serializable class need NOT to check the * actual string length before read/write. @@ -82,6 +85,13 @@ XERCES_CPP_NAMESPACE_BEGIN +const bool XSerializeEngine::toWriteBufferLen = true; +const bool XSerializeEngine::toReadBufferLen = true; + int XSerializeEngine::defaultBufferLen = 0; + int XSerializeEngine::defaultDataLen = 0; + +static const int noDataFollowed = -1; + static const XSerializeEngine::XSerializedObjectId_t fgNullObjectTag = 0; // indicating null ptrs static const XSerializeEngine::XSerializedObjectId_t fgNewClassTag = 0xFFFFFFFF; // indicating new class static const XSerializeEngine::XSerializedObjectId_t fgClassMask = 0x80000000; // indicates class tag @@ -238,13 +248,14 @@ /*** * - ***/ +***/ void XSerializeEngine::write(const XMLCh* const toWrite , int writeLen) { write((XMLByte*)toWrite, (sizeof(XMLCh)/sizeof(XMLByte)) * writeLen); } + void XSerializeEngine::write(const XMLByte* const toWrite , int writeLen) { @@ -297,6 +308,63 @@ } +/*** + * + * Storage scheme (normal): + * + * < + * 1st integer: bufferLen (optional) + * 2nd integer: dataLen + * bytes following: + * > + * + * Storage scheme (special): + * < + * only integer: noDataFollowed + * > + */ + +void XSerializeEngine::writeString(const XMLCh* const toWrite + , const int bufferLen + , bool toWriteBufLen) +{ + if (toWrite) + { + if (toWriteBufLen) + *this<<bufferLen; + + int strLen = XMLString::stringLen(toWrite); + *this<<strLen; + write(toWrite, strLen); + } + else + { + *this<<noDataFollowed; + } + +} + +void XSerializeEngine::writeString(const XMLByte* const toWrite + , const int bufferLen + , bool toWriteBufLen) +{ + + if (toWrite) + { + if (toWriteBufLen) + *this<<bufferLen; + + int strLen = XMLString::stringLen((char*)toWrite); + *this<<strLen; + write(toWrite, strLen); + } + else + { + *this<<noDataFollowed; + } + +} + // --------------------------------------------------------------------------- // Loading // --------------------------------------------------------------------------- @@ -432,6 +500,84 @@ memcpy(tempRead, fBufCur, readRemain); fBufCur += readRemain; } + +} + +/*** + * + * Storage scheme (normal): + * + * < + * 1st integer: bufferLen (optional) + * 2nd integer: dataLen + * bytes following: + * > + * + * Storage scheme (special): + * < + * only integer: noDataFollowed + * > + */ +void XSerializeEngine::readString(XMLCh*& toRead + , int& bufferLen + , int& dataLen + , bool toReadBufLen) +{ + /*** + * Check if any data written + ***/ + *this>>bufferLen; + if (bufferLen == noDataFollowed) + { + toRead = 0; + bufferLen = 0; + dataLen = 0; + return; + } + + if (toReadBufLen) + { + *this>>dataLen; + } + else + { + dataLen = bufferLen++; + } + + toRead = (XMLCh*) fMemoryManager->allocate(bufferLen * sizeof(XMLCh)); + read(toRead, dataLen); + toRead[dataLen] = 0; +} + +void XSerializeEngine::readString(XMLByte*& toRead + , int& bufferLen + , int& dataLen + , bool toReadBufLen) +{ + /*** + * Check if any data written + ***/ + *this>>bufferLen; + if (bufferLen == noDataFollowed) + { + toRead = 0; + bufferLen = 0; + dataLen = 0; + return; + } + + if (toReadBufLen) + { + *this>>dataLen; + } + else + { + dataLen = bufferLen++; + } + + toRead = (XMLByte*) fMemoryManager->allocate(bufferLen * sizeof(XMLByte)); + read(toRead, dataLen); + toRead[dataLen] = 0; } 1.3 +92 -1 xml-xerces/c/src/xercesc/internal/XSerializeEngine.hpp Index: XSerializeEngine.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XSerializeEngine.hpp,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- XSerializeEngine.hpp 19 Sep 2003 04:29:11 -0000 1.2 +++ XSerializeEngine.hpp 25 Sep 2003 22:22:00 -0000 1.3 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.3 2003/09/25 22:22:00 peiyongz + * Introduction of readString/writeString + * * Revision 1.2 2003/09/19 04:29:11 neilg * fix compilation problems under GCC * @@ -219,6 +222,46 @@ /*** * + * 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 @@ -272,6 +315,54 @@ ***/ 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 = defaultBufferLen + , int& dataLen = defaultDataLen + , 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 + * dataLen: the length of the stream + * toReadBufLen: specify if the bufferLen need to be read or not + * + * Return: + * + ***/ + void readString(XMLByte*& toRead + , int& bufferLen = defaultBufferLen + , int& dataLen = defaultDataLen + , bool toReadBufLen = false); + + static const bool toReadBufferLen; + + static int defaultBufferLen; + + static int defaultDataLen; /*** *
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]