/* * Copyright (c) 2018-2020, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include namespace IPC { #define IPC_CLIENT_CONNECTION(klass, socket_path) \ C_OBJECT_ABSTRACT(klass) \ public: \ template \ static ErrorOr> try_create(Args&&... args) \ { \ auto parsed_socket_path = TRY(Core::SessionManagement::parse_path_with_sid(socket_path)); \ auto socket = TRY(Core::LocalSocket::connect(move(parsed_socket_path))); \ /* We want to rate-limit our clients */ \ TRY(socket->set_blocking(true)); \ \ return adopt_nonnull_ref_or_enomem(new (nothrow) Klass(IPC::Transport(move(socket)), forward(args)...)); \ } template class ConnectionToServer : public IPC::Connection , public ClientEndpoint::Stub , public ServerEndpoint::template Proxy { public: using ClientStub = typename ClientEndpoint::Stub; using IPCProxy = typename ServerEndpoint::template Proxy; ConnectionToServer(ClientStub& local_endpoint, Transport transport) : Connection(local_endpoint, move(transport)) , ServerEndpoint::template Proxy(*this, {}) { } virtual void die() override { // Override this function if you don't want your app to exit if it loses the connection. exit(0); } }; }