Updated license
[anna.git] / include / anna / comm / Network.hpp
1 // ANNA - Anna is Not Nothingness Anymore
2 //
3 // (c) Copyright 2005-2014 Eduardo Ramos Testillano & Francisco Ruiz Rayo
4 //
5 // https://bitbucket.org/testillano/anna
6 //
7 // Redistribution and use in source and binary forms, with or without
8 // modification, are permitted provided that the following conditions
9 // are met:
10 //
11 //     * Redistributions of source code must retain the above copyright
12 // notice, this list of conditions and the following disclaimer.
13 //     * Redistributions in binary form must reproduce the above
14 // copyright notice, this list of conditions and the following disclaimer
15 // in the documentation and/or other materials provided with the
16 // distribution.
17 //     * Neither the name of Google Inc. nor the names of its
18 // contributors may be used to endorse or promote products derived from
19 // this software without specific prior written permission.
20 //
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 //
33 // Authors: eduardo.ramos.testillano@gmail.com
34 //          cisco.tierra@gmail.com
35
36
37 #ifndef anna_comm_Network_hpp
38 #define anna_comm_Network_hpp
39
40 #include <netinet/in.h>
41
42 #include <vector>
43
44 #include <anna/core/Singleton.hpp>
45
46 #include <anna/comm/INetAddress.hpp>
47
48 namespace anna {
49
50 namespace xml {
51 class Node;
52 }
53
54 namespace comm {
55
56 class Host;
57 class Device;
58 class Server;
59 class TransportFactory;
60 class ReceiverFactory;
61
62 /**
63    Representacion logica de la estructura de red donde se ejecuta nuestra aplicacion.
64 */
65 class Network : public Singleton <Network> {
66 public:
67   /**
68    * Modo de actuar a la hora de crear una conexión mediante #createConnection o #resolveConnection.
69    * \li Si el modo es \em Unique y ya existe una instancia previa conectada a una IP puerto se devuelve esa misma
70    * instancia,
71    * \li Si el modo es \em Multiple se pueden abrir tantas conexiones como se deseé sobre una misma IP:port.
72    */
73   struct Port { enum _v { Unique, Multiple }; };
74   struct DoConnect { enum _v { Yes, No }; };
75
76
77   typedef std::vector <Host*> host_container; /**< Definicion para gestionar las maquinas */
78   typedef host_container::iterator host_iterator; /**< Definicion para el iterador de maquinas */
79   typedef host_container::const_iterator const_host_iterator; /**< Definicion para el iterador de maquinas */
80
81   typedef std::vector <Device*> device_container; /**< Definicion para gestionar los dispositivos de red */
82   typedef device_container::iterator device_iterator; /**< Definicion para el iterador de dispositivos de red */
83   typedef device_container::const_iterator const_device_iterator; /**< Definicion para el iterador de dispositivos de red */
84
85   /**
86      Devuelve un puntero al dispositivo que coincide con la direccion IP
87      recibida como parametro. Si no encuentra ninguna coincidencia se creara automaticamente.
88
89      @param address Direccion de la maquina buscada.
90
91      @return La instancia del dispositivo que coincide con la direccion IP recibida como parametro.
92   */
93   Device* find(const in_addr_t& address) throw();
94
95   /**
96      Devuelve un iterador al comienzo de la lista de dispositivos de red.
97      \return un iterador al comienzo de la lista de dispositivos de red.
98   */
99   const_device_iterator device_begin() const throw() { return a_devices.begin(); }
100
101   /**
102      Devuelve un iterador al final de la lista de dispositivos de red.
103      \return un iterador al final de la lista de dispositivos de red.
104   */
105   const_device_iterator device_end() const throw() { return a_devices.end(); }
106
107   /**
108      Devuelve un puntero al elemento sobre el que se encuentra el iterador pasado como
109      parametro.
110      \param ii Iterador que estamos recorriendo.
111      \return un puntero al elemento sobre el que se encuentra el iterador pasado como
112      parametro.
113   */
114   static const Device* device(const_device_iterator ii) throw() { return *ii; }
115
116   /**
117      Devuelve un iterador al comienzo de la lista de dispositivos de red.
118      \return un iterador al comienzo de la lista de dispositivos de red.
119   */
120   device_iterator device_begin() throw() { return a_devices.begin(); }
121
122   /**
123      Devuelve un iterador al final de la lista de dispositivos de red.
124      \return un iterador al final de la lista de dispositivos de red.
125   */
126   device_iterator device_end() throw() { return a_devices.end(); }
127
128   /**
129      Devuelve un puntero al elemento sobre el que se encuentra el iterador pasado como
130      parametro.
131      \param ii Iterador que estamos recorriendo.
132      \return un puntero al elemento sobre el que se encuentra el iterador pasado como
133      parametro.
134   */
135   static Device* device(device_iterator ii) throw() { return *ii; }
136
137   /**
138      Realiza una busqueda secuencial entre todas las maquinas y devuelve la instancia de la
139      maquina asociada al nombre recibido como parametro. Si no existia una instancia registrada
140      con este nombre se creara.
141
142      @param name Nombre logico de la maquina.
143
144      @return La instancia de la maquina asociada al nombre recibido.
145   */
146   Host* find_host(const char* name) throw();
147
148   /**
149      Realiza una busqueda secuencial entre todas las maquinas y devuelve la instancia de la
150      maquina asociada al nombre recibido como parametro. Si no existia una instancia registrada
151      con este nombre se creara.
152
153      @param name Nombre logico de la maquina.
154
155      @return La instancia de la maquina asociada al nombre recibido.
156   */
157   Host* find_host(const std::string& name) throw() { return find_host(name.c_str()); }
158
159   /**
160    * Resuelve el nombre de la maquina recibido como parametro y devuelve la instancia
161    * del Host asociado a ese nombre. Si el nombre de host ho ha sido definido previamente mediante
162    * el uso de los metodos #find devolvera una instancia de Host que tiene asignada todas las
163    * direcciones IP's retornadas por el sistema.
164    *
165    * \param hostname Nombre logico del servidor que sera usado para resolver. Podria ser una cadena
166    * de la forma www.gopher.net
167    *
168    * \return Si el nombre de host ho ha sido definido previamente mediante
169    * el uso de los metodos #find_host devolvera una instancia de Host que tiene asignada todas las
170    * direcciones IP's retornadas por el sistema
171    *
172    * \see man gethostbyname.
173    */
174   Host* resolve(const char* hostname) throw(RuntimeException);
175
176   /**
177    * Resuelve el nombre de la maquina recibido como parametro y devuelve la instancia
178    * del Host asociado a ese nombre. Si el nombre de host ho ha sido definido previamente mediante
179    * el uso de los metodos #find devolvera una instancia de Host que tiene asignada todas las
180    * direcciones IP's retornadas por el sistema.
181    *
182    * \param hostname Nombre logico del servidor que sera usado para resolver. Podria ser una cadena
183    * de la forma www.gopher.net
184    *
185    * \return Si el nombre de host ho ha sido definido previamente mediante
186    * el uso de los metodos #find_host devolvera una instancia de Host que tiene asignada todas las
187    * direcciones IP's retornadas por el sistema
188    *
189    * \see man gethostbyname.
190    */
191   Host* resolve(const std::string& hostname) throw(RuntimeException) { return resolve(hostname.c_str()); }
192
193   /**
194      Devuelve un iterador al comienzo de la lista de maquinas no modificables.
195      \return Un iterador al comienzo de la lista de maquinas no modificables.
196   */
197   const_host_iterator host_begin() const throw() { return a_hosts.begin(); }
198
199   /**
200      Devuelve un iterador al final de la lista de maquinas no modificables.
201      \return Un iterador al final de la lista de maquinas no modificables.
202   */
203   const_host_iterator host_end() const throw() { return a_hosts.end(); }
204
205   /**
206      Devuelve un puntero al elemento sobre el que se encuentra el iterador pasado como
207      parametro.
208      \param ii Iterador que estamos recorriendo.
209      \return un puntero al elemento sobre el que se encuentra el iterador pasado como
210      parametro.
211   */
212   static const Host* host(const_host_iterator ii) throw() { return *ii; }
213
214   /**
215      Devuelve un iterador al comienzo de la lista de maquinas no modificables.
216      \return Un iterador al comienzo de la lista de maquinas no modificables.
217   */
218   host_iterator host_begin() throw() { return a_hosts.begin(); }
219
220   /**
221      Devuelve un iterador al final de la lista de maquinas no modificables.
222      \return Un iterador al final de la lista de maquinas no modificables.
223   */
224   host_iterator host_end() throw() { return a_hosts.end(); }
225
226   /**
227      Devuelve un puntero al elemento sobre el que se encuentra el iterador pasado como
228      parametro.
229      \param ii Iterador que estamos recorriendo.
230      \return un puntero al elemento sobre el que se encuentra el iterador pasado como
231      parametro.
232   */
233   static Host* host(host_iterator ii) throw() { return *ii; }
234
235   /**
236      Crea la instancia de un anna::comm::Server disponible para conectar con la
237      IP y puerto indicados.
238
239      \param ip Direccion IP en la que escucha el proceso con el que queremos conectar.
240      \param remotePort Puerto remoto en el que atiendo peticiones el proceso con el que conectar.
241      \param autoRecovery Indica si en caso de caida se debe intentar la recuperacion
242      automatica de la conexion.
243      \param transportFactory Factoria de protocolos de transporte usada por los ClientSocket asociados a este
244      proceso servidor.
245      \param mode Modo de actuar en caso de que ya haya definida una conexión previa contra una misma IP:port
246      \param doConnect Realiza o ignora, la conexion del recurso creado.
247      \return La instancia de comm::Server asociado al IP y puerto recibido.
248      \warning Con modo de puerto unico, si ya existe un proceso definido sobre esa misma IP:port retorna la misma instancia.
249   */
250   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)
251   throw(RuntimeException);
252
253   /**
254      Crea la instancia de un anna::comm::Server disponible para conectar con la
255      IP y puerto indicados.
256
257      \param ip Direccion IP en la que escucha el proceso con el que queremos conectar.
258      \param remotePort Puerto remoto en el que atiendo peticiones el proceso con el que conectar.
259      \param autoRecovery Indica si en caso de caida se debe intentar la recuperacion
260      automatica de la conexion.
261      \param receiverFactory Factoria de receptores usada por el comm::ClientSocket usado por el comm::Server a crear.
262      \param transportFactory Factoria de protocolos de transporte usada por los ClientSocket asociados a este
263      proceso servidor.
264      \param mode Modo de actuar en caso de que ya haya definida una conexión previa contra una misma IP:port
265      \param doConnect Realiza o ignora, la conexion del recurso creado.
266      \return La instancia de comm::Server asociado al IP y puerto recibido.
267      \warning Con modo de puerto unico, si ya existe un proceso definido sobre esa misma IP:port retorna la misma instancia.
268   */
269   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)
270   throw(RuntimeException);
271
272 //   /**
273 //      Devuelve la instancia del anna::comm::Server asociado a la IP y puerto recibidos.
274 //
275 //      \param ip Direccion IP en la que escucha el proceso con el que queremos conectar.
276 //      \param remotePort Puerto remoto en el que atiendo peticiones el proceso con el que conectar.
277 //
278 //      \return La instancia de comm::Server asociado al IP y puerto recibido.
279 //      \warning El anna::comm::Server devuelto puede ser NULL.
280 //   */
281 //   Server* findServer (const char* ip, const int remotePort) throw (RuntimeException);
282
283   /**
284      Crea la instancia de un anna::comm::Server disponible para conectar con la
285      IP y puerto indicados.
286
287    * \param hostname Nombre logico del servidor que sera usado para resolver. Podria ser una cadena
288    * de la forma www.gopher.net
289      \param remotePort Puerto remoto en el que atiendo peticiones el proceso con el que conectar.
290      \param autoRecovery Indica si en caso de caida se debe intentar la recuperacion
291      automatica de la conexion.
292      \param transportFactory Factoria de protocolos de transporte usada por los ClientSocket asociados a este
293      proceso servidor.
294      \param mode Modo de actuar en caso de que ya haya definida una conexión previa contra una misma IP:port
295      \param doConnect Realiza o ignora, la conexion del recurso creado.
296      \return La instancia de comm::Server asociado al IP y puerto recibido.
297      \warning Con modo de puerto unico, si ya existe un proceso definido sobre esa misma IP:port retorna la misma instancia.
298   */
299   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)
300   throw(RuntimeException);
301
302   /**
303      Crea la instancia de un anna::comm::Server disponible para conectar con la
304      IP y puerto indicados.
305
306    * \param hostname Nombre logico del servidor que sera usado para resolver. Podria ser una cadena
307    * de la forma www.gopher.net
308      \param remotePort Puerto remoto en el que atiendo peticiones el proceso con el que conectar.
309      \param autoRecovery Indica si en caso de caida se debe intentar la recuperacion
310      automatica de la conexion.
311      \param receiverFactory Factoria de receptores usada por el comm::ClientSocket usado por el comm::Server a crear.
312      \param transportFactory Factoria de protocolos de transporte usada por los ClientSocket asociados a este
313      proceso servidor.
314      \param mode Modo de actuar en caso de que ya haya definida una conexión previa contra una misma IP:port
315      \param doConnect Realiza o ignora, la conexion del recurso creado.
316      \return La instancia de comm::Server asociado al IP y puerto recibido.
317      \warning Con modo de puerto unico, si ya existe un proceso definido sobre esa misma IP:port retorna la misma instancia.
318   */
319   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)
320   throw(RuntimeException);
321
322
323   /**
324    * Obtiene la INetAddress correspondiente a la IP y puerto recibidos como parámetro.
325    * \param ip Dirección IP en formato a.b.c.d
326    * \param port Puerto de la dirección de red.
327    * \return la INetAddress correspondiente a la IP y puerto recibidos como parámetro.
328    */
329   INetAddress getINetAddress(const char* ip, const int port) throw(RuntimeException);
330
331   /**
332    * Obtiene la INetAddress correspondiente a la IP y puerto recibidos como parámetro.
333    * \param ip Dirección IP en formato a.b.c.d
334    * \param port Puerto de la dirección de red.
335    * \return la INetAddress correspondiente a la IP y puerto recibidos como parámetro.
336    */
337   INetAddress getINetAddress(const std::string& ip, const int port) throw(RuntimeException);
338
339
340   /**
341      Devuelve una cadena con la informacin referente a esta instancia.
342      \param parent Nodo XML del que dependende la informacion.
343      @return Una cadena con la informacin referente a esta instancia.
344   */
345   xml::Node* asXML(xml::Node* parent) const throw();
346
347 private:
348   host_container a_hosts;
349   device_container a_devices;
350   Host* a_cacheHost;
351   Device* a_cacheDevice;
352
353   Network() : a_cacheHost(NULL), a_cacheDevice(NULL) {;}
354   Network(const Network&);
355
356   friend class Singleton<Network>;
357 };
358
359 }
360 }
361
362 #endif
363