void TagTest::testFetchFullTagWithItem() { const Collection res3 = Collection(collectionIdFromPath(QStringLiteral("res3"))); Tag tag; { TagCreateJob *createjob = new TagCreateJob(Tag(QStringLiteral("gid1")), this); AKVERIFYEXEC(createjob); tag = createjob->tag(); } Item item1; { item1.setMimeType(QStringLiteral("application/octet-stream")); ItemCreateJob *append = new ItemCreateJob(item1, res3, this); AKVERIFYEXEC(append); item1 = append->item(); //FIXME This should also be possible with create, but isn't item1.setTag(tag); } ItemModifyJob *modJob = new ItemModifyJob(item1, this); AKVERIFYEXEC(modJob); ItemFetchJob *fetchJob = new ItemFetchJob(item1, this); fetchJob->fetchScope().setFetchTags(true); fetchJob->fetchScope().tagFetchScope().setFetchIdOnly(false); AKVERIFYEXEC(fetchJob); QCOMPARE(fetchJob->items().first().tags().size(), 1); Tag t = fetchJob->items().first().tags().first(); QCOMPARE(t, tag); QVERIFY(!t.gid().isEmpty()); TagDeleteJob *deleteJob = new TagDeleteJob(tag, this); AKVERIFYEXEC(deleteJob); }
void ItemAppendTest::testMultipartAppend() { const Collection testFolder1(collectionIdFromPath(QStringLiteral("res2/space folder"))); QVERIFY(testFolder1.isValid()); Item item; item.setMimeType(QStringLiteral("application/octet-stream")); item.setPayload<QByteArray>("body data"); item.attribute<TestAttribute>(Item::AddIfMissing)->data = "extra data"; item.setFlag("TestFlag"); ItemCreateJob *job = new ItemCreateJob(item, testFolder1, this); AKVERIFYEXEC(job); Item ref = job->item(); ItemFetchJob *fjob = new ItemFetchJob(ref, this); fjob->fetchScope().fetchFullPayload(); fjob->fetchScope().fetchAttribute<TestAttribute>(); AKVERIFYEXEC(fjob); QCOMPARE(fjob->items().count(), 1); item = fjob->items().first(); QCOMPARE(item.payload<QByteArray>(), QByteArray("body data")); QVERIFY(item.hasAttribute<TestAttribute>()); QCOMPARE(item.attribute<TestAttribute>()->data, QByteArray("extra data")); QVERIFY(item.flags().contains("TestFlag")); ItemDeleteJob *djob = new ItemDeleteJob(ref, this); AKVERIFYEXEC(djob); }
void TagTest::testFetchTagIdWithItem() { const Collection res3 = Collection(collectionIdFromPath(QStringLiteral("res3"))); Tag tag; { TagCreateJob *createjob = new TagCreateJob(Tag(QStringLiteral("gid1")), this); AKVERIFYEXEC(createjob); tag = createjob->tag(); } Item item1; { item1.setMimeType(QStringLiteral("application/octet-stream")); item1.setTag(tag); ItemCreateJob *append = new ItemCreateJob(item1, res3, this); AKVERIFYEXEC(append); item1 = append->item(); } ItemFetchJob *fetchJob = new ItemFetchJob(item1, this); fetchJob->fetchScope().setFetchTags(true); fetchJob->fetchScope().tagFetchScope().setFetchIdOnly(true); AKVERIFYEXEC(fetchJob); QCOMPARE(fetchJob->items().first().tags().size(), 1); Tag t = fetchJob->items().first().tags().first(); QCOMPARE(t.id(), tag.id()); QVERIFY(t.gid().isEmpty()); TagDeleteJob *deleteJob = new TagDeleteJob(tag, this); AKVERIFYEXEC(deleteJob); }
void testCopy() { const Collection target(collectionIdFromPath(QStringLiteral("res3"))); QVERIFY(target.isValid()); ItemCopyJob *copy = new ItemCopyJob(Item(1), target); AKVERIFYEXEC(copy); Item source(1); ItemFetchJob *sourceFetch = new ItemFetchJob(source); AKVERIFYEXEC(sourceFetch); source = sourceFetch->items().first(); ItemFetchJob *fetch = new ItemFetchJob(target); fetch->fetchScope().fetchFullPayload(); fetch->fetchScope().fetchAllAttributes(); fetch->fetchScope().setCacheOnly(true); AKVERIFYEXEC(fetch); QCOMPARE(fetch->items().count(), 1); Item item = fetch->items().first(); QVERIFY(item.hasPayload()); QVERIFY(source.size() > 0); QVERIFY(item.size() > 0); QCOMPARE(item.size(), source.size()); QCOMPARE(item.attributes().count(), 1); QVERIFY(item.remoteId().isEmpty()); QEXPECT_FAIL("", "statistics are not properly updated after copy", Abort); QCOMPARE(target.statistics().count(), 1ll); }
void RelationTest::testCreateFetch() { const Collection res3 = Collection(collectionIdFromPath(QStringLiteral("res3"))); Item item1; { item1.setMimeType(QStringLiteral("application/octet-stream")); ItemCreateJob *append = new ItemCreateJob(item1, res3, this); AKVERIFYEXEC(append); item1 = append->item(); } Item item2; { item2.setMimeType(QStringLiteral("application/octet-stream")); ItemCreateJob *append = new ItemCreateJob(item2, res3, this); AKVERIFYEXEC(append); item2 = append->item(); } Relation rel(Relation::GENERIC, item1, item2); RelationCreateJob *createjob = new RelationCreateJob(rel, this); AKVERIFYEXEC(createjob); //Test fetch & create { RelationFetchJob *fetchJob = new RelationFetchJob(QVector<QByteArray>(), this); AKVERIFYEXEC(fetchJob); QCOMPARE(fetchJob->relations().size(), 1); QCOMPARE(fetchJob->relations().first().type(), QByteArray(Relation::GENERIC)); } //Test item fetch { ItemFetchJob *fetchJob = new ItemFetchJob(item1); fetchJob->fetchScope().setFetchRelations(true); AKVERIFYEXEC(fetchJob); QCOMPARE(fetchJob->items().first().relations().size(), 1); } { ItemFetchJob *fetchJob = new ItemFetchJob(item2); fetchJob->fetchScope().setFetchRelations(true); AKVERIFYEXEC(fetchJob); QCOMPARE(fetchJob->items().first().relations().size(), 1); } //Test delete { RelationDeleteJob *deleteJob = new RelationDeleteJob(rel, this); AKVERIFYEXEC(deleteJob); RelationFetchJob *fetchJob = new RelationFetchJob(QVector<QByteArray>(), this); AKVERIFYEXEC(fetchJob); QCOMPARE(fetchJob->relations().size(), 0); } }
void ConflictHandler::start() { if ( mConflictType == LocalLocalConflict || mConflictType == LocalRemoteConflict ) { ItemFetchJob *job = new ItemFetchJob( mConflictingItem, mSession ); job->fetchScope().fetchFullPayload(); job->fetchScope().setAncestorRetrieval( ItemFetchScope::Parent ); connect( job, SIGNAL(result(KJob*)), SLOT(slotOtherItemFetched(KJob*)) ); } else { resolve(); } }
void testMove() { QFETCH( Item::List, items ); QFETCH( Collection, destination ); Collection source( collectionIdFromPath( "res1/foo" ) ); QVERIFY( source.isValid() ); ResourceSelectJob *select = new ResourceSelectJob( "akonadi_knut_resource_0" ); AKVERIFYEXEC( select ); // for rid based moves ItemFetchJob *prefetchjob = new ItemFetchJob( destination, this ); AKVERIFYEXEC( prefetchjob ); int baseline = prefetchjob->items().size(); ItemMoveJob *move = new ItemMoveJob( items, destination, this ); AKVERIFYEXEC( move ); ItemFetchJob *fetch = new ItemFetchJob( destination, this ); fetch->fetchScope().fetchFullPayload(); AKVERIFYEXEC( fetch ); QCOMPARE( fetch->items().count(), items.count() + baseline ); foreach ( const Item& movedItem, fetch->items() ) { QVERIFY( movedItem.hasPayload() ); QVERIFY( !movedItem.payload<QByteArray>().isEmpty() ); } }
void TagTest::testModifyItemWithTagByGID() { const Collection res3 = Collection(collectionIdFromPath(QStringLiteral("res3"))); { Tag tag; tag.setGid("gid2"); TagCreateJob *createjob = new TagCreateJob(tag, this); AKVERIFYEXEC(createjob); } Item item1; { item1.setMimeType(QStringLiteral("application/octet-stream")); ItemCreateJob *append = new ItemCreateJob(item1, res3, this); AKVERIFYEXEC(append); item1 = append->item(); } Tag tag; tag.setGid("gid2"); item1.setTag(tag); ItemModifyJob *modJob = new ItemModifyJob(item1, this); AKVERIFYEXEC(modJob); ItemFetchJob *fetchJob = new ItemFetchJob(item1, this); fetchJob->fetchScope().setFetchTags(true); AKVERIFYEXEC(fetchJob); QCOMPARE(fetchJob->items().first().tags().size(), 1); TagDeleteJob *deleteJob = new TagDeleteJob(fetchJob->items().first().tags().first(), this); AKVERIFYEXEC(deleteJob); }
void ItemAppendTest::testContent() { const Collection testFolder1(collectionIdFromPath(QStringLiteral("res2/space folder"))); QVERIFY(testFolder1.isValid()); QFETCH(QByteArray, data); Item item; item.setMimeType(QStringLiteral("application/octet-stream")); if (!data.isNull()) { item.setPayload(data); } ItemCreateJob *job = new ItemCreateJob(item, testFolder1, this); AKVERIFYEXEC(job); Item ref = job->item(); ItemFetchJob *fjob = new ItemFetchJob(testFolder1, this); fjob->fetchScope().setCacheOnly(true); fjob->fetchScope().fetchFullPayload(); AKVERIFYEXEC(fjob); QCOMPARE(fjob->items().count(), 1); Item item2 = fjob->items().first(); QCOMPARE(item2.hasPayload(), !data.isNull()); if (item2.hasPayload()) { QCOMPARE(item2.payload<QByteArray>(), data); } ItemDeleteJob *djob = new ItemDeleteJob(ref, this); AKVERIFYEXEC(djob); }
void TransportResourceBasePrivate::send(Item::Id id) { ItemFetchJob *job = new ItemFetchJob(Item(id)); job->fetchScope().fetchFullPayload(); job->setProperty("id", QVariant(id)); connect(job, &KJob::result, this, &TransportResourceBasePrivate::fetchResult); }
void CalendarResource::itemRemoved(const Akonadi::Item &item) { if (!canPerformTask()) { return; } if (item.mimeType() == KCalCore::Event::eventMimeType()) { KGAPI2::Job *job = new EventDeleteJob(item.remoteId(), item.parentCollection().remoteId(), account(), this); job->setProperty(ITEM_PROPERTY, QVariant::fromValue(item)); connect(job, &EventCreateJob::finished, this, &CalendarResource::slotGenericJobFinished); } else if (item.mimeType() == KCalCore::Todo::todoMimeType()) { /* Google always automatically removes tasks with all their subtasks. In KOrganizer * by default we only remove the item we are given. For this reason we have to first * fetch all tasks, find all sub-tasks for the task being removed and detach them * from the task. Only then the task can be safely removed. */ ItemFetchJob *fetchJob = new ItemFetchJob(item.parentCollection()); fetchJob->setAutoDelete(true); fetchJob->fetchScope().fetchFullPayload(true); fetchJob->setProperty(ITEM_PROPERTY, qVariantFromValue(item)); connect(fetchJob, &ItemFetchJob::finished, this, &CalendarResource::slotRemoveTaskFetchJobFinished); fetchJob->start(); } else { cancelTask(i18n("Invalid payload type. Expected event or todo, got %1", item.mimeType())); } }
void TagTest::testModifyItemWithTagByRID() { { ResourceSelectJob *select = new ResourceSelectJob(QStringLiteral("akonadi_knut_resource_0")); AKVERIFYEXEC(select); } const Collection res3 = Collection(collectionIdFromPath(QStringLiteral("res3"))); Tag tag3; { tag3.setGid("gid3"); tag3.setRemoteId("rid3"); TagCreateJob *createjob = new TagCreateJob(tag3, this); AKVERIFYEXEC(createjob); tag3 = createjob->tag(); } Item item1; { item1.setMimeType(QStringLiteral("application/octet-stream")); ItemCreateJob *append = new ItemCreateJob(item1, res3, this); AKVERIFYEXEC(append); item1 = append->item(); } Tag tag; tag.setRemoteId("rid2"); item1.setTag(tag); ItemModifyJob *modJob = new ItemModifyJob(item1, this); AKVERIFYEXEC(modJob); ItemFetchJob *fetchJob = new ItemFetchJob(item1, this); fetchJob->fetchScope().setFetchTags(true); AKVERIFYEXEC(fetchJob); QCOMPARE(fetchJob->items().first().tags().size(), 1); { TagDeleteJob *deleteJob = new TagDeleteJob(fetchJob->items().first().tags().first(), this); AKVERIFYEXEC(deleteJob); } { TagDeleteJob *deleteJob = new TagDeleteJob(tag3, this); AKVERIFYEXEC(deleteJob); } { ResourceSelectJob *select = new ResourceSelectJob(QStringLiteral("")); AKVERIFYEXEC(select); } }
void InfoCommand::fetchItems() { Item item; // See if user input is a valid integer as an item ID bool ok; int id = mEntityArg.toInt(&ok); if (ok) item = Item(id); // conversion succeeded else { // Otherwise check if we have an Akonadi URL const KUrl url = QUrl::fromUserInput(mEntityArg); if (url.isValid() && url.scheme()==QLatin1String("akonadi")) { item = Item::fromUrl(url); } else { emit error(i18nc("@info:shell", "Invalid item/collection syntax")); emit finished(RuntimeError); return; } } ItemFetchJob *job = new ItemFetchJob(item, this); job->fetchScope().setFetchModificationTime(true); job->fetchScope().fetchAllAttributes(true); // Need this so that parentCollection() will be valid. job->fetchScope().setAncestorRetrieval(ItemFetchScope::Parent); // Not actually going to use the payload here, but if we don't set it // to be fetched then hasPayload() will not return a meaningful result. job->fetchScope().fetchFullPayload(true); connect(job, SIGNAL(result(KJob *)), SLOT(onItemsFetched(KJob *))); }
void InfoCommand::fetchItems() { Item item = CollectionResolveJob::parseItem(mEntityArg); if (!item.isValid()) { emit error(i18nc("@info:shell", "Invalid item/collection syntax")); emit finished(RuntimeError); return; } ItemFetchJob *job = new ItemFetchJob(item, this); job->fetchScope().setFetchModificationTime(true); job->fetchScope().setFetchTags(true); job->fetchScope().fetchAllAttributes(true); // Need this so that parentCollection() will be valid. job->fetchScope().setAncestorRetrieval(ItemFetchScope::Parent); // Not actually going to use the payload here, but if we don't set it // to be fetched then hasPayload() will not return a meaningful result. job->fetchScope().fetchFullPayload(true); connect(job, SIGNAL(result(KJob *)), SLOT(onItemsFetched(KJob *))); }
void RecursiveMover::replayNextItem() { Q_ASSERT( m_currentCollection.isValid() ); if ( m_pendingItems.isEmpty() ) { replayNextCollection(); // all items processed here return; } else { Q_ASSERT( m_currentAction == None ); m_currentItem = m_pendingItems.takeFirst(); ItemFetchJob *job = new ItemFetchJob( m_currentItem, this ); job->fetchScope().fetchFullPayload(); connect( job, SIGNAL(result(KJob*)), SLOT(itemFetchResult(KJob*)) ); addSubjob( job ); ++m_runningJobs; } }
void TagTest::testTagItem() { Akonadi::Monitor monitor; monitor.itemFetchScope().setFetchTags(true); monitor.setAllMonitored(true); const Collection res3 = Collection(collectionIdFromPath(QStringLiteral("res3"))); Tag tag; { TagCreateJob *createjob = new TagCreateJob(Tag(QStringLiteral("gid1")), this); AKVERIFYEXEC(createjob); tag = createjob->tag(); } Item item1; { item1.setMimeType(QStringLiteral("application/octet-stream")); ItemCreateJob *append = new ItemCreateJob(item1, res3, this); AKVERIFYEXEC(append); item1 = append->item(); } item1.setTag(tag); QSignalSpy tagsSpy(&monitor, SIGNAL(itemsTagsChanged(Akonadi::Item::List,QSet<Akonadi::Tag>,QSet<Akonadi::Tag>))); QVERIFY(tagsSpy.isValid()); ItemModifyJob *modJob = new ItemModifyJob(item1, this); AKVERIFYEXEC(modJob); QTRY_VERIFY(tagsSpy.count() >= 1); QTRY_COMPARE(tagsSpy.last().first().value<Akonadi::Item::List>().first().id(), item1.id()); QTRY_COMPARE(tagsSpy.last().at(1).value< QSet<Tag> >().size(), 1); //1 added tag ItemFetchJob *fetchJob = new ItemFetchJob(item1, this); fetchJob->fetchScope().setFetchTags(true); AKVERIFYEXEC(fetchJob); QCOMPARE(fetchJob->items().first().tags().size(), 1); TagDeleteJob *deleteJob = new TagDeleteJob(tag, this); AKVERIFYEXEC(deleteJob); }
void AkonadiSlave::get(const QUrl &url) { const Item item = Item::fromUrl(url); ItemFetchJob *job = new ItemFetchJob(item); job->fetchScope().fetchFullPayload(); if (!job->exec()) { error(KIO::ERR_INTERNAL, job->errorString()); return; } if (job->items().count() != 1) { error(KIO::ERR_DOES_NOT_EXIST, i18n("No such item.")); } else { const Item item = job->items().at(0); QByteArray tmp = item.payloadData(); data(tmp); data(QByteArray()); finished(); } finished(); }
void ItemAppendTest::testItemAppend() { const Collection testFolder1(collectionIdFromPath(QStringLiteral("res2/space folder"))); QVERIFY(testFolder1.isValid()); QFETCH(QString, remoteId); Item ref; // for cleanup Item item(-1); item.setRemoteId(remoteId); item.setMimeType(QStringLiteral("application/octet-stream")); item.setFlag("TestFlag"); item.setSize(3456); ItemCreateJob *job = new ItemCreateJob(item, testFolder1, this); AKVERIFYEXEC(job); ref = job->item(); QCOMPARE(ref.parentCollection(), testFolder1); ItemFetchJob *fjob = new ItemFetchJob(testFolder1, this); fjob->fetchScope().setAncestorRetrieval(ItemFetchScope::Parent); AKVERIFYEXEC(fjob); QCOMPARE(fjob->items().count(), 1); QCOMPARE(fjob->items()[0], ref); QCOMPARE(fjob->items()[0].remoteId(), remoteId); QVERIFY(fjob->items()[0].flags().contains("TestFlag")); QCOMPARE(fjob->items()[0].parentCollection(), ref.parentCollection()); qint64 size = 3456; QCOMPARE(fjob->items()[0].size(), size); ItemDeleteJob *djob = new ItemDeleteJob(ref, this); AKVERIFYEXEC(djob); fjob = new ItemFetchJob(testFolder1, this); AKVERIFYEXEC(fjob); QVERIFY(fjob->items().isEmpty()); }
void akonadimailsearch::onCollectionsFetched(KJob* job) { if (job->error()) { kWarning() << job->errorString(); emit finished(); } else { CollectionFetchJob *fetchJob = qobject_cast<CollectionFetchJob*>(job); QList<Collection> contactCollections; foreach (const Collection &collection, fetchJob->collections()) { if (collection.isVirtual()) { continue; } if (collection.contentMimeTypes().contains( KABC::Addressee::mimeType() ) ) { ItemFetchJob *itemFetchJob = new ItemFetchJob(collection); itemFetchJob->fetchScope().fetchFullPayload(); connect(itemFetchJob, SIGNAL(finished(KJob*)), SLOT(onItemsFetched(KJob*))); ++activeFetchJobsCount; } } if (activeFetchJobsCount == 0) { emit finished(); } } }
void DupeTest::testDupes() { QFETCH(QString, message); QFETCH(int, count); QFETCH(int, delay); // clean sink ItemFetchJob *fjob = new ItemFetchJob(sink, this); AKVERIFYEXEC(fjob); if (fjob->items().count() > 0) { // this test is needed because ItemDeleteJob gives error if no items are found ItemDeleteJob *djob = new ItemDeleteJob(sink, this); AKVERIFYEXEC(djob); } fjob = new ItemFetchJob(sink, this); AKVERIFYEXEC(fjob); QCOMPARE(fjob->items().count(), 0); // queue messages Q_ASSERT(monitor); QSignalSpy *addSpy = new QSignalSpy(monitor, SIGNAL(itemAdded(Akonadi::Item,Akonadi::Collection))); qDebug() << "Queuing" << count << "messages..."; for (int i = 0; i < count; i++) { //qDebug() << "Queuing message" << i + 1 << "of" << count; Message::Ptr msg = Message::Ptr(new Message); msg->setContent(QStringLiteral("%1-msg%2\n").arg(message).arg(i + 1, 2, 10, QLatin1Char('0')).toLatin1()); MessageQueueJob *job = new MessageQueueJob(this); job->setMessage(msg); job->transportAttribute().setTransportId(TransportManager::self()->defaultTransportId()); // default dispatch mode // default sent-mail collection job->addressAttribute().setFrom(QStringLiteral("naiba")); job->addressAttribute().setTo(QStringList() << QStringLiteral("dracu")); //AKVERIFYEXEC( job ); job->start(); QTest::qWait(delay); } qDebug() << "Queued" << count << "messages."; // wait for the MDA to send them int seconds = 0; while (true) { seconds++; QTest::qWait(1000); qDebug() << seconds << "seconds elapsed." << addSpy->count() << "messages got to sink."; if (addSpy->count() >= count) { break; } #if 0 if (seconds >= TIMEOUT_SECONDS) { qDebug() << "Timeout, gdb master!"; QTest::qWait(1000 * 1000); } #endif QVERIFY2(seconds < TIMEOUT_SECONDS, "Timeout"); } // TODO I should verify that the MDA has actually finished its work and has an empty queue QTest::qWait(2000); // verify what has been sent fjob = new ItemFetchJob(sink, this); fjob->fetchScope().fetchFullPayload(); AKVERIFYEXEC(fjob); const Item::List items = fjob->items(); int found[ MAXCOUNT ]; for (int i = 0; i < count; i++) { found[i] = 0; } for (int i = 0; i < items.count(); i++) { QVERIFY(items[i].hasPayload<Message::Ptr>()); Message::Ptr msg = items[i].payload<Message::Ptr>(); const QByteArray content = msg->encodedContent(); //qDebug() << "i" << i << "content" << content; int loc = content.indexOf("-msg"); QVERIFY(loc >= 0); bool ok; int who = content.mid(loc + 4, 2).toInt(&ok); QVERIFY(ok); //qDebug() << "identified msg" << who; QVERIFY(who > 0 && who <= count); found[ who - 1 ]++; } for (int i = 0; i < count; i++) { if (found[i] > 1) { qDebug() << "found duplicate message" << i + 1 << "(" << found[i] << "times )"; } else if (found[i] < 1) { qDebug() << "didn't find message" << i + 1; } QCOMPARE(found[i], 1); } QCOMPARE(addSpy->count(), count); QCOMPARE(items.count(), count); }
// TODO: test signals void testMove() { QFETCH( Collection, source ); QFETCH( Collection, destination ); QFETCH( bool, crossResource ); QVERIFY( source.isValid() ); QVERIFY( destination.isValid() ); CollectionFetchJob *fetch = new CollectionFetchJob( source, CollectionFetchJob::Base, this ); AKVERIFYEXEC( fetch ); QCOMPARE( fetch->collections().count(), 1 ); source = fetch->collections().first(); // obtain reference listing fetch = new CollectionFetchJob( source, CollectionFetchJob::Recursive ); AKVERIFYEXEC( fetch ); QHash<Collection, Item::List> referenceData; foreach ( const Collection &c, fetch->collections() ) { ItemFetchJob *job = new ItemFetchJob( c, this ); AKVERIFYEXEC( job ); referenceData.insert( c, job->items() ); } // move collection CollectionMoveJob *mod = new CollectionMoveJob( source, destination, this ); AKVERIFYEXEC( mod ); // check if source was modified correctly CollectionFetchJob *ljob = new CollectionFetchJob( source, CollectionFetchJob::Base ); AKVERIFYEXEC( ljob ); Collection::List list = ljob->collections(); QCOMPARE( list.count(), 1 ); Collection col = list.first(); QCOMPARE( col.name(), source.name() ); QCOMPARE( col.parentCollection(), destination ); // list destination and check if everything is still there ljob = new CollectionFetchJob( destination, CollectionFetchJob::Recursive ); AKVERIFYEXEC( ljob ); list = ljob->collections(); QVERIFY( list.count() >= referenceData.count() ); for ( QHash<Collection, Item::List>::ConstIterator it = referenceData.constBegin(); it != referenceData.constEnd(); ++it ) { QVERIFY( list.contains( it.key() ) ); if ( crossResource ) { QVERIFY( list[ list.indexOf( it.key() ) ].resource() != it.key().resource() ); } else { QCOMPARE( list[ list.indexOf( it.key() ) ].resource(), it.key().resource() ); } ItemFetchJob *job = new ItemFetchJob( it.key(), this ); job->fetchScope().fetchFullPayload(); AKVERIFYEXEC( job ); QCOMPARE( job->items().count(), it.value().count() ); foreach ( const Item &item, job->items() ) { QVERIFY( it.value().contains( item ) ); QVERIFY( item.hasPayload() ); } } // cleanup mod = new CollectionMoveJob( col, source.parentCollection(), this ); AKVERIFYEXEC( mod ); }
bool AkonadiEngine::sourceRequestEvent(const QString &name) { kDebug() << "Source requested:" << name << sources(); if (name == "EmailCollections") { Collection emailCollection(Collection::root()); emailCollection.setContentMimeTypes(QStringList() << "message/rfc822"); CollectionFetchJob *fetch = new CollectionFetchJob( emailCollection, CollectionFetchJob::Recursive); connect( fetch, SIGNAL(result(KJob*)), SLOT(fetchEmailCollectionsDone(KJob*)) ); // For async data fetching, it's mandatory to set the data source to empty before returning true setData(name, DataEngine::Data()); return true; } else if (name.startsWith(QString("EmailCollection-"))) { qlonglong id = name.split('-')[1].toLongLong(); ItemFetchJob* fetch = new ItemFetchJob( Collection( id ), this ); if (!m_emailMonitor) { initEmailMonitor(); } m_emailMonitor->setCollectionMonitored(Collection( id ), true); fetch->fetchScope().fetchPayloadPart( MessagePart::Envelope ); connect( fetch, SIGNAL(result(KJob*)), SLOT(fetchEmailCollectionDone(KJob*)) ); connect( fetch, SIGNAL(itemsReceived(Akonadi::Item::List)), SLOT(emailItemsReceived(Akonadi::Item::List)) ); m_jobCollections[fetch] = name; setData(name, DataEngine::Data()); return true; } else if (name.startsWith(QString("Email-"))) { qlonglong id = name.split('-')[1].toLongLong(); ItemFetchJob* fetch = new ItemFetchJob( Item( id ), this ); if (!m_emailMonitor) { initEmailMonitor(); } m_emailMonitor->setItemMonitored(Item( id ), true); fetch->fetchScope().fetchFullPayload( true ); connect( fetch, SIGNAL(result(KJob*)), SLOT(fetchEmailCollectionDone(KJob*)) ); connect( fetch, SIGNAL(itemsReceived(Akonadi::Item::List)), SLOT(emailItemsReceived(Akonadi::Item::List)) ); m_jobCollections[fetch] = name; setData(name, DataEngine::Data()); return true; } else if (name == "ContactCollections") { Collection contactCollection(Collection::root()); contactCollection.setContentMimeTypes(QStringList() << "text/directory"); CollectionFetchJob* fetch = new CollectionFetchJob( contactCollection, CollectionFetchJob::Recursive); connect( fetch, SIGNAL(result(KJob*)), SLOT(fetchContactCollectionsDone(KJob*)) ); setData(name, DataEngine::Data()); return true; } else if (name.startsWith(QString("ContactCollection-"))) { qlonglong id = name.split('-')[1].toLongLong(); ItemFetchJob *fetch = new ItemFetchJob( Collection( id ), this ); if (!m_contactMonitor) { initContactMonitor(); } m_contactMonitor->setCollectionMonitored(Collection( id ), true); // FIXME: should be contacts monitor fetch->fetchScope().fetchFullPayload(); connect( fetch, SIGNAL(result(KJob*)), SLOT(fetchContactCollectionDone(KJob*)) ); setData(name, DataEngine::Data()); return true; } else if (name.startsWith(QString("Contact-"))) { kDebug() << "Fetching contact" << name; qlonglong id = name.split('-')[1].toLongLong(); ItemFetchJob *fetch = new ItemFetchJob( Item( id ), this ); if (!m_contactMonitor) { initContactMonitor(); } m_contactMonitor->setItemMonitored(Item( id ), true); // FIXME: should be contacts monitor fetch->fetchScope().fetchFullPayload(); connect( fetch, SIGNAL(result(KJob*)), SLOT(fetchContactCollectionDone(KJob*)) ); setData(name, DataEngine::Data()); return true; } else if (name == "MicroBlogs") { Collection microblogCollection(Collection::root()); microblogCollection.setContentMimeTypes(QStringList() << "application/x-vnd.kde.microblog"); CollectionFetchJob *fetch = new CollectionFetchJob( microblogCollection, CollectionFetchJob::Recursive); connect( fetch, SIGNAL(result(KJob*)), SLOT(fetchMicroBlogCollectionsDone(KJob*)) ); setData(name, DataEngine::Data()); return true; } else if (name.startsWith(QString("MicroBlog-"))) { qlonglong id = name.split('-')[1].toLongLong(); kDebug() << "MicroBlog ID" << id << " requested" << name; ItemFetchJob *fetch = new ItemFetchJob( Akonadi::Collection( id )); if (!m_microBlogMonitor) { initMicroBlogMonitor(); } m_microBlogMonitor->setItemMonitored(Item( id ), true); fetch->fetchScope().fetchFullPayload(); connect( fetch, SIGNAL(result(KJob*)), SLOT(fetchMicroBlogDone(KJob*)) ); setData(name, DataEngine::Data()); return true; } // We don't understand the request. kDebug() << "Don't know what to do with:" << name; return false; }