Remove dynamic exceptions
[anna.git] / include / anna / comm / Network.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_Network_hpp
10 #define anna_comm_Network_hpp
11
12 #include <netinet/in.h>
13
14 #include <vector>
15
16 #include <anna/core/Singleton.hpp>
17
18 #include <anna/comm/INetAddress.hpp>
19
20 namespace anna {
21
22 namespace xml {
23 class Node;
24 }
25
26 namespace comm {
27
28 class Host;
29 class Device;
30 class Server;
31 class TransportFactory;
32 class ReceiverFactory;
33
34 /**
35    Representacion logica de la estructura de red donde se ejecuta nuestra aplicacion.
36 */
37 class Network : public Singleton <Network> {
38 public:
39   /**
40    * Modo de actuar a la hora de crear una conexión mediante #createConnection o #resolveConnection.
41    * \li Si el modo es \em Unique y ya existe una instancia previa conectada a una IP puerto se devuelve esa misma
42    * instancia,
43    * \li Si el modo es \em Multiple se pueden abrir tantas conexiones como se deseé sobre una misma IP:port.
44    */
45   struct Port { enum _v { Unique, Multiple }; };
46   struct DoConnect { enum _v { Yes, No }; };
47
48
49   typedef std::vector <Host*> host_container; /**< Definicion para gestionar las maquinas */
50   typedef host_container::iterator host_iterator; /**< Definicion para el iterador de maquinas */
51   typedef host_container::const_iterator const_host_iterator; /**< Definicion para el iterador de maquinas */
52
53   typedef std::vector <Device*> device_container; /**< Definicion para gestionar los dispositivos de red */
54   typedef device_container::iterator device_iterator; /**< Definicion para el iterador de dispositivos de red */
55   typedef device_container::const_iterator const_device_iterator; /**< Definicion para el iterador de dispositivos de red */
56
57   /**
58      Devuelve un puntero al dispositivo que coincide con la direccion IP
59      recibida como parametro. Si no encuentra ninguna coincidencia se creara automaticamente.
60
61      @param address Direccion de la maquina buscada.
62
63      @return La instancia del dispositivo que coincide con la direccion IP recibida como parametro.
64   */
65   Device* find(const in_addr_t& address) ;
66
67   /**
68      Devuelve un iterador al comienzo de la lista de dispositivos de red.
69      \return un iterador al comienzo de la lista de dispositivos de red.
70   */
71   const_device_iterator device_begin() const { return a_devices.begin(); }
72
73   /**
74      Devuelve un iterador al final de la lista de dispositivos de red.
75      \return un iterador al final de la lista de dispositivos de red.
76   */
77   const_device_iterator device_end() const { return a_devices.end(); }
78
79   /**
80      Devuelve un puntero al elemento sobre el que se encuentra el iterador pasado como
81      parametro.
82      \param ii Iterador que estamos recorriendo.
83      \return un puntero al elemento sobre el que se encuentra el iterador pasado como
84      parametro.
85   */
86   static const Device* device(const_device_iterator ii) { return *ii; }
87
88   /**
89      Devuelve un iterador al comienzo de la lista de dispositivos de red.
90      \return un iterador al comienzo de la lista de dispositivos de red.
91   */
92   device_iterator device_begin() { return a_devices.begin(); }
93
94   /**
95      Devuelve un iterador al final de la lista de dispositivos de red.
96      \return un iterador al final de la lista de dispositivos de red.
97   */
98   device_iterator device_end() { return a_devices.end(); }
99
100   /**
101      Devuelve un puntero al elemento sobre el que se encuentra el iterador pasado como
102      parametro.
103      \param ii Iterador que estamos recorriendo.
104      \return un puntero al elemento sobre el que se encuentra el iterador pasado como
105      parametro.
106   */
107   static Device* device(device_iterator ii) { return *ii; }
108
109   /**
110      Realiza una busqueda secuencial entre todas las maquinas y devuelve la instancia de la
111      maquina asociada al nombre recibido como parametro. Si no existia una instancia registrada
112      con este nombre se creara.
113
114      @param name Nombre logico de la maquina.
115
116      @return La instancia de la maquina asociada al nombre recibido.
117   */
118   Host* find_host(const char* name) ;
119
120   /**
121      Realiza una busqueda secuencial entre todas las maquinas y devuelve la instancia de la
122      maquina asociada al nombre recibido como parametro. Si no existia una instancia registrada
123      con este nombre se creara.
124
125      @param name Nombre logico de la maquina.
126
127      @return La instancia de la maquina asociada al nombre recibido.
128   */
129   Host* find_host(const std::string& name) { return find_host(name.c_str()); }
130
131   /**
132    * Resuelve el nombre de la maquina recibido como parametro y devuelve la instancia
133    * del Host asociado a ese nombre. Si el nombre de host ho ha sido definido previamente mediante
134    * el uso de los metodos #find devolvera una instancia de Host que tiene asignada todas las
135    * direcciones IP's retornadas por el sistema.
136    *
137    * \param hostname Nombre logico del servidor que sera usado para resolver. Podria ser una cadena
138    * de la forma www.gopher.net
139    *
140    * \return Si el nombre de host ho ha sido definido previamente mediante
141    * el uso de los metodos #find_host devolvera una instancia de Host que tiene asignada todas las
142    * direcciones IP's retornadas por el sistema
143    *
144    * \see man gethostbyname.
145    */
146   Host* resolve(const char* hostname) noexcept(false);
147
148   /**
149    * Resuelve el nombre de la maquina recibido como parametro y devuelve la instancia
150    * del Host asociado a ese nombre. Si el nombre de host ho ha sido definido previamente mediante
151    * el uso de los metodos #find devolvera una instancia de Host que tiene asignada todas las
152    * direcciones IP's retornadas por el sistema.
153    *
154    * \param hostname Nombre logico del servidor que sera usado para resolver. Podria ser una cadena
155    * de la forma www.gopher.net
156    *
157    * \return Si el nombre de host ho ha sido definido previamente mediante
158    * el uso de los metodos #find_host devolvera una instancia de Host que tiene asignada todas las
159    * direcciones IP's retornadas por el sistema
160    *
161    * \see man gethostbyname.
162    */
163   Host* resolve(const std::string& hostname) noexcept(false) { return resolve(hostname.c_str()); }
164
165   /**
166      Devuelve un iterador al comienzo de la lista de maquinas no modificables.
167      \return Un iterador al comienzo de la lista de maquinas no modificables.
168   */
169   const_host_iterator host_begin() const { return a_hosts.begin(); }
170
171   /**
172      Devuelve un iterador al final de la lista de maquinas no modificables.
173      \return Un iterador al final de la lista de maquinas no modificables.
174   */
175   const_host_iterator host_end() const { return a_hosts.end(); }
176
177   /**
178      Devuelve un puntero al elemento sobre el que se encuentra el iterador pasado como
179      parametro.
180      \param ii Iterador que estamos recorriendo.
181      \return un puntero al elemento sobre el que se encuentra el iterador pasado como
182      parametro.
183   */
184   static const Host* host(const_host_iterator ii) { return *ii; }
185
186   /**
187      Devuelve un iterador al comienzo de la lista de maquinas no modificables.
188      \return Un iterador al comienzo de la lista de maquinas no modificables.
189   */
190   host_iterator host_begin() { return a_hosts.begin(); }
191
192   /**
193      Devuelve un iterador al final de la lista de maquinas no modificables.
194      \return Un iterador al final de la lista de maquinas no modificables.
195   */
196   host_iterator host_end() { return a_hosts.end(); }
197
198   /**
199      Devuelve un puntero al elemento sobre el que se encuentra el iterador pasado como
200      parametro.
201      \param ii Iterador que estamos recorriendo.
202      \return un puntero al elemento sobre el que se encuentra el iterador pasado como
203      parametro.
204   */
205   static Host* host(host_iterator ii) { return *ii; }
206
207   /**
208      Crea la instancia de un anna::comm::Server disponible para conectar con la
209      IP y puerto indicados.
210
211      \param ip Direccion IP en la que escucha el proceso con el que queremos conectar.
212      \param remotePort Puerto remoto en el que atiendo peticiones el proceso con el que conectar.
213      \param autoRecovery Indica si en caso de caida se debe intentar la recuperacion
214      automatica de la conexion.
215      \param transportFactory Factoria de protocolos de transporte usada por los ClientSocket asociados a este
216      proceso servidor.
217      \param mode Modo de actuar en caso de que ya haya definida una conexión previa contra una misma IP:port
218      \param doConnect Realiza o ignora, la conexion del recurso creado.
219      \return La instancia de comm::Server asociado al IP y puerto recibido.
220      \warning Con modo de puerto unico, si ya existe un proceso definido sobre esa misma IP:port retorna la misma instancia.
221   */
222   Server* createServer(const char* ip, const int remotePort, const bool autoRecovery, TransportFactory* transportFactory = NULL, const Port::_v mode = Port::Multiple, const DoConnect::_v doConnect = DoConnect::Yes)
223   noexcept(false);
224
225   /**
226      Crea la instancia de un anna::comm::Server disponible para conectar con la
227      IP y puerto indicados.
228
229      \param ip Direccion IP en la que escucha el proceso con el que queremos conectar.
230      \param remotePort Puerto remoto en el que atiendo peticiones el proceso con el que conectar.
231      \param autoRecovery Indica si en caso de caida se debe intentar la recuperacion
232      automatica de la conexion.
233      \param receiverFactory Factoria de receptores usada por el comm::ClientSocket usado por el comm::Server a crear.
234      \param transportFactory Factoria de protocolos de transporte usada por los ClientSocket asociados a este
235      proceso servidor.
236      \param mode Modo de actuar en caso de que ya haya definida una conexión previa contra una misma IP:port
237      \param doConnect Realiza o ignora, la conexion del recurso creado.
238      \return La instancia de comm::Server asociado al IP y puerto recibido.
239      \warning Con modo de puerto unico, si ya existe un proceso definido sobre esa misma IP:port retorna la misma instancia.
240   */
241   Server* createServer(const char* ip, const int remotePort, const bool autoRecovery, ReceiverFactory& receiverFactory, TransportFactory* transportFactory = NULL, const Port::_v mode = Port::Multiple, const DoConnect::_v doConnect = DoConnect::Yes)
242   noexcept(false);
243
244 //   /**
245 //      Devuelve la instancia del anna::comm::Server asociado a la IP y puerto recibidos.
246 //
247 //      \param ip Direccion IP en la que escucha el proceso con el que queremos conectar.
248 //      \param remotePort Puerto remoto en el que atiendo peticiones el proceso con el que conectar.
249 //
250 //      \return La instancia de comm::Server asociado al IP y puerto recibido.
251 //      \warning El anna::comm::Server devuelto puede ser NULL.
252 //   */
253 //   Server* findServer (const char* ip, const int remotePort) noexcept(false);
254
255   /**
256      Crea la instancia de un anna::comm::Server disponible para conectar con la
257      IP y puerto indicados.
258
259    * \param hostname Nombre logico del servidor que sera usado para resolver. Podria ser una cadena
260    * de la forma www.gopher.net
261      \param remotePort Puerto remoto en el que atiendo peticiones el proceso con el que conectar.
262      \param autoRecovery Indica si en caso de caida se debe intentar la recuperacion
263      automatica de la conexion.
264      \param transportFactory Factoria de protocolos de transporte usada por los ClientSocket asociados a este
265      proceso servidor.
266      \param mode Modo de actuar en caso de que ya haya definida una conexión previa contra una misma IP:port
267      \param doConnect Realiza o ignora, la conexion del recurso creado.
268      \return La instancia de comm::Server asociado al IP y puerto recibido.
269      \warning Con modo de puerto unico, si ya existe un proceso definido sobre esa misma IP:port retorna la misma instancia.
270   */
271   Server* resolveServer(const char* hostname, const int remotePort, const bool autoRecovery, TransportFactory* transportFactory = NULL, const Port::_v mode = Port::Multiple, const DoConnect::_v doConnect = DoConnect::Yes)
272   noexcept(false);
273
274   /**
275      Crea la instancia de un anna::comm::Server disponible para conectar con la
276      IP y puerto indicados.
277
278    * \param hostname Nombre logico del servidor que sera usado para resolver. Podria ser una cadena
279    * de la forma www.gopher.net
280      \param remotePort Puerto remoto en el que atiendo peticiones el proceso con el que conectar.
281      \param autoRecovery Indica si en caso de caida se debe intentar la recuperacion
282      automatica de la conexion.
283      \param receiverFactory Factoria de receptores usada por el comm::ClientSocket usado por el comm::Server a crear.
284      \param transportFactory Factoria de protocolos de transporte usada por los ClientSocket asociados a este
285      proceso servidor.
286      \param mode Modo de actuar en caso de que ya haya definida una conexión previa contra una misma IP:port
287      \param doConnect Realiza o ignora, la conexion del recurso creado.
288      \return La instancia de comm::Server asociado al IP y puerto recibido.
289      \warning Con modo de puerto unico, si ya existe un proceso definido sobre esa misma IP:port retorna la misma instancia.
290   */
291   Server* resolveServer(const char* hostname, const int remotePort, const bool autoRecovery, ReceiverFactory& receiverFactory, TransportFactory* transportFactory = NULL, const Port::_v mode = Port::Multiple, const DoConnect::_v doConnect = DoConnect::Yes)
292   noexcept(false);
293
294
295   /**
296    * Obtiene la INetAddress correspondiente a la IP y puerto recibidos como parámetro.
297    * \param ip Dirección IP en formato a.b.c.d
298    * \param port Puerto de la dirección de red.
299    * \return la INetAddress correspondiente a la IP y puerto recibidos como parámetro.
300    */
301   INetAddress getINetAddress(const char* ip, const int port) noexcept(false);
302
303   /**
304    * Obtiene la INetAddress correspondiente a la IP y puerto recibidos como parámetro.
305    * \param ip Dirección IP en formato a.b.c.d
306    * \param port Puerto de la dirección de red.
307    * \return la INetAddress correspondiente a la IP y puerto recibidos como parámetro.
308    */
309   INetAddress getINetAddress(const std::string& ip, const int port) noexcept(false);
310
311
312   /**
313      Devuelve una cadena con la informacin referente a esta instancia.
314      \param parent Nodo XML del que dependende la informacion.
315      @return Una cadena con la informacin referente a esta instancia.
316   */
317   xml::Node* asXML(xml::Node* parent) const ;
318
319 private:
320   host_container a_hosts;
321   device_container a_devices;
322   Host* a_cacheHost;
323   Device* a_cacheDevice;
324
325   Network() : a_cacheHost(NULL), a_cacheDevice(NULL) {;}
326   Network(const Network&);
327
328   friend class Singleton<Network>;
329 };
330
331 }
332 }
333
334 #endif
335