diff options
Diffstat (limited to 'SwifTools/AutoUpdater')
-rw-r--r-- | SwifTools/AutoUpdater/AutoUpdater.h | 16 | ||||
-rw-r--r-- | SwifTools/AutoUpdater/SparkleAutoUpdater.h | 7 | ||||
-rw-r--r-- | SwifTools/AutoUpdater/SparkleAutoUpdater.mm | 30 | ||||
-rw-r--r-- | SwifTools/AutoUpdater/SparkleAutoUpdaterDelegate.h | 12 | ||||
-rw-r--r-- | SwifTools/AutoUpdater/SparkleAutoUpdaterDelegate.mm | 32 |
5 files changed, 71 insertions, 26 deletions
diff --git a/SwifTools/AutoUpdater/AutoUpdater.h b/SwifTools/AutoUpdater/AutoUpdater.h index 274bf50..a125229 100644 --- a/SwifTools/AutoUpdater/AutoUpdater.h +++ b/SwifTools/AutoUpdater/AutoUpdater.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2016 Isode Limited. + * Copyright (c) 2010-2017 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -13,11 +13,21 @@ namespace Swift { class AutoUpdater { public: + enum class State { + NotCheckedForUpdatesYet, + NoUpdateAvailable, + CheckingForUpdate, + ErrorCheckingForUpdate, + DownloadingUpdate, + RestartToInstallUpdate + }; + + public: virtual ~AutoUpdater(); virtual void setAppcastFeed(const std::string& appcastFeed) = 0; virtual void checkForUpdates() = 0; - virtual bool recommendRestartToUpdate() = 0; + virtual State getCurrentState() = 0; public: /** @@ -25,6 +35,6 @@ namespace Swift { * and the user needs to be notified so they can quit the app and start * the newer version. */ - boost::signals2::signal<void()> onSuggestRestartToUserToUpdate; + boost::signals2::signal<void(State)> onUpdateStateChanged; }; } diff --git a/SwifTools/AutoUpdater/SparkleAutoUpdater.h b/SwifTools/AutoUpdater/SparkleAutoUpdater.h index dd22e73..48b75e5 100644 --- a/SwifTools/AutoUpdater/SparkleAutoUpdater.h +++ b/SwifTools/AutoUpdater/SparkleAutoUpdater.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2016 Isode Limited. + * Copyright (c) 2010-2017 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -25,7 +25,10 @@ namespace Swift { void setAppcastFeed(const std::string& appcastFeed); void checkForUpdates(); - bool recommendRestartToUpdate(); + State getCurrentState(); + + private: + void setCurrentState(State updatedState); private: class Private; diff --git a/SwifTools/AutoUpdater/SparkleAutoUpdater.mm b/SwifTools/AutoUpdater/SparkleAutoUpdater.mm index 0c296ee..4cf5837 100644 --- a/SwifTools/AutoUpdater/SparkleAutoUpdater.mm +++ b/SwifTools/AutoUpdater/SparkleAutoUpdater.mm @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 Isode Limited. + * Copyright (c) 2016-2017 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -18,7 +18,7 @@ class SparkleAutoUpdater::Private { public: SUUpdater* updater; boost::intrusive_ptr<SparkleAutoUpdaterDelegate> delegate; - bool restartToUpdate = false; + State currentState = State::NotCheckedForUpdatesYet; }; SparkleAutoUpdater::SparkleAutoUpdater(const std::string& appcastFeed) : d(new Private()) { @@ -26,9 +26,8 @@ SparkleAutoUpdater::SparkleAutoUpdater(const std::string& appcastFeed) : d(new P [d->updater retain]; d->delegate = boost::intrusive_ptr<SparkleAutoUpdaterDelegate>([[SparkleAutoUpdaterDelegate alloc] init], false); - [d->delegate.get() setUpdateDownloadFinished: [&](){ - d->restartToUpdate = true; - onSuggestRestartToUserToUpdate(); + [d->delegate.get() setOnNewUpdateState: [&](AutoUpdater::State updatedState){ + setCurrentState(updatedState); }]; [d->updater setDelegate: d->delegate.get()]; @@ -37,8 +36,7 @@ SparkleAutoUpdater::SparkleAutoUpdater(const std::string& appcastFeed) : d(new P [d->updater setUpdateCheckInterval: 86400]; [d->updater setAutomaticallyDownloadsUpdates: true]; - NSURL* nsurl = [NSURL URLWithString: std2NSString(appcastFeed)]; - [d->updater setFeedURL: nsurl]; + setAppcastFeed(appcastFeed); } SparkleAutoUpdater::~SparkleAutoUpdater() { @@ -51,12 +49,22 @@ void SparkleAutoUpdater::setAppcastFeed(const std::string& appcastFeed) { } void SparkleAutoUpdater::checkForUpdates() { - [d->updater resetUpdateCycle]; - [d->updater checkForUpdatesInBackground]; + if (!(getCurrentState() == State::CheckingForUpdate || + getCurrentState() == State::DownloadingUpdate || + getCurrentState() == State::RestartToInstallUpdate)) { + setCurrentState(State::CheckingForUpdate); + [d->updater resetUpdateCycle]; + [d->updater checkForUpdatesInBackground]; + } +} + +void SparkleAutoUpdater::setCurrentState(AutoUpdater::State updatedState) { + d->currentState = updatedState; + onUpdateStateChanged(d->currentState); } -bool SparkleAutoUpdater::recommendRestartToUpdate() { - return d->restartToUpdate; +AutoUpdater::State SparkleAutoUpdater::getCurrentState() { + return d->currentState; } } diff --git a/SwifTools/AutoUpdater/SparkleAutoUpdaterDelegate.h b/SwifTools/AutoUpdater/SparkleAutoUpdaterDelegate.h index 8f408de..4aa236b 100644 --- a/SwifTools/AutoUpdater/SparkleAutoUpdaterDelegate.h +++ b/SwifTools/AutoUpdater/SparkleAutoUpdaterDelegate.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 Isode Limited. + * Copyright (c) 2016-2017 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -12,12 +12,10 @@ #import <Sparkle/Sparkle.h> -namespace Swift { - class SparkleAutoUpdater; -} +#include <SwifTools/AutoUpdater/AutoUpdater.h> @interface SparkleAutoUpdaterDelegate : NSObject<SUUpdaterDelegate> -@property (atomic) std::function< void ()> updateDownloadFinished; +@property (atomic) std::function< void (Swift::AutoUpdater::State)> onNewUpdateState; - (void)updater:(SUUpdater *)updater didFinishLoadingAppcast:(SUAppcast *)appcast; @@ -27,6 +25,10 @@ namespace Swift { - (void)updaterDidNotFindUpdate:(SUUpdater *)update; +- (void)updater:(SUUpdater *)updater willDownloadUpdate:(SUAppcastItem *)item withRequest:(NSMutableURLRequest *)request; + +- (void)updater:(SUUpdater *)updater failedToDownloadUpdate:(SUAppcastItem *)item error:(NSError *)error; + - (void)updater:(SUUpdater *)updater willInstallUpdate:(SUAppcastItem *)update; - (void)updater:(SUUpdater *)updater willInstallUpdateOnQuit:(SUAppcastItem *)item immediateInstallationInvocation:(NSInvocation *)invocation; diff --git a/SwifTools/AutoUpdater/SparkleAutoUpdaterDelegate.mm b/SwifTools/AutoUpdater/SparkleAutoUpdaterDelegate.mm index 6e832ba..be58355 100644 --- a/SwifTools/AutoUpdater/SparkleAutoUpdaterDelegate.mm +++ b/SwifTools/AutoUpdater/SparkleAutoUpdaterDelegate.mm @@ -1,10 +1,10 @@ /* - * Copyright (c) 2016 Isode Limited. + * Copyright (c) 2016-2017 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ -#import "SwifTools/AutoUpdater/SparkleAutoUpdaterDelegate.h" +#import <SwifTools/AutoUpdater/SparkleAutoUpdaterDelegate.h> #include <string> @@ -16,11 +16,12 @@ using namespace Swift; @implementation SparkleAutoUpdaterDelegate -@synthesize updateDownloadFinished; +@synthesize onNewUpdateState; - (void)updater:(SUUpdater *)updater didFinishLoadingAppcast:(SUAppcast *)appcast { (void)updater; (void)appcast; + onNewUpdateState(AutoUpdater::State::DownloadingUpdate); } - (void)updater:(SUUpdater *)updater didFindValidUpdate:(SUAppcastItem *)update { @@ -35,6 +36,21 @@ using namespace Swift; - (void)updaterDidNotFindUpdate:(SUUpdater *)updater { (void)updater; + onNewUpdateState(AutoUpdater::State::NoUpdateAvailable); +} + +- (void)updater:(SUUpdater *)updater willDownloadUpdate:(SUAppcastItem *)item withRequest:(NSMutableURLRequest *)request { + (void)updater; + (void)item; + (void)request; + onNewUpdateState(AutoUpdater::State::DownloadingUpdate); +} + +- (void)updater:(SUUpdater *)updater failedToDownloadUpdate:(SUAppcastItem *)item error:(NSError *)error { + (void)updater; + (void)item; + SWIFT_LOG(error) << ns2StdString([error localizedDescription]) << std::endl; + onNewUpdateState(AutoUpdater::State::ErrorCheckingForUpdate); } - (void)updater:(SUUpdater *)updater willInstallUpdate:(SUAppcastItem *)update { @@ -46,12 +62,18 @@ using namespace Swift; (void)updater; (void)item; (void)invocation; - updateDownloadFinished(); + onNewUpdateState(AutoUpdater::State::RestartToInstallUpdate); } - (void)updater:(SUUpdater *)updater didAbortWithError:(NSError *)error { (void)updater; - SWIFT_LOG(error) << ns2StdString([error localizedDescription]) << std::endl; + if ([error code] == SUNoUpdateError) { + onNewUpdateState(AutoUpdater::State::NoUpdateAvailable); + } + else { + SWIFT_LOG(error) << ns2StdString([error localizedDescription]) << std::endl; + onNewUpdateState(AutoUpdater::State::ErrorCheckingForUpdate); + } } @end |