1 /* Copyright (C) 2006 - 2014 Jan Kundrát <jkt@flaska.net>
2 
3    This file is part of the Trojita Qt IMAP e-mail client,
4    http://trojita.flaska.net/
5 
6    This program is free software; you can redistribute it and/or
7    modify it under the terms of the GNU General Public License as
8    published by the Free Software Foundation; either version 2 of
9    the License or (at your option) version 3 or any later version
10    accepted by the membership of KDE e.V. (or its successor approved
11    by the membership of KDE e.V.), which shall act as a proxy
12    defined in Section 14 of version 3 of the license.
13 
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18 
19    You should have received a copy of the GNU General Public License
20    along with this program.  If not, see <http://www.gnu.org/licenses/>.
21 */
22 
23 #ifndef TROJITA_IMAPACCESS_H
24 #define TROJITA_IMAPACCESS_H
25 
26 #include <QObject>
27 #include <QSslError>
28 
29 #include "Common/ConnectionMethod.h"
30 #include "Common/Logging.h"
31 #include "Imap/Model/NetworkPolicy.h"
32 #include "UiUtils/Formatting.h"
33 
34 class QModelIndex;
35 class QNetworkAccessManager;
36 class QSettings;
37 
38 namespace Plugins {
39 class PluginManager;
40 }
41 
42 namespace UiUtils {
43 class PasswordWatcher;
44 }
45 
46 namespace Imap {
47 
48 namespace Mailbox {
49 class MailboxModel;
50 class Model;
51 class MsgListModel;
52 class NetworkWatcher;
53 class OneMessageModel;
54 class SubtreeModelOfMailboxModel;
55 class ThreadingMsgListModel;
56 class VisibleTasksModel;
57 }
58 
59 class ImapAccess : public QObject
60 {
61     Q_OBJECT
62 
63     Q_PROPERTY(bool isConfigured READ isConfigured NOTIFY modelsChanged)
64     Q_PROPERTY(QObject *imapModel READ imapModel NOTIFY modelsChanged)
65     Q_PROPERTY(QObject *mailboxModel READ mailboxModel NOTIFY modelsChanged)
66     Q_PROPERTY(QObject *msgListModel READ msgListModel NOTIFY modelsChanged)
67     Q_PROPERTY(QObject *threadingMsgListModel READ threadingMsgListModel NOTIFY modelsChanged)
68     Q_PROPERTY(QObject *visibleTasksModel READ visibleTasksModel NOTIFY modelsChanged)
69     Q_PROPERTY(QObject *oneMessageModel READ oneMessageModel NOTIFY modelsChanged)
70     Q_PROPERTY(QObject *networkWatcher READ networkWatcher NOTIFY modelsChanged)
71     Q_PROPERTY(QObject *msgQNAM READ msgQNAM NOTIFY modelsChanged)
72     Q_PROPERTY(UiUtils::PasswordWatcher *passwordWatcher READ passwordWatcher NOTIFY modelsChanged)
73     Q_PROPERTY(QString server READ server WRITE setServer NOTIFY serverChanged)
74     Q_PROPERTY(int port READ port WRITE setPort NOTIFY portChanged)
75     Q_PROPERTY(QString username READ username WRITE setUsername NOTIFY usernameChanged)
76     Q_PROPERTY(QString sslMode READ sslMode WRITE setSslMode NOTIFY connMethodChanged)
77     Q_PROPERTY(QString sslInfoTitle READ sslInfoTitle NOTIFY checkSslPolicy)
78     Q_PROPERTY(QString sslInfoMessage READ sslInfoMessage NOTIFY checkSslPolicy)
79     Q_PROPERTY(int numberRefreshInterval READ numberRefreshInterval WRITE setNumberRefreshInterval NOTIFY numberRefreshIntervalChanged)
80     Q_ENUMS(Imap::ImapAccess::ConnectionMethod)
81 
82 public:
83     ImapAccess(QObject *parent, QSettings *settings, Plugins::PluginManager *pluginManager, const QString &accountName);
84 
85     bool isConfigured() const;
86     QAbstractItemModel *imapModel() const;
87     QAbstractItemModel *mailboxModel() const;
88     QAbstractItemModel *msgListModel() const;
89     QAbstractItemModel *visibleTasksModel() const;
90     QObject *oneMessageModel() const;
91     QObject *networkWatcher() const;
92     QAbstractItemModel *threadingMsgListModel() const;
93     QObject *msgQNAM() const;
94     UiUtils::PasswordWatcher *passwordWatcher() const;
95 
96     QString server() const;
97     void setServer(const QString &server);
98     int port() const;
99     void setPort(const int port);
100     QString username() const;
101     void setUsername(const QString &username);
102     QString password() const;
103     void setPassword(const QString &password);
104     QString sslMode() const;
105     void setSslMode(const QString &sslMode);
106     int numberRefreshInterval() const;
107     void setNumberRefreshInterval(const int interval);
108 
109     QString accountName() const;
110 
111     Common::ConnectionMethod connectionMethod() const;
112     void setConnectionMethod(const Common::ConnectionMethod mode);
113 
114     Imap::Mailbox::NetworkPolicy preferredNetworkPolicy() const;
115 
116     Q_INVOKABLE void doConnect();
117 
118     QString sslInfoTitle() const;
119     QString sslInfoMessage() const;
120     UiUtils::Formatting::IconType sslInfoIcon() const;
121 
122     Q_INVOKABLE void openMessage(const QString &mailbox, const uint uid);
123     Q_INVOKABLE void setSslPolicy(bool accept);
124     Q_INVOKABLE void forgetSslCertificate();
125 
126     Q_INVOKABLE void nukeCache();
127 
128     Q_INVOKABLE QString mailboxListShortMailboxName() const;
129     Q_INVOKABLE QString mailboxListMailboxName() const;
130 
131     Q_INVOKABLE QModelIndex deproxifiedIndex(const QModelIndex index);
132     Q_INVOKABLE void markMessageDeleted(const QModelIndex &message, bool marked);
133 signals:
134     void serverChanged();
135     void portChanged();
136     void usernameChanged();
137     void connMethodChanged();
138     void modelsChanged();
139     void checkSslPolicy();
140     void cacheError(const QString &message);
141     void numberRefreshIntervalChanged();
142 
143 public slots:
144     void alertReceived(const QString &message);
145     void imapError(const QString &message);
146     void networkError(const QString &message);
147     void onCacheError(const QString &message);
148     void slotLogged(uint parserId, const Common::LogMessage &message);
149     void slotSslErrors(const QList<QSslCertificate> &sslCertificateChain, const QList<QSslError> &sslErrors);
150     void reloadConfiguration();
151 
152 private slots:
153     void onRequireStartTlsInFuture();
154     void desiredNetworkPolicyChanged(const Imap::Mailbox::NetworkPolicy policy);
155 
156 private:
157     QSettings *m_settings;
158     Imap::Mailbox::Model *m_imapModel;
159     Imap::Mailbox::MailboxModel *m_mailboxModel;
160     Imap::Mailbox::SubtreeModelOfMailboxModel *m_mailboxSubtreeModel;
161     Imap::Mailbox::MsgListModel *m_msgListModel;
162     Imap::Mailbox::ThreadingMsgListModel *m_threadingMsgListModel;
163     Imap::Mailbox::VisibleTasksModel *m_visibleTasksModel;
164     Imap::Mailbox::OneMessageModel *m_oneMessageModel;
165     Imap::Mailbox::NetworkWatcher *m_netWatcher;
166     QNetworkAccessManager *m_msgQNAM;
167     Plugins::PluginManager *m_pluginManager;
168     UiUtils::PasswordWatcher *m_passwordWatcher;
169 
170     QString m_server;
171     int m_port;
172     QString m_username;
173     QString m_password;
174     Common::ConnectionMethod m_connectionMethod;
175 
176     QList<QSslCertificate> m_sslChain;
177     QList<QSslError> m_sslErrors;
178     QString m_sslInfoTitle;
179     QString m_sslInfoMessage;
180     UiUtils::Formatting::IconType m_sslInfoIcon;
181 
182     QString m_accountName;
183     QString m_cacheDir;
184 };
185 
186 }
187 
188 #endif // TROJITA_IMAPACCESS_H
189