X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/blobdiff_plain/81fe1238505972c209c81f1c729ae910c275cfe9..325f784cbf310091cb5749842a52cf7e1ad64b1b:/Server/src/controlclient.cpp diff --git a/Server/src/controlclient.cpp b/Server/src/controlclient.cpp index 48ef328..e744d0d 100644 --- a/Server/src/controlclient.cpp +++ b/Server/src/controlclient.cpp @@ -39,38 +39,42 @@ namespace Server { ControlClient::~ControlClient(void) { #ifdef DEBUG - cerr << __FILE__ << ": destructor." << endl; + cerr << __FILE__ << "(" << __LINE__ << ")" + << ": destructor." << endl; #endif // DEBUG // TODO Temporal: espero que el receiver muera. - receiver.finish(true); + receiver->finish(true); } -ControlClient::ControlClient(const string& host, const Connection::Port& port): - Connection(sockbuf::sock_stream, host, port) { +ControlClient::ControlClient(const string& _host, + const Connection::Port& _port) throw(sockerr): + Connection(sockbuf::sock_stream, _host, _port) { #ifdef DEBUG - cerr << __FILE__ << ": host = " << host + cerr << __FILE__ << "(" << __LINE__ << ")" + << ": host = " << host << " | port = " << port << endl; #endif // DEBUG + socket->connect(host.c_str(), port); + host = socket->localhost(); + port = socket->localport(); + receiver = new Receiver(7528, host); } void ControlClient::real_run(void) { #ifdef DEBUG - cerr << __FILE__ << ": real_run." << endl; + cerr << __FILE__ << "(" << __LINE__ << ")" + << ": real_run." << endl; #endif // DEBUG try { - socket->connect(host.c_str(), port); } catch (const sockerr& e) { - // Poner una señal de error específica? - error_received(1); - finish(); + // TODO Poner una señal de error específica? + error(e.serrno(), e.errstr()); return; } - host = socket->localhost(); - port = socket->localport(); // TODO sacar signal_connected? connected(); // TODO Temporal: el receiver empieza a escuchar. - receiver.run(); + receiver->run(); while (!stop) { HTTPResponse response; try { @@ -78,14 +82,19 @@ void ControlClient::real_run(void) { socket >> response; // Si se cerró el socket. } catch (const ios::failure& e) { - stop = true; - continue; + // TODO poner buenos codigos de error. + error(1000000, "Se desconectó."); + return; + } catch (const sockerr& e) { + error(e.serrno(), e.errstr()); + return; // Si hay un error al parsear la respuesta. } catch (const HTTPResponse::Error& e) { #ifdef DEBUG - cerr << __FILE__ << " : real_run() ERROR nro: " << e << endl; + cerr << __FILE__ << "(" << __LINE__ << ")" + << " : real_run() ERROR nro: " << e << endl; #endif // DEBUG - // TODO - pasar como parametro codigo de error o algo. + // TODO - es un error recuperable? O manda señal error()? error_received(e); continue; } @@ -101,9 +110,15 @@ void ControlClient::real_run(void) { } void ControlClient::send(const Command& command) { - socket << command << flush; + try { + socket << command << flush; + } catch (const sockerr& e) { + error(e.serrno(), e.errstr()); + finish(); + } #ifdef DEBUG - cerr << __FILE__ << ": send() Enviado!" << endl; + cerr << __FILE__ << "(" << __LINE__ << ")" + << ": send() Enviado!" << endl; #endif // DEBUG } @@ -121,7 +136,10 @@ ControlClient::SignalErrorReceived& ControlClient::signal_error_received(void) { // TODO - temporal Receiver::SignalFrameReceived& ControlClient::signal_frame_received(void) { - return receiver.signal_frame_received(); + // XXX - cuidado, esto puede dar quilombo si no esta protegido por un mutex, + // aunque no deberia porque la señal no es llamada hasta que no se empice + // la transmision y la señal se conecta antes de pedir la transmision. + return receiver->signal_frame_received(); } } // namespace Server