From d4e362ec890b7a8acd77032415d789558551d780 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Tue, 21 Jan 2014 22:50:46 +0800 Subject: [PATCH] Add error and update-not-available events for auto updater. --- browser/api/atom_api_auto_updater.cc | 10 ++++++++ browser/api/atom_api_auto_updater.h | 2 ++ browser/auto_updater_delegate.h | 6 +++++ browser/auto_updater_mac.mm | 37 +++++++++++++++++++--------- 4 files changed, 43 insertions(+), 12 deletions(-) diff --git a/browser/api/atom_api_auto_updater.cc b/browser/api/atom_api_auto_updater.cc index f7b5f8e3cfc..5360a3151fb 100644 --- a/browser/api/atom_api_auto_updater.cc +++ b/browser/api/atom_api_auto_updater.cc @@ -24,6 +24,16 @@ AutoUpdater::~AutoUpdater() { auto_updater::AutoUpdater::SetDelegate(NULL); } +void AutoUpdater::OnError(const std::string& error) { + base::ListValue args; + args.AppendString(error); + Emit("error", &args); +} + +void AutoUpdater::OnUpdateNotAvailable() { + Emit("update-not-available"); +} + void AutoUpdater::OnUpdateDownloaded(const std::string& release_notes, const std::string& release_name, const base::Time& release_date, diff --git a/browser/api/atom_api_auto_updater.h b/browser/api/atom_api_auto_updater.h index 55d44c4ebc2..2bb830c2767 100644 --- a/browser/api/atom_api_auto_updater.h +++ b/browser/api/atom_api_auto_updater.h @@ -25,6 +25,8 @@ class AutoUpdater : public EventEmitter, explicit AutoUpdater(v8::Handle wrapper); // AutoUpdaterDelegate implementations. + virtual void OnError(const std::string& error) OVERRIDE; + virtual void OnUpdateNotAvailable() OVERRIDE; virtual void OnUpdateDownloaded( const std::string& release_notes, const std::string& release_name, diff --git a/browser/auto_updater_delegate.h b/browser/auto_updater_delegate.h index ba6e4ec933f..063cc79d5e7 100644 --- a/browser/auto_updater_delegate.h +++ b/browser/auto_updater_delegate.h @@ -17,6 +17,12 @@ namespace auto_updater { class AutoUpdaterDelegate { public: + // An error happened. + virtual void OnError(const std::string& error) {} + + // There is no available update. + virtual void OnUpdateNotAvailable() {} + // There is a new update which has been downloaded. virtual void OnUpdateDownloaded(const std::string& release_notes, const std::string& release_name, diff --git a/browser/auto_updater_mac.mm b/browser/auto_updater_mac.mm index 45c6e264fb1..63747e9f3b5 100644 --- a/browser/auto_updater_mac.mm +++ b/browser/auto_updater_mac.mm @@ -35,19 +35,32 @@ void AutoUpdater::SetFeedURL(const std::string& feed) { NSURLRequest* urlRequest = [NSURLRequest requestWithURL:url]; g_updater = [[SQRLUpdater alloc] initWithUpdateRequest:urlRequest]; - // Subscribe to events. - [g_updater.updates subscribeNext:^(SQRLDownloadedUpdate* downloadedUpdate) { - AutoUpdaterDelegate* delegate = GetDelegate(); - if (!delegate) - return; + AutoUpdaterDelegate* delegate = GetDelegate(); + if (!delegate) + return; - SQRLUpdate* update = downloadedUpdate.update; - delegate->OnUpdateDownloaded( - base::SysNSStringToUTF8(update.releaseNotes), - base::SysNSStringToUTF8(update.releaseName), - base::Time::FromDoubleT(update.releaseDate.timeIntervalSince1970), - base::SysNSStringToUTF8(update.updateURL.absoluteString), - base::Bind(RelaunchToInstallUpdate)); + // Subscribe to events. + __block bool has_update = false; + [g_updater.updates subscribeNext:^(SQRLDownloadedUpdate* downloadedUpdate) { + has_update = true; + + // There is a new update that has been downloaded. + SQRLUpdate* update = downloadedUpdate.update; + delegate->OnUpdateDownloaded( + base::SysNSStringToUTF8(update.releaseNotes), + base::SysNSStringToUTF8(update.releaseName), + base::Time::FromDoubleT(update.releaseDate.timeIntervalSince1970), + base::SysNSStringToUTF8(update.updateURL.absoluteString), + base::Bind(RelaunchToInstallUpdate)); + } error:^(NSError* error) { + // Something wrong happened. + delegate->OnError(base::SysNSStringToUTF8(error.localizedDescription)); + } completed:^() { + // When the completed event is sent with no update, then we know there + // is no update available. + if (!has_update) + delegate->OnUpdateNotAvailable(); + has_update = false; }]; } }