Program Listing for File Server.hpp

Return to documentation for file (BackendAsyncmsg/Server.hpp)

#ifndef NETIO3BACKEND_BACKENDASYNCMSG_SERVER_HPP
#define NETIO3BACKEND_BACKENDASYNCMSG_SERVER_HPP

#include <functional>
#include <memory>
#include <set>

#include <asyncmsg/Server.h>
#include <asyncmsg/Session.h>

#include "Types.hpp"

namespace netio3::asyncmsg {
  class Server : public felix::asyncmsg::Server
  {
  public:
    explicit Server(boost::asio::io_service& ioService,
                    NetworkConfig config,
                    std::function<void(const EndPointAddress&)> onShutdownCb,
                    std::function<void(const ConnectionEvent&)> addEventCb,
                    BaseEventLoop* eventloop,
                    bool useAsioEventLoop,
                    Mode mode);

    void startAccept();

    void onAccept(std::shared_ptr<felix::asyncmsg::Session> session) override;

    void onAcceptError(const boost::system::error_code& error,
                       std::shared_ptr<felix::asyncmsg::Session> session) override;

    void shutdown();

  private:
    void closeSession(std::shared_ptr<felix::asyncmsg::Session> session);

    std::reference_wrapper<boost::asio::io_service> m_ioService;
    NetworkConfig m_config{};
    std::function<void(const EndPointAddress&)> m_onShutdownCb{};
    std::function<void(const ConnectionEvent&)> m_addEventCb{};
    BaseEventLoop* m_eventloop{nullptr};
    std::set<std::shared_ptr<felix::asyncmsg::Session>> m_sessions{};
    bool m_useAsioEventLoop{};
    Mode m_mode{};
    bool m_shuttingDown{false};
    mutable std::mutex m_mutex{};
  };
}  // namespace netio3::asyncmsg

#endif  // NETIO3BACKEND_BACKENDASYNCMSG_SERVER_HPP