1 /*
2 SPDX-FileCopyrightText: 2014 Sandro Knauß <knauss@kolabsys.com>
3
4 SPDX-License-Identifier: GPL-2.0-only
5 */
6
7 #include "createnotejob.h"
8 #include "createnoteplugin_debug.h"
9 #include <Akonadi/ItemCreateJob>
10 #include <Akonadi/ItemModifyJob>
11 #include <Akonadi/KMime/MessageParts>
12 #include <Akonadi/Relation>
13 #include <Akonadi/RelationCreateJob>
14
15 #include <KMime/Message>
16 #include <QCoreApplication>
17
18 using namespace MessageViewer;
19
CreateNoteJob(const KMime::Message::Ptr & notePtr,const Akonadi::Collection & collection,const Akonadi::Item & item,QObject * parent)20 CreateNoteJob::CreateNoteJob(const KMime::Message::Ptr ¬ePtr, const Akonadi::Collection &collection, const Akonadi::Item &item, QObject *parent)
21 : KJob(parent)
22 , mItem(item)
23 , mCollection(collection)
24 , mNote(notePtr)
25 {
26 }
27
~CreateNoteJob()28 CreateNoteJob::~CreateNoteJob()
29 {
30 }
31
start()32 void CreateNoteJob::start()
33 {
34 mNote.setFrom(QCoreApplication::applicationName() + QLatin1Char(' ') + QCoreApplication::applicationVersion());
35 mNote.setLastModifiedDate(QDateTime::currentDateTimeUtc());
36 if (!mItem.relations().isEmpty()) {
37 Akonadi::Relation relation;
38 const auto relations = mItem.relations();
39 for (const Akonadi::Relation &r : relations) {
40 // assuming that GENERIC relations to emails are notes is a pretty horrific hack imo - aseigo
41 if (r.type() == Akonadi::Relation::GENERIC && r.right().mimeType() == Akonadi::NoteUtils::noteMimeType()) {
42 relation = r;
43 break;
44 }
45 }
46
47 if (relation.isValid()) {
48 Akonadi::Item item = relation.right();
49 item.setMimeType(Akonadi::NoteUtils::noteMimeType());
50 item.setPayload(mNote.message());
51 auto modifyJob = new Akonadi::ItemModifyJob(item);
52 connect(modifyJob, &Akonadi::ItemModifyJob::result, this, &CreateNoteJob::noteUpdated);
53 return;
54 }
55 }
56
57 Akonadi::Item newNoteItem;
58 newNoteItem.setMimeType(Akonadi::NoteUtils::noteMimeType());
59 newNoteItem.setPayload(mNote.message());
60 auto createJob = new Akonadi::ItemCreateJob(newNoteItem, mCollection);
61 connect(createJob, &Akonadi::ItemCreateJob::result, this, &CreateNoteJob::noteCreated);
62 }
63
noteCreated(KJob * job)64 void CreateNoteJob::noteCreated(KJob *job)
65 {
66 if (job->error()) {
67 qCWarning(CREATENOTEPLUGIN_LOG) << "Error during create new Note " << job->errorString();
68 setError(job->error());
69 setErrorText(job->errorText());
70 emitResult();
71 } else {
72 auto createJob = static_cast<Akonadi::ItemCreateJob *>(job);
73 Akonadi::Relation relation(Akonadi::Relation::GENERIC, mItem, createJob->item());
74 auto rJob = new Akonadi::RelationCreateJob(relation);
75 connect(rJob, &Akonadi::RelationCreateJob::result, this, &CreateNoteJob::relationCreated);
76 }
77 }
78
noteUpdated(KJob * job)79 void CreateNoteJob::noteUpdated(KJob *job)
80 {
81 if (job->error()) {
82 setError(job->error());
83 setErrorText(job->errorText());
84 }
85
86 emitResult();
87 }
88
relationCreated(KJob * job)89 void CreateNoteJob::relationCreated(KJob *job)
90 {
91 if (job->error()) {
92 qCDebug(CREATENOTEPLUGIN_LOG) << "Error during create new Note " << job->errorString();
93 }
94 emitResult();
95 }
96