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 };