00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
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
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
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
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
00366
00367 if ( !sameType( _entry, _other, QString::fromLatin1("AddressBookSyncEntry") ) )
00368 return false;
00369
00370
00371
00372
00373 AddressBookSyncEntry *entry, *other;
00374 entry = static_cast<AddressBookSyncEntry*>( _entry );
00375 other = static_cast<AddressBookSyncEntry*>( _other );
00376
00377
00378
00379
00380 AddressBookMergerInternal::MergeMap::Iterator it;
00381 AddressBookMergerInternal::MergeMap* ma = AddressBookMergerInternal::mergeMap();
00382
00383
00384
00385
00386
00387
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
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
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 }