X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fserver.h;h=771db62e6b58d6d381269a80465071d926d998a8;hp=c17b4d0f34ae9ef830a29b7ce39f6ac24c34924a;hb=8699dd758516d0ded076811e8ea656adc95e69d0;hpb=077d44f36d2f5c730283ef6be839aea7dd073d56 diff --git a/src/core/server.h b/src/core/server.h index c17b4d0f..771db62e 100644 --- a/src/core/server.h +++ b/src/core/server.h @@ -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 * @@ -21,15 +21,22 @@ #ifndef _SERVER_H_ #define _SERVER_H_ -#include +#include +#include +#include +#include +#include #include -#include -#include "global.h" #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. @@ -40,149 +47,109 @@ 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 buffers; - - QString ownNick; - QString currentServer; - VarMap networkSettings; - VarMap identity; - QHash nicks; // stores all known nicks for the server - QHash 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 ctcpMDequoteHash; - QHash 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