X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/blobdiff_plain/802f79cdb0d688127b8a639cd3173d801a1466cd..1855f998e5c0e51e2c1958724ac84cc13a87d84c:/Server/src/controlclient.cpp diff --git a/Server/src/controlclient.cpp b/Server/src/controlclient.cpp index 7138b44..ac8886a 100644 --- a/Server/src/controlclient.cpp +++ b/Server/src/controlclient.cpp @@ -25,26 +25,116 @@ // $Id$ // +#include "plaqui/server/response.h" #include "plaqui/server/controlclient.h" -// XXX -#include +#ifdef DEBUG +# include +#endif // DEBUG -using namespace PlaQui::Server; +using namespace std; -ControlClient::ControlClient(std::string host, int port): - Connection(sockbuf::sock_stream) { - // FIXME - poner en run(). +namespace PlaQui { + +namespace Server { + +ControlClient::~ControlClient(void) { +#ifdef DEBUG + 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(); +} + +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__ << "(" << __LINE__ << ")" + << ": host = " << host + << " | port = " << port << endl; +#endif // DEBUG + receiver = new Receiver(7528, host); } -void ControlClient::real_run(void) { - // FIXME - debería tirar una excepción? - if (!socket->is_open()) { - std::cerr << "No se pudo conectar a " << socket->peerhost() << - ":" << socket->peerport() << "." << std::endl; - } else { - std::cerr << "Conectado a " << socket->peerhost() << - ":" << socket->peerport() << "." << std::endl; +void ControlClient::real_run(void) throw() { +#ifdef DEBUG + cerr << __FILE__ << "(" << __LINE__ << ")" + << ": real_run." << endl; + cerr << ": REAL | host = " << host + << " | port = " << port << endl; +#endif // DEBUG + // 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) { + // TODO poner buenos codigos de error. + signal_error().emit(1000000, "Se desconectó."); + return; + } catch (const sockerr& e) { + signal_error().emit(e.serrno(), e.errstr()); + return; + // 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); + continue; + } + switch (response.xml_code) { + case Response::OK: + ok_received(response.xml_body); + break; + default: + error_received(response.xml_code); + 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 +} + +ControlClient::SignalOKReceived& ControlClient::signal_ok_received(void) { + return ok_received; +} + +ControlClient::SignalErrorReceived& ControlClient::signal_error_received(void) { + return error_received; +} + +// TODO - temporal +Receiver::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 + +} // namespace PlaQui +