Browse Source

client: move peer message sending buffer to PeerChat

ambrop7 14 năm trước cách đây
mục cha
commit
6bc9e6c879
4 tập tin đã thay đổi với 49 bổ sung38 xóa
  1. 37 12
      client/PeerChat.c
  2. 10 2
      client/PeerChat.h
  3. 2 20
      client/client.c
  4. 0 4
      client/client.h

+ 37 - 12
client/PeerChat.c

@@ -224,6 +224,8 @@ int PeerChat_Init (PeerChat *o, peerid_t peer_id, int ssl_mode, CERTCertificate
     // set no received data
     o->recv_data_len = -1;
     
+    PacketPassInterface *send_buf_output = PacketCopier_GetInput(&o->copier);
+    
     if (o->ssl_mode != PEERCHAT_SSL_NONE) {
         // init receive buffer
         if (!SimpleStreamBuffer_Init(&o->ssl_recv_buf, PEERCHAT_SSL_RECV_BUF_SIZE, pg)) {
@@ -232,7 +234,7 @@ int PeerChat_Init (PeerChat *o, peerid_t peer_id, int ssl_mode, CERTCertificate
         }
         
         // init SSL StreamPacketSender
-        StreamPacketSender_Init(&o->ssl_sp_sender, PacketCopier_GetInput(&o->copier), pg);
+        StreamPacketSender_Init(&o->ssl_sp_sender, send_buf_output, pg);
         
         // init SSL bottom prfd
         if (!BSSLConnection_MakeBackend(&o->ssl_bottom_prfd, StreamPacketSender_GetInput(&o->ssl_sp_sender), SimpleStreamBuffer_GetOutput(&o->ssl_recv_buf))) {
@@ -309,13 +311,27 @@ int PeerChat_Init (PeerChat *o, peerid_t peer_id, int ssl_mode, CERTCertificate
             PeerLog(o, BLOG_ERROR, "PacketProtoDecoder_Init failed");
             goto fail5;
         }
+        
+        send_buf_output = PacketCopier_GetInput(&o->ssl_copier);
+    }
+    
+    // init send writer
+    BufferWriter_Init(&o->send_writer, SC_MAX_MSGLEN, pg);
+    
+    // init send buffer
+    if (!PacketBuffer_Init(&o->send_buf, BufferWriter_GetOutput(&o->send_writer), send_buf_output, PEERCHAT_SEND_BUF_SIZE, pg)) {
+        PeerLog(o, BLOG_ERROR, "PacketBuffer_Init failed");
+        goto fail6;
     }
     
     DebugError_Init(&o->d_err, pg);
     DebugObject_Init(&o->d_obj);
     return 1;
     
+fail6:
+    BufferWriter_Free(&o->send_writer);
     if (o->ssl_mode != PEERCHAT_SSL_NONE) {
+        PacketProtoDecoder_Free(&o->ssl_recv_decoder);
 fail5:
         PacketPassInterface_Free(&o->ssl_recv_if);
         SinglePacketBuffer_Free(&o->ssl_buffer);
@@ -343,6 +359,8 @@ void PeerChat_Free (PeerChat *o)
     DebugObject_Free(&o->d_obj);
     DebugError_Free(&o->d_err);
     
+    PacketBuffer_Free(&o->send_buf);
+    BufferWriter_Free(&o->send_writer);
     if (o->ssl_mode != PEERCHAT_SSL_NONE) {
         PacketProtoDecoder_Free(&o->ssl_recv_decoder);
         PacketPassInterface_Free(&o->ssl_recv_if);
@@ -361,17 +379,6 @@ void PeerChat_Free (PeerChat *o)
     PacketCopier_Free(&o->copier);
 }
 
-PacketPassInterface * PeerChat_GetSendInput (PeerChat *o)
-{
-    DebugObject_Access(&o->d_obj);
-    
-    if (o->ssl_mode != PEERCHAT_SSL_NONE) {
-        return PacketCopier_GetInput(&o->ssl_copier);
-    } else {
-        return PacketCopier_GetInput(&o->copier);
-    }
-}
-
 PacketRecvInterface * PeerChat_GetSendOutput (PeerChat *o)
 {
     DebugObject_Access(&o->d_obj);
@@ -394,3 +401,21 @@ void PeerChat_InputReceived (PeerChat *o, uint8_t *data, int data_len)
     // set received job
     BPending_Set(&o->recv_job);
 }
+
+int PeerChat_StartMessage (PeerChat *o, uint8_t **data)
+{
+    DebugObject_Access(&o->d_obj);
+    DebugError_AssertNoError(&o->d_err);
+    
+    return BufferWriter_StartPacket(&o->send_writer, data);
+}
+
+void PeerChat_EndMessage (PeerChat *o, int data_len)
+{
+    DebugObject_Access(&o->d_obj);
+    DebugError_AssertNoError(&o->d_err);
+    ASSERT(data_len >= 0)
+    ASSERT(data_len <= SC_MAX_MSGLEN)
+    
+    BufferWriter_EndPacket(&o->send_writer, data_len);
+}

+ 10 - 2
client/PeerChat.h

@@ -39,6 +39,8 @@
 #include <flow/PacketStreamSender.h>
 #include <flow/SinglePacketBuffer.h>
 #include <flow/PacketProtoDecoder.h>
+#include <flow/PacketBuffer.h>
+#include <flow/BufferWriter.h>
 #include <nspr_support/BSSLConnection.h>
 #include <client/SCOutmsgEncoder.h>
 #include <client/SimpleStreamBuffer.h>
@@ -48,6 +50,7 @@
 #define PEERCHAT_SSL_SERVER 2
 
 #define PEERCHAT_SSL_RECV_BUF_SIZE 4096
+#define PEERCHAT_SEND_BUF_SIZE 200
 
 //#define PEERCHAT_SIMULATE_ERROR 40
 
@@ -66,7 +69,7 @@ typedef struct {
     PeerChat_handler_error handler_error;
     PeerChat_handler_message handler_message;
     
-    // common
+    // transport
     PacketProtoEncoder pp_encoder;
     SCOutmsgEncoder sc_encoder;
     PacketCopier copier;
@@ -91,6 +94,10 @@ typedef struct {
     PacketProtoDecoder ssl_recv_decoder;
     PacketPassInterface ssl_recv_if;
     
+    // higher layer send buffer
+    PacketBuffer send_buf;
+    BufferWriter send_writer;
+    
     DebugError d_err;
     DebugObject d_obj;
 } PeerChat;
@@ -101,8 +108,9 @@ int PeerChat_Init (PeerChat *o, peerid_t peer_id, int ssl_mode, CERTCertificate
                    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);
+int PeerChat_StartMessage (PeerChat *o, uint8_t **data) WARN_UNUSED;
+void PeerChat_EndMessage (PeerChat *o, int data_len);
 
 #endif

+ 2 - 20
client/client.c

@@ -1366,15 +1366,6 @@ void peer_add (peerid_t id, int flags, const uint8_t *cert, int cert_len)
         goto fail3;
     }
     
-    // init chat send writer
-    BufferWriter_Init(&peer->chat_send_writer, SC_MAX_MSGLEN, BReactor_PendingGroup(&ss));
-    
-    // init chat send buffer
-    if (!PacketBuffer_Init(&peer->chat_send_buffer, BufferWriter_GetOutput(&peer->chat_send_writer), PeerChat_GetSendInput(&peer->chat), SERVER_BUFFER_MIN_PACKETS, BReactor_PendingGroup(&ss))) {
-        peer_log(peer, BLOG_ERROR, "PacketBuffer_Init failed");
-        goto fail4;
-    }
-    
     // set no message
     peer->chat_send_msg_len = -1;
     
@@ -1442,9 +1433,6 @@ fail6:
     DataProtoFlow_Free(&peer->local_dpflow);
 fail5:
     server_flow_disconnect(peer->server_flow);
-    PacketBuffer_Free(&peer->chat_send_buffer);
-fail4:
-    BufferWriter_Free(&peer->chat_send_writer);
     PeerChat_Free(&peer->chat);
 fail3:
     server_flow_free(peer->server_flow);
@@ -1563,12 +1551,6 @@ void peer_free_chat (struct peer_data *peer)
     // disconnect chat from server flow
     server_flow_disconnect(peer->server_flow);
     
-    // free chat send buffer
-    PacketBuffer_Free(&peer->chat_send_buffer);
-    
-    // free chat send writer
-    BufferWriter_Free(&peer->chat_send_writer);
-    
     // free chat
     PeerChat_Free(&peer->chat);
     
@@ -2409,7 +2391,7 @@ static int peer_start_msg (struct peer_data *peer, void **data, int type, int le
     
     // obtain buffer location
     uint8_t *packet;
-    if (!BufferWriter_StartPacket(&peer->chat_send_writer, &packet)) {
+    if (!PeerChat_StartMessage(&peer->chat, &packet)) {
         peer_log(peer, BLOG_ERROR, "cannot send message, out of buffer");
         return 0;
     }
@@ -2436,7 +2418,7 @@ static void peer_end_msg (struct peer_data *peer)
     ASSERT(peer->have_chat)
     
     // submit packet to buffer
-    BufferWriter_EndPacket(&peer->chat_send_writer, msg_SIZEtype + msg_SIZEpayload(peer->chat_send_msg_len));
+    PeerChat_EndMessage(&peer->chat, msg_SIZEtype + msg_SIZEpayload(peer->chat_send_msg_len));
     
     // set no message
     peer->chat_send_msg_len = -1;

+ 0 - 4
client/client.h

@@ -26,8 +26,6 @@
 #include <protocol/scproto.h>
 #include <structure/LinkedList2.h>
 #include <flow/PacketPassFairQueue.h>
-#include <flow/PacketBuffer.h>
-#include <flow/BufferWriter.h>
 #include <flow/SinglePacketBuffer.h>
 #include <flow/PacketRecvConnector.h>
 #include <client/DatagramPeerIO.h>
@@ -117,8 +115,6 @@ struct peer_data {
     // chat
     int have_chat;
     PeerChat chat;
-    PacketBuffer chat_send_buffer;
-    BufferWriter chat_send_writer;
     int chat_send_msg_len;
     
     // resetpeer source (when chat fails)