File indexing completed on 2024-05-19 05:16:10
0001 /* 0002 SPDX-FileCopyrightText: 2017-2024 Laurent Montel <montel@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "akonadimailtransportplugin.h" 0008 #include "mailtransportplugin_akonadi_debug.h" 0009 #include "resourcesendjob_p.h" 0010 #include <Akonadi/AgentConfigurationDialog> 0011 #include <Akonadi/AgentInstanceCreateJob> 0012 #include <Akonadi/AgentManager> 0013 #include <KPluginFactory> 0014 #include <MailTransport/Transport> 0015 #include <QPointer> 0016 0017 using namespace Akonadi; 0018 0019 K_PLUGIN_CLASS_WITH_JSON(AkonadiMailTransportPlugin, "akonadimailtransport.json") 0020 0021 AkonadiMailTransportPlugin::AkonadiMailTransportPlugin(QObject *parent, const QList<QVariant> &) 0022 : MailTransport::TransportAbstractPlugin(parent) 0023 { 0024 // Watch for appearing and disappearing types. 0025 connect(AgentManager::self(), &AgentManager::typeAdded, this, &AkonadiMailTransportPlugin::slotUpdatePluginList); 0026 connect(AgentManager::self(), &AgentManager::typeRemoved, this, &AkonadiMailTransportPlugin::slotUpdatePluginList); 0027 } 0028 0029 AkonadiMailTransportPlugin::~AkonadiMailTransportPlugin() = default; 0030 0031 void AkonadiMailTransportPlugin::slotUpdatePluginList(const Akonadi::AgentType &type) 0032 { 0033 if (type.capabilities().contains(QLatin1StringView("MailTransport"))) { 0034 Q_EMIT updatePluginList(); 0035 } 0036 } 0037 0038 void AkonadiMailTransportPlugin::cleanUp(MailTransport::Transport *t) 0039 { 0040 const AgentInstance instance = AgentManager::self()->instance(t->host()); 0041 if (!instance.isValid()) { 0042 qCWarning(MAILTRANSPORT_AKONADI_LOG) << "Could not find resource instance for name:" << t->host(); 0043 } 0044 AgentManager::self()->removeInstance(instance); 0045 } 0046 0047 QList<MailTransport::TransportAbstractPluginInfo> AkonadiMailTransportPlugin::names() const 0048 { 0049 QList<MailTransport::TransportAbstractPluginInfo> lst; 0050 0051 const auto types{AgentManager::self()->types()}; 0052 for (const AgentType &atype : types) { 0053 // TODO probably the string "MailTransport" should be #defined somewhere 0054 // and used like that in the resources (?) 0055 if (atype.capabilities().contains(QLatin1StringView("MailTransport"))) { 0056 MailTransport::TransportAbstractPluginInfo info; 0057 info.name = atype.name(); 0058 info.description = atype.description(); 0059 info.identifier = atype.identifier(); 0060 info.isAkonadi = true; 0061 lst << std::move(info); 0062 } 0063 } 0064 return lst; 0065 } 0066 0067 bool AkonadiMailTransportPlugin::configureTransport(const QString &identifier, MailTransport::Transport *transport, QWidget *parent) 0068 { 0069 Q_UNUSED(identifier) 0070 AgentInstance instance = AgentManager::self()->instance(transport->host()); 0071 if (!instance.isValid()) { 0072 qCWarning(MAILTRANSPORT_AKONADI_LOG) << "Invalid resource instance" << transport->host(); 0073 return false; 0074 } 0075 Akonadi::AgentConfigurationDialog dlg(instance, parent); // Async... 0076 dlg.exec(); 0077 transport->save(); 0078 return true; // No way to know here if the user cancelled or not. 0079 } 0080 0081 MailTransport::TransportJob *AkonadiMailTransportPlugin::createTransportJob(MailTransport::Transport *t, const QString &identifier) 0082 { 0083 Q_UNUSED(identifier) 0084 return new MailTransport::ResourceSendJob(t, this); 0085 } 0086 0087 void AkonadiMailTransportPlugin::initializeTransport(MailTransport::Transport *t, const QString &identifier) 0088 { 0089 auto cjob = new AgentInstanceCreateJob(identifier); 0090 if (!cjob->exec()) { 0091 qCWarning(MAILTRANSPORT_AKONADI_LOG) << "Failed to create agent instance of type" << identifier; 0092 return; 0093 } 0094 t->setHost(cjob->instance().identifier()); 0095 } 0096 0097 #include "akonadimailtransportplugin.moc" 0098 0099 #include "moc_akonadimailtransportplugin.cpp"