From 7bcf3798d7e4edb49345f40c7c543f7a9bb97805 Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Mon, 16 Oct 2006 21:58:48 +0000 Subject: [PATCH] Work in progress --- network/CMakeLists.txt | 4 +- network/builtin_cmds.cpp | 2 +- network/builtin_handlers.cpp | 2 +- network/{messages.cpp => message.cpp} | 60 ++++++++++++++++++++------- network/{messages.h => message.h} | 32 +++++++++----- network/msgcodes.h | 10 ++++- network/server.cpp | 10 +++-- network/server.h | 13 ++++-- 8 files changed, 96 insertions(+), 37 deletions(-) rename network/{messages.cpp => message.cpp} (63%) rename network/{messages.h => message.h} (77%) diff --git a/network/CMakeLists.txt b/network/CMakeLists.txt index e83a0ecc..6130d186 100644 --- a/network/CMakeLists.txt +++ b/network/CMakeLists.txt @@ -1,5 +1,5 @@ -SET(network_SRCS messages.cpp builtin_cmds.cpp builtin_handlers.cpp server.cpp) -SET(network_HDRS messages.h) +SET(network_SRCS message.cpp builtin_cmds.cpp builtin_handlers.cpp server.cpp) +SET(network_HDRS message.h msgcodes.h) SET(network_MOCS server.h) QT4_WRAP_CPP(_MOC ${network_MOCS}) diff --git a/network/builtin_cmds.cpp b/network/builtin_cmds.cpp index c7c3a9d8..5bc3a8d3 100644 --- a/network/builtin_cmds.cpp +++ b/network/builtin_cmds.cpp @@ -19,7 +19,7 @@ ***************************************************************************/ #include -#include "messages.h" +#include "message.h" /** This macro marks strings as translateable for Qt's linguist tools */ diff --git a/network/builtin_handlers.cpp b/network/builtin_handlers.cpp index bb9e8d10..86a41fc0 100644 --- a/network/builtin_handlers.cpp +++ b/network/builtin_handlers.cpp @@ -18,5 +18,5 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#include "messages.h" +#include "message.h" diff --git a/network/messages.cpp b/network/message.cpp similarity index 63% rename from network/messages.cpp rename to network/message.cpp index 912c3623..d99e5ebc 100644 --- a/network/messages.cpp +++ b/network/message.cpp @@ -18,7 +18,7 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#include "messages.h" +#include "message.h" #include extern BuiltinCmd builtins[]; @@ -27,9 +27,27 @@ recvHandlerType Message::defaultRecvHandler; sendHandlerType Message::defaultSendHandler; QHash Message::cmdTypes; -Message::Message(QString _cmd, QStringList args) { - cmd = _cmd; qDebug() << "cmd: " << cmd; - params = args; +Message::Message(Server *srv, Buffer *buf, QString _cmd, QString _prefix, QStringList _params) + : server(srv), buffer(buf), cmd(_cmd), prefix(_prefix), params(_params) { + + // Check if it's a registered cmd (or a numeric reply with a custom entry) + if(cmdTypes.contains(cmd)) { + CmdType c = cmdTypes[cmd]; + recvHandler = ( c.recvHandler ? c.recvHandler : defaultRecvHandler); + sendHandler = ( c.sendHandler ? c.sendHandler : defaultSendHandler); + type = - c.type; + } else { + int t = cmd.toInt(); + if(t) { + type = t; + recvHandler = defaultRecvHandler; + sendHandler = defaultSendHandler; + } else { + // Unknown cmd! + qWarning() << "Unknown command: " << cmd; + type = 0; + } + } } void Message::init(recvHandlerType _r, sendHandlerType _s) { @@ -40,7 +58,7 @@ void Message::init(recvHandlerType _r, sendHandlerType _s) { for(int i = 0; ; i++) { if(builtins[i].cmd.isEmpty()) break; CmdType c; - c.cmd = builtins[i].cmd.toLower(); + c.cmd = builtins[i].cmd.toUpper(); c.cmdDescr = builtins[i].cmdDescr; c.args = builtins[i].args; c.argsDescr = builtins[i].argsDescr; @@ -65,17 +83,31 @@ sendHandlerType Message::getSendHandler() { return 0; } -/* -void Message::parseParams(QString str) { - QString left = str.section(':', 0, 0); - QString trailing = str.section(':', 1); - if(left.size()) { +/** This parses a raw string as sent by the server and constructs a message object which is then returned. + */ +Message * Message::createFromServerString(Server *srv, QString msg) { + if(msg.isEmpty()) { + qWarning() << "Received empty message from server!"; + return 0; + } + 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.size()) { + if(!trailing.isEmpty()) { params << trailing; } - qDebug() << params; - + return new Message(srv, 0, cmd, prefix, params); + //qDebug() << "prefix: " << prefix << " cmd: " << cmd << " params: " << params; } -*/ diff --git a/network/messages.h b/network/message.h similarity index 77% rename from network/messages.h rename to network/message.h index c1a48ee4..2620d7ce 100644 --- a/network/messages.h +++ b/network/message.h @@ -18,8 +18,8 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#ifndef _MESSAGES_H_ -#define _MESSAGES_H_ +#ifndef _MESSAGE_H_ +#define _MESSAGE_H_ #include #include @@ -37,6 +37,7 @@ typedef void (*recvHandlerType)(Message *); // handler for incoming * Most of these are defined at compile time, but more may be added at runtime. */ struct CmdType { + int type; QString cmd; QString cmdDescr; QString args; @@ -51,23 +52,34 @@ struct CmdType { */ class Message { public: - uint type; - QString prefix; - QString cmd; - QStringList params; - - Message(QString cmd, QStringList args = QStringList()); + Message(Server *server, Buffer *buffer, QString cmd, QString prefix, QStringList args = QStringList()); virtual ~Message() {}; static void init(recvHandlerType defaultRevcHandler, sendHandlerType defaultSendHandler); + static Message * createFromServerString(Server *server, QString srvMsg); + //static Message * createFromUserString(Server *server, Buffer *buffer, QString usrMsg); //static registerCmd(); //static unregisterCmd(); - recvHandlerType getRecvHandler(); - sendHandlerType getSendHandler(); + inline Server * getServer() { return server; } + inline Buffer * getBuffer() { return buffer; } + inline int getType() { return type; } + inline QString getPrefix() { return prefix; } + inline QString getCmd() { return cmd; } + inline QStringList getParams() { return params; } + inline recvHandlerType getRecvHandler(); + inline sendHandlerType getSendHandler(); protected: + Server *server; + Buffer *buffer; + int type; + QString prefix; + QString cmd; + QStringList params; + recvHandlerType recvHandler; + sendHandlerType sendHandler; static recvHandlerType defaultRecvHandler; static sendHandlerType defaultSendHandler; diff --git a/network/msgcodes.h b/network/msgcodes.h index 2ac196b9..e494da25 100644 --- a/network/msgcodes.h +++ b/network/msgcodes.h @@ -21,8 +21,14 @@ #ifndef _MSGCODES_H_ #define _MSGCODES_H_ - - +/** Contains numeric codes for the named commands. */ +enum CmdCodes { + CMD_ADMIN = 1, CMD_AMSG, CMD_AWAY, CMD_BAN, CMD_CTCP, CMD_CYCLE, CMD_DEHALFOP, CMD_DEOP, CMD_DEVOICE, + CMD_HALFOP, CMD_INFO, CMD_INVITE, CMD_JOIN, CMD_KICK, CMD_KICKBAN, CMD_LIST, CMD_LUSERS, CMD_ME, + CMD_MODE, CMD_MOTD, CMD_MSG, CMD_NAMES, CMD_NICK, CMD_NOTICE, CMD_OP, CMD_PART, CMD_PING, CMD_PONG, + CMD_PRIVMSG, CMD_QUERY, CMD_QUIT, CMD_QUOTE, CMD_STATS, CMD_TIME, CMD_TOPIC, CMD_UNBAN, CMD_USERHOST, + CMD_USERS, CMD_VERSION, CMD_VOICE, CMD_WALLOPS, CMD_WHO, CMD_WHOIS, CMD_WHOWAS +}; diff --git a/network/server.cpp b/network/server.cpp index ae8cd570..c253ab1a 100644 --- a/network/server.cpp +++ b/network/server.cpp @@ -30,7 +30,7 @@ Server::~Server() { } void Server::init() { - Message::init(&handleServerMsg, &handleUserMsg); + Message::init(&dispatchServerMsg, &dispatchUserMsg); } void Server::run() { @@ -63,13 +63,17 @@ void Server::disconnectFromIrc( ) { void Server::putRawLine( const QString &s ) { qDebug() << "Raw line: " << s; stream << s << "\r\n" << flush; + //Message::createFromServerString(this, s); } void Server::socketHasData( ) { while(socket->canReadLine()) { QString s = stream.readLine(); qDebug() << "Read: " << s; - emit recvLine(s + "\n"); + emit recvRawServerMsg(s); + Message *msg = Message::createFromServerString(this, s); + if(msg) handleServerMsg(msg); + delete msg; } } @@ -93,7 +97,7 @@ void Server::socketStateChanged(QAbstractSocket::SocketState state) { } void Server::handleServerMsg(Message *msg) { - + } diff --git a/network/server.h b/network/server.h index fcea80bb..b2131112 100644 --- a/network/server.h +++ b/network/server.h @@ -24,7 +24,7 @@ #include #include -#include "messages.h" +#include "message.h" #define DEFAULT_PORT 6667 @@ -56,7 +56,8 @@ class Server : public QThread { signals: //void outputLine(const QString & /*, Buffer *target = 0 */); - void recvLine(const QString&); + void recvRawServerMsg(QString); + void recvLine(QString); // temp, should send a message to the GUI private slots: void socketHasData(); @@ -69,11 +70,15 @@ class Server : public QThread { QTcpSocket *socket; QTextStream stream; - static void handleServerMsg(Message *); - static void handleUserMsg(Message *); + void handleServerMsg(Message *); + void handleUserMsg(Message *); + static inline void dispatchServerMsg(Message *msg) { msg->getServer()->handleServerMsg(msg); } + static inline void dispatchUserMsg(Message *msg) { msg->getServer()->handleUserMsg(msg); } }; +class Buffer {}; + /* class TcpConnection : public QThread { Q_OBJECT -- 2.20.1