From: Leandro Lucarella Date: Sun, 30 Nov 2003 02:26:53 +0000 (+0000) Subject: Se mejora el manejo de errores. Ahora con el codigo de error va una descripcion X-Git-Tag: svn_import~156 X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/commitdiff_plain/bed1e8f7b596cf1aa73c25b8b39dcffe145fa018 Se mejora el manejo de errores. Ahora con el codigo de error va una descripcion mucho mas agradable. --- diff --git a/Client/include/principal.h b/Client/include/principal.h index 6984359..5f78d99 100644 --- a/Client/include/principal.h +++ b/Client/include/principal.h @@ -88,7 +88,8 @@ protected: // Callbacks para las conexiones void on_conexion_finished(); void on_conexion_ok(const std::string &body); - void on_conexion_error(unsigned code); + void on_conexion_fatal_error(const PlaQui::Server::ControlClient::Error& code, const std::string& desc); + void on_conexion_error(unsigned code, const std::string& desc); void on_conexion_frame(const std::string &frame); }; diff --git a/Client/src/principal.cpp b/Client/src/principal.cpp index 96093c1..845de81 100644 --- a/Client/src/principal.cpp +++ b/Client/src/principal.cpp @@ -80,7 +80,7 @@ Principal::~Principal() } // Espera a que termine realmente. while (conexion) { - Glib::usleep(10000); // 10 milisegundos + Glib::usleep(100000); // 0,1 segundo } } @@ -155,6 +155,7 @@ void Principal::on_dlg_connect_ok() // Conecto las señales conexion->signal_ok_received().connect( SigC::slot(*this, &Principal::on_conexion_ok) ); + conexion->signal_error().connect( SigC::slot(*this, &Principal::on_conexion_fatal_error) ); conexion->signal_error_received().connect( SigC::slot(*this, &Principal::on_conexion_error) ); conexion->signal_finished().connect( SigC::slot(*this, &Principal::on_conexion_finished) ); conexion->signal_frame_received().connect(SigC::slot(*this, &Principal::on_conexion_frame)); @@ -321,14 +322,29 @@ void Principal::on_conexion_ok(const std::string &body) } } -void Principal::on_conexion_error(unsigned code) +void Principal::on_conexion_fatal_error(const PlaQui::Server::ControlClient::Error& code, const std::string& desc) { std::stringstream a; std::string s; a << code; a >> s; - txt_view->get_buffer()->insert_at_cursor("El server dice que hay error : "); + txt_view->get_buffer()->insert_at_cursor("Error de red nro. "); txt_view->get_buffer()->insert_at_cursor(s); + txt_view->get_buffer()->insert_at_cursor(": "); + txt_view->get_buffer()->insert_at_cursor(desc); + txt_view->get_buffer()->insert_at_cursor("\n"); +} + +void Principal::on_conexion_error(unsigned code, const std::string& desc) +{ + std::stringstream a; + std::string s; + a << code; + a >> s; + txt_view->get_buffer()->insert_at_cursor("El server dice que hay error nro. "); + txt_view->get_buffer()->insert_at_cursor(s); + txt_view->get_buffer()->insert_at_cursor(": "); + txt_view->get_buffer()->insert_at_cursor(desc); txt_view->get_buffer()->insert_at_cursor("\n"); } diff --git a/Server/include/plaqui/server/controlclient.h b/Server/include/plaqui/server/controlclient.h index 8de78d7..3d0448b 100644 --- a/Server/include/plaqui/server/controlclient.h +++ b/Server/include/plaqui/server/controlclient.h @@ -30,7 +30,7 @@ #include "plaqui/server/command.h" #include "plaqui/server/connection.h" -#include "plaqui/server/receiver.h" // TODO TEMPRORAL +#include "plaqui/server/receiver.h" // FIXME TEMPRORAL #include namespace PlaQui { @@ -55,7 +55,8 @@ namespace Server { typedef SigC::Signal1 SignalOKReceived; /// Tipo de señal para indicar que se recibió un error. - typedef SigC::Signal1 SignalErrorReceived; + typedef SigC::Signal2 + SignalErrorReceived; /// Tipo de señal para indicar que se recibió un frame. FIXME typedef Receiver::SignalFrameReceived SignalFrameReceived; @@ -72,7 +73,7 @@ namespace Server { /** * Obtiene la señal que avisa cuando se recibió un cuadro. - * \todo TODO Temporal. + * \todo FIXME Temporal. */ SignalFrameReceived& signal_frame_received(void); @@ -89,7 +90,7 @@ namespace Server { /// Señal para indicar que se recibió un error. SignalErrorReceived error_received; - /// Receptor del estado de la planta TODO Temporal. + /// Receptor del estado de la planta FIXME Temporal. Receiver* receiver; ///////////////////////////////////////////////////////////////////// @@ -126,6 +127,18 @@ namespace Server { */ void send(const Command& command); + /** + * Envia una señal de error si hay un error en la recepción. + * \todo FIXME Temporal. + */ + void on_receiver_error(const Error& code, const std::string& desc); + + /** + * Limpia el puntero del receptor cuando termina. + * \todo FIXME Temporal. + */ + void on_receiver_finished(void); + }; } diff --git a/Server/src/controlclient.cpp b/Server/src/controlclient.cpp index 291272f..1f96585 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 @@ -43,9 +45,12 @@ ControlClient::~ControlClient(void) { << ": 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(); + if (receiver) { + receiver->finish(); + } + while (receiver) { + Glib::usleep(100000); // 0,1 segundo + } } ControlClient::ControlClient(const string& _host, @@ -60,6 +65,10 @@ ControlClient::ControlClient(const string& _host, << " | port = " << port << endl; #endif // DEBUG 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() { @@ -93,7 +102,7 @@ void ControlClient::real_run(void) throw() { << " : real_run() ERROR nro: " << e << endl; #endif // DEBUG // TODO - es un error recuperable? O manda señal error()? - error_received(e); + error_received(e, "La respuesta recibida es inválida"); continue; } switch (response.get_code()) { @@ -101,7 +110,7 @@ void ControlClient::real_run(void) throw() { ok_received(response.get_contents()); break; default: - error_received(response.get_code()); + error_received(response.get_code(), response.get_description()); break; } } @@ -120,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; } @@ -129,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.