]> git.llucax.com Git - z.facultad/75.42/plaqui.git/blobdiff - Server/src/tcpserver.cpp
Luca, si podes lleva esto, no creo que termine nada mas hoy
[z.facultad/75.42/plaqui.git] / Server / src / tcpserver.cpp
index 82f157706bcaf5a5c4efe58e99b113ecb786a8ca..0f97fe5a762b5fbaebcfc0410ff62685cbad39cf 100644 (file)
 //
 
 #include "plaqui/server/tcpserver.h"
 //
 
 #include "plaqui/server/tcpserver.h"
-#include <sigc++/class_slot.h> // FIXME
+#include <sigc++/class_slot.h>
 #ifdef DEBUG
 #      include <iostream>
 #endif // DEBUG
 
 #ifdef DEBUG
 #      include <iostream>
 #endif // DEBUG
 
-PlaQui::Server::TCPServer::~TCPServer(void) {
+using namespace std;
+
+namespace PlaQui {
+
+namespace Server {
+
+TCPServer::~TCPServer(void) {
 #ifdef DEBUG
 #ifdef DEBUG
-       std::cerr << __FILE__ <<  ": destructor." << std::endl;
+       cerr << __FILE__ <<  ": destructor." << endl;
 #endif // DEBUG
 }
 
 #endif // DEBUG
 }
 
-PlaQui::Server::TCPServer::TCPServer(int port):
-               socket(sockbuf::sock_stream) {
+TCPServer::TCPServer(int port):        socket(sockbuf::sock_stream) {
 #ifdef DEBUG
 #ifdef DEBUG
-       std::cerr << __FILE__ <<  ": port = " << port << std::endl;
+       cerr << __FILE__ <<  ": port = " << port << endl;
 #endif // DEBUG
        socket.bind(port);
 #ifdef DEBUG
 #endif // DEBUG
        socket.bind(port);
 #ifdef DEBUG
-       std::cerr << __FILE__ <<  ": escuchando en " << socket.localhost()
-               << ":" << socket.localport() << "." << std::endl;
+       cerr << __FILE__ <<  ": escuchando en " << socket.localhost()
+               << ":" << socket.localport() << "." << endl;
 #endif // DEBUG
 #endif // DEBUG
-       socket.listen();
+       socket.listen(MAX_PENDING_CONNECTIONS);
 #ifdef DEBUG
 #ifdef DEBUG
-       std::cerr << __FILE__ <<  ": [despues de listen()] escuchando en "
-               << socket.localhost() << ":" << socket.localport() << "." << std::endl;
+       cerr << __FILE__ <<  ": [despues de listen()] escuchando en "
+               << socket.localhost() << ":" << socket.localport() << "." << endl;
 #endif // DEBUG
 }
 
 #endif // DEBUG
 }
 
-void PlaQui::Server::TCPServer::on_connection_finished(
-               PlaQui::Server::Connection* connection) {
+void TCPServer::on_connection_finished(Connection* connection) {
 #ifdef DEBUG
 #ifdef DEBUG
-       std::cerr << __FILE__ <<  ": on_connection_finished(connection = "
-               << connection << ")" << std::endl;
+       cerr << __FILE__ <<  ": on_connection_finished(connection = "
+               << connection << ")" << endl;
 #endif // DEBUG
 #endif // DEBUG
-       // TODO: poner lock.
+       Glib::Mutex::Lock lock(connections_mutex);
        connections.remove(connection);
        connections.remove(connection);
-       // TODO: sacar lock.
+#ifdef DEBUG
+       cerr << __FILE__ <<  ": lista de conexiones" << endl;
+       for (ConnectionList::const_iterator i = connections.begin();
+                       i != connections.end(); i++) {
+               cerr << "\t " << *i << endl;
+       }
+#endif // DEBUG
 }
 
 }
 
-void PlaQui::Server::TCPServer::real_run(void) {
+/// \todo TODO: ver tema de timeout o como salir de un accept().
+void TCPServer::real_run(void) {
 #ifdef DEBUG
 #ifdef DEBUG
-       std::cerr << __FILE__ <<  ": real_run" << std::endl;
+       cerr << __FILE__ <<  ": real_run()" << endl;
 #endif // DEBUG
 #endif // DEBUG
-       PlaQui::Server::Connection* conn;
+       Connection* connection;
        while (!stop) {
        while (!stop) {
-               // TODO: ver tema de timeout o como salir de un accept().
                // Forma grasa de salir del accept: crear conexion que salga al toque.
                // Forma grasa de salir del accept: crear conexion que salga al toque.
-               conn = new_connection(socket.accept());
-               // TODO: poner lock.
-               connections.push_back(conn);
-               // TODO: sacar lock.
-               // TODO: esto va en Server::new_connection()
+               connection = new_connection(socket.accept());
+#ifdef DEBUG
+               cerr << __FILE__ <<  ": real_run(): connection = " << connection
+                       << endl;
+#endif // DEBUG
+               Glib::Mutex::Lock lock(connections_mutex);
+               // XXX connections_mutex.lock();
+               connections.push_back(connection);
+#ifdef DEBUG
+               cerr << __FILE__ <<  ": real_run(): lista de conexiones" << endl;
+               for (ConnectionList::const_iterator i = connections.begin();
+                               i != connections.end(); i++) {
+                       cerr << "\t " << *i << endl;
+               }
+#endif // DEBUG
+               // XXX connections_mutex.unlock(); // Si pongo el mutex antes del run(),
+               //                                    muere.
                // Conecto la señal para cuando termina una conexión, borrarla.
                // Conecto la señal para cuando termina una conexión, borrarla.
-               conn->signal_finished().connect(
-                               SigC::bind<PlaQui::Server::Connection*>(
+               connection->signal_finished().connect(
+                               SigC::bind<Connection*>(
                                        SigC::slot_class(*this,
                                        SigC::slot_class(*this,
-                                               &PlaQui::Server::TCPServer::on_connection_finished),
-                                       conn));
-               conn->run();
+                                               &TCPServer::on_connection_finished),
+                                       connection));
+               connection->run();
+       }
+}
+
+TCPServer::ConnectionInfoList TCPServer::get_connected(void) {
+#ifdef DEBUG
+       cerr << __FILE__ <<  ": get_connected()" << endl;
+#endif // DEBUG
+       TCPServer::ConnectionInfoList con;
+       Glib::Mutex::Lock lock(connections_mutex);
+       for (ConnectionList::const_iterator i = connections.begin();
+                       i != connections.end(); i++) {
+               TCPServer::ConnectionInfo ci =
+                       { (*i)->get_peerhost(), (*i)->get_peerport() };
+               con.push_back(ci);
        }
        }
+       return con;
 }
 
 }
 
+} // namespace Server
+
+} // namespace PlaQui
+