Starting reorganization of files in preparation of separation of client and GUI.
[quassel.git] / src / core / server.h
diff --git a/src/core/server.h b/src/core/server.h
new file mode 100644 (file)
index 0000000..c17b4d0
--- /dev/null
@@ -0,0 +1,188 @@
+/***************************************************************************
+ *   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