roo_transport
API Documentation for roo_transport
Loading...
Searching...
No Matches
mux_messaging.h
Go to the documentation of this file.
1#pragma once
2
3#include "roo_collections.h"
4#include "roo_collections/flat_small_hash_map.h"
6
7namespace roo_transport {
8
9/// Multiplexes up to 256 logical messaging channels over one `Messaging` link.
11 public:
12 using ChannelId = uint8_t;
13
14 class Channel;
15
16 MuxMessaging(Messaging& messaging);
18
19 private:
20 friend class Channel;
21
22 class Dispatcher : public Messaging::Receiver {
23 public:
24 explicit Dispatcher(MuxMessaging& mux) : mux_(mux) {}
25
26 void received(Messaging::ConnectionId connection_id, const roo::byte* data,
27 size_t len) override;
28
29 void reset(Messaging::ConnectionId connection_id) override {
30 mux_.reset(connection_id);
31 }
32
33 private:
34 MuxMessaging& mux_;
35 };
36
37 /// Called by `Channel` constructor.
38 void registerChannel(Channel& channel);
39
40 /// Called by `Channel` destructor.
41 void unregisterChannel(Channel& channel);
42
43 void received(Messaging::ConnectionId connection_id, ChannelId channel_id,
44 const roo::byte* data, size_t len);
45
46 void reset(Messaging::ConnectionId connection_id);
47
48 Messaging& messaging_;
49 Dispatcher dispatcher_;
50 roo_collections::FlatSmallHashMap<ChannelId, Channel*> receivers_;
51};
52
54 public:
55 using Messaging::send;
57
59 : messaging_(messaging), id_(id) {
60 messaging_.registerChannel(*this);
61 }
62
63 ~Channel() { messaging_.unregisterChannel(*this); }
64
65 bool send(const roo::byte* header, size_t header_size,
66 const roo::byte* payload, size_t payload_size,
67 ConnectionId* connection_id) override;
68
69 bool sendContinuation(ConnectionId connection_id, const roo::byte* header,
70 size_t header_size, const roo::byte* payload,
71 size_t payload_size) override;
72
73 private:
74 friend class MuxMessaging;
75
76 MuxMessaging& messaging_;
77 ChannelId id_;
78};
79
80} // namespace roo_transport
Abstract interface for message exchange over a reliable channel.
Definition messaging.h:17
virtual bool sendContinuation(ConnectionId connection_id, const roo::byte *header, size_t header_size, const roo::byte *payload, size_t payload_size)=0
Sends continuation payload on an existing sender-side connection.
virtual bool send(const roo::byte *header, size_t header_size, const roo::byte *payload, size_t payload_size, ConnectionId *connection_id)=0
Sends message with optional header and payload.
bool sendContinuation(ConnectionId connection_id, const roo::byte *header, size_t header_size, const roo::byte *payload, size_t payload_size) override
Sends continuation payload on an existing sender-side connection.
bool send(const roo::byte *header, size_t header_size, const roo::byte *payload, size_t payload_size, ConnectionId *connection_id) override
Sends message with optional header and payload.
Channel(MuxMessaging &messaging, ChannelId id)
Multiplexes up to 256 logical messaging channels over one Messaging link.