Remove dynamic exceptions
[anna.git] / include / anna / timex / TimeEvent.hpp
1 // ANNA - Anna is Not Nothingness Anymore                                                         //
2 //                                                                                                //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo                         //
4 //                                                                                                //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite                           //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
7
8
9 #ifndef anna_timex_TimeEvent_hpp
10 #define anna_timex_TimeEvent_hpp
11
12 #include <anna/core/RuntimeException.hpp>
13 #include <anna/config/defines.hpp>
14 #include <anna/core/util/Millisecond.hpp>
15
16 namespace anna {
17
18 namespace timex {
19
20 class Engine;
21 class TimeEventObserver;
22
23 /**
24    Clase base de los eventos de los eventos de tiempo.
25 */
26 class TimeEvent {
27 public:
28   /**
29      Sinonimo usado para el identificador de eventos de tiempo.
30
31      Se define como un ptrnumber para facilitar la construccion de instancias sin tener que indicar
32      un Id en particular, ya que se usara su direccion de memoria como identificador.
33   */
34   typedef anna::ptrnumber Id;
35
36   /**
37      Destructor.
38      Si un evento de tiempo esta activo y se invoca a su destructor se invocaria automaticamente a
39      Engine::cancel para terminar con la ejecucin de este evento.
40   */
41   virtual ~TimeEvent();
42
43   /**
44      Devuelve el identificador de este evento.
45      \return El identificador de este evento.
46   */
47   Id getId() const { return a_id; }
48
49   /**
50      Devuelve la duracion maxima a este evento indicada en milisegundos.
51      @return La duracion maxima de este evento indicada en milisegundos.
52   */
53   const Millisecond & getTimeout() const { return a_timeout; }
54
55   /**
56      Devuelve la instancia del objeto encargado de gestionar el espacio asociado a
57      esta instancia. Puede ser NULL.
58      \return La instancia del objeto encargado de gestionar el espacio asociado a
59      esta instancia.
60   */
61   const TimeEventObserver* getObserver() const { return a_observer; }
62
63   /**
64      Establece el identificador de este evento de tiempo.
65      \param id El identificador de evento para esta instancia.
66
67      \warning Exclusivamente uso interno.
68   */
69   void setId(const Id id) { a_id = id; }
70
71   /**
72      Establece la duracion de este evento indicada en milisegundos.
73      \param timeout Establece la duracion de este evento.
74   */
75   void setTimeout(const Millisecond & timeout) { a_timeout = timeout; }
76
77   /**
78      Establece la instancia de objeto encargado de gestionar el espacio asociado a esta
79      instancia. Si no es NULL sera invocado cuando el timex::Engine caduque o
80      cancele este evento temporal.
81
82      \param observer Instancia del objeto encargada de gestional el espacio asignado a esta
83      instancia.
84   */
85   void setObserver(TimeEventObserver* observer) { a_observer = observer; }
86
87   /**
88      Devuelve el estado de activacin de este evento de tiempo.
89      @return \em false si el evento esta activado o \em false en otro caso.
90   */
91   bool isActive() const { return (a_controller != NULL); }
92
93   /**
94      Devuelve una cadena con la informacion sobre este evento.
95      \return Una cadena con la informacion sobre este evento.
96   */
97   virtual std::string asString() const ;
98
99 protected:
100   /**
101      Contructor.
102   */
103   TimeEvent() :
104     a_id(0),
105     a_timeout(0),
106     a_controller(NULL),
107     a_observer(NULL)
108   {;}
109
110   /**
111      Contructor.
112
113      @param id Identificador de este evento.
114      @param timeout La duracion de este evento indicada en milisegundos.
115   */
116   TimeEvent(const Id id, const Millisecond & timeout) :
117     a_id(id),
118     a_timeout(timeout),
119     a_controller(NULL),
120     a_observer(NULL) {}
121
122   /**
123      metodo que debemos re-escribir para particularizar el comportamiento de nuestra clase cuando
124      el Engine notifica que se ha sobrepasado la duracion maxima del evento si que se invoque
125      a ninguno de los metodos que lo cancelarian. Una vez invocado a este metodo el evento se considera
126      cancelado y todos sus recursos son liberados automaticamente por Engine.
127
128      @param timeController Controlador de tiempo asociado al evento que esta expirando.
129   */
130   virtual void expire(Engine* timeController) noexcept(false) = 0;
131
132   /**
133      metodo que debemos re-escribir para particularizar el comportamiento de nuestra clase cuando
134      el Engine notifica que se ha parado el sistema de control de tiempos. Una vez invocado a este
135      metodo el evento se considera cancelado y todos sus recursos son liberados automaticamente
136      por Engine.
137
138      Las acciones realizadas nunca deber�n generar nuevos eventos. Por defecto no hace nada.
139   */
140   virtual void stop() noexcept(false) {;}
141
142 private:
143   Id a_id;
144   Millisecond a_timeout;
145   Engine* a_controller;
146   TimeEventObserver* a_observer;
147
148   friend class Engine;
149 };
150
151 }
152 }
153
154 #endif
155
156