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 ¤tCollection)
91 {
92 mCurrentCollection = currentCollection;
93 }
94