mirror of https://github.com/opencardev/aasdk
Merge pull request #1 from jcwenger/feature/interleaved-channels
Feature/interleaved channelsdevelop
commit
b2733fe146
|
@ -18,11 +18,13 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include <map>
|
||||
#include <f1x/aasdk/Transport/ITransport.hpp>
|
||||
#include <f1x/aasdk/Messenger/IMessageInStream.hpp>
|
||||
#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
|
||||
{
|
||||
|
@ -51,6 +53,7 @@ private:
|
|||
FrameType recentFrameType_;
|
||||
ReceivePromise::Pointer promise_;
|
||||
Message::Pointer message_;
|
||||
std::map<messenger::ChannelId, Message::Pointer> messageBuffer_;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -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<Message>(frameHeader.getChannelId(), frameHeader.getEncryptionType(), frameHeader.getMessageType());
|
||||
}
|
||||
messageBuffer_.erase(bufferedMessage);
|
||||
}
|
||||
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);
|
||||
|
|
Loading…
Reference in New Issue