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