Newer
Older
fOutputStream->writeBytes(fBufStart, fBufSize);
}
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();
}
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
}
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
)
}
inline void XSerializeEngine::resetBuffer()
{
memset(fBufStart, 0, fBufSize * sizeof(XMLByte));
}
// ---------------------------------------------------------------------------
// 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;
}
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
//
// Based on the current position (fBufCur), calculated the needed size
// to read/write
//
inline size_t XSerializeEngine::alignAdjust(size_t size) const
{
size_t remainder = (size_t) fBufCur % size;
return (remainder == 0) ? 0 : (size - remainder);
}
// Adjust the fBufCur
inline void XSerializeEngine::alignBufCur(size_t size)
{
fBufCur+=alignAdjust(size);
assert(((size_t) fBufCur % size)==0);
}
inline size_t XSerializeEngine::calBytesNeeded(size_t size) const
{
return (alignAdjust(size) + size);
}
void XSerializeEngine::trace(char* funcName) const
{
return;
if (isStoring())
printf("\n funcName=<%s>, storing, count=<%d>, postion=<%d>\n", funcName, fBufCount, getBufCurAccumulated());
else
printf("\n funcName=<%s>, loading, count=<%d>, postion=<%d>\n", funcName, fBufCount, getBufCurAccumulated());
}