roo_transport
API Documentation for roo_transport
Loading...
Searching...
No Matches
header.cpp
Go to the documentation of this file.
2
3#include "roo_io/data/read.h"
4#include "roo_io/data/write.h"
5#include "roo_io/memory/memory_input_iterator.h"
6#include "roo_io/memory/memory_output_iterator.h"
7
8namespace roo_transport {
9
11 CHECK(type_ == kRequest && first_message_);
12 return new_request_.function_id_;
13}
14
16 CHECK(type_ == kRequest && first_message_ && has_timeout_);
17 return new_request_.timeout_ms_;
18}
19
21 CHECK(type_ == kResponse && last_message_);
22 return last_response_.status_;
23}
24
28 header.type_ = kRequest;
29 header.first_message_ = true;
30 header.last_message_ = true;
31 header.has_timeout_ = false;
32 header.stream_id_ = stream_id;
33 header.new_request_.function_id_ = function_id;
34 header.new_request_.timeout_ms_ = 0;
35 return header;
36}
37
42 header.type_ = kRequest;
43 header.first_message_ = true;
44 header.last_message_ = true;
45 header.has_timeout_ = false;
46 header.stream_id_ = stream_id;
47 header.new_request_.function_id_ = function_id;
48 header.new_request_.timeout_ms_ = timeout_ms;
49 return header;
50}
51
54 header.type_ = kResponse;
55 header.first_message_ = true;
56 header.last_message_ = true;
57 header.has_timeout_ = false;
58 header.stream_id_ = stream_id;
59 header.last_response_.status_ = status;
60 return header;
61}
62
63size_t RpcHeader::serialize(roo::byte* buffer, size_t buffer_size) const {
64 roo_io::MemoryOutputIterator it(buffer, buffer + buffer_size);
65 uint8_t mask = 0;
66 mask |= (type_ == kRequest) ? 0x01 : 0;
67 mask |= first_message_ ? 0x02 : 0;
68 mask |= last_message_ ? 0x04 : 0;
69 mask |= has_timeout_ ? 0x08 : 0;
70 it.write(roo::byte{mask});
71 roo_io::WriteBeU24(it, stream_id_);
72 if (type_ == kRequest && first_message_) {
73 roo_io::WriteVarU64(it, new_request_.function_id_);
74 if (has_timeout_) {
75 roo_io::WriteVarU64(it, new_request_.timeout_ms_);
76 }
77 } else if (type_ == kResponse && last_message_) {
78 roo_io::WriteU8(it, (uint8_t)last_response_.status_);
79 }
80 CHECK_EQ(roo_io::kOk, it.status());
81 return it.ptr() - buffer;
82}
83
84size_t RpcHeader::deserialize(const roo::byte* buffer, size_t buffer_size) {
85 roo_io::MemoryIterator it(buffer, buffer + buffer_size);
86 uint8_t mask = (uint8_t)roo_io::ReadU8(it);
87 if ((mask & 0xF0) != 0) {
88 return 0;
89 }
90 type_ = (mask & 0x01) ? kRequest : kResponse;
91 first_message_ = (mask & 0x02) != 0;
92 last_message_ = (mask & 0x04) != 0;
93 has_timeout_ = (mask & 0x08) != 0;
94 stream_id_ = roo_io::ReadBeU24(it);
95 if (type_ == kRequest && first_message_) {
96 new_request_.function_id_ = roo_io::ReadVarU64(it);
97 if (has_timeout_) {
98 new_request_.timeout_ms_ = roo_io::ReadVarU64(it);
99 } else {
100 new_request_.timeout_ms_ = 0;
101 }
102 } else if (type_ == kResponse && last_message_) {
103 last_response_.status_ = (RpcStatus)roo_io::ReadU8(it);
104 }
105 if (it.status() != roo_io::kOk) {
106 return 0;
107 }
108 return it.ptr() - buffer;
109}
110
111} // namespace roo_transport
static RpcHeader NewUnaryResponse(RpcStreamId stream_id, RpcStatus status)
Definition header.cpp:52
struct roo_transport::RpcHeader::@0::@3 last_response_
uint32_t timeoutMs() const
Definition header.cpp:15
size_t serialize(roo::byte *buffer, size_t buffer_size) const
Definition header.cpp:63
size_t deserialize(const roo::byte *buffer, size_t buffer_size)
Definition header.cpp:84
struct roo_transport::RpcHeader::@0::@2 new_request_
RpcStatus responseStatus() const
Definition header.cpp:20
RpcFunctionId functionId() const
Definition header.cpp:10
static RpcHeader NewUnaryRequest(RpcFunctionId function_id, RpcStreamId stream_id)
Definition header.cpp:25
uint32_t RpcFunctionId
Definition rpc.h:10
uint32_t RpcStreamId
Definition rpc.h:11