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"