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,30 +1,40 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2017 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#pragma once
#include <string>
#include <boost/signals2.hpp>
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:
/**
* Emit this signal if a new version of the software has been downloaded
* 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,34 +1,37 @@
/*
- * Copyright (c) 2010-2016 Isode Limited.
+ * Copyright (c) 2010-2017 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#pragma once
#include <memory>
#include <string>
#include <SwifTools/AutoUpdater/AutoUpdater.h>
namespace Swift {
/**
* @brief The SparkleAutoUpdater class provides integration with Sparkle.
* This enables automatic silent background updates. If using this in Qt you
* need to emit a NSApplicationWillTerminateNotification before you quit
* the application.
*/
class SparkleAutoUpdater : public AutoUpdater {
public:
SparkleAutoUpdater(const std::string& appcastFeed);
~SparkleAutoUpdater();
void setAppcastFeed(const std::string& appcastFeed);
void checkForUpdates();
- bool recommendRestartToUpdate();
+ State getCurrentState();
+
+ private:
+ void setCurrentState(State updatedState);
private:
class Private;
const std::unique_ptr<Private> d;
};
}
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,62 +1,70 @@
/*
- * Copyright (c) 2016 Isode Limited.
+ * Copyright (c) 2016-2017 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#include <SwifTools/AutoUpdater/SparkleAutoUpdater.h>
#include <Cocoa/Cocoa.h>
#include <Sparkle/Sparkle.h>
#include <SwifTools/AutoUpdater/SparkleAutoUpdaterDelegate.h>
#include <SwifTools/Cocoa/CocoaUtil.h>
namespace Swift {
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()) {
d->updater = [SUUpdater sharedUpdater];
[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()];
[d->updater setAutomaticallyChecksForUpdates: true];
// Automatically check for an update after a day.
[d->updater setUpdateCheckInterval: 86400];
[d->updater setAutomaticallyDownloadsUpdates: true];
- NSURL* nsurl = [NSURL URLWithString: std2NSString(appcastFeed)];
- [d->updater setFeedURL: nsurl];
+ setAppcastFeed(appcastFeed);
}
SparkleAutoUpdater::~SparkleAutoUpdater() {
[d->updater release];
}
void SparkleAutoUpdater::setAppcastFeed(const std::string& appcastFeed) {
NSURL* nsurl = [NSURL URLWithString: std2NSString(appcastFeed)];
[d->updater setFeedURL: nsurl];
}
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,35 +1,37 @@
/*
- * Copyright (c) 2016 Isode Limited.
+ * Copyright (c) 2016-2017 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
#pragma once
#include <functional>
#import <Cocoa/Cocoa.h>
#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;
- (void)updater:(SUUpdater *)updater didFindValidUpdate:(SUAppcastItem *)update;
- (id <SUVersionComparison>)versionComparatorForUpdater:(SUUpdater *)updater;
- (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;
- (void)updater:(SUUpdater *)updater didAbortWithError:(NSError *)error;
@end
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,57 +1,79 @@
/*
- * 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>
#include <Swiften/Base/Log.h>
#include <SwifTools/Cocoa/CocoaUtil.h>
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 {
(void)updater;
(void)update;
}
- (id <SUVersionComparison>)versionComparatorForUpdater:(SUUpdater *)updater {
(void)updater;
return nil;
}
- (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 {
(void)updater;
(void)update;
}
- (void)updater:(SUUpdater *)updater willInstallUpdateOnQuit:(SUAppcastItem *)item immediateInstallationInvocation:(NSInvocation *)invocation {
(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