From c037f89aaf77080ceecf3965e8a3daae69fb489b Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Mon, 23 Oct 2017 14:26:35 +0200 Subject: [PATCH] Work on getting attachments - gui. --- rssguard.pro | 9 ++-- src/network-web/downloader.cpp | 1 + src/services/gmail/gmailserviceroot.cpp | 23 ++++----- .../gmail/gui/formdownloadattachment.cpp | 48 +++++++++++++++++ .../gmail/gui/formdownloadattachment.h | 26 ++++++++++ .../gmail/gui/formdownloadattachment.ui | 51 +++++++++++++++++++ 6 files changed, 141 insertions(+), 17 deletions(-) create mode 100755 src/services/gmail/gui/formdownloadattachment.cpp create mode 100755 src/services/gmail/gui/formdownloadattachment.h create mode 100755 src/services/gmail/gui/formdownloadattachment.ui diff --git a/rssguard.pro b/rssguard.pro index 13311f64a..86807c80e 100755 --- a/rssguard.pro +++ b/rssguard.pro @@ -333,7 +333,8 @@ HEADERS += src/core/feeddownloader.h \ src/services/tt-rss/ttrssfeed.h \ src/services/tt-rss/ttrssserviceentrypoint.h \ src/services/tt-rss/ttrssserviceroot.h \ - src/network-web/httpresponse.h + src/network-web/httpresponse.h \ + src/services/gmail/gui/formdownloadattachment.h SOURCES += src/core/feeddownloader.cpp \ src/core/feedsmodel.cpp \ @@ -465,7 +466,8 @@ SOURCES += src/core/feeddownloader.cpp \ src/services/tt-rss/ttrssfeed.cpp \ src/services/tt-rss/ttrssserviceentrypoint.cpp \ src/services/tt-rss/ttrssserviceroot.cpp \ - src/network-web/httpresponse.cpp + src/network-web/httpresponse.cpp \ + src/services/gmail/gui/formdownloadattachment.cpp mac { OBJECTIVE_SOURCES += src/miscellaneous/disablewindowtabbing.mm @@ -496,7 +498,8 @@ FORMS += src/gui/dialogs/formabout.ui \ src/services/owncloud/gui/formeditowncloudaccount.ui \ src/services/standard/gui/formstandardcategorydetails.ui \ src/services/standard/gui/formstandardimportexport.ui \ - src/services/tt-rss/gui/formeditttrssaccount.ui + src/services/tt-rss/gui/formeditttrssaccount.ui \ + src/services/gmail/gui/formdownloadattachment.ui equals(USE_WEBENGINE, true) { HEADERS += src/gui/locationlineedit.h \ diff --git a/src/network-web/downloader.cpp b/src/network-web/downloader.cpp index d59450e55..2a45910f4 100755 --- a/src/network-web/downloader.cpp +++ b/src/network-web/downloader.cpp @@ -261,6 +261,7 @@ void Downloader::runGetRequest(const QNetworkRequest& request) { m_activeReply->setProperty("protected", m_targetProtected); m_activeReply->setProperty("username", m_targetUsername); m_activeReply->setProperty("password", m_targetPassword); + connect(m_activeReply, &QNetworkReply::downloadProgress, this, &Downloader::progressInternal); connect(m_activeReply, &QNetworkReply::finished, this, &Downloader::finished); } diff --git a/src/services/gmail/gmailserviceroot.cpp b/src/services/gmail/gmailserviceroot.cpp index 7d42940a8..6d914a6cd 100755 --- a/src/services/gmail/gmailserviceroot.cpp +++ b/src/services/gmail/gmailserviceroot.cpp @@ -10,11 +10,11 @@ #include "services/gmail/definitions.h" #include "services/gmail/gmailentrypoint.h" #include "services/gmail/gmailfeed.h" +#include "services/gmail/gui/formdownloadattachment.h" #include "services/gmail/gui/formeditgmailaccount.h" #include "services/gmail/network/gmailnetworkfactory.h" -#include -#include +#include GmailServiceRoot::GmailServiceRoot(GmailNetworkFactory* network, RootItem* parent) : ServiceRoot(parent), CacheForServiceRoot(), m_serviceMenu(QList()), m_network(network) { @@ -108,20 +108,15 @@ bool GmailServiceRoot::downloadAttachmentOnMyOwn(const QUrl& url) const { QString str_url = url.toString(); QString attachment_id = str_url.mid(str_url.indexOf(QL1C('?')) + 1); QStringList parts = attachment_id.split(QL1S(GMAIL_ATTACHMENT_SEP)); - Downloader* down = network()->downloadAttachment(parts.at(1)); + QString file = QFileDialog::getSaveFileName(qApp->mainFormWidget(), tr("Select attachment destination file"), + qApp->homeFolder() + QDir::separator() + parts.at(0)); - connect(down, &Downloader::completed, [parts, down](QNetworkReply::NetworkError status, QByteArray contents) { - if (status == QNetworkReply::NetworkError::NoError) { - QString data = QJsonDocument::fromJson(contents).object()["data"].toString(); + if (!file.isEmpty()) { + Downloader* down = network()->downloadAttachment(parts.at(1)); + FormDownloadAttachment form(file, down, qApp->mainFormWidget()); - if (!data.isEmpty()) { - IOFactory::writeFile(parts.at(0), QByteArray::fromBase64(data.toLocal8Bit(), - QByteArray::Base64Option::Base64UrlEncoding)); - } - } - - down->deleteLater(); - }); + form.exec(); + } return true; } diff --git a/src/services/gmail/gui/formdownloadattachment.cpp b/src/services/gmail/gui/formdownloadattachment.cpp new file mode 100755 index 000000000..2458cb1d7 --- /dev/null +++ b/src/services/gmail/gui/formdownloadattachment.cpp @@ -0,0 +1,48 @@ +// For license of this file, see /LICENSE.md. + +#include "formdownloadattachment.h" + +#include "gui/guiutilities.h" +#include "miscellaneous/application.h" +#include "miscellaneous/iconfactory.h" +#include "miscellaneous/iofactory.h" +#include "network-web/downloader.h" + +#include +#include +#include + +FormDownloadAttachment::FormDownloadAttachment(const QString& target_file, Downloader* downloader, QWidget* parent) : QDialog(parent) { + m_ui.setupUi(this); + + GuiUtilities::applyDialogProperties(*this, qApp->icons()->fromTheme(QSL("mail-attachment")), tr("Downloading attachment...")); + + connect(m_ui.m_btnBox->button(QDialogButtonBox::StandardButton::Abort), &QPushButton::clicked, downloader, &Downloader::cancel); + connect(downloader, &Downloader::completed, [downloader, target_file](QNetworkReply::NetworkError status, QByteArray contents) { + if (status == QNetworkReply::NetworkError::NoError) { + QString data = QJsonDocument::fromJson(contents).object()["data"].toString(); + + if (!data.isEmpty()) { + IOFactory::writeFile(target_file, QByteArray::fromBase64(data.toLocal8Bit(), + QByteArray::Base64Option::Base64UrlEncoding)); + } + } + + downloader->deleteLater(); + }); + connect(downloader, &Downloader::completed, this, &FormDownloadAttachment::close); + connect(downloader, &Downloader::progress, [this](qint64 bytes_received, qint64 bytes_total) { + if (m_ui.m_progressBar->maximum() == 0) { + return; + } + + if (bytes_total <= 0) { + m_ui.m_progressBar->setMinimum(0); + m_ui.m_progressBar->setMaximum(0); + m_ui.m_progressBar->setValue(0); + } + else { + m_ui.m_progressBar->setValue(int((bytes_received * 100.0) / bytes_total)); + } + }); +} diff --git a/src/services/gmail/gui/formdownloadattachment.h b/src/services/gmail/gui/formdownloadattachment.h new file mode 100755 index 000000000..ec646cf6f --- /dev/null +++ b/src/services/gmail/gui/formdownloadattachment.h @@ -0,0 +1,26 @@ +// For license of this file, see /LICENSE.md. + +#ifndef FORMDOWNLOADATTACHMENT_H +#define FORMDOWNLOADATTACHMENT_H + +#include + +#include "ui_formdownloadattachment.h" + +namespace Ui { + class FormDownloadAttachment; +} + +class Downloader; + +class FormDownloadAttachment : public QDialog { + Q_OBJECT + + public: + explicit FormDownloadAttachment(const QString& target_file, Downloader* downloader, QWidget* parent = nullptr); + + private: + Ui::FormDownloadAttachment m_ui; +}; + +#endif // FORMDOWNLOADATTACHMENT_H diff --git a/src/services/gmail/gui/formdownloadattachment.ui b/src/services/gmail/gui/formdownloadattachment.ui new file mode 100755 index 000000000..cf9936107 --- /dev/null +++ b/src/services/gmail/gui/formdownloadattachment.ui @@ -0,0 +1,51 @@ + + + FormDownloadAttachment + + + + 0 + 0 + 275 + 106 + + + + Dialog + + + + + + 0 + + + + + + + Qt::Vertical + + + + 20 + 100 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Abort + + + + + + + +