265 lines
8.5 KiB
C++
265 lines
8.5 KiB
C++
#include "DirParserThread.h"
|
|
#include "ZTData.h"
|
|
#include "GlobalDefine.h"
|
|
#include "QString"
|
|
#include "QStringList"
|
|
#include <QDate>
|
|
|
|
|
|
|
|
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<CLogElement*> *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<CLogElement *> *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<QList<CLogElement *> *> *ReportDataContainer)
|
|
{
|
|
mMutex.lockForWrite();
|
|
mReportSettings = ReportSettings;
|
|
mReportFilters = ReportFilters;
|
|
mReportDataContainer = ReportDataContainer;
|
|
mMutex.unlock();
|
|
}
|
|
void CDirParserThread::KillThread()
|
|
{
|
|
mMutex.lockForWrite();
|
|
mExecThread = false;
|
|
mMutex.unlock();
|
|
}
|