summaryrefslogtreecommitdiffabout
path: root/kabc/addressee.cpp
Unidiff
Diffstat (limited to 'kabc/addressee.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--kabc/addressee.cpp4
1 files changed, 4 insertions, 0 deletions
diff --git a/kabc/addressee.cpp b/kabc/addressee.cpp
index eec0f1f..3ce733d 100644
--- a/kabc/addressee.cpp
+++ b/kabc/addressee.cpp
@@ -463,1671 +463,1675 @@ void Addressee::simplifyAddresses()
463 463
464 Address::List list; 464 Address::List list;
465 Address::List::Iterator it; 465 Address::List::Iterator it;
466 Address::List::Iterator it2; 466 Address::List::Iterator it2;
467 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 467 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
468 it2 = it; 468 it2 = it;
469 ++it2; 469 ++it2;
470 for( ; it2 != mData->addresses.end(); ++it2 ) { 470 for( ; it2 != mData->addresses.end(); ++it2 ) {
471 if ( (*it) == (*it2) ) { 471 if ( (*it) == (*it2) ) {
472 list.append( *it ); 472 list.append( *it );
473 break; 473 break;
474 } 474 }
475 } 475 }
476 } 476 }
477 for( it = list.begin(); it != list.end(); ++it ) { 477 for( it = list.begin(); it != list.end(); ++it ) {
478 removeAddress( (*it) ); 478 removeAddress( (*it) );
479 } 479 }
480 480
481 list.clear(); 481 list.clear();
482 int max = 2; 482 int max = 2;
483 if ( mData->url.isValid() ) 483 if ( mData->url.isValid() )
484 max = 1; 484 max = 1;
485 if ( mData->addresses.count() <= max ) return ; 485 if ( mData->addresses.count() <= max ) return ;
486 int count = 0; 486 int count = 0;
487 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 487 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
488 if ( count >= max ) 488 if ( count >= max )
489 list.append( *it ); 489 list.append( *it );
490 ++count; 490 ++count;
491 } 491 }
492 for( it = list.begin(); it != list.end(); ++it ) { 492 for( it = list.begin(); it != list.end(); ++it ) {
493 removeAddress( (*it) ); 493 removeAddress( (*it) );
494 } 494 }
495} 495}
496 496
497// removes all emails but the first 497// removes all emails but the first
498// needed by phone sync 498// needed by phone sync
499void Addressee::simplifyEmails() 499void Addressee::simplifyEmails()
500{ 500{
501 if ( mData->emails.count() == 0 ) return ; 501 if ( mData->emails.count() == 0 ) return ;
502 QString email = mData->emails.first(); 502 QString email = mData->emails.first();
503 detach(); 503 detach();
504 mData->emails.clear(); 504 mData->emails.clear();
505 mData->emails.append( email ); 505 mData->emails.append( email );
506} 506}
507 507
508void Addressee::simplifyPhoneNumbers() 508void Addressee::simplifyPhoneNumbers()
509{ 509{
510 int max = 4; 510 int max = 4;
511 int inList = mData->phoneNumbers.count(); 511 int inList = mData->phoneNumbers.count();
512 KABC::PhoneNumber::List removeNumbers; 512 KABC::PhoneNumber::List removeNumbers;
513 KABC::PhoneNumber::List::Iterator phoneIter; 513 KABC::PhoneNumber::List::Iterator phoneIter;
514 if ( inList > max ) { 514 if ( inList > max ) {
515 // delete non-preferred numbers 515 // delete non-preferred numbers
516 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); 516 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
517 ++phoneIter ) { 517 ++phoneIter ) {
518 if ( inList > max ) { 518 if ( inList > max ) {
519 if ( ! (( *phoneIter ).type() & PhoneNumber::Pref )) { 519 if ( ! (( *phoneIter ).type() & PhoneNumber::Pref )) {
520 removeNumbers.append( ( *phoneIter ) ); 520 removeNumbers.append( ( *phoneIter ) );
521 --inList; 521 --inList;
522 } 522 }
523 } else 523 } else
524 break; 524 break;
525 } 525 }
526 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end(); 526 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end();
527 ++phoneIter ) { 527 ++phoneIter ) {
528 removePhoneNumber(( *phoneIter )); 528 removePhoneNumber(( *phoneIter ));
529 } 529 }
530 // delete preferred numbers 530 // delete preferred numbers
531 if ( inList > max ) { 531 if ( inList > max ) {
532 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); 532 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
533 ++phoneIter ) { 533 ++phoneIter ) {
534 if ( inList > max ) { 534 if ( inList > max ) {
535 removeNumbers.append( ( *phoneIter ) ); 535 removeNumbers.append( ( *phoneIter ) );
536 --inList; 536 --inList;
537 } else 537 } else
538 break; 538 break;
539 } 539 }
540 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end(); 540 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end();
541 ++phoneIter ) { 541 ++phoneIter ) {
542 removePhoneNumber(( *phoneIter )); 542 removePhoneNumber(( *phoneIter ));
543 } 543 }
544 } 544 }
545 } 545 }
546 // remove non-numeric characters 546 // remove non-numeric characters
547 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); 547 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
548 ++phoneIter ) { 548 ++phoneIter ) {
549 if ( ! ( *phoneIter ).simplifyNumber() ) 549 if ( ! ( *phoneIter ).simplifyNumber() )
550 removeNumbers.append( ( *phoneIter ) ); 550 removeNumbers.append( ( *phoneIter ) );
551 } 551 }
552 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end(); 552 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end();
553 ++phoneIter ) { 553 ++phoneIter ) {
554 removePhoneNumber(( *phoneIter )); 554 removePhoneNumber(( *phoneIter ));
555 } 555 }
556} 556}
557void Addressee::simplifyPhoneNumberTypes() 557void Addressee::simplifyPhoneNumberTypes()
558{ 558{
559 KABC::PhoneNumber::List::Iterator phoneIter; 559 KABC::PhoneNumber::List::Iterator phoneIter;
560 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); 560 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
561 ++phoneIter ) 561 ++phoneIter )
562 ( *phoneIter ).simplifyType(); 562 ( *phoneIter ).simplifyType();
563} 563}
564void Addressee::removeID(const QString &prof) 564void Addressee::removeID(const QString &prof)
565{ 565{
566 detach(); 566 detach();
567 if ( prof.isEmpty() ) 567 if ( prof.isEmpty() )
568 mData->mExternalId = ":"; 568 mData->mExternalId = ":";
569 else 569 else
570 mData->mExternalId = KIdManager::removeId ( mData->mExternalId, prof); 570 mData->mExternalId = KIdManager::removeId ( mData->mExternalId, prof);
571 571
572} 572}
573void Addressee::setID( const QString & prof , const QString & id ) 573void Addressee::setID( const QString & prof , const QString & id )
574{ 574{
575 detach(); 575 detach();
576 mData->mExternalId = KIdManager::setId ( mData->mExternalId, prof, id ); 576 mData->mExternalId = KIdManager::setId ( mData->mExternalId, prof, id );
577 //qDebug("setID2 %s %s %s",mData->mExternalId.latin1(), prof.latin1(), id.latin1() ); 577 //qDebug("setID2 %s %s %s",mData->mExternalId.latin1(), prof.latin1(), id.latin1() );
578} 578}
579void Addressee::setTempSyncStat( int id ) 579void Addressee::setTempSyncStat( int id )
580{ 580{
581 if ( mData->mTempSyncStat == id ) return; 581 if ( mData->mTempSyncStat == id ) return;
582 detach(); 582 detach();
583 mData->mTempSyncStat = id; 583 mData->mTempSyncStat = id;
584} 584}
585int Addressee::tempSyncStat() const 585int Addressee::tempSyncStat() const
586{ 586{
587 return mData->mTempSyncStat; 587 return mData->mTempSyncStat;
588} 588}
589 589
590QString Addressee::getID( const QString & prof) 590QString Addressee::getID( const QString & prof)
591{ 591{
592 return KIdManager::getId ( mData->mExternalId, prof ); 592 return KIdManager::getId ( mData->mExternalId, prof );
593} 593}
594 594
595void Addressee::setCsum( const QString & prof , const QString & id ) 595void Addressee::setCsum( const QString & prof , const QString & id )
596{ 596{
597 detach(); 597 detach();
598 //qDebug("setcsum1 %s %s %s",mData->mExternalId.latin1(), prof.latin1(), id.latin1() ); 598 //qDebug("setcsum1 %s %s %s",mData->mExternalId.latin1(), prof.latin1(), id.latin1() );
599 mData->mExternalId = KIdManager::setCsum ( mData->mExternalId, prof, id ); 599 mData->mExternalId = KIdManager::setCsum ( mData->mExternalId, prof, id );
600 //qDebug("setcsum2 %s ",mData->mExternalId.latin1() ); 600 //qDebug("setcsum2 %s ",mData->mExternalId.latin1() );
601} 601}
602 602
603QString Addressee::getCsum( const QString & prof) 603QString Addressee::getCsum( const QString & prof)
604{ 604{
605 return KIdManager::getCsum ( mData->mExternalId, prof ); 605 return KIdManager::getCsum ( mData->mExternalId, prof );
606} 606}
607 607
608void Addressee::setIDStr( const QString & s ) 608void Addressee::setIDStr( const QString & s )
609{ 609{
610 detach(); 610 detach();
611 mData->mExternalId = s; 611 mData->mExternalId = s;
612} 612}
613 613
614QString Addressee::IDStr() const 614QString Addressee::IDStr() const
615{ 615{
616 return mData->mExternalId; 616 return mData->mExternalId;
617} 617}
618 618
619void Addressee::setExternalUID( const QString &id ) 619void Addressee::setExternalUID( const QString &id )
620{ 620{
621 if ( id == mData->externalUID ) return; 621 if ( id == mData->externalUID ) return;
622 detach(); 622 detach();
623 mData->empty = false; 623 mData->empty = false;
624 mData->externalUID = id; 624 mData->externalUID = id;
625} 625}
626 626
627QString Addressee::externalUID() const 627QString Addressee::externalUID() const
628{ 628{
629 return mData->externalUID; 629 return mData->externalUID;
630} 630}
631void Addressee::setOriginalExternalUID( const QString &id ) 631void Addressee::setOriginalExternalUID( const QString &id )
632{ 632{
633 if ( id == mData->originalExternalUID ) return; 633 if ( id == mData->originalExternalUID ) return;
634 detach(); 634 detach();
635 mData->empty = false; 635 mData->empty = false;
636 //qDebug("*******Set orig uid %s ", id.latin1()); 636 //qDebug("*******Set orig uid %s ", id.latin1());
637 mData->originalExternalUID = id; 637 mData->originalExternalUID = id;
638} 638}
639 639
640QString Addressee::originalExternalUID() const 640QString Addressee::originalExternalUID() const
641{ 641{
642 return mData->originalExternalUID; 642 return mData->originalExternalUID;
643} 643}
644 644
645void Addressee::setUid( const QString &id ) 645void Addressee::setUid( const QString &id )
646{ 646{
647 if ( id == mData->uid ) return; 647 if ( id == mData->uid ) return;
648 detach(); 648 detach();
649 //qDebug("****setuid %s ", id.latin1()); 649 //qDebug("****setuid %s ", id.latin1());
650 mData->empty = false; 650 mData->empty = false;
651 mData->uid = id; 651 mData->uid = id;
652} 652}
653 653
654QString Addressee::uid() const 654QString Addressee::uid() const
655{ 655{
656 if ( mData->uid.isEmpty() ) 656 if ( mData->uid.isEmpty() )
657 mData->uid = KApplication::randomString( 10 ); 657 mData->uid = KApplication::randomString( 10 );
658 658
659 return mData->uid; 659 return mData->uid;
660} 660}
661 661
662QString Addressee::uidLabel() 662QString Addressee::uidLabel()
663{ 663{
664 return i18n("Unique Identifier"); 664 return i18n("Unique Identifier");
665} 665}
666 666
667void Addressee::setName( const QString &name ) 667void Addressee::setName( const QString &name )
668{ 668{
669 if ( name == mData->name ) return; 669 if ( name == mData->name ) return;
670 detach(); 670 detach();
671 mData->empty = false; 671 mData->empty = false;
672 mData->name = name; 672 mData->name = name;
673} 673}
674 674
675QString Addressee::name() const 675QString Addressee::name() const
676{ 676{
677 return mData->name; 677 return mData->name;
678} 678}
679 679
680QString Addressee::nameLabel() 680QString Addressee::nameLabel()
681{ 681{
682 return i18n("Name"); 682 return i18n("Name");
683} 683}
684 684
685 685
686void Addressee::setFormattedName( const QString &formattedName ) 686void Addressee::setFormattedName( const QString &formattedName )
687{ 687{
688 if ( formattedName == mData->formattedName ) return; 688 if ( formattedName == mData->formattedName ) return;
689 detach(); 689 detach();
690 mData->empty = false; 690 mData->empty = false;
691 mData->formattedName = formattedName; 691 mData->formattedName = formattedName;
692} 692}
693 693
694QString Addressee::formattedName() const 694QString Addressee::formattedName() const
695{ 695{
696 return mData->formattedName; 696 return mData->formattedName;
697} 697}
698 698
699QString Addressee::formattedNameLabel() 699QString Addressee::formattedNameLabel()
700{ 700{
701 return i18n("Formatted Name"); 701 return i18n("Formatted Name");
702} 702}
703 703
704 704
705void Addressee::setFamilyName( const QString &familyName ) 705void Addressee::setFamilyName( const QString &familyName )
706{ 706{
707 if ( familyName == mData->familyName ) return; 707 if ( familyName == mData->familyName ) return;
708 detach(); 708 detach();
709 mData->empty = false; 709 mData->empty = false;
710 mData->familyName = familyName; 710 mData->familyName = familyName;
711} 711}
712 712
713QString Addressee::familyName() const 713QString Addressee::familyName() const
714{ 714{
715 return mData->familyName; 715 return mData->familyName;
716} 716}
717 717
718QString Addressee::familyNameLabel() 718QString Addressee::familyNameLabel()
719{ 719{
720 return i18n("Family Name"); 720 return i18n("Family Name");
721} 721}
722 722
723 723
724void Addressee::setGivenName( const QString &givenName ) 724void Addressee::setGivenName( const QString &givenName )
725{ 725{
726 if ( givenName == mData->givenName ) return; 726 if ( givenName == mData->givenName ) return;
727 detach(); 727 detach();
728 mData->empty = false; 728 mData->empty = false;
729 mData->givenName = givenName; 729 mData->givenName = givenName;
730} 730}
731 731
732QString Addressee::givenName() const 732QString Addressee::givenName() const
733{ 733{
734 return mData->givenName; 734 return mData->givenName;
735} 735}
736 736
737QString Addressee::givenNameLabel() 737QString Addressee::givenNameLabel()
738{ 738{
739 return i18n("Given Name"); 739 return i18n("Given Name");
740} 740}
741 741
742 742
743void Addressee::setAdditionalName( const QString &additionalName ) 743void Addressee::setAdditionalName( const QString &additionalName )
744{ 744{
745 if ( additionalName == mData->additionalName ) return; 745 if ( additionalName == mData->additionalName ) return;
746 detach(); 746 detach();
747 mData->empty = false; 747 mData->empty = false;
748 mData->additionalName = additionalName; 748 mData->additionalName = additionalName;
749} 749}
750 750
751QString Addressee::additionalName() const 751QString Addressee::additionalName() const
752{ 752{
753 return mData->additionalName; 753 return mData->additionalName;
754} 754}
755 755
756QString Addressee::additionalNameLabel() 756QString Addressee::additionalNameLabel()
757{ 757{
758 return i18n("Additional Names"); 758 return i18n("Additional Names");
759} 759}
760 760
761 761
762void Addressee::setPrefix( const QString &prefix ) 762void Addressee::setPrefix( const QString &prefix )
763{ 763{
764 if ( prefix == mData->prefix ) return; 764 if ( prefix == mData->prefix ) return;
765 detach(); 765 detach();
766 mData->empty = false; 766 mData->empty = false;
767 mData->prefix = prefix; 767 mData->prefix = prefix;
768} 768}
769 769
770QString Addressee::prefix() const 770QString Addressee::prefix() const
771{ 771{
772 return mData->prefix; 772 return mData->prefix;
773} 773}
774 774
775QString Addressee::prefixLabel() 775QString Addressee::prefixLabel()
776{ 776{
777 return i18n("Honorific Prefixes"); 777 return i18n("Honorific Prefixes");
778} 778}
779 779
780 780
781void Addressee::setSuffix( const QString &suffix ) 781void Addressee::setSuffix( const QString &suffix )
782{ 782{
783 if ( suffix == mData->suffix ) return; 783 if ( suffix == mData->suffix ) return;
784 detach(); 784 detach();
785 mData->empty = false; 785 mData->empty = false;
786 mData->suffix = suffix; 786 mData->suffix = suffix;
787} 787}
788 788
789QString Addressee::suffix() const 789QString Addressee::suffix() const
790{ 790{
791 return mData->suffix; 791 return mData->suffix;
792} 792}
793 793
794QString Addressee::suffixLabel() 794QString Addressee::suffixLabel()
795{ 795{
796 return i18n("Honorific Suffixes"); 796 return i18n("Honorific Suffixes");
797} 797}
798 798
799 799
800void Addressee::setNickName( const QString &nickName ) 800void Addressee::setNickName( const QString &nickName )
801{ 801{
802 if ( nickName == mData->nickName ) return; 802 if ( nickName == mData->nickName ) return;
803 detach(); 803 detach();
804 mData->empty = false; 804 mData->empty = false;
805 mData->nickName = nickName; 805 mData->nickName = nickName;
806} 806}
807 807
808QString Addressee::nickName() const 808QString Addressee::nickName() const
809{ 809{
810 return mData->nickName; 810 return mData->nickName;
811} 811}
812 812
813QString Addressee::nickNameLabel() 813QString Addressee::nickNameLabel()
814{ 814{
815 return i18n("Nick Name"); 815 return i18n("Nick Name");
816} 816}
817 817
818 818
819void Addressee::setBirthday( const QDateTime &birthday ) 819void Addressee::setBirthday( const QDateTime &birthday )
820{ 820{
821 if ( birthday == mData->birthday ) return; 821 if ( birthday == mData->birthday ) return;
822 detach(); 822 detach();
823 mData->empty = false; 823 mData->empty = false;
824 mData->birthday = birthday; 824 mData->birthday = birthday;
825} 825}
826 826
827QDateTime Addressee::birthday() const 827QDateTime Addressee::birthday() const
828{ 828{
829 return mData->birthday; 829 return mData->birthday;
830} 830}
831 831
832QString Addressee::birthdayLabel() 832QString Addressee::birthdayLabel()
833{ 833{
834 return i18n("Birthday"); 834 return i18n("Birthday");
835} 835}
836 836
837 837
838QString Addressee::homeAddressStreetLabel() 838QString Addressee::homeAddressStreetLabel()
839{ 839{
840 return i18n("Home Address Street"); 840 return i18n("Home Address Street");
841} 841}
842 842
843 843
844QString Addressee::homeAddressLocalityLabel() 844QString Addressee::homeAddressLocalityLabel()
845{ 845{
846 return i18n("Home Address Locality"); 846 return i18n("Home Address Locality");
847} 847}
848 848
849 849
850QString Addressee::homeAddressRegionLabel() 850QString Addressee::homeAddressRegionLabel()
851{ 851{
852 return i18n("Home Address Region"); 852 return i18n("Home Address Region");
853} 853}
854 854
855 855
856QString Addressee::homeAddressPostalCodeLabel() 856QString Addressee::homeAddressPostalCodeLabel()
857{ 857{
858 return i18n("Home Address Postal Code"); 858 return i18n("Home Address Postal Code");
859} 859}
860 860
861 861
862QString Addressee::homeAddressCountryLabel() 862QString Addressee::homeAddressCountryLabel()
863{ 863{
864 return i18n("Home Address Country"); 864 return i18n("Home Address Country");
865} 865}
866 866
867 867
868QString Addressee::homeAddressLabelLabel() 868QString Addressee::homeAddressLabelLabel()
869{ 869{
870 return i18n("Home Address Label"); 870 return i18n("Home Address Label");
871} 871}
872 872
873 873
874QString Addressee::businessAddressStreetLabel() 874QString Addressee::businessAddressStreetLabel()
875{ 875{
876 return i18n("Business Address Street"); 876 return i18n("Business Address Street");
877} 877}
878 878
879 879
880QString Addressee::businessAddressLocalityLabel() 880QString Addressee::businessAddressLocalityLabel()
881{ 881{
882 return i18n("Business Address Locality"); 882 return i18n("Business Address Locality");
883} 883}
884 884
885 885
886QString Addressee::businessAddressRegionLabel() 886QString Addressee::businessAddressRegionLabel()
887{ 887{
888 return i18n("Business Address Region"); 888 return i18n("Business Address Region");
889} 889}
890 890
891 891
892QString Addressee::businessAddressPostalCodeLabel() 892QString Addressee::businessAddressPostalCodeLabel()
893{ 893{
894 return i18n("Business Address Postal Code"); 894 return i18n("Business Address Postal Code");
895} 895}
896 896
897 897
898QString Addressee::businessAddressCountryLabel() 898QString Addressee::businessAddressCountryLabel()
899{ 899{
900 return i18n("Business Address Country"); 900 return i18n("Business Address Country");
901} 901}
902 902
903 903
904QString Addressee::businessAddressLabelLabel() 904QString Addressee::businessAddressLabelLabel()
905{ 905{
906 return i18n("Business Address Label"); 906 return i18n("Business Address Label");
907} 907}
908 908
909 909
910QString Addressee::homePhoneLabel() 910QString Addressee::homePhoneLabel()
911{ 911{
912 return i18n("Home Phone"); 912 return i18n("Home Phone");
913} 913}
914 914
915 915
916QString Addressee::businessPhoneLabel() 916QString Addressee::businessPhoneLabel()
917{ 917{
918 return i18n("Business Phone"); 918 return i18n("Business Phone");
919} 919}
920 920
921 921
922QString Addressee::mobilePhoneLabel() 922QString Addressee::mobilePhoneLabel()
923{ 923{
924 return i18n("Mobile Phone"); 924 return i18n("Mobile Phone");
925} 925}
926 926
927 927
928QString Addressee::homeFaxLabel() 928QString Addressee::homeFaxLabel()
929{ 929{
930 return i18n("Home Fax"); 930 return i18n("Home Fax");
931} 931}
932 932
933 933
934QString Addressee::businessFaxLabel() 934QString Addressee::businessFaxLabel()
935{ 935{
936 return i18n("Business Fax"); 936 return i18n("Business Fax");
937} 937}
938 938
939 939
940QString Addressee::carPhoneLabel() 940QString Addressee::carPhoneLabel()
941{ 941{
942 return i18n("Car Phone"); 942 return i18n("Car Phone");
943} 943}
944 944
945 945
946QString Addressee::isdnLabel() 946QString Addressee::isdnLabel()
947{ 947{
948 return i18n("ISDN"); 948 return i18n("ISDN");
949} 949}
950 950
951 951
952QString Addressee::pagerLabel() 952QString Addressee::pagerLabel()
953{ 953{
954 return i18n("Pager"); 954 return i18n("Pager");
955} 955}
956 956
957QString Addressee::sipLabel() 957QString Addressee::sipLabel()
958{ 958{
959 return i18n("SIP"); 959 return i18n("SIP");
960} 960}
961 961
962QString Addressee::emailLabel() 962QString Addressee::emailLabel()
963{ 963{
964 return i18n("Email Address"); 964 return i18n("Email Address");
965} 965}
966 966
967 967
968void Addressee::setMailer( const QString &mailer ) 968void Addressee::setMailer( const QString &mailer )
969{ 969{
970 if ( mailer == mData->mailer ) return; 970 if ( mailer == mData->mailer ) return;
971 detach(); 971 detach();
972 mData->empty = false; 972 mData->empty = false;
973 mData->mailer = mailer; 973 mData->mailer = mailer;
974} 974}
975 975
976QString Addressee::mailer() const 976QString Addressee::mailer() const
977{ 977{
978 return mData->mailer; 978 return mData->mailer;
979} 979}
980 980
981QString Addressee::mailerLabel() 981QString Addressee::mailerLabel()
982{ 982{
983 return i18n("Mail Client"); 983 return i18n("Mail Client");
984} 984}
985 985
986 986
987void Addressee::setTimeZone( const TimeZone &timeZone ) 987void Addressee::setTimeZone( const TimeZone &timeZone )
988{ 988{
989 if ( timeZone == mData->timeZone ) return; 989 if ( timeZone == mData->timeZone ) return;
990 detach(); 990 detach();
991 mData->empty = false; 991 mData->empty = false;
992 mData->timeZone = timeZone; 992 mData->timeZone = timeZone;
993} 993}
994 994
995TimeZone Addressee::timeZone() const 995TimeZone Addressee::timeZone() const
996{ 996{
997 return mData->timeZone; 997 return mData->timeZone;
998} 998}
999 999
1000QString Addressee::timeZoneLabel() 1000QString Addressee::timeZoneLabel()
1001{ 1001{
1002 return i18n("Time Zone"); 1002 return i18n("Time Zone");
1003} 1003}
1004 1004
1005 1005
1006void Addressee::setGeo( const Geo &geo ) 1006void Addressee::setGeo( const Geo &geo )
1007{ 1007{
1008 if ( geo == mData->geo ) return; 1008 if ( geo == mData->geo ) return;
1009 detach(); 1009 detach();
1010 mData->empty = false; 1010 mData->empty = false;
1011 mData->geo = geo; 1011 mData->geo = geo;
1012} 1012}
1013 1013
1014Geo Addressee::geo() const 1014Geo Addressee::geo() const
1015{ 1015{
1016 return mData->geo; 1016 return mData->geo;
1017} 1017}
1018 1018
1019QString Addressee::geoLabel() 1019QString Addressee::geoLabel()
1020{ 1020{
1021 return i18n("Geographic Position"); 1021 return i18n("Geographic Position");
1022} 1022}
1023 1023
1024 1024
1025void Addressee::setTitle( const QString &title ) 1025void Addressee::setTitle( const QString &title )
1026{ 1026{
1027 if ( title == mData->title ) return; 1027 if ( title == mData->title ) return;
1028 detach(); 1028 detach();
1029 mData->empty = false; 1029 mData->empty = false;
1030 mData->title = title; 1030 mData->title = title;
1031} 1031}
1032 1032
1033QString Addressee::title() const 1033QString Addressee::title() const
1034{ 1034{
1035 return mData->title; 1035 return mData->title;
1036} 1036}
1037 1037
1038QString Addressee::titleLabel() 1038QString Addressee::titleLabel()
1039{ 1039{
1040 return i18n("Title"); 1040 return i18n("Title");
1041} 1041}
1042 1042
1043 1043
1044void Addressee::setRole( const QString &role ) 1044void Addressee::setRole( const QString &role )
1045{ 1045{
1046 if ( role == mData->role ) return; 1046 if ( role == mData->role ) return;
1047 detach(); 1047 detach();
1048 mData->empty = false; 1048 mData->empty = false;
1049 mData->role = role; 1049 mData->role = role;
1050} 1050}
1051 1051
1052QString Addressee::role() const 1052QString Addressee::role() const
1053{ 1053{
1054 return mData->role; 1054 return mData->role;
1055} 1055}
1056 1056
1057QString Addressee::roleLabel() 1057QString Addressee::roleLabel()
1058{ 1058{
1059 return i18n("Role"); 1059 return i18n("Role");
1060} 1060}
1061 1061
1062 1062
1063void Addressee::setOrganization( const QString &organization ) 1063void Addressee::setOrganization( const QString &organization )
1064{ 1064{
1065 if ( organization == mData->organization ) return; 1065 if ( organization == mData->organization ) return;
1066 detach(); 1066 detach();
1067 mData->empty = false; 1067 mData->empty = false;
1068 mData->organization = organization; 1068 mData->organization = organization;
1069} 1069}
1070 1070
1071QString Addressee::organization() const 1071QString Addressee::organization() const
1072{ 1072{
1073 return mData->organization; 1073 return mData->organization;
1074} 1074}
1075 1075
1076QString Addressee::organizationLabel() 1076QString Addressee::organizationLabel()
1077{ 1077{
1078 return i18n("Organization"); 1078 return i18n("Organization");
1079} 1079}
1080 1080
1081 1081
1082void Addressee::setNote( const QString &note ) 1082void Addressee::setNote( const QString &note )
1083{ 1083{
1084 if ( note == mData->note ) return; 1084 if ( note == mData->note ) return;
1085 detach(); 1085 detach();
1086 mData->empty = false; 1086 mData->empty = false;
1087 mData->note = note; 1087 mData->note = note;
1088} 1088}
1089 1089
1090QString Addressee::note() const 1090QString Addressee::note() const
1091{ 1091{
1092 return mData->note; 1092 return mData->note;
1093} 1093}
1094 1094
1095QString Addressee::noteLabel() 1095QString Addressee::noteLabel()
1096{ 1096{
1097 return i18n("Note"); 1097 return i18n("Note");
1098} 1098}
1099 1099
1100 1100
1101void Addressee::setProductId( const QString &productId ) 1101void Addressee::setProductId( const QString &productId )
1102{ 1102{
1103 if ( productId == mData->productId ) return; 1103 if ( productId == mData->productId ) return;
1104 detach(); 1104 detach();
1105 mData->empty = false; 1105 mData->empty = false;
1106 mData->productId = productId; 1106 mData->productId = productId;
1107} 1107}
1108 1108
1109QString Addressee::productId() const 1109QString Addressee::productId() const
1110{ 1110{
1111 return mData->productId; 1111 return mData->productId;
1112} 1112}
1113 1113
1114QString Addressee::productIdLabel() 1114QString Addressee::productIdLabel()
1115{ 1115{
1116 return i18n("Product Identifier"); 1116 return i18n("Product Identifier");
1117} 1117}
1118 1118
1119 1119
1120void Addressee::setRevision( const QDateTime &revision ) 1120void Addressee::setRevision( const QDateTime &revision )
1121{ 1121{
1122 if ( revision == mData->revision ) return; 1122 if ( revision == mData->revision ) return;
1123 detach(); 1123 detach();
1124 mData->empty = false; 1124 mData->empty = false;
1125 mData->revision = QDateTime( revision.date(), 1125 mData->revision = QDateTime( revision.date(),
1126 QTime (revision.time().hour(), 1126 QTime (revision.time().hour(),
1127 revision.time().minute(), 1127 revision.time().minute(),
1128 revision.time().second())); 1128 revision.time().second()));
1129} 1129}
1130 1130
1131QDateTime Addressee::revision() const 1131QDateTime Addressee::revision() const
1132{ 1132{
1133 return mData->revision; 1133 return mData->revision;
1134} 1134}
1135 1135
1136QString Addressee::revisionLabel() 1136QString Addressee::revisionLabel()
1137{ 1137{
1138 return i18n("Revision Date"); 1138 return i18n("Revision Date");
1139} 1139}
1140 1140
1141 1141
1142void Addressee::setSortString( const QString &sortString ) 1142void Addressee::setSortString( const QString &sortString )
1143{ 1143{
1144 if ( sortString == mData->sortString ) return; 1144 if ( sortString == mData->sortString ) return;
1145 detach(); 1145 detach();
1146 mData->empty = false; 1146 mData->empty = false;
1147 mData->sortString = sortString; 1147 mData->sortString = sortString;
1148} 1148}
1149 1149
1150QString Addressee::sortString() const 1150QString Addressee::sortString() const
1151{ 1151{
1152 return mData->sortString; 1152 return mData->sortString;
1153} 1153}
1154 1154
1155QString Addressee::sortStringLabel() 1155QString Addressee::sortStringLabel()
1156{ 1156{
1157 return i18n("Sort String"); 1157 return i18n("Sort String");
1158} 1158}
1159 1159
1160 1160
1161void Addressee::setUrl( const KURL &url ) 1161void Addressee::setUrl( const KURL &url )
1162{ 1162{
1163 if ( url == mData->url ) return; 1163 if ( url == mData->url ) return;
1164 detach(); 1164 detach();
1165 mData->empty = false; 1165 mData->empty = false;
1166 mData->url = url; 1166 mData->url = url;
1167} 1167}
1168 1168
1169KURL Addressee::url() const 1169KURL Addressee::url() const
1170{ 1170{
1171 return mData->url; 1171 return mData->url;
1172} 1172}
1173 1173
1174QString Addressee::urlLabel() 1174QString Addressee::urlLabel()
1175{ 1175{
1176 return i18n("URL"); 1176 return i18n("URL");
1177} 1177}
1178 1178
1179 1179
1180void Addressee::setSecrecy( const Secrecy &secrecy ) 1180void Addressee::setSecrecy( const Secrecy &secrecy )
1181{ 1181{
1182 if ( secrecy == mData->secrecy ) return; 1182 if ( secrecy == mData->secrecy ) return;
1183 detach(); 1183 detach();
1184 mData->empty = false; 1184 mData->empty = false;
1185 mData->secrecy = secrecy; 1185 mData->secrecy = secrecy;
1186} 1186}
1187 1187
1188Secrecy Addressee::secrecy() const 1188Secrecy Addressee::secrecy() const
1189{ 1189{
1190 return mData->secrecy; 1190 return mData->secrecy;
1191} 1191}
1192 1192
1193QString Addressee::secrecyLabel() 1193QString Addressee::secrecyLabel()
1194{ 1194{
1195 return i18n("Security Class"); 1195 return i18n("Security Class");
1196} 1196}
1197 1197
1198 1198
1199void Addressee::setLogo( const Picture &logo ) 1199void Addressee::setLogo( const Picture &logo )
1200{ 1200{
1201 if ( logo == mData->logo ) return; 1201 if ( logo == mData->logo ) return;
1202 detach(); 1202 detach();
1203 mData->empty = false; 1203 mData->empty = false;
1204 mData->logo = logo; 1204 mData->logo = logo;
1205} 1205}
1206 1206
1207Picture Addressee::logo() const 1207Picture Addressee::logo() const
1208{ 1208{
1209 return mData->logo; 1209 return mData->logo;
1210} 1210}
1211 1211
1212QString Addressee::logoLabel() 1212QString Addressee::logoLabel()
1213{ 1213{
1214 return i18n("Logo"); 1214 return i18n("Logo");
1215} 1215}
1216 1216
1217 1217
1218void Addressee::setPhoto( const Picture &photo ) 1218void Addressee::setPhoto( const Picture &photo )
1219{ 1219{
1220 if ( photo == mData->photo ) return; 1220 if ( photo == mData->photo ) return;
1221 detach(); 1221 detach();
1222 mData->empty = false; 1222 mData->empty = false;
1223 mData->photo = photo; 1223 mData->photo = photo;
1224} 1224}
1225 1225
1226Picture Addressee::photo() const 1226Picture Addressee::photo() const
1227{ 1227{
1228 return mData->photo; 1228 return mData->photo;
1229} 1229}
1230 1230
1231QString Addressee::photoLabel() 1231QString Addressee::photoLabel()
1232{ 1232{
1233 return i18n("Photo"); 1233 return i18n("Photo");
1234} 1234}
1235 1235
1236 1236
1237void Addressee::setSound( const Sound &sound ) 1237void Addressee::setSound( const Sound &sound )
1238{ 1238{
1239 if ( sound == mData->sound ) return; 1239 if ( sound == mData->sound ) return;
1240 detach(); 1240 detach();
1241 mData->empty = false; 1241 mData->empty = false;
1242 mData->sound = sound; 1242 mData->sound = sound;
1243} 1243}
1244 1244
1245Sound Addressee::sound() const 1245Sound Addressee::sound() const
1246{ 1246{
1247 return mData->sound; 1247 return mData->sound;
1248} 1248}
1249 1249
1250QString Addressee::soundLabel() 1250QString Addressee::soundLabel()
1251{ 1251{
1252 return i18n("Sound"); 1252 return i18n("Sound");
1253} 1253}
1254 1254
1255 1255
1256void Addressee::setAgent( const Agent &agent ) 1256void Addressee::setAgent( const Agent &agent )
1257{ 1257{
1258 if ( agent == mData->agent ) return; 1258 if ( agent == mData->agent ) return;
1259 detach(); 1259 detach();
1260 mData->empty = false; 1260 mData->empty = false;
1261 mData->agent = agent; 1261 mData->agent = agent;
1262} 1262}
1263 1263
1264Agent Addressee::agent() const 1264Agent Addressee::agent() const
1265{ 1265{
1266 return mData->agent; 1266 return mData->agent;
1267} 1267}
1268 1268
1269QString Addressee::agentLabel() 1269QString Addressee::agentLabel()
1270{ 1270{
1271 return i18n("Agent"); 1271 return i18n("Agent");
1272} 1272}
1273 1273
1274 1274
1275 1275
1276void Addressee::setNameFromString( const QString &str ) 1276void Addressee::setNameFromString( const QString &str )
1277{ 1277{
1278 setFormattedName( str ); 1278 setFormattedName( str );
1279 setName( str ); 1279 setName( str );
1280 1280
1281 static bool first = true; 1281 static bool first = true;
1282 static QStringList titles; 1282 static QStringList titles;
1283 static QStringList suffixes; 1283 static QStringList suffixes;
1284 static QStringList prefixes; 1284 static QStringList prefixes;
1285 1285
1286 if ( first ) { 1286 if ( first ) {
1287 first = false; 1287 first = false;
1288 titles += i18n( "Dr." ); 1288 titles += i18n( "Dr." );
1289 titles += i18n( "Miss" ); 1289 titles += i18n( "Miss" );
1290 titles += i18n( "Mr." ); 1290 titles += i18n( "Mr." );
1291 titles += i18n( "Mrs." ); 1291 titles += i18n( "Mrs." );
1292 titles += i18n( "Ms." ); 1292 titles += i18n( "Ms." );
1293 titles += i18n( "Prof." ); 1293 titles += i18n( "Prof." );
1294 1294
1295 suffixes += i18n( "I" ); 1295 suffixes += i18n( "I" );
1296 suffixes += i18n( "II" ); 1296 suffixes += i18n( "II" );
1297 suffixes += i18n( "III" ); 1297 suffixes += i18n( "III" );
1298 suffixes += i18n( "Jr." ); 1298 suffixes += i18n( "Jr." );
1299 suffixes += i18n( "Sr." ); 1299 suffixes += i18n( "Sr." );
1300 1300
1301 prefixes += "van"; 1301 prefixes += "van";
1302 prefixes += "von"; 1302 prefixes += "von";
1303 prefixes += "de"; 1303 prefixes += "de";
1304 1304
1305 KConfig config( locateLocal( "config", "kabcrc") ); 1305 KConfig config( locateLocal( "config", "kabcrc") );
1306 config.setGroup( "General" ); 1306 config.setGroup( "General" );
1307 titles += config.readListEntry( "Prefixes" ); 1307 titles += config.readListEntry( "Prefixes" );
1308 titles.remove( "" ); 1308 titles.remove( "" );
1309 prefixes += config.readListEntry( "Inclusions" ); 1309 prefixes += config.readListEntry( "Inclusions" );
1310 prefixes.remove( "" ); 1310 prefixes.remove( "" );
1311 suffixes += config.readListEntry( "Suffixes" ); 1311 suffixes += config.readListEntry( "Suffixes" );
1312 suffixes.remove( "" ); 1312 suffixes.remove( "" );
1313 } 1313 }
1314 1314
1315 // clear all name parts 1315 // clear all name parts
1316 setPrefix( "" ); 1316 setPrefix( "" );
1317 setGivenName( "" ); 1317 setGivenName( "" );
1318 setAdditionalName( "" ); 1318 setAdditionalName( "" );
1319 setFamilyName( "" ); 1319 setFamilyName( "" );
1320 setSuffix( "" ); 1320 setSuffix( "" );
1321 1321
1322 if ( str.isEmpty() ) 1322 if ( str.isEmpty() )
1323 return; 1323 return;
1324 1324
1325 int i = str.find(','); 1325 int i = str.find(',');
1326 if( i < 0 ) { 1326 if( i < 0 ) {
1327 QStringList parts = QStringList::split( " ", str ); 1327 QStringList parts = QStringList::split( " ", str );
1328 int leftOffset = 0; 1328 int leftOffset = 0;
1329 int rightOffset = parts.count() - 1; 1329 int rightOffset = parts.count() - 1;
1330 1330
1331 QString suffix; 1331 QString suffix;
1332 while ( rightOffset >= 0 ) { 1332 while ( rightOffset >= 0 ) {
1333 if ( suffixes.contains( parts[ rightOffset ] ) ) { 1333 if ( suffixes.contains( parts[ rightOffset ] ) ) {
1334 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " ")); 1334 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " "));
1335 rightOffset--; 1335 rightOffset--;
1336 } else 1336 } else
1337 break; 1337 break;
1338 } 1338 }
1339 setSuffix( suffix ); 1339 setSuffix( suffix );
1340 1340
1341 if ( rightOffset < 0 ) 1341 if ( rightOffset < 0 )
1342 return; 1342 return;
1343 1343
1344 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) { 1344 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) {
1345 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] ); 1345 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] );
1346 rightOffset--; 1346 rightOffset--;
1347 } else 1347 } else
1348 setFamilyName( parts[ rightOffset ] ); 1348 setFamilyName( parts[ rightOffset ] );
1349 1349
1350 QString prefix; 1350 QString prefix;
1351 while ( leftOffset < rightOffset ) { 1351 while ( leftOffset < rightOffset ) {
1352 if ( titles.contains( parts[ leftOffset ] ) ) { 1352 if ( titles.contains( parts[ leftOffset ] ) ) {
1353 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1353 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1354 leftOffset++; 1354 leftOffset++;
1355 } else 1355 } else
1356 break; 1356 break;
1357 } 1357 }
1358 setPrefix( prefix ); 1358 setPrefix( prefix );
1359 1359
1360 if ( leftOffset < rightOffset ) { 1360 if ( leftOffset < rightOffset ) {
1361 setGivenName( parts[ leftOffset ] ); 1361 setGivenName( parts[ leftOffset ] );
1362 leftOffset++; 1362 leftOffset++;
1363 } 1363 }
1364 1364
1365 QString additionalName; 1365 QString additionalName;
1366 while ( leftOffset < rightOffset ) { 1366 while ( leftOffset < rightOffset ) {
1367 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1367 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1368 leftOffset++; 1368 leftOffset++;
1369 } 1369 }
1370 setAdditionalName( additionalName ); 1370 setAdditionalName( additionalName );
1371 } else { 1371 } else {
1372 QString part1 = str.left( i ); 1372 QString part1 = str.left( i );
1373 QString part2 = str.mid( i + 1 ); 1373 QString part2 = str.mid( i + 1 );
1374 1374
1375 QStringList parts = QStringList::split( " ", part1 ); 1375 QStringList parts = QStringList::split( " ", part1 );
1376 int leftOffset = 0; 1376 int leftOffset = 0;
1377 int rightOffset = parts.count() - 1; 1377 int rightOffset = parts.count() - 1;
1378 1378
1379 QString suffix; 1379 QString suffix;
1380 while ( rightOffset >= 0 ) { 1380 while ( rightOffset >= 0 ) {
1381 if ( suffixes.contains( parts[ rightOffset ] ) ) { 1381 if ( suffixes.contains( parts[ rightOffset ] ) ) {
1382 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " ")); 1382 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " "));
1383 rightOffset--; 1383 rightOffset--;
1384 } else 1384 } else
1385 break; 1385 break;
1386 } 1386 }
1387 setSuffix( suffix ); 1387 setSuffix( suffix );
1388 1388
1389 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) { 1389 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) {
1390 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] ); 1390 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] );
1391 rightOffset--; 1391 rightOffset--;
1392 } else 1392 } else
1393 setFamilyName( parts[ rightOffset ] ); 1393 setFamilyName( parts[ rightOffset ] );
1394 1394
1395 QString prefix; 1395 QString prefix;
1396 while ( leftOffset < rightOffset ) { 1396 while ( leftOffset < rightOffset ) {
1397 if ( titles.contains( parts[ leftOffset ] ) ) { 1397 if ( titles.contains( parts[ leftOffset ] ) ) {
1398 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1398 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1399 leftOffset++; 1399 leftOffset++;
1400 } else 1400 } else
1401 break; 1401 break;
1402 } 1402 }
1403 1403
1404 parts = QStringList::split( " ", part2 ); 1404 parts = QStringList::split( " ", part2 );
1405 1405
1406 leftOffset = 0; 1406 leftOffset = 0;
1407 rightOffset = parts.count(); 1407 rightOffset = parts.count();
1408 1408
1409 while ( leftOffset < rightOffset ) { 1409 while ( leftOffset < rightOffset ) {
1410 if ( titles.contains( parts[ leftOffset ] ) ) { 1410 if ( titles.contains( parts[ leftOffset ] ) ) {
1411 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1411 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1412 leftOffset++; 1412 leftOffset++;
1413 } else 1413 } else
1414 break; 1414 break;
1415 } 1415 }
1416 setPrefix( prefix ); 1416 setPrefix( prefix );
1417 1417
1418 if ( leftOffset < rightOffset ) { 1418 if ( leftOffset < rightOffset ) {
1419 setGivenName( parts[ leftOffset ] ); 1419 setGivenName( parts[ leftOffset ] );
1420 leftOffset++; 1420 leftOffset++;
1421 } 1421 }
1422 1422
1423 QString additionalName; 1423 QString additionalName;
1424 while ( leftOffset < rightOffset ) { 1424 while ( leftOffset < rightOffset ) {
1425 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1425 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1426 leftOffset++; 1426 leftOffset++;
1427 } 1427 }
1428 setAdditionalName( additionalName ); 1428 setAdditionalName( additionalName );
1429 } 1429 }
1430} 1430}
1431 1431
1432QString Addressee::realName() const 1432QString Addressee::realName() const
1433{ 1433{
1434 if ( !formattedName().isEmpty() ) 1434 if ( !formattedName().isEmpty() )
1435 return formattedName(); 1435 return formattedName();
1436 1436
1437 QString n = assembledName(); 1437 QString n = assembledName();
1438 1438
1439 if ( n.isEmpty() ) 1439 if ( n.isEmpty() )
1440 n = name(); 1440 n = name();
1441 1441
1442 return n; 1442 return n;
1443} 1443}
1444 1444
1445QString Addressee::assembledName() const 1445QString Addressee::assembledName() const
1446{ 1446{
1447 QString name = prefix() + " " + givenName() + " " + additionalName() + " " + 1447 QString name = prefix() + " " + givenName() + " " + additionalName() + " " +
1448 familyName() + " " + suffix(); 1448 familyName() + " " + suffix();
1449 1449
1450 return name.simplifyWhiteSpace(); 1450 return name.simplifyWhiteSpace();
1451} 1451}
1452 1452
1453QString Addressee::fullEmail( const QString &email ) const 1453QString Addressee::fullEmail( const QString &email ) const
1454{ 1454{
1455 QString e; 1455 QString e;
1456 if ( email.isNull() ) { 1456 if ( email.isNull() ) {
1457 e = preferredEmail(); 1457 e = preferredEmail();
1458 } else { 1458 } else {
1459 e = email; 1459 e = email;
1460 } 1460 }
1461 if ( e.isEmpty() ) return QString::null; 1461 if ( e.isEmpty() ) return QString::null;
1462 1462
1463 QString text; 1463 QString text;
1464 if ( realName().isEmpty() ) 1464 if ( realName().isEmpty() )
1465 text = e; 1465 text = e;
1466 else 1466 else
1467 text = assembledName() + " <" + e + ">"; 1467 text = assembledName() + " <" + e + ">";
1468 1468
1469 return text; 1469 return text;
1470} 1470}
1471 1471
1472void Addressee::insertEmail( const QString &email, bool preferred ) 1472void Addressee::insertEmail( const QString &email, bool preferred )
1473{ 1473{
1474 detach(); 1474 detach();
1475 1475
1476 QStringList::Iterator it = mData->emails.find( email ); 1476 QStringList::Iterator it = mData->emails.find( email );
1477 1477
1478 if ( it != mData->emails.end() ) { 1478 if ( it != mData->emails.end() ) {
1479 if ( !preferred || it == mData->emails.begin() ) return; 1479 if ( !preferred || it == mData->emails.begin() ) return;
1480 mData->emails.remove( it ); 1480 mData->emails.remove( it );
1481 mData->emails.prepend( email ); 1481 mData->emails.prepend( email );
1482 } else { 1482 } else {
1483 if ( preferred ) { 1483 if ( preferred ) {
1484 mData->emails.prepend( email ); 1484 mData->emails.prepend( email );
1485 } else { 1485 } else {
1486 mData->emails.append( email ); 1486 mData->emails.append( email );
1487 } 1487 }
1488 } 1488 }
1489} 1489}
1490 1490
1491void Addressee::removeEmail( const QString &email ) 1491void Addressee::removeEmail( const QString &email )
1492{ 1492{
1493 detach(); 1493 detach();
1494 1494
1495 QStringList::Iterator it = mData->emails.find( email ); 1495 QStringList::Iterator it = mData->emails.find( email );
1496 if ( it == mData->emails.end() ) return; 1496 if ( it == mData->emails.end() ) return;
1497 1497
1498 mData->emails.remove( it ); 1498 mData->emails.remove( it );
1499} 1499}
1500 1500
1501QString Addressee::preferredEmail() const 1501QString Addressee::preferredEmail() const
1502{ 1502{
1503 if ( mData->emails.count() == 0 ) return QString::null; 1503 if ( mData->emails.count() == 0 ) return QString::null;
1504 else return mData->emails.first(); 1504 else return mData->emails.first();
1505} 1505}
1506 1506
1507QStringList Addressee::emails() const 1507QStringList Addressee::emails() const
1508{ 1508{
1509 return mData->emails; 1509 return mData->emails;
1510} 1510}
1511void Addressee::setEmails( const QStringList& emails ) { 1511void Addressee::setEmails( const QStringList& emails ) {
1512 detach(); 1512 detach();
1513 mData->emails = emails; 1513 mData->emails = emails;
1514} 1514}
1515void Addressee::insertPhoneNumber( const PhoneNumber &phoneNumber ) 1515void Addressee::insertPhoneNumber( const PhoneNumber &phoneNumber )
1516{ 1516{
1517 detach(); 1517 detach();
1518 mData->empty = false; 1518 mData->empty = false;
1519 1519
1520 PhoneNumber::List::Iterator it; 1520 PhoneNumber::List::Iterator it;
1521 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1521 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1522 if ( (*it).id() == phoneNumber.id() ) { 1522 if ( (*it).id() == phoneNumber.id() ) {
1523 *it = phoneNumber; 1523 *it = phoneNumber;
1524 return; 1524 return;
1525 } 1525 }
1526 } 1526 }
1527 mData->phoneNumbers.append( phoneNumber ); 1527 mData->phoneNumbers.append( phoneNumber );
1528} 1528}
1529 1529
1530void Addressee::removePhoneNumber( const PhoneNumber &phoneNumber ) 1530void Addressee::removePhoneNumber( const PhoneNumber &phoneNumber )
1531{ 1531{
1532 detach(); 1532 detach();
1533 1533
1534 PhoneNumber::List::Iterator it; 1534 PhoneNumber::List::Iterator it;
1535 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1535 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1536 if ( (*it).id() == phoneNumber.id() ) { 1536 if ( (*it).id() == phoneNumber.id() ) {
1537 mData->phoneNumbers.remove( it ); 1537 mData->phoneNumbers.remove( it );
1538 return; 1538 return;
1539 } 1539 }
1540 } 1540 }
1541} 1541}
1542 1542
1543PhoneNumber Addressee::phoneNumber( int type ) const 1543PhoneNumber Addressee::phoneNumber( int type ) const
1544{ 1544{
1545 PhoneNumber phoneNumber( "", type ); 1545 PhoneNumber phoneNumber( "", type );
1546 PhoneNumber::List::ConstIterator it; 1546 PhoneNumber::List::ConstIterator it;
1547 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1547 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1548 if ( matchBinaryPatternP( (*it).type(), type ) ) { 1548 if ( matchBinaryPatternP( (*it).type(), type ) ) {
1549 if ( (*it).type() & PhoneNumber::Pref ) 1549 if ( (*it).type() & PhoneNumber::Pref )
1550 return (*it); 1550 return (*it);
1551 else if ( phoneNumber.number().isEmpty() ) 1551 else if ( phoneNumber.number().isEmpty() )
1552 phoneNumber = (*it); 1552 phoneNumber = (*it);
1553 } 1553 }
1554 } 1554 }
1555 1555
1556 return phoneNumber; 1556 return phoneNumber;
1557} 1557}
1558 1558
1559PhoneNumber::List Addressee::phoneNumbers() const 1559PhoneNumber::List Addressee::phoneNumbers() const
1560{ 1560{
1561 return mData->phoneNumbers; 1561 return mData->phoneNumbers;
1562} 1562}
1563 1563
1564PhoneNumber::List Addressee::phoneNumbers( int type ) const 1564PhoneNumber::List Addressee::phoneNumbers( int type ) const
1565{ 1565{
1566 PhoneNumber::List list; 1566 PhoneNumber::List list;
1567 1567
1568 PhoneNumber::List::ConstIterator it; 1568 PhoneNumber::List::ConstIterator it;
1569 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1569 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1570 if ( matchBinaryPattern( (*it).type(), type ) ) { 1570 if ( matchBinaryPattern( (*it).type(), type ) ) {
1571 list.append( *it ); 1571 list.append( *it );
1572 } 1572 }
1573 } 1573 }
1574 return list; 1574 return list;
1575} 1575}
1576 1576
1577PhoneNumber Addressee::findPhoneNumber( const QString &id ) const 1577PhoneNumber Addressee::findPhoneNumber( const QString &id ) const
1578{ 1578{
1579 PhoneNumber::List::ConstIterator it; 1579 PhoneNumber::List::ConstIterator it;
1580 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1580 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1581 if ( (*it).id() == id ) { 1581 if ( (*it).id() == id ) {
1582 return *it; 1582 return *it;
1583 } 1583 }
1584 } 1584 }
1585 return PhoneNumber(); 1585 return PhoneNumber();
1586} 1586}
1587 1587
1588void Addressee::insertKey( const Key &key ) 1588void Addressee::insertKey( const Key &key )
1589{ 1589{
1590 detach(); 1590 detach();
1591 mData->empty = false; 1591 mData->empty = false;
1592 1592
1593 Key::List::Iterator it; 1593 Key::List::Iterator it;
1594 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1594 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1595 if ( (*it).id() == key.id() ) { 1595 if ( (*it).id() == key.id() ) {
1596 *it = key; 1596 *it = key;
1597 return; 1597 return;
1598 } 1598 }
1599 } 1599 }
1600 mData->keys.append( key ); 1600 mData->keys.append( key );
1601} 1601}
1602 1602
1603void Addressee::removeKey( const Key &key ) 1603void Addressee::removeKey( const Key &key )
1604{ 1604{
1605 detach(); 1605 detach();
1606 1606
1607 Key::List::Iterator it; 1607 Key::List::Iterator it;
1608 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1608 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1609 if ( (*it).id() == key.id() ) { 1609 if ( (*it).id() == key.id() ) {
1610 mData->keys.remove( key ); 1610 mData->keys.remove( key );
1611 return; 1611 return;
1612 } 1612 }
1613 } 1613 }
1614} 1614}
1615 1615
1616Key Addressee::key( int type, QString customTypeString ) const 1616Key Addressee::key( int type, QString customTypeString ) const
1617{ 1617{
1618 Key::List::ConstIterator it; 1618 Key::List::ConstIterator it;
1619 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1619 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1620 if ( (*it).type() == type ) { 1620 if ( (*it).type() == type ) {
1621 if ( type == Key::Custom ) { 1621 if ( type == Key::Custom ) {
1622 if ( customTypeString.isEmpty() ) { 1622 if ( customTypeString.isEmpty() ) {
1623 return *it; 1623 return *it;
1624 } else { 1624 } else {
1625 if ( (*it).customTypeString() == customTypeString ) 1625 if ( (*it).customTypeString() == customTypeString )
1626 return (*it); 1626 return (*it);
1627 } 1627 }
1628 } else { 1628 } else {
1629 return *it; 1629 return *it;
1630 } 1630 }
1631 } 1631 }
1632 } 1632 }
1633 return Key( QString(), type ); 1633 return Key( QString(), type );
1634} 1634}
1635void Addressee::setKeys( const Key::List& list ) { 1635void Addressee::setKeys( const Key::List& list ) {
1636 detach(); 1636 detach();
1637 mData->keys = list; 1637 mData->keys = list;
1638} 1638}
1639 1639
1640Key::List Addressee::keys() const 1640Key::List Addressee::keys() const
1641{ 1641{
1642 return mData->keys; 1642 return mData->keys;
1643} 1643}
1644 1644
1645Key::List Addressee::keys( int type, QString customTypeString ) const 1645Key::List Addressee::keys( int type, QString customTypeString ) const
1646{ 1646{
1647 Key::List list; 1647 Key::List list;
1648 1648
1649 Key::List::ConstIterator it; 1649 Key::List::ConstIterator it;
1650 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1650 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1651 if ( (*it).type() == type ) { 1651 if ( (*it).type() == type ) {
1652 if ( type == Key::Custom ) { 1652 if ( type == Key::Custom ) {
1653 if ( customTypeString.isEmpty() ) { 1653 if ( customTypeString.isEmpty() ) {
1654 list.append(*it); 1654 list.append(*it);
1655 } else { 1655 } else {
1656 if ( (*it).customTypeString() == customTypeString ) 1656 if ( (*it).customTypeString() == customTypeString )
1657 list.append(*it); 1657 list.append(*it);
1658 } 1658 }
1659 } else { 1659 } else {
1660 list.append(*it); 1660 list.append(*it);
1661 } 1661 }
1662 } 1662 }
1663 } 1663 }
1664 return list; 1664 return list;
1665} 1665}
1666 1666
1667Key Addressee::findKey( const QString &id ) const 1667Key Addressee::findKey( const QString &id ) const
1668{ 1668{
1669 Key::List::ConstIterator it; 1669 Key::List::ConstIterator it;
1670 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1670 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1671 if ( (*it).id() == id ) { 1671 if ( (*it).id() == id ) {
1672 return *it; 1672 return *it;
1673 } 1673 }
1674 } 1674 }
1675 return Key(); 1675 return Key();
1676} 1676}
1677 1677
1678QString Addressee::asString() const 1678QString Addressee::asString() const
1679{ 1679{
1680 return "Smith, agent Smith..."; 1680 return "Smith, agent Smith...";
1681} 1681}
1682 1682
1683void Addressee::dump() const 1683void Addressee::dump() const
1684{ 1684{
1685 return; 1685 return;
1686 kdDebug(5700) << "Addressee {" << endl; 1686 kdDebug(5700) << "Addressee {" << endl;
1687 1687
1688 kdDebug(5700) << " Uid: '" << uid() << "'" << endl; 1688 kdDebug(5700) << " Uid: '" << uid() << "'" << endl;
1689 1689
1690 kdDebug(5700) << " Name: '" << name() << "'" << endl; 1690 kdDebug(5700) << " Name: '" << name() << "'" << endl;
1691 kdDebug(5700) << " FormattedName: '" << formattedName() << "'" << endl; 1691 kdDebug(5700) << " FormattedName: '" << formattedName() << "'" << endl;
1692 kdDebug(5700) << " FamilyName: '" << familyName() << "'" << endl; 1692 kdDebug(5700) << " FamilyName: '" << familyName() << "'" << endl;
1693 kdDebug(5700) << " GivenName: '" << givenName() << "'" << endl; 1693 kdDebug(5700) << " GivenName: '" << givenName() << "'" << endl;
1694 kdDebug(5700) << " AdditionalName: '" << additionalName() << "'" << endl; 1694 kdDebug(5700) << " AdditionalName: '" << additionalName() << "'" << endl;
1695 kdDebug(5700) << " Prefix: '" << prefix() << "'" << endl; 1695 kdDebug(5700) << " Prefix: '" << prefix() << "'" << endl;
1696 kdDebug(5700) << " Suffix: '" << suffix() << "'" << endl; 1696 kdDebug(5700) << " Suffix: '" << suffix() << "'" << endl;
1697 kdDebug(5700) << " NickName: '" << nickName() << "'" << endl; 1697 kdDebug(5700) << " NickName: '" << nickName() << "'" << endl;
1698 kdDebug(5700) << " Birthday: '" << birthday().toString() << "'" << endl; 1698 kdDebug(5700) << " Birthday: '" << birthday().toString() << "'" << endl;
1699 kdDebug(5700) << " Mailer: '" << mailer() << "'" << endl; 1699 kdDebug(5700) << " Mailer: '" << mailer() << "'" << endl;
1700 kdDebug(5700) << " TimeZone: '" << timeZone().asString() << "'" << endl; 1700 kdDebug(5700) << " TimeZone: '" << timeZone().asString() << "'" << endl;
1701 kdDebug(5700) << " Geo: '" << geo().asString() << "'" << endl; 1701 kdDebug(5700) << " Geo: '" << geo().asString() << "'" << endl;
1702 kdDebug(5700) << " Title: '" << title() << "'" << endl; 1702 kdDebug(5700) << " Title: '" << title() << "'" << endl;
1703 kdDebug(5700) << " Role: '" << role() << "'" << endl; 1703 kdDebug(5700) << " Role: '" << role() << "'" << endl;
1704 kdDebug(5700) << " Organization: '" << organization() << "'" << endl; 1704 kdDebug(5700) << " Organization: '" << organization() << "'" << endl;
1705 kdDebug(5700) << " Note: '" << note() << "'" << endl; 1705 kdDebug(5700) << " Note: '" << note() << "'" << endl;
1706 kdDebug(5700) << " ProductId: '" << productId() << "'" << endl; 1706 kdDebug(5700) << " ProductId: '" << productId() << "'" << endl;
1707 kdDebug(5700) << " Revision: '" << revision().toString() << "'" << endl; 1707 kdDebug(5700) << " Revision: '" << revision().toString() << "'" << endl;
1708 kdDebug(5700) << " SortString: '" << sortString() << "'" << endl; 1708 kdDebug(5700) << " SortString: '" << sortString() << "'" << endl;
1709 kdDebug(5700) << " Url: '" << url().url() << "'" << endl; 1709 kdDebug(5700) << " Url: '" << url().url() << "'" << endl;
1710 kdDebug(5700) << " Secrecy: '" << secrecy().asString() << "'" << endl; 1710 kdDebug(5700) << " Secrecy: '" << secrecy().asString() << "'" << endl;
1711 kdDebug(5700) << " Logo: '" << logo().asString() << "'" << endl; 1711 kdDebug(5700) << " Logo: '" << logo().asString() << "'" << endl;
1712 kdDebug(5700) << " Photo: '" << photo().asString() << "'" << endl; 1712 kdDebug(5700) << " Photo: '" << photo().asString() << "'" << endl;
1713 kdDebug(5700) << " Sound: '" << sound().asString() << "'" << endl; 1713 kdDebug(5700) << " Sound: '" << sound().asString() << "'" << endl;
1714 kdDebug(5700) << " Agent: '" << agent().asString() << "'" << endl; 1714 kdDebug(5700) << " Agent: '" << agent().asString() << "'" << endl;
1715 1715
1716 kdDebug(5700) << " Emails {" << endl; 1716 kdDebug(5700) << " Emails {" << endl;
1717 QStringList e = emails(); 1717 QStringList e = emails();
1718 QStringList::ConstIterator it; 1718 QStringList::ConstIterator it;
1719 for( it = e.begin(); it != e.end(); ++it ) { 1719 for( it = e.begin(); it != e.end(); ++it ) {
1720 kdDebug(5700) << " " << (*it) << endl; 1720 kdDebug(5700) << " " << (*it) << endl;
1721 } 1721 }
1722 kdDebug(5700) << " }" << endl; 1722 kdDebug(5700) << " }" << endl;
1723 1723
1724 kdDebug(5700) << " PhoneNumbers {" << endl; 1724 kdDebug(5700) << " PhoneNumbers {" << endl;
1725 PhoneNumber::List p = phoneNumbers(); 1725 PhoneNumber::List p = phoneNumbers();
1726 PhoneNumber::List::ConstIterator it2; 1726 PhoneNumber::List::ConstIterator it2;
1727 for( it2 = p.begin(); it2 != p.end(); ++it2 ) { 1727 for( it2 = p.begin(); it2 != p.end(); ++it2 ) {
1728 kdDebug(5700) << " Type: " << int((*it2).type()) << " Number: " << (*it2).number() << endl; 1728 kdDebug(5700) << " Type: " << int((*it2).type()) << " Number: " << (*it2).number() << endl;
1729 } 1729 }
1730 kdDebug(5700) << " }" << endl; 1730 kdDebug(5700) << " }" << endl;
1731 1731
1732 Address::List a = addresses(); 1732 Address::List a = addresses();
1733 Address::List::ConstIterator it3; 1733 Address::List::ConstIterator it3;
1734 for( it3 = a.begin(); it3 != a.end(); ++it3 ) { 1734 for( it3 = a.begin(); it3 != a.end(); ++it3 ) {
1735 (*it3).dump(); 1735 (*it3).dump();
1736 } 1736 }
1737 1737
1738 kdDebug(5700) << " Keys {" << endl; 1738 kdDebug(5700) << " Keys {" << endl;
1739 Key::List k = keys(); 1739 Key::List k = keys();
1740 Key::List::ConstIterator it4; 1740 Key::List::ConstIterator it4;
1741 for( it4 = k.begin(); it4 != k.end(); ++it4 ) { 1741 for( it4 = k.begin(); it4 != k.end(); ++it4 ) {
1742 kdDebug(5700) << " Type: " << int((*it4).type()) << 1742 kdDebug(5700) << " Type: " << int((*it4).type()) <<
1743 " Key: " << (*it4).textData() << 1743 " Key: " << (*it4).textData() <<
1744 " CustomString: " << (*it4).customTypeString() << endl; 1744 " CustomString: " << (*it4).customTypeString() << endl;
1745 } 1745 }
1746 kdDebug(5700) << " }" << endl; 1746 kdDebug(5700) << " }" << endl;
1747 1747
1748 kdDebug(5700) << "}" << endl; 1748 kdDebug(5700) << "}" << endl;
1749} 1749}
1750 1750
1751 1751
1752void Addressee::insertAddress( const Address &address ) 1752void Addressee::insertAddress( const Address &address )
1753{ 1753{
1754 detach(); 1754 detach();
1755 mData->empty = false; 1755 mData->empty = false;
1756 1756
1757 Address::List::Iterator it; 1757 Address::List::Iterator it;
1758 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1758 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1759 if ( (*it).id() == address.id() ) { 1759 if ( (*it).id() == address.id() ) {
1760 *it = address; 1760 *it = address;
1761 return; 1761 return;
1762 } 1762 }
1763 } 1763 }
1764 mData->addresses.append( address ); 1764 mData->addresses.append( address );
1765} 1765}
1766 1766
1767void Addressee::removeAddress( const Address &address ) 1767void Addressee::removeAddress( const Address &address )
1768{ 1768{
1769 detach(); 1769 detach();
1770 1770
1771 Address::List::Iterator it; 1771 Address::List::Iterator it;
1772 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1772 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1773 if ( (*it).id() == address.id() ) { 1773 if ( (*it).id() == address.id() ) {
1774 mData->addresses.remove( it ); 1774 mData->addresses.remove( it );
1775 return; 1775 return;
1776 } 1776 }
1777 } 1777 }
1778} 1778}
1779 1779
1780Address Addressee::address( int type ) const 1780Address Addressee::address( int type ) const
1781{ 1781{
1782 Address address( type ); 1782 Address address( type );
1783 Address::List::ConstIterator it; 1783 Address::List::ConstIterator it;
1784 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1784 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1785 if ( matchBinaryPatternA( (*it).type(), type ) ) { 1785 if ( matchBinaryPatternA( (*it).type(), type ) ) {
1786 if ( (*it).type() & Address::Pref ) 1786 if ( (*it).type() & Address::Pref )
1787 return (*it); 1787 return (*it);
1788 else if ( address.isEmpty() ) 1788 else if ( address.isEmpty() )
1789 address = (*it); 1789 address = (*it);
1790 } 1790 }
1791 } 1791 }
1792 1792
1793 return address; 1793 return address;
1794} 1794}
1795 1795
1796Address::List Addressee::addresses() const 1796Address::List Addressee::addresses() const
1797{ 1797{
1798 return mData->addresses; 1798 return mData->addresses;
1799} 1799}
1800 1800
1801Address::List Addressee::addresses( int type ) const 1801Address::List Addressee::addresses( int type ) const
1802{ 1802{
1803 Address::List list; 1803 Address::List list;
1804 1804
1805 Address::List::ConstIterator it; 1805 Address::List::ConstIterator it;
1806 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1806 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1807 if ( matchBinaryPattern( (*it).type(), type ) ) { 1807 if ( matchBinaryPattern( (*it).type(), type ) ) {
1808 list.append( *it ); 1808 list.append( *it );
1809 } 1809 }
1810 } 1810 }
1811 1811
1812 return list; 1812 return list;
1813} 1813}
1814 1814
1815Address Addressee::findAddress( const QString &id ) const 1815Address Addressee::findAddress( const QString &id ) const
1816{ 1816{
1817 Address::List::ConstIterator it; 1817 Address::List::ConstIterator it;
1818 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1818 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1819 if ( (*it).id() == id ) { 1819 if ( (*it).id() == id ) {
1820 return *it; 1820 return *it;
1821 } 1821 }
1822 } 1822 }
1823 return Address(); 1823 return Address();
1824} 1824}
1825 1825
1826void Addressee::insertCategory( const QString &c ) 1826void Addressee::insertCategory( const QString &c )
1827{ 1827{
1828 detach(); 1828 detach();
1829 mData->empty = false; 1829 mData->empty = false;
1830 1830
1831 if ( mData->categories.contains( c ) ) return; 1831 if ( mData->categories.contains( c ) ) return;
1832 1832
1833 mData->categories.append( c ); 1833 mData->categories.append( c );
1834} 1834}
1835 1835
1836void Addressee::removeCategory( const QString &c ) 1836void Addressee::removeCategory( const QString &c )
1837{ 1837{
1838 detach(); 1838 detach();
1839 1839
1840 QStringList::Iterator it = mData->categories.find( c ); 1840 QStringList::Iterator it = mData->categories.find( c );
1841 if ( it == mData->categories.end() ) return; 1841 if ( it == mData->categories.end() ) return;
1842 1842
1843 mData->categories.remove( it ); 1843 mData->categories.remove( it );
1844} 1844}
1845 1845
1846bool Addressee::hasCategory( const QString &c ) const 1846bool Addressee::hasCategory( const QString &c ) const
1847{ 1847{
1848 return ( mData->categories.contains( c ) ); 1848 return ( mData->categories.contains( c ) );
1849} 1849}
1850 1850
1851void Addressee::setCategories( const QStringList &c ) 1851void Addressee::setCategories( const QStringList &c )
1852{ 1852{
1853 detach(); 1853 detach();
1854 mData->empty = false; 1854 mData->empty = false;
1855 1855
1856 mData->categories = c; 1856 mData->categories = c;
1857} 1857}
1858 1858
1859QStringList Addressee::categories() const 1859QStringList Addressee::categories() const
1860{ 1860{
1861 return mData->categories; 1861 return mData->categories;
1862} 1862}
1863 1863
1864void Addressee::insertCustom( const QString &app, const QString &name, 1864void Addressee::insertCustom( const QString &app, const QString &name,
1865 const QString &value ) 1865 const QString &value )
1866{ 1866{
1867 if ( value.isNull() || name.isEmpty() || app.isEmpty() ) return; 1867 if ( value.isNull() || name.isEmpty() || app.isEmpty() ) return;
1868 1868
1869 detach(); 1869 detach();
1870 mData->empty = false; 1870 mData->empty = false;
1871 1871
1872 QString qualifiedName = app + "-" + name + ":"; 1872 QString qualifiedName = app + "-" + name + ":";
1873 1873
1874 QStringList::Iterator it; 1874 QStringList::Iterator it;
1875 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) { 1875 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
1876 if ( (*it).startsWith( qualifiedName ) ) { 1876 if ( (*it).startsWith( qualifiedName ) ) {
1877 (*it) = qualifiedName + value; 1877 (*it) = qualifiedName + value;
1878 return; 1878 return;
1879 } 1879 }
1880 } 1880 }
1881 mData->custom.append( qualifiedName + value ); 1881 mData->custom.append( qualifiedName + value );
1882} 1882}
1883 1883
1884void Addressee::removeCustom( const QString &app, const QString &name) 1884void Addressee::removeCustom( const QString &app, const QString &name)
1885{ 1885{
1886 detach(); 1886 detach();
1887 1887
1888 QString qualifiedName = app + "-" + name + ":"; 1888 QString qualifiedName = app + "-" + name + ":";
1889 1889
1890 QStringList::Iterator it; 1890 QStringList::Iterator it;
1891 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) { 1891 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
1892 if ( (*it).startsWith( qualifiedName ) ) { 1892 if ( (*it).startsWith( qualifiedName ) ) {
1893 mData->custom.remove( it ); 1893 mData->custom.remove( it );
1894 return; 1894 return;
1895 } 1895 }
1896 } 1896 }
1897} 1897}
1898 1898
1899QString Addressee::custom( const QString &app, const QString &name ) const 1899QString Addressee::custom( const QString &app, const QString &name ) const
1900{ 1900{
1901 QString qualifiedName = app + "-" + name + ":"; 1901 QString qualifiedName = app + "-" + name + ":";
1902 QString value; 1902 QString value;
1903 1903
1904 QStringList::ConstIterator it; 1904 QStringList::ConstIterator it;
1905 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) { 1905 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
1906 if ( (*it).startsWith( qualifiedName ) ) { 1906 if ( (*it).startsWith( qualifiedName ) ) {
1907 value = (*it).mid( (*it).find( ":" ) + 1 ); 1907 value = (*it).mid( (*it).find( ":" ) + 1 );
1908 break; 1908 break;
1909 } 1909 }
1910 } 1910 }
1911 1911
1912 return value; 1912 return value;
1913} 1913}
1914 1914
1915void Addressee::setCustoms( const QStringList &l ) 1915void Addressee::setCustoms( const QStringList &l )
1916{ 1916{
1917 detach(); 1917 detach();
1918 mData->empty = false; 1918 mData->empty = false;
1919 1919
1920 mData->custom = l; 1920 mData->custom = l;
1921} 1921}
1922 1922
1923QStringList Addressee::customs() const 1923QStringList Addressee::customs() const
1924{ 1924{
1925 return mData->custom; 1925 return mData->custom;
1926} 1926}
1927 1927
1928void Addressee::parseEmailAddress( const QString &rawEmail, QString &fullName, 1928void Addressee::parseEmailAddress( const QString &rawEmail, QString &fullName,
1929 QString &email) 1929 QString &email)
1930{ 1930{
1931 int startPos, endPos, len; 1931 int startPos, endPos, len;
1932 QString partA, partB, result; 1932 QString partA, partB, result;
1933 char endCh = '>'; 1933 char endCh = '>';
1934 1934
1935 startPos = rawEmail.find('<'); 1935 startPos = rawEmail.find('<');
1936 if (startPos < 0) 1936 if (startPos < 0)
1937 { 1937 {
1938 startPos = rawEmail.find('('); 1938 startPos = rawEmail.find('(');
1939 endCh = ')'; 1939 endCh = ')';
1940 } 1940 }
1941 if (startPos < 0) 1941 if (startPos < 0)
1942 { 1942 {
1943 // We couldn't find any separators, so we assume the whole string 1943 // We couldn't find any separators, so we assume the whole string
1944 // is the email address 1944 // is the email address
1945 email = rawEmail; 1945 email = rawEmail;
1946 fullName = ""; 1946 fullName = "";
1947 } 1947 }
1948 else 1948 else
1949 { 1949 {
1950 // We have a start position, try to find an end 1950 // We have a start position, try to find an end
1951 endPos = rawEmail.find(endCh, startPos+1); 1951 endPos = rawEmail.find(endCh, startPos+1);
1952 1952
1953 if (endPos < 0) 1953 if (endPos < 0)
1954 { 1954 {
1955 // We couldn't find the end of the email address. We can only 1955 // We couldn't find the end of the email address. We can only
1956 // assume the entire string is the email address. 1956 // assume the entire string is the email address.
1957 email = rawEmail; 1957 email = rawEmail;
1958 fullName = ""; 1958 fullName = "";
1959 } 1959 }
1960 else 1960 else
1961 { 1961 {
1962 // We have a start and end to the email address 1962 // We have a start and end to the email address
1963 1963
1964 // Grab the name part 1964 // Grab the name part
1965 fullName = rawEmail.left(startPos).stripWhiteSpace(); 1965 fullName = rawEmail.left(startPos).stripWhiteSpace();
1966 1966
1967 // grab the email part 1967 // grab the email part
1968 email = rawEmail.mid(startPos+1, endPos-startPos-1).stripWhiteSpace(); 1968 email = rawEmail.mid(startPos+1, endPos-startPos-1).stripWhiteSpace();
1969 1969
1970 // Check that we do not have any extra characters on the end of the 1970 // Check that we do not have any extra characters on the end of the
1971 // strings 1971 // strings
1972 len = fullName.length(); 1972 len = fullName.length();
1973 if (fullName[0]=='"' && fullName[len-1]=='"') 1973 if (fullName[0]=='"' && fullName[len-1]=='"')
1974 fullName = fullName.mid(1, len-2); 1974 fullName = fullName.mid(1, len-2);
1975 else if (fullName[0]=='<' && fullName[len-1]=='>') 1975 else if (fullName[0]=='<' && fullName[len-1]=='>')
1976 fullName = fullName.mid(1, len-2); 1976 fullName = fullName.mid(1, len-2);
1977 else if (fullName[0]=='(' && fullName[len-1]==')') 1977 else if (fullName[0]=='(' && fullName[len-1]==')')
1978 fullName = fullName.mid(1, len-2); 1978 fullName = fullName.mid(1, len-2);
1979 } 1979 }
1980 } 1980 }
1981} 1981}
1982 1982
1983void Addressee::setResource( Resource *resource ) 1983void Addressee::setResource( Resource *resource )
1984{ 1984{
1985 detach(); 1985 detach();
1986 mData->resource = resource; 1986 mData->resource = resource;
1987} 1987}
1988 1988
1989Resource *Addressee::resource() const 1989Resource *Addressee::resource() const
1990{ 1990{
1991 return mData->resource; 1991 return mData->resource;
1992} 1992}
1993 1993
1994//US 1994//US
1995QString Addressee::resourceLabel() 1995QString Addressee::resourceLabel()
1996{ 1996{
1997 return i18n("Resource"); 1997 return i18n("Resource");
1998} 1998}
1999QString Addressee::categoryLabel()
2000{
2001 return i18n("Category");
2002}
1999 2003
2000void Addressee::setChanged( bool value ) 2004void Addressee::setChanged( bool value )
2001{ 2005{
2002 detach(); 2006 detach();
2003 mData->changed = value; 2007 mData->changed = value;
2004} 2008}
2005 2009
2006bool Addressee::changed() const 2010bool Addressee::changed() const
2007{ 2011{
2008 return mData->changed; 2012 return mData->changed;
2009} 2013}
2010 2014
2011void Addressee::setTagged( bool value ) 2015void Addressee::setTagged( bool value )
2012{ 2016{
2013 detach(); 2017 detach();
2014 mData->tagged = value; 2018 mData->tagged = value;
2015} 2019}
2016 2020
2017bool Addressee::tagged() const 2021bool Addressee::tagged() const
2018{ 2022{
2019 return mData->tagged; 2023 return mData->tagged;
2020} 2024}
2021 2025
2022QDataStream &KABC::operator<<( QDataStream &s, const Addressee &a ) 2026QDataStream &KABC::operator<<( QDataStream &s, const Addressee &a )
2023{ 2027{
2024 if (!a.mData) return s; 2028 if (!a.mData) return s;
2025 2029
2026 s << a.uid(); 2030 s << a.uid();
2027 2031
2028 s << a.mData->name; 2032 s << a.mData->name;
2029 s << a.mData->formattedName; 2033 s << a.mData->formattedName;
2030 s << a.mData->familyName; 2034 s << a.mData->familyName;
2031 s << a.mData->givenName; 2035 s << a.mData->givenName;
2032 s << a.mData->additionalName; 2036 s << a.mData->additionalName;
2033 s << a.mData->prefix; 2037 s << a.mData->prefix;
2034 s << a.mData->suffix; 2038 s << a.mData->suffix;
2035 s << a.mData->nickName; 2039 s << a.mData->nickName;
2036 s << a.mData->birthday; 2040 s << a.mData->birthday;
2037 s << a.mData->mailer; 2041 s << a.mData->mailer;
2038 s << a.mData->timeZone; 2042 s << a.mData->timeZone;
2039 s << a.mData->geo; 2043 s << a.mData->geo;
2040 s << a.mData->title; 2044 s << a.mData->title;
2041 s << a.mData->role; 2045 s << a.mData->role;
2042 s << a.mData->organization; 2046 s << a.mData->organization;
2043 s << a.mData->note; 2047 s << a.mData->note;
2044 s << a.mData->productId; 2048 s << a.mData->productId;
2045 s << a.mData->revision; 2049 s << a.mData->revision;
2046 s << a.mData->sortString; 2050 s << a.mData->sortString;
2047 s << a.mData->url; 2051 s << a.mData->url;
2048 s << a.mData->secrecy; 2052 s << a.mData->secrecy;
2049 s << a.mData->logo; 2053 s << a.mData->logo;
2050 s << a.mData->photo; 2054 s << a.mData->photo;
2051 s << a.mData->sound; 2055 s << a.mData->sound;
2052 s << a.mData->agent; 2056 s << a.mData->agent;
2053 s << a.mData->phoneNumbers; 2057 s << a.mData->phoneNumbers;
2054 s << a.mData->addresses; 2058 s << a.mData->addresses;
2055 s << a.mData->emails; 2059 s << a.mData->emails;
2056 s << a.mData->categories; 2060 s << a.mData->categories;
2057 s << a.mData->custom; 2061 s << a.mData->custom;
2058 s << a.mData->keys; 2062 s << a.mData->keys;
2059 return s; 2063 return s;
2060} 2064}
2061 2065
2062QDataStream &KABC::operator>>( QDataStream &s, Addressee &a ) 2066QDataStream &KABC::operator>>( QDataStream &s, Addressee &a )
2063{ 2067{
2064 if (!a.mData) return s; 2068 if (!a.mData) return s;
2065 2069
2066 s >> a.mData->uid; 2070 s >> a.mData->uid;
2067 2071
2068 s >> a.mData->name; 2072 s >> a.mData->name;
2069 s >> a.mData->formattedName; 2073 s >> a.mData->formattedName;
2070 s >> a.mData->familyName; 2074 s >> a.mData->familyName;
2071 s >> a.mData->givenName; 2075 s >> a.mData->givenName;
2072 s >> a.mData->additionalName; 2076 s >> a.mData->additionalName;
2073 s >> a.mData->prefix; 2077 s >> a.mData->prefix;
2074 s >> a.mData->suffix; 2078 s >> a.mData->suffix;
2075 s >> a.mData->nickName; 2079 s >> a.mData->nickName;
2076 s >> a.mData->birthday; 2080 s >> a.mData->birthday;
2077 s >> a.mData->mailer; 2081 s >> a.mData->mailer;
2078 s >> a.mData->timeZone; 2082 s >> a.mData->timeZone;
2079 s >> a.mData->geo; 2083 s >> a.mData->geo;
2080 s >> a.mData->title; 2084 s >> a.mData->title;
2081 s >> a.mData->role; 2085 s >> a.mData->role;
2082 s >> a.mData->organization; 2086 s >> a.mData->organization;
2083 s >> a.mData->note; 2087 s >> a.mData->note;
2084 s >> a.mData->productId; 2088 s >> a.mData->productId;
2085 s >> a.mData->revision; 2089 s >> a.mData->revision;
2086 s >> a.mData->sortString; 2090 s >> a.mData->sortString;
2087 s >> a.mData->url; 2091 s >> a.mData->url;
2088 s >> a.mData->secrecy; 2092 s >> a.mData->secrecy;
2089 s >> a.mData->logo; 2093 s >> a.mData->logo;
2090 s >> a.mData->photo; 2094 s >> a.mData->photo;
2091 s >> a.mData->sound; 2095 s >> a.mData->sound;
2092 s >> a.mData->agent; 2096 s >> a.mData->agent;
2093 s >> a.mData->phoneNumbers; 2097 s >> a.mData->phoneNumbers;
2094 s >> a.mData->addresses; 2098 s >> a.mData->addresses;
2095 s >> a.mData->emails; 2099 s >> a.mData->emails;
2096 s >> a.mData->categories; 2100 s >> a.mData->categories;
2097 s >> a.mData->custom; 2101 s >> a.mData->custom;
2098 s >> a.mData->keys; 2102 s >> a.mData->keys;
2099 2103
2100 a.mData->empty = false; 2104 a.mData->empty = false;
2101 2105
2102 return s; 2106 return s;
2103} 2107}
2104bool matchBinaryPattern( int value, int pattern ) 2108bool matchBinaryPattern( int value, int pattern )
2105{ 2109{
2106 /** 2110 /**
2107 We want to match all telephonnumbers/addresses which have the bits in the 2111 We want to match all telephonnumbers/addresses which have the bits in the
2108 pattern set. More are allowed. 2112 pattern set. More are allowed.
2109 if pattern == 0 we have a special handling, then we want only those with 2113 if pattern == 0 we have a special handling, then we want only those with
2110 exactly no bit set. 2114 exactly no bit set.
2111 */ 2115 */
2112 if ( pattern == 0 ) 2116 if ( pattern == 0 )
2113 return ( value == 0 ); 2117 return ( value == 0 );
2114 else 2118 else
2115 return ( pattern == ( pattern & value ) ); 2119 return ( pattern == ( pattern & value ) );
2116} 2120}
2117 2121
2118bool matchBinaryPatternP( int value, int pattern ) 2122bool matchBinaryPatternP( int value, int pattern )
2119{ 2123{
2120 2124
2121 if ( pattern == 0 ) 2125 if ( pattern == 0 )
2122 return ( value == 0 ); 2126 return ( value == 0 );
2123 else 2127 else
2124 return ( (pattern |PhoneNumber::Pref ) == ( value |PhoneNumber::Pref ) ); 2128 return ( (pattern |PhoneNumber::Pref ) == ( value |PhoneNumber::Pref ) );
2125} 2129}
2126bool matchBinaryPatternA( int value, int pattern ) 2130bool matchBinaryPatternA( int value, int pattern )
2127{ 2131{
2128 2132
2129 if ( pattern == 0 ) 2133 if ( pattern == 0 )
2130 return ( value == 0 ); 2134 return ( value == 0 );
2131 else 2135 else
2132 return ( (pattern | Address::Pref) == ( value | Address::Pref ) ); 2136 return ( (pattern | Address::Pref) == ( value | Address::Pref ) );
2133} 2137}