File indexing completed on 2024-05-12 05:17:17

0001 /*
0002     SPDX-FileCopyrightText: 2009 Kevin Ottens <ervin@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #pragma once
0008 
0009 #include "session.h"
0010 #include "sessionuiproxy.h"
0011 
0012 #include <QObject>
0013 #include <QQueue>
0014 #include <QSslSocket>
0015 #include <QString>
0016 #include <QTimer>
0017 
0018 class KJob;
0019 
0020 namespace KIMAP
0021 {
0022 class Job;
0023 struct Response;
0024 class SessionLogger;
0025 class SessionThread;
0026 
0027 class KIMAP_EXPORT SessionPrivate : public QObject
0028 {
0029     Q_OBJECT
0030 
0031     friend class Session;
0032 
0033 public:
0034     explicit SessionPrivate(Session *session);
0035     ~SessionPrivate() override;
0036 
0037     void addJob(Job *job);
0038     QByteArray sendCommand(const QByteArray &command, const QByteArray &args = QByteArray());
0039     void startSsl(QSsl::SslProtocol protocol);
0040     void sendData(const QByteArray &data);
0041 
0042     QSsl::SslProtocol negotiatedEncryption() const;
0043 
0044     void setSocketTimeout(int ms);
0045     int socketTimeout() const;
0046 
0047 Q_SIGNALS:
0048     void encryptionNegotiationResult(bool);
0049 
0050 private Q_SLOTS:
0051     void onEncryptionNegotiationResult(bool isEncrypted, QSsl::SslProtocol sslVersion);
0052     void onSocketTimeout();
0053 
0054     void doStartNext();
0055     void jobDone(KJob *);
0056     void jobDestroyed(QObject *);
0057     void responseReceived(const KIMAP::Response &);
0058 
0059     void socketConnected();
0060     void socketDisconnected();
0061     void socketError(QAbstractSocket::SocketError error);
0062     void socketActivity();
0063 
0064     void handleSslError(const KSslErrorUiData &errorData);
0065 
0066 private:
0067     void startNext();
0068     void clearJobQueue();
0069     void setState(Session::State state);
0070 
0071     void startSocketTimer();
0072     void stopSocketTimer();
0073     void restartSocketTimer();
0074     bool isConnected() const;
0075 
0076     Session *const q;
0077 
0078     bool isSocketConnected = false;
0079     Session::State state;
0080 
0081     SessionLogger *logger = nullptr;
0082     SessionThread *thread = nullptr;
0083     SessionUiProxy::Ptr uiProxy;
0084 
0085     bool jobRunning = false;
0086     Job *currentJob = nullptr;
0087     QQueue<Job *> queue;
0088 
0089     QByteArray authTag;
0090     QByteArray selectTag;
0091     QByteArray closeTag;
0092 
0093     QString userName;
0094     QByteArray greeting;
0095     QByteArray currentMailBox;
0096     QByteArray upcomingMailBox;
0097     quint16 tagCount;
0098 
0099     QSsl::SslProtocol sslVersion;
0100 
0101     int socketTimerInterval = 0;
0102     QTimer socketTimer;
0103 };
0104 
0105 }