Newer
Older
}
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);
}