From 6ffc2c0a8d7cd399980ec1b4fbcc0e25c7c16419 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Tue, 9 Apr 2019 10:12:38 +0200 Subject: [PATCH] fix gmail attachment download --- src/gui/messagetextbrowser.cpp | 2 -- src/gui/messagetextbrowser.h | 4 ++-- src/services/gmail/definitions.h | 2 +- src/services/gmail/gmailserviceroot.cpp | 10 ++++++---- .../gmail/network/gmailnetworkfactory.cpp | 17 ++++++++++------- .../gmail/network/gmailnetworkfactory.h | 2 +- 6 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/gui/messagetextbrowser.cpp b/src/gui/messagetextbrowser.cpp index 3924ba0eb..2e91b2cc5 100755 --- a/src/gui/messagetextbrowser.cpp +++ b/src/gui/messagetextbrowser.cpp @@ -8,8 +8,6 @@ MessageTextBrowser::MessageTextBrowser(QWidget* parent) : QTextBrowser(parent) {} -MessageTextBrowser::~MessageTextBrowser() {} - QVariant MessageTextBrowser::loadResource(int type, const QUrl& name) { Q_UNUSED(name) diff --git a/src/gui/messagetextbrowser.h b/src/gui/messagetextbrowser.h index 1a400fb0e..234208705 100755 --- a/src/gui/messagetextbrowser.h +++ b/src/gui/messagetextbrowser.h @@ -9,8 +9,8 @@ class MessageTextBrowser : public QTextBrowser { Q_OBJECT public: - explicit MessageTextBrowser(QWidget* parent = 0); - virtual ~MessageTextBrowser(); + explicit MessageTextBrowser(QWidget* parent = nullptr); + virtual ~MessageTextBrowser() = default; QVariant loadResource(int type, const QUrl& name); diff --git a/src/services/gmail/definitions.h b/src/services/gmail/definitions.h index 8ddf31067..4322d98fa 100755 --- a/src/services/gmail/definitions.h +++ b/src/services/gmail/definitions.h @@ -8,7 +8,7 @@ #define GMAIL_OAUTH_SCOPE "https://mail.google.com/" #define GMAIL_API_BATCH_UPD_LABELS "https://www.googleapis.com/gmail/v1/users/me/messages/batchModify" -#define GMAIL_API_GET_ATTACHMENT "https://www.googleapis.com/gmail/v1/users/me/messages/%20/attachments/" +#define GMAIL_API_GET_ATTACHMENT "https://www.googleapis.com/gmail/v1/users/me/messages/%1/attachments/%2" #define GMAIL_API_LABELS_LIST "https://www.googleapis.com/gmail/v1/users/me/labels" #define GMAIL_API_MSGS_LIST "https://www.googleapis.com/gmail/v1/users/me/messages" #define GMAIL_API_BATCH "https://www.googleapis.com/batch" diff --git a/src/services/gmail/gmailserviceroot.cpp b/src/services/gmail/gmailserviceroot.cpp index 9c99050ab..a882bbaa5 100755 --- a/src/services/gmail/gmailserviceroot.cpp +++ b/src/services/gmail/gmailserviceroot.cpp @@ -118,14 +118,16 @@ bool GmailServiceRoot::downloadAttachmentOnMyOwn(const QUrl& url) const { QString file = QFileDialog::getSaveFileName(qApp->mainFormWidget(), tr("Select attachment destination file"), qApp->homeFolder() + QDir::separator() + parts.at(0)); - if (!file.isEmpty()) { - Downloader* down = network()->downloadAttachment(parts.at(1)); + if (!file.isEmpty() && parts.size() == 3) { + Downloader* down = network()->downloadAttachment(parts.at(1), parts.at(2)); FormDownloadAttachment form(file, down, qApp->mainFormWidget()); form.exec(); + return true; + } + else { + return false; } - - return true; } QList GmailServiceRoot::serviceMenu() { diff --git a/src/services/gmail/network/gmailnetworkfactory.cpp b/src/services/gmail/network/gmailnetworkfactory.cpp index 4b2655f33..90f08a797 100755 --- a/src/services/gmail/network/gmailnetworkfactory.cpp +++ b/src/services/gmail/network/gmailnetworkfactory.cpp @@ -72,20 +72,21 @@ void GmailNetworkFactory::setUsername(const QString& username) { m_username = username; } -Downloader* GmailNetworkFactory::downloadAttachment(const QString& attachment_id) { +Downloader* GmailNetworkFactory::downloadAttachment(const QString& msg_id, const QString& attachment_id) { Downloader* downloader = new Downloader(); QString bearer = m_oauth2->bearer().toLocal8Bit(); if (bearer.isEmpty()) { return nullptr; } + else { + QString target_url = QString(GMAIL_API_GET_ATTACHMENT).arg(msg_id, attachment_id); - QString target_url = QString(GMAIL_API_GET_ATTACHMENT) + attachment_id; + downloader->appendRawHeader(QString(HTTP_HEADERS_AUTHORIZATION).toLocal8Bit(), bearer.toLocal8Bit()); + downloader->downloadFile(target_url); - downloader->appendRawHeader(QString(HTTP_HEADERS_AUTHORIZATION).toLocal8Bit(), bearer.toLocal8Bit()); - downloader->downloadFile(target_url); - - return downloader; + return downloader; + } } QList GmailNetworkFactory::messages(const QString& stream_id, Feed::Status& error) { @@ -356,7 +357,9 @@ bool GmailNetworkFactory::fillFullMessage(Message& msg, const QJsonObject& json, } else if (!filename.isEmpty()) { // We have attachment. - msg.m_enclosures.append(Enclosure(filename + QL1S(GMAIL_ATTACHMENT_SEP) + body["attachmentId"].toString(), + msg.m_enclosures.append(Enclosure(filename + + QL1S(GMAIL_ATTACHMENT_SEP) + msg.m_customId + + QL1S(GMAIL_ATTACHMENT_SEP) + body["attachmentId"].toString(), filename + QString(" (%1 KB)").arg(QString::number(body["size"].toInt() / 1000.0)))); } } diff --git a/src/services/gmail/network/gmailnetworkfactory.h b/src/services/gmail/network/gmailnetworkfactory.h index eef7ecdfc..f6f207e8d 100755 --- a/src/services/gmail/network/gmailnetworkfactory.h +++ b/src/services/gmail/network/gmailnetworkfactory.h @@ -39,7 +39,7 @@ class GmailNetworkFactory : public QObject { // Returned items do not have primary IDs assigned. //RootItem* feedsCategories(); - Downloader* downloadAttachment(const QString& attachment_id); + Downloader* downloadAttachment(const QString& msg_id, const QString& attachment_id); QList messages(const QString& stream_id, Feed::Status& error); void markMessagesRead(RootItem::ReadStatus status, const QStringList& custom_ids, bool async = true);