#ifndef MATADOR_CONNECTOR_HPP #define MATADOR_CONNECTOR_HPP #include "matador/net/export.hpp" #include "matador/net/handler.hpp" #include "matador/net/handler_creator.hpp" #include "matador/net/ip.hpp" #include "matador/logger/logger.hpp" #include namespace matador { /** * Connector which initiates a reactor based connection * to a remote network host identified by a list * of endpoints. * * Once a connection is established a handler is created * with the given create handler function. The socket * is passed to the created handler. */ class OOS_NET_API connector : public handler, public handler_creator { public: typedef std::function(tcp::socket sock, tcp::peer endpoint, connector *cnnctr)> t_connect_handler; /**< Shortcut to a function creating a handler on successfully execute to a host */ /** * Default constructor */ connector(); /** * Creates a new connector with the given * create handler function * * @param on_new_connection Function which creates a handler on new connection */ explicit connector(t_connect_handler on_new_connection); /** * Initiates a execute to one of the given endpoints within the * given reactor. Once a connection is established a new handler * for this connection is created. The new connection is dispatched * by the reactor. * * @param r Reactor to handle the connector and the created connection * @param endpoints List of endpoints to */ void connect(reactor &r, const std::vector &endpoints); /** * Initiates a execute to one of the given endpoints within the * given reactor. Once a connection is established a new handler * for this connection is created with the given function. The new * connection is dispatched by the reactor. * * @param r Reactor to handle the connector and the created connection * @param endpoints List of endpoints to * @param on_new_connection Function creating a new handler on new connection */ void connect(reactor &r, const std::vector &endpoints, t_connect_handler on_new_connection); /** * Opens the connector. Actually this does * nothing at all. */ void open() override {} /** * Returns the handle of the connector. The result will * always be zero, because the connector doesn't has a socket * * @return Always zero */ socket_type handle() const override; /** * Does nothing */ void on_input() override {} /** * Does nothing */ void on_output() override {} /** * Does nothing */ void on_except() override {} /** * The timeout call is used to establish the connection. * Once the connection could be established within this call * the timeout is canceled otherwise it will be tried again * after three seconds */ void on_timeout() override; /** * Does nothing */ void on_close() override {} /** * Does nothing */ void close() override {} /** * Always false because connection is established via timeout * * @return Always false */ bool is_ready_write() const override; /** * Always false because connection is established via timeout * * @return Always false */ bool is_ready_read() const override; /** * Notifies the connector that * this handler was closed. * * @param hndlr Closed handler. */ void notify_close(handler *hndlr) override; std::string name() const override; private: t_connect_handler connect_handler_; logger log_; std::vector endpoints_; }; } #endif //MATADOR_CONNECTOR_HPP