X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fnetworkconnection.h;h=d9474557f5c06c633b4296c6368740696136e210;hp=1a7aafaa14667edca95a275dee3c05ec9b6ccc0b;hb=f7379184b7c0ae4e53d7470809f84e2ad3239ec1;hpb=6ac855b96988ebc999f7017765ae3dbda527301a diff --git a/src/core/networkconnection.h b/src/core/networkconnection.h index 1a7aafaa..d9474557 100644 --- a/src/core/networkconnection.h +++ b/src/core/networkconnection.h @@ -26,21 +26,19 @@ #include #include -#ifndef QT_NO_OPENSSL +#ifdef HAVE_SSL # include # include #else # include #endif +#include "coresession.h" #include "identity.h" #include "message.h" #include "network.h" #include "signalproxy.h" -class CoreSession; -class Network; - class IrcServerHandler; class UserInputHandler; class CtcpHandler; @@ -52,18 +50,18 @@ public: NetworkConnection(Network *network, CoreSession *session); ~NetworkConnection(); - NetworkId networkId() const; - QString networkName() const; - Network *network() const; - Identity *identity() const; - CoreSession *coreSession() const; + inline NetworkId networkId() const { return network()->networkId(); } + inline QString networkName() const { return network()->networkName(); } + inline Network *network() const { return _network; } + inline Identity *identity() const { return coreSession()->identity(network()->identity()); } + inline CoreSession *coreSession() const { return _coreSession; } - bool isConnected() const; - Network::ConnectionState connectionState() const; + inline bool isConnected() const { return connectionState() == Network::Initialized; } + inline Network::ConnectionState connectionState() const { return _connectionState; } - IrcServerHandler *ircServerHandler() const; - UserInputHandler *userInputHandler() const; - CtcpHandler *ctcpHandler() const; + 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. QString serverDecode(const QByteArray &string) const; @@ -86,33 +84,31 @@ public: inline QString channelKey(const QString &channel) const { return _channelKeys.value(channel.toLower(), QString()); } inline QStringList persistentChannels() const { return _channelKeys.keys(); } + inline bool isAutoWhoInProgress(const QString &channel) const { return _autoWhoInProgress.value(channel.toLower(), 0); } + public slots: // void setServerOptions(); void connectToIrc(bool reconnecting = false); - void disconnectFromIrc(bool requested = true); + void disconnectFromIrc(bool requested = true, const QString &reason = QString()); void userInput(BufferInfo bufferInfo, QString msg); void putRawLine(QByteArray input); - void putCmd(const QString &cmd, const QVariantList ¶ms, const QByteArray &prefix = QByteArray()); + int lastParamOverrun(const QString &cmd, const QList ¶ms); + 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); -private slots: - void sendPerform(); - void autoReconnectSettingsChanged(); - void doAutoReconnect(); - void sendWho(); - void nickChanged(const QString &newNick, const QString &oldNick); // this signal is inteded to rename query buffers in the storage backend + bool setAutoWhoDone(const QString &channel); signals: // #void networkState(QString net, QVariantMap data); void recvRawServerMsg(QString); void displayStatusMsg(QString); //void displayMsg(Message msg); - void displayMsg(Message::Type, BufferInfo::Type, QString target, QString text, QString sender = "", quint8 flags = Message::None); + void displayMsg(Message::Type, BufferInfo::Type, QString target, QString text, QString sender = "", Message::Flags flags = Message::None); void connected(NetworkId networkId); ///< Emitted after receipt of 001 to indicate that we can now send data to the IRC server void disconnected(NetworkId networkId); void connectionStateChanged(Network::ConnectionState); @@ -133,18 +129,29 @@ private slots: void socketError(QAbstractSocket::SocketError); void socketConnected(); void socketInitialized(); + void socketCloseTimeout(); void socketDisconnected(); void socketStateChanged(QAbstractSocket::SocketState); void setConnectionState(Network::ConnectionState); void networkInitialized(const QString ¤tServer); -#ifndef QT_NO_OPENSSL + void sendPerform(); + void autoReconnectSettingsChanged(); + void doAutoReconnect(); + void sendPing(); + void sendAutoWho(); + void startAutoWhoCycle(); + void nickChanged(const QString &newNick, const QString &oldNick); // this signal is inteded to rename query buffers in the storage backend + +#ifdef HAVE_SSL void socketEncrypted(); void sslErrors(const QList &errors); #endif + void fillBucketAndProcessQueue(); + private: -#ifndef QT_NO_OPENSSL +#ifdef HAVE_SSL QSslSocket socket; #else QTcpSocket socket; @@ -163,13 +170,37 @@ private: QHash _channelKeys; // stores persistent channels and their passwords, if any QTimer _autoReconnectTimer; + int _autoReconnectCount; - QTimer _whoTimer; + 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; bool _previousConnectionAttemptFailed; int _lastUsedServerlistIndex; + + QTimer _pingTimer; + bool _autoWhoEnabled; + QStringList _autoWhoQueue; + QHash _autoWhoInProgress; + 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; + + void writeToSocket(QByteArray s); + class ParseError : public Exception { public: ParseError(QString cmd, QString prefix, QStringList params);