Эх сурвалжийг харах

client: process messages through PeerChat

ambrop7 14 жил өмнө
parent
commit
d8d0eea7e9

+ 42 - 1
client/PeerChat.c

@@ -26,11 +26,28 @@
 
 #include "PeerChat.h"
 
-int PeerChat_Init (PeerChat *o, peerid_t peer_id, BPendingGroup *pg, void *user, PeerChat_handler_error handler_error)
+static void received_job_handler (PeerChat *o)
+{
+    DebugObject_Access(&o->d_obj);
+    ASSERT(o->received_data_len >= 0)
+    
+    int data_len = o->received_data_len;
+    
+    // set no received data
+    o->received_data_len = -1;
+    
+    // call message handler
+    o->handler_message(o->user, o->received_data, data_len);
+    return;
+}
+
+int PeerChat_Init (PeerChat *o, peerid_t peer_id, BPendingGroup *pg, void *user, PeerChat_handler_error handler_error,
+                                                                                 PeerChat_handler_message handler_message)
 {
     // init arguments
     o->user = user;
     o->handler_error = handler_error;
+    o->handler_message = handler_message;
     
     // init copier
     PacketCopier_Init(&o->copier, SC_MAX_MSGLEN, pg);
@@ -41,6 +58,12 @@ int PeerChat_Init (PeerChat *o, peerid_t peer_id, BPendingGroup *pg, void *user,
     // init PacketProto encoder
     PacketProtoEncoder_Init(&o->pp_encoder, SCOutmsgEncoder_GetOutput(&o->sc_encoder), pg);
     
+    // init received job
+    BPending_Init(&o->received_job, pg, (BPending_handler)received_job_handler, o);
+    
+    // set no received data
+    o->received_data_len = -1;
+    
     DebugObject_Init(&o->d_obj);
     return 1;
     
@@ -55,6 +78,9 @@ void PeerChat_Free (PeerChat *o)
 {
     DebugObject_Free(&o->d_obj);
     
+    // free received job
+    BPending_Free(&o->received_job);
+    
     // free PacketProto encoder
     PacketProtoEncoder_Free(&o->pp_encoder);
     
@@ -78,3 +104,18 @@ PacketRecvInterface * PeerChat_GetSendOutput (PeerChat *o)
     
     return PacketProtoEncoder_GetOutput(&o->pp_encoder);
 }
+
+void PeerChat_InputReceived (PeerChat *o, uint8_t *data, int data_len)
+{
+    DebugObject_Access(&o->d_obj);
+    ASSERT(o->received_data_len == -1)
+    ASSERT(data_len >= 0)
+    ASSERT(data_len <= SC_MAX_MSGLEN)
+    
+    // remember data
+    o->received_data = data;
+    o->received_data_len = data_len;
+    
+    // set received job
+    BPending_Set(&o->received_job);
+}

+ 9 - 1
client/PeerChat.h

@@ -27,25 +27,33 @@
 #include <protocol/scproto.h>
 #include <misc/debug.h>
 #include <base/DebugObject.h>
+#include <base/BPending.h>
 #include <flow/SinglePacketSender.h>
 #include <flow/PacketProtoEncoder.h>
 #include <flow/PacketCopier.h>
 #include <client/SCOutmsgEncoder.h>
 
 typedef void (*PeerChat_handler_error) (void *user);
+typedef void (*PeerChat_handler_message) (void *user, uint8_t *data, int data_len);
 
 typedef struct {
     void *user;
     PeerChat_handler_error handler_error;
+    PeerChat_handler_message handler_message;
     PacketProtoEncoder pp_encoder;
     SCOutmsgEncoder sc_encoder;
     PacketCopier copier;
+    BPending received_job;
+    uint8_t *received_data;
+    int received_data_len;
     DebugObject d_obj;
 } PeerChat;
 
-int PeerChat_Init (PeerChat *o, peerid_t peer_id, BPendingGroup *pg, void *user, PeerChat_handler_error handler_error) WARN_UNUSED;
+int PeerChat_Init (PeerChat *o, peerid_t peer_id, BPendingGroup *pg, void *user, PeerChat_handler_error handler_error,
+                                                                                 PeerChat_handler_message handler_message) WARN_UNUSED;
 void PeerChat_Free (PeerChat *o);
 PacketPassInterface * PeerChat_GetSendInput (PeerChat *o);
 PacketRecvInterface * PeerChat_GetSendOutput (PeerChat *o);
+void PeerChat_InputReceived (PeerChat *o, uint8_t *data, int data_len);
 
 #endif

+ 7 - 6
client/client.c

@@ -256,7 +256,7 @@ static void peer_unregister_need_relay (struct peer_data *peer);
 static void peer_reset (struct peer_data *peer);
 
 // handle incoming peer messages
-static void peer_msg (struct peer_data *peer, uint8_t *data, int data_len);
+static void peer_chat_handler_message (struct peer_data *peer, uint8_t *data, int data_len);
 
 // handlers for different message types
 static void peer_msg_youconnect (struct peer_data *peer, uint8_t *data, int data_len);
@@ -1278,7 +1278,9 @@ void peer_add (peerid_t id, int flags, const uint8_t *cert, int cert_len)
     BPending_Set(&peer->job_init);
     
     // init chat
-    if (!PeerChat_Init(&peer->chat, peer->id, BReactor_PendingGroup(&ss), NULL, NULL)) {
+    if (!PeerChat_Init(&peer->chat, peer->id, BReactor_PendingGroup(&ss), peer, NULL,
+                                                                                (PeerChat_handler_message)peer_chat_handler_message
+    )) {
         peer_log(peer, BLOG_ERROR, "PeerChat_Init failed");
         goto fail1;
     }
@@ -1792,7 +1794,7 @@ void peer_reset (struct peer_data *peer)
     }
 }
 
-void peer_msg (struct peer_data *peer, uint8_t *data, int data_len)
+void peer_chat_handler_message (struct peer_data *peer, uint8_t *data, int data_len)
 {
     ASSERT(data_len >= 0)
     ASSERT(data_len <= SC_MAX_MSGLEN)
@@ -2693,9 +2695,8 @@ void server_handler_message (void *user, peerid_t peer_id, uint8_t *data, int da
         return;
     }
     
-    // process peer message
-    peer_msg(peer, data, data_len);
-    return;
+    // pass message to chat
+    PeerChat_InputReceived(&peer->chat, data, data_len);
 }
 
 void peer_job_send_seed_after_binding (struct peer_data *peer)