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 }