summaryrefslogtreecommitdiffabout
path: root/kabc/addressee.cpp
authorzautrix <zautrix>2005-10-28 11:31:59 (UTC)
committer zautrix <zautrix>2005-10-28 11:31:59 (UTC)
commitb27cb619bb9005ad4345d38bbee3b1c3d0eda1b2 (patch) (unidiff)
treea7ac6002208ddedcd9dc13cd0e91294519883007 /kabc/addressee.cpp
parent5ceebb8563f134c789e9082d1bc49723beb28c8c (diff)
downloadkdepimpi-b27cb619bb9005ad4345d38bbee3b1c3d0eda1b2.zip
kdepimpi-b27cb619bb9005ad4345d38bbee3b1c3d0eda1b2.tar.gz
kdepimpi-b27cb619bb9005ad4345d38bbee3b1c3d0eda1b2.tar.bz2
commit
Diffstat (limited to 'kabc/addressee.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--kabc/addressee.cpp4
1 files changed, 2 insertions, 2 deletions
diff --git a/kabc/addressee.cpp b/kabc/addressee.cpp
index 19c78ee..789a694 100644
--- a/kabc/addressee.cpp
+++ b/kabc/addressee.cpp
@@ -294,1559 +294,1559 @@ void Addressee::computeCsum(const QString &dev)
294 t.sort(); 294 t.sort();
295 for ( iii = 0; iii < t.count(); ++iii) 295 for ( iii = 0; iii < t.count(); ++iii)
296 l.append( t[iii] ); 296 l.append( t[iii] );
297 } 297 }
298 uint cs = getCsum4List(l); 298 uint cs = getCsum4List(l);
299 299
300#if 0 300#if 0
301 for ( iii = 0; iii < l.count(); ++iii) 301 for ( iii = 0; iii < l.count(); ++iii)
302 qDebug("%d***%s***",iii,l[iii].latin1()); 302 qDebug("%d***%s***",iii,l[iii].latin1());
303 qDebug("CSUM computed %d %s %s", cs,QString::number (cs ).latin1(), uid().latin1() ); 303 qDebug("CSUM computed %d %s %s", cs,QString::number (cs ).latin1(), uid().latin1() );
304#endif 304#endif
305 305
306 306
307 setCsum( dev, QString::number (cs )); 307 setCsum( dev, QString::number (cs ));
308} 308}
309bool Addressee::matchAddress( QRegExp* re ) const 309bool Addressee::matchAddress( QRegExp* re ) const
310{ 310{
311 KABC::Address::List::Iterator addressIter; 311 KABC::Address::List::Iterator addressIter;
312 for ( addressIter = mData->addresses.begin(); addressIter != mData->addresses.end(); 312 for ( addressIter = mData->addresses.begin(); addressIter != mData->addresses.end();
313 ++addressIter ) { 313 ++addressIter ) {
314 if ( (*addressIter).matchAddress( re ) ) 314 if ( (*addressIter).matchAddress( re ) )
315 return true; 315 return true;
316 } 316 }
317 return false; 317 return false;
318} 318}
319bool Addressee::matchPhoneNumber( QRegExp* re ) const 319bool Addressee::matchPhoneNumber( QRegExp* re ) const
320{ 320{
321 KABC::PhoneNumber::List::Iterator phoneIter; 321 KABC::PhoneNumber::List::Iterator phoneIter;
322 322
323 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); ++phoneIter ) { 323 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); ++phoneIter ) {
324#if QT_VERSION >= 0x030000 324#if QT_VERSION >= 0x030000
325 if (re->search( (*phoneIter).number() ) == 0) 325 if (re->search( (*phoneIter).number() ) == 0)
326#else 326#else
327 if (re->match( (*phoneIter).number() ) == 0) 327 if (re->match( (*phoneIter).number() ) == 0)
328#endif 328#endif
329 return true; 329 return true;
330 330
331 } 331 }
332 return false; 332 return false;
333 333
334} 334}
335void Addressee::mergeContact( const Addressee& ad , bool isSubSet) // = false) 335void Addressee::mergeContact( const Addressee& ad , bool isSubSet) // = false)
336{ 336{
337 // merge all standard non-outlook fields. 337 // merge all standard non-outlook fields.
338 //if isSubSet (e.g. mobile phone sync) merge all fields 338 //if isSubSet (e.g. mobile phone sync) merge all fields
339 339
340 detach(); 340 detach();
341 if ( isSubSet ) { 341 if ( isSubSet ) {
342 if ( mData->name.isEmpty() ) mData->name = ad.mData->name; 342 if ( mData->name.isEmpty() ) mData->name = ad.mData->name;
343 if ( mData->formattedName.isEmpty() ) mData->formattedName = ad.mData->formattedName; 343 if ( mData->formattedName.isEmpty() ) mData->formattedName = ad.mData->formattedName;
344 if ( mData->familyName.isEmpty() ) mData->familyName = ad.mData->familyName; 344 if ( mData->familyName.isEmpty() ) mData->familyName = ad.mData->familyName;
345 if ( mData->givenName.isEmpty() ) mData->givenName = ad.mData->givenName ; 345 if ( mData->givenName.isEmpty() ) mData->givenName = ad.mData->givenName ;
346 if ( mData->additionalName ) mData->additionalName = ad.mData->additionalName; 346 if ( mData->additionalName ) mData->additionalName = ad.mData->additionalName;
347 if ( mData->prefix.isEmpty() ) mData->prefix = ad.mData->prefix; 347 if ( mData->prefix.isEmpty() ) mData->prefix = ad.mData->prefix;
348 if ( mData->suffix.isEmpty() ) mData->suffix = ad.mData->suffix; 348 if ( mData->suffix.isEmpty() ) mData->suffix = ad.mData->suffix;
349 if ( mData->title .isEmpty() ) mData->title = ad.mData->title ; 349 if ( mData->title .isEmpty() ) mData->title = ad.mData->title ;
350 if ( mData->role.isEmpty() ) mData->role = ad.mData->role ; 350 if ( mData->role.isEmpty() ) mData->role = ad.mData->role ;
351 if ( mData->nickName.isEmpty() ) mData->nickName = ad.mData->nickName; 351 if ( mData->nickName.isEmpty() ) mData->nickName = ad.mData->nickName;
352 if ( mData->organization.isEmpty() ) mData->organization = ad.mData->organization ; 352 if ( mData->organization.isEmpty() ) mData->organization = ad.mData->organization ;
353 if ( mData->note.isEmpty() ) mData->note = ad.mData->note ; 353 if ( mData->note.isEmpty() ) mData->note = ad.mData->note ;
354 if ( !mData->secrecy.isValid() ) mData->secrecy = ad.mData->secrecy; 354 if ( !mData->secrecy.isValid() ) mData->secrecy = ad.mData->secrecy;
355 if ( ( !mData->url.isValid() && ad.mData->url.isValid() ) ) mData->url = ad.mData->url ; 355 if ( ( !mData->url.isValid() && ad.mData->url.isValid() ) ) mData->url = ad.mData->url ;
356 if ( !mData->birthday.isValid() ) 356 if ( !mData->birthday.isValid() )
357 if ( ad.mData->birthday.isValid()) 357 if ( ad.mData->birthday.isValid())
358 mData->birthday = ad.mData->birthday; 358 mData->birthday = ad.mData->birthday;
359 359
360 } 360 }
361 if ( mData->mailer.isEmpty() ) mData->mailer = ad.mData->mailer; 361 if ( mData->mailer.isEmpty() ) mData->mailer = ad.mData->mailer;
362 if ( !mData->timeZone.isValid() ) mData->timeZone = ad.mData->timeZone; 362 if ( !mData->timeZone.isValid() ) mData->timeZone = ad.mData->timeZone;
363 if ( !mData->geo.isValid() ) mData->geo = ad.mData->geo; 363 if ( !mData->geo.isValid() ) mData->geo = ad.mData->geo;
364 if ( mData->productId.isEmpty() ) mData->productId = ad.mData->productId; 364 if ( mData->productId.isEmpty() ) mData->productId = ad.mData->productId;
365 if ( mData->sortString.isEmpty() ) mData->sortString = ad.mData->sortString; 365 if ( mData->sortString.isEmpty() ) mData->sortString = ad.mData->sortString;
366 QStringList t; 366 QStringList t;
367 QStringList tAD; 367 QStringList tAD;
368 uint iii; 368 uint iii;
369 369
370 // ********** phone numbers 370 // ********** phone numbers
371 if ( isSubSet ) { 371 if ( isSubSet ) {
372 PhoneNumber::List phoneAD = ad.phoneNumbers(); 372 PhoneNumber::List phoneAD = ad.phoneNumbers();
373 PhoneNumber::List::Iterator phoneItAD; 373 PhoneNumber::List::Iterator phoneItAD;
374 for ( phoneItAD = phoneAD.begin(); phoneItAD != phoneAD.end(); ++phoneItAD ) { 374 for ( phoneItAD = phoneAD.begin(); phoneItAD != phoneAD.end(); ++phoneItAD ) {
375 bool found = false; 375 bool found = false;
376 PhoneNumber::List::Iterator it; 376 PhoneNumber::List::Iterator it;
377 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 377 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
378 if ( ( *phoneItAD ).contains( (*it) ) ) { 378 if ( ( *phoneItAD ).contains( (*it) ) ) {
379 found = true; 379 found = true;
380 (*it).setType( ( *phoneItAD ).type() ); 380 (*it).setType( ( *phoneItAD ).type() );
381 (*it).setNumber( ( *phoneItAD ).number() ); 381 (*it).setNumber( ( *phoneItAD ).number() );
382 break; 382 break;
383 } 383 }
384 } 384 }
385 // if ( isSubSet && ! found ) 385 // if ( isSubSet && ! found )
386 if ( ! found ) // LR try this one... 386 if ( ! found ) // LR try this one...
387 mData->phoneNumbers.append( *phoneItAD ); 387 mData->phoneNumbers.append( *phoneItAD );
388 } 388 }
389 } else { 389 } else {
390 PhoneNumber::List phoneAD = ad.phoneNumbers(); 390 PhoneNumber::List phoneAD = ad.phoneNumbers();
391 PhoneNumber::List::Iterator phoneItAD; 391 PhoneNumber::List::Iterator phoneItAD;
392 for ( phoneItAD = phoneAD.begin(); phoneItAD != phoneAD.end(); ++phoneItAD ) { 392 for ( phoneItAD = phoneAD.begin(); phoneItAD != phoneAD.end(); ++phoneItAD ) {
393 bool found = false; 393 bool found = false;
394 PhoneNumber::List::Iterator it; 394 PhoneNumber::List::Iterator it;
395 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 395 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
396 if ( ( *phoneItAD ).contains( (*it) ) ) { 396 if ( ( *phoneItAD ).contains( (*it) ) ) {
397 found = true; 397 found = true;
398 (*it).setType( ( *phoneItAD ).type() ); 398 (*it).setType( ( *phoneItAD ).type() );
399 (*it).setNumber( ( *phoneItAD ).number() ); 399 (*it).setNumber( ( *phoneItAD ).number() );
400 break; 400 break;
401 } 401 }
402 } 402 }
403 if ( ! found ) { // append numbers which do not have work or home type 403 if ( ! found ) { // append numbers which do not have work or home type
404 if ( ! ( ( *phoneItAD ).type() & (PhoneNumber::Work | PhoneNumber::Home) ) ) 404 if ( ! ( ( *phoneItAD ).type() & (PhoneNumber::Work | PhoneNumber::Home) ) )
405 mData->phoneNumbers.append( *phoneItAD ); 405 mData->phoneNumbers.append( *phoneItAD );
406 } 406 }
407 } 407 }
408 } 408 }
409 if ( isSubSet ) { 409 if ( isSubSet ) {
410 // ************* emails; 410 // ************* emails;
411 t = mData->emails; 411 t = mData->emails;
412 tAD = ad.mData->emails; 412 tAD = ad.mData->emails;
413 for ( iii = 0; iii < tAD.count(); ++iii) 413 for ( iii = 0; iii < tAD.count(); ++iii)
414 if ( !t.contains(tAD[iii] ) ) 414 if ( !t.contains(tAD[iii] ) )
415 mData->emails.append( tAD[iii] ); 415 mData->emails.append( tAD[iii] );
416 } 416 }
417 417
418 // ************* categories; 418 // ************* categories;
419 if ( isSubSet ) { 419 if ( isSubSet ) {
420 t = mData->categories; 420 t = mData->categories;
421 tAD = ad.mData->categories; 421 tAD = ad.mData->categories;
422 for ( iii = 0; iii < tAD.count(); ++iii) 422 for ( iii = 0; iii < tAD.count(); ++iii)
423 if ( !t.contains(tAD[iii] ) ) 423 if ( !t.contains(tAD[iii] ) )
424 mData->categories.append( tAD[iii] ); 424 mData->categories.append( tAD[iii] );
425 } 425 }
426 QStringList::ConstIterator it; 426 QStringList::ConstIterator it;
427 for( it = ad.mData->custom.begin(); it != ad.mData->custom.end(); ++it ) { 427 for( it = ad.mData->custom.begin(); it != ad.mData->custom.end(); ++it ) {
428 QString qualifiedName = (*it).left( (*it).find( ":" )); 428 QString qualifiedName = (*it).left( (*it).find( ":" ));
429 bool found = false; 429 bool found = false;
430 QStringList::ConstIterator itL; 430 QStringList::ConstIterator itL;
431 for( itL = mData->custom.begin(); itL != mData->custom.end(); ++itL ) { 431 for( itL = mData->custom.begin(); itL != mData->custom.end(); ++itL ) {
432 if ( (*itL).startsWith( qualifiedName ) ) { 432 if ( (*itL).startsWith( qualifiedName ) ) {
433 found = true; 433 found = true;
434 break; 434 break;
435 } 435 }
436 } 436 }
437 if ( ! found ) { 437 if ( ! found ) {
438 mData->custom.append( *it ); 438 mData->custom.append( *it );
439 } 439 }
440 } 440 }
441 if ( mData->logo.undefined() && !ad.mData->logo.undefined() ) mData->logo = ad.mData->logo; 441 if ( mData->logo.undefined() && !ad.mData->logo.undefined() ) mData->logo = ad.mData->logo;
442 if ( mData->photo.undefined() && !ad.mData->photo.undefined() ) mData->photo = ad.mData->photo; 442 if ( mData->photo.undefined() && !ad.mData->photo.undefined() ) mData->photo = ad.mData->photo;
443 if ( !mData->sound.isIntern() ) { 443 if ( !mData->sound.isIntern() ) {
444 if ( mData->sound.url().isEmpty() ) { 444 if ( mData->sound.url().isEmpty() ) {
445 mData->sound = ad.mData->sound; 445 mData->sound = ad.mData->sound;
446 } 446 }
447 } 447 }
448 if ( !mData->agent.isIntern() ) { 448 if ( !mData->agent.isIntern() ) {
449 if ( mData->agent.url().isEmpty() ) { 449 if ( mData->agent.url().isEmpty() ) {
450 mData->agent = ad.mData->agent; 450 mData->agent = ad.mData->agent;
451 } 451 }
452 } 452 }
453 { 453 {
454 Key::List::Iterator itA; 454 Key::List::Iterator itA;
455 for( itA = ad.mData->keys.begin(); itA != ad.mData->keys.end(); ++itA ) { 455 for( itA = ad.mData->keys.begin(); itA != ad.mData->keys.end(); ++itA ) {
456 bool found = false; 456 bool found = false;
457 Key::List::Iterator it; 457 Key::List::Iterator it;
458 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 458 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
459 if ( (*it) == (*itA)) { 459 if ( (*it) == (*itA)) {
460 found = true; 460 found = true;
461 break; 461 break;
462 462
463 } 463 }
464 } 464 }
465 if ( ! found ) { 465 if ( ! found ) {
466 mData->keys.append( *itA ); 466 mData->keys.append( *itA );
467 } 467 }
468 } 468 }
469 } 469 }
470 if ( isSubSet ) { 470 if ( isSubSet ) {
471 KABC::Address::List::Iterator addressIterA; 471 KABC::Address::List::Iterator addressIterA;
472 for ( addressIterA = ad.mData->addresses.begin(); addressIterA != ad.mData->addresses.end(); ++addressIterA ) { 472 for ( addressIterA = ad.mData->addresses.begin(); addressIterA != ad.mData->addresses.end(); ++addressIterA ) {
473 bool found = false; 473 bool found = false;
474 KABC::Address::List::Iterator addressIter; 474 KABC::Address::List::Iterator addressIter;
475 for ( addressIter = mData->addresses.begin(); addressIter != mData->addresses.end(); 475 for ( addressIter = mData->addresses.begin(); addressIter != mData->addresses.end();
476 ++addressIter ) { 476 ++addressIter ) {
477 if ( (*addressIter) == (*addressIterA)) { 477 if ( (*addressIter) == (*addressIterA)) {
478 found = true; 478 found = true;
479 (*addressIter).setType( (*addressIterA).type() ); 479 (*addressIter).setType( (*addressIterA).type() );
480 break; 480 break;
481 } 481 }
482 482
483 } 483 }
484 if ( isSubSet && ! found ) { 484 if ( isSubSet && ! found ) {
485 mData->addresses.append( *addressIterA ); 485 mData->addresses.append( *addressIterA );
486 } 486 }
487 } 487 }
488 } 488 }
489 //qDebug("merge contact %s ", ad.uid().latin1()); 489 //qDebug("merge contact %s ", ad.uid().latin1());
490 setUid( ad.uid() ); 490 setUid( ad.uid() );
491 setRevision( ad.revision() ); 491 setRevision( ad.revision() );
492} 492}
493 493
494bool Addressee::removeVoice() 494bool Addressee::removeVoice()
495{ 495{
496 PhoneNumber::List phoneN = phoneNumbers(); 496 PhoneNumber::List phoneN = phoneNumbers();
497 PhoneNumber::List::Iterator phoneIt; 497 PhoneNumber::List::Iterator phoneIt;
498 bool found = false; 498 bool found = false;
499 for ( phoneIt = phoneN.begin(); phoneIt != phoneN.end(); ++phoneIt ) { 499 for ( phoneIt = phoneN.begin(); phoneIt != phoneN.end(); ++phoneIt ) {
500 if ( (*phoneIt).type() & PhoneNumber::Voice) { // voice found 500 if ( (*phoneIt).type() & PhoneNumber::Voice) { // voice found
501 if ((*phoneIt).type() - PhoneNumber::Voice ) { 501 if ((*phoneIt).type() - PhoneNumber::Voice ) {
502 (*phoneIt).setType((*phoneIt).type() - PhoneNumber::Voice ); 502 (*phoneIt).setType((*phoneIt).type() - PhoneNumber::Voice );
503 insertPhoneNumber( (*phoneIt) ); 503 insertPhoneNumber( (*phoneIt) );
504 found = true; 504 found = true;
505 } 505 }
506 } 506 }
507 507
508 } 508 }
509 return found; 509 return found;
510} 510}
511 511
512bool Addressee::containsAdr(const Addressee& ad ) 512bool Addressee::containsAdr(const Addressee& ad )
513{ 513{
514 if ( ! ad.mData->familyName.isEmpty() ) if ( mData->familyName != ad.mData->familyName) return false; 514 if ( ! ad.mData->familyName.isEmpty() ) if ( mData->familyName != ad.mData->familyName) return false;
515 if ( ! ad.mData->givenName.isEmpty() )if ( mData->givenName != ad.mData->givenName ) return false; 515 if ( ! ad.mData->givenName.isEmpty() )if ( mData->givenName != ad.mData->givenName ) return false;
516 if ( ad.mData->url.isValid() ) if (mData->url != ad.mData->url) return false ; 516 if ( ad.mData->url.isValid() ) if (mData->url != ad.mData->url) return false ;
517 if ( ! ad.mData->role.isEmpty() ) if (mData->role != ad.mData->role) return false ; 517 if ( ! ad.mData->role.isEmpty() ) if (mData->role != ad.mData->role) return false ;
518 if ( ! ad.mData->organization.isEmpty() ) if (mData->organization != ad.mData->organization) return false ; 518 if ( ! ad.mData->organization.isEmpty() ) if (mData->organization != ad.mData->organization) return false ;
519 if ( ! ad.mData->note.isEmpty() ) if (mData->note != ad.mData->note) return false ; 519 if ( ! ad.mData->note.isEmpty() ) if (mData->note != ad.mData->note) return false ;
520 if ( ! ad.mData->title .isEmpty() ) if (mData->title != ad.mData->title ) return false ; 520 if ( ! ad.mData->title .isEmpty() ) if (mData->title != ad.mData->title ) return false ;
521 521
522 // compare phone numbers 522 // compare phone numbers
523 PhoneNumber::List phoneN = ad.phoneNumbers(); 523 PhoneNumber::List phoneN = ad.phoneNumbers();
524 PhoneNumber::List::Iterator phoneIt; 524 PhoneNumber::List::Iterator phoneIt;
525 bool found = false; 525 bool found = false;
526 for ( phoneIt = phoneN.begin(); phoneIt != phoneN.end(); ++phoneIt ) { 526 for ( phoneIt = phoneN.begin(); phoneIt != phoneN.end(); ++phoneIt ) {
527 bool found = false; 527 bool found = false;
528 PhoneNumber::List phoneL = ad.phoneNumbers(); 528 PhoneNumber::List phoneL = ad.phoneNumbers();
529 PhoneNumber::List::Iterator phoneItL; 529 PhoneNumber::List::Iterator phoneItL;
530 for ( phoneItL = phoneL.begin(); phoneItL != phoneL.end(); ++phoneItL ) { 530 for ( phoneItL = phoneL.begin(); phoneItL != phoneL.end(); ++phoneItL ) {
531 if ( ( *phoneItL ).number() == ( *phoneIt ).number() ) { 531 if ( ( *phoneItL ).number() == ( *phoneIt ).number() ) {
532 found = true; 532 found = true;
533 break; 533 break;
534 } 534 }
535 } 535 }
536 if ( ! found ) 536 if ( ! found )
537 return false; 537 return false;
538 } 538 }
539 return true; 539 return true;
540 540
541} 541}
542void Addressee::simplifyAddresses() 542void Addressee::simplifyAddresses()
543{ 543{
544 544
545 545
546 Address::List list; 546 Address::List list;
547 Address::List::Iterator it; 547 Address::List::Iterator it;
548 Address::List::Iterator it2; 548 Address::List::Iterator it2;
549 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 549 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
550 it2 = it; 550 it2 = it;
551 ++it2; 551 ++it2;
552 for( ; it2 != mData->addresses.end(); ++it2 ) { 552 for( ; it2 != mData->addresses.end(); ++it2 ) {
553 if ( (*it) == (*it2) ) { 553 if ( (*it) == (*it2) ) {
554 list.append( *it ); 554 list.append( *it );
555 break; 555 break;
556 } 556 }
557 } 557 }
558 } 558 }
559 for( it = list.begin(); it != list.end(); ++it ) { 559 for( it = list.begin(); it != list.end(); ++it ) {
560 removeAddress( (*it) ); 560 removeAddress( (*it) );
561 } 561 }
562 562
563 list.clear(); 563 list.clear();
564 int max = 2; 564 int max = 2;
565 if ( mData->url.isValid() ) 565 if ( mData->url.isValid() )
566 max = 1; 566 max = 1;
567 if ( mData->addresses.count() <= max ) return ; 567 if ( mData->addresses.count() <= max ) return ;
568 int count = 0; 568 int count = 0;
569 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 569 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
570 if ( count >= max ) 570 if ( count >= max )
571 list.append( *it ); 571 list.append( *it );
572 ++count; 572 ++count;
573 } 573 }
574 for( it = list.begin(); it != list.end(); ++it ) { 574 for( it = list.begin(); it != list.end(); ++it ) {
575 removeAddress( (*it) ); 575 removeAddress( (*it) );
576 } 576 }
577} 577}
578 578
579// removes all emails but the first 579// removes all emails but the first
580// needed by phone sync 580// needed by phone sync
581void Addressee::simplifyEmails() 581void Addressee::simplifyEmails()
582{ 582{
583 if ( mData->emails.count() == 0 ) return ; 583 if ( mData->emails.count() == 0 ) return ;
584 QString email = mData->emails.first(); 584 QString email = mData->emails.first();
585 detach(); 585 detach();
586 mData->emails.clear(); 586 mData->emails.clear();
587 mData->emails.append( email ); 587 mData->emails.append( email );
588} 588}
589void Addressee::makePhoneNumbersOLcompatible() 589void Addressee::makePhoneNumbersOLcompatible()
590{ 590{
591 KABC::PhoneNumber::List::Iterator phoneIter; 591 KABC::PhoneNumber::List::Iterator phoneIter;
592 KABC::PhoneNumber::List::Iterator phoneIter2; 592 KABC::PhoneNumber::List::Iterator phoneIter2;
593 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); 593 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
594 ++phoneIter ) { 594 ++phoneIter ) {
595 ( *phoneIter ).makeCompat(); 595 ( *phoneIter ).makeCompat();
596 } 596 }
597 int hasHome = hasPhoneNumberType( PhoneNumber::Home | PhoneNumber::Pref ); 597 int hasHome = hasPhoneNumberType( PhoneNumber::Home | PhoneNumber::Pref );
598 int hasHome2 = hasPhoneNumberType( PhoneNumber::Home ); 598 int hasHome2 = hasPhoneNumberType( PhoneNumber::Home );
599 int hasWork = hasPhoneNumberType( PhoneNumber::Work | PhoneNumber::Pref ); 599 int hasWork = hasPhoneNumberType( PhoneNumber::Work | PhoneNumber::Pref );
600 int hasWork2 = hasPhoneNumberType( PhoneNumber::Work ); 600 int hasWork2 = hasPhoneNumberType( PhoneNumber::Work );
601 int hasCell = hasPhoneNumberType( PhoneNumber::Cell ); 601 int hasCell = hasPhoneNumberType( PhoneNumber::Cell );
602 int hasCell2 = hasPhoneNumberType( PhoneNumber::Car ); 602 int hasCell2 = hasPhoneNumberType( PhoneNumber::Car );
603 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); 603 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
604 ++phoneIter ) { 604 ++phoneIter ) {
605 if ( (*phoneIter).type() == PhoneNumber::Home && ! hasHome ) { 605 if ( (*phoneIter).type() == PhoneNumber::Home && ! hasHome ) {
606 (*phoneIter).setType( PhoneNumber::Home | PhoneNumber::Pref ); 606 (*phoneIter).setType( PhoneNumber::Home | PhoneNumber::Pref );
607 ++hasHome; 607 ++hasHome;
608 if ( hasHome2 ) --hasHome2; 608 if ( hasHome2 ) --hasHome2;
609 } else if ( ( (*phoneIter).type() == PhoneNumber::Home | PhoneNumber::Pref) && hasHome>1 && !hasHome2 ) { 609 } else if ( ( (*phoneIter).type() == PhoneNumber::Home | PhoneNumber::Pref) && hasHome>1 && !hasHome2 ) {
610 (*phoneIter).setType( PhoneNumber::Home ); 610 (*phoneIter).setType( PhoneNumber::Home );
611 --hasHome; 611 --hasHome;
612 ++hasHome2; 612 ++hasHome2;
613 } else if ( (*phoneIter).type() == PhoneNumber::Work && ! hasWork ) { 613 } else if ( (*phoneIter).type() == PhoneNumber::Work && ! hasWork ) {
614 (*phoneIter).setType( PhoneNumber::Work | PhoneNumber::Pref ); 614 (*phoneIter).setType( PhoneNumber::Work | PhoneNumber::Pref );
615 ++hasWork; 615 ++hasWork;
616 if ( hasWork2 ) --hasWork2; 616 if ( hasWork2 ) --hasWork2;
617 } else if ( ( (*phoneIter).type() == PhoneNumber::Work | PhoneNumber::Pref) && hasWork > 1 && ! hasWork2 ) { 617 } else if ( ( (*phoneIter).type() == PhoneNumber::Work | PhoneNumber::Pref) && hasWork > 1 && ! hasWork2 ) {
618 (*phoneIter).setType( PhoneNumber::Work ); 618 (*phoneIter).setType( PhoneNumber::Work );
619 --hasWork; 619 --hasWork;
620 ++hasWork2; 620 ++hasWork2;
621 } else if ( (*phoneIter).type() == PhoneNumber::Cell && hasCell > 1 && !hasCell2) { 621 } else if ( (*phoneIter).type() == PhoneNumber::Cell && hasCell > 1 && !hasCell2) {
622 (*phoneIter).setType( PhoneNumber::Car ); 622 (*phoneIter).setType( PhoneNumber::Car );
623 ++hasCell2; 623 ++hasCell2;
624 --hasCell; 624 --hasCell;
625 } else if ( (*phoneIter).type() == PhoneNumber::Car && hasCell2 > 1 && !hasCell) { 625 } else if ( (*phoneIter).type() == PhoneNumber::Car && hasCell2 > 1 && !hasCell) {
626 (*phoneIter).setType( PhoneNumber::Cell ); 626 (*phoneIter).setType( PhoneNumber::Cell );
627 ++hasCell; 627 ++hasCell;
628 --hasCell2; 628 --hasCell2;
629 } else{ 629 } else{
630 phoneIter2 = phoneIter; 630 phoneIter2 = phoneIter;
631 ++phoneIter2; 631 ++phoneIter2;
632 for ( ; phoneIter2 != mData->phoneNumbers.end(); 632 for ( ; phoneIter2 != mData->phoneNumbers.end();
633 ++phoneIter2 ) { 633 ++phoneIter2 ) {
634 if ( (*phoneIter2).type() == (*phoneIter).type() ) { 634 if ( (*phoneIter2).type() == (*phoneIter).type() ) {
635 (*phoneIter2).setType( PhoneNumber::Voice ); 635 (*phoneIter2).setType( PhoneNumber::Voice );
636 636
637 } 637 }
638 } 638 }
639 } 639 }
640 } 640 }
641} 641}
642void Addressee::simplifyPhoneNumbers() 642void Addressee::simplifyPhoneNumbers()
643{ 643{
644 int max = 4; 644 int max = 4;
645 int inList = mData->phoneNumbers.count(); 645 int inList = mData->phoneNumbers.count();
646 KABC::PhoneNumber::List removeNumbers; 646 KABC::PhoneNumber::List removeNumbers;
647 KABC::PhoneNumber::List::Iterator phoneIter; 647 KABC::PhoneNumber::List::Iterator phoneIter;
648 if ( inList > max ) { 648 if ( inList > max ) {
649 // delete non-preferred numbers 649 // delete non-preferred numbers
650 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); 650 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
651 ++phoneIter ) { 651 ++phoneIter ) {
652 if ( inList > max ) { 652 if ( inList > max ) {
653 if ( ! (( *phoneIter ).type() & PhoneNumber::Pref )) { 653 if ( ! (( *phoneIter ).type() & PhoneNumber::Pref )) {
654 removeNumbers.append( ( *phoneIter ) ); 654 removeNumbers.append( ( *phoneIter ) );
655 --inList; 655 --inList;
656 } 656 }
657 } else 657 } else
658 break; 658 break;
659 } 659 }
660 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end(); 660 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end();
661 ++phoneIter ) { 661 ++phoneIter ) {
662 removePhoneNumber(( *phoneIter )); 662 removePhoneNumber(( *phoneIter ));
663 } 663 }
664 // delete preferred numbers 664 // delete preferred numbers
665 if ( inList > max ) { 665 if ( inList > max ) {
666 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); 666 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
667 ++phoneIter ) { 667 ++phoneIter ) {
668 if ( inList > max ) { 668 if ( inList > max ) {
669 removeNumbers.append( ( *phoneIter ) ); 669 removeNumbers.append( ( *phoneIter ) );
670 --inList; 670 --inList;
671 } else 671 } else
672 break; 672 break;
673 } 673 }
674 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end(); 674 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end();
675 ++phoneIter ) { 675 ++phoneIter ) {
676 removePhoneNumber(( *phoneIter )); 676 removePhoneNumber(( *phoneIter ));
677 } 677 }
678 } 678 }
679 } 679 }
680 // remove non-numeric characters 680 // remove non-numeric characters
681 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); 681 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
682 ++phoneIter ) { 682 ++phoneIter ) {
683 if ( ! ( *phoneIter ).simplifyNumber() ) 683 if ( ! ( *phoneIter ).simplifyNumber() )
684 removeNumbers.append( ( *phoneIter ) ); 684 removeNumbers.append( ( *phoneIter ) );
685 } 685 }
686 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end(); 686 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end();
687 ++phoneIter ) { 687 ++phoneIter ) {
688 removePhoneNumber(( *phoneIter )); 688 removePhoneNumber(( *phoneIter ));
689 } 689 }
690} 690}
691void Addressee::simplifyPhoneNumberTypes() 691void Addressee::simplifyPhoneNumberTypes()
692{ 692{
693 KABC::PhoneNumber::List::Iterator phoneIter; 693 KABC::PhoneNumber::List::Iterator phoneIter;
694 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); 694 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
695 ++phoneIter ) 695 ++phoneIter )
696 ( *phoneIter ).simplifyType(); 696 ( *phoneIter ).simplifyType();
697} 697}
698void Addressee::removeID(const QString &prof) 698void Addressee::removeID(const QString &prof)
699{ 699{
700 detach(); 700 detach();
701 if ( prof.isEmpty() ) 701 if ( prof.isEmpty() )
702 mData->mExternalId = ":"; 702 mData->mExternalId = ":";
703 else 703 else
704 mData->mExternalId = KIdManager::removeId ( mData->mExternalId, prof); 704 mData->mExternalId = KIdManager::removeId ( mData->mExternalId, prof);
705 705
706} 706}
707void Addressee::setID( const QString & prof , const QString & id ) 707void Addressee::setID( const QString & prof , const QString & id )
708{ 708{
709 detach(); 709 detach();
710 mData->mExternalId = KIdManager::setId ( mData->mExternalId, prof, id ); 710 mData->mExternalId = KIdManager::setId ( mData->mExternalId, prof, id );
711 //qDebug("setID2 %s %s %s",mData->mExternalId.latin1(), prof.latin1(), id.latin1() ); 711 //qDebug("setID2 %s %s %s",mData->mExternalId.latin1(), prof.latin1(), id.latin1() );
712} 712}
713void Addressee::setTempSyncStat( int id ) 713void Addressee::setTempSyncStat( int id )
714{ 714{
715 if ( mData->mTempSyncStat == id ) return; 715 if ( mData->mTempSyncStat == id ) return;
716 detach(); 716 detach();
717 mData->mTempSyncStat = id; 717 mData->mTempSyncStat = id;
718} 718}
719int Addressee::tempSyncStat() const 719int Addressee::tempSyncStat() const
720{ 720{
721 return mData->mTempSyncStat; 721 return mData->mTempSyncStat;
722} 722}
723 723
724const QString Addressee::getID( const QString & prof) const 724const QString Addressee::getID( const QString & prof) const
725{ 725{
726 return KIdManager::getId ( mData->mExternalId, prof ); 726 return KIdManager::getId ( mData->mExternalId, prof );
727} 727}
728 728
729void Addressee::setCsum( const QString & prof , const QString & id ) 729void Addressee::setCsum( const QString & prof , const QString & id )
730{ 730{
731 detach(); 731 detach();
732 //qDebug("setcsum1 %s %s %s",mData->mExternalId.latin1(), prof.latin1(), id.latin1() ); 732 //qDebug("setcsum1 %s %s %s",mData->mExternalId.latin1(), prof.latin1(), id.latin1() );
733 mData->mExternalId = KIdManager::setCsum ( mData->mExternalId, prof, id ); 733 mData->mExternalId = KIdManager::setCsum ( mData->mExternalId, prof, id );
734 //qDebug("setcsum2 %s ",mData->mExternalId.latin1() ); 734 //qDebug("setcsum2 %s ",mData->mExternalId.latin1() );
735} 735}
736 736
737const QString Addressee::getCsum( const QString & prof) const 737const QString Addressee::getCsum( const QString & prof) const
738{ 738{
739 return KIdManager::getCsum ( mData->mExternalId, prof ); 739 return KIdManager::getCsum ( mData->mExternalId, prof );
740} 740}
741 741
742void Addressee::setIDStr( const QString & s ) 742void Addressee::setIDStr( const QString & s )
743{ 743{
744 detach(); 744 detach();
745 mData->mExternalId = s; 745 mData->mExternalId = s;
746} 746}
747 747
748const QString Addressee::IDStr() const 748const QString Addressee::IDStr() const
749{ 749{
750 return mData->mExternalId; 750 return mData->mExternalId;
751} 751}
752 752
753void Addressee::setExternalUID( const QString &id ) 753void Addressee::setExternalUID( const QString &id )
754{ 754{
755 if ( id == mData->externalUID ) return; 755 if ( id == mData->externalUID ) return;
756 detach(); 756 detach();
757 mData->empty = false; 757 mData->empty = false;
758 mData->externalUID = id; 758 mData->externalUID = id;
759} 759}
760 760
761const QString Addressee::externalUID() const 761const QString Addressee::externalUID() const
762{ 762{
763 return mData->externalUID; 763 return mData->externalUID;
764} 764}
765void Addressee::setOriginalExternalUID( const QString &id ) 765void Addressee::setOriginalExternalUID( const QString &id )
766{ 766{
767 if ( id == mData->originalExternalUID ) return; 767 if ( id == mData->originalExternalUID ) return;
768 detach(); 768 detach();
769 mData->empty = false; 769 mData->empty = false;
770 //qDebug("*******Set orig uid %s ", id.latin1()); 770 //qDebug("*******Set orig uid %s ", id.latin1());
771 mData->originalExternalUID = id; 771 mData->originalExternalUID = id;
772} 772}
773 773
774QString Addressee::originalExternalUID() const 774QString Addressee::originalExternalUID() const
775{ 775{
776 return mData->originalExternalUID; 776 return mData->originalExternalUID;
777} 777}
778 778
779void Addressee::setUid( const QString &id ) 779void Addressee::setUid( const QString &id )
780{ 780{
781 if ( id == mData->uid ) return; 781 if ( id == mData->uid ) return;
782 detach(); 782 detach();
783 //qDebug("****setuid %s ", id.latin1()); 783 //qDebug("****setuid %s ", id.latin1());
784 mData->empty = false; 784 mData->empty = false;
785 mData->uid = id; 785 mData->uid = id;
786} 786}
787 787
788const QString Addressee::uid() const 788const QString Addressee::uid() const
789{ 789{
790 if ( mData->uid.isEmpty() ) 790 if ( mData->uid.isEmpty() )
791 mData->uid = KApplication::randomString( 10 ); 791 mData->uid = KApplication::randomString( 10 );
792 792
793 return mData->uid; 793 return mData->uid;
794} 794}
795 795
796QString Addressee::uidLabel() 796QString Addressee::uidLabel()
797{ 797{
798 return i18n("Unique Identifier"); 798 return i18n("Unique Identifier");
799} 799}
800 800
801void Addressee::setName( const QString &name ) 801void Addressee::setName( const QString &name )
802{ 802{
803 if ( name == mData->name ) return; 803 if ( name == mData->name ) return;
804 detach(); 804 detach();
805 mData->empty = false; 805 mData->empty = false;
806 mData->name = name; 806 mData->name = name;
807} 807}
808 808
809QString Addressee::name() const 809QString Addressee::name() const
810{ 810{
811 return mData->name; 811 return mData->name;
812} 812}
813 813
814QString Addressee::nameLabel() 814QString Addressee::nameLabel()
815{ 815{
816 return i18n("Name"); 816 return i18n("Name");
817} 817}
818 818
819 819
820void Addressee::setFormattedName( const QString &formattedName ) 820void Addressee::setFormattedName( const QString &formattedName )
821{ 821{
822 if ( formattedName == mData->formattedName ) return; 822 if ( formattedName == mData->formattedName ) return;
823 detach(); 823 detach();
824 mData->empty = false; 824 mData->empty = false;
825 mData->formattedName = formattedName; 825 mData->formattedName = formattedName;
826} 826}
827 827
828QString Addressee::formattedName() const 828QString Addressee::formattedName() const
829{ 829{
830 return mData->formattedName; 830 return mData->formattedName;
831} 831}
832 832
833QString Addressee::formattedNameLabel() 833QString Addressee::formattedNameLabel()
834{ 834{
835 return i18n("Formatted Name"); 835 return i18n("Formatted Name");
836} 836}
837 837
838 838
839void Addressee::setFamilyName( const QString &familyName ) 839void Addressee::setFamilyName( const QString &familyName )
840{ 840{
841 if ( familyName == mData->familyName ) return; 841 if ( familyName == mData->familyName ) return;
842 detach(); 842 detach();
843 mData->empty = false; 843 mData->empty = false;
844 mData->familyName = familyName; 844 mData->familyName = familyName;
845} 845}
846 846
847QString Addressee::familyName() const 847QString Addressee::familyName() const
848{ 848{
849 return mData->familyName; 849 return mData->familyName;
850} 850}
851 851
852QString Addressee::familyNameLabel() 852QString Addressee::familyNameLabel()
853{ 853{
854 return i18n("Family Name"); 854 return i18n("Family Name");
855} 855}
856 856
857 857
858void Addressee::setGivenName( const QString &givenName ) 858void Addressee::setGivenName( const QString &givenName )
859{ 859{
860 if ( givenName == mData->givenName ) return; 860 if ( givenName == mData->givenName ) return;
861 detach(); 861 detach();
862 mData->empty = false; 862 mData->empty = false;
863 mData->givenName = givenName; 863 mData->givenName = givenName;
864} 864}
865 865
866QString Addressee::givenName() const 866QString Addressee::givenName() const
867{ 867{
868 return mData->givenName; 868 return mData->givenName;
869} 869}
870 870
871QString Addressee::givenNameLabel() 871QString Addressee::givenNameLabel()
872{ 872{
873 return i18n("Given Name"); 873 return i18n("Given Name");
874} 874}
875 875
876 876
877void Addressee::setAdditionalName( const QString &additionalName ) 877void Addressee::setAdditionalName( const QString &additionalName )
878{ 878{
879 if ( additionalName == mData->additionalName ) return; 879 if ( additionalName == mData->additionalName ) return;
880 detach(); 880 detach();
881 mData->empty = false; 881 mData->empty = false;
882 mData->additionalName = additionalName; 882 mData->additionalName = additionalName;
883} 883}
884 884
885QString Addressee::additionalName() const 885QString Addressee::additionalName() const
886{ 886{
887 return mData->additionalName; 887 return mData->additionalName;
888} 888}
889 889
890QString Addressee::additionalNameLabel() 890QString Addressee::additionalNameLabel()
891{ 891{
892 return i18n("Additional Names"); 892 return i18n("Additional Names");
893} 893}
894 894
895 895
896void Addressee::setPrefix( const QString &prefix ) 896void Addressee::setPrefix( const QString &prefix )
897{ 897{
898 if ( prefix == mData->prefix ) return; 898 if ( prefix == mData->prefix ) return;
899 detach(); 899 detach();
900 mData->empty = false; 900 mData->empty = false;
901 mData->prefix = prefix; 901 mData->prefix = prefix;
902} 902}
903 903
904QString Addressee::prefix() const 904QString Addressee::prefix() const
905{ 905{
906 return mData->prefix; 906 return mData->prefix;
907} 907}
908 908
909QString Addressee::prefixLabel() 909QString Addressee::prefixLabel()
910{ 910{
911 return i18n("Honorific Prefixes"); 911 return i18n("Honorific Prefixes");
912} 912}
913 913
914 914
915void Addressee::setSuffix( const QString &suffix ) 915void Addressee::setSuffix( const QString &suffix )
916{ 916{
917 if ( suffix == mData->suffix ) return; 917 if ( suffix == mData->suffix ) return;
918 detach(); 918 detach();
919 mData->empty = false; 919 mData->empty = false;
920 mData->suffix = suffix; 920 mData->suffix = suffix;
921} 921}
922 922
923QString Addressee::suffix() const 923QString Addressee::suffix() const
924{ 924{
925 return mData->suffix; 925 return mData->suffix;
926} 926}
927 927
928QString Addressee::suffixLabel() 928QString Addressee::suffixLabel()
929{ 929{
930 return i18n("Honorific Suffixes"); 930 return i18n("Honorific Suffixes");
931} 931}
932 932
933 933
934void Addressee::setNickName( const QString &nickName ) 934void Addressee::setNickName( const QString &nickName )
935{ 935{
936 if ( nickName == mData->nickName ) return; 936 if ( nickName == mData->nickName ) return;
937 detach(); 937 detach();
938 mData->empty = false; 938 mData->empty = false;
939 mData->nickName = nickName; 939 mData->nickName = nickName;
940} 940}
941 941
942QString Addressee::nickName() const 942QString Addressee::nickName() const
943{ 943{
944 return mData->nickName; 944 return mData->nickName;
945} 945}
946 946
947QString Addressee::nickNameLabel() 947QString Addressee::nickNameLabel()
948{ 948{
949 return i18n("Nick Name"); 949 return i18n("Nick Name");
950} 950}
951 951
952 952
953void Addressee::setBirthday( const QDateTime &birthday ) 953void Addressee::setBirthday( const QDateTime &birthday )
954{ 954{
955 if ( birthday == mData->birthday ) return; 955 if ( birthday == mData->birthday ) return;
956 detach(); 956 detach();
957 mData->empty = false; 957 mData->empty = false;
958 mData->birthday = birthday; 958 mData->birthday = birthday;
959} 959}
960 960
961QDateTime Addressee::birthday() const 961QDateTime Addressee::birthday() const
962{ 962{
963 return mData->birthday; 963 return mData->birthday;
964} 964}
965 965
966QString Addressee::birthdayLabel() 966QString Addressee::birthdayLabel()
967{ 967{
968 return i18n("Birthday"); 968 return i18n("Birthday");
969} 969}
970 970
971 971
972QString Addressee::homeAddressStreetLabel() 972QString Addressee::homeAddressStreetLabel()
973{ 973{
974 return i18n("Home Address Street"); 974 return i18n("Home Address Street");
975} 975}
976 976
977 977
978QString Addressee::homeAddressLocalityLabel() 978QString Addressee::homeAddressLocalityLabel()
979{ 979{
980 return i18n("Home Address Locality"); 980 return i18n("Home Address Locality");
981} 981}
982 982
983 983
984QString Addressee::homeAddressRegionLabel() 984QString Addressee::homeAddressRegionLabel()
985{ 985{
986 return i18n("Home Address Region"); 986 return i18n("Home Address Region");
987} 987}
988 988
989 989
990QString Addressee::homeAddressPostalCodeLabel() 990QString Addressee::homeAddressPostalCodeLabel()
991{ 991{
992 return i18n("Home Address Postal Code"); 992 return i18n("Home Address Postal Code");
993} 993}
994 994
995 995
996QString Addressee::homeAddressCountryLabel() 996QString Addressee::homeAddressCountryLabel()
997{ 997{
998 return i18n("Home Address Country"); 998 return i18n("Home Address Country");
999} 999}
1000 1000
1001 1001
1002QString Addressee::homeAddressLabelLabel() 1002QString Addressee::homeAddressLabelLabel()
1003{ 1003{
1004 return i18n("Home Address Label"); 1004 return i18n("Home Address Label");
1005} 1005}
1006 1006
1007 1007
1008QString Addressee::businessAddressStreetLabel() 1008QString Addressee::businessAddressStreetLabel()
1009{ 1009{
1010 return i18n("Business Address Street"); 1010 return i18n("Business Address Street");
1011} 1011}
1012 1012
1013 1013
1014QString Addressee::businessAddressLocalityLabel() 1014QString Addressee::businessAddressLocalityLabel()
1015{ 1015{
1016 return i18n("Business Address Locality"); 1016 return i18n("Business Address Locality");
1017} 1017}
1018 1018
1019 1019
1020QString Addressee::businessAddressRegionLabel() 1020QString Addressee::businessAddressRegionLabel()
1021{ 1021{
1022 return i18n("Business Address Region"); 1022 return i18n("Business Address Region");
1023} 1023}
1024 1024
1025 1025
1026QString Addressee::businessAddressPostalCodeLabel() 1026QString Addressee::businessAddressPostalCodeLabel()
1027{ 1027{
1028 return i18n("Business Address Postal Code"); 1028 return i18n("Business Address Postal Code");
1029} 1029}
1030 1030
1031 1031
1032QString Addressee::businessAddressCountryLabel() 1032QString Addressee::businessAddressCountryLabel()
1033{ 1033{
1034 return i18n("Business Address Country"); 1034 return i18n("Business Address Country");
1035} 1035}
1036 1036
1037 1037
1038QString Addressee::businessAddressLabelLabel() 1038QString Addressee::businessAddressLabelLabel()
1039{ 1039{
1040 return i18n("Business Address Label"); 1040 return i18n("Business Address Label");
1041} 1041}
1042 1042
1043 1043
1044QString Addressee::homePhoneLabel() 1044QString Addressee::homePhoneLabel()
1045{ 1045{
1046 return i18n("Home Phone"); 1046 return i18n("Home Phone");
1047} 1047}
1048 1048
1049 1049
1050QString Addressee::businessPhoneLabel() 1050QString Addressee::businessPhoneLabel()
1051{ 1051{
1052 return i18n("Work Phone"); 1052 return i18n("Work Phone");
1053} 1053}
1054 1054
1055 1055
1056QString Addressee::mobilePhoneLabel() 1056QString Addressee::mobilePhoneLabel()
1057{ 1057{
1058 return i18n("Mobile Phone"); 1058 return i18n("Mobile Phone");
1059} 1059}
1060QString Addressee::mobileWorkPhoneLabel() 1060QString Addressee::mobileWorkPhoneLabel()
1061{ 1061{
1062 return i18n("Mobile2 (work)"); 1062 return i18n("Mobile2 (Work)");
1063} 1063}
1064QString Addressee::mobileHomePhoneLabel() 1064QString Addressee::mobileHomePhoneLabel()
1065{ 1065{
1066 return i18n("Mobile (Home)"); 1066 return i18n("Mobile (Home)");
1067} 1067}
1068 1068
1069 1069
1070QString Addressee::homeFaxLabel() 1070QString Addressee::homeFaxLabel()
1071{ 1071{
1072 return i18n("Fax (Home)"); 1072 return i18n("Fax (Home)");
1073} 1073}
1074 1074
1075 1075
1076QString Addressee::businessFaxLabel() 1076QString Addressee::businessFaxLabel()
1077{ 1077{
1078 return i18n("Fax (Work)"); 1078 return i18n("Fax (Work)");
1079} 1079}
1080 1080
1081 1081
1082QString Addressee::carPhoneLabel() 1082QString Addressee::carPhoneLabel()
1083{ 1083{
1084 return i18n("Mobile2 (car)"); 1084 return i18n("Mobile2 (Car)");
1085} 1085}
1086 1086
1087 1087
1088QString Addressee::isdnLabel() 1088QString Addressee::isdnLabel()
1089{ 1089{
1090 return i18n("ISDN"); 1090 return i18n("ISDN");
1091} 1091}
1092 1092
1093 1093
1094QString Addressee::pagerLabel() 1094QString Addressee::pagerLabel()
1095{ 1095{
1096 return i18n("Pager"); 1096 return i18n("Pager");
1097} 1097}
1098 1098
1099QString Addressee::sipLabel() 1099QString Addressee::sipLabel()
1100{ 1100{
1101 return i18n("SIP"); 1101 return i18n("SIP");
1102} 1102}
1103 1103
1104QString Addressee::emailLabel() 1104QString Addressee::emailLabel()
1105{ 1105{
1106 return i18n("Email Address"); 1106 return i18n("Email Address");
1107} 1107}
1108 1108
1109 1109
1110void Addressee::setMailer( const QString &mailer ) 1110void Addressee::setMailer( const QString &mailer )
1111{ 1111{
1112 if ( mailer == mData->mailer ) return; 1112 if ( mailer == mData->mailer ) return;
1113 detach(); 1113 detach();
1114 mData->empty = false; 1114 mData->empty = false;
1115 mData->mailer = mailer; 1115 mData->mailer = mailer;
1116} 1116}
1117 1117
1118QString Addressee::mailer() const 1118QString Addressee::mailer() const
1119{ 1119{
1120 return mData->mailer; 1120 return mData->mailer;
1121} 1121}
1122 1122
1123QString Addressee::mailerLabel() 1123QString Addressee::mailerLabel()
1124{ 1124{
1125 return i18n("Mail Client"); 1125 return i18n("Mail Client");
1126} 1126}
1127 1127
1128 1128
1129void Addressee::setTimeZone( const TimeZone &timeZone ) 1129void Addressee::setTimeZone( const TimeZone &timeZone )
1130{ 1130{
1131 if ( timeZone == mData->timeZone ) return; 1131 if ( timeZone == mData->timeZone ) return;
1132 detach(); 1132 detach();
1133 mData->empty = false; 1133 mData->empty = false;
1134 mData->timeZone = timeZone; 1134 mData->timeZone = timeZone;
1135} 1135}
1136 1136
1137TimeZone Addressee::timeZone() const 1137TimeZone Addressee::timeZone() const
1138{ 1138{
1139 return mData->timeZone; 1139 return mData->timeZone;
1140} 1140}
1141 1141
1142QString Addressee::timeZoneLabel() 1142QString Addressee::timeZoneLabel()
1143{ 1143{
1144 return i18n("Time Zone"); 1144 return i18n("Time Zone");
1145} 1145}
1146 1146
1147 1147
1148void Addressee::setGeo( const Geo &geo ) 1148void Addressee::setGeo( const Geo &geo )
1149{ 1149{
1150 if ( geo == mData->geo ) return; 1150 if ( geo == mData->geo ) return;
1151 detach(); 1151 detach();
1152 mData->empty = false; 1152 mData->empty = false;
1153 mData->geo = geo; 1153 mData->geo = geo;
1154} 1154}
1155 1155
1156Geo Addressee::geo() const 1156Geo Addressee::geo() const
1157{ 1157{
1158 return mData->geo; 1158 return mData->geo;
1159} 1159}
1160 1160
1161QString Addressee::geoLabel() 1161QString Addressee::geoLabel()
1162{ 1162{
1163 return i18n("Geographic Position"); 1163 return i18n("Geographic Position");
1164} 1164}
1165 1165
1166 1166
1167void Addressee::setTitle( const QString &title ) 1167void Addressee::setTitle( const QString &title )
1168{ 1168{
1169 if ( title == mData->title ) return; 1169 if ( title == mData->title ) return;
1170 detach(); 1170 detach();
1171 mData->empty = false; 1171 mData->empty = false;
1172 mData->title = title; 1172 mData->title = title;
1173} 1173}
1174 1174
1175QString Addressee::title() const 1175QString Addressee::title() const
1176{ 1176{
1177 return mData->title; 1177 return mData->title;
1178} 1178}
1179 1179
1180QString Addressee::titleLabel() 1180QString Addressee::titleLabel()
1181{ 1181{
1182 return i18n("Title"); 1182 return i18n("Title");
1183} 1183}
1184 1184
1185 1185
1186void Addressee::setRole( const QString &role ) 1186void Addressee::setRole( const QString &role )
1187{ 1187{
1188 if ( role == mData->role ) return; 1188 if ( role == mData->role ) return;
1189 detach(); 1189 detach();
1190 mData->empty = false; 1190 mData->empty = false;
1191 mData->role = role; 1191 mData->role = role;
1192} 1192}
1193 1193
1194QString Addressee::role() const 1194QString Addressee::role() const
1195{ 1195{
1196 return mData->role; 1196 return mData->role;
1197} 1197}
1198 1198
1199QString Addressee::roleLabel() 1199QString Addressee::roleLabel()
1200{ 1200{
1201 return i18n("Role"); 1201 return i18n("Role");
1202} 1202}
1203 1203
1204 1204
1205void Addressee::setOrganization( const QString &organization ) 1205void Addressee::setOrganization( const QString &organization )
1206{ 1206{
1207 if ( organization == mData->organization ) return; 1207 if ( organization == mData->organization ) return;
1208 detach(); 1208 detach();
1209 mData->empty = false; 1209 mData->empty = false;
1210 mData->organization = organization; 1210 mData->organization = organization;
1211} 1211}
1212 1212
1213QString Addressee::organization() const 1213QString Addressee::organization() const
1214{ 1214{
1215 return mData->organization; 1215 return mData->organization;
1216} 1216}
1217 1217
1218QString Addressee::organizationLabel() 1218QString Addressee::organizationLabel()
1219{ 1219{
1220 return i18n("Organization"); 1220 return i18n("Organization");
1221} 1221}
1222 1222
1223 1223
1224void Addressee::setNote( const QString &note ) 1224void Addressee::setNote( const QString &note )
1225{ 1225{
1226 if ( note == mData->note ) return; 1226 if ( note == mData->note ) return;
1227 detach(); 1227 detach();
1228 mData->empty = false; 1228 mData->empty = false;
1229 mData->note = note; 1229 mData->note = note;
1230} 1230}
1231 1231
1232QString Addressee::note() const 1232QString Addressee::note() const
1233{ 1233{
1234 return mData->note; 1234 return mData->note;
1235} 1235}
1236 1236
1237QString Addressee::noteLabel() 1237QString Addressee::noteLabel()
1238{ 1238{
1239 return i18n("Note"); 1239 return i18n("Note");
1240} 1240}
1241 1241
1242 1242
1243void Addressee::setProductId( const QString &productId ) 1243void Addressee::setProductId( const QString &productId )
1244{ 1244{
1245 if ( productId == mData->productId ) return; 1245 if ( productId == mData->productId ) return;
1246 detach(); 1246 detach();
1247 mData->empty = false; 1247 mData->empty = false;
1248 mData->productId = productId; 1248 mData->productId = productId;
1249} 1249}
1250 1250
1251QString Addressee::productId() const 1251QString Addressee::productId() const
1252{ 1252{
1253 return mData->productId; 1253 return mData->productId;
1254} 1254}
1255 1255
1256QString Addressee::productIdLabel() 1256QString Addressee::productIdLabel()
1257{ 1257{
1258 return i18n("Product Identifier"); 1258 return i18n("Product Identifier");
1259} 1259}
1260 1260
1261 1261
1262void Addressee::setRevision( const QDateTime &revision ) 1262void Addressee::setRevision( const QDateTime &revision )
1263{ 1263{
1264 if ( revision == mData->revision ) return; 1264 if ( revision == mData->revision ) return;
1265 detach(); 1265 detach();
1266 mData->empty = false; 1266 mData->empty = false;
1267 mData->revision = QDateTime( revision.date(), 1267 mData->revision = QDateTime( revision.date(),
1268 QTime (revision.time().hour(), 1268 QTime (revision.time().hour(),
1269 revision.time().minute(), 1269 revision.time().minute(),
1270 revision.time().second())); 1270 revision.time().second()));
1271} 1271}
1272 1272
1273QDateTime Addressee::revision() const 1273QDateTime Addressee::revision() const
1274{ 1274{
1275 return mData->revision; 1275 return mData->revision;
1276} 1276}
1277 1277
1278QString Addressee::revisionLabel() 1278QString Addressee::revisionLabel()
1279{ 1279{
1280 return i18n("Revision Date"); 1280 return i18n("Revision Date");
1281} 1281}
1282 1282
1283 1283
1284void Addressee::setSortString( const QString &sortString ) 1284void Addressee::setSortString( const QString &sortString )
1285{ 1285{
1286 if ( sortString == mData->sortString ) return; 1286 if ( sortString == mData->sortString ) return;
1287 detach(); 1287 detach();
1288 mData->empty = false; 1288 mData->empty = false;
1289 mData->sortString = sortString; 1289 mData->sortString = sortString;
1290} 1290}
1291 1291
1292QString Addressee::sortString() const 1292QString Addressee::sortString() const
1293{ 1293{
1294 return mData->sortString; 1294 return mData->sortString;
1295} 1295}
1296 1296
1297QString Addressee::sortStringLabel() 1297QString Addressee::sortStringLabel()
1298{ 1298{
1299 return i18n("Sort String"); 1299 return i18n("Sort String");
1300} 1300}
1301 1301
1302 1302
1303void Addressee::setUrl( const KURL &url ) 1303void Addressee::setUrl( const KURL &url )
1304{ 1304{
1305 if ( url == mData->url ) return; 1305 if ( url == mData->url ) return;
1306 detach(); 1306 detach();
1307 mData->empty = false; 1307 mData->empty = false;
1308 mData->url = url; 1308 mData->url = url;
1309} 1309}
1310 1310
1311KURL Addressee::url() const 1311KURL Addressee::url() const
1312{ 1312{
1313 return mData->url; 1313 return mData->url;
1314} 1314}
1315 1315
1316QString Addressee::urlLabel() 1316QString Addressee::urlLabel()
1317{ 1317{
1318 return i18n("URL"); 1318 return i18n("URL");
1319} 1319}
1320 1320
1321 1321
1322void Addressee::setSecrecy( const Secrecy &secrecy ) 1322void Addressee::setSecrecy( const Secrecy &secrecy )
1323{ 1323{
1324 if ( secrecy == mData->secrecy ) return; 1324 if ( secrecy == mData->secrecy ) return;
1325 detach(); 1325 detach();
1326 mData->empty = false; 1326 mData->empty = false;
1327 mData->secrecy = secrecy; 1327 mData->secrecy = secrecy;
1328} 1328}
1329 1329
1330Secrecy Addressee::secrecy() const 1330Secrecy Addressee::secrecy() const
1331{ 1331{
1332 return mData->secrecy; 1332 return mData->secrecy;
1333} 1333}
1334 1334
1335QString Addressee::secrecyLabel() 1335QString Addressee::secrecyLabel()
1336{ 1336{
1337 return i18n("Security Class"); 1337 return i18n("Security Class");
1338} 1338}
1339 1339
1340 1340
1341void Addressee::setLogo( const Picture &logo ) 1341void Addressee::setLogo( const Picture &logo )
1342{ 1342{
1343 if ( logo == mData->logo ) return; 1343 if ( logo == mData->logo ) return;
1344 detach(); 1344 detach();
1345 mData->empty = false; 1345 mData->empty = false;
1346 mData->logo = logo; 1346 mData->logo = logo;
1347} 1347}
1348 1348
1349Picture Addressee::logo() const 1349Picture Addressee::logo() const
1350{ 1350{
1351 return mData->logo; 1351 return mData->logo;
1352} 1352}
1353 1353
1354QString Addressee::logoLabel() 1354QString Addressee::logoLabel()
1355{ 1355{
1356 return i18n("Logo"); 1356 return i18n("Logo");
1357} 1357}
1358 1358
1359 1359
1360void Addressee::setPhoto( const Picture &photo ) 1360void Addressee::setPhoto( const Picture &photo )
1361{ 1361{
1362 if ( photo == mData->photo ) return; 1362 if ( photo == mData->photo ) return;
1363 detach(); 1363 detach();
1364 mData->empty = false; 1364 mData->empty = false;
1365 mData->photo = photo; 1365 mData->photo = photo;
1366} 1366}
1367 1367
1368Picture Addressee::photo() const 1368Picture Addressee::photo() const
1369{ 1369{
1370 return mData->photo; 1370 return mData->photo;
1371} 1371}
1372 1372
1373QString Addressee::photoLabel() 1373QString Addressee::photoLabel()
1374{ 1374{
1375 return i18n("Photo"); 1375 return i18n("Photo");
1376} 1376}
1377 1377
1378 1378
1379void Addressee::setSound( const Sound &sound ) 1379void Addressee::setSound( const Sound &sound )
1380{ 1380{
1381 if ( sound == mData->sound ) return; 1381 if ( sound == mData->sound ) return;
1382 detach(); 1382 detach();
1383 mData->empty = false; 1383 mData->empty = false;
1384 mData->sound = sound; 1384 mData->sound = sound;
1385} 1385}
1386 1386
1387Sound Addressee::sound() const 1387Sound Addressee::sound() const
1388{ 1388{
1389 return mData->sound; 1389 return mData->sound;
1390} 1390}
1391 1391
1392QString Addressee::soundLabel() 1392QString Addressee::soundLabel()
1393{ 1393{
1394 return i18n("Sound"); 1394 return i18n("Sound");
1395} 1395}
1396 1396
1397 1397
1398void Addressee::setAgent( const Agent &agent ) 1398void Addressee::setAgent( const Agent &agent )
1399{ 1399{
1400 if ( agent == mData->agent ) return; 1400 if ( agent == mData->agent ) return;
1401 detach(); 1401 detach();
1402 mData->empty = false; 1402 mData->empty = false;
1403 mData->agent = agent; 1403 mData->agent = agent;
1404} 1404}
1405 1405
1406Agent Addressee::agent() const 1406Agent Addressee::agent() const
1407{ 1407{
1408 return mData->agent; 1408 return mData->agent;
1409} 1409}
1410 1410
1411QString Addressee::agentLabel() 1411QString Addressee::agentLabel()
1412{ 1412{
1413 return i18n("Agent"); 1413 return i18n("Agent");
1414} 1414}
1415 1415
1416 1416
1417 1417
1418void Addressee::setNameFromString( const QString &str ) 1418void Addressee::setNameFromString( const QString &str )
1419{ 1419{
1420 setFormattedName( str ); 1420 setFormattedName( str );
1421 setName( str ); 1421 setName( str );
1422 1422
1423 static bool first = true; 1423 static bool first = true;
1424 static QStringList titles; 1424 static QStringList titles;
1425 static QStringList suffixes; 1425 static QStringList suffixes;
1426 static QStringList prefixes; 1426 static QStringList prefixes;
1427 1427
1428 if ( first ) { 1428 if ( first ) {
1429 first = false; 1429 first = false;
1430 titles += i18n( "Dr." ); 1430 titles += i18n( "Dr." );
1431 titles += i18n( "Miss" ); 1431 titles += i18n( "Miss" );
1432 titles += i18n( "Mr." ); 1432 titles += i18n( "Mr." );
1433 titles += i18n( "Mrs." ); 1433 titles += i18n( "Mrs." );
1434 titles += i18n( "Ms." ); 1434 titles += i18n( "Ms." );
1435 titles += i18n( "Prof." ); 1435 titles += i18n( "Prof." );
1436 1436
1437 suffixes += i18n( "I" ); 1437 suffixes += i18n( "I" );
1438 suffixes += i18n( "II" ); 1438 suffixes += i18n( "II" );
1439 suffixes += i18n( "III" ); 1439 suffixes += i18n( "III" );
1440 suffixes += i18n( "Jr." ); 1440 suffixes += i18n( "Jr." );
1441 suffixes += i18n( "Sr." ); 1441 suffixes += i18n( "Sr." );
1442 1442
1443 prefixes += "van"; 1443 prefixes += "van";
1444 prefixes += "von"; 1444 prefixes += "von";
1445 prefixes += "de"; 1445 prefixes += "de";
1446 1446
1447 KConfig config( locateLocal( "config", "kabcrc") ); 1447 KConfig config( locateLocal( "config", "kabcrc") );
1448 config.setGroup( "General" ); 1448 config.setGroup( "General" );
1449 titles += config.readListEntry( "Prefixes" ); 1449 titles += config.readListEntry( "Prefixes" );
1450 titles.remove( "" ); 1450 titles.remove( "" );
1451 prefixes += config.readListEntry( "Inclusions" ); 1451 prefixes += config.readListEntry( "Inclusions" );
1452 prefixes.remove( "" ); 1452 prefixes.remove( "" );
1453 suffixes += config.readListEntry( "Suffixes" ); 1453 suffixes += config.readListEntry( "Suffixes" );
1454 suffixes.remove( "" ); 1454 suffixes.remove( "" );
1455 } 1455 }
1456 1456
1457 // clear all name parts 1457 // clear all name parts
1458 setPrefix( "" ); 1458 setPrefix( "" );
1459 setGivenName( "" ); 1459 setGivenName( "" );
1460 setAdditionalName( "" ); 1460 setAdditionalName( "" );
1461 setFamilyName( "" ); 1461 setFamilyName( "" );
1462 setSuffix( "" ); 1462 setSuffix( "" );
1463 1463
1464 if ( str.isEmpty() ) 1464 if ( str.isEmpty() )
1465 return; 1465 return;
1466 1466
1467 int i = str.find(','); 1467 int i = str.find(',');
1468 if( i < 0 ) { 1468 if( i < 0 ) {
1469 QStringList parts = QStringList::split( " ", str ); 1469 QStringList parts = QStringList::split( " ", str );
1470 int leftOffset = 0; 1470 int leftOffset = 0;
1471 int rightOffset = parts.count() - 1; 1471 int rightOffset = parts.count() - 1;
1472 1472
1473 QString suffix; 1473 QString suffix;
1474 while ( rightOffset >= 0 ) { 1474 while ( rightOffset >= 0 ) {
1475 if ( suffixes.contains( parts[ rightOffset ] ) ) { 1475 if ( suffixes.contains( parts[ rightOffset ] ) ) {
1476 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " ")); 1476 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " "));
1477 rightOffset--; 1477 rightOffset--;
1478 } else 1478 } else
1479 break; 1479 break;
1480 } 1480 }
1481 setSuffix( suffix ); 1481 setSuffix( suffix );
1482 1482
1483 if ( rightOffset < 0 ) 1483 if ( rightOffset < 0 )
1484 return; 1484 return;
1485 1485
1486 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) { 1486 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) {
1487 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] ); 1487 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] );
1488 rightOffset--; 1488 rightOffset--;
1489 } else 1489 } else
1490 setFamilyName( parts[ rightOffset ] ); 1490 setFamilyName( parts[ rightOffset ] );
1491 1491
1492 QString prefix; 1492 QString prefix;
1493 while ( leftOffset < rightOffset ) { 1493 while ( leftOffset < rightOffset ) {
1494 if ( titles.contains( parts[ leftOffset ] ) ) { 1494 if ( titles.contains( parts[ leftOffset ] ) ) {
1495 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1495 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1496 leftOffset++; 1496 leftOffset++;
1497 } else 1497 } else
1498 break; 1498 break;
1499 } 1499 }
1500 setPrefix( prefix ); 1500 setPrefix( prefix );
1501 1501
1502 if ( leftOffset < rightOffset ) { 1502 if ( leftOffset < rightOffset ) {
1503 setGivenName( parts[ leftOffset ] ); 1503 setGivenName( parts[ leftOffset ] );
1504 leftOffset++; 1504 leftOffset++;
1505 } 1505 }
1506 1506
1507 QString additionalName; 1507 QString additionalName;
1508 while ( leftOffset < rightOffset ) { 1508 while ( leftOffset < rightOffset ) {
1509 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1509 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1510 leftOffset++; 1510 leftOffset++;
1511 } 1511 }
1512 setAdditionalName( additionalName ); 1512 setAdditionalName( additionalName );
1513 } else { 1513 } else {
1514 QString part1 = str.left( i ); 1514 QString part1 = str.left( i );
1515 QString part2 = str.mid( i + 1 ); 1515 QString part2 = str.mid( i + 1 );
1516 1516
1517 QStringList parts = QStringList::split( " ", part1 ); 1517 QStringList parts = QStringList::split( " ", part1 );
1518 int leftOffset = 0; 1518 int leftOffset = 0;
1519 int rightOffset = parts.count() - 1; 1519 int rightOffset = parts.count() - 1;
1520 1520
1521 QString suffix; 1521 QString suffix;
1522 while ( rightOffset >= 0 ) { 1522 while ( rightOffset >= 0 ) {
1523 if ( suffixes.contains( parts[ rightOffset ] ) ) { 1523 if ( suffixes.contains( parts[ rightOffset ] ) ) {
1524 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " ")); 1524 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " "));
1525 rightOffset--; 1525 rightOffset--;
1526 } else 1526 } else
1527 break; 1527 break;
1528 } 1528 }
1529 setSuffix( suffix ); 1529 setSuffix( suffix );
1530 1530
1531 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) { 1531 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) {
1532 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] ); 1532 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] );
1533 rightOffset--; 1533 rightOffset--;
1534 } else 1534 } else
1535 setFamilyName( parts[ rightOffset ] ); 1535 setFamilyName( parts[ rightOffset ] );
1536 1536
1537 QString prefix; 1537 QString prefix;
1538 while ( leftOffset < rightOffset ) { 1538 while ( leftOffset < rightOffset ) {
1539 if ( titles.contains( parts[ leftOffset ] ) ) { 1539 if ( titles.contains( parts[ leftOffset ] ) ) {
1540 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1540 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1541 leftOffset++; 1541 leftOffset++;
1542 } else 1542 } else
1543 break; 1543 break;
1544 } 1544 }
1545 1545
1546 parts = QStringList::split( " ", part2 ); 1546 parts = QStringList::split( " ", part2 );
1547 1547
1548 leftOffset = 0; 1548 leftOffset = 0;
1549 rightOffset = parts.count(); 1549 rightOffset = parts.count();
1550 1550
1551 while ( leftOffset < rightOffset ) { 1551 while ( leftOffset < rightOffset ) {
1552 if ( titles.contains( parts[ leftOffset ] ) ) { 1552 if ( titles.contains( parts[ leftOffset ] ) ) {
1553 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1553 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1554 leftOffset++; 1554 leftOffset++;
1555 } else 1555 } else
1556 break; 1556 break;
1557 } 1557 }
1558 setPrefix( prefix ); 1558 setPrefix( prefix );
1559 1559
1560 if ( leftOffset < rightOffset ) { 1560 if ( leftOffset < rightOffset ) {
1561 setGivenName( parts[ leftOffset ] ); 1561 setGivenName( parts[ leftOffset ] );
1562 leftOffset++; 1562 leftOffset++;
1563 } 1563 }
1564 1564
1565 QString additionalName; 1565 QString additionalName;
1566 while ( leftOffset < rightOffset ) { 1566 while ( leftOffset < rightOffset ) {
1567 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1567 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1568 leftOffset++; 1568 leftOffset++;
1569 } 1569 }
1570 setAdditionalName( additionalName ); 1570 setAdditionalName( additionalName );
1571 } 1571 }
1572} 1572}
1573 1573
1574QString Addressee::realName() const 1574QString Addressee::realName() const
1575{ 1575{
1576 if ( !formattedName().isEmpty() ) 1576 if ( !formattedName().isEmpty() )
1577 return formattedName(); 1577 return formattedName();
1578 1578
1579 QString n = assembledName(); 1579 QString n = assembledName();
1580 1580
1581 if ( n.isEmpty() ) 1581 if ( n.isEmpty() )
1582 n = name(); 1582 n = name();
1583 if ( n.isEmpty() ) 1583 if ( n.isEmpty() )
1584 n = organization(); 1584 n = organization();
1585 return n; 1585 return n;
1586} 1586}
1587 1587
1588QString Addressee::assembledName() const 1588QString Addressee::assembledName() const
1589{ 1589{
1590 QString name = prefix() + " " + givenName() + " " + additionalName() + " " + 1590 QString name = prefix() + " " + givenName() + " " + additionalName() + " " +
1591 familyName() + " " + suffix(); 1591 familyName() + " " + suffix();
1592 1592
1593 return name.simplifyWhiteSpace(); 1593 return name.simplifyWhiteSpace();
1594} 1594}
1595 1595
1596QString Addressee::fullEmail( const QString &email ) const 1596QString Addressee::fullEmail( const QString &email ) const
1597{ 1597{
1598 QString e; 1598 QString e;
1599 if ( email.isNull() ) { 1599 if ( email.isNull() ) {
1600 e = preferredEmail(); 1600 e = preferredEmail();
1601 } else { 1601 } else {
1602 e = email; 1602 e = email;
1603 } 1603 }
1604 if ( e.isEmpty() ) return QString::null; 1604 if ( e.isEmpty() ) return QString::null;
1605 1605
1606 QString text; 1606 QString text;
1607 if ( realName().isEmpty() ) 1607 if ( realName().isEmpty() )
1608 text = e; 1608 text = e;
1609 else 1609 else
1610 text = assembledName() + " <" + e + ">"; 1610 text = assembledName() + " <" + e + ">";
1611 1611
1612 return text; 1612 return text;
1613} 1613}
1614 1614
1615void Addressee::insertEmail( const QString &email, bool preferred ) 1615void Addressee::insertEmail( const QString &email, bool preferred )
1616{ 1616{
1617 detach(); 1617 detach();
1618 1618
1619 QStringList::Iterator it = mData->emails.find( email ); 1619 QStringList::Iterator it = mData->emails.find( email );
1620 1620
1621 if ( it != mData->emails.end() ) { 1621 if ( it != mData->emails.end() ) {
1622 if ( !preferred || it == mData->emails.begin() ) return; 1622 if ( !preferred || it == mData->emails.begin() ) return;
1623 mData->emails.remove( it ); 1623 mData->emails.remove( it );
1624 mData->emails.prepend( email ); 1624 mData->emails.prepend( email );
1625 } else { 1625 } else {
1626 if ( preferred ) { 1626 if ( preferred ) {
1627 mData->emails.prepend( email ); 1627 mData->emails.prepend( email );
1628 } else { 1628 } else {
1629 mData->emails.append( email ); 1629 mData->emails.append( email );
1630 } 1630 }
1631 } 1631 }
1632} 1632}
1633 1633
1634void Addressee::removeEmail( const QString &email ) 1634void Addressee::removeEmail( const QString &email )
1635{ 1635{
1636 detach(); 1636 detach();
1637 1637
1638 QStringList::Iterator it = mData->emails.find( email ); 1638 QStringList::Iterator it = mData->emails.find( email );
1639 if ( it == mData->emails.end() ) return; 1639 if ( it == mData->emails.end() ) return;
1640 1640
1641 mData->emails.remove( it ); 1641 mData->emails.remove( it );
1642} 1642}
1643 1643
1644QString Addressee::preferredEmail() const 1644QString Addressee::preferredEmail() const
1645{ 1645{
1646 if ( mData->emails.count() == 0 ) return QString::null; 1646 if ( mData->emails.count() == 0 ) return QString::null;
1647 else return mData->emails.first(); 1647 else return mData->emails.first();
1648} 1648}
1649 1649
1650QStringList Addressee::emails() const 1650QStringList Addressee::emails() const
1651{ 1651{
1652 return mData->emails; 1652 return mData->emails;
1653} 1653}
1654void Addressee::setEmails( const QStringList& emails ) { 1654void Addressee::setEmails( const QStringList& emails ) {
1655 detach(); 1655 detach();
1656 mData->emails = emails; 1656 mData->emails = emails;
1657} 1657}
1658void Addressee::insertPhoneNumber( const PhoneNumber &phoneNumber ) 1658void Addressee::insertPhoneNumber( const PhoneNumber &phoneNumber )
1659{ 1659{
1660 detach(); 1660 detach();
1661 mData->empty = false; 1661 mData->empty = false;
1662 1662
1663 PhoneNumber::List::Iterator it; 1663 PhoneNumber::List::Iterator it;
1664 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1664 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1665 if ( (*it).id() == phoneNumber.id() ) { 1665 if ( (*it).id() == phoneNumber.id() ) {
1666 *it = phoneNumber; 1666 *it = phoneNumber;
1667 return; 1667 return;
1668 } 1668 }
1669 } 1669 }
1670 mData->phoneNumbers.append( phoneNumber ); 1670 mData->phoneNumbers.append( phoneNumber );
1671} 1671}
1672 1672
1673void Addressee::removePhoneNumber( const PhoneNumber &phoneNumber ) 1673void Addressee::removePhoneNumber( const PhoneNumber &phoneNumber )
1674{ 1674{
1675 detach(); 1675 detach();
1676 1676
1677 PhoneNumber::List::Iterator it; 1677 PhoneNumber::List::Iterator it;
1678 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1678 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1679 if ( (*it).id() == phoneNumber.id() ) { 1679 if ( (*it).id() == phoneNumber.id() ) {
1680 mData->phoneNumbers.remove( it ); 1680 mData->phoneNumbers.remove( it );
1681 return; 1681 return;
1682 } 1682 }
1683 } 1683 }
1684} 1684}
1685 1685
1686PhoneNumber Addressee::phoneNumber( int type ) const 1686PhoneNumber Addressee::phoneNumber( int type ) const
1687{ 1687{
1688 PhoneNumber phoneNumber( "", type ); 1688 PhoneNumber phoneNumber( "", type );
1689 PhoneNumber::List::ConstIterator it; 1689 PhoneNumber::List::ConstIterator it;
1690 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1690 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1691 if ( matchBinaryPatternP( (*it).type(), type ) ) { 1691 if ( matchBinaryPatternP( (*it).type(), type ) ) {
1692 if ( (*it).type() & PhoneNumber::Pref ) 1692 if ( (*it).type() & PhoneNumber::Pref )
1693 return (*it); 1693 return (*it);
1694 else if ( phoneNumber.number().isEmpty() ) 1694 else if ( phoneNumber.number().isEmpty() )
1695 phoneNumber = (*it); 1695 phoneNumber = (*it);
1696 } 1696 }
1697 } 1697 }
1698 1698
1699 return phoneNumber; 1699 return phoneNumber;
1700} 1700}
1701 1701
1702PhoneNumber::List Addressee::phoneNumbers() const 1702PhoneNumber::List Addressee::phoneNumbers() const
1703{ 1703{
1704 return mData->phoneNumbers; 1704 return mData->phoneNumbers;
1705} 1705}
1706 1706
1707int Addressee::hasPhoneNumberType( int type ) 1707int Addressee::hasPhoneNumberType( int type )
1708{ 1708{
1709 int retval = 0; 1709 int retval = 0;
1710 PhoneNumber::List::ConstIterator it; 1710 PhoneNumber::List::ConstIterator it;
1711 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1711 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1712 if ( (*it).type() == type ) 1712 if ( (*it).type() == type )
1713 ++retval; 1713 ++retval;
1714 } 1714 }
1715 return retval; 1715 return retval;
1716} 1716}
1717PhoneNumber::List Addressee::phoneNumbers( int type ) const 1717PhoneNumber::List Addressee::phoneNumbers( int type ) const
1718{ 1718{
1719 PhoneNumber::List list; 1719 PhoneNumber::List list;
1720 1720
1721 PhoneNumber::List::ConstIterator it; 1721 PhoneNumber::List::ConstIterator it;
1722 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1722 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1723 if ( matchBinaryPattern( (*it).type(), type ) ) { 1723 if ( matchBinaryPattern( (*it).type(), type ) ) {
1724 list.append( *it ); 1724 list.append( *it );
1725 } 1725 }
1726 } 1726 }
1727 return list; 1727 return list;
1728} 1728}
1729 1729
1730PhoneNumber Addressee::findPhoneNumber( const QString &id ) const 1730PhoneNumber Addressee::findPhoneNumber( const QString &id ) const
1731{ 1731{
1732 PhoneNumber::List::ConstIterator it; 1732 PhoneNumber::List::ConstIterator it;
1733 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1733 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1734 if ( (*it).id() == id ) { 1734 if ( (*it).id() == id ) {
1735 return *it; 1735 return *it;
1736 } 1736 }
1737 } 1737 }
1738 return PhoneNumber(); 1738 return PhoneNumber();
1739} 1739}
1740 1740
1741void Addressee::insertKey( const Key &key ) 1741void Addressee::insertKey( const Key &key )
1742{ 1742{
1743 detach(); 1743 detach();
1744 mData->empty = false; 1744 mData->empty = false;
1745 1745
1746 Key::List::Iterator it; 1746 Key::List::Iterator it;
1747 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1747 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1748 if ( (*it).id() == key.id() ) { 1748 if ( (*it).id() == key.id() ) {
1749 *it = key; 1749 *it = key;
1750 return; 1750 return;
1751 } 1751 }
1752 } 1752 }
1753 mData->keys.append( key ); 1753 mData->keys.append( key );
1754} 1754}
1755 1755
1756void Addressee::removeKey( const Key &key ) 1756void Addressee::removeKey( const Key &key )
1757{ 1757{
1758 detach(); 1758 detach();
1759 1759
1760 Key::List::Iterator it; 1760 Key::List::Iterator it;
1761 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1761 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1762 if ( (*it).id() == key.id() ) { 1762 if ( (*it).id() == key.id() ) {
1763 mData->keys.remove( key ); 1763 mData->keys.remove( key );
1764 return; 1764 return;
1765 } 1765 }
1766 } 1766 }
1767} 1767}
1768 1768
1769Key Addressee::key( int type, QString customTypeString ) const 1769Key Addressee::key( int type, QString customTypeString ) const
1770{ 1770{
1771 Key::List::ConstIterator it; 1771 Key::List::ConstIterator it;
1772 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1772 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1773 if ( (*it).type() == type ) { 1773 if ( (*it).type() == type ) {
1774 if ( type == Key::Custom ) { 1774 if ( type == Key::Custom ) {
1775 if ( customTypeString.isEmpty() ) { 1775 if ( customTypeString.isEmpty() ) {
1776 return *it; 1776 return *it;
1777 } else { 1777 } else {
1778 if ( (*it).customTypeString() == customTypeString ) 1778 if ( (*it).customTypeString() == customTypeString )
1779 return (*it); 1779 return (*it);
1780 } 1780 }
1781 } else { 1781 } else {
1782 return *it; 1782 return *it;
1783 } 1783 }
1784 } 1784 }
1785 } 1785 }
1786 return Key( QString(), type ); 1786 return Key( QString(), type );
1787} 1787}
1788void Addressee::setKeys( const Key::List& list ) { 1788void Addressee::setKeys( const Key::List& list ) {
1789 detach(); 1789 detach();
1790 mData->keys = list; 1790 mData->keys = list;
1791} 1791}
1792 1792
1793Key::List Addressee::keys() const 1793Key::List Addressee::keys() const
1794{ 1794{
1795 return mData->keys; 1795 return mData->keys;
1796} 1796}
1797 1797
1798Key::List Addressee::keys( int type, QString customTypeString ) const 1798Key::List Addressee::keys( int type, QString customTypeString ) const
1799{ 1799{
1800 Key::List list; 1800 Key::List list;
1801 1801
1802 Key::List::ConstIterator it; 1802 Key::List::ConstIterator it;
1803 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1803 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1804 if ( (*it).type() == type ) { 1804 if ( (*it).type() == type ) {
1805 if ( type == Key::Custom ) { 1805 if ( type == Key::Custom ) {
1806 if ( customTypeString.isEmpty() ) { 1806 if ( customTypeString.isEmpty() ) {
1807 list.append(*it); 1807 list.append(*it);
1808 } else { 1808 } else {
1809 if ( (*it).customTypeString() == customTypeString ) 1809 if ( (*it).customTypeString() == customTypeString )
1810 list.append(*it); 1810 list.append(*it);
1811 } 1811 }
1812 } else { 1812 } else {
1813 list.append(*it); 1813 list.append(*it);
1814 } 1814 }
1815 } 1815 }
1816 } 1816 }
1817 return list; 1817 return list;
1818} 1818}
1819 1819
1820Key Addressee::findKey( const QString &id ) const 1820Key Addressee::findKey( const QString &id ) const
1821{ 1821{
1822 Key::List::ConstIterator it; 1822 Key::List::ConstIterator it;
1823 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1823 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1824 if ( (*it).id() == id ) { 1824 if ( (*it).id() == id ) {
1825 return *it; 1825 return *it;
1826 } 1826 }
1827 } 1827 }
1828 return Key(); 1828 return Key();
1829} 1829}
1830 1830
1831QString Addressee::asString() const 1831QString Addressee::asString() const
1832{ 1832{
1833 return "Smith, agent Smith..."; 1833 return "Smith, agent Smith...";
1834} 1834}
1835 1835
1836void Addressee::dump() const 1836void Addressee::dump() const
1837{ 1837{
1838 return; 1838 return;
1839#if 0 1839#if 0
1840 kdDebug(5700) << "Addressee {" << endl; 1840 kdDebug(5700) << "Addressee {" << endl;
1841 1841
1842 kdDebug(5700) << " Uid: '" << uid() << "'" << endl; 1842 kdDebug(5700) << " Uid: '" << uid() << "'" << endl;
1843 1843
1844 kdDebug(5700) << " Name: '" << name() << "'" << endl; 1844 kdDebug(5700) << " Name: '" << name() << "'" << endl;
1845 kdDebug(5700) << " FormattedName: '" << formattedName() << "'" << endl; 1845 kdDebug(5700) << " FormattedName: '" << formattedName() << "'" << endl;
1846 kdDebug(5700) << " FamilyName: '" << familyName() << "'" << endl; 1846 kdDebug(5700) << " FamilyName: '" << familyName() << "'" << endl;
1847 kdDebug(5700) << " GivenName: '" << givenName() << "'" << endl; 1847 kdDebug(5700) << " GivenName: '" << givenName() << "'" << endl;
1848 kdDebug(5700) << " AdditionalName: '" << additionalName() << "'" << endl; 1848 kdDebug(5700) << " AdditionalName: '" << additionalName() << "'" << endl;
1849 kdDebug(5700) << " Prefix: '" << prefix() << "'" << endl; 1849 kdDebug(5700) << " Prefix: '" << prefix() << "'" << endl;
1850 kdDebug(5700) << " Suffix: '" << suffix() << "'" << endl; 1850 kdDebug(5700) << " Suffix: '" << suffix() << "'" << endl;
1851 kdDebug(5700) << " NickName: '" << nickName() << "'" << endl; 1851 kdDebug(5700) << " NickName: '" << nickName() << "'" << endl;
1852 kdDebug(5700) << " Birthday: '" << birthday().toString() << "'" << endl; 1852 kdDebug(5700) << " Birthday: '" << birthday().toString() << "'" << endl;