fix interleaved channel crashing #2

develop
Robert Stanley Judka 2020-04-12 17:49:52 -10:00 committed by Jason Wenger
parent 5d7b2bf332
commit d387974e9d
2 changed files with 21 additions and 16 deletions

View File

@ -18,12 +18,14 @@
#pragma once #pragma once
#include <map>
#include <f1x/aasdk/Transport/ITransport.hpp> #include <f1x/aasdk/Transport/ITransport.hpp>
#include <f1x/aasdk/Messenger/IMessageInStream.hpp> #include <f1x/aasdk/Messenger/IMessageInStream.hpp>
#include <f1x/aasdk/Messenger/ICryptor.hpp> #include <f1x/aasdk/Messenger/ICryptor.hpp>
#include <f1x/aasdk/Messenger/FrameHeader.hpp> #include <f1x/aasdk/Messenger/FrameHeader.hpp>
#include <f1x/aasdk/Messenger/FrameSize.hpp> #include <f1x/aasdk/Messenger/FrameSize.hpp>
#include <f1x/aasdk/Messenger/FrameType.hpp> #include <f1x/aasdk/Messenger/FrameType.hpp>
namespace f1x namespace f1x
{ {
namespace aasdk namespace aasdk
@ -51,8 +53,7 @@ private:
FrameType recentFrameType_; FrameType recentFrameType_;
ReceivePromise::Pointer promise_; ReceivePromise::Pointer promise_;
Message::Pointer message_; Message::Pointer message_;
std::map<messenger::ChannelId, Message::Pointer> messageBuffer_;
std::map<messenger::ChannelId, Message::Pointer> channel_assembly_buffers;
}; };
} }

View File

@ -18,7 +18,7 @@
#include <f1x/aasdk/Messenger/MessageInStream.hpp> #include <f1x/aasdk/Messenger/MessageInStream.hpp>
#include <f1x/aasdk/Error/Error.hpp> #include <f1x/aasdk/Error/Error.hpp>
#include <iostream>
namespace f1x namespace f1x
{ {
namespace aasdk namespace aasdk
@ -63,28 +63,32 @@ void MessageInStream::startReceive(ReceivePromise::Pointer promise)
void MessageInStream::receiveFrameHeaderHandler(const common::DataConstBuffer& buffer) void MessageInStream::receiveFrameHeaderHandler(const common::DataConstBuffer& buffer)
{ {
FrameHeader frameHeader(buffer); FrameHeader frameHeader(buffer);
if(message_ != nullptr && message_->getChannelId() != frameHeader.getChannelId()) 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 messageBuffer_[message_->getChannelId()] = message_;
channel_assembly_buffers[message_->getChannelId()] = message_;
message_ = nullptr; 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? auto bufferedMessage = messageBuffer_.find(frameHeader.getChannelId());
if(frameHeader.getType()!=FrameType::FIRST) //only use the data if we're not on a new frame, otherwise disregard
message_ = prevBuffer->second; if(bufferedMessage != messageBuffer_.end())
else{ {
if(frameHeader.getType() != FrameType::FIRST)
{
message_ = bufferedMessage->second;
}
else
{
message_ = std::make_shared<Message>(frameHeader.getChannelId(), frameHeader.getEncryptionType(), frameHeader.getMessageType()); 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. messageBuffer_.erase(bufferedMessage);
} }
else if(message_ == nullptr){ else if(message_ == nullptr)
{
message_ = std::make_shared<Message>(frameHeader.getChannelId(), frameHeader.getEncryptionType(), frameHeader.getMessageType()); message_ = std::make_shared<Message>(frameHeader.getChannelId(), frameHeader.getEncryptionType(), frameHeader.getMessageType());
} }
recentFrameType_ = frameHeader.getType(); recentFrameType_ = frameHeader.getType();
const size_t frameSize = FrameSize::getSizeOf(frameHeader.getType() == FrameType::FIRST ? FrameSizeType::EXTENDED : FrameSizeType::SHORT); const size_t frameSize = FrameSize::getSizeOf(frameHeader.getType() == FrameType::FIRST ? FrameSizeType::EXTENDED : FrameSizeType::SHORT);