00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include <QTextStream>
00030
00031 #include "config.hpp"
00032 #include "Log.hpp"
00033 #include "Mensajero.hpp"
00034 #include "Servidor.hpp"
00035
00036
00037 extern Mensajero *miMensaj;
00038
00039
00040
00041
00043 Conexion::Conexion (int desc)
00044 {
00045 setSocketDescriptor (desc);
00046
00047 descriptor = desc;
00048 direccion = new QString (peerAddress().toString());
00049
00050 connect (this, SIGNAL (disconnected()), SLOT (ConexionCerrada()));
00051 connect (this, SIGNAL (readyRead()), SLOT (Lee()));
00052 }
00053
00055 Conexion::~Conexion ()
00056 {
00057 qDebug ("Destructor de Conexion");
00058
00059 delete direccion;
00060 }
00061
00063 void Conexion::ConexionCerrada ()
00064 {
00065 emit (EliminarConexion (this));
00066 }
00067
00069 void Conexion::Lee ()
00070 {
00071 QTextStream stream (this);
00072
00073 if (canReadLine())
00074 {
00075 QString linea = stream.readLine();
00076 miMensaj->NuevaLinea (socketDescriptor(), linea);
00077 }
00078 }
00079
00081 void Conexion::Escribe (const QString &texto)
00082 {
00083 QTextStream stream (this);
00084
00085 stream << texto;
00086 }
00087
00088
00089
00090
00092 Servidor::Servidor ()
00093 {
00094 setMaxPendingConnections (NUM_MAX_CONXS_PENDS);
00095
00096 if (!listen (QHostAddress::Any, NUM_PUERTO))
00097 qFatal ("El servidor no se ha podido asociar al puerto %d.", NUM_PUERTO);
00098
00099 QString puerto;
00100 puerto.setNum (NUM_PUERTO);
00101 Log (8, "Servidor a la espera de nuevas conexiones en el puerto " + puerto +
00102 ".\n");
00103 }
00104
00106 Servidor::~Servidor ()
00107 {
00108 qDebug ("Destructor de Servidor");
00109
00110
00111 foreach (Conexion *con, conexiones)
00112 delete (con);
00113 }
00114
00116 void Servidor::CierraConexion (const int descriptor)
00117 {
00118 if (!conexiones.contains (descriptor))
00119 qFatal ("Intento de cerrar la conexión de un descriptor no presente.");
00120
00121 Conexion *con = conexiones.value (descriptor);
00122
00123 EliminarConexion (con);
00124 }
00125
00127 void Servidor::EliminarConexion (Conexion *con)
00128 {
00129 Log (6, "Cerrando conexión");
00130 Log (5, " procedente de la dirección IP: " + *con->direccion);
00131 Log (6, "\n");
00132 miMensaj->EliminaCanal (con->descriptor);
00133 conexiones.remove (con->descriptor);
00134 delete con;
00135
00136 QString num_conexiones;
00137 num_conexiones.setNum (conexiones.count());
00138 Log (4, "Ahora mismo hay " + num_conexiones + " conexiones abiertas.\n");
00139 }
00140
00142 void Servidor::Escribe (const int descriptor, const QString &texto)
00143 {
00144 if (!conexiones.contains (descriptor))
00145 qFatal ("Intento de escritura hacia un descriptor no presente.");
00146
00147 Conexion *destino = conexiones.value (descriptor);
00148
00149 destino->Escribe (texto);
00150 }
00151
00153 void Servidor::incomingConnection (const int descriptor)
00154 {
00155 Conexion *entrante = new Conexion (descriptor);
00156
00157
00158 conexiones.insert (descriptor, entrante);
00159
00160 connect (entrante, SIGNAL (EliminarConexion (Conexion *)), this,
00161 SLOT (EliminarConexion (Conexion *)));
00162
00163 miMensaj->NuevoCanal (descriptor);
00164
00165 Log (6, "Nueva conexión entrante aceptada.\n");
00166 Log (5, "La conexión proviene de la dirección IP: " + *entrante->direccion +
00167 "\n");
00168
00169 QString num_conexiones;
00170 num_conexiones.setNum (conexiones.count());
00171 Log (4, "Ahora mismo hay " + num_conexiones);
00172 if (conexiones.count() == 1)
00173 Log (4, " conexión abierta.\n");
00174 else
00175 Log (4, " conexiones abiertas.\n");
00176 }