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() ) {
61 if ( status & mTargetStatus ) {
62 mMessages.append( item );
65 if ( !( status & mTargetStatus ) ) {
66 mMessages.append( item );
69 if ( mMessages.empty() ) {
70 if( mFolderListJobCount == 0 ) {
77 if ( mFolderListJobCount > 0 ) {
78 Akonadi::ItemFetchJob *job =
new Akonadi::ItemFetchJob( mFolders[mFolderListJobCount - 1], parent() );
79 job->fetchScope().setAncestorRetrieval( Akonadi::ItemFetchScope::Parent );
80 connect( job, SIGNAL(result(KJob*)),
this, SLOT(slotFetchDone(KJob*)) );
85 void MarkAsCommand::execute()
87 if ( !mFolders.isEmpty() ) {
89 Akonadi::ItemFetchJob *job =
new Akonadi::ItemFetchJob( mFolders[mFolderListJobCount - 1], parent() );
90 job->fetchScope().setAncestorRetrieval( Akonadi::ItemFetchScope::Parent );
91 connect( job, SIGNAL(result(KJob*)),
this, SLOT(slotFetchDone(KJob*)) );
92 }
else if ( !mMessages.isEmpty() ) {
93 mFolders << mMessages.first().parentCollection();
100 void MarkAsCommand::markMessages()
104 QSet<QByteArray> flags = mTargetStatus.statusFlags();
105 Q_ASSERT( flags.size() == 1 );
106 Akonadi::Item::Flag flag;
107 if ( !flags.isEmpty() )
108 flag = *( flags.begin() );
110 Akonadi::Item::List itemsToModify;
111 foreach(
const Akonadi::Item &it, mMessages ) {
112 Akonadi::Item item( it );
117 if ( item.hasFlag( flag ) ) {
118 item.clearFlag( flag );
119 itemsToModify.push_back( item );
122 if ( !item.hasFlag( flag ) ) {
123 item.setFlag( flag );
124 itemsToModify.push_back( item );
130 if ( itemsToModify.isEmpty() ) {
131 slotModifyItemDone( 0 );
133 Akonadi::ItemModifyJob *modifyJob =
new Akonadi::ItemModifyJob( itemsToModify,
this );
134 modifyJob->setIgnorePayload(
true );
135 modifyJob->disableRevisionCheck();
136 connect( modifyJob, SIGNAL(result(KJob*)),
this, SLOT(slotModifyItemDone(KJob*)) );
140 void MarkAsCommand::slotModifyItemDone( KJob * job )
144 if ( job && job->error() ) {
145 kDebug()<<
" Error trying to set item status:" << job->errorText();
146 emitResult( Failed );
148 if ( mMarkJobCount == 0 && mFolderListJobCount == 0 ) {
154 #include "moc_markascommand_p.cpp"