File indexing completed on 2024-06-23 05:18:30

0001 /*
0002    SPDX-FileCopyrightText: 2013-2024 Laurent Montel <montel@kde.org>
0003 
0004    SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "imagescalingutils.h"
0008 #include "settings/messagecomposersettings.h"
0009 
0010 #include <QFileInfo>
0011 
0012 using namespace MessageComposer;
0013 
0014 bool Utils::resizeImage(MessageCore::AttachmentPart::Ptr part)
0015 {
0016     const QString filename = part->fileName();
0017     const QString pattern = MessageComposer::MessageComposerSettings::self()->filterSourcePattern();
0018 
0019     if (!pattern.isEmpty()) {
0020         // TODO use regexp ?
0021         const QStringList lstPattern = pattern.split(QLatin1Char(';'));
0022         for (const QString &patternStr : lstPattern) {
0023             switch (MessageComposer::MessageComposerSettings::self()->filterSourceType()) {
0024             case MessageComposer::MessageComposerSettings::EnumFilterSourceType::NoFilter:
0025                 break;
0026             case MessageComposer::MessageComposerSettings::EnumFilterSourceType::IncludeFilesWithPattern:
0027                 if (!filename.contains(patternStr)) {
0028                     return false;
0029                 }
0030                 break;
0031             case MessageComposer::MessageComposerSettings::EnumFilterSourceType::ExcludeFilesWithPattern:
0032                 if (filename.contains(patternStr)) {
0033                     return false;
0034                 }
0035                 break;
0036             }
0037         }
0038     }
0039 
0040     if (MessageComposer::MessageComposerSettings::self()->resizeImagesWithFormats()) {
0041         const QString formatsType = MessageComposer::MessageComposerSettings::self()->resizeImagesWithFormatsType();
0042         if (!formatsType.isEmpty()) {
0043             const QStringList lstFormat = formatsType.split(QLatin1Char(';'));
0044             bool willResizeImage = false;
0045             for (const QString &type : lstFormat) {
0046                 if (QLatin1StringView(part->mimeType()) == type) {
0047                     willResizeImage = true;
0048                     break;
0049                 }
0050             }
0051             if (!willResizeImage) {
0052                 return false;
0053             }
0054         }
0055     }
0056 
0057     if (MessageComposer::MessageComposerSettings::self()->skipImageLowerSizeEnabled()) {
0058         if (part->size() > MessageComposer::MessageComposerSettings::self()->skipImageLowerSize() * 1024) {
0059             if (hasImage(part->mimeType())) {
0060                 return true;
0061             } else {
0062                 return false;
0063             }
0064         } else {
0065             return false;
0066         }
0067     }
0068     return true;
0069 }
0070 
0071 void Utils::changeFileName(MessageCore::AttachmentPart::Ptr part)
0072 {
0073     if (MessageComposer::MessageComposerSettings::self()->renameResizedImages()) {
0074         QString pattern = MessageComposer::MessageComposerSettings::self()->renameResizedImagesPattern();
0075         if (!pattern.isEmpty()) {
0076             const QString filename = part->fileName();
0077             pattern.replace(QLatin1StringView("%t"), QTime::currentTime().toString());
0078             pattern.replace(QLatin1StringView("%d"), QDate::currentDate().toString());
0079             pattern.replace(QLatin1StringView("%n"), filename); // Original name
0080             pattern.replace(QLatin1StringView("%e"), QFileInfo(filename).completeSuffix()); // Original extension
0081 
0082             const QString type = MessageComposer::MessageComposerSettings::self()->writeFormat();
0083             QString newExtension;
0084             if (type == QLatin1StringView("JPG")) {
0085                 newExtension = QStringLiteral("jpg");
0086             } else if (type == QLatin1StringView("PNG")) {
0087                 newExtension = QStringLiteral("png");
0088             }
0089             if (!newExtension.isEmpty()) {
0090                 pattern.replace(QLatin1StringView("%x"), newExtension); // new Extension
0091             }
0092 
0093             // Need to define pattern type.
0094             part->setFileName(pattern);
0095             part->setName(pattern);
0096         }
0097     }
0098 }
0099 
0100 bool Utils::filterRecipients(const QStringList &recipients)
0101 {
0102     if (recipients.isEmpty()) {
0103         return false;
0104     }
0105 
0106     if (MessageComposer::MessageComposerSettings::self()->filterRecipientType()
0107         == MessageComposer::MessageComposerSettings::EnumFilterRecipientType::NoFilter) {
0108         return true;
0109     }
0110 
0111     const QString doNotResizeEmailsPattern = MessageComposer::MessageComposerSettings::self()->doNotResizeEmailsPattern();
0112     const QString resizeEmailsPattern = MessageComposer::MessageComposerSettings::self()->resizeEmailsPattern();
0113     if (doNotResizeEmailsPattern.isEmpty() && resizeEmailsPattern.isEmpty()) {
0114         return true;
0115     }
0116 
0117     switch (MessageComposer::MessageComposerSettings::self()->filterRecipientType()) {
0118     case MessageComposer::MessageComposerSettings::EnumFilterRecipientType::NoFilter:
0119         return true;
0120     case MessageComposer::MessageComposerSettings::EnumFilterRecipientType::ResizeEachEmailsContainsPattern:
0121         if (resizeEmailsPattern.isEmpty()) {
0122             return false;
0123         }
0124         for (const QString &emails : recipients) {
0125             if (!emails.contains(resizeEmailsPattern)) {
0126                 return false;
0127             }
0128         }
0129         return true;
0130     case MessageComposer::MessageComposerSettings::EnumFilterRecipientType::ResizeOneEmailContainsPattern:
0131         if (resizeEmailsPattern.isEmpty()) {
0132             return false;
0133         }
0134         for (const QString &emails : recipients) {
0135             if (emails.contains(resizeEmailsPattern)) {
0136                 return true;
0137             }
0138         }
0139         return false;
0140     case MessageComposer::MessageComposerSettings::EnumFilterRecipientType::DontResizeEachEmailsContainsPattern:
0141         if (doNotResizeEmailsPattern.isEmpty()) {
0142             return false;
0143         }
0144         for (const QString &emails : recipients) {
0145             if (!emails.contains(doNotResizeEmailsPattern)) {
0146                 return false;
0147             }
0148         }
0149         return true;
0150     case MessageComposer::MessageComposerSettings::EnumFilterRecipientType::DontResizeOneEmailContainsPattern:
0151         if (doNotResizeEmailsPattern.isEmpty()) {
0152             return false;
0153         }
0154         for (const QString &emails : recipients) {
0155             if (emails.contains(doNotResizeEmailsPattern)) {
0156                 return true;
0157             }
0158         }
0159         return false;
0160     }
0161 
0162     return false;
0163 }
0164 
0165 bool Utils::hasImage(const QByteArray &mimetype)
0166 {
0167     if (mimetype == QByteArrayLiteral("image/gif") || mimetype == QByteArrayLiteral("image/jpeg") || mimetype == QByteArrayLiteral("image/png")) {
0168         return true;
0169     }
0170     return false;
0171 }
0172 
0173 bool Utils::containsImage(const MessageCore::AttachmentPart::List &parts)
0174 {
0175     for (const MessageCore::AttachmentPart::Ptr &part : parts) {
0176         if (hasImage(part->mimeType())) {
0177             return true;
0178         }
0179     }
0180     return false;
0181 }