//----------------------------------------------------------// // CPacket::AddMessages //----------------------------------------------------------// CPacket::Error::Enum CPacket::AddMessages(TMessageList& sendList, TMessageList::iterator& it) { bool bForcedEnd = false; bool bPacketIsCompressed = true; //-- Prefer compressed. bool bPacketIsEncrypted = (SysString::INVALID_KEY != m_Key); //-- Prefer encrypted if valid key is available. it = sendList.begin(); if (it != sendList.end()) { SysSmartPtr<CMessage> pFirst = *it; bPacketIsCompressed = pFirst->CanBeCompressed(bPacketIsCompressed); if (IS_TRUE(bPacketIsCompressed)) { SET_FLAG(m_HeaderV1.m_nFlags, Flag::Compressed); } bPacketIsEncrypted = pFirst->CanBeEncrypted(bPacketIsEncrypted); if (IS_TRUE(bPacketIsEncrypted)) { SET_FLAG(m_HeaderV1.m_nFlags, Flag::Encrypted); } } CPacketSerializer::Error::Enum eSerError = CPacketSerializer::Error::Ok; while ( IS_FALSE(bForcedEnd) && (CPacketSerializer::Error::Ok == eSerError) && (it != sendList.end()) ) { SysSmartPtr<CMessage> pMessage = *it; if (bPacketIsCompressed != pMessage->CanBeCompressed(bPacketIsCompressed)) { //-- Message cannot be included in same packet as previous message because //-- compressed flag has changed. bForcedEnd = true; break; } if (bPacketIsEncrypted != pMessage->CanBeEncrypted(bPacketIsEncrypted)) { //-- Message cannot be included in same packet as previous message because //-- encrypted flag has changed. bForcedEnd = true; break; } CPacketSerializer messageSerializer(ISerializer::Mode::Serializing, m_DataBuffer.Buffer() + m_DataBuffer.UsedSize(), m_DataBuffer.UnusedSize()); pMessage->Serialize(messageSerializer); eSerError = messageSerializer.GetError(); switch (eSerError) { case CPacketSerializer::Error::Ok: { //-- Success if (IS_PTR(m_DataBuffer.InsTail(NULL, messageSerializer.GetOffset()))) { ++it; m_HeaderV1.m_nMessages++; if (IS_TRUE(pMessage->IsForcedEnd())) { bForcedEnd = true; } } else { //-- Error! return Error::BadFail; } } break; case CPacketSerializer::Error::EndReached: { //-- This just means we can break out of the loop. return Error::Ok; } break; default: { //-- Something bad went wrong. return Error::Serializer; } break; } } return Error::Ok; }