You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
615 lines
15 KiB
615 lines
15 KiB
// |
|
|
|
#ifndef KMCommands_h |
|
#define KMCommands_h |
|
#include <MessageComposer/MessageFactoryNG> |
|
#include "MessageList/View" |
|
#include "mailcommon/searchpattern.h" |
|
#include "messageviewer/viewer.h" |
|
|
|
#include <Akonadi/KMime/MessageStatus> |
|
#include <kio/job.h> |
|
#include <kmime/kmime_message.h> |
|
|
|
#include <QPointer> |
|
#include <QList> |
|
#include <AkonadiCore/item.h> |
|
#include <AkonadiCore/itemfetchscope.h> |
|
#include <AkonadiCore/collection.h> |
|
#include <QUrl> |
|
namespace Akonadi { |
|
class Tag; |
|
} |
|
|
|
namespace KPIM { |
|
class ProgressItem; |
|
} |
|
|
|
using Akonadi::MessageStatus; |
|
|
|
class QProgressDialog; |
|
class KMMainWidget; |
|
class KMReaderMainWin; |
|
|
|
template<typename T> class QSharedPointer; |
|
|
|
namespace MessageViewer { |
|
class HeaderStyle; |
|
class AttachmentStrategy; |
|
} |
|
|
|
namespace KIO { |
|
class Job; |
|
} |
|
namespace KMail { |
|
class Composer; |
|
} |
|
typedef QMap<KMime::Content *, Akonadi::Item> PartNodeMessageMap; |
|
/// Small helper structure which encapsulates the KMMessage created when creating a reply, and |
|
|
|
class KMCommand : public QObject |
|
{ |
|
Q_OBJECT |
|
|
|
public: |
|
enum Result { |
|
Undefined, OK, Canceled, Failed |
|
}; |
|
|
|
// Trival constructor, don't retrieve any messages |
|
explicit KMCommand(QWidget *parent = nullptr); |
|
KMCommand(QWidget *parent, const Akonadi::Item &); |
|
// Retrieve all messages in msgList when start is called. |
|
KMCommand(QWidget *parent, const Akonadi::Item::List &msgList); |
|
// Retrieve the single message msgBase when start is called. |
|
~KMCommand() override; |
|
|
|
/** Returns the result of the command. Only call this method from the slot |
|
connected to completed(). |
|
*/ |
|
Result result() const; |
|
|
|
public Q_SLOTS: |
|
// Retrieve messages then calls execute |
|
void start(); |
|
|
|
Q_SIGNALS: |
|
|
|
/// @param result The status of the command. |
|
void messagesTransfered(KMCommand::Result result); |
|
|
|
/// Emitted when the command has completed. |
|
void completed(KMCommand *command); |
|
|
|
protected: |
|
virtual Akonadi::ItemFetchJob *createFetchJob(const Akonadi::Item::List &items); |
|
|
|
/** Allows to configure how much data should be retrieved of the messages. */ |
|
Akonadi::ItemFetchScope &fetchScope() |
|
{ |
|
return mFetchScope; |
|
} |
|
|
|
// Returns list of messages retrieved |
|
const Akonadi::Item::List retrievedMsgs() const; |
|
// Returns the single message retrieved |
|
Akonadi::Item retrievedMessage() const; |
|
// Returns the parent widget |
|
QWidget *parentWidget() const; |
|
|
|
bool deletesItself() const; |
|
/** Specify whether the subclass takes care of the deletion of the object. |
|
By default the base class will delete the object. |
|
@param deletesItself true if the subclass takes care of deletion, false |
|
if the base class should take care of deletion |
|
*/ |
|
void setDeletesItself(bool deletesItself); |
|
|
|
bool emitsCompletedItself() const; |
|
/** Specify whether the subclass takes care of emitting the completed() |
|
signal. By default the base class will Q_EMIT this signal. |
|
@param emitsCompletedItself true if the subclass emits the completed |
|
signal, false if the base class should Q_EMIT |
|
the signal |
|
*/ |
|
void setEmitsCompletedItself(bool emitsCompletedItself); |
|
|
|
/** Use this to set the result of the command. |
|
@param result The result of the command. |
|
*/ |
|
void setResult(Result result); |
|
|
|
private: |
|
Q_DISABLE_COPY(KMCommand) |
|
// execute should be implemented by derived classes |
|
virtual Result execute() = 0; |
|
|
|
/** transfers the list of (imap)-messages |
|
* this is a necessary preparation for e.g. forwarding */ |
|
void transferSelectedMsgs(); |
|
|
|
private Q_SLOTS: |
|
void slotPostTransfer(KMCommand::Result result); |
|
/** the msg has been transferred */ |
|
void slotMsgTransfered(const Akonadi::Item::List &msgs); |
|
/** the KMImapJob is finished */ |
|
void slotJobFinished(); |
|
/** the transfer was canceled */ |
|
void slotTransferCancelled(); |
|
|
|
protected: |
|
Akonadi::Item::List mRetrievedMsgs; |
|
|
|
private: |
|
// ProgressDialog for transferring messages |
|
QPointer<QProgressDialog> mProgressDialog; |
|
//Currently only one async command allowed at a time |
|
static int mCountJobs; |
|
int mCountMsgs; |
|
Result mResult; |
|
bool mDeletesItself : 1; |
|
bool mEmitsCompletedItself : 1; |
|
|
|
QWidget *mParent = nullptr; |
|
Akonadi::Item::List mMsgList; |
|
Akonadi::ItemFetchScope mFetchScope; |
|
}; |
|
|
|
class KMMailtoComposeCommand : public KMCommand |
|
{ |
|
Q_OBJECT |
|
|
|
public: |
|
explicit KMMailtoComposeCommand(const QUrl &url, const Akonadi::Item &msg = Akonadi::Item()); |
|
|
|
private: |
|
Result execute() override; |
|
|
|
QUrl mUrl; |
|
Akonadi::Item mMessage; |
|
}; |
|
|
|
class KMMailtoReplyCommand : public KMCommand |
|
{ |
|
Q_OBJECT |
|
|
|
public: |
|
KMMailtoReplyCommand(QWidget *parent, const QUrl &url, const Akonadi::Item &msg, const QString &selection); |
|
|
|
private: |
|
Result execute() override; |
|
|
|
QUrl mUrl; |
|
QString mSelection; |
|
}; |
|
|
|
class KMMailtoForwardCommand : public KMCommand |
|
{ |
|
Q_OBJECT |
|
|
|
public: |
|
KMMailtoForwardCommand(QWidget *parent, const QUrl &url, const Akonadi::Item &msg); |
|
|
|
private: |
|
Result execute() override; |
|
QUrl mUrl; |
|
}; |
|
|
|
class KMAddBookmarksCommand : public KMCommand |
|
{ |
|
Q_OBJECT |
|
|
|
public: |
|
KMAddBookmarksCommand(const QUrl &url, QWidget *parent); |
|
|
|
private: |
|
Result execute() override; |
|
|
|
QUrl mUrl; |
|
}; |
|
|
|
class KMUrlSaveCommand : public KMCommand |
|
{ |
|
Q_OBJECT |
|
|
|
public: |
|
KMUrlSaveCommand(const QUrl &url, QWidget *parent); |
|
|
|
private Q_SLOTS: |
|
void slotUrlSaveResult(KJob *job); |
|
|
|
private: |
|
Result execute() override; |
|
|
|
QUrl mUrl; |
|
}; |
|
|
|
class KMEditItemCommand : public KMCommand |
|
{ |
|
Q_OBJECT |
|
|
|
public: |
|
explicit KMEditItemCommand(QWidget *parent, const Akonadi::Item &msg, bool deleteFromSource = true); |
|
~KMEditItemCommand(); |
|
private Q_SLOTS: |
|
void slotDeleteItem(KJob *job); |
|
private: |
|
Result execute() override; |
|
bool mDeleteFromSource = false; |
|
}; |
|
|
|
class KMEditMessageCommand : public KMCommand |
|
{ |
|
Q_OBJECT |
|
|
|
public: |
|
explicit KMEditMessageCommand(QWidget *parent, const KMime::Message::Ptr &msg); |
|
private: |
|
Result execute() override; |
|
KMime::Message::Ptr mMessage; |
|
}; |
|
|
|
class KMUseTemplateCommand : public KMCommand |
|
{ |
|
Q_OBJECT |
|
|
|
public: |
|
KMUseTemplateCommand(QWidget *parent, const Akonadi::Item &msg); |
|
|
|
private: |
|
Result execute() override; |
|
}; |
|
|
|
class KMSaveMsgCommand : public KMCommand |
|
{ |
|
Q_OBJECT |
|
|
|
public: |
|
KMSaveMsgCommand(QWidget *parent, const Akonadi::Item::List &msgList); |
|
|
|
private: |
|
Result execute() override; |
|
}; |
|
|
|
class KMOpenMsgCommand : public KMCommand |
|
{ |
|
Q_OBJECT |
|
|
|
public: |
|
explicit KMOpenMsgCommand(QWidget *parent, const QUrl &url = QUrl(), const QString &encoding = QString(), KMMainWidget *main = nullptr); |
|
|
|
private: |
|
Result execute() override; |
|
|
|
private Q_SLOTS: |
|
void slotDataArrived(KIO::Job *job, const QByteArray &data); |
|
void slotResult(KJob *job); |
|
|
|
private: |
|
void doesNotContainMessage(); |
|
static const int MAX_CHUNK_SIZE = 64 * 1024; |
|
QUrl mUrl; |
|
QString mMsgString; |
|
KIO::TransferJob *mJob = nullptr; |
|
const QString mEncoding; |
|
KMMainWidget *mMainWidget = nullptr; |
|
}; |
|
|
|
class KMSaveAttachmentsCommand : public KMCommand |
|
{ |
|
Q_OBJECT |
|
public: |
|
/** Use this to save all attachments of the given message. |
|
@param parent The parent widget of the command used for message boxes. |
|
@param msg The message of which the attachments should be saved. |
|
*/ |
|
KMSaveAttachmentsCommand(QWidget *parent, const Akonadi::Item &msg, MessageViewer::Viewer *viewer); |
|
/** Use this to save all attachments of the given messages. |
|
@param parent The parent widget of the command used for message boxes. |
|
@param msgs The messages of which the attachments should be saved. |
|
*/ |
|
KMSaveAttachmentsCommand(QWidget *parent, const Akonadi::Item::List &msgs); |
|
|
|
private: |
|
Result execute() override; |
|
MessageViewer::Viewer *mViewer = nullptr; |
|
}; |
|
|
|
class KMReplyCommand : public KMCommand |
|
{ |
|
Q_OBJECT |
|
public: |
|
KMReplyCommand(QWidget *parent, const Akonadi::Item &msg, MessageComposer::ReplyStrategy replyStrategy, |
|
const QString &selection = QString(), bool noquote = false, const QString &templateName = QString()); |
|
private: |
|
Result execute() override; |
|
|
|
private: |
|
QString mSelection; |
|
QString mTemplate; |
|
MessageComposer::ReplyStrategy m_replyStrategy; |
|
bool mNoQuote = false; |
|
}; |
|
|
|
class KMForwardCommand : public KMCommand |
|
{ |
|
Q_OBJECT |
|
|
|
public: |
|
KMForwardCommand(QWidget *parent, const Akonadi::Item::List &msgList, uint identity = 0, const QString &templateName = QString(), const QString &selection = QString()); |
|
KMForwardCommand(QWidget *parent, const Akonadi::Item &msg, uint identity = 0, const QString &templateName = QString(), const QString &selection = QString()); |
|
|
|
private: |
|
KMCommand::Result createComposer(const Akonadi::Item &item); |
|
Result execute() override; |
|
|
|
private: |
|
uint mIdentity; |
|
QString mTemplate; |
|
QString mSelection; |
|
}; |
|
|
|
class KMForwardAttachedCommand : public KMCommand |
|
{ |
|
Q_OBJECT |
|
|
|
public: |
|
KMForwardAttachedCommand(QWidget *parent, const Akonadi::Item::List &msgList, uint identity = 0, KMail::Composer *win = nullptr); |
|
KMForwardAttachedCommand(QWidget *parent, const Akonadi::Item &msg, uint identity = 0, KMail::Composer *win = nullptr); |
|
|
|
private: |
|
Result execute() override; |
|
|
|
uint mIdentity; |
|
QPointer<KMail::Composer> mWin; |
|
}; |
|
|
|
class KMRedirectCommand : public KMCommand |
|
{ |
|
Q_OBJECT |
|
|
|
public: |
|
KMRedirectCommand(QWidget *parent, const Akonadi::Item &msg); |
|
KMRedirectCommand(QWidget *parent, const Akonadi::Item::List &msgList); |
|
|
|
private: |
|
Result execute() override; |
|
}; |
|
|
|
class KMPrintCommand : public KMCommand |
|
{ |
|
Q_OBJECT |
|
|
|
public: |
|
KMPrintCommand(QWidget *parent, const Akonadi::Item &msg, MessageViewer::HeaderStylePlugin *plugin = nullptr, |
|
MessageViewer::Viewer::DisplayFormatMessage format = MessageViewer::Viewer::UseGlobalSetting, bool htmlLoadExtOverride = false, bool useFixedFont = false, |
|
const QString &encoding = QString()); |
|
|
|
void setOverrideFont(const QFont &); |
|
void setAttachmentStrategy(const MessageViewer::AttachmentStrategy *strategy); |
|
void setPrintPreview(bool preview); |
|
|
|
private: |
|
Result execute() override; |
|
|
|
MessageViewer::HeaderStylePlugin *mHeaderStylePlugin = nullptr; |
|
const MessageViewer::AttachmentStrategy *mAttachmentStrategy = nullptr; |
|
QFont mOverrideFont; |
|
QString mEncoding; |
|
MessageViewer::Viewer::DisplayFormatMessage mFormat; |
|
bool mHtmlLoadExtOverride = false; |
|
bool mUseFixedFont = false; |
|
bool mPrintPreview = false; |
|
}; |
|
|
|
class KMSetStatusCommand : public KMCommand |
|
{ |
|
Q_OBJECT |
|
|
|
public: |
|
// Serial numbers |
|
KMSetStatusCommand(const MessageStatus &status, const Akonadi::Item::List &items, bool invert = false); |
|
|
|
protected Q_SLOTS: |
|
void slotModifyItemDone(KJob *job); |
|
|
|
private: |
|
Result execute() override; |
|
MessageStatus mStatus; |
|
bool mInvertMark = false; |
|
}; |
|
|
|
/** This command is used to set or toggle a tag for a list of messages. If toggle is |
|
true then the tag is deleted if it is already applied. |
|
*/ |
|
class KMSetTagCommand : public KMCommand |
|
{ |
|
Q_OBJECT |
|
|
|
public: |
|
enum SetTagMode { |
|
AddIfNotExisting, Toggle, CleanExistingAndAddNew |
|
}; |
|
|
|
KMSetTagCommand(const Akonadi::Tag::List &tags, const Akonadi::Item::List &item, SetTagMode mode = AddIfNotExisting); |
|
|
|
protected Q_SLOTS: |
|
void slotModifyItemDone(KJob *job); |
|
|
|
private: |
|
Result execute() override; |
|
void setTags(); |
|
|
|
Akonadi::Tag::List mTags; |
|
Akonadi::Tag::List mCreatedTags; |
|
Akonadi::Item::List mItem; |
|
SetTagMode mMode; |
|
}; |
|
|
|
/* This command is used to apply a single filter (AKA ad-hoc filter) |
|
to a set of messages */ |
|
class KMFilterActionCommand : public KMCommand |
|
{ |
|
Q_OBJECT |
|
|
|
public: |
|
KMFilterActionCommand(QWidget *parent, const QVector<qlonglong> &msgListId, const QString &filterId); |
|
|
|
private: |
|
Result execute() override; |
|
QVector<qlonglong> mMsgListId; |
|
QString mFilterId; |
|
}; |
|
|
|
class KMMetaFilterActionCommand : public QObject |
|
{ |
|
Q_OBJECT |
|
|
|
public: |
|
KMMetaFilterActionCommand(const QString &filterId, KMMainWidget *main); |
|
|
|
public Q_SLOTS: |
|
void start(); |
|
|
|
private: |
|
QString mFilterId; |
|
KMMainWidget *mMainWidget = nullptr; |
|
}; |
|
|
|
class KMMailingListFilterCommand : public KMCommand |
|
{ |
|
Q_OBJECT |
|
|
|
public: |
|
KMMailingListFilterCommand(QWidget *parent, const Akonadi::Item &msg); |
|
|
|
private: |
|
Result execute() override; |
|
}; |
|
|
|
class KMCopyCommand : public KMCommand |
|
{ |
|
Q_OBJECT |
|
|
|
public: |
|
KMCopyCommand(const Akonadi::Collection &destFolder, const Akonadi::Item::List &msgList); |
|
KMCopyCommand(const Akonadi::Collection &destFolder, const Akonadi::Item &msg); |
|
|
|
protected Q_SLOTS: |
|
void slotCopyResult(KJob *job); |
|
private: |
|
Result execute() override; |
|
|
|
Akonadi::Collection mDestFolder; |
|
}; |
|
|
|
class KMCopyDecryptedCommand : public KMCommand |
|
{ |
|
Q_OBJECT |
|
public: |
|
KMCopyDecryptedCommand(const Akonadi::Collection &destFolder, const Akonadi::Item::List &msgList); |
|
KMCopyDecryptedCommand(const Akonadi::Collection &destFolder, const Akonadi::Item &msg); |
|
|
|
protected Q_SLOTS: |
|
void slotAppendResult(KJob *job); |
|
|
|
private: |
|
Result execute() override; |
|
|
|
Akonadi::Collection mDestFolder; |
|
QList<KJob *> mPendingJobs; |
|
}; |
|
|
|
class KMMoveCommand : public KMCommand |
|
{ |
|
Q_OBJECT |
|
|
|
public: |
|
KMMoveCommand(const Akonadi::Collection &destFolder, const Akonadi::Item::List &msgList, MessageList::Core::MessageItemSetReference ref); |
|
KMMoveCommand(const Akonadi::Collection &destFolder, const Akonadi::Item &msg, MessageList::Core::MessageItemSetReference ref = MessageList::Core::MessageItemSetReference()); |
|
Akonadi::Collection destFolder() const |
|
{ |
|
return mDestFolder; |
|
} |
|
|
|
MessageList::Core::MessageItemSetReference refSet() const |
|
{ |
|
return mRef; |
|
} |
|
|
|
public Q_SLOTS: |
|
void slotMoveCanceled(); |
|
void slotMoveResult(KJob *job); |
|
protected: |
|
void setDestFolder(const Akonadi::Collection &folder) |
|
{ |
|
mDestFolder = folder; |
|
} |
|
|
|
Q_SIGNALS: |
|
void moveDone(KMMoveCommand *); |
|
|
|
private: |
|
Result execute() override; |
|
void completeMove(Result result); |
|
|
|
Akonadi::Collection mDestFolder; |
|
KPIM::ProgressItem *mProgressItem = nullptr; |
|
MessageList::Core::MessageItemSetReference mRef; |
|
}; |
|
|
|
class KMTrashMsgCommand : public KMMoveCommand |
|
{ |
|
Q_OBJECT |
|
|
|
public: |
|
KMTrashMsgCommand(const Akonadi::Collection &srcFolder, const Akonadi::Item::List &msgList, MessageList::Core::MessageItemSetReference ref); |
|
KMTrashMsgCommand(const Akonadi::Collection &srcFolder, const Akonadi::Item &msg, MessageList::Core::MessageItemSetReference ref); |
|
|
|
private: |
|
static Akonadi::Collection findTrashFolder(const Akonadi::Collection &srcFolder); |
|
}; |
|
|
|
class KMResendMessageCommand : public KMCommand |
|
{ |
|
Q_OBJECT |
|
|
|
public: |
|
explicit KMResendMessageCommand(QWidget *parent, const Akonadi::Item &msg = Akonadi::Item()); |
|
|
|
private: |
|
Result execute() override; |
|
}; |
|
|
|
class KMShareImageCommand : public KMCommand |
|
{ |
|
Q_OBJECT |
|
|
|
public: |
|
explicit KMShareImageCommand(const QUrl &url, QWidget *parent); |
|
|
|
private: |
|
Result execute() override; |
|
QUrl mUrl; |
|
}; |
|
|
|
class KMFetchMessageCommand : public KMCommand |
|
{ |
|
Q_OBJECT |
|
public: |
|
explicit KMFetchMessageCommand(QWidget *parent, const Akonadi::Item &item, MessageViewer::Viewer *viewer, KMReaderMainWin *win = nullptr); |
|
|
|
Akonadi::Item item() const; |
|
|
|
KMReaderMainWin *readerMainWin() const; |
|
|
|
private: |
|
Akonadi::ItemFetchJob *createFetchJob(const Akonadi::Item::List &items) override; |
|
Result execute() override; |
|
|
|
Akonadi::Item mItem; |
|
MessageViewer::Viewer *mViewer = nullptr; |
|
KMReaderMainWin *mReaderMainWin = nullptr; |
|
}; |
|
|
|
#endif /*KMCommands_h*/
|
|
|