Newer
Older
* Flush out whatever left in the buffer, from
* fBufStart to fBufEnd.
*
***/
void XSerializeEngine::flushBuffer()
{
ensureStoring();
ensureStoreBuffer();
fOutputStream->writeBytes(fBufStart, fBufSize);
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
fBufCur = fBufStart;
ensureStoreBuffer();
}
inline void XSerializeEngine::checkAndFlushBuffer(int bytesNeedToWrite)
{
TEST_THROW_ARG1( (bytesNeedToWrite <= 0)
, bytesNeedToWrite
, XMLExcepts::XSer_Inv_checkFlushBuffer_Size
)
// fBufStart ... fBufCur ...fBufEnd
if ((fBufCur + bytesNeedToWrite) >= fBufEnd)
flushBuffer();
}
inline void XSerializeEngine::checkAndFillBuffer(int bytesNeedToRead)
{
TEST_THROW_ARG1( (bytesNeedToRead <= 0)
, bytesNeedToRead
, XMLExcepts::XSer_Inv_checkFillBuffer_Size
)
// fBufStart ... fBufCur ...fBufLoadMax
if ((fBufCur + bytesNeedToRead) > fBufLoadMax)
{
fillBuffer();
}
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
}
inline void XSerializeEngine::ensureStoreBuffer() const
{
TEST_THROW_ARG2 ( !((fBufStart <= fBufCur) && (fBufCur <= fBufEnd))
, (int)(fBufCur - fBufStart)
, (int)(fBufEnd - fBufCur)
, XMLExcepts::XSer_StoreBuffer_Violation
)
}
inline void XSerializeEngine::ensureLoadBuffer() const
{
TEST_THROW_ARG2 ( !((fBufStart <= fBufCur) && (fBufCur <= fBufLoadMax))
, (int)(fBufCur - fBufStart)
, (int)(fBufLoadMax - fBufCur)
, XMLExcepts::XSer_LoadBuffer_Violation
)
}
inline void XSerializeEngine::ensurePointer(void* const ptr) const
{
TEST_THROW_ARG1( (ptr == 0)
PeiYong Zhang
committed
, 0
, XMLExcepts::XSer_Inv_Null_Pointer
)
}
inline void XSerializeEngine::ensureBufferLen(int bufferLen) const
{
TEST_THROW_ARG1( (bufferLen < 0)
, bufferLen
, XMLExcepts::XSer_Inv_Buffer_Len
)
}
// ---------------------------------------------------------------------------
// Template object
// ---------------------------------------------------------------------------
/***
*
* Search the store pool to see if the address has been seen before or not.
*
* If yes, write the corresponding object Tag to the internal buffer
* and return true.
*
* Otherwise, add the address to the store pool and return false
* to notifiy the client application code to store the template object.
*
***/
bool XSerializeEngine::needToStoreObject(void* const templateObjectToWrite)
{
ensureStoring(); //don't ensurePointer here !!!
XSerializedObjectId_t objIndex = 0;
if (!templateObjectToWrite)
{
*this << fgNullObjectTag; // null pointer
return false;
}
else if (0 != (objIndex = lookupStorePool(templateObjectToWrite)))
{
*this << objIndex; // write an object reference tag
return false;
}
else
{
*this << fgTemplateObjTag; // write fgTemplateObjTag to denote that actual
// template object follows
addStorePool(templateObjectToWrite); // put the address into StorePool
return true;
}
}
bool XSerializeEngine::needToLoadObject(void** templateObjectToRead)
{
ensureLoading();
XSerializedObjectId_t obTag;
*this >> obTag;
if (obTag == fgTemplateObjTag)
{
/***
* what follows fgTemplateObjTag is the actual template object
* We need the client application to create a template object
* and register it through registerObject(), and deserialize
* template object
***/
return true;
}
else
{
/***
* We hava a reference to an existing template object, get it.
*/
*templateObjectToRead = lookupLoadPool(obTag);
return false;
}
}
void XSerializeEngine::registerObject(void* const templateObjectToRegister)
{
ensureLoading();
addLoadPool(templateObjectToRegister);
}
XMLGrammarPool* XSerializeEngine::getGrammarPool() const
{
return fGrammarPool;
}
XMLStringPool* XSerializeEngine::getStringPool() const
{
return fGrammarPool->getURIStringPool();
}
MemoryManager* XSerializeEngine::getMemoryManager() const
{
//todo: changed to return fGrammarPool->getMemoryManager()
return fGrammarPool ? fGrammarPool->getMemoryManager() : XMLPlatformUtils::fgMemoryManager;
}