From b5bdfa6c2e9a0eb62e476dd399b82bfa972e0320 Mon Sep 17 00:00:00 2001
From: Kenneth Chew <kenneth.c0@protonmail.com>
Date: Wed, 20 Apr 2022 22:34:13 -0400
Subject: Implement automatic and manual updates on macOS

---
 launcher/updater/UpdateChecker.cpp | 21 +++++++++++++++++++++
 launcher/updater/UpdateChecker.h   | 15 +++++++++++++++
 2 files changed, 36 insertions(+)

(limited to 'launcher/updater')

diff --git a/launcher/updater/UpdateChecker.cpp b/launcher/updater/UpdateChecker.cpp
index efdb6093..ad159841 100644
--- a/launcher/updater/UpdateChecker.cpp
+++ b/launcher/updater/UpdateChecker.cpp
@@ -44,8 +44,28 @@ bool UpdateChecker::hasChannels() const
     return !m_channels.isEmpty();
 }
 
+#ifdef Q_OS_MAC
+SparkleUpdater* UpdateChecker::getSparkleUpdater()
+{
+    return m_sparkleUpdater;
+}
+#endif
+
 void UpdateChecker::checkForUpdate(QString updateChannel, bool notifyNoUpdate)
 {
+#ifdef Q_OS_MAC
+    m_sparkleUpdater->setAllowedChannel(updateChannel);
+    if (notifyNoUpdate)
+    {
+        qDebug() << "Checking for updates.";
+        m_sparkleUpdater->checkForUpdates();
+    }
+    else
+    {
+        // Sparkle already handles automatic update checks.
+        return;
+    }
+#else
     qDebug() << "Checking for updates.";
 
     // If the channel list hasn't loaded yet, load it and defer checking for updates until
@@ -109,6 +129,7 @@ void UpdateChecker::checkForUpdate(QString updateChannel, bool notifyNoUpdate)
     connect(indexJob.get(), &NetJob::succeeded, [this, notifyNoUpdate](){ updateCheckFinished(notifyNoUpdate); });
     connect(indexJob.get(), &NetJob::failed, this, &UpdateChecker::updateCheckFailed);
     indexJob->start();
+#endif
 }
 
 void UpdateChecker::updateCheckFinished(bool notifyNoUpdate)
diff --git a/launcher/updater/UpdateChecker.h b/launcher/updater/UpdateChecker.h
index 13ee4efd..c569e49a 100644
--- a/launcher/updater/UpdateChecker.h
+++ b/launcher/updater/UpdateChecker.h
@@ -18,6 +18,10 @@
 #include "net/NetJob.h"
 #include "GoUpdate.h"
 
+#ifdef Q_OS_MAC
+#include "updater/macsparkle/SparkleUpdater.h"
+#endif
+
 class UpdateChecker : public QObject
 {
     Q_OBJECT
@@ -54,6 +58,13 @@ public:
      */
     bool hasChannels() const;
 
+#ifdef Q_OS_MAC
+    /*!
+     * Returns a pointer to the Sparkle updater.
+     */
+    SparkleUpdater *getSparkleUpdater();
+#endif
+
 signals:
     //! Signal emitted when an update is available. Passes the URL for the repo and the ID and name for the version.
     void updateAvailable(GoUpdate::Status status);
@@ -117,5 +128,9 @@ private:
     QString m_currentRepoUrl;
 
     QString m_newRepoUrl;
+
+#ifdef Q_OS_MAC
+    SparkleUpdater *m_sparkleUpdater = new SparkleUpdater();
+#endif
 };
 
-- 
cgit