mailtransport
filteractionjob.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "filteractionjob.h"
00021
00022 #include <akonadi/collection.h>
00023 #include <akonadi/itemfetchjob.h>
00024 #include <akonadi/itemfetchscope.h>
00025
00026 #include <KDebug>
00027
00028 using namespace Akonadi;
00029
00030 class Akonadi::FilterActionJob::Private
00031 {
00032 public:
00033 Private( FilterActionJob *qq )
00034 : q( qq ), functor( 0 )
00035 {
00036 }
00037
00038 ~Private()
00039 {
00040 delete functor;
00041 }
00042
00043 FilterActionJob *q;
00044 Collection collection;
00045 Item::List items;
00046 FilterAction *functor;
00047 ItemFetchScope fetchScope;
00048
00049
00050 void fetchResult( KJob *job );
00051
00052 void traverseItems();
00053 };
00054
00055 void FilterActionJob::Private::fetchResult( KJob *job )
00056 {
00057 if ( job->error() ) {
00058
00059 return;
00060 }
00061
00062 ItemFetchJob *fjob = dynamic_cast<ItemFetchJob*>( job );
00063 Q_ASSERT( fjob );
00064 Q_ASSERT( items.isEmpty() );
00065 items = fjob->items();
00066 traverseItems();
00067 }
00068
00069 void FilterActionJob::Private::traverseItems()
00070 {
00071 Q_ASSERT( functor );
00072 kDebug() << "Traversing" << items.count() << "items.";
00073 foreach ( const Item &item, items ) {
00074 if ( functor->itemAccepted( item ) ) {
00075 q->addSubjob( functor->itemAction( item ) );
00076 kDebug() << "Added subjob for item" << item.id();
00077 }
00078 }
00079 if ( q->subjobs().isEmpty() ) {
00080 kDebug() << "No subjobs; I am done.";
00081 q->emitResult();
00082 } else {
00083 kDebug() << "Have subjobs; calling commit().";
00084 q->commit();
00085 }
00086 }
00087
00088 FilterAction::~FilterAction()
00089 {
00090 }
00091
00092 FilterActionJob::FilterActionJob( const Item &item, FilterAction *functor, QObject *parent )
00093 : TransactionSequence( parent ), d( new Private( this ) )
00094 {
00095 d->functor = functor;
00096 d->items << item;
00097 }
00098
00099 FilterActionJob::FilterActionJob( const Item::List &items, FilterAction *functor, QObject *parent )
00100 : TransactionSequence( parent ), d( new Private( this ) )
00101 {
00102 d->functor = functor;
00103 d->items = items;
00104 }
00105
00106 FilterActionJob::FilterActionJob( const Collection &collection,
00107 FilterAction *functor, QObject *parent )
00108 : TransactionSequence( parent ), d( new Private( this ) )
00109 {
00110 d->functor = functor;
00111 Q_ASSERT( collection.isValid() );
00112 d->collection = collection;
00113 }
00114
00115 FilterActionJob::~FilterActionJob()
00116 {
00117 delete d;
00118 }
00119
00120 void FilterActionJob::doStart()
00121 {
00122 if( d->collection.isValid() ) {
00123 kDebug() << "Fetching collection" << d->collection.id();
00124 ItemFetchJob *fjob = new ItemFetchJob( d->collection, this );
00125 Q_ASSERT( d->functor );
00126 d->fetchScope = d->functor->fetchScope();
00127 fjob->setFetchScope( d->fetchScope );
00128 connect( fjob, SIGNAL(result(KJob*)), this, SLOT(fetchResult(KJob*)) );
00129 } else {
00130 d->traverseItems();
00131 }
00132 }
00133
00134 #include "filteractionjob.moc"