1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- #pragma once
- #include "plugin_base.h"
- #include <string>
- #include <unordered_map>
- #include <functional>
- #include <forward_list>
- namespace rotor::plugin {
- struct link_client_plugin_t : public plugin_base_t {
-
- using link_callback_t = std::function<void(const extended_error_ptr_t &)>;
-
- using unlink_reaction_t = std::function<bool(message::unlink_request_t &message)>;
- using plugin_base_t::plugin_base_t;
-
- static const void *class_identity;
- const void *identity() const noexcept override;
- void activate(actor_base_t *actor) noexcept override;
-
- virtual void link(const address_ptr_t &address, bool operational_only = true,
- const link_callback_t &callback = {}) noexcept;
-
- template <typename F> void on_unlink(F &&callback) noexcept { unlink_reaction = std::forward<F>(callback); }
-
- virtual void on_link_response(message::link_response_t &message) noexcept;
-
- virtual void on_unlink_request(message::unlink_request_t &message) noexcept;
- bool handle_shutdown(message::shutdown_request_t *message) noexcept override;
- bool handle_init(message::init_request_t *message) noexcept override;
-
- void forget_link(message::unlink_request_t &message) noexcept;
- private:
- enum class link_state_t { LINKING, OPERATIONAL, UNLINKING };
- struct server_record_t {
- link_callback_t callback;
- link_state_t state;
- request_id_t request_id;
- };
- using servers_map_t = std::unordered_map<address_ptr_t, server_record_t>;
- using unlink_req_t = intrusive_ptr_t<message::unlink_request_t>;
- using unlink_queue_t = std::list<unlink_req_t>;
- void try_forget_links(bool attempt_shutdown) noexcept;
- servers_map_t servers_map;
- unlink_reaction_t unlink_reaction;
- unlink_queue_t unlink_queue;
- bool configured = false;
- };
- }
|