00001
00002
00003
00004
00005
00006
00007
00008
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 }
00384 }
00385 else
00386 LogError(NoLine, NoCar, "Reading char");
00387 }
00388 }
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
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
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