/* * Copyright (c) 2024, Andrew Kaster * Copyright (c) 2025, stasoid * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #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 wait_until_readable(); ErrorOr transfer(Bytes, Vector const& handle_offsets); struct [[nodiscard]] ReadResult { Vector bytes; Vector fds; // always empty, present to avoid OS #ifdefs in Connection.cpp }; ReadResult read_as_much_as_possible_without_blocking(Function schedule_shutdown); // 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); private: NonnullOwnPtr m_socket; int m_peer_pid = -1; }; }