Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 

392 řádky
11 KiB

  1. #include "ZTLogFilesMgr.h"
  2. #include <QFileInfo>
  3. #include <QTextStream>
  4. #include <QCoreApplication>
  5. #include <QMessageBox>
  6. #include <QBuffer>
  7. CZTLogFilesMgr::CZTLogFilesMgr()
  8. {
  9. mProgramHandle = 0;
  10. mDirParserThread = new QThread();
  11. mDirParserWorkerThread = new CDirParserThread();
  12. mDirParserWorkerThread->moveToThread(mDirParserThread);
  13. connect(mDirParserThread,SIGNAL(started()),mDirParserWorkerThread,SLOT(ParseDirectories()));
  14. connect(mDirParserThread,SIGNAL(finished()),this,SLOT(ThreadQuit()));
  15. connect(mDirParserThread,SIGNAL(terminated()),this,SLOT(ThreadTerminated()));
  16. connect(mDirParserWorkerThread,SIGNAL(NewLogParsed(QString,bool)),this,SLOT(NewZTLogParsed(QString,bool)));
  17. connect(mDirParserWorkerThread,SIGNAL(ParsingFinished(int)),this,SLOT(DirParsingFinished(int)));
  18. connect(mDirParserWorkerThread,SIGNAL(EmptyDirParsed()),this,SLOT(EmptyDirParsed()));
  19. mDatabaseParsingTimer = new QTimer();
  20. mDatabaseParsingTimer->setInterval(60000);
  21. connect(mDatabaseParsingTimer,SIGNAL(timeout()),this,SLOT(ParsingTimerExpired()));
  22. mSaveDBFile = false;
  23. }
  24. CZTLogFilesMgr::~CZTLogFilesMgr()
  25. {
  26. delete mDirParserThread;
  27. delete mDirParserWorkerThread;
  28. delete mDatabaseParsingTimer;
  29. }
  30. void CZTLogFilesMgr::DestroyZTLogFilesList()
  31. {
  32. mZTLogFilesList.clear();
  33. }
  34. void CZTLogFilesMgr::ParseZTLogFiles(bool RebuildDatabase)
  35. {
  36. mZTLogFilesList.clear();
  37. if(RebuildDatabase == true)
  38. {
  39. mSaveDBFile = true;
  40. // mDirParserWorkerThread->SetParsingInfo(QDir(mLogDatabaseDir),"*.txt",false);
  41. mDirParserThread->start();
  42. //mProgramHandle->ZTLogFilesFetchingBegin(this);
  43. return ;
  44. }
  45. else
  46. {
  47. QDir BaseDir(mLogDatabaseDir);
  48. QString DatabaseFilePath = BaseDir.filePath("ZTLogs.zdb");
  49. // DatabaseFilePath += "Trains.zdb";
  50. QFile* DatabaseFile = new QFile(BaseDir.filePath("ZTLogs.zdb")/*DatabaseFilePath*/);
  51. if(DatabaseFile)
  52. {
  53. if(DatabaseFile->open(QIODevice::ReadOnly | QIODevice::Unbuffered) == false)
  54. {
  55. mSaveDBFile = true;
  56. // mDirParserWorkerThread->SetParsingInfo(QDir(mLogDatabaseDir),"*.txt",false);
  57. mDirParserThread->start();
  58. // mProgramHandle->ZTLogFilesFetchingBegin(this);
  59. delete DatabaseFile;
  60. return ;
  61. }
  62. }
  63. else
  64. {
  65. QMessageBox::information(0,"Erreur","Impossible de créer le fichier DB ZTLog");
  66. return ;
  67. }
  68. QByteArray DBData = DatabaseFile->readAll();
  69. QDataStream *DBStrm = new QDataStream(DBData);
  70. qint32 NBRecords;
  71. *DBStrm >> NBRecords;
  72. for(qint32 i = 0; i < NBRecords; i++)
  73. {
  74. CZTLogFileInfo NewElement;
  75. *DBStrm >> NewElement.mStationName
  76. >> NewElement.mZTStationID
  77. >> NewElement.mStartDateTime
  78. >> NewElement.mEndDateTime
  79. >> NewElement.mZTLogFilePath;
  80. mZTLogFilesList.append(NewElement);
  81. }
  82. DatabaseFile->close();
  83. delete DatabaseFile;
  84. delete DBStrm;
  85. DirParsingFinished(1);
  86. }
  87. }
  88. void CZTLogFilesMgr::NewZTLogParsed(QString FilePath, bool KeepData)
  89. {
  90. Q_UNUSED(KeepData)
  91. // mProgramHandle->ZTLogFilesFetchingTick(this,mZTLogFilesList.size(),FilePath);
  92. ExtractLogInfo(FilePath);
  93. mDatabaseParsingTimer->start();
  94. }
  95. void CZTLogFilesMgr::DirParsingFinished(int Res)
  96. {
  97. qDebug("ZTLog Files Parsing finished with result %d",Res);
  98. mDirParserThread->quit();
  99. mDatabaseParsingTimer->stop();
  100. // mProgramHandle->ZTLogFilesDatabaseLoaded(this,Res);
  101. qDebug("Parsed %d ZTLog files",mZTLogFilesList.size());
  102. if(mSaveDBFile == true)
  103. {
  104. SaveDatabaseFile();
  105. }
  106. }
  107. int CZTLogFilesMgr::GetZTLogFilesCount()
  108. {
  109. return mZTLogFilesList.size();
  110. }
  111. void CZTLogFilesMgr::ParsingTimerExpired()
  112. {
  113. qDebug("ZTLogs Parsing timer timeout");
  114. mDirParserWorkerThread->KillThread();
  115. mDirParserThread->terminate();
  116. DirParsingFinished(2);
  117. }
  118. void CZTLogFilesMgr::EmptyDirParsed()
  119. {
  120. //The thread is not stuck. Kick the timer...
  121. mDatabaseParsingTimer->start();
  122. }
  123. void CZTLogFilesMgr::ThreadQuit()
  124. {
  125. // qDebug("Thread quit slot");
  126. }
  127. void CZTLogFilesMgr::ThreadTerminated()
  128. {
  129. // qDebug("Thread terminated slot");
  130. }
  131. bool CZTLogFilesMgr::ExtractLogInfo(QString LogFilePath)
  132. {
  133. QFileInfo LogFileInfo(LogFilePath);
  134. if(LogFileInfo.fileName() != "ZTLog.txt")
  135. return false;
  136. CZTLogFileInfo NewLogFileInfo;
  137. int line =0;
  138. QFile *LogFile = new QFile(LogFilePath);
  139. if(LogFile)
  140. {
  141. if(LogFile->open(QIODevice::ReadOnly | QIODevice::Text | QIODevice::Unbuffered) == true)
  142. {
  143. QString LogText(LogFile->readAll());
  144. QTextStream strm(&LogText);
  145. strm.seek(0);
  146. QString temp;
  147. //find a valid line
  148. do
  149. {
  150. temp = strm.readLine();
  151. line++;
  152. if(strm.atEnd())
  153. break;
  154. }
  155. while(temp.length() < 10);
  156. // temp = strm.readLine();
  157. QStringList parts = temp.split(" : ");
  158. QString LineText,DateString;
  159. if(parts.size() != 0)
  160. {
  161. LineText.clear();
  162. DateString = parts.at(0);
  163. NewLogFileInfo.mStartDateTime = QDateTime::fromString(DateString,"yyyy/MM/dd - hh:mm:ss.zzz");
  164. }
  165. //go to end of file
  166. QString LastValidLine;
  167. do
  168. {
  169. temp = strm.readLine();
  170. if(temp.size() >=10)
  171. LastValidLine = temp;
  172. }
  173. while(!strm.atEnd());
  174. parts = LastValidLine.split(" : ");
  175. if(parts.size() != 0)
  176. {
  177. DateString = parts.at(0);
  178. NewLogFileInfo.mEndDateTime = QDateTime::fromString(DateString,"yyyy/MM/dd - hh:mm:ss.zzz");
  179. }
  180. LogFile->close();
  181. }
  182. delete LogFile;
  183. }
  184. else
  185. {
  186. return false;
  187. }
  188. NewLogFileInfo.mZTLogFilePath = LogFilePath;
  189. if(LogFilePath.contains("ANG"))
  190. {
  191. NewLogFileInfo.mZTStationID = ANGRIGNON_ZT_ID;
  192. // NewLogFileInfo.mStationName = mProgramHandle->GetStationName(ANGRIGNON_ZT_ID);// "Angrignon";
  193. }
  194. else if(LogFilePath.contains("BUQ4"))
  195. {
  196. NewLogFileInfo.mZTStationID = BERRI_UQAM_ZT_ID;
  197. // NewLogFileInfo.mStationName = mProgramHandle->GetStationName(BERRI_UQAM_ZT_ID);//"Berri-UQAM";
  198. }
  199. else if(LogFilePath.contains("HBOU"))
  200. {
  201. NewLogFileInfo.mZTStationID = HENRI_BOURASSA_ZT_ID;
  202. // NewLogFileInfo.mStationName = mProgramHandle->GetStationName(HENRI_BOURASSA_ZT_ID);//"Henri-Bourassa";
  203. }
  204. else if(LogFilePath.contains("HBGR"))
  205. {
  206. NewLogFileInfo.mZTStationID = HONORE_BEAUGRAND_ZT_ID;
  207. // NewLogFileInfo.mStationName = mProgramHandle->GetStationName(HONORE_BEAUGRAND_ZT_ID);//"Honoré-Beaugrand";
  208. }
  209. else if(LogFilePath.contains("LONG"))
  210. {
  211. NewLogFileInfo.mZTStationID = LONGUEUIL_ZT_ID;
  212. // NewLogFileInfo.mStationName = mProgramHandle->GetStationName(LONGUEUIL_ZT_ID);//"Longueuil";
  213. }
  214. else if(LogFilePath.contains("MMOY"))
  215. {
  216. NewLogFileInfo.mZTStationID = MONTMORENCY_ZT_ID;
  217. // NewLogFileInfo.mStationName = mProgramHandle->GetStationName(MONTMORENCY_ZT_ID);//"Montmorency";
  218. }
  219. // else if(LogFilePath.contains("MMO"))
  220. // {
  221. // NewLogFileInfo.mZTStationID = MONTMORENCY_10_12_ZT_ID;
  222. // // NewLogFileInfo.mStationName = mProgramHandle->GetStationName(MONTMORENCY_10_12_ZT_ID);//"Montmorency 10/12";
  223. // }
  224. // else if(LogFilePath.contains("MMO2"))
  225. // {
  226. // NewLogFileInfo.mZTStationID = MONTMORENCY_10_22_ZT_ID;
  227. // // NewLogFileInfo.mStationName = mProgramHandle->GetStationName(MONTMORENCY_10_22_ZT_ID);///"Montmorency 10/22";
  228. // }
  229. else if(LogFilePath.contains("SMIC"))
  230. {
  231. NewLogFileInfo.mZTStationID = SAINT_MICHEL_ZT_ID;
  232. // NewLogFileInfo.mStationName = mProgramHandle->GetStationName(SAINT_MICHEL_ZT_ID);//"Saint-Michel";
  233. }
  234. else if(LogFilePath.contains("SNW5"))
  235. {
  236. NewLogFileInfo.mZTStationID = SNOWDON_ZT_ID;
  237. // NewLogFileInfo.mStationName = mProgramHandle->GetStationName(SNOWDON_ZT_ID);//"Snowdon";
  238. }
  239. else
  240. {
  241. return false;
  242. }
  243. mZTLogFilesList.append(NewLogFileInfo);
  244. return true;
  245. }
  246. int CZTLogFilesMgr::ParseDir(QDir dir)
  247. {
  248. QStringList LogFilters;
  249. QFileInfoList list;
  250. // QString LogDataDir = mProgramHandle->GetLogDataPath();
  251. LogFilters << "*.txt";
  252. //Load files in base directory
  253. QDir LogDir(dir);
  254. LogDir.setFilter(QDir::Files | QDir::NoDotAndDotDot);
  255. LogDir.setNameFilters(LogFilters);
  256. LogDir.setSorting(QDir::Name);
  257. list = LogDir.entryInfoList();
  258. if(list.size() != 0)
  259. {
  260. //Extract data for each passage
  261. for(int i = 0; i < list.size(); i++)
  262. {
  263. ExtractLogInfo(list.at(i).absoluteFilePath());
  264. }
  265. }
  266. //Check for subdirectories
  267. QDir SubDirectories(dir);
  268. SubDirectories.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
  269. QFileInfoList SubDirList = SubDirectories.entryInfoList();
  270. for(int i = 0; i < SubDirList.size(); i++)
  271. {
  272. ParseDir(QDir(SubDirList.at(i).absoluteFilePath()));
  273. }
  274. return 1;
  275. }
  276. int CZTLogFilesMgr::SaveDatabaseFile()
  277. {
  278. qDebug("Saving ZTLogs.zdb database");
  279. QDir BaseDir(mLogDatabaseDir);
  280. QString DatabaseFilePath = BaseDir.filePath("ZTLogs.zdb");
  281. // DatabaseFilePath += "Trains.zdb";
  282. QFile* DatabaseFile = new QFile(BaseDir.filePath("ZTLogs.zdb")/*DatabaseFilePath*/);
  283. if(DatabaseFile)
  284. {
  285. if(DatabaseFile->open(QIODevice::WriteOnly | QIODevice::Unbuffered) == false)
  286. {
  287. QMessageBox::information(0,"Erreur","Impossible de créer le fichier DB ZTLog");
  288. delete DatabaseFile;
  289. return RET_ERROR;
  290. }
  291. }
  292. else
  293. {
  294. QMessageBox::information(0,"Erreur","Impossible de créer le fichier DB ZTLog");
  295. return RET_ERROR;
  296. }
  297. QByteArray byteArray;
  298. QBuffer FileBuffer(&byteArray);
  299. FileBuffer.open(QIODevice::WriteOnly);
  300. QDataStream *DBStrm = new QDataStream(&FileBuffer);
  301. qint32 NBRecords = mZTLogFilesList.size();
  302. *DBStrm << NBRecords;
  303. for(int i = 0; i < mZTLogFilesList.size(); i++)
  304. {
  305. *DBStrm << mZTLogFilesList.at(i).mStationName
  306. << mZTLogFilesList.at(i).mZTStationID
  307. << mZTLogFilesList.at(i).mStartDateTime
  308. << mZTLogFilesList.at(i).mEndDateTime
  309. << mZTLogFilesList.at(i).mZTLogFilePath;
  310. }
  311. FileBuffer.seek(0);
  312. DatabaseFile->write(FileBuffer.buffer());
  313. DatabaseFile->flush();
  314. FileBuffer.close();
  315. DatabaseFile->close();
  316. delete DatabaseFile;
  317. delete DBStrm;
  318. mSaveDBFile = false;
  319. return RET_OK;
  320. }