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

List:       kde-commits
Subject:    kdenetwork/kopete/libkopete
From:       Will Stephenson <lists () stevello ! free-online ! co ! uk>
Date:       2004-07-31 19:47:42
Message-ID: 20040731194742.1850F99F5 () office ! kde ! org
[Download RAW message or body]

CVS commit by wstephens: 

Merge our data with any existing data when writing a kabc field
Solves a couple of ancient FIXMEs and makes Kopete play nicely now that Konversation is joining the \
addressbook integration game.


  M +26 -5     kopetemetacontact.cpp   1.221


--- kdenetwork/kopete/libkopete/kopetemetacontact.cpp  #1.220:1.221
@@ -67,4 +67,19 @@ KABC::AddressBook* KopeteMetaContact::m_
 bool KopeteMetaContactPrivate::s_addrBookWritePending = false;
 
+/**
+ * utility function to merge two QStrings containing individual elements separated by 0xE000
+ */
+QString unionContents( QString arg1, QString arg2 )
+{
+        QChar separator( 0xE000 );
+        QStringList outList = QStringList::split( separator, arg1 );
+        QStringList arg2List = QStringList::split( separator, arg2 );
+        for ( QStringList::iterator it = arg2List.begin(); it != arg2List.end(); ++it )
+                if ( !outList.contains( *it ) )
+                        outList.append( *it );
+        QString out = outList.join( separator );
+        return out;
+}
+
 KopeteMetaContact::KopeteMetaContact()
 : KopetePluginDataObject( KopeteContactList::contactList() ), KopeteNotifyDataObject()
@@ -827,4 +842,7 @@ void KopeteMetaContact::setMetaContactId
         // 5) Is called when reading the saved contact list
 
+        // only remove kabc data if we are changing contacts; other programs may have written that data,
+        // and kopete will not pick up on it if no other MC is associated with the data left behind
+        if ( !newMetaContactId.isNull() )
         removeKABC();
         d->metaContactId = newMetaContactId;
@@ -853,5 +871,4 @@ void KopeteMetaContact::updateKABC()
                 // (inherited from Kopete < 0.8, where all metacontacts had random ids)
 
-                // FIXME: this no longer gets called when reading all contacts but we need something \
similar to update from 0.7  if ( theAddressee.isEmpty() )
                 {
@@ -869,8 +886,12 @@ void KopeteMetaContact::updateKABC()
                                 for( ; addrIt != appIt.data().end(); ++addrIt )
                                 {
-                                        // FIXME: This assumes Kopete is the only app writing these \
fields +                                        // read existing data for this key
+                                        QString currentCustom = theAddressee.custom( appIt.key(), \
addrIt.key() ); +                                        // merge without duplicating
+                                        QString toWrite = unionContents( currentCustom, addrIt.data() );
+                                        // write the result
                                         // Note if nothing ends up in the KABC data, this is because \
                insertCustom does nothing if any param is empty.
-                                        kdDebug( 14010 ) << k_funcinfo << "Writing: " << appIt.key() << \
                ", " << addrIt.key() << ", " << addrIt.data() << endl;
-                                        theAddressee.insertCustom( appIt.key(), addrIt.key(), \
addrIt.data() ); +                                        kdDebug( 14010 ) << k_funcinfo << "Writing: " \
<< appIt.key() << ", " << addrIt.key() << ", " << toWrite << endl; +                                      \
theAddressee.insertCustom( appIt.key(), addrIt.key(), toWrite );  }
                         }


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

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