#include "plaqui/server/tcpserver.h"
#include <sigc++/class_slot.h>
-// FIXME - para probar mutex
-#include <glibmm/timer.h>
#ifdef DEBUG
# include <iostream>
#endif // DEBUG
-const unsigned PlaQui::Server::TCPServer::MAX_PENDING_CONNECTIONS = 10;
+using namespace std;
-PlaQui::Server::TCPServer::~TCPServer(void) {
+namespace PlaQui {
+
+namespace Server {
+
+TCPServer::~TCPServer(void) {
#ifdef DEBUG
- std::cerr << __FILE__ << ": destructor." << std::endl;
+ cerr << __FILE__ << ": destructor." << endl;
#endif // DEBUG
}
-PlaQui::Server::TCPServer::TCPServer(int port):
- socket(sockbuf::sock_stream) {
+TCPServer::TCPServer(int port): socket(sockbuf::sock_stream) {
#ifdef DEBUG
- std::cerr << __FILE__ << ": port = " << port << std::endl;
+ cerr << __FILE__ << ": port = " << port << endl;
#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
socket.listen(MAX_PENDING_CONNECTIONS);
#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
}
-void PlaQui::Server::TCPServer::on_connection_finished(
- Connection* connection) {
+void TCPServer::on_connection_finished(Connection* connection) {
#ifdef DEBUG
- std::cerr << __FILE__ << ": on_connection_finished(connection = "
- << connection << ")" << std::endl;
+ cerr << __FILE__ << ": on_connection_finished(connection = "
+ << connection << ")" << endl;
#endif // DEBUG
Glib::Mutex::Lock lock(connections_mutex);
- // XXX connections_mutex.lock();
connections.remove(connection);
#ifdef DEBUG
- std::cerr << __FILE__ << ": lista de conexiones" << std::endl;
+ cerr << __FILE__ << ": lista de conexiones" << endl;
for (ConnectionList::const_iterator i = connections.begin();
i != connections.end(); i++) {
- std::cerr << "\t " << *i << std::endl;
+ cerr << "\t " << *i << endl;
}
#endif // DEBUG
- // XXX connections_mutex.unlock();
}
/// \todo TODO: ver tema de timeout o como salir de un accept().
-void PlaQui::Server::TCPServer::real_run(void) {
+void TCPServer::real_run(void) {
#ifdef DEBUG
- std::cerr << __FILE__ << ": real_run()" << std::endl;
+ cerr << __FILE__ << ": real_run()" << endl;
#endif // DEBUG
Connection* connection;
while (!stop) {
// Forma grasa de salir del accept: crear conexion que salga al toque.
connection = new_connection(socket.accept());
#ifdef DEBUG
- std::cerr << __FILE__ << ": real_run(): connection = " << connection
- << std::endl;
+ 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
- std::cerr << __FILE__ << ": real_run(): lista de conexiones" << std::endl;
+ cerr << __FILE__ << ": real_run(): lista de conexiones" << endl;
for (ConnectionList::const_iterator i = connections.begin();
i != connections.end(); i++) {
- std::cerr << "\t " << *i << std::endl;
+ 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.
connection->signal_finished().connect(
SigC::bind<Connection*>(
&TCPServer::on_connection_finished),
connection));
connection->run();
- //connections_mutex.unlock(); // Si pongo el mutex antes del run(), muere.
}
}
+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
+