basic documentation

This commit is contained in:
brenozd
2024-07-13 14:06:43 -03:00
parent 2b70078e9c
commit 30aba6ceca
5 changed files with 330 additions and 34 deletions

245
.cmake-format.yaml Normal file
View 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: {}

View File

@@ -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)

View File

@@ -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_

View File

@@ -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();

View File

@@ -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