Remove dynamic exceptions
[anna.git] / include / anna / comm / Service.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_comm_Service_hpp
10 #define anna_comm_Service_hpp
11
12 #include <anna/comm/Delivery.hpp>
13
14 namespace anna {
15
16 namespace comm {
17
18 class Server;
19 class Message;
20
21 /**
22    Clase que modela un servicio de reparto de carga. Cada servicio de reparto de carga esta asociado
23    a un nmero indeterminado de procesos servidores (ver Server) entre los que puede seleccionar a
24    la hora de enviar una peticin.
25
26    Para crear un nuevo servicio hay que invocar a Communicator::createService.
27 */
28 class Service : public Delivery {
29 public:
30   /**
31      Constructor.
32      \param name Nombre lógico del servicio de reparto de carga.
33      \param isCritical Indica las caracteristicas del reparto de carga. Debe valor \em true si el
34      reparto de carga a crear es crítico o \em false en otro caso.
35   */
36   Service(const char* name, const bool isCritical) :
37     Delivery(name),
38     a_isCritical(isCritical) {}
39
40   /**
41      Devuelve la caracteristica de criticidad de este reparto.
42
43      @return La caracteristica de criticidad de este reparto.
44   */
45   bool isCritical() const { return a_isCritical; }
46
47   /**
48      Conecta el servidor recibido como parámetro con este reparto.
49      \param server Instancia del servidor que vamos a registrar en este reparto.
50   */
51   void attach(Server* server) noexcept(false);
52
53   /**
54      Envía el mensaje recibido como parámetro. El bloque de datos recibido se codifica segun las
55      reglas establecidas por el protocolo asociado en el contructor.
56
57      \param message Mensaje que vamos codificar para enviar a la capa de transporte.
58      @return Servidor usado en el envio
59   */
60   comm::Server* send(Message& message) noexcept(false);
61
62   /**
63      Envía el mensaje recibido como parámetro. El bloque de datos recibido se codifica segun las
64      reglas establecidas por el protocolo asociado en el contructor.
65
66      \param message Mensaje que vamos codificar para enviar a la capa de transporte.
67      @return Servidor usado en el envio
68   */
69   comm::Server* send(Message* message) noexcept(false);
70
71   /**
72      Envía el mensaje recibido como parámetro a todos los servidores incluidos en el servicio de reparto de carga
73      recibido como parámetro. El bloque de datos recibido se codifica segun las reglas establecidas
74      por el protocolo asociado.
75
76      \param message Mensaje que vamos a enviar al todos los procesos que componente el servicio.
77
78      @return Numero de servidores a los que ha enviado el mensaje.
79   */
80   int broadcast(Message& message) ;
81
82   /**
83      Envía el mensaje recibido como parámetro a todos los servidores incluidos en el servicio de reparto de carga
84      recibido como parámetro. El bloque de datos recibido se codifica segun las reglas establecidas
85      por el protocolo asociado.
86
87      \param message Mensaje que vamos a enviar al todos los procesos que componente el servicio.
88
89      @return Numero de servidores a los que ha enviado el mensaje.
90   */
91   int broadcast(Message* message) ;
92
93   /**
94      Devuelve una cadena con la información referente a esta maquina.
95      @return Una cadena con la información referente a esta maquina.
96   */
97   std::string asString() const ;
98
99   /**
100      Devuelve un nodo XML con la información referente a este objeto.
101      \param parent Nodo XML a partir del cual introducir la información.
102      \return Un nodo XML con la información referente a este objeto.
103   */
104   xml::Node* asXML(xml::Node* parent) const ;
105
106   /**
107      Devuelve el recurso remoto apuntado por el iterador recibido como parámetro.
108      \param ii Iterador usado para recorrer los recursos asociados a este reparto.
109      \return El recurso remoto apuntado por el iterador recibido como parámetro.
110   */
111   static Server* server(iterator& ii) ;
112
113   /**
114      Devuelve el recurso remoto apuntado por el iterador recibido como parámetro.
115      \param ii Iterador usado para recorrer los recursos asociados a este reparto.
116      \return El recurso remoto apuntado por el iterador recibido como parámetro.
117   */
118   static const Server* server(const_iterator& ii) ;
119
120 private:
121   const bool a_isCritical;
122 };
123
124 }
125 }
126
127 #endif