+ 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 setPingInterval(int interval);
+
+ void connectToIrc(bool reconnecting = false);
+ /**
+ * Disconnect from the IRC server.
+ *
+ * Begin disconnecting from the IRC server, including optionally reconnecting.
+ *
+ * @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 userInput(BufferInfo bufferInfo, QString msg);
+
+ /**
+ * Sends the raw (encoded) line, adding to the queue if needed, optionally with higher priority.
+ *
+ * @param[in] input QByteArray of encoded characters
+ * @param[in] prepend
+ * @parmblock
+ * If true, the line is prepended into the start of the queue, otherwise, it's appended to the
+ * end. This should be used sparingly, for if either the core or the IRC server cannot maintain
+ * PING/PONG replies, the other side will close the connection.
+ * @endparmblock
+ */
+ void putRawLine(const QByteArray input, const bool prepend = false);
+
+ /**
+ * Sends the command with encoded parameters, with optional prefix or high priority.
+ *
+ * @param[in] cmd Command to send, ignoring capitalization
+ * @param[in] params Parameters for the command, encoded within a QByteArray
+ * @param[in] prefix Optional command prefix
+ * @param[in] prepend
+ * @parmblock
+ * If true, the command is prepended into the start of the queue, otherwise, it's appended to
+ * the end. This should be used sparingly, for if either the core or the IRC server cannot
+ * maintain PING/PONG replies, the other side will close the connection.
+ * @endparmblock
+ */
+ void putCmd(const QString &cmd, const QList<QByteArray> ¶ms, const QByteArray &prefix = QByteArray(), const bool prepend = false);
+
+ /**
+ * Sends the command for each set of encoded parameters, with optional prefix or high priority.
+ *
+ * @param[in] cmd Command to send, ignoring capitalization
+ * @param[in] params
+ * @parmblock
+ * List of parameter lists for the command, encoded within a QByteArray. The command will be
+ * sent multiple times, once for each set of params stored within the outer list.
+ * @endparmblock
+ * @param[in] prefix Optional command prefix
+ * @param[in] prependAll
+ * @parmblock
+ * If true, ALL of the commands are prepended into the start of the queue, otherwise, they're
+ * appended to the end. This should be used sparingly, for if either the core or the IRC server
+ * cannot maintain PING/PONG replies, the other side will close the connection.
+ * @endparmblock
+ */
+ void putCmd(const QString &cmd, const QList<QList<QByteArray>> ¶ms, const QByteArray &prefix = QByteArray(), const bool prependAll = false);
+
+ void setChannelJoined(const QString &channel);
+ void setChannelParted(const QString &channel);
+ void addChannelKey(const QString &channel, const QString &key);
+ void removeChannelKey(const QString &channel);
+
+ // Blowfish stuff
+#ifdef HAVE_QCA2
+ Cipher *cipher(const QString &recipient);
+ QByteArray cipherKey(const QString &recipient) const;
+ void setCipherKey(const QString &recipient, const QByteArray &key);
+ bool cipherUsesCBC(const QString &target);
+#endif
+
+ // IRCv3 capability negotiation (can be connected to signals)
+
+ /**
+ * Indicates a capability is now available, with optional value in Network::capValue().
+ *
+ * @see Network::addCap()
+ *
+ * @param[in] capability Name of the capability
+ */
+ void serverCapAdded(const QString &capability);
+
+ /**
+ * Indicates a capability was acknowledged (enabled by the IRC server).
+ *
+ * @see Network::acknowledgeCap()
+ *
+ * @param[in] capability Name of the capability
+ */
+ void serverCapAcknowledged(const QString &capability);
+
+ /**
+ * Indicates a capability was removed from the list of available capabilities.
+ *
+ * @see Network::removeCap()
+ *
+ * @param[in] capability Name of the capability
+ */
+ void serverCapRemoved(const QString &capability);
+
+ /**
+ * Sends the next capability from the queue.
+ *
+ * During nick registration if any capabilities remain queued, this will take the next and
+ * request it. When no capabilities remain, capability negotiation is ended.
+ */
+ void sendNextCap();
+
+ void setAutoWhoEnabled(bool enabled);
+ void setAutoWhoInterval(int interval);
+ void setAutoWhoDelay(int delay);
+
+ /**
+ * Appends the given channel/nick to the front of the AutoWho queue.
+ *
+ * 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
+ */
+ void queueAutoWhoOneshot(const QString &channelOrNick);
+
+ bool setAutoWhoDone(const QString &channel);
+
+ void updateIssuedModes(const QString &requestedModes);
+ void updatePersistentModes(QString addModes, QString removeModes);
+ void resetPersistentModes();
+
+ 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);
+
+ void newEvent(Event *event);
+ void socketInitialized(const CoreIdentity *identity, const QHostAddress &localAddress, quint16 localPort, const QHostAddress &peerAddress, quint16 peerPort);
+ void socketDisconnected(const CoreIdentity *identity, const QHostAddress &localAddress, quint16 localPort, const QHostAddress &peerAddress, quint16 peerPort);
+
+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); }
+
+protected slots:
+ // TODO: remove cached cipher keys, when appropriate
+ //virtual void removeIrcUser(IrcUser *ircuser);
+ //virtual void removeIrcChannel(IrcChannel *ircChannel);
+ //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 networkInitialized();
+
+ void sendPerform();
+ void restoreUserModes();
+ void doAutoReconnect();
+ void sendPing();
+ void enablePingTimeout(bool enable = true);
+ void disablePingTimeout();
+ void sendAutoWho();
+ void startAutoWhoCycle();
+
+#ifdef HAVE_SSL
+ void sslErrors(const QList<QSslError> &errors);
+#endif
+
+ void fillBucketAndProcessQueue();
+
+ void writeToSocket(const QByteArray &data);