File indexing completed on 2025-03-09 04:54:13
0001 /* -*- c++ -*- 0002 * imagecollector.cpp 0003 * 0004 * This file is part of KMail, the KDE mail client. 0005 * SPDX-FileCopyrightText: 2004 Marc Mutz <mutz@kde.org> 0006 * SPDX-FileCopyrightText: 2011 Torgny Nyblom <nyblom@kde.org> 0007 * 0008 * SPDX-License-Identifier: GPL-2.0-or-later 0009 */ 0010 0011 #include "imagecollector.h" 0012 0013 #include "MessageCore/NodeHelper" 0014 0015 #include "messagecore_debug.h" 0016 #include <KMime/Content> 0017 0018 static bool isInExclusionList(KMime::Content *node) 0019 { 0020 if (!node) { 0021 return true; 0022 } 0023 0024 auto ct = node->contentType(); // Create if necessary 0025 if (ct->mediaType() != "image") { 0026 return true; 0027 } 0028 0029 if (ct->isMultipart()) { 0030 return true; 0031 } 0032 0033 return false; 0034 } 0035 0036 class MessageCore::ImageCollector::ImageCollectorPrivate 0037 { 0038 public: 0039 std::vector<KMime::Content *> mImages; 0040 }; 0041 0042 MessageCore::ImageCollector::ImageCollector() 0043 : d(new ImageCollectorPrivate) 0044 { 0045 } 0046 0047 MessageCore::ImageCollector::~ImageCollector() = default; 0048 0049 void MessageCore::ImageCollector::collectImagesFrom(KMime::Content *node) 0050 { 0051 KMime::Content *parent = nullptr; 0052 0053 while (node) { 0054 parent = node->parent(); 0055 0056 if (node->topLevel()->textContent() == node) { 0057 node = MessageCore::NodeHelper::next(node); 0058 continue; 0059 } 0060 0061 if (isInExclusionList(node)) { 0062 node = MessageCore::NodeHelper::next(node); 0063 continue; 0064 } 0065 0066 if (parent && parent->contentType()->isMultipart() && parent->contentType(false)->subType() == "related") { 0067 qCWarning(MESSAGECORE_LOG) << "Adding image" << node->contentID(); 0068 d->mImages.push_back(node); 0069 node = MessageCore::NodeHelper::next(node); // skip embedded images 0070 continue; 0071 } 0072 0073 node = MessageCore::NodeHelper::next(node); 0074 } 0075 } 0076 0077 const std::vector<KMime::Content *> &MessageCore::ImageCollector::images() const 0078 { 0079 return d->mImages; 0080 }