uisupport: Provide helpers for dealing with widget changes
[quassel.git] / src / core / corenetwork.h
index f2f7c4d..c67d479 100644 (file)
@@ -18,8 +18,7 @@
  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
  ***************************************************************************/
 
-#ifndef CORENETWORK_H
-#define CORENETWORK_H
+#pragma once
 
 #include "network.h"
 #include "coreircchannel.h"
@@ -52,13 +51,11 @@ class Event;
 
 class CoreNetwork : public Network
 {
-    SYNCABLE_OBJECT
-        Q_OBJECT
+    Q_OBJECT
 
 public:
     CoreNetwork(const NetworkId &networkid, CoreSession *session);
-    ~CoreNetwork();
-    inline virtual const QMetaObject *syncMetaObject() const { return &Network::staticMetaObject; }
+    ~CoreNetwork() override;
 
     inline CoreIdentity *identityPtr() const { return coreSession()->identity(identity()); }
     inline CoreSession *coreSession() const { return _coreSession; }
@@ -90,7 +87,16 @@ public:
     inline QByteArray readChannelCipherKey(const QString &channel) const { return _cipherKeys.value(channel.toLower()); }
     inline void storeChannelCipherKey(const QString &channel, const QByteArray &key) { _cipherKeys[channel.toLower()] = key; }
 
-    inline bool isAutoWhoInProgress(const QString &channel) const { return _autoWhoPending.value(channel.toLower(), 0); }
+    /**
+     * Checks if the given target has an automatic WHO in progress
+     *
+     * @param name Channel or nickname
+     * @return True if an automatic WHO is in progress, otherwise false
+     */
+    inline bool isAutoWhoInProgress(const QString &name) const
+    {
+        return _autoWhoPending.value(name.toLower(), 0);
+    }
 
     inline UserId userId() const { return _coreSession->user(); }
 
@@ -129,7 +135,7 @@ public:
      */
     inline bool isPongReplyPending() const { return _pongReplyPending; }
 
-    QList<QList<QByteArray>> splitMessage(const QString &cmd, const QString &message, std::function<QList<QByteArray>(QString &)> cmdGenerator);
+    QList<QList<QByteArray>> splitMessage(const QString &cmd, const QString &message, const std::function<QList<QByteArray>(QString &)> &cmdGenerator);
 
     // IRCv3 capability negotiation
 
@@ -138,8 +144,7 @@ public:
      *
      * @returns True if in progress, otherwise false
      */
-    inline bool capNegotiationInProgress() const { return (!_capsQueuedIndividual.empty() ||
-                                                           !_capsQueuedBundled.empty()); }
+    inline bool capNegotiationInProgress() const { return (!_capsQueuedIndividual.empty() || !_capsQueuedBundled.empty()); }
 
     /**
      * Queues a capability to be requested.
@@ -197,15 +202,15 @@ public:
     };
 
 public slots:
-    virtual void setMyNick(const QString &mynick);
+    void setMyNick(const QString &mynick) override;
 
-    virtual void requestConnect() const;
-    virtual void requestDisconnect() const;
-    virtual void requestSetNetworkInfo(const NetworkInfo &info);
+    void requestConnect() const override;
+    void requestDisconnect() const override;
+    void requestSetNetworkInfo(const NetworkInfo &info) override;
 
-    virtual void setUseAutoReconnect(bool);
-    virtual void setAutoReconnectInterval(quint32);
-    virtual void setAutoReconnectRetries(quint16);
+    void setUseAutoReconnect(bool) override;
+    void setAutoReconnectInterval(quint32) override;
+    void setAutoReconnectRetries(quint16) override;
 
     void setPingInterval(int interval);
 
@@ -220,6 +225,13 @@ public slots:
      */
     void setPongTimestampValid(bool validTimestamp);
 
+    /**
+     * Indicates that the CoreSession is shutting down.
+     *
+     * Disconnects the network if connected, and sets a flag that prevents reconnections.
+     */
+    void shutdown();
+
     void connectToIrc(bool reconnecting = false);
     /**
      * Disconnect from the IRC server.
@@ -229,23 +241,21 @@ public slots:
      * @param requested       If true, user requested this disconnect; don't try to reconnect
      * @param reason          Reason for quitting, defaulting to the user-configured quit reason
      * @param withReconnect   Reconnect to the network after disconnecting (e.g. ping timeout)
-     * @param forceImmediate  Immediately disconnect from network, skipping queue of other commands
      */
-    void disconnectFromIrc(bool requested = true, const QString &reason = QString(),
-                           bool withReconnect = false, bool forceImmediate = false);
+    void disconnectFromIrc(bool requested = true, const QString &reason = QString(), bool withReconnect = false);
 
     /**
      * Forcibly close the IRC server socket, waiting for it to close.
      *
      * Call CoreNetwork::disconnectFromIrc() first, allow the event loop to run, then if you need to
-     * be sure the network's disconencted (e.g. clean-up), call this.
+     * be sure the network's disconnected (e.g. clean-up), call this.
      *
      * @param msecs  Maximum time to wait for socket to close, in milliseconds.
      * @return True if socket closes successfully; false if error occurs or timeout reached
      */
     bool forceDisconnect(int msecs = 1000);
 
-    void userInput(BufferInfo bufferInfo, QString msg);
+    void userInput(const BufferInfo &bufferInfo, QString msg);
 
     /**
      * Sends the raw (encoded) line, adding to the queue if needed, optionally with higher priority.
@@ -258,7 +268,7 @@ public slots:
      * PING/PONG replies, the other side will close the connection.
      * @endparmblock
      */
-    void putRawLine(const QByteArray input, const bool prepend = false);
+    void putRawLine(const QByteArray &input, bool prepend = false);
 
     /**
      * Sends the command with encoded parameters, with optional prefix or high priority.
@@ -273,7 +283,7 @@ public slots:
      * maintain PING/PONG replies, the other side will close the connection.
      * @endparmblock
      */
-    void putCmd(const QString &cmd, const QList<QByteArray> &params, const QByteArray &prefix = QByteArray(), const bool prepend = false);
+    void putCmd(const QString &cmd, const QList<QByteArray> &params, const QByteArray &prefix = {}, bool prepend = false);
 
     /**
      * Sends the command for each set of encoded parameters, with optional prefix or high priority.
@@ -292,7 +302,7 @@ public slots:
      * cannot maintain PING/PONG replies, the other side will close the connection.
      * @endparmblock
      */
-    void putCmd(const QString &cmd, const QList<QList<QByteArray>> &params, const QByteArray &prefix = QByteArray(), const bool prependAll = false);
+    void putCmd(const QString &cmd, const QList<QList<QByteArray>> &params, const QByteArray &prefix = {}, bool prependAll = false);
 
     void setChannelJoined(const QString &channel);
     void setChannelParted(const QString &channel);
@@ -388,11 +398,17 @@ public slots:
      * When 'away-notify' is enabled, this will trigger an immediate AutoWho since regular
      * who-cycles are disabled as per IRCv3 specifications.
      *
-     * @param[in] channelOrNick Channel or nickname to WHO
+     * @param[in] name Channel or nickname
      */
-    void queueAutoWhoOneshot(const QString &channelOrNick);
+    void queueAutoWhoOneshot(const QString &name);
 
-    bool setAutoWhoDone(const QString &channel);
+    /**
+     * Checks if the given target has an automatic WHO in progress, and sets it as done if so
+     *
+     * @param name Channel or nickname
+     * @return True if an automatic WHO is in progress (and should be silenced), otherwise false
+     */
+    bool setAutoWhoDone(const QString &name);
 
     void updateIssuedModes(const QString &requestedModes);
     void updatePersistentModes(QString addModes, QString removeModes);
@@ -407,7 +423,7 @@ public slots:
      */
     inline void resetPongReplyPending() { _pongReplyPending = false; }
 
-    inline void displayMsg(Message::Type msgType, BufferInfo::Type bufferType, const QString &target, const QString &text, const QString &sender = "", Message::Flags flags = Message::None)
+    void onDisplayMsg(Message::Type msgType, BufferInfo::Type bufferType, const QString &target, const QString &text, const QString &sender, Message::Flags flags)
     {
         emit displayMsg(networkId(), msgType, bufferType, target, text, sender, flags);
     }
@@ -416,7 +432,7 @@ public slots:
 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 displayMsg(NetworkId, Message::Type, BufferInfo::Type, const QString &target, const QString &text, const QString &sender, Message::Flags flags);
     void disconnected(NetworkId networkId);
     void connectionError(const QString &errorMsg);
 
@@ -428,8 +444,8 @@ signals:
     void socketDisconnected(const CoreIdentity *identity, const QHostAddress &localAddress, quint16 localPort, const QHostAddress &peerAddress, quint16 peerPort, qint64 socketId);
 
 protected:
-    inline virtual IrcChannel *ircChannelFactory(const QString &channelname) { return new CoreIrcChannel(channelname, this); }
-    inline virtual IrcUser *ircUserFactory(const QString &hostmask) { return new CoreIrcUser(hostmask, this); }
+    inline IrcChannel *ircChannelFactory(const QString &channelname) override { return new CoreIrcChannel(channelname, this); }
+    inline IrcUser *ircUserFactory(const QString &hostmask) override { return new CoreIrcUser(hostmask, this); }
 
 protected slots:
     // TODO: remove cached cipher keys, when appropriate
@@ -438,12 +454,13 @@ protected slots:
     //virtual void removeChansAndUsers();
 
 private slots:
-    void socketHasData();
-    void socketError(QAbstractSocket::SocketError);
-    void socketInitialized();
-    inline void socketCloseTimeout() { socket.abort(); }
-    void socketDisconnected();
-    void socketStateChanged(QAbstractSocket::SocketState);
+    void onSocketHasData();
+    void onSocketError(QAbstractSocket::SocketError);
+    void onSocketInitialized();
+    void onSocketCloseTimeout();
+    void onSocketDisconnected();
+    void onSocketStateChanged(QAbstractSocket::SocketState);
+
     void networkInitialized();
 
     void sendPerform();
@@ -456,7 +473,7 @@ private slots:
     void startAutoWhoCycle();
 
 #ifdef HAVE_SSL
-    void sslErrors(const QList<QSslError> &errors);
+    void onSslErrors(const QList<QSslError> &errors);
 #endif
 
     /**
@@ -480,6 +497,17 @@ private slots:
 
     void writeToSocket(const QByteArray &data);
 
+private:
+    void showMessage(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);
+    }
+
 private:
     CoreSession *_coreSession;
 
@@ -512,6 +540,8 @@ private:
     // This avoids logging a spurious RemoteHostClosedError whenever disconnect is called without
     // specifying a permanent (saved to core session) disconnect.
 
+    bool _shuttingDown{false};  ///< If true, we're shutting down and ignore requests to (dis)connect networks
+
     bool _previousConnectionAttemptFailed;
     int _lastUsedServerIndex;
 
@@ -578,6 +608,3 @@ private:
     // List of blowfish keys for channels
     QHash<QString, QByteArray> _cipherKeys;
 };
-
-
-#endif //CORENETWORK_H