From 17bd1f3d704a88f51f88f34260e68015ba21788b Mon Sep 17 00:00:00 2001 From: Carlos Daniel Ruvalcaba Valenzuela Date: Sun, 24 Jun 2007 00:07:10 -0700 Subject: [PATCH] Added a state based IPC parser, which works fine --- src/ipc.cpp | 189 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 188 insertions(+), 1 deletion(-) diff --git a/src/ipc.cpp b/src/ipc.cpp index ef1d1fa..0bbd1e8 100644 --- a/src/ipc.cpp +++ b/src/ipc.cpp @@ -89,6 +89,193 @@ public: auxsock->Close(); } + int FetchMessage2(){ + char buffer[255], xbuff[255], tbuff[20], *msgdata; + int state, onParse; + int i, t, r, mlen, margc; + IPCMessage *msg; + + state = 0; + onParse = 1; + + mlen = 0; + margc = 0; + msg = NULL; + + while (onParse){ + + memset(buffer, 0, 255); + r = auxsock->Read(buffer, 255); + + if (r < 1){ + return 0; + state = -1; + onParse = 0; + } + + for (i = 0; i < r; i++){ + switch (state){ + case 0: + if (buffer[i] == 'M') + state++; + break; + case 1: + if (buffer[i] == 'S') + state++; + break; + case 2: + if (buffer[i] == 'G') + state++; + break; + case 3: + if (buffer[i] == '['){ + state++; + memset(tbuff, 0, 20); + t = 0; + } + break; + case 4: + if ((buffer[i] >= 48) && (buffer[i] <= 57)){ + tbuff[t] = buffer[i]; + t++; + if (t == 20) + state = -1; + }else{ + mlen = atoi(tbuff); + state++; + } + break; + case 5: + if (buffer[i] == '['){ + state++; + memset(tbuff, 0, 20); + t = 0; + } + break; + case 6: + if ((buffer[i] >= 48) && (buffer[i] <= 57)){ + tbuff[t] = buffer[i]; + t++; + if (t == 20) + state = -1; + }else{ + margc = atoi(tbuff); + state++; + if (mlen < 255){ + msgdata = xbuff; + }else{ + msgdata = (char*)malloc(sizeof(char) * mlen + 1); + } + t = 0; + } + break; + case 7: + if (t < mlen){ + msgdata[t] = buffer[i]; + t++; + if (t == mlen){ + msgdata[t] = 0; + state++; + } + } + break; + case 8: + msg = new IPCMessage(msgdata); + if (msgdata != xbuff) + free(msgdata); + state++; + + if (margc == 0) + state = 20; + i--; + break; + case 9: + if (buffer[i] == 'P') + state++; + break; + case 10: + if (buffer[i] == 'A') + state++; + break; + case 11: + if (buffer[i] == 'R') + state++; + break; + case 12: + if (buffer[i] == 'A') + state++; + break; + case 13: + if (buffer[i] == 'M') + state++; + break; + case 14: + if (buffer[i] == '['){ + state++; + memset(tbuff, 0, 20); + t = 0; + } + break; + case 15: + if ((buffer[i] >= 48) && (buffer[i] <= 57)){ + tbuff[t] = buffer[i]; + t++; + if (t == 20) + state = -1; + }else{ + mlen = atoi(tbuff); + state++; + } + break; + case 16: + if (mlen < 255){ + msgdata = xbuff; + }else{ + msgdata = (char*)malloc(sizeof(char) * mlen + 1); + } + t = 0; + state++; + i--; + break; + case 17: + if (t < mlen){ + msgdata[t] = buffer[i]; + t++; + if (t == mlen){ + msgdata[t] = 0; + state++; + i--; + } + } + break; + case 18: + msg->PushParam(msgdata); + if (msgdata != xbuff) + free(msgdata); + if (msg->ParamCount() == margc){ + state++; + }else{ + state = 9; + } + onParse = 0; + break; + default: + onParse = 0; + break; + } + } + } + + if (state == -1){ + if (msg) + delete msg; + return 0; + } + + msgQueue.push(msg); + return 1; + } + int FetchMessage(){ char buffer[255], *param; int i, j, k, s, r; @@ -156,7 +343,7 @@ public: int PeekMessage(){ - if(FetchMessage()) + if(FetchMessage2()) return 1; if (msgQueue.size() > 0) -- 2.11.4.GIT