X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/blobdiff_plain/ffc9f02ea0544d4b1aa86e29afe12a2b4bace953..01aa13f85f3032dff11fc23efdaf5a13389bf60e:/Server/src/controlclient.cpp diff --git a/Server/src/controlclient.cpp b/Server/src/controlclient.cpp index ac8886a..e4293ae 100644 --- a/Server/src/controlclient.cpp +++ b/Server/src/controlclient.cpp @@ -27,6 +27,8 @@ #include "plaqui/server/response.h" #include "plaqui/server/controlclient.h" +#include +#include #ifdef DEBUG # include #endif // DEBUG @@ -42,10 +44,13 @@ ControlClient::~ControlClient(void) { cerr << __FILE__ << "(" << __LINE__ << ")" << ": destructor." << endl; #endif // DEBUG - // TODO Temporal: espero que el receiver muera. - // Conectar señal on_receiver_finished() y esperar a que el puntero sea - // NULL para saber que terminó. - receiver->finish(); + // FIXME Temporal: espero que el receiver muera. + if (receiver) { + receiver->finish(); + } + while (receiver) { + Glib::usleep(100000); // 0,1 segundo + } } ControlClient::ControlClient(const string& _host, @@ -59,7 +64,12 @@ ControlClient::ControlClient(const string& _host, << ": host = " << host << " | port = " << port << endl; #endif // DEBUG + // 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) throw() { @@ -74,32 +84,33 @@ void ControlClient::real_run(void) throw() { while (!stop()) { Response response; try { - //Glib::Mutex::Lock lock(socket_mutex); socket >> response; // Si se cerró el socket. } catch (const ios::failure& e) { - // TODO poner buenos codigos de error. + // 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__ << "(" << __LINE__ << ")" << " : real_run() ERROR nro: " << e << endl; #endif // DEBUG - // TODO - es un error recuperable? O manda señal error()? - error_received(e); + signal_error().emit(e, "La respuesta recibida es inválida"); continue; } - switch (response.xml_code) { + switch (response.get_code()) { case Response::OK: - ok_received(response.xml_body); + ok_received(response.get_contents()); break; default: - error_received(response.xml_code); + error_received(response.get_code(), response.get_description()); break; } } @@ -118,6 +129,15 @@ void ControlClient::send(const Command& command) { #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; } @@ -127,7 +147,7 @@ ControlClient::SignalErrorReceived& ControlClient::signal_error_received(void) { } // TODO - temporal -Receiver::SignalFrameReceived& ControlClient::signal_frame_received(void) { +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.