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

List:       kde-commits
Subject:    KDE/kdepim/akonadi/resources/kabc
From:       Kevin Krammer <kevin.krammer () gmx ! at>
Date:       2008-11-13 21:42:43
Message-ID: 1226612563.226932.12127.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 883938 by krake:

Adding support for distribution lists.
Using KABC::DistributionList plugin-side and KABC::ContactGroup Akonadi-side.

Still needs converting/copying of custom entry attributes, but ContactGroup \
subclasses currently don't have iterators for that.

CCMAIL: tokoe@kde.org


 M  +184 -33   kabcresource.cpp  
 M  +1 -1      kabcresource.desktop  
 M  +6 -0      kabcresource.h  


--- trunk/KDE/kdepim/akonadi/resources/kabc/kabcresource.cpp #883937:883938
@@ -26,6 +26,8 @@
 
 #include <kabc/addressbook.h>
 #include <kabc/addressee.h>
+#include <kabc/contactgroup.h>
+#include <kabc/distributionlist.h>
 #include <kabc/errorhandler.h>
 #include <kabc/resource.h>
 #include <kabc/resourceabc.h>
@@ -186,6 +188,7 @@
   mimeTypes << QLatin1String( "text/directory" );
 
   QStringList topLevelMimeTypes = mimeTypes;
+  topLevelMimeTypes << KABC::ContactGroup::mimeType();
 
   if ( mFolderResource != 0 ) {
     topLevelMimeTypes << Collection::mimeType();
@@ -253,8 +256,19 @@
     items.append( item );
   }
 
-  // TODO: handle distribution lists once we have an Akonadi payload for them
+  QList<KABC::DistributionList*> distLists = mBaseResource->allDistributionLists();
+  foreach ( const KABC::DistributionList *list, distLists ) {
+    Item item;
+    item.setRemoteId( list->identifier() );
+    item.setMimeType( KABC::ContactGroup::mimeType() );
 
+    if ( mFullItemRetrieve ) {
+      item.setPayload<KABC::ContactGroup>( contactGroupFromDistList( list ) );
+    }
+
+    items.append( item );
+  }
+
   mFullItemRetrieve = false;
 
   itemsRetrieved( items );
@@ -267,20 +281,34 @@
   Q_UNUSED( parts );
   const QString rid = item.remoteId();
 
-  // TODO: handle distribution lists once we have an Akonadi payload for them
+  if ( item.mimeType() == KABC::ContactGroup::mimeType() ) {
+    KABC::DistributionList *list =
+      mAddressBook->findDistributionListByIdentifier( rid );
+    if ( list == 0 ) {
+      kError() << "No distributionlist with identifier" << rid;
+      emit error( i18nc( "@info:status",
+                          "Request for data of a specific distribution list failed "
+                          "because there is no such list" ) );
+      return false;
+    }
 
-  KABC::Addressee addressee = mAddressBook->findByUid( item.remoteId() );
-  if ( addressee.isEmpty() ) {
-    kError() << "No addressee with uid" << rid;
-    emit error( i18nc( "@info:status",
-                        "Request for data of a specific address book entry failed "
-                        "because there is no such entry" ) );
-    return false;
+    Item i( item );
+    i.setPayload<KABC::ContactGroup>( contactGroupFromDistList( list ) );
+    itemRetrieved( i );
+  } else {
+    KABC::Addressee addressee = mAddressBook->findByUid( item.remoteId() );
+    if ( addressee.isEmpty() ) {
+      kError() << "No addressee with uid" << rid;
+      emit error( i18nc( "@info:status",
+                          "Request for data of a specific address book entry failed \
" +                          "because there is no such entry" ) );
+      return false;
+    }
+
+    Item i( item );
+    i.setPayload<KABC::Addressee>( addressee );
+    itemRetrieved( i );
   }
-
-  Item i( item );
-  i.setPayload<KABC::Addressee>( addressee );
-  itemRetrieved( i );
   return true;
 }
 
@@ -311,6 +339,7 @@
   Q_UNUSED( col );
 
   kDebug() << "item.hasPayload<Addressee>() " << item.hasPayload<KABC::Addressee>();
+  kDebug() << "item.hasPayload<ContactGroup>() " << \
item.hasPayload<KABC::ContactGroup>();  if ( item.hasPayload<KABC::Addressee>() ) {
     KABC::Addressee addressee = item.payload<KABC::Addressee>();
 
@@ -327,23 +356,40 @@
       i.setPayload<KABC::Addressee>( addressee );
 
       changeCommitted( i );
-    } else {
-      changeProcessed();
+      return;
     }
-  } else {
-    // TODO: handle distribution lists once we have an Akonadi payload for them
-    changeProcessed();
+  } else if ( item.hasPayload<KABC::ContactGroup>() ) {
+    KABC::ContactGroup contactGroup = item.payload<KABC::ContactGroup>();
+
+    if ( contactGroup.id().isEmpty() )
+      contactGroup.setId( KRandom::randomString( 10 ) );
+
+    // also inserts list into resource
+    distListFromContactGroup( contactGroup );
+
+    // TODO: proper error reporting
+    if ( scheduleSaveAddressBook() ) {
+      Item i( item );
+      i.setRemoteId( contactGroup.id() );
+      i.setPayload<KABC::ContactGroup>( contactGroup );
+
+      changeCommitted( i );
+      return;
+    }
   }
+
+  changeProcessed();
 }
 
 void KABCResource::itemChanged( const Akonadi::Item &item, const QSet<QByteArray>& \
parts )  {
   kDebug() << "item id="  << item.id() << ", remoteId=" << item.remoteId()
            << "mimeType=" << item.mimeType();
-  // we store the whole addressee any way
+  // we store the whole addressee/contactgroup anyway
   Q_UNUSED( parts );
 
   kDebug() << "item.hasPayload<Addressee>() " << item.hasPayload<KABC::Addressee>();
+  kDebug() << "item.hasPayload<ContactGroup>() " << \
item.hasPayload<KABC::ContactGroup>();  if ( item.hasPayload<KABC::Addressee>() ) {
     KABC::Addressee addressee = item.payload<KABC::Addressee>();
     Q_ASSERT( !addressee.uid().isEmpty() );
@@ -354,32 +400,67 @@
     // TODO: proper error reporting
     if ( scheduleSaveAddressBook() ) {
       changeCommitted( item );
+      return;
+    }
+  } else if ( item.hasPayload<KABC::ContactGroup>() ) {
+    KABC::ContactGroup contactGroup = item.payload<KABC::ContactGroup>();
+    Q_ASSERT( !contactGroup.id().isEmpty() );
+
+    KABC::DistributionList *list =
+      mAddressBook->findDistributionListByIdentifier( contactGroup.id() );
+    if ( list == 0 ) {
+      // TODO: rather report an error?
+
+      // also inserts list into resource
+      distListFromContactGroup( contactGroup );
     } else {
-      changeProcessed();
+      // TODO: might be better to update the already existing instance
+      mBaseResource->removeDistributionList( list );
+      delete list;
+
+      // also inserts list into resource
+      distListFromContactGroup( contactGroup );
     }
-  } else {
-    // TODO: handle distribution lists once we have an Akonadi payload for them
-    changeProcessed();
+
+    // TODO: proper error reporting
+    if ( scheduleSaveAddressBook() ) {
+      changeCommitted( item );
+      return;
+    }
   }
+
+  changeProcessed();
 }
 
 void KABCResource::itemRemoved( const Akonadi::Item &item )
 {
   kDebug() << "item id="  << item.id() << ", remoteId=" << item.remoteId()
            << "mimeType=" << item.mimeType();
-  KABC::Addressee addressee = mAddressBook->findByUid( item.remoteId() );
-  if ( !addressee.isEmpty() ) {
-    mAddressBook->removeAddressee( addressee );
-    // TODO: proper error reporting
-    if ( scheduleSaveAddressBook() ) {
-      changeCommitted( item );
-    } else {
-      changeProcessed();
+  if ( item.mimeType() == KABC::ContactGroup::mimeType() ) {
+    KABC::DistributionList *list =
+      mAddressBook->findDistributionListByIdentifier( item.remoteId() );
+    if ( list != 0 ) {
+      mAddressBook->removeDistributionList( list );
+      delete list;
+
+      // TODO: proper error reporting
+      if ( scheduleSaveAddressBook() ) {
+        changeCommitted( item );
+        return;
+      }
     }
   } else {
-    // TODO: handle distribution lists once we have an Akonadi payload for them
-    changeProcessed();
+    KABC::Addressee addressee = mAddressBook->findByUid( item.remoteId() );
+    if ( !addressee.isEmpty() ) {
+      mAddressBook->removeAddressee( addressee );
+      // TODO: proper error reporting
+      if ( scheduleSaveAddressBook() ) {
+        changeCommitted( item );
+        return;
+      }
+    }
   }
+  changeProcessed();
 }
 
 void KABCResource::collectionChanged( const Akonadi::Collection &collection )
@@ -668,6 +749,76 @@
   }
 }
 
+KABC::DistributionList *KABCResource::distListFromContactGroup( const \
KABC::ContactGroup& contactGroup ) +{
+  KABC::DistributionList *list =
+    new KABC::DistributionList( mBaseResource, contactGroup.id(), \
contactGroup.name() ); +
+  for ( unsigned int refIndex = 0; refIndex < contactGroup.referencesCount(); \
++refIndex ) { +    const KABC::ContactGroup::Reference &reference = \
contactGroup.reference( refIndex ); +
+    KABC::Addressee addressee = mBaseResource->findByUid( reference.uid() );
+    if ( addressee.isEmpty() ) {
+      addressee.setUid( reference.uid() );
+      // TODO any way to set a good name?
+    }
+
+    // TODO how to handle ContactGroup::Reference custom fields?
+
+    list->insertEntry( addressee, reference.preferredEmail() );
+  }
+
+  for ( unsigned int dataIndex = 0; dataIndex < contactGroup.dataCount(); \
++dataIndex ) { +    const KABC::ContactGroup::Data &data = contactGroup.data( \
dataIndex ); +
+    KABC::Addressee addressee;
+    addressee.setName( data.name() );
+    addressee.insertEmail( data.email() );
+
+    // TODO how to handle ContactGroup::Data custom fields?
+
+    list->insertEntry( addressee );
+  }
+
+  return list;
+}
+
+KABC::ContactGroup KABCResource::contactGroupFromDistList( const \
KABC::DistributionList* list ) const +{
+  kDebug() << "name=" << list->name() << ", identifier=" << list->identifier()
+           << ", entries.count=" << list->entries().count();
+
+  KABC::ContactGroup contactGroup( list->name() );
+  contactGroup.setId( list->identifier() );
+
+  KABC::DistributionList::Entry::List entries = list->entries();
+  foreach ( const KABC::DistributionList::Entry &entry, entries ) {
+    KABC::Addressee addressee = entry.addressee();
+    const QString email = entry.email();
+    if ( addressee.isEmpty() ) {
+      if ( email.isEmpty() )
+        continue;
+
+      KABC::ContactGroup::Data data( email, email );
+      contactGroup.append( data );
+    } else {
+      KABC::Addressee baseAddressee = mBaseResource->findByUid( addressee.uid() );
+      if ( baseAddressee.isEmpty() ) {
+        KABC::ContactGroup::Data data( email, email );
+        // TODO: transer custom fields?
+        contactGroup.append( data );
+      } else {
+        KABC::ContactGroup::Reference reference( addressee.uid() );
+        reference.setPreferredEmail( email );
+        // TODO: transer custom fields?
+        contactGroup.append( reference );
+      }
+    }
+  }
+
+  return contactGroup;
+}
+
 AKONADI_RESOURCE_MAIN( KABCResource )
 
 #include "kabcresource.moc"
--- trunk/KDE/kdepim/akonadi/resources/kabc/kabcresource.desktop #883937:883938
@@ -24,6 +24,6 @@
 Exec=akonadi_kabc_resource
 Icon=text-directory
 
-X-Akonadi-MimeTypes=text/directory
+X-Akonadi-MimeTypes=text/directory,application/x-vnd.kde.contactgroup
 X-Akonadi-Capabilities=Resource
 X-Akonadi-Identifier=akonadi_kabc_resource
--- trunk/KDE/kdepim/akonadi/resources/kabc/kabcresource.h #883937:883938
@@ -22,6 +22,8 @@
 #include <akonadi/resourcebase.h>
 
 namespace KABC {
+  class ContactGroup;
+  class DistributionList;
   class Resource;
   class ResourceABC;
 }
@@ -79,6 +81,10 @@
 
     bool scheduleSaveAddressBook();
 
+    KABC::DistributionList *distListFromContactGroup( const KABC::ContactGroup& \
contactGroup ); +
+    KABC::ContactGroup contactGroupFromDistList( const KABC::DistributionList* list \
) const; +
     typedef KABC::Resource Resource;
 
   private Q_SLOTS:


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

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