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 "akonadimailtransportplugin.h"
8 #include "mailtransportplugin_akonadi_debug.h"
9 #include "resourcesendjob_p.h"
10 #include <Akonadi/AgentConfigurationDialog>
11 #include <Akonadi/AgentInstanceCreateJob>
12 #include <Akonadi/AgentManager>
13 #include <KPluginFactory>
14 #include <MailTransport/Transport>
15
16 using namespace Akonadi;
17
18 K_PLUGIN_CLASS_WITH_JSON(AkonadiMailTransportPlugin, "akonadimailtransport.json")
19
AkonadiMailTransportPlugin(QObject * parent,const QList<QVariant> &)20 AkonadiMailTransportPlugin::AkonadiMailTransportPlugin(QObject *parent, const QList<QVariant> &)
21 : MailTransport::TransportAbstractPlugin(parent)
22 {
23 // Watch for appearing and disappearing types.
24 connect(AgentManager::self(), &AgentManager::typeAdded, this, &AkonadiMailTransportPlugin::slotUpdatePluginList);
25 connect(AgentManager::self(), &AgentManager::typeRemoved, this, &AkonadiMailTransportPlugin::slotUpdatePluginList);
26 }
27
~AkonadiMailTransportPlugin()28 AkonadiMailTransportPlugin::~AkonadiMailTransportPlugin()
29 {
30 }
31
slotUpdatePluginList(const Akonadi::AgentType & type)32 void AkonadiMailTransportPlugin::slotUpdatePluginList(const Akonadi::AgentType &type)
33 {
34 if (type.capabilities().contains(QLatin1String("MailTransport"))) {
35 Q_EMIT updatePluginList();
36 }
37 }
38
cleanUp(MailTransport::Transport * t)39 void AkonadiMailTransportPlugin::cleanUp(MailTransport::Transport *t)
40 {
41 const AgentInstance instance = AgentManager::self()->instance(t->host());
42 if (!instance.isValid()) {
43 qCWarning(MAILTRANSPORT_AKONADI_LOG) << "Could not find resource instance for name:" << t->host();
44 }
45 AgentManager::self()->removeInstance(instance);
46 }
47
names() const48 QVector<MailTransport::TransportAbstractPluginInfo> AkonadiMailTransportPlugin::names() const
49 {
50 QVector<MailTransport::TransportAbstractPluginInfo> lst;
51
52 const auto types{AgentManager::self()->types()};
53 for (const AgentType &atype : types) {
54 // TODO probably the string "MailTransport" should be #defined somewhere
55 // and used like that in the resources (?)
56 if (atype.capabilities().contains(QLatin1String("MailTransport"))) {
57 MailTransport::TransportAbstractPluginInfo info;
58 info.name = atype.name();
59 info.description = atype.description();
60 info.identifier = atype.identifier();
61 info.isAkonadi = true;
62 lst << info;
63 }
64 }
65 return lst;
66 }
67
configureTransport(const QString & identifier,MailTransport::Transport * transport,QWidget * parent)68 bool AkonadiMailTransportPlugin::configureTransport(const QString &identifier, MailTransport::Transport *transport, QWidget *parent)
69 {
70 Q_UNUSED(identifier)
71 AgentInstance instance = AgentManager::self()->instance(transport->host());
72 if (!instance.isValid()) {
73 qCWarning(MAILTRANSPORT_AKONADI_LOG) << "Invalid resource instance" << transport->host();
74 return false;
75 }
76 QPointer<Akonadi::AgentConfigurationDialog> dlg = new Akonadi::AgentConfigurationDialog(instance, parent); // Async...
77 dlg->exec();
78 delete dlg;
79 transport->save();
80 return true; // No way to know here if the user cancelled or not.
81 }
82
createTransportJob(MailTransport::Transport * t,const QString & identifier)83 MailTransport::TransportJob *AkonadiMailTransportPlugin::createTransportJob(MailTransport::Transport *t, const QString &identifier)
84 {
85 Q_UNUSED(identifier)
86 return new MailTransport::ResourceSendJob(t, this);
87 }
88
initializeTransport(MailTransport::Transport * t,const QString & identifier)89 void AkonadiMailTransportPlugin::initializeTransport(MailTransport::Transport *t, const QString &identifier)
90 {
91 auto cjob = new AgentInstanceCreateJob(identifier);
92 if (!cjob->exec()) {
93 qCWarning(MAILTRANSPORT_AKONADI_LOG) << "Failed to create agent instance of type" << identifier;
94 return;
95 }
96 t->setHost(cjob->instance().identifier());
97 }
98
99 #include "akonadimailtransportplugin.moc"
100