From b968ea8ed364238c57c3e74cf2c122cb897cfbea Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Tue, 23 May 2017 19:13:13 +0200 Subject: Builds but doesn't link, no formatters yet --- framework/src/domain/mimetreeparser/otp/util.cpp | 136 +++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 framework/src/domain/mimetreeparser/otp/util.cpp (limited to 'framework/src/domain/mimetreeparser/otp/util.cpp') diff --git a/framework/src/domain/mimetreeparser/otp/util.cpp b/framework/src/domain/mimetreeparser/otp/util.cpp new file mode 100644 index 00000000..5ca8d828 --- /dev/null +++ b/framework/src/domain/mimetreeparser/otp/util.cpp @@ -0,0 +1,136 @@ +/* + Copyright (c) 2016 Sandro Knauß + + This program 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 2 of the License, or + (at your option) any later version. + + This program 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 this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +*/ + +#include "util.h" + +#include "mimetreeparser_debug.h" + +#include "nodehelper.h" + +#include + +#include +#include + +using namespace MimeTreeParser::Util; + +bool MimeTreeParser::Util::isTypeBlacklisted(KMime::Content *node) +{ + const QByteArray mediaTypeLower = node->contentType()->mediaType().toLower(); + bool typeBlacklisted = mediaTypeLower == "multipart"; + if (!typeBlacklisted) { + typeBlacklisted = KMime::isCryptoPart(node); + } + typeBlacklisted = typeBlacklisted || node == node->topLevel(); + const bool firstTextChildOfEncapsulatedMsg = + mediaTypeLower == "text" && + node->contentType()->subType().toLower() == "plain" && + node->parent() && node->parent()->contentType()->mediaType().toLower() == "message"; + return typeBlacklisted || firstTextChildOfEncapsulatedMsg; +} + +QString MimeTreeParser::Util::labelForContent(KMime::Content *node) +{ + const QString name = node->contentType()->name(); + QString label = name.isEmpty() ? NodeHelper::fileName(node) : name; + if (label.isEmpty()) { + label = node->contentDescription()->asUnicodeString(); + } + return label; +} + +QMimeType MimeTreeParser::Util::mimetype(const QString &name) +{ + QMimeDatabase db; + // consider the filename if mimetype cannot be found by content-type + const auto mimeTypes = db.mimeTypesForFileName(name); + for (const auto &mt : mimeTypes) { + if (mt.name() != QLatin1String("application/octet-stream")) { + return mt; + } + } + + // consider the attachment's contents if neither the Content-Type header + // nor the filename give us a clue + return db.mimeTypeForFile(name); +} + +QString MimeTreeParser::Util::iconNameForMimetype(const QString &mimeType, + const QString &fallbackFileName1, + const QString &fallbackFileName2) +{ + QString fileName; + QString tMimeType = mimeType; + + // convert non-registered types to registered types + if (mimeType == QLatin1String("application/x-vnd.kolab.contact")) { + tMimeType = QStringLiteral("text/x-vcard"); + } else if (mimeType == QLatin1String("application/x-vnd.kolab.event")) { + tMimeType = QStringLiteral("application/x-vnd.akonadi.calendar.event"); + } else if (mimeType == QLatin1String("application/x-vnd.kolab.task")) { + tMimeType = QStringLiteral("application/x-vnd.akonadi.calendar.todo"); + } else if (mimeType == QLatin1String("application/x-vnd.kolab.journal")) { + tMimeType = QStringLiteral("application/x-vnd.akonadi.calendar.journal"); + } else if (mimeType == QLatin1String("application/x-vnd.kolab.note")) { + tMimeType = QStringLiteral("application/x-vnd.akonadi.note"); + } else if (mimeType == QLatin1String("image/jpg")) { + tMimeType = QStringLiteral("image/jpeg"); + } + QMimeDatabase mimeDb; + auto mime = mimeDb.mimeTypeForName(tMimeType); + if (mime.isValid()) { + fileName = mime.iconName(); + } else { + fileName = QStringLiteral("unknown"); + if (!tMimeType.isEmpty()) { + qCWarning(MIMETREEPARSER_LOG) << "unknown mimetype" << tMimeType; + } + } + //WorkAround for #199083 + if (fileName == QLatin1String("text-vcard")) { + fileName = QStringLiteral("text-x-vcard"); + } + + if (fileName.isEmpty()) { + fileName = fallbackFileName1; + if (fileName.isEmpty()) { + fileName = fallbackFileName2; + } + if (!fileName.isEmpty()) { + fileName = mimeDb.mimeTypeForFile(QLatin1String("/tmp/") + fileName).iconName(); + } + } + + return fileName; +} + +QString MimeTreeParser::Util::iconNameForContent(KMime::Content *node) +{ + if (!node) { + return QString(); + } + + QByteArray mimeType = node->contentType()->mimeType(); + if (mimeType.isNull() || mimeType == "application/octet-stream") { + const QString mime = mimetype(node->contentDisposition()->filename()).name(); + mimeType = mime.toLatin1(); + } + mimeType = mimeType.toLower(); + return iconNameForMimetype(QLatin1String(mimeType), node->contentDisposition()->filename(), + node->contentType()->name()); +} -- cgit v1.2.3