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 =
dynamic_cast<Akonadi::ItemFetchJob*
>( job );
57 foreach(
const Akonadi::Item &item, fjob->items() ) {
58 Akonadi::MessageStatus status;
59 status.setStatusFromFlags( item.flags() );
61 if ( status & mTargetStatus ) {
62 mMessages.append( item );
65 if (! (status & mTargetStatus) )
67 mMessages.append( item );
70 if ( mMessages.empty() ) {
71 if( mFolderListJobCount == 0 ) {
78 if ( mFolderListJobCount > 0 ) {
79 Akonadi::ItemFetchJob *job =
new Akonadi::ItemFetchJob( mFolders[mFolderListJobCount - 1], parent() );
80 job->fetchScope().setAncestorRetrieval( Akonadi::ItemFetchScope::Parent );
81 connect( job, SIGNAL(result(KJob*)),
this, SLOT(slotFetchDone(KJob*)) );
86 void MarkAsCommand::execute()
88 if ( !mFolders.isEmpty() ) {
90 Akonadi::ItemFetchJob *job =
new Akonadi::ItemFetchJob( mFolders[mFolderListJobCount - 1], parent() );
91 job->fetchScope().setAncestorRetrieval( Akonadi::ItemFetchScope::Parent );
92 connect( job, SIGNAL(result(KJob*)),
this, SLOT(slotFetchDone(KJob*)) );
93 }
else if ( !mMessages.isEmpty() ) {
94 mFolders << mMessages.first().parentCollection();
101 void MarkAsCommand::markMessages()
105 QSet<QByteArray> flags = mTargetStatus.statusFlags();
106 Q_ASSERT( flags.size() == 1 );
109 flag = *(flags.begin());
112 foreach(
const Akonadi::Item &it, mMessages ) {
113 Akonadi::Item item( it );
118 if ( item.hasFlag( flag ) ) {
119 item.clearFlag( flag );
120 itemsToModify.push_back( item );
123 if ( !item.hasFlag( flag ) ) {
124 item.setFlag( flag );
125 itemsToModify.push_back( item );
131 if ( itemsToModify.isEmpty() ) {
132 slotModifyItemDone( 0 );
134 Akonadi::ItemModifyJob *modifyJob =
new Akonadi::ItemModifyJob( itemsToModify,
this );
135 modifyJob->setIgnorePayload(
true );
136 modifyJob->disableRevisionCheck();
137 connect( modifyJob, SIGNAL(result(KJob*)),
this, SLOT(slotModifyItemDone(KJob*)) );
141 void MarkAsCommand::slotModifyItemDone( KJob * job )
145 if ( job && job->error() ) {
146 kDebug()<<
" Error trying to set item status:" << job->errorText();
147 emitResult( Failed );
149 if ( mMarkJobCount == 0 && mFolderListJobCount == 0 ) {
155 #include "markascommand_p.moc"