basic documentation
This commit is contained in:
245
.cmake-format.yaml
Normal file
245
.cmake-format.yaml
Normal file
@@ -0,0 +1,245 @@
|
||||
_help_parse: Options affecting listfile parsing
|
||||
parse:
|
||||
_help_additional_commands:
|
||||
- Specify structure for custom cmake functions
|
||||
additional_commands:
|
||||
foo:
|
||||
flags:
|
||||
- BAR
|
||||
- BAZ
|
||||
kwargs:
|
||||
HEADERS: "*"
|
||||
SOURCES: "*"
|
||||
DEPENDS: "*"
|
||||
_help_override_spec:
|
||||
- Override configurations per-command where available
|
||||
override_spec: {}
|
||||
_help_vartags:
|
||||
- Specify variable tags.
|
||||
vartags: []
|
||||
_help_proptags:
|
||||
- Specify property tags.
|
||||
proptags: []
|
||||
_help_format: Options affecting formatting.
|
||||
format:
|
||||
_help_disable:
|
||||
- Disable formatting entirely, making cmake-format a no-op
|
||||
disable: false
|
||||
_help_line_width:
|
||||
- How wide to allow formatted cmake files
|
||||
line_width: 128
|
||||
_help_tab_size:
|
||||
- How many spaces to tab for indent
|
||||
tab_size: 2
|
||||
_help_use_tabchars:
|
||||
- If true, lines are indented using tab characters (utf-8
|
||||
- 0x09) instead of <tab_size> space characters (utf-8 0x20).
|
||||
- In cases where the layout would require a fractional tab
|
||||
- character, the behavior of the fractional indentation is
|
||||
- governed by <fractional_tab_policy>
|
||||
use_tabchars: false
|
||||
_help_fractional_tab_policy:
|
||||
- If <use_tabchars> is True, then the value of this variable
|
||||
- indicates how fractional indentions are handled during
|
||||
- whitespace replacement. If set to 'use-space', fractional
|
||||
- indentation is left as spaces (utf-8 0x20). If set to
|
||||
- "`round-up` fractional indentation is replaced with a single"
|
||||
- tab character (utf-8 0x09) effectively shifting the column
|
||||
- to the next tabstop
|
||||
fractional_tab_policy: use-space
|
||||
_help_max_subgroups_hwrap:
|
||||
- If an argument group contains more than this many sub-groups
|
||||
- (parg or kwarg groups) then force it to a vertical layout.
|
||||
max_subgroups_hwrap: 2
|
||||
_help_max_pargs_hwrap:
|
||||
- If a positional argument group contains more than this many
|
||||
- arguments, then force it to a vertical layout.
|
||||
max_pargs_hwrap: 6
|
||||
_help_max_rows_cmdline:
|
||||
- If a cmdline positional group consumes more than this many
|
||||
- lines without nesting, then invalidate the layout (and nest)
|
||||
max_rows_cmdline: 2
|
||||
_help_separate_ctrl_name_with_space:
|
||||
- If true, separate flow control names from their parentheses
|
||||
- with a space
|
||||
separate_ctrl_name_with_space: false
|
||||
_help_separate_fn_name_with_space:
|
||||
- If true, separate function names from parentheses with a
|
||||
- space
|
||||
separate_fn_name_with_space: false
|
||||
_help_dangle_parens:
|
||||
- If a statement is wrapped to more than one line, than dangle
|
||||
- the closing parenthesis on its own line.
|
||||
dangle_parens: false
|
||||
_help_dangle_align:
|
||||
- If the trailing parenthesis must be 'dangled' on its on
|
||||
- "line, then align it to this reference: `prefix`: the start"
|
||||
- "of the statement, `prefix-indent`: the start of the"
|
||||
- "statement, plus one indentation level, `child`: align to"
|
||||
- the column of the arguments
|
||||
dangle_align: prefix
|
||||
_help_min_prefix_chars:
|
||||
- If the statement spelling length (including space and
|
||||
- parenthesis) is smaller than this amount, then force reject
|
||||
- nested layouts.
|
||||
min_prefix_chars: 4
|
||||
_help_max_prefix_chars:
|
||||
- If the statement spelling length (including space and
|
||||
- parenthesis) is larger than the tab width by more than this
|
||||
- amount, then force reject un-nested layouts.
|
||||
max_prefix_chars: 10
|
||||
_help_max_lines_hwrap:
|
||||
- If a candidate layout is wrapped horizontally but it exceeds
|
||||
- this many lines, then reject the layout.
|
||||
max_lines_hwrap: 2
|
||||
_help_line_ending:
|
||||
- What style line endings to use in the output.
|
||||
line_ending: unix
|
||||
_help_command_case:
|
||||
- Format command names consistently as 'lower' or 'upper' case
|
||||
command_case: canonical
|
||||
_help_keyword_case:
|
||||
- Format keywords consistently as 'lower' or 'upper' case
|
||||
keyword_case: unchanged
|
||||
_help_always_wrap:
|
||||
- A list of command names which should always be wrapped
|
||||
always_wrap: []
|
||||
_help_enable_sort:
|
||||
- If true, the argument lists which are known to be sortable
|
||||
- will be sorted lexicographicall
|
||||
enable_sort: true
|
||||
_help_autosort:
|
||||
- If true, the parsers may infer whether or not an argument
|
||||
- list is sortable (without annotation).
|
||||
autosort: false
|
||||
_help_require_valid_layout:
|
||||
- By default, if cmake-format cannot successfully fit
|
||||
- everything into the desired linewidth it will apply the
|
||||
- last, most aggressive attempt that it made. If this flag is
|
||||
- True, however, cmake-format will print error, exit with non-
|
||||
- zero status code, and write-out nothing
|
||||
require_valid_layout: false
|
||||
_help_layout_passes:
|
||||
- A dictionary mapping layout nodes to a list of wrap
|
||||
- decisions. See the documentation for more information.
|
||||
layout_passes: {}
|
||||
_help_markup: Options affecting comment reflow and formatting.
|
||||
markup:
|
||||
_help_bullet_char:
|
||||
- What character to use for bulleted lists
|
||||
bullet_char: "*"
|
||||
_help_enum_char:
|
||||
- What character to use as punctuation after numerals in an
|
||||
- enumerated list
|
||||
enum_char: .
|
||||
_help_first_comment_is_literal:
|
||||
- If comment markup is enabled, don't reflow the first comment
|
||||
- block in each listfile. Use this to preserve formatting of
|
||||
- your copyright/license statements.
|
||||
first_comment_is_literal: false
|
||||
_help_literal_comment_pattern:
|
||||
- If comment markup is enabled, don't reflow any comment block
|
||||
- which matches this (regex) pattern. Default is `None`
|
||||
- (disabled).
|
||||
literal_comment_pattern: null
|
||||
_help_fence_pattern:
|
||||
- Regular expression to match preformat fences in comments
|
||||
- default= ``r'^\s*([`~]{3}[`~]*)(.*)$'``
|
||||
fence_pattern: ^\s*([`~]{3}[`~]*)(.*)$
|
||||
_help_ruler_pattern:
|
||||
- Regular expression to match rulers in comments default=
|
||||
- '``r''^\s*[^\w\s]{3}.*[^\w\s]{3}$''``'
|
||||
ruler_pattern: ^\s*[^\w\s]{3}.*[^\w\s]{3}$
|
||||
_help_explicit_trailing_pattern:
|
||||
- If a comment line matches starts with this pattern then it
|
||||
- is explicitly a trailing comment for the preceeding
|
||||
- argument. Default is '#<'
|
||||
explicit_trailing_pattern: "#<"
|
||||
_help_hashruler_min_length:
|
||||
- If a comment line starts with at least this many consecutive
|
||||
- hash characters, then don't lstrip() them off. This allows
|
||||
- for lazy hash rulers where the first hash char is not
|
||||
- separated by space
|
||||
hashruler_min_length: 10
|
||||
_help_canonicalize_hashrulers:
|
||||
- If true, then insert a space between the first hash char and
|
||||
- remaining hash chars in a hash ruler, and normalize its
|
||||
- length to fill the column
|
||||
canonicalize_hashrulers: true
|
||||
_help_enable_markup:
|
||||
- enable comment markup parsing and reflow
|
||||
enable_markup: true
|
||||
_help_lint: Options affecting the linter
|
||||
lint:
|
||||
_help_disabled_codes:
|
||||
- a list of lint codes to disable
|
||||
disabled_codes: []
|
||||
_help_function_pattern:
|
||||
- regular expression pattern describing valid function names
|
||||
function_pattern: "[0-9a-z_]+"
|
||||
_help_macro_pattern:
|
||||
- regular expression pattern describing valid macro names
|
||||
macro_pattern: "[0-9A-Z_]+"
|
||||
_help_global_var_pattern:
|
||||
- regular expression pattern describing valid names for
|
||||
- variables with global (cache) scope
|
||||
global_var_pattern: "[A-Z][0-9A-Z_]+"
|
||||
_help_internal_var_pattern:
|
||||
- regular expression pattern describing valid names for
|
||||
- variables with global scope (but internal semantic)
|
||||
internal_var_pattern: _[A-Z][0-9A-Z_]+
|
||||
_help_local_var_pattern:
|
||||
- regular expression pattern describing valid names for
|
||||
- variables with local scope
|
||||
local_var_pattern: "[a-z][a-z0-9_]+"
|
||||
_help_private_var_pattern:
|
||||
- regular expression pattern describing valid names for
|
||||
- privatedirectory variables
|
||||
private_var_pattern: _[0-9a-z_]+
|
||||
_help_public_var_pattern:
|
||||
- regular expression pattern describing valid names for public
|
||||
- directory variables
|
||||
public_var_pattern: "[A-Z][0-9A-Z_]+"
|
||||
_help_argument_var_pattern:
|
||||
- regular expression pattern describing valid names for
|
||||
- function/macro arguments and loop variables.
|
||||
argument_var_pattern: "[a-z][a-z0-9_]+"
|
||||
_help_keyword_pattern:
|
||||
- regular expression pattern describing valid names for
|
||||
- keywords used in functions or macros
|
||||
keyword_pattern: "[A-Z][0-9A-Z_]+"
|
||||
_help_max_conditionals_custom_parser:
|
||||
- In the heuristic for C0201, how many conditionals to match
|
||||
- within a loop in before considering the loop a parser.
|
||||
max_conditionals_custom_parser: 2
|
||||
_help_min_statement_spacing:
|
||||
- Require at least this many newlines between statements
|
||||
min_statement_spacing: 1
|
||||
_help_max_statement_spacing:
|
||||
- Require no more than this many newlines between statements
|
||||
max_statement_spacing: 2
|
||||
max_returns: 6
|
||||
max_branches: 12
|
||||
max_arguments: 5
|
||||
max_localvars: 15
|
||||
max_statements: 50
|
||||
_help_encode: Options affecting file encoding
|
||||
encode:
|
||||
_help_emit_byteorder_mark:
|
||||
- If true, emit the unicode byte-order mark (BOM) at the start
|
||||
- of the file
|
||||
emit_byteorder_mark: false
|
||||
_help_input_encoding:
|
||||
- Specify the encoding of the input file. Defaults to utf-8
|
||||
input_encoding: utf-8
|
||||
_help_output_encoding:
|
||||
- Specify the encoding of the output file. Defaults to utf-8.
|
||||
- Note that cmake only claims to support utf-8 so be careful
|
||||
- when using anything else
|
||||
output_encoding: utf-8
|
||||
_help_misc: Miscellaneous configurations options.
|
||||
misc:
|
||||
_help_per_command:
|
||||
- A dictionary containing any per-command configuration
|
||||
- overrides. Currently only `command_case` is supported.
|
||||
per_command: {}
|
||||
@@ -3,9 +3,7 @@ set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||
set(ENV{TARGET} "x86_64-linux-gnu")
|
||||
|
||||
set(CMAKE_CXX_FLAGS
|
||||
"-Wall -fvisibility=hidden -fvisibility-inlines-hidden -Wformat -Wformat-security -rdynamic"
|
||||
)
|
||||
set(CMAKE_CXX_FLAGS "-Wall -fvisibility=hidden -fvisibility-inlines-hidden -Wformat -Wformat-security -rdynamic")
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "-g2 -O0")
|
||||
set(CMAKE_CXX_FLAGS_RELEASE
|
||||
"-fstack-protector-all -Wl,-z,relro,-z,now -Wl,-z,noexecstack -s -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 -O3 -g2 -march=native -pipe -flto=auto"
|
||||
@@ -27,4 +25,3 @@ project(
|
||||
add_subdirectory(src)
|
||||
add_subdirectory(tests)
|
||||
add_subdirectory(docs)
|
||||
|
||||
|
||||
@@ -3,57 +3,114 @@
|
||||
|
||||
#include "exceptions.hpp"
|
||||
#include "utf8_string.hpp"
|
||||
#include <packet_interface.hpp>
|
||||
#include <bit.hpp>
|
||||
#include <cstddef>
|
||||
#include <last_will.hpp>
|
||||
#include <bit.hpp>
|
||||
#include <packet_interface.hpp>
|
||||
#include <string>
|
||||
#include <variant>
|
||||
#include <vector>
|
||||
|
||||
/**
|
||||
* @brief Enum class representing the flags for MQTT Connect packets.
|
||||
*
|
||||
* These flags are used to control the behavior of the connection attempt.
|
||||
*/
|
||||
enum ConnectFlags : uint16_t {
|
||||
RESERVERD = 0,
|
||||
CLEAN_START = 1,
|
||||
WILL_FLAG = 2,
|
||||
WILL_QOS = 3,
|
||||
WILL_RETAIN = 5,
|
||||
PASSWORD_FLAG = 6,
|
||||
USERNAME_FLAG = 7,
|
||||
RESERVERD = 0, /**< Reserved flag. */
|
||||
CLEAN_START = 1, /**< Clean start flag. */
|
||||
WILL_FLAG = 2, /**< Will flag. */
|
||||
WILL_QOS = 3, /**< Will QoS flag. */
|
||||
WILL_RETAIN = 5, /**< Will retain flag.*/
|
||||
PASSWORD_FLAG = 6, /**< Password flag. If set to 0, password MUST not be present in the payload*/
|
||||
USERNAME_FLAG = 7, /**< Username flag. If set to 0, username MUST not be present in the payload*/
|
||||
};
|
||||
|
||||
using ConnectionFlagValue = std::variant<bool, uint8_t>;
|
||||
|
||||
/**
|
||||
* @brief Connect Packet according to MQTT Version 5.0 specification.
|
||||
*
|
||||
* This class represents a Connect packet as defined in the MQTT Version 5.0 specification.
|
||||
*/
|
||||
class ConnectPacket : public IPacket {
|
||||
public:
|
||||
ConnectPacket(IPacket &);
|
||||
ConnectPacket(std::vector<std::byte>);
|
||||
/**
|
||||
* @brief Constructs a new Connect Packet from an existing packet.
|
||||
*
|
||||
* @param packet The packet from which to construct the Connect Packet.
|
||||
*/
|
||||
ConnectPacket(IPacket &packet);
|
||||
|
||||
/**
|
||||
* @brief Constructs a new Connect Packet from a vector of bytes.
|
||||
*
|
||||
* @param bytes The bytes from which to construct the Connect Packet.
|
||||
*/
|
||||
ConnectPacket(std::vector<std::byte> bytes);
|
||||
|
||||
/**
|
||||
* @brief Destructs the Connect Packet.
|
||||
*/
|
||||
~ConnectPacket();
|
||||
|
||||
/**
|
||||
* @brief Gets the value of a connection flag.
|
||||
*
|
||||
* @param flag The flag for which to get the value.
|
||||
* @return The value of the flag.
|
||||
*/
|
||||
ConnectionFlagValue get_connection_flag(ConnectFlags flag) const;
|
||||
|
||||
/**
|
||||
* @brief Converts the packet to a string for display purposes.
|
||||
*
|
||||
* @return A string representing the packet.
|
||||
*/
|
||||
std::string as_string() const final;
|
||||
|
||||
/**
|
||||
* @brief Converts the packet to bytes for transmission over a socket to the client.
|
||||
*
|
||||
* This function is not implemented for ConnectPacket.
|
||||
*
|
||||
* @return A vector of bytes representing the packet.
|
||||
*/
|
||||
std::vector<std::byte> as_bytes() final { throw NotImplemented(); };
|
||||
|
||||
inline std::string get_client_id() const { return this->client_id.as_string(); };
|
||||
/**
|
||||
* @brief Gets the client ID from the packet.
|
||||
*
|
||||
* @return The client ID as a string.
|
||||
*/
|
||||
inline std::string get_client_id() const { return this->client_id.as_string(); };
|
||||
|
||||
private:
|
||||
/**
|
||||
* @brief Parses the variable header of the packet.
|
||||
*/
|
||||
void parse_variable_header() final;
|
||||
|
||||
/**
|
||||
* @brief Parses the payload of the packet.
|
||||
*/
|
||||
void parse_payload() final;
|
||||
|
||||
// Variable Header
|
||||
utf8_str protocol_name;
|
||||
std::uint8_t protocol_version;
|
||||
std::byte connection_flags;
|
||||
std::uint16_t keepalive;
|
||||
std::vector<std::byte>::const_iterator payload_start_byte;
|
||||
uint16_t packet_identifier = 0;
|
||||
MQTTProperties properties;
|
||||
uint size_in_bytes = 0;
|
||||
|
||||
utf8_str protocol_name; /**< The protocol name. */
|
||||
std::uint8_t protocol_version; /**< The protocol version. */
|
||||
std::byte connection_flags; /**< The connection flags. */
|
||||
std::uint16_t keepalive; /**< The keepalive value. */
|
||||
std::vector<std::byte>::const_iterator payload_start_byte; /**< Iterator to the start byte of the payload. */
|
||||
uint16_t packet_identifier = 0; /**< The packet identifier. */
|
||||
MQTTProperties properties; /**< The MQTT properties associated with the packet. */
|
||||
uint size_in_bytes = 0; /**< The size of the packet in bytes. */
|
||||
|
||||
// Payload
|
||||
utf8_str client_id;
|
||||
LastWill lastwill;
|
||||
utf8_str username;
|
||||
binary_data password;
|
||||
utf8_str client_id; /**< The client ID. */
|
||||
LastWill lastwill; /**< The last will message. */
|
||||
utf8_str username; /**< The username. */
|
||||
binary_data password; /**< The password. */
|
||||
};
|
||||
|
||||
#endif // INCLUDE_CONNECTION_CONNECT_PACKET_HPP_
|
||||
|
||||
@@ -95,9 +95,6 @@ int main() {
|
||||
cpptrace::enable_inlined_call_resolution(true);
|
||||
warmup_cpptrace();
|
||||
set_signal_handlers();
|
||||
raise(SIGSEGV);
|
||||
|
||||
// spdlog::set_level(spdlog::level::debug);
|
||||
|
||||
clistener.start();
|
||||
clistener.join();
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#define MQTTD_VERSION_MAJOR 0
|
||||
#define MQTTD_VERSION_MINOR 0
|
||||
#define MQTTD_VERSION_PATCH 1
|
||||
#define MQTTD_COMMIT_HASH ccd31f1802fa0052819a18599c9932e1c74e8a1a
|
||||
#define MQTTD_BUILD_TIMESTAMP 1713729654
|
||||
#define MQTTD_COMMIT_HASH 2b70078e9ce0694833dfb760747bbb7bf7f0621a
|
||||
#define MQTTD_BUILD_TIMESTAMP 1720889932
|
||||
|
||||
Reference in New Issue
Block a user