Ejemplo n.º 1
0
//----------------------------------------------------------//
// CPacket::GetMessages
//----------------------------------------------------------//
CPacket::Error::Enum CPacket::GetMessages(TMessageList& tempList)
{
	//-- DataBuffer should have exactly m_HeaderV1.m_nMessages inside it.
	tempList.clear();

	u16 nProcessedMessages = 0;
	CPacketSerializer messageDeserializer(ISerializer::Mode::Deserializing, m_DataBuffer.Buffer(), m_DataBuffer.UsedSize());
	CPacketSerializer::Error::Enum eSerError = CPacketSerializer::Error::Ok;
	
	while ( (CPacketSerializer::Error::Ok == eSerError)
		&& (messageDeserializer.GetOffset() < messageDeserializer.GetSize()) )
	{
		CMessage::Type nMessageType = CMessage::kTypeUnknown;

		if (IS_ZERO(messageDeserializer.SerializeU32(nMessageType, 'type')))
		{
			return Error::Serializer;
		}

		CMessage* pMessage = CMessageFactory::CreateType(nMessageType);
		if (IS_NULL_PTR(pMessage))
		{
			return Error::ProtocolMismatch;
		}

		pMessage->Serialize(messageDeserializer);

		eSerError = messageDeserializer.GetError();
		if (CPacketSerializer::Error::Ok != eSerError)
		{
			return Error::Serializer;
		}

		SysSmartPtr<CMessage> pSmart(pMessage);
		tempList.push_back(pSmart);
		++nProcessedMessages;
	}

	//-- Sanity tests
	//-- messageSerializer should have consumed all its bytes.
	assert(messageDeserializer.GetOffset() == messageDeserializer.GetSize());
	if (messageDeserializer.GetOffset() != messageDeserializer.GetSize())
	{
		return Error::SanityFail;
	}

	//-- We should have processed exactly the right number of messages.
	assert(nProcessedMessages == GetMessageCount());
	if (nProcessedMessages != GetMessageCount())
	{
		return Error::SanityFail;
	}

	return Error::Ok;
}