summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--bin/kdepim/kaddressbook/germantranslation.txt24
-rw-r--r--kabc/addressee.cpp74
-rw-r--r--kabc/addressee.h2
-rw-r--r--kabc/field.cpp10
-rw-r--r--kabc/phonenumber.cpp112
-rw-r--r--kabc/phonenumber.h5
-rw-r--r--kabc/vcard21parser.cpp14
-rw-r--r--kabc/vcardformatimpl.cpp4
-rw-r--r--kabc/vcardparser/vcardtool.cpp2
9 files changed, 211 insertions, 36 deletions
diff --git a/bin/kdepim/kaddressbook/germantranslation.txt b/bin/kdepim/kaddressbook/germantranslation.txt
index 8dd0a52..62e567e 100644
--- a/bin/kdepim/kaddressbook/germantranslation.txt
+++ b/bin/kdepim/kaddressbook/germantranslation.txt
@@ -105,25 +105,25 @@
105{ "Longitude:","Längengrad:" }, 105{ "Longitude:","Längengrad:" },
106{ "Edit Geo Data...","Edit geo Daten..." }, 106{ "Edit Geo Data...","Edit geo Daten..." },
107{ "Keys:","Schlüssel:" }, 107{ "Keys:","Schlüssel:" },
108{ "Add","Hinzu" }, 108{ "Add","Hinzu" },
109{ "Remove","Entf." }, 109{ "Remove","Entf." },
110{ "Export","Exportiere" }, 110{ "Export","Exportiere" },
111{ "&Misc","Verschiedenes" }, 111{ "&Misc","Verschiedenes" },
112{ "Photo","Foto" }, 112{ "Photo","Foto" },
113{ "Store as URL","Speichere als URL" }, 113{ "Store as URL","Speichere als URL" },
114{ "Logo","Logo" }, 114{ "Logo","Logo" },
115{ "&Images","B&ilder" }, 115{ "&Images","B&ilder" },
116{ "Home","Privat" }, 116{ "Home","Privat" },
117{ "Work","Geschäft" }, 117{ "Work","Arbeit" },
118{ "Mobile","Handy" }, 118{ "Mobile","Handy" },
119{ "Fax","Fax" }, 119{ "Fax","Fax" },
120{ "Contact Editor","Bearbeite Kontakt" }, 120{ "Contact Editor","Bearbeite Kontakt" },
121{ "&Mail...","&Mail..." }, 121{ "&Mail...","&Mail..." },
122{ "&Print...","Drucken..." }, 122{ "&Print...","Drucken..." },
123{ "&Save","&Speichern" }, 123{ "&Save","&Speichern" },
124{ "&New Contact...","&Neuer Kontakt..." }, 124{ "&New Contact...","&Neuer Kontakt..." },
125{ "Mail &vCard...","Mail &vCard..." }, 125{ "Mail &vCard...","Mail &vCard..." },
126{ "Selected to phone","Auswahl zum Telefon" }, 126{ "Selected to phone","Auswahl zum Telefon" },
127{ "Beam selected v&Card(s)","Beame ausgewählte v&Card(s)" }, 127{ "Beam selected v&Card(s)","Beame ausgewählte v&Card(s)" },
128{ "&Beam personal vCard","Beame persönliche vCard" }, 128{ "&Beam personal vCard","Beame persönliche vCard" },
129{ "&Edit Contact...","Bearbeite Kontakt..." }, 129{ "&Edit Contact...","Bearbeite Kontakt..." },
@@ -293,28 +293,28 @@
293{ "Home Address Locality","Privat Adresse Stadt" }, 293{ "Home Address Locality","Privat Adresse Stadt" },
294{ "Home Address Region","Privat Adresse Bundesland" }, 294{ "Home Address Region","Privat Adresse Bundesland" },
295{ "Home Address Postal Code","Privat Adresse PLZ" }, 295{ "Home Address Postal Code","Privat Adresse PLZ" },
296{ "Home Address Country","Privat Adresse Land" }, 296{ "Home Address Country","Privat Adresse Land" },
297{ "Home Address Label","Privat Adresse Label" }, 297{ "Home Address Label","Privat Adresse Label" },
298{ "Business Address Street","Büro Adresse Strasse" }, 298{ "Business Address Street","Büro Adresse Strasse" },
299{ "Business Address Locality","Büro Adresse Stadt" }, 299{ "Business Address Locality","Büro Adresse Stadt" },
300{ "Business Address Region","Büro Adresse Bundesland" }, 300{ "Business Address Region","Büro Adresse Bundesland" },
301{ "Business Address Postal Code","Büro Adresse PLZ" }, 301{ "Business Address Postal Code","Büro Adresse PLZ" },
302{ "Business Address Country","Büro Adresse Land" }, 302{ "Business Address Country","Büro Adresse Land" },
303{ "Business Address Label","Büro Adresse Label" }, 303{ "Business Address Label","Büro Adresse Label" },
304{ "Home Phone","Privat Telefon" }, 304{ "Home Phone","Privat Telefon" },
305{ "Business Phone","ro Telefon" }, 305{ "Business Phone","Arbeit Telefon" },
306{ "Mobile Phone","Handy" }, 306{ "Mobile Phone","Handy" },
307{ "Home Fax","Privat Fax" }, 307{ "Home Fax","Privat Fax" },
308{ "Business Fax","ro Fax" }, 308{ "Business Fax","Arbeit Fax" },
309{ "Car Phone","Autotelefon" }, 309{ "Car Phone","Autotelefon" },
310{ "ISDN","ISDN" }, 310{ "ISDN","ISDN" },
311{ "Pager","Pager" }, 311{ "Pager","Pager" },
312{ "Mail Client","Mail Klient" }, 312{ "Mail Client","Mail Klient" },
313{ "Title","Titel" }, 313{ "Title","Titel" },
314{ "Role","Rolle" }, 314{ "Role","Rolle" },
315{ "Note","Notiz" }, 315{ "Note","Notiz" },
316{ "URL","URL" }, 316{ "URL","URL" },
317{ "Resource","Resource" }, 317{ "Resource","Resource" },
318{ "SIP","SIP" }, 318{ "SIP","SIP" },
319{ "Default Filter","Default Filter" }, 319{ "Default Filter","Default Filter" },
320{ "The default filter will be activated whenever this view is displayed. This feature allows you to configure views that only interact with certain types of information based on the filter. Once the view is activated, the filter can be changed at anytime.","#The default filter will be activated whenever this view is displayed. This feature allows you to configure views that only interact with certain types of information based on the filter. Once the view is activated, the filter can be changed at anytime." }, 320{ "The default filter will be activated whenever this view is displayed. This feature allows you to configure views that only interact with certain types of information based on the filter. Once the view is activated, the filter can be changed at anytime.","#The default filter will be activated whenever this view is displayed. This feature allows you to configure views that only interact with certain types of information based on the filter. Once the view is activated, the filter can be changed at anytime." },
@@ -743,26 +743,26 @@
743{ "Clock skew of\nsyncing devices\nis %1 seconds!","Uhrzeitunterschied der\nsyncenden Geräte\nist %1 Sekunden!" }, 743{ "Clock skew of\nsyncing devices\nis %1 seconds!","Uhrzeitunterschied der\nsyncenden Geräte\nist %1 Sekunden!" },
744{ "Synchronize!","Synchronisiere!" }, 744{ "Synchronize!","Synchronisiere!" },
745{ "High clock skew!","Großer Uhrzeitunterschied!" }, 745{ "High clock skew!","Großer Uhrzeitunterschied!" },
746{ "ADJUST\nYOUR\nCLOCKS!","JUSTIERE\nDIE\nUHREN!" }, 746{ "ADJUST\nYOUR\nCLOCKS!","JUSTIERE\nDIE\nUHREN!" },
747{ "The clocks of the syncing\ndevices have a difference\nof more than 5 minutes.\nPlease adjust your clocks.\nYou may get wrong syncing results!\nPlease confirm synchronization!","Die Uhren der syncenden Geräte\nhaben einen Unterschied von\nmehr als 5 Minuten. Bitte die\nUhrzeiten anpassen. Sie können\nfalsche Sync-Resultate erhalten!\nBitte das Syncen bestätigen!" }, 747{ "The clocks of the syncing\ndevices have a difference\nof more than 5 minutes.\nPlease adjust your clocks.\nYou may get wrong syncing results!\nPlease confirm synchronization!","Die Uhren der syncenden Geräte\nhaben einen Unterschied von\nmehr als 5 Minuten. Bitte die\nUhrzeiten anpassen. Sie können\nfalsche Sync-Resultate erhalten!\nBitte das Syncen bestätigen!" },
748{ "Change search field enable jump bar","Ändere Suchfeld um Jumpbar anzuzeigen" }, 748{ "Change search field enable jump bar","Ändere Suchfeld um Jumpbar anzuzeigen" },
749{ "Search with '*' prefix (wildcard)","Suche mit '*' Prefix (Wildcard)" }, 749{ "Search with '*' prefix (wildcard)","Suche mit '*' Prefix (Wildcard)" },
750{ "Shrink searchfield in portrait view","Verkleinere Suchfeld im Portraitmodus" }, 750{ "Shrink searchfield in portrait view","Verkleinere Suchfeld im Portraitmodus" },
751{ "Edit new contact","Bearbeite neuen Kontakt" }, 751{ "Edit new contact","Bearbeite neuen Kontakt" },
752{ "Edit ","Bearbeite " }, 752{ "Edit ","Bearbeite " },
753{ "No contact changed!","Kein Kontakt verändert" }, 753{ "No contact changed!","Kein Kontakt verändert" },
754{ "%1 contacts changed!","%1 Kontakte geändert!" }, 754{ "%1 contacts changed!","%1 Kontakte geändert!" },
755{ "Mobile (home)","Handy (Arbeit)" }, 755{ "Mobile (home)","Handy (Privat)" },
756{ "Mobile (work)","Handy (Privat)" }, 756{ "Mobile (work)","Handy (Arbeit)" },
757{ "Def.Formatted Name","Def. Format. Name" }, 757{ "Def.Formatted Name","Def. Format. Name" },
758{ "Colors","Farben" }, 758{ "Colors","Farben" },
759{ "Alternating background of list views","Abwechselnder Hintergrund für Listen" }, 759{ "Alternating background of list views","Abwechselnder Hintergrund für Listen" },
760{ "Backup enabled","Backup angeschaltet" }, 760{ "Backup enabled","Backup angeschaltet" },
761{ "Use standard backup dir","Standard Backupverzeichnis" }, 761{ "Use standard backup dir","Standard Backupverzeichnis" },
762{ "Number of Backups:","Anzahl der Backups" }, 762{ "Number of Backups:","Anzahl der Backups" },
763{ "Make backup every ","Mache ein Backup alle " }, 763{ "Make backup every ","Mache ein Backup alle " },
764{ " days"," Tage" }, 764{ " days"," Tage" },
765{ "Creating backup ... please wait ...","Erzeuge Backup ... bitte warten ..." }, 765{ "Creating backup ... please wait ...","Erzeuge Backup ... bitte warten ..." },
766{ "Backup Failed!","Backup Problem!" }, 766{ "Backup Failed!","Backup Problem!" },
767{ "Try again now","Versuche jetzt nochmal" }, 767{ "Try again now","Versuche jetzt nochmal" },
768{ "Try again later","Versuche später nochmal" }, 768{ "Try again later","Versuche später nochmal" },
@@ -806,21 +806,27 @@
806{ "Writing back file ...","Schreibe Datei zurück..." }, 806{ "Writing back file ...","Schreibe Datei zurück..." },
807{ "Sending back file ...","Sende Datei zurück..." }, 807{ "Sending back file ...","Sende Datei zurück..." },
808{ "Eeek, there I am ticklish!","Huch, da bin ich kitzlig!" }, 808{ "Eeek, there I am ticklish!","Huch, da bin ich kitzlig!" },
809{ "Save using LOCAL storage","Speichere nutze LOCAL Pfad" }, 809{ "Save using LOCAL storage","Speichere nutze LOCAL Pfad" },
810{ "...and %1 more\ncontact(s) selected","...und noch %1 Kontakte\n mehr ausgewählt" }, 810{ "...and %1 more\ncontact(s) selected","...und noch %1 Kontakte\n mehr ausgewählt" },
811{ "Do you really\nwant to delete the\nsetected contact(s)?\n\n","Möchten Sie wirklich\ndie ausgewählten\nKontakte löschen?\n\n" }, 811{ "Do you really\nwant to delete the\nsetected contact(s)?\n\n","Möchten Sie wirklich\ndie ausgewählten\nKontakte löschen?\n\n" },
812{ "%1 contacts\nsuccessfully\nimported.","%1 Kontakte\nerfolgreich\nimportiert." }, 812{ "%1 contacts\nsuccessfully\nimported.","%1 Kontakte\nerfolgreich\nimportiert." },
813{ "Import this contact?","Importiere diesen Kontakt?" }, 813{ "Import this contact?","Importiere diesen Kontakt?" },
814{ "Import all!","Importiere alle!" }, 814{ "Import all!","Importiere alle!" },
815{ "Loading addressbook data ... please wait","Lade Adressbuchdaten ... bitte warten" }, 815{ "Loading addressbook data ... please wait","Lade Adressbuchdaten ... bitte warten" },
816{ "Import Format","Import Format" }, 816{ "Import Format","Import Format" },
817{ "Select import format!\nDefault and standard is Utf8.\nLatin1 may be the right\nfor some West Europian languages.","Wähle Import Format!\nDefault und Standard ist Utf8.\nLatin1 kann das richtige für\nWesteuropäische Sprachen sein." }, 817{ "Select import format!\nDefault and standard is Utf8.\nLatin1 may be the right\nfor some West Europian languages.","Wähle Import Format!\nDefault und Standard ist Utf8.\nLatin1 kann das richtige für\nWesteuropäische Sprachen sein." },
818{ "","" }, 818{ "Home2","Privat2" },
819{ "","" }, 819{ "Work2","Arbeit2" },
820{ "","" }, 820{ "Fax (Work)","Fax (Arbeit)" },
821{ "","" }, 821{ "Fax (Home)","Fax (Privat)" },
822{ "Assistent","Sekretär(in)" },
823{ "Company","Firma" },
824{ "Mobile2 (Work)","Handy2 (Arbeit)" },
825{ "Callback","Rückruf" },
826{ "Fax (Other)","Fax (Anderes)" },
827{ "Primary","Bevorzugt" },
822{ "","" }, 828{ "","" },
823{ "","" }, 829{ "","" },
824{ "","" }, 830{ "","" },
825{ "","" }, 831{ "","" },
826{ "","" }, \ No newline at end of file 832{ "","" }, \ No newline at end of file
diff --git a/kabc/addressee.cpp b/kabc/addressee.cpp
index 7e1e414..661bdf6 100644
--- a/kabc/addressee.cpp
+++ b/kabc/addressee.cpp
@@ -577,25 +577,77 @@ void Addressee::simplifyAddresses()
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()
590{
591 KABC::PhoneNumber::List::Iterator phoneIter;
592 KABC::PhoneNumber::List::Iterator phoneIter2;
593 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
594 ++phoneIter ) {
595 ( *phoneIter ).makeCompat();
596 }
597 int hasHome = hasPhoneNumberType( PhoneNumber::Home | PhoneNumber::Pref );
598 int hasHome2 = hasPhoneNumberType( PhoneNumber::Home );
599 int hasWork = hasPhoneNumberType( PhoneNumber::Work | PhoneNumber::Pref );
600 int hasWork2 = hasPhoneNumberType( PhoneNumber::Work );
601 int hasCell = hasPhoneNumberType( PhoneNumber::Cell );
602 int hasCell2 = hasPhoneNumberType( PhoneNumber::Car );
603 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
604 ++phoneIter ) {
605 if ( (*phoneIter).type() == PhoneNumber::Home && ! hasHome ) {
606 (*phoneIter).setType( PhoneNumber::Home | PhoneNumber::Pref );
607 ++hasHome;
608 if ( hasHome2 ) --hasHome2;
609 } else if ( ( (*phoneIter).type() == PhoneNumber::Home | PhoneNumber::Pref) && hasHome>1 && !hasHome2 ) {
610 (*phoneIter).setType( PhoneNumber::Home );
611 --hasHome;
612 ++hasHome2;
613 } else if ( (*phoneIter).type() == PhoneNumber::Work && ! hasWork ) {
614 (*phoneIter).setType( PhoneNumber::Work | PhoneNumber::Pref );
615 ++hasWork;
616 if ( hasWork2 ) --hasWork2;
617 } else if ( ( (*phoneIter).type() == PhoneNumber::Work | PhoneNumber::Pref) && hasWork > 1 && ! hasWork2 ) {
618 (*phoneIter).setType( PhoneNumber::Work );
619 --hasWork;
620 ++hasWork2;
621 } else if ( (*phoneIter).type() == PhoneNumber::Cell && hasCell > 1 && !hasCell2) {
622 (*phoneIter).setType( PhoneNumber::Car );
623 ++hasCell2;
624 --hasCell;
625 } else if ( (*phoneIter).type() == PhoneNumber::Car && hasCell2 > 1 && !hasCell) {
626 (*phoneIter).setType( PhoneNumber::Cell );
627 ++hasCell;
628 --hasCell2;
629 } else{
630 phoneIter2 = phoneIter;
631 ++phoneIter2;
632 for ( ; phoneIter2 != mData->phoneNumbers.end();
633 ++phoneIter2 ) {
634 if ( (*phoneIter2).type() == (*phoneIter).type() ) {
635 (*phoneIter2).setType( PhoneNumber::Voice );
589 636
637 }
638 }
639 }
640 }
641}
590void Addressee::simplifyPhoneNumbers() 642void Addressee::simplifyPhoneNumbers()
591{ 643{
592 int max = 4; 644 int max = 4;
593 int inList = mData->phoneNumbers.count(); 645 int inList = mData->phoneNumbers.count();
594 KABC::PhoneNumber::List removeNumbers; 646 KABC::PhoneNumber::List removeNumbers;
595 KABC::PhoneNumber::List::Iterator phoneIter; 647 KABC::PhoneNumber::List::Iterator phoneIter;
596 if ( inList > max ) { 648 if ( inList > max ) {
597 // delete non-preferred numbers 649 // delete non-preferred numbers
598 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); 650 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
599 ++phoneIter ) { 651 ++phoneIter ) {
600 if ( inList > max ) { 652 if ( inList > max ) {
601 if ( ! (( *phoneIter ).type() & PhoneNumber::Pref )) { 653 if ( ! (( *phoneIter ).type() & PhoneNumber::Pref )) {
@@ -988,57 +1040,57 @@ QString Addressee::businessAddressLabelLabel()
988 return i18n("Business Address Label"); 1040 return i18n("Business Address Label");
989} 1041}
990 1042
991 1043
992QString Addressee::homePhoneLabel() 1044QString Addressee::homePhoneLabel()
993{ 1045{
994 return i18n("Home Phone"); 1046 return i18n("Home Phone");
995} 1047}
996 1048
997 1049
998QString Addressee::businessPhoneLabel() 1050QString Addressee::businessPhoneLabel()
999{ 1051{
1000 return i18n("Business Phone"); 1052 return i18n("Work Phone");
1001} 1053}
1002 1054
1003 1055
1004QString Addressee::mobilePhoneLabel() 1056QString Addressee::mobilePhoneLabel()
1005{ 1057{
1006 return i18n("Mobile Phone"); 1058 return i18n("Mobile Phone");
1007} 1059}
1008QString Addressee::mobileWorkPhoneLabel() 1060QString Addressee::mobileWorkPhoneLabel()
1009{ 1061{
1010 return i18n("Mobile (work)"); 1062 return i18n("Mobile2 (work)");
1011} 1063}
1012QString Addressee::mobileHomePhoneLabel() 1064QString Addressee::mobileHomePhoneLabel()
1013{ 1065{
1014 return i18n("Mobile (home)"); 1066 return i18n("Mobile");
1015} 1067}
1016 1068
1017 1069
1018QString Addressee::homeFaxLabel() 1070QString Addressee::homeFaxLabel()
1019{ 1071{
1020 return i18n("Home Fax"); 1072 return i18n("Fax (Home)");
1021} 1073}
1022 1074
1023 1075
1024QString Addressee::businessFaxLabel() 1076QString Addressee::businessFaxLabel()
1025{ 1077{
1026 return i18n("Business Fax"); 1078 return i18n("Fax (Work)");
1027} 1079}
1028 1080
1029 1081
1030QString Addressee::carPhoneLabel() 1082QString Addressee::carPhoneLabel()
1031{ 1083{
1032 return i18n("Car Phone"); 1084 return i18n("Mobile2 (work)");
1033} 1085}
1034 1086
1035 1087
1036QString Addressee::isdnLabel() 1088QString Addressee::isdnLabel()
1037{ 1089{
1038 return i18n("ISDN"); 1090 return i18n("ISDN");
1039} 1091}
1040 1092
1041 1093
1042QString Addressee::pagerLabel() 1094QString Addressee::pagerLabel()
1043{ 1095{
1044 return i18n("Pager"); 1096 return i18n("Pager");
@@ -1643,24 +1695,34 @@ PhoneNumber Addressee::phoneNumber( int type ) const
1643 phoneNumber = (*it); 1695 phoneNumber = (*it);
1644 } 1696 }
1645 } 1697 }
1646 1698
1647 return phoneNumber; 1699 return phoneNumber;
1648} 1700}
1649 1701
1650PhoneNumber::List Addressee::phoneNumbers() const 1702PhoneNumber::List Addressee::phoneNumbers() const
1651{ 1703{
1652 return mData->phoneNumbers; 1704 return mData->phoneNumbers;
1653} 1705}
1654 1706
1707int Addressee::hasPhoneNumberType( int type )
1708{
1709 int retval = 0;
1710 PhoneNumber::List::ConstIterator it;
1711 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1712 if ( (*it).type() == type )
1713 ++retval;
1714 }
1715 return retval;
1716}
1655PhoneNumber::List Addressee::phoneNumbers( int type ) const 1717PhoneNumber::List Addressee::phoneNumbers( int type ) const
1656{ 1718{
1657 PhoneNumber::List list; 1719 PhoneNumber::List list;
1658 1720
1659 PhoneNumber::List::ConstIterator it; 1721 PhoneNumber::List::ConstIterator it;
1660 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1722 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1661 if ( matchBinaryPattern( (*it).type(), type ) ) { 1723 if ( matchBinaryPattern( (*it).type(), type ) ) {
1662 list.append( *it ); 1724 list.append( *it );
1663 } 1725 }
1664 } 1726 }
1665 return list; 1727 return list;
1666} 1728}
diff --git a/kabc/addressee.h b/kabc/addressee.h
index d1c07cb..0c488eb 100644
--- a/kabc/addressee.h
+++ b/kabc/addressee.h
@@ -113,24 +113,26 @@ class Addressee
113 Return, if the address book entry is empty. 113 Return, if the address book entry is empty.
114 */ 114 */
115 bool isEmpty() const; 115 bool isEmpty() const;
116 void setExternalUID( const QString &id ); 116 void setExternalUID( const QString &id );
117 const QString externalUID() const; 117 const QString externalUID() const;
118 void setOriginalExternalUID( const QString &id ); 118 void setOriginalExternalUID( const QString &id );
119 QString originalExternalUID() const; 119 QString originalExternalUID() const;
120 void mergeContact( const Addressee& ad, bool isSubSet ); 120 void mergeContact( const Addressee& ad, bool isSubSet );
121 void simplifyEmails(); 121 void simplifyEmails();
122 void simplifyAddresses(); 122 void simplifyAddresses();
123 void simplifyPhoneNumbers(); 123 void simplifyPhoneNumbers();
124 void simplifyPhoneNumberTypes(); 124 void simplifyPhoneNumberTypes();
125 void makePhoneNumbersOLcompatible();
126 int hasPhoneNumberType( int type );
125 bool removeVoice(); 127 bool removeVoice();
126 bool containsAdr(const Addressee& addr ); 128 bool containsAdr(const Addressee& addr );
127 129
128 /** 130 /**
129 Set unique identifier. 131 Set unique identifier.
130 */ 132 */
131 void setUid( const QString &uid ); 133 void setUid( const QString &uid );
132 /** 134 /**
133 Return unique identifier. 135 Return unique identifier.
134 */ 136 */
135 const QString uid() const; 137 const QString uid() const;
136 /** 138 /**
diff --git a/kabc/field.cpp b/kabc/field.cpp
index fd51026..20885de 100644
--- a/kabc/field.cpp
+++ b/kabc/field.cpp
@@ -280,45 +280,45 @@ QString Field::value( const KABC::Addressee &a )
280 return dt; 280 return dt;
281 } 281 }
282 else 282 else
283 return QString::null; 283 return QString::null;
284 case FieldImpl::Url: 284 case FieldImpl::Url:
285 return a.url().prettyURL(); 285 return a.url().prettyURL();
286//US 286//US
287 case FieldImpl::Resource: 287 case FieldImpl::Resource:
288 return a.resource()->resourceName(); 288 return a.resource()->resourceName();
289 case FieldImpl::Category: 289 case FieldImpl::Category:
290 return a.categories().join(","); 290 return a.categories().join(",");
291 case FieldImpl::HomePhone: 291 case FieldImpl::HomePhone:
292 return a.phoneNumber( PhoneNumber::Home ).number(); 292 return a.phoneNumber( PhoneNumber::Home| PhoneNumber::Pref ).number();
293 case FieldImpl::BusinessPhone: 293 case FieldImpl::BusinessPhone:
294 return a.phoneNumber( PhoneNumber::Work ).number(); 294 return a.phoneNumber( PhoneNumber::Work| PhoneNumber::Pref ).number();
295 case FieldImpl::MobilePhone: 295 case FieldImpl::MobilePhone:
296 return a.phoneNumber( PhoneNumber::Cell ).number(); 296 return a.phoneNumber( PhoneNumber::Cell ).number();
297 case FieldImpl::MobileWorkPhone: 297 case FieldImpl::MobileWorkPhone:
298 return a.phoneNumber( PhoneNumber::Cell | PhoneNumber::Work ).number(); 298 return a.phoneNumber( PhoneNumber::Car ).number();
299 case FieldImpl::MobileHomePhone: 299 case FieldImpl::MobileHomePhone:
300 return a.phoneNumber( PhoneNumber::Cell | PhoneNumber::Home ).number(); 300 return a.phoneNumber( PhoneNumber::Cell ).number();
301 case FieldImpl::HomeFax: 301 case FieldImpl::HomeFax:
302 return a.phoneNumber( PhoneNumber::Home | PhoneNumber::Fax ).number(); 302 return a.phoneNumber( PhoneNumber::Home | PhoneNumber::Fax ).number();
303 case FieldImpl::BusinessFax: 303 case FieldImpl::BusinessFax:
304 return a.phoneNumber( PhoneNumber::Work | PhoneNumber::Fax ).number(); 304 return a.phoneNumber( PhoneNumber::Work | PhoneNumber::Fax ).number();
305 case FieldImpl::CarPhone: 305 case FieldImpl::CarPhone:
306 return a.phoneNumber( PhoneNumber::Car ).number(); 306 return a.phoneNumber( PhoneNumber::Car ).number();
307 case FieldImpl::Isdn: 307 case FieldImpl::Isdn:
308 return a.phoneNumber( PhoneNumber::Isdn ).number(); 308 return a.phoneNumber( PhoneNumber::Isdn ).number();
309 case FieldImpl::Pager: 309 case FieldImpl::Pager:
310 return a.phoneNumber( PhoneNumber::Pager ).number(); 310 return a.phoneNumber( PhoneNumber::Pager ).number();
311 case FieldImpl::Sip: 311 case FieldImpl::Sip:
312 return a.phoneNumber( PhoneNumber::Sip ).number(); 312 return a.phoneNumber( PhoneNumber::Pcs | PhoneNumber::Pref ).number();
313 case FieldImpl::HomeAddressStreet: 313 case FieldImpl::HomeAddressStreet:
314 return a.address( Address::Home ).street(); 314 return a.address( Address::Home ).street();
315 case FieldImpl::HomeAddressLocality: 315 case FieldImpl::HomeAddressLocality:
316 return a.address( Address::Home ).locality(); 316 return a.address( Address::Home ).locality();
317 case FieldImpl::HomeAddressRegion: 317 case FieldImpl::HomeAddressRegion:
318 return a.address( Address::Home ).region(); 318 return a.address( Address::Home ).region();
319 case FieldImpl::HomeAddressPostalCode: 319 case FieldImpl::HomeAddressPostalCode:
320 return a.address( Address::Home ).postalCode(); 320 return a.address( Address::Home ).postalCode();
321 case FieldImpl::HomeAddressCountry: 321 case FieldImpl::HomeAddressCountry:
322 return a.address( Address::Home ).country(); 322 return a.address( Address::Home ).country();
323 case FieldImpl::BusinessAddressStreet: 323 case FieldImpl::BusinessAddressStreet:
324 return a.address( Address::Work ).street(); 324 return a.address( Address::Work ).street();
diff --git a/kabc/phonenumber.cpp b/kabc/phonenumber.cpp
index 4c6231d..0d46ba7 100644
--- a/kabc/phonenumber.cpp
+++ b/kabc/phonenumber.cpp
@@ -56,25 +56,80 @@ void PhoneNumber::init()
56bool PhoneNumber::operator==( const PhoneNumber &p ) const 56bool PhoneNumber::operator==( const PhoneNumber &p ) const
57{ 57{
58 if ( mNumber != p.mNumber ) return false; 58 if ( mNumber != p.mNumber ) return false;
59 if ( mType != p.mType ) return false; 59 if ( mType != p.mType ) return false;
60 60
61 return true; 61 return true;
62} 62}
63 63
64bool PhoneNumber::operator!=( const PhoneNumber &p ) const 64bool PhoneNumber::operator!=( const PhoneNumber &p ) const
65{ 65{
66 return !( p == *this ); 66 return !( p == *this );
67} 67}
68void PhoneNumber::makeCompat()
69{
70 mType = getCompatType( mType );
71}
72int PhoneNumber::getCompatType( int type )
73{
74
75 if ((type & Cell) == Cell) {
76 if ((type & Work) == Work)
77 return Car;
78 return Cell;
79 }
80 if ((type & Home) == Home) {
81 if ((type & Pref) == Pref)
82 return (Home | Pref);
83 if ((type & Fax) == Fax)
84 return (Home | Fax);
85 return (Home);
86 }
87 if ((type & Work) == Work) {
88 if ((type & Pref) == Pref)
89 return (Work| Pref);
90 if ((type & Fax) == Fax)
91 return (Fax |Work);
92 if ((type & Msg) == Msg) {
93 if ((type & Voice) == Voice)
94 return ( Msg | Voice |Work);
95 return ( Msg | Work);
96 }
97 return Work;
98 }
99 if ((type & Pcs) == Pcs) {
100 if ((type & Pref) == Pref)
101 return Pcs | Pref;
102 return Pcs;
103 }
104 if ((type & Car) == Car)
105 return Car;
106 if ((type & Pager) == Pager)
107 return Pager;
108 if ((type & Isdn) == Isdn)
109 return Isdn;
110 if ((type & Video) == Video)
111 return Video;
112
113 if ((type & Msg) == Msg)
114 return Msg;
115 if ((type & Fax) == Fax)
116 return Fax;
117
118 if ((type & Pref) == Pref)
119 return Pref;
68 120
121 return Voice;
122
123}
69bool PhoneNumber::simplifyNumber() 124bool PhoneNumber::simplifyNumber()
70{ 125{
71 QString Number; 126 QString Number;
72 int i; 127 int i;
73 Number = mNumber.stripWhiteSpace (); 128 Number = mNumber.stripWhiteSpace ();
74 mNumber = ""; 129 mNumber = "";
75 for ( i = 0; i < Number.length(); ++i) { 130 for ( i = 0; i < Number.length(); ++i) {
76 if ( Number.at(i).isDigit() || Number.at(i) == '+'|| Number.at(i) == '*'|| Number.at(i) == '#' ) 131 if ( Number.at(i).isDigit() || Number.at(i) == '+'|| Number.at(i) == '*'|| Number.at(i) == '#' )
77 mNumber += Number.at(i); 132 mNumber += Number.at(i);
78 } 133 }
79 return ( mNumber.length() > 0 ); 134 return ( mNumber.length() > 0 );
80} 135}
@@ -154,38 +209,90 @@ QString PhoneNumber::typeLabel() const
154} 209}
155 210
156QString PhoneNumber::label() const 211QString PhoneNumber::label() const
157{ 212{
158 return typeLabel( type() ); 213 return typeLabel( type() );
159} 214}
160 215
161PhoneNumber::TypeList PhoneNumber::typeList() 216PhoneNumber::TypeList PhoneNumber::typeList()
162{ 217{
163 TypeList list; 218 TypeList list;
164 219
165 list << Home << Work << Msg << Pref << Voice << Fax << Cell << Video 220 list << Home << Work << Msg << Pref << Voice << Fax << Cell << Video
166 << Bbs << Modem << Car << Isdn << Pcs << Pager << Sip; 221 << Bbs << Modem << Car << Isdn << Pcs << Pager;
167 222
168 return list; 223 return list;
169} 224}
170 225
171QString PhoneNumber::label( int type ) 226QString PhoneNumber::label( int type )
172{ 227{
173 return typeLabel( type ); 228 return typeLabel( type );
174} 229}
175 230
176QString PhoneNumber::typeLabel( int type ) 231QString PhoneNumber::typeLabel( int type )
177{ 232{
178 QString typeString; 233 if ((type & Cell) == Cell)
234 return i18n("Mobile");
235 if ((type & Home) == Home) {
236 if ((type & Pref) == Pref)
237 return i18n("Home");
238 if ((type & Fax) == Fax)
239 return i18n("Fax (Home)");
240 return i18n("Home2");
241 }
179 242
243 if ((type & Work) == Work) {
244 if ((type & Pref) == Pref)
245 return i18n("Work");
246 if ((type & Fax) == Fax)
247 return i18n("Fax (Work)");
248 if ((type & Msg) == Msg) {
249 if ((type & Voice) == Voice)
250 return i18n("Assistent");
251 return i18n("Company");
252 }
253 return i18n("Work2");
254 }
255 if ((type & Pcs) == Pcs) {
256 if ((type & Pref) == Pref)
257 return i18n("SIP");
258 return i18n("VoIP");
259 }
260 if ((type & Car) == Car)
261 return i18n("Mobile2 (Work)");
262 if ((type & Pager) == Pager)
263 return i18n("Pager");
264 if ((type & Isdn) == Isdn)
265 return i18n("ISDN");
266 if ((type & Video) == Video)
267 return i18n("Video");
268
269 if ((type & Msg) == Msg)
270 return i18n("Callback");
271 if ((type & Fax) == Fax)
272 return i18n("Fax (Other)");
273
274 if ((type & Pref) == Pref)
275 return i18n("Primary");
276
277
278 return i18n("Other");
279
280
281#if 0
282
283
284
285 QString typeString;
286
180 287
181 if ((type & Cell) == Cell) 288 if ((type & Cell) == Cell)
182 typeString += i18n("Mobile") +" "; 289 typeString += i18n("Mobile") +" ";
183 if ((type & Home) == Home) 290 if ((type & Home) == Home)
184 typeString += i18n("Home")+" "; 291 typeString += i18n("Home")+" ";
185 else if ((type & Work) == Work) 292 else if ((type & Work) == Work)
186 typeString += i18n("Work")+" "; 293 typeString += i18n("Work")+" ";
187 294
188 if ((type & Sip) == Sip) 295 if ((type & Sip) == Sip)
189 typeString += i18n("SIP")+" "; 296 typeString += i18n("SIP")+" ";
190 if ((type & Car) == Car) 297 if ((type & Car) == Car)
191 typeString += i18n("Car")+" "; 298 typeString += i18n("Car")+" ";
@@ -211,24 +318,25 @@ QString PhoneNumber::typeLabel( int type )
211 if ((type & Pref) == Pref) 318 if ((type & Pref) == Pref)
212 typeString += i18n("(p)"); 319 typeString += i18n("(p)");
213 */ 320 */
214 //if we still have no match, return "other" 321 //if we still have no match, return "other"
215 if (typeString.isEmpty()) { 322 if (typeString.isEmpty()) {
216 if ((type & Voice) == Voice) 323 if ((type & Voice) == Voice)
217 return i18n("Voice"); 324 return i18n("Voice");
218 else 325 else
219 return i18n("Other"); 326 return i18n("Other");
220 } 327 }
221 328
222 return typeString.stripWhiteSpace(); 329 return typeString.stripWhiteSpace();
330#endif
223} 331}
224 332
225QDataStream &KABC::operator<<( QDataStream &s, const PhoneNumber &phone ) 333QDataStream &KABC::operator<<( QDataStream &s, const PhoneNumber &phone )
226{ 334{
227 return s << phone.mId << phone.mType << phone.mNumber; 335 return s << phone.mId << phone.mType << phone.mNumber;
228} 336}
229 337
230QDataStream &KABC::operator>>( QDataStream &s, PhoneNumber &phone ) 338QDataStream &KABC::operator>>( QDataStream &s, PhoneNumber &phone )
231{ 339{
232 s >> phone.mId >> phone.mType >> phone.mNumber; 340 s >> phone.mId >> phone.mType >> phone.mNumber;
233 341
234 return s; 342 return s;
diff --git a/kabc/phonenumber.h b/kabc/phonenumber.h
index 2d4d3e0..b9d6a17 100644
--- a/kabc/phonenumber.h
+++ b/kabc/phonenumber.h
@@ -55,29 +55,28 @@ class PhoneNumber
55 @li @p Msg - Messaging 55 @li @p Msg - Messaging
56 @li @p Pref - Preferred number 56 @li @p Pref - Preferred number
57 @li @p Voice - Voice 57 @li @p Voice - Voice
58 @li @p Fax - Fax machine 58 @li @p Fax - Fax machine
59 @li @p Cell - Cell phone 59 @li @p Cell - Cell phone
60 @li @p Video - Video phone 60 @li @p Video - Video phone
61 @li @p Bbs - Mailbox 61 @li @p Bbs - Mailbox
62 @li @p Modem - Modem 62 @li @p Modem - Modem
63 @li @p Car - Car phone 63 @li @p Car - Car phone
64 @li @p Isdn - ISDN connection 64 @li @p Isdn - ISDN connection
65 @li @p Pcs - Personal Communication Service 65 @li @p Pcs - Personal Communication Service
66 @li @p Pager - Pager 66 @li @p Pager - Pager
67 @li @p SIP - VoIP
68 */ 67 */
69 enum Types { Home = 1, Work = 2, Msg = 4, Pref = 8, Voice = 16, Fax = 32, 68 enum Types { Home = 1, Work = 2, Msg = 4, Pref = 8, Voice = 16, Fax = 32,
70 Cell = 64, Video = 128, Bbs = 256, Modem = 512, Car = 1024, 69 Cell = 64, Video = 128, Bbs = 256, Modem = 512, Car = 1024,
71 Isdn = 2048, Pcs = 4096, Pager = 8192, Sip = 16384 }; 70 Isdn = 2048, Pcs = 4096, Pager = 8192 };
72 71
73 /** 72 /**
74 Create an empty phone number object. 73 Create an empty phone number object.
75 */ 74 */
76 PhoneNumber(); 75 PhoneNumber();
77 76
78 /** 77 /**
79 Create a phonenumber object. 78 Create a phonenumber object.
80 79
81 @param number Number 80 @param number Number
82 @param type Type as defined in enum. Multiple types can be 81 @param type Type as defined in enum. Multiple types can be
83 specified by combining them by a logical or. 82 specified by combining them by a logical or.
@@ -142,24 +141,26 @@ class PhoneNumber
142 /** 141 /**
143 Returns the translated label for phone number type. 142 Returns the translated label for phone number type.
144 */ 143 */
145 static QString typeLabel( int type ); 144 static QString typeLabel( int type );
146 145
147 /** 146 /**
148 Returns the translated label for phone number type. 147 Returns the translated label for phone number type.
149 @obsolete 148 @obsolete
150 */ 149 */
151 static QString label( int type ); 150 static QString label( int type );
152 bool simplifyNumber(); 151 bool simplifyNumber();
153 void simplifyType(); 152 void simplifyType();
153 void makeCompat();
154 int getCompatType( int type );
154 155
155 private: 156 private:
156 void init(); 157 void init();
157 158
158 QString mId; 159 QString mId;
159 160
160 int mType; 161 int mType;
161 QString mNumber; 162 QString mNumber;
162}; 163};
163 164
164QDataStream &operator<<( QDataStream &, const PhoneNumber & ); 165QDataStream &operator<<( QDataStream &, const PhoneNumber & );
165QDataStream &operator>>( QDataStream &, PhoneNumber & ); 166QDataStream &operator>>( QDataStream &, PhoneNumber & );
diff --git a/kabc/vcard21parser.cpp b/kabc/vcard21parser.cpp
index 277de22..60d02b8 100644
--- a/kabc/vcard21parser.cpp
+++ b/kabc/vcard21parser.cpp
@@ -161,26 +161,25 @@ bool VCardLineX::isValid() const
161 qualifiers.contains(VCARD_TEL_WORK) || 161 qualifiers.contains(VCARD_TEL_WORK) ||
162 qualifiers.contains(VCARD_TEL_PREF) || 162 qualifiers.contains(VCARD_TEL_PREF) ||
163 qualifiers.contains(VCARD_TEL_VOICE) || 163 qualifiers.contains(VCARD_TEL_VOICE) ||
164 qualifiers.contains(VCARD_TEL_FAX) || 164 qualifiers.contains(VCARD_TEL_FAX) ||
165 qualifiers.contains(VCARD_TEL_MSG) || 165 qualifiers.contains(VCARD_TEL_MSG) ||
166 qualifiers.contains(VCARD_TEL_CELL) || 166 qualifiers.contains(VCARD_TEL_CELL) ||
167 qualifiers.contains(VCARD_TEL_PAGER) || 167 qualifiers.contains(VCARD_TEL_PAGER) ||
168 qualifiers.contains(VCARD_TEL_BBS) || 168 qualifiers.contains(VCARD_TEL_BBS) ||
169 qualifiers.contains(VCARD_TEL_MODEM) || 169 qualifiers.contains(VCARD_TEL_MODEM) ||
170 qualifiers.contains(VCARD_TEL_CAR) || 170 qualifiers.contains(VCARD_TEL_CAR) ||
171 qualifiers.contains(VCARD_TEL_ISDN) || 171 qualifiers.contains(VCARD_TEL_ISDN) ||
172 qualifiers.contains(VCARD_TEL_VIDEO) || 172 qualifiers.contains(VCARD_TEL_VIDEO) ||
173 qualifiers.contains(VCARD_TEL_PCS) || 173 qualifiers.contains(VCARD_TEL_PCS)
174 qualifiers.contains(VCARD_TEL_SIP)
175 ) ) 174 ) )
176 return true; 175 return true;
177 if ( name == VCARD_TZ ) 176 if ( name == VCARD_TZ )
178 return true; 177 return true;
179 if ( name == VCARD_TITLE ) 178 if ( name == VCARD_TITLE )
180 return true; 179 return true;
181 break; 180 break;
182 181
183 case 'u': 182 case 'u':
184 if ( name == VCARD_URL ) 183 if ( name == VCARD_URL )
185 return true; 184 return true;
186 if ( name == VCARD_UID ) 185 if ( name == VCARD_UID )
@@ -270,54 +269,53 @@ KABC::Addressee VCard21Parser::readFromString( const QString &data)
270 addressee.setBirthday(VCardStringToDate(tmpStr)); 269 addressee.setBirthday(VCardStringToDate(tmpStr));
271 270
272 //set the addressee's phone numbers 271 //set the addressee's phone numbers
273 for ( QValueListIterator<VCardLineX> i = mVCard->_vcdata->begin();i != mVCard->_vcdata->end(); ++i ) { 272 for ( QValueListIterator<VCardLineX> i = mVCard->_vcdata->begin();i != mVCard->_vcdata->end(); ++i ) {
274 if ( (*i).name == VCARD_TEL ) { 273 if ( (*i).name == VCARD_TEL ) {
275 int type = 0; 274 int type = 0;
276 if ( (*i).qualified ) { 275 if ( (*i).qualified ) {
277 if ( (*i).qualifiers.contains( VCARD_TEL_HOME ) ) 276 if ( (*i).qualifiers.contains( VCARD_TEL_HOME ) )
278 type |= PhoneNumber::Home; 277 type |= PhoneNumber::Home;
279 if ( (*i).qualifiers.contains( VCARD_TEL_WORK ) ) 278 if ( (*i).qualifiers.contains( VCARD_TEL_WORK ) )
280 type |= PhoneNumber::Work; 279 type |= PhoneNumber::Work;
281 if ( (*i).qualifiers.contains( VCARD_TEL_PREF ) ) 280 if ( (*i).qualifiers.contains( VCARD_TEL_PREF ) )
282 type |= PhoneNumber::Pref; 281 type |= PhoneNumber::Pref;
283 // if ( (*i).qualifiers.contains( VCARD_TEL_VOICE ) ) 282 if ( (*i).qualifiers.contains( VCARD_TEL_VOICE ) )
284 // type |= PhoneNumber::Voice; 283 type |= PhoneNumber::Voice;
285 if ( (*i).qualifiers.contains( VCARD_TEL_FAX ) ) 284 if ( (*i).qualifiers.contains( VCARD_TEL_FAX ) )
286 type |= PhoneNumber::Fax; 285 type |= PhoneNumber::Fax;
287 if ( (*i).qualifiers.contains( VCARD_TEL_MSG ) ) 286 if ( (*i).qualifiers.contains( VCARD_TEL_MSG ) )
288 type |= PhoneNumber::Msg; 287 type |= PhoneNumber::Msg;
289 if ( (*i).qualifiers.contains( VCARD_TEL_CELL ) ) 288 if ( (*i).qualifiers.contains( VCARD_TEL_CELL ) )
290 type |= PhoneNumber::Cell; 289 type |= PhoneNumber::Cell;
291 if ( (*i).qualifiers.contains( VCARD_TEL_PAGER ) ) 290 if ( (*i).qualifiers.contains( VCARD_TEL_PAGER ) )
292 type |= PhoneNumber::Pager; 291 type |= PhoneNumber::Pager;
293 if ( (*i).qualifiers.contains( VCARD_TEL_BBS ) ) 292 if ( (*i).qualifiers.contains( VCARD_TEL_BBS ) )
294 type |= PhoneNumber::Bbs; 293 type |= PhoneNumber::Bbs;
295 if ( (*i).qualifiers.contains( VCARD_TEL_MODEM ) ) 294 if ( (*i).qualifiers.contains( VCARD_TEL_MODEM ) )
296 type |= PhoneNumber::Modem; 295 type |= PhoneNumber::Modem;
297 if ( (*i).qualifiers.contains( VCARD_TEL_CAR ) ) 296 if ( (*i).qualifiers.contains( VCARD_TEL_CAR ) )
298 type |= PhoneNumber::Car; 297 type |= PhoneNumber::Car;
299 if ( (*i).qualifiers.contains( VCARD_TEL_ISDN ) ) 298 if ( (*i).qualifiers.contains( VCARD_TEL_ISDN ) )
300 type |= PhoneNumber::Isdn; 299 type |= PhoneNumber::Isdn;
301 if ( (*i).qualifiers.contains( VCARD_TEL_VIDEO ) ) 300 if ( (*i).qualifiers.contains( VCARD_TEL_VIDEO ) )
302 type |= PhoneNumber::Video; 301 type |= PhoneNumber::Video;
303 if ( (*i).qualifiers.contains( VCARD_TEL_PCS ) ) 302 if ( (*i).qualifiers.contains( VCARD_TEL_PCS ) )
304 type |= PhoneNumber::Pcs; 303 type |= PhoneNumber::Pcs;
305 if ( (*i).qualifiers.contains( VCARD_TEL_SIP ) ) 304
306 type |= PhoneNumber::Sip;
307 } 305 }
308 addressee.insertPhoneNumber( PhoneNumber( (*i).parameters[ 0 ], type ) ); 306 addressee.insertPhoneNumber( PhoneNumber( (*i).parameters[ 0 ], type ) );
309 } 307 }
310 } 308 }
311 309 addressee.makePhoneNumbersOLcompatible();
312 //set the addressee's addresses 310 //set the addressee's addresses
313 for ( QValueListIterator<VCardLineX> i = mVCard->_vcdata->begin();i != mVCard->_vcdata->end(); ++i ) { 311 for ( QValueListIterator<VCardLineX> i = mVCard->_vcdata->begin();i != mVCard->_vcdata->end(); ++i ) {
314 if ( (*i).name == VCARD_ADR ) { 312 if ( (*i).name == VCARD_ADR ) {
315 int type = 0; 313 int type = 0;
316 if ( (*i).qualified ) { 314 if ( (*i).qualified ) {
317 if ( (*i).qualifiers.contains( VCARD_ADR_DOM ) ) 315 if ( (*i).qualifiers.contains( VCARD_ADR_DOM ) )
318 type |= Address::Dom; 316 type |= Address::Dom;
319 if ( (*i).qualifiers.contains( VCARD_ADR_INTL ) ) 317 if ( (*i).qualifiers.contains( VCARD_ADR_INTL ) )
320 type |= Address::Intl; 318 type |= Address::Intl;
321 if ( (*i).qualifiers.contains( VCARD_ADR_POSTAL ) ) 319 if ( (*i).qualifiers.contains( VCARD_ADR_POSTAL ) )
322 type |= Address::Postal; 320 type |= Address::Postal;
323 if ( (*i).qualifiers.contains( VCARD_ADR_PARCEL ) ) 321 if ( (*i).qualifiers.contains( VCARD_ADR_PARCEL ) )
diff --git a/kabc/vcardformatimpl.cpp b/kabc/vcardformatimpl.cpp
index ec5ed80..26fd4f0 100644
--- a/kabc/vcardformatimpl.cpp
+++ b/kabc/vcardformatimpl.cpp
@@ -272,25 +272,25 @@ bool VCardFormatImpl::loadAddressee( Addressee& addressee, VCard *v )
272 for( cl = contentLines.first(); cl; cl = contentLines.next() ) { 272 for( cl = contentLines.first(); cl; cl = contentLines.next() ) {
273 EntityType type = cl->entityType(); 273 EntityType type = cl->entityType();
274 if ( type == EntityLabel ) { 274 if ( type == EntityLabel ) {
275 int type = readAddressParam( cl ); 275 int type = readAddressParam( cl );
276 Address address = addressee.address( type ); 276 Address address = addressee.address( type );
277 if ( address.isEmpty() ) 277 if ( address.isEmpty() )
278 address.setType( type ); 278 address.setType( type );
279 279
280 address.setLabel( QString::fromUtf8( cl->value()->asString() ) ); 280 address.setLabel( QString::fromUtf8( cl->value()->asString() ) );
281 addressee.insertAddress( address ); 281 addressee.insertAddress( address );
282 } 282 }
283 } 283 }
284 284 addressee.makePhoneNumbersOLcompatible();
285 return true; 285 return true;
286} 286}
287 287
288void VCardFormatImpl::saveAddressee( const Addressee &addressee, VCard *v, bool intern ) 288void VCardFormatImpl::saveAddressee( const Addressee &addressee, VCard *v, bool intern )
289{ 289{
290//US ContentLine cl; 290//US ContentLine cl;
291//US QString value; 291//US QString value;
292 292
293 addTextValue( v, EntityName, addressee.name() ); 293 addTextValue( v, EntityName, addressee.name() );
294 addTextValue( v, EntityUID, addressee.uid() ); 294 addTextValue( v, EntityUID, addressee.uid() );
295 addTextValue( v, EntityFullName, addressee.formattedName() ); 295 addTextValue( v, EntityFullName, addressee.formattedName() );
296 296
@@ -586,25 +586,24 @@ void VCardFormatImpl::addTelephoneValue( VCard *v, const PhoneNumber &p )
586 if( p.type() & PhoneNumber::Msg ) params.append( new Param( "TYPE", "msg" ) ); 586 if( p.type() & PhoneNumber::Msg ) params.append( new Param( "TYPE", "msg" ) );
587 if( p.type() & PhoneNumber::Pref ) params.append( new Param( "TYPE", "pref" ) ); 587 if( p.type() & PhoneNumber::Pref ) params.append( new Param( "TYPE", "pref" ) );
588 if( p.type() & PhoneNumber::Voice ) params.append( new Param( "TYPE", "voice" ) ); 588 if( p.type() & PhoneNumber::Voice ) params.append( new Param( "TYPE", "voice" ) );
589 if( p.type() & PhoneNumber::Fax ) params.append( new Param( "TYPE", "fax" ) ); 589 if( p.type() & PhoneNumber::Fax ) params.append( new Param( "TYPE", "fax" ) );
590 if( p.type() & PhoneNumber::Cell ) params.append( new Param( "TYPE", "cell" ) ); 590 if( p.type() & PhoneNumber::Cell ) params.append( new Param( "TYPE", "cell" ) );
591 if( p.type() & PhoneNumber::Video ) params.append( new Param( "TYPE", "video" ) ); 591 if( p.type() & PhoneNumber::Video ) params.append( new Param( "TYPE", "video" ) );
592 if( p.type() & PhoneNumber::Bbs ) params.append( new Param( "TYPE", "bbs" ) ); 592 if( p.type() & PhoneNumber::Bbs ) params.append( new Param( "TYPE", "bbs" ) );
593 if( p.type() & PhoneNumber::Modem ) params.append( new Param( "TYPE", "modem" ) ); 593 if( p.type() & PhoneNumber::Modem ) params.append( new Param( "TYPE", "modem" ) );
594 if( p.type() & PhoneNumber::Car ) params.append( new Param( "TYPE", "car" ) ); 594 if( p.type() & PhoneNumber::Car ) params.append( new Param( "TYPE", "car" ) );
595 if( p.type() & PhoneNumber::Isdn ) params.append( new Param( "TYPE", "isdn" ) ); 595 if( p.type() & PhoneNumber::Isdn ) params.append( new Param( "TYPE", "isdn" ) );
596 if( p.type() & PhoneNumber::Pcs ) params.append( new Param( "TYPE", "pcs" ) ); 596 if( p.type() & PhoneNumber::Pcs ) params.append( new Param( "TYPE", "pcs" ) );
597 if( p.type() & PhoneNumber::Pager ) params.append( new Param( "TYPE", "pager" ) ); 597 if( p.type() & PhoneNumber::Pager ) params.append( new Param( "TYPE", "pager" ) );
598 if( p.type() & PhoneNumber::Sip ) params.append( new Param( "TYPE", "sip" ) );
599 cl.setParamList( params ); 598 cl.setParamList( params );
600 599
601 v->add(cl); 600 v->add(cl);
602} 601}
603 602
604PhoneNumber VCardFormatImpl::readTelephoneValue( ContentLine *cl ) 603PhoneNumber VCardFormatImpl::readTelephoneValue( ContentLine *cl )
605{ 604{
606 PhoneNumber p; 605 PhoneNumber p;
607 TelValue *value = (TelValue *)cl->value(); 606 TelValue *value = (TelValue *)cl->value();
608 p.setNumber( QString::fromUtf8( value->asString() ) ); 607 p.setNumber( QString::fromUtf8( value->asString() ) );
609 608
610 int type = 0; 609 int type = 0;
@@ -619,25 +618,24 @@ PhoneNumber VCardFormatImpl::readTelephoneValue( ContentLine *cl )
619 else if ( tmpStr == "msg" ) type |= PhoneNumber::Msg; 618 else if ( tmpStr == "msg" ) type |= PhoneNumber::Msg;
620 else if ( tmpStr == "pref" ) type |= PhoneNumber::Pref; 619 else if ( tmpStr == "pref" ) type |= PhoneNumber::Pref;
621 else if ( tmpStr == "voice" ) type |= PhoneNumber::Voice; 620 else if ( tmpStr == "voice" ) type |= PhoneNumber::Voice;
622 else if ( tmpStr == "fax" ) type |= PhoneNumber::Fax; 621 else if ( tmpStr == "fax" ) type |= PhoneNumber::Fax;
623 else if ( tmpStr == "cell" ) type |= PhoneNumber::Cell; 622 else if ( tmpStr == "cell" ) type |= PhoneNumber::Cell;
624 else if ( tmpStr == "video" ) type |= PhoneNumber::Video; 623 else if ( tmpStr == "video" ) type |= PhoneNumber::Video;
625 else if ( tmpStr == "bbs" ) type |= PhoneNumber::Bbs; 624 else if ( tmpStr == "bbs" ) type |= PhoneNumber::Bbs;
626 else if ( tmpStr == "modem" ) type |= PhoneNumber::Modem; 625 else if ( tmpStr == "modem" ) type |= PhoneNumber::Modem;
627 else if ( tmpStr == "car" ) type |= PhoneNumber::Car; 626 else if ( tmpStr == "car" ) type |= PhoneNumber::Car;
628 else if ( tmpStr == "isdn" ) type |= PhoneNumber::Isdn; 627 else if ( tmpStr == "isdn" ) type |= PhoneNumber::Isdn;
629 else if ( tmpStr == "pcs" ) type |= PhoneNumber::Pcs; 628 else if ( tmpStr == "pcs" ) type |= PhoneNumber::Pcs;
630 else if ( tmpStr == "pager" ) type |= PhoneNumber::Pager; 629 else if ( tmpStr == "pager" ) type |= PhoneNumber::Pager;
631 else if ( tmpStr == "sip" ) type |= PhoneNumber::Sip;
632 } 630 }
633 } 631 }
634 p.setType( type ); 632 p.setType( type );
635 633
636 return p; 634 return p;
637} 635}
638 636
639QString VCardFormatImpl::readTextValue( ContentLine *cl ) 637QString VCardFormatImpl::readTextValue( ContentLine *cl )
640{ 638{
641 VCARD::Value *value = cl->value(); 639 VCARD::Value *value = cl->value();
642 if ( value ) { 640 if ( value ) {
643 return QString::fromUtf8( value->asString() ); 641 return QString::fromUtf8( value->asString() );
diff --git a/kabc/vcardparser/vcardtool.cpp b/kabc/vcardparser/vcardtool.cpp
index c3d92b6..204326e 100644
--- a/kabc/vcardparser/vcardtool.cpp
+++ b/kabc/vcardparser/vcardtool.cpp
@@ -567,25 +567,25 @@ Addressee::List VCardTool::parseVCards( const QString& vcard )
567 // URL 567 // URL
568 else if ( identifier == "url" ) 568 else if ( identifier == "url" )
569 addr.setUrl( KURL( (*lineIt).valueString() ) ); 569 addr.setUrl( KURL( (*lineIt).valueString() ) );
570 570
571 // X- 571 // X-
572 else if ( identifier.startsWith( "x-" ) ) { 572 else if ( identifier.startsWith( "x-" ) ) {
573 const QString key = (*lineIt).identifier().mid( 2 ); 573 const QString key = (*lineIt).identifier().mid( 2 );
574 int dash = key.find( "-" ); 574 int dash = key.find( "-" );
575 addr.insertCustom( key.left( dash ), key.mid( dash + 1 ), (*lineIt).valueString() ); 575 addr.insertCustom( key.left( dash ), key.mid( dash + 1 ), (*lineIt).valueString() );
576 } 576 }
577 } 577 }
578 } 578 }
579 579 addr.makePhoneNumbersOLcompatible();
580 addrList.append( addr ); 580 addrList.append( addr );
581 } 581 }
582 582
583 return addrList; 583 return addrList;
584} 584}
585 585
586QDateTime VCardTool::parseDateTime( const QString &str ) 586QDateTime VCardTool::parseDateTime( const QString &str )
587{ 587{
588 QDateTime dateTime; 588 QDateTime dateTime;
589 589
590 if ( str.find( '-' ) == -1 ) { // is base format (yyyymmdd) 590 if ( str.find( '-' ) == -1 ) { // is base format (yyyymmdd)
591 dateTime.setDate( QDate( str.left( 4 ).toInt(), str.mid( 4, 2 ).toInt(), 591 dateTime.setDate( QDate( str.left( 4 ).toInt(), str.mid( 4, 2 ).toInt(),