-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})
***************************************************************************/
#include <QtGlobal>
-#include "messages.h"
+#include "message.h"
/** This macro marks strings as translateable for Qt's linguist tools */
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
-#include "messages.h"
+#include "message.h"
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
-#include "messages.h"
+#include "message.h"
#include <QtDebug>
extern BuiltinCmd builtins[];
sendHandlerType Message::defaultSendHandler;
QHash<QString, CmdType> 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) {
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;
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;
}
-*/
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
-#ifndef _MESSAGES_H_
-#define _MESSAGES_H_
+#ifndef _MESSAGE_H_
+#define _MESSAGE_H_
#include <QHash>
#include <QString>
* 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;
*/
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;
#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
+};
}
void Server::init() {
- Message::init(&handleServerMsg, &handleUserMsg);
+ Message::init(&dispatchServerMsg, &dispatchUserMsg);
}
void Server::run() {
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;
}
}
}
void Server::handleServerMsg(Message *msg) {
-
+
}
#include <QtCore>
#include <QtNetwork>
-#include "messages.h"
+#include "message.h"
#define DEFAULT_PORT 6667
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();
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