[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kdepim-runtime] resources/imap
From:       Tobias Koenig <tokoe () kde ! org>
Date:       2011-01-21 14:25:47
Message-ID: 20110121142547.55FD4A60A9 () git ! kde ! org
[Download RAW message or body]

Git commit 64eb16f9b69ca6d994721e8e2bbb0423bbe77690 by Tobias Koenig
Pushed by tokoe into branch master

Set annotations correctly for new collections

This fixes the bug that collections, created by the Kolab
resource, loose their annotations and therefor do not show
up in kaddressbook/korganizer/knotes

CCMAIL: ervin@kde.org

M  +51   -3    resources/imap/addcollectiontask.cpp     
M  +7    -0    resources/imap/addcollectiontask.h     

http://commits.kde.org/607f3003/64eb16f9b69ca6d994721e8e2bbb0423bbe77690

diff --git a/resources/imap/addcollectiontask.cpp \
b/resources/imap/addcollectiontask.cpp index 8176c08..5ce6aec 100644
--- a/resources/imap/addcollectiontask.cpp
+++ b/resources/imap/addcollectiontask.cpp
@@ -21,17 +21,19 @@
 
 #include "addcollectiontask.h"
 
+#include "collectionannotationsattribute.h"
+
 #include <KDE/KDebug>
 #include <KDE/KLocale>
 
 #include <kimap/createjob.h>
 #include <kimap/session.h>
+#include <kimap/setmetadatajob.h>
 #include <kimap/subscribejob.h>
 
 AddCollectionTask::AddCollectionTask( ResourceStateInterface::Ptr resource, QObject \
*parent )  : ResourceTask( DeferIfNoSession, resource, parent )
 {
-
 }
 
 AddCollectionTask::~AddCollectionTask()
@@ -49,6 +51,8 @@ void AddCollectionTask::doStart( KIMAP::Session *session )
   }
 
   const QChar separator = parentCollection().remoteId().at( 0 );
+  m_pendingJobs = 0;
+  m_session = session;
   m_collection = collection();
   m_collection.setName( m_collection.name().replace( separator, QString() ) );
   m_collection.setRemoteId( separator + m_collection.name() );
@@ -98,9 +102,53 @@ void AddCollectionTask::onSubscribeDone( KJob *job )
                        m_collection.name() ) );
   }
 
-  changeCommitted( m_collection );
+  if ( !m_collection.hasAttribute<Akonadi::CollectionAnnotationsAttribute>() ) {
+    // we are finished
+    changeCommitted( m_collection );
+    return;
+  }
+
+  const Akonadi::CollectionAnnotationsAttribute *attribute = \
m_collection.attribute<Akonadi::CollectionAnnotationsAttribute>(); +
+  const QMap<QByteArray, QByteArray> annotations = attribute->annotations();
+
+  foreach ( const QByteArray &entry, annotations.keys() ) {
+    KIMAP::SetMetaDataJob *job = new KIMAP::SetMetaDataJob( m_session );
+    if ( serverCapabilities().contains( "METADATA" ) ) {
+      job->setServerCapability( KIMAP::MetaDataJobBase::Metadata );
+    } else {
+      job->setServerCapability( KIMAP::MetaDataJobBase::Annotatemore );
+    }
+
+    QByteArray attribute = entry;
+    if ( job->serverCapability()==KIMAP::MetaDataJobBase::Annotatemore ) {
+      attribute = "value.shared";
+    }
+
+    job->setMailBox( mailBoxForCollection( m_collection ) );
+    job->setEntry( entry );
+    job->addMetaData( attribute, annotations[entry] );
+
+    connect( job, SIGNAL( result( KJob* ) ),
+             this, SLOT( onSetMetaDataDone( KJob* ) ) );
+
+    m_pendingJobs++;
+
+    job->start();
+  }
 }
 
-#include "addcollectiontask.moc"
+void AddCollectionTask::onSetMetaDataDone( KJob *job )
+{
+  if ( job->error() ) {
+    emitWarning( i18n( "Failed to write some annotations for '%1' on the IMAP \
server. %2", +                       collection().name(), job->errorText() ) );
+  }
 
+  m_pendingJobs--;
 
+  if ( m_pendingJobs == 0 )
+    changeCommitted( m_collection );
+}
+
+#include "addcollectiontask.moc"
diff --git a/resources/imap/addcollectiontask.h b/resources/imap/addcollectiontask.h
index da7d638..de83683 100644
--- a/resources/imap/addcollectiontask.h
+++ b/resources/imap/addcollectiontask.h
@@ -24,6 +24,10 @@
 
 #include "resourcetask.h"
 
+namespace KIMAP {
+class Session;
+}
+
 class AddCollectionTask : public ResourceTask
 {
   Q_OBJECT
@@ -35,12 +39,15 @@ public:
 private slots:
   void onCreateDone( KJob *job );
   void onSubscribeDone( KJob *job );
+  void onSetMetaDataDone( KJob *job );
 
 protected:
   virtual void doStart( KIMAP::Session *session );
 
 private:
   Akonadi::Collection m_collection;
+  uint m_pendingJobs;
+  KIMAP::Session *m_session;
 };
 
 #endif


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic