20 #include "markascommand_p.h"
22 #include <akonadi/itemfetchjob.h>
23 #include <akonadi/itemfetchscope.h>
24 #include <akonadi/itemmodifyjob.h>
26 MarkAsCommand::MarkAsCommand(
const Akonadi::MessageStatus& targetStatus,
const Akonadi::Item::List& msgList,
bool invert, QObject* parent): CommandBase( parent )
30 mTargetStatus = targetStatus;
31 mFolderListJobCount = 0;
34 MarkAsCommand::MarkAsCommand(
const Akonadi::MessageStatus &targetStatus,
const Akonadi::Collection::List& folders,
bool invert, QObject* parent): CommandBase( parent )
38 mTargetStatus = targetStatus;
39 mFolderListJobCount = mFolders.size();
42 void MarkAsCommand::slotFetchDone(KJob* job)
44 mFolderListJobCount--;
48 Util::showJobError(job);
53 Akonadi::ItemFetchJob *fjob =
static_cast<Akonadi::ItemFetchJob*
>( job );
55 foreach(
const Akonadi::Item &item, fjob->items() ) {
59 if ( status & mTargetStatus ) {
60 mMessages.append( item );
63 if ( !( status & mTargetStatus ) ) {
64 mMessages.append( item );
67 if ( mMessages.empty() ) {
68 if ( mFolderListJobCount == 0 ) {
75 if ( mFolderListJobCount > 0 ) {
76 Akonadi::ItemFetchJob *job =
new Akonadi::ItemFetchJob( mFolders[mFolderListJobCount - 1], parent() );
77 job->fetchScope().setAncestorRetrieval( Akonadi::ItemFetchScope::Parent );
78 connect( job, SIGNAL(result(KJob*)),
this, SLOT(slotFetchDone(KJob*)) );
82 void MarkAsCommand::execute()
84 if ( !mFolders.isEmpty() ) {
86 Akonadi::ItemFetchJob *job =
new Akonadi::ItemFetchJob( mFolders[mFolderListJobCount - 1], parent() );
87 job->fetchScope().setAncestorRetrieval( Akonadi::ItemFetchScope::Parent );
88 connect( job, SIGNAL(result(KJob*)),
this, SLOT(slotFetchDone(KJob*)) );
89 }
else if ( !mMessages.isEmpty() ) {
90 mFolders << mMessages.first().parentCollection();
97 void MarkAsCommand::markMessages()
101 QSet<QByteArray> flags = mTargetStatus.statusFlags();
102 Q_ASSERT( flags.size() == 1 );
103 Akonadi::Item::Flag flag;
104 if ( !flags.isEmpty() )
105 flag = *( flags.begin() );
107 Akonadi::Item::List itemsToModify;
108 foreach(
const Akonadi::Item &it, mMessages ) {
109 Akonadi::Item item( it );
114 if ( item.hasFlag( flag ) ) {
115 item.clearFlag( flag );
116 itemsToModify.push_back( item );
119 if ( !item.hasFlag( flag ) ) {
120 item.setFlag( flag );
121 itemsToModify.push_back( item );
127 if ( itemsToModify.isEmpty() ) {
128 slotModifyItemDone( 0 );
130 Akonadi::ItemModifyJob *modifyJob =
new Akonadi::ItemModifyJob( itemsToModify,
this );
131 modifyJob->setIgnorePayload(
true );
132 modifyJob->disableRevisionCheck();
133 connect( modifyJob, SIGNAL(result(KJob*)),
this, SLOT(slotModifyItemDone(KJob*)) );
137 void MarkAsCommand::slotModifyItemDone( KJob * job )
141 if ( job && job->error() ) {
142 kDebug()<<
" Error trying to set item status:" << job->errorText();
143 emitResult( Failed );
145 if ( mMarkJobCount == 0 && mFolderListJobCount == 0 ) {
150 #include "moc_markascommand_p.cpp"
void setStatusFromFlags(const QSet< QByteArray > &flags)
Set the status as a whole e.g.
Akonadi KMime Message Status.