]> git.netwichtig.de Git - user/henk/code/inspircd.git/blob - include/timer.h
'svn propset -R svn:eol-style CR *' Set to UNIX-style always. Binaries are auto skipp...
[user/henk/code/inspircd.git] / include / timer.h
1 /*       +------------------------------------+\r *       | Inspire Internet Relay Chat Daemon |\r *       +------------------------------------+\r *\r *  InspIRCd: (C) 2002-2007 InspIRCd Development Team\r * See: http://www.inspircd.org/wiki/index.php/Credits\r *\r * This program is free but copyrighted software; see\r *            the file COPYING for details.\r *\r * ---------------------------------------------------\r */\r\r#ifndef INSPIRCD_TIMER_H\r#define INSPIRCD_TIMER_H\r\rclass InspIRCd;\r\r/** Timer class for one-second resolution timers\r * InspTimer provides a facility which allows module\r * developers to create one-shot timers. The timer\r * can be made to trigger at any time up to a one-second\r * resolution. To use InspTimer, inherit a class from\r * InspTimer, then insert your inherited class into the\r * queue using Server::AddTimer(). The Tick() method of\r * your object (which you should override) will be called\r * at the given time.\r */\rclass CoreExport InspTimer : public Extensible\r{\r private:\r /** The triggering time\r         */\r    time_t trigger;\r        /** Number of seconds between triggers\r  */\r    long secs;\r     /** True if this is a repeating timer\r   */\r    bool repeat;\r public:\r  /** Default constructor, initializes the triggering time\r        * @param secs_from_now The number of seconds from now to trigger the timer\r     * @param now The time now\r      * @param repeating Repeat this timer every secs_from_now seconds if set to true\r        */\r    InspTimer(long secs_from_now,time_t now, bool repeating = false)\r       {\r              trigger = now + secs_from_now;\r         secs = secs_from_now;\r          repeat = repeating;\r    }\r\r     /** Default destructor, does nothing.\r   */\r    virtual ~InspTimer() { }\r\r      /** Retrieve the current triggering time\r        */\r    virtual time_t GetTimer()\r      {\r              return trigger;\r        }\r\r     /** Called when the timer ticks.\r        * You should override this method with some useful code to\r     * handle the tick event.\r       */\r    virtual void Tick(time_t TIME) = 0;\r\r   /** Returns true if this timer is set to repeat\r         */\r    bool GetRepeat()\r       {\r              return repeat;\r }\r\r     /** Returns the interval (number of seconds between ticks)\r      * of this timer object.\r        */\r    long GetSecs()\r {\r              return secs;\r   }\r\r     /** Cancels the repeat state of a repeating timer.\r      * If you call this method, then the next time your\r     * timer ticks, it will be removed immediately after.\r   * You should use this method call to remove a recurring\r        * timer if you wish to do so within the timer's Tick\r   * event, as calling TimerManager::DelTimer() from within\r       * the InspTimer::Tick() method is dangerous and may\r    * cause a segmentation fault. Calling CancelRepeat()\r   * is safe in this case.\r        */\r    void CancelRepeat()\r    {\r              repeat = false;\r        }\r};\r\r\r/** This class manages sets of InspTimers, and triggers them at their defined times.\r * This will ensure timers are not missed, as well as removing timers that have\r * expired and allowing the addition of new ones.\r */\rclass CoreExport TimerManager : public Extensible\r{\r protected:\r      /** A group of timers all set to trigger at the same time\r       */\r    typedef std::vector<InspTimer*> timergroup;\r    /** A map of timergroups, each group has a specific trigger time\r        */\r    typedef std::map<time_t, timergroup*> timerlist;\r       /** Set when ticking timers, to prevent deletion while iterating\r        */\r    bool CantDeleteHere;\r   /** Creating server instance\r    */\r    InspIRCd* ServerInstance;\r private:\r\r   /** The current timer set, a map of timergroups\r         */\r    timerlist Timers;\r\r public:\r    /** Constructor\r         */\r    TimerManager(InspIRCd* Instance);\r      /** Tick all pending InspTimers\r         * @param TIME the current system time\r  */\r    void TickTimers(time_t TIME);\r  /** Add an InspTimer\r    * @param T an InspTimer derived class to add\r   * @param secs_from_now You may set this to the number of seconds\r       * from the current time when the timer will tick, or you may just\r      * leave this unset and the values set by the InspTimers constructor\r    * will be used. This is used internally for re-triggering repeating\r    * timers.\r      */\r    void AddTimer(InspTimer* T, long secs_from_now = 0);\r   /** Delete an InspTimer\r         * @param T an InspTimer derived class to delete\r        */\r    void DelTimer(InspTimer* T);\r   /** Tick any timers that have been missed due to lag\r    * @param TIME the current system time\r  */\r    void TickMissedTimers(time_t TIME);\r};\r\r#endif\r\r