Merge branch 'develop' of https://github.com/PrismLauncher/PrismLauncher into feat/launcher-updater

Signed-off-by: Trial97 <alexandru.tripon97@gmail.com>
This commit is contained in:
Trial97
2023-08-15 13:29:42 +03:00
712 changed files with 18878 additions and 17954 deletions

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-3.0-only
/*
* PolyMC - Minecraft Launcher
* Prism Launcher - Minecraft Launcher
* Copyright (C) 2022 Kenneth Chew <kenneth.c0@protonmail.com>
*
* This program is free software: you can redistribute it and/or modify
@ -31,11 +31,10 @@
* The initializer of the new class should have the side effect of starting the automatic updater. That is,
* once the class is initialized, the program should automatically check for updates if necessary.
*/
class ExternalUpdater : public QObject
{
class ExternalUpdater : public QObject {
Q_OBJECT
public:
public:
/*!
* Check for updates manually, showing the user a progress bar and an alert if no updates are found.
*/
@ -71,7 +70,7 @@ public:
*/
virtual void setBetaAllowed(bool allowed) = 0;
signals:
signals:
/*!
* Emits whenever the user's ability to check for updates changes.
*
@ -84,4 +83,4 @@ signals:
void canCheckForUpdatesChanged(bool canCheck);
};
#endif //LAUNCHER_EXTERNALUPDATER_H
#endif // LAUNCHER_EXTERNALUPDATER_H

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-3.0-only
/*
* PolyMC - Minecraft Launcher
* Prism Launcher - Minecraft Launcher
* Copyright (C) 2022 Kenneth Chew <kenneth.c0@protonmail.com>
*
* This program is free software: you can redistribute it and/or modify
@ -26,11 +26,10 @@
/*!
* An implementation for the updater on macOS that uses the Sparkle framework.
*/
class MacSparkleUpdater : public ExternalUpdater
{
class MacSparkleUpdater : public ExternalUpdater {
Q_OBJECT
public:
public:
/*!
* Start the Sparkle updater, which automatically checks for updates if necessary.
*/
@ -115,10 +114,10 @@ public:
*/
void setBetaAllowed(bool allowed) override;
private:
private:
class Private;
Private *priv;
Private* priv;
};
#endif //LAUNCHER_MACSPARKLEUPDATER_H
#endif // LAUNCHER_MACSPARKLEUPDATER_H

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-3.0-only
/*
* PolyMC - Minecraft Launcher
* Prism Launcher - Minecraft Launcher
* Copyright (C) 2022 Kenneth Chew <kenneth.c0@protonmail.com>
*
* This program is free software: you can redistribute it and/or modify
@ -28,7 +28,7 @@
@property(nonatomic, readonly) SPUUpdater* updater;
/// A callback to run when the state of `canCheckForUpdates` for the `updater` changes.
@property(nonatomic, copy) void (^callback) (bool);
@property(nonatomic, copy) void (^callback)(bool);
- (id)initWithUpdater:(SPUUpdater*)updater;
@ -36,8 +36,7 @@
@implementation UpdaterObserver
- (id)initWithUpdater:(SPUUpdater*)updater
{
- (id)initWithUpdater:(SPUUpdater*)updater {
self = [super init];
_updater = updater;
[self addObserver:self forKeyPath:@"updater.canCheckForUpdates" options:NSKeyValueObservingOptionNew context:nil];
@ -45,13 +44,11 @@
return self;
}
- (void)observeValueForKeyPath:(NSString *)keyPath
- (void)observeValueForKeyPath:(NSString*)keyPath
ofObject:(id)object
change:(NSDictionary<NSKeyValueChangeKey, id> *)change
context:(void *)context
{
if ([keyPath isEqualToString:@"updater.canCheckForUpdates"])
{
change:(NSDictionary<NSKeyValueChangeKey, id>*)change
context:(void*)context {
if ([keyPath isEqualToString:@"updater.canCheckForUpdates"]) {
bool canCheck = [change[NSKeyValueChangeNewKey] boolValue];
self.callback(canCheck);
}
@ -59,34 +56,29 @@
@end
@interface UpdaterDelegate : NSObject <SPUUpdaterDelegate>
@property(nonatomic, copy) NSSet<NSString *> *allowedChannels;
@property(nonatomic, copy) NSSet<NSString*>* allowedChannels;
@end
@implementation UpdaterDelegate
- (NSSet<NSString *> *)allowedChannelsForUpdater:(SPUUpdater *)updater
{
- (NSSet<NSString*>*)allowedChannelsForUpdater:(SPUUpdater*)updater {
return _allowedChannels;
}
@end
class MacSparkleUpdater::Private
{
public:
SPUStandardUpdaterController *updaterController;
UpdaterObserver *updaterObserver;
UpdaterDelegate *updaterDelegate;
NSAutoreleasePool *autoReleasePool;
class MacSparkleUpdater::Private {
public:
SPUStandardUpdaterController* updaterController;
UpdaterObserver* updaterObserver;
UpdaterDelegate* updaterDelegate;
NSAutoreleasePool* autoReleasePool;
};
MacSparkleUpdater::MacSparkleUpdater()
{
MacSparkleUpdater::MacSparkleUpdater() {
priv = new MacSparkleUpdater::Private();
// Enable Cocoa's memory management.
@ -98,18 +90,17 @@ MacSparkleUpdater::MacSparkleUpdater()
// Controller is the interface for actually doing the updates.
priv->updaterController = [[SPUStandardUpdaterController alloc] initWithStartingUpdater:true
updaterDelegate:priv->updaterDelegate
userDriverDelegate:nil];
updaterDelegate:priv->updaterDelegate
userDriverDelegate:nil];
priv->updaterObserver = [[UpdaterObserver alloc] initWithUpdater:priv->updaterController.updater];
// Use KVO to run a callback that emits a Qt signal when `canCheckForUpdates` changes, so the UI can respond accordingly.
priv->updaterObserver.callback = ^(bool canCheck) {
emit canCheckForUpdatesChanged(canCheck);
emit canCheckForUpdatesChanged(canCheck);
};
}
MacSparkleUpdater::~MacSparkleUpdater()
{
MacSparkleUpdater::~MacSparkleUpdater() {
[priv->updaterObserver removeObserver:priv->updaterObserver forKeyPath:@"updater.canCheckForUpdates"];
[priv->updaterController release];
@ -119,77 +110,63 @@ MacSparkleUpdater::~MacSparkleUpdater()
delete priv;
}
void MacSparkleUpdater::checkForUpdates()
{
void MacSparkleUpdater::checkForUpdates() {
[priv->updaterController checkForUpdates:nil];
}
bool MacSparkleUpdater::getAutomaticallyChecksForUpdates()
{
bool MacSparkleUpdater::getAutomaticallyChecksForUpdates() {
return priv->updaterController.updater.automaticallyChecksForUpdates;
}
double MacSparkleUpdater::getUpdateCheckInterval()
{
double MacSparkleUpdater::getUpdateCheckInterval() {
return priv->updaterController.updater.updateCheckInterval;
}
QSet<QString> MacSparkleUpdater::getAllowedChannels()
{
QSet<QString> MacSparkleUpdater::getAllowedChannels() {
// Convert NSSet<NSString> -> QSet<QString>
__block QSet<QString> channels;
[priv->updaterDelegate.allowedChannels enumerateObjectsUsingBlock:^(NSString *channel, BOOL *stop)
{
channels.insert(QString::fromNSString(channel));
[priv->updaterDelegate.allowedChannels enumerateObjectsUsingBlock:^(NSString* channel, BOOL* stop) {
channels.insert(QString::fromNSString(channel));
}];
return channels;
}
bool MacSparkleUpdater::getBetaAllowed()
{
bool MacSparkleUpdater::getBetaAllowed() {
return getAllowedChannels().contains("beta");
}
void MacSparkleUpdater::setAutomaticallyChecksForUpdates(bool check)
{
priv->updaterController.updater.automaticallyChecksForUpdates = check ? YES : NO; // make clang-tidy happy
void MacSparkleUpdater::setAutomaticallyChecksForUpdates(bool check) {
priv->updaterController.updater.automaticallyChecksForUpdates = check ? YES : NO; // make clang-tidy happy
}
void MacSparkleUpdater::setUpdateCheckInterval(double seconds)
{
void MacSparkleUpdater::setUpdateCheckInterval(double seconds) {
priv->updaterController.updater.updateCheckInterval = seconds;
}
void MacSparkleUpdater::clearAllowedChannels()
{
void MacSparkleUpdater::clearAllowedChannels() {
priv->updaterDelegate.allowedChannels = [NSSet set];
}
void MacSparkleUpdater::setAllowedChannel(const QString &channel)
{
if (channel.isEmpty())
{
void MacSparkleUpdater::setAllowedChannel(const QString& channel) {
if (channel.isEmpty()) {
clearAllowedChannels();
return;
}
NSSet<NSString *> *nsChannels = [NSSet setWithObject:channel.toNSString()];
NSSet<NSString*>* nsChannels = [NSSet setWithObject:channel.toNSString()];
priv->updaterDelegate.allowedChannels = nsChannels;
}
void MacSparkleUpdater::setAllowedChannels(const QSet<QString> &channels)
{
if (channels.isEmpty())
{
void MacSparkleUpdater::setAllowedChannels(const QSet<QString>& channels) {
if (channels.isEmpty()) {
clearAllowedChannels();
return;
}
QString channelsConfig = "";
// Convert QSet<QString> -> NSSet<NSString>
NSMutableSet<NSString *> *nsChannels = [NSMutableSet setWithCapacity:channels.count()];
foreach (const QString channel, channels)
{
NSMutableSet<NSString*>* nsChannels = [NSMutableSet setWithCapacity:channels.count()];
foreach (const QString channel, channels) {
[nsChannels addObject:channel.toNSString()];
channelsConfig += channel + " ";
}
@ -197,14 +174,10 @@ void MacSparkleUpdater::setAllowedChannels(const QSet<QString> &channels)
priv->updaterDelegate.allowedChannels = nsChannels;
}
void MacSparkleUpdater::setBetaAllowed(bool allowed)
{
if (allowed)
{
void MacSparkleUpdater::setBetaAllowed(bool allowed) {
if (allowed) {
setAllowedChannel("beta");
}
else
{
} else {
clearAllowedChannels();
}
}