From f463d3ec6d1d8d29d2cfc2b63fb851734e50c64f Mon Sep 17 00:00:00 2001
From: John Preston <johnprestonmail@gmail.com>
Date: Tue, 10 Sep 2019 01:21:44 +0300
Subject: [PATCH] Divide autoupdate paths for OS versions.

---
 Telegram/SourceFiles/core/update_checker.cpp  | 28 +++++++------------
 .../SourceFiles/platform/linux/info_linux.cpp | 14 ++++++++++
 Telegram/SourceFiles/platform/mac/info_mac.mm | 17 +++++++++++
 Telegram/SourceFiles/platform/platform_info.h |  2 ++
 .../SourceFiles/platform/win/info_win.cpp     | 11 ++++++++
 5 files changed, 54 insertions(+), 18 deletions(-)

diff --git a/Telegram/SourceFiles/core/update_checker.cpp b/Telegram/SourceFiles/core/update_checker.cpp
index aa55ec1fe..76551517b 100644
--- a/Telegram/SourceFiles/core/update_checker.cpp
+++ b/Telegram/SourceFiles/core/update_checker.cpp
@@ -499,21 +499,7 @@ bool ParseCommonMap(
 		return false;
 	}
 	const auto platforms = document.object();
-	const auto platform = [&] {
-		if (Platform::IsWindows()) {
-			return "win";
-		} else if (Platform::IsMacOldBuild()) {
-			return "mac32";
-		} else if (Platform::IsMac()) {
-			return "mac";
-		} else if (Platform::IsLinux32Bit()) {
-			return "linux32";
-		} else if (Platform::IsLinux64Bit()) {
-			return "linux";
-		} else {
-			Unexpected("Platform in ParseCommonMap.");
-		}
-	}();
+	const auto platform = Platform::AutoUpdateKey();
 	const auto it = platforms.constFind(platform);
 	if (it == platforms.constEnd()) {
 		LOG(("Update Error: MTP platform '%1' not found in response."
@@ -621,7 +607,11 @@ HttpChecker::HttpChecker(bool testing) : Checker(testing) {
 }
 
 void HttpChecker::start() {
-	auto url = QUrl(Local::readAutoupdatePrefix() + qstr("/current"));
+	const auto updaterVersion = Platform::AutoUpdateVersion();
+	const auto path = Local::readAutoupdatePrefix()
+		+ qstr("/current")
+		+ (updaterVersion > 1 ? QString::number(updaterVersion) : QString());
+	auto url = QUrl(path);
 	DEBUG_LOG(("Update Info: requesting update state"));
 	const auto request = QNetworkRequest(url);
 	_manager = std::make_unique<QNetworkAccessManager>();
@@ -896,8 +886,10 @@ void MtpChecker::start() {
 		crl::on_main(this, [=] { fail(); });
 		return;
 	}
-	constexpr auto kFeed = "tdhbcfeed";
-	MTP::ResolveChannel(&_mtp, kFeed, [=](const MTPInputChannel &channel) {
+	const auto updaterVersion = Platform::AutoUpdateVersion();
+	const auto feed = "tdhbcfeed"
+		+ (updaterVersion > 1 ? QString::number(updaterVersion) : QString());
+	MTP::ResolveChannel(&_mtp, feed, [=](const MTPInputChannel &channel) {
 		_mtp.send(
 			MTPmessages_GetHistory(
 				MTP_inputPeerChannel(
diff --git a/Telegram/SourceFiles/platform/linux/info_linux.cpp b/Telegram/SourceFiles/platform/linux/info_linux.cpp
index 255fd79d9..8d5e66764 100644
--- a/Telegram/SourceFiles/platform/linux/info_linux.cpp
+++ b/Telegram/SourceFiles/platform/linux/info_linux.cpp
@@ -42,4 +42,18 @@ QDate WhenSystemBecomesOutdated() {
 	return QDate();
 }
 
+int AutoUpdateVersion() {
+	return 2;
+}
+
+QString AutoUpdateKey() {
+	if (IsLinux32Bit()) {
+		return "linux32";
+	} else if (IsLinux64Bit()) {
+		return "linux";
+	} else {
+		Unexpected("Platform in AutoUpdateKey.");
+	}
+}
+
 } // namespace Platform
diff --git a/Telegram/SourceFiles/platform/mac/info_mac.mm b/Telegram/SourceFiles/platform/mac/info_mac.mm
index 1a6504f1c..7a34eca46 100644
--- a/Telegram/SourceFiles/platform/mac/info_mac.mm
+++ b/Telegram/SourceFiles/platform/mac/info_mac.mm
@@ -122,6 +122,23 @@ QDate WhenSystemBecomesOutdated() {
 	return QDate();
 }
 
+int AutoUpdateVersion() {
+	if (!IsMac10_10OrGreater()) {
+		return 1;
+	}
+	return 2;
+}
+
+QString AutoUpdateKey() {
+	if (IsMacOldBuild()) {
+		return "mac32";
+	} else if (!IsMac10_12OrGreater()) {
+		return "osx";
+	} else {
+		return "mac";
+	}
+}
+
 bool IsMac10_6OrGreater() {
 	return IsMacThatOrGreater<6>();
 }
diff --git a/Telegram/SourceFiles/platform/platform_info.h b/Telegram/SourceFiles/platform/platform_info.h
index c8193c53c..3fe92ea28 100644
--- a/Telegram/SourceFiles/platform/platform_info.h
+++ b/Telegram/SourceFiles/platform/platform_info.h
@@ -14,6 +14,8 @@ namespace Platform {
 [[nodiscard]] QString SystemCountry();
 [[nodiscard]] QString SystemLanguage();
 [[nodiscard]] QDate WhenSystemBecomesOutdated();
+[[nodiscard]] int AutoUpdateVersion();
+[[nodiscard]] QString AutoUpdateKey();
 
 [[nodiscard]] constexpr bool IsWindows();
 [[nodiscard]] constexpr bool IsWindowsStoreBuild();
diff --git a/Telegram/SourceFiles/platform/win/info_win.cpp b/Telegram/SourceFiles/platform/win/info_win.cpp
index d1af4befb..6a5a45fe1 100644
--- a/Telegram/SourceFiles/platform/win/info_win.cpp
+++ b/Telegram/SourceFiles/platform/win/info_win.cpp
@@ -218,6 +218,17 @@ QDate WhenSystemBecomesOutdated() {
 	return QDate();
 }
 
+int AutoUpdateVersion() {
+	if (!IsWindows7OrGreater()) {
+		return 1;
+	}
+	return 2;
+}
+
+QString AutoUpdateKey() {
+	return "win";
+}
+
 bool IsWindowsXPOrGreater() {
 	static const auto result = ::IsWindowsXPOrGreater();
 	return result;