async_mqtt 9.0.1
Loading...
Searching...
No Matches
v5_publish.hpp
1// Copyright Takatoshi Kondo 2022
2//
3// Distributed under the Boost Software License, Version 1.0.
4// (See accompanying file LICENSE_1_0.txt or copy at
5// http://www.boost.org/LICENSE_1_0.txt)
6
7#if !defined(ASYNC_MQTT_PACKET_V5_PUBLISH_HPP)
8#define ASYNC_MQTT_PACKET_V5_PUBLISH_HPP
9
10#include <async_mqtt/buffer_to_packet_variant.hpp>
11#include <async_mqtt/error.hpp>
12
13#include <async_mqtt/packet/control_packet_type.hpp>
14#include <async_mqtt/packet/packet_id_type.hpp>
15#include <async_mqtt/packet/pubopts.hpp>
16#include <async_mqtt/packet/property_variant.hpp>
17#include <async_mqtt/packet/detail/is_payload.hpp>
18
19#include <async_mqtt/util/buffer.hpp>
20#include <async_mqtt/util/variable_bytes.hpp>
21#include <async_mqtt/util/static_vector.hpp>
22
23#if defined(ASYNC_MQTT_PRINT_PAYLOAD)
24#include <async_mqtt/util/json_like_out.hpp>
25#endif // defined(ASYNC_MQTT_PRINT_PAYLOAD)
26
37namespace async_mqtt::v5 {
38
39namespace as = boost::asio;
40
62template <std::size_t PacketIdBytes>
64public:
65
87 template <
88 typename StringViewLike,
89 typename Payload,
90 std::enable_if_t<
91 std::is_convertible_v<std::decay_t<StringViewLike>, std::string_view> &&
92 detail::is_payload<Payload>(),
93 std::nullptr_t
94 > = nullptr
95 >
98 StringViewLike&& topic_name,
99 Payload&& payloads,
100 pub::opts pubopts,
101 properties props = {}
102 );
103
119 template <
120 typename StringViewLike,
121 typename Payload,
122 std::enable_if_t<
123 std::is_convertible_v<std::decay_t<StringViewLike>, std::string_view> &&
124 detail::is_payload<Payload>(),
125 std::nullptr_t
126 > = nullptr
127 >
129 StringViewLike&& topic_name,
130 Payload&& payloads,
131 pub::opts pubopts,
132 properties props = {}
133 );
134
139 static constexpr control_packet_type type() {
141 }
142
148 std::vector<as::const_buffer> const_buffer_sequence() const;
149
154 std::size_t size() const;
155
160 std::size_t num_of_const_buffer_sequence() const;
161
167
172 constexpr pub::opts opts() const {
173 return pub::opts(fixed_header_);
174 }
175
180 std::string topic() const;
181
186 buffer const& topic_as_buffer() const;
187
192 std::string payload() const;
193
198 auto payload_range() const;
199
204 std::vector<buffer> const& payload_as_buffer() const;
205
210 constexpr void set_dup(bool dup) {
211 pub::set_dup(fixed_header_, dup);
212 }
213
218 properties const& props() const;
219
226
233
239 void add_topic(std::string topic);
240
246
253
258 void update_message_expiry_interval(std::uint32_t val);
259
260private:
261 void update_remaining_length_buf();
262
263 std::tuple<std::size_t, std::size_t> update_property_length_buf();
264
265 std::size_t remove_topic_alias_impl();
266
267 void add_topic_impl(std::string topic);
268
269private:
270
271 template <std::size_t PacketIdBytesArg>
274
275#if defined(ASYNC_MQTT_UNIT_TEST_FOR_PACKET)
276 friend struct ::ut_packet::v5_publish;
277 friend struct ::ut_packet::v5_publish_qos0;
278 friend struct ::ut_packet::v5_publish_invalid;
279 friend struct ::ut_packet::v5_publish_pid4;
280 friend struct ::ut_packet::v5_publish_topic_alias;
281 friend struct ::ut_packet::v5_publish_error;
282#endif // defined(ASYNC_MQTT_UNIT_TEST_FOR_PACKET)
283
284 // private constructor for internal use
285 explicit basic_publish_packet(buffer buf, error_code& ec);
286
287 struct tag_internal{};
288 explicit basic_publish_packet(
289 tag_internal,
291 buffer&& topic_name,
292 std::vector<buffer>&& payloads,
293 pub::opts pubopts,
295 );
296
297private:
298 std::uint8_t fixed_header_;
299 buffer topic_name_;
300 static_vector<char, 2> topic_name_length_buf_;
301 static_vector<char, PacketIdBytes> packet_id_;
302 std::size_t property_length_;
303 static_vector<char, 4> property_length_buf_;
304 properties props_;
305 std::vector<buffer> payloads_;
306 std::size_t remaining_length_;
307 static_vector<char, 4> remaining_length_buf_;
308};
309
322template <std::size_t PacketIdBytes>
324
337template <std::size_t PacketIdBytes>
339
352template <std::size_t PacketIdBytes>
353std::ostream& operator<<(std::ostream& o, basic_publish_packet<PacketIdBytes> const& v);
354
366
367} // namespace async_mqtt::v5
368
369#include <async_mqtt/packet/impl/v5_publish.hpp>
370
371#if !defined(ASYNC_MQTT_SEPARATE_COMPILATION)
372#include <async_mqtt/packet/impl/v5_publish.ipp>
373#endif // !defined(ASYNC_MQTT_SEPARATE_COMPILATION)
374
375#endif // ASYNC_MQTT_PACKET_V5_PUBLISH_HPP
The varaint type of all packets and system_error.
Definition packet_variant_fwd.hpp:37
buffer that has string_view interface and shared ownership This class is only for advanced usecase su...
Definition buffer.hpp:46
MQTT PUBLISH packet (v5)
Definition v5_publish.hpp:63
std::size_t num_of_const_buffer_sequence() const
Get number of element of const_buffer_sequence.
buffer const & topic_as_buffer() const
Get topic as a buffer.
bool operator==(basic_publish_packet< PacketIdBytes > const &lhs, basic_publish_packet< PacketIdBytes > const &rhs)
equal operator
constexpr void set_dup(bool dup)
Set dup flag.
Definition v5_publish.hpp:210
auto payload_range() const
Get payload range.
std::vector< buffer > const & payload_as_buffer() const
Get payload as a sequence of buffer.
static constexpr control_packet_type type()
Get MQTT control packet type.
Definition v5_publish.hpp:139
void remove_topic_alias_add_topic(std::string topic)
Remove topic and add topic_alias This is for extracting topic from the topic_alias.
void remove_topic_alias()
Remove topic alias This is for prepareing to store packet.
constexpr pub::opts opts() const
Get publish_options.
Definition v5_publish.hpp:172
basic_packet_id_type< PacketIdBytes >::type packet_id() const
Get packet id.
void remove_topic_add_topic_alias(topic_alias_type val)
Remove topic and add topic_alias This is for applying topic_alias.
bool operator<(basic_publish_packet< PacketIdBytes > const &lhs, basic_publish_packet< PacketIdBytes > const &rhs)
less than operator
basic_publish_packet(StringViewLike &&topic_name, Payload &&payloads, pub::opts pubopts, properties props={})
constructor for QoS0
properties const & props() const
Get properties.
void add_topic(std::string topic)
Add topic This is for extracting topic_alias.
std::string payload() const
Get payload.
void add_topic_alias(topic_alias_type val)
Add topic_alias This is for registering topic_alias.
void update_message_expiry_interval(std::uint32_t val)
Update MessageExpiryInterval property.
std::string topic() const
Get topic name.
std::ostream & operator<<(std::ostream &o, basic_publish_packet< PacketIdBytes > const &v)
stream output operator
basic_publish_packet(typename basic_packet_id_type< PacketIdBytes >::type packet_id, StringViewLike &&topic_name, Payload &&payloads, pub::opts pubopts, properties props={})
constructor
std::size_t size() const
Get packet size.
std::vector< as::const_buffer > const_buffer_sequence() const
Create const buffer sequence it is for boost asio APIs.
sys::error_code error_code
sys is a namespace alias of boost::sytem.
Definition error.hpp:56
protocol_version
MQTT protocol version.
Definition protocol_version.hpp:29
basic_packet_variant< PacketIdBytes > buffer_to_basic_packet_variant(buffer buf, protocol_version ver, error_code &ec)
create basic_packet_variant from the buffer
control_packet_type
MQTT control packet type.
Definition control_packet_type.hpp:26
std::uint16_t topic_alias_type
type of the topic alias value
Definition property.hpp:81
std::vector< property_variant > properties
property variant collection type
Definition property_variant.hpp:224
constexpr void set_dup(std::uint8_t &fixed_header, bool dup)
Set DUP to the fixed header.
Definition pubopts.hpp:84
packet idenfitifer type class template
Definition packet_id_type.hpp:25
MQTT PublishOptions.
Definition pubopts.hpp:136