Ver código fonte

CSocket: Add an on_ready_to_read callback.

This callback uses a CNotifier internally and will fire whenever there's
something to be read from the socket.
Andreas Kling 6 anos atrás
pai
commit
82446ea701
2 arquivos alterados com 17 adições e 0 exclusões
  1. 13 0
      Libraries/LibCore/CSocket.cpp
  2. 4 0
      Libraries/LibCore/CSocket.h

+ 13 - 0
Libraries/LibCore/CSocket.cpp

@@ -137,3 +137,16 @@ bool CSocket::listen()
     set_error(errno);
     return rc == 0;
 }
+
+void CSocket::did_update_fd(int fd)
+{
+    if (fd < 0) {
+        m_read_notifier = nullptr;
+        return;
+    }
+    m_read_notifier = make<CNotifier>(fd, CNotifier::Event::Read);
+    m_read_notifier->on_ready_to_read = [this] {
+        if (on_ready_to_read)
+            on_ready_to_read();
+    };
+}

+ 4 - 0
Libraries/LibCore/CSocket.h

@@ -39,6 +39,7 @@ public:
     int destination_port() const { return m_destination_port; }
 
     Function<void()> on_connected;
+    Function<void()> on_ready_to_read;
 
 protected:
     CSocket(Type, CObject* parent);
@@ -49,8 +50,11 @@ protected:
     int m_destination_port { -1 };
     bool m_connected { false };
 
+    virtual void did_update_fd(int) override;
+
 private:
     virtual bool open(CIODevice::OpenMode) override { ASSERT_NOT_REACHED(); }
     Type m_type { Type::Invalid };
     OwnPtr<CNotifier> m_notifier;
+    OwnPtr<CNotifier> m_read_notifier;
 };