Skip to content

Commit af8544c

Browse files
committed
Combine buffer into one message if non-continuous
1 parent d85de92 commit af8544c

File tree

4 files changed

+49
-15
lines changed

4 files changed

+49
-15
lines changed

include/buffer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ typedef struct _block block_t;
88
struct _block {
99
char *data;
1010
int len;
11+
int last;
1112
block_t *next;
1213
};
1314

src/buffer.c

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,26 +23,47 @@ int buffer_write(buffer_t *buffer, char *data, int len)
2323
if (new_block == NULL) return -1;
2424

2525
new_block -> data = new_data;
26-
new_block -> len = len;
26+
new_block -> len = len;
27+
if (len == -1) {
28+
new_block -> last = 0;
29+
new_block -> len = PACKET_DATA_SIZE;
30+
} else {
31+
new_block -> last = 1;
32+
}
2733

2834
linked_list_add((*buffer), new_block);
2935

30-
return len;
36+
return new_block -> len;
3137
}
3238

3339
int buffer_read(buffer_t *buffer, char *data, int len)
3440
{
3541
block_t *block;
36-
37-
linked_list_get((*buffer), block);
38-
if (block == NULL) return 0;
39-
40-
if (len < block -> len) return -1;
41-
strcpy(data, block -> data);
42-
free(block -> data);
43-
free(block);
44-
45-
return block -> len;
42+
int retval = 0;
43+
int pos = 0;
44+
int last = 0;
45+
46+
while (last == 0) {
47+
linked_list_get((*buffer), block);
48+
if (block == NULL) break;
49+
50+
last = block -> last;
51+
if (pos >= len) {
52+
free(block -> data);
53+
free(block);
54+
continue;
55+
}
56+
57+
int n = ((len - pos) < block -> len) ? len - pos : block -> len;
58+
strncpy(data + pos, block -> data, n);
59+
retval += n;
60+
pos += n;
61+
62+
free(block -> data);
63+
free(block);
64+
}
65+
66+
return retval;
4667
}
4768

4869
int buffer_write_packet(buffer_t *buffer, packet_t *packet)

src/packet.c

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,19 @@ void packet_parse(packet_t packet)
116116

117117
}
118118
} else { /* data packet */
119-
recv_buffer_write(packet.data, sizeof(packet.data));
119+
120+
if (packet.header._head1 & 0x80000000 &&
121+
packet.header._head1 & 0x40000000) /* solo packet */
122+
recv_buffer_write(packet.data, PACKET_DATA_SIZE);
123+
124+
else if (packet.header._head1 & 0x40000000) /* last packet */
125+
recv_buffer_write(packet.data, PACKET_DATA_SIZE);
126+
127+
else if (packet.header._head1 & 0x80000000) /* first packet */
128+
recv_buffer_write(packet.data, -1);
129+
130+
else /* middle packet */
131+
recv_buffer_write(packet.data, -1);
120132
}
121133
return;
122134
}

src/send_buffer.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,14 @@ int send_buffer_write(char *data, int len)
3333
seqnum = 2142894844; /* TODO: generate random number */
3434
buffer = data;
3535
boundary = PACKET_BOUNDARY_START;
36-
packet_clear_header (packet);
37-
packet_set_data (packet);
3836

3937
while (len > 0) {
4038
size = (len > PACKET_DATA_SIZE) ? PACKET_DATA_SIZE : len;
4139
len -= PACKET_DATA_SIZE;
4240
boundary |= (len > 0) ? PACKET_BOUNDARY_NONE : PACKET_BOUNDARY_END;
4341

42+
packet_clear_header (packet);
43+
packet_set_data (packet);
4444
packet_set_seqnum (packet, seqnum++);
4545
packet_set_boundary (packet, boundary);
4646
packet_set_order (packet, 1);

0 commit comments

Comments
 (0)