From edf728d80adabf286b29dbf5a0f5844e64885c0c Mon Sep 17 00:00:00 2001
From: vincent <vincent@groupe-sa.fr>
Date: Mon, 4 Jan 2016 14:54:43 +0100
Subject: [PATCH] Add QCronHolidayNode.

---
 src/qcronfield.cpp  | 12 ++++++++++++
 src/qcronnode.cpp   | 42 ++++++++++++++++++++++++++++++++++++++++--
 src/qcronnode.hpp   | 29 +++++++++++++++++++++++++++++
 test/qcron_test.cpp | 18 +++++++++---------
 4 files changed, 90 insertions(+), 11 deletions(-)

diff --git a/src/qcronfield.cpp b/src/qcronfield.cpp
index ae10e8c..791d16e 100644
--- a/src/qcronfield.cpp
+++ b/src/qcronfield.cpp
@@ -131,6 +131,18 @@ _parseNode(QString & str)
     {
         node = _parseList(str);
     }
+    else if (_field == DOM)
+    {
+        if ('F' == c)
+        {
+            str.remove(0, 1);
+            node = new QCronHolidayNode();
+        }
+        else if ('f' == c)
+        {
+
+        }
+    }
     if (NULL == node)
     {
         throw QCronFieldException(QString("Unexpected character %1").arg(c));
diff --git a/src/qcronnode.cpp b/src/qcronnode.cpp
index 965ea09..ed9c8d0 100644
--- a/src/qcronnode.cpp
+++ b/src/qcronnode.cpp
@@ -1,8 +1,7 @@
 #include "qcronnode.hpp"
 #include "qcronfield.hpp"
 #include "qcron.hpp"
-
-#include <QDebug>
+#include "holiday.hpp"
 
 #include <QDebug>
 
@@ -328,3 +327,42 @@ match(int tu) const
 
 /******************************************************************************/
 /******************************************************************************/
+
+int
+QCronHolidayNode::
+next(int t) const
+{
+    Q_UNUSED(t)
+    //return Holiday::next(t);
+    return -1;
+}
+
+/******************************************************************************/
+
+void
+QCronHolidayNode::
+process(QCron * cron,
+        QDateTime & dt,
+        EField field)
+{
+    Q_UNUSED(cron);
+    if (DOM == field)
+    {
+        QDate next_holiday = Holiday::next(dt.date());
+        dt.setDate(next_holiday);
+    }
+    qFatal("Should not be there.");
+}
+
+/******************************************************************************/
+
+bool
+QCronHolidayNode::
+match(int tu) const
+{
+    Q_UNUSED(tu);
+    return false;
+}
+
+/******************************************************************************/
+/******************************************************************************/
diff --git a/src/qcronnode.hpp b/src/qcronnode.hpp
index 6a8ed4b..7699775 100644
--- a/src/qcronnode.hpp
+++ b/src/qcronnode.hpp
@@ -27,10 +27,14 @@ protected:
     QCronField * _field;
 };
 
+/******************************************************************************/
+
 class QCronValueNode : public QCronNode
 {
 };
 
+/******************************************************************************/
+
 class QCronIntNode : public QCronValueNode
 {
 public:
@@ -49,6 +53,8 @@ private:
     int _value;
 };
 
+/******************************************************************************/
+
 class QCronStrNode : public QCronValueNode
 {
 public:
@@ -59,6 +65,8 @@ public:
                          EField field) Q_DECL_OVERRIDE;
 };
 
+/******************************************************************************/
+
 class QCronAllNode : public QCronValueNode
 {
 public:
@@ -69,6 +77,8 @@ public:
                          EField field) Q_DECL_OVERRIDE;
 };
 
+/******************************************************************************/
+
 class QCronRangeNode : public QCronNode
 {
 public:
@@ -90,6 +100,8 @@ private:
     const QCronIntNode * _end;
 };
 
+/******************************************************************************/
+
 class QCronEveryNode : public QCronNode
 {
 public:
@@ -107,6 +119,8 @@ private:
     QCronIntNode * _freq;
 };
 
+/******************************************************************************/
+
 class QCronListNode : public QCronNode
 {
 public:
@@ -122,4 +136,19 @@ private:
     QList<QCronNode*> _nodes;
 };
 
+/******************************************************************************/
+
+class QCronHolidayNode : public QCronNode
+{
+public:
+    virtual int next(int t) const;
+
+    virtual bool match(int tu) const;
+    virtual void process(QCron * cron,
+                         QDateTime & dt,
+                         EField field);
+};
+
+/******************************************************************************/
+
 #endif
diff --git a/test/qcron_test.cpp b/test/qcron_test.cpp
index 76956d1..502ff16 100644
--- a/test/qcron_test.cpp
+++ b/test/qcron_test.cpp
@@ -28,6 +28,15 @@ actual(QString & pattern)
 
 /******************************************************************************/
 
+QDateTime
+QCronTest::
+now()
+{
+    return QDateTime(_dnow, _tnow);
+}
+
+/******************************************************************************/
+
 void
 QCronTest::
 minutes()
@@ -143,15 +152,6 @@ minutes()
 
 /******************************************************************************/
 
-QDateTime
-QCronTest::
-now()
-{
-    return QDateTime(_dnow, _tnow);
-}
-
-/******************************************************************************/
-
 
 void
 QCronTest::