11#ifndef RPCLITE_SERVER_H
22#define RPCLITE_SERVER_H
33
4+ #include " request.h"
45#include " error.h"
56#include " wrapper.h"
67#include " dispatcher.h"
910#include " SerialTransport.h"
1011
1112#define MAX_CALLBACKS 100
12- #define RPC_BUFFER_SIZE 1024
1313
1414class RPCServer {
1515
@@ -32,30 +32,33 @@ class RPCServer {
3232 }
3333
3434 void run () {
35- get_rpc ();
36- process_request ();
37- send_response ();
38- // delay(1);
35+
36+ RPCRequest req;
37+ if (get_rpc (req)) { // Populate local request
38+ process_request (req); // Process local data
39+ send_response (req); // Send from local data
40+ }
41+
3942 }
4043
41- bool get_rpc () {
44+ bool get_rpc (RPCRequest& req, MsgPack:: str_t tag= " " ) {
4245 decoder->decode ();
43- if (_rpc_size > 0 ) return true ; // Already have a request
44- // TODO USE A QUEUE
45- _rpc_size = decoder->get_request (_rpc_buffer, RPC_BUFFER_SIZE);
46- return _rpc_size > 0 ;
46+
47+ MsgPack::str_t method = decoder->fetch_method ();
48+
49+ if (method == " " || !hasTag (method, tag)) return false ;
50+
51+ req.size = decoder->get_request (req.buffer , RPC_BUFFER_SIZE);
52+ return req.size > 0 ;
4753 }
4854
49- void process_request (MsgPack:: str_t tag= " " ) {
50- if (_rpc_size == 0 ) return ;
55+ void process_request (RPCRequest& req ) {
56+ if (req. size == 0 ) return ;
5157
5258 MsgPack::Unpacker unpacker;
5359
5460 unpacker.clear ();
55- if (!unpacker.feed (_rpc_buffer, _rpc_size)) {
56- _rpc_size = 0 ; // Reset size on error
57- return ; // Error in unpacking
58- }
61+ if (!unpacker.feed (req.buffer , req.size )) return ;
5962
6063 int msg_type;
6164 int msg_id;
@@ -69,43 +72,38 @@ class RPCServer {
6972
7073 if (msg_type == CALL_MSG && req_size.size () == REQUEST_SIZE) {
7174 if (!unpacker.deserialize (msg_id, method)) {
72- reset_rpc ();
75+ req. reset ();
7376 return ; // Method not unpackable
7477 }
7578 } else if (msg_type == NOTIFY_MSG && req_size.size () == NOTIFY_SIZE) {
7679 if (!unpacker.deserialize (method)) {
77- reset_rpc ();
80+ req. reset ();
7881 return ; // Method not unpackable
7982 }
8083 } else {
81- reset_rpc ();
84+ req. reset ();
8285 return ; // Invalid request size/type
8386 }
8487
85- if (!hasTag (method, tag)) return ;
86-
87- _rpc_type = msg_type;
88+ req.type = msg_type;
8889
8990 MsgPack::arr_size_t resp_size (RESPONSE_SIZE);
90- res_packer.clear ();
91- if (msg_type == CALL_MSG) res_packer.serialize (resp_size, RESP_MSG, msg_id);
91+ req. res_packer .clear ();
92+ if (msg_type == CALL_MSG) req. res_packer .serialize (resp_size, RESP_MSG, msg_id);
9293
93- dispatcher.call (method, unpacker, res_packer);
94+ dispatcher.call (method, unpacker, req. res_packer );
9495
9596 }
9697
97- bool send_response () {
98- if (_rpc_type == NO_MSG || res_packer.size () == 0 ) {
98+ bool send_response (RPCRequest& req) {
99+
100+ if (req.type == NO_MSG || req.res_packer .size () == 0 ) {
99101 return true ; // No response to send
100102 }
101103
102- if (_rpc_type == NOTIFY_MSG) {
103- reset_rpc ();
104- return true ;
105- }
104+ if (req.type == NOTIFY_MSG) return true ;
106105
107- reset_rpc ();
108- return decoder->send_response (res_packer);
106+ return decoder->send_response (req.res_packer );
109107
110108 }
111109
0 commit comments