21 #include "markascommand_p.h"
23 #include <akonadi/itemfetchjob.h>
24 #include <akonadi/itemfetchscope.h>
25 #include <akonadi/itemmodifyjob.h>
27 MarkAsCommand::MarkAsCommand(
const Akonadi::MessageStatus& targetStatus,
const Akonadi::Item::List& msgList,
bool invert, QObject* parent): CommandBase( parent )
31 mTargetStatus = targetStatus;
32 mFolderListJobCount = 0;
35 MarkAsCommand::MarkAsCommand(
const Akonadi::MessageStatus &targetStatus,
const Akonadi::Collection::List& folders,
bool invert, QObject* parent): CommandBase( parent )
39 mTargetStatus = targetStatus;
40 mFolderListJobCount = mFolders.size();
43 void MarkAsCommand::slotFetchDone(KJob* job)
45 mFolderListJobCount--;
49 Util::showJobError(job);
54 Akonadi::ItemFetchJob *fjob =
static_cast<Akonadi::ItemFetchJob*
>( job );
56 foreach(
const Akonadi::Item &item, fjob->items() ) {
60 if ( status & mTargetStatus ) {
61 mMessages.append( item );
64 if ( !( status & mTargetStatus ) ) {
65 mMessages.append( item );
68 if ( mMessages.empty() ) {
69 if( mFolderListJobCount == 0 ) {
76 if ( mFolderListJobCount > 0 ) {
77 Akonadi::ItemFetchJob *job =
new Akonadi::ItemFetchJob( mFolders[mFolderListJobCount - 1], parent() );
78 job->fetchScope().setAncestorRetrieval( Akonadi::ItemFetchScope::Parent );
79 connect( job, SIGNAL(result(KJob*)),
this, SLOT(slotFetchDone(KJob*)) );
84 void MarkAsCommand::execute()
86 if ( !mFolders.isEmpty() ) {
88 Akonadi::ItemFetchJob *job =
new Akonadi::ItemFetchJob( mFolders[mFolderListJobCount - 1], parent() );
89 job->fetchScope().setAncestorRetrieval( Akonadi::ItemFetchScope::Parent );
90 connect( job, SIGNAL(result(KJob*)),
this, SLOT(slotFetchDone(KJob*)) );
91 }
else if ( !mMessages.isEmpty() ) {
92 mFolders << mMessages.first().parentCollection();
99 void MarkAsCommand::markMessages()
103 QSet<QByteArray> flags = mTargetStatus.statusFlags();
104 Q_ASSERT( flags.size() == 1 );
105 Akonadi::Item::Flag flag;
106 if ( !flags.isEmpty() )
107 flag = *( flags.begin() );
109 Akonadi::Item::List itemsToModify;
110 foreach(
const Akonadi::Item &it, mMessages ) {
111 Akonadi::Item item( it );
116 if ( item.hasFlag( flag ) ) {
117 item.clearFlag( flag );
118 itemsToModify.push_back( item );
121 if ( !item.hasFlag( flag ) ) {
122 item.setFlag( flag );
123 itemsToModify.push_back( item );
129 if ( itemsToModify.isEmpty() ) {
130 slotModifyItemDone( 0 );
132 Akonadi::ItemModifyJob *modifyJob =
new Akonadi::ItemModifyJob( itemsToModify,
this );
133 modifyJob->setIgnorePayload(
true );
134 modifyJob->disableRevisionCheck();
135 connect( modifyJob, SIGNAL(result(KJob*)),
this, SLOT(slotModifyItemDone(KJob*)) );
139 void MarkAsCommand::slotModifyItemDone( KJob * job )
143 if ( job && job->error() ) {
144 kDebug()<<
" Error trying to set item status:" << job->errorText();
145 emitResult( Failed );
147 if ( mMarkJobCount == 0 && mFolderListJobCount == 0 ) {
153 #include "moc_markascommand_p.cpp"
void setStatusFromFlags(const QSet< QByteArray > &flags)
Set the status as a whole e.g.
Akonadi KMime Message Status.