diff --git a/src/librssguard/definitions/definitions.h b/src/librssguard/definitions/definitions.h index 8d6a1b3b4..77bf2aeb3 100755 --- a/src/librssguard/definitions/definitions.h +++ b/src/librssguard/definitions/definitions.h @@ -14,7 +14,7 @@ #define ARGUMENTS_LIST_SEPARATOR "\n" #define ADBLOCK_ADBLOCKED_PAGE "adblockedpage" -#define ADBLOCK_HOWTO_FILTERS "http://adblockplus.org/en/filters" +#define ADBLOCK_HOWTO_FILTERS "https://help.eyeo.com/en/adblockplus/how-to-write-filters" #define ADBLOCK_UPDATE_DAYS_INTERVAL 5 #define ADBLOCK_ICON_ACTIVE "adblock" #define ADBLOCK_ICON_DISABLED "adblock-disabled" @@ -78,6 +78,7 @@ #define HTTP_HEADERS_ACCEPT "Accept" #define HTTP_HEADERS_CONTENT_TYPE "Content-Type" +#define HTTP_HEADERS_CONTENT_LENGTH "Content-Length" #define HTTP_HEADERS_AUTHORIZATION "Authorization" #define HTTP_HEADERS_USER_AGENT "User-Agent" diff --git a/src/librssguard/gui/messagesview.cpp b/src/librssguard/gui/messagesview.cpp index 78f182e0d..99febc4e0 100644 --- a/src/librssguard/gui/messagesview.cpp +++ b/src/librssguard/gui/messagesview.cpp @@ -1,19 +1,4 @@ -// This file is part of RSS Guard. - -// Copyright (C) 2011-2017 by Martin Rotter -// -// RSS Guard is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// RSS Guard is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with RSS Guard. If not, see . +// For license of this file, see /LICENSE.md. #include "gui/messagesview.h" diff --git a/src/librssguard/gui/treewidget.cpp b/src/librssguard/gui/treewidget.cpp index d2c833fb5..b9715b446 100644 --- a/src/librssguard/gui/treewidget.cpp +++ b/src/librssguard/gui/treewidget.cpp @@ -1,4 +1,4 @@ -// This file is part of RSS Guard. +// For license of this file, see /LICENSE.md. // // Copyright (C) 2011-2017 by Martin Rotter diff --git a/src/librssguard/gui/treewidget.h b/src/librssguard/gui/treewidget.h index 2d47300bb..d4d6595cf 100644 --- a/src/librssguard/gui/treewidget.h +++ b/src/librssguard/gui/treewidget.h @@ -1,4 +1,4 @@ -// This file is part of RSS Guard. +// For license of this file, see /LICENSE.md. // // Copyright (C) 2011-2017 by Martin Rotter diff --git a/src/librssguard/network-web/adblock/adblockaddsubscriptiondialog.cpp b/src/librssguard/network-web/adblock/adblockaddsubscriptiondialog.cpp index 598093229..6cbee418c 100644 --- a/src/librssguard/network-web/adblock/adblockaddsubscriptiondialog.cpp +++ b/src/librssguard/network-web/adblock/adblockaddsubscriptiondialog.cpp @@ -1,4 +1,4 @@ -// This file is part of RSS Guard. +// For license of this file, see /LICENSE.md. // // Copyright (C) 2011-2017 by Martin Rotter diff --git a/src/librssguard/network-web/adblock/adblockaddsubscriptiondialog.h b/src/librssguard/network-web/adblock/adblockaddsubscriptiondialog.h index 146ea2286..990c8b37f 100644 --- a/src/librssguard/network-web/adblock/adblockaddsubscriptiondialog.h +++ b/src/librssguard/network-web/adblock/adblockaddsubscriptiondialog.h @@ -1,4 +1,4 @@ -// This file is part of RSS Guard. +// For license of this file, see /LICENSE.md. // // Copyright (C) 2011-2017 by Martin Rotter diff --git a/src/librssguard/network-web/adblock/adblockdialog.cpp b/src/librssguard/network-web/adblock/adblockdialog.cpp index cd8bd55dc..845cc0d1c 100644 --- a/src/librssguard/network-web/adblock/adblockdialog.cpp +++ b/src/librssguard/network-web/adblock/adblockdialog.cpp @@ -1,4 +1,4 @@ -// This file is part of RSS Guard. +// For license of this file, see /LICENSE.md. // // Copyright (C) 2011-2017 by Martin Rotter diff --git a/src/librssguard/network-web/adblock/adblockdialog.h b/src/librssguard/network-web/adblock/adblockdialog.h index b815e7568..f4ee3a041 100644 --- a/src/librssguard/network-web/adblock/adblockdialog.h +++ b/src/librssguard/network-web/adblock/adblockdialog.h @@ -1,4 +1,4 @@ -// This file is part of RSS Guard. +// For license of this file, see /LICENSE.md. // // Copyright (C) 2011-2017 by Martin Rotter diff --git a/src/librssguard/network-web/adblock/adblockicon.cpp b/src/librssguard/network-web/adblock/adblockicon.cpp index 2d7bcd247..6904b83f7 100644 --- a/src/librssguard/network-web/adblock/adblockicon.cpp +++ b/src/librssguard/network-web/adblock/adblockicon.cpp @@ -1,4 +1,4 @@ -// This file is part of RSS Guard. +// For license of this file, see /LICENSE.md. // // Copyright (C) 2011-2017 by Martin Rotter diff --git a/src/librssguard/network-web/adblock/adblockicon.h b/src/librssguard/network-web/adblock/adblockicon.h index b7bd6ce5e..52df382f2 100644 --- a/src/librssguard/network-web/adblock/adblockicon.h +++ b/src/librssguard/network-web/adblock/adblockicon.h @@ -1,4 +1,4 @@ -// This file is part of RSS Guard. +// For license of this file, see /LICENSE.md. // // Copyright (C) 2011-2017 by Martin Rotter diff --git a/src/librssguard/network-web/adblock/adblockmanager.cpp b/src/librssguard/network-web/adblock/adblockmanager.cpp index 5d27b410b..35aeb3e3f 100644 --- a/src/librssguard/network-web/adblock/adblockmanager.cpp +++ b/src/librssguard/network-web/adblock/adblockmanager.cpp @@ -1,4 +1,4 @@ -// This file is part of RSS Guard. +// For license of this file, see /LICENSE.md. // // Copyright (C) 2011-2017 by Martin Rotter diff --git a/src/librssguard/network-web/adblock/adblockmanager.h b/src/librssguard/network-web/adblock/adblockmanager.h index 33443f1e4..cc8243c5f 100644 --- a/src/librssguard/network-web/adblock/adblockmanager.h +++ b/src/librssguard/network-web/adblock/adblockmanager.h @@ -1,4 +1,4 @@ -// This file is part of RSS Guard. +// For license of this file, see /LICENSE.md. // // Copyright (C) 2011-2017 by Martin Rotter diff --git a/src/librssguard/network-web/adblock/adblockmatcher.cpp b/src/librssguard/network-web/adblock/adblockmatcher.cpp index 27766cc7c..01f5922bc 100644 --- a/src/librssguard/network-web/adblock/adblockmatcher.cpp +++ b/src/librssguard/network-web/adblock/adblockmatcher.cpp @@ -1,4 +1,4 @@ -// This file is part of RSS Guard. +// For license of this file, see /LICENSE.md. // // Copyright (C) 2011-2017 by Martin Rotter diff --git a/src/librssguard/network-web/adblock/adblockmatcher.h b/src/librssguard/network-web/adblock/adblockmatcher.h index b6f217645..9441e1041 100644 --- a/src/librssguard/network-web/adblock/adblockmatcher.h +++ b/src/librssguard/network-web/adblock/adblockmatcher.h @@ -1,4 +1,4 @@ -// This file is part of RSS Guard. +// For license of this file, see /LICENSE.md. // // Copyright (C) 2011-2017 by Martin Rotter diff --git a/src/librssguard/network-web/adblock/adblockrule.cpp b/src/librssguard/network-web/adblock/adblockrule.cpp index a2eeed39a..f6cf0b0a4 100644 --- a/src/librssguard/network-web/adblock/adblockrule.cpp +++ b/src/librssguard/network-web/adblock/adblockrule.cpp @@ -1,4 +1,4 @@ -// This file is part of RSS Guard. +// For license of this file, see /LICENSE.md. // // Copyright (C) 2011-2017 by Martin Rotter diff --git a/src/librssguard/network-web/adblock/adblockrule.h b/src/librssguard/network-web/adblock/adblockrule.h index 9edad3736..ee2ea22d1 100644 --- a/src/librssguard/network-web/adblock/adblockrule.h +++ b/src/librssguard/network-web/adblock/adblockrule.h @@ -1,4 +1,4 @@ -// This file is part of RSS Guard. +// For license of this file, see /LICENSE.md. // // Copyright (C) 2011-2017 by Martin Rotter diff --git a/src/librssguard/network-web/adblock/adblocksearchtree.cpp b/src/librssguard/network-web/adblock/adblocksearchtree.cpp index 232baa796..8a67dae92 100644 --- a/src/librssguard/network-web/adblock/adblocksearchtree.cpp +++ b/src/librssguard/network-web/adblock/adblocksearchtree.cpp @@ -1,4 +1,4 @@ -// This file is part of RSS Guard. +// For license of this file, see /LICENSE.md. // // Copyright (C) 2011-2017 by Martin Rotter diff --git a/src/librssguard/network-web/adblock/adblocksearchtree.h b/src/librssguard/network-web/adblock/adblocksearchtree.h index 11253a84c..321d55793 100644 --- a/src/librssguard/network-web/adblock/adblocksearchtree.h +++ b/src/librssguard/network-web/adblock/adblocksearchtree.h @@ -1,4 +1,4 @@ -// This file is part of RSS Guard. +// For license of this file, see /LICENSE.md. // // Copyright (C) 2011-2017 by Martin Rotter diff --git a/src/librssguard/network-web/adblock/adblocksubscription.cpp b/src/librssguard/network-web/adblock/adblocksubscription.cpp index 2a7318bea..0964f90c4 100644 --- a/src/librssguard/network-web/adblock/adblocksubscription.cpp +++ b/src/librssguard/network-web/adblock/adblocksubscription.cpp @@ -1,4 +1,4 @@ -// This file is part of RSS Guard. +// For license of this file, see /LICENSE.md. // // Copyright (C) 2011-2017 by Martin Rotter diff --git a/src/librssguard/network-web/adblock/adblocksubscription.h b/src/librssguard/network-web/adblock/adblocksubscription.h index b29365706..645b8d7a8 100644 --- a/src/librssguard/network-web/adblock/adblocksubscription.h +++ b/src/librssguard/network-web/adblock/adblocksubscription.h @@ -1,4 +1,4 @@ -// This file is part of RSS Guard. +// For license of this file, see /LICENSE.md. // // Copyright (C) 2011-2017 by Martin Rotter diff --git a/src/librssguard/network-web/adblock/adblocktreewidget.cpp b/src/librssguard/network-web/adblock/adblocktreewidget.cpp index 3521bb853..0ebf801a8 100644 --- a/src/librssguard/network-web/adblock/adblocktreewidget.cpp +++ b/src/librssguard/network-web/adblock/adblocktreewidget.cpp @@ -1,4 +1,4 @@ -// This file is part of RSS Guard. +// For license of this file, see /LICENSE.md. // // Copyright (C) 2011-2017 by Martin Rotter diff --git a/src/librssguard/network-web/adblock/adblocktreewidget.h b/src/librssguard/network-web/adblock/adblocktreewidget.h index 27d61bfe9..ccd3d4d45 100644 --- a/src/librssguard/network-web/adblock/adblocktreewidget.h +++ b/src/librssguard/network-web/adblock/adblocktreewidget.h @@ -1,4 +1,4 @@ -// This file is part of RSS Guard. +// For license of this file, see /LICENSE.md. // // Copyright (C) 2011-2017 by Martin Rotter diff --git a/src/librssguard/network-web/adblock/adblockurlinterceptor.cpp b/src/librssguard/network-web/adblock/adblockurlinterceptor.cpp index a2369d26c..46fc7fbe4 100644 --- a/src/librssguard/network-web/adblock/adblockurlinterceptor.cpp +++ b/src/librssguard/network-web/adblock/adblockurlinterceptor.cpp @@ -1,4 +1,4 @@ -// This file is part of RSS Guard. +// For license of this file, see /LICENSE.md. // // Copyright (C) 2011-2017 by Martin Rotter diff --git a/src/librssguard/network-web/adblock/adblockurlinterceptor.h b/src/librssguard/network-web/adblock/adblockurlinterceptor.h index 41fce7a3f..2d6fec8fe 100644 --- a/src/librssguard/network-web/adblock/adblockurlinterceptor.h +++ b/src/librssguard/network-web/adblock/adblockurlinterceptor.h @@ -1,4 +1,4 @@ -// This file is part of RSS Guard. +// For license of this file, see /LICENSE.md. // // Copyright (C) 2011-2017 by Martin Rotter diff --git a/src/librssguard/network-web/networkurlinterceptor.cpp b/src/librssguard/network-web/networkurlinterceptor.cpp index d92665309..11f83803e 100644 --- a/src/librssguard/network-web/networkurlinterceptor.cpp +++ b/src/librssguard/network-web/networkurlinterceptor.cpp @@ -1,4 +1,4 @@ -// This file is part of RSS Guard. +// For license of this file, see /LICENSE.md. // // Copyright (C) 2011-2017 by Martin Rotter diff --git a/src/librssguard/network-web/networkurlinterceptor.h b/src/librssguard/network-web/networkurlinterceptor.h index 840e4a8e3..620782503 100644 --- a/src/librssguard/network-web/networkurlinterceptor.h +++ b/src/librssguard/network-web/networkurlinterceptor.h @@ -1,4 +1,4 @@ -// This file is part of RSS Guard. +// For license of this file, see /LICENSE.md. // // Copyright (C) 2011-2017 by Martin Rotter diff --git a/src/librssguard/network-web/rssguardschemehandler.cpp b/src/librssguard/network-web/rssguardschemehandler.cpp index 582721787..edf2410bc 100644 --- a/src/librssguard/network-web/rssguardschemehandler.cpp +++ b/src/librssguard/network-web/rssguardschemehandler.cpp @@ -1,4 +1,4 @@ -// This file is part of RSS Guard. +// For license of this file, see /LICENSE.md. // // Copyright (C) 2011-2017 by Martin Rotter diff --git a/src/librssguard/network-web/rssguardschemehandler.h b/src/librssguard/network-web/rssguardschemehandler.h index f8bbd49b3..dd39c15ed 100644 --- a/src/librssguard/network-web/rssguardschemehandler.h +++ b/src/librssguard/network-web/rssguardschemehandler.h @@ -1,4 +1,4 @@ -// This file is part of RSS Guard. +// For license of this file, see /LICENSE.md. // // Copyright (C) 2011-2017 by Martin Rotter diff --git a/src/librssguard/network-web/urlinterceptor.h b/src/librssguard/network-web/urlinterceptor.h index a42f1baab..cc3ca9083 100644 --- a/src/librssguard/network-web/urlinterceptor.h +++ b/src/librssguard/network-web/urlinterceptor.h @@ -1,4 +1,4 @@ -// This file is part of RSS Guard. +// For license of this file, see /LICENSE.md. // // Copyright (C) 2011-2017 by Martin Rotter diff --git a/src/librssguard/services/gmail/definitions.h b/src/librssguard/services/gmail/definitions.h index e5e05696d..3c5cee25c 100644 --- a/src/librssguard/services/gmail/definitions.h +++ b/src/librssguard/services/gmail/definitions.h @@ -7,7 +7,7 @@ #define GMAIL_OAUTH_TOKEN_URL "https://accounts.google.com/o/oauth2/token" #define GMAIL_OAUTH_SCOPE "https://mail.google.com/" -#define GMAIL_API_SEND_MESSAGE "https://www.googleapis.com/upload/gmail/v1/users/me/messages/send?uploadType=multipart" +#define GMAIL_API_SEND_MESSAGE "https://www.googleapis.com/upload/gmail/v1/users/me/messages/send?uploadType=media" #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/%1/attachments/%2" #define GMAIL_API_LABELS_LIST "https://www.googleapis.com/gmail/v1/users/me/labels" diff --git a/src/librssguard/services/gmail/gui/emailrecipientcontrol.cpp b/src/librssguard/services/gmail/gui/emailrecipientcontrol.cpp index 4debf41dc..a7c1fcab3 100644 --- a/src/librssguard/services/gmail/gui/emailrecipientcontrol.cpp +++ b/src/librssguard/services/gmail/gui/emailrecipientcontrol.cpp @@ -8,6 +8,7 @@ #include "services/gmail/definitions.h" #include +#include #include #include @@ -20,6 +21,11 @@ EmailRecipientControl::EmailRecipientControl(const QString& recipient, QWidget* lay->setMargin(0); lay->setContentsMargins(0, 0, 0, 0); + m_cmbRecipientType->setFocusPolicy(Qt::FocusPolicy::NoFocus); + m_btnCloseMe->setFocusPolicy(Qt::FocusPolicy::NoFocus); + m_txtRecipient->setPlaceholderText(tr("E-mail address")); + m_txtRecipient->setText(recipient); + m_btnCloseMe->setToolTip("Remove this recipient."); m_btnCloseMe->setIcon(qApp->icons()->fromTheme(QSL("list-remove"))); @@ -43,3 +49,17 @@ QString EmailRecipientControl::recipientAddress() const { RecipientType EmailRecipientControl::recipientType() const { return RecipientType(m_cmbRecipientType->currentData(Qt::ItemDataRole::UserRole).toInt()); } + +void EmailRecipientControl::setPossibleRecipients(const QStringList& rec) { + + if (m_txtRecipient->completer() != nullptr) { + auto* old_cmpl = m_txtRecipient->completer(); + + m_txtRecipient->setCompleter(nullptr); + old_cmpl->deleteLater(); + } + + QCompleter* cmpl = new QCompleter(rec, m_txtRecipient); + + m_txtRecipient->setCompleter(cmpl); +} diff --git a/src/librssguard/services/gmail/gui/emailrecipientcontrol.h b/src/librssguard/services/gmail/gui/emailrecipientcontrol.h index 3431035a9..ef64383c1 100644 --- a/src/librssguard/services/gmail/gui/emailrecipientcontrol.h +++ b/src/librssguard/services/gmail/gui/emailrecipientcontrol.h @@ -21,6 +21,8 @@ class EmailRecipientControl : public QWidget { QString recipientAddress() const; RecipientType recipientType() const; + void setPossibleRecipients(const QStringList& rec); + signals: void removalRequested(); diff --git a/src/librssguard/services/gmail/gui/formaddeditemail.cpp b/src/librssguard/services/gmail/gui/formaddeditemail.cpp index 74d0f1b73..580f0f42d 100644 --- a/src/librssguard/services/gmail/gui/formaddeditemail.cpp +++ b/src/librssguard/services/gmail/gui/formaddeditemail.cpp @@ -22,6 +22,7 @@ FormAddEditEmail::FormAddEditEmail(GmailServiceRoot* root, QWidget* parent) : QD m_ui.m_btnAdder->setIcon(qApp->icons()->fromTheme(QSL("list-add"))); m_ui.m_btnAdder->setToolTip(tr("Add new recipient.")); + m_ui.m_btnAdder->setFocusPolicy(Qt::FocusPolicy::NoFocus); connect(m_ui.m_btnAdder, &PlainToolButton::clicked, this, [=]() { addRecipientRow(); @@ -96,8 +97,11 @@ void FormAddEditEmail::onOkClicked() { msg["Reply-To"] = rec_repl.join(',').toStdString(); } - msg["Subject"] = m_ui.m_txtSubject->text().toStdString(); + msg["Subject"] = QString("=?utf-8?B?%1?=") + .arg(QString(m_ui.m_txtSubject->text().toUtf8().toBase64(QByteArray::Base64Option::Base64UrlEncoding))) + .toStdString(); msg.set_plain(m_ui.m_txtMessage->toPlainText().toStdString()); + msg.set_header("Content-Type", "text/plain; charset=utf-8"); if (m_originalMessage == nullptr) { // Send completely new message. @@ -123,6 +127,13 @@ void FormAddEditEmail::addRecipientRow(const QString& recipient) { connect(mail_rec, &EmailRecipientControl::removalRequested, this, &FormAddEditEmail::removeRecipientRow); + try { + QStringList rec = m_root->network()->getAllRecipients(); + + mail_rec->setPossibleRecipients(rec); + } + catch (const ApplicationException& ex) {} + m_ui.m_layout->insertRow(m_ui.m_layout->count() - 5, mail_rec); } diff --git a/src/librssguard/services/gmail/network/gmailnetworkfactory.cpp b/src/librssguard/services/gmail/network/gmailnetworkfactory.cpp index 67f9f991c..7b3f43f78 100644 --- a/src/librssguard/services/gmail/network/gmailnetworkfactory.cpp +++ b/src/librssguard/services/gmail/network/gmailnetworkfactory.cpp @@ -52,7 +52,7 @@ void GmailNetworkFactory::setBatchSize(int batch_size) { m_batchSize = batch_size; } -void GmailNetworkFactory::sendEmail(const Mimesis::Message& msg) { +QString GmailNetworkFactory::sendEmail(const Mimesis::Message& msg) { QString bearer = m_oauth2->bearer().toLocal8Bit(); if (bearer.isEmpty()) { @@ -60,17 +60,39 @@ void GmailNetworkFactory::sendEmail(const Mimesis::Message& msg) { } QString rfc_email = QString::fromStdString(msg.to_string()); - QString json = QSL("{\"raw\": \"%1\"}").arg(QString(rfc_email.toUtf8().toBase64(QByteArray::Base64Option::Base64UrlEncoding))); - QByteArray input_data = json.toUtf8(); + QByteArray input_data = rfc_email.toUtf8(); QList> headers; + + headers.append(QPair(QString(HTTP_HEADERS_AUTHORIZATION).toLocal8Bit(), + m_oauth2->bearer().toLocal8Bit())); + headers.append(QPair(QString(HTTP_HEADERS_CONTENT_TYPE).toLocal8Bit(), + QString("message/rfc822").toLocal8Bit())); + QByteArray out; - auto xx = NetworkFactory::performNetworkOperation(GMAIL_API_SEND_MESSAGE, - DOWNLOAD_TIMEOUT, - input_data, - out, - QNetworkAccessManager::Operation::PostOperation, - headers); - int a = 5; + auto result = NetworkFactory::performNetworkOperation(GMAIL_API_SEND_MESSAGE, + DOWNLOAD_TIMEOUT, + input_data, + out, + QNetworkAccessManager::Operation::PostOperation, + headers); + + if (result.first != QNetworkReply::NetworkError::NoError) { + if (!out.isEmpty()) { + QJsonDocument doc = QJsonDocument::fromJson(out); + auto msg = doc.object()["error"].toObject()["message"].toString(); + + throw ApplicationException(msg); + } + else { + throw ApplicationException(QString::fromUtf8(out)); + } + } + else { + QJsonDocument doc = QJsonDocument::fromJson(out); + auto msg_id = doc.object()["id"].toString(); + + return msg_id; + } } void GmailNetworkFactory::initializeOauth() { @@ -393,6 +415,92 @@ bool GmailNetworkFactory::fillFullMessage(Message& msg, const QJsonObject& json, return true; } +QStringList GmailNetworkFactory::getAllRecipients() { + QString bearer = m_oauth2->bearer().toLocal8Bit(); + + if (bearer.isEmpty()) { + throw ApplicationException(tr("not logged-in")); + } + + QStringList recipients; + QList> headers; + + headers.append(QPair(QString(HTTP_HEADERS_AUTHORIZATION).toLocal8Bit(), + m_oauth2->bearer().toLocal8Bit())); + headers.append(QPair(QString(HTTP_HEADERS_CONTENT_TYPE).toLocal8Bit(), + QString(GMAIL_CONTENT_TYPE_JSON).toLocal8Bit())); + + int timeout = qApp->settings()->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)).toInt(); + QByteArray msg_list_data; + + // TODO: Cyklicky!! + auto list_res = NetworkFactory::performNetworkOperation(GMAIL_API_MSGS_LIST, + timeout, + QByteArray(), + msg_list_data, + QNetworkAccessManager::Operation::GetOperation, + headers); + + if (list_res.first != QNetworkReply::NetworkError::NoError) { + throw ApplicationException(tr("comm error when asking for recipients")); + } + + QJsonDocument json_list = QJsonDocument::fromJson(msg_list_data); + QStringList message_ids; + + for (const auto& msg_nod : json_list.object()["messages"].toArray()) { + message_ids.append(msg_nod.toObject()["id"].toString()); + } + + auto* multi = new QHttpMultiPart(); + + multi->setContentType(QHttpMultiPart::ContentType::MixedType); + + for (const QString& msg : message_ids) { + QHttpPart part; + + part.setRawHeader(HTTP_HEADERS_CONTENT_TYPE, GMAIL_CONTENT_TYPE_HTTP); + QString full_msg_endpoint = QString("GET /gmail/v1/users/me/messages/%1?metadataHeaders=From&metadataHeaders=To&format=metadata\r\n").arg(msg); + + part.setBody(full_msg_endpoint.toUtf8()); + multi->append(part); + } + + QList output; + + headers.removeLast(); + + NetworkResult res = NetworkFactory::performNetworkOperation(GMAIL_API_BATCH, + timeout, + multi, + output, + QNetworkAccessManager::Operation::PostOperation, + headers); + + if (res.first == QNetworkReply::NetworkError::NoError) { + // We parse each part of HTTP response (it contains HTTP headers and payload with msg full data). + for (const HttpResponse& part : output) { + QJsonObject msg_doc = QJsonDocument::fromJson(part.body().toUtf8()).object(); + auto headers = msg_doc["payload"].toObject()["headers"].toArray(); + + if (headers.size() >= 2) { + for (const auto& head : headers) { + auto val = head.toObject()["value"].toString(); + + if (!recipients.contains(val)) { + recipients.append(val); + } + } + } + } + + return recipients; + } + else { + throw ApplicationException(tr("comm error when asking for recipients")); + } +} + bool GmailNetworkFactory::obtainAndDecodeFullMessages(const QList& lite_messages, const QString& feed_id, QList& full_messages) { @@ -477,81 +585,3 @@ QList GmailNetworkFactory::decodeLiteMessages(const QString& messages_j return messages; } - -/* - RootItem* GmailNetworkFactory::decodeFeedCategoriesData(const QString& categories) { - RootItem* parent = new RootItem(); - QJsonArray json = QJsonDocument::fromJson(categories.toUtf8()).object()["labels"].toArray(); - - QMap cats; - cats.insert(QString(), parent); - - for (const QJsonValue& obj : json) { - auto label = obj.toObject(); - QString label_id = label["id"].toString(); - QString label_name = label["name"].toString(); - QString label_type = label["type"].toString(); - - if (label_name.contains(QL1C('/'))) { - // We have nested labels. - } - else { - GmailFeed* feed = new GmailFeed(); - - feed->setTitle(label_name); - feed->setCustomId(label_id); - - parent->appendChild(feed); - } - - - if (label_id.contains(QSL("/label/"))) { - // We have label (not "state"). - Category* category = new Category(); - - category->setDescription(label["htmlUrl"].toString()); - category->setTitle(label_id.mid(label_id.lastIndexOf(QL1C('/')) + 1)); - category->setCustomId(label_id); - - cats.insert(category->customId(), category); - - // All categories in Nextcloud are top-level. - parent->appendChild(category); - } - } - - json = QJsonDocument::fromJson(feeds.toUtf8()).object()["subscriptions"].toArray(); - - for (const QJsonValue& obj : json) { - auto subscription = obj.toObject(); - QString id = subscription["id"].toString(); - QString title = subscription["title"].toString(); - QString url = subscription["htmlUrl"].toString(); - QString parent_label; - QJsonArray categories = subscription["categories"].toArray(); - - for (const QJsonValue& cat : categories) { - QString potential_id = cat.toObject()["id"].toString(); - - if (potential_id.contains(QSL("/label/"))) { - parent_label = potential_id; - break; - } - } - - // We have label (not "state"). - GmailFeed* feed = new GmailFeed(); - - feed->setDescription(url); - feed->setUrl(url); - feed->setTitle(title); - feed->setCustomId(id); - - if (cats.contains(parent_label)) { - cats[parent_label]->appendChild(feed); - } - } - - return parent; - } - */ diff --git a/src/librssguard/services/gmail/network/gmailnetworkfactory.h b/src/librssguard/services/gmail/network/gmailnetworkfactory.h index 8d791dc03..f7297a048 100644 --- a/src/librssguard/services/gmail/network/gmailnetworkfactory.h +++ b/src/librssguard/services/gmail/network/gmailnetworkfactory.h @@ -35,7 +35,11 @@ class GmailNetworkFactory : public QObject { int batchSize() const; void setBatchSize(int batch_size); - void sendEmail(const Mimesis::Message& msg); + // Sends e-mail, returns its ID. + QString sendEmail(const Mimesis::Message& msg); + + // Returns all possible recipients. + QStringList getAllRecipients(); Downloader* downloadAttachment(const QString& msg_id, const QString& attachment_id); diff --git a/src/librssguard/services/inoreader/inoreaderserviceroot.cpp b/src/librssguard/services/inoreader/inoreaderserviceroot.cpp index b6ccf66d2..0cc4ea8af 100644 --- a/src/librssguard/services/inoreader/inoreaderserviceroot.cpp +++ b/src/librssguard/services/inoreader/inoreaderserviceroot.cpp @@ -1,21 +1,4 @@ -// This file is part of RSS Guard. - -// -// Copyright (C) 2011-2017 by Martin Rotter -// Copyright (C) 2010-2014 by David Rosca -// -// RSS Guard is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// RSS Guard is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with RSS Guard. If not, see . +// For license of this file, see /LICENSE.md. #include "services/inoreader/inoreaderserviceroot.h" diff --git a/src/librssguard/services/inoreader/inoreaderserviceroot.h b/src/librssguard/services/inoreader/inoreaderserviceroot.h index e51f9309b..bfea16a25 100644 --- a/src/librssguard/services/inoreader/inoreaderserviceroot.h +++ b/src/librssguard/services/inoreader/inoreaderserviceroot.h @@ -1,21 +1,4 @@ -// This file is part of RSS Guard. - -// -// Copyright (C) 2011-2017 by Martin Rotter -// Copyright (C) 2010-2014 by David Rosca -// -// RSS Guard is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// RSS Guard is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with RSS Guard. If not, see . +// For license of this file, see /LICENSE.md. #ifndef INOREADERSERVICEROOT_H #define INOREADERSERVICEROOT_H