diff --git a/messagecomposer/CMakeLists.txt b/messagecomposer/CMakeLists.txt index cce0ca9a..607a3c60 100644 --- a/messagecomposer/CMakeLists.txt +++ b/messagecomposer/CMakeLists.txt @@ -1,36 +1,34 @@ ecm_setup_version(PROJECT VARIABLE_PREFIX MESSAGECOMPOSER VERSION_HEADER "${CMAKE_CURRENT_BINARY_DIR}/messagecomposer_version.h" PACKAGE_VERSION_FILE "${CMAKE_CURRENT_BINARY_DIR}/KF5MessageComposerConfigVersion.cmake" SOVERSION 5 ) -configure_file(src/messagecomposer-version.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/src/messagecomposer-version.h @ONLY) - ########### CMake Config Files ########### set(CMAKECONFIG_INSTALL_DIR "${KDE_INSTALL_CMAKEPACKAGEDIR}/KF5MessageComposer") configure_package_config_file( "${CMAKE_CURRENT_SOURCE_DIR}/KF5MessageComposerConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/KF5MessageComposerConfig.cmake" INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR} ) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/KF5MessageComposerConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/KF5MessageComposerConfigVersion.cmake" DESTINATION "${CMAKECONFIG_INSTALL_DIR}" COMPONENT Devel ) install(EXPORT KF5MessageComposerTargets DESTINATION "${CMAKECONFIG_INSTALL_DIR}" FILE KF5MessageComposerTargets.cmake NAMESPACE KF5::) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/messagecomposer_version.h DESTINATION ${KDE_INSTALL_INCLUDEDIR_KF5} COMPONENT Devel ) add_subdirectory(src) if (BUILD_TESTING) add_subdirectory(autotests) add_subdirectory(tests) endif() diff --git a/messagecomposer/src/helper/messagehelper.cpp b/messagecomposer/src/helper/messagehelper.cpp index f220de37..1758d696 100644 --- a/messagecomposer/src/helper/messagehelper.cpp +++ b/messagecomposer/src/helper/messagehelper.cpp @@ -1,173 +1,172 @@ /* Copyright (C) 2009 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.net Copyright (c) 2009 Andras Mantia 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 "messagehelper.h" -#include "messagecomposer-version.h" #include "utils/util.h" #include "settings/messagecomposersettings.h" #include "MessageCore/MailingList" #include "MessageCore/StringUtil" #include #include #include #include #include #include #include "messagecomposer_debug.h" using namespace MessageCore; namespace MessageHelper { void initHeader(const KMime::Message::Ptr &message, const KIdentityManagement::IdentityManager *identMan, uint id) { applyIdentity(message, identMan, id); message->removeHeader(); message->removeHeader(); message->date()->setDateTime(QDateTime::currentDateTime()); // This will allow to change Content-Type: message->contentType()->setMimeType("text/plain"); } void initFromMessage(const KMime::Message::Ptr &msg, const KMime::Message::Ptr &origMsg, KIdentityManagement::IdentityManager *identMan, uint id, bool idHeaders) { if (idHeaders) { MessageHelper::initHeader(msg, identMan, id); } else { KMime::Headers::Generic *header = new KMime::Headers::Generic("X-KMail-Identity"); header->fromUnicodeString(QString::number(id), "utf-8"); msg->setHeader(header); } if (auto hdr = origMsg->headerByType("X-KMail-Transport")) { const QString transport = hdr->asUnicodeString(); KMime::Headers::Generic *header = new KMime::Headers::Generic("X-KMail-Transport"); header->fromUnicodeString(transport, "utf-8"); msg->setHeader(header); } } void applyIdentity(const KMime::Message::Ptr &message, const KIdentityManagement::IdentityManager *identMan, uint id) { const KIdentityManagement::Identity &ident = identMan->identityForUoidOrDefault(id); if (ident.fullEmailAddr().isEmpty()) { message->removeHeader(); } else { message->from()->addAddress(ident.primaryEmailAddress().toUtf8(), ident.fullName()); } if (ident.replyToAddr().isEmpty()) { message->removeHeader(); } else { message->replyTo()->addAddress(ident.replyToAddr().toUtf8()); } if (ident.bcc().isEmpty()) { message->removeHeader(); } else { const auto mailboxes = KMime::Types::Mailbox::listFromUnicodeString(ident.bcc()); for (const KMime::Types::Mailbox &mailbox : mailboxes) { message->bcc()->addAddress(mailbox); } } if (ident.cc().isEmpty()) { message->removeHeader(); } else { const auto mailboxes = KMime::Types::Mailbox::listFromUnicodeString(ident.cc()); for (const KMime::Types::Mailbox &mailbox : mailboxes) { message->cc()->addAddress(mailbox); } } if (ident.organization().isEmpty()) { message->removeHeader(); } else { KMime::Headers::Organization *const organization = new KMime::Headers::Organization; organization->fromUnicodeString(ident.organization(), "utf-8"); message->setHeader(organization); } if (ident.isDefault()) { message->removeHeader("X-KMail-Identity"); } else { KMime::Headers::Generic *header = new KMime::Headers::Generic("X-KMail-Identity"); header->fromUnicodeString(QString::number(ident.uoid()), "utf-8"); message->setHeader(header); } if (ident.transport().isEmpty()) { message->removeHeader("X-KMail-Transport"); } else { KMime::Headers::Generic *header = new KMime::Headers::Generic("X-KMail-Transport"); header->fromUnicodeString(ident.transport(), "utf-8"); message->setHeader(header); } if (ident.fcc().isEmpty()) { message->removeHeader("X-KMail-Fcc"); } else { KMime::Headers::Generic *header = new KMime::Headers::Generic("X-KMail-Fcc"); header->fromUnicodeString(ident.fcc(), "utf-8"); message->setHeader(header); } if (ident.disabledFcc()) { KMime::Headers::Generic *header = new KMime::Headers::Generic("X-KMail-FccDisabled"); header->fromUnicodeString(QStringLiteral("true"), "utf-8"); message->setHeader(header); } else { message->removeHeader("X-KMail-FccDisabled"); } } KMime::Types::AddrSpecList extractAddrSpecs(const KMime::Message::Ptr &msg, const QByteArray &header) { KMime::Types::AddrSpecList result; if (auto hrd = msg->headerByType(header.constData())) { KMime::Types::AddressList al = MessageCore::StringUtil::splitAddressField(hrd->asUnicodeString().toUtf8()); KMime::Types::AddressList::const_iterator alend(al.constEnd()); for (KMime::Types::AddressList::const_iterator ait = al.constBegin(); ait != alend; ++ait) { KMime::Types::MailboxList::const_iterator mitEnd((*ait).mailboxList.constEnd()); for (KMime::Types::MailboxList::const_iterator mit = (*ait).mailboxList.constBegin(); mit != mitEnd; ++mit) { result.push_back((*mit).addrSpec()); } } } return result; } void setAutomaticFields(const KMime::Message::Ptr &msg, bool aIsMulti) { auto header = msg->header(true); header->from7BitString("1.0"); if (aIsMulti || msg->contents().size() > 1) { // Set the type to 'Multipart' and the subtype to 'Mixed' msg->contentType()->setMimeType("multipart/mixed"); // Create a random printable string and set it as the boundary parameter msg->contentType()->setBoundary(KMime::multiPartBoundary()); } } } diff --git a/messagecomposer/src/job/skeletonmessagejob.cpp b/messagecomposer/src/job/skeletonmessagejob.cpp index c452e78a..2d789ec3 100644 --- a/messagecomposer/src/job/skeletonmessagejob.cpp +++ b/messagecomposer/src/job/skeletonmessagejob.cpp @@ -1,290 +1,289 @@ /* Copyright (c) 2009 Constantin Berzan This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include "settings/messagecomposersettings.h" #include "job/skeletonmessagejob.h" -#include "messagecomposer-version.h" #include "part/infopart.h" #include "part/globalpart.h" #include "job/jobbase_p.h" #include #include #include #include "messagecomposer_debug.h" #include #include using namespace MessageComposer; class MessageComposer::SkeletonMessageJobPrivate : public JobBasePrivate { public: SkeletonMessageJobPrivate(SkeletonMessageJob *qq) : JobBasePrivate(qq) { } void doStart(); // slot InfoPart *infoPart = nullptr; GlobalPart *globalPart = nullptr; KMime::Message *message = nullptr; Q_DECLARE_PUBLIC(SkeletonMessageJob) }; void SkeletonMessageJobPrivate::doStart() { Q_Q(SkeletonMessageJob); Q_ASSERT(infoPart); Q_ASSERT(message == nullptr); message = new KMime::Message; // From: { KMime::Headers::From *from = new KMime::Headers::From; KMime::Types::Mailbox address; address.fromUnicodeString(KEmailAddress::normalizeAddressesAndEncodeIdn(infoPart->from())); from->fromUnicodeString(QString::fromLatin1(address.as7BitString("utf-8")), "utf-8"); message->setHeader(from); } // To: { KMime::Headers::To *to = new KMime::Headers::To; QByteArray sTo; const QStringList lstTo = infoPart->to(); for (const QString &a : lstTo) { KMime::Types::Mailbox address; address.fromUnicodeString(KEmailAddress::normalizeAddressesAndEncodeIdn(a)); if (!sTo.isEmpty()) { sTo.append(","); } sTo.append(address.as7BitString("utf-8")); } to->fromUnicodeString(QString::fromLatin1(sTo), "utf-8"); message->setHeader(to); } // Reply To: if (!infoPart->replyTo().isEmpty()) { KMime::Headers::ReplyTo *replyTo = new KMime::Headers::ReplyTo; const QStringList lstReplyTo = infoPart->replyTo(); QByteArray sReplyTo; for (const QString &a : lstReplyTo) { KMime::Types::Mailbox address; address.fromUnicodeString(KEmailAddress::normalizeAddressesAndEncodeIdn(a)); if (!sReplyTo.isEmpty()) { sReplyTo.append(","); } sReplyTo.append(address.as7BitString("utf-8")); } replyTo->fromUnicodeString(QString::fromLatin1(sReplyTo), "utf-8"); message->setHeader(replyTo); } // Cc: { KMime::Headers::Cc *cc = new KMime::Headers::Cc; QByteArray sCc; const QStringList lstCc = infoPart->cc(); for (const QString &a : lstCc) { KMime::Types::Mailbox address; address.fromUnicodeString(KEmailAddress::normalizeAddressesAndEncodeIdn(a)); if (!sCc.isEmpty()) { sCc.append(","); } sCc.append(address.as7BitString("utf-8")); } cc->fromUnicodeString(QString::fromLatin1(sCc), "utf-8"); message->setHeader(cc); } // Bcc: { KMime::Headers::Bcc *bcc = new KMime::Headers::Bcc; QByteArray sBcc; const QStringList lstBcc = infoPart->bcc(); for (const QString &a : lstBcc) { KMime::Types::Mailbox address; address.fromUnicodeString(KEmailAddress::normalizeAddressesAndEncodeIdn(a)); if (!sBcc.isEmpty()) { sBcc.append(","); } sBcc.append(address.as7BitString("utf-8")); } bcc->fromUnicodeString(QString::fromLatin1(sBcc), "utf-8"); message->setHeader(bcc); } // Subject: { KMime::Headers::Subject *subject = new KMime::Headers::Subject; subject->fromUnicodeString(infoPart->subject(), "utf-8"); // TODO should we be more specific about the charset? message->setHeader(subject); } // Date: { KMime::Headers::Date *date = new KMime::Headers::Date; date->setDateTime(QDateTime::currentDateTime()); message->setHeader(date); } // Fcc: if (!infoPart->fcc().isEmpty()) { KMime::Headers::Generic *header = new KMime::Headers::Generic("X-KMail-Fcc"); header->fromUnicodeString(infoPart->fcc(), "utf-8"); message->setHeader(header); } //Transport: if (infoPart->transportId() > -1) { KMime::Headers::Generic *header = new KMime::Headers::Generic("X-KMail-Transport"); header->fromUnicodeString(QString::number(infoPart->transportId()), "utf-8"); message->setHeader(header); } // Message-ID { KMime::Headers::MessageID *messageId = new KMime::Headers::MessageID(); QByteArray fqdn; if (MessageComposer::MessageComposerSettings::self()->useCustomMessageIdSuffix()) { fqdn = QUrl::toAce(MessageComposer::MessageComposerSettings::self()->customMsgIDSuffix()); } if (fqdn.isEmpty()) { fqdn = QUrl::toAce(QHostInfo::localHostName()); } if (fqdn.isEmpty()) { qCWarning(MESSAGECOMPOSER_LOG) << "Unable to generate a Message-ID, falling back to 'localhost.localdomain'."; fqdn = "local.domain"; } messageId->generate(fqdn); message->setHeader(messageId); } // Extras foreach (KMime::Headers::Base *extra, infoPart->extraHeaders()) { message->setHeader(extra); } // Request Delivery Confirmation { if (globalPart->requestDeleveryConfirmation()) { //TODO fix me multi address const QString addr = infoPart->replyTo().isEmpty() ? infoPart->from() : infoPart->replyTo().at(0); KMime::Headers::Generic *requestDeleveryConfirmation = new KMime::Headers::Generic("Return-Receipt-To"); requestDeleveryConfirmation->fromUnicodeString(addr, "utf-8"); message->setHeader(requestDeleveryConfirmation); } } // MDN { if (globalPart->MDNRequested()) { //TODO fix me multi address const QString addr = infoPart->replyTo().isEmpty() ? infoPart->from() : infoPart->replyTo().at(0); KMime::Headers::Generic *mdn = new KMime::Headers::Generic("Disposition-Notification-To"); mdn->fromUnicodeString(addr, "utf-8"); message->setHeader(mdn); } } // Urgent header if (infoPart->urgent()) { KMime::Headers::Generic *urg1 = new KMime::Headers::Generic("X-PRIORITY"); urg1->fromUnicodeString(QStringLiteral("2 (High)"), "utf-8"); KMime::Headers::Generic *urg2 = new KMime::Headers::Generic("Priority"); urg2->fromUnicodeString(QStringLiteral("urgent"), "utf-8"); message->setHeader(urg1); message->setHeader(urg2); } // In-Reply-To if (!infoPart->inReplyTo().isEmpty()) { KMime::Headers::InReplyTo *header = new KMime::Headers::InReplyTo; header->fromUnicodeString(infoPart->inReplyTo(), "utf-8"); message->setHeader(header); } // References if (!infoPart->references().isEmpty()) { KMime::Headers::References *header = new KMime::Headers::References; header->fromUnicodeString(infoPart->references(), "utf-8"); message->setHeader(header); } q->emitResult(); // Success. } SkeletonMessageJob::SkeletonMessageJob(InfoPart *infoPart, GlobalPart *globalPart, QObject *parent) : JobBase(*new SkeletonMessageJobPrivate(this), parent) { Q_D(SkeletonMessageJob); d->infoPart = infoPart; d->globalPart = globalPart; } SkeletonMessageJob::~SkeletonMessageJob() { } InfoPart *SkeletonMessageJob::infoPart() const { Q_D(const SkeletonMessageJob); return d->infoPart; } void SkeletonMessageJob::setInfoPart(InfoPart *part) { Q_D(SkeletonMessageJob); d->infoPart = part; } GlobalPart *SkeletonMessageJob::globalPart() const { Q_D(const SkeletonMessageJob); return d->globalPart; } void SkeletonMessageJob::setGlobalPart(GlobalPart *part) { Q_D(SkeletonMessageJob); d->globalPart = part; } KMime::Message *SkeletonMessageJob::message() const { Q_D(const SkeletonMessageJob); return d->message; } void SkeletonMessageJob::start() { Q_D(SkeletonMessageJob); d->doStart(); } #include "moc_skeletonmessagejob.cpp" diff --git a/messagecomposer/src/messagecomposer-version.h.cmake b/messagecomposer/src/messagecomposer-version.h.cmake deleted file mode 100644 index 934491e6..00000000 --- a/messagecomposer/src/messagecomposer-version.h.cmake +++ /dev/null @@ -1,36 +0,0 @@ -/* - Copyright (c) 1998-1999 Preston Brown - Copyright (c) 2000-2004 Cornelius Schumacher - - 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. -*/ - -/* - Set the version for this kdepim release. - - This version may be used by programs within this module that - do not want to maintain a version on their own. - - Note that we cannot use the kdelibs version because we may - build against older kdelibs releases. -*/ - -#ifndef MESSAGECOMPOSER_VERSION_H -#define MESSAGECOMPOSER_VERSION_H - - -#define MESSAGELIB_LIB_VERSION "@MESSAGELIB_LIB_VERSION@" - -#endif