X-Git-Url: https://git.llucax.com/z.facultad/75.42/plaqui.git/blobdiff_plain/ab9300aaf1217f0c3b45dd5f1f1fdc1c5e5bd1be..c5c8d16a2d8c4a0ec1a8d3e83104f73512c91001:/Server/src/receiver.cpp?ds=inline diff --git a/Server/src/receiver.cpp b/Server/src/receiver.cpp index 9667e8c..9133f85 100644 --- a/Server/src/receiver.cpp +++ b/Server/src/receiver.cpp @@ -26,37 +26,83 @@ // #include "plaqui/server/receiver.h" +#include #ifdef DEBUG # include #endif // DEBUG -PlaQui::Server::Receiver::~Receiver(void) { +using namespace std; + +namespace PlaQui { + +namespace Server { + +const string Receiver::FRAME_BEGIN(""); + +Receiver::~Receiver(void) { #ifdef DEBUG - std::cerr << __FILE__ << ": destructor." << std::endl; + cerr << __FILE__ << "(" << __LINE__ << ")" + << ": destructor." << endl; #endif // DEBUG } -PlaQui::Server::Receiver::Receiver(int port, std::string host): - ServerConnection(sockbuf::sock_dgram) { +Receiver::Receiver(const Connection::Port& port, const string& host) + throw(sockerr): Connection(sockbuf::sock_dgram, host, port) { #ifdef DEBUG - std::cerr << __FILE__ << ": port = " << port - << " | host = " << host << std::endl; + cerr << __FILE__ << "(" << __LINE__ << ")" + << ": port = " << port + << " | host = " << host << endl; #endif // DEBUG - // FIXME - deberia ir en run(). - socket->bind(port); + socket->bind(host.c_str(), port); } -void PlaQui::Server::Receiver::real_run(void) { +// XXX EL XML DEBE EMPEZAR Y FINALIZAR EN UNA LINEA SEPARADA. +void Receiver::real_run(void) throw() { #ifdef DEBUG - std::cerr << __FILE__ << ": real_run." << std::endl; + cerr << __FILE__ << "(" << __LINE__ << ")" + << ": real_run." << endl; #endif // DEBUG - // 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; + char buf[BUFSIZ]; + bool in_frame = false; + stringstream ss; + while (!stop()) { + try { + if (!socket.getline(buf, BUFSIZ)) { + return; // Se terminó la transmision. + } + } catch (const sockerr& e) { + signal_error().emit(e.serrno(), e.errstr()); + return; + } + string sbuf = buf; + if (in_frame) { + string::size_type pos = sbuf.find(FRAME_END); + if (pos == string::npos) { // No encuentra el fin + ss << sbuf << endl; + } else { // Encuentra el fin. + // Agrego al mensaje actual hasta el final . + ss << sbuf.substr(0, pos + FRAME_END.length()); + frame_received(ss.str()); + ss.str(""); + in_frame = false; + } + } else { // No esta en un frame. + string::size_type pos = sbuf.find(FRAME_BEGIN); + if (pos != string::npos) { // Encuentra el inicio + ss << sbuf.substr(pos) << endl; + in_frame = true; + } + } } } +Receiver::SignalFrameReceived& Receiver::signal_frame_received(void) { + return frame_received; +} + +} // namespace Server + +} // namespace PlaQui +