From: Marcus Eggenberger Date: Mon, 21 Jul 2008 14:43:17 +0000 (+0200) Subject: adding server lag indicator to the network tooltip X-Git-Tag: 0.3.0~246 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=257ca0d5f944a8f63d002e1dcaaa3902258d85e0 adding server lag indicator to the network tooltip --- diff --git a/src/client/networkmodel.cpp b/src/client/networkmodel.cpp index 000a5e02..1f2c257c 100644 --- a/src/client/networkmodel.cpp +++ b/src/client/networkmodel.cpp @@ -146,6 +146,10 @@ QString NetworkItem::toolTip(int column) const { toolTip.append(QString("Server: %1").arg(currentServer())); toolTip.append(QString("Users: %1").arg(nickCount())); + if(_network) { + toolTip.append(QString("Lag: %1 msecs").arg(_network->latency())); + } + return QString("

%1

").arg(toolTip.join("
")); } diff --git a/src/common/network.cpp b/src/common/network.cpp index c813ebbc..374c0bfc 100644 --- a/src/common/network.cpp +++ b/src/common/network.cpp @@ -36,6 +36,7 @@ Network::Network(const NetworkId &networkid, QObject *parent) _networkId(networkid), _identity(0), _myNick(QString()), + _latency(0), _networkName(QString("")), _currentServer(QString()), _connected(false), @@ -429,6 +430,13 @@ void Network::setMyNick(const QString &nickname) { emit myNickSet(nickname); } +void Network::setLatency(int latency) { + if(_latency == latency) + return; + _latency = latency; + emit latencySet(latency); +} + void Network::setIdentity(IdentityId id) { _identity = id; emit identitySet(id); diff --git a/src/common/network.h b/src/common/network.h index 2ff0a363..d94502ee 100644 --- a/src/common/network.h +++ b/src/common/network.h @@ -48,6 +48,7 @@ class Network : public SyncableObject { Q_PROPERTY(QString networkName READ networkName WRITE setNetworkName STORED false) Q_PROPERTY(QString currentServer READ currentServer WRITE setCurrentServer STORED false) Q_PROPERTY(QString myNick READ myNick WRITE setMyNick STORED false) + Q_PROPERTY(int latency READ latency WRITE setLatency STORED false) Q_PROPERTY(QByteArray codecForServer READ codecForServer WRITE setCodecForServer STORED false) Q_PROPERTY(QByteArray codecForEncoding READ codecForEncoding WRITE setCodecForEncoding STORED false) Q_PROPERTY(QByteArray codecForDecoding READ codecForDecoding WRITE setCodecForDecoding STORED false) @@ -116,6 +117,7 @@ public: inline const QString &networkName() const { return _networkName; } inline const QString ¤tServer() const { return _currentServer; } inline const QString &myNick() const { return _myNick; } + inline const int latency() const { return _latency; } inline IrcUser *me() const { return ircUser(myNick()); } inline IdentityId identity() const { return _identity; } QStringList nicks() const; @@ -181,6 +183,7 @@ public slots: //void setConnectionState(Network::ConnectionState state); void setConnectionState(int state); void setMyNick(const QString &mynick); + void setLatency(int latency); void setIdentity(IdentityId); void setServerList(const QVariantList &serverList); @@ -250,6 +253,7 @@ signals: void connectionStateSet(int); void connectionError(const QString &errorMsg); void myNickSet(const QString &mynick); + void latencySet(int latency); void identitySet(IdentityId); void serverListSet(QVariantList serverList); @@ -296,6 +300,7 @@ private: IdentityId _identity; QString _myNick; + int _latency; QString _networkName; QString _currentServer; bool _connected; diff --git a/src/common/signalproxy.cpp b/src/common/signalproxy.cpp index 1d9e4703..0350ac65 100644 --- a/src/common/signalproxy.cpp +++ b/src/common/signalproxy.cpp @@ -1041,7 +1041,7 @@ void SignalProxy::sendHeartBeat() { QHash::iterator peerIterEnd = _peers.end(); while(peerIter != peerIterEnd) { if(peerIter->sentHeartBeats > 0) { - updateLag(peerIter.key(), (float)_heartBeatTimer.interval()); + updateLag(peerIter.key(), _heartBeatTimer.interval()); } if(peerIter->sentHeartBeats > 1) { QAbstractSocket *socket = qobject_cast(peerIter.key()); @@ -1077,10 +1077,10 @@ void SignalProxy::receiveHeartBeatReply(QIODevice *dev, const QVariantList ¶ } QTime sendTime = params[0].value(); - updateLag(dev, (float)sendTime.msecsTo(QTime::currentTime()) / 2); + updateLag(dev, sendTime.msecsTo(QTime::currentTime()) / 2); } -void SignalProxy::updateLag(QIODevice *dev, float lag) { +void SignalProxy::updateLag(QIODevice *dev, int lag) { Q_ASSERT(_peers.contains(dev)); _peers[dev].lag = lag; if(proxyMode() == Client) { diff --git a/src/common/signalproxy.h b/src/common/signalproxy.h index eb57ad76..18038093 100644 --- a/src/common/signalproxy.h +++ b/src/common/signalproxy.h @@ -129,7 +129,7 @@ signals: void connected(); void disconnected(); void objectInitialized(SyncableObject *); - void lagUpdated(float lag); + void lagUpdated(int lag); private: void init(); @@ -163,7 +163,7 @@ private: QVariantMap initData(SyncableObject *obj) const; void setInitData(SyncableObject *obj, const QVariantMap &properties); - void updateLag(QIODevice *dev, float lag); + void updateLag(QIODevice *dev, int lag); public: void dumpSyncMap(SyncableObject *object); @@ -175,7 +175,7 @@ private: quint32 byteCount; bool usesCompression; int sentHeartBeats; - float lag; + int lag; peerInfo() : byteCount(0), usesCompression(false), sentHeartBeats(0) {} }; //QHash _peerByteCount; diff --git a/src/core/ircserverhandler.cpp b/src/core/ircserverhandler.cpp index 288a8ab5..ae7736d9 100644 --- a/src/core/ircserverhandler.cpp +++ b/src/core/ircserverhandler.cpp @@ -350,6 +350,23 @@ void IrcServerHandler::handlePing(const QString &prefix, const QList putCmd("PONG", params); } +void IrcServerHandler::handlePong(const QString &prefix, const QList ¶ms) { + Q_UNUSED(prefix); + // the server is supposed to send back what we passed as param. and we send a timestamp + // but using quote and whatnought one can send arbitrary pings, so we have to do some sanity checks + if(params.count() < 2) + return; + + QString timestamp = serverDecode(params[1]); + QTime sendTime = QTime::fromString(timestamp, "hh:mm:ss.zzz"); + if(!sendTime.isValid()) { + emit displayMsg(Message::Server, BufferInfo::StatusBuffer, "", "PONG " + serverDecode(params).join(" "), prefix); + return; + } + + network()->setLatency(sendTime.msecsTo(QTime::currentTime()) / 2); +} + void IrcServerHandler::handlePrivmsg(const QString &prefix, const QList ¶ms) { if(!checkParamCount("IrcServerHandler::handlePrivmsg()", params, 1)) return; diff --git a/src/core/ircserverhandler.h b/src/core/ircserverhandler.h index 518af932..9624928c 100644 --- a/src/core/ircserverhandler.h +++ b/src/core/ircserverhandler.h @@ -40,6 +40,7 @@ public slots: void handleNotice(const QString &prefix, const QList ¶ms); void handlePart(const QString &prefix, const QList ¶ms); void handlePing(const QString &prefix, const QList ¶ms); + void handlePong(const QString &prefix, const QList ¶ms); void handlePrivmsg(const QString &prefix, const QList ¶ms); void handleQuit(const QString &prefix, const QList ¶ms); void handleTopic(const QString &prefix, const QList ¶ms); diff --git a/src/core/networkconnection.cpp b/src/core/networkconnection.cpp index f5e6a367..67680951 100644 --- a/src/core/networkconnection.cpp +++ b/src/core/networkconnection.cpp @@ -64,7 +64,10 @@ NetworkConnection::NetworkConnection(Network *network, CoreSession *session) _autoReconnectTimer.setSingleShot(true); _socketCloseTimer.setSingleShot(true); connect(&_socketCloseTimer, SIGNAL(timeout()), this, SLOT(socketCloseTimeout())); - + + _pingTimer.setInterval(60000); + connect(&_pingTimer, SIGNAL(timeout()), this, SLOT(sendPing())); + _autoWhoTimer.setInterval(_autoWhoDelay * 1000); _autoWhoCycleTimer.setInterval(_autoWhoInterval * 1000); @@ -215,6 +218,8 @@ void NetworkConnection::networkInitialized(const QString ¤tServer) { network()->setConnected(true); emit connected(networkId()); + _pingTimer.start(); + if(_autoWhoEnabled) { _autoWhoCycleTimer.start(); _autoWhoTimer.start(); @@ -502,6 +507,10 @@ void NetworkConnection::putCmd(const QString &cmd, const QList ¶ putRawLine(msg); } +void NetworkConnection::sendPing() { + userInputHandler()->handlePing(BufferInfo(), QString()); +} + void NetworkConnection::sendAutoWho() { while(!_autoWhoQueue.isEmpty()) { QString chan = _autoWhoQueue.takeFirst(); diff --git a/src/core/networkconnection.h b/src/core/networkconnection.h index c28da180..a02997f9 100644 --- a/src/core/networkconnection.h +++ b/src/core/networkconnection.h @@ -140,6 +140,7 @@ private slots: 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 @@ -181,6 +182,8 @@ private: bool _previousConnectionAttemptFailed; int _lastUsedServerlistIndex; + QTimer _pingTimer; + bool _autoWhoEnabled; QStringList _autoWhoQueue; QHash _autoWhoInProgress; diff --git a/src/core/userinputhandler.cpp b/src/core/userinputhandler.cpp index 1bd29bd3..73bfcce1 100644 --- a/src/core/userinputhandler.cpp +++ b/src/core/userinputhandler.cpp @@ -266,6 +266,16 @@ void UserInputHandler::handlePart(const BufferInfo &bufferInfo, const QString &m emit putCmd("PART", params); } +void UserInputHandler::handlePing(const BufferInfo &bufferInfo, const QString &msg) { + Q_UNUSED(bufferInfo) + + QString param = msg; + if(param.isEmpty()) + param = QTime::currentTime().toString("hh:mm:ss.zzz"); + + putCmd("PING", serverEncode(param)); +} + // TODO: implement queries void UserInputHandler::handleQuery(const BufferInfo &bufferInfo, const QString &msg) { Q_UNUSED(bufferInfo) diff --git a/src/core/userinputhandler.h b/src/core/userinputhandler.h index d1e2d266..006e1ebe 100644 --- a/src/core/userinputhandler.h +++ b/src/core/userinputhandler.h @@ -52,6 +52,7 @@ public slots: void handleOper(const BufferInfo &bufferInfo, const QString &text); void handleOp(const BufferInfo &bufferInfo, const QString &text); void handlePart(const BufferInfo &bufferInfo, const QString &text); + void handlePing(const BufferInfo &bufferInfo, const QString &text); void handleQuery(const BufferInfo &bufferInfo, const QString &text); void handleQuit(const BufferInfo &bufferInfo, const QString &text); void handleQuote(const BufferInfo &bufferInfo, const QString &text); diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index e92d9b84..9b46b73c 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -336,7 +336,7 @@ void MainWin::setupStatusBar() { // Core Lag: updateLagIndicator(0); statusBar()->addPermanentWidget(coreLagLabel); - connect(Client::signalProxy(), SIGNAL(lagUpdated(float)), this, SLOT(updateLagIndicator(float))); + connect(Client::signalProxy(), SIGNAL(lagUpdated(int)), this, SLOT(updateLagIndicator(int))); // SSL indicator connect(Client::instance(), SIGNAL(securedConnection()), this, SLOT(securedConnection())); @@ -447,7 +447,7 @@ void MainWin::saveLayout() { if(accountId > 0) s.setValue(QString("MainWinState-%1").arg(accountId) , saveState(accountId)); } -void MainWin::updateLagIndicator(float lag) { +void MainWin::updateLagIndicator(int lag) { coreLagLabel->setText(QString("Core Lag: %1 msec").arg(lag)); } diff --git a/src/qtui/mainwin.h b/src/qtui/mainwin.h index 73d1fa93..231ffc0a 100644 --- a/src/qtui/mainwin.h +++ b/src/qtui/mainwin.h @@ -67,7 +67,7 @@ class MainWin : public QMainWindow { protected slots: void connectedToCore(); void setConnectedState(); - void updateLagIndicator(float lag); + void updateLagIndicator(int lag); void securedConnection(); void disconnectedFromCore(); void setDisconnectedState();