1 // ANNA - Anna is Not Nothingness Anymore //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo //
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 //
9 #ifndef anna_app_Application_hpp
10 #define anna_app_Application_hpp
14 #include <anna/core/RuntimeException.hpp>
28 Application abstraction.
30 Gather all the information of resources (version, title, command line,
31 threads, etc ...) used by our applications.
33 Only one single instance could exists for the application, accessed by mean anna::functions::getApp.
37 typedef std::vector <Component*>::iterator iterator;
38 typedef std::vector <Component*>::const_iterator const_iterator;
39 typedef std::vector <pid_t> pid_container;
40 typedef pid_container::iterator pid_iterator;
41 typedef pid_container::const_iterator const_pid_iterator;
46 @param shortName Instance logical name.
47 @param title Application title (appears when the application starts).
48 @param version Program version (recommended X.YRZZn with X = main version, Y = secondary version, ZZ = delivery number
49 \param date Component build date. Normally the macro __DATE__.
50 \param time Component build time. Normally the macro __TIME__.
52 Application(const char* shortName, const char* title, const char* version, const char* date = NULL, const char* time = NULL);
57 virtual ~Application() { a_components.clear(); }
61 Short name given in constructor.
62 \return Short name given in constructor.
64 const char* getShortName() const throw() { return a_shortName; }
67 Version given in constructor.
68 \return Version given in constructor.
70 const std::string& getVersion() const throw() { return a_version; }
73 Devuelve el titulo indicado en el contructor de esta aplicacion.
74 \return el titulo indicado en el contructor de esta aplicacion.
76 const std::string& getTitle() const throw() { return a_title; }
79 Devuelve el pid asignado por el sistema operativo a la aplicacion que estamos ejecutando.
80 @return El pid asignado por el sistema operativo a la aplicacion que estamos ejecutando.
82 pid_t getPid() const throw() { return a_pid; }
85 Activa la salida por pantalla del mensaje referente a la licencia GPL 3.0.
86 \warning Para que tenga efecto debe ser invocado antes de ejecutar el metodo Application::start.
88 void activateGeneralPublicLicense() throw() { a_enableGPL = true; }
91 * Crea un nuevo proceso a partir de este usando el metodo \em fork.
93 * Estrictamente este metodo retonara dos veces, una en el ambito del proceso que lo invoco y
94 * otra en el ambito del nuevo proceso, llamado proceso hijo.
96 * Si la duplicacion se realiza de forma correcta se invoca a los metodos #do_cloneChild y #do_cloneParent de nuestra
97 * aplicacion y Component::do_cloneChild y Component::do_cloneParent de cada uno de los componentes registrados.
99 * Para saber en cual de los procesos
100 * \return La instancia de la nueva aplicacion.
102 Application& clone() throw(RuntimeException);
105 Devuelve la instancia del componente que corresponde con el nombre recibido.
106 \return La instancia del componente que corresponde con el nombre recibido. Puede ser NULL si no
107 hay ningun componente asociado a la �ta aplicacion que corresponda con el nombre.
109 Component* find(const char* className) throw();
112 Inicializa los elementos propios de nuestra aplicacio, invoca al metodo #initialize
113 e invoca al metodo #run.
115 void start() throw(RuntimeException);
118 Devuelve un iterador al primer componente definido en la aplicacion.
119 \return un iterador al primer componente definido en la aplicacion.
121 const_iterator begin() const throw() { return a_components.begin(); }
124 Devuelve un iterador al primer componente definido en la aplicacion.
125 \return un iterador al primer componente definido en la aplicacion.
127 iterator begin() throw() { return a_components.begin(); }
130 Devuelve un iterador al ultimo componente definido en la aplicacion.
131 \return un iterador al ultimo componente definido en la aplicacion.
133 const_iterator end() const throw() { return a_components.end(); }
136 Devuelve un iterador al ultimo componente definido en la aplicacion.
137 \return un iterador al ultimo componente definido en la aplicacion.
139 iterator end() throw() { return a_components.end(); }
142 Vuelva un documento XML con el contexto de la aplicacion.
143 \param file Ruta completa del fichero en el que grabar el contexto de la aplicacion.
145 void writeContext(const std::string& file) throw(RuntimeException);
148 metodo que puede ser reescrito en las clases heredadas de Application y que nos
149 da la posibilidad de inicializar los elementos particulares de nuestra aplicacion.
150 Por defecto no realiza ninguna operacion.
151 \warning En el momento de invocar a esta funcin los componentes (\see Component) pueden no
154 virtual void initialize() throw(RuntimeException) {;}
157 Devuelve si esta aplicacion tiene soporto para comunicaciones entre procesos.
158 \return \em true si la aplicacion tiene soporta para comunicacion entre proceso o \em false
161 virtual bool supportCommunication() const throw() { return false; }
164 * Este m�todo se invocar� cuando alguna capa superior a �sta detecte un problema tan grave
165 * como para parar la aplicaci�n de forma s�bita.
166 * \param className Nombre de la clase que genera el evento.
168 * \warning En el momento de invocar a este m�todo la aplicaci�n puede estar en un estado
169 * no muy estable por lo que se deber�an minizar las operaciones a realizar para evitar
170 * bloquear la aplicaci�n.
172 virtual void eventAbnormalTermination(const char* className) throw() { ; }
175 Devuelve una cadena con la informacion referente a esta instancia.
176 \param parent Nodo XML del que dependende la informacion.
177 @return Una cadena con la informacion referente a esta instancia.
179 virtual xml::Node* asXML(xml::Node* parent) const throw();
182 Devuelve el objeto sobre el que esta posicionado el iterator recibido como parametro.
183 \param ii Iterator que deberia estar comprendido entre #begin y #end.
184 \return El objeto sobre el que esta posicionado el iterator recibido como parametro.
186 static const Component* component(const_iterator& ii) throw() { return *ii; }
189 Devuelve el objeto sobre el que esta posicionado el iterator recibido como parametro.
190 \param ii Iterator que deberia estar comprendido entre #begin y #end.
191 \return El objeto sobre el que esta posicionado el iterator recibido como parametro.
193 static Component* component(iterator& ii) throw() { return *ii; }
196 static Application* st_application;
199 metodo que debemos implementar para ejecutar nuestra aplicacion.
201 virtual void run() throw(RuntimeException) = 0;
204 Handler for SIGUSR1. Application context written by default.
206 virtual void signalUSR1() throw(RuntimeException);
209 Handler for SIGUSR2. Nothing done by default.
211 virtual void signalUSR2() throw(RuntimeException);
214 Metodo manejador que podemos re-escribir para tratar la recepcion de la senhal SIGTERM.
216 virtual void signalTerminate() throw(RuntimeException) {;}
219 * Metodo que debemos implementar en la clase heredada para tratar el proceso de clonado de
220 * esta aplicacion desde el punto de vista del proceso original.
221 * \warning Si se detecta algun error terminara abortara la ejecucion del proceso hijo.
223 virtual void do_cloneParent() throw(RuntimeException) {;}
226 * Metodo que debemos implementar en la clase heredada para tratar el proceso de clonado de
227 * esta aplicacion desde el punto de vista del proceso hijo.
228 * \warning Si se detecta algun error terminara abortara la ejecucion de este proceso.
230 virtual void do_cloneChild() throw(RuntimeException) {;}
233 Devuelve un iterador al primer proceso hijo creado por la aplicacion (ver #clone),
234 \return un iterador al primer proceso hijo definido en la aplicacion.
236 pid_iterator pid_begin() throw() { return a_pids.begin(); }
239 Devuelve un iterador al final de lista lista de procesos hijos creados por la aplicacion (ver #clone).
240 \return un iterador al primer proceso hijo definido en la aplicacion.
242 pid_iterator pid_end() throw() { return a_pids.end(); }
245 * Devuelve el numero de procesos hijos.
246 * \return el numero de procesos hijos.
248 int pid_size() const throw() { return a_pids.size(); }
251 Devuelve un iterador al primer proceso hijo creado por la aplicacion (ver #clone),
252 \return un iterador al primer proceso hijo definido en la aplicacion.
254 const_pid_iterator pid_begin() const throw() { return a_pids.begin(); }
257 Devuelve un iterador al final de lista lista de procesos hijos creados por la aplicacion (ver #clone).
258 \return un iterador al primer proceso hijo definido en la aplicacion.
260 const_pid_iterator pid_end() const throw() { return a_pids.end(); }
263 Devuelve el PID sobre el que esta posicionado el iterator recibido como parametro.
264 \param ii Iterator que deberia estar comprendido entre #pid_begin y #pid_end.
265 \return El objeto sobre el que esta posicionado el iterator recibido como parametro.
267 static pid_t pid(pid_iterator& ii) throw() { return *ii; }
270 Devuelve el PID sobre el que esta posicionado el iterator recibido como parametro.
271 \param ii Iterator que deberia estar comprendido entre #pid_begin y #pid_end.
272 \return El objeto sobre el que esta posicionado el iterator recibido como parametro.
274 static pid_t pid(const_pid_iterator& ii) throw() { return *ii; }
278 std::string a_version;
279 const std::string a_title;
280 std::vector <Component*> a_components;
282 const char* a_shortName;
284 pid_container a_pids;
286 void attach(Component*) throw(RuntimeException);
287 void detach(Component*) throw(RuntimeException);
289 void startComponents() throw(RuntimeException);
290 void stopComponents() throw(RuntimeException);
291 void sendSignalToChilds(const int signal) throw();
293 void signalUSR(int) throw(RuntimeException);
294 static void handlerSignalUSR(int) throw();
295 static void handlerSignalTerminate(int) throw();
296 static void handlerChildTerminate(int sig) throw();
298 friend class Component; // Para poder acceder a los metodo attach y detach
299 friend struct functions;