From 748d88d993fb56ecd97e14b8e7c7b6c49f11c410 Mon Sep 17 00:00:00 2001 From: John Maguire Date: Fri, 27 Mar 2015 14:28:55 +0100 Subject: [PATCH] Ensure Amazon is connected before serving URLs. --- src/internet/amazon/amazonclouddrive.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/internet/amazon/amazonclouddrive.cpp b/src/internet/amazon/amazonclouddrive.cpp index 71d6fa6d2..f6d84dd04 100644 --- a/src/internet/amazon/amazonclouddrive.cpp +++ b/src/internet/amazon/amazonclouddrive.cpp @@ -10,6 +10,7 @@ #include "core/logging.h" #include "core/network.h" #include "core/player.h" +#include "core/waitforsignal.h" #include "internet/core/oauthenticator.h" #include "internet/amazon/amazonurlhandler.h" #include "library/librarybackend.h" @@ -49,6 +50,7 @@ bool AmazonCloudDrive::has_credentials() const { } QUrl AmazonCloudDrive::GetStreamingUrlFromSongId(const QUrl& url) { + EnsureConnected(); // Access token must be up to date. QUrl download_url( QString(kDownloadEndpoint).arg(content_url_).arg(url.path())); download_url.setFragment(QString("Bearer %1").arg(access_token_)); @@ -76,6 +78,11 @@ void AmazonCloudDrive::Connect() { } void AmazonCloudDrive::EnsureConnected() { + if (access_token_.isEmpty() || + QDateTime::currentDateTime().secsTo(expiry_time_) < 60) { + Connect(); + WaitForSignal(this, SIGNAL(Connected())); + } } void AmazonCloudDrive::ForgetCredentials() { @@ -98,7 +105,6 @@ void AmazonCloudDrive::ConnectFinished(OAuthenticator* oauth) { s.setValue("refresh_token", oauth->refresh_token()); access_token_ = oauth->access_token(); - // TODO: Amazon expiry time is only an hour so refresh this regularly. expiry_time_ = oauth->expiry_time(); FetchEndpoint(); @@ -125,9 +131,13 @@ void AmazonCloudDrive::FetchEndpointFinished(QNetworkReply* reply) { s.beginGroup(kSettingsGroup); QString checkpoint = s.value("checkpoint", "").toString(); RequestChanges(checkpoint); + + // We wait until we know the endpoint URLs before emitting Connected(); + emit Connected(); } void AmazonCloudDrive::RequestChanges(const QString& checkpoint) { + EnsureConnected(); QUrl url(QString(kChangesEndpoint).arg(metadata_url_)); QVariantMap data;