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 "handleclickedurljob.h"
8 #include "composer.h"
9 #include "editor/kmcomposerwin.h"
10 #include "kmail_debug.h"
11 #include "kmkernel.h"
12 #include <KMime/Message>
13 #include <MessageComposer/MessageHelper>
14 #include <MessageCore/StringUtil>
15 #include <TemplateParser/TemplateParserJob>
16 
HandleClickedUrlJob(QObject * parent)17 HandleClickedUrlJob::HandleClickedUrlJob(QObject *parent)
18     : QObject(parent)
19 {
20 }
21 
22 HandleClickedUrlJob::~HandleClickedUrlJob() = default;
23 
start()24 void HandleClickedUrlJob::start()
25 {
26     mMsg = KMime::Message::Ptr(new KMime::Message);
27     mIdentity = !mFolder.isNull() ? mFolder->identity() : 0;
28     MessageHelper::initHeader(mMsg, KMKernel::self()->identityManager(), mIdentity);
29     mMsg->contentType()->setCharset("utf-8");
30 
31     const QVector<QPair<QString, QString>> fields = MessageCore::StringUtil::parseMailtoUrl(mUrl);
32     for (int i = 0; i < fields.count(); ++i) {
33         const QPair<QString, QString> element = fields.at(i);
34         if (element.first == QLatin1String("to")) {
35             mMsg->to()->fromUnicodeString(element.second, "utf-8");
36         } else if (element.first == QLatin1String("subject")) {
37             const QString subject = element.second;
38             if (!subject.isEmpty()) {
39                 mMsg->subject()->fromUnicodeString(subject, "utf-8");
40             }
41         } else if (element.first == QLatin1String("body")) {
42             const QString body = element.second;
43             if (!body.isEmpty()) {
44                 mMsg->setBody(body.toUtf8());
45             }
46         } else if (element.first == QLatin1String("cc")) {
47             const QString cc = element.second;
48             if (!cc.isEmpty()) {
49                 mMsg->cc()->fromUnicodeString(cc, "utf-8");
50             }
51         } else if (element.first == QLatin1String("bcc")) {
52             const QString bcc = element.second;
53             if (!bcc.isEmpty()) {
54                 mMsg->bcc()->fromUnicodeString(bcc, "utf-8");
55             }
56         } else if (element.first == QLatin1String("attach")) {
57             const QString attach = element.second;
58             if (!attach.isEmpty()) {
59                 qCDebug(KMAIL_LOG) << "Attachment not supported yet";
60                 // TODO
61             }
62         }
63     }
64 
65     auto parser = new TemplateParser::TemplateParserJob(mMsg, TemplateParser::TemplateParserJob::NewMessage, this);
66     connect(parser, &TemplateParser::TemplateParserJob::parsingDone, this, &HandleClickedUrlJob::slotOpenComposer);
67     parser->setIdentityManager(KMKernel::self()->identityManager());
68     parser->process(mMsg, mCurrentCollection.id());
69 }
70 
slotOpenComposer()71 void HandleClickedUrlJob::slotOpenComposer()
72 {
73     KMail::Composer *win = KMail::makeComposer(mMsg, false, false, KMail::Composer::New, mIdentity);
74     win->setFocusToSubject();
75     win->setCollectionForNewMessage(mCurrentCollection);
76     win->show();
77     deleteLater();
78 }
79 
setUrl(const QUrl & url)80 void HandleClickedUrlJob::setUrl(const QUrl &url)
81 {
82     mUrl = url;
83 }
84 
setFolder(const QSharedPointer<MailCommon::FolderSettings> & folder)85 void HandleClickedUrlJob::setFolder(const QSharedPointer<MailCommon::FolderSettings> &folder)
86 {
87     mFolder = folder;
88 }
89 
setCurrentCollection(const Akonadi::Collection & currentCollection)90 void HandleClickedUrlJob::setCurrentCollection(const Akonadi::Collection &currentCollection)
91 {
92     mCurrentCollection = currentCollection;
93 }
94