3 #include "telnetpp/command.hpp"
4 #include "telnetpp/core.hpp"
5 #include "telnetpp/negotiation.hpp"
6 #include "telnetpp/subnegotiation.hpp"
8 #include <boost/range/algorithm_ext/insert.hpp>
17 template <
typename Continuation>
18 void operator()(telnetpp::bytes data, Continuation &&c)
20 boost::insert(unparsed_data_, unparsed_data_.end(), data);
22 if (!std::exchange(currently_parsing_,
true))
24 auto const _ = gsl::finally([
this] {
25 unparsed_data_.clear();
26 currently_parsing_ =
false;
32 for (
unsigned char by : unparsed_data_)
36 case parsing_state::state_idle:
40 case parsing_state::state_iac:
44 case parsing_state::state_negotiation:
45 parse_negotiation(by, c);
48 case parsing_state::state_subnegotiation:
49 parse_subnegotiation(by, c);
52 case parsing_state::state_subnegotiation_content:
53 parse_subnegotiation_content(by, c);
56 case parsing_state::state_subnegotiation_content_iac:
57 parse_subnegotiation_content_iac(by, c);
70 enum class parsing_state
76 state_subnegotiation_content,
77 state_subnegotiation_content_iac
80 parsing_state state_{parsing_state::state_idle};
81 bool currently_parsing_{
false};
82 std::vector<telnetpp::byte> unparsed_data_;
84 telnetpp::byte_storage plain_data_;
85 telnetpp::byte_storage subnegotiation_content_;
86 telnetpp::negotiation_type negotiation_type_;
87 telnetpp::option_type subnegotiation_option_;
89 template <
typename Continuation>
90 void parse_idle(telnetpp::byte by, Continuation &&c)
95 state_ = parsing_state::state_iac;
99 plain_data_.push_back(by);
104 template <
typename Continuation>
105 void parse_iac(telnetpp::byte by, Continuation &&c)
110 plain_data_.push_back(by);
111 state_ = parsing_state::state_idle;
119 negotiation_type_ = by;
120 state_ = parsing_state::state_negotiation;
125 state_ = parsing_state::state_subnegotiation;
131 state_ = parsing_state::state_idle;
136 template <
typename Continuation>
137 void parse_negotiation(telnetpp::byte by, Continuation &&c)
140 state_ = parsing_state::state_idle;
143 template <
typename Continuation>
144 void parse_subnegotiation(telnetpp::byte by, Continuation &&c)
146 subnegotiation_option_ = by;
147 subnegotiation_content_.clear();
148 state_ = parsing_state::state_subnegotiation_content;
151 template <
typename Continuation>
152 void parse_subnegotiation_content(telnetpp::byte by, Continuation &&c)
157 state_ = parsing_state::state_subnegotiation_content_iac;
161 subnegotiation_content_.push_back(by);
166 template <
typename Continuation>
167 void parse_subnegotiation_content_iac(telnetpp::byte by, Continuation &&c)
173 subnegotiation_option_, subnegotiation_content_});
174 state_ = parsing_state::state_idle;
178 subnegotiation_content_.push_back(by);
179 state_ = parsing_state::state_subnegotiation_content;
184 template <
typename Continuation>
185 void emit_plain_data(Continuation &&c)
187 if (!plain_data_.empty())
A class that encapsulates the value of a Telnet command.
Definition: command.hpp:13
A class that encapsulates a Telnet negotiation.
Definition: negotiation.hpp:15
Definition: parser.hpp:15
A class that encapsulates a Telnet subnegotiation.
Definition: subnegotiation.hpp:14