diff --git a/Userland/Libraries/LibCore/Forward.h b/Userland/Libraries/LibCore/Forward.h index 71381bc79d..9c3afdf9d2 100644 --- a/Userland/Libraries/LibCore/Forward.h +++ b/Userland/Libraries/LibCore/Forward.h @@ -41,4 +41,10 @@ class UDPSocket; enum class TimerShouldFireWhenNotVisible; +namespace Stream { +class Socket; +class Stream; +class BufferedSocketBase; +} + } diff --git a/Userland/Libraries/LibCore/Stream.h b/Userland/Libraries/LibCore/Stream.h index 3af5633653..f5ae204fde 100644 --- a/Userland/Libraries/LibCore/Stream.h +++ b/Userland/Libraries/LibCore/Stream.h @@ -742,8 +742,16 @@ private: BufferedHelper m_helper; }; +class BufferedSocketBase : public Socket { +public: + virtual ErrorOr read_line(Bytes buffer) = 0; + virtual ErrorOr read_until(Bytes buffer, StringView const& candidate) = 0; + virtual ErrorOr can_read_line() = 0; + virtual size_t buffer_size() const = 0; +}; + template -class BufferedSocket final : public Socket { +class BufferedSocket final : public BufferedSocketBase { friend BufferedHelper; public: @@ -753,7 +761,7 @@ public: } BufferedSocket(BufferedSocket&& other) - : Socket(static_cast(other)) + : BufferedSocketBase(static_cast(other)) , m_helper(move(other.m_helper)) { setup_notifier(); @@ -780,13 +788,13 @@ public: virtual ErrorOr set_blocking(bool enabled) override { return m_helper.stream().set_blocking(enabled); } virtual ErrorOr set_close_on_exec(bool enabled) override { return m_helper.stream().set_close_on_exec(enabled); } - ErrorOr read_line(Bytes buffer) { return m_helper.read_line(move(buffer)); } - ErrorOr read_until(Bytes buffer, StringView const& candidate) { return m_helper.read_until(move(buffer), move(candidate)); } + virtual ErrorOr read_line(Bytes buffer) override { return m_helper.read_line(move(buffer)); } + virtual ErrorOr read_until(Bytes buffer, StringView const& candidate) override { return m_helper.read_until(move(buffer), move(candidate)); } template ErrorOr read_until_any_of(Bytes buffer, Array candidates) { return m_helper.read_until_any_of(move(buffer), move(candidates)); } - ErrorOr can_read_line() { return m_helper.can_read_line(); } + virtual ErrorOr can_read_line() override { return m_helper.can_read_line(); } - size_t buffer_size() const { return m_helper.buffer_size(); } + virtual size_t buffer_size() const override { return m_helper.buffer_size(); } virtual ~BufferedSocket() override { }