File indexing completed on 2024-06-23 05:21:16

0001 /* Copyright (C) 2006 - 2014 Jan Kundrát <jkt@flaska.net>
0002 
0003    This file is part of the Trojita Qt IMAP e-mail client,
0004    http://trojita.flaska.net/
0005 
0006    This program is free software; you can redistribute it and/or
0007    modify it under the terms of the GNU General Public License as
0008    published by the Free Software Foundation; either version 2 of
0009    the License or (at your option) version 3 or any later version
0010    accepted by the membership of KDE e.V. (or its successor approved
0011    by the membership of KDE e.V.), which shall act as a proxy
0012    defined in Section 14 of version 3 of the license.
0013 
0014    This program is distributed in the hope that it will be useful,
0015    but WITHOUT ANY WARRANTY; without even the implied warranty of
0016    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0017    GNU General Public License for more details.
0018 
0019    You should have received a copy of the GNU General Public License
0020    along with this program.  If not, see <http://www.gnu.org/licenses/>.
0021 */
0022 
0023 #ifndef IMAP_THREAD_TASK_H
0024 #define IMAP_THREAD_TASK_H
0025 
0026 #include <QPersistentModelIndex>
0027 #include "ImapTask.h"
0028 
0029 namespace Imap
0030 {
0031 namespace Mailbox
0032 {
0033 
0034 /** @short Send the THREAD command with requested parameters  */
0035 class ThreadTask : public ImapTask
0036 {
0037     Q_OBJECT
0038 public:
0039 
0040     /** @short Is this a regular threading request, or an incremental operation? */
0041     typedef enum {
0042         /** @short Regular threading request */
0043         THREADING_REGULAR,
0044         /** @short Incremental request */
0045         THREADING_INCREMENTAL
0046     } ThreadingIncrementalMode;
0047 
0048     ThreadTask(Model *model, const QModelIndex &mailbox, const QByteArray &algorithm, const QStringList &searchCriteria,
0049                const ThreadingIncrementalMode incrementalMode = THREADING_REGULAR);
0050     void perform() override;
0051 
0052     bool handleStateHelper(const Imap::Responses::State *const resp) override;
0053     bool handleThread(const Imap::Responses::Thread *const resp) override;
0054     bool handleESearch(const Responses::ESearch *const resp) override;
0055     QVariant taskData(const int role) const override;
0056     bool needsMailbox() const override {return true;}
0057 signals:
0058     /** @short An incremental update to the threading as per draft-imap-incthread */
0059     void incrementalThreadingAvailable(const Responses::ESearch::IncrementalThreadingData_t &update);
0060 protected:
0061     void _failed(const QString &errorMessage) override;
0062 private:
0063     CommandHandle tag;
0064     ImapTask *conn;
0065     QPersistentModelIndex mailboxIndex;
0066     QByteArray algorithm;
0067     QStringList searchCriteria;
0068     QVector<Imap::Responses::ThreadingNode> mapping;
0069     bool m_incrementalMode;
0070 };
0071 
0072 }
0073 }
0074 
0075 #endif // IMAP_THREAD_TASK_H