Fix license headers: Quassel IRC Team -> Quassel Project, 2007 -> 2008
[quassel.git] / src / core / server.h
index 34a4514..771db62 100644 (file)
@@ -1,11 +1,11 @@
 /***************************************************************************
- *   Copyright (C) 2005/06 by The Quassel Team                             *
+ *   Copyright (C) 2005-08 by the Quassel Project                          *
  *   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.                                   *
+ *   (at your option) version 3.                                           *
  *                                                                         *
  *   This program is distributed in the hope that it will be useful,       *
  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 #include <QTimer>
 
 #include "message.h"
+#include "signalproxy.h"
 
-#define DEFAULT_PORT 6667
+class NetworkInfo;
 
+class IrcServerHandler;
+class UserInputHandler;
+class CtcpHandler;
+class CoreSession;
 
 /*!
  * This is a server object, managing a single connection to an IRC server, handling the associated channels and so on.
 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);
+public:
+  Server(UserId uid, NetworkId networkId, QString network, const QVariant &previousState = QVariant());
+  ~Server();
+
+  UserId userId() const { return _userId; } 
+
+  // serverState state();
+  bool isConnected() const { return socket.state() == QAbstractSocket::ConnectedState; }
+
+  NetworkId networkId() const;
+  QString networkName() const;  // hasbeen getNetwork()
+
+  NetworkInfo *networkInfo() const { return _networkInfo; }
+  IrcServerHandler *ircServerHandler() const { return _ircServerHandler; }
+  UserInputHandler *userInputHandler() const { return _userInputHandler; }
+  CtcpHandler *ctcpHandler() const { return _ctcpHandler; }
+
+  QVariant state(); ///< Return data necessary to restore the server's state upon core restart
+
+  //! Decode a string using the server (network) decoding.
+  QString serverDecode(const QByteArray &string) const;
+
+  //! Decode a string using a buffer-specific encoding if one is set (and use the server encoding else).
+  QString bufferDecode(const QString &bufferName, const QByteArray &string) const;
+
+  //! Decode a string using a IrcUser specific encoding, if one exists (using the server encoding else).
+  QString userDecode(const QString &userNick, const QByteArray &string) const;
+
+  //! Encode a string using the server (network) encoding.
+  QByteArray serverEncode(const QString &string) const;
+
+  //! Encode a string using the buffer-specific encoding, if set, and use the server encoding else.
+  QByteArray bufferEncode(const QString &bufferName, const QString &string) const;
+
+  //! Encode a string using the user-specific encoding, if set, and use the server encoding else.
+  QByteArray userEncode(const QString &userNick, const QString &string) const;
+
+public slots:
+  // void setServerOptions();
+  void connectToIrc(QString net);
+  void disconnectFromIrc(QString net);
+  void userInput(uint netid, QString buffer, QString msg);
+
+  void putRawLine(QString input);
+  void putCmd(QString cmd, QStringList params, QString prefix = 0);
+
 
-    class ParseError : public Exception {
-      public:
-        ParseError(QString cmd, QString prefix, QStringList params);
-    };
+private slots:
+  void threadFinished();
+  void sendPerform();
 
-    class UnknownCmdError : public Exception {
-      public:
-        UnknownCmdError(QString cmd, QString prefix, QStringList params);
-    };
+signals:
+  void serverState(QString net, QVariantMap 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(uint networkId);
+  void disconnected(uint networkId);
+
+  void connectionInitialized(); ///< Emitted after receipt of 001 to indicate that we can now send data to the IRC server
+
+  void synchronizeClients();
+  
+  void queryRequested(QString network, QString nick);
+
+
+private slots:
+  void run();
+  void socketHasData();
+  void socketError(QAbstractSocket::SocketError);
+  void socketConnected();
+  void socketStateChanged(QAbstractSocket::SocketState);
+
+private:
+  UserId _userId;
+  NetworkId _networkId;
+
+  QTcpSocket socket;
+
+  IrcServerHandler *_ircServerHandler;
+  UserInputHandler *_userInputHandler;
+  CtcpHandler *_ctcpHandler;
+
+  NetworkInfo *_networkInfo;
+
+  QVariantMap networkSettings;
+  QVariantMap identity;
+
+  QVariant _previousState;
+
+  CoreSession *coreSession() const;
+  
+  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