summaryrefslogtreecommitdiff
path: root/Libraries
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2019-07-27 10:48:43 +0200
committerAndreas Kling <awesomekling@gmail.com>2019-07-27 10:48:43 +0200
commit82446ea70175b05cddba60a962fe1443c137da6b (patch)
tree6f7663ffe0cdcb701f2af691a97d4578389b9720 /Libraries
parent8f4fba95c0f39992cc1aac046a4a0c9804e0a3b4 (diff)
downloadserenity-82446ea70175b05cddba60a962fe1443c137da6b.zip
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.
Diffstat (limited to 'Libraries')
-rw-r--r--Libraries/LibCore/CSocket.cpp13
-rw-r--r--Libraries/LibCore/CSocket.h4
2 files changed, 17 insertions, 0 deletions
diff --git a/Libraries/LibCore/CSocket.cpp b/Libraries/LibCore/CSocket.cpp
index c49a6e2698..636dc179d5 100644
--- a/Libraries/LibCore/CSocket.cpp
+++ b/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();
+ };
+}
diff --git a/Libraries/LibCore/CSocket.h b/Libraries/LibCore/CSocket.h
index 20d059166b..7aac4008f9 100644
--- a/Libraries/LibCore/CSocket.h
+++ b/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;
};