diff --git a/src/mumble/ConnectDialog.cpp b/src/mumble/ConnectDialog.cpp index 985fab35a..f773fd152 100644 --- a/src/mumble/ConnectDialog.cpp +++ b/src/mumble/ConnectDialog.cpp @@ -59,6 +59,7 @@ void PingStats::init() { uiMaxUsers = 0; uiBandwidth = 0; uiSent = 0; + uiRecv = 0; uiVersion = 0; } @@ -423,7 +424,6 @@ QVariant ServerItem::data(int column, int role) const { qsl << qha.toString(); double ploss = 100.0; - quint32 uiRecv = static_cast(boost::accumulators::count(* asQuantile)); if (uiSent > 0) ploss = (uiSent - qMin(uiRecv, uiSent)) * 100. / uiSent; @@ -506,14 +506,18 @@ void ServerItem::setDatas(double elapsed, quint32 users, quint32 maxusers) { dPing = elapsed; quint32 ping = static_cast(lround(dPing / 1000.)); + uiRecv = static_cast(boost::accumulators::count(* asQuantile)); bool changed = (ping != uiPing) || (users != uiUsers) || (maxusers != uiMaxUsers); uiUsers = users; uiMaxUsers = maxusers; uiPing = ping; - - if ((uiPingSort == 0) || (dPing < (950. * uiPingSort)) || (dPing > (1050. * uiPingSort))) + + double grace = qMax(5000., 50. * uiPingSort); + double diff = fabs(1000. * uiPingSort - dPing); + + if ((uiPingSort == 0) || ((uiSent >= 10) && (diff >= grace))) uiPingSort = ping; if (changed) @@ -783,20 +787,26 @@ ConnectDialog::ConnectDialog(QWidget *p) : QDialog(p) { qtwServers->setCurrentItem(NULL); bLastFound = false; - + + qmPingCache = Database::getPingCache(); } ConnectDialog::~ConnectDialog() { ServerItem::qmIcons.clear(); QList ql; + qmPingCache.clear(); foreach(ServerItem *si, qlItems) { + if (si->uiPing) + qmPingCache.insert(QPair(si->qsHostname, si->usPort), si->uiPing); + if (si->itType != ServerItem::FavoriteType) continue; ql << si->toFavoriteServer(); } Database::setFavorites(ql); + Database::setPingCache(qmPingCache); } void ConnectDialog::accept() { @@ -1342,6 +1352,9 @@ void ConnectDialog::udpReply() { quint32 users = qFromBigEndian(ping[3]); quint32 maxusers = qFromBigEndian(ping[4]); si->uiBandwidth = qFromBigEndian(ping[5]); + + if (! si->uiPingSort) + si->uiPingSort = qmPingCache.value(QPair(si->qsHostname, si->usPort)); si->setDatas(static_cast(elapsed), users, maxusers); si->hideCheck(); diff --git a/src/mumble/ConnectDialog.h b/src/mumble/ConnectDialog.h index 39b864ce5..9ed069b9b 100644 --- a/src/mumble/ConnectDialog.h +++ b/src/mumble/ConnectDialog.h @@ -66,6 +66,7 @@ public: quint32 uiMaxUsers; quint32 uiBandwidth; quint32 uiSent; + quint32 uiRecv; double dPing; @@ -132,7 +133,6 @@ class ServerItem : public QTreeWidgetItem, public PingStats { QString qsUrl; - QString qsBonjourHost; BonjourRecord brRecord; @@ -210,6 +210,8 @@ class ConnectDialog : public QDialog, public Ui::ConnectDialog { QHash qhPingRand; QHash > qhPings; + + QMap, unsigned int> qmPingCache; bool bIPv4; bool bIPv6; diff --git a/src/mumble/Database.cpp b/src/mumble/Database.cpp index e24cf4e29..a110217a9 100644 --- a/src/mumble/Database.cpp +++ b/src/mumble/Database.cpp @@ -112,6 +112,9 @@ Database::Database() { query.exec(QLatin1String("CREATE TABLE IF NOT EXISTS `muted` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `hash` TEXT)")); query.exec(QLatin1String("CREATE UNIQUE INDEX IF NOT EXISTS `muted_hash` ON `muted`(`hash`)")); + query.exec(QLatin1String("CREATE TABLE IF NOT EXISTS `pingcache` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `hostname` TEXT, `port` INTEGER, `ping` INTEGER)")); + query.exec(QLatin1String("CREATE UNIQUE INDEX IF NOT EXISTS `pingcache_host_port` ON `pingcache`(`hostname`,`port`)")); + query.exec(QLatin1String("DELETE FROM `comments` WHERE `seen` < datetime('now', '-1 years')")); } @@ -178,6 +181,38 @@ void Database::setLocalMuted(const QString &hash, bool muted) { query.exec(); } +QMap, unsigned int> Database::getPingCache() { + QSqlQuery query; + QMap, unsigned int> map; + + query.prepare(QLatin1String("SELECT `hostname`, `port`, `ping` FROM `pingcache`")); + query.exec(); + while (query.next()) { + map.insert(QPair(query.value(0).toString(), query.value(1).toUInt()), query.value(2).toUInt()); + } + return map; +} + +void Database::setPingCache(const QMap, unsigned int> &map) { + QSqlQuery query; + QMap, unsigned int>::const_iterator i; + + QSqlDatabase::database().transaction(); + + query.prepare(QLatin1String("DELETE FROM `pingcache`")); + query.exec(); + + query.prepare(QLatin1String("REPLACE INTO `pingcache` (`hostname`, `port`, `ping`) VALUES (?,?,?)")); + for(i = map.constBegin(); i != map.constEnd(); ++i) { + query.addBindValue(i.key().first); + query.addBindValue(i.key().second); + query.addBindValue(i.value()); + query.exec(); + } + + QSqlDatabase::database().commit(); +} + bool Database::seenComment(const QString &hash, const QString &comment) { QSqlQuery query; diff --git a/src/mumble/Database.h b/src/mumble/Database.h index f5fba45c8..1247fcf89 100644 --- a/src/mumble/Database.h +++ b/src/mumble/Database.h @@ -56,6 +56,9 @@ class Database : public QObject { static bool isLocalMuted(const QString &hash); static void setLocalMuted(const QString &hash, bool muted); + + static QMap, unsigned int> getPingCache(); + static void setPingCache(const QMap, unsigned int> &cache); static bool seenComment(const QString &hash, const QString &comment); static void setSeenComment(const QString &hash, const QString &comment);