diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2017-09-29 12:45:28 -0700 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2017-09-29 12:45:28 -0700 |
commit | 7b8832bc0ba1d287baae247307d3352da1371b55 (patch) | |
tree | 4c324aa2014a68b878c6e2b9c5cede3ef1e2f8b7 | |
parent | c8c9a5dc65c184f0c0acdc19411b4e7efc39fb99 (diff) | |
download | subsurface-7b8832bc0ba1d287baae247307d3352da1371b55.tar.gz |
[Facebook] fewer UI freezes while accessing facebook
Use signal / slots on the networkreply instead of freezing the event
loop.
Signed-off-by: Tomaz Canabrava <tcanabrava@kde.org>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r-- | desktop-widgets/plugins/facebook/facebookconnectwidget.cpp | 34 | ||||
-rw-r--r-- | desktop-widgets/plugins/facebook/facebookconnectwidget.h | 11 |
2 files changed, 32 insertions, 13 deletions
diff --git a/desktop-widgets/plugins/facebook/facebookconnectwidget.cpp b/desktop-widgets/plugins/facebook/facebookconnectwidget.cpp index 6ed02832b..de0fcb682 100644 --- a/desktop-widgets/plugins/facebook/facebookconnectwidget.cpp +++ b/desktop-widgets/plugins/facebook/facebookconnectwidget.cpp @@ -49,6 +49,7 @@ FacebookManager *FacebookManager::instance() FacebookManager::FacebookManager(QObject *parent) : QObject(parent) { + albumListUrl = QUrl("https://graph.facebook.com/me/albums?access_token=" + QString(prefs.facebook.access_token)); } static QString graphApi = QStringLiteral("https://graph.facebook.com/v2.10/"); @@ -98,14 +99,14 @@ void FacebookManager::logout() void FacebookManager::requestAlbumId() { - QUrl albumListUrl("https://graph.facebook.com/me/albums?access_token=" + QString(prefs.facebook.access_token)); QNetworkAccessManager *manager = new QNetworkAccessManager(); QNetworkReply *reply = manager->get(QNetworkRequest(albumListUrl)); + connect(reply, &QNetworkReply::finished, this, &FacebookManager::albumListReceived); +} - QEventLoop loop; - connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); - loop.exec(); - +void FacebookManager::albumListReceived() +{ + QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender()); QJsonDocument albumsDoc = QJsonDocument::fromJson(reply->readAll()); QJsonArray albumObj = albumsDoc.object().value("data").toArray(); auto fb = SettingsObjectWrapper::instance()->facebook; @@ -117,7 +118,12 @@ void FacebookManager::requestAlbumId() return; } } + // No album with the name we requested, create a new one. + createFacebookAlbum(); +} +void FacebookManager::createFacebookAlbum() +{ QUrlQuery params; params.addQueryItem("name", albumName ); params.addQueryItem("description", "Subsurface Album"); @@ -125,13 +131,19 @@ void FacebookManager::requestAlbumId() QNetworkRequest request(albumListUrl); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/octet-stream"); - reply = manager->post(request, params.query().toLocal8Bit()); - connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); - loop.exec(); - albumsDoc = QJsonDocument::fromJson(reply->readAll()); + QNetworkAccessManager *manager = new QNetworkAccessManager(); + QNetworkReply *reply = manager->post(request, params.query().toLocal8Bit()); + connect(reply, &QNetworkReply::finished, this, &FacebookManager::facebookAlbumCreated); +} + +void FacebookManager::facebookAlbumCreated() +{ + QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender()); + QJsonDocument albumsDoc = QJsonDocument::fromJson(reply->readAll()); QJsonObject album = albumsDoc.object(); if (album.contains("id")) { + auto fb = SettingsObjectWrapper::instance()->facebook; fb->setAlbumId(album.value("id").toString()); return; } @@ -195,7 +207,9 @@ void FacebookManager::sendDive() data.append("Content-Disposition: form-data; name=\"action\"\r\n\r\n"); data.append(graphApi + "\r\n"); data.append("--" + bound + "\r\n"); //according to rfc 1867 - data.append("Content-Disposition: form-data; name=\"uploaded\"; filename=\"" + QString::number(qrand()) + ".png\"\r\n"); //name of the input is "uploaded" in my form, next one is a file name. + + //name of the input is "uploaded" in my form, next one is a file name. + data.append("Content-Disposition: form-data; name=\"uploaded\"; filename=\"" + QString::number(qrand()) + ".png\"\r\n"); data.append("Content-Type: image/jpeg\r\n\r\n"); //data type data.append(bytes); //let's read the file data.append("\r\n"); diff --git a/desktop-widgets/plugins/facebook/facebookconnectwidget.h b/desktop-widgets/plugins/facebook/facebookconnectwidget.h index 1c6e40e07..c47f4be66 100644 --- a/desktop-widgets/plugins/facebook/facebookconnectwidget.h +++ b/desktop-widgets/plugins/facebook/facebookconnectwidget.h @@ -3,6 +3,7 @@ #define FACEBOOKCONNECTWIDGET_H #include <QDialog> +#include <QUrl> #ifdef USE_WEBENGINE class QWebEngineView; #else @@ -11,8 +12,8 @@ class QWebView; class QNetworkReply; namespace Ui { - class FacebookConnectWidget; - class SocialnetworksDialog; + class FacebookConnectWidget; + class SocialnetworksDialog; } class FacebookManager : public QObject @@ -33,10 +34,14 @@ public slots: void logout(); void setDesiredAlbumName(const QString& albumName); void sendDive(); - void uploadFinished(); + void uploadFinished(); + void albumListReceived(); + void createFacebookAlbum(); + void facebookAlbumCreated(); private: explicit FacebookManager(QObject *parent = 0); QString albumName; + QUrl albumListUrl; }; |