Index: sources/maintimer.cpp =================================================================== diff -u -r2437559b2d4cd4c2ac6a926b4f55652e55e1f616 -rd04653f0fbf1ed98178b6c7094beb4ec226a777f --- sources/maintimer.cpp (.../maintimer.cpp) (revision 2437559b2d4cd4c2ac6a926b4f55652e55e1f616) +++ sources/maintimer.cpp (.../maintimer.cpp) (revision d04653f0fbf1ed98178b6c7094beb4ec226a777f) @@ -14,6 +14,7 @@ #include "maintimer.h" //Qt +#include //Project #include "logger.h" @@ -55,6 +56,27 @@ void MainTimer::quit() { } /*! + * \brief MainTimer::isDateChanged + * \details Checks the date has been changed + * \return true if date changed. + */ +bool MainTimer::isDateChanged() +{ + static int oy,om,od; // old date + int cy,cm,cd; // current date + QDate::currentDate().getDate(&cy, &cm, &cd); + if (oy == cy && om == cm && od == cd) { + return false; + } + else { + oy = cy; + om = cm; + od = cd; + } + return true; +} + +/*! * \brief MainTimer::timerEvent * \details This event handler has been re-implemented in here * to receive timer events for the object @@ -64,4 +86,6 @@ void MainTimer::timerEvent(QTimerEvent *) { emit didTimeout(); + if (isDateChanged()) + emit didDateChange(); } Index: sources/maintimer.h =================================================================== diff -u -rc6a09899d2e46dc0bda5a6b994aa257953626f97 -rd04653f0fbf1ed98178b6c7094beb4ec226a777f --- sources/maintimer.h (.../maintimer.h) (revision c6a09899d2e46dc0bda5a6b994aa257953626f97) +++ sources/maintimer.h (.../maintimer.h) (revision d04653f0fbf1ed98178b6c7094beb4ec226a777f) @@ -39,9 +39,10 @@ void quit(); private: - + bool isDateChanged(); signals: void didTimeout(); + void didDateChange(); protected: void timerEvent(QTimerEvent *) override; Index: sources/storage/filehandler.cpp =================================================================== diff -u -r15de0cd12dad1ea5107c52e5ed89280bc9e29b1d -rd04653f0fbf1ed98178b6c7094beb4ec226a777f --- sources/storage/filehandler.cpp (.../filehandler.cpp) (revision 15de0cd12dad1ea5107c52e5ed89280bc9e29b1d) +++ sources/storage/filehandler.cpp (.../filehandler.cpp) (revision d04653f0fbf1ed98178b6c7094beb4ec226a777f) @@ -17,9 +17,11 @@ #include #include #include - - +#include +#include +#include // Project +#include "logger.h" // namespace using namespace Storage; @@ -96,3 +98,44 @@ return result; } // coco end + +/*! + * \brief FileHandler::removeFiles + * \details + * \param vFolder + * \param vFilter + * \param vDateOlderThan + * \return + */ +int FileHandler::removeFiles(const QStringList &vFolders, const QStringList &vNameFilter, const QDate &vDateOlderThan) +{ + int countRemoved = 0; + QStringList removed; + for (const auto &folder : vFolders) { + QDir dir(folder); + dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks); + dir.setSorting(QDir::Time | QDir::Reversed); + QFileInfoList infoList = dir.entryInfoList(vNameFilter); + for (const auto &info : infoList) { + QDateTime fileTime = info.lastModified(); + QString fileName = info.absoluteFilePath(); + if (fileTime.isValid()) { + if (fileTime.date() < vDateOlderThan) { + if (QFile::remove(fileName)) { + removed += fileName; + ++countRemoved; + } + else { + LOG_ERROR(QString("Can't delete file : ") + fileName); + } + } + } + else { + LOG_ERROR(QString("Can't get last modified date of file : ") + fileName); + } + } + } + + qDebug() << countRemoved << vDateOlderThan << removed; + return countRemoved; +} Index: sources/storage/filehandler.h =================================================================== diff -u -r31b9ae63410e7ca23f0f849e38368880e4c402b4 -rd04653f0fbf1ed98178b6c7094beb4ec226a777f --- sources/storage/filehandler.h (.../filehandler.h) (revision 31b9ae63410e7ca23f0f849e38368880e4c402b4) +++ sources/storage/filehandler.h (.../filehandler.h) (revision d04653f0fbf1ed98178b6c7094beb4ec226a777f) @@ -15,6 +15,7 @@ // Qt #include +class QDate; namespace Storage { @@ -34,6 +35,8 @@ static bool read (const QString &vFileName, QString &vContent); static int copyFolder(const QString &vSource, const QString &vDestination); + + static int removeFiles(const QStringList &vFolders, const QStringList &vNameFilter, const QDate &vDateOlderThan); }; } Index: sources/storage/logger.cpp =================================================================== diff -u -r3453d86e870b126f49f9582321dbf58928c4f396 -rd04653f0fbf1ed98178b6c7094beb4ec226a777f --- sources/storage/logger.cpp (.../logger.cpp) (revision 3453d86e870b126f49f9582321dbf58928c4f396) +++ sources/storage/logger.cpp (.../logger.cpp) (revision d04653f0fbf1ed98178b6c7094beb4ec226a777f) @@ -22,9 +22,11 @@ #include // Project +#include "threads.h" #include "storageglobals.h" +#include "maintimer.h" #include "filehandler.h" -#include "threads.h" +#include "format.h" using namespace Storage; @@ -34,7 +36,9 @@ * \param parent - QObject parent owner object. * Qt handles the children destruction by their parent objects life-cycle. */ -Logger::Logger(QObject *parent) : QObject(parent) { } +Logger::Logger(QObject *parent) : QObject(parent) { + _prefix = QFileInfo(qApp->applicationFilePath()).baseName(); +} /*! * \brief Logger::init @@ -102,8 +106,16 @@ connect(&_exportWatcher, SIGNAL(finished()), this , SLOT(onExport())); + connect(this, SIGNAL(didLog(QString,LogType)), this, SLOT( onLog(QString,LogType))); + + + connect(&_MainTimer, SIGNAL( didDateChange ()), + this , SLOT( concurrentRemoveOldLogs())); + + connect(&_removeOldLogsWatcher, SIGNAL(finished ()), + this , SLOT(onRemoveOldLogs())); } /*! @@ -223,17 +235,17 @@ void Logger::log(const QString &vContent, LogType vLogType) { QString date = QDate::currentDate().toString(_dateFormat); - QString fileName = date + _dateSeparator; + QString fileName = date + _dateSeparator + _prefix; switch (vLogType) { case LogType::eLogBasic: case LogType::eLogEvent: case LogType::eLogDatum: case LogType::eLogError: - fileName += _logFileNameBase[vLogType]; + fileName += _logFileNameExt[vLogType]; break; default: - fileName += _logFileNameBase[LogType::eLogError]; + fileName += _logFileNameExt[LogType::eLogError]; LOG_ERROR(tr("Incorrect type of logging %1").arg(vLogType)); } @@ -287,3 +299,35 @@ emit didExport(); } // coco end + +/*! + * \brief Logger::concurrentRemoveOldLogs + * \details + * + * \return always returns true for now. + * \note This method uses QtConcurrent run to execute the FileHandler copyFolder method. + */ +bool Logger::concurrentRemoveOldLogs() +{ + // coco begin validated: This needs user interaction to check the old files deleted + // has been tested manually + QString mLogsLocation = "./"; //Storage::Log_Base_Path_Name; + QStringList mLogFileFilter ; + QStringList mLogFolders ; + + mLogFolders = Format::toStringList(_logBasePathNames.values(), true, mLogsLocation); + mLogFileFilter = Format::toStringList(_logFileNameExt .values(), true, "*"); + QDate mOlderThan = QDate().currentDate().addDays(-1 * _removeOldLogsDaysOlderThan); + QFuture mFuture = QtConcurrent::run(&FileHandler::removeFiles, mLogFolders, mLogFileFilter, mOlderThan); + _removeOldLogsWatcher.setFuture(mFuture); + return true; +} +// coco end + +void Logger::onRemoveOldLogs() +{ + // coco begin validated: This needs user interaction to export to USB device + // has been tested manually + emit didRemoveOldLogs(); +} +// coco end Index: sources/storage/logger.h =================================================================== diff -u -r30f83b2813e68ae3c2806399bf808b642c215b67 -rd04653f0fbf1ed98178b6c7094beb4ec226a777f --- sources/storage/logger.h (.../logger.h) (revision 30f83b2813e68ae3c2806399bf808b642c215b67) +++ sources/storage/logger.h (.../logger.h) (revision d04653f0fbf1ed98178b6c7094beb4ec226a777f) @@ -70,30 +70,31 @@ private: QDir _dir; + QString _prefix; QHash _logPathNames; - QHash _logBasePathNames { - { LogType::eLogBasic, "log/" }, - { LogType::eLogEvent, "log/" }, - { LogType::eLogDatum, "log/" }, - { LogType::eLogError, "log/" }, + const QHash _logBasePathNames { + { LogType::eLogBasic, "log/" }, + { LogType::eLogEvent, "log/" }, + { LogType::eLogDatum, "log/" }, + { LogType::eLogError, "service/" }, }; - QHash _logPrefix { // Will be used for the logging in the file + const QHash _logPrefix { // Will be used for the logging in the file { LogType::eLogBasic, "" }, // Object itself tells what it is { LogType::eLogEvent, "E" }, { LogType::eLogDatum, "D" }, { LogType::eLogError, "" }, // it has its own file and all the content is Error }; - QHash _logTypeName { // Will be used for for information + const QHash _logTypeName { // Will be used for for information { LogType::eLogBasic, "Basic" }, // Object itself tells what it is - { LogType::eLogEvent, "Event" }, - { LogType::eLogDatum, "Datum" }, + { LogType::eLogEvent, "Event" }, + { LogType::eLogDatum, "Datum" }, { LogType::eLogError, "Error" }, // it has its own file and all the content is Error }; - QHash _logFileNameBase { - { LogType::eLogBasic, "denali.log" }, - { LogType::eLogEvent, "denali.log" }, - { LogType::eLogDatum, "denali.log" }, - { LogType::eLogError, "denali.err" }, + const QHash _logFileNameExt { + { LogType::eLogBasic, ".log" }, + { LogType::eLogEvent, ".log" }, + { LogType::eLogDatum, ".log" }, + { LogType::eLogError, ".err" }, }; const char *_dateFormat = "yyyy_MM_dd"; @@ -105,7 +106,10 @@ QString _logFileName = ""; QFutureWatcher _exportWatcher; + QFutureWatcher _removeOldLogsWatcher; + const quint8 _removeOldLogsDaysOlderThan = 3; + QThread *_thread = nullptr; bool _init = false; @@ -144,6 +148,13 @@ */ void didExport(); +// ----- Remove Old Logs structure +private slots: + bool concurrentRemoveOldLogs(); + void onRemoveOldLogs(); +signals: + void didRemoveOldLogs(); + // ----- logging structure private slots: void onLog (const QString &vContent, LogType vLogType); Index: sources/utility/format.cpp =================================================================== diff -u -rb798668f16ad0967ab97e96f5f9a2cdd821e899f -rd04653f0fbf1ed98178b6c7094beb4ec226a777f --- sources/utility/format.cpp (.../format.cpp) (revision b798668f16ad0967ab97e96f5f9a2cdd821e899f) +++ sources/utility/format.cpp (.../format.cpp) (revision d04653f0fbf1ed98178b6c7094beb4ec226a777f) @@ -99,3 +99,19 @@ mData += '\0'; return mData; } + +QStringList Format::toStringList(const QList vList, bool vRemoveDuplicate, QString vPrefix) +{ + QStringList list; + for (const auto &listItem : vList) { + auto item = vPrefix + listItem; + if ( vRemoveDuplicate ) { + if ( ! list.contains(item) ) { + list += item; + } + } + else + list += item; + } + return list; +} Index: sources/utility/format.h =================================================================== diff -u -rb798668f16ad0967ab97e96f5f9a2cdd821e899f -rd04653f0fbf1ed98178b6c7094beb4ec226a777f --- sources/utility/format.h (.../format.h) (revision b798668f16ad0967ab97e96f5f9a2cdd821e899f) +++ sources/utility/format.h (.../format.h) (revision d04653f0fbf1ed98178b6c7094beb4ec226a777f) @@ -28,5 +28,6 @@ static QByteArray toHexByteArray(const QByteArray &vData , char separator = '.'); static QString toHexString (const QByteArray &vData , char separator = '.'); static QByteArray fromVariant (const QVariant &vData ); + static QStringList toStringList (const QList vList, bool vRemoveDuplicate = false, QString vPrefix = ""); };