- Agregar timeouts (recvtimeout() y sendtimeout()).
- Darle bola al header Connection para saber si cerramos la conexión al
finalizar el request o no.
-- Hacer un try/catch en cada llamada al socket por si se desconecto, para que no
- muera con un segmentation fault.
-- Terminal Response para que lleguen bien todos los comandos al cliente.
-- Ver si sirve Runnable::signal_error y usar si sirve.
+- Redondear e implementar el tema de errores.
+- Terminar Response para que lleguen bien todas las respuestas al cliente con
+ formato XML y codigo de error.
/**
* Obtiene el nombre del host local de la conexión.
- * \todo TODO - Debería devolver una copia? Porque podría morir la
- * conexion y nosotros seguir usando la variable destruida.
*/
- const std::string& get_host(void) const;
+ const std::string get_host(void) const;
/**
* Obtiene el puerto local de la conexión.
- * \todo TODO - Debería devolver una copia? Porque podría morir la
- * conexion y nosotros seguir usando la variable destruida.
*/
- const Port& get_port(void) const;
+ const Port get_port(void) const;
};
/////////////////////////////////////////////////////////////////////
// Tipos.
+ public:
+
+ /////////////////////////////////////////////////////////////////////
+ /// \name Señales.
+ //@{
+
public:
/// Tipo de señal para indicar que se conectó.
/// Tipo de señal para indicar que se recibió un error.
typedef SigC::Signal1<void, unsigned> SignalErrorReceived;
+ /// Tipo de señal para indicar que se recibió un frame. FIXME
+ typedef Receiver::SignalFrameReceived SignalFrameReceived;
+
+ /**
+ * Obtiene la señal para indicar que se recibió una respuesta OK.
+ */
+ SignalOKReceived& signal_ok_received(void);
+
+ /**
+ * Obtiene la señal para indicar que se recibió un error.
+ */
+ SignalErrorReceived& signal_error_received(void);
+
+ /**
+ * Obtiene la señal que avisa cuando se recibió un cuadro.
+ * \todo TODO Temporal.
+ */
+ SignalFrameReceived& signal_frame_received(void);
+
+ //@}
+
/////////////////////////////////////////////////////////////////////
// Atributos.
protected:
- /// Señal para indicar que se conectó.
- SignalConnected connected;
-
/// Señal para indicar que se recibió una respuesta OK.
SignalOKReceived ok_received;
*/
void send(const Command& command);
- /**
- * Obtiene la señal para indicar que se conectó.
- */
- SignalConnected& signal_connected(void);
-
- /**
- * Obtiene la señal para indicar que se recibió una respuesta OK.
- */
- SignalOKReceived& signal_ok_received(void);
-
- /**
- * Obtiene la señal para indicar que se recibió un error.
- */
- SignalErrorReceived& signal_error_received(void);
-
- /**
- * Obtiene la señal que avisa cuando se recibió un cuadro.
- */
- Receiver::SignalFrameReceived& signal_frame_received(void);
-
};
}
cerr << __FILE__ << "(" << __LINE__ << ")"
<< ": finish();" << endl;
#endif // DEBUG
- //socket_mutex.lock();
+ Runnable::finish();
try {
+ // Para que el socket retorne el control, cierro sus canales de E/S.
socket->shutdown(sockbuf::shut_readwrite);
- // FIXME socket->close(sockbuf::shut_readwrite);
- // close(socket->sd());
} catch (const sockerr& e) {
signal_error().emit(e.serrno(), e.errstr());
}
- //socket_mutex.unlock();
- Runnable::finish();
}
-const string& Connection::get_host(void) const {
+const string Connection::get_host(void) const {
return host;
}
-const Connection::Port& Connection::get_port(void) const {
+const Connection::Port Connection::get_port(void) const {
return port;
}
ControlClient::ControlClient(const string& _host,
const Connection::Port& _port) throw(sockerr):
Connection(sockbuf::sock_stream, _host, _port) {
-#ifdef DEBUG
- cerr << __FILE__ << "(" << __LINE__ << ")"
- << ": host = " << host
- << " | port = " << port << endl;
-#endif // DEBUG
socket->connect(host.c_str(), port);
host = socket->localhost();
port = socket->localport();
#ifdef DEBUG
cerr << __FILE__ << "(" << __LINE__ << ")"
- << ": REAL | host = " << host
+ << ": host = " << host
<< " | port = " << port << endl;
#endif // DEBUG
receiver = new Receiver(7528, host);
cerr << ": REAL | host = " << host
<< " | port = " << port << endl;
#endif // DEBUG
- try {
- } catch (const sockerr& e) {
- // TODO Poner una señal de error específica?
- signal_error().emit(e.serrno(), e.errstr());
- return;
- }
- // TODO sacar signal_connected?
- connected();
// TODO Temporal: el receiver empieza a escuchar.
receiver->run();
while (!stop()) {
#endif // DEBUG
}
-ControlClient::SignalConnected& ControlClient::signal_connected(void) {
- return connected;
-}
-
ControlClient::SignalOKReceived& ControlClient::signal_ok_received(void) {
return ok_received;
}