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