00001 /*! \file XML.h 00002 \brief Gestion de fichiers XML. 00003 00004 Gestion dde fichiers XML. \n 00005 Si \a Type == \a XML_OBJET alors la class est un objet contenant des sous-objets (balise) : \n 00006 \a Size indique le nombre de sous-objets. \n 00007 \a Name , \a NbParam , \a Params , \a Size et \a Objets sont remplit si il le faut. \n 00008 Si \a Type == \a XML_DATA alors la class est une data simple (text simple entre balise) :\n 00009 \a Size indique la longeur de la data.\n 00010 \a Data est remplit avec le text brute et a une longeur de \a Size. \n 00011 Si \a Type == \a XML_SPECIAL alors la class est un objet spécial (ex : balise de commentaire) : \a 00012 \a Size indique la longeur de la data brute.\n 00013 \a Data est remplit avec tout le contenu de la balise et a une longeur de \a Size. \n 00014 00015 \author aerith (www.aerith.fr) 00016 \version 1.0 00017 \date 09/12/2007 00018 */ 00019 00020 #ifndef INCLUDE_RSRC_XMLObjet 00021 #define INCLUDE_RSRC_XMLObjet 00022 00023 #include "../Surcouche/SurcoucheMultitache.h" 00024 #include "../Tools/Tools.h" 00025 #include "../Error/Error.h" 00026 #include <stdio.h> 00027 #include <string.h> 00028 #include <vector> 00029 00030 #define XML_VIERGE 0 /*!< Vierge. */ 00031 #define XML_OPEN_OPEN 1 /*!< '<' Ouverture. */ 00032 #define XML_OBJET_NAME 2 /*!< Copie nom objet. */ 00033 #define XML_PARAM_NAME 3 /*!< Copie nom paramètre. */ 00034 #define XML_PARAM_FOUND 4 /*!< '=' Paramètre trouvé. */ 00035 #define XML_PARAM_DATA 5 /*!< Copie data paramètre. */ 00036 #define XML_OPEN_CLOSE 6 /*!< '>' Fermeture. */ 00037 #define XML_DATA 7 /*!< Data. */ 00038 #define XML_CLOSE_OPEN 8 /*!< '<' Ouverture. */ 00039 #define XML_CLOSE_FOUND 9 /*!< '/' Trouvé. */ 00040 #define XML_CLOSE_CLOSE 10 /*!< '>' Fermeture. */ 00041 #define XML_SPECIAL 11 /*!< Objet spécial. */ 00042 00043 #define XML_TYPE_OBJET 1 00044 #define XML_TYPE_DATA 2 00045 #define XML_TYPE_SPECIAL 3 00046 00047 #define XML_FILENAME 512 00048 #define XML_BUFFER 1024 00049 #define XML_NAME 256 00050 #define XML_TEMP 1024 00051 00052 typedef struct _XMLParam 00053 { 00054 char Name[XML_NAME]; 00055 int Size; 00056 char *Data; 00057 } XMLParam; 00058 00059 00060 //! Gestion de fichiers XML. 00061 /*! Gestion de fichiers XML. 00062 */ 00063 class XMLObjet 00064 { 00065 private : 00066 static int Cur; /*!< Position dans le fichier. */ 00067 static int NoLine; /*!< Numéro de la ligne en traitement du fichier. */ 00068 static int NoCar; /*!< Numéro du carractère en traitement de la ligne. */ 00069 int Type; /*!< Indique ce que stock la class. */ 00070 char Name[XML_NAME]; /*!< Nom de l'objet. */ 00071 int NbParam; /*!< Nombre de paramètre de l'objet. */ 00072 std::vector<XMLParam *> Params; /*!< Chaque ligne est un paramétre. */ 00073 int NbObjet; /*!< Nombre de sous-objet dans l'objet. */ 00074 std::vector<XMLObjet *> Objets; /*!< Chaque ligne est un sous-objet. */ 00075 int Size; /*!< Taille de \a Data. */ 00076 char *Data; /*!< Data brute, si le type l'utilise. */ 00077 00078 //! Afiche une erreur de parsage. 00079 /*! Affiche des informations sur une erreur lors du parsage d'un fichier. 00080 \param iLine numéro de la ligne dans le fichier. 00081 \param iCar numéro du carractère dans la ligne. 00082 \param pDesc déscription de l'erreur. 00083 */ 00084 void LogError(int iNoLine, int iNoCar, char *pDesc); 00085 00086 protected : 00087 char FileName[XML_FILENAME]; /*!< Nom du fichier. */ 00088 static FILE *File; /*!< Descripteur du fichier destination. */ 00089 static int XMLInstance; /*!< Compte les instance de la class. */ 00090 static MUTEX XMLMutex; /*!< Utiliser des que l'on accede à un fichier. */ 00091 00092 public : 00093 /*! Initialise avec des parametres par defaut. 00094 */ 00095 XMLObjet(); 00096 00097 /*! Libere proprement la mémoire. 00098 */ 00099 ~XMLObjet(); 00100 00101 //! Log une erreur. 00102 /*! Log une erreur de parsage dans le fichier XMLError.log. 00103 \param pDesc descryption de l'erreur 00104 */ 00105 void LogError(char *pDesc); 00106 00107 //! Charge un fichier. 00108 /*! Charge un fichier XML en mémoire. 00109 \return code d'erreur. 00110 \sa Save(). 00111 */ 00112 int Load(int iNoLine = 1, int iNoCar = 0); 00113 00114 //! Sauve dans un fichier. 00115 /*! Poursuit la sauvegarde vers le fichier. 00116 \param iDec nombre de tabulation pour l'indentation. 00117 \return code d'erreur. 00118 \sa Load(). 00119 */ 00120 int Save(int iDec = 0); 00121 00122 00123 //! Retourne le nombre d'instance. 00124 /*! Retourne le nombre d'instance de la class (pour multitache). 00125 \return nombre d'instance de la class. 00126 */ 00127 inline int GetNbInstance() 00128 { 00129 return XMLInstance; 00130 }; 00131 00132 //! Retourne le nom du fichier. 00133 /*! Retourne le nom du fichier XML \a FileName. 00134 \return un pointeur sur le nom du fichier XML \a FileName. 00135 */ 00136 inline char *GetFileName() 00137 { 00138 return FileName; 00139 }; 00140 00141 //! Affiche la structure. 00142 /*! Enregistre la structure des objets dans le fichier \a pFileName. 00143 \param pFileName fichier destination. 00144 \return code d'erreur. 00145 \sa Load(). 00146 */ 00147 int Print(FILE *pFile); 00148 00149 //! Retourne le type de l'objet. 00150 /*! Retourne le type de l'objet \a Type. 00151 \return le type de l'objet \a Type. 00152 */ 00153 inline int GetType() 00154 { 00155 return Type; 00156 }; 00157 00158 //! Retourne le nom de l'objet. 00159 /*! Retourne le nom de l'objet \a Name. 00160 \return un pointeur sur le nom de l'objet \a Name. 00161 \sa SetName(). 00162 */ 00163 inline char *GetName() 00164 { 00165 return Name; 00166 }; 00167 00168 //! Définie le nom de l'objet. 00169 /*! Définie le nom de l'objet \a Name. 00170 \param pName nom de l'objet. 00171 \return un pointeur sur le nom de l'objet \a Name. 00172 \sa GetName(). 00173 */ 00174 inline char *SetName(char *pName) 00175 { 00176 for(int i = 0; (i < (XML_NAME - 1)) && pName[i]; i++) 00177 Name[i] = pName[i]; 00178 00179 return Name; 00180 }; 00181 00182 //! Retourne \a Size. 00183 /*! Retourne le nombre, \a Size , d'objet ou la taille de data. 00184 \return le nombre, \a Size , d'objet ou la taille de data. 00185 */ 00186 inline int GetSize() 00187 { 00188 return Size; 00189 }; 00190 00191 //! Affiche la structure. 00192 /*! Affiche la structure des objets vers le fichier \a File. 00193 \param iDec nombre de tabulation pour l'indentation. 00194 \return code d'erreur. 00195 \sa Load(). 00196 */ 00197 int Print(int iDec = 0); 00198 00199 //********************************** Paramétre ********************************* 00200 //! Ajoute un paramétre. 00201 /*! Ajoute un paramétre avec comme nom \a pName. 00202 \param pName nom du paramétre 00203 \param pData données du paramétre 00204 \return code d'erreur. 00205 \sa DelParam(), GetParam() et GetNbParam(). 00206 */ 00207 int AddParam(char *pName, char *pData); 00208 00209 //! Supprime un paramétre. 00210 /*! Supprime le paramétre étant à la position \a iPos. 00211 \param iPos position du paramétre. 00212 \return code d'erreur. 00213 \sa AddParam(), GetParam() et GetNbParam(). 00214 */ 00215 int DelParam(int iPos); 00216 00217 //! Supprime un paramétre. 00218 /*! Supprime le paramétre ayant le nom \a pName. 00219 \param pName nom du paramétre. 00220 \return code d'erreur. 00221 \sa AddParam(), GetParam() et GetNbParam(). 00222 */ 00223 inline int DelParam(char *pName) 00224 { 00225 for(int i = 0; i < NbParam; i++) 00226 { 00227 if(!strcmp(Params[i]->Name, pName)) 00228 return DelParam(i); 00229 } 00230 00231 return ERROR_C_NOERROR; 00232 }; 00233 00234 //! Retourne un paramétre. 00235 /*! Retourne le paramétre étant à la position \a iPos. 00236 \param iPos position du paramétre. 00237 \return pointeur sur la structure du paramétre. 00238 \sa AddParam(), DelParam() et GetNbParam(). 00239 */ 00240 inline XMLParam *GetParam(int iPos) 00241 { 00242 if(iPos < NbParam) 00243 return Params[iPos]; 00244 00245 return NULL; 00246 }; 00247 00248 //! Retourne un paramétre. 00249 /*! Retourne le paramétre ayant le nom \a pName. 00250 \param pName nom du paramétre. 00251 \return pointeur sur la structure du paramétre. 00252 \sa AddParam(), DelParam() et GetNbParam(). 00253 */ 00254 inline XMLParam *GetParam(char *pName) 00255 { 00256 for(int i = 0; i < NbParam; i++) 00257 { 00258 if(!strcmp(Params[i]->Name, pName)) 00259 return Params[i]; 00260 } 00261 00262 return NULL; 00263 }; 00264 00265 //! Retourne le nombre de paramétre. 00266 /*! Retourne le nombre de paramétre de l'objet. 00267 \return nombre de paramétre de l'objet. 00268 \sa AddParam(), DelParam() et GetParam(). 00269 */ 00270 inline int GetNbParam() 00271 { 00272 return NbParam; 00273 }; 00274 00275 //********************************** Objets ********************************* 00276 //! Ajoute un objet. 00277 /*! Ajoute un objet de type \a XML_OBJET. 00278 \return code d'erreur. 00279 \sa Del(), GetSousObjet(), GetSPecial() et GetData(). 00280 */ 00281 int Add(); 00282 00283 //! Supprime un objet. 00284 /*! Supprime l'objet étant à la position \a iPos. 00285 \param iPos position de l'objet. 00286 \return code d'erreur. 00287 \sa Add(), GetSousObjet(), GetSPecial() et GetData(). 00288 */ 00289 int Del(int iPos); 00290 00291 //! Supprime un objet. 00292 /*! Supprime l'objet étant à la position \a iPos. 00293 \param pName nom de l'objet. 00294 \return code d'erreur. 00295 \sa Add(), GetSousObjet(), GetSPecial() et GetData(). 00296 */ 00297 inline int Del(char *pName) 00298 { 00299 for(int i = 0; i < NbObjet; i++) 00300 { 00301 if(Objets[i]->Type == XML_TYPE_OBJET) 00302 if(!strcmp(Objets[i]->Name, pName)) 00303 return Del(i); 00304 } 00305 00306 return ERROR_C_NOERROR; 00307 }; 00308 00309 //! Retourne un sous-objet. 00310 /*! Retourne le sous-objet étant à la position \a iPos. 00311 \param iPos position du sous-objet. 00312 \return pointeur sur la structure du sous-objet. 00313 \sa Add() et Del(). 00314 */ 00315 inline XMLObjet *GetSousObjet(int iPos) 00316 { 00317 if(iPos < NbObjet) 00318 if(Objets[iPos]->Type == XML_TYPE_OBJET) 00319 return Objets[iPos]; 00320 00321 return NULL; 00322 }; 00323 00324 //! Retourne un sous-objet. 00325 /*! Retourne le sous-objet ayant le nom \a pName. 00326 \param pName nom du sous-objet. 00327 \return pointeur sur la structure du sous-objet. 00328 \sa Add() et Del(). 00329 */ 00330 inline XMLObjet *GetSousObjet(char *pName) 00331 { 00332 for(int i = 0; i < NbObjet; i++) 00333 { 00334 if(Objets[i]->Type == XML_TYPE_OBJET) 00335 if(!strcmp(Objets[i]->Name, pName)) 00336 return Objets[i]; 00337 } 00338 00339 return NULL; 00340 }; 00341 00342 //! Retourne un objet spécial. 00343 /*! Retourne l'objet spécial étant à la position \a iPos. 00344 \param iPos position de l'objet spécial. 00345 \return pointeur sur la data de l'objet spécial \a Data. 00346 \sa Add() et Del(). 00347 */ 00348 inline char *GetSpecial(int iPos) 00349 { 00350 if(iPos < NbObjet) 00351 if(Objets[iPos]->Type == XML_TYPE_SPECIAL) 00352 return Data; 00353 00354 return NULL; 00355 }; 00356 00357 //! Retourne un objet data. 00358 /*! Retourne l'objet data étant à la position \a iPos. 00359 \param iPos position de l'objet data. 00360 \return pointeur sur la data de l'objet data \a Data. 00361 \sa Add() et Del(). 00362 */ 00363 inline char *GetData(int iPos) 00364 { 00365 if(iPos < NbObjet) 00366 if(Objets[iPos]->Type == XML_TYPE_DATA) 00367 return Data; 00368 00369 return NULL; 00370 }; 00371 00372 //! Retourne le nombre de sous objet. 00373 /*! Retourne le nombre de sous objet de l'objet. 00374 \return nombre de sous objet de l'objet. 00375 \sa Add(), Del() et GetSousObjet(). 00376 */ 00377 inline int GetNbObjet() 00378 { 00379 return NbObjet; 00380 }; 00381 }; 00382 00383 00384 #endif 00385