1#include <vanetza/geonet/indication_context.hpp>
2#include <vanetza/geonet/pdu_conversion.hpp>
3#include <vanetza/geonet/secured_pdu.hpp>
10IndicationContextDeserialize::IndicationContextDeserialize(UpPacketPtr packet, CohesivePacket& cohesive,
const LinkLayer& ll) :
11 IndicationContextBasic(ll),
12 m_packet(
std::move(packet)), m_cohesive_packet(cohesive),
13 m_parser(cohesive[OsiLayer::Network])
17const BasicHeader* IndicationContextDeserialize::parse_basic()
19 auto bytes = m_parser.parse_basic(pdu().basic());
20 return bytes > 0 ? &pdu().basic() :
nullptr;
23const CommonHeader* IndicationContextDeserialize::parse_common()
25 auto bytes = m_parser.parse_common(pdu().common());
26 return bytes > 0 ? &pdu().common() :
nullptr;
29const IndicationContext::SecuredMessage* IndicationContextDeserialize::parse_secured()
31 boost::optional<IndicationContext::SecuredMessage> tmp;
32 auto bytes = m_parser.parse_secured(tmp);
33 if (bytes > 0 && tmp) {
34 pdu().secured(std::move(*tmp));
35 return pdu().secured();
41boost::optional<HeaderConstRefVariant> IndicationContextDeserialize::parse_extended(HeaderType ht)
43 auto bytes = m_parser.parse_extended(pdu().extended_variant(), ht);
44 return boost::optional<HeaderConstRefVariant>(bytes > 0, pdu().extended_variant());
47IndicationContext::UpPacketPtr IndicationContextDeserialize::finish()
49 m_cohesive_packet.set_boundary(OsiLayer::Network, m_parser.parsed_bytes());
50 m_cohesive_packet.trim(OsiLayer::Transport, pdu().common().payload);
51 return std::move(m_packet);
55IndicationContextCast::IndicationContextCast(UpPacketPtr packet,
ChunkPacket& chunk,
const LinkLayer& ll) :
58 Pdu* casted_pdu = pdu_cast(chunk.
layer(OsiLayer::Network));
62 throw std::runtime_error(
"Casting to Pdu failed");
66const BasicHeader* IndicationContextCast::parse_basic()
68 return &pdu().basic();
71const CommonHeader* IndicationContextCast::parse_common()
73 return &pdu().common();
76const IndicationContext::SecuredMessage* IndicationContextCast::parse_secured()
78 return pdu().secured();
81boost::optional<HeaderConstRefVariant> IndicationContextCast::parse_extended(HeaderType)
83 return boost::optional<HeaderConstRefVariant> { pdu().extended_variant() };
89 return std::move(m_packet);
96 m_parser(payload[OsiLayer::Network])
100const CommonHeader* IndicationContextSecuredDeserialize::parse_common()
102 auto bytes = m_parser.parse_common(pdu().common());
103 return bytes > 0 ? &pdu().common() :
nullptr;
106boost::optional<HeaderConstRefVariant> IndicationContextSecuredDeserialize::parse_extended(HeaderType ht)
108 auto bytes = m_parser.parse_extended(pdu().extended_variant(), ht);
109 return boost::optional<HeaderConstRefVariant>(bytes > 0, pdu().extended_variant());
114 m_packet.
set_boundary(OsiLayer::Network, m_parser.parsed_bytes());
115 auto packet = m_parent.
finish();
116 (*packet) = m_packet;
123 m_packet(parent.finish())
125 SecuredPdu* secured_pdu = secured_pdu_cast(packet.
layer(OsiLayer::Network));
127 pdu().common() = secured_pdu->common;
128 pdu().extended_variant() = secured_pdu->extended;
130 throw std::runtime_error(
"Casting to SecuredPdu failed");
133 struct parent_packet_visitor :
public boost::static_visitor<>
135 parent_packet_visitor(ChunkPacket& _secured_payload) : secured_payload(_secured_payload) {}
137 void operator()(ChunkPacket& packet)
139 packet.merge(secured_payload, OsiLayer::Transport, max_osi_layer());
142 void operator()(CohesivePacket& packet)
145 ByteBuffer buffer(secured_payload.size());
146 for (
auto layer : osi_layer_range(OsiLayer::Transport, max_osi_layer())) {
147 ByteBuffer layer_buffer;
148 secured_payload.layer(layer).convert(layer_buffer);
149 buffer.insert(buffer.end(), layer_buffer.begin(), layer_buffer.end());
151 packet = CohesivePacket(std::move(buffer), OsiLayer::Transport);
154 ChunkPacket& secured_payload;
157 parent_packet_visitor visitor(packet);
158 boost::apply_visitor(visitor, *m_packet);
161const CommonHeader* IndicationContextSecuredCast::parse_common()
163 return &pdu().common();
166boost::optional<HeaderConstRefVariant> IndicationContextSecuredCast::parse_extended(HeaderType)
168 return boost::optional<HeaderConstRefVariant> { pdu().extended_variant() };
173 return std::move(m_packet);
ChunckPacket is a packet consisting of several memory chunks.
ByteBufferConvertible & layer(OsiLayer ol)
void set_boundary(OsiLayer, unsigned bytes)
UpPacketPtr finish() override
UpPacketPtr finish() override
UpPacketPtr finish() override
virtual UpPacketPtr finish()=0