Git commit c6563979b71da8a052e2e874e253068ad49b8ff3 by Till Adam. Committed on 14/10/2012 at 14:45. Pushed by tilladam into branch 'master'. Kill contact and group search jobs if they are no longer useful. Also starts all jobs in a separate session, to avoid blocking the main UI. M +22 -4 libkdepim/addresseelineedit.cpp http://commits.kde.org/kdepim/c6563979b71da8a052e2e874e253068ad49b8ff3 diff --git a/libkdepim/addresseelineedit.cpp b/libkdepim/addresseelineedit.= cpp index 51ea6f1..a629ecc 100644 --- a/libkdepim/addresseelineedit.cpp +++ b/libkdepim/addresseelineedit.cpp @@ -36,6 +36,8 @@ #include #include #include +#include +#include = #include #include @@ -85,6 +87,7 @@ class AddresseeLineEditStatic ldapSearch( 0 ), ldapLineEdit( 0 ), nepomukSearchClient( 0 ), + akonadiSession( new Akonadi::Session("contactsCompletionSession") = ), nepomukCompletionSource( 0 ), contactsListed( false ) { @@ -163,6 +166,8 @@ class AddresseeLineEditStatic // a list of akonadi items (contacts) that have not had their collecti= on fetched yet Akonadi::Item::List akonadiPendingItems; Nepomuk2::Query::QueryServiceClient* nepomukSearchClient; + Akonadi::Session *akonadiSession; + QSet akonadiJobsInFlight; bool useNepomukCompletion; int nepomukCompletionSource; bool contactsListed; @@ -648,8 +653,16 @@ void AddresseeLineEdit::Private::startSearches() void AddresseeLineEdit::Private::akonadiPerformSearch() { kDebug() << "searching akonadi with:" << m_searchString; - Akonadi::ContactSearchJob *contactJob =3D new Akonadi::ContactSearchJob(= ); - Akonadi::ContactGroupSearchJob *groupJob =3D new Akonadi::ContactGroupSe= archJob(); + + // first, kill all job still in flight, they are no longer current + Q_FOREACH( Akonadi::Job* job, s_static->akonadiJobsInFlight ) { + job->kill(); + } + s_static->akonadiJobsInFlight.clear(); + + // now start new jobs + Akonadi::ContactSearchJob *contactJob =3D new Akonadi::ContactSearchJob(= s_static->akonadiSession ); + Akonadi::ContactGroupSearchJob *groupJob =3D new Akonadi::ContactGroupSe= archJob( s_static->akonadiSession ); contactJob->fetchScope().setAncestorRetrieval( Akonadi::ItemFetchScope::= Parent ); groupJob->fetchScope().setAncestorRetrieval( Akonadi::ItemFetchScope::Pa= rent ); contactJob->setQuery( Akonadi::ContactSearchJob::NameOrEmail, m_searchSt= ring, @@ -663,6 +676,8 @@ void AddresseeLineEdit::Private::akonadiPerformSearch() q, SLOT(slotAkonadiSearchResult(KJob*)) ); q->connect( groupJob, SIGNAL(result(KJob*)), q, SLOT(slotAkonadiSearchResult(KJob*)) ); + s_static->akonadiJobsInFlight.insert( contactJob ); + s_static->akonadiJobsInFlight.insert( groupJob ); akonadiHandlePending(); } = @@ -671,7 +686,8 @@ void AddresseeLineEdit::Private::akonadiListAllContacts= () kDebug() << "listing all contacts in Akonadi"; Akonadi::RecursiveItemFetchJob *job =3D new Akonadi::RecursiveItemFetchJob( Akonadi::Collection::root(), - QStringList() << KABC::Addr= essee::mimeType() ); + QStringList() << KABC::Addr= essee::mimeType(), + s_static->akonadiSession ); job->fetchScope().fetchFullPayload(); job->fetchScope().setAncestorRetrieval( Akonadi::ItemFetchScope::Parent = ); q->connect( job, SIGNAL(result(KJob*)), @@ -936,7 +952,8 @@ void AddresseeLineEdit::Private::akonadiHandleItems( co= nst Akonadi::Item::List & // the collection isn't there, start the fetch job. Akonadi::CollectionFetchJob *collectionJob =3D new Akonadi::CollectionFetchJob( item.parentCollection(), - Akonadi::CollectionFetchJob::Ba= se, q ); + Akonadi::CollectionFetchJob::Ba= se, + s_static->akonadiSession ); connect( collectionJob, SIGNAL(collectionsReceived(Akonadi::Collec= tion::List)), q, SLOT(slotAkonadiCollectionsReceived(Akonadi::Collectio= n::List)) ); /* we don't want to start multiple fetch jobs for the same collect= ion, @@ -962,6 +979,7 @@ void AddresseeLineEdit::Private::akonadiHandleItems( co= nst Akonadi::Item::List & = void AddresseeLineEdit::Private::slotAkonadiSearchResult( KJob *job ) { + s_static->akonadiJobsInFlight.remove( qobject_cast( job )= ); const Akonadi::ContactSearchJob *contactJob =3D qobject_cast( job ); const Akonadi::ContactGroupSearchJob *groupJob =3D