#ifndef _PROTOCOL_ #define _PROTOCOL_ #include #include #include #include #include namespace protocol { struct message_t { std::string input; token::pattern_t pattern; }; class protocol_t; using handler_t = std::function; using handler_map_t = std::map; using session_key_t = token::string_t; session_key_t session_key_from(const token::list_t& tokens); session_key_t session_key_from(const message_t& message); token::string_t session_token_from(const token::list_t& tokens); token::string_t session_token_from(const message_t& message); class protocol_t { public: void set_handlers(const handler_map_t handlers); void absorb(const std::string& input); void send(const token::list_t& tokens); // TODO: Move these methods to a separate session_t class! void send_result(const session_key_t& session_key, const token::string_t& session_token, token::list_t tokens); void proceed(const session_key_t& session_key, const token::string_t& session_token); void junk(const session_key_t& session_key, const token::string_t& session_token); void fail(const session_key_t& session_key, const token::string_t& session_token); void submit_message(const session_key_t& session_key, const token::string_t& session_token, const std::vector& header, const std::vector& body); protected: virtual void emit(const std::string& output) { }; private: handler_map_t handlers; size_t max_pattern_length; std::string version; void send_data_line(const session_key_t& session_key, const token::string_t& session_token, const std::string& data_line); }; class ios_protocol_t : public protocol_t { public: ios_protocol_t(std::istream& in, std::ostream& out); void run(); protected: virtual void emit(const std::string& output); private: std::istream& in; std::ostream& out; }; } #endif