/[PAMELA software]/chewbacca/PamOffLineSW/PamOffLineSW_Main.cpp
ViewVC logotype

Diff of /chewbacca/PamOffLineSW/PamOffLineSW_Main.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.3 by mocchiut, Fri Dec 12 15:58:48 2008 UTC revision 1.13 by mocchiut, Fri Feb 12 12:45:49 2010 UTC
# Line 1  Line 1 
1  //============================================================================  //============================================================================
2  // $Id: PamOffLineSW_Main.cpp,v 1.52 2008-09-12 14:03:55 messineo Exp $  // $Id: PamOffLineSW_Main.cpp,v 1.12 2010/02/12 05:22:04 mocchiut Exp $
3  // Description : Pamela Off-Line Software  // Description : Pamela Off-Line Software
4  //============================================================================  //============================================================================
5    
# Line 8  Line 8 
8  #include "StateManager.h"  #include "StateManager.h"
9    
10  #include "PacketUser.h"  #include "PacketUser.h"
11    #include <TArrayL64.h>
12    
13  extern "C" {  extern "C" {
14      #include <dirent.h>      #include <dirent.h>
# Line 42  short int CRC_Cadre_Check(char dataVRL[] Line 43  short int CRC_Cadre_Check(char dataVRL[]
43    
44  //global variables  //global variables
45  bool simulated_data = false;  bool simulated_data = false;
46  bool do_vrl_check = false;  //bool do_vrl_check = false; //EMI
47    bool do_vrl_check = true; //EMI
48    
49  char*  db_host = "";  
50    const char*  db_host = "";
51  int        db_port = 0;  int        db_port = 0;
52  char*  db_name = "";  const char*  db_name = "";
53  char conn[100]="";  char conn[100]="";
54    
55  LogUtil::logLevel loglevel=LogUtil::LOGERROR;  LogUtil::logLevel loglevel=LogUtil::LOGERROR;
56  char* logfilename = "chewbacca.log";  const char* logfilename = "chewbacca.log";
57  //current route  //current route
58  int route = 999;  int route = 999;
59  //previous route  //previous route
60  int old_route = 999;  int old_route = 999;
61    
62    Long64_t filelength = 0LL;
63    Long64_t streamposi = 0LL;
64    Long64_t streamposisaved = 0LL;
65    Long64_t streamposiorig = 0LL;
66    Int_t numposi = 10;
67    Long64_t downcount = 1LL;
68    TArrayL64 *dwin=new TArrayL64(12);
69    Long64_t cadcount = 0LL;
70    Int_t horrorcount = 0;
71    Int_t hc = 0;
72    
73  bool skip_cadre = false;  bool skip_cadre = false;
74  long int iNumGoodCadres=0; //total number of good cadres  long int iNumGoodCadres=0; //total number of good cadres
75                    
76  // global variables used in all the project  // global variables used in all the project
77  namespace PamOffLineSW  namespace PamOffLineSW
78  {        {      
79          char*  db_user = "";          const char*  db_user = "";
80          char*  db_pwd  = "";          const char*  db_pwd  = "";
81          char* connection = NULL;                  char* pelosconnection = NULL;  
82          //marco_new_01          //marco_new_01
83          bool single_connection=false;            bool single_connection=false;  
84          long int iNumCadres=0; //cadre's number          long int iNumCadres=0; //cadre's number
# Line 74  namespace PamOffLineSW Line 88  namespace PamOffLineSW
88          char* fni; //path completo          char* fni; //path completo
89          short compression = 3;          short compression = 3;
90  //      char *outDir = ".";  //      char *outDir = ".";
91          char *outDir = "";          const char *outDir = "";
92    
93          char * nome_output="chewbacca";    //    char * nome_output="chewbacca"; //EMI
94      bool multiFile = 0;          const char * nome_output="L0PAM";//EMI
95          unsigned long int step_pkt_number=0;          bool multiFile = 0;    
96          unsigned long int step_pkt_obt=0;    //    unsigned long int step_pkt_number=0; // EMI
97            unsigned long int step_pkt_number=3000;
98      //    unsigned long int step_pkt_obt=0; // EMI
99            unsigned long int step_pkt_obt=7200000; // EMI
100          LogUtil* mainLogUtil = NULL;          LogUtil* mainLogUtil = NULL;
101          TSQLServer* sqlServer = NULL;          TSQLServer* sqlServer = NULL;
102          unsigned long int max_pkt_number =   16777215;//biggest value before reset          unsigned long int max_pkt_number =   16777215;//biggest value before reset
103          unsigned long int max_pkt_obt    = 4294967295u;//biggest value before reset          unsigned long int max_pkt_obt    = 4294967295u;//biggest value before reset
104    
105          bool is_new_route = false;          //    bool is_new_route = false;      // EMI
106            bool is_new_route = true;       // EMI ??????????? VA BENE? SECONDO ME SI`
107          unsigned int download = 0;          unsigned int download = 0;
108          unsigned int orbit_number=0;          unsigned int orbit_number=0;
109          unsigned int mmm_number = 0;//session_number          unsigned int mmm_number = 0;//session_number
110          unsigned long int time_Offset=0;          unsigned long int time_Offset=0;
111          bool tryMerge = false;    //    bool tryMerge = false;
112            bool tryMerge = true;
113            bool candelete = true; //EM
114                                    
115          bool do_cont_check=true;//if do_cont_check is false do not use a DB ...          bool do_cont_check=true;//if do_cont_check is false do not use a DB ...
116    
117          //TODO: now it is unused          //TODO: now it is unused
118          unsigned long int delta_Time=0;//in seconds          unsigned long int delta_Time=0;//in seconds
119    #define TAGVALUELEN 4
120      char tag_value[TAGVALUELEN];
121  }  }
122    
123  // main:  // main:
# Line 158  void readOptions(int argc, char *argv[]) Line 180  void readOptions(int argc, char *argv[])
180          cout << "\t  (-help | --help | -h) print this help and exit \n";          cout << "\t  (-help | --help | -h) print this help and exit \n";
181          cout << "\t -simu       if the input file contains simulated data instead of real data\n";          cout << "\t -simu       if the input file contains simulated data instead of real data\n";
182          cout << "\t -vrl    if you want to perform the vrl check\n";          cout << "\t -vrl    if you want to perform the vrl check\n";
183            cout << "\t -no-vrl    if you DO NOT want to perform the vrl check\n";
184            cout << "\t -gpamela    gpamela data as input\n";
185          cout << "\t -filelog     set the log filename. [default: chewbacca.log]\n";          cout << "\t -filelog     set the log filename. [default: chewbacca.log]\n";
186          cout << "\t -loglevel     set the log level. Values: [0,3] (error,warning,info,all) [default:0]\n";          cout << "\t -loglevel     set the log level. Values: [0,3] (error,warning,info,all) [default:0]\n";
187          cout << "\t -c      set the compression level for the generated ROOT file(s). Values: [0,9] [default = 3]\n";          cout << "\t -c      set the compression level for the generated ROOT file(s). Values: [0,9] [default = 3]\n";
# Line 176  void readOptions(int argc, char *argv[]) Line 200  void readOptions(int argc, char *argv[])
200          cout << "\t -session_number  Value of the session number. If 0 this is retrieved from the input file name.  [default = 0]\n";                          cout << "\t -session_number  Value of the session number. If 0 this is retrieved from the input file name.  [default = 0]\n";                
201          cout << "\t -time_Offset  Value of the timeOffset. If 0 this is retrieved using the orbital number.  [default = 0]\n";          cout << "\t -time_Offset  Value of the timeOffset. If 0 this is retrieved using the orbital number.  [default = 0]\n";
202          cout << "\t -tryMerge if you want to try to Merge ROOT files\n";          cout << "\t -tryMerge if you want to try to Merge ROOT files\n";
203                  //marco_new_01          cout << "\t -dontMerge if you do not want to try to Merge ROOT files\n";
204            cout << "\t -dontDelete if you do not want to delete bad ROOT files from disks\n";
205            //marco_new_01
206          cout << "\t -single_connection if you want to open only one connection to DB.\n";          cout << "\t -single_connection if you want to open only one connection to DB.\n";
207                          //       cout << "\t -delta_Time  set the allowed difference (seconds) in the Real Time between two root file. [default = 0]\n";          cout << "\t -tag if you want add the 'The owner of the file' - the tag lenght is 4 char\n";
208            //       cout << "\t -delta_Time  set the allowed difference (seconds) in the Real Time between two root file. [default = 0]\n";
209          //cout << "\t -multi  generate multiple root files \n";          //cout << "\t -multi  generate multiple root files \n";
210          exit(1);          exit(1);
211    }    }
# Line 198  void readOptions(int argc, char *argv[]) Line 224  void readOptions(int argc, char *argv[])
224          exit(1);          exit(1);
225      }      }
226    
227      //input file
228      fni= argv[1];
229      
230    for (int i = 2; i < argc; i++)    for (int i = 2; i < argc; i++)
231    {          {      
232          //marco_new_01          //marco_new_01
# Line 213  void readOptions(int argc, char *argv[]) Line 242  void readOptions(int argc, char *argv[])
242                          tryMerge = true;                          tryMerge = true;
243                  continue;                  continue;
244              }              }
245    
246              if (!strcmp(argv[i], "-dontMerge")) // EMI
247                {
248                            tryMerge = false;
249                    continue;
250                }
251    
252              if (!strcmp(argv[i], "-dontDelete")) // EMI
253                {
254                            candelete = false;
255                    continue;
256                }
257                        
258            if (!strcmp(argv[i], "-time_Offset")){            if (!strcmp(argv[i], "-time_Offset")){
259                          if (++i >= argc){                          if (++i >= argc){
# Line 300  void readOptions(int argc, char *argv[]) Line 341  void readOptions(int argc, char *argv[])
341            simulated_data = true;            simulated_data = true;
342            continue;            continue;
343        }        }
344    
345          if (!strcmp(argv[i], "-gpamela"))
346          {
347              simulated_data = true;
348              do_vrl_check = false;
349              nome_output = (char *)gSystem->BaseName(fni);
350              tryMerge = false;
351              candelete = false;
352              continue;
353          }
354                
355          if (!strcmp(argv[i], "-no-vrl")) //EMI
356            {
357              do_vrl_check = false;
358          }
359        if (!strcmp(argv[i], "-vrl"))        if (!strcmp(argv[i], "-vrl"))
360        {        {
361            do_vrl_check = true;            do_vrl_check = true;
# Line 364  void readOptions(int argc, char *argv[]) Line 419  void readOptions(int argc, char *argv[])
419                   exit(1);                   exit(1);
420               }               }
421               DIR* tempdir;               DIR* tempdir;
422               if ((tempdir = opendir(argv[i])) != 0) {               if ((tempdir = opendir(gSystem->ExpandPathName(argv[i]))) != 0) { // EMI
423                   outDir = argv[i];                   outDir = argv[i];
424                   closedir(tempdir);                   closedir(tempdir);
425               } else {               } else {
# Line 488  void readOptions(int argc, char *argv[]) Line 543  void readOptions(int argc, char *argv[])
543                               db_pwd = argv[i];                               db_pwd = argv[i];
544                                continue;                                continue;
545                            }                            }
546                   if (!strcmp(argv[i], "-tag")){
547                                  if (++i >= argc){
548                                      cerr << "-tag needs arguments. \n";
549                                      cout << "Try '-help' for more information. \n";
550                                      exit(1);
551                                  }
552                                  int len=strlen(argv[i])>TAGVALUELEN?TAGVALUELEN:strlen(argv[i]);
553                                  strncpy(tag_value,argv[i],len);
554                                  tag_value[len]=0;
555                                  continue;
556                              }
557                      
558                  //TODO: check that multiFile is always 0                  //TODO: check that multiFile is always 0
559         //       if (!strcmp(argv[i], "-multi")){multiFile = 1; cout<<"debug: multi= "<<multiFile<<endl;}                 //       if (!strcmp(argv[i], "-multi")){multiFile = 1; cout<<"debug: multi= "<<multiFile<<endl;}        
560     }     }
561        
   //input file  
   fni= argv[1];  
     
562    //TODO: maybe if simulated data I don't need nothig so I can skip the following lines    //TODO: maybe if simulated data I don't need nothig so I can skip the following lines
563    // and use instead something similar to:    // and use instead something similar to:
564    //if(simulated data){orbit_number=99999; mmm_number=999; download=999; }    if (simulated_data) {orbit_number=99999; mmm_number=999; download=999; }
565        
566    //I need the following lines only to retrieve orbit_number and mmm_number (session_number)from the filename    //I need the following lines only to retrieve orbit_number and mmm_number (session_number)from the filename
567    if((!orbit_number)||(!mmm_number))    if((!orbit_number)||(!mmm_number))
# Line 571  void DB_config() Line 634  void DB_config()
634                  char *pamdbhost = getenv("PAM_DBHOST");                  char *pamdbhost = getenv("PAM_DBHOST");
635                  if (pamdbhost)                  if (pamdbhost)
636                  {                  {
637                          connection = pamdbhost;                          pelosconnection = pamdbhost;
638                  }                  }
639                  else                  else
640                  {                        {      
# Line 590  void DB_config() Line 653  void DB_config()
653                                  db_name="chewbacca_db";                                          db_name="chewbacca_db";        
654                          }                                                                                        }                                                              
655                          sprintf(conn,"mysql://%s:%d/%s",db_host,db_port,db_name);                                sprintf(conn,"mysql://%s:%d/%s",db_host,db_port,db_name);      
656                          connection=conn;                                                  pelosconnection=conn;                  
657                  }                  }
658          }          }
659          else{          else{
660                  sprintf(conn,"mysql://%s:%d/%s",db_host,db_port,db_name);                        sprintf(conn,"mysql://%s:%d/%s",db_host,db_port,db_name);      
661                  connection=conn;                                                  pelosconnection=conn;                          
662          }          }
663                                    
664          if (!strcmp(db_user,""))          if (!strcmp(db_user,""))
# Line 625  void DB_config() Line 688  void DB_config()
688                  }                        }      
689          }          }
690                    
691          string msg = "Using DB: " + string(connection);// +" "+ string(db_user) +" "+ string(db_pwd);          string msg = "Using DB: " + string(pelosconnection);// +" "+ string(db_user) +" "+ string(db_pwd);
692          mainLogUtil->logAlways(msg);          mainLogUtil->logAlways(msg);
693  }  }
694    
# Line 634  void firstLog(){ Line 697  void firstLog(){
697          string msg = "Input file: " + (string)fni;          string msg = "Input file: " + (string)fni;
698          mainLogUtil->logAlways(msg);          mainLogUtil->logAlways(msg);
699    
700          msg = "Output directory for the generated root file(s): " + (string)outDir;          msg = "Output directory for the generated root file(s): " + (string)outDir;
701          mainLogUtil->logAlways(msg);              mainLogUtil->logAlways(msg);    
702            msg = "Output directory for the generated root file(s) expanded: " + (string)gSystem->ExpandPathName(outDir); // EMI
703            mainLogUtil->logAlways(msg);    //EMI
704    
705          msg = "Output root name for the generated root file(s): " + (string)nome_output;          msg = "Output root name for the generated root file(s): " + (string)nome_output;
706          mainLogUtil->logAlways(msg);              mainLogUtil->logAlways(msg);    
# Line 791  void mainRead_RealData(char fni[]) Line 856  void mainRead_RealData(char fni[])
856          ifstream fin;            ifstream fin;  
857          fin.open(fni, ifstream::binary);                  fin.open(fni, ifstream::binary);        
858          if (!fin) {cout<<"Can not open input file "<<fni<<endl; exit(1);}          if (!fin) {cout<<"Can not open input file "<<fni<<endl; exit(1);}
859            
860    
861            //
862            // EM determine file length, number of downloads (a part small fractions of download due to VRL memory) and interval window for allowed change in download number
863            //
864            fin.seekg(0,std::ios::end);
865            filelength = (Long64_t)fin.tellg();
866            //
867            //      filelength = 3840214016LL;
868            //      filelength = 5763760128LL;
869            //      filelength = 15370027008LL;
870            //
871            downcount = (Long64_t)round((Double_t)filelength/2000000000.);
872            if ( downcount < 1LL ) downcount = 1LL;
873            Long64_t downsize = (Long64_t)round((Double_t)filelength/(Double_t)downcount);
874            Long64_t hwint = Long64_t((Double_t)downsize/25.);
875            //
876            if ( downcount > 5LL ) dwin->Set(2LL+2LL*downcount);
877            dwin->Reset();
878            dwin->AddAt(0LL,0);
879            //
880            Int_t dco = 1;
881            //
882            for (Int_t ee=1; ee<(-1+2+2*downcount); ee+=2){
883              dwin->AddAt(((downsize*(dco-1))+hwint),ee);    
884              dwin->AddAt(((downsize*dco)-hwint),ee+1);      
885              dco++;
886            };
887            //
888            fin.seekg(0,std::ios::beg);
889            //
890            dwin->AddAt(filelength,(-1LL+2LL+2LL*downcount));
891            //
892            //      printf(" file lenght is %L downcount is %L downsize is %L hwint is %L \n",filelength,downcount,downsize,hwint);
893            stringstream ess;
894            ess.str() = "";
895            ess << " (EM) " << " file lenght is "<< filelength<< " downcount is "<< downcount <<" downsize is "<< downsize <<" hwint is " << hwint;
896            string emsg = ess.str();
897            mainLogUtil->logInfo(emsg);
898            //
899            //      cout << " file lenght is "<< filelength<< " downcount is "<< downcount <<" downsize is "<< downsize <<" hwint is " << hwint << endl;
900            //      for (Int_t ee=0; ee<TMath::Max((2+2*downcount),12LL); ee++){
901            //        cout << " " << ee << " ==> "<< dwin->At(ee) << endl;
902            //        //a     printf(" %i ==> %L \n",ee,dwin->At(ee));
903            //      };
904    
905          //main read loop          //main read loop
906           while(fin.eof()==0)           while(fin.eof()==0)
907           {                         {              
908                  isCadreGood = true;                              isCadreGood = true;            
909                  //start reading the file                  //start reading the file
910                    streamposi = (Long64_t)fin.tellg(); // stream position in the file before reading the vrl header
911                    if ( iNumCadres > 9 && numposi > 9 ){
912                            streamposisaved = streamposi;
913                            numposi = 0;                    
914                    };
915                    numposi++;
916                    //
917                  fin.read(ccHeader_VRL, LENGTH_HEADER_VRL);                                fin.read(ccHeader_VRL, LENGTH_HEADER_VRL);              
918                    //              printf(" position in file is %llu \n",streamposi);
919                    stringstream ss;
920                    ss.str() = "";
921                    ss << " position in file is "<<streamposi;
922                    string sms = ss.str();
923                    //              mainLogUtil->logError(sms);
924                    //
925                  if (!fin.good())                  if (!fin.good())
926                  {                        {      
927                          //TODO: check here                          //TODO: check here
# Line 825  void mainRead_RealData(char fni[]) Line 949  void mainRead_RealData(char fni[])
949                          " This error occurred after byte: "<<iByte_tot<<" ... use the data carefully";                          " This error occurred after byte: "<<iByte_tot<<" ... use the data carefully";
950                          string msg = oss.str();                          string msg = oss.str();
951                          mainLogUtil->logWarning(msg);                          mainLogUtil->logWarning(msg);
952                            //                      printf(" streamposi %llu \n",streamposi);
953                  }                  }
954                                    
955                    //
956                    // we completely missed more than 10 VRL packets
957                    //
958                    if (  hc == 1100 ){
959                      fin.seekg(streamposiorig);
960                      stringstream os;                                              
961                      os<<" NEW (EM) UN-RECOVERABLE SYNC WITH VRL HEADERS, SIG! ";
962                      os<<" new position in file, go back to "<<streamposiorig;
963                      string ms = os.str();
964                      mainLogUtil->logAll(ms);
965                      hc++;
966                      continue;
967                    };
968                    if ( horrorcount > 10 && hc < 1100 ){
969                      hc++;
970                      //if ( horrorcount > 1 ){
971                      stringstream os;                                              
972                      os<<" NEW (EM) THIS IS TOO MUCH, LOST SYNC WITH VRL HEADERS! try to recover horrorcount = "<<horrorcount;
973                      os<<" new position in file "<<(streamposi-(10LL*1024LL)+1LL);
974                      //              os<<" new position in file "<<(streamposi-(1LL*1024LL)+1LL);
975                      string ms = os.str();
976                      mainLogUtil->logAll(ms);
977                      //              printf(" fin.(streamposi-10*1025-7) %llu \n",streamposi-(10LL*1025LL)-7LL);
978                      if ( (streamposi-(10LL*1024LL)+1LL) < streamposisaved ){
979                              fin.seekg(streamposisaved+1LL);
980                              stringstream oss;
981                            oss<<" Problems repositioning stream reader... streamposisaved "<<streamposisaved;
982                            string msg = oss.str();
983                            mainLogUtil->logWarning(msg);
984    
985                      } else {
986                              fin.seekg(streamposi-(10LL*1024LL)+1LL);
987                      };
988                      //              fin.seekg(streamposi-(1LL*1024LL)+1LL);
989                      horrorcount = 0;
990                      continue;
991                    };
992    
993    
994                  //we have read and analysed the header VRL of this cadre                  //we have read and analysed the header VRL of this cadre
995                  iByte_tot+=fin.gcount();                  iByte_tot+=fin.gcount();
996                                    
# Line 910  void mainRead_RealData(char fni[]) Line 1074  void mainRead_RealData(char fni[])
1074                          if(route!=old_route)                          if(route!=old_route)
1075                          {                                {      
1076                                  is_new_route=true;                                  is_new_route=true;
1077                                    cadcount = 1LL;
1078                                  download++;                                  download++;
1079                                  stringstream oss;                                                                                stringstream oss;                                              
1080                                  oss<<"Found a new download n: "<<download<<". Header VRL ends at byte: "<<iByte_tot;                                  oss<<"Found a new download n: "<<download<<". Header VRL ends at byte: "<<iByte_tot;
# Line 997  bool VRL_Header_Check(char* headVRL, int Line 1162  bool VRL_Header_Check(char* headVRL, int
1162                  " This error occurred after byte: "<<iByte_tot<<" ... Route number unused= "<<(int)headVRL[3]<<" Resetting ROUTE to old value = "<<old_route<<" (download="<<download<<")";                  " This error occurred after byte: "<<iByte_tot<<" ... Route number unused= "<<(int)headVRL[3]<<" Resetting ROUTE to old value = "<<old_route<<" (download="<<download<<")";
1163                  string msg = oss.str();                  string msg = oss.str();
1164                  mainLogUtil->logAll(msg);                  mainLogUtil->logAll(msg);
1165    
1166                    if ( ((int)(unsigned char)headVRL[0]!=CODE_FF)&&((int)(unsigned char)headVRL[1]!=CODE_46)&& ((int)(unsigned char)headVRL[2]!=CODE_D5) ){
1167                      stringstream os;                                              
1168                      os<<" Horror movie, the cadre does not start with FF 46 D5 at all! "<<
1169                        " This error occurred after byte: "<<iByte_tot<<" ... Route number unused= "<<(int)headVRL[3]<<" Resetting ROUTE to old value = "<<old_route<<" (download="<<download<<")";
1170                      string ms = os.str();
1171                      mainLogUtil->logAll(ms);
1172                      if ( !hc && !horrorcount ) streamposiorig = streamposi;
1173                      horrorcount++;
1174                    };
1175    
1176                  return false;                  return false;
1177          }          }
1178            
1179          route = (int)headVRL[3];          horrorcount = 0;
1180                    
1181          if(route!=old_route)          // EM qui condizione su posizione file
1182          {                Bool_t downchangeallowed = false;      
1183                  stringstream oss;                        for (Int_t ee=0; ee<(-1+2+2*downcount); ee+=2){
1184                  oss<<"Changing ROUTE at byte: "<<iByte_tot<<" route = "<<route<<" old value = "<<old_route<<" (download="<<download<<")";            if ( streamposi >= dwin->At(ee) && streamposi < dwin->At(ee+1) ) downchangeallowed = true;
1185                  string msg = oss.str();            //      printf(" %i ==> %i \n",ee,dwin->At(ee));
1186                  mainLogUtil->logAll(msg);          };
1187          }          if ( cadcount < 10000LL && cadcount > 0LL) downchangeallowed = false;
1188            cadcount++;
1189            //      cout << " cadcount " << cadcount << endl;
1190            //      printf("cadcount %L \n",cadcount);
1191            if ( downchangeallowed ){
1192              //      printf(" change allowed! \n");
1193    
1194              route = (int)headVRL[3];
1195              
1196              if(route!=old_route)
1197                {  
1198                  stringstream oss;        
1199                  oss<<"Changing ROUTE at byte: "<<iByte_tot<<" route = "<<route<<" old value = "<<old_route<<" (download="<<download<<")";
1200                  string msg = oss.str();
1201                  mainLogUtil->logAll(msg);
1202                }
1203    
1204            };
1205    
1206          //TODO: check the cadre number and save this info?          //TODO: check the cadre number and save this info?
1207          //TODO check that the lenght is 8          //TODO check that the lenght is 8

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.13

  ViewVC Help
Powered by ViewVC 1.1.23