00001 /*! \file NetParser.h 00002 \brief Parser de protocol. 00003 00004 Parser de protocol programmable. 00005 00006 \author aerith (www.aerith.fr) 00007 \version 1.0 00008 \date 01/11/2007 00009 */ 00010 00011 #ifndef INCLUDE_RSRC_NET_PARSER 00012 #define INCLUDE_RSRC_NET_PARSER 00013 00014 #include "../Surcouche/SurcoucheModule.h" 00015 #include "../Tools/Tools.h" 00016 #include "../Error/Error.h" 00017 #include "NetRequest.h" 00018 #include <stdio.h> 00019 #include <string.h> 00020 #include <stdlib.h> 00021 #include <vector> 00022 00023 //! Parser de protocol. 00024 /*! Parser de protocol programmable. 00025 */ 00026 class NetParser 00027 { 00028 private : 00029 int NbRequest; /*!< Nombre de requette. */ 00030 std::vector<NetRequest *> Requests; /*!< Chaque lignes est une requette. */ 00031 NetConnect *Connect; /*!< Class d'info sur la connection utilisant le parser. */ 00032 00033 public : 00034 /*! Initialise avec des paramétres par defaut. 00035 \param pConnect class de la connection reseau 00036 */ 00037 NetParser(NetConnect *pConnect); 00038 00039 /*! Libère la mémoire proprement 00040 */ 00041 ~NetParser(); 00042 00043 //! Ajoute une requette. 00044 /*! Ajoute une requette avec un raw et une fonction lier. 00045 \param pName nom de la requette. 00046 \param iPos position de \a pName dans la requette lors du pré-parse. 00047 \param pFunction fonction a lier. 00048 \param pMask syntax de la requette. 00049 \param iComplet si à 1, éxige que \a Mask soit completement parser 00050 \param pToks tokens utiliser pour rechercher le nom de la requette lors du pré-parse. 00051 \sa DelRequest() et GetNbRequest(). 00052 */ 00053 int AddRequest(char *pName, int iPos, ROUTINE pFunction, char *pMask, int iComplet = 0, char *pToks = " \n\r\t"); 00054 00055 //! Supprime une requette. 00056 /*! Supprime la requette à la position \a iPos. 00057 \param iPos position de la requette. 00058 \sa AddRequest(), GetRaw() et GetNbRequest(). 00059 */ 00060 int DelRequest(int iPos); 00061 00062 //! Supprime une requette. 00063 /*! Supprime la requette ayant le raw \a iRaw. 00064 \param pName nom de la requette. 00065 \sa AddRequest(), GetRaw() et GetNbRequest(). 00066 */ 00067 inline int DelRequest(char *pName) 00068 { 00069 int i; 00070 00071 for(i = 0; i < NbRequest; i++) 00072 if(!strcmp(Requests[i]->Name, pName)) 00073 return DelRequest(i); 00074 }; 00075 00076 //! Retourne le nom de la requette. 00077 /*! Retourne le nom de la requette \a iPos. 00078 \param iPos Position de la requette. 00079 \return pointeur sur le nom de la requette \a Name. 00080 \sa AddRequest(), DelRequest() et GetNbRequest(). 00081 */ 00082 inline char *GetName(int iPos) 00083 { 00084 if(iPos < NbRequest) 00085 return Requests[iPos]->Name; 00086 00087 return NULL; 00088 }; 00089 00090 //! Retourne la syntax de la requette. 00091 /*! Retourne la syntax (Mask) de la requette \a iPos. 00092 \param iPos Position de la requette. 00093 \return pointeur sur la syntax de la requette \a Mask. 00094 \sa AddRequest(), DelRequest() et GetNbRequest(). 00095 */ 00096 inline char *GetMask(int iPos) 00097 { 00098 if(iPos < NbRequest) 00099 return Requests[iPos]->Mask; 00100 00101 return NULL; 00102 }; 00103 00104 //! Retourne la syntax de la requette. 00105 /*! Retourne la syntax (Mask) de la requette de nom \a pName. 00106 \param pName nom de la requette. 00107 \return pointeur sur la syntax de la requette \a Mask. 00108 \sa AddRequest(), DelRequest() et GetNbRequest(). 00109 */ 00110 inline char *GetMask(char *pName) 00111 { 00112 for(int i = 0; i < NbRequest; i++) 00113 if(!strcmp(Requests[i]->Name, pName)) 00114 return Requests[i]->Mask; 00115 00116 return NULL; 00117 }; 00118 00119 //! Retourne le nombre de requettes. 00120 /*! Retourne le nombre de requette du parser. 00121 \return nombre de requette du parser. 00122 \sa AddRequest(), DelRequest() et GetRequest(). 00123 */ 00124 inline int GetNbRequest() 00125 { 00126 return NbRequest; 00127 }; 00128 00129 //! Parse un buffer. 00130 /*! Parse un buffer ligne à ligne, recherche et éxécute les requettes.\n 00131 \param pBuffer buffer à parser. 00132 \return code d'erreur de la fonction retournant l'erreur. 00133 */ 00134 int ParseLine(char *pBuffer); 00135 00136 //! Parse un buffer. 00137 /*! Parse le buffer en un seul block, recherche et éxécute une requette.\n 00138 \param pBuffer buffer à parser. 00139 \return code d'erreur de la fonction. 00140 */ 00141 int Parse(char *pBuffer); 00142 }; 00143 00144 00145 #endif