Branch 'feature/remoterelationsyc' - 2 commits - resources/imap resources/kolab
Aaron Seigo
seigo at kolabsys.com
Wed Nov 5 15:59:20 CET 2014
resources/imap/resourcestate.cpp | 6 +
resources/imap/resourcestate.h | 1
resources/imap/resourcestateinterface.h | 1
resources/imap/tests/dummyresourcestate.cpp | 5 +
resources/imap/tests/dummyresourcestate.h | 1
resources/kolab/kolabretrievetagstask.cpp | 111 +++++++++++++++++-----------
resources/kolab/kolabretrievetagstask.h | 10 ++
7 files changed, 92 insertions(+), 43 deletions(-)
New commits:
commit 0d296bb92ee2f06cd24b96d2ee04d29cf3cf09c9
Author: Aaron Seigo <aseigo at kde.org>
Date: Wed Nov 5 15:57:51 2014 +0100
refactor out tag extraction and add relation extraction
diff --git a/resources/kolab/kolabretrievetagstask.cpp b/resources/kolab/kolabretrievetagstask.cpp
index c2ab6fb..43e540d 100644
--- a/resources/kolab/kolabretrievetagstask.cpp
+++ b/resources/kolab/kolabretrievetagstask.cpp
@@ -101,55 +101,71 @@ void KolabRetrieveTagTask::onHeadersReceived(const QString &mailBox,
const KMime::Message::Ptr msg = messages[number];
const Kolab::KolabObjectReader reader(msg);
switch (reader.getType()) {
- case Kolab::RelationConfigurationObject: {
- Akonadi::Tag tag = reader.getTag();
- tag.setRemoteId(QByteArray::number(uids[number]));
- mTags << tag;
-
- Akonadi::Item::List members;
- Q_FOREACH (const QString &memberUrl, reader.getTagMembers()) {
- Kolab::RelationMember member = Kolab::parseMemberUrl(memberUrl);
- //TODO should we create a dummy item if it isn't yet available?
- Akonadi::Item i;
- if (!member.gid.isEmpty()) {
- //Reference by GID
- i.setGid(member.gid);
- } else {
- //Reference by imap uid
- if (member.uid < 0) {
- kWarning() << "Failed to parse uid: " << memberUrl;
- continue;
- }
- i.setRemoteId(QString::number(member.uid));
- kDebug() << "got member: " << member.uid << member.mailbox;
- Akonadi::Collection parent;
- {
- //The root collection is not part of the mailbox path
- Akonadi::Collection col;
- col.setRemoteId(rootRemoteId());
- col.setParentCollection(Akonadi::Collection::root());
- parent = col;
- }
- Q_FOREACH(const QByteArray part, member.mailbox) {
- Akonadi::Collection col;
- col.setRemoteId(separatorCharacter() + QString::fromLatin1(part));
- col.setParentCollection(parent);
- parent = col;
- }
- i.setParentCollection(parent);
- }
- //TODO implement fallback to search if uid is not available
- members << i;
+ case Kolab::RelationConfigurationObject:
+ if (reader.isTag()) {
+ extractTag(reader, uids[number]);
+ } else if (reader.isRelation()) {
+ extractRelation(reader, uids[number]);
}
- mTagMembers.insert(QString::fromLatin1(tag.remoteId()), members);
- }
break;
+
default:
break;
}
}
}
+void KolabRetrieveTagTask::extractTag(const Kolab::KolabObjectReader &reader, qint64 remoteUid)
+{
+ Akonadi::Tag tag = reader.getTag();
+ tag.setRemoteId(QByteArray::number(remoteUid));
+ mTags << tag;
+
+ Akonadi::Item::List members;
+ Q_FOREACH (const QString &memberUrl, reader.getTagMembers()) {
+ Kolab::RelationMember member = Kolab::parseMemberUrl(memberUrl);
+ //TODO should we create a dummy item if it isn't yet available?
+ Akonadi::Item i;
+ if (!member.gid.isEmpty()) {
+ //Reference by GID
+ i.setGid(member.gid);
+ } else {
+ //Reference by imap uid
+ if (member.uid < 0) {
+ kWarning() << "Failed to parse uid: " << memberUrl;
+ continue;
+ }
+ i.setRemoteId(QString::number(member.uid));
+ kDebug() << "got member: " << member.uid << member.mailbox;
+ Akonadi::Collection parent;
+ {
+ //The root collection is not part of the mailbox path
+ Akonadi::Collection col;
+ col.setRemoteId(rootRemoteId());
+ col.setParentCollection(Akonadi::Collection::root());
+ parent = col;
+ }
+ Q_FOREACH(const QByteArray part, member.mailbox) {
+ Akonadi::Collection col;
+ col.setRemoteId(separatorCharacter() + QString::fromLatin1(part));
+ col.setParentCollection(parent);
+ parent = col;
+ }
+ i.setParentCollection(parent);
+ }
+ //TODO implement fallback to search if uid is not available
+ members << i;
+ }
+ mTagMembers.insert(QString::fromLatin1(tag.remoteId()), members);
+}
+
+void KolabRetrieveTagTask::extractRelation(const Kolab::KolabObjectReader &reader, qint64 remoteUid)
+{
+ Akonadi::Relation relation = reader.getRelation();
+ relation.setRemoteId(QByteArray::number(remoteUid));
+ mRelations << relation;
+}
+
void KolabRetrieveTagTask::onHeadersFetchDone(KJob *job)
{
if (job->error()) {
@@ -157,8 +173,17 @@ void KolabRetrieveTagTask::onHeadersFetchDone(KJob *job)
cancelTask(job->errorString());
return;
}
- kDebug() << "Fetched tags: " << mTags.size() << mTagMembers.keys().size();
- resourceState()->tagsRetrieved(mTags, mTagMembers);
+
+ if (!mTags.isEmpty() || !mTagMembers.isEmpty()) {
+ kDebug() << "Fetched tags: " << mTags.size() << mTagMembers.keys().size();
+ resourceState()->tagsRetrieved(mTags, mTagMembers);
+ }
+
+ if (!mRelations.isEmpty()) {
+ kDebug() << "Fetched relations:" << mRelations.size();
+ resourceState()->relationsRetrieved(mRelations);
+ }
+
deleteLater();
}
diff --git a/resources/kolab/kolabretrievetagstask.h b/resources/kolab/kolabretrievetagstask.h
index d790dbd..0dab163 100644
--- a/resources/kolab/kolabretrievetagstask.h
+++ b/resources/kolab/kolabretrievetagstask.h
@@ -23,6 +23,11 @@
#include "kolabrelationresourcetask.h"
#include <akonadi/tag.h>
+namespace Kolab
+{
+ class KolabObjectReader;
+} // namespace Kolab
+
class KolabRetrieveTagTask : public KolabRelationResourceTask
{
Q_OBJECT
@@ -36,6 +41,7 @@ private:
KIMAP::Session *mSession;
Akonadi::Tag::List mTags;
QHash<QString, Akonadi::Item::List> mTagMembers;
+ Akonadi::Relation::List mRelations;
private Q_SLOTS:
// void onItemsFetchDone(KJob *job);
@@ -48,6 +54,10 @@ private Q_SLOTS:
const QMap<qint64, KIMAP::MessagePtr> &messages);
void onHeadersFetchDone(KJob *job);
+private:
+ void extractTag(const Kolab::KolabObjectReader &reader, qint64 remoteUid);
+ void extractRelation(const Kolab::KolabObjectReader &reader, qint64 remoteUid);
+
// void onApplyCollectionChanged(const Akonadi::Collection &collection);
// void onCancelTask(const QString &errorText);
// void onChangeCommitted();
commit 37601f0bf9a4435202b8e51bb94a70d64e3fb152
Author: Aaron Seigo <aseigo at kde.org>
Date: Wed Nov 5 15:57:19 2014 +0100
add a relationsRetrieved method
diff --git a/resources/imap/resourcestate.cpp b/resources/imap/resourcestate.cpp
index b2460c4..fa6289c 100644
--- a/resources/imap/resourcestate.cpp
+++ b/resources/imap/resourcestate.cpp
@@ -418,3 +418,9 @@ void ResourceState::tagsRetrieved( const Akonadi::Tag::List &tags, const QHash<Q
{
m_resource->tagsRetrieved(tags, tagMembers);
}
+
+
+void ResourceState::relationsRetrieved(const Akonadi::Relation::List &relations)
+{
+ m_resource->relationsRetrieved(relations);
+}
diff --git a/resources/imap/resourcestate.h b/resources/imap/resourcestate.h
index 9588be5..9e00562 100644
--- a/resources/imap/resourcestate.h
+++ b/resources/imap/resourcestate.h
@@ -120,6 +120,7 @@ public:
virtual void collectionsRetrieved( const Akonadi::Collection::List &collections );
virtual void tagsRetrieved( const Akonadi::Tag::List &tags, const QHash<QString, Akonadi::Item::List> & );
+ virtual void relationsRetrieved( const Akonadi::Relation::List &tags);
virtual void collectionChangeCommitted( const Akonadi::Collection &collection );
diff --git a/resources/imap/resourcestateinterface.h b/resources/imap/resourcestateinterface.h
index d920199..82ea2e1 100644
--- a/resources/imap/resourcestateinterface.h
+++ b/resources/imap/resourcestateinterface.h
@@ -120,6 +120,7 @@ public:
virtual MessageHelper::Ptr messageHelper() const = 0;
virtual void tagsRetrieved( const Akonadi::Tag::List &tags, const QHash<QString, Akonadi::Item::List> & ) = 0;
+ virtual void relationsRetrieved( const Akonadi::Relation::List &tags) = 0;
virtual Akonadi::Relation::List addedRelations() const = 0;
virtual Akonadi::Relation::List removedRelations() const = 0;
diff --git a/resources/imap/tests/dummyresourcestate.cpp b/resources/imap/tests/dummyresourcestate.cpp
index 0e554e7..753099b 100644
--- a/resources/imap/tests/dummyresourcestate.cpp
+++ b/resources/imap/tests/dummyresourcestate.cpp
@@ -332,6 +332,11 @@ void DummyResourceState::tagsRetrieved( const Akonadi::Tag::List &tags, const QH
recordCall( "tagsRetrieved", QVariant::fromValue( qMakePair(tags, items) ) );
}
+void DummyResourceState::relationsRetrieved( const Akonadi::Relation::List &relations )
+{
+ recordCall( "relationsRetrieved", QVariant::fromValue( relations ) );
+}
+
void DummyResourceState::tagChangeCommitted(const Akonadi::Tag &tag)
{
recordCall( "tagChangeCommitted", QVariant::fromValue( tag ) );
diff --git a/resources/imap/tests/dummyresourcestate.h b/resources/imap/tests/dummyresourcestate.h
index ba80a4c..0aa5317 100644
--- a/resources/imap/tests/dummyresourcestate.h
+++ b/resources/imap/tests/dummyresourcestate.h
@@ -119,6 +119,7 @@ public:
virtual void collectionChangeCommitted( const Akonadi::Collection &collection );
virtual void tagsRetrieved( const Akonadi::Tag::List &tags, const QHash<QString, Akonadi::Item::List> & );
+ virtual void relationsRetrieved( const Akonadi::Relation::List &tags );
virtual void tagChangeCommitted( const Akonadi::Tag &tag );
virtual void searchFinished( const QVector<qint64> &result, bool isRid = true );
More information about the commits
mailing list