X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=network%2Fserver.cpp;h=f97e1aed9d4d32732ec4aba76f40fd9d75aa4e16;hp=ae8cd5707eac12711c99f4e571cf166777ce0a48;hb=e368a1672c4f917bfa6adb52dae3b5ebfcd0db18;hpb=09494f0681def3c6cf585eda25b8bb236560ddac diff --git a/network/server.cpp b/network/server.cpp index ae8cd570..f97e1aed 100644 --- a/network/server.cpp +++ b/network/server.cpp @@ -18,58 +18,50 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ +#include "quassel.h" #include "server.h" +#include "cmdcodes.h" + +#include Server::Server() { - socket = new QTcpSocket(); } Server::~Server() { - delete socket; + } void Server::init() { - Message::init(&handleServerMsg, &handleUserMsg); + //Message::init(&dispatchServerMsg, &dispatchUserMsg); } void Server::run() { - connect(socket, SIGNAL(connected()), this, SLOT(socketConnected())); - connect(socket, SIGNAL(disconnected()), this, SLOT(socketDisconnected())); - connect(socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(socketError(QAbstractSocket::SocketError))); - connect(socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(socketStateChanged(QAbstractSocket::SocketState))); - connect(socket, SIGNAL(readyRead()), this, SLOT(socketHasData())); - - stream.setDevice(socket); - //connectToIrc("irc.quakenet.org", 6667); - exec(); -} + connect(&socket, SIGNAL(connected()), this, SLOT(socketConnected())); + connect(&socket, SIGNAL(disconnected()), this, SLOT(socketDisconnected())); + connect(&socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(socketError(QAbstractSocket::SocketError))); + connect(&socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(socketStateChanged(QAbstractSocket::SocketState))); + connect(&socket, SIGNAL(readyRead()), this, SLOT(socketHasData())); -/* -QAbstractSocket::SocketState TcpConnection::state( ) const { - return socket.state(); + exec(); } -*/ void Server::connectToIrc( const QString & host, quint16 port ) { qDebug() << "Connecting..."; - socket->connectToHost(host, port); + socket.connectToHost(host, port); } void Server::disconnectFromIrc( ) { - socket->disconnectFromHost(); -} - -void Server::putRawLine( const QString &s ) { - qDebug() << "Raw line: " << s; - stream << s << "\r\n" << flush; + socket.disconnectFromHost(); } -void Server::socketHasData( ) { - while(socket->canReadLine()) { - QString s = stream.readLine(); +void Server::socketHasData() { + while(socket.canReadLine()) { + QString s = socket.readLine().trimmed(); qDebug() << "Read: " << s; - emit recvLine(s + "\n"); + emit recvRawServerMsg(s); + //Message *msg = Message::createFromServerString(this, s); + handleServerMsg(s); } } @@ -80,7 +72,8 @@ void Server::socketError( QAbstractSocket::SocketError err ) { void Server::socketConnected( ) { qDebug() << "Socket connected!"; - //emit connected(); + putRawLine("NICK :Sput|QuasselDev"); + putRawLine("USER Sputnick 8 * :Using Quassel IRC (WiP Version)"); } void Server::socketDisconnected( ) { @@ -92,13 +85,124 @@ void Server::socketStateChanged(QAbstractSocket::SocketState state) { qDebug() << "Socket state changed: " << state; } +void Server::putRawLine(QString s) { + qDebug() << "SentRaw: " << s; + s += "\r\n"; + socket.write(s.toAscii()); +} + +void Server::putCmd(QString cmd, QStringList params, QString prefix) { + QString m; + if(!prefix.isEmpty()) m += ":" + prefix + " "; + m += cmd.toUpper(); + for(int i = 0; i < params.size() - 1; i++) { + m += " " + params[i]; + } + if(!params.isEmpty()) m += " :" + params.last(); + qDebug() << "SentCmd: " << m; + m += "\r\n"; + socket.write(m.toAscii()); +} + +/** Handle a raw message string sent by the server. We try to find a suitable handler, otherwise we call a default handler. */ +void Server::handleServerMsg(QString msg) { + try { + if(msg.isEmpty()) { + qWarning() << "Received empty string from server!"; + return; + } + // OK, first we split the raw message into its various parts... + QString prefix; + QString cmd; + QStringList params; + if(msg[0] == ':') { + msg.remove(0,1); + prefix = msg.section(' ', 0, 0); + msg = msg.section(' ', 1); + } + cmd = msg.section(' ', 0, 0).toUpper(); + msg = msg.section(' ', 1); + QString left = msg.section(':', 0, 0); + QString trailing = msg.section(':', 1); + if(!left.isEmpty()) { + params << left.split(' ', QString::SkipEmptyParts); + } + if(!trailing.isEmpty()) { + params << trailing; + } + // Now we try to find a handler for this message. BTW, I do love the Trolltech guys ;-) + QString hname = cmd.toLower(); + hname[0] = hname[0].toUpper(); + hname = "handle" + hname + "FromServer"; + if(!QMetaObject::invokeMethod(this, hname.toAscii(), Q_ARG(QString, prefix), Q_ARG(QStringList, params))) { + // Ok. Default handler it is. + defaultHandlerForServer(cmd, prefix, params); + } + } catch(Exception e) { + emit recvLine(e.msg()); + } +} + +void Server::defaultHandlerForServer(QString cmd, QString prefix, QStringList params) { + uint num = cmd.toUInt(); + if(num) { + recvLine(cmd + " " + params.join(" ")); + } else { + recvLine(QString("Unknown: ") + cmd + " " + params.join(" ")); + } +} + +void Server::handleUserMsg(QString usrMsg) { + +} + +/* void Server::handleServerMsg(Message *msg) { + int cmdCode = msg->getCmdCode(); + QString prefix = msg->getPrefix(); + QStringList params = msg->getParams(); + if(cmdCode < 0) { + switch(-cmdCode) { + case CMD_PING: + // PING [] + if(params.size() < 1 || params.size() > 2) throw ParseError(msg); + putCmd("PONG", params); + break; + + default: + throw Exception(QString("No handler installed for command: ") + msg->getCmd() + " " + msg->getParams().join(" ")); + } + } else if(msg->getCmdCode() > 0) { + switch(msg->getCmdCode()) { + + default: + // + throw Exception(msg->getCmd() + " " + msg->getParams().join(" ")); + } + + } else { + throw UnknownCmdError(msg); + } +} +*/ + +void Server::handleNoticeFromServer(QString prefix, QStringList params) { + recvLine(params.join(" ")); } -void Server::handleUserMsg(Message *msg) { +void Server::handlePingFromServer(QString prefix, QStringList params) { + putCmd("PONG", params); +} +/* Exception classes for message handling */ +Server::ParseError::ParseError(QString cmd, QString prefix, QStringList params) { + _msg = QString("Command Parse Error: ") + cmd + params.join(" "); } +Server::UnknownCmdError::UnknownCmdError(QString cmd, QString prefix, QStringList params) { + _msg = QString("Unknown Command: ") + cmd; + +}