X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fcorenetwork.h;h=dbb8a5e2244258854f1102fa6d4128e705fbd3e9;hp=4c956cf717ea93a3bc3ff456829fabf065d80abb;hb=50b6749c57fab7941f513087d4209d676ae0f6bf;hpb=fe4b38e66592f11fdf4c4651863968983daecd2d diff --git a/src/core/corenetwork.h b/src/core/corenetwork.h index 4c956cf7..dbb8a5e2 100644 --- a/src/core/corenetwork.h +++ b/src/core/corenetwork.h @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-08 by the Quassel Project * + * Copyright (C) 2005-09 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -22,25 +22,182 @@ #define CORENETWORK_H #include "network.h" +#include "coreircchannel.h" -class CoreSession; +#include + +#ifdef HAVE_SSL +# include +# include +#else +# include +#endif + +#include "coresession.h" + +class CoreIdentity; +class IrcServerHandler; +class UserInputHandler; +class CtcpHandler; class CoreNetwork : public Network { Q_OBJECT public: CoreNetwork(const NetworkId &networkid, CoreSession *session); - + ~CoreNetwork(); inline virtual const QMetaObject *syncMetaObject() const { return &Network::staticMetaObject; } + inline CoreIdentity *identityPtr() const { return coreSession()->identity(identity()); } inline CoreSession *coreSession() const { return _coreSession; } + inline IrcServerHandler *ircServerHandler() const { return _ircServerHandler; } + inline UserInputHandler *userInputHandler() const { return _userInputHandler; } + inline CtcpHandler *ctcpHandler() const { return _ctcpHandler; } + + //! Decode a string using the server (network) decoding. + inline QString serverDecode(const QByteArray &string) const { return decodeServerString(string); } + + //! Decode a string using a channel-specific encoding if one is set (and use the standard encoding else). + QString channelDecode(const QString &channelName, const QByteArray &string) const; + + //! Decode a string using an IrcUser-specific encoding, if one exists (using the standaed encoding else). + QString userDecode(const QString &userNick, const QByteArray &string) const; + + //! Encode a string using the server (network) encoding. + inline QByteArray serverEncode(const QString &string) const { return encodeServerString(string); } + + //! Encode a string using the channel-specific encoding, if set, and use the standard encoding else. + QByteArray channelEncode(const QString &channelName, const QString &string) const; + + //! Encode a string using the user-specific encoding, if set, and use the standard encoding else. + QByteArray userEncode(const QString &userNick, const QString &string) const; + + inline QString channelKey(const QString &channel) const { return _channelKeys.value(channel.toLower(), QString()); } + + inline bool isAutoWhoInProgress(const QString &channel) const { return _autoWhoPending.value(channel.toLower(), 0); } + + inline UserId userId() const { return _coreSession->user(); } + public slots: + virtual void setMyNick(const QString &mynick); + virtual void requestConnect() const; virtual void requestDisconnect() const; + virtual void requestSetNetworkInfo(const NetworkInfo &info); + + virtual void setUseAutoReconnect(bool); + virtual void setAutoReconnectInterval(quint32); + virtual void setAutoReconnectRetries(quint16); + + void connectToIrc(bool reconnecting = false); + void disconnectFromIrc(bool requested = true, const QString &reason = QString(), bool withReconnect = false); + + void userInput(BufferInfo bufferInfo, QString msg); + void putRawLine(QByteArray input); + void putCmd(const QString &cmd, const QList ¶ms, const QByteArray &prefix = QByteArray()); + + void setChannelJoined(const QString &channel); + void setChannelParted(const QString &channel); + void addChannelKey(const QString &channel, const QString &key); + void removeChannelKey(const QString &channel); + + bool setAutoWhoDone(const QString &channel); + + Server usedServer() const; + + inline void resetPingTimeout() { _pingCount = 0; } + + inline void displayMsg(Message::Type msgType, BufferInfo::Type bufferType, const QString &target, const QString &text, const QString &sender = "", Message::Flags flags = Message::None) { + emit displayMsg(networkId(), msgType, bufferType, target, text, sender, flags); + } + +signals: + void recvRawServerMsg(QString); + void displayStatusMsg(QString); + void displayMsg(NetworkId, Message::Type, BufferInfo::Type, const QString &target, const QString &text, const QString &sender = "", Message::Flags flags = Message::None); + void disconnected(NetworkId networkId); + void connectionError(const QString &errorMsg); + + void quitRequested(NetworkId networkId); + void sslErrors(const QVariant &errorData); + +protected: + inline virtual IrcChannel *ircChannelFactory(const QString &channelname) { return new CoreIrcChannel(channelname, this); } + +private slots: + void socketHasData(); + void socketError(QAbstractSocket::SocketError); + void socketInitialized(); + inline void socketCloseTimeout() { socket.disconnectFromHost(); } + void socketDisconnected(); + void socketStateChanged(QAbstractSocket::SocketState); + void networkInitialized(); + + void sendPerform(); + void restoreUserModes(); + void doAutoReconnect(); + void sendPing(); + void enablePingTimeout(); + void disablePingTimeout(); + void sendAutoWho(); + void startAutoWhoCycle(); + +#ifdef HAVE_SSL + void sslErrors(const QList &errors); +#endif + + void fillBucketAndProcessQueue(); + + void writeToSocket(const QByteArray &data); private: CoreSession *_coreSession; + +#ifdef HAVE_SSL + QSslSocket socket; +#else + QTcpSocket socket; +#endif + + IrcServerHandler *_ircServerHandler; + UserInputHandler *_userInputHandler; + CtcpHandler *_ctcpHandler; + + QHash _channelKeys; // stores persistent channels and their passwords, if any + + QTimer _autoReconnectTimer; + int _autoReconnectCount; + + QTimer _socketCloseTimer; + + /* this flag triggers quitRequested() once the socket is closed + * it is needed to determine whether or not the connection needs to be + * in the automatic session restore. */ + bool _quitRequested; + QString _quitReason; + + bool _previousConnectionAttemptFailed; + int _lastUsedServerIndex; + + QTimer _pingTimer; + uint _lastPingTime; + uint _maxPingCount; + uint _pingCount; + + bool _autoWhoEnabled; + QStringList _autoWhoQueue; + QHash _autoWhoPending; + int _autoWhoInterval; + int _autoWhoNickLimit; + int _autoWhoDelay; + QTimer _autoWhoTimer, _autoWhoCycleTimer; + + QTimer _tokenBucketTimer; + int _messagesPerSecond; // token refill speed + int _burstSize; // size of the token bucket + int _tokenBucket; // the virtual bucket that holds the tokens + QList _msgQueue; }; #endif //CORENETWORK_H