/* * Copyright (c) 2021, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include namespace IPC { template class MultiServer { public: static ErrorOr> try_create(Optional socket_path = {}) { auto server = TRY(Core::LocalServer::try_create()); TRY(server->take_over_from_system_server(socket_path.value_or({}))); return adopt_nonnull_own_or_enomem(new (nothrow) MultiServer(move(server))); } private: explicit MultiServer(NonnullRefPtr server) : m_server(move(server)) { m_server->on_accept = [&](auto client_socket) { auto client_id = ++m_next_client_id; (void)IPC::new_client_connection(move(client_socket), client_id); }; } int m_next_client_id { 0 }; RefPtr m_server; }; }