Akonadi::Item::List Serializer::filterDescendantItems(const Akonadi::Item::List &potentialChildren, const Akonadi::Item &ancestorItem) { if (potentialChildren.isEmpty()) return Akonadi::Item::List(); Akonadi::Item::List itemsToProcess = potentialChildren; Q_ASSERT(ancestorItem.isValid() && ancestorItem.hasPayload<KCalCore::Todo::Ptr>()); KCalCore::Todo::Ptr todo = ancestorItem.payload<KCalCore::Todo::Ptr>(); const auto bound = std::partition(itemsToProcess.begin(), itemsToProcess.end(), [ancestorItem, todo](Akonadi::Item currentItem) { return (!currentItem.hasPayload<KCalCore::Todo::Ptr>() || currentItem == ancestorItem || currentItem.payload<KCalCore::Todo::Ptr>()->relatedTo() != todo->uid()); }); Akonadi::Item::List itemsRemoved; std::copy(itemsToProcess.begin(), bound, std::back_inserter(itemsRemoved)); itemsToProcess.erase(itemsToProcess.begin(), bound); auto result = std::accumulate(itemsToProcess.begin(), itemsToProcess.end(), Akonadi::Item::List(), [this, itemsRemoved](Akonadi::Item::List result, Akonadi::Item currentItem) { result << currentItem; return result += filterDescendantItems(itemsRemoved, currentItem); }); return result; }
void EmptyTrashCommand::slotExpungeJob(KJob *job) { if (job->error()) { Util::showJobError(job); emitResult(Failed); return; } Akonadi::ItemFetchJob *fjob = qobject_cast<Akonadi::ItemFetchJob *>(job); if (!fjob) { emitResult(Failed); return; } const Akonadi::Item::List lstItem = fjob->items(); if (lstItem.isEmpty()) { emitResult(OK); return; } Akonadi::ItemDeleteJob *jobDelete = new Akonadi::ItemDeleteJob(lstItem, this); connect(jobDelete, &Akonadi::ItemDeleteJob::result, this, &EmptyTrashCommand::slotDeleteJob); }