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       23/01/2008
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(ROUTINE pFunction, char *pMask)
00027 {
00028     Requests.push_back(new NetRequest);
00029 
00030     if(!Requests[NbRequest])
00031         return ERROR_C_MEMORY;
00032     else
00033     {
00034         Requests[NbRequest]->Function = pFunction;
00035         Requests[NbRequest]->Mask = new char[strlen(pMask) + 1];
00036         strcpy(Requests[NbRequest]->Mask, pMask);
00037     }
00038     NbRequest++;
00039 
00040     return ERROR_C_NOERROR;
00041 }
00042 
00043 int     NetParser::DelRequest(int iPos)
00044 {
00045 
00046     if(iPos < NbRequest)
00047     {
00048         delete [] Requests[iPos]->Mask;
00049         delete Requests[iPos];
00050         Requests.erase(Requests.begin() + iPos);
00051 
00052         NbRequest--;
00053     }
00054     
00055     return ERROR_C_NOERROR;
00056 }
00057 
00058 int     NetParser::ParseLine(char *pBuffer)
00059 {
00060     char    *Buffer = NULL, *Out = NULL;
00061     char    *pBuf = NULL, *pOut = NULL;
00062     int     Size = 0;
00063     BEGIN
00064 
00065     Size = strlen(pBuffer);
00066     Buffer = new char[Size + 1];
00067     Out = new char[Size + 1];
00068     strncpy(Buffer, pBuffer, Size);
00069     pBuf = Buffer;
00070     pOut = Out;
00071 
00072     while(*pBuf && !CERROR)
00073     {
00074         if((*pBuf != '\n') && (*pBuf != '\r'))
00075         {
00076             *pOut = *pBuf;
00077             pOut++;
00078         }
00079         else if(pOut != Out)
00080         {
00081             *pOut = '\0';
00082             CERROR = Parse(Out);
00083             pOut = Out;
00084         }
00085 
00086         pBuf++;
00087     }
00088 
00089     delete Buffer;
00090     delete Out;
00091 
00092     ENDBEGIN
00093 }
00094 
00095 int     NetParser::Parse(char *pBuffer)
00096 {
00097     int                 i = 0;
00098     char                *pMask = NULL;
00099     char                Tok = '\0';
00100     char                Buffer[NET_BUFFER];
00101     char                Temp[NET_BUFFER];
00102     char                Label[NET_NAME];
00103     char                *pBuf = NULL;
00104     char                *pTemp = NULL;
00105     char                *pLabel = NULL;
00106     NetRequestParameter *Parameter = NULL;
00107     BEGIN
00108 
00109     strncpy(Buffer, pBuffer, NET_BUFFER);
00110 
00111     for(i = 0; (i < NbRequest) && !CERROR; i++)
00112     {
00113         pBuf = Buffer;
00114         pMask = Requests[i]->Mask;
00115         Parameter = new NetRequestParameter(Connect);
00116 
00117         TRY do
00118         {
00119             if(*pMask == '%') //si c'est un parametre
00120             {
00121                 pLabel = Label;
00122                 pTemp = Temp;
00123 
00124                 pMask++;
00125                 while(IsAlphaNumCar(*pMask)) //copie le nom du paramètre
00126                     *pLabel++ = *pMask++;
00127                 *pLabel = '\0';
00128 
00129                 Tok = *pMask; //carractère où s'arrète le paramètre
00130 
00131                 while(*pBuf != '\0') //copie la valeur du paramètre
00132                 {
00133                     if(*pBuf == Tok) //fin de la valeur du paramètre
00134                         break;
00135 
00136                     *pTemp = *pBuf;
00137                     pTemp++;
00138                     pBuf++;
00139                 }
00140                 *pTemp = '\0';
00141                 pBuf++; //pour être différent de Tok
00142 
00143                 Parameter->Add(Label, Temp);
00144             }
00145             else //si c'est un carractère non utile
00146             {
00147                 if(*pMask == *pBuf)
00148                     pBuf++;
00149                 else //si la requette ne correspond pas au mask
00150                     break;
00151             }
00152 
00153             if(*pMask != '\0')
00154                 pMask++;
00155         }
00156         while(*pBuf && *pMask);
00157 
00158         TRY if((*pMask == '\0') && (*pBuf == '\0'))
00159         {
00160             CERROR = (int)Requests[i]->Function((PARAMETRE)Parameter);
00161         }
00162         delete Parameter;
00163     }
00164 
00165     ENDBEGIN
00166 }
00167 

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