00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "NetParser.h"
00012
00013 NetParser::NetParser(NetConnect *pConnect)
00014 {
00015 NbRequest = 0;
00016 Connect = pConnect;
00017 }
00018
00019 NetParser::~NetParser()
00020 {
00021 while(NbRequest)
00022 DelRequest(NbRequest - 1);
00023 Requests.clear();
00024 }
00025
00026 int NetParser::AddRequest(char *pName, int iPos, ROUTINE pFunction, char *pMask, int iComplet, char *pToks)
00027 {
00028 Requests.push_back(new NetRequest);
00029
00030 if(!Requests[NbRequest])
00031 return ERROR_C_MEMORY;
00032 else
00033 {
00034 Requests[NbRequest]->Name = new char[strlen(pName) + 1];
00035 strcpy(Requests[NbRequest]->Name, pName);
00036 Requests[NbRequest]->Pos = iPos;
00037 Requests[NbRequest]->Function = pFunction;
00038 Requests[NbRequest]->Mask = new char[strlen(pMask) + 1];
00039 strcpy(Requests[NbRequest]->Mask, pMask);
00040 Requests[NbRequest]->Complet = iComplet;
00041 Requests[NbRequest]->Toks = new char[strlen(pToks) + 1];
00042 strcpy(Requests[NbRequest]->Toks, pToks);
00043 }
00044 NbRequest++;
00045
00046 return ERROR_C_NOERROR;
00047 }
00048
00049 int NetParser::DelRequest(int iPos)
00050 {
00051
00052 if(iPos < NbRequest)
00053 {
00054 delete [] Requests[iPos]->Name;
00055 delete [] Requests[iPos]->Mask;
00056 delete [] Requests[iPos]->Toks;
00057 delete Requests[iPos];
00058 Requests.erase(Requests.begin() + iPos);
00059
00060 NbRequest--;
00061 }
00062
00063 return ERROR_C_NOERROR;
00064 }
00065
00066 int NetParser::ParseLine(char *pBuffer)
00067 {
00068 char *Buffer, *Out;
00069 char *pBuf, *pOut;
00070 int Size;
00071 BEGIN
00072
00073 Size = strlen(pBuffer);
00074 Buffer = (char *)malloc(sizeof(char) * (Size + 1));
00075 Out = (char *)malloc(sizeof(char) * (Size + 1));
00076 strncpy(Buffer, pBuffer, Size);
00077 pBuf = Buffer;
00078 pOut = Out;
00079
00080 while(*pBuf && !CERROR)
00081 {
00082 if((*pBuf != '\n') && (*pBuf != '\r'))
00083 {
00084 *pOut = *pBuf;
00085 pOut++;
00086 }
00087 else if(pOut != Out)
00088 {
00089 *pOut = '\0';
00090 CERROR = Parse(Out);
00091 pOut = Out;
00092 }
00093
00094 pBuf++;
00095 }
00096
00097 free(Buffer);
00098 free(Out);
00099
00100 ENDBEGIN
00101 }
00102
00103 int NetParser::Parse(char *pBuffer)
00104 {
00105 int i;
00106 char *pMask;
00107 char Tok;
00108 char Buffer[NET_BUFFER];
00109 char Temp[NET_BUFFER];
00110 char Label[NET_NAME];
00111 char *pCur;
00112 char *pTemp;
00113 char *pLabel;
00114 BEGIN
00115
00116 for(i = 0; (i < NbRequest) && !CERROR; i++)
00117 {
00118 if(!strcmp(Requests[i]->Name, gettok(pBuffer, Requests[i]->Pos, Requests[i]->Toks)))
00119 {
00120 TRY if(i < NbRequest)
00121 {
00122 NetRequestParameter Parameter(Connect);
00123 Parameter.SetName(Requests[i]->Name, Requests[i]->Pos);
00124 strncpy(Buffer, pBuffer, NET_BUFFER);
00125 pCur = Buffer;
00126 pMask = Requests[i]->Mask;
00127
00128 do
00129 {
00130 TRY {
00131 if(*pMask == '%')
00132 {
00133 pMask++;
00134 pLabel = Label;
00135 pTemp = Temp;
00136
00137 while(IsAlphaNumCar(*pMask))
00138 *pLabel++ = *pMask++;
00139
00140 Tok = *pMask;
00141
00142 while(*pCur)
00143 {
00144 if(*pCur == Tok)
00145 {
00146 *pCur++;
00147 break;
00148 }
00149 *pTemp++ = *pCur++;
00150 }
00151
00152 *pTemp = '\0';
00153 *pLabel = '\0';
00154
00155 Parameter.Add(Label, Temp);
00156 }
00157 else
00158 {
00159 if(*pMask == *pCur)
00160 pCur++;
00161 }
00162 }
00163
00164 if(*pMask)
00165 pMask++;
00166 }
00167 while(*pCur && *pMask && !CERROR);
00168
00169 TRY if((Requests[i]->Complet && !*pMask) || (!Requests[i]->Complet))
00170 {
00171 CERROR = (int)Requests[i]->Function((PARAMETRE)&Parameter);
00172 }
00173 }
00174 }
00175 }
00176
00177 ENDBEGIN
00178 }
00179