/* * Copyright (c) 2024, Andrew Kaster * Copyright (c) 2025, stasoid * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include namespace IPC { class TransportSocketWindows { AK_MAKE_NONCOPYABLE(TransportSocketWindows); AK_MAKE_DEFAULT_MOVABLE(TransportSocketWindows); public: explicit TransportSocketWindows(NonnullOwnPtr socket); void set_peer_pid(int pid); void set_up_read_hook(Function); bool is_open() const; void close(); void close_after_sending_all_pending_messages(); void wait_until_readable(); ErrorOr transfer_message(ReadonlyBytes, Vector const& handle_offsets); enum class ShouldShutdown { No, Yes, }; struct Message { Vector bytes; Queue fds; // always empty, present to avoid OS #ifdefs in Connection.cpp }; ShouldShutdown read_as_many_messages_as_possible_without_blocking(Function&&); // Obnoxious name to make it clear that this is a dangerous operation. ErrorOr release_underlying_transport_for_transfer(); ErrorOr clone_for_transfer(); private: ErrorOr duplicate_handles(Bytes, Vector const& handle_offsets); ErrorOr transfer(ReadonlyBytes); private: NonnullOwnPtr m_socket; ByteBuffer m_unprocessed_bytes; int m_peer_pid = -1; }; }