+/***************************************************************************
+ * Copyright (C) 2005/06 by The Quassel Team *
+ * devel@quassel-irc.org *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * You should have received a copy of the GNU General Public License *
+ * along with this program; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+ ***************************************************************************/
+
+#ifndef _SERVER_H_
+#define _SERVER_H_
+
+#include <QtCore>
+#include <QTimer>
+#include <QtNetwork>
+
+#include "global.h"
+#include "message.h"
+
+#define DEFAULT_PORT 6667
+
+
+/*!
+ * This is a server object, managing a single connection to an IRC server, handling the associated channels and so on.
+ * We have this running in its own thread mainly to not block other server objects or the core if something goes wrong,
+ * e.g. if some scripts starts running wild...
+ */
+
+class Server : public QThread {
+ Q_OBJECT
+
+ public:
+ Server(UserId uid, QString network);
+ ~Server();
+
+ UserId userId() const { return user; }
+ // serverState state();
+ bool isConnected() const { return socket.state() == QAbstractSocket::ConnectedState; }
+ QString getNetwork() { return network; }
+ QStringList providesUserHandlers();
+
+ enum CtcpType {CtcpQuery, CtcpReply};
+
+ public slots:
+ // void setServerOptions();
+ void sendState();
+ void connectToIrc(QString net);
+ void disconnectFromIrc(QString net);
+ void userInput(QString net, QString buffer, QString msg);
+
+ void putRawLine(QString input);
+ void putCmd(QString cmd, QStringList params, QString prefix = 0);
+
+ //void exitThread();
+
+ signals:
+ void serverState(QString net, VarMap data);
+ void recvRawServerMsg(QString);
+ void displayStatusMsg(QString);
+ //void displayMsg(Message msg);
+ void displayMsg(Message::Type, QString target, QString text, QString sender = "", quint8 flags = Message::None);
+ void connected(QString network);
+ void disconnected(QString network);
+
+ void nickAdded(QString network, QString nick, VarMap props);
+ void nickRenamed(QString network, QString oldnick, QString newnick);
+ void nickRemoved(QString network, QString nick);
+ void nickUpdated(QString network, QString nick, VarMap props);
+ void modeSet(QString network, QString target, QString mode);
+ void topicSet(QString network, QString buffer, QString topic);
+ void ownNickSet(QString network, QString newNick);
+ void queryRequested(QString network, QString nick);
+
+
+ private slots:
+ void run();
+ void socketHasData();
+ void socketError(QAbstractSocket::SocketError);
+ void socketConnected();
+ void socketDisconnected();
+ void socketStateChanged(QAbstractSocket::SocketState);
+
+ /* Message Handlers */
+
+ /* void handleUser(QString, QString); */
+ void handleUserAway(QString, QString);
+ void handleUserDeop(QString, QString);
+ void handleUserDevoice(QString, QString);
+ void handleUserInvite(QString, QString);
+ void handleUserJoin(QString, QString);
+ void handleUserKick(QString, QString);
+ void handleUserList(QString, QString);
+ void handleUserMode(QString, QString);
+ void handleUserMsg(QString, QString);
+ void handleUserNick(QString, QString);
+ void handleUserOp(QString, QString);
+ void handleUserPart(QString, QString);
+ void handleUserQuery(QString, QString);
+ void handleUserQuit(QString, QString);
+ void handleUserQuote(QString, QString);
+ void handleUserSay(QString, QString);
+ void handleUserTopic(QString, QString);
+ void handleUserVoice(QString, QString);
+ void handleUserMe(QString, QString);
+
+ /* void handleServer(QString, QStringList); */
+ void handleServerJoin(QString, QStringList);
+ void handleServerKick(QString, QStringList);
+ void handleServerMode(QString, QStringList);
+ void handleServerNick(QString, QStringList);
+ void handleServerNotice(QString, QStringList);
+ void handleServerPart(QString, QStringList);
+ void handleServerPing(QString, QStringList);
+ void handleServerPrivmsg(QString, QStringList);
+ void handleServerQuit(QString, QStringList);
+ void handleServerTopic(QString, QStringList);
+
+ void handleServer001(QString, QStringList); // RPL_WELCOME
+ void handleServer005(QString, QStringList); // RPL_ISUPPORT
+ void handleServer331(QString, QStringList); // RPL_NOTOPIC
+ void handleServer332(QString, QStringList); // RPL_TOPIC
+ void handleServer333(QString, QStringList); // Topic set by...
+ void handleServer353(QString, QStringList); // RPL_NAMREPLY
+ void handleServer432(QString, QStringList); // ERR_ERRONEUSNICKNAME
+ void handleServer433(QString, QStringList); // ERR_NICKNAMEINUSE
+
+ void handleCtcpAction(CtcpType, QString, QString, QString);
+ void handleCtcpPing(CtcpType, QString, QString, QString);
+ void handleCtcpVersion(CtcpType, QString, QString, QString);
+
+ void defaultServerHandler(QString cmd, QString prefix, QStringList params);
+ void defaultUserHandler(QString buf, QString cmd, QString msg);
+ void defaultCtcpHandler(CtcpType ctcptype, QString prefix, QString cmd, QString target, QString param);
+
+ private:
+ UserId user;
+ QString network;
+ QTcpSocket socket;
+ //QHash<QString, Buffer*> buffers;
+
+ QString ownNick;
+ QString currentServer;
+ VarMap networkSettings;
+ VarMap identity;
+ QHash<QString, VarMap> nicks; // stores all known nicks for the server
+ QHash<QString, QString> topics; // stores topics for each buffer
+ VarMap serverSupports; // stores results from RPL_ISUPPORT
+
+ void handleServerMsg(QString rawMsg);
+ void handleUserInput(QString buffer, QString usrMsg);
+
+ // CTCP Stuff
+ QString XDELIM;
+ QHash<QString, QString> ctcpMDequoteHash;
+ QHash<QString, QString> ctcpXDelimDequoteHash;
+ QString ctcpDequote(QString);
+ QString ctcpXdelimDequote(QString);
+ QStringList parseCtcp(CtcpType, QString, QString, QString);
+
+ QString ctcpPack(QString ctcpTag, QString message);
+ void ctcpQuery(QString bufname, QString ctcpTag, QString message);
+ void ctcpReply(QString bufname, QString ctcpTag, QString message);
+
+ QString updateNickFromMask(QString mask);
+
+ class ParseError : public Exception {
+ public:
+ ParseError(QString cmd, QString prefix, QStringList params);
+ };
+
+ class UnknownCmdError : public Exception {
+ public:
+ UnknownCmdError(QString cmd, QString prefix, QStringList params);
+ };
+};
+
+#endif