Page principale | Hiérarchie des classes | Liste alphabétique | Liste des classes | Liste des fichiers | Membres de classe | Membres de fichier

NetParser.cpp

00001 /*! \file NetParser.cpp
00002     \brief Parser de protocol.
00003 
00004     Parser de protocol programmable.
00005 
00006     \author     aerith (contact@aerith.biz - www.aerith.biz)
00007     \version    1.0
00008     \date       26/07/2007
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 

Généré le Thu Jan 24 12:36:03 2008 pour A.I.F. par  doxygen 1.3.9.1