44#include " MsgPack.h"
55
66
7+ #define NO_MSG -1
78#define CALL_MSG 0
89#define RESP_MSG 1
910#define NOTIFY_MSG 2
@@ -42,101 +43,59 @@ class RpcDecoder {
4243 return true ;
4344 }
4445
45- // Tries to parse the first packet only
46- size_t parse_packet (){
46+ void parse_packet (){
4747
48- // Nop in case 1st packet is ready... waiting to deliver
49- if (_packet_ready){return _packet_size;}
50-
51- size_t bytes_checked = 3 ;
52-
53- while (bytes_checked < _bytes_stored) {
54- bytes_checked++;
55-
56- if (is_packet_complete (bytes_checked)) {
57- _packet_ready = true ;
58- _packet_size = bytes_checked;
59- break ;
60- }
61- }
62-
63- return _packet_size;
64-
65- }
66-
67- bool is_packet_complete (size_t size) {
48+ if (packet_incoming () || buffer_empty ()){return ;}
6849
6950 static MsgPack::Unpacker unpacker;
7051 unpacker.clear ();
52+ unpacker.feed (_raw_buffer, _bytes_stored);
7153
72- if (unpacker.feed (_raw_buffer, size)){
73- size_t min_packet_indices;
74-
75- MsgPack::arr_size_t elem_size;
76- if (unpacker.deserialize (elem_size)){
77- min_packet_indices = elem_size.size () + 1 ;
78- if (unpacker.size () < min_packet_indices) return false ;
79- int type;
80- if (unpacker.deserialize (type)) {
81- if (type == CALL_MSG || type == RESP_MSG) { // request or response
82- int _id;
83- MsgPack::str_t callback;
84- MsgPack::arr_size_t param_size;
85- unpacker.deserialize (_id, callback, param_size);
86- return (unpacker.size () == min_packet_indices + param_size.size ());
87- } else if (type == NOTIFY_MSG) { // notification
88- MsgPack::str_t callback;
89- MsgPack::arr_size_t param_size;
90- unpacker.deserialize (callback, param_size);
91- return (unpacker.size () == min_packet_indices + param_size.size ());
92- }
93- }
94-
95- }
96-
54+ MsgPack::arr_size_t elem_size;
55+ int type;
56+ if (unpacker.deserialize (elem_size, type)){
57+ _packet_type = type;
9758 }
9859
99- return false ;
100-
10160 }
10261
10362 // Check if a packet is available
104- bool packet_available () const { return _packet_ready ; }
63+ inline bool packet_incoming () const { return _packet_type >= CALL_MSG ; }
10564
106- size_t packet_size () const {return _packet_size ;}
65+ int packet_type () const {return _packet_type ;}
10766
10867 // Get the oldest packet (returns false if no packet available)
109- bool get_next_packet (MsgPack::Unpacker& unpacker) {
110- if (!_packet_ready) return false ;
111- return unpacker.feed (_raw_buffer, _packet_size);
68+ bool get_next_packet (MsgPack::Unpacker& unpacker, size_t size) {
69+ if (!packet_incoming ()) return false ;
70+ unpacker.clear ();
71+ return unpacker.feed (_raw_buffer, size);
11272 }
11373
11474 // Try to recover buffer error condition
11575 void recover () {
11676 // ensure parsing was attempted
11777 parse_packet ();
118- if (buffer_full () && !_packet_ready ){
78+ if (buffer_full () && !packet_incoming () ){
11979 flush_buffer ();
12080 }
12181 }
12282
12383 // Discard the oldest packet. Returns the number of freed_bytes
124- size_t pop_packet () {
84+ size_t pop_packet (size_t size ) {
12585
126- if (!_packet_ready ) return false ;
86+ if (size > _bytes_stored ) return 0 ;
12787
128- const size_t remaining_bytes = _bytes_stored - _packet_size ;
88+ const size_t remaining_bytes = _bytes_stored - size ;
12989
13090 // Shift remaining data forward (manual memmove for compatibility)
13191 for (size_t i = 0 ; i < remaining_bytes; i++) {
132- _raw_buffer[i] = _raw_buffer[_packet_size + i];
92+ _raw_buffer[i] = _raw_buffer[size + i];
13393 }
13494
13595 _bytes_stored = remaining_bytes;
136- _packet_ready = false ;
137- _packet_size = 0 ; // Reset packet state
96+ _packet_type = NO_MSG;
13897
139- return _packet_size ;
98+ return size ;
14099 }
141100
142101#ifdef DEBUG
@@ -159,11 +118,10 @@ void print_buffer(){
159118 uint8_t _raw_buffer[BufferSize];
160119 size_t _bytes_stored = 0 ;
161120
162- bool _packet_ready = false ;
163- size_t _packet_size = 0 ;
121+ int _packet_type = NO_MSG;
164122
165123 inline bool buffer_full () const { return _bytes_stored == BufferSize; }
166- inline bool buffer_empy () const { return _bytes_stored == 0 ;}
124+ inline bool buffer_empty () const { return _bytes_stored == 0 ;}
167125 inline void flush_buffer () {
168126 uint8_t * discard_buf;
169127 while (_transport.read (discard_buf, CHUNK_SIZE) > 0 );
0 commit comments