Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mumble-voip/mumble.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Adam <dev@robert-adam.de>2022-09-09 20:36:35 +0300
committerGitHub <noreply@github.com>2022-09-09 20:36:35 +0300
commit5d4bacfefacc22e30749011497a1e3e71cda33e9 (patch)
treedd2461b317d739102ef4039a090cca307fd1b0b7
parent0e115aae9d840a20e684abb338474b7e7718278f (diff)
parentb6927dfb39287def9b044c9818ee4f0ba7f9d0e0 (diff)
Merge PR #5868: Backport "FIX(client, server): Fix patch versions > 255"
-rw-r--r--src/CMakeLists.txt7
-rw-r--r--src/Mumble.proto16
-rw-r--r--src/OSInfo.cpp4
-rw-r--r--src/ProtoUtils.cpp40
-rw-r--r--src/ProtoUtils.h22
-rw-r--r--src/Version.cpp73
-rw-r--r--src/Version.h98
-rw-r--r--src/mumble/ACLEditor.cpp6
-rw-r--r--src/mumble/API_v_1_0_x.cpp2
-rw-r--r--src/mumble/About.cpp2
-rw-r--r--src/mumble/ConnectDialog.cpp4
-rw-r--r--src/mumble/ConnectDialog.h3
-rw-r--r--src/mumble/CrashReporter.cpp4
-rw-r--r--src/mumble/MainWindow.cpp48
-rw-r--r--src/mumble/Messages.cpp18
-rw-r--r--src/mumble/NetworkConfig.cpp9
-rw-r--r--src/mumble/Plugin.cpp4
-rw-r--r--src/mumble/ServerHandler.cpp15
-rw-r--r--src/mumble/ServerHandler.h3
-rw-r--r--src/mumble/UserInformation.cpp12
-rw-r--r--src/mumble/UserInformation.ui118
-rw-r--r--src/mumble/VersionCheck.cpp2
-rw-r--r--src/mumble/VoiceRecorder.cpp5
-rw-r--r--src/mumble/VoiceRecorderDialog.cpp2
-rw-r--r--src/mumble/mumble_ar.ts16
-rw-r--r--src/mumble/mumble_bg.ts16
-rw-r--r--src/mumble/mumble_br.ts16
-rw-r--r--src/mumble/mumble_ca.ts16
-rw-r--r--src/mumble/mumble_cs.ts16
-rw-r--r--src/mumble/mumble_cy.ts16
-rw-r--r--src/mumble/mumble_da.ts16
-rw-r--r--src/mumble/mumble_de.ts16
-rw-r--r--src/mumble/mumble_el.ts16
-rw-r--r--src/mumble/mumble_en.ts16
-rw-r--r--src/mumble/mumble_en_GB.ts16
-rw-r--r--src/mumble/mumble_eo.ts16
-rw-r--r--src/mumble/mumble_es.ts16
-rw-r--r--src/mumble/mumble_et.ts16
-rw-r--r--src/mumble/mumble_eu.ts16
-rw-r--r--src/mumble/mumble_fa_IR.ts16
-rw-r--r--src/mumble/mumble_fi.ts16
-rw-r--r--src/mumble/mumble_fr.ts16
-rw-r--r--src/mumble/mumble_gl.ts16
-rw-r--r--src/mumble/mumble_he.ts16
-rw-r--r--src/mumble/mumble_hu.ts16
-rw-r--r--src/mumble/mumble_it.ts16
-rw-r--r--src/mumble/mumble_ja.ts16
-rw-r--r--src/mumble/mumble_ko.ts16
-rw-r--r--src/mumble/mumble_lt.ts16
-rw-r--r--src/mumble/mumble_nl.ts16
-rw-r--r--src/mumble/mumble_no.ts16
-rw-r--r--src/mumble/mumble_oc.ts16
-rw-r--r--src/mumble/mumble_pl.ts16
-rw-r--r--src/mumble/mumble_pt_BR.ts16
-rw-r--r--src/mumble/mumble_pt_PT.ts16
-rw-r--r--src/mumble/mumble_ro.ts16
-rw-r--r--src/mumble/mumble_ru.ts16
-rw-r--r--src/mumble/mumble_si.ts16
-rw-r--r--src/mumble/mumble_sq.ts16
-rw-r--r--src/mumble/mumble_sv.ts16
-rw-r--r--src/mumble/mumble_te.ts16
-rw-r--r--src/mumble/mumble_th.ts16
-rw-r--r--src/mumble/mumble_tr.ts16
-rw-r--r--src/mumble/mumble_uk.ts16
-rw-r--r--src/mumble/mumble_zh_CN.ts16
-rw-r--r--src/mumble/mumble_zh_HK.ts16
-rw-r--r--src/mumble/mumble_zh_TW.ts16
-rw-r--r--src/mumble/os_win.cpp3
-rw-r--r--src/murmur/About.cpp2
-rw-r--r--src/murmur/DBus.cpp3
-rw-r--r--src/murmur/DBus.h3
-rw-r--r--src/murmur/Messages.cpp60
-rw-r--r--src/murmur/Meta.cpp7
-rw-r--r--src/murmur/Meta.h7
-rw-r--r--src/murmur/Murmur.ice4
-rw-r--r--src/murmur/MurmurGRPCImpl.cpp7
-rw-r--r--src/murmur/MurmurIce.cpp9
-rw-r--r--src/murmur/MurmurIceWrapper.cpp3
-rw-r--r--src/murmur/RPC.cpp15
-rw-r--r--src/murmur/Server.cpp83
-rw-r--r--src/murmur/Server.h23
-rw-r--r--src/murmur/ServerUser.cpp2
-rw-r--r--src/murmur/ServerUser.h3
-rw-r--r--src/murmur/Tray.cpp2
-rw-r--r--src/murmur/main.cpp8
-rw-r--r--src/tests/Benchmark.cpp2
-rw-r--r--src/tests/CMakeLists.txt1
-rw-r--r--src/tests/TestVersion/CMakeLists.txt12
-rw-r--r--src/tests/TestVersion/TestVersion.cpp86
89 files changed, 1098 insertions, 452 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 456288bfe..9b6a0f095 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -63,6 +63,7 @@ set(SHARED_SOURCES
"PlatformCheck.cpp"
"QtUtils.cpp"
"ProcessResolver.cpp"
+ "ProtoUtils.cpp"
"SelfSignedCertificate.cpp"
"ServerAddress.cpp"
"ServerResolver.cpp"
@@ -97,6 +98,7 @@ set(SHARED_HEADERS
"PasswordGenerator.h"
"PlatformCheck.h"
"ProcessResolver.h"
+ "ProtoUtils.h"
"SelfSignedCertificate.h"
"ServerAddress.h"
"ServerResolver.h"
@@ -124,7 +126,10 @@ target_sources(shared
target_compile_definitions(shared
PUBLIC
- "MUMBLE_VERSION=${PROJECT_VERSION}"
+ "MUMBLE_VERSION=${CMAKE_PROJECT_VERSION}"
+ "MUMBLE_VERSION_MAJOR=${CMAKE_PROJECT_VERSION_MAJOR}"
+ "MUMBLE_VERSION_MINOR=${CMAKE_PROJECT_VERSION_MINOR}"
+ "MUMBLE_VERSION_PATCH=${CMAKE_PROJECT_VERSION_PATCH}"
)
target_compile_definitions(shared
diff --git a/src/Mumble.proto b/src/Mumble.proto
index 5132e7011..d23812606 100644
--- a/src/Mumble.proto
+++ b/src/Mumble.proto
@@ -10,8 +10,12 @@ package MumbleProto;
option optimize_for = SPEED;
message Version {
- // 2-byte Major, 1-byte Minor and 1-byte Patch version number.
- optional uint32 version = 1;
+ // Legacy version number format.
+ optional uint32 version_v1 = 1;
+ // New version number format.
+ // Necessary since patch level may exceed 255. (See https://github.com/mumble-voip/mumble/issues/5827)
+ optional uint64 version_v2 = 5;
+
// Client release name.
optional string release = 2;
// Client OS name.
@@ -576,8 +580,12 @@ message ServerConfig {
// Sent by the server to inform the clients of suggested client configuration
// specified by the server administrator.
message SuggestConfig {
- // Suggested client version.
- optional uint32 version = 1;
+ // Suggested client version in the legacy format.
+ optional uint32 version_v1 = 1;
+ // Suggested client version in the new format.
+ // Necessary since patch level may exceed 255. (See https://github.com/mumble-voip/mumble/issues/5827)
+ optional uint64 version_v2 = 4;
+
// True if the administrator suggests positional audio to be used on this
// server.
optional bool positional = 2;
diff --git a/src/OSInfo.cpp b/src/OSInfo.cpp
index 1305036ad..4afb54bcb 100644
--- a/src/OSInfo.cpp
+++ b/src/OSInfo.cpp
@@ -388,12 +388,12 @@ void OSInfo::fillXml(QDomDocument &doc, QDomElement &root, const QList< QHostAdd
tag = doc.createElement(QLatin1String("version"));
root.appendChild(tag);
- t = doc.createTextNode(QLatin1String(MUMTEXT(MUMBLE_VERSION)));
+ t = doc.createTextNode(Version::getRelease());
tag.appendChild(t);
tag = doc.createElement(QLatin1String("release"));
root.appendChild(tag);
- t = doc.createTextNode(QLatin1String(MUMBLE_RELEASE));
+ t = doc.createTextNode(Version::getRelease());
tag.appendChild(t);
tag = doc.createElement(QLatin1String("os"));
diff --git a/src/ProtoUtils.cpp b/src/ProtoUtils.cpp
new file mode 100644
index 000000000..3ee3ba666
--- /dev/null
+++ b/src/ProtoUtils.cpp
@@ -0,0 +1,40 @@
+// Copyright 2022 The Mumble Developers. All rights reserved.
+// Use of this source code is governed by a BSD-style license
+// that can be found in the LICENSE file at the root of the
+// Mumble source tree or at <https://www.mumble.info/LICENSE>.
+
+#include "ProtoUtils.h"
+
+namespace MumbleProto {
+
+::Version::full_t getVersion(const MumbleProto::Version &msg) {
+ if (msg.has_version_v2()) {
+ return static_cast<::Version::full_t >(msg.version_v2());
+ } else if (msg.has_version_v1()) {
+ return ::Version::fromLegacyVersion(msg.version_v1());
+ }
+
+ return ::Version::UNKNOWN;
+}
+
+void setVersion(MumbleProto::Version &msg, const ::Version::full_t version) {
+ msg.set_version_v2(version);
+ msg.set_version_v1(::Version::toLegacyVersion(version));
+}
+
+::Version::full_t getSuggestedVersion(const MumbleProto::SuggestConfig &msg) {
+ if (msg.has_version_v2()) {
+ return static_cast<::Version::full_t >(msg.version_v2());
+ } else if (msg.has_version_v1()) {
+ return ::Version::fromLegacyVersion(msg.version_v1());
+ }
+
+ return ::Version::UNKNOWN;
+}
+
+void setSuggestedVersion(MumbleProto::SuggestConfig &msg, const ::Version::full_t version) {
+ msg.set_version_v2(version);
+ msg.set_version_v1(::Version::toLegacyVersion(version));
+}
+
+}; // namespace MumbleProto
diff --git a/src/ProtoUtils.h b/src/ProtoUtils.h
new file mode 100644
index 000000000..f2013e1bc
--- /dev/null
+++ b/src/ProtoUtils.h
@@ -0,0 +1,22 @@
+// Copyright 2022 The Mumble Developers. All rights reserved.
+// Use of this source code is governed by a BSD-style license
+// that can be found in the LICENSE file at the root of the
+// Mumble source tree or at <https://www.mumble.info/LICENSE>.
+
+#ifndef MUMBLE_PROTOUTILS_H_
+#define MUMBLE_PROTOUTILS_H_
+
+#include "Mumble.pb.h"
+#include "Version.h"
+
+namespace MumbleProto {
+
+::Version::full_t getVersion(const MumbleProto::Version &msg);
+void setVersion(MumbleProto::Version &msg, const ::Version::full_t version);
+
+::Version::full_t getSuggestedVersion(const MumbleProto::SuggestConfig &msg);
+void setSuggestedVersion(MumbleProto::SuggestConfig &msg, const ::Version::full_t version);
+
+}; // namespace MumbleProto
+
+#endif // MUMBLE_PROTOUTILS_H_
diff --git a/src/Version.cpp b/src/Version.cpp
index 95e9a4c55..3254703e4 100644
--- a/src/Version.cpp
+++ b/src/Version.cpp
@@ -5,35 +5,76 @@
#include "Version.h"
-#include <QtCore/QRegExp>
+#include <QObject>
+#include <QRegExp>
namespace Version {
-unsigned int getRaw(const QString &version) {
- int major, minor, patch;
+QString getRelease() {
+ return MUMBLE_RELEASE;
+}
+
+Version::full_t fromString(const QString &version) {
+ Version::component_t major, minor, patch;
+
+ if (Version::getComponents(major, minor, patch, version)) {
+ return Version::fromComponents(major, minor, patch);
+ }
+
+ return Version::UNKNOWN;
+}
+
+Version::full_t fromConfig(const QVariant &config) {
+ Version::full_t version;
- if (get(&major, &minor, &patch, version))
- return toRaw(major, minor, patch);
+ bool ok = false;
+ std::uint64_t integerValue = config.toULongLong(&ok);
+ if (ok) {
+ if ((integerValue >> Version::OFFSET_MAJOR) != 0) {
+ // We assume this must be the new version format (v2), as a bit
+ // after the 32nd is set.
+ version = static_cast< Version::full_t >(integerValue);
+ } else {
+ version = Version::fromLegacyVersion(static_cast< std::uint32_t >(integerValue));
+ }
+ } else {
+ // The config contains non-numeric characters -> We assume it contains a version string such as "1.5.0".
+ // If this call fails, UNKNOWN is returned.
+ version = Version::fromString(config.toString());
+ }
+
+ if (version == 0) {
+ // 0 is not a valid value for a suggested version
+ version = Version::UNKNOWN;
+ }
- return 0;
+ return version;
}
-QString toString(unsigned int v) {
- int major, minor, patch;
- fromRaw(v, &major, &minor, &patch);
+QString toString(Version::full_t v) {
+ if (v == Version::UNKNOWN) {
+ return QObject::tr("Unknown Version");
+ }
+ Version::component_t major, minor, patch;
+ Version::getComponents(major, minor, patch, v);
return QString::fromLatin1("%1.%2.%3").arg(major).arg(minor).arg(patch);
}
-bool get(int *major, int *minor, int *patch, const QString &version) {
+QString toConfigString(Version::full_t v) {
+ if (v == Version::UNKNOWN) {
+ return QString();
+ }
+ return Version::toString(v);
+}
+
+bool getComponents(Version::component_t &major, Version::component_t &minor, Version::component_t &patch,
+ const QString &version) {
QRegExp rx(QLatin1String("(\\d+)\\.(\\d+)\\.(\\d+)(?:\\.(\\d+))?"));
if (rx.exactMatch(version)) {
- if (major)
- *major = rx.cap(1).toInt();
- if (minor)
- *minor = rx.cap(2).toInt();
- if (patch)
- *patch = rx.cap(3).toInt();
+ major = rx.cap(1).toInt();
+ minor = rx.cap(2).toInt();
+ patch = rx.cap(3).toInt();
return true;
}
diff --git a/src/Version.h b/src/Version.h
index 2980b8fc8..3fcf9e188 100644
--- a/src/Version.h
+++ b/src/Version.h
@@ -6,7 +6,11 @@
#ifndef MUMBLE_VERSION_H_
#define MUMBLE_VERSION_H_
-#include <QtCore/QString>
+#include <cstdint>
+#include <limits>
+
+#include <QString>
+#include <QVariant>
#define MUMXTEXT(X) #X
#define MUMTEXT(X) MUMXTEXT(X)
@@ -15,12 +19,94 @@
namespace Version {
-unsigned int getRaw(const QString &version = QLatin1String(MUMTEXT(MUMBLE_VERSION)));
-QString toString(unsigned int version);
-bool get(int *major, int *minor, int *patch, const QString &version = QLatin1String(MUMTEXT(MUMBLE_VERSION)));
+enum class CompareMode { AtLeast, LessThan };
+
+//
+// The mumble version format (v2) is a uint64:
+// major minor patch reserved/unused
+// 0xFFFF 0xFFFF 0xFFFF 0xFFFF
+// (big-endian)
+//
+
+using full_t = std::uint64_t;
+using component_t = std::uint16_t;
+
+constexpr full_t OFFSET_MAJOR = 48;
+constexpr full_t OFFSET_MINOR = 32;
+constexpr full_t OFFSET_PATCH = 16;
+constexpr full_t OFFSET_UNUSED = 0;
+constexpr full_t FIELD_MASK = 0xFFFF;
+constexpr full_t FIELD_MAJOR = (FIELD_MASK << Version::OFFSET_MAJOR);
+constexpr full_t FIELD_MINOR = (FIELD_MASK << Version::OFFSET_MINOR);
+constexpr full_t FIELD_PATCH = (FIELD_MASK << Version::OFFSET_PATCH);
+constexpr full_t FIELD_UNUSED = (FIELD_MASK << Version::OFFSET_UNUSED);
+
+constexpr full_t UNKNOWN = 0;
+
+QString getRelease();
+full_t fromString(const QString &version);
+full_t fromConfig(const QVariant &config);
+QString toString(full_t version);
+QString toConfigString(full_t version);
+bool getComponents(Version::component_t &major, Version::component_t &minor, Version::component_t &patch,
+ const QString &version);
+
+constexpr Version::component_t getMajor(Version::full_t version) {
+ return static_cast< Version::component_t >((version & Version::FIELD_MAJOR) >> Version::OFFSET_MAJOR);
+}
+
+constexpr Version::component_t getMinor(Version::full_t version) {
+ return static_cast< Version::component_t >((version & Version::FIELD_MINOR) >> Version::OFFSET_MINOR);
+}
+
+constexpr Version::component_t getPatch(Version::full_t version) {
+ return static_cast< Version::component_t >((version & Version::FIELD_PATCH) >> Version::OFFSET_PATCH);
+}
+
+constexpr Version::full_t fromComponents(Version::component_t major, Version::component_t minor,
+ Version::component_t patch) {
+ return ((static_cast< full_t >(major) << Version::OFFSET_MAJOR)
+ | (static_cast< full_t >(minor) << Version::OFFSET_MINOR)
+ | (static_cast< full_t >(patch) << Version::OFFSET_PATCH));
+}
+
+constexpr full_t get() {
+ return fromComponents(MUMBLE_VERSION_MAJOR, MUMBLE_VERSION_MINOR, MUMBLE_VERSION_PATCH);
+}
+
+constexpr void getComponents(Version::component_t &major, Version::component_t &minor, Version::component_t &patch,
+ Version::full_t version = get()) {
+ major = Version::getMajor(version);
+ minor = Version::getMinor(version);
+ patch = Version::getPatch(version);
+}
+
+//
+// Legacy versions: These versions are kept around for backward compatibility, but
+// have since been replaced by other version formats.
+//
+// Mumble legacy version format (v1) is a uint32:
+// major minor patch
+// 0xFFFF 0xFF 0xFF
+// (big-endian)
+//
+
+constexpr Version::full_t fromLegacyVersion(std::uint32_t version) {
+ return fromComponents((version & 0xFFFF0000) >> 16, (version & 0xFF00) >> 8, version & 0xFF);
+}
-unsigned int toRaw(int major, int minor, int patch);
-void fromRaw(unsigned int version, int *major, int *minor, int *patch);
+constexpr std::uint32_t toLegacyVersion(Version::full_t version) {
+ // If any of the version components exceeds their allowed value range, they will
+ // be truncated to the highest representable value
+ return ((std::min(static_cast< std::uint32_t >(Version::getMajor(version)),
+ static_cast< std::uint32_t >(std::numeric_limits< std::uint16_t >::max()))
+ << 16)
+ | (std::min(static_cast< std::uint32_t >(Version::getMinor(version)),
+ static_cast< std::uint32_t >(std::numeric_limits< std::uint8_t >::max()))
+ << 8)
+ | std::min(static_cast< std::uint32_t >(Version::getPatch(version)),
+ static_cast< std::uint32_t >(std::numeric_limits< std::uint8_t >::max())));
+}
}; // namespace Version
diff --git a/src/mumble/ACLEditor.cpp b/src/mumble/ACLEditor.cpp
index ba709e372..cdf96a2f4 100644
--- a/src/mumble/ACLEditor.cpp
+++ b/src/mumble/ACLEditor.cpp
@@ -58,7 +58,7 @@ ACLEditor::ACLEditor(int channelparentid, QWidget *p) : QDialog(p) {
qleChannelPassword->hide();
qlChannelPassword->hide();
- if (Global::get().sh->uiVersion >= 0x010300) {
+ if (Global::get().sh->uiVersion >= Version::fromComponents(1, 3, 0)) {
qsbChannelMaxUsers->setRange(0, INT_MAX);
qsbChannelMaxUsers->setValue(0);
qsbChannelMaxUsers->setSpecialValueText(tr("Default server value"));
@@ -124,7 +124,7 @@ ACLEditor::ACLEditor(int channelid, const MumbleProto::ACL &mea, QWidget *p) : Q
qsbChannelPosition->setRange(INT_MIN, INT_MAX);
qsbChannelPosition->setValue(pChannel->iPosition);
- if (Global::get().sh->uiVersion >= 0x010300) {
+ if (Global::get().sh->uiVersion >= Version::fromComponents(1, 3, 0)) {
qsbChannelMaxUsers->setRange(0, INT_MAX);
qsbChannelMaxUsers->setValue(pChannel->uiMaxUsers);
qsbChannelMaxUsers->setSpecialValueText(tr("Default server value"));
@@ -148,7 +148,7 @@ ACLEditor::ACLEditor(int channelid, const MumbleProto::ACL &mea, QWidget *p) : Q
if (!name.isEmpty()) {
// If the server's version is less than 1.4.0 then it won't support the new permissions.
// Skipping this iteration of the loop prevents checkboxes for it being added to the UI.
- if (Global::get().sh->uiVersion < Version::toRaw(1, 4, 0)
+ if (Global::get().sh->uiVersion < Version::fromComponents(1, 4, 0)
&& (perm == ChanACL::ResetUserContent || perm == ChanACL::Listen)) {
continue;
}
diff --git a/src/mumble/API_v_1_0_x.cpp b/src/mumble/API_v_1_0_x.cpp
index dc8477b5b..a796fbc64 100644
--- a/src/mumble/API_v_1_0_x.cpp
+++ b/src/mumble/API_v_1_0_x.cpp
@@ -1561,7 +1561,7 @@ void MumbleAPI::sendData_v_1_0_x(mumble_plugin_id_t callerID, mumble_connection_
mpdt.set_dataid(dataID);
if (Global::get().sh) {
- if (Global::get().sh->uiVersion < Version::toRaw(1, 4, 0)) {
+ if (Global::get().sh->uiVersion < Version::fromComponents(1, 4, 0)) {
// The sendMessage call relies on the server relaying the message to the respective receiver. This
// functionality was added to the server protocol in version 1.4.0, so an older server will not know what to
// do with the received message.
diff --git a/src/mumble/About.cpp b/src/mumble/About.cpp
index 2abac5852..47087141a 100644
--- a/src/mumble/About.cpp
+++ b/src/mumble/About.cpp
@@ -68,7 +68,7 @@ AboutDialog::AboutDialog(QWidget *p) : QDialog(p) {
"<p>%3</p>"
"<p><b>An Open Source, low-latency, high quality voice-chat utility</b></p>"
"<p><tt><a href=\"%2\">%2</a></tt></p>")
- .arg(QLatin1String(MUMBLE_RELEASE))
+ .arg(Version::getRelease())
.arg(QLatin1String("https://www.mumble.info/"))
.arg(copyrightText));
QHBoxLayout *qhbl = new QHBoxLayout(about);
diff --git a/src/mumble/ConnectDialog.cpp b/src/mumble/ConnectDialog.cpp
index 552887aea..35e00eafe 100644
--- a/src/mumble/ConnectDialog.cpp
+++ b/src/mumble/ConnectDialog.cpp
@@ -1358,7 +1358,7 @@ void ConnectDialog::initList() {
url.setPath(QLatin1String("/v1/list"));
QUrlQuery query;
- query.addQueryItem(QLatin1String("version"), QLatin1String(MUMTEXT(MUMBLE_VERSION)));
+ query.addQueryItem(QLatin1String("version"), Version::getRelease());
url.setQuery(query);
WebFetch::fetch(QLatin1String("publist"), url, this, SLOT(fetched(QByteArray, QUrl, QMap< QString, QString >)));
@@ -1778,7 +1778,7 @@ void ConnectDialog::udpReply() {
quint64 elapsed = tPing.elapsed() - (*ts ^ qhPingRand.value(address));
foreach (ServerItem *si, qhPings.value(address)) {
- si->uiVersion = qFromBigEndian(ping[0]);
+ si->uiVersion = Version::fromLegacyVersion(qFromBigEndian(ping[0]));
quint32 users = qFromBigEndian(ping[3]);
quint32 maxusers = qFromBigEndian(ping[4]);
si->uiBandwidth = qFromBigEndian(ping[5]);
diff --git a/src/mumble/ConnectDialog.h b/src/mumble/ConnectDialog.h
index 278d4ccca..1758a9a0a 100644
--- a/src/mumble/ConnectDialog.h
+++ b/src/mumble/ConnectDialog.h
@@ -30,6 +30,7 @@
#include "ServerAddress.h"
#include "Timer.h"
#include "UnresolvedServerAddress.h"
+#include "Version.h"
struct FavoriteServer;
class QUdpSocket;
@@ -52,7 +53,7 @@ protected:
void init();
public:
- quint32 uiVersion;
+ Version::full_t uiVersion;
quint32 uiPing;
quint32 uiPingSort;
quint32 uiUsers;
diff --git a/src/mumble/CrashReporter.cpp b/src/mumble/CrashReporter.cpp
index c12cbf28e..ace38c622 100644
--- a/src/mumble/CrashReporter.cpp
+++ b/src/mumble/CrashReporter.cpp
@@ -210,8 +210,8 @@ void CrashReporter::run() {
"name=\"os\"\r\nContent-Transfer-Encoding: 8bit\r\n\r\n%2 %3\r\n")
.arg(boundary, OSInfo::getOS(), OSInfo::getOSVersion());
QString ver = QString::fromLatin1("--%1\r\nContent-Disposition: form-data; "
- "name=\"ver\"\r\nContent-Transfer-Encoding: 8bit\r\n\r\n%2 %3\r\n")
- .arg(boundary, QLatin1String(MUMTEXT(MUMBLE_VERSION)), QLatin1String(MUMBLE_RELEASE));
+ "name=\"ver\"\r\nContent-Transfer-Encoding: 8bit\r\n\r\n%2\r\n")
+ .arg(boundary, Version::getRelease());
QString email = QString::fromLatin1("--%1\r\nContent-Disposition: form-data; "
"name=\"email\"\r\nContent-Transfer-Encoding: 8bit\r\n\r\n%2\r\n")
.arg(boundary, qleEmail->text());
diff --git a/src/mumble/MainWindow.cpp b/src/mumble/MainWindow.cpp
index 21022ff64..8ffbb958d 100644
--- a/src/mumble/MainWindow.cpp
+++ b/src/mumble/MainWindow.cpp
@@ -249,7 +249,7 @@ void MainWindow::createActions() {
gsVolumeDown->setObjectName(QLatin1String("VolumeDown"));
qstiIcon = new QSystemTrayIcon(qiIcon, this);
- qstiIcon->setToolTip(tr("Mumble -- %1").arg(QLatin1String(MUMBLE_RELEASE)));
+ qstiIcon->setToolTip(tr("Mumble -- %1").arg(Version::getRelease()));
qstiIcon->setObjectName(QLatin1String("Icon"));
gsWhisper = new GlobalShortcut(this, idx++, tr("Whisper/Shout"), QVariant::fromValue(ShortcutTarget()));
@@ -1052,19 +1052,14 @@ void MainWindow::openUrl(const QUrl &url) {
return;
}
- int major, minor, patch;
- int thismajor, thisminor, thispatch;
- Version::get(&thismajor, &thisminor, &thispatch);
-
- // With no version parameter given assume the link refers to our version
- major = thismajor;
- minor = thisminor;
- patch = thispatch;
+ Version::full_t thisVersion = Version::get();
+ Version::full_t targetVersion = Version::UNKNOWN;
QUrlQuery query(url);
QString version = query.queryItemValue(QLatin1String("version"));
if (version.size() > 0) {
- if (!Version::get(&major, &minor, &patch, version)) {
+ targetVersion = Version::fromString(version);
+ if (targetVersion == Version::UNKNOWN) {
// The version format is invalid
Global::get().l->log(Log::Warning,
QObject::tr("The provided URL uses an invalid version format: \"%1\"").arg(version));
@@ -1072,21 +1067,20 @@ void MainWindow::openUrl(const QUrl &url) {
}
}
+ // With no version parameter given assume the link refers to our version
+ if (targetVersion == Version::UNKNOWN) {
+ targetVersion = thisVersion;
+ }
+
// We can't handle URLs for versions < 1.2.0
- const int minMajor = 1;
- const int minMinor = 2;
- const int minPatch = 0;
- const bool isPre_120 = major < minMajor || (major == minMajor && minor < minMinor)
- || (major == minMajor && minor == minMinor && patch < minPatch);
+ const bool isPre_120 = targetVersion < Version::fromComponents(1, 2, 0);
// We also can't handle URLs for versions newer than the running Mumble instance
- const bool isFuture = major > thismajor || (major == thismajor && minor > thisminor)
- || (major == thismajor && minor == thisminor && patch > thispatch);
+ const bool isFuture = thisVersion < targetVersion;
if (isPre_120 || isFuture) {
- Global::get().l->log(Log::Warning, tr("This version of Mumble can't handle URLs for Mumble version %1.%2.%3")
- .arg(major)
- .arg(minor)
- .arg(patch));
+ Global::get().l->log(
+ Log::Warning,
+ tr("This version of Mumble can't handle URLs for Mumble version %1").arg(Version::toString(targetVersion)));
return;
}
@@ -1385,7 +1379,7 @@ void MainWindow::on_qmSelf_aboutToShow() {
qaSelfRegister->setEnabled(user && (user->iId < 0) && !user->qsHash.isEmpty()
&& (Global::get().pPermissions & (ChanACL::SelfRegister | ChanACL::Write)));
- if (Global::get().sh && Global::get().sh->uiVersion >= 0x010203) {
+ if (Global::get().sh && Global::get().sh->uiVersion >= Version::fromComponents(1, 2, 3)) {
qaSelfPrioritySpeaker->setEnabled(user && Global::get().pPermissions & (ChanACL::Write | ChanACL::MuteDeafen));
qaSelfPrioritySpeaker->setChecked(user && user->bPrioritySpeaker);
} else {
@@ -1581,7 +1575,7 @@ void MainWindow::qmUser_aboutToShow() {
qmUser->addAction(qaUserBan);
qmUser->addAction(qaUserMute);
qmUser->addAction(qaUserDeaf);
- if (Global::get().sh && Global::get().sh->uiVersion >= 0x010203)
+ if (Global::get().sh && Global::get().sh->uiVersion >= Version::fromComponents(1, 2, 3))
qmUser->addAction(qaUserPrioritySpeaker);
qmUser->addAction(qaUserLocalMute);
qmUser->addAction(qaUserLocalIgnore);
@@ -1599,7 +1593,7 @@ void MainWindow::qmUser_aboutToShow() {
}
qmUser->addAction(qaUserTextMessage);
- if (Global::get().sh && Global::get().sh->uiVersion >= 0x010202)
+ if (Global::get().sh && Global::get().sh->uiVersion >= Version::fromComponents(1, 2, 2))
qmUser->addAction(qaUserInformation);
if (p && (p->iId < 0) && !p->qsHash.isEmpty()
@@ -1664,7 +1658,7 @@ void MainWindow::qmUser_aboutToShow() {
qaUserLocalIgnoreTTS->setEnabled(!isSelf);
// If the server's version is less than 1.4.0 it won't support the new permission to reset a comment/avatar, so
// fall back to the old method
- if (Global::get().sh->uiVersion < 0x010400) {
+ if (Global::get().sh->uiVersion < Version::fromComponents(1, 4, 0)) {
qaUserCommentReset->setEnabled(!p->qbaCommentHash.isEmpty()
&& (Global::get().pPermissions & (ChanACL::Move | ChanACL::Write)));
qaUserTextureReset->setEnabled(!p->qbaTextureHash.isEmpty()
@@ -2132,7 +2126,7 @@ void MainWindow::qmChannel_aboutToShow() {
qmChannel->addSeparator();
}
- if (c && Global::get().sh && Global::get().sh->uiVersion >= 0x010400) {
+ if (c && Global::get().sh && Global::get().sh->uiVersion >= Version::fromComponents(1, 4, 0)) {
// If the server's version is less than 1.4, the listening feature is not supported yet
// and thus it doesn't make sense to show the action for it
qmChannel->addAction(qaChannelListen);
@@ -3385,7 +3379,7 @@ void MainWindow::serverDisconnected(QAbstractSocket::SocketError err, QString re
}
}
}
- qstiIcon->setToolTip(tr("Mumble -- %1").arg(QLatin1String(MUMBLE_RELEASE)));
+ qstiIcon->setToolTip(tr("Mumble -- %1").arg(Version::getRelease()));
AudioInput::setMaxBandwidth(-1);
}
diff --git a/src/mumble/Messages.cpp b/src/mumble/Messages.cpp
index c49a1739b..d39a6cc5f 100644
--- a/src/mumble/Messages.cpp
+++ b/src/mumble/Messages.cpp
@@ -25,6 +25,7 @@
#endif
#include "ChannelListenerManager.h"
#include "PluginManager.h"
+#include "ProtoUtils.h"
#include "ServerHandler.h"
#include "TalkingUI.h"
#include "User.h"
@@ -1153,8 +1154,8 @@ void MainWindow::removeContextAction(const MumbleProto::ContextActionModify &msg
///
/// @param msg The message object with the respective information
void MainWindow::msgVersion(const MumbleProto::Version &msg) {
- if (msg.has_version())
- Global::get().sh->uiVersion = msg.version();
+ Global::get().sh->uiVersion = MumbleProto::getVersion(msg);
+
if (msg.has_release())
Global::get().sh->qsRelease = u8(msg.release());
if (msg.has_os()) {
@@ -1232,7 +1233,8 @@ void MainWindow::msgCodecVersion(const MumbleProto::CodecVersion &msg) {
#endif
// Workaround for broken 1.2.2 servers
- if (Global::get().sh && Global::get().sh->uiVersion == 0x010202 && alpha != -1 && alpha == beta) {
+ if (Global::get().sh && Global::get().sh->uiVersion == Version::fromComponents(1, 2, 2) && alpha != -1
+ && alpha == beta) {
if (pref)
beta = Global::get().iCodecBeta;
else
@@ -1299,9 +1301,13 @@ void MainWindow::msgRequestBlob(const MumbleProto::RequestBlob &) {
///
/// @param msg The message object containing the suggestions
void MainWindow::msgSuggestConfig(const MumbleProto::SuggestConfig &msg) {
- if (msg.has_version() && (msg.version() > Version::getRaw())) {
- Global::get().l->log(Log::Warning,
- tr("The server requests minimum client version %1").arg(Version::toString(msg.version())));
+ Version::full_t requestedVersion = MumbleProto::getSuggestedVersion(msg);
+ if (requestedVersion <= Version::get()) {
+ requestedVersion = Version::UNKNOWN;
+ }
+ if (requestedVersion != Version::UNKNOWN) {
+ Global::get().l->log(
+ Log::Warning, tr("The server requests minimum client version %1").arg(Version::toString(requestedVersion)));
}
if (msg.has_positional() && (msg.positional() != Global::get().s.doPositionalAudio())) {
if (msg.positional())
diff --git a/src/mumble/NetworkConfig.cpp b/src/mumble/NetworkConfig.cpp
index 674caedb1..e3dfe4353 100644
--- a/src/mumble/NetworkConfig.cpp
+++ b/src/mumble/NetworkConfig.cpp
@@ -190,14 +190,11 @@ void Network::prepareRequest(QNetworkRequest &req) {
// Do not send OS information if the corresponding privacy setting is enabled
if (Global::get().s.bHideOS) {
req.setRawHeader(QString::fromLatin1("User-Agent").toUtf8(),
- QString::fromLatin1("Mozilla/5.0 Mumble/%1 %2")
- .arg(QLatin1String(MUMTEXT(MUMBLE_VERSION)), QLatin1String(MUMBLE_RELEASE))
- .toUtf8());
+ QString::fromLatin1("Mozilla/5.0 Mumble/%1").arg(Version::getRelease()).toUtf8());
} else {
req.setRawHeader(QString::fromLatin1("User-Agent").toUtf8(),
- QString::fromLatin1("Mozilla/5.0 (%1; %2) Mumble/%3 %4")
- .arg(OSInfo::getOS(), OSInfo::getOSVersion(), QLatin1String(MUMTEXT(MUMBLE_VERSION)),
- QLatin1String(MUMBLE_RELEASE))
+ QString::fromLatin1("Mozilla/5.0 (%1; %2) Mumble/%3")
+ .arg(OSInfo::getOS(), OSInfo::getOSVersion(), Version::getRelease())
.toUtf8());
}
}
diff --git a/src/mumble/Plugin.cpp b/src/mumble/Plugin.cpp
index 5c5b1cab1..cd8b2b396 100644
--- a/src/mumble/Plugin.cpp
+++ b/src/mumble/Plugin.cpp
@@ -312,8 +312,8 @@ mumble_error_t Plugin::init() {
// Step 1: Introduce ourselves (inform the plugin about Mumble's (API) version
// Get Mumble version
- int mumbleMajor, mumbleMinor, mumblePatch;
- Version::get(&mumbleMajor, &mumbleMinor, &mumblePatch);
+ Version::component_t mumbleMajor, mumbleMinor, mumblePatch;
+ Version::getComponents(mumbleMajor, mumbleMinor, mumblePatch);
// Require API version 1.0.0 as the minimal supported one
setMumbleInfo({ mumbleMajor, mumbleMinor, mumblePatch }, MUMBLE_PLUGIN_API_VERSION, { 1, 0, 0 });
diff --git a/src/mumble/ServerHandler.cpp b/src/mumble/ServerHandler.cpp
index 8fd5486c4..a77f2abfa 100644
--- a/src/mumble/ServerHandler.cpp
+++ b/src/mumble/ServerHandler.cpp
@@ -24,6 +24,7 @@
#include "NetworkConfig.h"
#include "OSInfo.h"
#include "PacketDataStream.h"
+#include "ProtoUtils.h"
#include "RichTextEditor.h"
#include "SSL.h"
#include "ServerResolver.h"
@@ -112,7 +113,7 @@ ServerHandler::ServerHandler() : database(new Database(QLatin1String("ServerHand
usPort = 0;
bUdp = true;
tConnectionTimeoutTimer = nullptr;
- uiVersion = 0;
+ uiVersion = Version::UNKNOWN;
iInFlightTCPPings = 0;
// assign connection ID
@@ -452,7 +453,7 @@ void ServerHandler::run() {
accUDP = accTCP = accClean;
- uiVersion = 0;
+ uiVersion = Version::UNKNOWN;
qsRelease = QString();
qsOS = QString();
qsOSVersion = QString();
@@ -771,12 +772,8 @@ void ServerHandler::serverConnectionConnected() {
}
MumbleProto::Version mpv;
- mpv.set_release(u8(QLatin1String(MUMBLE_RELEASE)));
-
- unsigned int version = Version::getRaw();
- if (version) {
- mpv.set_version(version);
- }
+ mpv.set_release(u8(Version::getRelease()));
+ MumbleProto::setVersion(mpv, Version::get());
if (!Global::get().s.bHideOS) {
mpv.set_os(u8(OSInfo::getOS()));
@@ -1032,7 +1029,7 @@ void ServerHandler::setUserComment(unsigned int uiSession, const QString &commen
void ServerHandler::setUserTexture(unsigned int uiSession, const QByteArray &qba) {
QByteArray texture;
- if ((uiVersion >= 0x010202) || qba.isEmpty()) {
+ if ((uiVersion >= Version::fromComponents(1, 2, 2)) || qba.isEmpty()) {
texture = qba;
} else {
QByteArray raw = qba;
diff --git a/src/mumble/ServerHandler.h b/src/mumble/ServerHandler.h
index 6790c09b3..869033624 100644
--- a/src/mumble/ServerHandler.h
+++ b/src/mumble/ServerHandler.h
@@ -36,6 +36,7 @@
#include "Mumble.pb.h"
#include "ServerAddress.h"
#include "Timer.h"
+#include "Version.h"
class Connection;
class Database;
@@ -106,7 +107,7 @@ public:
QHash< ServerAddress, QString > qhHostnames;
ServerAddress saTargetServer;
- unsigned int uiVersion;
+ Version::full_t uiVersion;
QString qsRelease;
QString qsOS;
QString qsOSVersion;
diff --git a/src/mumble/UserInformation.cpp b/src/mumble/UserInformation.cpp
index a8395e798..5eb9aa182 100644
--- a/src/mumble/UserInformation.cpp
+++ b/src/mumble/UserInformation.cpp
@@ -8,6 +8,7 @@
#include "Audio.h"
#include "CELTCodec.h"
#include "HostAddress.h"
+#include "ProtoUtils.h"
#include "QtUtils.h"
#include "ServerHandler.h"
#include "ViewCert.h"
@@ -128,9 +129,16 @@ void UserInformation::update(const MumbleProto::UserStats &msg) {
showcon = true;
const MumbleProto::Version &mpv = msg.version();
-
- qlVersion->setText(tr("%1 (%2)").arg(Version::toString(mpv.version())).arg(u8(mpv.release())));
+ Version::full_t version = MumbleProto::getVersion(mpv);
+ qlVersion->setText(tr("%1 (%2)").arg(Version::toString(version)).arg(u8(mpv.release())));
qlOS->setText(tr("%1 (%2)").arg(u8(mpv.os())).arg(u8(mpv.os_version())));
+
+ if (Version::getPatch(version) == 255) {
+ // The patch level 255 might indicate that the server is incapable of parsing
+ // the new version format (or the patch level is actually exactly 255).
+ // Show a warning to the user just in case.
+ qlVersionNote->show();
+ }
}
if (msg.celt_versions_size() > 0) {
QStringList qsl;
diff --git a/src/mumble/UserInformation.ui b/src/mumble/UserInformation.ui
index d08f4b8f7..dbb0d53b9 100644
--- a/src/mumble/UserInformation.ui
+++ b/src/mumble/UserInformation.ui
@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>379</width>
- <height>401</height>
+ <width>488</width>
+ <height>658</height>
</rect>
</property>
<property name="windowTitle">
@@ -20,17 +20,10 @@
<string>Connection Information</string>
</property>
<layout class="QGridLayout" name="gridLayout">
- <item row="0" column="0">
- <widget class="QLabel" name="qliVersion">
- <property name="text">
- <string>Version</string>
- </property>
- </widget>
- </item>
- <item row="0" column="1" colspan="2">
- <widget class="QLabel" name="qlVersion">
+ <item row="4" column="1">
+ <widget class="QLabel" name="qlCertificate">
<property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@@ -46,14 +39,14 @@
</property>
</widget>
</item>
- <item row="1" column="0">
+ <item row="2" column="0">
<widget class="QLabel" name="qliOS">
<property name="text">
<string>OS</string>
</property>
</widget>
</item>
- <item row="1" column="1" colspan="2">
+ <item row="2" column="1" colspan="2">
<widget class="QLabel" name="qlOS">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
@@ -72,17 +65,24 @@
</property>
</widget>
</item>
- <item row="3" column="0">
+ <item row="4" column="0">
<widget class="QLabel" name="qliCertificate">
<property name="text">
<string>Certificate</string>
</property>
</widget>
</item>
- <item row="3" column="1">
- <widget class="QLabel" name="qlCertificate">
+ <item row="0" column="0">
+ <widget class="QLabel" name="qliVersion">
+ <property name="text">
+ <string>Version</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="1" colspan="2">
+ <widget class="QLabel" name="qlCELT">
<property name="sizePolicy">
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
@@ -90,46 +90,34 @@
<property name="text">
<string/>
</property>
- <property name="textFormat">
- <enum>Qt::PlainText</enum>
- </property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
- <item row="4" column="0">
- <widget class="QLabel" name="qliAddress">
+ <item row="7" column="0">
+ <widget class="QLabel" name="qliOpus">
<property name="text">
- <string>IP Address</string>
+ <string notr="true">Opus</string>
</property>
</widget>
</item>
- <item row="4" column="1" colspan="2">
- <widget class="QLabel" name="qlAddress">
- <property name="sizePolicy">
- <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
- <horstretch>1</horstretch>
- <verstretch>0</verstretch>
- </sizepolicy>
- </property>
+ <item row="6" column="0">
+ <widget class="QLabel" name="qliCELT">
<property name="text">
- <string/>
- </property>
- <property name="textInteractionFlags">
- <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
+ <string>CELT Versions</string>
</property>
</widget>
</item>
- <item row="5" column="0">
- <widget class="QLabel" name="qliCELT">
+ <item row="7" column="1" colspan="2">
+ <widget class="QLabel" name="qlOpus">
<property name="text">
- <string>CELT Versions</string>
+ <string/>
</property>
</widget>
</item>
- <item row="5" column="1" colspan="2">
- <widget class="QLabel" name="qlCELT">
+ <item row="0" column="1" colspan="2">
+ <widget class="QLabel" name="qlVersion">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>1</horstretch>
@@ -139,12 +127,22 @@
<property name="text">
<string/>
</property>
+ <property name="textFormat">
+ <enum>Qt::PlainText</enum>
+ </property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
- <item row="3" column="2">
+ <item row="5" column="0">
+ <widget class="QLabel" name="qliAddress">
+ <property name="text">
+ <string>IP Address</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="2">
<widget class="QPushButton" name="qpbCertificate">
<property name="enabled">
<bool>false</bool>
@@ -166,17 +164,41 @@
</property>
</widget>
</item>
- <item row="6" column="0">
- <widget class="QLabel" name="qliOpus">
+ <item row="5" column="1" colspan="2">
+ <widget class="QLabel" name="qlAddress">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>1</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
<property name="text">
- <string notr="true">Opus</string>
+ <string/>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
- <item row="6" column="1" colspan="2">
- <widget class="QLabel" name="qlOpus">
+ <item row="1" column="0" colspan="3">
+ <widget class="QLabel" name="qlVersionNote">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="visible">
+ <bool>false</bool>
+ </property>
<property name="text">
- <string/>
+ <string>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ <property name="openExternalLinks">
+ <bool>true</bool>
</property>
</widget>
</item>
diff --git a/src/mumble/VersionCheck.cpp b/src/mumble/VersionCheck.cpp
index 123665e57..aca7333c1 100644
--- a/src/mumble/VersionCheck.cpp
+++ b/src/mumble/VersionCheck.cpp
@@ -33,7 +33,7 @@ VersionCheck::VersionCheck(bool autocheck, QObject *p, bool focus) : QObject(p),
QList< QPair< QString, QString > > queryItems;
queryItems << qMakePair(QString::fromLatin1("ver"),
- QString::fromLatin1(QUrl::toPercentEncoding(QLatin1String(MUMBLE_RELEASE))));
+ QString::fromLatin1(QUrl::toPercentEncoding(Version::getRelease())));
#if defined(Q_OS_WIN)
# if defined(Q_OS_WIN64)
queryItems << qMakePair(QString::fromLatin1("os"), QString::fromLatin1("WinX64"));
diff --git a/src/mumble/VoiceRecorder.cpp b/src/mumble/VoiceRecorder.cpp
index bba6bf34b..ffd686a20 100644
--- a/src/mumble/VoiceRecorder.cpp
+++ b/src/mumble/VoiceRecorder.cpp
@@ -280,7 +280,7 @@ bool VoiceRecorder::ensureFileIsOpenedFor(SF_INFO &soundFileInfo, boost::shared_
void VoiceRecorder::run() {
Q_ASSERT(!m_recording);
- if (Global::get().sh && Global::get().sh->uiVersion < 0x010203)
+ if (Global::get().sh && Global::get().sh->uiVersion < Version::fromComponents(1, 2, 3))
return;
SF_INFO soundFileInfo = createSoundFileInfo();
@@ -293,7 +293,8 @@ void VoiceRecorder::run() {
m_sleepLock.lock();
m_sleepCondition.wait(&m_sleepLock);
- if (!m_recording || m_abort || (Global::get().sh && Global::get().sh->uiVersion < 0x010203)) {
+ if (!m_recording || m_abort
+ || (Global::get().sh && Global::get().sh->uiVersion < Version::fromComponents(1, 2, 3))) {
m_sleepLock.unlock();
break;
}
diff --git a/src/mumble/VoiceRecorderDialog.cpp b/src/mumble/VoiceRecorderDialog.cpp
index bca3d5ee5..77039f68a 100644
--- a/src/mumble/VoiceRecorderDialog.cpp
+++ b/src/mumble/VoiceRecorderDialog.cpp
@@ -113,7 +113,7 @@ void VoiceRecorderDialog::on_qpbStart_clicked() {
return;
}
- if (Global::get().sh->uiVersion < 0x010203) {
+ if (Global::get().sh->uiVersion < Version::fromComponents(1, 2, 3)) {
QMessageBox::critical(this, tr("Recorder"),
tr("The server you are currently connected to is version 1.2.2 or older. "
"For privacy reasons, recording on servers of versions older than 1.2.3 "
diff --git a/src/mumble/mumble_ar.ts b/src/mumble/mumble_ar.ts
index 59eface2a..00f3c78ae 100644
--- a/src/mumble/mumble_ar.ts
+++ b/src/mumble/mumble_ar.ts
@@ -4603,10 +4603,6 @@ The setting only applies for new messages, the already shown ones will retain th
<translation type="unfinished"></translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation type="unfinished"></translation>
</message>
@@ -6271,6 +6267,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7524,6 +7524,10 @@ See &lt;a href=&quot;https://wiki.mumble.info/wiki/Installing_Mumble&quot;&gt;th
You can register them again.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8242,6 +8246,10 @@ An access token is a text string, which can be used as a password for very simpl
<source>Ping deviation</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_bg.ts b/src/mumble/mumble_bg.ts
index dc0b4cbb3..2ab66d5a1 100644
--- a/src/mumble/mumble_bg.ts
+++ b/src/mumble/mumble_bg.ts
@@ -4600,10 +4600,6 @@ The setting only applies for new messages, the already shown ones will retain th
<translation type="unfinished"></translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation>Свързване Ñ %1.</translation>
</message>
@@ -6268,6 +6264,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7521,6 +7521,10 @@ See &lt;a href=&quot;https://wiki.mumble.info/wiki/Installing_Mumble&quot;&gt;th
You can register them again.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8235,6 +8239,10 @@ An access token is a text string, which can be used as a password for very simpl
<source>Ping deviation</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_br.ts b/src/mumble/mumble_br.ts
index 574289fcd..573ba97bd 100644
--- a/src/mumble/mumble_br.ts
+++ b/src/mumble/mumble_br.ts
@@ -4599,10 +4599,6 @@ The setting only applies for new messages, the already shown ones will retain th
<translation type="unfinished"></translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation type="unfinished"></translation>
</message>
@@ -6267,6 +6263,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7520,6 +7520,10 @@ See &lt;a href=&quot;https://wiki.mumble.info/wiki/Installing_Mumble&quot;&gt;th
You can register them again.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8234,6 +8238,10 @@ An access token is a text string, which can be used as a password for very simpl
<source>Ping deviation</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_ca.ts b/src/mumble/mumble_ca.ts
index 2f0701113..8b97c5ade 100644
--- a/src/mumble/mumble_ca.ts
+++ b/src/mumble/mumble_ca.ts
@@ -4625,10 +4625,6 @@ The setting only applies for new messages, the already shown ones will retain th
<translation type="unfinished"></translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation type="unfinished"></translation>
</message>
@@ -6293,6 +6289,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7546,6 +7546,10 @@ See &lt;a href=&quot;https://wiki.mumble.info/wiki/Installing_Mumble&quot;&gt;th
You can register them again.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8260,6 +8264,10 @@ An access token is a text string, which can be used as a password for very simpl
<source>Ping deviation</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_cs.ts b/src/mumble/mumble_cs.ts
index 58b000d3e..3a5583470 100644
--- a/src/mumble/mumble_cs.ts
+++ b/src/mumble/mumble_cs.ts
@@ -4654,10 +4654,6 @@ The setting only applies for new messages, the already shown ones will retain th
<translation>Schéma URL není &apos;mumble&apos;</translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation>Tato verze Mumble neumí pracovat s URL pro verzi Mumble %1.%2.%3</translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation>Připojuji se k %1</translation>
</message>
@@ -6327,6 +6323,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished">Tato verze Mumble neumí pracovat s URL pro verzi Mumble %1</translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7584,6 +7584,10 @@ See &lt;a href=&quot;https://wiki.mumble.info/wiki/Installing_Mumble&quot;&gt;th
You can register them again.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8302,6 +8306,10 @@ Znak přístupu je textový řetězec, který může být použit jako heslo pro
<source>Ping deviation</source>
<translation>Odchylka odezvy</translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_cy.ts b/src/mumble/mumble_cy.ts
index 470809bd8..ee96612e8 100644
--- a/src/mumble/mumble_cy.ts
+++ b/src/mumble/mumble_cy.ts
@@ -4603,10 +4603,6 @@ The setting only applies for new messages, the already shown ones will retain th
<translation type="unfinished"></translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation type="unfinished">Cysylltu i %1</translation>
</message>
@@ -6271,6 +6267,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7524,6 +7524,10 @@ See &lt;a href=&quot;https://wiki.mumble.info/wiki/Installing_Mumble&quot;&gt;th
You can register them again.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8241,6 +8245,10 @@ An access token is a text string, which can be used as a password for very simpl
<source>Ping deviation</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_da.ts b/src/mumble/mumble_da.ts
index 529d48e12..0a052be9c 100644
--- a/src/mumble/mumble_da.ts
+++ b/src/mumble/mumble_da.ts
@@ -4652,10 +4652,6 @@ The setting only applies for new messages, the already shown ones will retain th
<translation>URL ordning er ikke &apos;mumble&apos;</translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation>Denne version af Mumble kan ikke håndtere URLs for Mumble version %1.%2.%3</translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation>Opretter forbindelse til %1</translation>
</message>
@@ -6323,6 +6319,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished">Denne version af Mumble kan ikke håndtere URLs for Mumble version %1</translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7580,6 +7580,10 @@ See &lt;a href=&quot;https://wiki.mumble.info/wiki/Installing_Mumble&quot;&gt;th
You can register them again.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8296,6 +8300,10 @@ Et adgangsudtryk er en tekststreng, der kan bruges som en adgangskode for meget
<source>Ping deviation</source>
<translation>Ping afvigelse</translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_de.ts b/src/mumble/mumble_de.ts
index 277bc9006..083bac5c8 100644
--- a/src/mumble/mumble_de.ts
+++ b/src/mumble/mumble_de.ts
@@ -4661,10 +4661,6 @@ Die Einstellung gilt nur für neue Nachrichten, die bereits angezeigten behalten
<translation>URL-Schema ist nicht &apos;mumble&apos;</translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation>Diese Version von Mumble kann keine URLs von Mumble Version %1.%2.%3 verarbeiten</translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation>Verbinde zu %1</translation>
</message>
@@ -6416,6 +6412,10 @@ Erlaubte Optionen sind:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation>Dies wird den Suchdialog öffnen oder schließen, je nachdem ob er bereits geöffnet ist</translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished">Diese Version von Mumble kann keine URLs von Mumble Version %1 verarbeiten</translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7677,6 +7677,10 @@ You can register them again.</source>
<translation>Leider konnte(n) %1 Tastenkürzel nicht migriert werden.
Sie können sie jedoch erneut registrieren.</translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8394,6 +8398,10 @@ Ein Zugriffscode ist eine Zeichenfolge, die als Passwort für ein sehr einfaches
<source>Ping deviation</source>
<translation>Ping Abweichung</translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_el.ts b/src/mumble/mumble_el.ts
index 3092b2c97..c564c2319 100644
--- a/src/mumble/mumble_el.ts
+++ b/src/mumble/mumble_el.ts
@@ -4661,10 +4661,6 @@ The setting only applies for new messages, the already shown ones will retain th
<translation>Το σχήμα διεÏθυνσης URL δεν είναι &apos;mumble&apos;</translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation>Αυτή η έκδοση του Mumble δεν μποÏεί να χειÏιστεί διευθÏνσεις URL για την έκδοση Mumble %1.%2.%3</translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation>Γίνεται σÏνδεση στο %1</translation>
</message>
@@ -6420,6 +6416,10 @@ mumble://[&lt;username&gt;[:&lt;password&gt;]@]&lt;host&gt;[:&lt;port&gt;][/&lt;
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation>Αυτό θα ανοίξει ή θα κλείσει το παÏάθυÏο διαλόγου αναζήτησης ανάλογα με το αν έχει ήδη ανοίξει ήδη</translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished">Αυτή η έκδοση του Mumble δεν μποÏεί να χειÏιστεί διευθÏνσεις URL για την έκδοση Mumble %1</translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7681,6 +7681,10 @@ You can register them again.</source>
<translation>Δυστυχώς, δεν ήταν δυνατή η μετεγκατάσταση %1 συντόμευσης.
ΜποÏείτε να τις καταχωÏήσετε ξανά.</translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8398,6 +8402,10 @@ An access token is a text string, which can be used as a password for very simpl
<source>Ping deviation</source>
<translation>Απόκλιση ping</translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_en.ts b/src/mumble/mumble_en.ts
index eba759641..df1c8c00f 100644
--- a/src/mumble/mumble_en.ts
+++ b/src/mumble/mumble_en.ts
@@ -4598,10 +4598,6 @@ The setting only applies for new messages, the already shown ones will retain th
<translation type="unfinished"></translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation type="unfinished"></translation>
</message>
@@ -6266,6 +6262,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7519,6 +7519,10 @@ See &lt;a href=&quot;https://wiki.mumble.info/wiki/Installing_Mumble&quot;&gt;th
You can register them again.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8232,6 +8236,10 @@ An access token is a text string, which can be used as a password for very simpl
<source>Ping deviation</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_en_GB.ts b/src/mumble/mumble_en_GB.ts
index b48ed38b5..33c30a78a 100644
--- a/src/mumble/mumble_en_GB.ts
+++ b/src/mumble/mumble_en_GB.ts
@@ -4635,10 +4635,6 @@ The setting only applies for new messages, the already shown ones will retain th
<translation type="unfinished"></translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation type="unfinished"></translation>
</message>
@@ -6303,6 +6299,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7556,6 +7556,10 @@ See &lt;a href=&quot;https://wiki.mumble.info/wiki/Installing_Mumble&quot;&gt;th
You can register them again.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8273,6 +8277,10 @@ An access token is a text string, which can be used as a password for very simpl
<source>Ping deviation</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_eo.ts b/src/mumble/mumble_eo.ts
index 0ba283b35..f9ceedb43 100644
--- a/src/mumble/mumble_eo.ts
+++ b/src/mumble/mumble_eo.ts
@@ -4610,10 +4610,6 @@ The setting only applies for new messages, the already shown ones will retain th
<translation type="unfinished"></translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation>Konektante al %1</translation>
</message>
@@ -6279,6 +6275,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7532,6 +7532,10 @@ See &lt;a href=&quot;https://wiki.mumble.info/wiki/Installing_Mumble&quot;&gt;th
You can register them again.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8246,6 +8250,10 @@ An access token is a text string, which can be used as a password for very simpl
<source>Ping deviation</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_es.ts b/src/mumble/mumble_es.ts
index 7c8bfeb98..487f198c6 100644
--- a/src/mumble/mumble_es.ts
+++ b/src/mumble/mumble_es.ts
@@ -4662,10 +4662,6 @@ La configuración solo se aplica a los mensajes nuevos, los que ya se muestran c
<translation>El esquema del URL no es &apos;mumble&apos;</translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation>Esta versión de Mumble no puede manejar URLs para la versión %1.%2.%3 de Mumble</translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation>Conectando a %1</translation>
</message>
@@ -6339,6 +6335,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation>Estro abrirá o cerrará el diálogo de búsqueda dependiendo de si ya está abierto o no</translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished">Esta versión de Mumble no puede manejar URLs para la versión %1 de Mumble</translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7600,6 +7600,10 @@ You can register them again.</source>
<translation>Desafortunadamente %1 atajo(s) no pudieron ser migrados.
Puedes registrarlos otra vez.</translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8317,6 +8321,10 @@ Una credencial de acceso es una cadena de texto que puede ser usada como contras
<source>Ping deviation</source>
<translation>Desviación del ping</translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_et.ts b/src/mumble/mumble_et.ts
index bc5fcd6f0..a2fc1a193 100644
--- a/src/mumble/mumble_et.ts
+++ b/src/mumble/mumble_et.ts
@@ -4600,10 +4600,6 @@ The setting only applies for new messages, the already shown ones will retain th
<translation type="unfinished"></translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation type="unfinished"></translation>
</message>
@@ -6268,6 +6264,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7521,6 +7521,10 @@ See &lt;a href=&quot;https://wiki.mumble.info/wiki/Installing_Mumble&quot;&gt;th
You can register them again.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8235,6 +8239,10 @@ An access token is a text string, which can be used as a password for very simpl
<source>Ping deviation</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_eu.ts b/src/mumble/mumble_eu.ts
index cd8aadbac..2f50cc9fa 100644
--- a/src/mumble/mumble_eu.ts
+++ b/src/mumble/mumble_eu.ts
@@ -4617,10 +4617,6 @@ The setting only applies for new messages, the already shown ones will retain th
<translation>URL eskema ez da &apos;mumble&apos;</translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation>%1-era konektatzen</translation>
</message>
@@ -6288,6 +6284,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7541,6 +7541,10 @@ See &lt;a href=&quot;https://wiki.mumble.info/wiki/Installing_Mumble&quot;&gt;th
You can register them again.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8255,6 +8259,10 @@ An access token is a text string, which can be used as a password for very simpl
<source>Ping deviation</source>
<translation>Ping desbideratzea</translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_fa_IR.ts b/src/mumble/mumble_fa_IR.ts
index 3940a5625..7a1f5bf5a 100644
--- a/src/mumble/mumble_fa_IR.ts
+++ b/src/mumble/mumble_fa_IR.ts
@@ -4598,10 +4598,6 @@ The setting only applies for new messages, the already shown ones will retain th
<translation type="unfinished"></translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation type="unfinished"></translation>
</message>
@@ -6266,6 +6262,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7519,6 +7519,10 @@ See &lt;a href=&quot;https://wiki.mumble.info/wiki/Installing_Mumble&quot;&gt;th
You can register them again.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8232,6 +8236,10 @@ An access token is a text string, which can be used as a password for very simpl
<source>Ping deviation</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_fi.ts b/src/mumble/mumble_fi.ts
index a8a6121b5..2a1b356ce 100644
--- a/src/mumble/mumble_fi.ts
+++ b/src/mumble/mumble_fi.ts
@@ -4661,10 +4661,6 @@ Tämä vaikuttaa vain uusiin viesteihin, vanhojen viestien aikaleima ei muutu.</
<translation>URL-osoitteen asettelu ei ole Mumblen mukainen</translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation>Mumblen tämä versio ei pysty käsittelemään URL-osoitteita Mumblen versiosta %1.%2.%3</translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation>Yhdistetään %1</translation>
</message>
@@ -6360,6 +6356,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation>Tämä avaa haku-ikkunan tai sulkee sen jos se on jo auki</translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished">Mumblen tämä versio ei pysty käsittelemään URL-osoitteita Mumblen versiosta %1</translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7621,6 +7621,10 @@ You can register them again.</source>
<translation>Valitettavasti %1 pikanäppäin(tä) ei voitu rekisteröidä.
Voit rekisteröidä ne uudelleen.</translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8338,6 +8342,10 @@ Pääsypoletti on merkkijonoketju, jota voidaan käyttää salasanana yksinkerta
<source>Ping deviation</source>
<translation>Vasteajan poikkeama</translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_fr.ts b/src/mumble/mumble_fr.ts
index ef4c3faf1..86342057d 100644
--- a/src/mumble/mumble_fr.ts
+++ b/src/mumble/mumble_fr.ts
@@ -4661,10 +4661,6 @@ Le paramètre ne s&apos;applique qu&apos;aux nouveaux messages, ceux déjà affi
<translation>Le schéma d&apos;URL n&apos;est pas &apos;mumble&apos;</translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation>Cette version de Mumble ne peut pas manipuler les URLs pour Mumble version %1.%2.%3</translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation>Connexion à %1</translation>
</message>
@@ -6361,6 +6357,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation>Cela ouvrira ou fermera la boîte de dialogue de recherche selon qu&apos;elle est déjà ouverte ou non</translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished">Cette version de Mumble ne peut pas manipuler les URLs pour Mumble version %1</translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7622,6 +7622,10 @@ You can register them again.</source>
<translation>Malheureusement %1 raccourci(s) n&apos;ont pu être migrés.
Vous pouvez les enregistrer à nouveau.</translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8339,6 +8343,10 @@ Un jeton d&apos;accès est une chaîne de caractères qui peut être utilisée c
<source>Ping deviation</source>
<translation>Déviation du ping</translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_gl.ts b/src/mumble/mumble_gl.ts
index 24846412a..13efff0fa 100644
--- a/src/mumble/mumble_gl.ts
+++ b/src/mumble/mumble_gl.ts
@@ -4601,10 +4601,6 @@ The setting only applies for new messages, the already shown ones will retain th
<translation type="unfinished"></translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation type="unfinished"></translation>
</message>
@@ -6269,6 +6265,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7522,6 +7522,10 @@ See &lt;a href=&quot;https://wiki.mumble.info/wiki/Installing_Mumble&quot;&gt;th
You can register them again.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8236,6 +8240,10 @@ An access token is a text string, which can be used as a password for very simpl
<source>Ping deviation</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_he.ts b/src/mumble/mumble_he.ts
index fd419dd43..6aa2e56fd 100644
--- a/src/mumble/mumble_he.ts
+++ b/src/mumble/mumble_he.ts
@@ -4649,10 +4649,6 @@ The setting only applies for new messages, the already shown ones will retain th
<translation>&lt;p dir=&quot;RTL&quot;&gt;צורת הכתובת ×”×™× ×œ× &apos;mumble&apos;&lt;/p&gt;</translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation>×’×™×¨×¡× ×–×• של Mumble ×œ× ×™×›×•×œ×” לטפל בכתובות עבור Mumble ×’×™×¨×¡× %1.%2.%3</translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation>מתחבר כעת ×ל %1</translation>
</message>
@@ -6319,6 +6315,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished">×’×™×¨×¡× ×–×• של Mumble ×œ× ×™×›×•×œ×” לטפל בכתובות עבור Mumble ×’×™×¨×¡× %1</translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7576,6 +7576,10 @@ See &lt;a href=&quot;https://wiki.mumble.info/wiki/Installing_Mumble&quot;&gt;th
You can register them again.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8293,6 +8297,10 @@ An access token is a text string, which can be used as a password for very simpl
<source>Ping deviation</source>
<translation>סטיית פינג</translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_hu.ts b/src/mumble/mumble_hu.ts
index 3d48e8418..97a42e7da 100644
--- a/src/mumble/mumble_hu.ts
+++ b/src/mumble/mumble_hu.ts
@@ -4647,10 +4647,6 @@ The setting only applies for new messages, the already shown ones will retain th
<translation>A webcím protokollja nem &apos;mumble&apos;</translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation>A Mumble jelen verziója nem képes kezelni a %1.%2.%3 verziójú Mumble címeket</translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation>Kapcsolódás: %1</translation>
</message>
@@ -6319,6 +6315,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished">A Mumble jelen verziója nem képes kezelni a %1 verziójú Mumble címeket</translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7573,6 +7573,10 @@ See &lt;a href=&quot;https://wiki.mumble.info/wiki/Installing_Mumble&quot;&gt;th
You can register them again.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8289,6 +8293,10 @@ A kulcs egy szöveges karaktersorozat, amely jelszóként használható a csator
<source>Ping deviation</source>
<translation>Eltérés</translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_it.ts b/src/mumble/mumble_it.ts
index 5c114e603..c8e3285d5 100644
--- a/src/mumble/mumble_it.ts
+++ b/src/mumble/mumble_it.ts
@@ -4661,10 +4661,6 @@ Questa impostazione si applica solo ai nuovi messaggi, quelli già mostrati mant
<translation>Lo schema dell&apos;URL non è &apos;mumble&apos;</translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation>Questa versione di Mumble non può utilizzare gli URL di Mumble versione %1.%2.%3</translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation>Connessione a %1</translation>
</message>
@@ -6420,6 +6416,10 @@ Le opzioni valide sono:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation>Questo aprirà o chiuderà il menù di ricerca a seconda dello stato attuale</translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished">Questa versione di Mumble non può utilizzare gli URL di Mumble versione %1</translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7681,6 +7681,10 @@ You can register them again.</source>
<translation>Sfortunatamente la shortcut %1 non può essere migrata.
Puoi registrarle di nuovo.</translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8398,6 +8402,10 @@ Un token di accesso è una stringa di testo, che può essere usata come password
<source>Ping deviation</source>
<translation>Deviazione ping</translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_ja.ts b/src/mumble/mumble_ja.ts
index a937654f1..2ce19a25a 100644
--- a/src/mumble/mumble_ja.ts
+++ b/src/mumble/mumble_ja.ts
@@ -4648,10 +4648,6 @@ The setting only applies for new messages, the already shown ones will retain th
<translation>URLスキーム㯠&apos;mumble&apos; ã§ã¯ã‚ã‚Šã¾ã›ã‚“</translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation>ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®Mumble 㯠Mumble %1.%2.%3 ã®ãŸã‚ã® URL を扱ãˆã¾ã›ã‚“</translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation>%1 ã«æŽ¥ç¶šã—ã¦ã„ã¾ã™</translation>
</message>
@@ -6317,6 +6313,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished">ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®Mumble 㯠Mumble %1 ã®ãŸã‚ã® URL を扱ãˆã¾ã›ã‚“</translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7574,6 +7574,10 @@ See &lt;a href=&quot;https://wiki.mumble.info/wiki/Installing_Mumble&quot;&gt;th
You can register them again.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8289,6 +8293,10 @@ An access token is a text string, which can be used as a password for very simpl
<source>Ping deviation</source>
<translation>Pingã®ã°ã‚‰ã¤ã</translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_ko.ts b/src/mumble/mumble_ko.ts
index 0c38fc62a..c98f7cfab 100644
--- a/src/mumble/mumble_ko.ts
+++ b/src/mumble/mumble_ko.ts
@@ -4660,10 +4660,6 @@ The setting only applies for new messages, the already shown ones will retain th
<translation>URL ìŠ¤í‚´ì´ &apos;mumble&apos;ì´ ì•„ë‹˜</translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation>ì´ ë²„ì „ì˜ Mumbleì€ Mumble 버전 %1.%2.%3 URLì„ ì²˜ë¦¬í•  수 ì—†ìŒ</translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation>%1ì— ì—°ê²° 중</translation>
</message>
@@ -6419,6 +6415,10 @@ mumble://[&lt;유저ì´ë¦„&gt;[:&lt;비밀번호&gt;]@]&lt;호스트&gt;[:&lt;í
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation>현재 ì—´ë ¤ ìžˆëŠ”ì§€ì— ë”°ë¼ ê²€ìƒ‰ 대화 ìƒìžë¥¼ 열거나 닫습니다</translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished">ì´ ë²„ì „ì˜ Mumbleì€ Mumble 버전 %1 URLì„ ì²˜ë¦¬í•  수 ì—†ìŒ</translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7680,6 +7680,10 @@ You can register them again.</source>
<translation>유ê°ìŠ¤ëŸ½ê²Œë„ %1 단축키(들)ê°€ ì´ë™ë˜ì§€ 않았습니다.
다시 등ë¡í•  수 있습니다.</translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8396,6 +8400,10 @@ An access token is a text string, which can be used as a password for very simpl
<source>Ping deviation</source>
<translation>핑 편차</translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_lt.ts b/src/mumble/mumble_lt.ts
index 7f5ab9083..78a07ad93 100644
--- a/src/mumble/mumble_lt.ts
+++ b/src/mumble/mumble_lt.ts
@@ -4631,10 +4631,6 @@ The setting only applies for new messages, the already shown ones will retain th
<translation>URL schema nÄ—ra &apos;mumble&apos;</translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation>Å i Mumble versija negali apdoroti URL, skirtus Mumble versijai %1.%2.%3</translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation>Jungiamasi prie %1</translation>
</message>
@@ -6360,6 +6356,10 @@ Galioja Å¡ios parinktys:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished">Å i Mumble versija negali apdoroti URL, skirtus Mumble versijai %1</translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7617,6 +7617,10 @@ See &lt;a href=&quot;https://wiki.mumble.info/wiki/Installing_Mumble&quot;&gt;th
You can register them again.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8335,6 +8339,10 @@ Prieigos raktas yra tekstinė eilutė, kuri gali būti naudojama kaip slaptažod
<source>Ping deviation</source>
<translation>Ping nuokrypis</translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_nl.ts b/src/mumble/mumble_nl.ts
index 554f51726..b3a4423d8 100644
--- a/src/mumble/mumble_nl.ts
+++ b/src/mumble/mumble_nl.ts
@@ -4661,10 +4661,6 @@ Deze instelling geldt voor nieuwe berichten, vermits getoonden conformeren aan h
<translation>URL-schema is niet &apos;mumble&apos;</translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation>Mumble-versie kan URL&apos;s voor Mumble versie %1.%2.%3 niet aan</translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation>Bezig met verbinden met %1</translation>
</message>
@@ -6420,6 +6416,10 @@ Geldige opties zijn:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation>Dit zal het zoekvenster openen of verbergen, afhankelijk van of het reeds geopend is</translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished">Mumble-versie kan URL&apos;s voor Mumble versie %1 niet aan</translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7681,6 +7681,10 @@ You can register them again.</source>
<translation>Helaas kon(den) %1 sneltoets(en) niet gemigreerd worden.
Je kunt ze opnieuw registreren.</translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8398,6 +8402,10 @@ Een toegangssleutel is een tekenreeks die gebruikt kan worden als wachtwoord om
<source>Ping deviation</source>
<translation>Pingafwijking</translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_no.ts b/src/mumble/mumble_no.ts
index 44760bc67..a72a54d3b 100644
--- a/src/mumble/mumble_no.ts
+++ b/src/mumble/mumble_no.ts
@@ -4676,10 +4676,6 @@ Har kun innvirkning for nye meldinger. Gamle meldinger vises i foregående tidsf
<translation>URL-forordningen er ikke &apos;mumble&apos;</translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation>Denne versjonen av Mumble kan ikke håndtere URL-er for Mumble versjon %1.%2.%3</translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation>Kobler til %1</translation>
</message>
@@ -6376,6 +6372,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation>Åpner eller lukker søkedialogen avhengig av om den nylig har blitt åpnet</translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished">Denne versjonen av Mumble kan ikke håndtere URL-er for Mumble versjon %1</translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7637,6 +7637,10 @@ You can register them again.</source>
<translation>%1 snarvei(er) kunne ikke flyttes.
Du kan registrere dem igjen.</translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8355,6 +8359,10 @@ Et tilgangssymbol er en tekststring, som kan brukes som et passord for veldig en
<source>Ping deviation</source>
<translation>Svartidsavvik</translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_oc.ts b/src/mumble/mumble_oc.ts
index 9e337cfba..b7dd1b0ef 100644
--- a/src/mumble/mumble_oc.ts
+++ b/src/mumble/mumble_oc.ts
@@ -4600,10 +4600,6 @@ The setting only applies for new messages, the already shown ones will retain th
<translation type="unfinished"></translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation>Connectat a %1</translation>
</message>
@@ -6268,6 +6264,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7521,6 +7521,10 @@ See &lt;a href=&quot;https://wiki.mumble.info/wiki/Installing_Mumble&quot;&gt;th
You can register them again.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8235,6 +8239,10 @@ An access token is a text string, which can be used as a password for very simpl
<source>Ping deviation</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_pl.ts b/src/mumble/mumble_pl.ts
index 16b0e78b6..f555d4c4e 100644
--- a/src/mumble/mumble_pl.ts
+++ b/src/mumble/mumble_pl.ts
@@ -4662,10 +4662,6 @@ Ustawienie dotyczy tylko nowych wiadomości, te już pokazane zachowają poprzed
<translation>Adres URL nie jest obsługiwany przez Mumble (brak mumble:// w adresie)</translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation>Ta wersja Mumble nie obsługuje adresów URL starszych wersji Mumble %1.%2.%3</translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation>ÅÄ…czenie z %1</translation>
</message>
@@ -6421,6 +6417,10 @@ Prawidłowe opcje to:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation>Spowoduje to otwarcie lub zamknięcie okna wyszukiwania w zależności od tego, czy jest już otwarte</translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished">Ta wersja Mumble nie obsługuje adresów URL starszych wersji Mumble %1</translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7682,6 +7682,10 @@ You can register them again.</source>
<translation>Niestety nie można zmigrować %1 skrótu(-ów).
Możesz je ponownie zarejestrować.</translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8400,6 +8404,10 @@ Token dostępu to ciąg tekstowy, który może służyć jako hasło do bardzo p
<source>Ping deviation</source>
<translation>Odchylenie</translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_pt_BR.ts b/src/mumble/mumble_pt_BR.ts
index 530813871..2bb3b4875 100644
--- a/src/mumble/mumble_pt_BR.ts
+++ b/src/mumble/mumble_pt_BR.ts
@@ -4661,10 +4661,6 @@ Essa configuração só se aplica para novas mensagens. As mensagens já exibida
<translation>Forma de URL não é &apos;mumble&apos;</translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation>Esta versão do Mumble não pode lidar com URLs para o Mumble versão %1.%2.%3</translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation>Conectando a %1</translation>
</message>
@@ -6361,6 +6357,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished">Esta versão do Mumble não pode lidar com URLs para o Mumble versão %1</translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7621,6 +7621,10 @@ Consulte a &lt;a href=&quot;https://wiki.mumble.info/wiki/Installing_Mumble&quot
You can register them again.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8338,6 +8342,10 @@ Uma credencial de acesso é uma cadeia de caracteres de texto, que podem ser usa
<source>Ping deviation</source>
<translation>Variação de ping</translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_pt_PT.ts b/src/mumble/mumble_pt_PT.ts
index 5291c7c74..550a2a900 100644
--- a/src/mumble/mumble_pt_PT.ts
+++ b/src/mumble/mumble_pt_PT.ts
@@ -4661,10 +4661,6 @@ Essa configuração só se aplica para novas mensagens. As mensagens já exibida
<translation>Forma de URL não é &apos;mumble&apos;</translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation>Esta versão do Mumble não consegue lidar com URLs para o Mumble versão %1.%2.%3</translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation>A ligar a %1</translation>
</message>
@@ -6339,6 +6335,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished">Esta versão do Mumble não consegue lidar com URLs para o Mumble versão %1</translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7599,6 +7599,10 @@ Consulte a &lt;a href=&quot;https://wiki.mumble.info/wiki/Installing_Mumble&quot
You can register them again.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8316,6 +8320,10 @@ Uma credencial de acesso é uma sequência de texto, que pode ser usada como uma
<source>Ping deviation</source>
<translation>Variação de ping</translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_ro.ts b/src/mumble/mumble_ro.ts
index d31f6aed5..c26f211c0 100644
--- a/src/mumble/mumble_ro.ts
+++ b/src/mumble/mumble_ro.ts
@@ -4604,10 +4604,6 @@ The setting only applies for new messages, the already shown ones will retain th
<translation type="unfinished"></translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation type="unfinished"></translation>
</message>
@@ -6272,6 +6268,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7525,6 +7525,10 @@ See &lt;a href=&quot;https://wiki.mumble.info/wiki/Installing_Mumble&quot;&gt;th
You can register them again.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8240,6 +8244,10 @@ An access token is a text string, which can be used as a password for very simpl
<source>Ping deviation</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_ru.ts b/src/mumble/mumble_ru.ts
index ce2900936..a42c8aca6 100644
--- a/src/mumble/mumble_ru.ts
+++ b/src/mumble/mumble_ru.ts
@@ -4662,10 +4662,6 @@ The setting only applies for new messages, the already shown ones will retain th
<translation>Схема ÑÑылки не &apos;mumble&apos;</translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation>Эта верÑÐ¸Ñ Mumble не может иÑпользовать ÑÑылки из Mumble верÑий %1.%2.%3</translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation>Подключение к %1</translation>
</message>
@@ -6421,6 +6417,10 @@ mumble://[&lt;Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ&gt;[:&lt;пароль&gt;]@]&lt;Ñ…
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation>Это откроет или закроет диалог поиÑка в завиÑимоÑти от того, открыт ли он в данный момент</translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished">Эта верÑÐ¸Ñ Mumble не может иÑпользовать ÑÑылки из Mumble верÑий %1</translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7682,6 +7682,10 @@ You can register them again.</source>
<translation>К Ñожалению, %1 Ñрлык(ов) не удалоÑÑŒ перенеÑти.
Ð’Ñ‹ можете зарегиÑтрировать их Ñнова.</translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8400,6 +8404,10 @@ An access token is a text string, which can be used as a password for very simpl
<source>Ping deviation</source>
<translation>Отклонение</translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_si.ts b/src/mumble/mumble_si.ts
index 22944c719..189a889d8 100644
--- a/src/mumble/mumble_si.ts
+++ b/src/mumble/mumble_si.ts
@@ -5465,10 +5465,6 @@ Valid actions are:
<translation type="unfinished"></translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation type="unfinished"></translation>
</message>
@@ -6230,6 +6226,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7479,6 +7479,10 @@ See &lt;a href=&quot;https://wiki.mumble.info/wiki/Installing_Mumble&quot;&gt;th
You can register them again.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8191,6 +8195,10 @@ An access token is a text string, which can be used as a password for very simpl
<source>%1 kbit/s</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_sq.ts b/src/mumble/mumble_sq.ts
index d6430a78e..202a656e1 100644
--- a/src/mumble/mumble_sq.ts
+++ b/src/mumble/mumble_sq.ts
@@ -5557,10 +5557,6 @@ Valid actions are:
<translation type="unfinished"></translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation type="unfinished"></translation>
</message>
@@ -6232,6 +6228,10 @@ Otherwise abort and check your certificate and username.</source>
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7481,6 +7481,10 @@ See &lt;a href=&quot;https://wiki.mumble.info/wiki/Installing_Mumble&quot;&gt;th
You can register them again.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8193,6 +8197,10 @@ An access token is a text string, which can be used as a password for very simpl
<source>%1 kbit/s</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_sv.ts b/src/mumble/mumble_sv.ts
index 8fe262bb0..53cd1f326 100644
--- a/src/mumble/mumble_sv.ts
+++ b/src/mumble/mumble_sv.ts
@@ -4661,10 +4661,6 @@ Inställningen gäller endast för nya meddelanden, de redan visade meddelandena
<translation>URL schemat kan inte användas av Mumble</translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation>Den här versionen av Mumble kan inte hantera URLer för Mumble version %1.%2.%3</translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation>Ansluter till %1</translation>
</message>
@@ -6361,6 +6357,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation>Det här kommer att öppna eller stänga sök-rutan beroende på om den redan är öppnad för tillfället</translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished">Den här versionen av Mumble kan inte hantera URLer för Mumble version %1</translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7621,6 +7621,10 @@ Se &lt;a href=&quot;https://wiki.mumble.info/wiki/Installing_Mumble&quot;&gt;Mum
You can register them again.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8338,6 +8342,10 @@ En token är en textsträng, som kan användas som ett lösenord för enkel till
<source>Ping deviation</source>
<translation>Pingavvikelser</translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_te.ts b/src/mumble/mumble_te.ts
index afceb9641..133ae75d7 100644
--- a/src/mumble/mumble_te.ts
+++ b/src/mumble/mumble_te.ts
@@ -4611,10 +4611,6 @@ The setting only applies for new messages, the already shown ones will retain th
<translation type="unfinished"></translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation type="unfinished"></translation>
</message>
@@ -6279,6 +6275,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7538,6 +7538,10 @@ See &lt;a href=&quot;https://wiki.mumble.info/wiki/Installing_Mumble&quot;&gt;th
You can register them again.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8252,6 +8256,10 @@ An access token is a text string, which can be used as a password for very simpl
<source>Ping deviation</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_th.ts b/src/mumble/mumble_th.ts
index e7d3219fd..ceef5a41c 100644
--- a/src/mumble/mumble_th.ts
+++ b/src/mumble/mumble_th.ts
@@ -4598,10 +4598,6 @@ The setting only applies for new messages, the already shown ones will retain th
<translation type="unfinished"></translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation type="unfinished"></translation>
</message>
@@ -6266,6 +6262,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7519,6 +7519,10 @@ See &lt;a href=&quot;https://wiki.mumble.info/wiki/Installing_Mumble&quot;&gt;th
You can register them again.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8232,6 +8236,10 @@ An access token is a text string, which can be used as a password for very simpl
<source>Ping deviation</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_tr.ts b/src/mumble/mumble_tr.ts
index cc81653fc..ca47b5cb4 100644
--- a/src/mumble/mumble_tr.ts
+++ b/src/mumble/mumble_tr.ts
@@ -4660,10 +4660,6 @@ Bu ayar sadece yeni mesajlara uygulanır, zaten görüntülenmiş olanlar öncek
<translation>URL düzeni &apos;mumble&apos; değil</translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation>Mumble&apos;ın bu sürümü %1.%2.%3 sayılı sürümün URL&apos;lerini işleyemez</translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation>%1 adresine bağlanılıyor</translation>
</message>
@@ -6419,6 +6415,10 @@ Geçerli seçenekler şunlardır:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation>Bu, o anda açık olup olmamasına bağlı olarak arama iletişim kutusunu açacak veya kapatacaktır</translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished">Mumble&apos;ın bu sürümü %1 sayılı sürümün URL&apos;lerini işleyemez</translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7680,6 +7680,10 @@ You can register them again.</source>
<translation>Ne yazık ki %1 kısayol geçirilemedi.
Bunları tekrar kaydedebilirsiniz.</translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8396,6 +8400,10 @@ Erişim jetonu bir metindir ve kanallara erişimin çok basit bir şekilde yöne
<source>Ping deviation</source>
<translation>Ping sapması</translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_uk.ts b/src/mumble/mumble_uk.ts
index 7ffa5eaa6..31b0f230f 100644
--- a/src/mumble/mumble_uk.ts
+++ b/src/mumble/mumble_uk.ts
@@ -4600,10 +4600,6 @@ The setting only applies for new messages, the already shown ones will retain th
<translation type="unfinished"></translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation type="unfinished"></translation>
</message>
@@ -6268,6 +6264,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7521,6 +7521,10 @@ See &lt;a href=&quot;https://wiki.mumble.info/wiki/Installing_Mumble&quot;&gt;th
You can register them again.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8236,6 +8240,10 @@ An access token is a text string, which can be used as a password for very simpl
<source>Ping deviation</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_zh_CN.ts b/src/mumble/mumble_zh_CN.ts
index 8ce93a2cc..b391657ec 100644
--- a/src/mumble/mumble_zh_CN.ts
+++ b/src/mumble/mumble_zh_CN.ts
@@ -4660,10 +4660,6 @@ The setting only applies for new messages, the already shown ones will retain th
<translation>URL åè®®ä¸æ˜¯â€œmumbleâ€</translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation>当å‰ç‰ˆæœ¬çš„ Mumble 无法处ç†ç”¨äºŽ Mumble %1.%2.%3 çš„ URL</translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation>正在连接 %1</translation>
</message>
@@ -6419,6 +6415,10 @@ mumble://[&lt;用户å&gt;[:&lt;密ç &gt;]@]&lt;主机å&gt;[:&lt;端å£&gt;]
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation>æ ¹æ®å½“å‰çš„å¼€å¯çŠ¶æ€æ‰“开或关闭æœç´¢å¯¹è¯æ¡†</translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished">当å‰ç‰ˆæœ¬çš„ Mumble 无法处ç†ç”¨äºŽ Mumble %1 çš„ URL</translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7680,6 +7680,10 @@ You can register them again.</source>
<translation>很ä¸å¹¸ï¼Œæ— æ³•è¿ç§» %1 个快æ·é”®ã€‚
您å¯ä»¥é‡æ–°è®¾ç½®å®ƒä»¬ã€‚</translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8396,6 +8400,10 @@ An access token is a text string, which can be used as a password for very simpl
<source>Ping deviation</source>
<translation>误差</translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_zh_HK.ts b/src/mumble/mumble_zh_HK.ts
index 50103aa95..6e9a729ff 100644
--- a/src/mumble/mumble_zh_HK.ts
+++ b/src/mumble/mumble_zh_HK.ts
@@ -4598,10 +4598,6 @@ The setting only applies for new messages, the already shown ones will retain th
<translation>“Mumble†ä¸æ”¯æ´çš„網å€</translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation>ç›®å‰çš„ Mumble 無法處ç†ç‰ˆæœ¬ %1.%2.%3 產生的網å€</translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation>正在連線到 %1</translation>
</message>
@@ -6271,6 +6267,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished">ç›®å‰çš„ Mumble 無法處ç†ç‰ˆæœ¬ %1 產生的網å€</translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7528,6 +7528,10 @@ See &lt;a href=&quot;https://wiki.mumble.info/wiki/Installing_Mumble&quot;&gt;th
You can register them again.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8243,6 +8247,10 @@ An access token is a text string, which can be used as a password for very simpl
<source>Ping deviation</source>
<translation>Ping 誤差</translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/mumble_zh_TW.ts b/src/mumble/mumble_zh_TW.ts
index 2b8657d1d..047177fbd 100644
--- a/src/mumble/mumble_zh_TW.ts
+++ b/src/mumble/mumble_zh_TW.ts
@@ -4626,10 +4626,6 @@ The setting only applies for new messages, the already shown ones will retain th
<translation>&apos;Mumble&apos; ä¸æ”¯æ´çš„網å€</translation>
</message>
<message>
- <source>This version of Mumble can&apos;t handle URLs for Mumble version %1.%2.%3</source>
- <translation>ç›®å‰çš„ Mumble 無法處ç†ç‰ˆæœ¬ %1.%2.%3 產生的網å€</translation>
- </message>
- <message>
<source>Connecting to %1</source>
<translation>正在連接 %1</translation>
</message>
@@ -6294,6 +6290,10 @@ Valid options are:
<source>This will open or close the search dialog depending on whether it is currently opened already</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>This version of Mumble can&apos;t handle URLs for Mumble version %1</source>
+ <translation type="unfinished">ç›®å‰çš„ Mumble 無法處ç†ç‰ˆæœ¬ %1 產生的網å€</translation>
+ </message>
</context>
<context>
<name>Manual</name>
@@ -7550,6 +7550,10 @@ See &lt;a href=&quot;https://wiki.mumble.info/wiki/Installing_Mumble&quot;&gt;th
You can register them again.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Unknown Version</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>RichTextEditor</name>
@@ -8263,6 +8267,10 @@ An access token is a text string, which can be used as a password for very simpl
<source>Ping deviation</source>
<translation>Ping 誤差</translation>
</message>
+ <message>
+ <source>Warning: The server seems to report a truncated protocol version for this client. (See: &lt;a href=&quot;https://github.com/mumble-voip/mumble/issues/5827/&quot;&gt;Issue #5827&lt;/a&gt;)</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>UserListModel</name>
diff --git a/src/mumble/os_win.cpp b/src/mumble/os_win.cpp
index 0e5ac74de..6911eacd7 100644
--- a/src/mumble/os_win.cpp
+++ b/src/mumble/os_win.cpp
@@ -278,8 +278,7 @@ void os_init() {
}
}
- QString comment = QString::fromLatin1("%1\n%2\n%3")
- .arg(QString::fromLatin1(MUMBLE_RELEASE), QString::fromLatin1(MUMTEXT(MUMBLE_VERSION)), hash);
+ QString comment = QString::fromLatin1("%1\n%2").arg(Version::getRelease(), hash);
wcscpy_s(wcComment, DUMP_BUFFER_SIZE, comment.toStdWString().c_str());
musComment.Type = CommentStreamW;
diff --git a/src/murmur/About.cpp b/src/murmur/About.cpp
index 8e0a07b63..88f17d622 100644
--- a/src/murmur/About.cpp
+++ b/src/murmur/About.cpp
@@ -56,7 +56,7 @@ AboutDialog::AboutDialog(QWidget *p, AboutDialogOptions options) : QDialog(p) {
text->setText(tr("<h3>Murmur (%1)</h3>"
"<p>%3</p>"
"<p><tt><a href=\"%2\">%2</a></tt></p>")
- .arg(QLatin1String(MUMBLE_RELEASE))
+ .arg(Version::getRelease())
.arg(QLatin1String("http://www.mumble.info/"))
.arg(QLatin1String("Copyright 2005-2020 The Mumble Developers")));
QHBoxLayout *qhbl = new QHBoxLayout(about);
diff --git a/src/murmur/DBus.cpp b/src/murmur/DBus.cpp
index 7b70de3e0..56dec1bbe 100644
--- a/src/murmur/DBus.cpp
+++ b/src/murmur/DBus.cpp
@@ -938,7 +938,8 @@ void MetaDBus::quit() {
QCoreApplication::instance()->quit();
}
-void MetaDBus::getVersion(int &major, int &minor, int &patch, QString &text) {
+void MetaDBus::getVersion(Version::component_t &major, Version::component_t &minor, Version::component_t &patch,
+ QString &text) {
Meta::getVersion(major, minor, patch, text);
}
diff --git a/src/murmur/DBus.h b/src/murmur/DBus.h
index aa6147fc5..03c43ce0f 100644
--- a/src/murmur/DBus.h
+++ b/src/murmur/DBus.h
@@ -231,7 +231,8 @@ public slots:
void setConf(int server_id, const QString &key, const QString &value, const QDBusMessage &);
void setSuperUserPassword(int server_id, const QString &pw, const QDBusMessage &);
void getLog(int server_id, int min_offset, int max_offset, const QDBusMessage &, QList< LogEntry > &entries);
- void getVersion(int &major, int &minor, int &patch, QString &string);
+ void getVersion(Version::component_t &major, Version::component_t &minor, Version::component_t &patch,
+ QString &string);
void quit();
signals:
void started(int server_id);
diff --git a/src/murmur/Messages.cpp b/src/murmur/Messages.cpp
index ca47f52a2..1fb33db3f 100644
--- a/src/murmur/Messages.cpp
+++ b/src/murmur/Messages.cpp
@@ -10,6 +10,7 @@
#include "Message.h"
#include "Meta.h"
#include "MumbleConstants.h"
+#include "ProtoUtils.h"
#include "Server.h"
#include "ServerDB.h"
#include "ServerUser.h"
@@ -354,7 +355,7 @@ void Server::msgAuthenticate(ServerUser *uSource, MumbleProto::Authenticate &msg
mpcs.set_position(c->iPosition);
- if ((uSource->uiVersion >= 0x010202) && !c->qbaDescHash.isEmpty())
+ if ((uSource->uiVersion >= Version::fromComponents(1, 2, 2)) && !c->qbaDescHash.isEmpty())
mpcs.set_description_hash(blob(c->qbaDescHash));
else if (!c->qsDesc.isEmpty())
mpcs.set_description(u8(c->qsDesc));
@@ -419,7 +420,7 @@ void Server::msgAuthenticate(ServerUser *uSource, MumbleProto::Authenticate &msg
if (uSource->cChannel->iId != 0)
mpus.set_channel_id(uSource->cChannel->iId);
- sendAll(mpus, 0x010202);
+ sendAll(mpus, Version::fromComponents(1, 2, 2), Version::CompareMode::AtLeast);
if ((uSource->qbaTexture.length() >= 4)
&& (qFromBigEndian< unsigned int >(reinterpret_cast< const unsigned char * >(uSource->qbaTexture.constData()))
@@ -427,7 +428,7 @@ void Server::msgAuthenticate(ServerUser *uSource, MumbleProto::Authenticate &msg
mpus.set_texture(blob(uSource->qbaTexture));
if (!uSource->qsComment.isEmpty())
mpus.set_comment(u8(uSource->qsComment));
- sendAll(mpus, ~0x010202);
+ sendAll(mpus, Version::fromComponents(1, 2, 2), Version::CompareMode::LessThan);
// Transmit other users profiles
foreach (ServerUser *u, qhUsers) {
@@ -442,7 +443,7 @@ void Server::msgAuthenticate(ServerUser *uSource, MumbleProto::Authenticate &msg
mpus.set_name(u8(u->qsName));
if (u->iId >= 0)
mpus.set_user_id(u->iId);
- if (uSource->uiVersion >= 0x010202) {
+ if (uSource->uiVersion >= Version::fromComponents(1, 2, 2)) {
if (!u->qbaTextureHash.isEmpty())
mpus.set_texture_hash(blob(u->qbaTextureHash));
else if (!u->qbaTexture.isEmpty())
@@ -469,7 +470,7 @@ void Server::msgAuthenticate(ServerUser *uSource, MumbleProto::Authenticate &msg
mpus.set_self_deaf(true);
else if (u->bSelfMute)
mpus.set_self_mute(true);
- if ((uSource->uiVersion >= 0x010202) && !u->qbaCommentHash.isEmpty())
+ if ((uSource->uiVersion >= Version::fromComponents(1, 2, 2)) && !u->qbaCommentHash.isEmpty())
mpus.set_comment_hash(blob(u->qbaCommentHash));
else if (!u->qsComment.isEmpty())
mpus.set_comment(u8(u->qsComment));
@@ -508,8 +509,9 @@ void Server::msgAuthenticate(ServerUser *uSource, MumbleProto::Authenticate &msg
sendMessage(uSource, mpsc);
MumbleProto::SuggestConfig mpsug;
- if (!qvSuggestVersion.isNull())
- mpsug.set_version(qvSuggestVersion.toUInt());
+ if (m_suggestVersion != Version::UNKNOWN) {
+ MumbleProto::setSuggestedVersion(mpsug, m_suggestVersion);
+ }
if (!qvSuggestPositional.isNull())
mpsug.set_positional(qvSuggestPositional.toBool());
if (!qvSuggestPushToTalk.isNull())
@@ -523,7 +525,7 @@ void Server::msgAuthenticate(ServerUser *uSource, MumbleProto::Authenticate &msg
sendMessage(uSource, mpsug);
}
- if (uSource->uiVersion < 0x010400 && Meta::mp.iMaxListenersPerChannel != 0
+ if (uSource->uiVersion < Version::fromComponents(1, 4, 0) && Meta::mp.iMaxListenersPerChannel != 0
&& Meta::mp.iMaxListenerProxiesPerUser != 0) {
// The server has the ChannelListener feature enabled but the client that connects doesn't have version 1.4.0 or
// newer meaning that this client doesn't know what ChannelListeners are. Thus we'll send that user a
@@ -686,7 +688,7 @@ void Server::msgUserState(ServerUser *uSource, MumbleProto::UserState &msg) {
return;
}
if (isChannelFull(c, uSource)) {
- PERM_DENIED_FALLBACK(ChannelFull, 0x010201, QLatin1String("Channel is full"));
+ PERM_DENIED_FALLBACK(ChannelFull, Version::fromComponents(1, 2, 1), QLatin1String("Channel is full"));
return;
}
}
@@ -709,7 +711,7 @@ void Server::msgUserState(ServerUser *uSource, MumbleProto::UserState &msg) {
if (Meta::mp.iMaxListenersPerChannel >= 0
&& Meta::mp.iMaxListenersPerChannel - m_channelListenerManager.getListenerCountForChannel(c->iId) - 1 < 0) {
// A limit for the amount of listener proxies per channel is set and it has been reached already
- PERM_DENIED_FALLBACK(ChannelListenerLimit, 0x010400,
+ PERM_DENIED_FALLBACK(ChannelListenerLimit, Version::fromComponents(1, 4, 0),
QLatin1String("No more listeners allowed in this channel"));
continue;
}
@@ -720,7 +722,7 @@ void Server::msgUserState(ServerUser *uSource, MumbleProto::UserState &msg) {
- passedChannelListener - 1
< 0) {
// A limit for the amount of listener proxies per user is set and it has been reached already
- PERM_DENIED_FALLBACK(UserListenerLimit, 0x010400,
+ PERM_DENIED_FALLBACK(UserListenerLimit, Version::fromComponents(1, 4, 0),
QLatin1String("No more listeners allowed in this channel"));
continue;
}
@@ -919,7 +921,7 @@ void Server::msgUserState(ServerUser *uSource, MumbleProto::UserState &msg) {
else
mptm.set_message(u8(QString(QLatin1String("User '%1' stopped recording")).arg(pDstServerUser->qsName)));
- sendAll(mptm, ~0x010203);
+ sendAll(mptm, Version::fromComponents(1, 2, 3), Version::CompareMode::LessThan);
bBroadcast = true;
}
@@ -985,12 +987,12 @@ void Server::msgUserState(ServerUser *uSource, MumbleProto::UserState &msg) {
!= 600 * 60 * 4)) {
// This is a new style texture, don't send it because the client doesn't handle it correctly / crashes.
msg.clear_texture();
- sendAll(msg, ~0x010202);
+ sendAll(msg, Version::fromComponents(1, 2, 2), Version::CompareMode::LessThan);
msg.set_texture(blob(pDstServerUser->qbaTexture));
} else {
// This is an old style texture, empty texture or there was no texture in this packet,
// send the message unchanged.
- sendAll(msg, ~0x010202);
+ sendAll(msg, Version::fromComponents(1, 2, 2), Version::CompareMode::LessThan);
}
// Texture / comment handling for clients >= 1.2.2.
@@ -1004,7 +1006,7 @@ void Server::msgUserState(ServerUser *uSource, MumbleProto::UserState &msg) {
msg.set_comment_hash(blob(pDstServerUser->qbaCommentHash));
}
- sendAll(msg, 0x010202);
+ sendAll(msg, Version::fromComponents(1, 2, 2), Version::CompareMode::AtLeast);
if (bDstAclChanged) {
clearACLCache(pDstServerUser);
@@ -1123,7 +1125,8 @@ void Server::msgChannelState(ServerUser *uSource, MumbleProto::ChannelState &msg
// a channel in or move a channel into this parent.
if (!canNest(p, c)) {
- PERM_DENIED_FALLBACK(NestingLimit, 0x010204, QLatin1String("Channel nesting limit reached"));
+ PERM_DENIED_FALLBACK(NestingLimit, Version::fromComponents(1, 2, 4),
+ QLatin1String("Channel nesting limit reached"));
return;
}
}
@@ -1135,7 +1138,8 @@ void Server::msgChannelState(ServerUser *uSource, MumbleProto::ChannelState &msg
return;
if (iChannelCountLimit != 0 && qhChannels.count() >= iChannelCountLimit) {
- PERM_DENIED_FALLBACK(ChannelCountLimit, 0x010300, QLatin1String("Channel count limit reached"));
+ PERM_DENIED_FALLBACK(ChannelCountLimit, Version::fromComponents(1, 3, 0),
+ QLatin1String("Channel count limit reached"));
return;
}
@@ -1182,12 +1186,12 @@ void Server::msgChannelState(ServerUser *uSource, MumbleProto::ChannelState &msg
log(uSource, QString("Added channel %1 under %2").arg(QString(*c), QString(*p)));
emit channelCreated(c);
- sendAll(msg, ~0x010202);
+ sendAll(msg, Version::fromComponents(1, 2, 2), Version::CompareMode::LessThan);
if (!c->qbaDescHash.isEmpty()) {
msg.clear_description();
msg.set_description_hash(blob(c->qbaDescHash));
}
- sendAll(msg, 0x010202);
+ sendAll(msg, Version::fromComponents(1, 2, 2), Version::CompareMode::AtLeast);
if (c->bTemporary) {
// If a temporary channel has been created move the creator right in there
@@ -1326,12 +1330,12 @@ void Server::msgChannelState(ServerUser *uSource, MumbleProto::ChannelState &msg
updateChannel(c);
emit channelStateChanged(c);
- sendAll(msg, ~0x010202);
+ sendAll(msg, Version::fromComponents(1, 2, 2), Version::CompareMode::LessThan);
if (msg.has_description() && !c->qbaDescHash.isEmpty()) {
msg.clear_description();
msg.set_description_hash(blob(c->qbaDescHash));
}
- sendAll(msg, 0x010202);
+ sendAll(msg, Version::fromComponents(1, 2, 2), Version::CompareMode::AtLeast);
}
}
@@ -1879,9 +1883,7 @@ QString convertWithSizeRestriction(const std::string &str, size_t maxSize) {
void Server::msgVersion(ServerUser *uSource, MumbleProto::Version &msg) {
RATELIMIT(uSource);
- if (msg.has_version()) {
- uSource->uiVersion = msg.version();
- }
+ uSource->uiVersion = MumbleProto::getVersion(msg);
if (msg.has_release()) {
uSource->qsRelease = convertWithSizeRestriction(msg.release(), 100);
}
@@ -1964,7 +1966,7 @@ void Server::msgUserList(ServerUser *uSource, MumbleProto::UserList &msg) {
} else {
MumbleProto::PermissionDenied mppd;
mppd.set_type(MumbleProto::PermissionDenied_DenyType_UserName);
- if (uSource->uiVersion < 0x010201)
+ if (uSource->uiVersion < Version::fromComponents(1, 2, 1))
mppd.set_reason(u8(QString::fromLatin1("%1 is not a valid username").arg(name)));
else
mppd.set_name(u8(name));
@@ -2090,10 +2092,12 @@ void Server::msgUserStats(ServerUser *uSource, MumbleProto::UserStats &msg) {
MumbleProto::Version *mpv;
mpv = msg.mutable_version();
- if (pDstServerUser->uiVersion)
- mpv->set_version(pDstServerUser->uiVersion);
- if (!pDstServerUser->qsRelease.isEmpty())
+ if (pDstServerUser->uiVersion != Version::UNKNOWN) {
+ MumbleProto::setVersion(*mpv, pDstServerUser->uiVersion);
+ }
+ if (!pDstServerUser->qsRelease.isEmpty()) {
mpv->set_release(u8(pDstServerUser->qsRelease));
+ }
if (!pDstServerUser->qsOS.isEmpty()) {
mpv->set_os(u8(pDstServerUser->qsOS));
if (!pDstServerUser->qsOSVersion.isEmpty())
diff --git a/src/murmur/Meta.cpp b/src/murmur/Meta.cpp
index 6ed11cdb1..d24318eaf 100644
--- a/src/murmur/Meta.cpp
+++ b/src/murmur/Meta.cpp
@@ -305,9 +305,7 @@ void MetaParams::read(QString fname) {
iBanTime = typeCheckedFromSettings("autobanTime", iBanTime);
bBanSuccessful = typeCheckedFromSettings("autobanSuccessfulConnections", bBanSuccessful);
- qvSuggestVersion = Version::getRaw(qsSettings->value("suggestVersion").toString());
- if (qvSuggestVersion.toUInt() == 0)
- qvSuggestVersion = QVariant();
+ m_suggestVersion = Version::fromConfig(qsSettings->value("suggestVersion"));
qvSuggestPositional = qsSettings->value("suggestPositional");
if (qvSuggestPositional.toString().trimmed().isEmpty())
@@ -405,8 +403,7 @@ void MetaParams::read(QString fname) {
qmConfig.insert(QLatin1String("certrequired"), bCertRequired ? QLatin1String("true") : QLatin1String("false"));
qmConfig.insert(QLatin1String("forceExternalAuth"),
bForceExternalAuth ? QLatin1String("true") : QLatin1String("false"));
- qmConfig.insert(QLatin1String("suggestversion"),
- qvSuggestVersion.isNull() ? QString() : qvSuggestVersion.toString());
+ qmConfig.insert(QLatin1String("suggestversion"), Version::toConfigString(m_suggestVersion));
qmConfig.insert(QLatin1String("suggestpositional"),
qvSuggestPositional.isNull() ? QString() : qvSuggestPositional.toString());
qmConfig.insert(QLatin1String("suggestpushtotalk"),
diff --git a/src/murmur/Meta.h b/src/murmur/Meta.h
index 91b48f535..9c793bc7f 100644
--- a/src/murmur/Meta.h
+++ b/src/murmur/Meta.h
@@ -8,6 +8,8 @@
#include "Timer.h"
+#include "Version.h"
+
#ifdef Q_OS_WIN
# include "win.h"
#endif
@@ -141,7 +143,7 @@ public:
QString qsName;
#endif
- QVariant qvSuggestVersion;
+ Version::full_t m_suggestVersion;
QVariant qvSuggestPositional;
QVariant qvSuggestPushToTalk;
@@ -207,7 +209,8 @@ public:
void killAll();
void getOSInfo();
void connectListener(QObject *);
- static void getVersion(int &major, int &minor, int &patch, QString &string);
+ static void getVersion(Version::component_t &major, Version::component_t &minor, Version::component_t &patch,
+ QString &string);
signals:
void started(Server *);
void stopped(Server *);
diff --git a/src/murmur/Murmur.ice b/src/murmur/Murmur.ice
index 1dff7fca3..d72d63b33 100644
--- a/src/murmur/Murmur.ice
+++ b/src/murmur/Murmur.ice
@@ -49,8 +49,10 @@ module Murmur
int onlinesecs;
/** Average transmission rate in bytes per second over the last few seconds. */
int bytespersec;
- /** Client version. Major version in upper 16 bits, followed by 8 bits of minor version and 8 bits of patchlevel. Version 1.2.3 = 0x010203. */
+ /** Legacy client version. */
int version;
+ /** New client version. (See https://github.com/mumble-voip/mumble/issues/5827) */
+ long version2;
/** Client release. For official releases, this equals the version. For snapshots and git compiles, this will be something else. */
string release;
/** Client OS. */
diff --git a/src/murmur/MurmurGRPCImpl.cpp b/src/murmur/MurmurGRPCImpl.cpp
index 37ea5c550..16d06833f 100644
--- a/src/murmur/MurmurGRPCImpl.cpp
+++ b/src/murmur/MurmurGRPCImpl.cpp
@@ -17,6 +17,7 @@
#include "ServerDB.h"
#include "ServerUser.h"
#include "Utils.h"
+#include "Version.h"
#include <chrono>
@@ -274,7 +275,7 @@ void ToRPC(const ::Server *srv, const ::User *u, ::MurmurRPC::User *ru) {
const auto su = static_cast< const ServerUser * >(u);
ru->set_online_secs(su->bwr.onlineSeconds());
ru->set_bytes_per_sec(su->bwr.bandwidth());
- ru->mutable_version()->set_version(su->uiVersion);
+ ru->mutable_version()->set_version(::Version::toLegacyVersion(su->uiVersion));
ru->mutable_version()->set_release(u8(su->qsRelease));
ru->mutable_version()->set_os(u8(su->qsOS));
ru->mutable_version()->set_os_version(u8(su->qsOSVersion));
@@ -1316,10 +1317,10 @@ namespace Wrapper {
void V1_GetVersion::impl(bool) {
::MurmurRPC::Version version;
- int major, minor, patch;
+ ::Version::component_t major, minor, patch;
QString release;
Meta::getVersion(major, minor, patch, release);
- version.set_version(major << 16 | minor << 8 | patch);
+ version.set_version(::Version::toLegacyVersion(::Version::fromComponents(major, minor, patch)));
version.set_release(u8(release));
end(version);
}
diff --git a/src/murmur/MurmurIce.cpp b/src/murmur/MurmurIce.cpp
index b19116e06..a75c77117 100644
--- a/src/murmur/MurmurIce.cpp
+++ b/src/murmur/MurmurIce.cpp
@@ -111,7 +111,8 @@ static void userToUser(const ::User *p, Murmur::User &mp) {
const ServerUser *u = static_cast< const ServerUser * >(p);
mp.onlinesecs = u->bwr.onlineSeconds();
mp.bytespersec = u->bwr.bandwidth();
- mp.version = u->uiVersion;
+ mp.version2 = u->uiVersion;
+ mp.version = Version::toLegacyVersion(u->uiVersion);
mp.release = iceString(u->qsRelease);
mp.os = iceString(u->qsOS);
mp.osversion = iceString(u->qsOSVersion);
@@ -1663,12 +1664,12 @@ static void impl_Server_setTexture(const ::Murmur::AMD_Server_setTexturePtr cb,
mpus.set_session(user->uiSession);
mpus.set_texture(blob(user->qbaTexture));
- server->sendAll(mpus, ~0x010202);
+ server->sendAll(mpus, Version::fromComponents(1, 2, 2), Version::CompareMode::LessThan);
if (!user->qbaTextureHash.isEmpty()) {
mpus.clear_texture();
mpus.set_texture_hash(blob(user->qbaTextureHash));
}
- server->sendAll(mpus, 0x010202);
+ server->sendAll(mpus, Version::fromComponents(1, 2, 2), Version::CompareMode::AtLeast);
}
cb->ice_response();
@@ -1927,7 +1928,7 @@ static void impl_Meta_getBootedServers(const ::Murmur::AMD_Meta_getBootedServers
#define ACCESS_Meta_getVersion_ALL
static void impl_Meta_getVersion(const ::Murmur::AMD_Meta_getVersionPtr cb, const Ice::ObjectAdapterPtr) {
- int major, minor, patch;
+ Version::component_t major, minor, patch;
QString txt;
::Meta::getVersion(major, minor, patch, txt);
cb->ice_response(major, minor, patch, iceString(txt));
diff --git a/src/murmur/MurmurIceWrapper.cpp b/src/murmur/MurmurIceWrapper.cpp
index a0ffd3ce9..4dd6ce950 100644
--- a/src/murmur/MurmurIceWrapper.cpp
+++ b/src/murmur/MurmurIceWrapper.cpp
@@ -2234,7 +2234,8 @@ void ::Murmur::MetaI::getSlice_async(const ::Murmur::AMD_Meta_getSlicePtr &cb, c
"\n\n\n\n#include <Ice/SliceChecksumDict.ice>\nmodule Murmur\n{\n\n[\"python:seq:tuple\"] sequence<byte> "
"NetAddress;\n\nstruct User {\nint session;\nint userid;\nbool mute;\nbool deaf;\nbool suppress;\nbool "
"prioritySpeaker;\nbool selfMute;\nbool selfDeaf;\nbool recording;\nint channel;\nstring name;\nint "
- "onlinesecs;\nint bytespersec;\nint version;\nstring release;\nstring os;\nstring osversion;\nstring "
+ "onlinesecs;\nint bytespersec;\nint version;\nlong version2;\nstring release;\nstring os;\nstring "
+ "osversion;\nstring "
"identity;\nstring context;\nstring comment;\nNetAddress address;\nbool tcponly;\nint idlesecs;\nfloat "
"udpPing;\nfloat tcpPing;\n};\nsequence<int> IntList;\n\nstruct TextMessage {\nIntList sessions;\nIntList "
"channels;\nIntList trees;\nstring text;\n};\n\nstruct Channel {\nint id;\nstring name;\nint parent;\nIntList "
diff --git a/src/murmur/RPC.cpp b/src/murmur/RPC.cpp
index f887e6c85..b06e7fb7d 100644
--- a/src/murmur/RPC.cpp
+++ b/src/murmur/RPC.cpp
@@ -80,12 +80,12 @@ void Server::setUserState(User *pUser, Channel *cChannel, bool mute, bool deaf,
}
if (changed) {
- sendAll(mpus, ~0x010202);
+ sendAll(mpus, Version::fromComponents(1, 2, 2), Version::CompareMode::LessThan);
if (mpus.has_comment() && !pUser->qbaCommentHash.isEmpty()) {
mpus.clear_comment();
mpus.set_comment_hash(blob(pUser->qbaCommentHash));
}
- sendAll(mpus, 0x010202);
+ sendAll(mpus, Version::fromComponents(1, 2, 2), Version::CompareMode::AtLeast);
emit userStateChanged(pUser);
}
@@ -299,12 +299,12 @@ bool Server::setChannelState(Channel *cChannel, Channel *cParent, const QString
if (updated)
updateChannel(cChannel);
if (changed) {
- sendAll(mpcs, ~0x010202);
+ sendAll(mpcs, Version::fromComponents(1, 2, 2), Version::CompareMode::LessThan);
if (mpcs.has_description() && !cChannel->qbaDescHash.isEmpty()) {
mpcs.clear_description();
mpcs.set_description_hash(blob(cChannel->qbaDescHash));
}
- sendAll(mpcs, 0x010202);
+ sendAll(mpcs, Version::fromComponents(1, 2, 2), Version::CompareMode::AtLeast);
emit channelStateChanged(cChannel);
}
@@ -581,8 +581,9 @@ void Meta::connectListener(QObject *obj) {
connect(this, SIGNAL(stopped(Server *)), obj, SLOT(stopped(Server *)));
}
-void Meta::getVersion(int &major, int &minor, int &patch, QString &string) {
- string = QLatin1String(MUMBLE_RELEASE);
+void Meta::getVersion(Version::component_t &major, Version::component_t &minor, Version::component_t &patch,
+ QString &string) {
+ string = Version::getRelease();
major = minor = patch = 0;
- Version::get(&major, &minor, &patch);
+ Version::getComponents(major, minor, patch);
}
diff --git a/src/murmur/Server.cpp b/src/murmur/Server.cpp
index b2d63f67a..3b5b6077e 100644
--- a/src/murmur/Server.cpp
+++ b/src/murmur/Server.cpp
@@ -15,6 +15,7 @@
#include "Message.h"
#include "Meta.h"
#include "PacketDataStream.h"
+#include "ProtoUtils.h"
#include "ServerDB.h"
#include "ServerUser.h"
#include "SpeechFlags.h"
@@ -226,12 +227,6 @@ Server::Server(int snum, QObject *p) : QThread(p) {
readLinks();
initializeCert();
- int major, minor, patch;
- QString release;
- Meta::getVersion(major, minor, patch, release);
-
- uiVersionBlob = qToBigEndian(static_cast< quint32 >((major << 16) | (minor << 8) | patch));
-
if (bValid) {
#ifdef USE_ZEROCONF
if (bBonjour)
@@ -315,41 +310,6 @@ Server::~Server() {
log("Stopped");
}
-/// normalizeSuggestVersion normalizes a 'suggestversion' config value.
-/// The config value may be a version string, or a bitmasked
-/// integer representing the version.
-/// This function converts the 'suggestversion' config value to
-/// always be a bitmasked integer representation.
-///
-/// On error, the function returns an empty QVariant.
-static QVariant normalizeSuggestVersion(QVariant suggestVersion) {
- uint integerValue = suggestVersion.toUInt();
-
- // If the integer value is 0, it can mean two things:
- //
- // Either the suggestversion is set to 0.
- // Or, the suggestversion is a version string such as "1.3.0",
- // and cannot be converted to an integer value.
- //
- // We handle both cases the same: by pretending the
- // suggestversion is a version string in both cases.
- //
- // If it is a version string, the call to Version::getRaw()
- // will return the bitmasked representation.
- //
- // If it is not a version string, the call to Version::getRaw()
- // will return 0, so it is effectively a no-op.
- if (integerValue == 0) {
- integerValue = Version::getRaw(suggestVersion.toString());
- }
-
- if (integerValue != 0) {
- return integerValue;
- }
-
- return QVariant();
-}
-
void Server::readParams() {
qsPassword = Meta::mp.qsPassword;
usPort = static_cast< unsigned short >(Meta::mp.usPort + iServerNum - 1);
@@ -381,7 +341,7 @@ void Server::readParams() {
iMessageBurst = Meta::mp.iMessageBurst;
iPluginMessageLimit = Meta::mp.iPluginMessageLimit;
iPluginMessageBurst = Meta::mp.iPluginMessageBurst;
- qvSuggestVersion = Meta::mp.qvSuggestVersion;
+ m_suggestVersion = Meta::mp.m_suggestVersion;
qvSuggestPositional = Meta::mp.qvSuggestPositional;
qvSuggestPushToTalk = Meta::mp.qvSuggestPushToTalk;
iOpusThreshold = Meta::mp.iOpusThreshold;
@@ -461,9 +421,8 @@ void Server::readParams() {
bCertRequired = getConf("certrequired", bCertRequired).toBool();
bForceExternalAuth = getConf("forceExternalAuth", bForceExternalAuth).toBool();
- qvSuggestVersion = normalizeSuggestVersion(getConf("suggestversion", qvSuggestVersion));
- if (qvSuggestVersion.toUInt() == 0)
- qvSuggestVersion = QVariant();
+ m_suggestVersion =
+ Version::fromString(getConf("suggestversion", Version::toConfigString(m_suggestVersion)).toString());
qvSuggestPositional = getConf("suggestpositional", qvSuggestPositional);
if (qvSuggestPositional.toString().trimmed().isEmpty())
@@ -608,8 +567,7 @@ void Server::setLiveConf(const QString &key, const QString &value) {
else if (key == "channelname")
qrChannelName = !v.isNull() ? QRegExp(v) : Meta::mp.qrChannelName;
else if (key == "suggestversion")
- qvSuggestVersion =
- !v.isNull() ? (v.isEmpty() ? QVariant() : normalizeSuggestVersion(v)) : Meta::mp.qvSuggestVersion;
+ m_suggestVersion = !v.isNull() ? Version::fromConfig(v) : Meta::mp.m_suggestVersion;
else if (key == "suggestpositional")
qvSuggestPositional = !v.isNull() ? (v.isEmpty() ? QVariant() : v) : Meta::mp.qvSuggestPositional;
else if (key == "suggestpushtotalk")
@@ -704,7 +662,7 @@ void Server::udpActivated(int socket) {
// Cloned from ::run(), as it's the only UDP data we care about until the thread is started.
quint32 *ping = reinterpret_cast< quint32 * >(encrypt);
if ((len == 12) && (*ping == 0) && bAllowPing) {
- ping[0] = uiVersionBlob;
+ ping[0] = qToBigEndian(Version::toLegacyVersion(Version::get()));
ping[3] = qToBigEndian(static_cast< quint32 >(qhUsers.count()));
ping[4] = qToBigEndian(static_cast< quint32 >(iMaxUsers));
ping[5] = qToBigEndian(static_cast< quint32 >(iMaxBandwidth));
@@ -848,7 +806,7 @@ void Server::run() {
quint32 *ping = reinterpret_cast< quint32 * >(encrypt);
if ((len == 12) && (*ping == 0) && bAllowPing) {
- ping[0] = uiVersionBlob;
+ ping[0] = qToBigEndian(Version::toLegacyVersion(Version::get()));
// 1 and 2 will be the timestamp, which we return unmodified.
ping[3] = qToBigEndian(static_cast< quint32 >(qhUsers.count()));
ping[4] = qToBigEndian(static_cast< quint32 >(iMaxUsers));
@@ -1457,15 +1415,11 @@ void Server::newClient() {
void Server::encrypted() {
ServerUser *uSource = qobject_cast< ServerUser * >(sender());
- int major, minor, patch;
- QString release;
-
- Meta::getVersion(major, minor, patch, release);
MumbleProto::Version mpv;
- mpv.set_version((major << 16) | (minor << 8) | patch);
+ MumbleProto::setVersion(mpv, Version::get());
if (Meta::mp.bSendVersion) {
- mpv.set_release(u8(release));
+ mpv.set_release(u8(Version::getRelease()));
mpv.set_os(u8(meta->qsOS));
mpv.set_os_version(u8(meta->qsOSVersion));
}
@@ -1779,18 +1733,25 @@ void Server::sendProtoMessage(ServerUser *u, const ::google::protobuf::Message &
u->sendMessage(msg, msgType, cache);
}
-void Server::sendProtoAll(const ::google::protobuf::Message &msg, unsigned int msgType, unsigned int version) {
- sendProtoExcept(nullptr, msg, msgType, version);
+void Server::sendProtoAll(const ::google::protobuf::Message &msg, unsigned int msgType, Version::full_t version,
+ Version::CompareMode mode) {
+ sendProtoExcept(nullptr, msg, msgType, version, mode);
}
void Server::sendProtoExcept(ServerUser *u, const ::google::protobuf::Message &msg, unsigned int msgType,
- unsigned int version) {
+ Version::full_t version, Version::CompareMode mode) {
QByteArray cache;
foreach (ServerUser *usr, qhUsers)
- if ((usr != u) && (usr->sState == ServerUser::Authenticated))
- if ((version == 0) || (usr->uiVersion >= version)
- || ((version & 0x80000000) && (usr->uiVersion < (~version))))
+ if ((usr != u) && (usr->sState == ServerUser::Authenticated)) {
+ assert(mode == Version::CompareMode::AtLeast || mode == Version::CompareMode::LessThan);
+
+ const bool isUnknown = version == Version::UNKNOWN;
+ const bool fulfillsVersionRequirement =
+ mode == Version::CompareMode::AtLeast ? usr->uiVersion >= version : usr->uiVersion < version;
+ if (isUnknown || fulfillsVersionRequirement) {
usr->sendMessage(msg, msgType, cache);
+ }
+ }
}
void Server::removeChannel(int id) {
diff --git a/src/murmur/Server.h b/src/murmur/Server.h
index ee927adc4..51223c740 100644
--- a/src/murmur/Server.h
+++ b/src/murmur/Server.h
@@ -20,6 +20,7 @@
#include "Mumble.pb.h"
#include "Timer.h"
#include "User.h"
+#include "Version.h"
#ifndef Q_MOC_RUN
# include <boost/function.hpp>
@@ -141,7 +142,7 @@ public:
unsigned int iPluginMessageLimit;
unsigned int iPluginMessageBurst;
- QVariant qvSuggestVersion;
+ Version::full_t m_suggestVersion;
QVariant qvSuggestPositional;
QVariant qvSuggestPushToTalk;
@@ -231,7 +232,6 @@ public:
HANDLE hNotify;
QList< SOCKET > qlUdpSocket;
#endif
- quint32 uiVersionBlob;
QList< QSocketNotifier * > qlUdpNotifier;
/// This lock provides synchronization between the
@@ -309,18 +309,23 @@ public:
void clearACLCache(User *p = nullptr);
void clearWhisperTargetCache();
- void sendProtoAll(const ::google::protobuf::Message &msg, unsigned int msgType, unsigned int minversion);
+ void sendProtoAll(const ::google::protobuf::Message &msg, unsigned int msgType, Version::full_t version,
+ Version::CompareMode mode);
void sendProtoExcept(ServerUser *, const ::google::protobuf::Message &msg, unsigned int msgType,
- unsigned int minversion);
+ Version::full_t version, Version::CompareMode mode);
void sendProtoMessage(ServerUser *, const ::google::protobuf::Message &msg, unsigned int msgType);
// sendAll sends a protobuf message to all users on the server whose version is either bigger than v or
// lower than ~v. If v == 0 the message is sent to everyone.
-#define MUMBLE_MH_MSG(x) \
- void sendAll(const MumbleProto::x &msg, unsigned int v = 0) { sendProtoAll(msg, MessageHandler::x, v); } \
- void sendExcept(ServerUser *u, const MumbleProto::x &msg, unsigned int v = 0) { \
- sendProtoExcept(u, msg, MessageHandler::x, v); \
- } \
+#define MUMBLE_MH_MSG(x) \
+ void sendAll(const MumbleProto::x &msg, Version::full_t v = Version::UNKNOWN, \
+ Version::CompareMode mode = Version::CompareMode::AtLeast) { \
+ sendProtoAll(msg, MessageHandler::x, v, mode); \
+ } \
+ void sendExcept(ServerUser *u, const MumbleProto::x &msg, Version::full_t v = Version::UNKNOWN, \
+ Version::CompareMode mode = Version::CompareMode::AtLeast) { \
+ sendProtoExcept(u, msg, MessageHandler::x, v, mode); \
+ } \
void sendMessage(ServerUser *u, const MumbleProto::x &msg) { sendProtoMessage(u, msg, MessageHandler::x); }
MUMBLE_MH_ALL
diff --git a/src/murmur/ServerUser.cpp b/src/murmur/ServerUser.cpp
index 7e0a61ccc..42eb90851 100644
--- a/src/murmur/ServerUser.cpp
+++ b/src/murmur/ServerUser.cpp
@@ -26,7 +26,7 @@ ServerUser::ServerUser(Server *p, QSslSocket *socket)
uiUDPPackets = uiTCPPackets = 0;
aiUdpFlag = 1;
- uiVersion = 0;
+ uiVersion = Version::UNKNOWN;
bVerified = true;
iLastPermissionCheck = -1;
diff --git a/src/murmur/ServerUser.h b/src/murmur/ServerUser.h
index c34ebeaf7..fe52119db 100644
--- a/src/murmur/ServerUser.h
+++ b/src/murmur/ServerUser.h
@@ -16,6 +16,7 @@
#include "HostAddress.h"
#include "Timer.h"
#include "User.h"
+#include "Version.h"
#include <QtCore/QElapsedTimer>
#include <QtCore/QStringList>
@@ -114,7 +115,7 @@ public:
float dTCPPingAvg, dTCPPingVar;
quint32 uiUDPPackets, uiTCPPackets;
- unsigned int uiVersion;
+ Version::full_t uiVersion;
QString qsRelease;
QString qsOS;
QString qsOSVersion;
diff --git a/src/murmur/Tray.cpp b/src/murmur/Tray.cpp
index 977c420bf..b1986fb18 100644
--- a/src/murmur/Tray.cpp
+++ b/src/murmur/Tray.cpp
@@ -78,7 +78,7 @@ void Tray::on_ShowLog_triggered() {
QTextBrowser *tb = new QTextBrowser();
mw->resize(675, 300);
mw->setCentralWidget(tb);
- mw->setWindowTitle(QString::fromLatin1("Murmur -- %1").arg(MUMBLE_RELEASE));
+ mw->setWindowTitle(QString::fromLatin1("Murmur -- %1").arg(Version::getRelease()));
connect(le, SIGNAL(newLogEntry(const QString &)), tb, SLOT(append(const QString &)));
diff --git a/src/murmur/main.cpp b/src/murmur/main.cpp
index 4a5826dea..cef62805f 100644
--- a/src/murmur/main.cpp
+++ b/src/murmur/main.cpp
@@ -352,7 +352,7 @@ int main(int argc, char **argv) {
bVerbose = true;
} else if ((arg == "-version") || (arg == "--version")) {
detach = false;
- qInfo("%s -- %s", qPrintable(args.at(0)), MUMBLE_RELEASE);
+ qInfo("%s -- %s", qPrintable(args.at(0)), Version::getRelease().toStdString().c_str());
return 0;
} else if (args.at(i) == QLatin1String("-license") || args.at(i) == QLatin1String("--license")) {
#ifdef Q_OS_WIN
@@ -663,11 +663,7 @@ int main(int argc, char **argv) {
meta->getOSInfo();
- int major, minor, patch;
- QString strver;
- meta->getVersion(major, minor, patch, strver);
-
- qWarning("Murmur %d.%d.%d (%s) running on %s: %s: Booting servers", major, minor, patch, qPrintable(strver),
+ qWarning("Murmur %s running on %s: %s: Booting servers", qPrintable(Version::toString(Version::get())),
qPrintable(meta->qsOS), qPrintable(meta->qsOSVersion));
meta->bootAll();
diff --git a/src/tests/Benchmark.cpp b/src/tests/Benchmark.cpp
index 251923ad4..aea34ea33 100644
--- a/src/tests/Benchmark.cpp
+++ b/src/tests/Benchmark.cpp
@@ -100,7 +100,7 @@ Client::Client(QObject *p, QHostAddress qha, unsigned short prt, bool send, bool
MumbleProto::Version mpv;
mpv.set_release(u8(QLatin1String("1.2.1 Benchmark")));
- mpv.set_version(0x010203);
+ mpv.set_version_v1(Version::toLegacyVersion(Version::fromComponents(1, 2, 3)));
sendMessage(mpv, MessageHandler::Version);
diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt
index 10cd9a069..11b5ff793 100644
--- a/src/tests/CMakeLists.txt
+++ b/src/tests/CMakeLists.txt
@@ -34,6 +34,7 @@ use_test("TestSSLLocks")
use_test("TestStdAbs")
use_test("TestTimer")
use_test("TestUnresolvedServerAddress")
+use_test("TestVersion")
if(online-tests)
message(STATUS "Including online tests - These will fail if you don't have a working internet connection when running them")
diff --git a/src/tests/TestVersion/CMakeLists.txt b/src/tests/TestVersion/CMakeLists.txt
new file mode 100644
index 000000000..7739a68bd
--- /dev/null
+++ b/src/tests/TestVersion/CMakeLists.txt
@@ -0,0 +1,12 @@
+# Copyright 2022 The Mumble Developers. All rights reserved.
+# Use of this source code is governed by a BSD-style license
+# that can be found in the LICENSE file at the root of the
+# Mumble source tree or at <https://www.mumble.info/LICENSE>.
+
+add_executable(TestVersion TestVersion.cpp)
+
+set_target_properties(TestVersion PROPERTIES AUTOMOC ON)
+
+target_link_libraries(TestVersion PRIVATE shared Qt5::Test)
+
+add_test(NAME TestVersion COMMAND $<TARGET_FILE:TestVersion>)
diff --git a/src/tests/TestVersion/TestVersion.cpp b/src/tests/TestVersion/TestVersion.cpp
new file mode 100644
index 000000000..92d8ab67d
--- /dev/null
+++ b/src/tests/TestVersion/TestVersion.cpp
@@ -0,0 +1,86 @@
+// Copyright 2022 The Mumble Developers. All rights reserved.
+// Use of this source code is governed by a BSD-style license
+// that can be found in the LICENSE file at the root of the
+// Mumble source tree or at <https://www.mumble.info/LICENSE>.
+
+#include "Version.h"
+
+#include <QObject>
+#include <QTest>
+
+#include <limits>
+
+class TestVersion : public QObject {
+ Q_OBJECT;
+private slots:
+
+ void legacy_encode() {
+ QCOMPARE(Version::toLegacyVersion(Version::fromComponents(1, 3, 5)), static_cast< std::uint32_t >(0x010305));
+ }
+
+ void legacy_decode() { QCOMPARE(Version::fromLegacyVersion(0x010305), Version::fromComponents(1, 3, 5)); }
+
+ void legacy_consistency() {
+ QCOMPARE(Version::fromLegacyVersion(Version::toLegacyVersion(Version::fromComponents(1, 3, 5))),
+ Version::fromComponents(1, 3, 5));
+ }
+
+ void general_getMajor() {
+ QCOMPARE(Version::getMajor(Version::fromComponents(1, 3, 5)), static_cast< Version::component_t >(1));
+ }
+
+ void general_getMinor() {
+ QCOMPARE(Version::getMinor(Version::fromComponents(1, 3, 5)), static_cast< Version::component_t >(3));
+ }
+
+ void general_getPatch() {
+ QCOMPARE(Version::getPatch(Version::fromComponents(1, 3, 5)), static_cast< Version::component_t >(5));
+ }
+
+ void v2_encode() { QCOMPARE(Version::fromComponents(1, 3, 5), static_cast< Version::full_t >(0x0001000300050000)); }
+
+ void v2_decode() {
+ Version::component_t major = 0, minor = 0, patch = 0;
+
+ Version::getComponents(major, minor, patch);
+ QCOMPARE(major, static_cast< Version::component_t >(MUMBLE_VERSION_MAJOR));
+ QCOMPARE(minor, static_cast< Version::component_t >(MUMBLE_VERSION_MINOR));
+ QCOMPARE(patch, static_cast< Version::component_t >(MUMBLE_VERSION_PATCH));
+
+ Version::getComponents(major, minor, patch, "2.8.42");
+ QCOMPARE(major, static_cast< Version::component_t >(2));
+ QCOMPARE(minor, static_cast< Version::component_t >(8));
+ QCOMPARE(patch, static_cast< Version::component_t >(42));
+ }
+
+ void v2_limits() {
+ Version::component_t major, minor, patch;
+ major = minor = patch = std::numeric_limits< Version::component_t >::max();
+
+ Version::full_t version = Version::fromComponents(major, minor, patch);
+
+ QCOMPARE(Version::getMajor(version), major);
+ QCOMPARE(Version::getMinor(version), minor);
+ QCOMPARE(Version::getPatch(version), patch);
+ }
+
+ void config_decoding() {
+ // Version may be given as a string (probably most common)
+ Version::full_t version = Version::fromConfig("1.8.266");
+
+ QCOMPARE(version, Version::fromComponents(1, 8, 266));
+
+ // Or as an integer (v2-encoded)
+ version = Version::fromConfig(static_cast< qulonglong >(Version::fromComponents(2, 18, 42)));
+
+ QCOMPARE(version, Version::fromComponents(2, 18, 42));
+
+ // Or as an integer (v1-encoded)
+ version = Version::fromConfig(Version::toLegacyVersion(Version::fromComponents(2, 18, 42)));
+
+ QCOMPARE(version, Version::fromComponents(2, 18, 42));
+ }
+};
+
+QTEST_MAIN(TestVersion)
+#include "TestVersion.moc"