#include "DirParserThread.h" #include "ZTData.h" #include "GlobalDefine.h" #include "QString" #include "QStringList" #include void CDirParserThread::ParseDirectories() { // if(mRootDir.absolutePath().isEmpty() == true) // { // emit ParsingFinished(0); // return; // } // ParseDir(mRootDir,mKeepData); mMutex.lockForWrite(); mExecThread = true; mMutex.unlock(); GatherReportData(mReportSettings,mReportFilters); // emit ParsingFinished(1); qDebug("Worker thread finished"); } CDirParserThread::CDirParserThread() { mExecThread = true; //Allocate a directory list for each station. for(int i = 0; i < NB_ZT_ID; i++) { mReportDirectoriesList.append(QStringList()); } } void CDirParserThread::GatherReportData(CReportProgramSettingsData ReportSettings, CReportConfigData ReportFilters) { //First, get a list of the filtered directories for(int i = 0; i < NB_ZT_ID; i++) { mReportDirectoriesList[i].clear(); } for(int i = 0; i < ReportSettings.mDataSourceDirectoryPaths.size(); i++) { QString BaseDir(ReportSettings.mDataSourceDirectoryPaths.at(i)); if(ReportFilters.mReportStationAngrignon == true) { QDir AngDir(QString("%1/ANG/").arg(BaseDir)); mReportDirectoriesList[ANGRIGNON_ZT_ID].append(FilterDirectories(AngDir,ReportFilters.mReportStartDate,ReportFilters.mReportEndDate)); } if(ReportFilters.mReportStationBeaugrand == true) { QDir Dir(QString("%1/HBGR/").arg(BaseDir)); mReportDirectoriesList[HONORE_BEAUGRAND_ZT_ID].append(FilterDirectories(Dir,ReportFilters.mReportStartDate,ReportFilters.mReportEndDate)); } if(ReportFilters.mReportStationVertu == true) { QDir Dir(QString("%1/CVRT/").arg(BaseDir)); mReportDirectoriesList[COTE_VERTU_ZT_ID].append(FilterDirectories(Dir,ReportFilters.mReportStartDate,ReportFilters.mReportEndDate)); } if(ReportFilters.mReportStationBourassa == true) { QDir Dir(QString("%1/HBOU/").arg(BaseDir)); mReportDirectoriesList[HENRI_BOURASSA_ZT_ID].append(FilterDirectories(Dir,ReportFilters.mReportStartDate,ReportFilters.mReportEndDate)); } if(ReportFilters.mReportStationMontmorency == true) { QDir Dir(QString("%1/MMO/").arg(BaseDir)); mReportDirectoriesList[MONTMORENCY_ZT_ID].append(FilterDirectories(Dir,ReportFilters.mReportStartDate,ReportFilters.mReportEndDate)); } if(ReportFilters.mReportStationBerri == true) { QDir Dir(QString("%1/BUQ4/").arg(BaseDir)); mReportDirectoriesList[BERRI_UQAM_ZT_ID].append(FilterDirectories(Dir,ReportFilters.mReportStartDate,ReportFilters.mReportEndDate)); } if(ReportFilters.mReportStationLongueuil == true) { QDir Dir(QString("%1/LONG/").arg(BaseDir)); mReportDirectoriesList[LONGUEUIL_ZT_ID].append(FilterDirectories(Dir,ReportFilters.mReportStartDate,ReportFilters.mReportEndDate)); } if(ReportFilters.mReportStationStMichel == true) { QDir Dir(QString("%1/SMIC/").arg(BaseDir)); mReportDirectoriesList[SAINT_MICHEL_ZT_ID].append(FilterDirectories(Dir,ReportFilters.mReportStartDate,ReportFilters.mReportEndDate)); } if(ReportFilters.mReportStationSnowdon == true) { QDir Dir(QString("%1/SNW5/").arg(BaseDir)); mReportDirectoriesList[SNOWDON_ZT_ID].append(FilterDirectories(Dir,ReportFilters.mReportStartDate,ReportFilters.mReportEndDate)); } } //Check if we found any directory... bool found = false; for(int i = 0; i < mReportDirectoriesList.size(); i++) { if(mReportDirectoriesList.at(i).isEmpty() == false) { found = true; break; } } if(found == false) { emit ReportProgressStatus("Aucun log correspondant aux filtres n'a été trouvé"); emit ParsingFinished(0); return; } //Now, parse each directory and collect data from ZT files. for(int station = 0; station < mReportDirectoriesList.size(); station++) { if(mReportDirectoriesList[station].isEmpty() == false) { QList *Container = mReportDataContainer->at(station); for(int dir =0; dir < mReportDirectoriesList[station].size(); dir++) { mMutex.lockForRead(); bool Run = mExecThread; mMutex.unlock(); if(Run == false) { emit ThreadAborted(); return; } emit ReportProgressStatus(QString("Analyse des fichiers du répertoire %1").arg(mReportDirectoriesList[station].at(dir))); ParseDir(QDir(mReportDirectoriesList[station].at(dir)),Container); } } } emit ParsingFinished(1); } QStringList CDirParserThread::FilterDirectories(QDir BaseDir, QDate StartDate, QDate EndDate) { QStringList OutputList; OutputList.clear(); BaseDir.setFilter(QDir::Dirs | QDir::NoDotAndDotDot); BaseDir.setSorting(QDir::Name); //QStringList DirList = BaseDir.entryList(); QFileInfoList DirList = BaseDir.entryInfoList(); for(int i = 0; i < DirList.size(); i++) { QString curDir = DirList.at(i).absoluteFilePath(); // QStringList DirNameChunks = curDir.split(BaseDir.separator()); // if(!DirNameChunks.isEmpty()) { //QDate DirDate; QString DirDateString = DirList.at(i).baseName().right(8); QDate DirDate = QDate::fromString(DirDateString,"yyyyMMdd"); //Check if the directory is in the date range if(DirDate <= EndDate && DirDate >= StartDate) { OutputList.append(curDir); } } } return OutputList; } int CDirParserThread::ParseDir(QDir dir, QList *Container) { mMutex.lockForRead(); bool Run = mExecThread; mMutex.unlock(); if(Run == false) { emit ThreadAborted(); return 0; } QStringList LogFilters; QFileInfoList list; // QString LogDataDir = mProgramHandle->GetLogDataPath(); LogFilters << "*.bin"; //Load files in base directory QDir LogDir(dir); LogDir.setFilter(QDir::Files | QDir::NoDotAndDotDot); LogDir.setNameFilters(LogFilters); LogDir.setSorting(QDir::Name); list = LogDir.entryInfoList(); if(list.size() != 0) { //Extract data for each passage for(int i = 0; i < list.size(); i++) { mMutex.lockForRead(); bool Run = mExecThread; mMutex.unlock(); if(Run == false) { emit ThreadAborted(); return 0; } //ParseNewLog(list.at(i).filePath(),KeepData); unsigned int ret; // emit ReportProgressStatus(QString("Analyse du fichiers %1").arg(list.at(i).fileName())); CLogElement *NewLog = CTrainLogFileMgr::instance()->OpenTrainLog(list.at(i).filePath(),ret); if(ret == RET_OK) { emit NewLogParsed(NewLog); mMutex.lockForWrite(); Container->append(NewLog); mMutex.unlock(); } } } else { emit EmptyDirParsed(); } // //Check for subdirectories // QDir SubDirectories(dir); // SubDirectories.setFilter(QDir::Dirs | QDir::NoDotAndDotDot); // QFileInfoList SubDirList = SubDirectories.entryInfoList(); // for(int i = 0; i < SubDirList.size(); i++) // { // ParseDir(QDir(SubDirList.at(i).absoluteFilePath()), KeepData); // } return 1; } //void CDirParserThread::SetParsingInfo(QDir dir, QString Filter, bool KeepData) //{ // //qDebug("DirParserThread parsing info: dir: %s, Filter: %s",dir.dirName().toAscii().data(),Filter.toAscii().data()); // mRootDir = dir; // mKeepData = KeepData; // mFilter = Filter; //} void CDirParserThread::SetParsingInfo(CReportProgramSettingsData ReportSettings, CReportConfigData ReportFilters, QList *> *ReportDataContainer) { mMutex.lockForWrite(); mReportSettings = ReportSettings; mReportFilters = ReportFilters; mReportDataContainer = ReportDataContainer; mMutex.unlock(); } void CDirParserThread::KillThread() { mMutex.lockForWrite(); mExecThread = false; mMutex.unlock(); }