Jelajahi Sumber

LibChess: Allow UCIEndpoint to handle unexpected disconnections

Tim Ledbetter 2 tahun lalu
induk
melakukan
680d4e34d5

+ 13 - 0
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<Core::CustomEvent>(EndpointEventType::UnexpectedEof));
+            m_in_notifier->set_enabled(false);
+            return;
+        }
+
         while (m_in->can_read_line())
             Core::EventLoop::current().post_event(*this, read_command());
     };

+ 5 - 0
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<Core::IODevice> in, NonnullRefPtr<Core::IODevice> out);
+    virtual void custom_event(Core::CustomEvent&) override;
 
 private:
+    enum EndpointEventType {
+        UnexpectedEof
+    };
     void set_in_notifier();
     NonnullOwnPtr<Command> read_command();