Work on getting attachments - gui.

This commit is contained in:
Martin Rotter 2017-10-23 14:26:35 +02:00
parent fc1f821144
commit c037f89aaf
6 changed files with 141 additions and 17 deletions

View File

@ -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 \

View File

@ -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);
}

View File

@ -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 <QJsonDocument>
#include <QJsonObject>
#include <QFileDialog>
GmailServiceRoot::GmailServiceRoot(GmailNetworkFactory* network, RootItem* parent) : ServiceRoot(parent),
CacheForServiceRoot(), m_serviceMenu(QList<QAction*>()), 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;
}

View File

@ -0,0 +1,48 @@
// For license of this file, see <object-root-folder>/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 <QDialogButtonBox>
#include <QJsonDocument>
#include <QJsonObject>
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));
}
});
}

View File

@ -0,0 +1,26 @@
// For license of this file, see <object-root-folder>/LICENSE.md.
#ifndef FORMDOWNLOADATTACHMENT_H
#define FORMDOWNLOADATTACHMENT_H
#include <QDialog>
#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

View File

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>FormDownloadAttachment</class>
<widget class="QDialog" name="FormDownloadAttachment">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>275</width>
<height>106</height>
</rect>
</property>
<property name="windowTitle">
<string>Dialog</string>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0" colspan="2">
<widget class="QProgressBar" name="m_progressBar">
<property name="value">
<number>0</number>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>100</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="0" colspan="2">
<widget class="QDialogButtonBox" name="m_btnBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Abort</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>