blob: 0a4a50e009cca8af3ecbd320d38c4f6cb25683d3 [file] [log] [blame]
Austin Schuh7bc59052020-02-16 23:48:33 -08001#include "aos/network/message_bridge_protocol.h"
2
3#include <string_view>
4
5#include "aos/configuration.h"
6#include "aos/flatbuffer_merge.h"
7#include "aos/flatbuffers.h"
8#include "aos/network/connect_generated.h"
9#include "flatbuffers/flatbuffers.h"
10
11namespace aos {
12namespace message_bridge {
13
14aos::FlatbufferDetachedBuffer<aos::message_bridge::Connect> MakeConnectMessage(
15 const Configuration *config, const Node *my_node,
16 std::string_view remote_name) {
17 CHECK(config->has_nodes()) << ": Config must have nodes to transfer.";
18
19 flatbuffers::FlatBufferBuilder fbb;
20 fbb.ForceDefaults(true);
21
22 flatbuffers::Offset<Node> node_offset = CopyFlatBuffer<Node>(my_node, &fbb);
23 const std::string_view node_name = my_node->name()->string_view();
24
25 std::vector<flatbuffers::Offset<Channel>> channel_offsets;
26 for (const Channel *channel : *config->channels()) {
27 if (channel->has_destination_nodes()) {
28 for (const Connection *connection : *channel->destination_nodes()) {
29 if (connection->name()->string_view() == node_name &&
30 channel->source_node()->string_view() == remote_name) {
Austin Schuha1250ce2020-03-15 22:48:15 -070031 // Remove the schema to save some space on the wire.
32 aos::FlatbufferDetachedBuffer<Channel> cleaned_channel =
33 CopyFlatBuffer<Channel>(channel);
34 cleaned_channel.mutable_message()->clear_schema();
35 channel_offsets.emplace_back(
36 CopyFlatBuffer<Channel>(&cleaned_channel.message(), &fbb));
Austin Schuh7bc59052020-02-16 23:48:33 -080037 }
38 }
39 }
40 }
41
42 flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<Channel>>>
43 channels_offset = fbb.CreateVector(channel_offsets);
44
45 Connect::Builder connect_builder(fbb);
46 connect_builder.add_channels_to_transfer(channels_offset);
47 connect_builder.add_node(node_offset);
48 fbb.Finish(connect_builder.Finish());
49
50 return fbb.Release();
51}
52
53} // namespace message_bridge
54} // namespace aos