From b2409ab7450582c78440bd91560cc61b94d57072 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Mon, 17 May 2021 08:41:49 +0200 Subject: [PATCH] improve gmail email parsing, also display correct local datetime in msg previewer --- .../desktop/com.github.rssguard.appdata.xml | 2 +- src/librssguard/gui/webviewer.cpp | 2 +- .../services/gmail/gmailnetworkfactory.cpp | 30 ++++++++++++------- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/resources/desktop/com.github.rssguard.appdata.xml b/resources/desktop/com.github.rssguard.appdata.xml index 02623d77d..21d0e0830 100644 --- a/resources/desktop/com.github.rssguard.appdata.xml +++ b/resources/desktop/com.github.rssguard.appdata.xml @@ -30,7 +30,7 @@ https://martinrotter.github.io/donate/ - + none diff --git a/src/librssguard/gui/webviewer.cpp b/src/librssguard/gui/webviewer.cpp index 5c09d4d3c..c5383e854 100644 --- a/src/librssguard/gui/webviewer.cpp +++ b/src/librssguard/gui/webviewer.cpp @@ -131,7 +131,7 @@ void WebViewer::loadMessages(const QList& messages, RootItem* root) { message.m_author), message.m_url, message.m_contents, - QLocale().toString(message.m_created, QLocale::FormatType::ShortFormat), + QLocale().toString(message.m_created.toLocalTime(), QLocale::FormatType::ShortFormat), enclosures, enclosure_images)); } diff --git a/src/librssguard/services/gmail/gmailnetworkfactory.cpp b/src/librssguard/services/gmail/gmailnetworkfactory.cpp index 2f8309a19..bf22723b0 100755 --- a/src/librssguard/services/gmail/gmailnetworkfactory.cpp +++ b/src/librssguard/services/gmail/gmailnetworkfactory.cpp @@ -490,25 +490,35 @@ bool GmailNetworkFactory::fillFullMessage(Message& msg, const QJsonObject& json, } QString backup_contents; - QJsonArray parts = json["payload"].toObject()["parts"].toArray(); + QList parts_to_process, parts; - if (parts.isEmpty()) { - parts.append(json["payload"].toObject()); + parts_to_process.append(json["payload"].toObject()); + + while (!parts_to_process.isEmpty()) { + auto this_part = parts_to_process.takeFirst(); + auto nested_parts = this_part["parts"].toArray(); + + for (const QJsonValue& prt : qAsConst(nested_parts)) { + auto prt_obj = prt.toObject(); + + parts.append(prt_obj); + parts_to_process.append(prt_obj); + } } - for (const QJsonValue& part : parts) { - QJsonObject part_obj = part.toObject(); - QJsonObject body = part_obj["body"].toObject(); - QString filename = part_obj["filename"].toString(); + for (const QJsonObject& part : qAsConst(parts)) { + QJsonObject body = part["body"].toObject(); + QString mime = part["mimeType"].toString(); + QString filename = part["filename"].toString(); - if (filename.isEmpty() && body.contains(QL1S("data"))) { + if (filename.isEmpty() && mime.startsWith(QSL("text/"))) { // We have textual data of e-mail. // We check if it is HTML. if (msg.m_contents.isEmpty()) { - if (part_obj["mimeType"].toString().contains(QL1S("text/html"))) { + if (mime.contains(QL1S("text/html"))) { msg.m_contents = QByteArray::fromBase64(body["data"].toString().toUtf8(), QByteArray::Base64Option::Base64UrlEncoding); } - else { + else if (backup_contents.isEmpty()) { backup_contents = QByteArray::fromBase64(body["data"].toString().toUtf8(), QByteArray::Base64Option::Base64UrlEncoding); } }