// // mdns_server.hpp // // Copyright (c) 2019 2020 Andrea Bondavalli. All rights reserved. // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // #ifndef _MDNS_SERVER_HPP_ #define _MDNS_SERVER_HPP_ #ifdef _USE_AVAHI_ #include #include #include #include #include #endif #include #include #include #include #include "config.hpp" #include "session_manager.hpp" #include "utils.hpp" class MDNSServer { public: MDNSServer(std::shared_ptr session_manager, std::shared_ptr config) : session_manager_(session_manager), config_(config) {} MDNSServer() = delete; MDNSServer(const MDNSServer&) = delete; MDNSServer& operator=(const MDNSServer&) = delete; virtual ~MDNSServer() = default; virtual bool init(); virtual bool terminate(); bool add_service(const std::string& name, const std::string& sdp); bool remove_service(const std::string& name); protected: #ifdef _USE_AVAHI_ static void entry_group_callback(AvahiEntryGroup* g, AvahiEntryGroupState state, void* userdata); static void client_callback(AvahiClient* c, AvahiClientState state, void* userdata); bool create_services(AvahiClient* client); #endif private: std::atomic_bool running_{false}; std::shared_ptr session_manager_; std::shared_ptr config_; std::string node_id_{config_->get_node_id()}; #ifdef _USE_AVAHI_ using entry_group_bimap_t = boost::bimap; entry_group_bimap_t groups_; /* order is important here */ std::unique_ptr poll_{ nullptr, &avahi_threaded_poll_free}; std::unique_ptr client_{ nullptr, &avahi_client_free}; #endif }; #endif