summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'SwifTools/AutoUpdater')
-rw-r--r--SwifTools/AutoUpdater/AutoUpdater.h16
-rw-r--r--SwifTools/AutoUpdater/SparkleAutoUpdater.h7
-rw-r--r--SwifTools/AutoUpdater/SparkleAutoUpdater.mm30
-rw-r--r--SwifTools/AutoUpdater/SparkleAutoUpdaterDelegate.h12
-rw-r--r--SwifTools/AutoUpdater/SparkleAutoUpdaterDelegate.mm32
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