bug in RC
[anna.git] / include / anna / comm / Device.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_Device_hpp
10 #define anna_comm_Device_hpp
11
12 #include <sys/types.h>
13 #include <sys/socket.h>
14 #include <netinet/in.h>
15 #include <arpa/inet.h>
16
17 #include <string>
18
19 #include <anna/core/RuntimeException.hpp>
20
21 namespace anna {
22
23 namespace xml {
24 class Node;
25 }
26
27 namespace comm {
28
29 class Network;
30
31 /**
32    Abstraccion de un dispositivo de Red.
33    Un Host puede tener asociado un numero indeterminado de dispositivos de red.
34
35    El metodo Network::find(in_addr_t) creara un nuevo dispositivo de red.
36 */
37 class Device {
38 public:
39   /**
40      Estados en los que puede estar un dispositivo de red.
41   */
42   struct Status { enum _v { Down, Up }; };
43
44   /**
45      Devuelve la direccion asociada a este instancia.
46      \return La direccion asociada a este instancia.
47   */
48   in_addr_t getAddress() const throw() { return a_address; }
49
50   /**
51      Devuelve el estado asociado al dispositivo.
52      \return el estado asociado al dispositivo.
53   */
54   Status::_v getStatus() const throw() { return a_status; }
55
56   /**
57      Establece el estado del dispositivo.
58      \param status Nuevo estado del dispositivo.
59   */
60   void setStatus(const Status::_v status) throw() { a_status = status; }
61
62   /**
63     Operador de comparacion.
64     \param right Direccion con la comparar.
65     @return \em true si la direccion recibida como parametro coincide con esta.
66     \em false en otro caso.
67   */
68   bool operator == (const Device& right) const throw()  { return a_address == right.a_address; }
69
70   /**
71     Operador de comparacion.
72     \param right Direccion con la comparar.
73     @return \em true si la direccion recibida como parametro coincide con esta.
74     \em false en otro caso.
75   */
76   bool operator == (const in_addr_t& right) const throw() { return a_address == right; }
77
78   /**
79     Operador de comparacion.
80     \param ip Direccion con la comparar. En formato A.B.C.D.
81     @return \em true si la direccion recibida como parametro coincide con esta.
82     \em false en otro caso.
83   */
84   bool operator == (const char* ip) const throw() { return a_address == inet_addr(ip); }
85
86   /**
87     Operador de comparacion.
88     \param ip Direccion con la comparar. En formato A.B.C.D.
89     @return \em true si la direccion recibida como parametro coincide con esta.
90     \em false en otro caso.
91   */
92   bool operator == (const std::string& ip) const throw() { return a_address == inet_addr(ip.c_str()); }
93
94   /**
95     Operador distinto.
96     @return \em true si la direccin recibida como par�etro coincide con �ta o
97     \em false en otro caso.
98   */
99   bool operator != (const Device& right) const throw() { return a_address != right.a_address; }
100
101   /**
102     Operador distinto.
103     @return \em true si la direccin recibida como par�etro no coincide con �ta o
104     \em false en otro caso.
105   */
106   bool operator != (const in_addr_t right) const throw() { return a_address != right; }
107
108   /**
109      Devuelve una cadena la informacion mas relevante de esta instancia.
110      @return una cadena la informacion mas relevante de esta instancia.
111   */
112   std::string asString() const throw();
113
114   /**
115      Devuelve un documento XML con la informacion mas relevante de esta instancia.
116      \param parent Nodo XML del que deben depender los datos a crear.
117      @return Un documento XML con la informacion mas relevante de esta instancia.
118   */
119   xml::Node* asXML(xml::Node* parent) const throw(RuntimeException);
120
121   /**
122      Incorpora los paremetros de esta instancia como atributos del nodo XML
123      recibido como parametro.
124      \param node Nodo del que dependen los atributos a crear.
125   */
126   void asAttribute(xml::Node* node) const throw(RuntimeException);
127
128   /**
129      Devuelve el nombre de esta clase. Se puede invocar desde \code template <class T>::asString (const T*); \endcode
130      \return Devuelve el nombre de esta clase.
131   */
132   static const char* className() throw() { return "anna::comm::Device"; }
133
134   /**
135      Devuelve la direccion INET recibida como parametro en formato cadena.
136      \param address Direccion INET a convertir.
137      \return la direccion INET recibida como parametro en formato cadena.
138   */
139   static std::string asString(const in_addr_t& address) throw();
140
141   /**
142      Devuelve la dirección IP recibida como cadena en un tipo in_addr_t.
143      \return la dirección IP recibida como cadena en un tipo in_addr_t.
144   */
145   static in_addr_t asAddress(const std::string& ip) throw() { return inet_addr(ip.c_str()); }
146
147 protected:
148   /**
149      Constructor.
150      \param ip Texto con la direccin IP en formato A.B.C.D.
151   */
152   Device(const char* ip)  : a_address(inet_addr(ip)), a_status(Status::Up) {;}
153
154   /**
155      Constructor.
156      \param ip Texto con la direccin IP en formato A.B.C.D.
157   */
158   Device(const std::string& ip)  : a_address(inet_addr(ip.c_str())), a_status(Status::Up) {;}
159
160   /**
161      Constructor.
162      \param address Direccin IP de esta instancia
163   */
164   Device(const in_addr_t& address)  : a_address(address), a_status(Status::Up) {;}
165
166   /**
167      Constructor copia.
168      \param other Dispositivo
169   */
170   Device(const Device& other) : a_address(other.a_address), a_status(Status::Up) {;}
171
172 private:
173   const in_addr_t a_address;
174   Status::_v a_status;
175
176   friend class Network;
177 };
178
179 }
180 }
181
182 #endif
183
184
185