X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/blobdiff_plain/6bffb655ac989fe4f115763270f84175bf24e4bb..ea3d0f30b8e44952b1b9ac3e2f5b2a08cd65ca48:/Server/src/controlclient.cpp?ds=sidebyside diff --git a/Server/src/controlclient.cpp b/Server/src/controlclient.cpp index ffce9c0..e4293ae 100644 --- a/Server/src/controlclient.cpp +++ b/Server/src/controlclient.cpp @@ -25,7 +25,10 @@ // $Id$ // +#include "plaqui/server/response.h" #include "plaqui/server/controlclient.h" +#include +#include #ifdef DEBUG # include #endif // DEBUG @@ -38,53 +41,103 @@ namespace Server { ControlClient::~ControlClient(void) { #ifdef DEBUG - cerr << __FILE__ << ": destructor." << endl; + cerr << __FILE__ << "(" << __LINE__ << ")" + << ": destructor." << endl; #endif // DEBUG + // FIXME Temporal: espero que el receiver muera. + if (receiver) { + receiver->finish(); + } + while (receiver) { + Glib::usleep(100000); // 0,1 segundo + } } -ControlClient::ControlClient(string host, int port): - Connection(sockbuf::sock_stream) { +ControlClient::ControlClient(const string& _host, + const Connection::Port& _port) throw(sockerr): + Connection(sockbuf::sock_stream, _host, _port) { + socket->connect(host.c_str(), port); + host = socket->localhost(); + port = socket->localport(); #ifdef DEBUG - cerr << __FILE__ << ": host" << host + cerr << __FILE__ << "(" << __LINE__ << ")" + << ": host = " << host << " | port = " << port << endl; #endif // DEBUG - socket->connect(host.c_str(), port); - if (!socket->is_open()) { - throw ios::failure("Can't connect!"); - } + // FIXME temporal + receiver = new Receiver(7528, host); + receiver->signal_finished().connect(SigC::slot_class(*this, + &ControlClient::on_receiver_finished)); + receiver->signal_error().connect(SigC::slot_class(*this, + &ControlClient::on_receiver_error)); } -void ControlClient::real_run(void) { +void ControlClient::real_run(void) throw() { #ifdef DEBUG - cerr << __FILE__ << ": real_run." << endl; + cerr << __FILE__ << "(" << __LINE__ << ")" + << ": real_run." << endl; + cerr << ": REAL | host = " << host + << " | port = " << port << endl; #endif // DEBUG - while (!stop) { - HTTPResponse response; + // TODO Temporal: el receiver empieza a escuchar. + receiver->run(); + while (!stop()) { + Response response; try { - //Glib::Mutex::Lock lock(socket_mutex); socket >> response; // Si se cerró el socket. } catch (const ios::failure& e) { - stop = true; + // FIXME poner buenos codigos de error. + signal_error().emit(1000000, "Se desconectó."); + return; + } catch (const sockerr& e) { + signal_error().emit(e.serrno(), e.errstr()); + return; + } catch (const xmlpp::parse_error& e) { + signal_error().emit(100001, e.what()); continue; // 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. - error_received(); + signal_error().emit(e, "La respuesta recibida es inválida"); continue; } - switch (response.status_code) { - case HTTPMessage::OK: - ok_received(); + switch (response.get_code()) { + case Response::OK: + ok_received(response.get_contents()); + break; default: - error_received(); + error_received(response.get_code(), response.get_description()); + break; } } } +void ControlClient::send(const Command& command) { + try { + socket << command << flush; + } catch (const sockerr& e) { + signal_error().emit(e.serrno(), e.errstr()); + finish(); + } +#ifdef DEBUG + cerr << __FILE__ << "(" << __LINE__ << ")" + << ": send() Enviado!" << endl; +#endif // DEBUG +} + +void ControlClient::on_receiver_finished(void) { + receiver = NULL; +} + +void ControlClient::on_receiver_error(const Runnable::Error& code, + const string& desc) { + signal_error().emit(code, string("Receiver Error: ") + desc); +} + ControlClient::SignalOKReceived& ControlClient::signal_ok_received(void) { return ok_received; } @@ -93,11 +146,12 @@ ControlClient::SignalErrorReceived& ControlClient::signal_error_received(void) { return error_received; } -void ControlClient::send(const Command& command) { - socket << command << flush; -#ifdef DEBUG - cerr << __FILE__ << ": send() Enviado!" << endl; -#endif // DEBUG +// TODO - temporal +ControlClient::SignalFrameReceived& ControlClient::signal_frame_received(void) { + // 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