]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - include/timer.h
Make this work on ancient gcc's
[user/henk/code/inspircd.git] / include / timer.h
index da8e742d9f58442c8fd8761be1502b50f5577410..2d12d84e5239f92027fd324141b74dc1663e6058 100644 (file)
@@ -30,25 +30,71 @@ class InspTimer : public Extensible
        /** The triggering time
         */
        time_t trigger;
+       /** Number of seconds between triggers
+        */
+       long secs;
+       /** True if this is a repeating timer
+        */
+       bool repeat;
  public:
        /** Default constructor, initializes the triggering time
+        * @param secs_from_now The number of seconds from now to trigger the timer
+        * @param now The time now
+        * @param repeating Repeat this timer every secs_from_now seconds if set to true
         */
-       InspTimer(long secs_from_now,time_t now)
+       InspTimer(long secs_from_now,time_t now, bool repeating = false)
        {
                trigger = now + secs_from_now;
+               secs = secs_from_now;
+               repeat = repeating;
        }
+
        /** Default destructor, does nothing.
         */
        virtual ~InspTimer() { }
+
        /** Retrieve the current triggering time
         */
        virtual time_t GetTimer()
        {
                return trigger;
        }
+
        /** Called when the timer ticks.
+        * You should override this method with some useful code to
+        * handle the tick event.
         */
        virtual void Tick(time_t TIME) = 0;
+
+       /** Returns true if this timer is set to repeat
+        */
+       bool GetRepeat()
+       {
+               return repeat;
+       }
+
+       /** Returns the interval (number of seconds between ticks)
+        * of this timer object.
+        */
+       long GetSecs()
+       {
+               return secs;
+       }
+
+       /** Cancels the repeat state of a repeating timer.
+        * If you call this method, then the next time your
+        * timer ticks, it will be removed immediately after.
+        * You should use this method call to remove a recurring
+        * timer if you wish to do so within the timer's Tick
+        * event, as calling TimerManager::DelTimer() from within
+        * the InspTimer::Tick() method is dangerous and may
+        * cause a segmentation fault. Calling CancelRepeat()
+        * is safe in this case.
+        */
+       void CancelRepeat()
+       {
+               repeat = false;
+       }
 };
 
 
@@ -79,8 +125,13 @@ class TimerManager : public Extensible
        void TickTimers(time_t TIME);
        /** Add an InspTimer
         * @param T an InspTimer derived class to add
+        * @param secs_from_now You may set this to the number of seconds
+        * from the current time when the timer will tick, or you may just
+        * leave this unset and the values set by the InspTimers constructor
+        * will be used. This is used internally for re-triggering repeating
+        * timers.
         */
-       void AddTimer(InspTimer* T);
+       void AddTimer(InspTimer* T, long secs_from_now = 0);
        /** Delete an InspTimer
         * @param T an InspTimer derived class to delete
         */