mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
[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>
This commit is contained in:
parent
c8c9a5dc65
commit
7b8832bc0b
2 changed files with 32 additions and 13 deletions
|
@ -49,6 +49,7 @@ FacebookManager *FacebookManager::instance()
|
||||||
|
|
||||||
FacebookManager::FacebookManager(QObject *parent) : QObject(parent)
|
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/");
|
static QString graphApi = QStringLiteral("https://graph.facebook.com/v2.10/");
|
||||||
|
@ -98,14 +99,14 @@ void FacebookManager::logout()
|
||||||
|
|
||||||
void FacebookManager::requestAlbumId()
|
void FacebookManager::requestAlbumId()
|
||||||
{
|
{
|
||||||
QUrl albumListUrl("https://graph.facebook.com/me/albums?access_token=" + QString(prefs.facebook.access_token));
|
|
||||||
QNetworkAccessManager *manager = new QNetworkAccessManager();
|
QNetworkAccessManager *manager = new QNetworkAccessManager();
|
||||||
QNetworkReply *reply = manager->get(QNetworkRequest(albumListUrl));
|
QNetworkReply *reply = manager->get(QNetworkRequest(albumListUrl));
|
||||||
|
connect(reply, &QNetworkReply::finished, this, &FacebookManager::albumListReceived);
|
||||||
|
}
|
||||||
|
|
||||||
QEventLoop loop;
|
void FacebookManager::albumListReceived()
|
||||||
connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
|
{
|
||||||
loop.exec();
|
QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
|
||||||
|
|
||||||
QJsonDocument albumsDoc = QJsonDocument::fromJson(reply->readAll());
|
QJsonDocument albumsDoc = QJsonDocument::fromJson(reply->readAll());
|
||||||
QJsonArray albumObj = albumsDoc.object().value("data").toArray();
|
QJsonArray albumObj = albumsDoc.object().value("data").toArray();
|
||||||
auto fb = SettingsObjectWrapper::instance()->facebook;
|
auto fb = SettingsObjectWrapper::instance()->facebook;
|
||||||
|
@ -117,7 +118,12 @@ void FacebookManager::requestAlbumId()
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// No album with the name we requested, create a new one.
|
||||||
|
createFacebookAlbum();
|
||||||
|
}
|
||||||
|
|
||||||
|
void FacebookManager::createFacebookAlbum()
|
||||||
|
{
|
||||||
QUrlQuery params;
|
QUrlQuery params;
|
||||||
params.addQueryItem("name", albumName );
|
params.addQueryItem("name", albumName );
|
||||||
params.addQueryItem("description", "Subsurface Album");
|
params.addQueryItem("description", "Subsurface Album");
|
||||||
|
@ -125,13 +131,19 @@ void FacebookManager::requestAlbumId()
|
||||||
|
|
||||||
QNetworkRequest request(albumListUrl);
|
QNetworkRequest request(albumListUrl);
|
||||||
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/octet-stream");
|
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();
|
QJsonObject album = albumsDoc.object();
|
||||||
if (album.contains("id")) {
|
if (album.contains("id")) {
|
||||||
|
auto fb = SettingsObjectWrapper::instance()->facebook;
|
||||||
fb->setAlbumId(album.value("id").toString());
|
fb->setAlbumId(album.value("id").toString());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -195,7 +207,9 @@ void FacebookManager::sendDive()
|
||||||
data.append("Content-Disposition: form-data; name=\"action\"\r\n\r\n");
|
data.append("Content-Disposition: form-data; name=\"action\"\r\n\r\n");
|
||||||
data.append(graphApi + "\r\n");
|
data.append(graphApi + "\r\n");
|
||||||
data.append("--" + bound + "\r\n"); //according to rfc 1867
|
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("Content-Type: image/jpeg\r\n\r\n"); //data type
|
||||||
data.append(bytes); //let's read the file
|
data.append(bytes); //let's read the file
|
||||||
data.append("\r\n");
|
data.append("\r\n");
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#define FACEBOOKCONNECTWIDGET_H
|
#define FACEBOOKCONNECTWIDGET_H
|
||||||
|
|
||||||
#include <QDialog>
|
#include <QDialog>
|
||||||
|
#include <QUrl>
|
||||||
#ifdef USE_WEBENGINE
|
#ifdef USE_WEBENGINE
|
||||||
class QWebEngineView;
|
class QWebEngineView;
|
||||||
#else
|
#else
|
||||||
|
@ -34,9 +35,13 @@ public slots:
|
||||||
void setDesiredAlbumName(const QString& albumName);
|
void setDesiredAlbumName(const QString& albumName);
|
||||||
void sendDive();
|
void sendDive();
|
||||||
void uploadFinished();
|
void uploadFinished();
|
||||||
|
void albumListReceived();
|
||||||
|
void createFacebookAlbum();
|
||||||
|
void facebookAlbumCreated();
|
||||||
private:
|
private:
|
||||||
explicit FacebookManager(QObject *parent = 0);
|
explicit FacebookManager(QObject *parent = 0);
|
||||||
QString albumName;
|
QString albumName;
|
||||||
|
QUrl albumListUrl;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue