|
|
@ -18,18 +18,33 @@ namespace protocol { |
|
|
|
using handler_t = std::function<void(protocol_t&, const message_t&)>; |
|
|
|
using handler_t = std::function<void(protocol_t&, const message_t&)>; |
|
|
|
using handler_map_t = std::map<token::pattern_t, handler_t>; |
|
|
|
using handler_map_t = std::map<token::pattern_t, handler_t>; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
struct session_key_t { |
|
|
|
|
|
|
|
std::string session; |
|
|
|
|
|
|
|
std::string token; |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool operator==(const session_key_t& l, const session_key_t& r); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
session_key_t session_key_from(const token::list_t& tokens); |
|
|
|
|
|
|
|
session_key_t session_key_from(const message_t& message); |
|
|
|
|
|
|
|
|
|
|
|
class protocol_t { |
|
|
|
class protocol_t { |
|
|
|
public: |
|
|
|
public: |
|
|
|
void set_handlers(const handler_map_t handlers); |
|
|
|
void set_handlers(const handler_map_t handlers); |
|
|
|
|
|
|
|
|
|
|
|
void absorb(const std::string& input); |
|
|
|
void absorb(const std::string& input); |
|
|
|
void send(const token::list_t& tokens); |
|
|
|
void send(const token::list_t& tokens); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void submit_message(const session_key_t& session_key, const std::vector<std::string>& header, const std::vector<std::string>& body); |
|
|
|
|
|
|
|
|
|
|
|
protected: |
|
|
|
protected: |
|
|
|
virtual void emit(const std::string& output) { }; |
|
|
|
virtual void emit(const std::string& output) { }; |
|
|
|
|
|
|
|
|
|
|
|
private: |
|
|
|
private: |
|
|
|
handler_map_t handlers; |
|
|
|
handler_map_t handlers; |
|
|
|
size_t max_pattern_length; |
|
|
|
size_t max_pattern_length; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void send_data_line(const session_key_t& session_key, const std::string& data_line); |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
class ios_protocol_t : public protocol_t { |
|
|
|
class ios_protocol_t : public protocol_t { |
|
|
@ -45,20 +60,11 @@ namespace protocol { |
|
|
|
std::ostream& out; |
|
|
|
std::ostream& out; |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
struct session_t { |
|
|
|
|
|
|
|
std::string session; |
|
|
|
|
|
|
|
std::string token; |
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool operator==(const session_t& l, const session_t& r); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
session_t session_from(token::list_t tokens); |
|
|
|
|
|
|
|
session_t session_from(message_t message); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
namespace std { |
|
|
|
namespace std { |
|
|
|
template<> struct hash<protocol::session_t> { |
|
|
|
template<> struct hash<protocol::session_key_t> { |
|
|
|
std::size_t operator()(protocol::session_t const& session) const noexcept { |
|
|
|
std::size_t operator()(protocol::session_key_t const& session) const noexcept { |
|
|
|
auto session_hash = std::hash<std::string>{}(session.session); |
|
|
|
auto session_hash = std::hash<std::string>{}(session.session); |
|
|
|
auto token_hash = std::hash<std::string>{}(session.token); |
|
|
|
auto token_hash = std::hash<std::string>{}(session.token); |
|
|
|
return session_hash ^ (token_hash << 1); |
|
|
|
return session_hash ^ (token_hash << 1); |
|
|
|