diff --git a/include/f1x/aasdk/Messenger/MessageInStream.hpp b/include/f1x/aasdk/Messenger/MessageInStream.hpp index 262c3f5..2d40466 100644 --- a/include/f1x/aasdk/Messenger/MessageInStream.hpp +++ b/include/f1x/aasdk/Messenger/MessageInStream.hpp @@ -18,11 +18,13 @@ #pragma once +#include #include #include #include #include #include +#include namespace f1x { @@ -51,6 +53,7 @@ private: FrameType recentFrameType_; ReceivePromise::Pointer promise_; Message::Pointer message_; + std::map messageBuffer_; }; } diff --git a/src/Messenger/MessageInStream.cpp b/src/Messenger/MessageInStream.cpp index 72a666f..e44ce29 100644 --- a/src/Messenger/MessageInStream.cpp +++ b/src/Messenger/MessageInStream.cpp @@ -64,17 +64,30 @@ void MessageInStream::receiveFrameHeaderHandler(const common::DataConstBuffer& b { FrameHeader frameHeader(buffer); - if(message_ == nullptr) + if(message_ != nullptr && message_->getChannelId() != frameHeader.getChannelId()) + { + messageBuffer_[message_->getChannelId()] = message_; + message_ = nullptr; + } + + auto bufferedMessage = messageBuffer_.find(frameHeader.getChannelId()); + + if(bufferedMessage != messageBuffer_.end()) + { + if(frameHeader.getType() != FrameType::FIRST) + { + message_ = bufferedMessage->second; + } + else + { + message_ = std::make_shared(frameHeader.getChannelId(), frameHeader.getEncryptionType(), frameHeader.getMessageType()); + } + messageBuffer_.erase(bufferedMessage); + } + else if(message_ == nullptr) { message_ = std::make_shared(frameHeader.getChannelId(), frameHeader.getEncryptionType(), frameHeader.getMessageType()); } - else if(message_->getChannelId() != frameHeader.getChannelId()) - { - message_.reset(); - promise_->reject(error::Error(error::ErrorCode::MESSENGER_INTERTWINED_CHANNELS)); - promise_.reset(); - return; - } recentFrameType_ = frameHeader.getType(); const size_t frameSize = FrameSize::getSizeOf(frameHeader.getType() == FrameType::FIRST ? FrameSizeType::EXTENDED : FrameSizeType::SHORT);