00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "filteractionjob_p.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 functor->itemAction( item, q );
00076 kDebug() << "Added subjob for item" << item.id();
00077 }
00078 }
00079 if ( q->subjobs().isEmpty() ) {
00080 kDebug() << "No subjobs; I am done";
00081 } else {
00082 kDebug() << "Have subjobs; Done when last of them is";
00083 }
00084 q->commit();
00085 }
00086
00087 FilterAction::~FilterAction()
00088 {
00089 }
00090
00091 FilterActionJob::FilterActionJob( const Item &item, FilterAction *functor, QObject *parent )
00092 : TransactionSequence( parent ), d( new Private( this ) )
00093 {
00094 d->functor = functor;
00095 d->items << item;
00096 }
00097
00098 FilterActionJob::FilterActionJob( const Item::List &items, FilterAction *functor, QObject *parent )
00099 : TransactionSequence( parent ), d( new Private( this ) )
00100 {
00101 d->functor = functor;
00102 d->items = items;
00103 }
00104
00105 FilterActionJob::FilterActionJob( const Collection &collection,
00106 FilterAction *functor, QObject *parent )
00107 : TransactionSequence( parent ), d( new Private( this ) )
00108 {
00109 d->functor = functor;
00110 Q_ASSERT( collection.isValid() );
00111 d->collection = collection;
00112 }
00113
00114 FilterActionJob::~FilterActionJob()
00115 {
00116 delete d;
00117 }
00118
00119 void FilterActionJob::doStart()
00120 {
00121 if( d->collection.isValid() ) {
00122 kDebug() << "Fetching collection" << d->collection.id();
00123 ItemFetchJob *fjob = new ItemFetchJob( d->collection, this );
00124 Q_ASSERT( d->functor );
00125 d->fetchScope = d->functor->fetchScope();
00126 fjob->setFetchScope( d->fetchScope );
00127 connect( fjob, SIGNAL(result(KJob*)), this, SLOT(fetchResult(KJob*)) );
00128 } else {
00129 d->traverseItems();
00130 }
00131 }
00132
00133 #include "filteractionjob_p.moc"