1 /*
2    SPDX-FileCopyrightText: 2017-2021 Laurent Montel <montel@kde.org>
3 
4    SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6 
7 #include "createreplymessagejob.h"
8 
9 #include "../util.h"
10 #include "composer.h"
11 #include "editor/kmcomposerwin.h"
12 #include "kmkernel.h"
13 #include <KEmailAddress>
14 #include <MailCommon/MailUtil>
15 
CreateReplyMessageJob(QObject * parent)16 CreateReplyMessageJob::CreateReplyMessageJob(QObject *parent)
17     : QObject(parent)
18 {
19 }
20 
~CreateReplyMessageJob()21 CreateReplyMessageJob::~CreateReplyMessageJob()
22 {
23     delete mMessageFactory;
24 }
25 
setSettings(const CreateReplyMessageJobSettings & settings)26 void CreateReplyMessageJob::setSettings(const CreateReplyMessageJobSettings &settings)
27 {
28     mSettings = settings;
29 }
30 
31 /// Small helper function to get the composer context from a reply
replyContext(const MessageComposer::MessageFactoryNG::MessageReply & reply)32 inline KMail::Composer::TemplateContext replyContext(const MessageComposer::MessageFactoryNG::MessageReply &reply)
33 {
34     if (reply.replyAll) {
35         return KMail::Composer::ReplyToAll;
36     } else {
37         return KMail::Composer::Reply;
38     }
39 }
40 
start()41 void CreateReplyMessageJob::start()
42 {
43     const auto col = CommonKernel->collectionFromId(mSettings.item.parentCollection().id());
44     mMessageFactory = new MessageComposer::MessageFactoryNG(mSettings.msg, mSettings.item.id(), col);
45     mMessageFactory->setIdentityManager(KMKernel::self()->identityManager());
46     mMessageFactory->setFolderIdentity(MailCommon::Util::folderIdentity(mSettings.item));
47     mMessageFactory->setMailingListAddresses(KMail::Util::mailingListsFromMessage(mSettings.item));
48     mMessageFactory->putRepliesInSameFolder(KMail::Util::putRepliesInSameFolder(mSettings.item));
49     mMessageFactory->setSelection(mSettings.selection);
50     mMessageFactory->setTemplate(mSettings.templateStr);
51     mMessageFactory->setReplyAsHtml(mSettings.replyAsHtml);
52     if (mSettings.noQuote) {
53         mMessageFactory->setQuote(false);
54     }
55     connect(mMessageFactory, &MessageComposer::MessageFactoryNG::createReplyDone, this, &CreateReplyMessageJob::slotCreateReplyDone);
56     mMessageFactory->setReplyStrategy(mSettings.replyStrategy);
57     mMessageFactory->createReplyAsync();
58 }
59 
slotCreateReplyDone(const MessageComposer::MessageFactoryNG::MessageReply & reply)60 void CreateReplyMessageJob::slotCreateReplyDone(const MessageComposer::MessageFactoryNG::MessageReply &reply)
61 {
62     KMime::Message::Ptr rmsg = reply.msg;
63     if (mSettings.url.isValid()) {
64         rmsg->to()->fromUnicodeString(KEmailAddress::decodeMailtoUrl(mSettings.url), "utf-8");
65     }
66     bool lastEncrypt = false;
67     bool lastSign = false;
68     KMail::Util::lastEncryptAndSignState(lastEncrypt, lastSign, mSettings.msg);
69 
70     KMail::Composer *win = KMail::makeComposer(rmsg,
71                                                lastSign,
72                                                lastEncrypt,
73                                                (mSettings.replyStrategy == MessageComposer::ReplyNone) ? KMail::Composer::Reply : replyContext(reply),
74                                                0,
75                                                mSettings.selection,
76                                                mSettings.templateStr);
77     win->setFocusToEditor();
78     win->show();
79     deleteLater();
80 }
81