11 /** Conector genérico de elementos
13 * El conector es un interfaz común que permite a objetos de distinto
14 * tipo comunicarse entre sí sin la necesidad de conocerse.
15 * Maneja una lista de elementos conectados a uno, que pueden estar
16 * tanto conectados a una entrada como a una salida.
22 * \param in Cantidad de entradas
23 * \param out Cantidad de salidas
25 IConector(unsigned in, unsigned out);
29 /** Envía un mensage a los elementos conectados
31 * Envía un mensage a los elementos conectados a la entrada o
33 * \param where Donde enviar el mensage, IConector::IN o IConector::OUT
34 * \param msg Mensage a enviar
36 void send_msg(int where, int msg, void *data=NULL);
40 * Este procedimiento atiende los mensages enviados por otros objetos.
41 * El mensage \e msg es enviado por \e who, quien puede enviar opcionalmente
42 * un dato en \e data. El campo \e data debe ser interpretado en forma
43 * correcta dependiendo del mensage enviado.
44 * El objeto que recibe un mensage puede, de ser necesario, responder al
45 * objeto que lo envió llamando directamente al método recieve_msg del objeto
46 * \e who. No se recomienda enviar un mensage mediante send_msg ya que puede
47 * ocacionar que objetos que no esten esperando una respuesta se comporte de
48 * manera indeterminada.
49 * \param msg ID del mensage enviado.
50 * \param who Objeto que envía el mensage.
51 * \param data Dato opcional a enviar.
53 virtual void recieve_msg(int msg, IConector *who, void *data);
55 /** Conecta un objeto con otro
57 * \param place IConector::IN o IConecor::OUT para conectar a la entrada o salida.
58 * \param obj Objeto a conectar
59 * \return true si se pudo conectar
61 bool connect(IConector *obj, int place);
63 /// Constantes de posición donde conectar
65 IN, ///< conectar a la entrada
66 OUT ///< conectar a la salida
69 /** Mensages a este nivel
71 * Las clases descendientes que quieran definir sus mensajes deben utilizar
72 * el valor de IConector::MSG_LAST como valor para el primer msg, a fin
73 * de evitar solapamiento de mensajes.
74 * Por ejemplo, si tenemos una clase B con un mensaje TEST se declararía
77 * class B:public IConector {
79 * MSG_TEST=IConector::MSG_LAST,
85 MSG_DISCONECT=0, ///< Desconectar el objeto que envía el mensaje
89 /// Lista de objetos conectados a las entradas
90 std::list<IConector *> in_list;
91 /// Lista de objetos conectados a las salidas
92 std::list<IConector *> out_list;
93 /// Cantidad de entradas disponibles
94 unsigned int in_slots;
95 /// Canitidad de salidas disponibles
96 unsigned int out_slots;
99 // Oculto copia entre clases
101 IConector(const IConector &) {}
102 IConector &operator = (const IConector &) { return (*this); }
106 } // namespace PlaQui
108 #endif // _I_CONECTOR_H_