]> git.lizzy.rs Git - dragonnet.git/blobdiff - recv_thread.c
Refactor type hooks
[dragonnet.git] / recv_thread.c
index b4975fb315f0d799c930526ad73f87ac26d8aabb..437105ee6492d4f5ab2263b4d7e9ec479e2d05f1 100644 (file)
@@ -1,13 +1,13 @@
 #include <assert.h>
+#include <dragonnet/peer.h>
+#include <dragonnet/recv.h>
+#include <dragonnet/recv_thread.h>
 #include <dragontype/number.h>
 #include <pthread.h>
 #include <stdbool.h>
 #include <stdio.h>
 #include <unistd.h>
 
-#include "peer.h"
-#include "recv_thread.h"
-
 void *dragonnet_peer_recv_thread(void *g_peer)
 {
        DragonnetPeer *p = (DragonnetPeer *) g_peer;
@@ -18,14 +18,14 @@ void *dragonnet_peer_recv_thread(void *g_peer)
        pthread_rwlock_unlock(&p->mu);
 
        while (true) {
-               u16 type;
+               u16 type_id;
 
                // Copy socket fd so that shutdown doesn't block
                pthread_rwlock_rdlock(&p->mu);
                int sock = p->sock;
                pthread_rwlock_unlock(&p->mu);
 
-               ssize_t len = recv(sock, &type, sizeof type, MSG_WAITALL);
+               ssize_t len = recv(sock, &type_id, sizeof type_id, MSG_WAITALL);
                if (len < 0) {
                        perror("recv");
                        dragonnet_peer_delete(p);
@@ -44,13 +44,16 @@ void *dragonnet_peer_recv_thread(void *g_peer)
                        return NULL;
                }
 
-               type = be16toh(type);
+               type_id = be16toh(type_id);
+               DragonnetType type = dragonnet_types[type_id];
+               u8 buf[type.siz];
+               type.deserialize(p, buf);
 
                pthread_rwlock_rdlock(&p->mu);
-               void (*on_recv_type)(struct dragonnet_peer *, u16) = p->on_recv_type;
+               void (*on_recv_type)(DragonnetPeer *, void *) = p->on_recv_type[type_id];
                pthread_rwlock_unlock(&p->mu);
 
                if (on_recv_type != NULL)
-                       on_recv_type(p, type);
+                       on_recv_type(p, buf);
        }
 }