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
@@ -1,826 +1,832 @@
1{ "file","Datei" }, 1{ "file","Datei" },
2{ "Choose one file","Wähle eine Datei" }, 2{ "Choose one file","Wähle eine Datei" },
3{ "dir","Verzeichnis" }, 3{ "dir","Verzeichnis" },
4{ "Choose a directory with may files","Wähle Verzeichnis" }, 4{ "Choose a directory with may files","Wähle Verzeichnis" },
5{ "ldap","ldap" }, 5{ "ldap","ldap" },
6{ "No description available","Keine Beschreibung verfügbar" }, 6{ "No description available","Keine Beschreibung verfügbar" },
7{ "Library files for "%1" not found in paths","Bibliothek für "%1" nicht gefunden" }, 7{ "Library files for "%1" not found in paths","Bibliothek für "%1" nicht gefunden" },
8{ "qtopia","qtopia" }, 8{ "qtopia","qtopia" },
9{ "Qtopia PIM Addressbook.","Qtopia PIM Adressbuch." }, 9{ "Qtopia PIM Addressbook.","Qtopia PIM Adressbuch." },
10{ "vCard","vCard" }, 10{ "vCard","vCard" },
11{ "vCard Format","vCard Format" }, 11{ "vCard Format","vCard Format" },
12{ "microkabcformat_binary","microkabcformat_binary" }, 12{ "microkabcformat_binary","microkabcformat_binary" },
13{ "Binary","Binary" }, 13{ "Binary","Binary" },
14{ "No description available.","Keine Beschreibung verfügbar." }, 14{ "No description available.","Keine Beschreibung verfügbar." },
15{ "Department","Abteilung" }, 15{ "Department","Abteilung" },
16{ "Profession","Beruf" }, 16{ "Profession","Beruf" },
17{ "Assistant's Name","Name d.Assistenten" }, 17{ "Assistant's Name","Name d.Assistenten" },
18{ "Manager's Name","Name d.Manager's" }, 18{ "Manager's Name","Name d.Manager's" },
19{ "Spouse's Name","Name d.Ehegatten" }, 19{ "Spouse's Name","Name d.Ehegatten" },
20{ "Office","Büro" }, 20{ "Office","Büro" },
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" },
405{ "Mailbox","Mailbox" }, 405{ "Mailbox","Mailbox" },
406{ "Modem","Modem" }, 406{ "Modem","Modem" },
407{ "Car","Auto" }, 407{ "Car","Auto" },
408{ "PCS","PCS" }, 408{ "PCS","PCS" },
409{ "Category","Kategorie" }, 409{ "Category","Kategorie" },
410{ "Select Categories","Wähle Kategorien" }, 410{ "Select Categories","Wähle Kategorien" },
411{ " &Deselect All "," &Deselektiere alle " }, 411{ " &Deselect All "," &Deselektiere alle " },
412{ " &Edit Categories "," B&earbeite Kategorien " }, 412{ " &Edit Categories "," B&earbeite Kategorien " },
413{ "&OK","&OK" }, 413{ "&OK","&OK" },
414{ "&Cancel","Abbre&chen" }, 414{ "&Cancel","Abbre&chen" },
415{ "Configure","Konfiguriere" }, 415{ "Configure","Konfiguriere" },
416{ "Default","Voreinstellungen" }, 416{ "Default","Voreinstellungen" },
417{ "Addressbook","Adressbuch" }, 417{ "Addressbook","Adressbuch" },
418{ "Details view font","Schriftart Detailansicht" }, 418{ "Details view font","Schriftart Detailansicht" },
419{ "phone:123","phone:123" }, 419{ "phone:123","phone:123" },
420{ "Search only after <return> key pressed","Suche nur nach <return> Taste" }, 420{ "Search only after <return> key pressed","Suche nur nach <return> Taste" },
421{ "Show edit dialog on single click","Zeige Edit Dialog bei Einzelklick" }, 421{ "Show edit dialog on single click","Zeige Edit Dialog bei Einzelklick" },
422{ "Automatic name parsing for new contacts","Automa. Name Parsen für neue Kontakte" }, 422{ "Automatic name parsing for new contacts","Automa. Name Parsen für neue Kontakte" },
423{ "Display List and Details at once (restart)","Zeige Liste und Details zusammen(neustart)" }, 423{ "Display List and Details at once (restart)","Zeige Liste und Details zusammen(neustart)" },
424{ "Show exit confirmation","Vor dem Beenden nachfragen" }, 424{ "Show exit confirmation","Vor dem Beenden nachfragen" },
425{ "General","Allgemein" }, 425{ "General","Allgemein" },
426{ "Extensions (restart)","Extensions (restart)" }, 426{ "Extensions (restart)","Extensions (restart)" },
427{ "Description","Beschreibungen" }, 427{ "Description","Beschreibungen" },
428{ "Extensions","Extensions" }, 428{ "Extensions","Extensions" },
429{ "Prefixes","Prefixe" }, 429{ "Prefixes","Prefixe" },
430{ "Inclusions","Inclusions" }, 430{ "Inclusions","Inclusions" },
431{ "Suffixes","Suffixe" }, 431{ "Suffixes","Suffixe" },
432{ "Default formatted name:","Default format. Name:" }, 432{ "Default formatted name:","Default format. Name:" },
433{ "Empty","Leer" }, 433{ "Empty","Leer" },
434{ "Simple Name","Einfacher Name" }, 434{ "Simple Name","Einfacher Name" },
435{ "Full Name","Voller Name" }, 435{ "Full Name","Voller Name" },
436{ "Reverse Name","Namen umdrehen" }, 436{ "Reverse Name","Namen umdrehen" },
437{ "Contact","Kontakt" }, 437{ "Contact","Kontakt" },
438{ "Global","Allgemein" }, 438{ "Global","Allgemein" },
439{ "Phone","Telefon" }, 439{ "Phone","Telefon" },
440{ "SMS","SMS" }, 440{ "SMS","SMS" },
441{ "Language:(needs restart)","Sprache:(Neustart)" }, 441{ "Language:(needs restart)","Sprache:(Neustart)" },
442{ "English","English" }, 442{ "English","English" },
443{ "German","Deutsch" }, 443{ "German","Deutsch" },
444{ "French","Französisch" }, 444{ "French","Französisch" },
445{ "Italian","Italienisch" }, 445{ "Italian","Italienisch" },
446{ "User defined (usertranslation.txt)","Benutzerdef. (usertranslation.txt)" }, 446{ "User defined (usertranslation.txt)","Benutzerdef. (usertranslation.txt)" },
447{ "Time Format(nr):","Zeit Format(nr):" }, 447{ "Time Format(nr):","Zeit Format(nr):" },
448{ "24:00","24:00" }, 448{ "24:00","24:00" },
449{ "12:00am","12:00am" }, 449{ "12:00am","12:00am" },
450{ "Week starts on Sunday","Woche beginnt Sonntags" }, 450{ "Week starts on Sunday","Woche beginnt Sonntags" },
451{ "Locale","Locale" }, 451{ "Locale","Locale" },
452{ "Date Format:","Datums Format:" }, 452{ "Date Format:","Datums Format:" },
453{ "24.03.2004 (%d.%m.%Y|%A %d %B %Y)","24.03.2004 (%d.%m.%Y|%A %d %B %Y)" }, 453{ "24.03.2004 (%d.%m.%Y|%A %d %B %Y)","24.03.2004 (%d.%m.%Y|%A %d %B %Y)" },
454{ "03.24.2004 (%m.%d.%Y|%A %B %d %Y)","03.24.2004 (%m.%d.%Y|%A %B %d %Y)" }, 454{ "03.24.2004 (%m.%d.%Y|%A %B %d %Y)","03.24.2004 (%m.%d.%Y|%A %B %d %Y)" },
455{ "2004-03-24 (%Y-%m-%d|%A %Y %B %d)","2004-03-24 (%Y-%m-%d|%A %Y %B %d)" }, 455{ "2004-03-24 (%Y-%m-%d|%A %Y %B %d)","2004-03-24 (%Y-%m-%d|%A %Y %B %d)" },
456{ "User defined","Benutzerdefiniert" }, 456{ "User defined","Benutzerdefiniert" },
457{ "User long date:","Format langes Datum:" }, 457{ "User long date:","Format langes Datum:" },
458{ "User short date:","Format kurzes Datum:" }, 458{ "User short date:","Format kurzes Datum:" },
459{ "Daylight start:","Sommerzeit Start:" }, 459{ "Daylight start:","Sommerzeit Start:" },
460{ "Daylight end:","Sommerzeit Ende:" }, 460{ "Daylight end:","Sommerzeit Ende:" },
461{ "Actual start and end is the\nsunday before this date.","Tatsächlicher Beginn/Ende ist der\nSonntag vor diesem Datum!" }, 461{ "Actual start and end is the\nsunday before this date.","Tatsächlicher Beginn/Ende ist der\nSonntag vor diesem Datum!" },
462{ "Monday 19 April 2004: %A %d %B %Y","Monday 19 April 2004: %A %d %B %Y" }, 462{ "Monday 19 April 2004: %A %d %B %Y","Monday 19 April 2004: %A %d %B %Y" },
463{ "Mon 19.04.04: %a %d.%m.%y","Mon 19.04.04: %a %d.%m.%y" }, 463{ "Mon 19.04.04: %a %d.%m.%y","Mon 19.04.04: %a %d.%m.%y" },
464{ "Mon, 19.Apr.04: %a, %d.%b.%y","Mon, 19.Apr.04: %a, %d.%b.%y" }, 464{ "Mon, 19.Apr.04: %a, %d.%b.%y","Mon, 19.Apr.04: %a, %d.%b.%y" },
465{ "Date Format","Datums Format" }, 465{ "Date Format","Datums Format" },
466{ "Timezone:","Zeitzone:" }, 466{ "Timezone:","Zeitzone:" },
467{ "The year in the date is ignored.","Das Jahr vom Datum wird ignoriert." }, 467{ "The year in the date is ignored.","Das Jahr vom Datum wird ignoriert." },
468{ "Timezone has daylight saving","Zeitzone hat Sommerzeit" }, 468{ "Timezone has daylight saving","Zeitzone hat Sommerzeit" },
469{ "Add 30 min to selected Timezone","Addiere 30 min zur Zeitzone" }, 469{ "Add 30 min to selected Timezone","Addiere 30 min zur Zeitzone" },
470{ "Used Mail Client","Benutzter Mail Client" }, 470{ "Used Mail Client","Benutzter Mail Client" },
471{ "Channel:","Channel:" }, 471{ "Channel:","Channel:" },
472{ "Message:","Message:" }, 472{ "Message:","Message:" },
473{ "Parameters:","Parameter:" }, 473{ "Parameters:","Parameter:" },
474{ "HINT: Delimiter=; Name=%1,Email=%2","Hinweis: Begrenzer=; Name=%1,Email=%2" }, 474{ "HINT: Delimiter=; Name=%1,Email=%2","Hinweis: Begrenzer=; Name=%1,Email=%2" },
475{ "extra Message:","extra Message:" }, 475{ "extra Message:","extra Message:" },
476{ "extra Parameters:","extra Parameter:" }, 476{ "extra Parameters:","extra Parameter:" },
477{ "HINT: Emails=%1,Attachments=%2","Hinweis: Emails=%1,Attachments=%2" }, 477{ "HINT: Emails=%1,Attachments=%2","Hinweis: Emails=%1,Attachments=%2" },
478{ "External Apps.","Externe Appl." }, 478{ "External Apps.","Externe Appl." },
479{ "Used %1 Client","Benutzer %1 Client" }, 479{ "Used %1 Client","Benutzer %1 Client" },
480{ "No email client installed","Keine Email Client installiert" }, 480{ "No email client installed","Keine Email Client installiert" },
481{ "Userdefined email client","Benutzerdef. Email Client" }, 481{ "Userdefined email client","Benutzerdef. Email Client" },
482{ "OM/Pi email client","OM/Pi Email Client" }, 482{ "OM/Pi email client","OM/Pi Email Client" },
483{ "Close KA/Pi?","Schließe KA/Pi?" }, 483{ "Close KA/Pi?","Schließe KA/Pi?" },
484{ "\nChanges will be saved!","\nÄnderungen werden gespeichert!" }, 484{ "\nChanges will be saved!","\nÄnderungen werden gespeichert!" },
485{ "Yes!","Ja!" }, 485{ "Yes!","Ja!" },
486{ "There was an error while attempting to save\n the address book. Please check that some \nother application is not using it. ","#There was an error while attempting to save\n the address book. Please check that some \nother application is not using it. " }, 486{ "There was an error while attempting to save\n the address book. Please check that some \nother application is not using it. ","#There was an error while attempting to save\n the address book. Please check that some \nother application is not using it. " },
487{ "Saving addressbook ... ","Speichere Adressbuch ... " }, 487{ "Saving addressbook ... ","Speichere Adressbuch ... " },
488{ "Addressbook saved!","Adressbuch gespeichert!" }, 488{ "Addressbook saved!","Adressbuch gespeichert!" },
489{ "Default Table View","Default Tabellenansicht" }, 489{ "Default Table View","Default Tabellenansicht" },
490{ "Merge and Remove","Zusammenfügen/entfernen" }, 490{ "Merge and Remove","Zusammenfügen/entfernen" },
491{ "Merge","Zusammenfügen" }, 491{ "Merge","Zusammenfügen" },
492{ "Merge Contacts Editor","Contact-Zusammenfüge-Editor" }, 492{ "Merge Contacts Editor","Contact-Zusammenfüge-Editor" },
493{ "New List...","Neue Liste..." }, 493{ "New List...","Neue Liste..." },
494{ "Rename List...","Ändere Namen..." }, 494{ "Rename List...","Ändere Namen..." },
495{ "Remove List","Lösche Liste" }, 495{ "Remove List","Lösche Liste" },
496{ "Add Contact","Kontakt hinzu" }, 496{ "Add Contact","Kontakt hinzu" },
497{ "Change Email...","Ändere Email..." }, 497{ "Change Email...","Ändere Email..." },
498{ "Remove Contact","Entferne Kontakt" }, 498{ "Remove Contact","Entferne Kontakt" },
499{ "Use Preferred","Nutze Preferred" }, 499{ "Use Preferred","Nutze Preferred" },
500{ "Distribution List Editor","Distribution List Editor" }, 500{ "Distribution List Editor","Distribution List Editor" },
501{ "Choose which contacts to export","Wähle Kontakte zum Exportieren" }, 501{ "Choose which contacts to export","Wähle Kontakte zum Exportieren" },
502{ "Which contacts do you want to export?","Welche Kontakte sollen exportiert werden?" }, 502{ "Which contacts do you want to export?","Welche Kontakte sollen exportiert werden?" },
503{ "Contact Selection","Kontaktauswahl" }, 503{ "Contact Selection","Kontaktauswahl" },
504{ "&All","&Alle" }, 504{ "&All","&Alle" },
505{ "Export the entire address book","Exportiere das komplette Addressbuch" }, 505{ "Export the entire address book","Exportiere das komplette Addressbuch" },
506{ "&Selected","Au&sgewählte" }, 506{ "&Selected","Au&sgewählte" },
507{ "Only export contacts selected in KAddressBook.\nThis option is disabled if no contacts are selected.","###Only export contacts selected in KAddressBook.\nThis option is disabled if no contacts are selected." }, 507{ "Only export contacts selected in KAddressBook.\nThis option is disabled if no contacts are selected.","###Only export contacts selected in KAddressBook.\nThis option is disabled if no contacts are selected." },
508{ "By matching &filter","Zutreffender &Filter" }, 508{ "By matching &filter","Zutreffender &Filter" },
509{ "Only export contacts matching the selected filter.\nThis option is disabled if you haven't defined any filters","###Only export contacts matching the selected filter.\nThis option is disabled if you haven't defined any filters" }, 509{ "Only export contacts matching the selected filter.\nThis option is disabled if you haven't defined any filters","###Only export contacts matching the selected filter.\nThis option is disabled if you haven't defined any filters" },
510{ "By Cate&gories","Kategorien" }, 510{ "By Cate&gories","Kategorien" },
511{ "Only export contacts who are members of a category that is checked on the list to the left.\nThis option is disabled if you have no categories.","###Only export contacts who are members of a category that is checked on the list to the left.\nThis option is disabled if you have no categories." }, 511{ "Only export contacts who are members of a category that is checked on the list to the left.\nThis option is disabled if you have no categories.","###Only export contacts who are members of a category that is checked on the list to the left.\nThis option is disabled if you have no categories." },
512{ "Select a filter to decide which contacts to export.","Wähle Filter zum Export aus." }, 512{ "Select a filter to decide which contacts to export.","Wähle Filter zum Export aus." },
513{ "Check the categories whose members you want to export.","Wähle die Kategorien zum Export aus." }, 513{ "Check the categories whose members you want to export.","Wähle die Kategorien zum Export aus." },
514{ "Sorting","Sortieren" }, 514{ "Sorting","Sortieren" },
515{ "Criterion:","Merkmal:" }, 515{ "Criterion:","Merkmal:" },
516{ "Order:","Reihenfolge:" }, 516{ "Order:","Reihenfolge:" },
517{ "Ascending","Aufsteigend" }, 517{ "Ascending","Aufsteigend" },
518{ "Descending","Absteigend" }, 518{ "Descending","Absteigend" },
519{ "Save file","Datei speichern" }, 519{ "Save file","Datei speichern" },
520{ "Error","Fehler" }, 520{ "Error","Fehler" },
521{ "Unable to export contacts.","Exportieren der Kontakte geht nicht." }, 521{ "Unable to export contacts.","Exportieren der Kontakte geht nicht." },
522{ "\nNo unsaved changes detected!\nNothing will be saved!","\nKeine ungespeicherten\nÄnderungen erkannt!\nNichts wird gespeichert!" }, 522{ "\nNo unsaved changes detected!\nNothing will be saved!","\nKeine ungespeicherten\nÄnderungen erkannt!\nNichts wird gespeichert!" },
523{ "Manage new categories...","Verwalte neue Kategorien..." }, 523{ "Manage new categories...","Verwalte neue Kategorien..." },
524{ "&File","Datei" }, 524{ "&File","Datei" },
525{ "&Edit","Bearbeite" }, 525{ "&Edit","Bearbeite" },
526{ "&View","Ansichten" }, 526{ "&View","Ansichten" },
527{ "&Settings","Konfiguration" }, 527{ "&Settings","Konfiguration" },
528{ "&Change selected","Ändere Selekt." }, 528{ "&Change selected","Ändere Selekt." },
529{ "&Help","Hilfe" }, 529{ "&Help","Hilfe" },
530{ "Remove sync info","Entferne Sync Info" }, 530{ "Remove sync info","Entferne Sync Info" },
531{ "For all profiles","Für alle Profile" }, 531{ "For all profiles","Für alle Profile" },
532{ "&Change","Ändere" }, 532{ "&Change","Ändere" },
533{ "Import xml (Qtopia)...","Importiere xml (Qtopia)..." }, 533{ "Import xml (Qtopia)...","Importiere xml (Qtopia)..." },
534{ "Export xml (Qtopia)...","Exportiere xml (Qtopia)..." }, 534{ "Export xml (Qtopia)...","Exportiere xml (Qtopia)..." },
535{ "Export to phone","Exportiere aufs Handy..." }, 535{ "Export to phone","Exportiere aufs Handy..." },
536{ "Which contacts do you want to select?","Welche Kontakte möchten Sie wählen?" }, 536{ "Which contacts do you want to select?","Welche Kontakte möchten Sie wählen?" },
537{ "&Modify","Ändere" }, 537{ "&Modify","Ändere" },
538{ "Choose which contacts to select","Bitte Kontakte auswählen!" }, 538{ "Choose which contacts to select","Bitte Kontakte auswählen!" },
539{ "After importing/loading/syncing\nthere may be new categories in\naddressees\nwhich are not in the category list.\nPlease choose what to do:\n ","Nach dem Importieren/Laden/Syncen\nkann es neue Kategorien in den \nKontakten geben, die nicht\nin der Kategorieliste enthalten sind.\nBitte wählen Sie, was passieren soll:\n " }, 539{ "After importing/loading/syncing\nthere may be new categories in\naddressees\nwhich are not in the category list.\nPlease choose what to do:\n ","Nach dem Importieren/Laden/Syncen\nkann es neue Kategorien in den \nKontakten geben, die nicht\nin der Kategorieliste enthalten sind.\nBitte wählen Sie, was passieren soll:\n " },
540{ "Manage new Categories","Verwalte neue Kategorien" }, 540{ "Manage new Categories","Verwalte neue Kategorien" },
541{ "Add to category list","Füge zur Kategorieliste hinzu" }, 541{ "Add to category list","Füge zur Kategorieliste hinzu" },
542{ "Remove from addressees","Entferne von den Kontakten" }, 542{ "Remove from addressees","Entferne von den Kontakten" },
543{ "New categories not in list:","Kategorien, die nicht in der Liste sind:" }, 543{ "New categories not in list:","Kategorien, die nicht in der Liste sind:" },
544{ "A&dd","Hinzufügen" }, 544{ "A&dd","Hinzufügen" },
545{ "Please read Help-Sync Howto\nto know what settings to use.","Bitte lese Hilfe-Sync Howto\num zu erfahren welche Einstellungen\ndie richtigen sind." }, 545{ "Please read Help-Sync Howto\nto know what settings to use.","Bitte lese Hilfe-Sync Howto\num zu erfahren welche Einstellungen\ndie richtigen sind." },
546{ "NOTE: This will remove all old\ncontact data on phone!","ACHTUNG: Das löscht alle alten\nKontakt Daten auf dem Handy!" }, 546{ "NOTE: This will remove all old\ncontact data on phone!","ACHTUNG: Das löscht alle alten\nKontakt Daten auf dem Handy!" },
547{ "Export to mobile phone!","Exportiere auf das Handy!" }, 547{ "Export to mobile phone!","Exportiere auf das Handy!" },
548{ "Export to phone options","Export ans Handy Optionen" }, 548{ "Export to phone options","Export ans Handy Optionen" },
549{ "Writing to phone...","Sende Daten ans Handy..." }, 549{ "Writing to phone...","Sende Daten ans Handy..." },
550{ " This may take 1-3 minutes!"," Das kann 1-3 Minuten dauern!" }, 550{ " This may take 1-3 minutes!"," Das kann 1-3 Minuten dauern!" },
551{ "Retry","Nochmal versuchen" }, 551{ "Retry","Nochmal versuchen" },
552{ "KDE/Pim phone access","KDE/Pim Handy Zugriff" }, 552{ "KDE/Pim phone access","KDE/Pim Handy Zugriff" },
553{ "Error accessing device!\nPlease turn on connection\nand retry!","Fehler beim Zugriff auf das Gerät!\nBitte die Verbindung aktivieren\nund nochmal versuchen!" }, 553{ "Error accessing device!\nPlease turn on connection\nand retry!","Fehler beim Zugriff auf das Gerät!\nBitte die Verbindung aktivieren\nund nochmal versuchen!" },
554{ "Error exporting to phone!","Fehler beim Export auf das Handy!" }, 554{ "Error exporting to phone!","Fehler beim Export auf das Handy!" },
555{ "&Print View","Drucke Ansicht" }, 555{ "&Print View","Drucke Ansicht" },
556{ "&Print Details","Drucke Details" }, 556{ "&Print Details","Drucke Details" },
557{ "Beam v&Card(s)...","Beame v&Card(s)..." }, 557{ "Beam v&Card(s)...","Beame v&Card(s)..." },
558{ "Set formatted name...","Setze formatierten Namen..." }, 558{ "Set formatted name...","Setze formatierten Namen..." },
559{ "Kde Sync HowTo","Kde Sync HowTo" }, 559{ "Kde Sync HowTo","Kde Sync HowTo" },
560{ "Multi Sync HowTo","Multi Sync HowTo" }, 560{ "Multi Sync HowTo","Multi Sync HowTo" },
561{ "&Beam","&Beame" }, 561{ "&Beam","&Beame" },
562{ "Edit Email Addresses","Editiere Email Adressen" }, 562{ "Edit Email Addresses","Editiere Email Adressen" },
563{ "Email address:","Email Adresse:" }, 563{ "Email address:","Email Adresse:" },
564{ "Change","Ändere" }, 564{ "Change","Ändere" },
565{ "Set Standard","Setze Standard" }, 565{ "Set Standard","Setze Standard" },
566{ "New Contact","Neuer Contact" }, 566{ "New Contact","Neuer Contact" },
567{ "Undo %1","Rückgängig %1" }, 567{ "Undo %1","Rückgängig %1" },
568{ "Redo","Wiederholen" }, 568{ "Redo","Wiederholen" },
569{ "Saving ... please wait! ","Am Speichern ... bitte warten! " }, 569{ "Saving ... please wait! ","Am Speichern ... bitte warten! " },
570{ "CSV Import Dialog","CSV Import Dialog" }, 570{ "CSV Import Dialog","CSV Import Dialog" },
571{ "File to import:","Datei zum Import:" }, 571{ "File to import:","Datei zum Import:" },
572{ "Delimiter","Trennzeichen" }, 572{ "Delimiter","Trennzeichen" },
573{ "Comma","Komma" }, 573{ "Comma","Komma" },
574{ "Semicolon","Semikolon" }, 574{ "Semicolon","Semikolon" },
575{ "Tabulator","Tabulator" }, 575{ "Tabulator","Tabulator" },
576{ "Space","Leerzeichen" }, 576{ "Space","Leerzeichen" },
577{ "1","1" }, 577{ "1","1" },
578{ """,""" }, 578{ """,""" },
579{ "'","'" }, 579{ "'","'" },
580{ "Start at line:","Beginne mit Zeile:" }, 580{ "Start at line:","Beginne mit Zeile:" },
581{ "Textquote:","Textquote:" }, 581{ "Textquote:","Textquote:" },
582{ "Ignore duplicate delimiters","Ignoriere doppelte Trennzeichen" }, 582{ "Ignore duplicate delimiters","Ignoriere doppelte Trennzeichen" },
583{ "Import KDE 2 Addressbook","Importiere KDE 2 Addressbook" }, 583{ "Import KDE 2 Addressbook","Importiere KDE 2 Addressbook" },
584{ "Override previously imported entries?","Überschreibe bereits importierte Einträge?" }, 584{ "Override previously imported entries?","Überschreibe bereits importierte Einträge?" },
585{ "Select vCard to Import","Selektiere zu importierende vCard" }, 585{ "Select vCard to Import","Selektiere zu importierende vCard" },
586{ "Information","Information" }, 586{ "Information","Information" },
587{ "Import xml file","Importiere xml Datei" }, 587{ "Import xml file","Importiere xml Datei" },
588{ "Choose contact selection","Wähle Kontakt Auswahl" }, 588{ "Choose contact selection","Wähle Kontakt Auswahl" },
589{ "Select the entire address book","Wähle das ganze Adressbuch" }, 589{ "Select the entire address book","Wähle das ganze Adressbuch" },
590{ "Only contacts selected in KAddressBook.\nThis option is disabled if no contacts are selected.","Nur in KA/Pi selektierte Kontate.\nDiese Option ist nicht verfügbar\nwhen keine Kontakte selektiert sind." }, 590{ "Only contacts selected in KAddressBook.\nThis option is disabled if no contacts are selected.","Nur in KA/Pi selektierte Kontate.\nDiese Option ist nicht verfügbar\nwhen keine Kontakte selektiert sind." },
591{ "Only contacts matching the selected filter.\nThis option is disabled if you haven't defined any filters","Nur Kontakte die auf den Filter zutreffen.\nDiese Option ist nicht verfügbar, wenn keine Filter definiert sind." }, 591{ "Only contacts matching the selected filter.\nThis option is disabled if you haven't defined any filters","Nur Kontakte die auf den Filter zutreffen.\nDiese Option ist nicht verfügbar, wenn keine Filter definiert sind." },
592{ "Only contacts who are members of a category that is checked on the list to the left.\nThis option is disabled if you have no categories.","Nur Kontakte die Mitglieder der Kategirien sind,\die links selektiert sind.\nDiese Option ist nicht verfügbar, wenn es keine Kategirien gibt." }, 592{ "Only contacts who are members of a category that is checked on the list to the left.\nThis option is disabled if you have no categories.","Nur Kontakte die Mitglieder der Kategirien sind,\die links selektiert sind.\nDiese Option ist nicht verfügbar, wenn es keine Kategirien gibt." },
593{ "Select a filter to decide which contacts to select.","Selektiere einen Filter um festzulegen welche Kontakte ausgewählt werden sollen." }, 593{ "Select a filter to decide which contacts to select.","Selektiere einen Filter um festzulegen welche Kontakte ausgewählt werden sollen." },
594{ "Check the categories whose members you want to select.","Setzte die Kategorien, dessen Mitglieder Sie auswählen möchten." }, 594{ "Check the categories whose members you want to select.","Setzte die Kategorien, dessen Mitglieder Sie auswählen möchten." },
595{ "I/O device: ","I/O device: " }, 595{ "I/O device: ","I/O device: " },
596{ "Connection: ","Connection: " }, 596{ "Connection: ","Connection: " },
597{ "Model(opt.): ","Model(opt.): " }, 597{ "Model(opt.): ","Model(opt.): " },
598{ "Exporting to phone...","Exportiere aufs Handy..." }, 598{ "Exporting to phone...","Exportiere aufs Handy..." },
599{ "Error exporting to phone","Fehler beim Export aufs Handy" }, 599{ "Error exporting to phone","Fehler beim Export aufs Handy" },
600{ "contacts successfully exported.","Kontakte erfolgreich exportiert." }, 600{ "contacts successfully exported.","Kontakte erfolgreich exportiert." },
601{ "Do you want to remove<br>all existing entries from<br>%1<br>before exporting.?","Wollen Sie<br>alle existieren Einträge von<br>%1<br>vor dem Export entfernen?" }, 601{ "Do you want to remove<br>all existing entries from<br>%1<br>before exporting.?","Wollen Sie<br>alle existieren Einträge von<br>%1<br>vor dem Export entfernen?" },
602{ "Set formatted name","Setze formatierten Namen" }, 602{ "Set formatted name","Setze formatierten Namen" },
603{ "You can set the formatted name\nfor a list of contacts in one go.","Sie können den formatierten Namen für\nein Liste von Kontakten auf einmal setzen." }, 603{ "You can set the formatted name\nfor a list of contacts in one go.","Sie können den formatierten Namen für\nein Liste von Kontakten auf einmal setzen." },
604{ "Set formatted name to:","Setze formatierten Name auf:" }, 604{ "Set formatted name to:","Setze formatierten Name auf:" },
605{ "Simple: James Bond","Einfach: James Bond" }, 605{ "Simple: James Bond","Einfach: James Bond" },
606{ "Full: Mr. James 007 Bond I","Voll: Mr. James 007 Bond I" }, 606{ "Full: Mr. James 007 Bond I","Voll: Mr. James 007 Bond I" },
607{ "Reverse: Bond, James","Umgekehrt: Bond, James" }, 607{ "Reverse: Bond, James","Umgekehrt: Bond, James" },
608{ "Organization: MI6","Organisation: MI6" }, 608{ "Organization: MI6","Organisation: MI6" },
609{ "Set formatted name to\norganization, if name empty","Setze formatierten Namen auf\nOrganisation, wenn Name leer ist." }, 609{ "Set formatted name to\norganization, if name empty","Setze formatierten Namen auf\nOrganisation, wenn Name leer ist." },
610{ "Select contact list","Selektiere Kontakt Liste" }, 610{ "Select contact list","Selektiere Kontakt Liste" },
611{ "Changing contact #%1","Ändere Kontakt #%1" }, 611{ "Changing contact #%1","Ändere Kontakt #%1" },
612{ "Refreshing view...","Lade Ansicht neu..." }, 612{ "Refreshing view...","Lade Ansicht neu..." },
613{ "Setting formatted name completed!","Setzen vom formatierten Namen beendet!" }, 613{ "Setting formatted name completed!","Setzen vom formatierten Namen beendet!" },
614{ "Removing voice...","Entferne voice..." }, 614{ "Removing voice...","Entferne voice..." },
615{ "Remove voice completed!","Entferne voice beendet!" }, 615{ "Remove voice completed!","Entferne voice beendet!" },
616{ "Merge with existing categories?","Zu bestehenden\nKategorien hinzufügen?" }, 616{ "Merge with existing categories?","Zu bestehenden\nKategorien hinzufügen?" },
617{ "Setting categories ... please wait!","Setze Kategorien ... bitte warten!" }, 617{ "Setting categories ... please wait!","Setze Kategorien ... bitte warten!" },
618{ "Setting categories completed!","Setzen der Kategorien beendet!" }, 618{ "Setting categories completed!","Setzen der Kategorien beendet!" },
619{ "OK","OK" }, 619{ "OK","OK" },
620{ "Please wait, processing categories...","Bitte warten, bearbeite Kategorien..." }, 620{ "Please wait, processing categories...","Bitte warten, bearbeite Kategorien..." },
621{ "Processing contact #%1","Bearbeite Kontakt #%1" }, 621{ "Processing contact #%1","Bearbeite Kontakt #%1" },
622{ " categories added to list! "," Kategorien zur Liste hinzugefügt! " }, 622{ " categories added to list! "," Kategorien zur Liste hinzugefügt! " },
623{ "%1: %2","%1: %2" }, 623{ "%1: %2","%1: %2" },
624{ "Your personal contact is\nnot set! Please select it\nand set it with menu:\nSettings - Set Who Am I\n","Ihr persönlicher Kontakt ist\nnicht gesetzt! Bitte selektieren Sie\nihn und setzen ihn mit Menu:\nKonfiguration - Setze wer bin ich\n" }, 624{ "Your personal contact is\nnot set! Please select it\nand set it with menu:\nSettings - Set Who Am I\n","Ihr persönlicher Kontakt ist\nnicht gesetzt! Bitte selektieren Sie\nihn und setzen ihn mit Menu:\nKonfiguration - Setze wer bin ich\n" },
625{ "<qt>Do you really want to use <b>%1</b> as your new personal contact?</qt>","<qt>Wollen Sie wirklich<br><b>%1</b><br>als persönlichen Kontakt setzent?</qt>" }, 625{ "<qt>Do you really want to use <b>%1</b> as your new personal contact?</qt>","<qt>Wollen Sie wirklich<br><b>%1</b><br>als persönlichen Kontakt setzent?</qt>" },
626{ "Cut","Ausschneiden" }, 626{ "Cut","Ausschneiden" },
627{ "Paste","Einfügen" }, 627{ "Paste","Einfügen" },
628{ "Delete","Löschen" }, 628{ "Delete","Löschen" },
629{ "Choose...","Wähle..." }, 629{ "Choose...","Wähle..." },
630{ "Add View","Ansicht hinzufügen" }, 630{ "Add View","Ansicht hinzufügen" },
631{ "View name:","Ansicht Name:" }, 631{ "View name:","Ansicht Name:" },
632{ "View Type","Typ der Ansicht" }, 632{ "View Type","Typ der Ansicht" },
633{ "Icons represent contacts. Very simple view.","Icons repräsentieren Kontakte. Sehr einfache Ansicht." }, 633{ "Icons represent contacts. Very simple view.","Icons repräsentieren Kontakte. Sehr einfache Ansicht." },
634{ "A listing of contacts in a table. Each cell of the table holds a field of the contact.","Eine Kontaktliste in einer Tabelle." }, 634{ "A listing of contacts in a table. Each cell of the table holds a field of the contact.","Eine Kontaktliste in einer Tabelle." },
635{ "Rolodex style cards represent contacts.","Rolodex Stil Karten repräsentieren Kontakte." }, 635{ "Rolodex style cards represent contacts.","Rolodex Stil Karten repräsentieren Kontakte." },
636{ "Draw &separators","Zeichne &Trennlinie" }, 636{ "Draw &separators","Zeichne &Trennlinie" },
637{ "Separator &width:","Trennlinien &Breite:" }, 637{ "Separator &width:","Trennlinien &Breite:" },
638{ "&Padding:","Füllung:" }, 638{ "&Padding:","Füllung:" },
639{ "Cards","Karten" }, 639{ "Cards","Karten" },
640{ "&Margin:","&Rand:" }, 640{ "&Margin:","&Rand:" },
641{ "Draw &borders","Zeichne Ränder" }, 641{ "Draw &borders","Zeichne Ränder" },
642{ "The item margin is the distance (in pixels) between the item edge and the item data. Most noticeably, incrementing the item margin will add space between the focus rectangle and the item data.","The item margin is the distance (in pixels) between the item edge and the item data. Most noticeably, incrementing the item margin will add space between the focus rectangle and the item data." }, 642{ "The item margin is the distance (in pixels) between the item edge and the item data. Most noticeably, incrementing the item margin will add space between the focus rectangle and the item data.","The item margin is the distance (in pixels) between the item edge and the item data. Most noticeably, incrementing the item margin will add space between the focus rectangle and the item data." },
643{ "The Item Spacing decides the distance (in pixels) between the items and anything else: the view borders, other items or column separators.","The Item Spacing decides the distance (in pixels) between the items and anything else: the view borders, other items or column separators." }, 643{ "The Item Spacing decides the distance (in pixels) between the items and anything else: the view borders, other items or column separators.","The Item Spacing decides the distance (in pixels) between the items and anything else: the view borders, other items or column separators." },
644{ "Sets the width of column separators","Sets the width of column separators" }, 644{ "Sets the width of column separators","Sets the width of column separators" },
645{ "&Layout","&Layout" }, 645{ "&Layout","&Layout" },
646{ "Show &empty fields","Zeige leere Felder" }, 646{ "Show &empty fields","Zeige leere Felder" },
647{ "Show field &labels","Zeige Feld Label" }, 647{ "Show field &labels","Zeige Feld Label" },
648{ "Be&havior","Ver&halten" }, 648{ "Be&havior","Ver&halten" },
649{ "Header, Border and Separator Color","Kopf, Rand und Trennlinien Farbe" }, 649{ "Header, Border and Separator Color","Kopf, Rand und Trennlinien Farbe" },
650{ "<qt>Are you sure that you want to delete the view <b>%1</b>?</qt>","<qt>Sind Sie sicher, dass Sie die Ansicht <b>%1</b> löschen möchten?</qt>" }, 650{ "<qt>Are you sure that you want to delete the view <b>%1</b>?</qt>","<qt>Sind Sie sicher, dass Sie die Ansicht <b>%1</b> löschen möchten?</qt>" },
651{ "Confirm Delete","Bestätige Löschen" }, 651{ "Confirm Delete","Bestätige Löschen" },
652{ "Edit Address Book Filter","Editiere Adressbuch Filter" }, 652{ "Edit Address Book Filter","Editiere Adressbuch Filter" },
653{ "Category rule","Kategorie Regel" }, 653{ "Category rule","Kategorie Regel" },
654{ "Include categories","Inklusive" }, 654{ "Include categories","Inklusive" },
655{ "Exclude categories","Exclusive" }, 655{ "Exclude categories","Exclusive" },
656{ "Include contacts, that are:","Schließe folgende Kontakte ein:" }, 656{ "Include contacts, that are:","Schließe folgende Kontakte ein:" },
657{ "public","Öffentlich" }, 657{ "public","Öffentlich" },
658{ "private","Privat" }, 658{ "private","Privat" },
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
@@ -77,2090 +77,2152 @@ struct Addressee::AddresseeData : public KShared
77 Sound sound; 77 Sound sound;
78 Agent agent; 78 Agent agent;
79 QString mExternalId; 79 QString mExternalId;
80 PhoneNumber::List phoneNumbers; 80 PhoneNumber::List phoneNumbers;
81 Address::List addresses; 81 Address::List addresses;
82 Key::List keys; 82 Key::List keys;
83 QStringList emails; 83 QStringList emails;
84 QStringList categories; 84 QStringList categories;
85 QStringList custom; 85 QStringList custom;
86 int mTempSyncStat; 86 int mTempSyncStat;
87 Resource *resource; 87 Resource *resource;
88 88
89 bool empty :1; 89 bool empty :1;
90 bool changed :1; 90 bool changed :1;
91 bool tagged :1; 91 bool tagged :1;
92}; 92};
93 93
94Addressee::Addressee() 94Addressee::Addressee()
95{ 95{
96 mData = new AddresseeData; 96 mData = new AddresseeData;
97 mData->empty = true; 97 mData->empty = true;
98 mData->changed = false; 98 mData->changed = false;
99 mData->resource = 0; 99 mData->resource = 0;
100 mData->mExternalId = ":"; 100 mData->mExternalId = ":";
101 mData->revision = QDateTime ( QDate( 2003,1,1)); 101 mData->revision = QDateTime ( QDate( 2003,1,1));
102 mData->mTempSyncStat = SYNC_TEMPSTATE_INITIAL; 102 mData->mTempSyncStat = SYNC_TEMPSTATE_INITIAL;
103} 103}
104 104
105Addressee::~Addressee() 105Addressee::~Addressee()
106{ 106{
107} 107}
108 108
109Addressee::Addressee( const Addressee &a ) 109Addressee::Addressee( const Addressee &a )
110{ 110{
111 mData = a.mData; 111 mData = a.mData;
112} 112}
113 113
114Addressee &Addressee::operator=( const Addressee &a ) 114Addressee &Addressee::operator=( const Addressee &a )
115{ 115{
116 mData = a.mData; 116 mData = a.mData;
117 return (*this); 117 return (*this);
118} 118}
119 119
120Addressee Addressee::copy() 120Addressee Addressee::copy()
121{ 121{
122 Addressee a; 122 Addressee a;
123 *(a.mData) = *mData; 123 *(a.mData) = *mData;
124 return a; 124 return a;
125} 125}
126 126
127void Addressee::detach() 127void Addressee::detach()
128{ 128{
129 if ( mData.count() == 1 ) return; 129 if ( mData.count() == 1 ) return;
130 *this = copy(); 130 *this = copy();
131} 131}
132 132
133bool Addressee::operator==( const Addressee &a ) const 133bool Addressee::operator==( const Addressee &a ) const
134{ 134{
135 if ( uid() != a.uid() ) return false; 135 if ( uid() != a.uid() ) return false;
136 if ( mData->name != a.mData->name ) return false; 136 if ( mData->name != a.mData->name ) return false;
137 if ( mData->formattedName != a.mData->formattedName ) return false; 137 if ( mData->formattedName != a.mData->formattedName ) return false;
138 if ( mData->familyName != a.mData->familyName ) return false; 138 if ( mData->familyName != a.mData->familyName ) return false;
139 if ( mData->givenName != a.mData->givenName ) return false; 139 if ( mData->givenName != a.mData->givenName ) return false;
140 if ( mData->additionalName != a.mData->additionalName ) return false; 140 if ( mData->additionalName != a.mData->additionalName ) return false;
141 if ( mData->prefix != a.mData->prefix ) return false; 141 if ( mData->prefix != a.mData->prefix ) return false;
142 if ( mData->suffix != a.mData->suffix ) return false; 142 if ( mData->suffix != a.mData->suffix ) return false;
143 if ( mData->nickName != a.mData->nickName ) return false; 143 if ( mData->nickName != a.mData->nickName ) return false;
144 if ( mData->birthday != a.mData->birthday ) return false; 144 if ( mData->birthday != a.mData->birthday ) return false;
145 if ( mData->mailer != a.mData->mailer ) return false; 145 if ( mData->mailer != a.mData->mailer ) return false;
146 if ( mData->timeZone != a.mData->timeZone ) return false; 146 if ( mData->timeZone != a.mData->timeZone ) return false;
147 if ( mData->geo != a.mData->geo ) return false; 147 if ( mData->geo != a.mData->geo ) return false;
148 if ( mData->title != a.mData->title ) return false; 148 if ( mData->title != a.mData->title ) return false;
149 if ( mData->role != a.mData->role ) return false; 149 if ( mData->role != a.mData->role ) return false;
150 if ( mData->organization != a.mData->organization ) return false; 150 if ( mData->organization != a.mData->organization ) return false;
151 if ( mData->note != a.mData->note ) return false; 151 if ( mData->note != a.mData->note ) return false;
152 if ( mData->productId != a.mData->productId ) return false; 152 if ( mData->productId != a.mData->productId ) return false;
153 //if ( mData->revision != a.mData->revision ) return false; 153 //if ( mData->revision != a.mData->revision ) return false;
154 if ( mData->sortString != a.mData->sortString ) return false; 154 if ( mData->sortString != a.mData->sortString ) return false;
155 if ( mData->secrecy != a.mData->secrecy ) return false; 155 if ( mData->secrecy != a.mData->secrecy ) return false;
156 if ( mData->logo != a.mData->logo ) return false; 156 if ( mData->logo != a.mData->logo ) return false;
157 if ( mData->photo != a.mData->photo ) return false; 157 if ( mData->photo != a.mData->photo ) return false;
158 if ( mData->sound != a.mData->sound ) return false; 158 if ( mData->sound != a.mData->sound ) return false;
159 if ( mData->agent != a.mData->agent ) return false; 159 if ( mData->agent != a.mData->agent ) return false;
160 if ( ( mData->url.isValid() || a.mData->url.isValid() ) && 160 if ( ( mData->url.isValid() || a.mData->url.isValid() ) &&
161 ( mData->url != a.mData->url ) ) return false; 161 ( mData->url != a.mData->url ) ) return false;
162 if ( mData->phoneNumbers != a.mData->phoneNumbers ) return false; 162 if ( mData->phoneNumbers != a.mData->phoneNumbers ) return false;
163 if ( mData->addresses != a.mData->addresses ) return false; 163 if ( mData->addresses != a.mData->addresses ) return false;
164 if ( mData->keys != a.mData->keys ) return false; 164 if ( mData->keys != a.mData->keys ) return false;
165 if ( mData->emails != a.mData->emails ) return false; 165 if ( mData->emails != a.mData->emails ) return false;
166 if ( mData->categories != a.mData->categories ) return false; 166 if ( mData->categories != a.mData->categories ) return false;
167 if ( mData->custom != a.mData->custom ) return false; 167 if ( mData->custom != a.mData->custom ) return false;
168 168
169 return true; 169 return true;
170} 170}
171 171
172bool Addressee::operator!=( const Addressee &a ) const 172bool Addressee::operator!=( const Addressee &a ) const
173{ 173{
174 return !( a == *this ); 174 return !( a == *this );
175} 175}
176 176
177bool Addressee::isEmpty() const 177bool Addressee::isEmpty() const
178{ 178{
179 return mData->empty; 179 return mData->empty;
180} 180}
181ulong Addressee::getCsum4List( const QStringList & attList) 181ulong Addressee::getCsum4List( const QStringList & attList)
182{ 182{
183 int max = attList.count(); 183 int max = attList.count();
184 ulong cSum = 0; 184 ulong cSum = 0;
185 int j,k,i; 185 int j,k,i;
186 int add; 186 int add;
187 for ( i = 0; i < max ; ++i ) { 187 for ( i = 0; i < max ; ++i ) {
188 QString s = attList[i]; 188 QString s = attList[i];
189 if ( ! s.isEmpty() ){ 189 if ( ! s.isEmpty() ){
190 j = s.length(); 190 j = s.length();
191 for ( k = 0; k < j; ++k ) { 191 for ( k = 0; k < j; ++k ) {
192 int mul = k +1; 192 int mul = k +1;
193 add = s[k].unicode (); 193 add = s[k].unicode ();
194 if ( k < 16 ) 194 if ( k < 16 )
195 mul = mul * mul; 195 mul = mul * mul;
196 int ii = i+1; 196 int ii = i+1;
197 add = add * mul *ii*ii*ii; 197 add = add * mul *ii*ii*ii;
198 cSum += add; 198 cSum += add;
199 //qDebug("csum: %d %d %d", i,k,cSum); 199 //qDebug("csum: %d %d %d", i,k,cSum);
200 } 200 }
201 } 201 }
202 202
203 } 203 }
204 //QString dump = attList.join(","); 204 //QString dump = attList.join(",");
205 //qDebug("csum: %d %s", cSum,dump.latin1()); 205 //qDebug("csum: %d %s", cSum,dump.latin1());
206 206
207 return cSum; 207 return cSum;
208 208
209} 209}
210void Addressee::computeCsum(const QString &dev) 210void Addressee::computeCsum(const QString &dev)
211{ 211{
212 QStringList l; 212 QStringList l;
213 //if ( !mData->name.isEmpty() ) l.append(mData->name); 213 //if ( !mData->name.isEmpty() ) l.append(mData->name);
214 //if ( !mData->formattedName.isEmpty() ) l.append(mData->formattedName ); 214 //if ( !mData->formattedName.isEmpty() ) l.append(mData->formattedName );
215 if ( !mData->familyName.isEmpty() ) l.append( mData->familyName ); 215 if ( !mData->familyName.isEmpty() ) l.append( mData->familyName );
216 if ( !mData->givenName.isEmpty() ) l.append(mData->givenName ); 216 if ( !mData->givenName.isEmpty() ) l.append(mData->givenName );
217 if ( !mData->additionalName.isEmpty() ) l.append( mData->additionalName ); 217 if ( !mData->additionalName.isEmpty() ) l.append( mData->additionalName );
218 if ( !mData->prefix.isEmpty() ) l.append( mData->prefix ); 218 if ( !mData->prefix.isEmpty() ) l.append( mData->prefix );
219 if ( !mData->suffix.isEmpty() ) l.append( mData->suffix ); 219 if ( !mData->suffix.isEmpty() ) l.append( mData->suffix );
220 if ( !mData->nickName.isEmpty() ) l.append( mData->nickName ); 220 if ( !mData->nickName.isEmpty() ) l.append( mData->nickName );
221 if ( mData->birthday.isValid() ) l.append( mData->birthday.toString() ); 221 if ( mData->birthday.isValid() ) l.append( mData->birthday.toString() );
222 if ( !mData->mailer.isEmpty() ) l.append( mData->mailer ); 222 if ( !mData->mailer.isEmpty() ) l.append( mData->mailer );
223 if ( mData->timeZone.isValid() ) l.append( mData->timeZone.asString() ); 223 if ( mData->timeZone.isValid() ) l.append( mData->timeZone.asString() );
224 if ( mData->geo.isValid() ) l.append( mData->geo.asString() ); 224 if ( mData->geo.isValid() ) l.append( mData->geo.asString() );
225 if ( !mData->title .isEmpty() ) l.append( mData->title ); 225 if ( !mData->title .isEmpty() ) l.append( mData->title );
226 if ( !mData->role.isEmpty() ) l.append( mData->role ); 226 if ( !mData->role.isEmpty() ) l.append( mData->role );
227 if ( !mData->organization.isEmpty() ) l.append( mData->organization ); 227 if ( !mData->organization.isEmpty() ) l.append( mData->organization );
228 if ( !mData->note.isEmpty() ) l.append( mData->note ); 228 if ( !mData->note.isEmpty() ) l.append( mData->note );
229 if ( !mData->productId.isEmpty() ) l.append(mData->productId ); 229 if ( !mData->productId.isEmpty() ) l.append(mData->productId );
230 if ( !mData->sortString.isEmpty() ) l.append( mData->sortString ); 230 if ( !mData->sortString.isEmpty() ) l.append( mData->sortString );
231 if ( mData->secrecy.isValid() ) l.append( mData->secrecy.asString()); 231 if ( mData->secrecy.isValid() ) l.append( mData->secrecy.asString());
232 if ( !mData->logo.undefined() ) { 232 if ( !mData->logo.undefined() ) {
233 if ( !mData->logo.isIntern() ) 233 if ( !mData->logo.isIntern() )
234 l.append( mData->logo.url() ); 234 l.append( mData->logo.url() );
235 else 235 else
236 l.append( QString::number(mData->logo.data().width()* mData->logo.data().height())); 236 l.append( QString::number(mData->logo.data().width()* mData->logo.data().height()));
237 } else { 237 } else {
238 l.append( "nologo"); 238 l.append( "nologo");
239 } 239 }
240 if ( !mData->photo.undefined() ) { 240 if ( !mData->photo.undefined() ) {
241 if ( !mData->photo.isIntern() ) 241 if ( !mData->photo.isIntern() )
242 l.append( mData->photo.url() ); 242 l.append( mData->photo.url() );
243 else 243 else
244 l.append( QString::number(mData->photo.data().width()* mData->photo.data().height())); 244 l.append( QString::number(mData->photo.data().width()* mData->photo.data().height()));
245 } else { 245 } else {
246 l.append( "nophoto"); 246 l.append( "nophoto");
247 } 247 }
248#if 0 248#if 0
249 if ( !mData->sound.undefined() ) { 249 if ( !mData->sound.undefined() ) {
250 if ( !mData->sound.isIntern() ) 250 if ( !mData->sound.isIntern() )
251 l.append( mData->sound.url() ); 251 l.append( mData->sound.url() );
252 else 252 else
253 l.append( QString(mData->sound.data().with()* mData->sound.data().height())); 253 l.append( QString(mData->sound.data().with()* mData->sound.data().height()));
254 } else { 254 } else {
255 l.append( "nosound"); 255 l.append( "nosound");
256 } 256 }
257#endif 257#endif
258 //if ( !mData->agent.isEmpty() ) l.append( ); 258 //if ( !mData->agent.isEmpty() ) l.append( );
259 if ( mData->url.isValid() ) 259 if ( mData->url.isValid() )
260 if ( ! mData->url.path().isEmpty()) l.append( mData->url.path() ); 260 if ( ! mData->url.path().isEmpty()) l.append( mData->url.path() );
261 KABC::PhoneNumber::List phoneNumbers; 261 KABC::PhoneNumber::List phoneNumbers;
262 KABC::PhoneNumber::List::Iterator phoneIter; 262 KABC::PhoneNumber::List::Iterator phoneIter;
263 263
264 QStringList t; 264 QStringList t;
265 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); 265 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
266 ++phoneIter ) 266 ++phoneIter )
267 t.append( ( *phoneIter ).number()+QString::number( ( *phoneIter ).type() ) ); 267 t.append( ( *phoneIter ).number()+QString::number( ( *phoneIter ).type() ) );
268 t.sort(); 268 t.sort();
269 uint iii; 269 uint iii;
270 for ( iii = 0; iii < t.count(); ++iii) 270 for ( iii = 0; iii < t.count(); ++iii)
271 l.append( t[iii] ); 271 l.append( t[iii] );
272 t = mData->emails; 272 t = mData->emails;
273 t.sort(); 273 t.sort();
274 for ( iii = 0; iii < t.count(); ++iii) 274 for ( iii = 0; iii < t.count(); ++iii)
275 l.append( t[iii] ); 275 l.append( t[iii] );
276 t = mData->categories; 276 t = mData->categories;
277 t.sort(); 277 t.sort();
278 for ( iii = 0; iii < t.count(); ++iii) 278 for ( iii = 0; iii < t.count(); ++iii)
279 l.append( t[iii] ); 279 l.append( t[iii] );
280 t = mData->custom; 280 t = mData->custom;
281 t.sort(); 281 t.sort();
282 for ( iii = 0; iii < t.count(); ++iii) 282 for ( iii = 0; iii < t.count(); ++iii)
283 if ( t[iii].left( 25 ) != "KADDRESSBOOK-X-ExternalID" ) { 283 if ( t[iii].left( 25 ) != "KADDRESSBOOK-X-ExternalID" ) {
284 int find = t[iii].find (':')+1; 284 int find = t[iii].find (':')+1;
285 //qDebug("lennnn %d %d ", find, t[iii].length()); 285 //qDebug("lennnn %d %d ", find, t[iii].length());
286 if ( find < t[iii].length()) 286 if ( find < t[iii].length())
287 l.append( t[iii] ); 287 l.append( t[iii] );
288 288
289 } 289 }
290 KABC::Address::List::Iterator addressIter; 290 KABC::Address::List::Iterator addressIter;
291 for ( addressIter = mData->addresses.begin(); addressIter != mData->addresses.end(); 291 for ( addressIter = mData->addresses.begin(); addressIter != mData->addresses.end();
292 ++addressIter ) { 292 ++addressIter ) {
293 t = (*addressIter).asList(); 293 t = (*addressIter).asList();
294 t.sort(); 294 t.sort();
295 for ( iii = 0; iii < t.count(); ++iii) 295 for ( iii = 0; iii < t.count(); ++iii)
296 l.append( t[iii] ); 296 l.append( t[iii] );
297 } 297 }
298 uint cs = getCsum4List(l); 298 uint cs = getCsum4List(l);
299 299
300#if 0 300#if 0
301 for ( iii = 0; iii < l.count(); ++iii) 301 for ( iii = 0; iii < l.count(); ++iii)
302 qDebug("%d***%s***",iii,l[iii].latin1()); 302 qDebug("%d***%s***",iii,l[iii].latin1());
303 qDebug("CSUM computed %d %s %s", cs,QString::number (cs ).latin1(), uid().latin1() ); 303 qDebug("CSUM computed %d %s %s", cs,QString::number (cs ).latin1(), uid().latin1() );
304#endif 304#endif
305 305
306 306
307 setCsum( dev, QString::number (cs )); 307 setCsum( dev, QString::number (cs ));
308} 308}
309bool Addressee::matchAddress( QRegExp* re ) const 309bool Addressee::matchAddress( QRegExp* re ) const
310{ 310{
311 KABC::Address::List::Iterator addressIter; 311 KABC::Address::List::Iterator addressIter;
312 for ( addressIter = mData->addresses.begin(); addressIter != mData->addresses.end(); 312 for ( addressIter = mData->addresses.begin(); addressIter != mData->addresses.end();
313 ++addressIter ) { 313 ++addressIter ) {
314 if ( (*addressIter).matchAddress( re ) ) 314 if ( (*addressIter).matchAddress( re ) )
315 return true; 315 return true;
316 } 316 }
317 return false; 317 return false;
318} 318}
319bool Addressee::matchPhoneNumber( QRegExp* re ) const 319bool Addressee::matchPhoneNumber( QRegExp* re ) const
320{ 320{
321 KABC::PhoneNumber::List::Iterator phoneIter; 321 KABC::PhoneNumber::List::Iterator phoneIter;
322 322
323 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); ++phoneIter ) { 323 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); ++phoneIter ) {
324#if QT_VERSION >= 0x030000 324#if QT_VERSION >= 0x030000
325 if (re->search( (*phoneIter).number() ) == 0) 325 if (re->search( (*phoneIter).number() ) == 0)
326#else 326#else
327 if (re->match( (*phoneIter).number() ) == 0) 327 if (re->match( (*phoneIter).number() ) == 0)
328#endif 328#endif
329 return true; 329 return true;
330 330
331 } 331 }
332 return false; 332 return false;
333 333
334} 334}
335void Addressee::mergeContact( const Addressee& ad , bool isSubSet) // = false) 335void Addressee::mergeContact( const Addressee& ad , bool isSubSet) // = false)
336{ 336{
337 // merge all standard non-outlook fields. 337 // merge all standard non-outlook fields.
338 //if isSubSet (e.g. mobile phone sync) merge all fields 338 //if isSubSet (e.g. mobile phone sync) merge all fields
339 339
340 detach(); 340 detach();
341 if ( isSubSet ) { 341 if ( isSubSet ) {
342 if ( mData->name.isEmpty() ) mData->name = ad.mData->name; 342 if ( mData->name.isEmpty() ) mData->name = ad.mData->name;
343 if ( mData->formattedName.isEmpty() ) mData->formattedName = ad.mData->formattedName; 343 if ( mData->formattedName.isEmpty() ) mData->formattedName = ad.mData->formattedName;
344 if ( mData->familyName.isEmpty() ) mData->familyName = ad.mData->familyName; 344 if ( mData->familyName.isEmpty() ) mData->familyName = ad.mData->familyName;
345 if ( mData->givenName.isEmpty() ) mData->givenName = ad.mData->givenName ; 345 if ( mData->givenName.isEmpty() ) mData->givenName = ad.mData->givenName ;
346 if ( mData->additionalName ) mData->additionalName = ad.mData->additionalName; 346 if ( mData->additionalName ) mData->additionalName = ad.mData->additionalName;
347 if ( mData->prefix.isEmpty() ) mData->prefix = ad.mData->prefix; 347 if ( mData->prefix.isEmpty() ) mData->prefix = ad.mData->prefix;
348 if ( mData->suffix.isEmpty() ) mData->suffix = ad.mData->suffix; 348 if ( mData->suffix.isEmpty() ) mData->suffix = ad.mData->suffix;
349 if ( mData->title .isEmpty() ) mData->title = ad.mData->title ; 349 if ( mData->title .isEmpty() ) mData->title = ad.mData->title ;
350 if ( mData->role.isEmpty() ) mData->role = ad.mData->role ; 350 if ( mData->role.isEmpty() ) mData->role = ad.mData->role ;
351 if ( mData->nickName.isEmpty() ) mData->nickName = ad.mData->nickName; 351 if ( mData->nickName.isEmpty() ) mData->nickName = ad.mData->nickName;
352 if ( mData->organization.isEmpty() ) mData->organization = ad.mData->organization ; 352 if ( mData->organization.isEmpty() ) mData->organization = ad.mData->organization ;
353 if ( mData->note.isEmpty() ) mData->note = ad.mData->note ; 353 if ( mData->note.isEmpty() ) mData->note = ad.mData->note ;
354 if ( !mData->secrecy.isValid() ) mData->secrecy = ad.mData->secrecy; 354 if ( !mData->secrecy.isValid() ) mData->secrecy = ad.mData->secrecy;
355 if ( ( !mData->url.isValid() && ad.mData->url.isValid() ) ) mData->url = ad.mData->url ; 355 if ( ( !mData->url.isValid() && ad.mData->url.isValid() ) ) mData->url = ad.mData->url ;
356 if ( !mData->birthday.isValid() ) 356 if ( !mData->birthday.isValid() )
357 if ( ad.mData->birthday.isValid()) 357 if ( ad.mData->birthday.isValid())
358 mData->birthday = ad.mData->birthday; 358 mData->birthday = ad.mData->birthday;
359 359
360 } 360 }
361 if ( mData->mailer.isEmpty() ) mData->mailer = ad.mData->mailer; 361 if ( mData->mailer.isEmpty() ) mData->mailer = ad.mData->mailer;
362 if ( !mData->timeZone.isValid() ) mData->timeZone = ad.mData->timeZone; 362 if ( !mData->timeZone.isValid() ) mData->timeZone = ad.mData->timeZone;
363 if ( !mData->geo.isValid() ) mData->geo = ad.mData->geo; 363 if ( !mData->geo.isValid() ) mData->geo = ad.mData->geo;
364 if ( mData->productId.isEmpty() ) mData->productId = ad.mData->productId; 364 if ( mData->productId.isEmpty() ) mData->productId = ad.mData->productId;
365 if ( mData->sortString.isEmpty() ) mData->sortString = ad.mData->sortString; 365 if ( mData->sortString.isEmpty() ) mData->sortString = ad.mData->sortString;
366 QStringList t; 366 QStringList t;
367 QStringList tAD; 367 QStringList tAD;
368 uint iii; 368 uint iii;
369 369
370 // ********** phone numbers 370 // ********** phone numbers
371 if ( isSubSet ) { 371 if ( isSubSet ) {
372 PhoneNumber::List phoneAD = ad.phoneNumbers(); 372 PhoneNumber::List phoneAD = ad.phoneNumbers();
373 PhoneNumber::List::Iterator phoneItAD; 373 PhoneNumber::List::Iterator phoneItAD;
374 for ( phoneItAD = phoneAD.begin(); phoneItAD != phoneAD.end(); ++phoneItAD ) { 374 for ( phoneItAD = phoneAD.begin(); phoneItAD != phoneAD.end(); ++phoneItAD ) {
375 bool found = false; 375 bool found = false;
376 PhoneNumber::List::Iterator it; 376 PhoneNumber::List::Iterator it;
377 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 377 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
378 if ( ( *phoneItAD ).contains( (*it) ) ) { 378 if ( ( *phoneItAD ).contains( (*it) ) ) {
379 found = true; 379 found = true;
380 (*it).setType( ( *phoneItAD ).type() ); 380 (*it).setType( ( *phoneItAD ).type() );
381 (*it).setNumber( ( *phoneItAD ).number() ); 381 (*it).setNumber( ( *phoneItAD ).number() );
382 break; 382 break;
383 } 383 }
384 } 384 }
385 // if ( isSubSet && ! found ) 385 // if ( isSubSet && ! found )
386 if ( ! found ) // LR try this one... 386 if ( ! found ) // LR try this one...
387 mData->phoneNumbers.append( *phoneItAD ); 387 mData->phoneNumbers.append( *phoneItAD );
388 } 388 }
389 } else { 389 } else {
390 PhoneNumber::List phoneAD = ad.phoneNumbers(); 390 PhoneNumber::List phoneAD = ad.phoneNumbers();
391 PhoneNumber::List::Iterator phoneItAD; 391 PhoneNumber::List::Iterator phoneItAD;
392 for ( phoneItAD = phoneAD.begin(); phoneItAD != phoneAD.end(); ++phoneItAD ) { 392 for ( phoneItAD = phoneAD.begin(); phoneItAD != phoneAD.end(); ++phoneItAD ) {
393 bool found = false; 393 bool found = false;
394 PhoneNumber::List::Iterator it; 394 PhoneNumber::List::Iterator it;
395 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 395 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
396 if ( ( *phoneItAD ).contains( (*it) ) ) { 396 if ( ( *phoneItAD ).contains( (*it) ) ) {
397 found = true; 397 found = true;
398 (*it).setType( ( *phoneItAD ).type() ); 398 (*it).setType( ( *phoneItAD ).type() );
399 (*it).setNumber( ( *phoneItAD ).number() ); 399 (*it).setNumber( ( *phoneItAD ).number() );
400 break; 400 break;
401 } 401 }
402 } 402 }
403 if ( ! found ) { // append numbers which do not have work or home type 403 if ( ! found ) { // append numbers which do not have work or home type
404 if ( ! ( ( *phoneItAD ).type() & (PhoneNumber::Work | PhoneNumber::Home) ) ) 404 if ( ! ( ( *phoneItAD ).type() & (PhoneNumber::Work | PhoneNumber::Home) ) )
405 mData->phoneNumbers.append( *phoneItAD ); 405 mData->phoneNumbers.append( *phoneItAD );
406 } 406 }
407 } 407 }
408 } 408 }
409 if ( isSubSet ) { 409 if ( isSubSet ) {
410 // ************* emails; 410 // ************* emails;
411 t = mData->emails; 411 t = mData->emails;
412 tAD = ad.mData->emails; 412 tAD = ad.mData->emails;
413 for ( iii = 0; iii < tAD.count(); ++iii) 413 for ( iii = 0; iii < tAD.count(); ++iii)
414 if ( !t.contains(tAD[iii] ) ) 414 if ( !t.contains(tAD[iii] ) )
415 mData->emails.append( tAD[iii] ); 415 mData->emails.append( tAD[iii] );
416 } 416 }
417 417
418 // ************* categories; 418 // ************* categories;
419 if ( isSubSet ) { 419 if ( isSubSet ) {
420 t = mData->categories; 420 t = mData->categories;
421 tAD = ad.mData->categories; 421 tAD = ad.mData->categories;
422 for ( iii = 0; iii < tAD.count(); ++iii) 422 for ( iii = 0; iii < tAD.count(); ++iii)
423 if ( !t.contains(tAD[iii] ) ) 423 if ( !t.contains(tAD[iii] ) )
424 mData->categories.append( tAD[iii] ); 424 mData->categories.append( tAD[iii] );
425 } 425 }
426 QStringList::ConstIterator it; 426 QStringList::ConstIterator it;
427 for( it = ad.mData->custom.begin(); it != ad.mData->custom.end(); ++it ) { 427 for( it = ad.mData->custom.begin(); it != ad.mData->custom.end(); ++it ) {
428 QString qualifiedName = (*it).left( (*it).find( ":" )); 428 QString qualifiedName = (*it).left( (*it).find( ":" ));
429 bool found = false; 429 bool found = false;
430 QStringList::ConstIterator itL; 430 QStringList::ConstIterator itL;
431 for( itL = mData->custom.begin(); itL != mData->custom.end(); ++itL ) { 431 for( itL = mData->custom.begin(); itL != mData->custom.end(); ++itL ) {
432 if ( (*itL).startsWith( qualifiedName ) ) { 432 if ( (*itL).startsWith( qualifiedName ) ) {
433 found = true; 433 found = true;
434 break; 434 break;
435 } 435 }
436 } 436 }
437 if ( ! found ) { 437 if ( ! found ) {
438 mData->custom.append( *it ); 438 mData->custom.append( *it );
439 } 439 }
440 } 440 }
441 if ( mData->logo.undefined() && !ad.mData->logo.undefined() ) mData->logo = ad.mData->logo; 441 if ( mData->logo.undefined() && !ad.mData->logo.undefined() ) mData->logo = ad.mData->logo;
442 if ( mData->photo.undefined() && !ad.mData->photo.undefined() ) mData->photo = ad.mData->photo; 442 if ( mData->photo.undefined() && !ad.mData->photo.undefined() ) mData->photo = ad.mData->photo;
443 if ( !mData->sound.isIntern() ) { 443 if ( !mData->sound.isIntern() ) {
444 if ( mData->sound.url().isEmpty() ) { 444 if ( mData->sound.url().isEmpty() ) {
445 mData->sound = ad.mData->sound; 445 mData->sound = ad.mData->sound;
446 } 446 }
447 } 447 }
448 if ( !mData->agent.isIntern() ) { 448 if ( !mData->agent.isIntern() ) {
449 if ( mData->agent.url().isEmpty() ) { 449 if ( mData->agent.url().isEmpty() ) {
450 mData->agent = ad.mData->agent; 450 mData->agent = ad.mData->agent;
451 } 451 }
452 } 452 }
453 { 453 {
454 Key::List::Iterator itA; 454 Key::List::Iterator itA;
455 for( itA = ad.mData->keys.begin(); itA != ad.mData->keys.end(); ++itA ) { 455 for( itA = ad.mData->keys.begin(); itA != ad.mData->keys.end(); ++itA ) {
456 bool found = false; 456 bool found = false;
457 Key::List::Iterator it; 457 Key::List::Iterator it;
458 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 458 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
459 if ( (*it) == (*itA)) { 459 if ( (*it) == (*itA)) {
460 found = true; 460 found = true;
461 break; 461 break;
462 462
463 } 463 }
464 } 464 }
465 if ( ! found ) { 465 if ( ! found ) {
466 mData->keys.append( *itA ); 466 mData->keys.append( *itA );
467 } 467 }
468 } 468 }
469 } 469 }
470 if ( isSubSet ) { 470 if ( isSubSet ) {
471 KABC::Address::List::Iterator addressIterA; 471 KABC::Address::List::Iterator addressIterA;
472 for ( addressIterA = ad.mData->addresses.begin(); addressIterA != ad.mData->addresses.end(); ++addressIterA ) { 472 for ( addressIterA = ad.mData->addresses.begin(); addressIterA != ad.mData->addresses.end(); ++addressIterA ) {
473 bool found = false; 473 bool found = false;
474 KABC::Address::List::Iterator addressIter; 474 KABC::Address::List::Iterator addressIter;
475 for ( addressIter = mData->addresses.begin(); addressIter != mData->addresses.end(); 475 for ( addressIter = mData->addresses.begin(); addressIter != mData->addresses.end();
476 ++addressIter ) { 476 ++addressIter ) {
477 if ( (*addressIter) == (*addressIterA)) { 477 if ( (*addressIter) == (*addressIterA)) {
478 found = true; 478 found = true;
479 (*addressIter).setType( (*addressIterA).type() ); 479 (*addressIter).setType( (*addressIterA).type() );
480 break; 480 break;
481 } 481 }
482 482
483 } 483 }
484 if ( isSubSet && ! found ) { 484 if ( isSubSet && ! found ) {
485 mData->addresses.append( *addressIterA ); 485 mData->addresses.append( *addressIterA );
486 } 486 }
487 } 487 }
488 } 488 }
489 //qDebug("merge contact %s ", ad.uid().latin1()); 489 //qDebug("merge contact %s ", ad.uid().latin1());
490 setUid( ad.uid() ); 490 setUid( ad.uid() );
491 setRevision( ad.revision() ); 491 setRevision( ad.revision() );
492} 492}
493 493
494bool Addressee::removeVoice() 494bool Addressee::removeVoice()
495{ 495{
496 PhoneNumber::List phoneN = phoneNumbers(); 496 PhoneNumber::List phoneN = phoneNumbers();
497 PhoneNumber::List::Iterator phoneIt; 497 PhoneNumber::List::Iterator phoneIt;
498 bool found = false; 498 bool found = false;
499 for ( phoneIt = phoneN.begin(); phoneIt != phoneN.end(); ++phoneIt ) { 499 for ( phoneIt = phoneN.begin(); phoneIt != phoneN.end(); ++phoneIt ) {
500 if ( (*phoneIt).type() & PhoneNumber::Voice) { // voice found 500 if ( (*phoneIt).type() & PhoneNumber::Voice) { // voice found
501 if ((*phoneIt).type() - PhoneNumber::Voice ) { 501 if ((*phoneIt).type() - PhoneNumber::Voice ) {
502 (*phoneIt).setType((*phoneIt).type() - PhoneNumber::Voice ); 502 (*phoneIt).setType((*phoneIt).type() - PhoneNumber::Voice );
503 insertPhoneNumber( (*phoneIt) ); 503 insertPhoneNumber( (*phoneIt) );
504 found = true; 504 found = true;
505 } 505 }
506 } 506 }
507 507
508 } 508 }
509 return found; 509 return found;
510} 510}
511 511
512bool Addressee::containsAdr(const Addressee& ad ) 512bool Addressee::containsAdr(const Addressee& ad )
513{ 513{
514 if ( ! ad.mData->familyName.isEmpty() ) if ( mData->familyName != ad.mData->familyName) return false; 514 if ( ! ad.mData->familyName.isEmpty() ) if ( mData->familyName != ad.mData->familyName) return false;
515 if ( ! ad.mData->givenName.isEmpty() )if ( mData->givenName != ad.mData->givenName ) return false; 515 if ( ! ad.mData->givenName.isEmpty() )if ( mData->givenName != ad.mData->givenName ) return false;
516 if ( ad.mData->url.isValid() ) if (mData->url != ad.mData->url) return false ; 516 if ( ad.mData->url.isValid() ) if (mData->url != ad.mData->url) return false ;
517 if ( ! ad.mData->role.isEmpty() ) if (mData->role != ad.mData->role) return false ; 517 if ( ! ad.mData->role.isEmpty() ) if (mData->role != ad.mData->role) return false ;
518 if ( ! ad.mData->organization.isEmpty() ) if (mData->organization != ad.mData->organization) return false ; 518 if ( ! ad.mData->organization.isEmpty() ) if (mData->organization != ad.mData->organization) return false ;
519 if ( ! ad.mData->note.isEmpty() ) if (mData->note != ad.mData->note) return false ; 519 if ( ! ad.mData->note.isEmpty() ) if (mData->note != ad.mData->note) return false ;
520 if ( ! ad.mData->title .isEmpty() ) if (mData->title != ad.mData->title ) return false ; 520 if ( ! ad.mData->title .isEmpty() ) if (mData->title != ad.mData->title ) return false ;
521 521
522 // compare phone numbers 522 // compare phone numbers
523 PhoneNumber::List phoneN = ad.phoneNumbers(); 523 PhoneNumber::List phoneN = ad.phoneNumbers();
524 PhoneNumber::List::Iterator phoneIt; 524 PhoneNumber::List::Iterator phoneIt;
525 bool found = false; 525 bool found = false;
526 for ( phoneIt = phoneN.begin(); phoneIt != phoneN.end(); ++phoneIt ) { 526 for ( phoneIt = phoneN.begin(); phoneIt != phoneN.end(); ++phoneIt ) {
527 bool found = false; 527 bool found = false;
528 PhoneNumber::List phoneL = ad.phoneNumbers(); 528 PhoneNumber::List phoneL = ad.phoneNumbers();
529 PhoneNumber::List::Iterator phoneItL; 529 PhoneNumber::List::Iterator phoneItL;
530 for ( phoneItL = phoneL.begin(); phoneItL != phoneL.end(); ++phoneItL ) { 530 for ( phoneItL = phoneL.begin(); phoneItL != phoneL.end(); ++phoneItL ) {
531 if ( ( *phoneItL ).number() == ( *phoneIt ).number() ) { 531 if ( ( *phoneItL ).number() == ( *phoneIt ).number() ) {
532 found = true; 532 found = true;
533 break; 533 break;
534 } 534 }
535 } 535 }
536 if ( ! found ) 536 if ( ! found )
537 return false; 537 return false;
538 } 538 }
539 return true; 539 return true;
540 540
541} 541}
542void Addressee::simplifyAddresses() 542void Addressee::simplifyAddresses()
543{ 543{
544 544
545 545
546 Address::List list; 546 Address::List list;
547 Address::List::Iterator it; 547 Address::List::Iterator it;
548 Address::List::Iterator it2; 548 Address::List::Iterator it2;
549 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 549 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
550 it2 = it; 550 it2 = it;
551 ++it2; 551 ++it2;
552 for( ; it2 != mData->addresses.end(); ++it2 ) { 552 for( ; it2 != mData->addresses.end(); ++it2 ) {
553 if ( (*it) == (*it2) ) { 553 if ( (*it) == (*it2) ) {
554 list.append( *it ); 554 list.append( *it );
555 break; 555 break;
556 } 556 }
557 } 557 }
558 } 558 }
559 for( it = list.begin(); it != list.end(); ++it ) { 559 for( it = list.begin(); it != list.end(); ++it ) {
560 removeAddress( (*it) ); 560 removeAddress( (*it) );
561 } 561 }
562 562
563 list.clear(); 563 list.clear();
564 int max = 2; 564 int max = 2;
565 if ( mData->url.isValid() ) 565 if ( mData->url.isValid() )
566 max = 1; 566 max = 1;
567 if ( mData->addresses.count() <= max ) return ; 567 if ( mData->addresses.count() <= max ) return ;
568 int count = 0; 568 int count = 0;
569 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 569 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
570 if ( count >= max ) 570 if ( count >= max )
571 list.append( *it ); 571 list.append( *it );
572 ++count; 572 ++count;
573 } 573 }
574 for( it = list.begin(); it != list.end(); ++it ) { 574 for( it = list.begin(); it != list.end(); ++it ) {
575 removeAddress( (*it) ); 575 removeAddress( (*it) );
576 } 576 }
577} 577}
578 578
579// removes all emails but the first 579// removes all emails but the first
580// needed by phone sync 580// needed by phone sync
581void Addressee::simplifyEmails() 581void Addressee::simplifyEmails()
582{ 582{
583 if ( mData->emails.count() == 0 ) return ; 583 if ( mData->emails.count() == 0 ) return ;
584 QString email = mData->emails.first(); 584 QString email = mData->emails.first();
585 detach(); 585 detach();
586 mData->emails.clear(); 586 mData->emails.clear();
587 mData->emails.append( email ); 587 mData->emails.append( email );
588} 588}
589void Addressee::makePhoneNumbersOLcompatible()
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
686{ 738{
687 return KIdManager::getCsum ( mData->mExternalId, prof ); 739 return KIdManager::getCsum ( mData->mExternalId, prof );
688} 740}
689 741
690void Addressee::setIDStr( const QString & s ) 742void Addressee::setIDStr( const QString & s )
691{ 743{
692 detach(); 744 detach();
693 mData->mExternalId = s; 745 mData->mExternalId = s;
694} 746}
695 747
696const QString Addressee::IDStr() const 748const QString Addressee::IDStr() const
697{ 749{
698 return mData->mExternalId; 750 return mData->mExternalId;
699} 751}
700 752
701void Addressee::setExternalUID( const QString &id ) 753void Addressee::setExternalUID( const QString &id )
702{ 754{
703 if ( id == mData->externalUID ) return; 755 if ( id == mData->externalUID ) return;
704 detach(); 756 detach();
705 mData->empty = false; 757 mData->empty = false;
706 mData->externalUID = id; 758 mData->externalUID = id;
707} 759}
708 760
709const QString Addressee::externalUID() const 761const QString Addressee::externalUID() const
710{ 762{
711 return mData->externalUID; 763 return mData->externalUID;
712} 764}
713void Addressee::setOriginalExternalUID( const QString &id ) 765void Addressee::setOriginalExternalUID( const QString &id )
714{ 766{
715 if ( id == mData->originalExternalUID ) return; 767 if ( id == mData->originalExternalUID ) return;
716 detach(); 768 detach();
717 mData->empty = false; 769 mData->empty = false;
718 //qDebug("*******Set orig uid %s ", id.latin1()); 770 //qDebug("*******Set orig uid %s ", id.latin1());
719 mData->originalExternalUID = id; 771 mData->originalExternalUID = id;
720} 772}
721 773
722QString Addressee::originalExternalUID() const 774QString Addressee::originalExternalUID() const
723{ 775{
724 return mData->originalExternalUID; 776 return mData->originalExternalUID;
725} 777}
726 778
727void Addressee::setUid( const QString &id ) 779void Addressee::setUid( const QString &id )
728{ 780{
729 if ( id == mData->uid ) return; 781 if ( id == mData->uid ) return;
730 detach(); 782 detach();
731 //qDebug("****setuid %s ", id.latin1()); 783 //qDebug("****setuid %s ", id.latin1());
732 mData->empty = false; 784 mData->empty = false;
733 mData->uid = id; 785 mData->uid = id;
734} 786}
735 787
736const QString Addressee::uid() const 788const QString Addressee::uid() const
737{ 789{
738 if ( mData->uid.isEmpty() ) 790 if ( mData->uid.isEmpty() )
739 mData->uid = KApplication::randomString( 10 ); 791 mData->uid = KApplication::randomString( 10 );
740 792
741 return mData->uid; 793 return mData->uid;
742} 794}
743 795
744QString Addressee::uidLabel() 796QString Addressee::uidLabel()
745{ 797{
746 return i18n("Unique Identifier"); 798 return i18n("Unique Identifier");
747} 799}
748 800
749void Addressee::setName( const QString &name ) 801void Addressee::setName( const QString &name )
750{ 802{
751 if ( name == mData->name ) return; 803 if ( name == mData->name ) return;
752 detach(); 804 detach();
753 mData->empty = false; 805 mData->empty = false;
754 mData->name = name; 806 mData->name = name;
755} 807}
756 808
757QString Addressee::name() const 809QString Addressee::name() const
758{ 810{
759 return mData->name; 811 return mData->name;
760} 812}
761 813
762QString Addressee::nameLabel() 814QString Addressee::nameLabel()
763{ 815{
764 return i18n("Name"); 816 return i18n("Name");
765} 817}
766 818
767 819
768void Addressee::setFormattedName( const QString &formattedName ) 820void Addressee::setFormattedName( const QString &formattedName )
769{ 821{
770 if ( formattedName == mData->formattedName ) return; 822 if ( formattedName == mData->formattedName ) return;
771 detach(); 823 detach();
772 mData->empty = false; 824 mData->empty = false;
773 mData->formattedName = formattedName; 825 mData->formattedName = formattedName;
774} 826}
775 827
776QString Addressee::formattedName() const 828QString Addressee::formattedName() const
777{ 829{
778 return mData->formattedName; 830 return mData->formattedName;
779} 831}
780 832
781QString Addressee::formattedNameLabel() 833QString Addressee::formattedNameLabel()
782{ 834{
783 return i18n("Formatted Name"); 835 return i18n("Formatted Name");
784} 836}
785 837
786 838
787void Addressee::setFamilyName( const QString &familyName ) 839void Addressee::setFamilyName( const QString &familyName )
788{ 840{
789 if ( familyName == mData->familyName ) return; 841 if ( familyName == mData->familyName ) return;
790 detach(); 842 detach();
791 mData->empty = false; 843 mData->empty = false;
792 mData->familyName = familyName; 844 mData->familyName = familyName;
793} 845}
794 846
795QString Addressee::familyName() const 847QString Addressee::familyName() const
796{ 848{
797 return mData->familyName; 849 return mData->familyName;
798} 850}
799 851
800QString Addressee::familyNameLabel() 852QString Addressee::familyNameLabel()
801{ 853{
802 return i18n("Family Name"); 854 return i18n("Family Name");
803} 855}
804 856
805 857
806void Addressee::setGivenName( const QString &givenName ) 858void Addressee::setGivenName( const QString &givenName )
807{ 859{
808 if ( givenName == mData->givenName ) return; 860 if ( givenName == mData->givenName ) return;
809 detach(); 861 detach();
810 mData->empty = false; 862 mData->empty = false;
811 mData->givenName = givenName; 863 mData->givenName = givenName;
812} 864}
813 865
814QString Addressee::givenName() const 866QString Addressee::givenName() const
815{ 867{
816 return mData->givenName; 868 return mData->givenName;
817} 869}
818 870
819QString Addressee::givenNameLabel() 871QString Addressee::givenNameLabel()
820{ 872{
821 return i18n("Given Name"); 873 return i18n("Given Name");
822} 874}
823 875
824 876
825void Addressee::setAdditionalName( const QString &additionalName ) 877void Addressee::setAdditionalName( const QString &additionalName )
826{ 878{
827 if ( additionalName == mData->additionalName ) return; 879 if ( additionalName == mData->additionalName ) return;
828 detach(); 880 detach();
829 mData->empty = false; 881 mData->empty = false;
830 mData->additionalName = additionalName; 882 mData->additionalName = additionalName;
831} 883}
832 884
833QString Addressee::additionalName() const 885QString Addressee::additionalName() const
834{ 886{
835 return mData->additionalName; 887 return mData->additionalName;
836} 888}
837 889
838QString Addressee::additionalNameLabel() 890QString Addressee::additionalNameLabel()
839{ 891{
840 return i18n("Additional Names"); 892 return i18n("Additional Names");
841} 893}
842 894
843 895
844void Addressee::setPrefix( const QString &prefix ) 896void Addressee::setPrefix( const QString &prefix )
845{ 897{
846 if ( prefix == mData->prefix ) return; 898 if ( prefix == mData->prefix ) return;
847 detach(); 899 detach();
848 mData->empty = false; 900 mData->empty = false;
849 mData->prefix = prefix; 901 mData->prefix = prefix;
850} 902}
851 903
852QString Addressee::prefix() const 904QString Addressee::prefix() const
853{ 905{
854 return mData->prefix; 906 return mData->prefix;
855} 907}
856 908
857QString Addressee::prefixLabel() 909QString Addressee::prefixLabel()
858{ 910{
859 return i18n("Honorific Prefixes"); 911 return i18n("Honorific Prefixes");
860} 912}
861 913
862 914
863void Addressee::setSuffix( const QString &suffix ) 915void Addressee::setSuffix( const QString &suffix )
864{ 916{
865 if ( suffix == mData->suffix ) return; 917 if ( suffix == mData->suffix ) return;
866 detach(); 918 detach();
867 mData->empty = false; 919 mData->empty = false;
868 mData->suffix = suffix; 920 mData->suffix = suffix;
869} 921}
870 922
871QString Addressee::suffix() const 923QString Addressee::suffix() const
872{ 924{
873 return mData->suffix; 925 return mData->suffix;
874} 926}
875 927
876QString Addressee::suffixLabel() 928QString Addressee::suffixLabel()
877{ 929{
878 return i18n("Honorific Suffixes"); 930 return i18n("Honorific Suffixes");
879} 931}
880 932
881 933
882void Addressee::setNickName( const QString &nickName ) 934void Addressee::setNickName( const QString &nickName )
883{ 935{
884 if ( nickName == mData->nickName ) return; 936 if ( nickName == mData->nickName ) return;
885 detach(); 937 detach();
886 mData->empty = false; 938 mData->empty = false;
887 mData->nickName = nickName; 939 mData->nickName = nickName;
888} 940}
889 941
890QString Addressee::nickName() const 942QString Addressee::nickName() const
891{ 943{
892 return mData->nickName; 944 return mData->nickName;
893} 945}
894 946
895QString Addressee::nickNameLabel() 947QString Addressee::nickNameLabel()
896{ 948{
897 return i18n("Nick Name"); 949 return i18n("Nick Name");
898} 950}
899 951
900 952
901void Addressee::setBirthday( const QDateTime &birthday ) 953void Addressee::setBirthday( const QDateTime &birthday )
902{ 954{
903 if ( birthday == mData->birthday ) return; 955 if ( birthday == mData->birthday ) return;
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()
1129{ 1181{
1130 return i18n("Title"); 1182 return i18n("Title");
1131} 1183}
1132 1184
1133 1185
1134void Addressee::setRole( const QString &role ) 1186void Addressee::setRole( const QString &role )
1135{ 1187{
1136 if ( role == mData->role ) return; 1188 if ( role == mData->role ) return;
1137 detach(); 1189 detach();
1138 mData->empty = false; 1190 mData->empty = false;
1139 mData->role = role; 1191 mData->role = role;
1140} 1192}
1141 1193
1142QString Addressee::role() const 1194QString Addressee::role() const
1143{ 1195{
1144 return mData->role; 1196 return mData->role;
1145} 1197}
1146 1198
1147QString Addressee::roleLabel() 1199QString Addressee::roleLabel()
1148{ 1200{
1149 return i18n("Role"); 1201 return i18n("Role");
1150} 1202}
1151 1203
1152 1204
1153void Addressee::setOrganization( const QString &organization ) 1205void Addressee::setOrganization( const QString &organization )
1154{ 1206{
1155 if ( organization == mData->organization ) return; 1207 if ( organization == mData->organization ) return;
1156 detach(); 1208 detach();
1157 mData->empty = false; 1209 mData->empty = false;
1158 mData->organization = organization; 1210 mData->organization = organization;
1159} 1211}
1160 1212
1161QString Addressee::organization() const 1213QString Addressee::organization() const
1162{ 1214{
1163 return mData->organization; 1215 return mData->organization;
1164} 1216}
1165 1217
1166QString Addressee::organizationLabel() 1218QString Addressee::organizationLabel()
1167{ 1219{
1168 return i18n("Organization"); 1220 return i18n("Organization");
1169} 1221}
1170 1222
1171 1223
1172void Addressee::setNote( const QString &note ) 1224void Addressee::setNote( const QString &note )
1173{ 1225{
1174 if ( note == mData->note ) return; 1226 if ( note == mData->note ) return;
1175 detach(); 1227 detach();
1176 mData->empty = false; 1228 mData->empty = false;
1177 mData->note = note; 1229 mData->note = note;
1178} 1230}
1179 1231
1180QString Addressee::note() const 1232QString Addressee::note() const
1181{ 1233{
1182 return mData->note; 1234 return mData->note;
1183} 1235}
1184 1236
1185QString Addressee::noteLabel() 1237QString Addressee::noteLabel()
1186{ 1238{
1187 return i18n("Note"); 1239 return i18n("Note");
1188} 1240}
1189 1241
1190 1242
1191void Addressee::setProductId( const QString &productId ) 1243void Addressee::setProductId( const QString &productId )
1192{ 1244{
1193 if ( productId == mData->productId ) return; 1245 if ( productId == mData->productId ) return;
1194 detach(); 1246 detach();
1195 mData->empty = false; 1247 mData->empty = false;
1196 mData->productId = productId; 1248 mData->productId = productId;
1197} 1249}
1198 1250
1199QString Addressee::productId() const 1251QString Addressee::productId() const
1200{ 1252{
1201 return mData->productId; 1253 return mData->productId;
1202} 1254}
1203 1255
1204QString Addressee::productIdLabel() 1256QString Addressee::productIdLabel()
1205{ 1257{
1206 return i18n("Product Identifier"); 1258 return i18n("Product Identifier");
1207} 1259}
1208 1260
1209 1261
1210void Addressee::setRevision( const QDateTime &revision ) 1262void Addressee::setRevision( const QDateTime &revision )
1211{ 1263{
1212 if ( revision == mData->revision ) return; 1264 if ( revision == mData->revision ) return;
1213 detach(); 1265 detach();
1214 mData->empty = false; 1266 mData->empty = false;
1215 mData->revision = QDateTime( revision.date(), 1267 mData->revision = QDateTime( revision.date(),
1216 QTime (revision.time().hour(), 1268 QTime (revision.time().hour(),
1217 revision.time().minute(), 1269 revision.time().minute(),
1218 revision.time().second())); 1270 revision.time().second()));
1219} 1271}
1220 1272
1221QDateTime Addressee::revision() const 1273QDateTime Addressee::revision() const
1222{ 1274{
1223 return mData->revision; 1275 return mData->revision;
1224} 1276}
1225 1277
1226QString Addressee::revisionLabel() 1278QString Addressee::revisionLabel()
1227{ 1279{
1228 return i18n("Revision Date"); 1280 return i18n("Revision Date");
1229} 1281}
1230 1282
1231 1283
1232void Addressee::setSortString( const QString &sortString ) 1284void Addressee::setSortString( const QString &sortString )
1233{ 1285{
1234 if ( sortString == mData->sortString ) return; 1286 if ( sortString == mData->sortString ) return;
1235 detach(); 1287 detach();
1236 mData->empty = false; 1288 mData->empty = false;
1237 mData->sortString = sortString; 1289 mData->sortString = sortString;
1238} 1290}
1239 1291
1240QString Addressee::sortString() const 1292QString Addressee::sortString() const
1241{ 1293{
1242 return mData->sortString; 1294 return mData->sortString;
1243} 1295}
1244 1296
1245QString Addressee::sortStringLabel() 1297QString Addressee::sortStringLabel()
1246{ 1298{
1247 return i18n("Sort String"); 1299 return i18n("Sort String");
1248} 1300}
1249 1301
1250 1302
1251void Addressee::setUrl( const KURL &url ) 1303void Addressee::setUrl( const KURL &url )
1252{ 1304{
1253 if ( url == mData->url ) return; 1305 if ( url == mData->url ) return;
1254 detach(); 1306 detach();
1255 mData->empty = false; 1307 mData->empty = false;
1256 mData->url = url; 1308 mData->url = url;
1257} 1309}
1258 1310
1259KURL Addressee::url() const 1311KURL Addressee::url() const
1260{ 1312{
1261 return mData->url; 1313 return mData->url;
1262} 1314}
1263 1315
1264QString Addressee::urlLabel() 1316QString Addressee::urlLabel()
1265{ 1317{
1266 return i18n("URL"); 1318 return i18n("URL");
1267} 1319}
1268 1320
1269 1321
1270void Addressee::setSecrecy( const Secrecy &secrecy ) 1322void Addressee::setSecrecy( const Secrecy &secrecy )
1271{ 1323{
1272 if ( secrecy == mData->secrecy ) return; 1324 if ( secrecy == mData->secrecy ) return;
1273 detach(); 1325 detach();
1274 mData->empty = false; 1326 mData->empty = false;
1275 mData->secrecy = secrecy; 1327 mData->secrecy = secrecy;
1276} 1328}
1277 1329
1278Secrecy Addressee::secrecy() const 1330Secrecy Addressee::secrecy() const
1279{ 1331{
1280 return mData->secrecy; 1332 return mData->secrecy;
1281} 1333}
1282 1334
1283QString Addressee::secrecyLabel() 1335QString Addressee::secrecyLabel()
1284{ 1336{
1285 return i18n("Security Class"); 1337 return i18n("Security Class");
1286} 1338}
1287 1339
1288 1340
1289void Addressee::setLogo( const Picture &logo ) 1341void Addressee::setLogo( const Picture &logo )
1290{ 1342{
1291 if ( logo == mData->logo ) return; 1343 if ( logo == mData->logo ) return;
1292 detach(); 1344 detach();
1293 mData->empty = false; 1345 mData->empty = false;
1294 mData->logo = logo; 1346 mData->logo = logo;
1295} 1347}
1296 1348
1297Picture Addressee::logo() const 1349Picture Addressee::logo() const
1298{ 1350{
1299 return mData->logo; 1351 return mData->logo;
1300} 1352}
1301 1353
1302QString Addressee::logoLabel() 1354QString Addressee::logoLabel()
1303{ 1355{
1304 return i18n("Logo"); 1356 return i18n("Logo");
1305} 1357}
1306 1358
1307 1359
1308void Addressee::setPhoto( const Picture &photo ) 1360void Addressee::setPhoto( const Picture &photo )
1309{ 1361{
1310 if ( photo == mData->photo ) return; 1362 if ( photo == mData->photo ) return;
1311 detach(); 1363 detach();
1312 mData->empty = false; 1364 mData->empty = false;
1313 mData->photo = photo; 1365 mData->photo = photo;
1314} 1366}
1315 1367
1316Picture Addressee::photo() const 1368Picture Addressee::photo() const
1317{ 1369{
1318 return mData->photo; 1370 return mData->photo;
1319} 1371}
1320 1372
1321QString Addressee::photoLabel() 1373QString Addressee::photoLabel()
1322{ 1374{
1323 return i18n("Photo"); 1375 return i18n("Photo");
1324} 1376}
1325 1377
1326 1378
1327void Addressee::setSound( const Sound &sound ) 1379void Addressee::setSound( const Sound &sound )
1328{ 1380{
1329 if ( sound == mData->sound ) return; 1381 if ( sound == mData->sound ) return;
1330 detach(); 1382 detach();
1331 mData->empty = false; 1383 mData->empty = false;
1332 mData->sound = sound; 1384 mData->sound = sound;
1333} 1385}
1334 1386
1335Sound Addressee::sound() const 1387Sound Addressee::sound() const
1336{ 1388{
1337 return mData->sound; 1389 return mData->sound;
1338} 1390}
1339 1391
1340QString Addressee::soundLabel() 1392QString Addressee::soundLabel()
1341{ 1393{
1342 return i18n("Sound"); 1394 return i18n("Sound");
1343} 1395}
1344 1396
1345 1397
1346void Addressee::setAgent( const Agent &agent ) 1398void Addressee::setAgent( const Agent &agent )
1347{ 1399{
1348 if ( agent == mData->agent ) return; 1400 if ( agent == mData->agent ) return;
1349 detach(); 1401 detach();
1350 mData->empty = false; 1402 mData->empty = false;
1351 mData->agent = agent; 1403 mData->agent = agent;
1352} 1404}
1353 1405
1354Agent Addressee::agent() const 1406Agent Addressee::agent() const
1355{ 1407{
1356 return mData->agent; 1408 return mData->agent;
1357} 1409}
1358 1410
1359QString Addressee::agentLabel() 1411QString Addressee::agentLabel()
1360{ 1412{
1361 return i18n("Agent"); 1413 return i18n("Agent");
1362} 1414}
1363 1415
1364 1416
1365 1417
1366void Addressee::setNameFromString( const QString &str ) 1418void Addressee::setNameFromString( const QString &str )
1367{ 1419{
1368 setFormattedName( str ); 1420 setFormattedName( str );
1369 setName( str ); 1421 setName( str );
1370 1422
1371 static bool first = true; 1423 static bool first = true;
1372 static QStringList titles; 1424 static QStringList titles;
1373 static QStringList suffixes; 1425 static QStringList suffixes;
1374 static QStringList prefixes; 1426 static QStringList prefixes;
1375 1427
1376 if ( first ) { 1428 if ( first ) {
1377 first = false; 1429 first = false;
1378 titles += i18n( "Dr." ); 1430 titles += i18n( "Dr." );
1379 titles += i18n( "Miss" ); 1431 titles += i18n( "Miss" );
1380 titles += i18n( "Mr." ); 1432 titles += i18n( "Mr." );
1381 titles += i18n( "Mrs." ); 1433 titles += i18n( "Mrs." );
1382 titles += i18n( "Ms." ); 1434 titles += i18n( "Ms." );
1383 titles += i18n( "Prof." ); 1435 titles += i18n( "Prof." );
1384 1436
1385 suffixes += i18n( "I" ); 1437 suffixes += i18n( "I" );
1386 suffixes += i18n( "II" ); 1438 suffixes += i18n( "II" );
1387 suffixes += i18n( "III" ); 1439 suffixes += i18n( "III" );
1388 suffixes += i18n( "Jr." ); 1440 suffixes += i18n( "Jr." );
1389 suffixes += i18n( "Sr." ); 1441 suffixes += i18n( "Sr." );
1390 1442
1391 prefixes += "van"; 1443 prefixes += "van";
1392 prefixes += "von"; 1444 prefixes += "von";
1393 prefixes += "de"; 1445 prefixes += "de";
1394 1446
1395 KConfig config( locateLocal( "config", "kabcrc") ); 1447 KConfig config( locateLocal( "config", "kabcrc") );
1396 config.setGroup( "General" ); 1448 config.setGroup( "General" );
1397 titles += config.readListEntry( "Prefixes" ); 1449 titles += config.readListEntry( "Prefixes" );
1398 titles.remove( "" ); 1450 titles.remove( "" );
1399 prefixes += config.readListEntry( "Inclusions" ); 1451 prefixes += config.readListEntry( "Inclusions" );
1400 prefixes.remove( "" ); 1452 prefixes.remove( "" );
1401 suffixes += config.readListEntry( "Suffixes" ); 1453 suffixes += config.readListEntry( "Suffixes" );
1402 suffixes.remove( "" ); 1454 suffixes.remove( "" );
1403 } 1455 }
1404 1456
1405 // clear all name parts 1457 // clear all name parts
1406 setPrefix( "" ); 1458 setPrefix( "" );
1407 setGivenName( "" ); 1459 setGivenName( "" );
1408 setAdditionalName( "" ); 1460 setAdditionalName( "" );
1409 setFamilyName( "" ); 1461 setFamilyName( "" );
1410 setSuffix( "" ); 1462 setSuffix( "" );
1411 1463
1412 if ( str.isEmpty() ) 1464 if ( str.isEmpty() )
1413 return; 1465 return;
1414 1466
1415 int i = str.find(','); 1467 int i = str.find(',');
1416 if( i < 0 ) { 1468 if( i < 0 ) {
1417 QStringList parts = QStringList::split( " ", str ); 1469 QStringList parts = QStringList::split( " ", str );
1418 int leftOffset = 0; 1470 int leftOffset = 0;
1419 int rightOffset = parts.count() - 1; 1471 int rightOffset = parts.count() - 1;
1420 1472
1421 QString suffix; 1473 QString suffix;
1422 while ( rightOffset >= 0 ) { 1474 while ( rightOffset >= 0 ) {
1423 if ( suffixes.contains( parts[ rightOffset ] ) ) { 1475 if ( suffixes.contains( parts[ rightOffset ] ) ) {
1424 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " ")); 1476 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " "));
1425 rightOffset--; 1477 rightOffset--;
1426 } else 1478 } else
1427 break; 1479 break;
1428 } 1480 }
1429 setSuffix( suffix ); 1481 setSuffix( suffix );
1430 1482
1431 if ( rightOffset < 0 ) 1483 if ( rightOffset < 0 )
1432 return; 1484 return;
1433 1485
1434 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) { 1486 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) {
1435 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] ); 1487 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] );
1436 rightOffset--; 1488 rightOffset--;
1437 } else 1489 } else
1438 setFamilyName( parts[ rightOffset ] ); 1490 setFamilyName( parts[ rightOffset ] );
1439 1491
1440 QString prefix; 1492 QString prefix;
1441 while ( leftOffset < rightOffset ) { 1493 while ( leftOffset < rightOffset ) {
1442 if ( titles.contains( parts[ leftOffset ] ) ) { 1494 if ( titles.contains( parts[ leftOffset ] ) ) {
1443 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1495 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1444 leftOffset++; 1496 leftOffset++;
1445 } else 1497 } else
1446 break; 1498 break;
1447 } 1499 }
1448 setPrefix( prefix ); 1500 setPrefix( prefix );
1449 1501
1450 if ( leftOffset < rightOffset ) { 1502 if ( leftOffset < rightOffset ) {
1451 setGivenName( parts[ leftOffset ] ); 1503 setGivenName( parts[ leftOffset ] );
1452 leftOffset++; 1504 leftOffset++;
1453 } 1505 }
1454 1506
1455 QString additionalName; 1507 QString additionalName;
1456 while ( leftOffset < rightOffset ) { 1508 while ( leftOffset < rightOffset ) {
1457 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1509 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1458 leftOffset++; 1510 leftOffset++;
1459 } 1511 }
1460 setAdditionalName( additionalName ); 1512 setAdditionalName( additionalName );
1461 } else { 1513 } else {
1462 QString part1 = str.left( i ); 1514 QString part1 = str.left( i );
1463 QString part2 = str.mid( i + 1 ); 1515 QString part2 = str.mid( i + 1 );
1464 1516
1465 QStringList parts = QStringList::split( " ", part1 ); 1517 QStringList parts = QStringList::split( " ", part1 );
1466 int leftOffset = 0; 1518 int leftOffset = 0;
1467 int rightOffset = parts.count() - 1; 1519 int rightOffset = parts.count() - 1;
1468 1520
1469 QString suffix; 1521 QString suffix;
1470 while ( rightOffset >= 0 ) { 1522 while ( rightOffset >= 0 ) {
1471 if ( suffixes.contains( parts[ rightOffset ] ) ) { 1523 if ( suffixes.contains( parts[ rightOffset ] ) ) {
1472 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " ")); 1524 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " "));
1473 rightOffset--; 1525 rightOffset--;
1474 } else 1526 } else
1475 break; 1527 break;
1476 } 1528 }
1477 setSuffix( suffix ); 1529 setSuffix( suffix );
1478 1530
1479 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) { 1531 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) {
1480 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] ); 1532 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] );
1481 rightOffset--; 1533 rightOffset--;
1482 } else 1534 } else
1483 setFamilyName( parts[ rightOffset ] ); 1535 setFamilyName( parts[ rightOffset ] );
1484 1536
1485 QString prefix; 1537 QString prefix;
1486 while ( leftOffset < rightOffset ) { 1538 while ( leftOffset < rightOffset ) {
1487 if ( titles.contains( parts[ leftOffset ] ) ) { 1539 if ( titles.contains( parts[ leftOffset ] ) ) {
1488 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1540 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1489 leftOffset++; 1541 leftOffset++;
1490 } else 1542 } else
1491 break; 1543 break;
1492 } 1544 }
1493 1545
1494 parts = QStringList::split( " ", part2 ); 1546 parts = QStringList::split( " ", part2 );
1495 1547
1496 leftOffset = 0; 1548 leftOffset = 0;
1497 rightOffset = parts.count(); 1549 rightOffset = parts.count();
1498 1550
1499 while ( leftOffset < rightOffset ) { 1551 while ( leftOffset < rightOffset ) {
1500 if ( titles.contains( parts[ leftOffset ] ) ) { 1552 if ( titles.contains( parts[ leftOffset ] ) ) {
1501 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1553 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1502 leftOffset++; 1554 leftOffset++;
1503 } else 1555 } else
1504 break; 1556 break;
1505 } 1557 }
1506 setPrefix( prefix ); 1558 setPrefix( prefix );
1507 1559
1508 if ( leftOffset < rightOffset ) { 1560 if ( leftOffset < rightOffset ) {
1509 setGivenName( parts[ leftOffset ] ); 1561 setGivenName( parts[ leftOffset ] );
1510 leftOffset++; 1562 leftOffset++;
1511 } 1563 }
1512 1564
1513 QString additionalName; 1565 QString additionalName;
1514 while ( leftOffset < rightOffset ) { 1566 while ( leftOffset < rightOffset ) {
1515 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1567 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1516 leftOffset++; 1568 leftOffset++;
1517 } 1569 }
1518 setAdditionalName( additionalName ); 1570 setAdditionalName( additionalName );
1519 } 1571 }
1520} 1572}
1521 1573
1522QString Addressee::realName() const 1574QString Addressee::realName() const
1523{ 1575{
1524 if ( !formattedName().isEmpty() ) 1576 if ( !formattedName().isEmpty() )
1525 return formattedName(); 1577 return formattedName();
1526 1578
1527 QString n = assembledName(); 1579 QString n = assembledName();
1528 1580
1529 if ( n.isEmpty() ) 1581 if ( n.isEmpty() )
1530 n = name(); 1582 n = name();
1531 if ( n.isEmpty() ) 1583 if ( n.isEmpty() )
1532 n = organization(); 1584 n = organization();
1533 return n; 1585 return n;
1534} 1586}
1535 1587
1536QString Addressee::assembledName() const 1588QString Addressee::assembledName() const
1537{ 1589{
1538 QString name = prefix() + " " + givenName() + " " + additionalName() + " " + 1590 QString name = prefix() + " " + givenName() + " " + additionalName() + " " +
1539 familyName() + " " + suffix(); 1591 familyName() + " " + suffix();
1540 1592
1541 return name.simplifyWhiteSpace(); 1593 return name.simplifyWhiteSpace();
1542} 1594}
1543 1595
1544QString Addressee::fullEmail( const QString &email ) const 1596QString Addressee::fullEmail( const QString &email ) const
1545{ 1597{
1546 QString e; 1598 QString e;
1547 if ( email.isNull() ) { 1599 if ( email.isNull() ) {
1548 e = preferredEmail(); 1600 e = preferredEmail();
1549 } else { 1601 } else {
1550 e = email; 1602 e = email;
1551 } 1603 }
1552 if ( e.isEmpty() ) return QString::null; 1604 if ( e.isEmpty() ) return QString::null;
1553 1605
1554 QString text; 1606 QString text;
1555 if ( realName().isEmpty() ) 1607 if ( realName().isEmpty() )
1556 text = e; 1608 text = e;
1557 else 1609 else
1558 text = assembledName() + " <" + e + ">"; 1610 text = assembledName() + " <" + e + ">";
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 {
1751 list.append(*it); 1813 list.append(*it);
1752 } 1814 }
1753 } 1815 }
1754 } 1816 }
1755 return list; 1817 return list;
1756} 1818}
1757 1819
1758Key Addressee::findKey( const QString &id ) const 1820Key Addressee::findKey( const QString &id ) const
1759{ 1821{
1760 Key::List::ConstIterator it; 1822 Key::List::ConstIterator it;
1761 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1823 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1762 if ( (*it).id() == id ) { 1824 if ( (*it).id() == id ) {
1763 return *it; 1825 return *it;
1764 } 1826 }
1765 } 1827 }
1766 return Key(); 1828 return Key();
1767} 1829}
1768 1830
1769QString Addressee::asString() const 1831QString Addressee::asString() const
1770{ 1832{
1771 return "Smith, agent Smith..."; 1833 return "Smith, agent Smith...";
1772} 1834}
1773 1835
1774void Addressee::dump() const 1836void Addressee::dump() const
1775{ 1837{
1776 return; 1838 return;
1777#if 0 1839#if 0
1778 kdDebug(5700) << "Addressee {" << endl; 1840 kdDebug(5700) << "Addressee {" << endl;
1779 1841
1780 kdDebug(5700) << " Uid: '" << uid() << "'" << endl; 1842 kdDebug(5700) << " Uid: '" << uid() << "'" << endl;
1781 1843
1782 kdDebug(5700) << " Name: '" << name() << "'" << endl; 1844 kdDebug(5700) << " Name: '" << name() << "'" << endl;
1783 kdDebug(5700) << " FormattedName: '" << formattedName() << "'" << endl; 1845 kdDebug(5700) << " FormattedName: '" << formattedName() << "'" << endl;
1784 kdDebug(5700) << " FamilyName: '" << familyName() << "'" << endl; 1846 kdDebug(5700) << " FamilyName: '" << familyName() << "'" << endl;
1785 kdDebug(5700) << " GivenName: '" << givenName() << "'" << endl; 1847 kdDebug(5700) << " GivenName: '" << givenName() << "'" << endl;
1786 kdDebug(5700) << " AdditionalName: '" << additionalName() << "'" << endl; 1848 kdDebug(5700) << " AdditionalName: '" << additionalName() << "'" << endl;
1787 kdDebug(5700) << " Prefix: '" << prefix() << "'" << endl; 1849 kdDebug(5700) << " Prefix: '" << prefix() << "'" << endl;
1788 kdDebug(5700) << " Suffix: '" << suffix() << "'" << endl; 1850 kdDebug(5700) << " Suffix: '" << suffix() << "'" << endl;
1789 kdDebug(5700) << " NickName: '" << nickName() << "'" << endl; 1851 kdDebug(5700) << " NickName: '" << nickName() << "'" << endl;
1790 kdDebug(5700) << " Birthday: '" << birthday().toString() << "'" << endl; 1852 kdDebug(5700) << " Birthday: '" << birthday().toString() << "'" << endl;
1791 kdDebug(5700) << " Mailer: '" << mailer() << "'" << endl; 1853 kdDebug(5700) << " Mailer: '" << mailer() << "'" << endl;
1792 kdDebug(5700) << " TimeZone: '" << timeZone().asString() << "'" << endl; 1854 kdDebug(5700) << " TimeZone: '" << timeZone().asString() << "'" << endl;
1793 kdDebug(5700) << " Geo: '" << geo().asString() << "'" << endl; 1855 kdDebug(5700) << " Geo: '" << geo().asString() << "'" << endl;
1794 kdDebug(5700) << " Title: '" << title() << "'" << endl; 1856 kdDebug(5700) << " Title: '" << title() << "'" << endl;
1795 kdDebug(5700) << " Role: '" << role() << "'" << endl; 1857 kdDebug(5700) << " Role: '" << role() << "'" << endl;
1796 kdDebug(5700) << " Organization: '" << organization() << "'" << endl; 1858 kdDebug(5700) << " Organization: '" << organization() << "'" << endl;
1797 kdDebug(5700) << " Note: '" << note() << "'" << endl; 1859 kdDebug(5700) << " Note: '" << note() << "'" << endl;
1798 kdDebug(5700) << " ProductId: '" << productId() << "'" << endl; 1860 kdDebug(5700) << " ProductId: '" << productId() << "'" << endl;
1799 kdDebug(5700) << " Revision: '" << revision().toString() << "'" << endl; 1861 kdDebug(5700) << " Revision: '" << revision().toString() << "'" << endl;
1800 kdDebug(5700) << " SortString: '" << sortString() << "'" << endl; 1862 kdDebug(5700) << " SortString: '" << sortString() << "'" << endl;
1801 kdDebug(5700) << " Url: '" << url().url() << "'" << endl; 1863 kdDebug(5700) << " Url: '" << url().url() << "'" << endl;
1802 kdDebug(5700) << " Secrecy: '" << secrecy().asString() << "'" << endl; 1864 kdDebug(5700) << " Secrecy: '" << secrecy().asString() << "'" << endl;
1803 kdDebug(5700) << " Logo: '" << logo().asString() << "'" << endl; 1865 kdDebug(5700) << " Logo: '" << logo().asString() << "'" << endl;
1804 kdDebug(5700) << " Photo: '" << photo().asString() << "'" << endl; 1866 kdDebug(5700) << " Photo: '" << photo().asString() << "'" << endl;
1805 kdDebug(5700) << " Sound: '" << sound().asString() << "'" << endl; 1867 kdDebug(5700) << " Sound: '" << sound().asString() << "'" << endl;
1806 kdDebug(5700) << " Agent: '" << agent().asString() << "'" << endl; 1868 kdDebug(5700) << " Agent: '" << agent().asString() << "'" << endl;
1807 1869
1808 kdDebug(5700) << " Emails {" << endl; 1870 kdDebug(5700) << " Emails {" << endl;
1809 QStringList e = emails(); 1871 QStringList e = emails();
1810 QStringList::ConstIterator it; 1872 QStringList::ConstIterator it;
1811 for( it = e.begin(); it != e.end(); ++it ) { 1873 for( it = e.begin(); it != e.end(); ++it ) {
1812 kdDebug(5700) << " " << (*it) << endl; 1874 kdDebug(5700) << " " << (*it) << endl;
1813 } 1875 }
1814 kdDebug(5700) << " }" << endl; 1876 kdDebug(5700) << " }" << endl;
1815 1877
1816 kdDebug(5700) << " PhoneNumbers {" << endl; 1878 kdDebug(5700) << " PhoneNumbers {" << endl;
1817 PhoneNumber::List p = phoneNumbers(); 1879 PhoneNumber::List p = phoneNumbers();
1818 PhoneNumber::List::ConstIterator it2; 1880 PhoneNumber::List::ConstIterator it2;
1819 for( it2 = p.begin(); it2 != p.end(); ++it2 ) { 1881 for( it2 = p.begin(); it2 != p.end(); ++it2 ) {
1820 kdDebug(5700) << " Type: " << int((*it2).type()) << " Number: " << (*it2).number() << endl; 1882 kdDebug(5700) << " Type: " << int((*it2).type()) << " Number: " << (*it2).number() << endl;
1821 } 1883 }
1822 kdDebug(5700) << " }" << endl; 1884 kdDebug(5700) << " }" << endl;
1823 1885
1824 Address::List a = addresses(); 1886 Address::List a = addresses();
1825 Address::List::ConstIterator it3; 1887 Address::List::ConstIterator it3;
1826 for( it3 = a.begin(); it3 != a.end(); ++it3 ) { 1888 for( it3 = a.begin(); it3 != a.end(); ++it3 ) {
1827 (*it3).dump(); 1889 (*it3).dump();
1828 } 1890 }
1829 1891
1830 kdDebug(5700) << " Keys {" << endl; 1892 kdDebug(5700) << " Keys {" << endl;
1831 Key::List k = keys(); 1893 Key::List k = keys();
1832 Key::List::ConstIterator it4; 1894 Key::List::ConstIterator it4;
1833 for( it4 = k.begin(); it4 != k.end(); ++it4 ) { 1895 for( it4 = k.begin(); it4 != k.end(); ++it4 ) {
1834 kdDebug(5700) << " Type: " << int((*it4).type()) << 1896 kdDebug(5700) << " Type: " << int((*it4).type()) <<
1835 " Key: " << (*it4).textData() << 1897 " Key: " << (*it4).textData() <<
1836 " CustomString: " << (*it4).customTypeString() << endl; 1898 " CustomString: " << (*it4).customTypeString() << endl;
1837 } 1899 }
1838 kdDebug(5700) << " }" << endl; 1900 kdDebug(5700) << " }" << endl;
1839 1901
1840 kdDebug(5700) << "}" << endl; 1902 kdDebug(5700) << "}" << endl;
1841#endif 1903#endif
1842} 1904}
1843 1905
1844 1906
1845void Addressee::insertAddress( const Address &address ) 1907void Addressee::insertAddress( const Address &address )
1846{ 1908{
1847 detach(); 1909 detach();
1848 mData->empty = false; 1910 mData->empty = false;
1849 1911
1850 Address::List::Iterator it; 1912 Address::List::Iterator it;
1851 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1913 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1852 if ( (*it).id() == address.id() ) { 1914 if ( (*it).id() == address.id() ) {
1853 *it = address; 1915 *it = address;
1854 return; 1916 return;
1855 } 1917 }
1856 } 1918 }
1857 mData->addresses.append( address ); 1919 mData->addresses.append( address );
1858} 1920}
1859 1921
1860void Addressee::removeAddress( const Address &address ) 1922void Addressee::removeAddress( const Address &address )
1861{ 1923{
1862 detach(); 1924 detach();
1863 1925
1864 Address::List::Iterator it; 1926 Address::List::Iterator it;
1865 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1927 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1866 if ( (*it).id() == address.id() ) { 1928 if ( (*it).id() == address.id() ) {
1867 mData->addresses.remove( it ); 1929 mData->addresses.remove( it );
1868 return; 1930 return;
1869 } 1931 }
1870 } 1932 }
1871} 1933}
1872 1934
1873Address Addressee::address( int type ) const 1935Address Addressee::address( int type ) const
1874{ 1936{
1875 Address address( type ); 1937 Address address( type );
1876 Address::List::ConstIterator it; 1938 Address::List::ConstIterator it;
1877 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1939 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1878 if ( matchBinaryPatternA( (*it).type(), type ) ) { 1940 if ( matchBinaryPatternA( (*it).type(), type ) ) {
1879 if ( (*it).type() & Address::Pref ) 1941 if ( (*it).type() & Address::Pref )
1880 return (*it); 1942 return (*it);
1881 else if ( address.isEmpty() ) 1943 else if ( address.isEmpty() )
1882 address = (*it); 1944 address = (*it);
1883 } 1945 }
1884 } 1946 }
1885 1947
1886 return address; 1948 return address;
1887} 1949}
1888 1950
1889Address::List Addressee::addresses() const 1951Address::List Addressee::addresses() const
1890{ 1952{
1891 return mData->addresses; 1953 return mData->addresses;
1892} 1954}
1893 1955
1894Address::List Addressee::addresses( int type ) const 1956Address::List Addressee::addresses( int type ) const
1895{ 1957{
1896 Address::List list; 1958 Address::List list;
1897 1959
1898 Address::List::ConstIterator it; 1960 Address::List::ConstIterator it;
1899 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1961 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1900 if ( matchBinaryPattern( (*it).type(), type ) ) { 1962 if ( matchBinaryPattern( (*it).type(), type ) ) {
1901 list.append( *it ); 1963 list.append( *it );
1902 } 1964 }
1903 } 1965 }
1904 1966
1905 return list; 1967 return list;
1906} 1968}
1907 1969
1908Address Addressee::findAddress( const QString &id ) const 1970Address Addressee::findAddress( const QString &id ) const
1909{ 1971{
1910 Address::List::ConstIterator it; 1972 Address::List::ConstIterator it;
1911 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1973 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1912 if ( (*it).id() == id ) { 1974 if ( (*it).id() == id ) {
1913 return *it; 1975 return *it;
1914 } 1976 }
1915 } 1977 }
1916 return Address(); 1978 return Address();
1917} 1979}
1918 1980
1919void Addressee::insertCategory( const QString &c ) 1981void Addressee::insertCategory( const QString &c )
1920{ 1982{
1921 detach(); 1983 detach();
1922 mData->empty = false; 1984 mData->empty = false;
1923 1985
1924 if ( mData->categories.contains( c ) ) return; 1986 if ( mData->categories.contains( c ) ) return;
1925 1987
1926 mData->categories.append( c ); 1988 mData->categories.append( c );
1927} 1989}
1928 1990
1929void Addressee::removeCategory( const QString &c ) 1991void Addressee::removeCategory( const QString &c )
1930{ 1992{
1931 detach(); 1993 detach();
1932 1994
1933 QStringList::Iterator it = mData->categories.find( c ); 1995 QStringList::Iterator it = mData->categories.find( c );
1934 if ( it == mData->categories.end() ) return; 1996 if ( it == mData->categories.end() ) return;
1935 1997
1936 mData->categories.remove( it ); 1998 mData->categories.remove( it );
1937} 1999}
1938 2000
1939bool Addressee::hasCategory( const QString &c ) const 2001bool Addressee::hasCategory( const QString &c ) const
1940{ 2002{
1941 return ( mData->categories.contains( c ) ); 2003 return ( mData->categories.contains( c ) );
1942} 2004}
1943 2005
1944void Addressee::setCategories( const QStringList &c ) 2006void Addressee::setCategories( const QStringList &c )
1945{ 2007{
1946 detach(); 2008 detach();
1947 mData->empty = false; 2009 mData->empty = false;
1948 2010
1949 mData->categories = c; 2011 mData->categories = c;
1950} 2012}
1951 2013
1952QStringList Addressee::categories() const 2014QStringList Addressee::categories() const
1953{ 2015{
1954 return mData->categories; 2016 return mData->categories;
1955} 2017}
1956 2018
1957void Addressee::insertCustom( const QString &app, const QString &name, 2019void Addressee::insertCustom( const QString &app, const QString &name,
1958 const QString &value ) 2020 const QString &value )
1959{ 2021{
1960 if ( value.isNull() || name.isEmpty() || app.isEmpty() ) return; 2022 if ( value.isNull() || name.isEmpty() || app.isEmpty() ) return;
1961 2023
1962 detach(); 2024 detach();
1963 mData->empty = false; 2025 mData->empty = false;
1964 2026
1965 QString qualifiedName = app + "-" + name + ":"; 2027 QString qualifiedName = app + "-" + name + ":";
1966 2028
1967 QStringList::Iterator it; 2029 QStringList::Iterator it;
1968 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) { 2030 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
1969 if ( (*it).startsWith( qualifiedName ) ) { 2031 if ( (*it).startsWith( qualifiedName ) ) {
1970 (*it) = qualifiedName + value; 2032 (*it) = qualifiedName + value;
1971 return; 2033 return;
1972 } 2034 }
1973 } 2035 }
1974 mData->custom.append( qualifiedName + value ); 2036 mData->custom.append( qualifiedName + value );
1975} 2037}
1976 2038
1977void Addressee::removeCustom( const QString &app, const QString &name) 2039void Addressee::removeCustom( const QString &app, const QString &name)
1978{ 2040{
1979 detach(); 2041 detach();
1980 2042
1981 QString qualifiedName = app + "-" + name + ":"; 2043 QString qualifiedName = app + "-" + name + ":";
1982 2044
1983 QStringList::Iterator it; 2045 QStringList::Iterator it;
1984 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) { 2046 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
1985 if ( (*it).startsWith( qualifiedName ) ) { 2047 if ( (*it).startsWith( qualifiedName ) ) {
1986 mData->custom.remove( it ); 2048 mData->custom.remove( it );
1987 return; 2049 return;
1988 } 2050 }
1989 } 2051 }
1990} 2052}
1991 2053
1992QString Addressee::custom( const QString &app, const QString &name ) const 2054QString Addressee::custom( const QString &app, const QString &name ) const
1993{ 2055{
1994 QString qualifiedName = app + "-" + name + ":"; 2056 QString qualifiedName = app + "-" + name + ":";
1995 QString value; 2057 QString value;
1996 2058
1997 QStringList::ConstIterator it; 2059 QStringList::ConstIterator it;
1998 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) { 2060 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
1999 if ( (*it).startsWith( qualifiedName ) ) { 2061 if ( (*it).startsWith( qualifiedName ) ) {
2000 value = (*it).mid( (*it).find( ":" ) + 1 ); 2062 value = (*it).mid( (*it).find( ":" ) + 1 );
2001 break; 2063 break;
2002 } 2064 }
2003 } 2065 }
2004 2066
2005 return value; 2067 return value;
2006} 2068}
2007 2069
2008void Addressee::setCustoms( const QStringList &l ) 2070void Addressee::setCustoms( const QStringList &l )
2009{ 2071{
2010 detach(); 2072 detach();
2011 mData->empty = false; 2073 mData->empty = false;
2012 2074
2013 mData->custom = l; 2075 mData->custom = l;
2014} 2076}
2015 2077
2016QStringList Addressee::customs() const 2078QStringList Addressee::customs() const
2017{ 2079{
2018 return mData->custom; 2080 return mData->custom;
2019} 2081}
2020 2082
2021void Addressee::parseEmailAddress( const QString &rawEmail, QString &fullName, 2083void Addressee::parseEmailAddress( const QString &rawEmail, QString &fullName,
2022 QString &email) 2084 QString &email)
2023{ 2085{
2024 int startPos, endPos, len; 2086 int startPos, endPos, len;
2025 QString partA, partB, result; 2087 QString partA, partB, result;
2026 char endCh = '>'; 2088 char endCh = '>';
2027 2089
2028 startPos = rawEmail.find('<'); 2090 startPos = rawEmail.find('<');
2029 if (startPos < 0) 2091 if (startPos < 0)
2030 { 2092 {
2031 startPos = rawEmail.find('('); 2093 startPos = rawEmail.find('(');
2032 endCh = ')'; 2094 endCh = ')';
2033 } 2095 }
2034 if (startPos < 0) 2096 if (startPos < 0)
2035 { 2097 {
2036 // We couldn't find any separators, so we assume the whole string 2098 // We couldn't find any separators, so we assume the whole string
2037 // is the email address 2099 // is the email address
2038 email = rawEmail; 2100 email = rawEmail;
2039 fullName = ""; 2101 fullName = "";
2040 } 2102 }
2041 else 2103 else
2042 { 2104 {
2043 // We have a start position, try to find an end 2105 // We have a start position, try to find an end
2044 endPos = rawEmail.find(endCh, startPos+1); 2106 endPos = rawEmail.find(endCh, startPos+1);
2045 2107
2046 if (endPos < 0) 2108 if (endPos < 0)
2047 { 2109 {
2048 // We couldn't find the end of the email address. We can only 2110 // We couldn't find the end of the email address. We can only
2049 // assume the entire string is the email address. 2111 // assume the entire string is the email address.
2050 email = rawEmail; 2112 email = rawEmail;
2051 fullName = ""; 2113 fullName = "";
2052 } 2114 }
2053 else 2115 else
2054 { 2116 {
2055 // We have a start and end to the email address 2117 // We have a start and end to the email address
2056 2118
2057 // Grab the name part 2119 // Grab the name part
2058 fullName = rawEmail.left(startPos).stripWhiteSpace(); 2120 fullName = rawEmail.left(startPos).stripWhiteSpace();
2059 2121
2060 // grab the email part 2122 // grab the email part
2061 email = rawEmail.mid(startPos+1, endPos-startPos-1).stripWhiteSpace(); 2123 email = rawEmail.mid(startPos+1, endPos-startPos-1).stripWhiteSpace();
2062 2124
2063 // Check that we do not have any extra characters on the end of the 2125 // Check that we do not have any extra characters on the end of the
2064 // strings 2126 // strings
2065 len = fullName.length(); 2127 len = fullName.length();
2066 if (fullName[0]=='"' && fullName[len-1]=='"') 2128 if (fullName[0]=='"' && fullName[len-1]=='"')
2067 fullName = fullName.mid(1, len-2); 2129 fullName = fullName.mid(1, len-2);
2068 else if (fullName[0]=='<' && fullName[len-1]=='>') 2130 else if (fullName[0]=='<' && fullName[len-1]=='>')
2069 fullName = fullName.mid(1, len-2); 2131 fullName = fullName.mid(1, len-2);
2070 else if (fullName[0]=='(' && fullName[len-1]==')') 2132 else if (fullName[0]=='(' && fullName[len-1]==')')
2071 fullName = fullName.mid(1, len-2); 2133 fullName = fullName.mid(1, len-2);
2072 } 2134 }
2073 } 2135 }
2074} 2136}
2075 2137
2076void Addressee::setResource( Resource *resource ) 2138void Addressee::setResource( Resource *resource )
2077{ 2139{
2078 detach(); 2140 detach();
2079 mData->resource = resource; 2141 mData->resource = resource;
2080} 2142}
2081 2143
2082Resource *Addressee::resource() const 2144Resource *Addressee::resource() const
2083{ 2145{
2084 return mData->resource; 2146 return mData->resource;
2085} 2147}
2086 2148
2087//US 2149//US
2088QString Addressee::resourceLabel() 2150QString Addressee::resourceLabel()
2089{ 2151{
2090 return i18n("Resource"); 2152 return i18n("Resource");
2091} 2153}
2092QString Addressee::categoryLabel() 2154QString Addressee::categoryLabel()
2093{ 2155{
2094 return i18n("Category"); 2156 return i18n("Category");
2095} 2157}
2096 2158
2097void Addressee::setChanged( bool value ) 2159void Addressee::setChanged( bool value )
2098{ 2160{
2099 detach(); 2161 detach();
2100 mData->changed = value; 2162 mData->changed = value;
2101} 2163}
2102 2164
2103bool Addressee::changed() const 2165bool Addressee::changed() const
2104{ 2166{
2105 return mData->changed; 2167 return mData->changed;
2106} 2168}
2107 2169
2108void Addressee::setTagged( bool value ) 2170void Addressee::setTagged( bool value )
2109{ 2171{
2110 detach(); 2172 detach();
2111 mData->tagged = value; 2173 mData->tagged = value;
2112} 2174}
2113 2175
2114bool Addressee::tagged() const 2176bool Addressee::tagged() const
2115{ 2177{
2116 return mData->tagged; 2178 return mData->tagged;
2117} 2179}
2118 2180
2119QDataStream &KABC::operator<<( QDataStream &s, const Addressee &a ) 2181QDataStream &KABC::operator<<( QDataStream &s, const Addressee &a )
2120{ 2182{
2121 if (!a.mData) return s; 2183 if (!a.mData) return s;
2122 2184
2123 s << a.uid(); 2185 s << a.uid();
2124 2186
2125 s << a.mData->name; 2187 s << a.mData->name;
2126 s << a.mData->formattedName; 2188 s << a.mData->formattedName;
2127 s << a.mData->familyName; 2189 s << a.mData->familyName;
2128 s << a.mData->givenName; 2190 s << a.mData->givenName;
2129 s << a.mData->additionalName; 2191 s << a.mData->additionalName;
2130 s << a.mData->prefix; 2192 s << a.mData->prefix;
2131 s << a.mData->suffix; 2193 s << a.mData->suffix;
2132 s << a.mData->nickName; 2194 s << a.mData->nickName;
2133 s << a.mData->birthday; 2195 s << a.mData->birthday;
2134 s << a.mData->mailer; 2196 s << a.mData->mailer;
2135 s << a.mData->timeZone; 2197 s << a.mData->timeZone;
2136 s << a.mData->geo; 2198 s << a.mData->geo;
2137 s << a.mData->title; 2199 s << a.mData->title;
2138 s << a.mData->role; 2200 s << a.mData->role;
2139 s << a.mData->organization; 2201 s << a.mData->organization;
2140 s << a.mData->note; 2202 s << a.mData->note;
2141 s << a.mData->productId; 2203 s << a.mData->productId;
2142 s << a.mData->revision; 2204 s << a.mData->revision;
2143 s << a.mData->sortString; 2205 s << a.mData->sortString;
2144 s << a.mData->url; 2206 s << a.mData->url;
2145 s << a.mData->secrecy; 2207 s << a.mData->secrecy;
2146 s << a.mData->logo; 2208 s << a.mData->logo;
2147 s << a.mData->photo; 2209 s << a.mData->photo;
2148 s << a.mData->sound; 2210 s << a.mData->sound;
2149 s << a.mData->agent; 2211 s << a.mData->agent;
2150 s << a.mData->phoneNumbers; 2212 s << a.mData->phoneNumbers;
2151 s << a.mData->addresses; 2213 s << a.mData->addresses;
2152 s << a.mData->emails; 2214 s << a.mData->emails;
2153 s << a.mData->categories; 2215 s << a.mData->categories;
2154 s << a.mData->custom; 2216 s << a.mData->custom;
2155 s << a.mData->keys; 2217 s << a.mData->keys;
2156 return s; 2218 return s;
2157} 2219}
2158 2220
2159QDataStream &KABC::operator>>( QDataStream &s, Addressee &a ) 2221QDataStream &KABC::operator>>( QDataStream &s, Addressee &a )
2160{ 2222{
2161 if (!a.mData) return s; 2223 if (!a.mData) return s;
2162 2224
2163 s >> a.mData->uid; 2225 s >> a.mData->uid;
2164 2226
2165 s >> a.mData->name; 2227 s >> a.mData->name;
2166 s >> a.mData->formattedName; 2228 s >> a.mData->formattedName;
diff --git a/kabc/addressee.h b/kabc/addressee.h
index d1c07cb..0c488eb 100644
--- a/kabc/addressee.h
+++ b/kabc/addressee.h
@@ -1,636 +1,638 @@
1/*** Warning! This file has been generated by the script makeaddressee ***/ 1/*** Warning! This file has been generated by the script makeaddressee ***/
2/* 2/*
3 This file is part of libkabc. 3 This file is part of libkabc.
4 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 4 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
5 5
6 This library is free software; you can redistribute it and/or 6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public 7 modify it under the terms of the GNU Library General Public
8 License as published by the Free Software Foundation; either 8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version. 9 version 2 of the License, or (at your option) any later version.
10 10
11 This library is distributed in the hope that it will be useful, 11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Library General Public License for more details. 14 Library General Public License for more details.
15 15
16 You should have received a copy of the GNU Library General Public License 16 You should have received a copy of the GNU Library General Public License
17 along with this library; see the file COPYING.LIB. If not, write to 17 along with this library; see the file COPYING.LIB. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. 19 Boston, MA 02111-1307, USA.
20*/ 20*/
21 21
22/* 22/*
23Enhanced Version of the file for platform independent KDE tools. 23Enhanced Version of the file for platform independent KDE tools.
24Copyright (c) 2004 Ulf Schenk 24Copyright (c) 2004 Ulf Schenk
25 25
26$Id$ 26$Id$
27*/ 27*/
28 28
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.
221 */ 223 */
222 void setSuffix( const QString &suffix ); 224 void setSuffix( const QString &suffix );
223 /** 225 /**
224 Return honorific suffixes. 226 Return honorific suffixes.
225 */ 227 */
226 QString suffix() const; 228 QString suffix() const;
227 /** 229 /**
228 Return translated label for suffix field. 230 Return translated label for suffix field.
229 */ 231 */
230 static QString suffixLabel(); 232 static QString suffixLabel();
231 233
232 /** 234 /**
233 Set nick name. 235 Set nick name.
234 */ 236 */
235 void setNickName( const QString &nickName ); 237 void setNickName( const QString &nickName );
236 /** 238 /**
237 Return nick name. 239 Return nick name.
238 */ 240 */
239 QString nickName() const; 241 QString nickName() const;
240 /** 242 /**
241 Return translated label for nickName field. 243 Return translated label for nickName field.
242 */ 244 */
243 static QString nickNameLabel(); 245 static QString nickNameLabel();
244 246
245 /** 247 /**
246 Set birthday. 248 Set birthday.
247 */ 249 */
248 void setBirthday( const QDateTime &birthday ); 250 void setBirthday( const QDateTime &birthday );
249 /** 251 /**
250 Return birthday. 252 Return birthday.
251 */ 253 */
252 QDateTime birthday() const; 254 QDateTime birthday() const;
253 /** 255 /**
254 Return translated label for birthday field. 256 Return translated label for birthday field.
255 */ 257 */
256 static QString birthdayLabel(); 258 static QString birthdayLabel();
257 259
258 /** 260 /**
259 Return translated label for homeAddressStreet field. 261 Return translated label for homeAddressStreet field.
260 */ 262 */
261 static QString homeAddressStreetLabel(); 263 static QString homeAddressStreetLabel();
262 264
263 /** 265 /**
264 Return translated label for homeAddressLocality field. 266 Return translated label for homeAddressLocality field.
265 */ 267 */
266 static QString homeAddressLocalityLabel(); 268 static QString homeAddressLocalityLabel();
267 269
268 /** 270 /**
269 Return translated label for homeAddressRegion field. 271 Return translated label for homeAddressRegion field.
270 */ 272 */
271 static QString homeAddressRegionLabel(); 273 static QString homeAddressRegionLabel();
272 274
273 /** 275 /**
274 Return translated label for homeAddressPostalCode field. 276 Return translated label for homeAddressPostalCode field.
275 */ 277 */
276 static QString homeAddressPostalCodeLabel(); 278 static QString homeAddressPostalCodeLabel();
277 279
278 /** 280 /**
279 Return translated label for homeAddressCountry field. 281 Return translated label for homeAddressCountry field.
280 */ 282 */
281 static QString homeAddressCountryLabel(); 283 static QString homeAddressCountryLabel();
282 284
283 /** 285 /**
284 Return translated label for homeAddressLabel field. 286 Return translated label for homeAddressLabel field.
285 */ 287 */
286 static QString homeAddressLabelLabel(); 288 static QString homeAddressLabelLabel();
287 289
288 /** 290 /**
289 Return translated label for businessAddressStreet field. 291 Return translated label for businessAddressStreet field.
290 */ 292 */
291 static QString businessAddressStreetLabel(); 293 static QString businessAddressStreetLabel();
292 294
293 /** 295 /**
294 Return translated label for businessAddressLocality field. 296 Return translated label for businessAddressLocality field.
295 */ 297 */
296 static QString businessAddressLocalityLabel(); 298 static QString businessAddressLocalityLabel();
297 299
298 /** 300 /**
299 Return translated label for businessAddressRegion field. 301 Return translated label for businessAddressRegion field.
300 */ 302 */
301 static QString businessAddressRegionLabel(); 303 static QString businessAddressRegionLabel();
302 304
303 /** 305 /**
304 Return translated label for businessAddressPostalCode field. 306 Return translated label for businessAddressPostalCode field.
305 */ 307 */
306 static QString businessAddressPostalCodeLabel(); 308 static QString businessAddressPostalCodeLabel();
307 309
308 /** 310 /**
309 Return translated label for businessAddressCountry field. 311 Return translated label for businessAddressCountry field.
310 */ 312 */
311 static QString businessAddressCountryLabel(); 313 static QString businessAddressCountryLabel();
312 314
313 /** 315 /**
314 Return translated label for businessAddressLabel field. 316 Return translated label for businessAddressLabel field.
315 */ 317 */
316 static QString businessAddressLabelLabel(); 318 static QString businessAddressLabelLabel();
317 319
318 /** 320 /**
319 Return translated label for homePhone field. 321 Return translated label for homePhone field.
320 */ 322 */
321 static QString homePhoneLabel(); 323 static QString homePhoneLabel();
322 324
323 /** 325 /**
324 Return translated label for businessPhone field. 326 Return translated label for businessPhone field.
325 */ 327 */
326 static QString businessPhoneLabel(); 328 static QString businessPhoneLabel();
327 329
328 /** 330 /**
329 Return translated label for mobilePhone field. 331 Return translated label for mobilePhone field.
330 */ 332 */
331 static QString mobilePhoneLabel(); 333 static QString mobilePhoneLabel();
332 static QString mobileWorkPhoneLabel(); 334 static QString mobileWorkPhoneLabel();
333 static QString mobileHomePhoneLabel(); 335 static QString mobileHomePhoneLabel();
334 336
335 /** 337 /**
336 Return translated label for homeFax field. 338 Return translated label for homeFax field.
337 */ 339 */
338 static QString homeFaxLabel(); 340 static QString homeFaxLabel();
339 341
340 /** 342 /**
341 Return translated label for businessFax field. 343 Return translated label for businessFax field.
342 */ 344 */
343 static QString businessFaxLabel(); 345 static QString businessFaxLabel();
344 346
345 /** 347 /**
346 Return translated label for carPhone field. 348 Return translated label for carPhone field.
347 */ 349 */
348 static QString carPhoneLabel(); 350 static QString carPhoneLabel();
349 351
350 /** 352 /**
351 Return translated label for isdn field. 353 Return translated label for isdn field.
352 */ 354 */
353 static QString isdnLabel(); 355 static QString isdnLabel();
354 356
355 /** 357 /**
356 Return translated label for pager field. 358 Return translated label for pager field.
357 */ 359 */
358 static QString pagerLabel(); 360 static QString pagerLabel();
359 361
360 /** 362 /**
361 Return translated label for sip field. 363 Return translated label for sip field.
362 */ 364 */
363 static QString sipLabel(); 365 static QString sipLabel();
364 366
365 /** 367 /**
366 Return translated label for email field. 368 Return translated label for email field.
367 */ 369 */
368 static QString emailLabel(); 370 static QString emailLabel();
369 371
370 /** 372 /**
371 Set mail client. 373 Set mail client.
372 */ 374 */
373 void setMailer( const QString &mailer ); 375 void setMailer( const QString &mailer );
374 /** 376 /**
375 Return mail client. 377 Return mail client.
376 */ 378 */
377 QString mailer() const; 379 QString mailer() const;
378 /** 380 /**
379 Return translated label for mailer field. 381 Return translated label for mailer field.
380 */ 382 */
381 static QString mailerLabel(); 383 static QString mailerLabel();
382 384
383 /** 385 /**
384 Set time zone. 386 Set time zone.
385 */ 387 */
386 void setTimeZone( const TimeZone &timeZone ); 388 void setTimeZone( const TimeZone &timeZone );
387 /** 389 /**
388 Return time zone. 390 Return time zone.
389 */ 391 */
390 TimeZone timeZone() const; 392 TimeZone timeZone() const;
391 /** 393 /**
392 Return translated label for timeZone field. 394 Return translated label for timeZone field.
393 */ 395 */
394 static QString timeZoneLabel(); 396 static QString timeZoneLabel();
395 397
396 /** 398 /**
397 Set geographic position. 399 Set geographic position.
398 */ 400 */
399 void setGeo( const Geo &geo ); 401 void setGeo( const Geo &geo );
400 /** 402 /**
401 Return geographic position. 403 Return geographic position.
402 */ 404 */
403 Geo geo() const; 405 Geo geo() const;
404 /** 406 /**
405 Return translated label for geo field. 407 Return translated label for geo field.
406 */ 408 */
407 static QString geoLabel(); 409 static QString geoLabel();
408 410
409 /** 411 /**
410 Set title. 412 Set title.
411 */ 413 */
412 void setTitle( const QString &title ); 414 void setTitle( const QString &title );
413 /** 415 /**
414 Return title. 416 Return title.
415 */ 417 */
416 QString title() const; 418 QString title() const;
417 /** 419 /**
418 Return translated label for title field. 420 Return translated label for title field.
419 */ 421 */
420 static QString titleLabel(); 422 static QString titleLabel();
421 423
422 /** 424 /**
423 Set role. 425 Set role.
424 */ 426 */
425 void setRole( const QString &role ); 427 void setRole( const QString &role );
426 /** 428 /**
427 Return role. 429 Return role.
428 */ 430 */
429 QString role() const; 431 QString role() const;
430 /** 432 /**
431 Return translated label for role field. 433 Return translated label for role field.
432 */ 434 */
433 static QString roleLabel(); 435 static QString roleLabel();
434 436
435 /** 437 /**
436 Set organization. 438 Set organization.
437 */ 439 */
438 void setOrganization( const QString &organization ); 440 void setOrganization( const QString &organization );
439 /** 441 /**
440 Return organization. 442 Return organization.
441 */ 443 */
442 QString organization() const; 444 QString organization() const;
443 /** 445 /**
444 Return translated label for organization field. 446 Return translated label for organization field.
445 */ 447 */
446 static QString organizationLabel(); 448 static QString organizationLabel();
447 449
448 /** 450 /**
449 Set note. 451 Set note.
450 */ 452 */
451 void setNote( const QString &note ); 453 void setNote( const QString &note );
452 /** 454 /**
453 Return note. 455 Return note.
454 */ 456 */
455 QString note() const; 457 QString note() const;
456 /** 458 /**
457 Return translated label for note field. 459 Return translated label for note field.
458 */ 460 */
459 static QString noteLabel(); 461 static QString noteLabel();
460 462
461 /** 463 /**
462 Set product identifier. 464 Set product identifier.
463 */ 465 */
464 void setProductId( const QString &productId ); 466 void setProductId( const QString &productId );
465 /** 467 /**
466 Return product identifier. 468 Return product identifier.
467 */ 469 */
468 QString productId() const; 470 QString productId() const;
469 /** 471 /**
470 Return translated label for productId field. 472 Return translated label for productId field.
471 */ 473 */
472 static QString productIdLabel(); 474 static QString productIdLabel();
473 475
474 /** 476 /**
475 Set revision date. 477 Set revision date.
476 */ 478 */
477 void setRevision( const QDateTime &revision ); 479 void setRevision( const QDateTime &revision );
478 /** 480 /**
479 Return revision date. 481 Return revision date.
480 */ 482 */
481 QDateTime revision() const; 483 QDateTime revision() const;
482 /** 484 /**
483 Return translated label for revision field. 485 Return translated label for revision field.
484 */ 486 */
485 static QString revisionLabel(); 487 static QString revisionLabel();
486 488
487 /** 489 /**
488 Set sort string. 490 Set sort string.
489 */ 491 */
490 void setSortString( const QString &sortString ); 492 void setSortString( const QString &sortString );
491 /** 493 /**
492 Return sort string. 494 Return sort string.
493 */ 495 */
494 QString sortString() const; 496 QString sortString() const;
495 /** 497 /**
496 Return translated label for sortString field. 498 Return translated label for sortString field.
497 */ 499 */
498 static QString sortStringLabel(); 500 static QString sortStringLabel();
499 501
500 /** 502 /**
501 Set URL. 503 Set URL.
502 */ 504 */
503 void setUrl( const KURL &url ); 505 void setUrl( const KURL &url );
504 /** 506 /**
505 Return URL. 507 Return URL.
506 */ 508 */
507 KURL url() const; 509 KURL url() const;
508 /** 510 /**
509 Return translated label for url field. 511 Return translated label for url field.
510 */ 512 */
511 static QString urlLabel(); 513 static QString urlLabel();
512 514
513 /** 515 /**
514 Set security class. 516 Set security class.
515 */ 517 */
516 void setSecrecy( const Secrecy &secrecy ); 518 void setSecrecy( const Secrecy &secrecy );
517 /** 519 /**
518 Return security class. 520 Return security class.
519 */ 521 */
520 Secrecy secrecy() const; 522 Secrecy secrecy() const;
521 /** 523 /**
522 Return translated label for secrecy field. 524 Return translated label for secrecy field.
523 */ 525 */
524 static QString secrecyLabel(); 526 static QString secrecyLabel();
525 527
526 /** 528 /**
527 Set logo. 529 Set logo.
528 */ 530 */
529 void setLogo( const Picture &logo ); 531 void setLogo( const Picture &logo );
530 /** 532 /**
531 Return logo. 533 Return logo.
532 */ 534 */
533 Picture logo() const; 535 Picture logo() const;
534 /** 536 /**
535 Return translated label for logo field. 537 Return translated label for logo field.
536 */ 538 */
537 static QString logoLabel(); 539 static QString logoLabel();
538 540
539 /** 541 /**
540 Set photo. 542 Set photo.
541 */ 543 */
542 void setPhoto( const Picture &photo ); 544 void setPhoto( const Picture &photo );
543 /** 545 /**
544 Return photo. 546 Return photo.
545 */ 547 */
546 Picture photo() const; 548 Picture photo() const;
547 /** 549 /**
548 Return translated label for photo field. 550 Return translated label for photo field.
549 */ 551 */
550 static QString photoLabel(); 552 static QString photoLabel();
551 553
552 /** 554 /**
553 Set sound. 555 Set sound.
554 */ 556 */
555 void setSound( const Sound &sound ); 557 void setSound( const Sound &sound );
556 /** 558 /**
557 Return sound. 559 Return sound.
558 */ 560 */
559 Sound sound() const; 561 Sound sound() const;
560 /** 562 /**
561 Return translated label for sound field. 563 Return translated label for sound field.
562 */ 564 */
563 static QString soundLabel(); 565 static QString soundLabel();
564 566
565 /** 567 /**
566 Set agent. 568 Set agent.
567 */ 569 */
568 void setAgent( const Agent &agent ); 570 void setAgent( const Agent &agent );
569 /** 571 /**
570 Return agent. 572 Return agent.
571 */ 573 */
572 Agent agent() const; 574 Agent agent() const;
573 /** 575 /**
574 Return translated label for agent field. 576 Return translated label for agent field.
575 */ 577 */
576 static QString agentLabel(); 578 static QString agentLabel();
577 579
578 /** 580 /**
579 Set name fields by parsing the given string and trying to associate the 581 Set name fields by parsing the given string and trying to associate the
580 parts of the string with according fields. This function should probably 582 parts of the string with according fields. This function should probably
581 be a bit more clever. 583 be a bit more clever.
582 */ 584 */
583 void setNameFromString( const QString & ); 585 void setNameFromString( const QString & );
584 586
585 /** 587 /**
586 Return the name of the addressee. This is calculated from all the name 588 Return the name of the addressee. This is calculated from all the name
587 fields. 589 fields.
588 */ 590 */
589 QString realName() const; 591 QString realName() const;
590 592
591 /** 593 /**
592 Return the name that consists of all name parts. 594 Return the name that consists of all name parts.
593 */ 595 */
594 QString assembledName() const; 596 QString assembledName() const;
595 597
596 /** 598 /**
597 Return email address including real name. 599 Return email address including real name.
598 600
599 @param email Email address to be used to construct the full email string. 601 @param email Email address to be used to construct the full email string.
600 If this is QString::null the preferred email address is used. 602 If this is QString::null the preferred email address is used.
601 */ 603 */
602 QString fullEmail( const QString &email=QString::null ) const; 604 QString fullEmail( const QString &email=QString::null ) const;
603 605
604 /** 606 /**
605 Insert an email address. If the email address already exists in this 607 Insert an email address. If the email address already exists in this
606 addressee it is not duplicated. 608 addressee it is not duplicated.
607 609
608 @param email Email address 610 @param email Email address
609 @param preferred Set to true, if this is the preferred email address of 611 @param preferred Set to true, if this is the preferred email address of
610 the addressee. 612 the addressee.
611 */ 613 */
612 void insertEmail( const QString &email, bool preferred=false ); 614 void insertEmail( const QString &email, bool preferred=false );
613 615
614 /** 616 /**
615 Remove email address. If the email address doesn't exist, nothing happens. 617 Remove email address. If the email address doesn't exist, nothing happens.
616 */ 618 */
617 void removeEmail( const QString &email ); 619 void removeEmail( const QString &email );
618 620
619 /** 621 /**
620 Return preferred email address. This is the first email address or the 622 Return preferred email address. This is the first email address or the
621 last one added with @ref insertEmail() with a set preferred parameter. 623 last one added with @ref insertEmail() with a set preferred parameter.
622 */ 624 */
623 QString preferredEmail() const; 625 QString preferredEmail() const;
624 626
625 /** 627 /**
626 Return list of all email addresses. 628 Return list of all email addresses.
627 */ 629 */
628 QStringList emails() const; 630 QStringList emails() const;
629 631
630 /** 632 /**
631 Set the emails to @param. 633 Set the emails to @param.
632 The first email address gets the preferred one! 634 The first email address gets the preferred one!
633 @param list The list of email addresses. 635 @param list The list of email addresses.
634 */ 636 */
635 void setEmails( const QStringList& list); 637 void setEmails( const QStringList& list);
636 638
diff --git a/kabc/field.cpp b/kabc/field.cpp
index fd51026..20885de 100644
--- a/kabc/field.cpp
+++ b/kabc/field.cpp
@@ -1,590 +1,590 @@
1/*** Warning! This file has been generated by the script makeaddressee ***/ 1/*** Warning! This file has been generated by the script makeaddressee ***/
2/* 2/*
3 This file is part of libkabc. 3 This file is part of libkabc.
4 Copyright (c) 2002 Cornelius Schumacher <schumacher@kde.org> 4 Copyright (c) 2002 Cornelius Schumacher <schumacher@kde.org>
5 5
6 This library is free software; you can redistribute it and/or 6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public 7 modify it under the terms of the GNU Library General Public
8 License as published by the Free Software Foundation; either 8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version. 9 version 2 of the License, or (at your option) any later version.
10 10
11 This library is distributed in the hope that it will be useful, 11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Library General Public License for more details. 14 Library General Public License for more details.
15 15
16 You should have received a copy of the GNU Library General Public License 16 You should have received a copy of the GNU Library General Public License
17 along with this library; see the file COPYING.LIB. If not, write to 17 along with this library; see the file COPYING.LIB. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. 19 Boston, MA 02111-1307, USA.
20*/ 20*/
21 21
22/* 22/*
23Enhanced Version of the file for platform independent KDE tools. 23Enhanced Version of the file for platform independent KDE tools.
24Copyright (c) 2004 Ulf Schenk 24Copyright (c) 2004 Ulf Schenk
25 25
26$Id$ 26$Id$
27*/ 27*/
28 28
29#include <klocale.h> 29#include <klocale.h>
30#include <kconfig.h> 30#include <kconfig.h>
31#include <kconfigbase.h> 31#include <kconfigbase.h>
32#include <kglobal.h> 32#include <kglobal.h>
33 33
34#include "field.h" 34#include "field.h"
35#include "resource.h" 35#include "resource.h"
36 36
37using namespace KABC; 37using namespace KABC;
38 38
39class Field::FieldImpl 39class Field::FieldImpl
40{ 40{
41 public: 41 public:
42 FieldImpl( int fieldId, int category = 0, 42 FieldImpl( int fieldId, int category = 0,
43 const QString &label = QString::null, 43 const QString &label = QString::null,
44 const QString &key = QString::null, 44 const QString &key = QString::null,
45 const QString &app = QString::null ) 45 const QString &app = QString::null )
46 : mFieldId( fieldId ), mCategory( category ), mLabel( label ), 46 : mFieldId( fieldId ), mCategory( category ), mLabel( label ),
47 mKey( key ), mApp( app ) {} 47 mKey( key ), mApp( app ) {}
48 48
49 enum FieldId 49 enum FieldId
50 { 50 {
51 CustomField, 51 CustomField,
52 FormattedName, 52 FormattedName,
53 FamilyName, 53 FamilyName,
54 GivenName, 54 GivenName,
55 AdditionalName, 55 AdditionalName,
56 Prefix, 56 Prefix,
57 Suffix, 57 Suffix,
58 NickName, 58 NickName,
59 Birthday, 59 Birthday,
60 Category, 60 Category,
61 HomeAddressStreet, 61 HomeAddressStreet,
62 HomeAddressLocality, 62 HomeAddressLocality,
63 HomeAddressRegion, 63 HomeAddressRegion,
64 HomeAddressPostalCode, 64 HomeAddressPostalCode,
65 HomeAddressCountry, 65 HomeAddressCountry,
66 HomeAddressLabel, 66 HomeAddressLabel,
67 BusinessAddressStreet, 67 BusinessAddressStreet,
68 BusinessAddressLocality, 68 BusinessAddressLocality,
69 BusinessAddressRegion, 69 BusinessAddressRegion,
70 BusinessAddressPostalCode, 70 BusinessAddressPostalCode,
71 BusinessAddressCountry, 71 BusinessAddressCountry,
72 BusinessAddressLabel, 72 BusinessAddressLabel,
73 HomePhone, 73 HomePhone,
74 BusinessPhone, 74 BusinessPhone,
75 MobilePhone, 75 MobilePhone,
76 HomeFax, 76 HomeFax,
77 BusinessFax, 77 BusinessFax,
78 CarPhone, 78 CarPhone,
79 Isdn, 79 Isdn,
80 Pager, 80 Pager,
81 Email, 81 Email,
82 Mailer, 82 Mailer,
83 Title, 83 Title,
84 Role, 84 Role,
85 Organization, 85 Organization,
86 Note, 86 Note,
87 Url, 87 Url,
88 Resource, 88 Resource,
89 Sip, 89 Sip,
90 MobileWorkPhone, 90 MobileWorkPhone,
91 MobileHomePhone 91 MobileHomePhone
92 }; 92 };
93 93
94 int fieldId() { return mFieldId; } 94 int fieldId() { return mFieldId; }
95 int category() { return mCategory; } 95 int category() { return mCategory; }
96 96
97 QString label() { return mLabel; } 97 QString label() { return mLabel; }
98 QString key() { return mKey; } 98 QString key() { return mKey; }
99 QString app() { return mApp; } 99 QString app() { return mApp; }
100 100
101 private: 101 private:
102 int mFieldId; 102 int mFieldId;
103 int mCategory; 103 int mCategory;
104 104
105 QString mLabel; 105 QString mLabel;
106 QString mKey; 106 QString mKey;
107 QString mApp; 107 QString mApp;
108}; 108};
109 109
110 110
111Field::List Field::mAllFields; 111Field::List Field::mAllFields;
112Field::List Field::mDefaultFields; 112Field::List Field::mDefaultFields;
113Field::List Field::mCustomFields; 113Field::List Field::mCustomFields;
114 114
115 115
116Field::Field( FieldImpl *impl ) 116Field::Field( FieldImpl *impl )
117{ 117{
118 mImpl = impl; 118 mImpl = impl;
119} 119}
120 120
121Field::~Field() 121Field::~Field()
122{ 122{
123 delete mImpl; 123 delete mImpl;
124} 124}
125 125
126QString Field::label() 126QString Field::label()
127{ 127{
128 switch ( mImpl->fieldId() ) { 128 switch ( mImpl->fieldId() ) {
129 case FieldImpl::FormattedName: 129 case FieldImpl::FormattedName:
130 return Addressee::formattedNameLabel(); 130 return Addressee::formattedNameLabel();
131 case FieldImpl::FamilyName: 131 case FieldImpl::FamilyName:
132 return Addressee::familyNameLabel(); 132 return Addressee::familyNameLabel();
133 case FieldImpl::GivenName: 133 case FieldImpl::GivenName:
134 return Addressee::givenNameLabel(); 134 return Addressee::givenNameLabel();
135 case FieldImpl::AdditionalName: 135 case FieldImpl::AdditionalName:
136 return Addressee::additionalNameLabel(); 136 return Addressee::additionalNameLabel();
137 case FieldImpl::Prefix: 137 case FieldImpl::Prefix:
138 return Addressee::prefixLabel(); 138 return Addressee::prefixLabel();
139 case FieldImpl::Suffix: 139 case FieldImpl::Suffix:
140 return Addressee::suffixLabel(); 140 return Addressee::suffixLabel();
141 case FieldImpl::NickName: 141 case FieldImpl::NickName:
142 return Addressee::nickNameLabel(); 142 return Addressee::nickNameLabel();
143 case FieldImpl::Birthday: 143 case FieldImpl::Birthday:
144 return Addressee::birthdayLabel(); 144 return Addressee::birthdayLabel();
145 case FieldImpl::HomeAddressStreet: 145 case FieldImpl::HomeAddressStreet:
146 return Addressee::homeAddressStreetLabel(); 146 return Addressee::homeAddressStreetLabel();
147 case FieldImpl::HomeAddressLocality: 147 case FieldImpl::HomeAddressLocality:
148 return Addressee::homeAddressLocalityLabel(); 148 return Addressee::homeAddressLocalityLabel();
149 case FieldImpl::HomeAddressRegion: 149 case FieldImpl::HomeAddressRegion:
150 return Addressee::homeAddressRegionLabel(); 150 return Addressee::homeAddressRegionLabel();
151 case FieldImpl::HomeAddressPostalCode: 151 case FieldImpl::HomeAddressPostalCode:
152 return Addressee::homeAddressPostalCodeLabel(); 152 return Addressee::homeAddressPostalCodeLabel();
153 case FieldImpl::HomeAddressCountry: 153 case FieldImpl::HomeAddressCountry:
154 return Addressee::homeAddressCountryLabel(); 154 return Addressee::homeAddressCountryLabel();
155 case FieldImpl::HomeAddressLabel: 155 case FieldImpl::HomeAddressLabel:
156 return Addressee::homeAddressLabelLabel(); 156 return Addressee::homeAddressLabelLabel();
157 case FieldImpl::BusinessAddressStreet: 157 case FieldImpl::BusinessAddressStreet:
158 return Addressee::businessAddressStreetLabel(); 158 return Addressee::businessAddressStreetLabel();
159 case FieldImpl::BusinessAddressLocality: 159 case FieldImpl::BusinessAddressLocality:
160 return Addressee::businessAddressLocalityLabel(); 160 return Addressee::businessAddressLocalityLabel();
161 case FieldImpl::BusinessAddressRegion: 161 case FieldImpl::BusinessAddressRegion:
162 return Addressee::businessAddressRegionLabel(); 162 return Addressee::businessAddressRegionLabel();
163 case FieldImpl::BusinessAddressPostalCode: 163 case FieldImpl::BusinessAddressPostalCode:
164 return Addressee::businessAddressPostalCodeLabel(); 164 return Addressee::businessAddressPostalCodeLabel();
165 case FieldImpl::BusinessAddressCountry: 165 case FieldImpl::BusinessAddressCountry:
166 return Addressee::businessAddressCountryLabel(); 166 return Addressee::businessAddressCountryLabel();
167 case FieldImpl::BusinessAddressLabel: 167 case FieldImpl::BusinessAddressLabel:
168 return Addressee::businessAddressLabelLabel(); 168 return Addressee::businessAddressLabelLabel();
169 case FieldImpl::HomePhone: 169 case FieldImpl::HomePhone:
170 return Addressee::homePhoneLabel(); 170 return Addressee::homePhoneLabel();
171 case FieldImpl::BusinessPhone: 171 case FieldImpl::BusinessPhone:
172 return Addressee::businessPhoneLabel(); 172 return Addressee::businessPhoneLabel();
173 case FieldImpl::MobilePhone: 173 case FieldImpl::MobilePhone:
174 return Addressee::mobilePhoneLabel(); 174 return Addressee::mobilePhoneLabel();
175 case FieldImpl::MobileHomePhone: 175 case FieldImpl::MobileHomePhone:
176 return Addressee::mobileHomePhoneLabel(); 176 return Addressee::mobileHomePhoneLabel();
177 case FieldImpl::MobileWorkPhone: 177 case FieldImpl::MobileWorkPhone:
178 return Addressee::mobileWorkPhoneLabel(); 178 return Addressee::mobileWorkPhoneLabel();
179 case FieldImpl::HomeFax: 179 case FieldImpl::HomeFax:
180 return Addressee::homeFaxLabel(); 180 return Addressee::homeFaxLabel();
181 case FieldImpl::BusinessFax: 181 case FieldImpl::BusinessFax:
182 return Addressee::businessFaxLabel(); 182 return Addressee::businessFaxLabel();
183 case FieldImpl::CarPhone: 183 case FieldImpl::CarPhone:
184 return Addressee::carPhoneLabel(); 184 return Addressee::carPhoneLabel();
185 case FieldImpl::Isdn: 185 case FieldImpl::Isdn:
186 return Addressee::isdnLabel(); 186 return Addressee::isdnLabel();
187 case FieldImpl::Pager: 187 case FieldImpl::Pager:
188 return Addressee::pagerLabel(); 188 return Addressee::pagerLabel();
189 case FieldImpl::Email: 189 case FieldImpl::Email:
190 return Addressee::emailLabel(); 190 return Addressee::emailLabel();
191 case FieldImpl::Mailer: 191 case FieldImpl::Mailer:
192 return Addressee::mailerLabel(); 192 return Addressee::mailerLabel();
193 case FieldImpl::Title: 193 case FieldImpl::Title:
194 return Addressee::titleLabel(); 194 return Addressee::titleLabel();
195 case FieldImpl::Role: 195 case FieldImpl::Role:
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 );
409 createField( FieldImpl::Prefix ); 409 createField( FieldImpl::Prefix );
410 createField( FieldImpl::Suffix ); 410 createField( FieldImpl::Suffix );
411 createField( FieldImpl::NickName, Personal ); 411 createField( FieldImpl::NickName, Personal );
412 createField( FieldImpl::Birthday, Personal ); 412 createField( FieldImpl::Birthday, Personal );
413 createField( FieldImpl::Category ); 413 createField( FieldImpl::Category );
414 createField( FieldImpl::HomeAddressStreet, Address|Personal ); 414 createField( FieldImpl::HomeAddressStreet, Address|Personal );
415 createField( FieldImpl::HomeAddressLocality, Address|Personal ); 415 createField( FieldImpl::HomeAddressLocality, Address|Personal );
416 createField( FieldImpl::HomeAddressRegion, Address|Personal ); 416 createField( FieldImpl::HomeAddressRegion, Address|Personal );
417 createField( FieldImpl::HomeAddressPostalCode, Address|Personal ); 417 createField( FieldImpl::HomeAddressPostalCode, Address|Personal );
418 createField( FieldImpl::HomeAddressCountry, Address|Personal ); 418 createField( FieldImpl::HomeAddressCountry, Address|Personal );
419 createField( FieldImpl::HomeAddressLabel, Address|Personal ); 419 createField( FieldImpl::HomeAddressLabel, Address|Personal );
420 createField( FieldImpl::BusinessAddressStreet, Address|Organization ); 420 createField( FieldImpl::BusinessAddressStreet, Address|Organization );
421 createField( FieldImpl::BusinessAddressLocality, Address|Organization ); 421 createField( FieldImpl::BusinessAddressLocality, Address|Organization );
422 createField( FieldImpl::BusinessAddressRegion, Address|Organization ); 422 createField( FieldImpl::BusinessAddressRegion, Address|Organization );
423 createField( FieldImpl::BusinessAddressPostalCode, Address|Organization ); 423 createField( FieldImpl::BusinessAddressPostalCode, Address|Organization );
424 createField( FieldImpl::BusinessAddressCountry, Address|Organization ); 424 createField( FieldImpl::BusinessAddressCountry, Address|Organization );
425 createField( FieldImpl::BusinessAddressLabel, Address|Organization ); 425 createField( FieldImpl::BusinessAddressLabel, Address|Organization );
426 createField( FieldImpl::HomePhone, Personal|Frequent ); 426 createField( FieldImpl::HomePhone, Personal|Frequent );
427 createField( FieldImpl::BusinessPhone, Organization|Frequent ); 427 createField( FieldImpl::BusinessPhone, Organization|Frequent );
428 createField( FieldImpl::MobilePhone, Frequent ); 428 createField( FieldImpl::MobilePhone, Frequent );
429 createField( FieldImpl::MobileHomePhone, Frequent ); 429 createField( FieldImpl::MobileHomePhone, Frequent );
430 createField( FieldImpl::MobileWorkPhone, Frequent ); 430 createField( FieldImpl::MobileWorkPhone, Frequent );
431 createField( FieldImpl::HomeFax ); 431 createField( FieldImpl::HomeFax );
432 createField( FieldImpl::BusinessFax ); 432 createField( FieldImpl::BusinessFax );
433 createField( FieldImpl::CarPhone ); 433 createField( FieldImpl::CarPhone );
434 createField( FieldImpl::Isdn ); 434 createField( FieldImpl::Isdn );
435 createField( FieldImpl::Pager ); 435 createField( FieldImpl::Pager );
436 createField( FieldImpl::Email, Email|Frequent ); 436 createField( FieldImpl::Email, Email|Frequent );
437 createField( FieldImpl::Mailer, Email ); 437 createField( FieldImpl::Mailer, Email );
438 createField( FieldImpl::Title, Organization ); 438 createField( FieldImpl::Title, Organization );
439 createField( FieldImpl::Role, Organization ); 439 createField( FieldImpl::Role, Organization );
440 createField( FieldImpl::Organization, Organization ); 440 createField( FieldImpl::Organization, Organization );
441 createField( FieldImpl::Note ); 441 createField( FieldImpl::Note );
442 createField( FieldImpl::Url ); 442 createField( FieldImpl::Url );
443 createField( FieldImpl::Resource ); 443 createField( FieldImpl::Resource );
444 createField( FieldImpl::Sip ); 444 createField( FieldImpl::Sip );
445 } 445 }
446 446
447 return mAllFields; 447 return mAllFields;
448} 448}
449 449
450Field::List Field::defaultFields() 450Field::List Field::defaultFields()
451{ 451{
452 if ( mDefaultFields.isEmpty() ) { 452 if ( mDefaultFields.isEmpty() ) {
453 createDefaultField( FieldImpl::GivenName ); 453 createDefaultField( FieldImpl::GivenName );
454 createDefaultField( FieldImpl::FamilyName ); 454 createDefaultField( FieldImpl::FamilyName );
455 createDefaultField( FieldImpl::Email ); 455 createDefaultField( FieldImpl::Email );
456 } 456 }
457 457
458 return mDefaultFields; 458 return mDefaultFields;
459} 459}
460 460
461void Field::createField( int id, int category ) 461void Field::createField( int id, int category )
462{ 462{
463 mAllFields.append( new Field( new FieldImpl( id, category ) ) ); 463 mAllFields.append( new Field( new FieldImpl( id, category ) ) );
464} 464}
465 465
466void Field::createDefaultField( int id, int category ) 466void Field::createDefaultField( int id, int category )
467{ 467{
468 mDefaultFields.append( new Field( new FieldImpl( id, category ) ) ); 468 mDefaultFields.append( new Field( new FieldImpl( id, category ) ) );
469} 469}
470 470
471void Field::deleteFields() 471void Field::deleteFields()
472{ 472{
473 Field::List::ConstIterator it; 473 Field::List::ConstIterator it;
474 474
475 for( it = mAllFields.begin(); it != mAllFields.end(); ++it ) { 475 for( it = mAllFields.begin(); it != mAllFields.end(); ++it ) {
476 delete (*it); 476 delete (*it);
477 } 477 }
478 mAllFields.clear(); 478 mAllFields.clear();
479 479
480 for( it = mDefaultFields.begin(); it != mDefaultFields.end(); ++it ) { 480 for( it = mDefaultFields.begin(); it != mDefaultFields.end(); ++it ) {
481 delete (*it); 481 delete (*it);
482 } 482 }
483 mDefaultFields.clear(); 483 mDefaultFields.clear();
484 484
485 for( it = mCustomFields.begin(); it != mCustomFields.end(); ++it ) { 485 for( it = mCustomFields.begin(); it != mCustomFields.end(); ++it ) {
486 delete (*it); 486 delete (*it);
487 } 487 }
488 mCustomFields.clear(); 488 mCustomFields.clear();
489} 489}
490 490
491void Field::saveFields( const QString &identifier, 491void Field::saveFields( const QString &identifier,
492 const Field::List &fields ) 492 const Field::List &fields )
493{ 493{
494 KConfig *cfg = KGlobal::config(); 494 KConfig *cfg = KGlobal::config();
495 KConfigGroupSaver( cfg, "KABCFields" ); 495 KConfigGroupSaver( cfg, "KABCFields" );
496 saveFields( cfg, identifier, fields ); 496 saveFields( cfg, identifier, fields );
497} 497}
498 498
499void Field::saveFields( KConfig *cfg, const QString &identifier, 499void Field::saveFields( KConfig *cfg, const QString &identifier,
500 const Field::List &fields ) 500 const Field::List &fields )
501{ 501{
502 QValueList<int> fieldIds; 502 QValueList<int> fieldIds;
503 503
504//US 504//US
505// qDebug("Field::saveFields to %s %s", cfg->getFileName().latin1(), identifier.latin1()); 505// qDebug("Field::saveFields to %s %s", cfg->getFileName().latin1(), identifier.latin1());
506 506
507 int custom = 0; 507 int custom = 0;
508 Field::List::ConstIterator it; 508 Field::List::ConstIterator it;
509 for( it = fields.begin(); it != fields.end(); ++it ) { 509 for( it = fields.begin(); it != fields.end(); ++it ) {
510//US 510//US
511// qDebug("Field::saveFields field:%i", (*it)->mImpl->fieldId()); 511// qDebug("Field::saveFields field:%i", (*it)->mImpl->fieldId());
512 512
513 fieldIds.append( (*it)->mImpl->fieldId() ); 513 fieldIds.append( (*it)->mImpl->fieldId() );
514 if( (*it)->isCustom() ) { 514 if( (*it)->isCustom() ) {
515 QStringList customEntry; 515 QStringList customEntry;
516 customEntry << (*it)->mImpl->label(); 516 customEntry << (*it)->mImpl->label();
517 customEntry << (*it)->mImpl->key(); 517 customEntry << (*it)->mImpl->key();
518 customEntry << (*it)->mImpl->app(); 518 customEntry << (*it)->mImpl->app();
519 cfg->writeEntry( "KABC_CustomEntry_" + identifier + "_" + 519 cfg->writeEntry( "KABC_CustomEntry_" + identifier + "_" +
520 QString::number( custom++ ), customEntry ); 520 QString::number( custom++ ), customEntry );
521 } 521 }
522 } 522 }
523 cfg->writeEntry( identifier, fieldIds ); 523 cfg->writeEntry( identifier, fieldIds );
524} 524}
525 525
526Field::List Field::restoreFields( const QString &identifier ) 526Field::List Field::restoreFields( const QString &identifier )
527{ 527{
528//US 528//US
529// qDebug("Field::restoreFields, identifier: %s", identifier.latin1()); 529// qDebug("Field::restoreFields, identifier: %s", identifier.latin1());
530 530
531 KConfig *cfg = KGlobal::config(); 531 KConfig *cfg = KGlobal::config();
532 KConfigGroupSaver( cfg, "KABCFields" ); 532 KConfigGroupSaver( cfg, "KABCFields" );
533 cfg->setGroup( "KABCFields" ); 533 cfg->setGroup( "KABCFields" );
534 534
535 Field::List l = restoreFields( cfg, identifier ); 535 Field::List l = restoreFields( cfg, identifier );
536 536
537 return l; 537 return l;
538} 538}
539 539
540Field::List Field::restoreFields( KConfig *cfg, const QString &identifier ) 540Field::List Field::restoreFields( KConfig *cfg, const QString &identifier )
541{ 541{
542 QValueList<int> fieldIds = cfg->readIntListEntry( identifier); 542 QValueList<int> fieldIds = cfg->readIntListEntry( identifier);
543//US 543//US
544// qDebug("Field::restoreFields from %s, identifier: %s", cfg->getFileName().latin1(), identifier.latin1()); 544// qDebug("Field::restoreFields from %s, identifier: %s", cfg->getFileName().latin1(), identifier.latin1());
545 545
546 Field::List fields; 546 Field::List fields;
547 547
548 int custom = 0; 548 int custom = 0;
549 QValueList<int>::ConstIterator it; 549 QValueList<int>::ConstIterator it;
550 for( it = fieldIds.begin(); it != fieldIds.end(); ++it ) { 550 for( it = fieldIds.begin(); it != fieldIds.end(); ++it ) {
551 FieldImpl *f = 0; 551 FieldImpl *f = 0;
552 if ( (*it) == FieldImpl::CustomField ) { 552 if ( (*it) == FieldImpl::CustomField ) {
553 QStringList customEntry = cfg->readListEntry( "KABC_CustomEntry_" + 553 QStringList customEntry = cfg->readListEntry( "KABC_CustomEntry_" +
554 identifier + "_" + 554 identifier + "_" +
555 QString::number( custom++ ) ); 555 QString::number( custom++ ) );
556 f = new FieldImpl( *it, CustomCategory, customEntry[ 0 ], 556 f = new FieldImpl( *it, CustomCategory, customEntry[ 0 ],
557 customEntry[ 1 ], customEntry[ 2 ] ); 557 customEntry[ 1 ], customEntry[ 2 ] );
558 } else { 558 } else {
559 f = new FieldImpl( *it ); 559 f = new FieldImpl( *it );
560 } 560 }
561 fields.append( new Field( f ) ); 561 fields.append( new Field( f ) );
562 } 562 }
563 563
564 return fields; 564 return fields;
565} 565}
566 566
567bool Field::equals( Field *field ) 567bool Field::equals( Field *field )
568{ 568{
569 bool sameId = ( mImpl->fieldId() == field->mImpl->fieldId() ); 569 bool sameId = ( mImpl->fieldId() == field->mImpl->fieldId() );
570 570
571 if ( !sameId ) return false; 571 if ( !sameId ) return false;
572 572
573 if ( mImpl->fieldId() != FieldImpl::CustomField ) return true; 573 if ( mImpl->fieldId() != FieldImpl::CustomField ) return true;
574 574
575 return mImpl->key() == field->mImpl->key(); 575 return mImpl->key() == field->mImpl->key();
576} 576}
577 577
578Field *Field::createCustomField( const QString &label, int category, 578Field *Field::createCustomField( const QString &label, int category,
579 const QString &key, const QString &app ) 579 const QString &key, const QString &app )
580{ 580{
581 Field *field = new Field( new FieldImpl( FieldImpl::CustomField, 581 Field *field = new Field( new FieldImpl( FieldImpl::CustomField,
582 category | CustomCategory, 582 category | CustomCategory,
583 label, key, app ) ); 583 label, key, app ) );
584//US 584//US
585// qDebug("Field::createCustomField label %s", label.latin1() ); 585// qDebug("Field::createCustomField label %s", label.latin1() );
586 586
587 mCustomFields.append( field ); 587 mCustomFields.append( field );
588 588
589 return field; 589 return field;
590} 590}
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
@@ -1,609 +1,607 @@
1/* 1/*
2 This file is part of libkabc. 2 This file is part of libkabc.
3 Copyright (c) 2001 Mark Westcott <mark@houseoffish.org> 3 Copyright (c) 2001 Mark Westcott <mark@houseoffish.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 <qmap.h> 28#include <qmap.h>
29#include <qregexp.h> 29#include <qregexp.h>
30#include <kmdcodec.h> 30#include <kmdcodec.h>
31 31
32#include "vcard21parser.h" 32#include "vcard21parser.h"
33#include "vcardconverter.h" 33#include "vcardconverter.h"
34 34
35using namespace KABC; 35using namespace KABC;
36 36
37bool VCardLineX::isValid() const 37bool VCardLineX::isValid() const
38{ 38{
39 // Invalid: if it is "begin:vcard" or "end:vcard" 39 // Invalid: if it is "begin:vcard" or "end:vcard"
40 if ( name == VCARD_BEGIN_N || name == VCARD_END_N ) 40 if ( name == VCARD_BEGIN_N || name == VCARD_END_N )
41 return false; 41 return false;
42 42
43 if ( name[0] == 'x' && name[1] == '-' ) // A custom x- line 43 if ( name[0] == 'x' && name[1] == '-' ) // A custom x- line
44 return true; 44 return true;
45 45
46 // This is long but it makes it a bit faster (and saves me from using 46 // This is long but it makes it a bit faster (and saves me from using
47 // a tree which is probably the ideal situation, but a bit memory heavy) 47 // a tree which is probably the ideal situation, but a bit memory heavy)
48 switch( name[0] ) { 48 switch( name[0] ) {
49 case 'a': 49 case 'a':
50 if ( name == VCARD_ADR && qualified && 50 if ( name == VCARD_ADR && qualified &&
51 (qualifiers.contains(VCARD_ADR_DOM) || 51 (qualifiers.contains(VCARD_ADR_DOM) ||
52 qualifiers.contains(VCARD_ADR_INTL) || 52 qualifiers.contains(VCARD_ADR_INTL) ||
53 qualifiers.contains(VCARD_ADR_POSTAL) || 53 qualifiers.contains(VCARD_ADR_POSTAL) ||
54 qualifiers.contains(VCARD_ADR_HOME) || 54 qualifiers.contains(VCARD_ADR_HOME) ||
55 qualifiers.contains(VCARD_ADR_WORK) || 55 qualifiers.contains(VCARD_ADR_WORK) ||
56 qualifiers.contains(VCARD_ADR_PREF) 56 qualifiers.contains(VCARD_ADR_PREF)
57 ) ) 57 ) )
58 return true; 58 return true;
59 59
60 if ( name == VCARD_AGENT ) 60 if ( name == VCARD_AGENT )
61 return true; 61 return true;
62 break; 62 break;
63 63
64 case 'b': 64 case 'b':
65 if ( name == VCARD_BDAY ) 65 if ( name == VCARD_BDAY )
66 return true; 66 return true;
67 break; 67 break;
68 68
69 case 'c': 69 case 'c':
70 if ( name == VCARD_CATEGORIES ) 70 if ( name == VCARD_CATEGORIES )
71 return true; 71 return true;
72 if ( name == VCARD_CLASS && qualified && 72 if ( name == VCARD_CLASS && qualified &&
73 (qualifiers.contains(VCARD_CLASS_PUBLIC) || 73 (qualifiers.contains(VCARD_CLASS_PUBLIC) ||
74 qualifiers.contains(VCARD_CLASS_PRIVATE) || 74 qualifiers.contains(VCARD_CLASS_PRIVATE) ||
75 qualifiers.contains(VCARD_CLASS_CONFIDENTIAL) 75 qualifiers.contains(VCARD_CLASS_CONFIDENTIAL)
76 ) ) 76 ) )
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
408VCard21ParserImpl *VCard21ParserImpl::parseVCard( const QString& vc, int *err ) 406VCard21ParserImpl *VCard21ParserImpl::parseVCard( const QString& vc, int *err )
409{ 407{
410 int _err = 0; 408 int _err = 0;
411 int _state = VC_STATE_BEGIN; 409 int _state = VC_STATE_BEGIN;
412 410
413 QValueList<VCardLineX> *_vcdata; 411 QValueList<VCardLineX> *_vcdata;
414 QValueList<QString> lines; 412 QValueList<QString> lines;
415 413
416 _vcdata = new QValueList<VCardLineX>; 414 _vcdata = new QValueList<VCardLineX>;
417 415
418 lines = QStringList::split( QRegExp( "[\x0d\x0a]" ), vc ); 416 lines = QStringList::split( QRegExp( "[\x0d\x0a]" ), vc );
419 417
420 // for each line in the vCard 418 // for each line in the vCard
421 for ( QStringList::Iterator j = lines.begin(); j != lines.end(); ++j ) { 419 for ( QStringList::Iterator j = lines.begin(); j != lines.end(); ++j ) {
422 VCardLineX _vcl; 420 VCardLineX _vcl;
423 421
424 // take spaces off the end - ugly but necessary hack 422 // take spaces off the end - ugly but necessary hack
425 for ( int g = (*j).length()-1; g > 0 && (*j)[g].isSpace(); --g ) 423 for ( int g = (*j).length()-1; g > 0 && (*j)[g].isSpace(); --g )
426 (*j)[g] = 0; 424 (*j)[g] = 0;
427 425
428 // first token: 426 // first token:
429 // verify state, update if necessary 427 // verify state, update if necessary
430 if ( _state & VC_STATE_BEGIN) { 428 if ( _state & VC_STATE_BEGIN) {
431 if ( !qstricmp( (*j).latin1(), VCARD_BEGIN ) ) { 429 if ( !qstricmp( (*j).latin1(), VCARD_BEGIN ) ) {
432 _state = VC_STATE_BODY; 430 _state = VC_STATE_BODY;
433 continue; 431 continue;
434 } else { 432 } else {
435 _err = VC_ERR_NO_BEGIN; 433 _err = VC_ERR_NO_BEGIN;
436 break; 434 break;
437 } 435 }
438 } else if ( _state & VC_STATE_BODY ) { 436 } else if ( _state & VC_STATE_BODY ) {
439 if ( !qstricmp( (*j).latin1(), VCARD_END ) ) { 437 if ( !qstricmp( (*j).latin1(), VCARD_END ) ) {
440 _state |= VC_STATE_END; 438 _state |= VC_STATE_END;
441 break; 439 break;
442 } 440 }
443 441
444 // split into two tokens 442 // split into two tokens
445 int colon = (*j).find( ':' ); 443 int colon = (*j).find( ':' );
446 if ( colon < 0 ) { 444 if ( colon < 0 ) {
447 _err = VC_ERR_INVALID_LINE; 445 _err = VC_ERR_INVALID_LINE;
448 break; 446 break;
449 } 447 }
450 448
451 QString key = (*j).left( colon ); 449 QString key = (*j).left( colon );
452 QString value = (*j).mid( colon + 1 ); 450 QString value = (*j).mid( colon + 1 );
453 451
454 // check for qualifiers and 452 // check for qualifiers and
455 // set name, qualified, qualifier(s) 453 // set name, qualified, qualifier(s)
456 QStringList keyTokens = QStringList::split( ';', key ); 454 QStringList keyTokens = QStringList::split( ';', key );
457 bool qp = false, first_pass = true; 455 bool qp = false, first_pass = true;
458 bool b64 = false; 456 bool b64 = false;
459 457
460 if ( keyTokens.count() > 0 ) { 458 if ( keyTokens.count() > 0 ) {
461 _vcl.qualified = false; 459 _vcl.qualified = false;
462 _vcl.name = keyTokens[ 0 ].lower(); 460 _vcl.name = keyTokens[ 0 ].lower();
463 461
464 for ( QStringList::Iterator z = keyTokens.begin(); z != keyTokens.end(); ++z ) { 462 for ( QStringList::Iterator z = keyTokens.begin(); z != keyTokens.end(); ++z ) {
465 QString zz = (*z).lower(); 463 QString zz = (*z).lower();
466 if ( zz == VCARD_QUOTED_PRINTABLE || zz == VCARD_ENCODING_QUOTED_PRINTABLE ) { 464 if ( zz == VCARD_QUOTED_PRINTABLE || zz == VCARD_ENCODING_QUOTED_PRINTABLE ) {
467 qp = true; 465 qp = true;
468 } else if ( zz == VCARD_BASE64 ) { 466 } else if ( zz == VCARD_BASE64 ) {
469 b64 = true; 467 b64 = true;
470 } else if ( !first_pass ) { 468 } else if ( !first_pass ) {
471 _vcl.qualified = true; 469 _vcl.qualified = true;
472 _vcl.qualifiers.append( zz ); 470 _vcl.qualifiers.append( zz );
473 } 471 }
474 first_pass = false; 472 first_pass = false;
475 } 473 }
476 } else { 474 } else {
477 _err = VC_ERR_INVALID_LINE; 475 _err = VC_ERR_INVALID_LINE;
478 } 476 }
479 477
480 if ( _err != 0 ) 478 if ( _err != 0 )
481 break; 479 break;
482 480
483 if ( _vcl.name == VCARD_VERSION ) 481 if ( _vcl.name == VCARD_VERSION )
484 _state |= VC_STATE_HAVE_VERSION; 482 _state |= VC_STATE_HAVE_VERSION;
485 483
486 if ( _vcl.name == VCARD_N || _vcl.name == VCARD_FN ) 484 if ( _vcl.name == VCARD_N || _vcl.name == VCARD_FN )
487 _state |= VC_STATE_HAVE_N; 485 _state |= VC_STATE_HAVE_N;
488 486
489 // second token: 487 // second token:
490 // split into tokens by ; 488 // split into tokens by ;
491 // add to parameters vector 489 // add to parameters vector
492 if ( b64 ) { 490 if ( b64 ) {
493 if ( value.at( value.length() - 1 ) != '=' ) 491 if ( value.at( value.length() - 1 ) != '=' )
494 do { 492 do {
495 value += *( ++j ); 493 value += *( ++j );
496 } while ( (*j).at( (*j).length() - 1 ) != '=' ); 494 } while ( (*j).at( (*j).length() - 1 ) != '=' );
497 } else { 495 } else {
498 if ( qp ) { // join any split lines 496 if ( qp ) { // join any split lines
499 while ( value.at( value.length() - 1 ) == '=' ) { 497 while ( value.at( value.length() - 1 ) == '=' ) {
500 value.remove( value.length() - 1, 1 ); 498 value.remove( value.length() - 1, 1 );
501 value.append(*( ++j )); 499 value.append(*( ++j ));
502 } 500 }
503 } 501 }
504 _vcl.parameters = QStringList::split( ';', value, true ); 502 _vcl.parameters = QStringList::split( ';', value, true );
505 if ( qp ) { // decode the quoted printable 503 if ( qp ) { // decode the quoted printable
506 for ( QStringList::Iterator z = _vcl.parameters.begin(); z != _vcl.parameters.end(); ++z ) 504 for ( QStringList::Iterator z = _vcl.parameters.begin(); z != _vcl.parameters.end(); ++z )
507 *z = KCodecs::quotedPrintableDecode( (*z).latin1() ); 505 *z = KCodecs::quotedPrintableDecode( (*z).latin1() );
508 } 506 }
509 } 507 }
510 } else { 508 } else {
511 _err = VC_ERR_INTERNAL; 509 _err = VC_ERR_INTERNAL;
512 break; 510 break;
513 } 511 }
514 512
515 // validate VCardLineX 513 // validate VCardLineX
516 if ( !_vcl.isValid() ) { 514 if ( !_vcl.isValid() ) {
517 _err = VC_ERR_INVALID_LINE; 515 _err = VC_ERR_INVALID_LINE;
518 break; 516 break;
519 } 517 }
520 518
521 // add to vector 519 // add to vector
522 _vcdata->append( _vcl ); 520 _vcdata->append( _vcl );
523 } 521 }
524 522
525 // errors to check at the last minute (exit state related) 523 // errors to check at the last minute (exit state related)
526 if ( _err == 0 ) { 524 if ( _err == 0 ) {
527 if ( !( _state & VC_STATE_END ) ) // we have to have an end!! 525 if ( !( _state & VC_STATE_END ) ) // we have to have an end!!
528 _err = VC_ERR_NO_END; 526 _err = VC_ERR_NO_END;
529 527
530 if ( !( _state & VC_STATE_HAVE_N ) || // we have to have the mandatories! 528 if ( !( _state & VC_STATE_HAVE_N ) || // we have to have the mandatories!
531 !( _state & VC_STATE_HAVE_VERSION ) ) 529 !( _state & VC_STATE_HAVE_VERSION ) )
532 _err = VC_ERR_MISSING_MANDATORY; 530 _err = VC_ERR_MISSING_MANDATORY;
533 } 531 }
534 532
535 // set the error message if we can, and only return an object 533 // set the error message if we can, and only return an object
536 // if the vCard was valid. 534 // if the vCard was valid.
537 if ( err ) 535 if ( err )
538 *err = _err; 536 *err = _err;
539 537
540 if ( _err != 0 ) { 538 if ( _err != 0 ) {
541 delete _vcdata; 539 delete _vcdata;
542 return 0; 540 return 0;
543 } 541 }
544 542
545 return new VCard21ParserImpl( _vcdata ); 543 return new VCard21ParserImpl( _vcdata );
546} 544}
547 545
548VCard21ParserImpl::VCard21ParserImpl(QValueList<VCardLineX> *_vcd) : _vcdata(_vcd) 546VCard21ParserImpl::VCard21ParserImpl(QValueList<VCardLineX> *_vcd) : _vcdata(_vcd)
549{ 547{
550} 548}
551 549
552 550
553QString VCard21ParserImpl::getValue(const QString& name, const QString& qualifier) 551QString VCard21ParserImpl::getValue(const QString& name, const QString& qualifier)
554{ 552{
555 QString failed; 553 QString failed;
556 const QString lowname = name.lower(); 554 const QString lowname = name.lower();
557 const QString lowqualifier = qualifier.lower(); 555 const QString lowqualifier = qualifier.lower();
558 556
559 for (QValueListIterator<VCardLineX> i = _vcdata->begin();i != _vcdata->end();++i) { 557 for (QValueListIterator<VCardLineX> i = _vcdata->begin();i != _vcdata->end();++i) {
560 if ((*i).name == lowname && (*i).qualified && (*i).qualifiers.contains(lowqualifier)) { 558 if ((*i).name == lowname && (*i).qualified && (*i).qualifiers.contains(lowqualifier)) {
561 if ((*i).parameters.count() > 0) 559 if ((*i).parameters.count() > 0)
562 return (*i).parameters[0]; 560 return (*i).parameters[0];
563 else return failed; 561 else return failed;
564 } 562 }
565 } 563 }
566 return failed; 564 return failed;
567} 565}
568 566
569 567
570QString VCard21ParserImpl::getValue(const QString& name) 568QString VCard21ParserImpl::getValue(const QString& name)
571{ 569{
572 QString failed; 570 QString failed;
573 const QString lowname = name.lower(); 571 const QString lowname = name.lower();
574 572
575 for (QValueListIterator<VCardLineX> i = _vcdata->begin();i != _vcdata->end();++i) { 573 for (QValueListIterator<VCardLineX> i = _vcdata->begin();i != _vcdata->end();++i) {
576 if ((*i).name == lowname && !(*i).qualified) { 574 if ((*i).name == lowname && !(*i).qualified) {
577 if ((*i).parameters.count() > 0) 575 if ((*i).parameters.count() > 0)
578 return (*i).parameters[0]; 576 return (*i).parameters[0];
579 else return failed; 577 else return failed;
580 } 578 }
581 } 579 }
582 return failed; 580 return failed;
583} 581}
584 582
585 583
586QStringList VCard21ParserImpl::getValues(const QString& name) 584QStringList VCard21ParserImpl::getValues(const QString& name)
587{ 585{
588 const QString lowname = name.lower(); 586 const QString lowname = name.lower();
589 for (QValueListIterator<VCardLineX> i = _vcdata->begin();i != _vcdata->end();++i) { 587 for (QValueListIterator<VCardLineX> i = _vcdata->begin();i != _vcdata->end();++i) {
590 if ((*i).name == lowname && !(*i).qualified) 588 if ((*i).name == lowname && !(*i).qualified)
591 return (*i).parameters; 589 return (*i).parameters;
592 } 590 }
593 // failed. 591 // failed.
594 return QStringList(); 592 return QStringList();
595} 593}
596 594
597QStringList VCard21ParserImpl::getValues(const QString& name, const QString& qualifier) 595QStringList VCard21ParserImpl::getValues(const QString& name, const QString& qualifier)
598{ 596{
599 const QString lowname = name.lower(); 597 const QString lowname = name.lower();
600 const QString lowqualifier = qualifier.lower(); 598 const QString lowqualifier = qualifier.lower();
601 for (QValueListIterator<VCardLineX> i = _vcdata->begin();i != _vcdata->end();++i) { 599 for (QValueListIterator<VCardLineX> i = _vcdata->begin();i != _vcdata->end();++i) {
602 if ((*i).name == lowname && (*i).qualified && (*i).qualifiers.contains(lowqualifier)) 600 if ((*i).name == lowname && (*i).qualified && (*i).qualifiers.contains(lowqualifier))
603 return (*i).parameters; 601 return (*i).parameters;
604 } 602 }
605 // failed. 603 // failed.
606 return QStringList(); 604 return QStringList();
607} 605}
608 606
609 607
diff --git a/kabc/vcardformatimpl.cpp b/kabc/vcardformatimpl.cpp
index ec5ed80..26fd4f0 100644
--- a/kabc/vcardformatimpl.cpp
+++ b/kabc/vcardformatimpl.cpp
@@ -1,1037 +1,1035 @@
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 <qfile.h> 28#include <qfile.h>
29#include <qregexp.h> 29#include <qregexp.h>
30#include <qapplication.h> 30#include <qapplication.h>
31 31
32#include <kdebug.h> 32#include <kdebug.h>
33#include <kmdcodec.h> 33#include <kmdcodec.h>
34#include <kstandarddirs.h> 34#include <kstandarddirs.h>
35#include <ktempfile.h> 35#include <ktempfile.h>
36 36
37#include <VCard.h> 37#include <VCard.h>
38 38
39#include "addressbook.h" 39#include "addressbook.h"
40#include "vcardformatimpl.h" 40#include "vcardformatimpl.h"
41 41
42using namespace KABC; 42using namespace KABC;
43using namespace VCARD; 43using namespace VCARD;
44 44
45int VCardFormatImpl::debug = -1; 45int VCardFormatImpl::debug = -1;
46 46
47VCardFormatImpl::VCardFormatImpl() 47VCardFormatImpl::VCardFormatImpl()
48{ 48{
49 debug = (getenv("KABC_DEBUG") != 0); 49 debug = (getenv("KABC_DEBUG") != 0);
50} 50}
51 51
52bool VCardFormatImpl::load( Addressee &addressee, QFile *file ) 52bool VCardFormatImpl::load( Addressee &addressee, QFile *file )
53{ 53{
54 kdDebug(5700) << "VCardFormat::load()" << endl; 54 kdDebug(5700) << "VCardFormat::load()" << endl;
55 55
56 QByteArray fdata = file->readAll(); 56 QByteArray fdata = file->readAll();
57 QCString data(fdata.data(), fdata.size()+1); 57 QCString data(fdata.data(), fdata.size()+1);
58 58
59 VCardEntity e( data ); 59 VCardEntity e( data );
60 60
61 VCardListIterator it( e.cardList() ); 61 VCardListIterator it( e.cardList() );
62 62
63 if ( it.current() ) { 63 if ( it.current() ) {
64//US VCard v(*it.current()); 64//US VCard v(*it.current());
65//US loadAddressee( addressee, v ); 65//US loadAddressee( addressee, v );
66 loadAddressee( addressee, it.current() ); 66 loadAddressee( addressee, it.current() );
67 return true; 67 return true;
68 } 68 }
69 69
70 return false; 70 return false;
71} 71}
72 72
73 73
74#include <kmessagebox.h> 74#include <kmessagebox.h>
75bool VCardFormatImpl::loadAll( AddressBook *addressBook, Resource *resource, QFile *file ) 75bool VCardFormatImpl::loadAll( AddressBook *addressBook, Resource *resource, QFile *file )
76{ 76{
77 77
78 QCString data(file->readAll().data(), file->size()+1); 78 QCString data(file->readAll().data(), file->size()+1);
79 VCardEntity e( data ); 79 VCardEntity e( data );
80 80
81 VCardListIterator it( e.cardList() ); 81 VCardListIterator it( e.cardList() );
82 82
83 for (; it.current(); ++it) { 83 for (; it.current(); ++it) {
84//US VCard v(*it.current()); 84//US VCard v(*it.current());
85 Addressee addressee; 85 Addressee addressee;
86//US loadAddressee( addressee, v ); 86//US loadAddressee( addressee, v );
87 loadAddressee( addressee, it.current() ); 87 loadAddressee( addressee, it.current() );
88 addressee.setResource( resource ); 88 addressee.setResource( resource );
89 addressBook->insertAddressee( addressee ); 89 addressBook->insertAddressee( addressee );
90 if (debug == true) 90 if (debug == true)
91 { 91 {
92 printf("address %s loaded successfully\n", addressee.formattedName().latin1()); 92 printf("address %s loaded successfully\n", addressee.formattedName().latin1());
93 } 93 }
94 } 94 }
95 return true; 95 return true;
96} 96}
97 97
98void VCardFormatImpl::save( const Addressee &addressee, QFile *file ) 98void VCardFormatImpl::save( const Addressee &addressee, QFile *file )
99{ 99{
100 VCardEntity vcards; 100 VCardEntity vcards;
101 VCardList vcardlist; 101 VCardList vcardlist;
102 vcardlist.setAutoDelete( true ); 102 vcardlist.setAutoDelete( true );
103 103
104 VCard *v = new VCard; 104 VCard *v = new VCard;
105 105
106 saveAddressee( addressee, v, false ); 106 saveAddressee( addressee, v, false );
107 107
108 vcardlist.append( v ); 108 vcardlist.append( v );
109 vcards.setCardList( vcardlist ); 109 vcards.setCardList( vcardlist );
110 110
111 QCString vcardData = vcards.asString(); 111 QCString vcardData = vcards.asString();
112 file->writeBlock( (const char*)vcardData, vcardData.length() ); 112 file->writeBlock( (const char*)vcardData, vcardData.length() );
113} 113}
114 114
115void VCardFormatImpl::saveAll( AddressBook *ab, Resource *resource, QFile *file ) 115void VCardFormatImpl::saveAll( AddressBook *ab, Resource *resource, QFile *file )
116{ 116{
117 117
118 AddressBook::Iterator it; 118 AddressBook::Iterator it;
119 for ( it = ab->begin(); it != ab->end(); ++it ) { 119 for ( it = ab->begin(); it != ab->end(); ++it ) {
120 if ( (*it).resource() == resource ) { 120 if ( (*it).resource() == resource ) {
121 save((*it),file); 121 save((*it),file);
122 qApp->processEvents(); 122 qApp->processEvents();
123 (*it).setChanged( false ); 123 (*it).setChanged( false );
124 } 124 }
125 } 125 }
126 // for memory usage status test only 126 // for memory usage status test only
127 // KMessageBox::information ( 0, "Stoppppp", QString("Stop ") ); 127 // KMessageBox::information ( 0, "Stoppppp", QString("Stop ") );
128} 128}
129 129
130bool VCardFormatImpl::loadAddressee( Addressee& addressee, VCard *v ) 130bool VCardFormatImpl::loadAddressee( Addressee& addressee, VCard *v )
131{ 131{
132 QPtrList<ContentLine> contentLines = v->contentLineList(); 132 QPtrList<ContentLine> contentLines = v->contentLineList();
133 ContentLine *cl; 133 ContentLine *cl;
134 134
135 for( cl = contentLines.first(); cl; cl = contentLines.next() ) { 135 for( cl = contentLines.first(); cl; cl = contentLines.next() ) {
136 QCString n = cl->name(); 136 QCString n = cl->name();
137 if ( n.left( 2 ) == "X-" ) { 137 if ( n.left( 2 ) == "X-" ) {
138 n = n.mid( 2 ); 138 n = n.mid( 2 );
139 int posDash = n.find( "-" ); 139 int posDash = n.find( "-" );
140 addressee.insertCustom( QString::fromUtf8( n.left( posDash ) ), 140 addressee.insertCustom( QString::fromUtf8( n.left( posDash ) ),
141 QString::fromUtf8( n.mid( posDash + 1 ) ), 141 QString::fromUtf8( n.mid( posDash + 1 ) ),
142 QString::fromUtf8( cl->value()->asString() ) ); 142 QString::fromUtf8( cl->value()->asString() ) );
143 continue; 143 continue;
144 } 144 }
145 145
146 EntityType type = cl->entityType(); 146 EntityType type = cl->entityType();
147 switch( type ) { 147 switch( type ) {
148 148
149 case EntityUID: 149 case EntityUID:
150 addressee.setUid( readTextValue( cl ) ); 150 addressee.setUid( readTextValue( cl ) );
151 break; 151 break;
152 152
153 case EntityEmail: 153 case EntityEmail:
154 addressee.insertEmail( readTextValue( cl ) ); 154 addressee.insertEmail( readTextValue( cl ) );
155 break; 155 break;
156 156
157 case EntityName: 157 case EntityName:
158 addressee.setName( readTextValue( cl ) ); 158 addressee.setName( readTextValue( cl ) );
159 break; 159 break;
160 160
161 case EntityFullName: 161 case EntityFullName:
162 addressee.setFormattedName( readTextValue( cl ) ); 162 addressee.setFormattedName( readTextValue( cl ) );
163 break; 163 break;
164 164
165 case EntityURL: 165 case EntityURL:
166 addressee.setUrl( KURL( readTextValue( cl ) ) ); 166 addressee.setUrl( KURL( readTextValue( cl ) ) );
167 break; 167 break;
168 168
169 case EntityNickname: 169 case EntityNickname:
170 addressee.setNickName( readTextValue( cl ) ); 170 addressee.setNickName( readTextValue( cl ) );
171 break; 171 break;
172 172
173 case EntityLabel: 173 case EntityLabel:
174 // not yet supported by kabc 174 // not yet supported by kabc
175 break; 175 break;
176 176
177 case EntityMailer: 177 case EntityMailer:
178 addressee.setMailer( readTextValue( cl ) ); 178 addressee.setMailer( readTextValue( cl ) );
179 break; 179 break;
180 180
181 case EntityTitle: 181 case EntityTitle:
182 addressee.setTitle( readTextValue( cl ) ); 182 addressee.setTitle( readTextValue( cl ) );
183 break; 183 break;
184 184
185 case EntityRole: 185 case EntityRole:
186 addressee.setRole( readTextValue( cl ) ); 186 addressee.setRole( readTextValue( cl ) );
187 break; 187 break;
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
381void VCardFormatImpl::addDateValue( VCard *vcard, EntityType type, 381void VCardFormatImpl::addDateValue( VCard *vcard, EntityType type,
382 const QDate &date ) 382 const QDate &date )
383{ 383{
384 if ( !date.isValid() ) return; 384 if ( !date.isValid() ) return;
385 385
386 ContentLine cl; 386 ContentLine cl;
387 cl.setName( EntityTypeToParamName( type ) ); 387 cl.setName( EntityTypeToParamName( type ) );
388 388
389 DateValue *v = new DateValue( date ); 389 DateValue *v = new DateValue( date );
390 cl.setValue( v ); 390 cl.setValue( v );
391 vcard->add(cl); 391 vcard->add(cl);
392} 392}
393 393
394void VCardFormatImpl::addDateTimeValue( VCard *vcard, EntityType type, 394void VCardFormatImpl::addDateTimeValue( VCard *vcard, EntityType type,
395 const QDateTime &dateTime ) 395 const QDateTime &dateTime )
396{ 396{
397 if ( !dateTime.isValid() ) return; 397 if ( !dateTime.isValid() ) return;
398 398
399 ContentLine cl; 399 ContentLine cl;
400 cl.setName( EntityTypeToParamName( type ) ); 400 cl.setName( EntityTypeToParamName( type ) );
401 401
402 DateValue *v = new DateValue( dateTime ); 402 DateValue *v = new DateValue( dateTime );
403 cl.setValue( v ); 403 cl.setValue( v );
404 vcard->add(cl); 404 vcard->add(cl);
405} 405}
406 406
407void VCardFormatImpl::addAddressValue( VCard *vcard, const Address &a ) 407void VCardFormatImpl::addAddressValue( VCard *vcard, const Address &a )
408{ 408{
409 if ( a.isEmpty() ) 409 if ( a.isEmpty() )
410 return; 410 return;
411 411
412 ContentLine cl; 412 ContentLine cl;
413 cl.setName( EntityTypeToParamName( EntityAddress ) ); 413 cl.setName( EntityTypeToParamName( EntityAddress ) );
414 414
415 AdrValue *v = new AdrValue; 415 AdrValue *v = new AdrValue;
416 v->setPOBox( a.postOfficeBox().utf8() ); 416 v->setPOBox( a.postOfficeBox().utf8() );
417 v->setExtAddress( a.extended().utf8() ); 417 v->setExtAddress( a.extended().utf8() );
418 v->setStreet( a.street().utf8() ); 418 v->setStreet( a.street().utf8() );
419 v->setLocality( a.locality().utf8() ); 419 v->setLocality( a.locality().utf8() );
420 v->setRegion( a.region().utf8() ); 420 v->setRegion( a.region().utf8() );
421 v->setPostCode( a.postalCode().utf8() ); 421 v->setPostCode( a.postalCode().utf8() );
422 v->setCountryName( a.country().utf8() ); 422 v->setCountryName( a.country().utf8() );
423 cl.setValue( v ); 423 cl.setValue( v );
424 424
425 addAddressParam( &cl, a.type() ); 425 addAddressParam( &cl, a.type() );
426 426
427 vcard->add( cl ); 427 vcard->add( cl );
428} 428}
429 429
430void VCardFormatImpl::addLabelValue( VCard *vcard, const Address &a ) 430void VCardFormatImpl::addLabelValue( VCard *vcard, const Address &a )
431{ 431{
432 if ( a.label().isEmpty() ) return; 432 if ( a.label().isEmpty() ) return;
433 433
434 ContentLine cl; 434 ContentLine cl;
435 cl.setName( EntityTypeToParamName( EntityLabel ) ); 435 cl.setName( EntityTypeToParamName( EntityLabel ) );
436 cl.setValue( new TextValue( a.label().utf8() ) ); 436 cl.setValue( new TextValue( a.label().utf8() ) );
437 437
438 addAddressParam( &cl, a.type() ); 438 addAddressParam( &cl, a.type() );
439 439
440 vcard->add( cl ); 440 vcard->add( cl );
441} 441}
442 442
443void VCardFormatImpl::addAddressParam( ContentLine *cl, int type ) 443void VCardFormatImpl::addAddressParam( ContentLine *cl, int type )
444{ 444{
445 ParamList params; 445 ParamList params;
446 if ( type & Address::Dom ) params.append( new Param( "TYPE", "dom" ) ); 446 if ( type & Address::Dom ) params.append( new Param( "TYPE", "dom" ) );
447 if ( type & Address::Intl ) params.append( new Param( "TYPE", "intl" ) ); 447 if ( type & Address::Intl ) params.append( new Param( "TYPE", "intl" ) );
448 if ( type & Address::Parcel ) params.append( new Param( "TYPE", "parcel" ) ); 448 if ( type & Address::Parcel ) params.append( new Param( "TYPE", "parcel" ) );
449 if ( type & Address::Postal ) params.append( new Param( "TYPE", "postal" ) ); 449 if ( type & Address::Postal ) params.append( new Param( "TYPE", "postal" ) );
450 if ( type & Address::Work ) params.append( new Param( "TYPE", "work" ) ); 450 if ( type & Address::Work ) params.append( new Param( "TYPE", "work" ) );
451 if ( type & Address::Home ) params.append( new Param( "TYPE", "home" ) ); 451 if ( type & Address::Home ) params.append( new Param( "TYPE", "home" ) );
452 if ( type & Address::Pref ) params.append( new Param( "TYPE", "pref" ) ); 452 if ( type & Address::Pref ) params.append( new Param( "TYPE", "pref" ) );
453 cl->setParamList( params ); 453 cl->setParamList( params );
454} 454}
455 455
456void VCardFormatImpl::addGeoValue( VCard *vcard, const Geo &geo ) 456void VCardFormatImpl::addGeoValue( VCard *vcard, const Geo &geo )
457{ 457{
458 if ( !geo.isValid() ) return; 458 if ( !geo.isValid() ) return;
459 459
460 ContentLine cl; 460 ContentLine cl;
461 cl.setName( EntityTypeToParamName( EntityGeo ) ); 461 cl.setName( EntityTypeToParamName( EntityGeo ) );
462 462
463 GeoValue *v = new GeoValue; 463 GeoValue *v = new GeoValue;
464 v->setLatitude( geo.latitude() ); 464 v->setLatitude( geo.latitude() );
465 v->setLongitude( geo.longitude() ); 465 v->setLongitude( geo.longitude() );
466 466
467 cl.setValue( v ); 467 cl.setValue( v );
468 vcard->add(cl); 468 vcard->add(cl);
469} 469}
470 470
471void VCardFormatImpl::addUTCValue( VCard *vcard, const TimeZone &tz ) 471void VCardFormatImpl::addUTCValue( VCard *vcard, const TimeZone &tz )
472{ 472{
473 if ( !tz.isValid() ) return; 473 if ( !tz.isValid() ) return;
474 474
475 ContentLine cl; 475 ContentLine cl;
476 cl.setName( EntityTypeToParamName( EntityTimeZone ) ); 476 cl.setName( EntityTypeToParamName( EntityTimeZone ) );
477 477
478 UTCValue *v = new UTCValue; 478 UTCValue *v = new UTCValue;
479 479
480 v->setPositive( tz.offset() >= 0 ); 480 v->setPositive( tz.offset() >= 0 );
481 v->setHour( (tz.offset() / 60) * ( tz.offset() >= 0 ? 1 : -1 ) ); 481 v->setHour( (tz.offset() / 60) * ( tz.offset() >= 0 ? 1 : -1 ) );
482 v->setMinute( (tz.offset() % 60) * ( tz.offset() >= 0 ? 1 : -1 ) ); 482 v->setMinute( (tz.offset() % 60) * ( tz.offset() >= 0 ? 1 : -1 ) );
483 483
484 cl.setValue( v ); 484 cl.setValue( v );
485 vcard->add(cl); 485 vcard->add(cl);
486} 486}
487 487
488void VCardFormatImpl::addClassValue( VCard *vcard, const Secrecy &secrecy ) 488void VCardFormatImpl::addClassValue( VCard *vcard, const Secrecy &secrecy )
489{ 489{
490 ContentLine cl; 490 ContentLine cl;
491 cl.setName( EntityTypeToParamName( EntityClass ) ); 491 cl.setName( EntityTypeToParamName( EntityClass ) );
492 492
493 ClassValue *v = new ClassValue; 493 ClassValue *v = new ClassValue;
494 switch ( secrecy.type() ) { 494 switch ( secrecy.type() ) {
495 case Secrecy::Public: 495 case Secrecy::Public:
496 v->setType( (int)ClassValue::Public ); 496 v->setType( (int)ClassValue::Public );
497 break; 497 break;
498 case Secrecy::Private: 498 case Secrecy::Private:
499 v->setType( (int)ClassValue::Private ); 499 v->setType( (int)ClassValue::Private );
500 break; 500 break;
501 case Secrecy::Confidential: 501 case Secrecy::Confidential:
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" ) );
728 break; 726 break;
729 case Key::PGP: 727 case Key::PGP:
730 params.append( new Param( "TYPE", "PGP" ) ); 728 params.append( new Param( "TYPE", "PGP" ) );
731 break; 729 break;
732 case Key::Custom: 730 case Key::Custom:
733 params.append( new Param( "TYPE", key.customTypeString().utf8() ) ); 731 params.append( new Param( "TYPE", key.customTypeString().utf8() ) );
734 break; 732 break;
735 } 733 }
736 734
737 cl.setParamList( params ); 735 cl.setParamList( params );
738 vcard->add( cl ); 736 vcard->add( cl );
739} 737}
740 738
741Key VCardFormatImpl::readKeyValue( VCARD::ContentLine *cl ) 739Key VCardFormatImpl::readKeyValue( VCARD::ContentLine *cl )
742{ 740{
743 Key key; 741 Key key;
744 bool isBinary = false; 742 bool isBinary = false;
745 TextValue *v = (TextValue *)cl->value(); 743 TextValue *v = (TextValue *)cl->value();
746 744
747 ParamList params = cl->paramList(); 745 ParamList params = cl->paramList();
748 ParamListIterator it( params ); 746 ParamListIterator it( params );
749 for( ; it.current(); ++it ) { 747 for( ; it.current(); ++it ) {
750 if ( (*it)->name() == "ENCODING" && (*it)->value() == "b" ) 748 if ( (*it)->name() == "ENCODING" && (*it)->value() == "b" )
751 isBinary = true; 749 isBinary = true;
752 if ( (*it)->name() == "TYPE" ) { 750 if ( (*it)->name() == "TYPE" ) {
753 if ( (*it)->value().isEmpty() ) 751 if ( (*it)->value().isEmpty() )
754 continue; 752 continue;
755 if ( (*it)->value() == "X509" ) 753 if ( (*it)->value() == "X509" )
756 key.setType( Key::X509 ); 754 key.setType( Key::X509 );
757 else if ( (*it)->value() == "PGP" ) 755 else if ( (*it)->value() == "PGP" )
758 key.setType( Key::PGP ); 756 key.setType( Key::PGP );
759 else { 757 else {
760 key.setType( Key::Custom ); 758 key.setType( Key::Custom );
761 key.setCustomTypeString( QString::fromUtf8( (*it)->value() ) ); 759 key.setCustomTypeString( QString::fromUtf8( (*it)->value() ) );
762 } 760 }
763 } 761 }
764 } 762 }
765 763
766 764
767 if ( isBinary ) { 765 if ( isBinary ) {
768 QByteArray data; 766 QByteArray data;
769 KCodecs::base64Decode( v->asString().stripWhiteSpace(), data ); 767 KCodecs::base64Decode( v->asString().stripWhiteSpace(), data );
770 key.setBinaryData( data ); 768 key.setBinaryData( data );
771 } else { 769 } else {
772 key.setTextData( QString::fromUtf8( v->asString() ) ); 770 key.setTextData( QString::fromUtf8( v->asString() ) );
773 } 771 }
774 772
775 return key; 773 return key;
776} 774}
777 775
778 776
779void VCardFormatImpl::addAgentValue( VCARD::VCard *vcard, const Agent &agent ) 777void VCardFormatImpl::addAgentValue( VCARD::VCard *vcard, const Agent &agent )
780{ 778{
781 if ( agent.isIntern() && !agent.addressee() ) 779 if ( agent.isIntern() && !agent.addressee() )
782 return; 780 return;
783 781
784 if ( !agent.isIntern() && agent.url().isEmpty() ) 782 if ( !agent.isIntern() && agent.url().isEmpty() )
785 return; 783 return;
786 784
787 ContentLine cl; 785 ContentLine cl;
788 cl.setName( EntityTypeToParamName( EntityAgent ) ); 786 cl.setName( EntityTypeToParamName( EntityAgent ) );
789 787
790 ParamList params; 788 ParamList params;
791 if ( agent.isIntern() ) { 789 if ( agent.isIntern() ) {
792 QString vstr; 790 QString vstr;
793 Addressee *addr = agent.addressee(); 791 Addressee *addr = agent.addressee();
794 if ( addr ) { 792 if ( addr ) {
795 writeToString( (*addr), vstr ); 793 writeToString( (*addr), vstr );
796 794
797 qDebug("VCardFormatImpl::addAgentValue please verify if replace is correct"); 795 qDebug("VCardFormatImpl::addAgentValue please verify if replace is correct");
798/*US 796/*US
799 vstr.replace( ":", "\\:" ); 797 vstr.replace( ":", "\\:" );
800 vstr.replace( ",", "\\," ); 798 vstr.replace( ",", "\\," );
801 vstr.replace( ";", "\\;" ); 799 vstr.replace( ";", "\\;" );
802 vstr.replace( "\r\n", "\\n" ); 800 vstr.replace( "\r\n", "\\n" );
803*/ 801*/
804 vstr.replace( QRegExp(":"), "\\:" ); 802 vstr.replace( QRegExp(":"), "\\:" );
805 vstr.replace( QRegExp(","), "\\," ); 803 vstr.replace( QRegExp(","), "\\," );
806 vstr.replace( QRegExp(";"), "\\;" ); 804 vstr.replace( QRegExp(";"), "\\;" );
807 vstr.replace( QRegExp("\r\n"), "\\n" ); 805 vstr.replace( QRegExp("\r\n"), "\\n" );
808 806
809 cl.setValue( new TextValue( vstr.utf8() ) ); 807 cl.setValue( new TextValue( vstr.utf8() ) );
810 } else 808 } else
811 return; 809 return;
812 } else { 810 } else {
813 cl.setValue( new TextValue( agent.url().utf8() ) ); 811 cl.setValue( new TextValue( agent.url().utf8() ) );
814 params.append( new Param( "VALUE", "uri" ) ); 812 params.append( new Param( "VALUE", "uri" ) );
815 } 813 }
816 814
817 cl.setParamList( params ); 815 cl.setParamList( params );
818 vcard->add( cl ); 816 vcard->add( cl );
819} 817}
820 818
821Agent VCardFormatImpl::readAgentValue( VCARD::ContentLine *cl ) 819Agent VCardFormatImpl::readAgentValue( VCARD::ContentLine *cl )
822{ 820{
823 Agent agent; 821 Agent agent;
824 bool isIntern = true; 822 bool isIntern = true;
825 TextValue *v = (TextValue *)cl->value(); 823 TextValue *v = (TextValue *)cl->value();
826 824
827 ParamList params = cl->paramList(); 825 ParamList params = cl->paramList();
828 ParamListIterator it( params ); 826 ParamListIterator it( params );
829 for( ; it.current(); ++it ) { 827 for( ; it.current(); ++it ) {
830 if ( (*it)->name() == "VALUE" && (*it)->value() == "uri" ) 828 if ( (*it)->name() == "VALUE" && (*it)->value() == "uri" )
831 isIntern = false; 829 isIntern = false;
832 } 830 }
833 831
834 if ( isIntern ) { 832 if ( isIntern ) {
835 QString vstr = QString::fromUtf8( v->asString() ); 833 QString vstr = QString::fromUtf8( v->asString() );
836 qDebug("VCardFormatImpl::addAgentValue please verify if replace is correct"); 834 qDebug("VCardFormatImpl::addAgentValue please verify if replace is correct");
837/*US 835/*US
838 vstr.replace( "\\n", "\r\n" ); 836 vstr.replace( "\\n", "\r\n" );
839 vstr.replace( "\\:", ":" ); 837 vstr.replace( "\\:", ":" );
840 vstr.replace( "\\,", "," ); 838 vstr.replace( "\\,", "," );
841 vstr.replace( "\\;", ";" ); 839 vstr.replace( "\\;", ";" );
842*/ 840*/
843 vstr.replace( QRegExp("\\\\n"), "\r\n" ); 841 vstr.replace( QRegExp("\\\\n"), "\r\n" );
844 vstr.replace( QRegExp("\\\\:"), ":" ); 842 vstr.replace( QRegExp("\\\\:"), ":" );
845 vstr.replace( QRegExp("\\\\,"), "," ); 843 vstr.replace( QRegExp("\\\\,"), "," );
846 vstr.replace( QRegExp("\\\\;"), ";" ); 844 vstr.replace( QRegExp("\\\\;"), ";" );
847 845
848 Addressee *addr = new Addressee; 846 Addressee *addr = new Addressee;
849 readFromString( vstr, *addr ); 847 readFromString( vstr, *addr );
850 agent.setAddressee( addr ); 848 agent.setAddressee( addr );
851 } else { 849 } else {
852 agent.setUrl( QString::fromUtf8( v->asString() ) ); 850 agent.setUrl( QString::fromUtf8( v->asString() ) );
853 } 851 }
854 852
855 return agent; 853 return agent;
856} 854}
857 855
858void VCardFormatImpl::addPictureValue( VCARD::VCard *vcard, VCARD::EntityType type, const Picture &pic, const Addressee &addr, bool intern ) 856void VCardFormatImpl::addPictureValue( VCARD::VCard *vcard, VCARD::EntityType type, const Picture &pic, const Addressee &addr, bool intern )
859{ 857{
860 ContentLine cl; 858 ContentLine cl;
861 cl.setName( EntityTypeToParamName( type ) ); 859 cl.setName( EntityTypeToParamName( type ) );
862 860
863 if ( pic.isIntern() && pic.data().isNull() ) 861 if ( pic.isIntern() && pic.data().isNull() )
864 return; 862 return;
865 863
866 if ( !pic.isIntern() && pic.url().isEmpty() ) 864 if ( !pic.isIntern() && pic.url().isEmpty() )
867 return; 865 return;
868 866
869 ParamList params; 867 ParamList params;
870 if ( pic.isIntern() ) { 868 if ( pic.isIntern() ) {
871 QImage img = pic.data(); 869 QImage img = pic.data();
872 if ( intern ) { // only for vCard export we really write the data inline 870 if ( intern ) { // only for vCard export we really write the data inline
873 QByteArray data; 871 QByteArray data;
874 QDataStream s( data, IO_WriteOnly ); 872 QDataStream s( data, IO_WriteOnly );
875 s.setVersion( 4 ); // to produce valid png files 873 s.setVersion( 4 ); // to produce valid png files
876 s << img; 874 s << img;
877 cl.setValue( new TextValue( KCodecs::base64Encode( data ) ) ); 875 cl.setValue( new TextValue( KCodecs::base64Encode( data ) ) );
878 876
879 } else { // save picture in cache 877 } else { // save picture in cache
880 QString dir; 878 QString dir;
881 if ( type == EntityPhoto ) 879 if ( type == EntityPhoto )
882 dir = "photos"; 880 dir = "photos";
883 if ( type == EntityLogo ) 881 if ( type == EntityLogo )
884 dir = "logos"; 882 dir = "logos";
885 883
886 img.save( locateLocal( "data", "kabc/" + dir + "/" + addr.uid() ), pic.type().utf8() ); 884 img.save( locateLocal( "data", "kabc/" + dir + "/" + addr.uid() ), pic.type().utf8() );
887 cl.setValue( new TextValue( "<dummy>" ) ); 885 cl.setValue( new TextValue( "<dummy>" ) );
888 } 886 }
889 params.append( new Param( "ENCODING", "b" ) ); 887 params.append( new Param( "ENCODING", "b" ) );
890 if ( !pic.type().isEmpty() ) 888 if ( !pic.type().isEmpty() )
891 params.append( new Param( "TYPE", pic.type().utf8() ) ); 889 params.append( new Param( "TYPE", pic.type().utf8() ) );
892 } else { 890 } else {
893 891
894 cl.setValue( new TextValue( pic.url().utf8() ) ); 892 cl.setValue( new TextValue( pic.url().utf8() ) );
895 params.append( new Param( "VALUE", "uri" ) ); 893 params.append( new Param( "VALUE", "uri" ) );
896 } 894 }
897 895
898 cl.setParamList( params ); 896 cl.setParamList( params );
899 vcard->add( cl ); 897 vcard->add( cl );
900} 898}
901 899
902Picture VCardFormatImpl::readPictureValue( VCARD::ContentLine *cl, VCARD::EntityType type, const Addressee &addr ) 900Picture VCardFormatImpl::readPictureValue( VCARD::ContentLine *cl, VCARD::EntityType type, const Addressee &addr )
903{ 901{
904 Picture pic; 902 Picture pic;
905 bool isInline = false; 903 bool isInline = false;
906 QString picType; 904 QString picType;
907 TextValue *v = (TextValue *)cl->value(); 905 TextValue *v = (TextValue *)cl->value();
908 906
909 ParamList params = cl->paramList(); 907 ParamList params = cl->paramList();
910 ParamListIterator it( params ); 908 ParamListIterator it( params );
911 for( ; it.current(); ++it ) { 909 for( ; it.current(); ++it ) {
912 if ( (*it)->name() == "ENCODING" && (*it)->value() == "b" ) 910 if ( (*it)->name() == "ENCODING" && (*it)->value() == "b" )
913 isInline = true; 911 isInline = true;
914 if ( (*it)->name() == "TYPE" && !(*it)->value().isEmpty() ) 912 if ( (*it)->name() == "TYPE" && !(*it)->value().isEmpty() )
915 picType = QString::fromUtf8( (*it)->value() ); 913 picType = QString::fromUtf8( (*it)->value() );
916 } 914 }
917 915
918 if ( isInline ) { 916 if ( isInline ) {
919 QImage img; 917 QImage img;
920 if ( v->asString() == "<dummy>" ) { // no picture inline stored => picture is in cache 918 if ( v->asString() == "<dummy>" ) { // no picture inline stored => picture is in cache
921 QString dir; 919 QString dir;
922 if ( type == EntityPhoto ) 920 if ( type == EntityPhoto )
923 dir = "photos"; 921 dir = "photos";
924 if ( type == EntityLogo ) 922 if ( type == EntityLogo )
925 dir = "logos"; 923 dir = "logos";
926 924
927 img.load( locateLocal( "data", "kabc/" + dir + "/" + addr.uid() ) ); 925 img.load( locateLocal( "data", "kabc/" + dir + "/" + addr.uid() ) );
928 } else { 926 } else {
929 QByteArray data; 927 QByteArray data;
930 KCodecs::base64Decode( v->asString(), data ); 928 KCodecs::base64Decode( v->asString(), data );
931 img.loadFromData( data ); 929 img.loadFromData( data );
932 } 930 }
933 pic.setData( img ); 931 pic.setData( img );
934 pic.setType( picType ); 932 pic.setType( picType );
935 } else { 933 } else {
936 pic.setUrl( QString::fromUtf8( v->asString() ) ); 934 pic.setUrl( QString::fromUtf8( v->asString() ) );
937 } 935 }
938 936
939 return pic; 937 return pic;
940} 938}
941 939
942void VCardFormatImpl::addSoundValue( VCARD::VCard *vcard, const Sound &sound, const Addressee &addr, bool intern ) 940void VCardFormatImpl::addSoundValue( VCARD::VCard *vcard, const Sound &sound, const Addressee &addr, bool intern )
943{ 941{
944 ContentLine cl; 942 ContentLine cl;
945 cl.setName( EntityTypeToParamName( EntitySound ) ); 943 cl.setName( EntityTypeToParamName( EntitySound ) );
946 944
947 if ( sound.isIntern() && sound.data().isNull() ) 945 if ( sound.isIntern() && sound.data().isNull() )
948 return; 946 return;
949 947
950 if ( !sound.isIntern() && sound.url().isEmpty() ) 948 if ( !sound.isIntern() && sound.url().isEmpty() )
951 return; 949 return;
952 950
953 ParamList params; 951 ParamList params;
954 if ( sound.isIntern() ) { 952 if ( sound.isIntern() ) {
955 QByteArray data = sound.data(); 953 QByteArray data = sound.data();
956 if ( intern ) { // only for vCard export we really write the data inline 954 if ( intern ) { // only for vCard export we really write the data inline
957 cl.setValue( new TextValue( KCodecs::base64Encode( data ) ) ); 955 cl.setValue( new TextValue( KCodecs::base64Encode( data ) ) );
958 } else { // save sound in cache 956 } else { // save sound in cache
959 QFile file( locateLocal( "data", "kabc/sounds/" + addr.uid() ) ); 957 QFile file( locateLocal( "data", "kabc/sounds/" + addr.uid() ) );
960 if ( file.open( IO_WriteOnly ) ) { 958 if ( file.open( IO_WriteOnly ) ) {
961 file.writeBlock( data ); 959 file.writeBlock( data );
962 } 960 }
963 cl.setValue( new TextValue( "<dummy>" ) ); 961 cl.setValue( new TextValue( "<dummy>" ) );
964 } 962 }
965 params.append( new Param( "ENCODING", "b" ) ); 963 params.append( new Param( "ENCODING", "b" ) );
966 } else { 964 } else {
967 cl.setValue( new TextValue( sound.url().utf8() ) ); 965 cl.setValue( new TextValue( sound.url().utf8() ) );
968 params.append( new Param( "VALUE", "uri" ) ); 966 params.append( new Param( "VALUE", "uri" ) );
969 } 967 }
970 968
971 cl.setParamList( params ); 969 cl.setParamList( params );
972 vcard->add( cl ); 970 vcard->add( cl );
973} 971}
974 972
975Sound VCardFormatImpl::readSoundValue( VCARD::ContentLine *cl, const Addressee &addr ) 973Sound VCardFormatImpl::readSoundValue( VCARD::ContentLine *cl, const Addressee &addr )
976{ 974{
977 Sound sound; 975 Sound sound;
978 bool isInline = false; 976 bool isInline = false;
979 TextValue *v = (TextValue *)cl->value(); 977 TextValue *v = (TextValue *)cl->value();
980 978
981 ParamList params = cl->paramList(); 979 ParamList params = cl->paramList();
982 ParamListIterator it( params ); 980 ParamListIterator it( params );
983 for( ; it.current(); ++it ) { 981 for( ; it.current(); ++it ) {
984 if ( (*it)->name() == "ENCODING" && (*it)->value() == "b" ) 982 if ( (*it)->name() == "ENCODING" && (*it)->value() == "b" )
985 isInline = true; 983 isInline = true;
986 } 984 }
987 985
988 if ( isInline ) { 986 if ( isInline ) {
989 QByteArray data; 987 QByteArray data;
990 if ( v->asString() == "<dummy>" ) { // no sound inline stored => sound is in cache 988 if ( v->asString() == "<dummy>" ) { // no sound inline stored => sound is in cache
991 QFile file( locateLocal( "data", "kabc/sounds/" + addr.uid() ) ); 989 QFile file( locateLocal( "data", "kabc/sounds/" + addr.uid() ) );
992 if ( file.open( IO_ReadOnly ) ) { 990 if ( file.open( IO_ReadOnly ) ) {
993 data = file.readAll(); 991 data = file.readAll();
994 file.close(); 992 file.close();
995 } 993 }
996 } else { 994 } else {
997 KCodecs::base64Decode( v->asString(), data ); 995 KCodecs::base64Decode( v->asString(), data );
998 } 996 }
999 sound.setData( data ); 997 sound.setData( data );
1000 } else { 998 } else {
1001 sound.setUrl( QString::fromUtf8( v->asString() ) ); 999 sound.setUrl( QString::fromUtf8( v->asString() ) );
1002 } 1000 }
1003 1001
1004 return sound; 1002 return sound;
1005} 1003}
1006 1004
1007bool VCardFormatImpl::readFromString( const QString &vcard, Addressee &addressee ) 1005bool VCardFormatImpl::readFromString( const QString &vcard, Addressee &addressee )
1008{ 1006{
1009 VCardEntity e( vcard.utf8() ); 1007 VCardEntity e( vcard.utf8() );
1010 VCardListIterator it( e.cardList() ); 1008 VCardListIterator it( e.cardList() );
1011 1009
1012 if ( it.current() ) { 1010 if ( it.current() ) {
1013//US VCard v(*it.current()); 1011//US VCard v(*it.current());
1014//US loadAddressee( addressee, v ); 1012//US loadAddressee( addressee, v );
1015 loadAddressee( addressee, it.current() ); 1013 loadAddressee( addressee, it.current() );
1016 return true; 1014 return true;
1017 } 1015 }
1018 1016
1019 return false; 1017 return false;
1020} 1018}
1021 1019
1022bool VCardFormatImpl::writeToString( const Addressee &addressee, QString &vcard ) 1020bool VCardFormatImpl::writeToString( const Addressee &addressee, QString &vcard )
1023{ 1021{
1024 VCardEntity vcards; 1022 VCardEntity vcards;
1025 VCardList vcardlist; 1023 VCardList vcardlist;
1026 vcardlist.setAutoDelete( true ); 1024 vcardlist.setAutoDelete( true );
1027 1025
1028 VCard *v = new VCard; 1026 VCard *v = new VCard;
1029 1027
1030 saveAddressee( addressee, v, true ); 1028 saveAddressee( addressee, v, true );
1031 1029
1032 vcardlist.append( v ); 1030 vcardlist.append( v );
1033 vcards.setCardList( vcardlist ); 1031 vcards.setCardList( vcardlist );
1034 vcard = QString::fromUtf8( vcards.asString() ); 1032 vcard = QString::fromUtf8( vcards.asString() );
1035 1033
1036 return true; 1034 return true;
1037} 1035}
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
@@ -67,803 +67,803 @@ QString VCardTool::createVCards( Addressee::List list, VCard::Version version )
67{ 67{
68 VCard::List vCardList; 68 VCard::List vCardList;
69 static const QRegExp semiExp(";"); 69 static const QRegExp semiExp(";");
70 70
71 Addressee::List::ConstIterator addrIt; 71 Addressee::List::ConstIterator addrIt;
72 Addressee::List::ConstIterator listEnd( list.end() ); 72 Addressee::List::ConstIterator listEnd( list.end() );
73 for ( addrIt = list.begin(); addrIt != listEnd; ++addrIt ) { 73 for ( addrIt = list.begin(); addrIt != listEnd; ++addrIt ) {
74 VCard card; 74 VCard card;
75 QStringList::ConstIterator strIt; 75 QStringList::ConstIterator strIt;
76 76
77 // ADR + LABEL 77 // ADR + LABEL
78 const Address::List addresses = (*addrIt).addresses(); 78 const Address::List addresses = (*addrIt).addresses();
79 for ( Address::List::ConstIterator it = addresses.begin(); it != addresses.end(); ++it ) { 79 for ( Address::List::ConstIterator it = addresses.begin(); it != addresses.end(); ++it ) {
80 QStringList address; 80 QStringList address;
81 81
82 bool isEmpty = ( (*it).postOfficeBox().isEmpty() && 82 bool isEmpty = ( (*it).postOfficeBox().isEmpty() &&
83 (*it).extended().isEmpty() && 83 (*it).extended().isEmpty() &&
84 (*it).street().isEmpty() && 84 (*it).street().isEmpty() &&
85 (*it).locality().isEmpty() && 85 (*it).locality().isEmpty() &&
86 (*it).region().isEmpty() && 86 (*it).region().isEmpty() &&
87 (*it).postalCode().isEmpty() && 87 (*it).postalCode().isEmpty() &&
88 (*it).country().isEmpty() ); 88 (*it).country().isEmpty() );
89 89
90 address.append( (*it).postOfficeBox().replace( semiExp, "\\;" ) ); 90 address.append( (*it).postOfficeBox().replace( semiExp, "\\;" ) );
91 address.append( (*it).extended().replace( semiExp, "\\;" ) ); 91 address.append( (*it).extended().replace( semiExp, "\\;" ) );
92 address.append( (*it).street().replace( semiExp, "\\;" ) ); 92 address.append( (*it).street().replace( semiExp, "\\;" ) );
93 address.append( (*it).locality().replace( semiExp, "\\;" ) ); 93 address.append( (*it).locality().replace( semiExp, "\\;" ) );
94 address.append( (*it).region().replace( semiExp, "\\;" ) ); 94 address.append( (*it).region().replace( semiExp, "\\;" ) );
95 address.append( (*it).postalCode().replace( semiExp, "\\;" ) ); 95 address.append( (*it).postalCode().replace( semiExp, "\\;" ) );
96 address.append( (*it).country().replace( semiExp, "\\;" ) ); 96 address.append( (*it).country().replace( semiExp, "\\;" ) );
97 97
98 VCardLine adrLine( "ADR", address.join( ";" ) ); 98 VCardLine adrLine( "ADR", address.join( ";" ) );
99 if ( version == VCard::v2_1 ) { 99 if ( version == VCard::v2_1 ) {
100 adrLine.addParameter( "CHARSET", "UTF-8" ); 100 adrLine.addParameter( "CHARSET", "UTF-8" );
101 adrLine.addParameter( "ENCODING", "8BIT" ); 101 adrLine.addParameter( "ENCODING", "8BIT" );
102 } 102 }
103 103
104 VCardLine labelLine( "LABEL", (*it).label() ); 104 VCardLine labelLine( "LABEL", (*it).label() );
105 if ( version == VCard::v2_1 ) { 105 if ( version == VCard::v2_1 ) {
106 labelLine.addParameter( "CHARSET", "UTF-8" ); 106 labelLine.addParameter( "CHARSET", "UTF-8" );
107 labelLine.addParameter( "ENCODING", "8BIT" ); 107 labelLine.addParameter( "ENCODING", "8BIT" );
108 } 108 }
109 109
110 bool hasLabel = !(*it).label().isEmpty(); 110 bool hasLabel = !(*it).label().isEmpty();
111 QMap<QString, int>::ConstIterator typeIt; 111 QMap<QString, int>::ConstIterator typeIt;
112 for ( typeIt = mAddressTypeMap.begin(); typeIt != mAddressTypeMap.end(); ++typeIt ) { 112 for ( typeIt = mAddressTypeMap.begin(); typeIt != mAddressTypeMap.end(); ++typeIt ) {
113 if ( typeIt.data() & (*it).type() ) { 113 if ( typeIt.data() & (*it).type() ) {
114 adrLine.addParameter( "TYPE", typeIt.key() ); 114 adrLine.addParameter( "TYPE", typeIt.key() );
115 if ( hasLabel ) 115 if ( hasLabel )
116 labelLine.addParameter( "TYPE", typeIt.key() ); 116 labelLine.addParameter( "TYPE", typeIt.key() );
117 } 117 }
118 } 118 }
119 119
120 if ( !isEmpty ) 120 if ( !isEmpty )
121 card.addLine( adrLine ); 121 card.addLine( adrLine );
122 if ( hasLabel ) 122 if ( hasLabel )
123 card.addLine( labelLine ); 123 card.addLine( labelLine );
124 } 124 }
125 125
126 // AGENT 126 // AGENT
127 card.addLine( createAgent( version, (*addrIt).agent() ) ); 127 card.addLine( createAgent( version, (*addrIt).agent() ) );
128 128
129 // BDAY 129 // BDAY
130 card.addLine( VCardLine( "BDAY", createDateTime( (*addrIt).birthday() ) ) ); 130 card.addLine( VCardLine( "BDAY", createDateTime( (*addrIt).birthday() ) ) );
131 131
132 // CATEGORIES 132 // CATEGORIES
133 if ( version == VCard::v3_0 ) { 133 if ( version == VCard::v3_0 ) {
134 QStringList categories = (*addrIt).categories(); 134 QStringList categories = (*addrIt).categories();
135 QStringList::Iterator catIt; 135 QStringList::Iterator catIt;
136 for ( catIt = categories.begin(); catIt != categories.end(); ++catIt ) 136 for ( catIt = categories.begin(); catIt != categories.end(); ++catIt )
137 (*catIt).replace( QRegExp(","), "\\," ); 137 (*catIt).replace( QRegExp(","), "\\," );
138 138
139 VCardLine catLine( "CATEGORIES", categories.join( "," ) ); 139 VCardLine catLine( "CATEGORIES", categories.join( "," ) );
140 if ( version == VCard::v2_1 ) { 140 if ( version == VCard::v2_1 ) {
141 catLine.addParameter( "CHARSET", "UTF-8" ); 141 catLine.addParameter( "CHARSET", "UTF-8" );
142 catLine.addParameter( "ENCODING", "8BIT" ); 142 catLine.addParameter( "ENCODING", "8BIT" );
143 } 143 }
144 144
145 card.addLine( catLine ); 145 card.addLine( catLine );
146 } 146 }
147 147
148 // CLASS 148 // CLASS
149 if ( version == VCard::v3_0 ) { 149 if ( version == VCard::v3_0 ) {
150 card.addLine( createSecrecy( (*addrIt).secrecy() ) ); 150 card.addLine( createSecrecy( (*addrIt).secrecy() ) );
151 } 151 }
152 152
153 // EMAIL 153 // EMAIL
154 const QStringList emails = (*addrIt).emails(); 154 const QStringList emails = (*addrIt).emails();
155 bool pref = true; 155 bool pref = true;
156 for ( strIt = emails.begin(); strIt != emails.end(); ++strIt ) { 156 for ( strIt = emails.begin(); strIt != emails.end(); ++strIt ) {
157 VCardLine line( "EMAIL", *strIt ); 157 VCardLine line( "EMAIL", *strIt );
158 if ( version == VCard::v2_1 ) { 158 if ( version == VCard::v2_1 ) {
159 line.addParameter( "CHARSET", "UTF-8" ); 159 line.addParameter( "CHARSET", "UTF-8" );
160 line.addParameter( "ENCODING", "8BIT" ); 160 line.addParameter( "ENCODING", "8BIT" );
161 } 161 }
162 if ( pref == true && emails.count() > 1 ) { 162 if ( pref == true && emails.count() > 1 ) {
163 line.addParameter( "TYPE", "PREF" ); 163 line.addParameter( "TYPE", "PREF" );
164 pref = false; 164 pref = false;
165 } 165 }
166 card.addLine( line ); 166 card.addLine( line );
167 } 167 }
168 168
169 // FN 169 // FN
170 VCardLine fnLine( "FN", (*addrIt).formattedName() ); 170 VCardLine fnLine( "FN", (*addrIt).formattedName() );
171 if ( version == VCard::v2_1 ) { 171 if ( version == VCard::v2_1 ) {
172 fnLine.addParameter( "CHARSET", "UTF-8" ); 172 fnLine.addParameter( "CHARSET", "UTF-8" );
173 fnLine.addParameter( "ENCODING", "8BIT" ); 173 fnLine.addParameter( "ENCODING", "8BIT" );
174 } 174 }
175 card.addLine( fnLine ); 175 card.addLine( fnLine );
176 176
177 // GEO 177 // GEO
178 Geo geo = (*addrIt).geo(); 178 Geo geo = (*addrIt).geo();
179 if ( geo.isValid() ) { 179 if ( geo.isValid() ) {
180 QString str; 180 QString str;
181 str.sprintf( "%.6f;%.6f", geo.latitude(), geo.longitude() ); 181 str.sprintf( "%.6f;%.6f", geo.latitude(), geo.longitude() );
182 card.addLine( VCardLine( "GEO", str ) ); 182 card.addLine( VCardLine( "GEO", str ) );
183 } 183 }
184 184
185 // KEY 185 // KEY
186 const Key::List keys = (*addrIt).keys(); 186 const Key::List keys = (*addrIt).keys();
187 Key::List::ConstIterator keyIt; 187 Key::List::ConstIterator keyIt;
188 for ( keyIt = keys.begin(); keyIt != keys.end(); ++keyIt ) 188 for ( keyIt = keys.begin(); keyIt != keys.end(); ++keyIt )
189 card.addLine( createKey( *keyIt ) ); 189 card.addLine( createKey( *keyIt ) );
190 190
191 // LOGO 191 // LOGO
192 card.addLine( createPicture( "LOGO", (*addrIt).logo() ) ); 192 card.addLine( createPicture( "LOGO", (*addrIt).logo() ) );
193 193
194 // MAILER 194 // MAILER
195 VCardLine mailerLine( "MAILER", (*addrIt).mailer() ); 195 VCardLine mailerLine( "MAILER", (*addrIt).mailer() );
196 if ( version == VCard::v2_1 ) { 196 if ( version == VCard::v2_1 ) {
197 mailerLine.addParameter( "CHARSET", "UTF-8" ); 197 mailerLine.addParameter( "CHARSET", "UTF-8" );
198 mailerLine.addParameter( "ENCODING", "8BIT" ); 198 mailerLine.addParameter( "ENCODING", "8BIT" );
199 } 199 }
200 card.addLine( mailerLine ); 200 card.addLine( mailerLine );
201 201
202 // N 202 // N
203 QStringList name; 203 QStringList name;
204 name.append( (*addrIt).familyName().replace( semiExp, "\\;" ) ); 204 name.append( (*addrIt).familyName().replace( semiExp, "\\;" ) );
205 name.append( (*addrIt).givenName().replace( semiExp, "\\;" ) ); 205 name.append( (*addrIt).givenName().replace( semiExp, "\\;" ) );
206 name.append( (*addrIt).additionalName().replace( semiExp, "\\;" ) ); 206 name.append( (*addrIt).additionalName().replace( semiExp, "\\;" ) );
207 name.append( (*addrIt).prefix().replace( semiExp, "\\;" ) ); 207 name.append( (*addrIt).prefix().replace( semiExp, "\\;" ) );
208 name.append( (*addrIt).suffix().replace( semiExp, "\\;" ) ); 208 name.append( (*addrIt).suffix().replace( semiExp, "\\;" ) );
209 209
210 VCardLine nLine( "N", name.join( ";" ) ); 210 VCardLine nLine( "N", name.join( ";" ) );
211 if ( version == VCard::v2_1 ) { 211 if ( version == VCard::v2_1 ) {
212 nLine.addParameter( "CHARSET", "UTF-8" ); 212 nLine.addParameter( "CHARSET", "UTF-8" );
213 nLine.addParameter( "ENCODING", "8BIT" ); 213 nLine.addParameter( "ENCODING", "8BIT" );
214 } 214 }
215 card.addLine( nLine ); 215 card.addLine( nLine );
216 216
217 // NAME 217 // NAME
218 VCardLine nameLine( "NAME", (*addrIt).name() ); 218 VCardLine nameLine( "NAME", (*addrIt).name() );
219 if ( version == VCard::v2_1 ) { 219 if ( version == VCard::v2_1 ) {
220 nameLine.addParameter( "CHARSET", "UTF-8" ); 220 nameLine.addParameter( "CHARSET", "UTF-8" );
221 nameLine.addParameter( "ENCODING", "8BIT" ); 221 nameLine.addParameter( "ENCODING", "8BIT" );
222 } 222 }
223 card.addLine( nameLine ); 223 card.addLine( nameLine );
224 224
225 // NICKNAME 225 // NICKNAME
226 if ( version == VCard::v3_0 ) 226 if ( version == VCard::v3_0 )
227 card.addLine( VCardLine( "NICKNAME", (*addrIt).nickName() ) ); 227 card.addLine( VCardLine( "NICKNAME", (*addrIt).nickName() ) );
228 228
229 // NOTE 229 // NOTE
230 VCardLine noteLine( "NOTE", (*addrIt).note() ); 230 VCardLine noteLine( "NOTE", (*addrIt).note() );
231 if ( version == VCard::v2_1 ) { 231 if ( version == VCard::v2_1 ) {
232 noteLine.addParameter( "CHARSET", "UTF-8" ); 232 noteLine.addParameter( "CHARSET", "UTF-8" );
233 noteLine.addParameter( "ENCODING", "8BIT" ); 233 noteLine.addParameter( "ENCODING", "8BIT" );
234 } 234 }
235 card.addLine( noteLine ); 235 card.addLine( noteLine );
236 236
237 // ORG 237 // ORG
238 VCardLine orgLine( "ORG", (*addrIt).organization() ); 238 VCardLine orgLine( "ORG", (*addrIt).organization() );
239 if ( version == VCard::v2_1 ) { 239 if ( version == VCard::v2_1 ) {
240 orgLine.addParameter( "CHARSET", "UTF-8" ); 240 orgLine.addParameter( "CHARSET", "UTF-8" );
241 orgLine.addParameter( "ENCODING", "8BIT" ); 241 orgLine.addParameter( "ENCODING", "8BIT" );
242 } 242 }
243 card.addLine( orgLine ); 243 card.addLine( orgLine );
244 244
245 // PHOTO 245 // PHOTO
246 card.addLine( createPicture( "PHOTO", (*addrIt).photo() ) ); 246 card.addLine( createPicture( "PHOTO", (*addrIt).photo() ) );
247 247
248 // PROID 248 // PROID
249 if ( version == VCard::v3_0 ) 249 if ( version == VCard::v3_0 )
250 card.addLine( VCardLine( "PRODID", (*addrIt).productId() ) ); 250 card.addLine( VCardLine( "PRODID", (*addrIt).productId() ) );
251 251
252 // REV 252 // REV
253 card.addLine( VCardLine( "REV", createDateTime( (*addrIt).revision() ) ) ); 253 card.addLine( VCardLine( "REV", createDateTime( (*addrIt).revision() ) ) );
254 254
255 // ROLE 255 // ROLE
256 VCardLine roleLine( "ROLE", (*addrIt).role() ); 256 VCardLine roleLine( "ROLE", (*addrIt).role() );
257 if ( version == VCard::v2_1 ) { 257 if ( version == VCard::v2_1 ) {
258 roleLine.addParameter( "CHARSET", "UTF-8" ); 258 roleLine.addParameter( "CHARSET", "UTF-8" );
259 roleLine.addParameter( "ENCODING", "8BIT" ); 259 roleLine.addParameter( "ENCODING", "8BIT" );
260 } 260 }
261 card.addLine( roleLine ); 261 card.addLine( roleLine );
262 262
263 // SORT-STRING 263 // SORT-STRING
264 if ( version == VCard::v3_0 ) 264 if ( version == VCard::v3_0 )
265 card.addLine( VCardLine( "SORT-STRING", (*addrIt).sortString() ) ); 265 card.addLine( VCardLine( "SORT-STRING", (*addrIt).sortString() ) );
266 266
267 // SOUND 267 // SOUND
268 card.addLine( createSound( (*addrIt).sound() ) ); 268 card.addLine( createSound( (*addrIt).sound() ) );
269 269
270 // TEL 270 // TEL
271 const PhoneNumber::List phoneNumbers = (*addrIt).phoneNumbers(); 271 const PhoneNumber::List phoneNumbers = (*addrIt).phoneNumbers();
272 PhoneNumber::List::ConstIterator phoneIt; 272 PhoneNumber::List::ConstIterator phoneIt;
273 for ( phoneIt = phoneNumbers.begin(); phoneIt != phoneNumbers.end(); ++phoneIt ) { 273 for ( phoneIt = phoneNumbers.begin(); phoneIt != phoneNumbers.end(); ++phoneIt ) {
274 VCardLine line( "TEL", (*phoneIt).number() ); 274 VCardLine line( "TEL", (*phoneIt).number() );
275 275
276 QMap<QString, int>::ConstIterator typeIt; 276 QMap<QString, int>::ConstIterator typeIt;
277 for ( typeIt = mPhoneTypeMap.begin(); typeIt != mPhoneTypeMap.end(); ++typeIt ) { 277 for ( typeIt = mPhoneTypeMap.begin(); typeIt != mPhoneTypeMap.end(); ++typeIt ) {
278 if ( typeIt.data() & (*phoneIt).type() ) 278 if ( typeIt.data() & (*phoneIt).type() )
279 line.addParameter( "TYPE", typeIt.key() ); 279 line.addParameter( "TYPE", typeIt.key() );
280 } 280 }
281 281
282 card.addLine( line ); 282 card.addLine( line );
283 } 283 }
284 284
285 // TITLE 285 // TITLE
286 VCardLine titleLine( "TITLE", (*addrIt).title() ); 286 VCardLine titleLine( "TITLE", (*addrIt).title() );
287 if ( version == VCard::v2_1 ) { 287 if ( version == VCard::v2_1 ) {
288 titleLine.addParameter( "CHARSET", "UTF-8" ); 288 titleLine.addParameter( "CHARSET", "UTF-8" );
289 titleLine.addParameter( "ENCODING", "8BIT" ); 289 titleLine.addParameter( "ENCODING", "8BIT" );
290 } 290 }
291 card.addLine( titleLine ); 291 card.addLine( titleLine );
292 292
293 // TZ 293 // TZ
294 TimeZone timeZone = (*addrIt).timeZone(); 294 TimeZone timeZone = (*addrIt).timeZone();
295 if ( timeZone.isValid() ) { 295 if ( timeZone.isValid() ) {
296 QString str; 296 QString str;
297 297
298 int neg = 1; 298 int neg = 1;
299 if ( timeZone.offset() < 0 ) 299 if ( timeZone.offset() < 0 )
300 neg = -1; 300 neg = -1;
301 301
302 str.sprintf( "%c%02d:%02d", ( timeZone.offset() >= 0 ? '+' : '-' ), 302 str.sprintf( "%c%02d:%02d", ( timeZone.offset() >= 0 ? '+' : '-' ),
303 ( timeZone.offset() / 60 ) * neg, 303 ( timeZone.offset() / 60 ) * neg,
304 ( timeZone.offset() % 60 ) * neg ); 304 ( timeZone.offset() % 60 ) * neg );
305 305
306 card.addLine( VCardLine( "TZ", str ) ); 306 card.addLine( VCardLine( "TZ", str ) );
307 } 307 }
308 308
309 // UID 309 // UID
310 card.addLine( VCardLine( "UID", (*addrIt).uid() ) ); 310 card.addLine( VCardLine( "UID", (*addrIt).uid() ) );
311 311
312 // URL 312 // URL
313 card.addLine( VCardLine( "URL", (*addrIt).url().url() ) ); 313 card.addLine( VCardLine( "URL", (*addrIt).url().url() ) );
314 314
315 // VERSION 315 // VERSION
316 if ( version == VCard::v2_1 ) 316 if ( version == VCard::v2_1 )
317 card.addLine( VCardLine( "VERSION", "2.1" ) ); 317 card.addLine( VCardLine( "VERSION", "2.1" ) );
318 if ( version == VCard::v3_0 ) 318 if ( version == VCard::v3_0 )
319 card.addLine( VCardLine( "VERSION", "3.0" ) ); 319 card.addLine( VCardLine( "VERSION", "3.0" ) );
320 320
321 // X- 321 // X-
322 const QStringList customs = (*addrIt).customs(); 322 const QStringList customs = (*addrIt).customs();
323 for ( strIt = customs.begin(); strIt != customs.end(); ++strIt ) { 323 for ( strIt = customs.begin(); strIt != customs.end(); ++strIt ) {
324 QString identifier = "X-" + (*strIt).left( (*strIt).find( ":" ) ); 324 QString identifier = "X-" + (*strIt).left( (*strIt).find( ":" ) );
325 QString value = (*strIt).mid( (*strIt).find( ":" ) + 1 ); 325 QString value = (*strIt).mid( (*strIt).find( ":" ) + 1 );
326 if ( value.isEmpty() ) 326 if ( value.isEmpty() )
327 continue; 327 continue;
328 328
329 VCardLine line( identifier, value ); 329 VCardLine line( identifier, value );
330 if ( version == VCard::v2_1 ) { 330 if ( version == VCard::v2_1 ) {
331 line.addParameter( "CHARSET", "UTF-8" ); 331 line.addParameter( "CHARSET", "UTF-8" );
332 line.addParameter( "ENCODING", "8BIT" ); 332 line.addParameter( "ENCODING", "8BIT" );
333 } 333 }
334 card.addLine( line ); 334 card.addLine( line );
335 } 335 }
336 336
337 vCardList.append( card ); 337 vCardList.append( card );
338 } 338 }
339 339
340 return VCardParser::createVCards( vCardList ); 340 return VCardParser::createVCards( vCardList );
341} 341}
342 342
343Addressee::List VCardTool::parseVCards( const QString& vcard ) 343Addressee::List VCardTool::parseVCards( const QString& vcard )
344{ 344{
345 static const QChar semicolonSep( ';' ); 345 static const QChar semicolonSep( ';' );
346 static const QChar commaSep( ',' ); 346 static const QChar commaSep( ',' );
347 QString identifier; 347 QString identifier;
348 348
349 Addressee::List addrList; 349 Addressee::List addrList;
350 const VCard::List vCardList = VCardParser::parseVCards( vcard ); 350 const VCard::List vCardList = VCardParser::parseVCards( vcard );
351 351
352 VCard::List::ConstIterator cardIt; 352 VCard::List::ConstIterator cardIt;
353 VCard::List::ConstIterator listEnd( vCardList.end() ); 353 VCard::List::ConstIterator listEnd( vCardList.end() );
354 for ( cardIt = vCardList.begin(); cardIt != listEnd; ++cardIt ) { 354 for ( cardIt = vCardList.begin(); cardIt != listEnd; ++cardIt ) {
355 Addressee addr; 355 Addressee addr;
356 356
357 const QStringList idents = (*cardIt).identifiers(); 357 const QStringList idents = (*cardIt).identifiers();
358 QStringList::ConstIterator identIt; 358 QStringList::ConstIterator identIt;
359 QStringList::ConstIterator identEnd( idents.end() ); 359 QStringList::ConstIterator identEnd( idents.end() );
360 for ( identIt = idents.begin(); identIt != identEnd; ++identIt ) { 360 for ( identIt = idents.begin(); identIt != identEnd; ++identIt ) {
361 const VCardLine::List lines = (*cardIt).lines( (*identIt) ); 361 const VCardLine::List lines = (*cardIt).lines( (*identIt) );
362 VCardLine::List::ConstIterator lineIt; 362 VCardLine::List::ConstIterator lineIt;
363 363
364 // iterate over the lines 364 // iterate over the lines
365 for ( lineIt = lines.begin(); lineIt != lines.end(); ++lineIt ) { 365 for ( lineIt = lines.begin(); lineIt != lines.end(); ++lineIt ) {
366 identifier = (*lineIt).identifier().lower(); 366 identifier = (*lineIt).identifier().lower();
367 // ADR 367 // ADR
368 if ( identifier == "adr" ) { 368 if ( identifier == "adr" ) {
369 Address address; 369 Address address;
370 const QStringList addrParts = splitString( semicolonSep, (*lineIt).valueString() ); 370 const QStringList addrParts = splitString( semicolonSep, (*lineIt).valueString() );
371 if ( addrParts.count() > 0 ) 371 if ( addrParts.count() > 0 )
372 address.setPostOfficeBox( addrParts[ 0 ] ); 372 address.setPostOfficeBox( addrParts[ 0 ] );
373 if ( addrParts.count() > 1 ) 373 if ( addrParts.count() > 1 )
374 address.setExtended( addrParts[ 1 ] ); 374 address.setExtended( addrParts[ 1 ] );
375 if ( addrParts.count() > 2 ) 375 if ( addrParts.count() > 2 )
376 address.setStreet( addrParts[ 2 ] ); 376 address.setStreet( addrParts[ 2 ] );
377 if ( addrParts.count() > 3 ) 377 if ( addrParts.count() > 3 )
378 address.setLocality( addrParts[ 3 ] ); 378 address.setLocality( addrParts[ 3 ] );
379 if ( addrParts.count() > 4 ) 379 if ( addrParts.count() > 4 )
380 address.setRegion( addrParts[ 4 ] ); 380 address.setRegion( addrParts[ 4 ] );
381 if ( addrParts.count() > 5 ) 381 if ( addrParts.count() > 5 )
382 address.setPostalCode( addrParts[ 5 ] ); 382 address.setPostalCode( addrParts[ 5 ] );
383 if ( addrParts.count() > 6 ) 383 if ( addrParts.count() > 6 )
384 address.setCountry( addrParts[ 6 ] ); 384 address.setCountry( addrParts[ 6 ] );
385 385
386 int type = 0; 386 int type = 0;
387 387
388 const QStringList types = (*lineIt).parameters( "type" ); 388 const QStringList types = (*lineIt).parameters( "type" );
389 for ( QStringList::ConstIterator it = types.begin(); it != types.end(); ++it ) 389 for ( QStringList::ConstIterator it = types.begin(); it != types.end(); ++it )
390 type += mAddressTypeMap[ (*it).lower() ]; 390 type += mAddressTypeMap[ (*it).lower() ];
391 391
392 address.setType( type ); 392 address.setType( type );
393 addr.insertAddress( address ); 393 addr.insertAddress( address );
394 } 394 }
395 395
396 // AGENT 396 // AGENT
397 else if ( identifier == "agent" ) 397 else if ( identifier == "agent" )
398 addr.setAgent( parseAgent( *lineIt ) ); 398 addr.setAgent( parseAgent( *lineIt ) );
399 399
400 // BDAY 400 // BDAY
401 else if ( identifier == "bday" ) 401 else if ( identifier == "bday" )
402 addr.setBirthday( parseDateTime( (*lineIt).valueString() ) ); 402 addr.setBirthday( parseDateTime( (*lineIt).valueString() ) );
403 403
404 // CATEGORIES 404 // CATEGORIES
405 else if ( identifier == "categories" ) { 405 else if ( identifier == "categories" ) {
406 const QStringList categories = splitString( commaSep, (*lineIt).valueString() ); 406 const QStringList categories = splitString( commaSep, (*lineIt).valueString() );
407 addr.setCategories( categories ); 407 addr.setCategories( categories );
408 } 408 }
409 409
410 // CLASS 410 // CLASS
411 else if ( identifier == "class" ) 411 else if ( identifier == "class" )
412 addr.setSecrecy( parseSecrecy( *lineIt ) ); 412 addr.setSecrecy( parseSecrecy( *lineIt ) );
413 413
414 // EMAIL 414 // EMAIL
415 else if ( identifier == "email" ) { 415 else if ( identifier == "email" ) {
416 const QStringList types = (*lineIt).parameters( "type" ); 416 const QStringList types = (*lineIt).parameters( "type" );
417 addr.insertEmail( (*lineIt).valueString(), types.findIndex( "PREF" ) != -1 ); 417 addr.insertEmail( (*lineIt).valueString(), types.findIndex( "PREF" ) != -1 );
418 } 418 }
419 419
420 // FN 420 // FN
421 else if ( identifier == "fn" ) 421 else if ( identifier == "fn" )
422 addr.setFormattedName( (*lineIt).valueString() ); 422 addr.setFormattedName( (*lineIt).valueString() );
423 423
424 // GEO 424 // GEO
425 else if ( identifier == "geo" ) { 425 else if ( identifier == "geo" ) {
426 Geo geo; 426 Geo geo;
427 427
428 const QStringList geoParts = QStringList::split( ';', (*lineIt).valueString(), true ); 428 const QStringList geoParts = QStringList::split( ';', (*lineIt).valueString(), true );
429 geo.setLatitude( geoParts[ 0 ].toFloat() ); 429 geo.setLatitude( geoParts[ 0 ].toFloat() );
430 geo.setLongitude( geoParts[ 1 ].toFloat() ); 430 geo.setLongitude( geoParts[ 1 ].toFloat() );
431 431
432 addr.setGeo( geo ); 432 addr.setGeo( geo );
433 } 433 }
434 434
435 // KEY 435 // KEY
436 else if ( identifier == "key" ) 436 else if ( identifier == "key" )
437 addr.insertKey( parseKey( *lineIt ) ); 437 addr.insertKey( parseKey( *lineIt ) );
438 438
439 // LABEL 439 // LABEL
440 else if ( identifier == "label" ) { 440 else if ( identifier == "label" ) {
441 int type = 0; 441 int type = 0;
442 442
443 const QStringList types = (*lineIt).parameters( "type" ); 443 const QStringList types = (*lineIt).parameters( "type" );
444 for ( QStringList::ConstIterator it = types.begin(); it != types.end(); ++it ) 444 for ( QStringList::ConstIterator it = types.begin(); it != types.end(); ++it )
445 type += mAddressTypeMap[ (*it).lower() ]; 445 type += mAddressTypeMap[ (*it).lower() ];
446 446
447 bool available = false; 447 bool available = false;
448 KABC::Address::List addressList = addr.addresses(); 448 KABC::Address::List addressList = addr.addresses();
449 KABC::Address::List::Iterator it; 449 KABC::Address::List::Iterator it;
450 for ( it = addressList.begin(); it != addressList.end(); ++it ) { 450 for ( it = addressList.begin(); it != addressList.end(); ++it ) {
451 if ( (*it).type() == type ) { 451 if ( (*it).type() == type ) {
452 (*it).setLabel( (*lineIt).valueString() ); 452 (*it).setLabel( (*lineIt).valueString() );
453 addr.insertAddress( *it ); 453 addr.insertAddress( *it );
454 available = true; 454 available = true;
455 break; 455 break;
456 } 456 }
457 } 457 }
458 458
459 if ( !available ) { // a standalone LABEL tag 459 if ( !available ) { // a standalone LABEL tag
460 KABC::Address address( type ); 460 KABC::Address address( type );
461 address.setLabel( (*lineIt).valueString() ); 461 address.setLabel( (*lineIt).valueString() );
462 addr.insertAddress( address ); 462 addr.insertAddress( address );
463 } 463 }
464 } 464 }
465 465
466 // LOGO 466 // LOGO
467 else if ( identifier == "logo" ) 467 else if ( identifier == "logo" )
468 addr.setLogo( parsePicture( *lineIt ) ); 468 addr.setLogo( parsePicture( *lineIt ) );
469 469
470 // MAILER 470 // MAILER
471 else if ( identifier == "mailer" ) 471 else if ( identifier == "mailer" )
472 addr.setMailer( (*lineIt).valueString() ); 472 addr.setMailer( (*lineIt).valueString() );
473 473
474 // N 474 // N
475 else if ( identifier == "n" ) { 475 else if ( identifier == "n" ) {
476 const QStringList nameParts = splitString( semicolonSep, (*lineIt).valueString() ); 476 const QStringList nameParts = splitString( semicolonSep, (*lineIt).valueString() );
477 if ( nameParts.count() > 0 ) 477 if ( nameParts.count() > 0 )
478 addr.setFamilyName( nameParts[ 0 ] ); 478 addr.setFamilyName( nameParts[ 0 ] );
479 if ( nameParts.count() > 1 ) 479 if ( nameParts.count() > 1 )
480 addr.setGivenName( nameParts[ 1 ] ); 480 addr.setGivenName( nameParts[ 1 ] );
481 if ( nameParts.count() > 2 ) 481 if ( nameParts.count() > 2 )
482 addr.setAdditionalName( nameParts[ 2 ] ); 482 addr.setAdditionalName( nameParts[ 2 ] );
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();
676 if ( params.findIndex( "encoding" ) != -1 ) 676 if ( params.findIndex( "encoding" ) != -1 )
677 snd.setData( line.valueBytes() ); 677 snd.setData( line.valueBytes() );
678 else if ( params.findIndex( "value" ) != -1 ) { 678 else if ( params.findIndex( "value" ) != -1 ) {
679 if ( line.parameter( "value" ).lower() == "uri" ) 679 if ( line.parameter( "value" ).lower() == "uri" )
680 snd.setUrl( line.valueString() ); 680 snd.setUrl( line.valueString() );
681 } 681 }
682 682
683/* TODO: support sound types 683/* TODO: support sound types
684 if ( params.contains( "type" ) ) 684 if ( params.contains( "type" ) )
685 snd.setType( line.parameter( "type" ) ); 685 snd.setType( line.parameter( "type" ) );
686*/ 686*/
687 687
688 return snd; 688 return snd;
689} 689}
690 690
691VCardLine VCardTool::createSound( const Sound &snd ) 691VCardLine VCardTool::createSound( const Sound &snd )
692{ 692{
693 VCardLine line( "SOUND" ); 693 VCardLine line( "SOUND" );
694 694
695 if ( snd.isIntern() ) { 695 if ( snd.isIntern() ) {
696 if ( !snd.data().isEmpty() ) { 696 if ( !snd.data().isEmpty() ) {
697 line.setValueBytes( snd.data() ); 697 line.setValueBytes( snd.data() );
698 line.addParameter( "encoding", "b" ); 698 line.addParameter( "encoding", "b" );
699 // TODO: need to store sound type!!! 699 // TODO: need to store sound type!!!
700 } 700 }
701 } else if ( !snd.url().isEmpty() ) { 701 } else if ( !snd.url().isEmpty() ) {
702 line.setValueString( snd.url() ); 702 line.setValueString( snd.url() );
703 line.addParameter( "value", "URI" ); 703 line.addParameter( "value", "URI" );
704 } 704 }
705 705
706 return line; 706 return line;
707} 707}
708 708
709Key VCardTool::parseKey( const VCardLine &line ) 709Key VCardTool::parseKey( const VCardLine &line )
710{ 710{
711 Key key; 711 Key key;
712 712
713 const QStringList params = line.parameterList(); 713 const QStringList params = line.parameterList();
714 if ( params.findIndex( "encoding" ) != -1 ) 714 if ( params.findIndex( "encoding" ) != -1 )
715 key.setBinaryData( line.valueBytes() ); 715 key.setBinaryData( line.valueBytes() );
716 else 716 else
717 key.setTextData( line.valueString() ); 717 key.setTextData( line.valueString() );
718 718
719 if ( params.findIndex( "type" ) != -1 ) { 719 if ( params.findIndex( "type" ) != -1 ) {
720 if ( line.parameter( "type" ).lower() == "x509" ) 720 if ( line.parameter( "type" ).lower() == "x509" )
721 key.setType( Key::X509 ); 721 key.setType( Key::X509 );
722 else if ( line.parameter( "type" ).lower() == "pgp" ) 722 else if ( line.parameter( "type" ).lower() == "pgp" )
723 key.setType( Key::PGP ); 723 key.setType( Key::PGP );
724 else { 724 else {
725 key.setType( Key::Custom ); 725 key.setType( Key::Custom );
726 key.setCustomTypeString( line.parameter( "type" ) ); 726 key.setCustomTypeString( line.parameter( "type" ) );
727 } 727 }
728 } 728 }
729 729
730 return key; 730 return key;
731} 731}
732 732
733VCardLine VCardTool::createKey( const Key &key ) 733VCardLine VCardTool::createKey( const Key &key )
734{ 734{
735 VCardLine line( "KEY" ); 735 VCardLine line( "KEY" );
736 736
737 if ( key.isBinary() ) { 737 if ( key.isBinary() ) {
738 if ( !key.binaryData().isEmpty() ) { 738 if ( !key.binaryData().isEmpty() ) {
739 line.setValueBytes( key.binaryData() ); 739 line.setValueBytes( key.binaryData() );
740 line.addParameter( "encoding", "b" ); 740 line.addParameter( "encoding", "b" );
741 } 741 }
742 } else if ( !key.textData().isEmpty() ) 742 } else if ( !key.textData().isEmpty() )
743 line.setValueString( key.textData() ); 743 line.setValueString( key.textData() );
744 744
745 if ( key.type() == Key::X509 ) 745 if ( key.type() == Key::X509 )
746 line.addParameter( "type", "X509" ); 746 line.addParameter( "type", "X509" );
747 else if ( key.type() == Key::PGP ) 747 else if ( key.type() == Key::PGP )
748 line.addParameter( "type", "PGP" ); 748 line.addParameter( "type", "PGP" );
749 else if ( key.type() == Key::Custom ) 749 else if ( key.type() == Key::Custom )
750 line.addParameter( "type", key.customTypeString() ); 750 line.addParameter( "type", key.customTypeString() );
751 751
752 return line; 752 return line;
753} 753}
754 754
755Secrecy VCardTool::parseSecrecy( const VCardLine &line ) 755Secrecy VCardTool::parseSecrecy( const VCardLine &line )
756{ 756{
757 Secrecy secrecy; 757 Secrecy secrecy;
758 758
759 if ( line.valueString().lower() == "public" ) 759 if ( line.valueString().lower() == "public" )
760 secrecy.setType( Secrecy::Public ); 760 secrecy.setType( Secrecy::Public );
761 if ( line.valueString().lower() == "private" ) 761 if ( line.valueString().lower() == "private" )
762 secrecy.setType( Secrecy::Private ); 762 secrecy.setType( Secrecy::Private );
763 if ( line.valueString().lower() == "confidential" ) 763 if ( line.valueString().lower() == "confidential" )
764 secrecy.setType( Secrecy::Confidential ); 764 secrecy.setType( Secrecy::Confidential );
765 765
766 return secrecy; 766 return secrecy;
767} 767}
768 768
769VCardLine VCardTool::createSecrecy( const Secrecy &secrecy ) 769VCardLine VCardTool::createSecrecy( const Secrecy &secrecy )
770{ 770{
771 VCardLine line( "CLASS" ); 771 VCardLine line( "CLASS" );
772 772
773 int type = secrecy.type(); 773 int type = secrecy.type();
774 774
775 if ( type == Secrecy::Public ) 775 if ( type == Secrecy::Public )
776 line.setValueString( "PUBLIC" ); 776 line.setValueString( "PUBLIC" );
777 else if ( type == Secrecy::Private ) 777 else if ( type == Secrecy::Private )
778 line.setValueString( "PRIVATE" ); 778 line.setValueString( "PRIVATE" );
779 else if ( type == Secrecy::Confidential ) 779 else if ( type == Secrecy::Confidential )
780 line.setValueString( "CONFIDENTIAL" ); 780 line.setValueString( "CONFIDENTIAL" );
781 781
782 return line; 782 return line;
783} 783}
784 784
785Agent VCardTool::parseAgent( const VCardLine &line ) 785Agent VCardTool::parseAgent( const VCardLine &line )
786{ 786{
787 Agent agent; 787 Agent agent;
788 788
789 const QStringList params = line.parameterList(); 789 const QStringList params = line.parameterList();
790 if ( params.findIndex( "value" ) != -1 ) { 790 if ( params.findIndex( "value" ) != -1 ) {
791 if ( line.parameter( "value" ).lower() == "uri" ) 791 if ( line.parameter( "value" ).lower() == "uri" )
792 agent.setUrl( line.valueString() ); 792 agent.setUrl( line.valueString() );
793 } else { 793 } else {
794 QString str = line.valueString(); 794 QString str = line.valueString();
795 str.replace( QRegExp("\\\\n"), "\r\n" ); 795 str.replace( QRegExp("\\\\n"), "\r\n" );
796 str.replace( QRegExp("\\\\N"), "\r\n" ); 796 str.replace( QRegExp("\\\\N"), "\r\n" );
797 str.replace( QRegExp("\\\\;"), ";" ); 797 str.replace( QRegExp("\\\\;"), ";" );
798 str.replace( QRegExp("\\\\:"), ":" ); 798 str.replace( QRegExp("\\\\:"), ":" );
799 str.replace( QRegExp("\\\\,"), "," ); 799 str.replace( QRegExp("\\\\,"), "," );
800 800
801 const Addressee::List list = parseVCards( str ); 801 const Addressee::List list = parseVCards( str );
802 if ( list.count() > 0 ) { 802 if ( list.count() > 0 ) {
803 Addressee *addr = new Addressee; 803 Addressee *addr = new Addressee;
804 *addr = list[ 0 ]; 804 *addr = list[ 0 ];
805 agent.setAddressee( addr ); 805 agent.setAddressee( addr );
806 } 806 }
807 } 807 }
808 808
809 return agent; 809 return agent;
810} 810}
811 811
812VCardLine VCardTool::createAgent( VCard::Version version, const Agent &agent ) 812VCardLine VCardTool::createAgent( VCard::Version version, const Agent &agent )
813{ 813{
814 VCardLine line( "AGENT" ); 814 VCardLine line( "AGENT" );
815 815
816 if ( agent.isIntern() ) { 816 if ( agent.isIntern() ) {
817 if ( agent.addressee() != 0 ) { 817 if ( agent.addressee() != 0 ) {
818 Addressee::List list; 818 Addressee::List list;
819 list.append( *agent.addressee() ); 819 list.append( *agent.addressee() );
820 820
821 QString str = createVCards( list, version ); 821 QString str = createVCards( list, version );
822 str.replace( QRegExp("\\r\\n"), "\\n" ); 822 str.replace( QRegExp("\\r\\n"), "\\n" );
823 str.replace( QRegExp(";"), "\\;" ); 823 str.replace( QRegExp(";"), "\\;" );
824 str.replace( QRegExp(":"), "\\:" ); 824 str.replace( QRegExp(":"), "\\:" );
825 str.replace( QRegExp(","), "\\," ); 825 str.replace( QRegExp(","), "\\," );
826 line.setValueString( str ); 826 line.setValueString( str );
827 } 827 }
828 } else if ( !agent.url().isEmpty() ) { 828 } else if ( !agent.url().isEmpty() ) {
829 line.setValueString( agent.url() ); 829 line.setValueString( agent.url() );
830 line.addParameter( "value", "URI" ); 830 line.addParameter( "value", "URI" );
831 } 831 }
832 832
833 return line; 833 return line;
834} 834}
835 835
836QStringList VCardTool::splitString( const QChar &sep, const QString &str ) 836QStringList VCardTool::splitString( const QChar &sep, const QString &str )
837{ 837{
838 QStringList list; 838 QStringList list;
839 QString value( str ); 839 QString value( str );
840 840
841 int start = 0; 841 int start = 0;
842 int pos = value.find( sep, start ); 842 int pos = value.find( sep, start );
843 843
844 while ( pos != -1 ) { 844 while ( pos != -1 ) {
845 if ( value[ pos - 1 ] != '\\' ) { 845 if ( value[ pos - 1 ] != '\\' ) {
846 if ( pos > start && pos <= (int)value.length() ) 846 if ( pos > start && pos <= (int)value.length() )
847 list << value.mid( start, pos - start ); 847 list << value.mid( start, pos - start );
848 else 848 else
849 list << QString::null; 849 list << QString::null;
850 850
851 start = pos + 1; 851 start = pos + 1;
852 pos = value.find( sep, start ); 852 pos = value.find( sep, start );
853 } else { 853 } else {
854 if ( pos != 0 ) { 854 if ( pos != 0 ) {
855 value.replace( pos - 1, 2, sep ); 855 value.replace( pos - 1, 2, sep );
856 pos = value.find( sep, pos ); 856 pos = value.find( sep, pos );
857 } else 857 } else
858 pos = value.find( sep, pos + 1 ); 858 pos = value.find( sep, pos + 1 );
859 } 859 }
860 } 860 }
861 861
862 int l = value.length() - 1; 862 int l = value.length() - 1;
863 if ( value.mid( start, l - start + 1 ).length() > 0 ) 863 if ( value.mid( start, l - start + 1 ).length() > 0 )
864 list << value.mid( start, l - start + 1 ); 864 list << value.mid( start, l - start + 1 );
865 else 865 else
866 list << QString::null; 866 list << QString::null;
867 867
868 return list; 868 return list;
869} 869}