ZTStats/Sources/DirParserThread.cpp
2024-08-09 12:11:50 -04:00

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();
}