File indexing completed on 2025-02-16 04:50:21

0001 /*
0002     SPDX-FileCopyrightText: 2010 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
0003     SPDX-FileContributor: Kevin Ottens <kevin@kdab.com>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #pragma once
0009 
0010 #include <QObject>
0011 #include <QStringList>
0012 
0013 #include "kimap/sessionuiproxy.h"
0014 #include <KIMAP/ListJob>
0015 #include <KIMAP/Session>
0016 
0017 namespace KIMAP
0018 {
0019 struct MailBoxDescriptor;
0020 }
0021 
0022 class ImapAccount;
0023 class PasswordRequesterInterface;
0024 
0025 class SessionPool : public QObject
0026 {
0027     Q_OBJECT
0028     Q_ENUMS(ConnectError)
0029 
0030 public:
0031     enum ErrorCodes {
0032         NoError,
0033         PasswordRequestError,
0034         ReconnectNeededError,
0035         EncryptionError,
0036         LoginFailError,
0037         CapabilitiesTestError,
0038         IncompatibleServerError,
0039         NoAvailableSessionError,
0040         CouldNotConnectError,
0041         CancelledError
0042     };
0043 
0044     enum SessionTermination {
0045         LogoutSession,
0046         CloseSession,
0047     };
0048 
0049     explicit SessionPool(int maxPoolSize, QObject *parent = nullptr);
0050     ~SessionPool() override;
0051 
0052     PasswordRequesterInterface *passwordRequester() const;
0053     void setPasswordRequester(PasswordRequesterInterface *requester);
0054     void cancelPasswordRequests();
0055 
0056     KIMAP::SessionUiProxy::Ptr sessionUiProxy() const;
0057     void setSessionUiProxy(KIMAP::SessionUiProxy::Ptr proxy);
0058 
0059     void setClientId(const QByteArray &clientId);
0060 
0061     [[nodiscard]] bool isConnected() const;
0062     bool connect(ImapAccount *account);
0063     void disconnect(SessionTermination termination = LogoutSession);
0064 
0065     [[nodiscard]] qint64 requestSession();
0066     void cancelSessionRequest(qint64 id);
0067     void releaseSession(KIMAP::Session *session);
0068 
0069     ImapAccount *account() const;
0070     [[nodiscard]] QStringList serverCapabilities() const;
0071     QList<KIMAP::MailBoxDescriptor> serverNamespaces() const;
0072     enum Namespace {
0073         Personal,
0074         User,
0075         Shared,
0076     };
0077     QList<KIMAP::MailBoxDescriptor> serverNamespaces(Namespace) const;
0078 
0079 Q_SIGNALS:
0080     void connectionLost(KIMAP::Session *session);
0081 
0082     void sessionRequestDone(qint64 requestNumber, KIMAP::Session *session, int errorCode = NoError, const QString &errorString = QString());
0083     void connectDone(int errorCode = NoError, const QString &errorString = QString());
0084     void disconnectDone();
0085 
0086 private Q_SLOTS:
0087     void processPendingRequests();
0088 
0089     void onPasswordRequestDone(int resultType, const QString &password);
0090     void onLoginDone(KJob *job);
0091     void onCapabilitiesTestDone(KJob *job);
0092     void onNamespacesTestDone(KJob *job);
0093     void onIdDone(KJob *job);
0094 
0095     void onSessionDestroyed(QObject *);
0096 
0097 private:
0098     void onConnectionLost();
0099     void killSession(KIMAP::Session *session, SessionTermination termination);
0100     void declareSessionReady(KIMAP::Session *session);
0101     void cancelSessionCreation(KIMAP::Session *session, int errorCode, const QString &errorString);
0102     void requestPassword();
0103 
0104     static qint64 m_requestCounter;
0105 
0106     const int m_maxPoolSize;
0107     ImapAccount *m_account = nullptr;
0108     PasswordRequesterInterface *m_passwordRequester = nullptr;
0109     KIMAP::SessionUiProxy::Ptr m_sessionUiProxy;
0110 
0111     bool m_initialConnectDone = false;
0112     KIMAP::Session *m_pendingInitialSession = nullptr;
0113 
0114     QList<qint64> m_pendingRequests;
0115     QList<KIMAP::Session *> m_connectingPool; // in preparation
0116     QList<KIMAP::Session *> m_unusedPool; // ready to be used
0117     QList<KIMAP::Session *> m_reservedPool; // currently used
0118 
0119     QStringList m_capabilities;
0120     QList<KIMAP::MailBoxDescriptor> m_namespaces;
0121     QList<KIMAP::MailBoxDescriptor> m_personalNamespaces;
0122     QList<KIMAP::MailBoxDescriptor> m_userNamespaces;
0123     QList<KIMAP::MailBoxDescriptor> m_sharedNamespaces;
0124     QByteArray m_clientId;
0125 };