kitchensync

addressbookmerger.cpp

00001 /*
00002     This file is part of KitchenSync.
00003 
00004     Copyright (c) 2002,2003,2004 Holger Freyther <zecke@handhelds.org>
00005 
00006     This library is free software; you can redistribute it and/or
00007     modify it under the terms of the GNU Library General Public
00008     License as published by the Free Software Foundation; either
00009     version 2 of the License, or (at your option) any later version.
00010 
00011     This library is distributed in the hope that it will be useful,
00012     but WITHOUT ANY WARRANTY; without even the implied warranty of
00013     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014     Library General Public License for more details.
00015 
00016     You should have received a copy of the GNU Library General Public License
00017     along with this library; see the file COPYING.LIB.  If not, write to
00018     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00019     Boston, MA 02110-1301, USA.
00020 */
00021 
00022 #include "addressbookmerger.h"
00023 
00024 #include "addressbooksyncee.h"
00025 
00026 #include <kabc/addressee.h>
00027 #include <kstaticdeleter.h>
00028 
00029 namespace KSync {
00030 namespace AddressBookMergerInternal {
00031 
00032 
00033 typedef void (*merge)(KABC::Addressee&, const KABC::Addressee& );
00034 typedef QMap<int, merge> MergeMap;
00035 
00036 static MergeMap* _mergeMap= 0;
00037 static KStaticDeleter<MergeMap> mergeMapDeleter;
00038 
00039 /* merge functions */
00040 static void mergeFamily    ( KABC::Addressee&, const KABC::Addressee& );
00041 static void mergeGiven     ( KABC::Addressee&, const KABC::Addressee& );
00042 static void mergeAdditionalName( KABC::Addressee&, const KABC::Addressee& );
00043 static void mergePrefix    ( KABC::Addressee&, const KABC::Addressee& );
00044 static void mergeSuffix    ( KABC::Addressee&, const KABC::Addressee& );
00045 static void mergeNickName      ( KABC::Addressee&, const KABC::Addressee& );
00046 static void mergeBirthDay      ( KABC::Addressee&, const KABC::Addressee& );
00047 static void mergeHomeAddress   ( KABC::Addressee&, const KABC::Addressee& );
00048 static void mergeBusinessAddress ( KABC::Addressee&, const KABC::Addressee& );
00049 static void mergeTimeZone      ( KABC::Addressee&, const KABC::Addressee& );
00050 static void mergeGeo       ( KABC::Addressee&, const KABC::Addressee& );
00051 static void mergeTitle     ( KABC::Addressee&, const KABC::Addressee& );
00052 static void mergeRole      ( KABC::Addressee&, const KABC::Addressee& );
00053 static void mergeOrganization  ( KABC::Addressee&, const KABC::Addressee& );
00054 static void mergeNote      ( KABC::Addressee&, const KABC::Addressee& );
00055 static void mergeUrl       ( KABC::Addressee&, const KABC::Addressee& );
00056 static void mergeSecrecy   ( KABC::Addressee&, const KABC::Addressee& );
00057 static void mergePicture   ( KABC::Addressee&, const KABC::Addressee& );
00058 static void mergeSound     ( KABC::Addressee&, const KABC::Addressee& );
00059 static void mergeAgent     ( KABC::Addressee&, const KABC::Addressee& );
00060 static void mergeHomeTelephoneNumber( KABC::Addressee&,
00061                                       const KABC::Addressee& );
00062 static void mergeOfficeTelephoneNumber( KABC::Addressee&,
00063                                         const KABC::Addressee& );
00064 static void mergeMessenger ( KABC::Addressee&, const KABC::Addressee& );
00065 static void mergePreferredNumber( KABC::Addressee&, const KABC::Addressee& );
00066 static void mergeVoice     ( KABC::Addressee&, const KABC::Addressee& );
00067 static void mergeFax       ( KABC::Addressee&, const KABC::Addressee& );
00068 static void mergeCellPhone ( KABC::Addressee&, const KABC::Addressee& );
00069 static void mergeVideo     ( KABC::Addressee&, const KABC::Addressee& );
00070 static void mergeMailbox   ( KABC::Addressee&, const KABC::Addressee& );
00071 static void mergeModem     ( KABC::Addressee&, const KABC::Addressee& );
00072 static void mergeCarPhone  ( KABC::Addressee&, const KABC::Addressee& );
00073 static void mergeISDN      ( KABC::Addressee&, const KABC::Addressee& );
00074 static void mergePCS       ( KABC::Addressee&, const KABC::Addressee& );
00075 static void mergePager     ( KABC::Addressee&, const KABC::Addressee& );
00076 static void mergeHomeFax   ( KABC::Addressee&, const KABC::Addressee& );
00077 static void mergeWorkFax   ( KABC::Addressee&, const KABC::Addressee& );
00078 static void mergeOtherTelephone( KABC::Addressee&, const KABC::Addressee& );
00079 static void mergeCategory  ( KABC::Addressee&, const KABC::Addressee& );
00080 static void mergeKeys      ( KABC::Addressee&, const KABC::Addressee& );
00081 static void mergeCustom    ( KABC::Addressee&, const KABC::Addressee& );
00082 static void mergeLogo      ( KABC::Addressee&, const KABC::Addressee& );
00083 static void mergeEmails    ( KABC::Addressee&, const KABC::Addressee& );
00084 static QStringList mergeList( const QStringList& entry, const QStringList& other );
00085 
00086 MergeMap* mergeMap()
00087 {
00088   if (!_mergeMap ) {
00089     /* now fill it with functions.... */
00090     mergeMapDeleter.setObject( _mergeMap,  new MergeMap );
00091     _mergeMap->insert(AddressBookMerger::FamilyName, mergeFamily );
00092     _mergeMap->insert(AddressBookMerger::GivenName,  mergeGiven );
00093     _mergeMap->insert(AddressBookMerger::AdditionalName, mergeAdditionalName );
00094     _mergeMap->insert(AddressBookMerger::Prefix, mergePrefix );
00095     _mergeMap->insert(AddressBookMerger::Suffix, mergeSuffix );
00096     _mergeMap->insert(AddressBookMerger::NickName, mergeNickName );
00097     _mergeMap->insert(AddressBookMerger::Birthday, mergeBirthDay );
00098     _mergeMap->insert(AddressBookMerger::HomeAddress, mergeHomeAddress );
00099     _mergeMap->insert(AddressBookMerger::BusinessAddress, mergeBusinessAddress );
00100     _mergeMap->insert(AddressBookMerger::TimeZone, mergeTimeZone );
00101     _mergeMap->insert(AddressBookMerger::Geo, mergeGeo );
00102     _mergeMap->insert(AddressBookMerger::Title, mergeTitle );
00103     _mergeMap->insert(AddressBookMerger::Role, mergeRole );
00104     _mergeMap->insert(AddressBookMerger::Organization, mergeOrganization );
00105     _mergeMap->insert(AddressBookMerger::Note, mergeNote );
00106     _mergeMap->insert(AddressBookMerger::Url, mergeUrl );
00107     _mergeMap->insert(AddressBookMerger::Secrecy, mergeSecrecy );
00108     _mergeMap->insert(AddressBookMerger::Picture, mergePicture );
00109     _mergeMap->insert(AddressBookMerger::Sound, mergeSound );
00110     _mergeMap->insert(AddressBookMerger::Agent, mergeAgent );
00111     _mergeMap->insert(AddressBookMerger::HomeNumbers, mergeHomeTelephoneNumber );
00112     _mergeMap->insert(AddressBookMerger::OfficeNumbers, mergeOfficeTelephoneNumber );
00113     _mergeMap->insert(AddressBookMerger::Messenger, mergeMessenger );
00114     _mergeMap->insert(AddressBookMerger::PreferredNumber, mergePreferredNumber );
00115     _mergeMap->insert(AddressBookMerger::Voice, mergeVoice );
00116     _mergeMap->insert(AddressBookMerger::Fax, mergeFax );
00117     _mergeMap->insert(AddressBookMerger::Cell, mergeCellPhone );
00118     _mergeMap->insert(AddressBookMerger::Video, mergeVideo );
00119     _mergeMap->insert(AddressBookMerger::Mailbox, mergeMailbox );
00120     _mergeMap->insert(AddressBookMerger::Modem, mergeModem );
00121     _mergeMap->insert(AddressBookMerger::CarPhone, mergeCarPhone );
00122     _mergeMap->insert(AddressBookMerger::ISDN, mergeISDN );
00123     _mergeMap->insert(AddressBookMerger::PCS, mergePCS );
00124     _mergeMap->insert(AddressBookMerger::Pager, mergePager );
00125     _mergeMap->insert(AddressBookMerger::HomeFax, mergeHomeFax );
00126     _mergeMap->insert(AddressBookMerger::WorkFax, mergeWorkFax );
00127     _mergeMap->insert(AddressBookMerger::OtherTel, mergeOtherTelephone );
00128     _mergeMap->insert(AddressBookMerger::Category, mergeCategory );
00129     _mergeMap->insert(AddressBookMerger::Custom, mergeCustom );
00130     _mergeMap->insert(AddressBookMerger::Keys, mergeKeys );
00131     _mergeMap->insert(AddressBookMerger::Logo, mergeLogo );
00132     _mergeMap->insert(AddressBookMerger::Email, mergeEmails );
00133   }
00134   return _mergeMap;
00135 }
00136     /* merge functions */
00137 static void mergeFamily    ( KABC::Addressee& entry, const KABC::Addressee& other)
00138 {
00139   entry.setFamilyName( other.familyName() );
00140 }
00141 
00142 static void mergeGiven     ( KABC::Addressee& entry, const KABC::Addressee& other)
00143 {
00144   entry.setGivenName( other.givenName() );
00145 }
00146 
00147 static void mergeAdditionalName( KABC::Addressee& entry, const KABC::Addressee& other)
00148 {
00149   entry.setAdditionalName( other.additionalName() );
00150 }
00151 
00152 static void mergePrefix    ( KABC::Addressee& entry, const KABC::Addressee& other)
00153 {
00154   entry.setPrefix( other.prefix() );
00155 }
00156 
00157 static void mergeSuffix    ( KABC::Addressee& entry, const KABC::Addressee& other)
00158 {
00159   entry.setSuffix( other.suffix() );
00160 }
00161 
00162 static void mergeNickName( KABC::Addressee& entry, const KABC::Addressee& other)
00163 {
00164   entry.setNickName( other.nickName() );
00165 }
00166 
00167 static void mergeBirthDay( KABC::Addressee& entry, const KABC::Addressee& other)
00168 {
00169   entry.setBirthday( other.birthday() );
00170 }
00171 
00172 static void mergeHomeAddress( KABC::Addressee& entry, const KABC::Addressee& other)
00173 {
00174   entry.insertAddress( other.address( KABC::Address::Home ) );
00175 }
00176 
00177 static void mergeBusinessAddress( KABC::Addressee& entry, const KABC::Addressee& other)
00178 {
00179   entry.insertAddress( other.address( KABC::Address::Work ) );
00180 }
00181 
00182 static void mergeTimeZone( KABC::Addressee& entry, const KABC::Addressee& other)
00183 {
00184   entry.setTimeZone( other.timeZone() );
00185 }
00186 
00187 static void mergeGeo       ( KABC::Addressee& entry, const KABC::Addressee& other)
00188 {
00189   entry.setGeo( other.geo() );
00190 }
00191 
00192 static void mergeTitle     ( KABC::Addressee& entry, const KABC::Addressee& other)
00193 {
00194   entry.setTitle( other.title() );
00195 }
00196 
00197 static void mergeRole      ( KABC::Addressee& entry, const KABC::Addressee& other)
00198 {
00199   entry.setRole( other.role() );
00200 }
00201 
00202 static void mergeOrganization( KABC::Addressee& entry, const KABC::Addressee& other)
00203 {
00204   entry.setOrganization( other.organization() );
00205 }
00206 
00207 static void mergeNote      ( KABC::Addressee& entry, const KABC::Addressee& other)
00208 {
00209   entry.setNote( other.note() );
00210 }
00211 
00212 static void mergeUrl       ( KABC::Addressee& entry, const KABC::Addressee& other)
00213 {
00214   entry.setUrl( other.url() );
00215 }
00216 
00217 static void mergeSecrecy   ( KABC::Addressee& entry, const KABC::Addressee& other)
00218 {
00219   entry.setSecrecy( other.secrecy() );
00220 }
00221 
00222 static void mergePicture   ( KABC::Addressee& entry, const KABC::Addressee& other)
00223 {
00224   entry.setPhoto( other.photo() );
00225 }
00226 
00227 static void mergeSound     ( KABC::Addressee& entry, const KABC::Addressee& other)
00228 {
00229   entry.setSound( other.sound() );
00230 }
00231 
00232 static void mergeAgent     ( KABC::Addressee& entry, const KABC::Addressee& other)
00233 {
00234   entry.setAgent( other.agent() );
00235 }
00236 
00237 static void mergeHomeTelephoneNumber( KABC::Addressee& entry, const KABC::Addressee& other)
00238 {
00239   entry.insertPhoneNumber( other.phoneNumber( KABC::PhoneNumber::Home ) );
00240 }
00241 
00242 static void mergeOfficeTelephoneNumber( KABC::Addressee& entry, const KABC::Addressee& other)
00243 {
00244   entry.insertPhoneNumber( other.phoneNumber( KABC::PhoneNumber::Work ) );
00245 }
00246 
00247 static void mergeMessenger ( KABC::Addressee& entry, const KABC::Addressee& other)
00248 {
00249   entry.insertPhoneNumber( other.phoneNumber( KABC::PhoneNumber::Msg ) );
00250 }
00251 
00252 static void mergePreferredNumber( KABC::Addressee& entry, const KABC::Addressee& other)
00253 {
00254   entry.insertPhoneNumber( other.phoneNumber( KABC::PhoneNumber::Pref ) );
00255 }
00256 
00257 static void mergeVoice     ( KABC::Addressee& entry, const KABC::Addressee& other)
00258 {
00259   entry.insertPhoneNumber( other.phoneNumber( KABC::PhoneNumber::Voice ) );
00260 }
00261 
00262 static void mergeFax       ( KABC::Addressee& entry, const KABC::Addressee& other)
00263 {
00264   entry.insertPhoneNumber( other.phoneNumber( KABC::PhoneNumber::Fax ) );
00265 }
00266 
00267 static void mergeCellPhone ( KABC::Addressee& entry, const KABC::Addressee& other)
00268 {
00269   entry.insertPhoneNumber( other.phoneNumber( KABC::PhoneNumber::Cell ) );
00270 }
00271 
00272 static void mergeVideo     ( KABC::Addressee& entry, const KABC::Addressee& other)
00273 {
00274   entry.insertPhoneNumber( other.phoneNumber( KABC::PhoneNumber::Video ) );
00275 }
00276 
00277 static void mergeMailbox   ( KABC::Addressee& entry, const KABC::Addressee& other)
00278 {
00279   entry.insertPhoneNumber( other.phoneNumber( KABC::PhoneNumber::Bbs ) );
00280 }
00281 
00282 static void mergeModem     ( KABC::Addressee& entry, const KABC::Addressee& other)
00283 {
00284   entry.insertPhoneNumber( other.phoneNumber( KABC::PhoneNumber::Modem ) );
00285 }
00286 
00287 static void mergeCarPhone  ( KABC::Addressee& entry, const KABC::Addressee& other)
00288 {
00289   entry.insertPhoneNumber( other.phoneNumber( KABC::PhoneNumber::Car ) );
00290 }
00291 
00292 static void mergeISDN      ( KABC::Addressee& entry, const KABC::Addressee& other)
00293 {
00294   entry.insertPhoneNumber( other.phoneNumber( KABC::PhoneNumber::Isdn ) );
00295 }
00296 
00297 static void mergePCS       ( KABC::Addressee& entry, const KABC::Addressee& other)
00298 {
00299   entry.insertPhoneNumber( other.phoneNumber( KABC::PhoneNumber::Pcs ) );
00300 }
00301 
00302 static void mergePager     ( KABC::Addressee& entry, const KABC::Addressee& other)
00303 {
00304   entry.insertPhoneNumber( other.phoneNumber( KABC::PhoneNumber::Pager ) );
00305 }
00306 
00307 static void mergeHomeFax   ( KABC::Addressee& entry, const KABC::Addressee& other)
00308 {
00309   entry.insertPhoneNumber( other.phoneNumber( KABC::PhoneNumber::Home | KABC::PhoneNumber::Fax ) );
00310 }
00311 
00312 static void mergeWorkFax   ( KABC::Addressee& entry, const KABC::Addressee& other)
00313 {
00314   entry.insertPhoneNumber( other.phoneNumber( KABC::PhoneNumber::Work | KABC::PhoneNumber::Fax ) );
00315 }
00316 
00317 static void mergeOtherTelephone ( KABC::Addressee&, const KABC::Addressee& )
00318 {}
00319 
00320 static void mergeCategory( KABC::Addressee& entry, const KABC::Addressee& other)
00321 {
00322   entry.setCategories( other.categories() );
00323 }
00324 
00325 static void mergeKeys      ( KABC::Addressee& entry, const KABC::Addressee& other)
00326 {
00327   entry.setKeys( other.keys() );
00328 }
00329 
00330 static void mergeCustom    ( KABC::Addressee& entry, const KABC::Addressee& other)
00331 {
00332   entry.setCustoms( AddressBookMergerInternal::mergeList( entry.customs(), other.customs() ) );
00333 }
00334 
00335 static void mergeLogo      ( KABC::Addressee& entry, const KABC::Addressee& other)
00336 {
00337   entry.setLogo( other.logo() );
00338 }
00339 
00340 static void mergeEmails    ( KABC::Addressee& entry, const KABC::Addressee& other)
00341 {
00342   QString pref = entry.preferredEmail();
00343   entry.setEmails( other.emails() );
00344   entry.insertEmail( pref, true );
00345 }
00346 
00347 }
00348 
00349 
00350 
00351 
00352 AddressBookMerger::AddressBookMerger( const QBitArray &supp)
00353   : mSupports( supp )
00354 {
00355   setSynceeType( QString::fromLatin1( "AddressBookSyncee" ) );
00356 }
00357 
00358 AddressBookMerger::~AddressBookMerger()
00359 {}
00360 
00361 
00362 bool AddressBookMerger::merge( SyncEntry* _entry, SyncEntry* _other )
00363 {
00364   /*
00365    * Check if we're from the same type
00366    */
00367   if ( !sameType( _entry, _other, QString::fromLatin1("AddressBookSyncEntry") ) )
00368     return false;
00369 
00370   /*
00371    * Now we can safely cast
00372    */
00373   AddressBookSyncEntry *entry, *other;
00374   entry = static_cast<AddressBookSyncEntry*>( _entry );
00375   other = static_cast<AddressBookSyncEntry*>( _other );
00376 
00377   /*
00378    * Create the Map, and then start
00379    */
00380   AddressBookMergerInternal::MergeMap::Iterator it;
00381   AddressBookMergerInternal::MergeMap* ma = AddressBookMergerInternal::mergeMap();
00382 
00383 
00384   /*
00385    * See what the other support
00386    * If it doesn't have a Merger we will assume it supports
00387    * everything
00388    */
00389   QBitArray otherSupport;
00390   if ( other->syncee() && other->syncee()->merger() )
00391     otherSupport = (otherMerger<AddressBookMerger>( other ))->mSupports;
00392   else {
00393     otherSupport = QBitArray( mSupports.size() );
00394     otherSupport.fill( true );
00395   }
00396 
00397   for ( uint i = 0; i < mSupports.size() && i < otherSupport.size(); ++i )
00398     /* we don't know it, but the other do so merge */
00399     if ( otherSupport[i] && !mSupports[i] ) {
00400       it = ma->find( i );
00401       if ( it != ma->end() )
00402         (*it.data())(entry->mAddressee, other->mAddressee );
00403     }
00404 
00405   /*  now merge custom entries */
00406   AddressBookMergerInternal::mergeCustom( entry->mAddressee, other->mAddressee );
00407 
00408   return true;
00409 }
00410 
00411 
00412 
00413 
00414 
00415 
00416 
00417 
00418 
00419 
00420 
00421 
00422 
00423 
00424 
00425 
00426 
00427 
00428 namespace AddressBookMergerInternal {
00429 
00430 static QStringList mergeList( const QStringList& entry, const QStringList& other ) {
00431     QStringList list = entry;
00432 
00433     QStringList::ConstIterator it;
00434     for (it = other.begin(); it != other.end(); ++it ) {
00435         if (!list.contains( (*it) ) )
00436             list << (*it);
00437     }
00438 
00439     return list;
00440 }
00441 
00442 }
00443 }
KDE Home | KDE Accessibility Home | Description of Access Keys