adding server lag indicator to the network tooltip
authorMarcus Eggenberger <egs@quassel-irc.org>
Mon, 21 Jul 2008 14:43:17 +0000 (16:43 +0200)
committerMarcus Eggenberger <egs@quassel-irc.org>
Mon, 21 Jul 2008 14:43:17 +0000 (16:43 +0200)
13 files changed:
src/client/networkmodel.cpp
src/common/network.cpp
src/common/network.h
src/common/signalproxy.cpp
src/common/signalproxy.h
src/core/ircserverhandler.cpp
src/core/ircserverhandler.h
src/core/networkconnection.cpp
src/core/networkconnection.h
src/core/userinputhandler.cpp
src/core/userinputhandler.h
src/qtui/mainwin.cpp
src/qtui/mainwin.h

index 000a5e0..1f2c257 100644 (file)
@@ -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("<p> %1 </p>").arg(toolTip.join("<br />"));
 }
 
index c813ebb..374c0bf 100644 (file)
@@ -36,6 +36,7 @@ Network::Network(const NetworkId &networkid, QObject *parent)
     _networkId(networkid),
     _identity(0),
     _myNick(QString()),
+    _latency(0),
     _networkName(QString("<not initialized>")),
     _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);
index 2ff0a36..d94502e 100644 (file)
@@ -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 &currentServer() 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;
index 1d9e470..0350ac6 100644 (file)
@@ -1041,7 +1041,7 @@ void SignalProxy::sendHeartBeat() {
   QHash<QIODevice *, peerInfo>::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<QAbstractSocket *>(peerIter.key());
@@ -1077,10 +1077,10 @@ void SignalProxy::receiveHeartBeatReply(QIODevice *dev, const QVariantList &para
   }
   
   QTime sendTime = params[0].value<QTime>();
-  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) {
index eb57ad7..1803809 100644 (file)
@@ -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<QIODevice*, peerInfo> _peerByteCount;
index 288a8ab..ae7736d 100644 (file)
@@ -350,6 +350,23 @@ void IrcServerHandler::handlePing(const QString &prefix, const QList<QByteArray>
   putCmd("PONG", params);
 }
 
+void IrcServerHandler::handlePong(const QString &prefix, const QList<QByteArray> &params) {
+  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<QByteArray> &params) {
   if(!checkParamCount("IrcServerHandler::handlePrivmsg()", params, 1))
     return;
index 518af93..9624928 100644 (file)
@@ -40,6 +40,7 @@ public slots:
   void handleNotice(const QString &prefix, const QList<QByteArray> &params);
   void handlePart(const QString &prefix, const QList<QByteArray> &params);
   void handlePing(const QString &prefix, const QList<QByteArray> &params);
+  void handlePong(const QString &prefix, const QList<QByteArray> &params);
   void handlePrivmsg(const QString &prefix, const QList<QByteArray> &params);
   void handleQuit(const QString &prefix, const QList<QByteArray> &params);
   void handleTopic(const QString &prefix, const QList<QByteArray> &params);
index f5e6a36..6768095 100644 (file)
@@ -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 &currentServer) {
   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<QByteArray> &para
   putRawLine(msg);
 }
 
+void NetworkConnection::sendPing() {
+  userInputHandler()->handlePing(BufferInfo(), QString());
+}
+
 void NetworkConnection::sendAutoWho() {
   while(!_autoWhoQueue.isEmpty()) {
     QString chan = _autoWhoQueue.takeFirst();
index c28da18..a02997f 100644 (file)
@@ -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<QString, int> _autoWhoInProgress;
index 1bd29bd..73bfcce 100644 (file)
@@ -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)
index d1e2d26..006e1eb 100644 (file)
@@ -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);
index e92d9b8..9b46b73 100644 (file)
@@ -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));
 }
 
index 73d1fa9..231ffc0 100644 (file)
@@ -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();