Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
C
code
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
ReadMailReallyFast
code
Commits
ee7b3235
Commit
ee7b3235
authored
3 years ago
by
Leon Dietrich
Committed by
Benny Baumann
2 years ago
Browse files
Options
Downloads
Patches
Plain Diff
add: Document connection_line_buffer class
parent
db92e549
No related branches found
No related tags found
1 merge request
!1
First unit tests
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/net/connection_line_buffer.hpp
+64
-0
64 additions, 0 deletions
src/net/connection_line_buffer.hpp
with
64 additions
and
0 deletions
src/net/connection_line_buffer.hpp
+
64
−
0
View file @
ee7b3235
...
...
@@ -15,12 +15,59 @@
namespace
rmrf
::
net
{
/**
* This type defines the signature of the search function required to look up the next end
* of a data segment (for example a CR LF). It needs to return the first position where it
* found the desired char sequence. Its arguments are a reference to the string that should be
* searched and an index where to start the search.
*
* If the requested sequence wasn't found such a function must return std::string::npos.
*/
typedef
std
::
function
<
std
::
string
::
size_type
(
const
std
::
string
&
,
std
::
string
::
size_type
)
>
eol_search_t
;
/**
* This is the default line ending search method. It looks for CR, LF and CR LF style line endings.
* @brief A default line ending search callback looking for default line endings.
* @param data The string data to perform the search in.
* @param start_position The start position of the search.
* @return The first occurence index of a new line sequence of std::string::npos if none where found.
*/
std
::
string
::
size_type
default_eol_search
(
const
std
::
string
&
data
,
std
::
string
::
size_type
start_position
);
/**
* This class is a middleware between a (TCP) Client and a specific protocol handling client that takes
* care of the fact that incomming data might not be splitted at the new line positions. In order to do so
* this class accepts a search method to look for the end of a message (rmrf::net::default_eol_search
* might be a good candidate here) and calls the specified found_next_line_cb_ callback if a complete
* message was reconstructed.
*
* This class contains an internal buffer that might get filled by a single, yet very large, line. As a consequence
* it is wise to check the line_complete argument of the provided callback.
*
* Known limitation: If the last received data ends with '\r' and the next incoming data would start with '\n' there is no way
* to detect this as the received message might indeed be a complete one ending with '\r' and one cannot wait for a potential
* continuation of said message to arrive as they might never arrive. Thus it is recommended to either only transmit line endings
* that solely rely on LF or, if the data source is known to send out CR LF style endings (and only those) to implement a custom
* line end search algorithm. A third possibility to handle this issue is to ignore empty incomming lines if the last message ended
* with CR.
* @class connection_line_buffer
* @author doralitze
* @date 05/01/21
* @file connection_line_buffer.hpp
* @brief Filter a client to only serve messages that reassemble a complete line
* @see rmrf::net::default_eol_search
* @see rmrf::net::eol_search_t
*/
class
connection_line_buffer
{
public:
/**
* This type represents the callback layout that an accepting client is supposed to implement.
* The first argument represents the message data. The second argument indicates whether
* or not the message was completed prior to calling this callback. If the message size exceeds
* the buffer size of this instance it will call the specified callback with the data it got and will
* indicate the incompleteness by passing false to the second argument. If the message was
* passed regularly it will pass true.
*/
typedef
std
::
function
<
void
(
const
std
::
string
&
,
bool
)
>
found_next_line_cb_t
;
private:
...
...
@@ -31,7 +78,24 @@ private:
std
::
string
data
;
public:
/**
* This constructor creates a new buffer based on a given client, an input callback and a search algorithm callback.
* @brief Create a new line buffer with a custom search behaviour
* @param c The client to perform the input buffering for
* @param found_next_line_cb_ The callback to be called when a complete new line arrived
* @param max_line_size The maximum line length to aquire prior to collection abort and transmission of the incomplete line
* @param search_lb The callback to use for line break detection
*/
connection_line_buffer
(
std
::
shared_ptr
<
connection_client
>
c
,
found_next_line_cb_t
found_next_line_cb_
,
std
::
string
::
size_type
max_line_size
,
eol_search_t
search_lb
);
/**
* This constructor creates a new buffer based on a given client, an input callback and the maximum line size.
* This constructor uses the default line break search algorithm (rmrf::net::default_eol_search)
* @brief Create a new line buffer with a custom search behaviour
* @param c The client to perform the input buffering for
* @param found_next_line_cb_ The callback to be called when a complete new line arrived
* @param max_line_size The maximum line length to aquire prior to collection abort and transmission of the incomplete line
*/
connection_line_buffer
(
std
::
shared_ptr
<
connection_client
>
c
,
found_next_line_cb_t
found_next_line_cb_
,
std
::
string
::
size_type
max_line_size
);
private:
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment