QCron emit signals when entering or exiting a pattern's valid date.

This commit is contained in:
vincent 2016-01-04 17:06:27 +01:00
parent 30cf21b5f4
commit 7dde3df279
4 changed files with 89 additions and 26 deletions

@ -3,8 +3,9 @@
#include <cmath> #include <cmath>
#include <QDateTime>
#include <QDebug> #include <QDebug>
#include <QTime> #include <QTimer>
/******************************************************************************/ /******************************************************************************/
@ -17,10 +18,11 @@ QCron()
/******************************************************************************/ /******************************************************************************/
QCron:: QCron::
QCron(QString & pattern) QCron(const QString & pattern)
{ {
_init(); _init();
_parsePattern(pattern); _parsePattern(pattern);
_checkState();
} }
/******************************************************************************/ /******************************************************************************/
@ -37,6 +39,7 @@ QCron::
_init() _init()
{ {
_is_valid = true; _is_valid = true;
_is_active = false;
_fields[0].setField(MINUTE); _fields[0].setField(MINUTE);
_fields[1].setField(HOUR); _fields[1].setField(HOUR);
_fields[2].setField(DOM); _fields[2].setField(DOM);
@ -47,6 +50,34 @@ _init()
/******************************************************************************/ /******************************************************************************/
void
QCron::
_checkState()
{
int interval_ms = 0;
if (match(QDateTime::currentDateTime()))
{
emit activated();
_is_active = true;
interval_ms = 1000 * 60; // one minute
}
else
{
if (_is_active)
{
emit deactivated();
_is_active = false;
}
interval_ms = QDateTime::currentDateTime().secsTo(next()) * 1000;
}
QTimer::singleShot(interval_ms,
Qt::VeryCoarseTimer,
this,
SLOT(_checkState()));
}
/******************************************************************************/
void void
QCron:: QCron::
_setError(const QString & error) _setError(const QString & error)
@ -59,7 +90,7 @@ _setError(const QString & error)
void void
QCron:: QCron::
_parsePattern(QString & pattern) _parsePattern(const QString & pattern)
{ {
if (pattern.contains("\n")) if (pattern.contains("\n"))
{ {
@ -213,7 +244,7 @@ catchUp(QDateTime & dt, EField field, int value)
void void
QCron:: QCron::
chiche(QDateTime & dt, EField field) _process(QDateTime & dt, EField field)
{ {
QCronNode * node = _fields[field].getRoot(); QCronNode * node = _fields[field].getRoot();
if (NULL == node) if (NULL == node)
@ -223,6 +254,14 @@ chiche(QDateTime & dt, EField field)
node->process(this, dt, field); node->process(this, dt, field);
} }
/******************************************************************************/
QDateTime
QCron::
next()
{
return next(QDateTime::currentDateTime());
}
/******************************************************************************/ /******************************************************************************/
@ -236,7 +275,7 @@ next(QDateTime dt)
//qDebug() << dt << "doesn't match"; //qDebug() << dt << "doesn't match";
for (int i = YEAR; i >= 0; --i) for (int i = YEAR; i >= 0; --i)
{ {
chiche(dt, (EField)i); _process(dt, (EField)i);
if (!dt.isValid()) if (!dt.isValid())
{ {
return dt; return dt;
@ -254,16 +293,6 @@ next(QDateTime dt)
/******************************************************************************/ /******************************************************************************/
QDateTime
QCron::
next(int n)
{
Q_UNUSED(n);
return next(_beginning);
}
/******************************************************************************/
bool bool
QCron:: QCron::
match(const QDateTime & dt) const match(const QDateTime & dt) const

@ -11,13 +11,10 @@ class QCron : public QObject
public: public:
QCron(); QCron();
QCron(QString & pattern); QCron(const QString & pattern);
~QCron(); ~QCron();
// Accessors. // Accessors.
void setBeginning(const QDateTime & date_time)
{ _beginning = date_time; }
bool isValid() const bool isValid() const
{ return _is_valid; } { return _is_valid; }
@ -26,30 +23,32 @@ public:
// Features. // Features.
QDateTime next(int n = 1); QDateTime next();
QDateTime next(QDateTime dt); QDateTime next(QDateTime dt);
void catchUp(QDateTime & dt, EField field, int value); void catchUp(QDateTime & dt, EField field, int value);
bool match(const QDateTime & dt) const; bool match(const QDateTime & dt) const;
void add(QDateTime & dt, EField field, int value); void add(QDateTime & dt, EField field, int value);
signals: signals:
void activated(); void activated();
void deactivated(); void deactivated();
private: private:
bool _is_valid; bool _is_valid;
bool _is_active;
QString _error; QString _error;
QCronField _fields[6]; QCronField _fields[6];
QDateTime _beginning;
void _init(); void _init();
void _setError(const QString & error); void _setError(const QString & error);
void _parsePattern(QString & pattern); void _parsePattern(const QString & pattern);
void _parseField(QString & field_str, void _parseField(QString & field_str,
EField field); EField field);
QString _validCharacters(EField field); QString _validCharacters(EField field);
void chiche(QDateTime & dt, EField field); void _process(QDateTime & dt, EField field);
private slots:
void _checkState();
}; };
#endif #endif

@ -22,8 +22,7 @@ QCronTest::
actual(QString & pattern) actual(QString & pattern)
{ {
QCron c(pattern); QCron c(pattern);
c.setBeginning(QDateTime(_dnow, _tnow)); return c.next(QDateTime(_dnow, _tnow));
return c.next();
} }
/******************************************************************************/ /******************************************************************************/
@ -392,4 +391,35 @@ excludeHolidays()
/******************************************************************************/ /******************************************************************************/
void
QCronTest::
signalUse()
{
QCron c("*/2 * * * * *");
connect(&c, SIGNAL(activated()),
this, SLOT(cronActivated()));
connect(&c, SIGNAL(deactivated()),
this, SLOT(cronDeactivated()));
// Too long to test
}
/******************************************************************************/
void
QCronTest::
cronActivated()
{
qDebug() << "ACTIVATED";
}
/******************************************************************************/
void QCronTest::
cronDeactivated()
{
qDebug() << "DEACTIVATED";
}
/******************************************************************************/
QTEST_MAIN(QCronTest) QTEST_MAIN(QCronTest)

@ -8,6 +8,10 @@ class QCronTest : public QObject
{ {
Q_OBJECT Q_OBJECT
public slots:
void cronActivated();
void cronDeactivated();
private slots: private slots:
void init(); void init();
void years(); void years();
@ -17,6 +21,7 @@ private slots:
void realLife(); void realLife();
void holidays(); void holidays();
void excludeHolidays(); void excludeHolidays();
void signalUse();
private: private:
QDate _dnow; QDate _dnow;