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

XMLObjet.cpp

Aller à la documentation de ce fichier.
00001 /*! \file XMLObjet.cpp
00002     \brief Gestion d'un objet XML.
00003 
00004     Gestion d'un objet dans \a XML. \n
00005 
00006     \author     aerith (www.aerith.fr)
00007     \version    1.0
00008     \date       01/11/2007
00009 */
00010 
00011 #include    "XMLObjet.h"
00012 
00013 
00014 FILE    *XMLObjet::File = NULL;
00015 int     XMLObjet::Cur   = 0;
00016 int     XMLObjet::NoLine= 0;
00017 int     XMLObjet::NoCar = 0;
00018 
00019 XMLObjet::XMLObjet()
00020 {
00021     Type    = XML_TYPE_OBJET;
00022     *Name   = '\0';
00023     NbParam = 0;
00024     NbObjet = 0;
00025     Data    = NULL;
00026 };
00027 
00028 XMLObjet::~XMLObjet()
00029 {
00030     int     i;
00031 
00032     for(i = 0; i < NbParam; i++)
00033         delete Params[i];
00034     Params.clear();
00035 
00036     for(i = 0; i < NbObjet; i++)
00037         delete Objets[i];
00038     Objets.clear();
00039 
00040     if(Data)
00041         free(Data);
00042 }
00043 
00044 void    XMLObjet::LogError(int iNoLine, int iNoCar, char *pDesc)
00045 {
00046     FILE    *File;
00047 
00048     File = fopen("XMLError.log", "a");
00049     if(File)
00050     {
00051         fprintf(File, "Line %i, Car %i => %s\n", iNoLine, iNoCar, pDesc);
00052 
00053         fclose(File);
00054     }
00055     else
00056         perror("Canot open XML's errors log file\n");
00057 }
00058 
00059 int     XMLObjet::Load(int iNoLine, int iNoCar)
00060 {
00061     char    TempBuffer[XML_BUFFER];
00062     char    TempName[XML_NAME];
00063     char    TempName2[XML_NAME];
00064     char    TempParam[XML_TEMP];
00065     int     iName = 0, iName2 = 0, iParam = 0, iBuffer = 0;
00066     int     GetString = 0;
00067     char    Car = '\0';
00068     int     Mode = 0;
00069 printf("\ndebug\n");
00070 
00071     BEGIN
00072     LOC("XMLObjet::Load");
00073 
00074     TRY if(File)
00075     {
00076         NoLine = iNoLine;
00077         NoCar = iNoCar;
00078 
00079         while(!feof(File) && !CERROR && (Mode != XML_CLOSE_CLOSE))
00080         {
00081             TRYNIF(Mode > XML_SPECIAL, ERROR_C_UNKNOW);
00082 
00083             TRY Car = (char)fgetc(File);
00084 
00085             if(Car == '\n')
00086             {
00087                 NoLine++;
00088                 NoCar = 0;
00089             }
00090             else
00091                 NoCar++;
00092 
00093             TRY
00094             {
00095                 switch(Car)
00096                 {
00097                     case    '<' :
00098                         switch(Mode)
00099                         {
00100                             case    XML_VIERGE      :
00101                                 Mode = XML_OPEN_OPEN;
00102                                 break;
00103                             case    XML_OPEN_OPEN   :
00104                                 LogError(NoLine, NoCar, "'<' found, already opened");
00105                                 break;
00106                             case    XML_OBJET_NAME  :
00107                                 LogError(NoLine, NoCar, "'<' found, '>' homited");
00108                                 break;
00109                             case    XML_PARAM_NAME  :
00110                                 LogError(NoLine, NoCar, "'<' found, parameter value needed");
00111                                 break;
00112                             case    XML_PARAM_FOUND :
00113                                 LogError(NoLine, NoCar, "'<' found, parameter value needed");
00114                                 break;
00115                             case    XML_PARAM_DATA  :
00116                                 LogError(NoLine, NoCar, "'<' found, '>' homited");
00117                                 break;
00118                             case    XML_OPEN_CLOSE  :
00119                                 TRY if(fseek(File, -1, SEEK_CUR))
00120                                 {
00121                                     LogError(NoLine, NoCar, "Repositioning seek for new objet");
00122                                     CERROR = 17;
00123                                 }
00124                                 TRY NoCar--;
00125                                 TRY CERROR = Add();
00126                                 TRY GetSousObjet(NbObjet - 1)->Load(NoLine, NoCar);
00127                                 TRY Mode = XML_DATA;
00128                                 break;
00129                             case    XML_DATA    :
00130                                 if(!GetString)
00131                                 {
00132                                     Type = XML_TYPE_DATA;
00133                                     TempBuffer[iBuffer] = '\0';
00134                                     Size = strlen(TempBuffer);
00135                                     Data = (char *)malloc(sizeof(char) * (Size + 1));
00136                                     strcpy(Data, TempBuffer);
00137                                     Mode = XML_CLOSE_OPEN;
00138                                 }
00139                                 else
00140                                     LogError(NoLine, NoCar, "'<' found, '\"' not closed");
00141                                 break;
00142                             case    XML_CLOSE_OPEN  :
00143                                 LogError(NoLine, NoCar, "'<' found, already opened");
00144                                 break;
00145                             case    XML_CLOSE_FOUND :
00146                                 LogError(NoLine, NoCar, "'<' found, '>' homited");
00147                                 break;
00148                             case    XML_CLOSE_CLOSE :
00149                                 LogError(NoLine, NoCar, "'<' found, parsing error, object not closed");
00150                                 break;
00151                             case    XML_SPECIAL     :
00152                                 LogError(NoLine, NoCar, "'<' found, '>' homited");
00153                                 break;
00154                         }
00155                         break;
00156 
00157                     case    '>' :
00158                         switch(Mode)
00159                         {
00160                             case    XML_VIERGE      :
00161                                 LogError(NoLine, NoCar, "'>' found, '<' homited");
00162                                 break;
00163                             case    XML_OPEN_OPEN   :
00164                                 LogError(NoLine, NoCar, "'>' found, homited object name");
00165                                 break;
00166                             case    XML_OBJET_NAME  :
00167                                 TempName[iName] = '\0';
00168                                 strcpy(Name, TempName);
00169                                 Mode = XML_OPEN_CLOSE;
00170                                 break;
00171                             case    XML_PARAM_NAME  :
00172                                 LogError(NoLine, NoCar, "'>' found, homited parameter value");
00173                                 break;
00174                             case    XML_PARAM_FOUND :
00175                                 LogError(NoLine, NoCar, "'>' found, homited parameter value");
00176                                 break;
00177                             case    XML_PARAM_DATA  :
00178                                 if(!GetString)
00179                                 {
00180                                     TempParam[iParam] = '\0';
00181                                     TempBuffer[iBuffer] = '\0';
00182                                     AddParam(TempParam, TempBuffer);
00183                                     Mode = XML_OPEN_CLOSE;
00184                                 }
00185                                 else
00186                                     LogError(NoLine, NoCar, "'>' found, '\"' not close");
00187                                 break;
00188                             case    XML_OPEN_CLOSE  :
00189                                 LogError(NoLine, NoCar, "'>' found, already closed");
00190                                 break;
00191                             case    XML_DATA    :
00192                                 LogError(NoLine, NoCar, "'>' found, '<' homited");
00193                                 break;
00194                             case    XML_CLOSE_OPEN  :
00195                                 LogError(NoLine, NoCar, "'>' found, homited '/'");
00196                                 break;
00197                             case    XML_CLOSE_FOUND :
00198                                 TempName2[iName2] = '\0';
00199                                 if(!strcmp(TempName2, TempName))
00200                                     Mode = XML_CLOSE_CLOSE;
00201                                 else
00202                                     LogError(NoLine, NoCar, "Objet's name dont match");
00203                                 break;
00204                             case    XML_CLOSE_CLOSE :
00205                                 LogError(NoLine, NoCar, "'>' found, objet not closed");
00206                                 break;
00207                             case    XML_SPECIAL     :
00208                                 Type = XML_TYPE_SPECIAL;
00209                                 TempBuffer[iBuffer] = '\0';
00210                                 Size = strlen(TempBuffer);
00211                                 Data = (char *)malloc(sizeof(char) * (Size + 1));
00212                                 strcpy(Data, TempBuffer);
00213                                 Mode = XML_CLOSE_CLOSE;
00214                                 break;
00215                         }
00216                         break;
00217 
00218                     case    ' ' :
00219                         switch(Mode)
00220                         {
00221                             case    XML_OBJET_NAME  :
00222                                 TempName[iName] = '\0';
00223                                 strcpy(Name, TempName);
00224                                 iParam = 0;
00225                                 Mode = XML_PARAM_NAME;
00226                                 break;
00227                             case    XML_PARAM_DATA  :
00228                                 if(!GetString)
00229                                 {
00230                                     TempParam[iParam] = '\0';
00231                                     TempBuffer[iBuffer] = '\0';
00232                                     AddParam(TempParam, TempBuffer);
00233                                     iParam = 0;
00234                                     Mode = XML_PARAM_NAME;
00235                                 }
00236                                 else
00237                                     TempBuffer[iBuffer++] = Car;
00238                                 break;
00239                             case    XML_DATA        :
00240                                 TempBuffer[iBuffer++] = Car;
00241                                 break;
00242                             case    XML_SPECIAL     :
00243                                 TempBuffer[iBuffer++] = Car;
00244                                 break;
00245                         }
00246                         break;
00247 
00248                     case    '=' :
00249                         if(Mode == XML_PARAM_NAME)
00250                             Mode = XML_PARAM_FOUND;
00251                         else
00252                         {
00253                             if(GetString || (Mode == XML_SPECIAL))
00254                                 TempBuffer[iBuffer++] = Car;
00255                             else
00256                                 LogError(NoLine, NoCar, "'=' found without parameter");
00257                         }
00258                         break;
00259 
00260                     case    '/' :
00261                         switch(Mode)
00262                         {
00263                             case    XML_OBJET_NAME  :
00264                                 Mode = XML_CLOSE_FOUND;
00265                                 break;
00266                             case    XML_PARAM_DATA  :
00267                                 Mode = XML_CLOSE_FOUND;
00268                                 break;
00269                             case    XML_CLOSE_OPEN  :
00270                                 Mode = XML_CLOSE_FOUND;
00271                                 break;
00272                             default     :
00273                                 if(GetString || (Mode == XML_SPECIAL))
00274                                     TempBuffer[iBuffer++] = Car;
00275                                 else
00276                                     LogError(NoLine, NoCar, "'/' found, '<' homited");
00277                                 break;
00278                         }
00279                         break;
00280 
00281                     case    '\"':
00282                         switch(Mode)
00283                         {
00284                             case    XML_PARAM_FOUND :
00285                                 if(!GetString)
00286                                 {
00287                                     iBuffer = 0;
00288                                     GetString = 1;
00289                                 }
00290                                 break;
00291                             case    XML_PARAM_DATA  :
00292                                 if(GetString)
00293                                 {
00294                                     GetString = 0;
00295                                     TempParam[iParam] = '\0';
00296                                     TempBuffer[iBuffer] = '\0';
00297                                     AddParam(TempParam, TempBuffer);
00298                                 }
00299                                 else
00300                                     LogError(NoLine, NoCar, "'\"' found but not opened");
00301                                 break;
00302                             case    XML_OPEN_CLOSE  :
00303                                 iBuffer = 0;
00304                                 TempBuffer[iBuffer++] = Car;
00305                                 Mode = XML_DATA;
00306                                 break;
00307                             case    XML_DATA        :
00308                                 TempBuffer[iBuffer++] = Car;
00309                                 break;
00310                             case    XML_SPECIAL     :
00311                                 TempBuffer[iBuffer++] = Car;
00312                                 break;
00313                             default     :
00314                                 LogError(NoLine, NoCar, "'\"' found");
00315                         }
00316                         break;
00317 
00318                     default     :
00319                         switch(Mode)
00320                         {
00321                             case    XML_VIERGE      :
00322                                 LogError(NoLine, NoCar, "no object opened");
00323                                 break;
00324                             case    XML_OPEN_OPEN   :
00325                                 if(IsAlphaNumCar(Car))
00326                                 {
00327                                     iName = 0;
00328                                     TempName[iName++] = Car;
00329                                     Mode = XML_OBJET_NAME;
00330                                 }
00331                                 else
00332                                 {
00333                                     iBuffer = 0;
00334                                     TempBuffer[iBuffer++] = Car;
00335                                     Mode = XML_SPECIAL;
00336                                 }
00337                                 break;
00338                             case    XML_OBJET_NAME  :
00339                                 if(IsAlphaNumCar(Car) || (Car == ':'))
00340                                     TempName[iName++] = Car;
00341                                 else
00342                                     LogError(NoLine, NoCar, "alphanum char only in name");
00343                                 break;
00344                             case    XML_PARAM_NAME  :
00345                                 if(IsAlphaNumCar(Car))
00346                                     TempParam[iParam++] = Car;
00347                                 else
00348                                     LogError(NoLine, NoCar, "alphanum char only in name");
00349                                 break;
00350                             case    XML_PARAM_FOUND :
00351                                 iBuffer = 0;
00352                                 TempBuffer[iBuffer++] = Car;
00353                                 Mode = XML_PARAM_DATA;
00354                                 break;
00355                             case    XML_PARAM_DATA  :
00356                                 TempBuffer[iBuffer++] = Car;
00357                                 break;
00358                             case    XML_OPEN_CLOSE  :
00359                                 iBuffer = 0;
00360                                 TempBuffer[iBuffer++] = Car;
00361                                 Mode = XML_DATA;
00362                                 break;
00363                             case    XML_DATA        :
00364                                 TempBuffer[iBuffer++] = Car;
00365                                 iName2 = 0;
00366                                 break;
00367                             case    XML_CLOSE_OPEN  :
00368                                 LogError(NoLine, NoCar, "/ homited");
00369                                 break;
00370                             case    XML_CLOSE_FOUND :
00371                                 if(IsAlphaNumCar(Car) || (Car == ':'))
00372                                     TempName2[iName2++] = Car;
00373                                 else
00374                                     LogError(NoLine, NoCar, "alphanum char only in name");
00375                                 break;
00376                             case    XML_CLOSE_CLOSE :
00377                                 LogError(NoLine, NoCar, "objet was closed");
00378                                 break;
00379                             case    XML_SPECIAL     :
00380                                 TempBuffer[iBuffer++] = Car;
00381                                 break;
00382                         }
00383                 } //switch(Car)
00384             } //TRY
00385             else
00386                 LogError(NoLine, NoCar, "Reading char");
00387         } //while(...)
00388     } //if(File)
00389     else
00390         LogError(NoLine, NoCar, "The file descriptor is closed");
00391 
00392     PERROR
00393 
00394     ENDBEGIN
00395 }
00396 
00397 int     XMLObjet::Save(int iDec)
00398 {
00399 
00400     return 0;
00401 }
00402 
00403 int     XMLObjet::Print(int iDec)
00404 {
00405     int     i;
00406     BEGIN
00407     LOC("XMLObjet::Print");
00408 
00409     TRY if(File)
00410     {
00411         for(i = 0; i < iDec; i++)
00412             fputc('\t', File);
00413         fprintf(File, "%s\n", Name);
00414 
00415         for(i = 0; i < Size; i++)
00416         {
00417             TRY if(GetSousObjet(i)->GetType() == XML_TYPE_OBJET)
00418             {
00419                 TRY CERROR = GetSousObjet(i)->Print();
00420             }
00421         }
00422     }
00423 
00424     PERROR
00425 
00426     ENDBEGIN
00427 }
00428 
00429 //********************************** Paramétre *********************************
00430 int     XMLObjet::AddParam(char *pName, char *pData)
00431 {
00432     Params.push_back(new XMLParam);
00433 
00434     if(!Params[NbParam])
00435         return ERROR_C_MEMORY;
00436 
00437     NbParam++;
00438 
00439     return ERROR_C_NOERROR;
00440 }
00441 
00442 int     XMLObjet::DelParam(int iPos)
00443 {
00444     if((NbParam > 0) && (iPos < NbParam))
00445     {
00446         Params.erase(Params.begin() + iPos);
00447 
00448         NbParam--;
00449     }
00450 
00451     return ERROR_C_NOERROR;
00452 }
00453 
00454 //********************************** Objets *********************************
00455 int     XMLObjet::Add()
00456 {
00457     Objets.push_back(new XMLObjet);
00458 
00459     if(!Objets[NbObjet])
00460         return ERROR_C_MEMORY;
00461 
00462     Size++;
00463 
00464     return ERROR_C_NOERROR;
00465 }
00466 
00467 int     XMLObjet::Del(int iPos)
00468 {
00469     if((NbObjet > 0) && (iPos < NbObjet))
00470     {
00471         Objets.erase(Objets.begin() + iPos);
00472 
00473         Size--;
00474     }
00475 
00476     return ERROR_C_NOERROR;
00477 }
00478 

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