pull/6/merge
Cole Brinsfield 2020-09-22 00:21:41 +01:00 committed by GitHub
commit 888f3729e4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 12 deletions

View File

@ -23,7 +23,7 @@
#include <f1x/aasdk/Messenger/ICryptor.hpp>
#include <f1x/aasdk/Messenger/FrameHeader.hpp>
#include <f1x/aasdk/Messenger/FrameSize.hpp>
#include <f1x/aasdk/Messenger/FrameType.hpp>
namespace f1x
{
namespace aasdk
@ -51,6 +51,8 @@ private:
FrameType recentFrameType_;
ReceivePromise::Pointer promise_;
Message::Pointer message_;
std::map<messenger::ChannelId, Message::Pointer> channel_assembly_buffers;
};
}

View File

@ -18,7 +18,7 @@
#include <f1x/aasdk/Messenger/MessageInStream.hpp>
#include <f1x/aasdk/Error/Error.hpp>
#include <iostream>
namespace f1x
{
namespace aasdk
@ -63,19 +63,28 @@ void MessageInStream::startReceive(ReceivePromise::Pointer promise)
void MessageInStream::receiveFrameHeaderHandler(const common::DataConstBuffer& buffer)
{
FrameHeader frameHeader(buffer);
if(message_ == nullptr)
if(message_ != nullptr && message_->getChannelId() != frameHeader.getChannelId())
{
// we have interleaved channels, stop working on the old one and store it for later; Switch to the new one
channel_assembly_buffers[message_->getChannelId()] = message_;
message_ = nullptr;
// message_.reset();
// promise_->reject(error::Error(error::ErrorCode::MESSENGER_INTERTWINED_CHANNELS));
// promise_.reset();
// return;
}
auto prevBuffer = channel_assembly_buffers.find(frameHeader.getChannelId());
if(prevBuffer != channel_assembly_buffers.end()){ // is there previous data in our map?
if(frameHeader.getType()!=FrameType::FIRST) //only use the data if we're not on a new frame, otherwise disregard
message_ = prevBuffer->second;
else{
message_ = std::make_shared<Message>(frameHeader.getChannelId(), frameHeader.getEncryptionType(), frameHeader.getMessageType());
}
channel_assembly_buffers.erase(prevBuffer); // get rid of the previously stored data because it's now our working data.
}
else if(message_ == nullptr){
message_ = std::make_shared<Message>(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);