diff --git a/Userland/Libraries/LibChess/UCIEndpoint.cpp b/Userland/Libraries/LibChess/UCIEndpoint.cpp index 7693d0e3df..865da51521 100644 --- a/Userland/Libraries/LibChess/UCIEndpoint.cpp +++ b/Userland/Libraries/LibChess/UCIEndpoint.cpp @@ -56,14 +56,27 @@ void Endpoint::event(Core::Event& event) case Command::Type::Quit: return handle_quit(); default: + Object::event(event); break; } } +void Endpoint::custom_event(Core::CustomEvent& custom_event) +{ + if (custom_event.custom_type() == EndpointEventType::UnexpectedEof) + handle_unexpected_eof(); +} + void Endpoint::set_in_notifier() { m_in_notifier = Core::Notifier::construct(m_in->fd(), Core::Notifier::Read); m_in_notifier->on_ready_to_read = [this] { + if (!m_in->can_read_line()) { + Core::EventLoop::current().post_event(*this, make(EndpointEventType::UnexpectedEof)); + m_in_notifier->set_enabled(false); + return; + } + while (m_in->can_read_line()) Core::EventLoop::current().post_event(*this, read_command()); }; diff --git a/Userland/Libraries/LibChess/UCIEndpoint.h b/Userland/Libraries/LibChess/UCIEndpoint.h index 00ae61ef39..18f4f4db34 100644 --- a/Userland/Libraries/LibChess/UCIEndpoint.h +++ b/Userland/Libraries/LibChess/UCIEndpoint.h @@ -31,6 +31,7 @@ public: virtual void handle_bestmove(BestMoveCommand const&) { } virtual void handle_info(InfoCommand const&) { } virtual void handle_quit() { } + virtual void handle_unexpected_eof() { } void send_command(Command const&); @@ -49,8 +50,12 @@ public: protected: Endpoint() = default; Endpoint(NonnullRefPtr in, NonnullRefPtr out); + virtual void custom_event(Core::CustomEvent&) override; private: + enum EndpointEventType { + UnexpectedEof + }; void set_in_notifier(); NonnullOwnPtr read_command();