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

XMLObjet.h

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 

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