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:
@ -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
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user