summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibIPC/ConnectionFromClient.h
diff options
context:
space:
mode:
Diffstat (limited to 'Userland/Libraries/LibIPC/ConnectionFromClient.h')
-rw-r--r--Userland/Libraries/LibIPC/ConnectionFromClient.h73
1 files changed, 73 insertions, 0 deletions
diff --git a/Userland/Libraries/LibIPC/ConnectionFromClient.h b/Userland/Libraries/LibIPC/ConnectionFromClient.h
new file mode 100644
index 0000000000..a57b243c4b
--- /dev/null
+++ b/Userland/Libraries/LibIPC/ConnectionFromClient.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <LibIPC/Connection.h>
+
+namespace IPC {
+
+template<typename T, class... Args>
+NonnullRefPtr<T> new_client_connection(Args&&... args)
+{
+ return T::construct(forward<Args>(args)...) /* arghs */;
+}
+
+template<typename ClientEndpoint, typename ServerEndpoint>
+class ConnectionFromClient : public Connection<ServerEndpoint, ClientEndpoint>
+ , public ServerEndpoint::Stub
+ , public ClientEndpoint::template Proxy<ServerEndpoint> {
+public:
+ using ServerStub = typename ServerEndpoint::Stub;
+ using IPCProxy = typename ClientEndpoint::template Proxy<ServerEndpoint>;
+
+ ConnectionFromClient(ServerStub& stub, NonnullOwnPtr<Core::Stream::LocalSocket> socket, int client_id)
+ : IPC::Connection<ServerEndpoint, ClientEndpoint>(stub, move(socket))
+ , ClientEndpoint::template Proxy<ServerEndpoint>(*this, {})
+ , m_client_id(client_id)
+ {
+ VERIFY(this->socket().is_open());
+ this->socket().on_ready_to_read = [this] {
+ // FIXME: Do something about errors.
+ (void)this->drain_messages_from_peer();
+ };
+ }
+
+ virtual ~ConnectionFromClient() override
+ {
+ }
+
+ void did_misbehave()
+ {
+ dbgln("{} (id={}) misbehaved, disconnecting.", *this, m_client_id);
+ this->shutdown();
+ }
+
+ void did_misbehave(const char* message)
+ {
+ dbgln("{} (id={}) misbehaved ({}), disconnecting.", *this, m_client_id, message);
+ this->shutdown();
+ }
+
+ void shutdown_with_error(Error const& error)
+ {
+ dbgln("{} (id={}) had error ({}), disconnecting.", *this, m_client_id, error);
+ this->shutdown();
+ }
+
+ int client_id() const { return m_client_id; }
+
+ virtual void die() override = 0;
+
+private:
+ int m_client_id { -1 };
+};
+
+}
+
+template<typename ClientEndpoint, typename ServerEndpoint>
+struct AK::Formatter<IPC::ConnectionFromClient<ClientEndpoint, ServerEndpoint>> : Formatter<Core::Object> {
+};