bug in RC
[anna.git] / include / anna / comm / Receiver.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_Receiver_hpp
10 #define anna_comm_Receiver_hpp
11
12 #include <string>
13
14 #include <anna/xml/Node.hpp>
15 #include <anna/comm/Server.hpp>
16
17 namespace anna {
18
19 namespace comm {
20
21 class ClientSocket;
22 class Server;
23 class ReceiverFactory;
24 class Message;
25
26 /**
27    Modela la clase que gestiona el tratamiento de los mensajes de red de forma independiente para
28    cada thread.
29
30    \see Communicator.
31    \see ReceiverFactory
32 */
33 class Receiver {
34 public:
35   /**
36    * Devuelve el nombre lógico de éste receptor.
37    * \return el nombre lógico de éste receptor.
38    */
39   const std::string& getName() const throw() { return a_name; }
40
41   /**
42      Metodo manejador de los mensajes recibidos por el socket. En entornos MT cada socket invocara
43      a su Receiver asociado de forma totalmente independiente.
44
45      \param clientSocket Socket cliente por el que ha llegado el mensaje.
46      \param message Ultimo mensaje recibido. El bloque de datos recibido ya ha sido
47      decodificado aplicando las reglas establecidas por la capa de transporte asociado
48      al ClientSocket por el que llega el mensaje.
49   */
50   virtual void apply(ClientSocket& clientSocket, const Message& message) throw(RuntimeException) = 0;
51
52   /**
53    * Método manejador de la notificación de que el socket va a ser cerrado.
54    * param clientSocket Socket cliente que va a ser cerrado.
55    */
56   virtual void eventBreakConnection(const comm::ClientSocket& clientSocket) throw() {;}
57
58   /**
59    * Método manejador de la notificación de que el socket va a ser cerrado.
60    * param clientSocket Socket cliente que va a ser cerrado.
61    */
62   virtual void eventBreakLocalConnection(const comm::ClientSocket& clientSocket) throw() {;}
63
64   /**
65    * Método manejador de la notificación de que se ha creado una nueva conexion
66    * @param server Proceso servidor con el que hemos establecido la conexion.
67    */
68   virtual void eventCreateConnection(const Server* server) throw() {;}
69
70   /**
71       Devuelve una cadena con toda la informacion relevante de este objeto.
72       \return una cadena con toda la informacion relevante de este objeto.
73    */
74   virtual std::string asString() const
75   throw() {
76     std::string msg("anna::comm::Receiver { Name: ");
77     msg += a_name;
78     return msg += " }";
79   }
80
81   /**
82      Devuelve un nodo XML con la informacion referente a este objeto.
83      \param parent Nodo XML a partir del cual introducir la informacion.
84      \return Un nodo XML con la informacion referente a este objeto.
85   */
86   virtual xml::Node* asXML(xml::Node* parent) const throw(RuntimeException) {
87     xml::Node* node = parent->createChild("comm.Receiver");
88     node->createAttribute("Name", a_name);
89     return node;
90   }
91
92 protected:
93   /**
94      Contructor.
95      \param name Nombre logico del receiver.
96   */
97   Receiver(const char* name) : a_name(name) { ; }
98
99   /**
100      Metodo invocado por el ReceiverFactory en el momento de pasar a usar esta instancia.
101   */
102   virtual void initialize() throw(RuntimeException) { ; }
103
104 private:
105   std::string a_name;
106
107   friend class ReceiverFactory;
108
109   /**
110    * Para poner invocar a #initialize en caso de que se asocie de forma directa el receptor
111    * a un anna::comm::ClientSocket.
112    */
113   friend class ClientSocket;
114 };
115
116 }
117 }
118
119
120 #endif
121