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 &notePtr, 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