summaryrefslogtreecommitdiffabout
authorzautrix <zautrix>2005-10-28 03:24:50 (UTC)
committer zautrix <zautrix>2005-10-28 03:24:50 (UTC)
commitf83a59cf4f9d0cff4111b6f5c88e88e6dc96e79e (patch) (unidiff)
tree969e6cf85499e3b1dcaa4dc24c972b65c906cfa9
parentcbda16d4966c7483d20d1b6b5a64c8af367ea732 (diff)
downloadkdepimpi-f83a59cf4f9d0cff4111b6f5c88e88e6dc96e79e.zip
kdepimpi-f83a59cf4f9d0cff4111b6f5c88e88e6dc96e79e.tar.gz
kdepimpi-f83a59cf4f9d0cff4111b6f5c88e88e6dc96e79e.tar.bz2
many new bugs...
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
@@ -21,384 +21,384 @@
21{ "IM Address","IM Adresse" }, 21{ "IM Address","IM Adresse" },
22{ "Anniversary","Jahrestag" }, 22{ "Anniversary","Jahrestag" },
23{ "Gender","Geschlecht" }, 23{ "Gender","Geschlecht" },
24{ "Children","Kinder" }, 24{ "Children","Kinder" },
25{ "FreeBusyUrl","FreeBusyUrl" }, 25{ "FreeBusyUrl","FreeBusyUrl" },
26{ "ExternalID","ExternalID" }, 26{ "ExternalID","ExternalID" },
27{ "Resource loaded: '%1'","Resource geladen: '%1'" }, 27{ "Resource loaded: '%1'","Resource geladen: '%1'" },
28{ "Select View","Ansicht wählen" }, 28{ "Select View","Ansicht wählen" },
29{ "Modify View...","Ansicht ändern..." }, 29{ "Modify View...","Ansicht ändern..." },
30{ "Add View...","Ansicht hinzufügen..." }, 30{ "Add View...","Ansicht hinzufügen..." },
31{ "Delete View","Ansicht löschen" }, 31{ "Delete View","Ansicht löschen" },
32{ "Refresh View","Ansicht aktualisieren" }, 32{ "Refresh View","Ansicht aktualisieren" },
33{ "Edit &Filters...","Bearbeite &Filter..." }, 33{ "Edit &Filters...","Bearbeite &Filter..." },
34{ "Select Filter","Filter wählen" }, 34{ "Select Filter","Filter wählen" },
35{ "Style:","Stil:" }, 35{ "Style:","Stil:" },
36{ "HTML table style.","HTML tabellen stil." }, 36{ "HTML table style.","HTML tabellen stil." },
37{ "Default Table View","Standard Tabellen Ansicht" }, 37{ "Default Table View","Standard Tabellen Ansicht" },
38{ "Show Extension Bar","Zeige Extension Bar" }, 38{ "Show Extension Bar","Zeige Extension Bar" },
39{ "None","Kein" }, 39{ "None","Kein" },
40{ "Name...","Name..." }, 40{ "Name...","Name..." },
41{ "Role:","Funktion:" }, 41{ "Role:","Funktion:" },
42{ "Organization:","Firma:" }, 42{ "Organization:","Firma:" },
43{ "Formatted name:","Formatt. Name:" }, 43{ "Formatted name:","Formatt. Name:" },
44{ "Edit Phone Numbers...","Bearbeite Telefonnummern..." }, 44{ "Edit Phone Numbers...","Bearbeite Telefonnummern..." },
45{ "Categories","Kategorien" }, 45{ "Categories","Kategorien" },
46{ "Public","Öffentlich" }, 46{ "Public","Öffentlich" },
47{ "Private","Privat" }, 47{ "Private","Privat" },
48{ "Confidential","Vertraulich" }, 48{ "Confidential","Vertraulich" },
49{ "&General","Allgemein" }, 49{ "&General","Allgemein" },
50{ "&Edit Addresses...","B&earbeite Adressen..." }, 50{ "&Edit Addresses...","B&earbeite Adressen..." },
51{ "Edit Email Addresses...","Bearbeite E-Mail Adressen..." }, 51{ "Edit Email Addresses...","Bearbeite E-Mail Adressen..." },
52{ "Email:","Email:" }, 52{ "Email:","Email:" },
53{ "URL:","URL:" }, 53{ "URL:","URL:" },
54{ "&IM address:","&IM address:" }, 54{ "&IM address:","&IM address:" },
55{ "&Address","&Adresse" }, 55{ "&Address","&Adresse" },
56{ "Department:","Abteilung:" }, 56{ "Department:","Abteilung:" },
57{ "Office:","Büro:" }, 57{ "Office:","Büro:" },
58{ "Profession:","Beruf:" }, 58{ "Profession:","Beruf:" },
59{ "Manager's name:","N.d.Manager's:" }, 59{ "Manager's name:","N.d.Manager's:" },
60{ "Assistant's name:","N.d.Assistenten:" }, 60{ "Assistant's name:","N.d.Assistenten:" },
61{ "Nick name:","Spitzname:" }, 61{ "Nick name:","Spitzname:" },
62{ "Spouse's name:","N.d.Ehegatten:" }, 62{ "Spouse's name:","N.d.Ehegatten:" },
63{ "Children's names:","N.d.Kinder:" }, 63{ "Children's names:","N.d.Kinder:" },
64{ "Birthday:","Geburtstag:" }, 64{ "Birthday:","Geburtstag:" },
65{ " Local Time","Ortszeit" }, 65{ " Local Time","Ortszeit" },
66{ "Mon","Mo" }, 66{ "Mon","Mo" },
67{ "Tue","Di" }, 67{ "Tue","Di" },
68{ "Wed","Mi" }, 68{ "Wed","Mi" },
69{ "Thu","Do" }, 69{ "Thu","Do" },
70{ "Fri","Fr" }, 70{ "Fri","Fr" },
71{ "Sat","Sa" }, 71{ "Sat","Sa" },
72{ "Sun","So" }, 72{ "Sun","So" },
73{ "January","Januar" }, 73{ "January","Januar" },
74{ "February","Februar" }, 74{ "February","Februar" },
75{ "March","März" }, 75{ "March","März" },
76{ "April","April" }, 76{ "April","April" },
77{ "May","Mai" }, 77{ "May","Mai" },
78{ "June","Juni" }, 78{ "June","Juni" },
79{ "July","July" }, 79{ "July","July" },
80{ "August","August" }, 80{ "August","August" },
81{ "September","September" }, 81{ "September","September" },
82{ "October","October" }, 82{ "October","October" },
83{ "November","November" }, 83{ "November","November" },
84{ "December","Dezember" }, 84{ "December","Dezember" },
85{ "tomorrow","Morgen" }, 85{ "tomorrow","Morgen" },
86{ "today","Heute" }, 86{ "today","Heute" },
87{ "yesterday","Gestern" }, 87{ "yesterday","Gestern" },
88{ "Monday","Montag" }, 88{ "Monday","Montag" },
89{ "Tuesday","Dienstag" }, 89{ "Tuesday","Dienstag" },
90{ "Wednesday","Mittwoch" }, 90{ "Wednesday","Mittwoch" },
91{ "Thursday","Donnerstag" }, 91{ "Thursday","Donnerstag" },
92{ "Friday","Freitag" }, 92{ "Friday","Freitag" },
93{ "Saturday","Samstag" }, 93{ "Saturday","Samstag" },
94{ "Sunday","Sonntag" }, 94{ "Sunday","Sonntag" },
95{ "Anniversary:","Jahrestag:" }, 95{ "Anniversary:","Jahrestag:" },
96{ "Gender:","Geschlecht:" }, 96{ "Gender:","Geschlecht:" },
97{ "ALIEN (undefined)","ALIEN (undefiniert)" }, 97{ "ALIEN (undefined)","ALIEN (undefiniert)" },
98{ "female","weiblich" }, 98{ "female","weiblich" },
99{ "male","männlich" }, 99{ "male","männlich" },
100{ "&Details","&Details" }, 100{ "&Details","&Details" },
101{ "Note:","Notiz:" }, 101{ "Note:","Notiz:" },
102{ "&Notes","&Notizen" }, 102{ "&Notes","&Notizen" },
103{ "Use geo data","Benutze geo Daten" }, 103{ "Use geo data","Benutze geo Daten" },
104{ "Latitude:","Breitengrad:" }, 104{ "Latitude:","Breitengrad:" },
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..." },
130{ "&Exit","B&eenden" }, 130{ "&Exit","B&eenden" },
131{ "&Copy","Kopieren" }, 131{ "&Copy","Kopieren" },
132{ "Cu&t","Ausschneiden" }, 132{ "Cu&t","Ausschneiden" },
133{ "&Paste","Einfügen" }, 133{ "&Paste","Einfügen" },
134{ "Select &All","Alles auswählen" }, 134{ "Select &All","Alles auswählen" },
135{ "&Undo","Rückgängig machen" }, 135{ "&Undo","Rückgängig machen" },
136{ "Re&do","Wiederherstellen" }, 136{ "Re&do","Wiederherstellen" },
137{ "&Delete Contact","Lösche Kontakt" }, 137{ "&Delete Contact","Lösche Kontakt" },
138{ "Configure &Resources...","Konfiguriere &Resourcen..." }, 138{ "Configure &Resources...","Konfiguriere &Resourcen..." },
139{ "&Configure %1...","Konfiguriere %1..." }, 139{ "&Configure %1...","Konfiguriere %1..." },
140{ "Configure S&hortcuts...","Konfiguriere S&hortcuts..." }, 140{ "Configure S&hortcuts...","Konfiguriere S&hortcuts..." },
141{ "Show Jump Bar","Zeige Jump Bar" }, 141{ "Show Jump Bar","Zeige Jump Bar" },
142{ "Show Details","Zeige Details" }, 142{ "Show Details","Zeige Details" },
143{ "Beam receive enabled","Beam (IR) Empfang AN" }, 143{ "Beam receive enabled","Beam (IR) Empfang AN" },
144{ "Set Who Am I","Setze "wer bin ich"" }, 144{ "Set Who Am I","Setze "wer bin ich"" },
145{ "Set Categories for Contacts...","Setze Kategorien für Kontakte..." }, 145{ "Set Categories for Contacts...","Setze Kategorien für Kontakte..." },
146{ "Edit Category List...","Editiere Kategorieliste..." }, 146{ "Edit Category List...","Editiere Kategorieliste..." },
147{ "Remove "voice"...","Entferne "voice"..." }, 147{ "Remove "voice"...","Entferne "voice"..." },
148{ "Import from Outlook...","Importiere aus Outlook..." }, 148{ "Import from Outlook...","Importiere aus Outlook..." },
149{ "Licence","Lizenz" }, 149{ "Licence","Lizenz" },
150{ "Faq","Fragen + Antworten" }, 150{ "Faq","Fragen + Antworten" },
151{ "What's New?","Was ist neu?" }, 151{ "What's New?","Was ist neu?" },
152{ "Sync HowTo","Sync Anleitung" }, 152{ "Sync HowTo","Sync Anleitung" },
153{ "&About KAddressBook","Über KAdressBuch" }, 153{ "&About KAddressBook","Über KAdressBuch" },
154{ "Select Incremental Search Field","Selektiere Such Feld" }, 154{ "Select Incremental Search Field","Selektiere Such Feld" },
155{ "Synchronize","Synchronisieren" }, 155{ "Synchronize","Synchronisieren" },
156{ "Configure...","Konfigurieren..." }, 156{ "Configure...","Konfigurieren..." },
157{ "Enable Pi-Sync","Aktiviere Pi-Sync" }, 157{ "Enable Pi-Sync","Aktiviere Pi-Sync" },
158{ "Multiple sync","Multi Sync" }, 158{ "Multiple sync","Multi Sync" },
159{ "Import CSV List...","Importiere CSV-Datei..." }, 159{ "Import CSV List...","Importiere CSV-Datei..." },
160{ "Export CSV List...","Exportiere CSV-Datei..." }, 160{ "Export CSV List...","Exportiere CSV-Datei..." },
161{ "Import KDE 2 Addressbook...","Importiere KDE 2 Adressbuch..." }, 161{ "Import KDE 2 Addressbook...","Importiere KDE 2 Adressbuch..." },
162{ "Import vCard...","Importiere vCard..." }, 162{ "Import vCard...","Importiere vCard..." },
163{ "Export vCard 3.0...","Exportiere vCard 3.0..." }, 163{ "Export vCard 3.0...","Exportiere vCard 3.0..." },
164{ "Import Qtopia...","Importiere Qtopia..." }, 164{ "Import Qtopia...","Importiere Qtopia..." },
165{ "Export Qtopia...","Exportiere Qtopia..." }, 165{ "Export Qtopia...","Exportiere Qtopia..." },
166{ "Edit Contact","Bearbeite Kontakt" }, 166{ "Edit Contact","Bearbeite Kontakt" },
167{ "Ok","Ok" }, 167{ "Ok","Ok" },
168{ "Apply","Anwenden" }, 168{ "Apply","Anwenden" },
169{ "Cancel","Abbrechen" }, 169{ "Cancel","Abbrechen" },
170{ "KAddressbook/Pi","KAdressbuch/Pi" }, 170{ "KAddressbook/Pi","KAdressbuch/Pi" },
171{ "No Filter","Kein Filter" }, 171{ "No Filter","Kein Filter" },
172{ "Given Name","Vorname" }, 172{ "Given Name","Vorname" },
173{ "Family Name","Nachname" }, 173{ "Family Name","Nachname" },
174{ "Email Address","E-Mail Adresse" }, 174{ "Email Address","E-Mail Adresse" },
175{ "All Fields","Alle Felder" }, 175{ "All Fields","Alle Felder" },
176{ "Question","Frage" }, 176{ "Question","Frage" },
177{ "After importing, phone numbers\nmay have two or more types.\n(E.g. work+voice)\nThese numbers are shown as "other".\nClick Yes to remove the voice type\nfrom numbers with more than one type.\n\nRemove voice type?","After importing, phone numbers\nmay have two or more types.\n(E.g. work+voice)\nThese numbers are shown as "other".\nClick Yes to remove the voice type\nfrom numbers with more than one type.\n\nRemove voice type?" }, 177{ "After importing, phone numbers\nmay have two or more types.\n(E.g. work+voice)\nThese numbers are shown as "other".\nClick Yes to remove the voice type\nfrom numbers with more than one type.\n\nRemove voice type?","After importing, phone numbers\nmay have two or more types.\n(E.g. work+voice)\nThese numbers are shown as "other".\nClick Yes to remove the voice type\nfrom numbers with more than one type.\n\nRemove voice type?" },
178{ "No","Nein" }, 178{ "No","Nein" },
179{ "Yes","Ja" }, 179{ "Yes","Ja" },
180{ "Synchronization Preferences","Einstellungen der Synchronisationsprofile" }, 180{ "Synchronization Preferences","Einstellungen der Synchronisationsprofile" },
181{ "Local device name:","Name dieses Gerätes:" }, 181{ "Local device name:","Name dieses Gerätes:" },
182{ "New profile","Neues Profil" }, 182{ "New profile","Neues Profil" },
183{ "Clone profile","Klone Profil" }, 183{ "Clone profile","Klone Profil" },
184{ "Delete profile","Lösche Profil" }, 184{ "Delete profile","Lösche Profil" },
185{ "Profile:","Profil:" }, 185{ "Profile:","Profil:" },
186{ "Ask for every entry on conflict","Frage bei Konflikten nach"}, 186{ "Ask for every entry on conflict","Frage bei Konflikten nach"},
187{ "Take local entry on conflict","Nimm lokalen Eintrag beim Konflikt" }, 187{ "Take local entry on conflict","Nimm lokalen Eintrag beim Konflikt" },
188{ "Take newest entry on conflict","Nimm neuesten Eintrag beim Konflikt" }, 188{ "Take newest entry on conflict","Nimm neuesten Eintrag beim Konflikt" },
189{ "Take remote entry on conflict","Nimm fernen Eintrag beim Konflikt" } 189{ "Take remote entry on conflict","Nimm fernen Eintrag beim Konflikt" }
190{ "Force: Take local entry always","Erzwinge: Nimm immer lokalen Eintrag" }, 190{ "Force: Take local entry always","Erzwinge: Nimm immer lokalen Eintrag" },
191{ "Force: Take remote entry always","Erzwinge: Nimm immer fernen Eintrag" }, 191{ "Force: Take remote entry always","Erzwinge: Nimm immer fernen Eintrag" },
192{ "Show summary after sync","Zeige Zusammenfassung nach dem Synchronisieren" }, 192{ "Show summary after sync","Zeige Zusammenfassung nach dem Synchronisieren" },
193{ "Write back file","Schreibe Datei zurück" }, 193{ "Write back file","Schreibe Datei zurück" },
194{ "Remote file (w down/upload command)","Entfernte Datei (via down/upload Kommando)" }, 194{ "Remote file (w down/upload command)","Entfernte Datei (via down/upload Kommando)" },
195{ "Pre sync (download) command:","Bevor Sync (download) Kommando:" }, 195{ "Pre sync (download) command:","Bevor Sync (download) Kommando:" },
196{ "Local device name:","Name dieses Gerätes:" }, 196{ "Local device name:","Name dieses Gerätes:" },
197{ "Ask for preferences before sync","Frage nach Synchronisationseinstellungen vor dem Syncen" }, 197{ "Ask for preferences before sync","Frage nach Synchronisationseinstellungen vor dem Syncen" },
198{ "Sync preferences","Synchronisations Einstellungen" }, 198{ "Sync preferences","Synchronisations Einstellungen" },
199{ "Profile kind","Profil Art" }, 199{ "Profile kind","Profil Art" },
200{ "Local file","Lokale Datei" }, 200{ "Local file","Lokale Datei" },
201{ "Local file:","Lokale Datei:" }, 201{ "Local file:","Lokale Datei:" },
202{ "Post sync (upload) command:","Nach Sync (upload) Kommando:" }, 202{ "Post sync (upload) command:","Nach Sync (upload) Kommando:" },
203{ "Fill in default values for:","Setze Beispiel Werte ein für:" }, 203{ "Fill in default values for:","Setze Beispiel Werte ein für:" },
204{ "Hint: Use $PWD$ for placeholder of password!","Hinweis: Benutze $PWD$ als Platzhalter für ein Passwort!" }, 204{ "Hint: Use $PWD$ for placeholder of password!","Hinweis: Benutze $PWD$ als Platzhalter für ein Passwort!" },
205{ "Synchronization Preferences","Einstellungen der Synchronisationsprofile"}, 205{ "Synchronization Preferences","Einstellungen der Synchronisationsprofile"},
206{ "Device","Gerät:" }, 206{ "Device","Gerät:" },
207{ "Sync with file \n...%1\nfrom:\n%2\n","Sync mit Datei \n...%1\nvom:\n%2\n" }, 207{ "Sync with file \n...%1\nfrom:\n%2\n","Sync mit Datei \n...%1\nvom:\n%2\n" },
208{ "Synchronization summary:\n\n %d items added to local\n %d items added to remote\n %d items updated on local\n %d items updated on remote\n %d items deleted on local\n %d items deleted on remote\n","Synchronisationsübersicht:\n\n %d items lokal hinzugefügt\n %d items entfernt hinzugefügt\n %d items lokal geändert\n %d items entfernt geändert\n %d items lokal gelöscht\n %d items entfernt gelöscht\n" }, 208{ "Synchronization summary:\n\n %d items added to local\n %d items added to remote\n %d items updated on local\n %d items updated on remote\n %d items deleted on local\n %d items deleted on remote\n","Synchronisationsübersicht:\n\n %d items lokal hinzugefügt\n %d items entfernt hinzugefügt\n %d items lokal geändert\n %d items entfernt geändert\n %d items lokal gelöscht\n %d items entfernt gelöscht\n" },
209{ "Synchronization successful","Synchronisation erfolgreich" }, 209{ "Synchronization successful","Synchronisation erfolgreich" },
210{ "Sync cancelled or failed. Nothing synced.","Sync abgebrochen oder fehlgeschlagen. Nichts wurde gesynced." }, 210{ "Sync cancelled or failed. Nothing synced.","Sync abgebrochen oder fehlgeschlagen. Nichts wurde gesynced." },
211{ "Sync file \n...%1\ndoes not exist!\nNothing synced!\n","Sync Datei \n...%1\nexistiert nicht!\nNichts wurde gesynced!\n" }, 211{ "Sync file \n...%1\ndoes not exist!\nNothing synced!\n","Sync Datei \n...%1\nexistiert nicht!\nNichts wurde gesynced!\n" },
212{ "Sync filename(*.ics/*.vcs)","Sync Dateiname(*.ics/*.vcs)" }, 212{ "Sync filename(*.ics/*.vcs)","Sync Dateiname(*.ics/*.vcs)" },
213{ "Enter password","Passwort eingeben" }, 213{ "Enter password","Passwort eingeben" },
214{ "Do you really want\nto remote sync\nwith profile \n","Wollen Sie wirklich\nmit dem entfernten\nProfil syncen: \n" }, 214{ "Do you really want\nto remote sync\nwith profile \n","Wollen Sie wirklich\nmit dem entfernten\nProfil syncen: \n" },
215{ "Copy remote file to local machine...","Kopiere entfernte Datei auf lokalen Rechner..." }, 215{ "Copy remote file to local machine...","Kopiere entfernte Datei auf lokalen Rechner..." },
216{ "Sorry, the copy command failed!\nCommand was:\n%1\n \nTry command on console to get more\ndetailed info about the reason.\n","Sorry, das Kopierkommando schlug fehl!\nKommando war:\n%1\n \nVersuche Kommando von Kosole um\nDetails für das Fehlschlagen\nzu erfahren.\n" }, 216{ "Sorry, the copy command failed!\nCommand was:\n%1\n \nTry command on console to get more\ndetailed info about the reason.\n","Sorry, das Kopierkommando schlug fehl!\nKommando war:\n%1\n \nVersuche Kommando von Kosole um\nDetails für das Fehlschlagen\nzu erfahren.\n" },
217{ "Writing back file result: ","Resultat des Dateizurückschreibens: " }, 217{ "Writing back file result: ","Resultat des Dateizurückschreibens: " },
218{ "Syncronization sucessfully completed","Synchronisation erfolgreich abgeschlossen" }, 218{ "Syncronization sucessfully completed","Synchronisation erfolgreich abgeschlossen" },
219{ "Used %1 Client","Benutzter %1 Client" }, 219{ "Used %1 Client","Benutzter %1 Client" },
220{ "No email client installed","Kein Email Klient installiert" }, 220{ "No email client installed","Kein Email Klient installiert" },
221{ "Userdefined email client","Benutzerdef. Email Klient" }, 221{ "Userdefined email client","Benutzerdef. Email Klient" },
222{ "OM/Pi email client","OM/Pi Email Klient" }, 222{ "OM/Pi email client","OM/Pi Email Klient" },
223{ "Include in multiple ","Beziehe in mehrfach " }, 223{ "Include in multiple ","Beziehe in mehrfach " },
224{ "calendar ","Kalender " }, 224{ "calendar ","Kalender " },
225{ "addressbook ","Adressbuch " }, 225{ "addressbook ","Adressbuch " },
226{ "pwmanager","PWmanager" }, 226{ "pwmanager","PWmanager" },
227{ " sync"," Sync ein" }, 227{ " sync"," Sync ein" },
228{ "Write back synced data","Schreibe gesyncte Daten zurück" }, 228{ "Write back synced data","Schreibe gesyncte Daten zurück" },
229{ "-- Write back (on remote) existing entries only","-- Schreibe nur existierende (entfernte) Einträge zurück" }, 229{ "-- Write back (on remote) existing entries only","-- Schreibe nur existierende (entfernte) Einträge zurück" },
230{ "-- Write back (calendar) entries in future only","-- Schreibe nur zukünftige Kalender-Einträge zurück" }, 230{ "-- Write back (calendar) entries in future only","-- Schreibe nur zukünftige Kalender-Einträge zurück" },
231{ "---- Max. weeks in future: ","---- Max. wochen in der Zukunft: " }, 231{ "---- Max. weeks in future: ","---- Max. wochen in der Zukunft: " },
232{ "Pi-Sync ( direct Kx/Pi to Kx/Pi sync )","Pi-Sync ( direktes Kx/Pi zu Kx/Pi sync )" }, 232{ "Pi-Sync ( direct Kx/Pi to Kx/Pi sync )","Pi-Sync ( direktes Kx/Pi zu Kx/Pi sync )" },
233{ "Mobile device (cell phone)","Mobiles Gerät (Handy)" }, 233{ "Mobile device (cell phone)","Mobiles Gerät (Handy)" },
234{ "Help...","Hilfe..." }, 234{ "Help...","Hilfe..." },
235{ "Local file Cal:","Lokale Datei Kal:" }, 235{ "Local file Cal:","Lokale Datei Kal:" },
236{ "Local file ABook:","Lokale Datei ABuch:" }, 236{ "Local file ABook:","Lokale Datei ABuch:" },
237{ "Local file PWMgr:","Lokale Datei PWMgr:" }, 237{ "Local file PWMgr:","Lokale Datei PWMgr:" },
238{ "Addressbook file (*.vcf) is used by KA/Pi","Adressbuch Datei (*.vcf) wird von KA/Pi genutzt" }, 238{ "Addressbook file (*.vcf) is used by KA/Pi","Adressbuch Datei (*.vcf) wird von KA/Pi genutzt" },
239{ "Calendar:","Kalender:" }, 239{ "Calendar:","Kalender:" },
240{ "AddressBook:","AdressBuch:" }, 240{ "AddressBook:","AdressBuch:" },
241{ "PWManager:","PWManager:" }, 241{ "PWManager:","PWManager:" },
242{ "Addressbook file is used by KA/Pi","Adressbuch Datei wird von KA/Pi genutzt" }, 242{ "Addressbook file is used by KA/Pi","Adressbuch Datei wird von KA/Pi genutzt" },
243{ "ssh/scp","ssh/scp" }, 243{ "ssh/scp","ssh/scp" },
244{ "ftp","ftp" }, 244{ "ftp","ftp" },
245{ "Password for remote access: (could be the same for each)","Passwort für entfernten Zugriff: (kann dasselbe sein für alle)" }, 245{ "Password for remote access: (could be the same for each)","Passwort für entfernten Zugriff: (kann dasselbe sein für alle)" },
246{ "Remote IP address: (could be the same for each)","Entfernte IP Adresse: (kann dasselbe sein für alle)" }, 246{ "Remote IP address: (could be the same for each)","Entfernte IP Adresse: (kann dasselbe sein für alle)" },
247{ "Remote port number: (should be different for each)","Entfernte Port Nummer: (Sollte für alle unterschiedlich sein)" }, 247{ "Remote port number: (should be different for each)","Entfernte Port Nummer: (Sollte für alle unterschiedlich sein)" },
248{ "command for downloading remote file to local device","Kommando zum Download der entfernten Datei zum lokalen Gerät" }, 248{ "command for downloading remote file to local device","Kommando zum Download der entfernten Datei zum lokalen Gerät" },
249{ "command for uploading local temp file to remote device","Kommando zum Upload der lokalen temp. Datei zum entfernten Gerät" }, 249{ "command for uploading local temp file to remote device","Kommando zum Upload der lokalen temp. Datei zum entfernten Gerät" },
250{ "Insert device where\nphone is connected. E.g.:\n","Füge Device ein, an dem\ndas Handy angeschlossen ist. Z.B.:\n" }, 250{ "Insert device where\nphone is connected. E.g.:\n","Füge Device ein, an dem\ndas Handy angeschlossen ist. Z.B.:\n" },
251{ "KDE-Pim sync config","KDE-Pim sync Konfig" }, 251{ "KDE-Pim sync config","KDE-Pim sync Konfig" },
252{ "Insert kind of connection,e.g.:\n","Füge Art der Verbindung ein,z.B.:\n" }, 252{ "Insert kind of connection,e.g.:\n","Füge Art der Verbindung ein,z.B.:\n" },
253{ "Recommended: Leave empty!\n(Such that model can\nbe auto detected)\nOr insert name of model:\n","Empfohlen: Leer lassen!\n(So dass das Model\nautomatisch erkannt\nwerden kann)\nOder füge Model Name ein:\n" }, 253{ "Recommended: Leave empty!\n(Such that model can\nbe auto detected)\nOr insert name of model:\n","Empfohlen: Leer lassen!\n(So dass das Model\nautomatisch erkannt\nwerden kann)\nOder füge Model Name ein:\n" },
254{ "Port number (Default: %1)","Port Nummer (Default: %1)" }, 254{ "Port number (Default: %1)","Port Nummer (Default: %1)" },
255{ "Password to enable\naccess from remote:","Passwort um entfernten\nZugriff zuzulassen:" }, 255{ "Password to enable\naccess from remote:","Passwort um entfernten\nZugriff zuzulassen:" },
256{ "Automatically start\nat application startup","Starte automatisch\nbeim Programmstart" }, 256{ "Automatically start\nat application startup","Starte automatisch\nbeim Programmstart" },
257{ "Automatically sync\nwith KDE-Desktop","Automatischer Sync\nmit dem KDE-Desktop" }, 257{ "Automatically sync\nwith KDE-Desktop","Automatischer Sync\nmit dem KDE-Desktop" },
258{ "Enter port for Pi-Sync","Port Nummer für Pi-Sync" }, 258{ "Enter port for Pi-Sync","Port Nummer für Pi-Sync" },
259{ "Disable Pi-Sync","Schalte Pi-Sync aus" }, 259{ "Disable Pi-Sync","Schalte Pi-Sync aus" },
260{ "Do you really want\nto multiple sync\nwith all checked profiles?\nSyncing takes some\ntime - all profiles\nare synced twice!","Wollen Sie wirklich\nmit allen selektierten\nProfilen "Multi-Syncen"?\nDas Syncen dauert einige Zeit -\nalle Profile werden zweimal gesynct!" }, 260{ "Do you really want\nto multiple sync\nwith all checked profiles?\nSyncing takes some\ntime - all profiles\nare synced twice!","Wollen Sie wirklich\nmit allen selektierten\nProfilen "Multi-Syncen"?\nDas Syncen dauert einige Zeit -\nalle Profile werden zweimal gesynct!" },
261{ "KDE-Pim Sync","KDE-Pim Sync" }, 261{ "KDE-Pim Sync","KDE-Pim Sync" },
262{ "Multiple profiles","Multi-Sync Profile" }, 262{ "Multiple profiles","Multi-Sync Profile" },
263{ "Device: ","Gerät: " }, 263{ "Device: ","Gerät: " },
264{ "Multiple sync started.","Multi-Sync gestartet." }, 264{ "Multiple sync started.","Multi-Sync gestartet." },
265{ "Nothing synced! No profiles defined for multisync!","Nichts gesynct! Keine Profile selektiert für Multi-Sync" }, 265{ "Nothing synced! No profiles defined for multisync!","Nichts gesynct! Keine Profile selektiert für Multi-Sync" },
266{ "KDE-Pim sync config","KDE-Pim Sync Konfig" }, 266{ "KDE-Pim sync config","KDE-Pim Sync Konfig" },
267{ "Insert kind of connection,e.g.:\n","Füge Art der Verbindung ein, z.B.:\n" }, 267{ "Insert kind of connection,e.g.:\n","Füge Art der Verbindung ein, z.B.:\n" },
268{ "Recommended: Leave empty!\n(Such that model can\nbe auto detected)\nOr insert name of model:\n","Empfohlen: Leer lassen!\n(So dass das Modell\nautomatisch\erkannt\nwerden kann)\nOder füge Model Name ein:\n" }, 268{ "Recommended: Leave empty!\n(Such that model can\nbe auto detected)\nOr insert name of model:\n","Empfohlen: Leer lassen!\n(So dass das Modell\nautomatisch\erkannt\nwerden kann)\nOder füge Model Name ein:\n" },
269{ "KO/Pi config error","KO/Pi Konfig. Fehler" }, 269{ "KO/Pi config error","KO/Pi Konfig. Fehler" },
270{ "Local device name undefined!\nPlease define device name!","Name dieses Gerätes undefiniert!\nBitte Namen angeben!" }, 270{ "Local device name undefined!\nPlease define device name!","Name dieses Gerätes undefiniert!\nBitte Namen angeben!" },
271{ "Edit Address Book Filters","Editiere Addressbuch Filter" }, 271{ "Edit Address Book Filters","Editiere Addressbuch Filter" },
272{ "&Add...","Hinzufügen..." }, 272{ "&Add...","Hinzufügen..." },
273{ "&Edit...","B&earbeiten..." }, 273{ "&Edit...","B&earbeiten..." },
274{ "&Remove","Entfe&rne" }, 274{ "&Remove","Entfe&rne" },
275{ "Modify View: ","Ansicht ändern: " }, 275{ "Modify View: ","Ansicht ändern: " },
276{ "Fields","Felder" }, 276{ "Fields","Felder" },
277{ "Select Fields to Display","Wähle anzuzeigende Felder" }, 277{ "Select Fields to Display","Wähle anzuzeigende Felder" },
278{ "All","Alles" }, 278{ "All","Alles" },
279{ "Frequent","Frequent" }, 279{ "Frequent","Frequent" },
280{ "Address","Adresse" }, 280{ "Address","Adresse" },
281{ "Email","E-Mail" }, 281{ "Email","E-Mail" },
282{ "Personal","Persönl." }, 282{ "Personal","Persönl." },
283{ "Organization","Organisation" }, 283{ "Organization","Organisation" },
284{ "Custom","Benutzerdefiniert" }, 284{ "Custom","Benutzerdefiniert" },
285{ "&Selected\nfields:","&Selektierte\nFelder:" }, 285{ "&Selected\nfields:","&Selektierte\nFelder:" },
286{ "Formatted Name","Format. Name" }, 286{ "Formatted Name","Format. Name" },
287{ "Additional Names","Mittelname" }, 287{ "Additional Names","Mittelname" },
288{ "Honorific Prefixes","Namensprefix" }, 288{ "Honorific Prefixes","Namensprefix" },
289{ "Honorific Suffixes","Namenssuffix" }, 289{ "Honorific Suffixes","Namenssuffix" },
290{ "Nick Name","Spitzname" }, 290{ "Nick Name","Spitzname" },
291{ "Birthday","Geburtstag" }, 291{ "Birthday","Geburtstag" },
292{ "Home Address Street","Privat Adresse Strasse" }, 292{ "Home Address Street","Privat Adresse Strasse" },
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." },
321{ "No default filter","Kein default Filter" }, 321{ "No default filter","Kein default Filter" },
322{ "Use last active filter","Nutze letzen aktiven Filter" }, 322{ "Use last active filter","Nutze letzen aktiven Filter" },
323{ "Use filter:","Nutze Filter:" }, 323{ "Use filter:","Nutze Filter:" },
324{ "Look & Feel","Look & Feel" }, 324{ "Look & Feel","Look & Feel" },
325{ "Row Separator","Reihen Separator" }, 325{ "Row Separator","Reihen Separator" },
326{ "Alternating backgrounds","Abwechselnder Hintergrund" }, 326{ "Alternating backgrounds","Abwechselnder Hintergrund" },
327{ "Single line","Einzelne Zeile" }, 327{ "Single line","Einzelne Zeile" },
328{ "Enable background image:","Hintergrundbild:" }, 328{ "Enable background image:","Hintergrundbild:" },
329{ "Enable contact tooltips","Contact Tooltips" }, 329{ "Enable contact tooltips","Contact Tooltips" },
330{ "&Enable custom Colors","Benutzerdef. Farben" }, 330{ "&Enable custom Colors","Benutzerdef. Farben" },
331{ "&Colors","Farben" }, 331{ "&Colors","Farben" },
332{ "If custom colors are enabled, you may choose the colors for the view below. Otherwise colors from your current KDE color scheme are used.","#If custom colors are enabled, you may choose the colors for the view below. Otherwise colors from your current KDE color scheme are used." }, 332{ "If custom colors are enabled, you may choose the colors for the view below. Otherwise colors from your current KDE color scheme are used.","#If custom colors are enabled, you may choose the colors for the view below. Otherwise colors from your current KDE color scheme are used." },
333{ "Double click or press RETURN on a item to select a color for the related strings in the view.","#Double click or press RETURN on a item to select a color for the related strings in the view." }, 333{ "Double click or press RETURN on a item to select a color for the related strings in the view.","#Double click or press RETURN on a item to select a color for the related strings in the view." },
334{ "&Enable custom fonts","B&enutzerdefinierte Schriften" }, 334{ "&Enable custom fonts","B&enutzerdefinierte Schriften" },
335{ "&Text font:","Textschriftart:" }, 335{ "&Text font:","Textschriftart:" },
336{ "&Header font:","Titelschriftart:" }, 336{ "&Header font:","Titelschriftart:" },
337{ "If custom fonts are enabled, you may choose which fonts to use for this view below. Otherwise the default KDE font will be used, in bold style for the header and normal style for the data.","#If custom fonts are enabled, you may choose which fonts to use for this view below. Otherwise the default KDE font will be used, in bold style for the header and normal style for the data." }, 337{ "If custom fonts are enabled, you may choose which fonts to use for this view below. Otherwise the default KDE font will be used, in bold style for the header and normal style for the data.","#If custom fonts are enabled, you may choose which fonts to use for this view below. Otherwise the default KDE font will be used, in bold style for the header and normal style for the data." },
338{ "&Fonts","Schri&ften" }, 338{ "&Fonts","Schri&ften" },
339{ "Background Color","Hintergrundfarbe" }, 339{ "Background Color","Hintergrundfarbe" },
340{ "Text Color","Textfarbe" }, 340{ "Text Color","Textfarbe" },
341{ "Header Background Color","Titel Hintergrundfarbe" }, 341{ "Header Background Color","Titel Hintergrundfarbe" },
342{ "Header Text Color","Titel Farbe" }, 342{ "Header Text Color","Titel Farbe" },
343{ "Highlight Color","Auswahlfarbe" }, 343{ "Highlight Color","Auswahlfarbe" },
344{ "Highlighted Text Color","Auswahltextfarbe" }, 344{ "Highlighted Text Color","Auswahltextfarbe" },
345{ "Alternating Background Color","Abwechselnder Hintergrundfarbe" }, 345{ "Alternating Background Color","Abwechselnder Hintergrundfarbe" },
346{ "Postal","Post" }, 346{ "Postal","Post" },
347{ "Dr.","Dr." }, 347{ "Dr.","Dr." },
348{ "Miss","Frl." }, 348{ "Miss","Frl." },
349{ "Mr.","Herr" }, 349{ "Mr.","Herr" },
350{ "Mrs.","Frau" }, 350{ "Mrs.","Frau" },
351{ "Ms.","Fr." }, 351{ "Ms.","Fr." },
352{ "Prof.","Prof." }, 352{ "Prof.","Prof." },
353{ "I","I" }, 353{ "I","I" },
354{ "II","II" }, 354{ "II","II" },
355{ "III","III" }, 355{ "III","III" },
356{ "Jr.","Jr." }, 356{ "Jr.","Jr." },
357{ "Sr.","Sr." }, 357{ "Sr.","Sr." },
358{ "Name:","Name:" }, 358{ "Name:","Name:" },
359{ "Documents","Dokumente" }, 359{ "Documents","Dokumente" },
360{ "Files","Dateien" }, 360{ "Files","Dateien" },
361{ "All Files","Alle Dateien" }, 361{ "All Files","Alle Dateien" },
362{ "Name","Name" }, 362{ "Name","Name" },
363{ "Size","Größe" }, 363{ "Size","Größe" },
364{ "Date","Datum" }, 364{ "Date","Datum" },
365{ "Mime Type","Mime Typ" }, 365{ "Mime Type","Mime Typ" },
366{ "Geo Data Input","Geo Dateneingabe" }, 366{ "Geo Data Input","Geo Dateneingabe" },
367{ "Sexagesimal","Sexagesimal" }, 367{ "Sexagesimal","Sexagesimal" },
368{ "North","Nord" }, 368{ "North","Nord" },
369{ "South","Süd" }, 369{ "South","Süd" },
370{ "East","Ost" }, 370{ "East","Ost" },
371{ "West","West" }, 371{ "West","West" },
372{ "Undefined","Unbestimmt" }, 372{ "Undefined","Unbestimmt" },
373{ "Edit Address","Bearbeite Adresse" }, 373{ "Edit Address","Bearbeite Adresse" },
374{ "Street:","Strasse:" }, 374{ "Street:","Strasse:" },
375{ "Post office box:","Postfach:" }, 375{ "Post office box:","Postfach:" },
376{ "Locality:","Stadt:" }, 376{ "Locality:","Stadt:" },
377{ "Region:","Region:" }, 377{ "Region:","Region:" },
378{ "Postal code:","PLZ:" }, 378{ "Postal code:","PLZ:" },
379{ "Country:","Staat:" }, 379{ "Country:","Staat:" },
380{ "This is the preferred address","Dies ist die bevorzugte Adresse" }, 380{ "This is the preferred address","Dies ist die bevorzugte Adresse" },
381{ "New...","Neu..." }, 381{ "New...","Neu..." },
382{ "Change Type","Ändere Art" }, 382{ "Change Type","Ändere Art" },
383{ "Edit Address Type","Ändere Address Art" }, 383{ "Edit Address Type","Ändere Address Art" },
384{ "Address Types","Address Art" }, 384{ "Address Types","Address Art" },
385{ "Domestic","Inland" }, 385{ "Domestic","Inland" },
386{ "International","International" }, 386{ "International","International" },
387{ "Parcel","Paket" }, 387{ "Parcel","Paket" },
388{ "Edit Contact Name","Ändere Kontakt Name" }, 388{ "Edit Contact Name","Ändere Kontakt Name" },
389{ "Honorific prefixes:","Namensprefixes:" }, 389{ "Honorific prefixes:","Namensprefixes:" },
390{ "Given name:","Vorname:" }, 390{ "Given name:","Vorname:" },
391{ "Additional names:","Mittelnamen:" }, 391{ "Additional names:","Mittelnamen:" },
392{ "Family names:","Nachname:" }, 392{ "Family names:","Nachname:" },
393{ "Honorific suffixes:","Namenssuffixe:" }, 393{ "Honorific suffixes:","Namenssuffixe:" },
394{ "Parse name automatically","Setze Namen automatisch" }, 394{ "Parse name automatically","Setze Namen automatisch" },
395{ "Edit Phone Numbers","Bearbeite Telefonnummern" }, 395{ "Edit Phone Numbers","Bearbeite Telefonnummern" },
396{ "Number","Nummer" }, 396{ "Number","Nummer" },
397{ "Type","Typ" }, 397{ "Type","Typ" },
398{ "Edit Phone Number","Bearbeite Telefonnummer" }, 398{ "Edit Phone Number","Bearbeite Telefonnummer" },
399{ "Number:","Nummer:" }, 399{ "Number:","Nummer:" },
400{ "This is the preferred phone number","Dies ist die bevorzugte Telefonnummer" }, 400{ "This is the preferred phone number","Dies ist die bevorzugte Telefonnummer" },
401{ "Types","Typen" }, 401{ "Types","Typen" },
402{ "Messenger","Messenger" }, 402{ "Messenger","Messenger" },
403{ "Other","Anderes" }, 403{ "Other","Anderes" },
404{ "Video","Video" }, 404{ "Video","Video" },
@@ -659,168 +659,174 @@
659{ "confidential","Vertraulich" }, 659{ "confidential","Vertraulich" },
660{ "Configure Resources","Konfiguriere Resourcen" }, 660{ "Configure Resources","Konfiguriere Resourcen" },
661{ "Resource Configuration","Resource Konfiguration" }, 661{ "Resource Configuration","Resource Konfiguration" },
662{ "Resources","Resourcen" }, 662{ "Resources","Resourcen" },
663{ "Standard","Standard" }, 663{ "Standard","Standard" },
664{ "&Use as Standard","Setze als Standard" }, 664{ "&Use as Standard","Setze als Standard" },
665{ "Select type of the new resource:","Selektiere Typ der neuen Resource:" }, 665{ "Select type of the new resource:","Selektiere Typ der neuen Resource:" },
666{ "General Settings","Allgemeine Einstellungen" }, 666{ "General Settings","Allgemeine Einstellungen" },
667{ "Read-only","Nur-Lesen" }, 667{ "Read-only","Nur-Lesen" },
668{ "Include in sync","Schließe in Sync mit ein" }, 668{ "Include in sync","Schließe in Sync mit ein" },
669{ "%1 Resource Settings","%1 Resource Einstellungen" }, 669{ "%1 Resource Settings","%1 Resource Einstellungen" },
670{ "Format:","Format:" }, 670{ "Format:","Format:" },
671{ "Location:","Ort:" }, 671{ "Location:","Ort:" },
672{ "Full Menu bar (restart)","Volle Menu Leiste (Neustart!)" }, 672{ "Full Menu bar (restart)","Volle Menu Leiste (Neustart!)" },
673{ "Language","Sprache" }, 673{ "Language","Sprache" },
674{ "Time Format","Zeit Format" }, 674{ "Time Format","Zeit Format" },
675{ "Time Zone","Zeit Zone" }, 675{ "Time Zone","Zeit Zone" },
676{ "Data storage path","Daten Speicherpfad" }, 676{ "Data storage path","Daten Speicherpfad" },
677{ "Your current storage dir is:\n%1\nYour mail is stored in:\n(storagedir)/apps/kopiemail/localmail","Aktuelles Speicherverzeichnis ist:\n%1\nIhre Mail wird gespeichert in:\n(speicherverz.)/apps/kopiemail/localmail" }, 677{ "Your current storage dir is:\n%1\nYour mail is stored in:\n(storagedir)/apps/kopiemail/localmail","Aktuelles Speicherverzeichnis ist:\n%1\nIhre Mail wird gespeichert in:\n(speicherverz.)/apps/kopiemail/localmail" },
678{ "<b>New data storage dir:</b>","<b>Neues Datenspeicherverzeichnis:</b>" }, 678{ "<b>New data storage dir:</b>","<b>Neues Datenspeicherverzeichnis:</b>" },
679{ "New dirs are created automatically","Neue Verzeichnisse werden aut. erstellt" }, 679{ "New dirs are created automatically","Neue Verzeichnisse werden aut. erstellt" },
680{ "Save settings","Speichere Einstellungen" }, 680{ "Save settings","Speichere Einstellungen" },
681{ "Save standard","Speichere Standard" }, 681{ "Save standard","Speichere Standard" },
682{ "Save","Speichern" }, 682{ "Save","Speichern" },
683{ "<b>New settings are used\nafter a restart</b>","<b>Neue Einstellungen werden nach\neinem Neustart genutzt</b>" }, 683{ "<b>New settings are used\nafter a restart</b>","<b>Neue Einstellungen werden nach\neinem Neustart genutzt</b>" },
684{ "Settings are stored in\n%1","Einstellungen werden gespeichert in:\n%1" }, 684{ "Settings are stored in\n%1","Einstellungen werden gespeichert in:\n%1" },
685{ "Multiple Sync options","Multi Sync Optionen" }, 685{ "Multiple Sync options","Multi Sync Optionen" },
686{ "Sync algo options","Sync Ablauf Optionen" }, 686{ "Sync algo options","Sync Ablauf Optionen" },
687{ "Apply filter when adding data to local:","Filter für das Hinzufügen von Daten zu Lokal:" }, 687{ "Apply filter when adding data to local:","Filter für das Hinzufügen von Daten zu Lokal:" },
688{ "Incoming calendar filter:","Eingehender Kalender Filter:" }, 688{ "Incoming calendar filter:","Eingehender Kalender Filter:" },
689{ "Incoming addressbook filter:","Eingehender Adressbuch Filter:" }, 689{ "Incoming addressbook filter:","Eingehender Adressbuch Filter:" },
690{ "Write back options","Optionen zum Zurückschreiben" }, 690{ "Write back options","Optionen zum Zurückschreiben" },
691{ "Write back (on remote) existing entries only","Schreibe nur existierende (auf Entfernt) Einträge zurück" }, 691{ "Write back (on remote) existing entries only","Schreibe nur existierende (auf Entfernt) Einträge zurück" },
692{ "Apply filter when adding data to remote:","Filter für das Hinzufügen von Daten zu Entfernt:" }, 692{ "Apply filter when adding data to remote:","Filter für das Hinzufügen von Daten zu Entfernt:" },
693{ "Outgoing calendar filter:","Ausgehender Kalender Filter:" }, 693{ "Outgoing calendar filter:","Ausgehender Kalender Filter:" },
694{ "Outgoing addressbook filter:","Ausgehender Adressbuch Filter:" }, 694{ "Outgoing addressbook filter:","Ausgehender Adressbuch Filter:" },
695{ "Write back (calendar) entries for time period only","Schreibe nur Kalender Einträge für Zeitspanne zurück" }, 695{ "Write back (calendar) entries for time period only","Schreibe nur Kalender Einträge für Zeitspanne zurück" },
696{ "Time period","Zeitspanne" }, 696{ "Time period","Zeitspanne" },
697{ "From ","Von " }, 697{ "From ","Von " },
698{ " weeks in the past to "," Wochen in der Vergangenheit bis zu " }, 698{ " weeks in the past to "," Wochen in der Vergangenheit bis zu " },
699{ " weeks in the future "," Wochen in der Zukunft " }, 699{ " weeks in the future "," Wochen in der Zukunft " },
700{ "Profile kind specific settings","Profil Art abhängige Einstellungen" }, 700{ "Profile kind specific settings","Profil Art abhängige Einstellungen" },
701{ "Local temp file:","Lokale temp Datei:" }, 701{ "Local temp file:","Lokale temp Datei:" },
702{ "Multiple profiles with same name!\nPlease use unique profile names!","Mehrere Profile mit demselben Namen!\nBitte verschiedene Namen benutzen!" }, 702{ "Multiple profiles with same name!\nPlease use unique profile names!","Mehrere Profile mit demselben Namen!\nBitte verschiedene Namen benutzen!" },
703{ "Aborted! Nothing synced!","Abgebrochen! Nichts wurde gesynct!" }, 703{ "Aborted! Nothing synced!","Abgebrochen! Nichts wurde gesynct!" },
704{ "You cannot remove your standard resource!\n Please select a new standard resource first.","Standard Resource kann\nnicht entfernt werden!\nBitte eine andere Resource\nals Standard setzen." }, 704{ "You cannot remove your standard resource!\n Please select a new standard resource first.","Standard Resource kann\nnicht entfernt werden!\nBitte eine andere Resource\nals Standard setzen." },
705{ "Sorry","Tut mir leid" }, 705{ "Sorry","Tut mir leid" },
706{ "You cannot use a read-only<br> resource as standard!","Man kann nicht eine read-only<br> Resource als Standard setzen!" }, 706{ "You cannot use a read-only<br> resource as standard!","Man kann nicht eine read-only<br> Resource als Standard setzen!" },
707{ "Please restart to get the \nchanged resources (re)loaded!\n","Bitte starten Sie jetzt\ndas Programm neu, um die geänderten\nResourcen neu zu laden!\n" }, 707{ "Please restart to get the \nchanged resources (re)loaded!\n","Bitte starten Sie jetzt\ndas Programm neu, um die geänderten\nResourcen neu zu laden!\n" },
708{ "The selected file does not\ninclude a valid vCard.\nPlease check the file and try again.\n","Die gewählte Datei enthält\nkeine gültige vCard.\nBitte prüfen Sie die Datei\nund versuchen es erneut.\n" }, 708{ "The selected file does not\ninclude a valid vCard.\nPlease check the file and try again.\n","Die gewählte Datei enthält\nkeine gültige vCard.\nBitte prüfen Sie die Datei\nund versuchen es erneut.\n" },
709{ "Unable to load resource '%1'","Resource kann nicht geladen werden: '%1'" }, 709{ "Unable to load resource '%1'","Resource kann nicht geladen werden: '%1'" },
710{ "Some changes are only\neffective after a restart!\n","Einige Änderungen werden erst\nnach einem Neustart übernommen!\n" }, 710{ "Some changes are only\neffective after a restart!\n","Einige Änderungen werden erst\nnach einem Neustart übernommen!\n" },
711{ "Syncing aborted. Nothing synced.","Syncing abgebrochen.Nichts wurde gesynct." }, 711{ "Syncing aborted. Nothing synced.","Syncing abgebrochen.Nichts wurde gesynct." },
712{ "Connected! Sending request for remote file ...","Verbunden! Sende Daten Anfrage..." }, 712{ "Connected! Sending request for remote file ...","Verbunden! Sende Daten Anfrage..." },
713{ "Trying to connect to remote...","Versuche mit Gegenstelle zu verbinden..." }, 713{ "Trying to connect to remote...","Versuche mit Gegenstelle zu verbinden..." },
714{ "Connection to remote\nhost timed out!\nDid you forgot to enable\nsyncing on remote host?","Verbindungsversuch wegen\nZeitüberschreitung gescheitert!\nWurde vergessen Pi-Sync auf\nder Gegenstelle anzuschalten?" }, 714{ "Connection to remote\nhost timed out!\nDid you forgot to enable\nsyncing on remote host?","Verbindungsversuch wegen\nZeitüberschreitung gescheitert!\nWurde vergessen Pi-Sync auf\nder Gegenstelle anzuschalten?" },
715{ "ERROR: Receiving remote file failed.","FEHLER: Empfang der entfernten Daten fehlgeschlagen." }, 715{ "ERROR: Receiving remote file failed.","FEHLER: Empfang der entfernten Daten fehlgeschlagen." },
716{ "Error","Fehler" }, 716{ "Error","Fehler" },
717{ ""You entered an invalid date!\n Date changed to current date.","Ungültiges Datum eingegeben.\nSetze heutiges Datum." }, 717{ ""You entered an invalid date!\n Date changed to current date.","Ungültiges Datum eingegeben.\nSetze heutiges Datum." },
718{ "You entered an invalid date!\n Will use current date instead.","Ungültiges Datum eingegeben.\nSetze stattdessen heutiges Datum." }, 718{ "You entered an invalid date!\n Will use current date instead.","Ungültiges Datum eingegeben.\nSetze stattdessen heutiges Datum." },
719{ "Warning","Warnung" }, 719{ "Warning","Warnung" },
720{ "Select week number","Wähle Wochen Nummer" }, 720{ "Select week number","Wähle Wochen Nummer" },
721{ "Februar","Februar" }, 721{ "Februar","Februar" },
722{ "Pi-Sync options for device: ","Pi-Sync Einstellungen für Gerät: " }, 722{ "Pi-Sync options for device: ","Pi-Sync Einstellungen für Gerät: " },
723{ "Password for remote access:","Passwort für fernen Zugriff:" }, 723{ "Password for remote access:","Passwort für fernen Zugriff:" },
724{ "Remote IP address:","Ferne IP Adresse:" }, 724{ "Remote IP address:","Ferne IP Adresse:" },
725{ "Remote port number:","Ferne Port Nummer:" }, 725{ "Remote port number:","Ferne Port Nummer:" },
726{ "Remote file saved to temp file.","Ferne Daten in temp Datei gespeichert." }, 726{ "Remote file saved to temp file.","Ferne Daten in temp Datei gespeichert." },
727{ "Remote from: ","Fern von: " }, 727{ "Remote from: ","Fern von: " },
728{ "Local from: ","Lokal von: " }, 728{ "Local from: ","Lokal von: " },
729{ "Synchronization summary:\n\n %d items added to local\n %d items added to remote\n %d items updated on local\n %d items updated on remote\n %d items deleted on local\n %d items deleted on remote\n %d incoming filtered out\n %d outgoing filtered out\n","Synchronisationsübersicht:\n\n %d lokal hinzugefügt\n %d fern hinzugefügt\n %d lokal geändert\n %d fern geändert\n %d lokal gelöscht\n %d fern gelöscht\n %d eingehende ausgefiltert\n %d ausgehende ausgefiltert\n" }, 729{ "Synchronization summary:\n\n %d items added to local\n %d items added to remote\n %d items updated on local\n %d items updated on remote\n %d items deleted on local\n %d items deleted on remote\n %d incoming filtered out\n %d outgoing filtered out\n","Synchronisationsübersicht:\n\n %d lokal hinzugefügt\n %d fern hinzugefügt\n %d lokal geändert\n %d fern geändert\n %d lokal gelöscht\n %d fern gelöscht\n %d eingehende ausgefiltert\n %d ausgehende ausgefiltert\n" },
730{ "Local calendar changed!\n","Lokaler Kalender geändert!\n" }, 730{ "Local calendar changed!\n","Lokaler Kalender geändert!\n" },
731{ "Write back","Schreibe zurück" }, 731{ "Write back","Schreibe zurück" },
732{ "Pi-Sync succesful!","Pi-Sync erfolgreich!" }, 732{ "Pi-Sync succesful!","Pi-Sync erfolgreich!" },
733{ "Received sync request","Sync Anfrage erhalten" }, 733{ "Received sync request","Sync Anfrage erhalten" },
734{ "Synchronizing from remote ...\n\nDo not use this application!\n\nIf syncing fails\nyou can close this dialog.","Ferne Synchronisation ...\n\nBenutze diese Anwendung nicht!\n\nWenn das Syncen fehlschlägt kann\ndieser Dialog geschlossen werden." }, 734{ "Synchronizing from remote ...\n\nDo not use this application!\n\nIf syncing fails\nyou can close this dialog.","Ferne Synchronisation ...\n\nBenutze diese Anwendung nicht!\n\nWenn das Syncen fehlschlägt kann\ndieser Dialog geschlossen werden." },
735{ "Saving Data to temp file ...","Speichere Daten in temp Datei..." }, 735{ "Saving Data to temp file ...","Speichere Daten in temp Datei..." },
736{ "Data saved to temp file!","Daten in temp Datei gespeichert!" }, 736{ "Data saved to temp file!","Daten in temp Datei gespeichert!" },
737{ "Sending file...","Sende Datei..." }, 737{ "Sending file...","Sende Datei..." },
738{ "Waiting for synced file...","Warte auf gesyncte Daten..." }, 738{ "Waiting for synced file...","Warte auf gesyncte Daten..." },
739{ "Receiving synced file...","Gesyncte Daten erhalten..." }, 739{ "Receiving synced file...","Gesyncte Daten erhalten..." },
740{ "Received %1 bytes","%1 Bytes erhalten" }, 740{ "Received %1 bytes","%1 Bytes erhalten" },
741{ "Writing file to disk...","Speichere Datei..." }, 741{ "Writing file to disk...","Speichere Datei..." },
742{ "Pi-Sync successful!","Pi-Sync erfolgreich!" }, 742{ "Pi-Sync successful!","Pi-Sync erfolgreich!" },
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" },
769{ "Try again tomorrow","Versuche morgen nochmal" }, 769{ "Try again tomorrow","Versuche morgen nochmal" },
770{ "Disable backup","Schalte Backup ab" }, 770{ "Disable backup","Schalte Backup ab" },
771{ "<b>Backup directory does not exist: </b>","<b>Backup Verzeichnis existiert nicht: </b>" }, 771{ "<b>Backup directory does not exist: </b>","<b>Backup Verzeichnis existiert nicht: </b>" },
772{ "<b>The backup copy command failed!</b>","<b>Das Backup Kopierkommando is fehlgeschlagen!</b>" }, 772{ "<b>The backup copy command failed!</b>","<b>Das Backup Kopierkommando is fehlgeschlagen!</b>" },
773{ "Choose action","Wähle Aktion" }, 773{ "Choose action","Wähle Aktion" },
774{ "&Configure KA/Pi...","Konfiguriere KA/Pi..." }, 774{ "&Configure KA/Pi...","Konfiguriere KA/Pi..." },
775{ "Global Settings...","Globale Einstellungen..." }, 775{ "Global Settings...","Globale Einstellungen..." },
776{ "Spouse","Ehegatte" }, 776{ "Spouse","Ehegatte" },
777{ "Notes","Notizen" }, 777{ "Notes","Notizen" },
778{ "Messanger","Messanger" }, 778{ "Messanger","Messanger" },
779{ "Assistant","Assistent" }, 779{ "Assistant","Assistent" },
780{ "Manager","Manager" }, 780{ "Manager","Manager" },
781{ "Secrecy","Sichtbar" }, 781{ "Secrecy","Sichtbar" },
782{ "male","männlich" }, 782{ "male","männlich" },
783{ "female","weiblich" }, 783{ "female","weiblich" },
784{ "Hide!","Verbergen!" }, 784{ "Hide!","Verbergen!" },
785{ "Show!","Anzeigen!" }, 785{ "Show!","Anzeigen!" },
786{ "Details","Details" }, 786{ "Details","Details" },
787{ "Search:","Suche:" }, 787{ "Search:","Suche:" },
788{ "Automatically sync with KDE-Desktop\nwhen receiving sync request","Synce automatisch mit KDE-Desktop\nwenn eine Sync-Anforderung kommt" }, 788{ "Automatically sync with KDE-Desktop\nwhen receiving sync request","Synce automatisch mit KDE-Desktop\nwenn eine Sync-Anforderung kommt" },
789{ "Pi-Sync Port Error","Pi-Sync Port Fehler" }, 789{ "Pi-Sync Port Error","Pi-Sync Port Fehler" },
790{ "<b>Enabling Pi-Sync failed!</b> Failed to bind or listen to the port %1! Is another instance already listening to that port?","<b>Anschalten von Pi-Sync fehlgeschlagen!</b> Fehler beim Ansprechen des Ports %1! Ist bereits eine andere Anwendung dabei diesen Port zu nutzen?" }, 790{ "<b>Enabling Pi-Sync failed!</b> Failed to bind or listen to the port %1! Is another instance already listening to that port?","<b>Anschalten von Pi-Sync fehlgeschlagen!</b> Fehler beim Ansprechen des Ports %1! Ist bereits eine andere Anwendung dabei diesen Port zu nutzen?" },
791{ "No valid port number:\n%1","Keine gültige Port Nummer:\n%1" }, 791{ "No valid port number:\n%1","Keine gültige Port Nummer:\n%1" },
792{ "Port number (Default: %1)\nValid range from 1 to 65535","Port Nummer (Standard: %1)\nGültiger Bereich von 1 bis 65535" }, 792{ "Port number (Default: %1)\nValid range from 1 to 65535","Port Nummer (Standard: %1)\nGültiger Bereich von 1 bis 65535" },
793{ "Pi-Sync Error","Pi-Sync Fehler" }, 793{ "Pi-Sync Error","Pi-Sync Fehler" },
794{ "Got send file request\nwith invalid password","Erhielt "sende Datei" Anfrage\nmit ungültigem Passwort" }, 794{ "Got send file request\nwith invalid password","Erhielt "sende Datei" Anfrage\nmit ungültigem Passwort" },
795{ "Got receive file request\nwith invalid password","Erhielt "empfange Datei" Anfrage\nmit ungültigem Passwort" }, 795{ "Got receive file request\nwith invalid password","Erhielt "empfange Datei" Anfrage\nmit ungültigem Passwort" },
796{ "Wrong password: Receiving remote file failed.","Falsches Passwort: Empfangen von entfernter Datei fehlgeschlagen." }, 796{ "Wrong password: Receiving remote file failed.","Falsches Passwort: Empfangen von entfernter Datei fehlgeschlagen." },
797{ "Please close error dialog on remote.","Bitte schließe Fehler-Dialog am entfernten Rechner" }, 797{ "Please close error dialog on remote.","Bitte schließe Fehler-Dialog am entfernten Rechner" },
798{ "Unknown error on remote.","Unbekannter Fehler am entfernten Rechner" }, 798{ "Unknown error on remote.","Unbekannter Fehler am entfernten Rechner" },
799{ "Pi-Sync: Connected!","Pi-Sync: Verbunden!" }, 799{ "Pi-Sync: Connected!","Pi-Sync: Verbunden!" },
800{ "Receiving file from remote...","Empfange entfernte Datei..." }, 800{ "Receiving file from remote...","Empfange entfernte Datei..." },
801{ "Sending back synced file...","Sende synchronisierte Datei zurück..." }, 801{ "Sending back synced file...","Sende synchronisierte Datei zurück..." },
802{ "Do you want to\nclear all sync info\nof all profiles?","Möchten Sie wirklich\ndie Sync-Info\nfür alle Profile\nlöschen?" }, 802{ "Do you want to\nclear all sync info\nof all profiles?","Möchten Sie wirklich\ndie Sync-Info\nfür alle Profile\nlöschen?" },
803{ "Do you want to\nclear the sync\ninfo of profile\n%1?\n","Möchten Sie wirklich\ndie Sync-Info für Profil\n%1?\nlöschen" }, 803{ "Do you want to\nclear the sync\ninfo of profile\n%1?\n","Möchten Sie wirklich\ndie Sync-Info für Profil\n%1?\nlöschen" },
804{ "Sorry, no valid port.Syncing cancelled.","Sorry, kein gültiger Port. Syncing abgebrochen." }, 804{ "Sorry, no valid port.Syncing cancelled.","Sorry, kein gültiger Port. Syncing abgebrochen." },
805{ "Remote port number:\n(May be: 1 - 65535)","Ferne Port Nummer:\n(Darf sein: 1 - 65535)" }, 805{ "Remote port number:\n(May be: 1 - 65535)","Ferne Port Nummer:\n(Darf sein: 1 - 65535)" },
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
@@ -493,193 +493,245 @@ void Addressee::mergeContact( const Addressee& ad , bool isSubSet) // = false)
493 493
494bool Addressee::removeVoice() 494bool Addressee::removeVoice()
495{ 495{
496 PhoneNumber::List phoneN = phoneNumbers(); 496 PhoneNumber::List phoneN = phoneNumbers();
497 PhoneNumber::List::Iterator phoneIt; 497 PhoneNumber::List::Iterator phoneIt;
498 bool found = false; 498 bool found = false;
499 for ( phoneIt = phoneN.begin(); phoneIt != phoneN.end(); ++phoneIt ) { 499 for ( phoneIt = phoneN.begin(); phoneIt != phoneN.end(); ++phoneIt ) {
500 if ( (*phoneIt).type() & PhoneNumber::Voice) { // voice found 500 if ( (*phoneIt).type() & PhoneNumber::Voice) { // voice found
501 if ((*phoneIt).type() - PhoneNumber::Voice ) { 501 if ((*phoneIt).type() - PhoneNumber::Voice ) {
502 (*phoneIt).setType((*phoneIt).type() - PhoneNumber::Voice ); 502 (*phoneIt).setType((*phoneIt).type() - PhoneNumber::Voice );
503 insertPhoneNumber( (*phoneIt) ); 503 insertPhoneNumber( (*phoneIt) );
504 found = true; 504 found = true;
505 } 505 }
506 } 506 }
507 507
508 } 508 }
509 return found; 509 return found;
510} 510}
511 511
512bool Addressee::containsAdr(const Addressee& ad ) 512bool Addressee::containsAdr(const Addressee& ad )
513{ 513{
514 if ( ! ad.mData->familyName.isEmpty() ) if ( mData->familyName != ad.mData->familyName) return false; 514 if ( ! ad.mData->familyName.isEmpty() ) if ( mData->familyName != ad.mData->familyName) return false;
515 if ( ! ad.mData->givenName.isEmpty() )if ( mData->givenName != ad.mData->givenName ) return false; 515 if ( ! ad.mData->givenName.isEmpty() )if ( mData->givenName != ad.mData->givenName ) return false;
516 if ( ad.mData->url.isValid() ) if (mData->url != ad.mData->url) return false ; 516 if ( ad.mData->url.isValid() ) if (mData->url != ad.mData->url) return false ;
517 if ( ! ad.mData->role.isEmpty() ) if (mData->role != ad.mData->role) return false ; 517 if ( ! ad.mData->role.isEmpty() ) if (mData->role != ad.mData->role) return false ;
518 if ( ! ad.mData->organization.isEmpty() ) if (mData->organization != ad.mData->organization) return false ; 518 if ( ! ad.mData->organization.isEmpty() ) if (mData->organization != ad.mData->organization) return false ;
519 if ( ! ad.mData->note.isEmpty() ) if (mData->note != ad.mData->note) return false ; 519 if ( ! ad.mData->note.isEmpty() ) if (mData->note != ad.mData->note) return false ;
520 if ( ! ad.mData->title .isEmpty() ) if (mData->title != ad.mData->title ) return false ; 520 if ( ! ad.mData->title .isEmpty() ) if (mData->title != ad.mData->title ) return false ;
521 521
522 // compare phone numbers 522 // compare phone numbers
523 PhoneNumber::List phoneN = ad.phoneNumbers(); 523 PhoneNumber::List phoneN = ad.phoneNumbers();
524 PhoneNumber::List::Iterator phoneIt; 524 PhoneNumber::List::Iterator phoneIt;
525 bool found = false; 525 bool found = false;
526 for ( phoneIt = phoneN.begin(); phoneIt != phoneN.end(); ++phoneIt ) { 526 for ( phoneIt = phoneN.begin(); phoneIt != phoneN.end(); ++phoneIt ) {
527 bool found = false; 527 bool found = false;
528 PhoneNumber::List phoneL = ad.phoneNumbers(); 528 PhoneNumber::List phoneL = ad.phoneNumbers();
529 PhoneNumber::List::Iterator phoneItL; 529 PhoneNumber::List::Iterator phoneItL;
530 for ( phoneItL = phoneL.begin(); phoneItL != phoneL.end(); ++phoneItL ) { 530 for ( phoneItL = phoneL.begin(); phoneItL != phoneL.end(); ++phoneItL ) {
531 if ( ( *phoneItL ).number() == ( *phoneIt ).number() ) { 531 if ( ( *phoneItL ).number() == ( *phoneIt ).number() ) {
532 found = true; 532 found = true;
533 break; 533 break;
534 } 534 }
535 } 535 }
536 if ( ! found ) 536 if ( ! found )
537 return false; 537 return false;
538 } 538 }
539 return true; 539 return true;
540 540
541} 541}
542void Addressee::simplifyAddresses() 542void Addressee::simplifyAddresses()
543{ 543{
544 544
545 545
546 Address::List list; 546 Address::List list;
547 Address::List::Iterator it; 547 Address::List::Iterator it;
548 Address::List::Iterator it2; 548 Address::List::Iterator it2;
549 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 549 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
550 it2 = it; 550 it2 = it;
551 ++it2; 551 ++it2;
552 for( ; it2 != mData->addresses.end(); ++it2 ) { 552 for( ; it2 != mData->addresses.end(); ++it2 ) {
553 if ( (*it) == (*it2) ) { 553 if ( (*it) == (*it2) ) {
554 list.append( *it ); 554 list.append( *it );
555 break; 555 break;
556 } 556 }
557 } 557 }
558 } 558 }
559 for( it = list.begin(); it != list.end(); ++it ) { 559 for( it = list.begin(); it != list.end(); ++it ) {
560 removeAddress( (*it) ); 560 removeAddress( (*it) );
561 } 561 }
562 562
563 list.clear(); 563 list.clear();
564 int max = 2; 564 int max = 2;
565 if ( mData->url.isValid() ) 565 if ( mData->url.isValid() )
566 max = 1; 566 max = 1;
567 if ( mData->addresses.count() <= max ) return ; 567 if ( mData->addresses.count() <= max ) return ;
568 int count = 0; 568 int count = 0;
569 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 569 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
570 if ( count >= max ) 570 if ( count >= max )
571 list.append( *it ); 571 list.append( *it );
572 ++count; 572 ++count;
573 } 573 }
574 for( it = list.begin(); it != list.end(); ++it ) { 574 for( it = list.begin(); it != list.end(); ++it ) {
575 removeAddress( (*it) ); 575 removeAddress( (*it) );
576 } 576 }
577} 577}
578 578
579// removes all emails but the first 579// removes all emails but the first
580// needed by phone sync 580// needed by phone sync
581void Addressee::simplifyEmails() 581void Addressee::simplifyEmails()
582{ 582{
583 if ( mData->emails.count() == 0 ) return ; 583 if ( mData->emails.count() == 0 ) return ;
584 QString email = mData->emails.first(); 584 QString email = mData->emails.first();
585 detach(); 585 detach();
586 mData->emails.clear(); 586 mData->emails.clear();
587 mData->emails.append( email ); 587 mData->emails.append( email );
588} 588}
589void Addressee::makePhoneNumbersOLcompatible()
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 )) {
602 removeNumbers.append( ( *phoneIter ) ); 654 removeNumbers.append( ( *phoneIter ) );
603 --inList; 655 --inList;
604 } 656 }
605 } else 657 } else
606 break; 658 break;
607 } 659 }
608 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end(); 660 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end();
609 ++phoneIter ) { 661 ++phoneIter ) {
610 removePhoneNumber(( *phoneIter )); 662 removePhoneNumber(( *phoneIter ));
611 } 663 }
612 // delete preferred numbers 664 // delete preferred numbers
613 if ( inList > max ) { 665 if ( inList > max ) {
614 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); 666 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
615 ++phoneIter ) { 667 ++phoneIter ) {
616 if ( inList > max ) { 668 if ( inList > max ) {
617 removeNumbers.append( ( *phoneIter ) ); 669 removeNumbers.append( ( *phoneIter ) );
618 --inList; 670 --inList;
619 } else 671 } else
620 break; 672 break;
621 } 673 }
622 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end(); 674 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end();
623 ++phoneIter ) { 675 ++phoneIter ) {
624 removePhoneNumber(( *phoneIter )); 676 removePhoneNumber(( *phoneIter ));
625 } 677 }
626 } 678 }
627 } 679 }
628 // remove non-numeric characters 680 // remove non-numeric characters
629 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); 681 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
630 ++phoneIter ) { 682 ++phoneIter ) {
631 if ( ! ( *phoneIter ).simplifyNumber() ) 683 if ( ! ( *phoneIter ).simplifyNumber() )
632 removeNumbers.append( ( *phoneIter ) ); 684 removeNumbers.append( ( *phoneIter ) );
633 } 685 }
634 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end(); 686 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end();
635 ++phoneIter ) { 687 ++phoneIter ) {
636 removePhoneNumber(( *phoneIter )); 688 removePhoneNumber(( *phoneIter ));
637 } 689 }
638} 690}
639void Addressee::simplifyPhoneNumberTypes() 691void Addressee::simplifyPhoneNumberTypes()
640{ 692{
641 KABC::PhoneNumber::List::Iterator phoneIter; 693 KABC::PhoneNumber::List::Iterator phoneIter;
642 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); 694 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
643 ++phoneIter ) 695 ++phoneIter )
644 ( *phoneIter ).simplifyType(); 696 ( *phoneIter ).simplifyType();
645} 697}
646void Addressee::removeID(const QString &prof) 698void Addressee::removeID(const QString &prof)
647{ 699{
648 detach(); 700 detach();
649 if ( prof.isEmpty() ) 701 if ( prof.isEmpty() )
650 mData->mExternalId = ":"; 702 mData->mExternalId = ":";
651 else 703 else
652 mData->mExternalId = KIdManager::removeId ( mData->mExternalId, prof); 704 mData->mExternalId = KIdManager::removeId ( mData->mExternalId, prof);
653 705
654} 706}
655void Addressee::setID( const QString & prof , const QString & id ) 707void Addressee::setID( const QString & prof , const QString & id )
656{ 708{
657 detach(); 709 detach();
658 mData->mExternalId = KIdManager::setId ( mData->mExternalId, prof, id ); 710 mData->mExternalId = KIdManager::setId ( mData->mExternalId, prof, id );
659 //qDebug("setID2 %s %s %s",mData->mExternalId.latin1(), prof.latin1(), id.latin1() ); 711 //qDebug("setID2 %s %s %s",mData->mExternalId.latin1(), prof.latin1(), id.latin1() );
660} 712}
661void Addressee::setTempSyncStat( int id ) 713void Addressee::setTempSyncStat( int id )
662{ 714{
663 if ( mData->mTempSyncStat == id ) return; 715 if ( mData->mTempSyncStat == id ) return;
664 detach(); 716 detach();
665 mData->mTempSyncStat = id; 717 mData->mTempSyncStat = id;
666} 718}
667int Addressee::tempSyncStat() const 719int Addressee::tempSyncStat() const
668{ 720{
669 return mData->mTempSyncStat; 721 return mData->mTempSyncStat;
670} 722}
671 723
672const QString Addressee::getID( const QString & prof) const 724const QString Addressee::getID( const QString & prof) const
673{ 725{
674 return KIdManager::getId ( mData->mExternalId, prof ); 726 return KIdManager::getId ( mData->mExternalId, prof );
675} 727}
676 728
677void Addressee::setCsum( const QString & prof , const QString & id ) 729void Addressee::setCsum( const QString & prof , const QString & id )
678{ 730{
679 detach(); 731 detach();
680 //qDebug("setcsum1 %s %s %s",mData->mExternalId.latin1(), prof.latin1(), id.latin1() ); 732 //qDebug("setcsum1 %s %s %s",mData->mExternalId.latin1(), prof.latin1(), id.latin1() );
681 mData->mExternalId = KIdManager::setCsum ( mData->mExternalId, prof, id ); 733 mData->mExternalId = KIdManager::setCsum ( mData->mExternalId, prof, id );
682 //qDebug("setcsum2 %s ",mData->mExternalId.latin1() ); 734 //qDebug("setcsum2 %s ",mData->mExternalId.latin1() );
683} 735}
684 736
685const QString Addressee::getCsum( const QString & prof) const 737const QString Addressee::getCsum( const QString & prof) const
@@ -904,225 +956,225 @@ void Addressee::setBirthday( const QDateTime &birthday )
904 detach(); 956 detach();
905 mData->empty = false; 957 mData->empty = false;
906 mData->birthday = birthday; 958 mData->birthday = birthday;
907} 959}
908 960
909QDateTime Addressee::birthday() const 961QDateTime Addressee::birthday() const
910{ 962{
911 return mData->birthday; 963 return mData->birthday;
912} 964}
913 965
914QString Addressee::birthdayLabel() 966QString Addressee::birthdayLabel()
915{ 967{
916 return i18n("Birthday"); 968 return i18n("Birthday");
917} 969}
918 970
919 971
920QString Addressee::homeAddressStreetLabel() 972QString Addressee::homeAddressStreetLabel()
921{ 973{
922 return i18n("Home Address Street"); 974 return i18n("Home Address Street");
923} 975}
924 976
925 977
926QString Addressee::homeAddressLocalityLabel() 978QString Addressee::homeAddressLocalityLabel()
927{ 979{
928 return i18n("Home Address Locality"); 980 return i18n("Home Address Locality");
929} 981}
930 982
931 983
932QString Addressee::homeAddressRegionLabel() 984QString Addressee::homeAddressRegionLabel()
933{ 985{
934 return i18n("Home Address Region"); 986 return i18n("Home Address Region");
935} 987}
936 988
937 989
938QString Addressee::homeAddressPostalCodeLabel() 990QString Addressee::homeAddressPostalCodeLabel()
939{ 991{
940 return i18n("Home Address Postal Code"); 992 return i18n("Home Address Postal Code");
941} 993}
942 994
943 995
944QString Addressee::homeAddressCountryLabel() 996QString Addressee::homeAddressCountryLabel()
945{ 997{
946 return i18n("Home Address Country"); 998 return i18n("Home Address Country");
947} 999}
948 1000
949 1001
950QString Addressee::homeAddressLabelLabel() 1002QString Addressee::homeAddressLabelLabel()
951{ 1003{
952 return i18n("Home Address Label"); 1004 return i18n("Home Address Label");
953} 1005}
954 1006
955 1007
956QString Addressee::businessAddressStreetLabel() 1008QString Addressee::businessAddressStreetLabel()
957{ 1009{
958 return i18n("Business Address Street"); 1010 return i18n("Business Address Street");
959} 1011}
960 1012
961 1013
962QString Addressee::businessAddressLocalityLabel() 1014QString Addressee::businessAddressLocalityLabel()
963{ 1015{
964 return i18n("Business Address Locality"); 1016 return i18n("Business Address Locality");
965} 1017}
966 1018
967 1019
968QString Addressee::businessAddressRegionLabel() 1020QString Addressee::businessAddressRegionLabel()
969{ 1021{
970 return i18n("Business Address Region"); 1022 return i18n("Business Address Region");
971} 1023}
972 1024
973 1025
974QString Addressee::businessAddressPostalCodeLabel() 1026QString Addressee::businessAddressPostalCodeLabel()
975{ 1027{
976 return i18n("Business Address Postal Code"); 1028 return i18n("Business Address Postal Code");
977} 1029}
978 1030
979 1031
980QString Addressee::businessAddressCountryLabel() 1032QString Addressee::businessAddressCountryLabel()
981{ 1033{
982 return i18n("Business Address Country"); 1034 return i18n("Business Address Country");
983} 1035}
984 1036
985 1037
986QString Addressee::businessAddressLabelLabel() 1038QString Addressee::businessAddressLabelLabel()
987{ 1039{
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");
1045} 1097}
1046 1098
1047QString Addressee::sipLabel() 1099QString Addressee::sipLabel()
1048{ 1100{
1049 return i18n("SIP"); 1101 return i18n("SIP");
1050} 1102}
1051 1103
1052QString Addressee::emailLabel() 1104QString Addressee::emailLabel()
1053{ 1105{
1054 return i18n("Email Address"); 1106 return i18n("Email Address");
1055} 1107}
1056 1108
1057 1109
1058void Addressee::setMailer( const QString &mailer ) 1110void Addressee::setMailer( const QString &mailer )
1059{ 1111{
1060 if ( mailer == mData->mailer ) return; 1112 if ( mailer == mData->mailer ) return;
1061 detach(); 1113 detach();
1062 mData->empty = false; 1114 mData->empty = false;
1063 mData->mailer = mailer; 1115 mData->mailer = mailer;
1064} 1116}
1065 1117
1066QString Addressee::mailer() const 1118QString Addressee::mailer() const
1067{ 1119{
1068 return mData->mailer; 1120 return mData->mailer;
1069} 1121}
1070 1122
1071QString Addressee::mailerLabel() 1123QString Addressee::mailerLabel()
1072{ 1124{
1073 return i18n("Mail Client"); 1125 return i18n("Mail Client");
1074} 1126}
1075 1127
1076 1128
1077void Addressee::setTimeZone( const TimeZone &timeZone ) 1129void Addressee::setTimeZone( const TimeZone &timeZone )
1078{ 1130{
1079 if ( timeZone == mData->timeZone ) return; 1131 if ( timeZone == mData->timeZone ) return;
1080 detach(); 1132 detach();
1081 mData->empty = false; 1133 mData->empty = false;
1082 mData->timeZone = timeZone; 1134 mData->timeZone = timeZone;
1083} 1135}
1084 1136
1085TimeZone Addressee::timeZone() const 1137TimeZone Addressee::timeZone() const
1086{ 1138{
1087 return mData->timeZone; 1139 return mData->timeZone;
1088} 1140}
1089 1141
1090QString Addressee::timeZoneLabel() 1142QString Addressee::timeZoneLabel()
1091{ 1143{
1092 return i18n("Time Zone"); 1144 return i18n("Time Zone");
1093} 1145}
1094 1146
1095 1147
1096void Addressee::setGeo( const Geo &geo ) 1148void Addressee::setGeo( const Geo &geo )
1097{ 1149{
1098 if ( geo == mData->geo ) return; 1150 if ( geo == mData->geo ) return;
1099 detach(); 1151 detach();
1100 mData->empty = false; 1152 mData->empty = false;
1101 mData->geo = geo; 1153 mData->geo = geo;
1102} 1154}
1103 1155
1104Geo Addressee::geo() const 1156Geo Addressee::geo() const
1105{ 1157{
1106 return mData->geo; 1158 return mData->geo;
1107} 1159}
1108 1160
1109QString Addressee::geoLabel() 1161QString Addressee::geoLabel()
1110{ 1162{
1111 return i18n("Geographic Position"); 1163 return i18n("Geographic Position");
1112} 1164}
1113 1165
1114 1166
1115void Addressee::setTitle( const QString &title ) 1167void Addressee::setTitle( const QString &title )
1116{ 1168{
1117 if ( title == mData->title ) return; 1169 if ( title == mData->title ) return;
1118 detach(); 1170 detach();
1119 mData->empty = false; 1171 mData->empty = false;
1120 mData->title = title; 1172 mData->title = title;
1121} 1173}
1122 1174
1123QString Addressee::title() const 1175QString Addressee::title() const
1124{ 1176{
1125 return mData->title; 1177 return mData->title;
1126} 1178}
1127 1179
1128QString Addressee::titleLabel() 1180QString Addressee::titleLabel()
@@ -1559,192 +1611,202 @@ QString Addressee::fullEmail( const QString &email ) const
1559 1611
1560 return text; 1612 return text;
1561} 1613}
1562 1614
1563void Addressee::insertEmail( const QString &email, bool preferred ) 1615void Addressee::insertEmail( const QString &email, bool preferred )
1564{ 1616{
1565 detach(); 1617 detach();
1566 1618
1567 QStringList::Iterator it = mData->emails.find( email ); 1619 QStringList::Iterator it = mData->emails.find( email );
1568 1620
1569 if ( it != mData->emails.end() ) { 1621 if ( it != mData->emails.end() ) {
1570 if ( !preferred || it == mData->emails.begin() ) return; 1622 if ( !preferred || it == mData->emails.begin() ) return;
1571 mData->emails.remove( it ); 1623 mData->emails.remove( it );
1572 mData->emails.prepend( email ); 1624 mData->emails.prepend( email );
1573 } else { 1625 } else {
1574 if ( preferred ) { 1626 if ( preferred ) {
1575 mData->emails.prepend( email ); 1627 mData->emails.prepend( email );
1576 } else { 1628 } else {
1577 mData->emails.append( email ); 1629 mData->emails.append( email );
1578 } 1630 }
1579 } 1631 }
1580} 1632}
1581 1633
1582void Addressee::removeEmail( const QString &email ) 1634void Addressee::removeEmail( const QString &email )
1583{ 1635{
1584 detach(); 1636 detach();
1585 1637
1586 QStringList::Iterator it = mData->emails.find( email ); 1638 QStringList::Iterator it = mData->emails.find( email );
1587 if ( it == mData->emails.end() ) return; 1639 if ( it == mData->emails.end() ) return;
1588 1640
1589 mData->emails.remove( it ); 1641 mData->emails.remove( it );
1590} 1642}
1591 1643
1592QString Addressee::preferredEmail() const 1644QString Addressee::preferredEmail() const
1593{ 1645{
1594 if ( mData->emails.count() == 0 ) return QString::null; 1646 if ( mData->emails.count() == 0 ) return QString::null;
1595 else return mData->emails.first(); 1647 else return mData->emails.first();
1596} 1648}
1597 1649
1598QStringList Addressee::emails() const 1650QStringList Addressee::emails() const
1599{ 1651{
1600 return mData->emails; 1652 return mData->emails;
1601} 1653}
1602void Addressee::setEmails( const QStringList& emails ) { 1654void Addressee::setEmails( const QStringList& emails ) {
1603 detach(); 1655 detach();
1604 mData->emails = emails; 1656 mData->emails = emails;
1605} 1657}
1606void Addressee::insertPhoneNumber( const PhoneNumber &phoneNumber ) 1658void Addressee::insertPhoneNumber( const PhoneNumber &phoneNumber )
1607{ 1659{
1608 detach(); 1660 detach();
1609 mData->empty = false; 1661 mData->empty = false;
1610 1662
1611 PhoneNumber::List::Iterator it; 1663 PhoneNumber::List::Iterator it;
1612 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1664 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1613 if ( (*it).id() == phoneNumber.id() ) { 1665 if ( (*it).id() == phoneNumber.id() ) {
1614 *it = phoneNumber; 1666 *it = phoneNumber;
1615 return; 1667 return;
1616 } 1668 }
1617 } 1669 }
1618 mData->phoneNumbers.append( phoneNumber ); 1670 mData->phoneNumbers.append( phoneNumber );
1619} 1671}
1620 1672
1621void Addressee::removePhoneNumber( const PhoneNumber &phoneNumber ) 1673void Addressee::removePhoneNumber( const PhoneNumber &phoneNumber )
1622{ 1674{
1623 detach(); 1675 detach();
1624 1676
1625 PhoneNumber::List::Iterator it; 1677 PhoneNumber::List::Iterator it;
1626 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1678 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1627 if ( (*it).id() == phoneNumber.id() ) { 1679 if ( (*it).id() == phoneNumber.id() ) {
1628 mData->phoneNumbers.remove( it ); 1680 mData->phoneNumbers.remove( it );
1629 return; 1681 return;
1630 } 1682 }
1631 } 1683 }
1632} 1684}
1633 1685
1634PhoneNumber Addressee::phoneNumber( int type ) const 1686PhoneNumber Addressee::phoneNumber( int type ) const
1635{ 1687{
1636 PhoneNumber phoneNumber( "", type ); 1688 PhoneNumber phoneNumber( "", type );
1637 PhoneNumber::List::ConstIterator it; 1689 PhoneNumber::List::ConstIterator it;
1638 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1690 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1639 if ( matchBinaryPatternP( (*it).type(), type ) ) { 1691 if ( matchBinaryPatternP( (*it).type(), type ) ) {
1640 if ( (*it).type() & PhoneNumber::Pref ) 1692 if ( (*it).type() & PhoneNumber::Pref )
1641 return (*it); 1693 return (*it);
1642 else if ( phoneNumber.number().isEmpty() ) 1694 else if ( phoneNumber.number().isEmpty() )
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}
1667 1729
1668PhoneNumber Addressee::findPhoneNumber( const QString &id ) const 1730PhoneNumber Addressee::findPhoneNumber( const QString &id ) const
1669{ 1731{
1670 PhoneNumber::List::ConstIterator it; 1732 PhoneNumber::List::ConstIterator it;
1671 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1733 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1672 if ( (*it).id() == id ) { 1734 if ( (*it).id() == id ) {
1673 return *it; 1735 return *it;
1674 } 1736 }
1675 } 1737 }
1676 return PhoneNumber(); 1738 return PhoneNumber();
1677} 1739}
1678 1740
1679void Addressee::insertKey( const Key &key ) 1741void Addressee::insertKey( const Key &key )
1680{ 1742{
1681 detach(); 1743 detach();
1682 mData->empty = false; 1744 mData->empty = false;
1683 1745
1684 Key::List::Iterator it; 1746 Key::List::Iterator it;
1685 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1747 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1686 if ( (*it).id() == key.id() ) { 1748 if ( (*it).id() == key.id() ) {
1687 *it = key; 1749 *it = key;
1688 return; 1750 return;
1689 } 1751 }
1690 } 1752 }
1691 mData->keys.append( key ); 1753 mData->keys.append( key );
1692} 1754}
1693 1755
1694void Addressee::removeKey( const Key &key ) 1756void Addressee::removeKey( const Key &key )
1695{ 1757{
1696 detach(); 1758 detach();
1697 1759
1698 Key::List::Iterator it; 1760 Key::List::Iterator it;
1699 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1761 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1700 if ( (*it).id() == key.id() ) { 1762 if ( (*it).id() == key.id() ) {
1701 mData->keys.remove( key ); 1763 mData->keys.remove( key );
1702 return; 1764 return;
1703 } 1765 }
1704 } 1766 }
1705} 1767}
1706 1768
1707Key Addressee::key( int type, QString customTypeString ) const 1769Key Addressee::key( int type, QString customTypeString ) const
1708{ 1770{
1709 Key::List::ConstIterator it; 1771 Key::List::ConstIterator it;
1710 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1772 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1711 if ( (*it).type() == type ) { 1773 if ( (*it).type() == type ) {
1712 if ( type == Key::Custom ) { 1774 if ( type == Key::Custom ) {
1713 if ( customTypeString.isEmpty() ) { 1775 if ( customTypeString.isEmpty() ) {
1714 return *it; 1776 return *it;
1715 } else { 1777 } else {
1716 if ( (*it).customTypeString() == customTypeString ) 1778 if ( (*it).customTypeString() == customTypeString )
1717 return (*it); 1779 return (*it);
1718 } 1780 }
1719 } else { 1781 } else {
1720 return *it; 1782 return *it;
1721 } 1783 }
1722 } 1784 }
1723 } 1785 }
1724 return Key( QString(), type ); 1786 return Key( QString(), type );
1725} 1787}
1726void Addressee::setKeys( const Key::List& list ) { 1788void Addressee::setKeys( const Key::List& list ) {
1727 detach(); 1789 detach();
1728 mData->keys = list; 1790 mData->keys = list;
1729} 1791}
1730 1792
1731Key::List Addressee::keys() const 1793Key::List Addressee::keys() const
1732{ 1794{
1733 return mData->keys; 1795 return mData->keys;
1734} 1796}
1735 1797
1736Key::List Addressee::keys( int type, QString customTypeString ) const 1798Key::List Addressee::keys( int type, QString customTypeString ) const
1737{ 1799{
1738 Key::List list; 1800 Key::List list;
1739 1801
1740 Key::List::ConstIterator it; 1802 Key::List::ConstIterator it;
1741 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1803 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1742 if ( (*it).type() == type ) { 1804 if ( (*it).type() == type ) {
1743 if ( type == Key::Custom ) { 1805 if ( type == Key::Custom ) {
1744 if ( customTypeString.isEmpty() ) { 1806 if ( customTypeString.isEmpty() ) {
1745 list.append(*it); 1807 list.append(*it);
1746 } else { 1808 } else {
1747 if ( (*it).customTypeString() == customTypeString ) 1809 if ( (*it).customTypeString() == customTypeString )
1748 list.append(*it); 1810 list.append(*it);
1749 } 1811 }
1750 } else { 1812 } else {
diff --git a/kabc/addressee.h b/kabc/addressee.h
index d1c07cb..0c488eb 100644
--- a/kabc/addressee.h
+++ b/kabc/addressee.h
@@ -29,192 +29,194 @@ $Id$
29#ifndef KABC_ADDRESSEE_H 29#ifndef KABC_ADDRESSEE_H
30#define KABC_ADDRESSEE_H 30#define KABC_ADDRESSEE_H
31 31
32#include <qdatetime.h> 32#include <qdatetime.h>
33#include <qstring.h> 33#include <qstring.h>
34#include <qregexp.h> 34#include <qregexp.h>
35#include <qstringlist.h> 35#include <qstringlist.h>
36#include <qvaluelist.h> 36#include <qvaluelist.h>
37 37
38#include <ksharedptr.h> 38#include <ksharedptr.h>
39#include <kurl.h> 39#include <kurl.h>
40 40
41#include "address.h" 41#include "address.h"
42#include "agent.h" 42#include "agent.h"
43#include "geo.h" 43#include "geo.h"
44#include "key.h" 44#include "key.h"
45#include "phonenumber.h" 45#include "phonenumber.h"
46#include "picture.h" 46#include "picture.h"
47#include "secrecy.h" 47#include "secrecy.h"
48#include "sound.h" 48#include "sound.h"
49#include "timezone.h" 49#include "timezone.h"
50 50
51namespace KABC { 51namespace KABC {
52 52
53class Resource; 53class Resource;
54 54
55/** 55/**
56 @short address book entry 56 @short address book entry
57 57
58 This class represents an entry in the address book. 58 This class represents an entry in the address book.
59 59
60 The data of this class is implicitly shared. You can pass this class by value. 60 The data of this class is implicitly shared. You can pass this class by value.
61 61
62 If you need the name of a field for presenting it to the user you should use 62 If you need the name of a field for presenting it to the user you should use
63 the functions ending in Label(). They return a translated string which can be 63 the functions ending in Label(). They return a translated string which can be
64 used as label for the corresponding field. 64 used as label for the corresponding field.
65 65
66 About the name fields: 66 About the name fields:
67 67
68 givenName() is the first name and familyName() the last name. In some 68 givenName() is the first name and familyName() the last name. In some
69 countries the family name comes first, that's the reason for the 69 countries the family name comes first, that's the reason for the
70 naming. formattedName() is the full name with the correct formatting. 70 naming. formattedName() is the full name with the correct formatting.
71 It is used as an override, when the correct formatting can't be generated 71 It is used as an override, when the correct formatting can't be generated
72 from the other name fields automatically. 72 from the other name fields automatically.
73 73
74 realName() returns a fully formatted name(). It uses formattedName, if set, 74 realName() returns a fully formatted name(). It uses formattedName, if set,
75 otherwise it constucts the name from the name fields. As fallback, if 75 otherwise it constucts the name from the name fields. As fallback, if
76 nothing else is set it uses name(). 76 nothing else is set it uses name().
77 77
78 name() is the NAME type of RFC2426. It can be used as internal name for the 78 name() is the NAME type of RFC2426. It can be used as internal name for the
79 data enty, but shouldn't be used for displaying the data to the user. 79 data enty, but shouldn't be used for displaying the data to the user.
80 */ 80 */
81class Addressee 81class Addressee
82{ 82{
83 friend QDataStream &operator<<( QDataStream &, const Addressee & ); 83 friend QDataStream &operator<<( QDataStream &, const Addressee & );
84 friend QDataStream &operator>>( QDataStream &, Addressee & ); 84 friend QDataStream &operator>>( QDataStream &, Addressee & );
85 85
86 public: 86 public:
87 typedef QValueList<Addressee> List; 87 typedef QValueList<Addressee> List;
88 88
89 /** 89 /**
90 Construct an empty address book entry. 90 Construct an empty address book entry.
91 */ 91 */
92 Addressee(); 92 Addressee();
93 ~Addressee(); 93 ~Addressee();
94 94
95 Addressee( const Addressee & ); 95 Addressee( const Addressee & );
96 Addressee &operator=( const Addressee & ); 96 Addressee &operator=( const Addressee & );
97 97
98 bool operator==( const Addressee & ) const; 98 bool operator==( const Addressee & ) const;
99 bool operator!=( const Addressee & ) const; 99 bool operator!=( const Addressee & ) const;
100 // sync stuff 100 // sync stuff
101 void setTempSyncStat(int id); 101 void setTempSyncStat(int id);
102 int tempSyncStat() const; 102 int tempSyncStat() const;
103 void setIDStr( const QString & ); 103 void setIDStr( const QString & );
104 const QString IDStr() const; 104 const QString IDStr() const;
105 void setID( const QString &, const QString & ); 105 void setID( const QString &, const QString & );
106 const QString getID( const QString & ) const; 106 const QString getID( const QString & ) const;
107 void setCsum( const QString &, const QString & ); 107 void setCsum( const QString &, const QString & );
108 const QString getCsum( const QString & ) const ; 108 const QString getCsum( const QString & ) const ;
109 void removeID(const QString &); 109 void removeID(const QString &);
110 void computeCsum(const QString &dev); 110 void computeCsum(const QString &dev);
111 ulong getCsum4List( const QStringList & attList); 111 ulong getCsum4List( const QStringList & attList);
112 /** 112 /**
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 /**
137 Return translated label for uid field. 139 Return translated label for uid field.
138 */ 140 */
139 static QString uidLabel(); 141 static QString uidLabel();
140 142
141 /** 143 /**
142 Set name. 144 Set name.
143 */ 145 */
144 void setName( const QString &name ); 146 void setName( const QString &name );
145 /** 147 /**
146 Return name. 148 Return name.
147 */ 149 */
148 QString name() const; 150 QString name() const;
149 /** 151 /**
150 Return translated label for name field. 152 Return translated label for name field.
151 */ 153 */
152 static QString nameLabel(); 154 static QString nameLabel();
153 155
154 /** 156 /**
155 Set formatted name. 157 Set formatted name.
156 */ 158 */
157 void setFormattedName( const QString &formattedName ); 159 void setFormattedName( const QString &formattedName );
158 /** 160 /**
159 Return formatted name. 161 Return formatted name.
160 */ 162 */
161 QString formattedName() const; 163 QString formattedName() const;
162 /** 164 /**
163 Return translated label for formattedName field. 165 Return translated label for formattedName field.
164 */ 166 */
165 static QString formattedNameLabel(); 167 static QString formattedNameLabel();
166 168
167 /** 169 /**
168 Set family name. 170 Set family name.
169 */ 171 */
170 void setFamilyName( const QString &familyName ); 172 void setFamilyName( const QString &familyName );
171 /** 173 /**
172 Return family name. 174 Return family name.
173 */ 175 */
174 QString familyName() const; 176 QString familyName() const;
175 /** 177 /**
176 Return translated label for familyName field. 178 Return translated label for familyName field.
177 */ 179 */
178 static QString familyNameLabel(); 180 static QString familyNameLabel();
179 181
180 /** 182 /**
181 Set given name. 183 Set given name.
182 */ 184 */
183 void setGivenName( const QString &givenName ); 185 void setGivenName( const QString &givenName );
184 /** 186 /**
185 Return given name. 187 Return given name.
186 */ 188 */
187 QString givenName() const; 189 QString givenName() const;
188 /** 190 /**
189 Return translated label for givenName field. 191 Return translated label for givenName field.
190 */ 192 */
191 static QString givenNameLabel(); 193 static QString givenNameLabel();
192 194
193 /** 195 /**
194 Set additional names. 196 Set additional names.
195 */ 197 */
196 void setAdditionalName( const QString &additionalName ); 198 void setAdditionalName( const QString &additionalName );
197 /** 199 /**
198 Return additional names. 200 Return additional names.
199 */ 201 */
200 QString additionalName() const; 202 QString additionalName() const;
201 /** 203 /**
202 Return translated label for additionalName field. 204 Return translated label for additionalName field.
203 */ 205 */
204 static QString additionalNameLabel(); 206 static QString additionalNameLabel();
205 207
206 /** 208 /**
207 Set honorific prefixes. 209 Set honorific prefixes.
208 */ 210 */
209 void setPrefix( const QString &prefix ); 211 void setPrefix( const QString &prefix );
210 /** 212 /**
211 Return honorific prefixes. 213 Return honorific prefixes.
212 */ 214 */
213 QString prefix() const; 215 QString prefix() const;
214 /** 216 /**
215 Return translated label for prefix field. 217 Return translated label for prefix field.
216 */ 218 */
217 static QString prefixLabel(); 219 static QString prefixLabel();
218 220
219 /** 221 /**
220 Set honorific suffixes. 222 Set honorific suffixes.
diff --git a/kabc/field.cpp b/kabc/field.cpp
index fd51026..20885de 100644
--- a/kabc/field.cpp
+++ b/kabc/field.cpp
@@ -196,213 +196,213 @@ QString Field::label()
196 return Addressee::roleLabel(); 196 return Addressee::roleLabel();
197 case FieldImpl::Organization: 197 case FieldImpl::Organization:
198 return Addressee::organizationLabel(); 198 return Addressee::organizationLabel();
199 case FieldImpl::Note: 199 case FieldImpl::Note:
200 return Addressee::noteLabel(); 200 return Addressee::noteLabel();
201 case FieldImpl::Url: 201 case FieldImpl::Url:
202 return Addressee::urlLabel(); 202 return Addressee::urlLabel();
203 case FieldImpl::Resource: 203 case FieldImpl::Resource:
204 return Addressee::resourceLabel(); 204 return Addressee::resourceLabel();
205 case FieldImpl::Category: 205 case FieldImpl::Category:
206 return Addressee::categoryLabel(); 206 return Addressee::categoryLabel();
207 case FieldImpl::Sip: 207 case FieldImpl::Sip:
208 return Addressee::sipLabel(); 208 return Addressee::sipLabel();
209 case FieldImpl::CustomField: 209 case FieldImpl::CustomField:
210 return mImpl->label(); 210 return mImpl->label();
211 default: 211 default:
212 return i18n("Unknown Field"); 212 return i18n("Unknown Field");
213 } 213 }
214} 214}
215 215
216int Field::category() 216int Field::category()
217{ 217{
218 return mImpl->category(); 218 return mImpl->category();
219} 219}
220 220
221QString Field::categoryLabel( int category ) 221QString Field::categoryLabel( int category )
222{ 222{
223 switch ( category ) { 223 switch ( category ) {
224 case All: 224 case All:
225 return i18n("All"); 225 return i18n("All");
226 case Frequent: 226 case Frequent:
227 return i18n("Frequent"); 227 return i18n("Frequent");
228 case Address: 228 case Address:
229 return i18n("Address"); 229 return i18n("Address");
230 case Email: 230 case Email:
231 return i18n("Email"); 231 return i18n("Email");
232 case Personal: 232 case Personal:
233 return i18n("Personal"); 233 return i18n("Personal");
234 case Organization: 234 case Organization:
235 return i18n("Organization"); 235 return i18n("Organization");
236 case CustomCategory: 236 case CustomCategory:
237 return i18n("Custom"); 237 return i18n("Custom");
238 default: 238 default:
239 return i18n("Undefined"); 239 return i18n("Undefined");
240 } 240 }
241} 241}
242 242
243QString Field::value( const KABC::Addressee &a ) 243QString Field::value( const KABC::Addressee &a )
244{ 244{
245 switch ( mImpl->fieldId() ) { 245 switch ( mImpl->fieldId() ) {
246 case FieldImpl::FormattedName: 246 case FieldImpl::FormattedName:
247 return a.formattedName(); 247 return a.formattedName();
248 case FieldImpl::FamilyName: 248 case FieldImpl::FamilyName:
249 return a.familyName(); 249 return a.familyName();
250 case FieldImpl::GivenName: 250 case FieldImpl::GivenName:
251 return a.givenName(); 251 return a.givenName();
252 case FieldImpl::AdditionalName: 252 case FieldImpl::AdditionalName:
253 return a.additionalName(); 253 return a.additionalName();
254 case FieldImpl::Prefix: 254 case FieldImpl::Prefix:
255 return a.prefix(); 255 return a.prefix();
256 case FieldImpl::Suffix: 256 case FieldImpl::Suffix:
257 return a.suffix(); 257 return a.suffix();
258 case FieldImpl::NickName: 258 case FieldImpl::NickName:
259 return a.nickName(); 259 return a.nickName();
260 case FieldImpl::Mailer: 260 case FieldImpl::Mailer:
261 return a.mailer(); 261 return a.mailer();
262 case FieldImpl::Title: 262 case FieldImpl::Title:
263 return a.title(); 263 return a.title();
264 case FieldImpl::Role: 264 case FieldImpl::Role:
265 return a.role(); 265 return a.role();
266 case FieldImpl::Organization: 266 case FieldImpl::Organization:
267 return a.organization(); 267 return a.organization();
268 case FieldImpl::Note: 268 case FieldImpl::Note:
269 return a.note(); 269 return a.note();
270 case FieldImpl::Email: 270 case FieldImpl::Email:
271 return a.preferredEmail(); 271 return a.preferredEmail();
272 case FieldImpl::Birthday: 272 case FieldImpl::Birthday:
273 if ( a.birthday().isValid() ) { 273 if ( a.birthday().isValid() ) {
274//the generated code had the following format: return a.birthday().date().toString( Qt::ISODate ); 274//the generated code had the following format: return a.birthday().date().toString( Qt::ISODate );
275// But Qt::IsoDate was not specified. 275// But Qt::IsoDate was not specified.
276// QString _oldFormat = KGlobal::locale()->dateFormat(); 276// QString _oldFormat = KGlobal::locale()->dateFormat();
277// KGlobal::locale()->setDateFormat("%Y-%m-%d"); // = Qt::ISODate 277// KGlobal::locale()->setDateFormat("%Y-%m-%d"); // = Qt::ISODate
278 QString dt = KGlobal::locale()->formatDate(a.birthday().date(), false, KLocale::ISODate); 278 QString dt = KGlobal::locale()->formatDate(a.birthday().date(), false, KLocale::ISODate);
279// KGlobal::locale()->setDateFormat(_oldFormat); 279// KGlobal::locale()->setDateFormat(_oldFormat);
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();
325 case FieldImpl::BusinessAddressLocality: 325 case FieldImpl::BusinessAddressLocality:
326 return a.address( Address::Work ).locality(); 326 return a.address( Address::Work ).locality();
327 case FieldImpl::BusinessAddressRegion: 327 case FieldImpl::BusinessAddressRegion:
328 return a.address( Address::Work ).region(); 328 return a.address( Address::Work ).region();
329 case FieldImpl::BusinessAddressPostalCode: 329 case FieldImpl::BusinessAddressPostalCode:
330 return a.address( Address::Work ).postalCode(); 330 return a.address( Address::Work ).postalCode();
331 case FieldImpl::BusinessAddressCountry: 331 case FieldImpl::BusinessAddressCountry:
332 return a.address( Address::Work ).country(); 332 return a.address( Address::Work ).country();
333 case FieldImpl::CustomField: 333 case FieldImpl::CustomField:
334 return a.custom( mImpl->app(), mImpl->key() ); 334 return a.custom( mImpl->app(), mImpl->key() );
335 default: 335 default:
336 return QString::null; 336 return QString::null;
337 } 337 }
338} 338}
339 339
340bool Field::setValue( KABC::Addressee &a, const QString &value ) 340bool Field::setValue( KABC::Addressee &a, const QString &value )
341{ 341{
342 switch ( mImpl->fieldId() ) { 342 switch ( mImpl->fieldId() ) {
343 case FieldImpl::FormattedName: 343 case FieldImpl::FormattedName:
344 a.setFormattedName( value ); 344 a.setFormattedName( value );
345 return true; 345 return true;
346 case FieldImpl::FamilyName: 346 case FieldImpl::FamilyName:
347 a.setFamilyName( value ); 347 a.setFamilyName( value );
348 return true; 348 return true;
349 case FieldImpl::GivenName: 349 case FieldImpl::GivenName:
350 a.setGivenName( value ); 350 a.setGivenName( value );
351 return true; 351 return true;
352 case FieldImpl::AdditionalName: 352 case FieldImpl::AdditionalName:
353 a.setAdditionalName( value ); 353 a.setAdditionalName( value );
354 return true; 354 return true;
355 case FieldImpl::Prefix: 355 case FieldImpl::Prefix:
356 a.setPrefix( value ); 356 a.setPrefix( value );
357 return true; 357 return true;
358 case FieldImpl::Suffix: 358 case FieldImpl::Suffix:
359 a.setSuffix( value ); 359 a.setSuffix( value );
360 return true; 360 return true;
361 case FieldImpl::NickName: 361 case FieldImpl::NickName:
362 a.setNickName( value ); 362 a.setNickName( value );
363 return true; 363 return true;
364 case FieldImpl::Mailer: 364 case FieldImpl::Mailer:
365 a.setMailer( value ); 365 a.setMailer( value );
366 return true; 366 return true;
367 case FieldImpl::Title: 367 case FieldImpl::Title:
368 a.setTitle( value ); 368 a.setTitle( value );
369 return true; 369 return true;
370 case FieldImpl::Role: 370 case FieldImpl::Role:
371 a.setRole( value ); 371 a.setRole( value );
372 return true; 372 return true;
373 case FieldImpl::Organization: 373 case FieldImpl::Organization:
374 a.setOrganization( value ); 374 a.setOrganization( value );
375 return true; 375 return true;
376 case FieldImpl::Note: 376 case FieldImpl::Note:
377 a.setNote( value ); 377 a.setNote( value );
378 return true; 378 return true;
379 case FieldImpl::Birthday: 379 case FieldImpl::Birthday:
380//US 380//US
381//the generated code had the following format: return a.setBirthday( QDate::fromString( value, Qt::ISODate ) ); 381//the generated code had the following format: return a.setBirthday( QDate::fromString( value, Qt::ISODate ) );
382// But Qt::IsoDate and QDate::fromString was not specified. Do I have the wrong QT version ? 382// But Qt::IsoDate and QDate::fromString was not specified. Do I have the wrong QT version ?
383 { 383 {
384 QDate dt = KGlobal::locale()->readDate( value, "%Y-%m-%d"); // = Qt::ISODate 384 QDate dt = KGlobal::locale()->readDate( value, "%Y-%m-%d"); // = Qt::ISODate
385 a.setBirthday(dt); 385 a.setBirthday(dt);
386 } 386 }
387 return true; 387 return true;
388 case FieldImpl::CustomField: 388 case FieldImpl::CustomField:
389 a.insertCustom( mImpl->app(), mImpl->key(), value ); 389 a.insertCustom( mImpl->app(), mImpl->key(), value );
390//US never copy the resourcename back to the adressee. 390//US never copy the resourcename back to the adressee.
391 case FieldImpl::Resource: 391 case FieldImpl::Resource:
392 default: 392 default:
393 return false; 393 return false;
394 } 394 }
395} 395}
396 396
397bool Field::isCustom() 397bool Field::isCustom()
398{ 398{
399 return mImpl->fieldId() == FieldImpl::CustomField; 399 return mImpl->fieldId() == FieldImpl::CustomField;
400} 400}
401 401
402Field::List Field::allFields() 402Field::List Field::allFields()
403{ 403{
404 if ( mAllFields.isEmpty() ) { 404 if ( mAllFields.isEmpty() ) {
405 createField( FieldImpl::FormattedName, Frequent ); 405 createField( FieldImpl::FormattedName, Frequent );
406 createField( FieldImpl::FamilyName, Frequent ); 406 createField( FieldImpl::FamilyName, Frequent );
407 createField( FieldImpl::GivenName, Frequent ); 407 createField( FieldImpl::GivenName, Frequent );
408 createField( FieldImpl::AdditionalName ); 408 createField( FieldImpl::AdditionalName );
diff --git a/kabc/phonenumber.cpp b/kabc/phonenumber.cpp
index 4c6231d..0d46ba7 100644
--- a/kabc/phonenumber.cpp
+++ b/kabc/phonenumber.cpp
@@ -1,235 +1,343 @@
1/* 1/*
2 This file is part of libkabc. 2 This file is part of libkabc.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21/* 21/*
22Enhanced Version of the file for platform independent KDE tools. 22Enhanced Version of the file for platform independent KDE tools.
23Copyright (c) 2004 Ulf Schenk 23Copyright (c) 2004 Ulf Schenk
24 24
25$Id$ 25$Id$
26*/ 26*/
27 27
28#include <kapplication.h> 28#include <kapplication.h>
29#include <klocale.h> 29#include <klocale.h>
30 30
31#include "phonenumber.h" 31#include "phonenumber.h"
32 32
33using namespace KABC; 33using namespace KABC;
34 34
35PhoneNumber::PhoneNumber() : 35PhoneNumber::PhoneNumber() :
36 mType( Home ) 36 mType( Home )
37{ 37{
38 init(); 38 init();
39} 39}
40 40
41PhoneNumber::PhoneNumber( const QString &number, int type ) : 41PhoneNumber::PhoneNumber( const QString &number, int type ) :
42 mType( type ), mNumber( number ) 42 mType( type ), mNumber( number )
43{ 43{
44 init(); 44 init();
45} 45}
46 46
47PhoneNumber::~PhoneNumber() 47PhoneNumber::~PhoneNumber()
48{ 48{
49} 49}
50 50
51void PhoneNumber::init() 51void PhoneNumber::init()
52{ 52{
53 mId = KApplication::randomString( 8 ); 53 mId = KApplication::randomString( 8 );
54} 54}
55 55
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}
81// make cellphone compatible 136// make cellphone compatible
82void PhoneNumber::simplifyType() 137void PhoneNumber::simplifyType()
83{ 138{
84 if ( mType & Fax ) mType = Fax; 139 if ( mType & Fax ) mType = Fax;
85 else if ( mType & Cell ) mType = Cell; 140 else if ( mType & Cell ) mType = Cell;
86 else if ( mType & Work ) mType = Work ; 141 else if ( mType & Work ) mType = Work ;
87 else if ( mType & Home ) mType = Home; 142 else if ( mType & Home ) mType = Home;
88 else mType = Pref; 143 else mType = Pref;
89} 144}
90bool PhoneNumber::contains( const PhoneNumber &p ) 145bool PhoneNumber::contains( const PhoneNumber &p )
91{ 146{
92 PhoneNumber myself; 147 PhoneNumber myself;
93 PhoneNumber other; 148 PhoneNumber other;
94 myself = *this; 149 myself = *this;
95 other = p; 150 other = p;
96 myself.simplifyNumber(); 151 myself.simplifyNumber();
97 other.simplifyNumber(); 152 other.simplifyNumber();
98 if ( myself.number() != other.number ()) 153 if ( myself.number() != other.number ())
99 return false; 154 return false;
100 myself.simplifyType(); 155 myself.simplifyType();
101 other.simplifyType(); 156 other.simplifyType();
102 if ( myself.type() == other.type()) 157 if ( myself.type() == other.type())
103 return true; 158 return true;
104 return false; 159 return false;
105} 160}
106 161
107void PhoneNumber::setId( const QString &id ) 162void PhoneNumber::setId( const QString &id )
108{ 163{
109 mId = id; 164 mId = id;
110} 165}
111 166
112QString PhoneNumber::id() const 167QString PhoneNumber::id() const
113{ 168{
114 return mId; 169 return mId;
115} 170}
116 171
117void PhoneNumber::setNumber( const QString &number ) 172void PhoneNumber::setNumber( const QString &number )
118{ 173{
119 mNumber = number; 174 mNumber = number;
120} 175}
121 176
122QString PhoneNumber::number() const 177QString PhoneNumber::number() const
123{ 178{
124 return mNumber; 179 return mNumber;
125} 180}
126 181
127void PhoneNumber::setType( int type ) 182void PhoneNumber::setType( int type )
128{ 183{
129 mType = type; 184 mType = type;
130} 185}
131 186
132int PhoneNumber::type() const 187int PhoneNumber::type() const
133{ 188{
134 return mType; 189 return mType;
135} 190}
136 191
137QString PhoneNumber::typeLabel() const 192QString PhoneNumber::typeLabel() const
138{ 193{
139 QString label; 194 QString label;
140 bool first = true; 195 bool first = true;
141 196
142 TypeList list = typeList(); 197 TypeList list = typeList();
143 198
144 TypeList::Iterator it; 199 TypeList::Iterator it;
145 for ( it = list.begin(); it != list.end(); ++it ) { 200 for ( it = list.begin(); it != list.end(); ++it ) {
146 if ( ( type() & (*it) ) && ( (*it) != Pref ) ) { 201 if ( ( type() & (*it) ) && ( (*it) != Pref ) ) {
147 label.append( ( first ? "" : "/" ) + typeLabel( *it ) ); 202 label.append( ( first ? "" : "/" ) + typeLabel( *it ) );
148 if ( first ) 203 if ( first )
149 first = false; 204 first = false;
150 } 205 }
151 } 206 }
152 207
153 return label; 208 return label;
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")+" ";
192 299
193 if ((type & Fax) == Fax) 300 if ((type & Fax) == Fax)
194 typeString += i18n("Fax"); 301 typeString += i18n("Fax");
195 else if ((type & Msg) == Msg) 302 else if ((type & Msg) == Msg)
196 typeString += i18n("Messenger"); 303 typeString += i18n("Messenger");
197 else if ((type & Video) == Video) 304 else if ((type & Video) == Video)
198 typeString += i18n("Video"); 305 typeString += i18n("Video");
199 else if ((type & Bbs) == Bbs) 306 else if ((type & Bbs) == Bbs)
200 typeString += i18n("Mailbox"); 307 typeString += i18n("Mailbox");
201 else if ((type & Modem) == Modem) 308 else if ((type & Modem) == Modem)
202 typeString += i18n("Modem"); 309 typeString += i18n("Modem");
203 else if ((type & Isdn) == Isdn) 310 else if ((type & Isdn) == Isdn)
204 typeString += i18n("ISDN"); 311 typeString += i18n("ISDN");
205 else if ((type & Pcs) == Pcs) 312 else if ((type & Pcs) == Pcs)
206 typeString += i18n("PCS"); 313 typeString += i18n("PCS");
207 else if ((type & Pager) == Pager) 314 else if ((type & Pager) == Pager)
208 typeString += i18n("Pager"); 315 typeString += i18n("Pager");
209 // add the prefered flag 316 // add the prefered flag
210 /* 317 /*
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;
235} 343}
diff --git a/kabc/phonenumber.h b/kabc/phonenumber.h
index 2d4d3e0..b9d6a17 100644
--- a/kabc/phonenumber.h
+++ b/kabc/phonenumber.h
@@ -1,169 +1,170 @@
1/* 1/*
2 This file is part of libkabc. 2 This file is part of libkabc.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21/* 21/*
22Enhanced Version of the file for platform independent KDE tools. 22Enhanced Version of the file for platform independent KDE tools.
23Copyright (c) 2004 Ulf Schenk 23Copyright (c) 2004 Ulf Schenk
24 24
25$Id$ 25$Id$
26*/ 26*/
27 27
28#ifndef KABC_PHONENUMBER_H 28#ifndef KABC_PHONENUMBER_H
29#define KABC_PHONENUMBER_H 29#define KABC_PHONENUMBER_H
30 30
31#include <qvaluelist.h> 31#include <qvaluelist.h>
32#include <qstring.h> 32#include <qstring.h>
33 33
34namespace KABC { 34namespace KABC {
35 35
36/** 36/**
37 @short Phonenumber information. 37 @short Phonenumber information.
38 38
39 This class provides phone number information. A phone number is classified by 39 This class provides phone number information. A phone number is classified by
40 a type. The following types are available, it's possible to use multiple types 40 a type. The following types are available, it's possible to use multiple types
41 @ref Types for a number by combining them through a logical or. 41 @ref Types for a number by combining them through a logical or.
42*/ 42*/
43class PhoneNumber 43class PhoneNumber
44{ 44{
45 friend QDataStream &operator<<( QDataStream &, const PhoneNumber & ); 45 friend QDataStream &operator<<( QDataStream &, const PhoneNumber & );
46 friend QDataStream &operator>>( QDataStream &, PhoneNumber & ); 46 friend QDataStream &operator>>( QDataStream &, PhoneNumber & );
47 47
48 public: 48 public:
49 typedef QValueList<PhoneNumber> List; 49 typedef QValueList<PhoneNumber> List;
50 typedef QValueList<int> TypeList; 50 typedef QValueList<int> TypeList;
51 51
52 /** 52 /**
53 @li @p Home - Home number 53 @li @p Home - Home number
54 @li @p Work - Office number 54 @li @p Work - Office number
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.
84 */ 83 */
85 PhoneNumber( const QString &number, int type = Home ); 84 PhoneNumber( const QString &number, int type = Home );
86 85
87 /** 86 /**
88 Destructor. 87 Destructor.
89 */ 88 */
90 ~PhoneNumber(); 89 ~PhoneNumber();
91 90
92 bool operator==( const PhoneNumber & ) const; 91 bool operator==( const PhoneNumber & ) const;
93 bool operator!=( const PhoneNumber & ) const; 92 bool operator!=( const PhoneNumber & ) const;
94 93
95 bool contains( const PhoneNumber &p ); 94 bool contains( const PhoneNumber &p );
96 /** 95 /**
97 Sets the unique identifier. 96 Sets the unique identifier.
98 */ 97 */
99 void setId( const QString &id ); 98 void setId( const QString &id );
100 99
101 /** 100 /**
102 Returns the unique identifier. 101 Returns the unique identifier.
103 */ 102 */
104 QString id() const; 103 QString id() const;
105 104
106 /** 105 /**
107 Sets the number. 106 Sets the number.
108 */ 107 */
109 void setNumber( const QString & ); 108 void setNumber( const QString & );
110 109
111 /** 110 /**
112 Returns the number. 111 Returns the number.
113 */ 112 */
114 QString number() const; 113 QString number() const;
115 114
116 /** 115 /**
117 Sets the type. Multiple types can be specified by combining them by 116 Sets the type. Multiple types can be specified by combining them by
118 a logical or. 117 a logical or.
119 */ 118 */
120 void setType( int ); 119 void setType( int );
121 120
122 /** 121 /**
123 Returns the type. Can be a multiple types combined by a logical or. 122 Returns the type. Can be a multiple types combined by a logical or.
124 */ 123 */
125 int type() const; 124 int type() const;
126 125
127 /** 126 /**
128 Returns a translated string of all types the address has. 127 Returns a translated string of all types the address has.
129 */ 128 */
130 QString typeLabel() const; 129 QString typeLabel() const;
131 130
132 /** 131 /**
133 Returns the translated label for phone number depending on its type. 132 Returns the translated label for phone number depending on its type.
134 */ 133 */
135 QString label() const; 134 QString label() const;
136 135
137 /** 136 /**
138 Returns a list of all available types 137 Returns a list of all available types
139 */ 138 */
140 static TypeList typeList(); 139 static TypeList typeList();
141 140
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 & );
166 167
167} 168}
168 169
169#endif 170#endif
diff --git a/kabc/vcard21parser.cpp b/kabc/vcard21parser.cpp
index 277de22..60d02b8 100644
--- a/kabc/vcard21parser.cpp
+++ b/kabc/vcard21parser.cpp
@@ -77,331 +77,329 @@ bool VCardLineX::isValid() const
77 return true; 77 return true;
78 break; 78 break;
79 79
80 case 'e': 80 case 'e':
81 if ( name == VCARD_EMAIL && qualified && 81 if ( name == VCARD_EMAIL && qualified &&
82 (qualifiers.contains(VCARD_EMAIL_INTERNET) || 82 (qualifiers.contains(VCARD_EMAIL_INTERNET) ||
83 qualifiers.contains(VCARD_EMAIL_PREF) || 83 qualifiers.contains(VCARD_EMAIL_PREF) ||
84 qualifiers.contains(VCARD_EMAIL_X400) 84 qualifiers.contains(VCARD_EMAIL_X400)
85 ) ) 85 ) )
86 return true; 86 return true;
87 break; 87 break;
88 88
89 case 'f': 89 case 'f':
90 if ( name == VCARD_FN ) 90 if ( name == VCARD_FN )
91 return true; 91 return true;
92 break; 92 break;
93 93
94 case 'g': 94 case 'g':
95 if ( name == VCARD_GEO ) 95 if ( name == VCARD_GEO )
96 return true; 96 return true;
97 break; 97 break;
98 98
99 case 'k': 99 case 'k':
100 if ( name == VCARD_KEY && qualified && 100 if ( name == VCARD_KEY && qualified &&
101 (qualifiers.contains(VCARD_KEY_X509) || 101 (qualifiers.contains(VCARD_KEY_X509) ||
102 qualifiers.contains(VCARD_KEY_PGP) 102 qualifiers.contains(VCARD_KEY_PGP)
103 ) ) 103 ) )
104 return true; 104 return true;
105 break; 105 break;
106 106
107 case 'l': 107 case 'l':
108 if ( name == VCARD_LABEL ) 108 if ( name == VCARD_LABEL )
109 return true; 109 return true;
110 if ( name == VCARD_LOGO ) 110 if ( name == VCARD_LOGO )
111 return true; 111 return true;
112 break; 112 break;
113 113
114 case 'm': 114 case 'm':
115 if ( name == VCARD_MAILER ) 115 if ( name == VCARD_MAILER )
116 return true; 116 return true;
117 break; 117 break;
118 118
119 case 'n': 119 case 'n':
120 if ( name == VCARD_N ) 120 if ( name == VCARD_N )
121 return true; 121 return true;
122 if ( name == VCARD_NAME ) 122 if ( name == VCARD_NAME )
123 return true; 123 return true;
124 if ( name == VCARD_NICKNAME ) 124 if ( name == VCARD_NICKNAME )
125 return true; 125 return true;
126 if ( name == VCARD_NOTE ) 126 if ( name == VCARD_NOTE )
127 return true; 127 return true;
128 break; 128 break;
129 129
130 case 'o': 130 case 'o':
131 if ( name == VCARD_ORG ) 131 if ( name == VCARD_ORG )
132 return true; 132 return true;
133 break; 133 break;
134 134
135 case 'p': 135 case 'p':
136 if ( name == VCARD_PHOTO ) 136 if ( name == VCARD_PHOTO )
137 return true; 137 return true;
138 if ( name == VCARD_PROFILE ) 138 if ( name == VCARD_PROFILE )
139 return true; 139 return true;
140 if ( name == VCARD_PRODID ) 140 if ( name == VCARD_PRODID )
141 return true; 141 return true;
142 break; 142 break;
143 143
144 case 'r': 144 case 'r':
145 if ( name == VCARD_ROLE ) 145 if ( name == VCARD_ROLE )
146 return true; 146 return true;
147 if ( name == VCARD_REV ) 147 if ( name == VCARD_REV )
148 return true; 148 return true;
149 break; 149 break;
150 150
151 case 's': 151 case 's':
152 if ( name == VCARD_SOURCE ) 152 if ( name == VCARD_SOURCE )
153 return true; 153 return true;
154 if ( name == VCARD_SOUND ) 154 if ( name == VCARD_SOUND )
155 return true; 155 return true;
156 break; 156 break;
157 157
158 case 't': 158 case 't':
159 if ( name == VCARD_TEL && qualified && 159 if ( name == VCARD_TEL && qualified &&
160 (qualifiers.contains(VCARD_TEL_HOME) || 160 (qualifiers.contains(VCARD_TEL_HOME) ||
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 )
187 return true; 186 return true;
188 break; 187 break;
189 188
190 case 'v': 189 case 'v':
191 if ( name == VCARD_VERSION ) 190 if ( name == VCARD_VERSION )
192 return true; 191 return true;
193 break; 192 break;
194 default: 193 default:
195 break; 194 break;
196 } 195 }
197 196
198 return false; 197 return false;
199} 198}
200 199
201 200
202VCard21Parser::VCard21Parser() 201VCard21Parser::VCard21Parser()
203{ 202{
204} 203}
205 204
206VCard21Parser::~VCard21Parser() 205VCard21Parser::~VCard21Parser()
207{ 206{
208} 207}
209 208
210void VCard21Parser::readFromString(KABC::AddressBook *addressbook, const QString &data) 209void VCard21Parser::readFromString(KABC::AddressBook *addressbook, const QString &data)
211{ 210{
212 KABC::Addressee mAddressee = readFromString(data); 211 KABC::Addressee mAddressee = readFromString(data);
213 addressbook->insertAddressee(mAddressee); 212 addressbook->insertAddressee(mAddressee);
214} 213}
215 214
216KABC::Addressee VCard21Parser::readFromString( const QString &data) 215KABC::Addressee VCard21Parser::readFromString( const QString &data)
217{ 216{
218 KABC::Addressee addressee; 217 KABC::Addressee addressee;
219 VCard21ParserImpl *mVCard = VCard21ParserImpl::parseVCard(data); 218 VCard21ParserImpl *mVCard = VCard21ParserImpl::parseVCard(data);
220 QString tmpStr; 219 QString tmpStr;
221 220
222 // Check if parsing failed 221 // Check if parsing failed
223 if (mVCard == 0) 222 if (mVCard == 0)
224 { 223 {
225 kdDebug() << "Parsing failed" << endl; 224 kdDebug() << "Parsing failed" << endl;
226 return addressee; 225 return addressee;
227 } 226 }
228 //set the addressees name and formated name 227 //set the addressees name and formated name
229 QStringList tmpList = mVCard->getValues(VCARD_N); 228 QStringList tmpList = mVCard->getValues(VCARD_N);
230 QString formattedName = ""; 229 QString formattedName = "";
231 if (tmpList.count() > 0) 230 if (tmpList.count() > 0)
232 addressee.setFamilyName(tmpList[0]); 231 addressee.setFamilyName(tmpList[0]);
233 if (tmpList.count() > 1) 232 if (tmpList.count() > 1)
234 addressee.setGivenName(tmpList[1]); 233 addressee.setGivenName(tmpList[1]);
235 if (tmpList.count() > 2) 234 if (tmpList.count() > 2)
236 addressee.setAdditionalName(tmpList[2]); 235 addressee.setAdditionalName(tmpList[2]);
237 if (tmpList.count() > 3) 236 if (tmpList.count() > 3)
238 addressee.setPrefix(tmpList[3]); 237 addressee.setPrefix(tmpList[3]);
239 if (tmpList.count() > 4) 238 if (tmpList.count() > 4)
240 addressee.setSuffix(tmpList[4]); 239 addressee.setSuffix(tmpList[4]);
241 240
242 tmpStr = (mVCard->getValue(VCARD_FN)); 241 tmpStr = (mVCard->getValue(VCARD_FN));
243 if (!tmpStr.isEmpty()) 242 if (!tmpStr.isEmpty())
244 addressee.setFormattedName(tmpStr); 243 addressee.setFormattedName(tmpStr);
245 244
246 //set the addressee's nick name 245 //set the addressee's nick name
247 tmpStr = mVCard->getValue(VCARD_NICKNAME); 246 tmpStr = mVCard->getValue(VCARD_NICKNAME);
248 addressee.setNickName(tmpStr); 247 addressee.setNickName(tmpStr);
249 //set the addressee's organisation 248 //set the addressee's organisation
250 tmpStr = mVCard->getValue(VCARD_ORG); 249 tmpStr = mVCard->getValue(VCARD_ORG);
251 addressee.setOrganization(tmpStr); 250 addressee.setOrganization(tmpStr);
252 //set the addressee's title 251 //set the addressee's title
253 tmpStr = mVCard->getValue(VCARD_TITLE); 252 tmpStr = mVCard->getValue(VCARD_TITLE);
254 addressee.setTitle(tmpStr); 253 addressee.setTitle(tmpStr);
255 //set the addressee's email - we can only deal with two. The preferenced one and one other. 254 //set the addressee's email - we can only deal with two. The preferenced one and one other.
256 tmpStr = mVCard->getValue(VCARD_EMAIL, VCARD_EMAIL_INTERNET); 255 tmpStr = mVCard->getValue(VCARD_EMAIL, VCARD_EMAIL_INTERNET);
257 addressee.insertEmail(tmpStr, false); 256 addressee.insertEmail(tmpStr, false);
258 tmpStr = mVCard->getValue(VCARD_EMAIL,VCARD_EMAIL_PREF); 257 tmpStr = mVCard->getValue(VCARD_EMAIL,VCARD_EMAIL_PREF);
259 addressee.insertEmail(tmpStr, true); 258 addressee.insertEmail(tmpStr, true);
260 //set the addressee's url 259 //set the addressee's url
261 tmpStr = mVCard->getValue(VCARD_URL); 260 tmpStr = mVCard->getValue(VCARD_URL);
262 if (tmpStr.isEmpty()) tmpStr = mVCard->getValue(VCARD_URL, VCARD_ADR_WORK); 261 if (tmpStr.isEmpty()) tmpStr = mVCard->getValue(VCARD_URL, VCARD_ADR_WORK);
263 if (tmpStr.isEmpty()) tmpStr = mVCard->getValue(VCARD_URL, VCARD_ADR_HOME); 262 if (tmpStr.isEmpty()) tmpStr = mVCard->getValue(VCARD_URL, VCARD_ADR_HOME);
264 if (!tmpStr.isEmpty()) { 263 if (!tmpStr.isEmpty()) {
265 addressee.setUrl(KURL(tmpStr)); 264 addressee.setUrl(KURL(tmpStr));
266 } 265 }
267 266
268 //set the addressee's birthday 267 //set the addressee's birthday
269 tmpStr = mVCard->getValue(VCARD_BDAY); 268 tmpStr = mVCard->getValue(VCARD_BDAY);
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 ) )
324 type |= Address::Parcel; 322 type |= Address::Parcel;
325 if ( (*i).qualifiers.contains( VCARD_ADR_HOME ) ) 323 if ( (*i).qualifiers.contains( VCARD_ADR_HOME ) )
326 type |= Address::Home; 324 type |= Address::Home;
327 if ( (*i).qualifiers.contains( VCARD_ADR_WORK ) ) 325 if ( (*i).qualifiers.contains( VCARD_ADR_WORK ) )
328 type |= Address::Work; 326 type |= Address::Work;
329 if ( (*i).qualifiers.contains( VCARD_ADR_PREF ) ) 327 if ( (*i).qualifiers.contains( VCARD_ADR_PREF ) )
330 type |= Address::Pref; 328 type |= Address::Pref;
331 } 329 }
332 addressee.insertAddress( readAddressFromQStringList( (*i).parameters, type ) ); 330 addressee.insertAddress( readAddressFromQStringList( (*i).parameters, type ) );
333 } 331 }
334 } 332 }
335 333
336 //set the addressee's delivery label 334 //set the addressee's delivery label
337 tmpStr = mVCard->getValue(VCARD_LABEL); 335 tmpStr = mVCard->getValue(VCARD_LABEL);
338 if (!tmpStr.isEmpty()) { 336 if (!tmpStr.isEmpty()) {
339qDebug("VCard21Parser::readFromString please verify if replace is correct"); 337qDebug("VCard21Parser::readFromString please verify if replace is correct");
340//US tmpStr.replace("\r\n","\n"); 338//US tmpStr.replace("\r\n","\n");
341 tmpStr.replace( QRegExp("\r\n"), "\n" ); 339 tmpStr.replace( QRegExp("\r\n"), "\n" );
342 Address tmpAddress; 340 Address tmpAddress;
343 tmpAddress.setLabel(tmpStr); 341 tmpAddress.setLabel(tmpStr);
344 addressee.insertAddress(tmpAddress); 342 addressee.insertAddress(tmpAddress);
345 } 343 }
346 344
347 //set the addressee's notes 345 //set the addressee's notes
348 tmpStr = mVCard->getValue(VCARD_NOTE); 346 tmpStr = mVCard->getValue(VCARD_NOTE);
349qDebug("VCard21Parser::readFromString please verify if correct"); 347qDebug("VCard21Parser::readFromString please verify if correct");
350//US tmpStr.replace("\r\n","\n"); 348//US tmpStr.replace("\r\n","\n");
351 tmpStr.replace( QRegExp("\r\n"), "\n" ); 349 tmpStr.replace( QRegExp("\r\n"), "\n" );
352 addressee.setNote(tmpStr); 350 addressee.setNote(tmpStr);
353 351
354 //set the addressee's timezone 352 //set the addressee's timezone
355 tmpStr = mVCard->getValue(VCARD_TZ); 353 tmpStr = mVCard->getValue(VCARD_TZ);
356 TimeZone tmpZone(tmpStr.toInt()); 354 TimeZone tmpZone(tmpStr.toInt());
357 addressee.setTimeZone(tmpZone); 355 addressee.setTimeZone(tmpZone);
358 356
359 //set the addressee's geographical position 357 //set the addressee's geographical position
360 tmpList = mVCard->getValues(VCARD_GEO); 358 tmpList = mVCard->getValues(VCARD_GEO);
361 if (tmpList.count()==2) 359 if (tmpList.count()==2)
362 { 360 {
363 tmpStr = tmpList[0]; 361 tmpStr = tmpList[0];
364 float glat = tmpStr.toFloat(); 362 float glat = tmpStr.toFloat();
365 tmpStr = tmpList[1]; 363 tmpStr = tmpList[1];
366 float glong = tmpStr.toFloat(); 364 float glong = tmpStr.toFloat();
367 Geo tmpGeo(glat,glong); 365 Geo tmpGeo(glat,glong);
368 addressee.setGeo(tmpGeo); 366 addressee.setGeo(tmpGeo);
369 } 367 }
370 368
371 //set the last revision date 369 //set the last revision date
372 tmpStr = mVCard->getValue(VCARD_REV); 370 tmpStr = mVCard->getValue(VCARD_REV);
373 addressee.setRevision(VCardStringToDate(tmpStr)); 371 addressee.setRevision(VCardStringToDate(tmpStr));
374 372
375 //set the role of the addressee 373 //set the role of the addressee
376 tmpStr = mVCard->getValue(VCARD_ROLE); 374 tmpStr = mVCard->getValue(VCARD_ROLE);
377 addressee.setRole(tmpStr); 375 addressee.setRole(tmpStr);
378 376
379 return addressee; 377 return addressee;
380} 378}
381 379
382 380
383 381
384KABC::Address VCard21Parser::readAddressFromQStringList ( const QStringList &data, const int type ) 382KABC::Address VCard21Parser::readAddressFromQStringList ( const QStringList &data, const int type )
385{ 383{
386 KABC::Address mAddress; 384 KABC::Address mAddress;
387 mAddress.setType( type ); 385 mAddress.setType( type );
388 386
389 if ( data.count() > 0 ) 387 if ( data.count() > 0 )
390 mAddress.setPostOfficeBox( data[0] ); 388 mAddress.setPostOfficeBox( data[0] );
391 if ( data.count() > 1 ) 389 if ( data.count() > 1 )
392 mAddress.setExtended( data[1] ); 390 mAddress.setExtended( data[1] );
393 if ( data.count() > 2 ) 391 if ( data.count() > 2 )
394 mAddress.setStreet( data[2] ); 392 mAddress.setStreet( data[2] );
395 if ( data.count() > 3 ) 393 if ( data.count() > 3 )
396 mAddress.setLocality( data[3] ); 394 mAddress.setLocality( data[3] );
397 if ( data.count() > 4 ) 395 if ( data.count() > 4 )
398 mAddress.setRegion( data[4] ); 396 mAddress.setRegion( data[4] );
399 if ( data.count() > 5 ) 397 if ( data.count() > 5 )
400 mAddress.setPostalCode( data[5] ); 398 mAddress.setPostalCode( data[5] );
401 if ( data.count() > 6 ) 399 if ( data.count() > 6 )
402 mAddress.setCountry( data[6] ); 400 mAddress.setCountry( data[6] );
403 401
404 return mAddress; 402 return mAddress;
405} 403}
406 404
407 405
diff --git a/kabc/vcardformatimpl.cpp b/kabc/vcardformatimpl.cpp
index ec5ed80..26fd4f0 100644
--- a/kabc/vcardformatimpl.cpp
+++ b/kabc/vcardformatimpl.cpp
@@ -188,193 +188,193 @@ bool VCardFormatImpl::loadAddressee( Addressee& addressee, VCard *v )
188 188
189 case EntityOrganisation: 189 case EntityOrganisation:
190 addressee.setOrganization( readTextValue( cl ) ); 190 addressee.setOrganization( readTextValue( cl ) );
191 break; 191 break;
192 192
193 case EntityNote: 193 case EntityNote:
194 addressee.setNote( readTextValue( cl ) ); 194 addressee.setNote( readTextValue( cl ) );
195 break; 195 break;
196 196
197 case EntityProductID: 197 case EntityProductID:
198 addressee.setProductId( readTextValue( cl ) ); 198 addressee.setProductId( readTextValue( cl ) );
199 break; 199 break;
200 200
201 case EntitySortString: 201 case EntitySortString:
202 addressee.setSortString( readTextValue( cl ) ); 202 addressee.setSortString( readTextValue( cl ) );
203 break; 203 break;
204 204
205 case EntityN: 205 case EntityN:
206 readNValue( cl, addressee ); 206 readNValue( cl, addressee );
207 break; 207 break;
208 208
209 case EntityAddress: 209 case EntityAddress:
210 addressee.insertAddress( readAddressValue( cl ) ); 210 addressee.insertAddress( readAddressValue( cl ) );
211 break; 211 break;
212 212
213 case EntityTelephone: 213 case EntityTelephone:
214 addressee.insertPhoneNumber( readTelephoneValue( cl ) ); 214 addressee.insertPhoneNumber( readTelephoneValue( cl ) );
215 break; 215 break;
216 216
217 case EntityCategories: 217 case EntityCategories:
218 addressee.setCategories( QStringList::split( ",", readTextValue( cl ) ) ); 218 addressee.setCategories( QStringList::split( ",", readTextValue( cl ) ) );
219 break; 219 break;
220 220
221 case EntityBirthday: 221 case EntityBirthday:
222 addressee.setBirthday( readDateValue( cl ) ); 222 addressee.setBirthday( readDateValue( cl ) );
223 break; 223 break;
224 224
225 case EntityRevision: 225 case EntityRevision:
226 addressee.setRevision( readDateTimeValue( cl ) ); 226 addressee.setRevision( readDateTimeValue( cl ) );
227 break; 227 break;
228 228
229 case EntityGeo: 229 case EntityGeo:
230 addressee.setGeo( readGeoValue( cl ) ); 230 addressee.setGeo( readGeoValue( cl ) );
231 break; 231 break;
232 232
233 case EntityTimeZone: 233 case EntityTimeZone:
234 addressee.setTimeZone( readUTCValue( cl ) ); 234 addressee.setTimeZone( readUTCValue( cl ) );
235 break; 235 break;
236 236
237 case EntityVersion: 237 case EntityVersion:
238 break; 238 break;
239 239
240 case EntityClass: 240 case EntityClass:
241 addressee.setSecrecy( readClassValue( cl ) ); 241 addressee.setSecrecy( readClassValue( cl ) );
242 break; 242 break;
243 243
244 case EntityKey: 244 case EntityKey:
245 addressee.insertKey( readKeyValue( cl ) ); 245 addressee.insertKey( readKeyValue( cl ) );
246 break; 246 break;
247 247
248 case EntityPhoto: 248 case EntityPhoto:
249 addressee.setPhoto( readPictureValue( cl, EntityPhoto, addressee ) ); 249 addressee.setPhoto( readPictureValue( cl, EntityPhoto, addressee ) );
250 break; 250 break;
251 251
252 case EntityLogo: 252 case EntityLogo:
253 addressee.setLogo( readPictureValue( cl, EntityLogo, addressee ) ); 253 addressee.setLogo( readPictureValue( cl, EntityLogo, addressee ) );
254 break; 254 break;
255 255
256 case EntityAgent: 256 case EntityAgent:
257 addressee.setAgent( readAgentValue( cl ) ); 257 addressee.setAgent( readAgentValue( cl ) );
258 break; 258 break;
259 259
260 case EntitySound: 260 case EntitySound:
261 addressee.setSound( readSoundValue( cl, addressee ) ); 261 addressee.setSound( readSoundValue( cl, addressee ) );
262 break; 262 break;
263 263
264 default: 264 default:
265 kdDebug(5700) << "VCardFormat::load(): Unsupported entity: " 265 kdDebug(5700) << "VCardFormat::load(): Unsupported entity: "
266 << int( type ) << ": " << cl->asString() << endl; 266 << int( type ) << ": " << cl->asString() << endl;
267 qDebug("VCardFormat::load(): Unsupported entity: %i: %s ", int(type), (const char*)cl->asString()); 267 qDebug("VCardFormat::load(): Unsupported entity: %i: %s ", int(type), (const char*)cl->asString());
268 break; 268 break;
269 } 269 }
270 } 270 }
271 271
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
297 QStringList emails = addressee.emails(); 297 QStringList emails = addressee.emails();
298 QStringList::ConstIterator it4; 298 QStringList::ConstIterator it4;
299 for( it4 = emails.begin(); it4 != emails.end(); ++it4 ) { 299 for( it4 = emails.begin(); it4 != emails.end(); ++it4 ) {
300 addTextValue( v, EntityEmail, *it4 ); 300 addTextValue( v, EntityEmail, *it4 );
301 } 301 }
302 302
303 QStringList customs = addressee.customs(); 303 QStringList customs = addressee.customs();
304 QStringList::ConstIterator it5; 304 QStringList::ConstIterator it5;
305 for( it5 = customs.begin(); it5 != customs.end(); ++it5 ) { 305 for( it5 = customs.begin(); it5 != customs.end(); ++it5 ) {
306 addCustomValue( v, *it5 ); 306 addCustomValue( v, *it5 );
307 } 307 }
308 308
309 addTextValue( v, EntityURL, addressee.url().url() ); 309 addTextValue( v, EntityURL, addressee.url().url() );
310 310
311 addNValue( v, addressee ); 311 addNValue( v, addressee );
312 312
313 addTextValue( v, EntityNickname, addressee.nickName() ); 313 addTextValue( v, EntityNickname, addressee.nickName() );
314 addTextValue( v, EntityMailer, addressee.mailer() ); 314 addTextValue( v, EntityMailer, addressee.mailer() );
315 addTextValue( v, EntityTitle, addressee.title() ); 315 addTextValue( v, EntityTitle, addressee.title() );
316 addTextValue( v, EntityRole, addressee.role() ); 316 addTextValue( v, EntityRole, addressee.role() );
317 addTextValue( v, EntityOrganisation, addressee.organization() ); 317 addTextValue( v, EntityOrganisation, addressee.organization() );
318 addTextValue( v, EntityNote, addressee.note() ); 318 addTextValue( v, EntityNote, addressee.note() );
319 addTextValue( v, EntityProductID, addressee.productId() ); 319 addTextValue( v, EntityProductID, addressee.productId() );
320 addTextValue( v, EntitySortString, addressee.sortString() ); 320 addTextValue( v, EntitySortString, addressee.sortString() );
321 321
322 Address::List addresses = addressee.addresses(); 322 Address::List addresses = addressee.addresses();
323 Address::List::ConstIterator it3; 323 Address::List::ConstIterator it3;
324 for( it3 = addresses.begin(); it3 != addresses.end(); ++it3 ) { 324 for( it3 = addresses.begin(); it3 != addresses.end(); ++it3 ) {
325 addAddressValue( v, *it3 ); 325 addAddressValue( v, *it3 );
326 addLabelValue( v, *it3 ); 326 addLabelValue( v, *it3 );
327 } 327 }
328 328
329 PhoneNumber::List phoneNumbers = addressee.phoneNumbers(); 329 PhoneNumber::List phoneNumbers = addressee.phoneNumbers();
330 PhoneNumber::List::ConstIterator it2; 330 PhoneNumber::List::ConstIterator it2;
331 for( it2 = phoneNumbers.begin(); it2 != phoneNumbers.end(); ++it2 ) { 331 for( it2 = phoneNumbers.begin(); it2 != phoneNumbers.end(); ++it2 ) {
332 addTelephoneValue( v, *it2 ); 332 addTelephoneValue( v, *it2 );
333 } 333 }
334 334
335 Key::List keys = addressee.keys(); 335 Key::List keys = addressee.keys();
336 Key::List::ConstIterator it6; 336 Key::List::ConstIterator it6;
337 for( it6 = keys.begin(); it6 != keys.end(); ++it6 ) { 337 for( it6 = keys.begin(); it6 != keys.end(); ++it6 ) {
338 addKeyValue( v, *it6 ); 338 addKeyValue( v, *it6 );
339 } 339 }
340 340
341 addTextValue( v, EntityCategories, addressee.categories().join(",") ); 341 addTextValue( v, EntityCategories, addressee.categories().join(",") );
342 342
343 addDateValue( v, EntityBirthday, addressee.birthday().date() ); 343 addDateValue( v, EntityBirthday, addressee.birthday().date() );
344 addDateTimeValue( v, EntityRevision, addressee.revision() ); 344 addDateTimeValue( v, EntityRevision, addressee.revision() );
345 addGeoValue( v, addressee.geo() ); 345 addGeoValue( v, addressee.geo() );
346 addUTCValue( v, addressee.timeZone() ); 346 addUTCValue( v, addressee.timeZone() );
347 347
348 addClassValue( v, addressee.secrecy() ); 348 addClassValue( v, addressee.secrecy() );
349 349
350 addPictureValue( v, EntityPhoto, addressee.photo(), addressee, intern ); 350 addPictureValue( v, EntityPhoto, addressee.photo(), addressee, intern );
351 addPictureValue( v, EntityLogo, addressee.logo(), addressee, intern ); 351 addPictureValue( v, EntityLogo, addressee.logo(), addressee, intern );
352 352
353 addAgentValue( v, addressee.agent() ); 353 addAgentValue( v, addressee.agent() );
354 354
355 addSoundValue( v, addressee.sound(), addressee, intern ); 355 addSoundValue( v, addressee.sound(), addressee, intern );
356} 356}
357 357
358void VCardFormatImpl::addCustomValue( VCard *v, const QString &txt ) 358void VCardFormatImpl::addCustomValue( VCard *v, const QString &txt )
359{ 359{
360 if ( txt.isEmpty() ) return; 360 if ( txt.isEmpty() ) return;
361 361
362 ContentLine cl; 362 ContentLine cl;
363 cl.setName( "X-" + txt.left( txt.find( ":" ) ).utf8() ); 363 cl.setName( "X-" + txt.left( txt.find( ":" ) ).utf8() );
364 QString value = txt.mid( txt.find( ":" ) + 1 ); 364 QString value = txt.mid( txt.find( ":" ) + 1 );
365 if ( value.isEmpty() ) 365 if ( value.isEmpty() )
366 return; 366 return;
367 cl.setValue( new TextValue( value.utf8() ) ); 367 cl.setValue( new TextValue( value.utf8() ) );
368 v->add(cl); 368 v->add(cl);
369} 369}
370 370
371void VCardFormatImpl::addTextValue( VCard *v, EntityType type, const QString &txt ) 371void VCardFormatImpl::addTextValue( VCard *v, EntityType type, const QString &txt )
372{ 372{
373 if ( txt.isEmpty() ) return; 373 if ( txt.isEmpty() ) return;
374 374
375 ContentLine cl; 375 ContentLine cl;
376 cl.setName( EntityTypeToParamName( type ) ); 376 cl.setName( EntityTypeToParamName( type ) );
377 cl.setValue( new TextValue( txt.utf8() ) ); 377 cl.setValue( new TextValue( txt.utf8() ) );
378 v->add(cl); 378 v->add(cl);
379} 379}
380 380
@@ -502,226 +502,224 @@ void VCardFormatImpl::addClassValue( VCard *vcard, const Secrecy &secrecy )
502 v->setType( (int)ClassValue::Confidential ); 502 v->setType( (int)ClassValue::Confidential );
503 break; 503 break;
504 } 504 }
505 505
506 cl.setValue( v ); 506 cl.setValue( v );
507 vcard->add(cl); 507 vcard->add(cl);
508} 508}
509 509
510 510
511Address VCardFormatImpl::readAddressValue( ContentLine *cl ) 511Address VCardFormatImpl::readAddressValue( ContentLine *cl )
512{ 512{
513 Address a; 513 Address a;
514 AdrValue *v = (AdrValue *)cl->value(); 514 AdrValue *v = (AdrValue *)cl->value();
515 a.setPostOfficeBox( QString::fromUtf8( v->poBox() ) ); 515 a.setPostOfficeBox( QString::fromUtf8( v->poBox() ) );
516 a.setExtended( QString::fromUtf8( v->extAddress() ) ); 516 a.setExtended( QString::fromUtf8( v->extAddress() ) );
517 a.setStreet( QString::fromUtf8( v->street() ) ); 517 a.setStreet( QString::fromUtf8( v->street() ) );
518 a.setLocality( QString::fromUtf8( v->locality() ) ); 518 a.setLocality( QString::fromUtf8( v->locality() ) );
519 a.setRegion( QString::fromUtf8( v->region() ) ); 519 a.setRegion( QString::fromUtf8( v->region() ) );
520 a.setPostalCode( QString::fromUtf8( v->postCode() ) ); 520 a.setPostalCode( QString::fromUtf8( v->postCode() ) );
521 a.setCountry( QString::fromUtf8( v->countryName() ) ); 521 a.setCountry( QString::fromUtf8( v->countryName() ) );
522 522
523 a.setType( readAddressParam( cl ) ); 523 a.setType( readAddressParam( cl ) );
524 524
525 return a; 525 return a;
526} 526}
527 527
528int VCardFormatImpl::readAddressParam( ContentLine *cl ) 528int VCardFormatImpl::readAddressParam( ContentLine *cl )
529{ 529{
530 int type = 0; 530 int type = 0;
531 ParamList params = cl->paramList(); 531 ParamList params = cl->paramList();
532 ParamListIterator it( params ); 532 ParamListIterator it( params );
533 QCString tmpStr; 533 QCString tmpStr;
534 for( ; it.current(); ++it ) { 534 for( ; it.current(); ++it ) {
535 if ( (*it)->name().upper() == "TYPE" ) { 535 if ( (*it)->name().upper() == "TYPE" ) {
536 tmpStr = (*it)->value().lower(); 536 tmpStr = (*it)->value().lower();
537 if ( tmpStr == "dom" ) type |= Address::Dom; 537 if ( tmpStr == "dom" ) type |= Address::Dom;
538 else if ( tmpStr == "intl" ) type |= Address::Intl; 538 else if ( tmpStr == "intl" ) type |= Address::Intl;
539 else if ( tmpStr == "parcel" ) type |= Address::Parcel; 539 else if ( tmpStr == "parcel" ) type |= Address::Parcel;
540 else if ( tmpStr == "postal" ) type |= Address::Postal; 540 else if ( tmpStr == "postal" ) type |= Address::Postal;
541 else if ( tmpStr == "work" ) type |= Address::Work; 541 else if ( tmpStr == "work" ) type |= Address::Work;
542 else if ( tmpStr == "home" ) type |= Address::Home; 542 else if ( tmpStr == "home" ) type |= Address::Home;
543 else if ( tmpStr == "pref" ) type |= Address::Pref; 543 else if ( tmpStr == "pref" ) type |= Address::Pref;
544 } 544 }
545 } 545 }
546 return type; 546 return type;
547} 547}
548 548
549void VCardFormatImpl::addNValue( VCard *vcard, const Addressee &a ) 549void VCardFormatImpl::addNValue( VCard *vcard, const Addressee &a )
550{ 550{
551 ContentLine cl; 551 ContentLine cl;
552 cl.setName(EntityTypeToParamName( EntityN ) ); 552 cl.setName(EntityTypeToParamName( EntityN ) );
553 NValue *v = new NValue; 553 NValue *v = new NValue;
554 v->setFamily( a.familyName().utf8() ); 554 v->setFamily( a.familyName().utf8() );
555 v->setGiven( a.givenName().utf8() ); 555 v->setGiven( a.givenName().utf8() );
556 v->setMiddle( a.additionalName().utf8() ); 556 v->setMiddle( a.additionalName().utf8() );
557 v->setPrefix( a.prefix().utf8() ); 557 v->setPrefix( a.prefix().utf8() );
558 v->setSuffix( a.suffix().utf8() ); 558 v->setSuffix( a.suffix().utf8() );
559 559
560 cl.setValue( v ); 560 cl.setValue( v );
561 vcard->add(cl); 561 vcard->add(cl);
562} 562}
563 563
564void VCardFormatImpl::readNValue( ContentLine *cl, Addressee &a ) 564void VCardFormatImpl::readNValue( ContentLine *cl, Addressee &a )
565{ 565{
566 NValue *v = (NValue *)cl->value(); 566 NValue *v = (NValue *)cl->value();
567 a.setFamilyName( QString::fromUtf8( v->family() ) ); 567 a.setFamilyName( QString::fromUtf8( v->family() ) );
568 a.setGivenName( QString::fromUtf8( v->given() ) ); 568 a.setGivenName( QString::fromUtf8( v->given() ) );
569 a.setAdditionalName( QString::fromUtf8( v->middle() ) ); 569 a.setAdditionalName( QString::fromUtf8( v->middle() ) );
570 a.setPrefix( QString::fromUtf8( v->prefix() ) ); 570 a.setPrefix( QString::fromUtf8( v->prefix() ) );
571 a.setSuffix( QString::fromUtf8( v->suffix() ) ); 571 a.setSuffix( QString::fromUtf8( v->suffix() ) );
572} 572}
573 573
574void VCardFormatImpl::addTelephoneValue( VCard *v, const PhoneNumber &p ) 574void VCardFormatImpl::addTelephoneValue( VCard *v, const PhoneNumber &p )
575{ 575{
576 if ( p.number().isEmpty() ) 576 if ( p.number().isEmpty() )
577 return; 577 return;
578 578
579 ContentLine cl; 579 ContentLine cl;
580 cl.setName(EntityTypeToParamName(EntityTelephone)); 580 cl.setName(EntityTypeToParamName(EntityTelephone));
581 cl.setValue(new TelValue( p.number().utf8() )); 581 cl.setValue(new TelValue( p.number().utf8() ));
582 582
583 ParamList params; 583 ParamList params;
584 if( p.type() & PhoneNumber::Home ) params.append( new Param( "TYPE", "home" ) ); 584 if( p.type() & PhoneNumber::Home ) params.append( new Param( "TYPE", "home" ) );
585 if( p.type() & PhoneNumber::Work ) params.append( new Param( "TYPE", "work" ) ); 585 if( p.type() & PhoneNumber::Work ) params.append( new Param( "TYPE", "work" ) );
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;
611 ParamList params = cl->paramList(); 610 ParamList params = cl->paramList();
612 ParamListIterator it( params ); 611 ParamListIterator it( params );
613 QCString tmpStr; 612 QCString tmpStr;
614 for( ; it.current(); ++it ) { 613 for( ; it.current(); ++it ) {
615 if ( (*it)->name() == "TYPE" ) { 614 if ( (*it)->name() == "TYPE" ) {
616 tmpStr = (*it)->value().lower(); 615 tmpStr = (*it)->value().lower();
617 if ( tmpStr == "home" ) type |= PhoneNumber::Home; 616 if ( tmpStr == "home" ) type |= PhoneNumber::Home;
618 else if ( tmpStr == "work" ) type |= PhoneNumber::Work; 617 else if ( tmpStr == "work" ) type |= PhoneNumber::Work;
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() );
644 } else { 642 } else {
645 kdDebug(5700) << "No value: " << cl->asString() << endl; 643 kdDebug(5700) << "No value: " << cl->asString() << endl;
646 qDebug("No value: %s", (const char*)(cl->asString())); 644 qDebug("No value: %s", (const char*)(cl->asString()));
647 return QString::null; 645 return QString::null;
648 } 646 }
649} 647}
650 648
651QDate VCardFormatImpl::readDateValue( ContentLine *cl ) 649QDate VCardFormatImpl::readDateValue( ContentLine *cl )
652{ 650{
653 DateValue *dateValue = (DateValue *)cl->value(); 651 DateValue *dateValue = (DateValue *)cl->value();
654 if ( dateValue ) 652 if ( dateValue )
655 return dateValue->qdate(); 653 return dateValue->qdate();
656 else 654 else
657 return QDate(); 655 return QDate();
658} 656}
659 657
660QDateTime VCardFormatImpl::readDateTimeValue( ContentLine *cl ) 658QDateTime VCardFormatImpl::readDateTimeValue( ContentLine *cl )
661{ 659{
662 DateValue *dateValue = (DateValue *)cl->value(); 660 DateValue *dateValue = (DateValue *)cl->value();
663 if ( dateValue ) 661 if ( dateValue )
664 return dateValue->qdt(); 662 return dateValue->qdt();
665 else 663 else
666 return QDateTime(); 664 return QDateTime();
667} 665}
668 666
669Geo VCardFormatImpl::readGeoValue( ContentLine *cl ) 667Geo VCardFormatImpl::readGeoValue( ContentLine *cl )
670{ 668{
671 GeoValue *geoValue = (GeoValue *)cl->value(); 669 GeoValue *geoValue = (GeoValue *)cl->value();
672 if ( geoValue ) { 670 if ( geoValue ) {
673 Geo geo( geoValue->latitude(), geoValue->longitude() ); 671 Geo geo( geoValue->latitude(), geoValue->longitude() );
674 return geo; 672 return geo;
675 } else 673 } else
676 return Geo(); 674 return Geo();
677} 675}
678 676
679TimeZone VCardFormatImpl::readUTCValue( ContentLine *cl ) 677TimeZone VCardFormatImpl::readUTCValue( ContentLine *cl )
680{ 678{
681 UTCValue *utcValue = (UTCValue *)cl->value(); 679 UTCValue *utcValue = (UTCValue *)cl->value();
682 if ( utcValue ) { 680 if ( utcValue ) {
683 TimeZone tz; 681 TimeZone tz;
684 tz.setOffset(((utcValue->hour()*60)+utcValue->minute())*(utcValue->positive() ? 1 : -1)); 682 tz.setOffset(((utcValue->hour()*60)+utcValue->minute())*(utcValue->positive() ? 1 : -1));
685 return tz; 683 return tz;
686 } else 684 } else
687 return TimeZone(); 685 return TimeZone();
688} 686}
689 687
690Secrecy VCardFormatImpl::readClassValue( ContentLine *cl ) 688Secrecy VCardFormatImpl::readClassValue( ContentLine *cl )
691{ 689{
692 ClassValue *classValue = (ClassValue *)cl->value(); 690 ClassValue *classValue = (ClassValue *)cl->value();
693 if ( classValue ) { 691 if ( classValue ) {
694 Secrecy secrecy; 692 Secrecy secrecy;
695 switch ( classValue->type() ) { 693 switch ( classValue->type() ) {
696 case ClassValue::Public: 694 case ClassValue::Public:
697 secrecy.setType( Secrecy::Public ); 695 secrecy.setType( Secrecy::Public );
698 break; 696 break;
699 case ClassValue::Private: 697 case ClassValue::Private:
700 secrecy.setType( Secrecy::Private ); 698 secrecy.setType( Secrecy::Private );
701 break; 699 break;
702 case ClassValue::Confidential: 700 case ClassValue::Confidential:
703 secrecy.setType( Secrecy::Confidential ); 701 secrecy.setType( Secrecy::Confidential );
704 break; 702 break;
705 } 703 }
706 704
707 return secrecy; 705 return secrecy;
708 } else 706 } else
709 return Secrecy(); 707 return Secrecy();
710} 708}
711 709
712void VCardFormatImpl::addKeyValue( VCARD::VCard *vcard, const Key &key ) 710void VCardFormatImpl::addKeyValue( VCARD::VCard *vcard, const Key &key )
713{ 711{
714 ContentLine cl; 712 ContentLine cl;
715 cl.setName( EntityTypeToParamName( EntityKey ) ); 713 cl.setName( EntityTypeToParamName( EntityKey ) );
716 714
717 ParamList params; 715 ParamList params;
718 if ( key.isBinary() ) { 716 if ( key.isBinary() ) {
719 cl.setValue( new TextValue( KCodecs::base64Encode( key.binaryData() ) ) ); 717 cl.setValue( new TextValue( KCodecs::base64Encode( key.binaryData() ) ) );
720 params.append( new Param( "ENCODING", "b" ) ); 718 params.append( new Param( "ENCODING", "b" ) );
721 } else { 719 } else {
722 cl.setValue( new TextValue( key.textData().utf8() ) ); 720 cl.setValue( new TextValue( key.textData().utf8() ) );
723 } 721 }
724 722
725 switch ( key.type() ) { 723 switch ( key.type() ) {
726 case Key::X509: 724 case Key::X509:
727 params.append( new Param( "TYPE", "X509" ) ); 725 params.append( new Param( "TYPE", "X509" ) );
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
@@ -483,193 +483,193 @@ Addressee::List VCardTool::parseVCards( const QString& vcard )
483 if ( nameParts.count() > 3 ) 483 if ( nameParts.count() > 3 )
484 addr.setPrefix( nameParts[ 3 ] ); 484 addr.setPrefix( nameParts[ 3 ] );
485 if ( nameParts.count() > 4 ) 485 if ( nameParts.count() > 4 )
486 addr.setSuffix( nameParts[ 4 ] ); 486 addr.setSuffix( nameParts[ 4 ] );
487 } 487 }
488 488
489 // NAME 489 // NAME
490 else if ( identifier == "name" ) 490 else if ( identifier == "name" )
491 addr.setName( (*lineIt).valueString() ); 491 addr.setName( (*lineIt).valueString() );
492 492
493 // NICKNAME 493 // NICKNAME
494 else if ( identifier == "nickname" ) 494 else if ( identifier == "nickname" )
495 addr.setNickName( (*lineIt).valueString() ); 495 addr.setNickName( (*lineIt).valueString() );
496 496
497 // NOTE 497 // NOTE
498 else if ( identifier == "note" ) 498 else if ( identifier == "note" )
499 addr.setNote( (*lineIt).valueString() ); 499 addr.setNote( (*lineIt).valueString() );
500 500
501 // ORGANIZATION 501 // ORGANIZATION
502 else if ( identifier == "org" ) 502 else if ( identifier == "org" )
503 addr.setOrganization( (*lineIt).valueString() ); 503 addr.setOrganization( (*lineIt).valueString() );
504 504
505 // PHOTO 505 // PHOTO
506 else if ( identifier == "photo" ) 506 else if ( identifier == "photo" )
507 addr.setPhoto( parsePicture( *lineIt ) ); 507 addr.setPhoto( parsePicture( *lineIt ) );
508 508
509 // PROID 509 // PROID
510 else if ( identifier == "prodid" ) 510 else if ( identifier == "prodid" )
511 addr.setProductId( (*lineIt).valueString() ); 511 addr.setProductId( (*lineIt).valueString() );
512 512
513 // REV 513 // REV
514 else if ( identifier == "rev" ) 514 else if ( identifier == "rev" )
515 addr.setRevision( parseDateTime( (*lineIt).valueString() ) ); 515 addr.setRevision( parseDateTime( (*lineIt).valueString() ) );
516 516
517 // ROLE 517 // ROLE
518 else if ( identifier == "role" ) 518 else if ( identifier == "role" )
519 addr.setRole( (*lineIt).valueString() ); 519 addr.setRole( (*lineIt).valueString() );
520 520
521 // SORT-STRING 521 // SORT-STRING
522 else if ( identifier == "sort-string" ) 522 else if ( identifier == "sort-string" )
523 addr.setSortString( (*lineIt).valueString() ); 523 addr.setSortString( (*lineIt).valueString() );
524 524
525 // SOUND 525 // SOUND
526 else if ( identifier == "sound" ) 526 else if ( identifier == "sound" )
527 addr.setSound( parseSound( *lineIt ) ); 527 addr.setSound( parseSound( *lineIt ) );
528 528
529 // TEL 529 // TEL
530 else if ( identifier == "tel" ) { 530 else if ( identifier == "tel" ) {
531 PhoneNumber phone; 531 PhoneNumber phone;
532 phone.setNumber( (*lineIt).valueString() ); 532 phone.setNumber( (*lineIt).valueString() );
533 533
534 int type = 0; 534 int type = 0;
535 535
536 const QStringList types = (*lineIt).parameters( "type" ); 536 const QStringList types = (*lineIt).parameters( "type" );
537 for ( QStringList::ConstIterator it = types.begin(); it != types.end(); ++it ) 537 for ( QStringList::ConstIterator it = types.begin(); it != types.end(); ++it )
538 type += mPhoneTypeMap[(*it).upper()]; 538 type += mPhoneTypeMap[(*it).upper()];
539 539
540 phone.setType( type ); 540 phone.setType( type );
541 541
542 addr.insertPhoneNumber( phone ); 542 addr.insertPhoneNumber( phone );
543 } 543 }
544 544
545 // TITLE 545 // TITLE
546 else if ( identifier == "title" ) 546 else if ( identifier == "title" )
547 addr.setTitle( (*lineIt).valueString() ); 547 addr.setTitle( (*lineIt).valueString() );
548 548
549 // TZ 549 // TZ
550 else if ( identifier == "tz" ) { 550 else if ( identifier == "tz" ) {
551 TimeZone tz; 551 TimeZone tz;
552 const QString date = (*lineIt).valueString(); 552 const QString date = (*lineIt).valueString();
553 553
554 int hours = date.mid( 1, 2).toInt(); 554 int hours = date.mid( 1, 2).toInt();
555 int minutes = date.mid( 4, 2 ).toInt(); 555 int minutes = date.mid( 4, 2 ).toInt();
556 int offset = ( hours * 60 ) + minutes; 556 int offset = ( hours * 60 ) + minutes;
557 offset = offset * ( date[ 0 ] == '+' ? 1 : -1 ); 557 offset = offset * ( date[ 0 ] == '+' ? 1 : -1 );
558 558
559 tz.setOffset( offset ); 559 tz.setOffset( offset );
560 addr.setTimeZone( tz ); 560 addr.setTimeZone( tz );
561 } 561 }
562 562
563 // UID 563 // UID
564 else if ( identifier == "uid" ) 564 else if ( identifier == "uid" )
565 addr.setUid( (*lineIt).valueString() ); 565 addr.setUid( (*lineIt).valueString() );
566 566
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(),
592 str.mid( 6, 2 ).toInt() ) ); 592 str.mid( 6, 2 ).toInt() ) );
593 593
594 if ( str.find( 'T' ) ) // has time information yyyymmddThh:mm:ss 594 if ( str.find( 'T' ) ) // has time information yyyymmddThh:mm:ss
595 dateTime.setTime( QTime( str.mid( 11, 2 ).toInt(), str.mid( 14, 2 ).toInt(), 595 dateTime.setTime( QTime( str.mid( 11, 2 ).toInt(), str.mid( 14, 2 ).toInt(),
596 str.mid( 17, 2 ).toInt() ) ); 596 str.mid( 17, 2 ).toInt() ) );
597 597
598 } else { // is extended format yyyy-mm-dd 598 } else { // is extended format yyyy-mm-dd
599 dateTime.setDate( QDate( str.left( 4 ).toInt(), str.mid( 5, 2 ).toInt(), 599 dateTime.setDate( QDate( str.left( 4 ).toInt(), str.mid( 5, 2 ).toInt(),
600 str.mid( 8, 2 ).toInt() ) ); 600 str.mid( 8, 2 ).toInt() ) );
601 601
602 if ( str.find( 'T' ) ) // has time information yyyy-mm-ddThh:mm:ss 602 if ( str.find( 'T' ) ) // has time information yyyy-mm-ddThh:mm:ss
603 dateTime.setTime( QTime( str.mid( 11, 2 ).toInt(), str.mid( 14, 2 ).toInt(), 603 dateTime.setTime( QTime( str.mid( 11, 2 ).toInt(), str.mid( 14, 2 ).toInt(),
604 str.mid( 17, 2 ).toInt() ) ); 604 str.mid( 17, 2 ).toInt() ) );
605 } 605 }
606 606
607 return dateTime; 607 return dateTime;
608} 608}
609 609
610QString VCardTool::createDateTime( const QDateTime &dateTime ) 610QString VCardTool::createDateTime( const QDateTime &dateTime )
611{ 611{
612 QString str; 612 QString str;
613 613
614 if ( dateTime.date().isValid() ) { 614 if ( dateTime.date().isValid() ) {
615 str.sprintf( "%4d-%02d-%02d", dateTime.date().year(), dateTime.date().month(), 615 str.sprintf( "%4d-%02d-%02d", dateTime.date().year(), dateTime.date().month(),
616 dateTime.date().day() ); 616 dateTime.date().day() );
617 if ( dateTime.time().isValid() ) { 617 if ( dateTime.time().isValid() ) {
618 QString tmp; 618 QString tmp;
619 tmp.sprintf( "T%02d:%02d:%02dZ", dateTime.time().hour(), dateTime.time().minute(), 619 tmp.sprintf( "T%02d:%02d:%02dZ", dateTime.time().hour(), dateTime.time().minute(),
620 dateTime.time().second() ); 620 dateTime.time().second() );
621 str += tmp; 621 str += tmp;
622 } 622 }
623 } 623 }
624 624
625 return str; 625 return str;
626} 626}
627 627
628Picture VCardTool::parsePicture( const VCardLine &line ) 628Picture VCardTool::parsePicture( const VCardLine &line )
629{ 629{
630 Picture pic; 630 Picture pic;
631 631
632 const QStringList params = line.parameterList(); 632 const QStringList params = line.parameterList();
633 if ( params.findIndex( "encoding" ) != -1 ) { 633 if ( params.findIndex( "encoding" ) != -1 ) {
634 QImage img; 634 QImage img;
635 img.loadFromData( line.valueBytes() ); 635 img.loadFromData( line.valueBytes() );
636 pic.setData( img ); 636 pic.setData( img );
637 } else if ( params.findIndex( "value" ) != -1 ) { 637 } else if ( params.findIndex( "value" ) != -1 ) {
638 if ( line.parameter( "value" ).lower() == "uri" ) 638 if ( line.parameter( "value" ).lower() == "uri" )
639 pic.setUrl( line.valueString() ); 639 pic.setUrl( line.valueString() );
640 } 640 }
641 641
642 if ( params.findIndex( "type" ) != -1 ) 642 if ( params.findIndex( "type" ) != -1 )
643 pic.setType( line.parameter( "type" ) ); 643 pic.setType( line.parameter( "type" ) );
644 644
645 return pic; 645 return pic;
646} 646}
647 647
648VCardLine VCardTool::createPicture( const QString &identifier, const Picture &pic ) 648VCardLine VCardTool::createPicture( const QString &identifier, const Picture &pic )
649{ 649{
650 VCardLine line( identifier ); 650 VCardLine line( identifier );
651 651
652 if ( pic.isIntern() ) { 652 if ( pic.isIntern() ) {
653 if ( !pic.data().isNull() ) { 653 if ( !pic.data().isNull() ) {
654 QByteArray input; 654 QByteArray input;
655 QDataStream s( input, IO_WriteOnly ); 655 QDataStream s( input, IO_WriteOnly );
656 s.setVersion( 4 ); 656 s.setVersion( 4 );
657 s << pic.data(); 657 s << pic.data();
658 line.setValueBytes( input ); 658 line.setValueBytes( input );
659 line.addParameter( "encoding", "b" ); 659 line.addParameter( "encoding", "b" );
660 line.addParameter( "type", "image/png" ); 660 line.addParameter( "type", "image/png" );
661 } 661 }
662 } else if ( !pic.url().isEmpty() ) { 662 } else if ( !pic.url().isEmpty() ) {
663 QByteArray ba; 663 QByteArray ba;
664 line.setValueString( pic.url() ); 664 line.setValueString( pic.url() );
665 line.addParameter( "value", "URI" ); 665 line.addParameter( "value", "URI" );
666 } 666 }
667 667
668 return line; 668 return line;
669} 669}
670 670
671Sound VCardTool::parseSound( const VCardLine &line ) 671Sound VCardTool::parseSound( const VCardLine &line )
672{ 672{
673 Sound snd; 673 Sound snd;
674 674
675 const QStringList params = line.parameterList(); 675 const QStringList params = line.parameterList();