Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 

265 linhas
8.5 KiB

  1. #include "DirParserThread.h"
  2. #include "ZTData.h"
  3. #include "GlobalDefine.h"
  4. #include "QString"
  5. #include "QStringList"
  6. #include <QDate>
  7. void CDirParserThread::ParseDirectories()
  8. {
  9. // if(mRootDir.absolutePath().isEmpty() == true)
  10. // {
  11. // emit ParsingFinished(0);
  12. // return;
  13. // }
  14. // ParseDir(mRootDir,mKeepData);
  15. mMutex.lockForWrite();
  16. mExecThread = true;
  17. mMutex.unlock();
  18. GatherReportData(mReportSettings,mReportFilters);
  19. // emit ParsingFinished(1);
  20. qDebug("Worker thread finished");
  21. }
  22. CDirParserThread::CDirParserThread()
  23. {
  24. mExecThread = true;
  25. //Allocate a directory list for each station.
  26. for(int i = 0; i < NB_ZT_ID; i++)
  27. {
  28. mReportDirectoriesList.append(QStringList());
  29. }
  30. }
  31. void CDirParserThread::GatherReportData(CReportProgramSettingsData ReportSettings, CReportConfigData ReportFilters)
  32. {
  33. //First, get a list of the filtered directories
  34. for(int i = 0; i < NB_ZT_ID; i++)
  35. {
  36. mReportDirectoriesList[i].clear();
  37. }
  38. for(int i = 0; i < ReportSettings.mDataSourceDirectoryPaths.size(); i++)
  39. {
  40. QString BaseDir(ReportSettings.mDataSourceDirectoryPaths.at(i));
  41. if(ReportFilters.mReportStationAngrignon == true)
  42. {
  43. QDir AngDir(QString("%1/ANG/").arg(BaseDir));
  44. mReportDirectoriesList[ANGRIGNON_ZT_ID].append(FilterDirectories(AngDir,ReportFilters.mReportStartDate,ReportFilters.mReportEndDate));
  45. }
  46. if(ReportFilters.mReportStationBeaugrand == true)
  47. {
  48. QDir Dir(QString("%1/HBGR/").arg(BaseDir));
  49. mReportDirectoriesList[HONORE_BEAUGRAND_ZT_ID].append(FilterDirectories(Dir,ReportFilters.mReportStartDate,ReportFilters.mReportEndDate));
  50. }
  51. if(ReportFilters.mReportStationVertu == true)
  52. {
  53. QDir Dir(QString("%1/CVRT/").arg(BaseDir));
  54. mReportDirectoriesList[COTE_VERTU_ZT_ID].append(FilterDirectories(Dir,ReportFilters.mReportStartDate,ReportFilters.mReportEndDate));
  55. }
  56. if(ReportFilters.mReportStationBourassa == true)
  57. {
  58. QDir Dir(QString("%1/HBOU/").arg(BaseDir));
  59. mReportDirectoriesList[HENRI_BOURASSA_ZT_ID].append(FilterDirectories(Dir,ReportFilters.mReportStartDate,ReportFilters.mReportEndDate));
  60. }
  61. if(ReportFilters.mReportStationMontmorency == true)
  62. {
  63. QDir Dir(QString("%1/MMO/").arg(BaseDir));
  64. mReportDirectoriesList[MONTMORENCY_ZT_ID].append(FilterDirectories(Dir,ReportFilters.mReportStartDate,ReportFilters.mReportEndDate));
  65. }
  66. if(ReportFilters.mReportStationBerri == true)
  67. {
  68. QDir Dir(QString("%1/BUQ4/").arg(BaseDir));
  69. mReportDirectoriesList[BERRI_UQAM_ZT_ID].append(FilterDirectories(Dir,ReportFilters.mReportStartDate,ReportFilters.mReportEndDate));
  70. }
  71. if(ReportFilters.mReportStationLongueuil == true)
  72. {
  73. QDir Dir(QString("%1/LONG/").arg(BaseDir));
  74. mReportDirectoriesList[LONGUEUIL_ZT_ID].append(FilterDirectories(Dir,ReportFilters.mReportStartDate,ReportFilters.mReportEndDate));
  75. }
  76. if(ReportFilters.mReportStationStMichel == true)
  77. {
  78. QDir Dir(QString("%1/SMIC/").arg(BaseDir));
  79. mReportDirectoriesList[SAINT_MICHEL_ZT_ID].append(FilterDirectories(Dir,ReportFilters.mReportStartDate,ReportFilters.mReportEndDate));
  80. }
  81. if(ReportFilters.mReportStationSnowdon == true)
  82. {
  83. QDir Dir(QString("%1/SNW5/").arg(BaseDir));
  84. mReportDirectoriesList[SNOWDON_ZT_ID].append(FilterDirectories(Dir,ReportFilters.mReportStartDate,ReportFilters.mReportEndDate));
  85. }
  86. }
  87. //Check if we found any directory...
  88. bool found = false;
  89. for(int i = 0; i < mReportDirectoriesList.size(); i++)
  90. {
  91. if(mReportDirectoriesList.at(i).isEmpty() == false)
  92. {
  93. found = true;
  94. break;
  95. }
  96. }
  97. if(found == false)
  98. {
  99. emit ReportProgressStatus("Aucun log correspondant aux filtres n'a été trouvé");
  100. emit ParsingFinished(0);
  101. return;
  102. }
  103. //Now, parse each directory and collect data from ZT files.
  104. for(int station = 0; station < mReportDirectoriesList.size(); station++)
  105. {
  106. if(mReportDirectoriesList[station].isEmpty() == false)
  107. {
  108. QList<CLogElement*> *Container = mReportDataContainer->at(station);
  109. for(int dir =0; dir < mReportDirectoriesList[station].size(); dir++)
  110. {
  111. mMutex.lockForRead();
  112. bool Run = mExecThread;
  113. mMutex.unlock();
  114. if(Run == false)
  115. {
  116. emit ThreadAborted();
  117. return;
  118. }
  119. emit ReportProgressStatus(QString("Analyse des fichiers du répertoire %1").arg(mReportDirectoriesList[station].at(dir)));
  120. ParseDir(QDir(mReportDirectoriesList[station].at(dir)),Container);
  121. }
  122. }
  123. }
  124. emit ParsingFinished(1);
  125. }
  126. QStringList CDirParserThread::FilterDirectories(QDir BaseDir, QDate StartDate, QDate EndDate)
  127. {
  128. QStringList OutputList;
  129. OutputList.clear();
  130. BaseDir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
  131. BaseDir.setSorting(QDir::Name);
  132. //QStringList DirList = BaseDir.entryList();
  133. QFileInfoList DirList = BaseDir.entryInfoList();
  134. for(int i = 0; i < DirList.size(); i++)
  135. {
  136. QString curDir = DirList.at(i).absoluteFilePath();
  137. // QStringList DirNameChunks = curDir.split(BaseDir.separator());
  138. // if(!DirNameChunks.isEmpty())
  139. {
  140. //QDate DirDate;
  141. QString DirDateString = DirList.at(i).baseName().right(8);
  142. QDate DirDate = QDate::fromString(DirDateString,"yyyyMMdd");
  143. //Check if the directory is in the date range
  144. if(DirDate <= EndDate && DirDate >= StartDate)
  145. {
  146. OutputList.append(curDir);
  147. }
  148. }
  149. }
  150. return OutputList;
  151. }
  152. int CDirParserThread::ParseDir(QDir dir, QList<CLogElement *> *Container)
  153. {
  154. mMutex.lockForRead();
  155. bool Run = mExecThread;
  156. mMutex.unlock();
  157. if(Run == false)
  158. {
  159. emit ThreadAborted();
  160. return 0;
  161. }
  162. QStringList LogFilters;
  163. QFileInfoList list;
  164. // QString LogDataDir = mProgramHandle->GetLogDataPath();
  165. LogFilters << "*.bin";
  166. //Load files in base directory
  167. QDir LogDir(dir);
  168. LogDir.setFilter(QDir::Files | QDir::NoDotAndDotDot);
  169. LogDir.setNameFilters(LogFilters);
  170. LogDir.setSorting(QDir::Name);
  171. list = LogDir.entryInfoList();
  172. if(list.size() != 0)
  173. {
  174. //Extract data for each passage
  175. for(int i = 0; i < list.size(); i++)
  176. {
  177. mMutex.lockForRead();
  178. bool Run = mExecThread;
  179. mMutex.unlock();
  180. if(Run == false)
  181. {
  182. emit ThreadAborted();
  183. return 0;
  184. }
  185. //ParseNewLog(list.at(i).filePath(),KeepData);
  186. unsigned int ret;
  187. // emit ReportProgressStatus(QString("Analyse du fichiers %1").arg(list.at(i).fileName()));
  188. CLogElement *NewLog = CTrainLogFileMgr::instance()->OpenTrainLog(list.at(i).filePath(),ret);
  189. if(ret == RET_OK)
  190. {
  191. emit NewLogParsed(NewLog);
  192. mMutex.lockForWrite();
  193. Container->append(NewLog);
  194. mMutex.unlock();
  195. }
  196. }
  197. }
  198. else
  199. {
  200. emit EmptyDirParsed();
  201. }
  202. // //Check for subdirectories
  203. // QDir SubDirectories(dir);
  204. // SubDirectories.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
  205. // QFileInfoList SubDirList = SubDirectories.entryInfoList();
  206. // for(int i = 0; i < SubDirList.size(); i++)
  207. // {
  208. // ParseDir(QDir(SubDirList.at(i).absoluteFilePath()), KeepData);
  209. // }
  210. return 1;
  211. }
  212. //void CDirParserThread::SetParsingInfo(QDir dir, QString Filter, bool KeepData)
  213. //{
  214. // //qDebug("DirParserThread parsing info: dir: %s, Filter: %s",dir.dirName().toAscii().data(),Filter.toAscii().data());
  215. // mRootDir = dir;
  216. // mKeepData = KeepData;
  217. // mFilter = Filter;
  218. //}
  219. void CDirParserThread::SetParsingInfo(CReportProgramSettingsData ReportSettings, CReportConfigData ReportFilters, QList<QList<CLogElement *> *> *ReportDataContainer)
  220. {
  221. mMutex.lockForWrite();
  222. mReportSettings = ReportSettings;
  223. mReportFilters = ReportFilters;
  224. mReportDataContainer = ReportDataContainer;
  225. mMutex.unlock();
  226. }
  227. void CDirParserThread::KillThread()
  228. {
  229. mMutex.lockForWrite();
  230. mExecThread = false;
  231. mMutex.unlock();
  232. }