Ember
Loading...
Searching...
No Matches
FlatBufferCodec.cpp
Go to the documentation of this file.
2
3namespace Ember {
4namespace Network {
5
6FlatBufferCodec::FlatBufferCodec() : m_builder(std::make_unique<flatbuffers::FlatBufferBuilder>(1024)) {}
7
9
11
12flatbuffers::FlatBufferBuilder &FlatBufferCodec::GetBuilder() { return *m_builder; }
13
14MessageFrame FlatBufferCodec::BuildHandshake(const std::string &version, const std::string &clientId,
15 const std::string &clientName,
16 const std::vector<std::string> &capabilities) {
17 Reset();
18
19 auto versionOffset = m_builder->CreateString(version);
20 auto clientIdOffset = m_builder->CreateString(clientId);
21 auto clientNameOffset = clientName.empty() ? 0 : m_builder->CreateString(clientName);
22
23 std::vector<flatbuffers::Offset<flatbuffers::String>> capOffsets;
24 for (const auto &cap : capabilities) {
25 capOffsets.push_back(m_builder->CreateString(cap));
26 }
27 auto capsVector = capabilities.empty() ? 0 : m_builder->CreateVector(capOffsets);
28
30 hsBuilder.add_version(versionOffset);
31 hsBuilder.add_client_id(clientIdOffset);
32 if (!clientName.empty()) {
33 hsBuilder.add_client_name(clientNameOffset);
34 }
35 if (!capabilities.empty()) {
36 hsBuilder.add_capabilities(capsVector);
37 }
38
39 auto handshake = hsBuilder.Finish();
40 m_builder->Finish(handshake);
41
42 return MessageFrame(Protocol::MessageType_Handshake, m_builder->GetBufferPointer(), m_builder->GetSize());
43}
44
45MessageFrame FlatBufferCodec::BuildHandshakeAck(const std::string &version, const std::string &sessionId, bool accepted,
46 const std::string &error) {
47 Reset();
48
49 auto versionOffset = m_builder->CreateString(version);
50 auto sessionIdOffset = m_builder->CreateString(sessionId);
51 auto errorOffset = error.empty() ? 0 : m_builder->CreateString(error);
52
54 builder.add_version(versionOffset);
55 builder.add_session_id(sessionIdOffset);
56 builder.add_accepted(accepted);
57 if (!error.empty()) {
58 builder.add_error(errorOffset);
59 }
60
61 auto ack = builder.Finish();
62 m_builder->Finish(ack);
63
64 return MessageFrame(Protocol::MessageType_HandshakeAck, m_builder->GetBufferPointer(), m_builder->GetSize());
65}
66
68FlatBufferCodec::BuildTreeInit(const std::string &treeId, const std::string &treeName,
69 flatbuffers::Offset<Protocol::NodeDefinition> rootOffset,
70 const std::vector<flatbuffers::Offset<Protocol::BlackboardDefinition>> &blackboards,
71 const std::vector<flatbuffers::Offset<Protocol::KeyValue>> &metadata) {
72 auto treeIdOffset = m_builder->CreateString(treeId);
73 auto treeNameOffset = treeName.empty() ? 0 : m_builder->CreateString(treeName);
74 auto blackboardsVector = blackboards.empty() ? 0 : m_builder->CreateVector(blackboards);
75 auto metadataVector = metadata.empty() ? 0 : m_builder->CreateVector(metadata);
76
78 builder.add_tree_id(treeIdOffset);
79 if (!treeName.empty()) {
80 builder.add_tree_name(treeNameOffset);
81 }
82 builder.add_root(rootOffset);
83 if (!blackboards.empty()) {
84 builder.add_blackboards(blackboardsVector);
85 }
86 if (!metadata.empty()) {
87 builder.add_metadata(metadataVector);
88 }
89
90 auto init = builder.Finish();
91 m_builder->Finish(init);
92
93 return MessageFrame(Protocol::MessageType_TreeInit, m_builder->GetBufferPointer(), m_builder->GetSize());
94}
95
96MessageFrame FlatBufferCodec::BuildTreeInitAck(const std::string &treeId, bool success, int32_t nodeCount,
97 const std::string &error) {
98 Reset();
99
100 auto treeIdOffset = m_builder->CreateString(treeId);
101 auto errorOffset = error.empty() ? 0 : m_builder->CreateString(error);
102
104 builder.add_tree_id(treeIdOffset);
105 builder.add_success(success);
106 builder.add_node_count(nodeCount);
107 if (!error.empty()) {
108 builder.add_error(errorOffset);
109 }
110
111 auto ack = builder.Finish();
112 m_builder->Finish(ack);
113
114 return MessageFrame(Protocol::MessageType_TreeInitAck, m_builder->GetBufferPointer(), m_builder->GetSize());
115}
116
117MessageFrame FlatBufferCodec::BuildTickUpdate(const std::string &treeId, int64_t tickNumber, int64_t tickTimestampMs,
118 float deltaTimeMs, bool isDelta,
119 const std::vector<flatbuffers::Offset<Protocol::NodeState>> &states,
120 const std::vector<int64_t> &executionPath) {
121 Reset();
122
123 auto treeIdOffset = m_builder->CreateString(treeId);
124 auto statesVector = m_builder->CreateVector(states);
125 auto pathVector = executionPath.empty() ? 0 : m_builder->CreateVector(executionPath);
126
128 builder.add_tree_id(treeIdOffset);
129 builder.add_tick_number(tickNumber);
130 builder.add_tick_timestamp_ms(tickTimestampMs);
131 builder.add_delta_time_ms(deltaTimeMs);
132 builder.add_is_delta(isDelta);
133 builder.add_states(statesVector);
134 if (!executionPath.empty()) {
135 builder.add_execution_path(pathVector);
136 }
137
138 auto update = builder.Finish();
139 m_builder->Finish(update);
140
141 return MessageFrame(Protocol::MessageType_TickUpdate, m_builder->GetBufferPointer(), m_builder->GetSize());
142}
143
145 const std::string &treeId, const std::string &blackboardId, int64_t tickNumber,
146 const std::vector<flatbuffers::Offset<Protocol::BlackboardUpdateEntry>> &updates) {
147 Reset();
148
149 auto treeIdOffset = m_builder->CreateString(treeId);
150 auto bbIdOffset = m_builder->CreateString(blackboardId);
151 auto updatesVector = updates.empty() ? 0 : m_builder->CreateVector(updates);
152
154 builder.add_tree_id(treeIdOffset);
155 builder.add_blackboard_id(bbIdOffset);
156 builder.add_tick_number(tickNumber);
157 if (!updates.empty()) {
158 builder.add_updates(updatesVector);
159 }
160
161 auto bbUpdate = builder.Finish();
162 m_builder->Finish(bbUpdate);
163
164 return MessageFrame(Protocol::MessageType_BlackboardUpdate, m_builder->GetBufferPointer(), m_builder->GetSize());
165}
166
167MessageFrame FlatBufferCodec::BuildTreeReset(const std::string &treeId, int64_t tickNumber, const std::string &reason) {
168 Reset();
169
170 auto treeIdOffset = m_builder->CreateString(treeId);
171 auto reasonOffset = reason.empty() ? 0 : m_builder->CreateString(reason);
172
174 builder.add_tree_id(treeIdOffset);
175 builder.add_tick_number(tickNumber);
176 if (!reason.empty()) {
177 builder.add_reason(reasonOffset);
178 }
179
180 auto reset = builder.Finish();
181 m_builder->Finish(reset);
182
183 return MessageFrame(Protocol::MessageType_TreeReset, m_builder->GetBufferPointer(), m_builder->GetSize());
184}
185
186MessageFrame FlatBufferCodec::BuildDisconnect(const std::string &reason, const std::string &message) {
187 Reset();
188
189 auto reasonOffset = reason.empty() ? 0 : m_builder->CreateString(reason);
190 auto messageOffset = message.empty() ? 0 : m_builder->CreateString(message);
191
193 if (!reason.empty()) {
194 builder.add_reason(reasonOffset);
195 }
196 if (!message.empty()) {
197 builder.add_message(messageOffset);
198 }
199
200 auto disconnect = builder.Finish();
201 m_builder->Finish(disconnect);
202
203 return MessageFrame(Protocol::MessageType_Disconnect, m_builder->GetBufferPointer(), m_builder->GetSize());
204}
205
206MessageFrame FlatBufferCodec::BuildError(Protocol::ErrorCode code, const std::string &message, bool fatal) {
207 Reset();
208
209 auto messageOffset = message.empty() ? 0 : m_builder->CreateString(message);
210
212 builder.add_code(code);
213 if (!message.empty()) {
214 builder.add_message(messageOffset);
215 }
216 builder.add_fatal(fatal);
217
218 auto error = builder.Finish();
219 m_builder->Finish(error);
220
221 return MessageFrame(Protocol::MessageType_Error, m_builder->GetBufferPointer(), m_builder->GetSize());
222}
223
224flatbuffers::Offset<Protocol::NodeDefinition>
225FlatBufferCodec::CreateNodeDefinition(int64_t id, Protocol::NodeType nodeType, const std::string &subtype,
226 const std::string &name, const std::string &description,
227 const std::vector<flatbuffers::Offset<Protocol::KeyValue>> &attributes,
228 const std::vector<flatbuffers::Offset<Protocol::NodeDefinition>> &children) {
229 auto subtypeOffset = m_builder->CreateString(subtype);
230 auto nameOffset = m_builder->CreateString(name);
231 auto descOffset = description.empty() ? 0 : m_builder->CreateString(description);
232 auto attrsVector = attributes.empty() ? 0 : m_builder->CreateVector(attributes);
233 auto childrenVector = children.empty() ? 0 : m_builder->CreateVector(children);
234
236 builder.add_id(id);
237 builder.add_node_type(nodeType);
238 builder.add_subtype(subtypeOffset);
239 builder.add_name(nameOffset);
240 if (!description.empty()) {
241 builder.add_description(descOffset);
242 }
243 if (!attributes.empty()) {
244 builder.add_attributes(attrsVector);
245 }
246 if (!children.empty()) {
247 builder.add_children(childrenVector);
248 }
249
250 return builder.Finish();
251}
252
253flatbuffers::Offset<Protocol::NodeState> FlatBufferCodec::CreateNodeState(int64_t id, Protocol::NodeStatus status,
254 Protocol::NodeStatus lastResult,
255 int64_t tickCount,
256 const std::string &message) {
257 auto messageOffset = message.empty() ? 0 : m_builder->CreateString(message);
258
260 builder.add_id(id);
261 builder.add_status(status);
262 builder.add_last_result(lastResult);
263 builder.add_tick_count(tickCount);
264 if (!message.empty()) {
265 builder.add_message(messageOffset);
266 }
267
268 return builder.Finish();
269}
270
271flatbuffers::Offset<Protocol::KeyValue> FlatBufferCodec::CreateKeyValue(const std::string &key,
272 const std::string &value) {
273 auto keyOffset = m_builder->CreateString(key);
274 auto valueOffset = value.empty() ? 0 : m_builder->CreateString(value);
275
277 builder.add_key(keyOffset);
278 if (!value.empty()) {
279 builder.add_value(valueOffset);
280 }
281
282 return builder.Finish();
283}
284
285flatbuffers::Offset<Protocol::BlackboardEntry> FlatBufferCodec::CreateBlackboardEntry(const std::string &key,
286 const std::string &valueType,
287 const std::string &value,
288 const std::string &description) {
289 auto keyOffset = m_builder->CreateString(key);
290 auto typeOffset = valueType.empty() ? 0 : m_builder->CreateString(valueType);
291 auto valueOffset = value.empty() ? 0 : m_builder->CreateString(value);
292 auto descOffset = description.empty() ? 0 : m_builder->CreateString(description);
293
295 builder.add_key(keyOffset);
296 if (!valueType.empty()) {
297 builder.add_value_type(typeOffset);
298 }
299 if (!value.empty()) {
300 builder.add_value(valueOffset);
301 }
302 if (!description.empty()) {
303 builder.add_description(descOffset);
304 }
305
306 return builder.Finish();
307}
308
309flatbuffers::Offset<Protocol::BlackboardDefinition> FlatBufferCodec::CreateBlackboardDefinition(
310 const std::string &id, const std::string &name,
311 const std::vector<flatbuffers::Offset<Protocol::BlackboardEntry>> &entries) {
312 auto idOffset = m_builder->CreateString(id);
313 auto nameOffset = name.empty() ? 0 : m_builder->CreateString(name);
314 auto entriesVector = entries.empty() ? 0 : m_builder->CreateVector(entries);
315
317 builder.add_id(idOffset);
318 if (!name.empty()) {
319 builder.add_name(nameOffset);
320 }
321 if (!entries.empty()) {
322 builder.add_entries(entriesVector);
323 }
324
325 return builder.Finish();
326}
327
328flatbuffers::Offset<Protocol::BlackboardUpdateEntry>
329FlatBufferCodec::CreateBlackboardUpdateEntry(const std::string &key, const std::string &value,
330 const std::string &previousValue) {
331 auto keyOffset = m_builder->CreateString(key);
332 auto valueOffset = value.empty() ? 0 : m_builder->CreateString(value);
333 auto prevOffset = previousValue.empty() ? 0 : m_builder->CreateString(previousValue);
334
336 builder.add_key(keyOffset);
337 if (!value.empty()) {
338 builder.add_value(valueOffset);
339 }
340 if (!previousValue.empty()) {
341 builder.add_previous_value(prevOffset);
342 }
343
344 return builder.Finish();
345}
346
347} // namespace Network
348} // namespace Ember
std::unique_ptr< flatbuffers::FlatBufferBuilder > m_builder
flatbuffers::Offset< Protocol::BlackboardEntry > CreateBlackboardEntry(const std::string &key, const std::string &valueType, const std::string &value, const std::string &description="")
MessageFrame BuildTreeReset(const std::string &treeId, int64_t tickNumber, const std::string &reason="")
MessageFrame BuildBlackboardUpdate(const std::string &treeId, const std::string &blackboardId, int64_t tickNumber, const std::vector< flatbuffers::Offset< Protocol::BlackboardUpdateEntry > > &updates)
flatbuffers::Offset< Protocol::BlackboardUpdateEntry > CreateBlackboardUpdateEntry(const std::string &key, const std::string &value, const std::string &previousValue)
MessageFrame BuildTickUpdate(const std::string &treeId, int64_t tickNumber, int64_t tickTimestampMs, float deltaTimeMs, bool isDelta, const std::vector< flatbuffers::Offset< Protocol::NodeState > > &states, const std::vector< int64_t > &executionPath={})
flatbuffers::Offset< Protocol::NodeDefinition > CreateNodeDefinition(int64_t id, Protocol::NodeType nodeType, const std::string &subtype, const std::string &name, const std::string &description="", const std::vector< flatbuffers::Offset< Protocol::KeyValue > > &attributes={}, const std::vector< flatbuffers::Offset< Protocol::NodeDefinition > > &children={})
MessageFrame BuildHandshake(const std::string &version, const std::string &clientId, const std::string &clientName="", const std::vector< std::string > &capabilities={})
flatbuffers::Offset< Protocol::NodeState > CreateNodeState(int64_t id, Protocol::NodeStatus status, Protocol::NodeStatus lastResult=Protocol::NodeStatus_Idle, int64_t tickCount=0, const std::string &message="")
flatbuffers::Offset< Protocol::KeyValue > CreateKeyValue(const std::string &key, const std::string &value)
MessageFrame BuildError(Protocol::ErrorCode code, const std::string &message, bool fatal=false)
MessageFrame BuildHandshakeAck(const std::string &version, const std::string &sessionId, bool accepted=true, const std::string &error="")
flatbuffers::FlatBufferBuilder & GetBuilder()
MessageFrame BuildDisconnect(const std::string &reason="", const std::string &message="")
MessageFrame BuildTreeInitAck(const std::string &treeId, bool success=true, int32_t nodeCount=0, const std::string &error="")
MessageFrame BuildTreeInit(const std::string &treeId, const std::string &treeName, flatbuffers::Offset< Protocol::NodeDefinition > rootOffset, const std::vector< flatbuffers::Offset< Protocol::BlackboardDefinition > > &blackboards={}, const std::vector< flatbuffers::Offset< Protocol::KeyValue > > &metadata={})
flatbuffers::Offset< Protocol::BlackboardDefinition > CreateBlackboardDefinition(const std::string &id, const std::string &name, const std::vector< flatbuffers::Offset< Protocol::BlackboardEntry > > &entries)
void add_entries(flatbuffers::Offset< flatbuffers::Vector< flatbuffers::Offset< BlackboardEntry > > > entries)
flatbuffers::Offset< BlackboardDefinition > Finish()
void add_id(flatbuffers::Offset< flatbuffers::String > id)
void add_name(flatbuffers::Offset< flatbuffers::String > name)
void add_value(flatbuffers::Offset< flatbuffers::String > value)
flatbuffers::Offset< BlackboardEntry > Finish()
void add_key(flatbuffers::Offset< flatbuffers::String > key)
void add_description(flatbuffers::Offset< flatbuffers::String > description)
void add_value_type(flatbuffers::Offset< flatbuffers::String > value_type)
flatbuffers::Offset< BlackboardUpdate > Finish()
void add_tree_id(flatbuffers::Offset< flatbuffers::String > tree_id)
void add_updates(flatbuffers::Offset< flatbuffers::Vector< flatbuffers::Offset< BlackboardUpdateEntry > > > updates)
void add_blackboard_id(flatbuffers::Offset< flatbuffers::String > blackboard_id)
void add_value(flatbuffers::Offset< flatbuffers::String > value)
flatbuffers::Offset< BlackboardUpdateEntry > Finish()
void add_previous_value(flatbuffers::Offset< flatbuffers::String > previous_value)
void add_key(flatbuffers::Offset< flatbuffers::String > key)
flatbuffers::Offset< Disconnect > Finish()
void add_reason(flatbuffers::Offset< flatbuffers::String > reason)
void add_message(flatbuffers::Offset< flatbuffers::String > message)
flatbuffers::Offset< Error > Finish()
void add_message(flatbuffers::Offset< flatbuffers::String > message)
void add_error(flatbuffers::Offset< flatbuffers::String > error)
void add_session_id(flatbuffers::Offset< flatbuffers::String > session_id)
void add_version(flatbuffers::Offset< flatbuffers::String > version)
flatbuffers::Offset< HandshakeAck > Finish()
flatbuffers::Offset< Handshake > Finish()
void add_capabilities(flatbuffers::Offset< flatbuffers::Vector< flatbuffers::Offset< flatbuffers::String > > > capabilities)
void add_client_name(flatbuffers::Offset< flatbuffers::String > client_name)
void add_version(flatbuffers::Offset< flatbuffers::String > version)
void add_client_id(flatbuffers::Offset< flatbuffers::String > client_id)
void add_key(flatbuffers::Offset< flatbuffers::String > key)
flatbuffers::Offset< KeyValue > Finish()
void add_value(flatbuffers::Offset< flatbuffers::String > value)
void add_children(flatbuffers::Offset< flatbuffers::Vector< flatbuffers::Offset< NodeDefinition > > > children)
flatbuffers::Offset< NodeDefinition > Finish()
void add_description(flatbuffers::Offset< flatbuffers::String > description)
void add_attributes(flatbuffers::Offset< flatbuffers::Vector< flatbuffers::Offset< KeyValue > > > attributes)
void add_name(flatbuffers::Offset< flatbuffers::String > name)
void add_subtype(flatbuffers::Offset< flatbuffers::String > subtype)
flatbuffers::Offset< NodeState > Finish()
void add_message(flatbuffers::Offset< flatbuffers::String > message)
void add_last_result(NodeStatus last_result)
void add_execution_path(flatbuffers::Offset< flatbuffers::Vector< int64_t > > execution_path)
void add_tree_id(flatbuffers::Offset< flatbuffers::String > tree_id)
flatbuffers::Offset< TickUpdate > Finish()
void add_states(flatbuffers::Offset< flatbuffers::Vector< flatbuffers::Offset< NodeState > > > states)
void add_tick_timestamp_ms(int64_t tick_timestamp_ms)
flatbuffers::Offset< TreeInitAck > Finish()
void add_error(flatbuffers::Offset< flatbuffers::String > error)
void add_tree_id(flatbuffers::Offset< flatbuffers::String > tree_id)
void add_blackboards(flatbuffers::Offset< flatbuffers::Vector< flatbuffers::Offset< BlackboardDefinition > > > blackboards)
void add_tree_id(flatbuffers::Offset< flatbuffers::String > tree_id)
void add_metadata(flatbuffers::Offset< flatbuffers::Vector< flatbuffers::Offset< KeyValue > > > metadata)
flatbuffers::Offset< TreeInit > Finish()
void add_root(flatbuffers::Offset< NodeDefinition > root)
void add_tree_name(flatbuffers::Offset< flatbuffers::String > tree_name)
flatbuffers::Offset< TreeReset > Finish()
void add_tree_id(flatbuffers::Offset< flatbuffers::String > tree_id)
void add_reason(flatbuffers::Offset< flatbuffers::String > reason)