summaryrefslogtreecommitdiffabout
path: root/kabc/addressee.cpp
Unidiff
Diffstat (limited to 'kabc/addressee.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--kabc/addressee.cpp6
1 files changed, 6 insertions, 0 deletions
diff --git a/kabc/addressee.cpp b/kabc/addressee.cpp
index 5cb194a..d484073 100644
--- a/kabc/addressee.cpp
+++ b/kabc/addressee.cpp
@@ -1,1616 +1,1622 @@
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#include <kconfig.h> 29#include <kconfig.h>
30 30
31#include <ksharedptr.h> 31#include <ksharedptr.h>
32#include <kdebug.h> 32#include <kdebug.h>
33#include <kapplication.h> 33#include <kapplication.h>
34#include <klocale.h> 34#include <klocale.h>
35//US 35//US
36#include <kstandarddirs.h> 36#include <kstandarddirs.h>
37 37
38//US #include "resource.h" 38//US #include "resource.h"
39#include "addressee.h" 39#include "addressee.h"
40 40
41using namespace KABC; 41using namespace KABC;
42 42
43static bool matchBinaryPattern( int value, int pattern ); 43static bool matchBinaryPattern( int value, int pattern );
44 44
45struct Addressee::AddresseeData : public KShared 45struct Addressee::AddresseeData : public KShared
46{ 46{
47 QString uid; 47 QString uid;
48 QString name; 48 QString name;
49 QString formattedName; 49 QString formattedName;
50 QString familyName; 50 QString familyName;
51 QString givenName; 51 QString givenName;
52 QString additionalName; 52 QString additionalName;
53 QString prefix; 53 QString prefix;
54 QString suffix; 54 QString suffix;
55 QString nickName; 55 QString nickName;
56 QDateTime birthday; 56 QDateTime birthday;
57 QString mailer; 57 QString mailer;
58 TimeZone timeZone; 58 TimeZone timeZone;
59 Geo geo; 59 Geo geo;
60 QString title; 60 QString title;
61 QString role; 61 QString role;
62 QString organization; 62 QString organization;
63 QString note; 63 QString note;
64 QString productId; 64 QString productId;
65 QDateTime revision; 65 QDateTime revision;
66 QString sortString; 66 QString sortString;
67 KURL url; 67 KURL url;
68 Secrecy secrecy; 68 Secrecy secrecy;
69 Picture logo; 69 Picture logo;
70 Picture photo; 70 Picture photo;
71 Sound sound; 71 Sound sound;
72 Agent agent; 72 Agent agent;
73 73
74 PhoneNumber::List phoneNumbers; 74 PhoneNumber::List phoneNumbers;
75 Address::List addresses; 75 Address::List addresses;
76 Key::List keys; 76 Key::List keys;
77 QStringList emails; 77 QStringList emails;
78 QStringList categories; 78 QStringList categories;
79 QStringList custom; 79 QStringList custom;
80 80
81 Resource *resource; 81 Resource *resource;
82 82
83 bool empty :1; 83 bool empty :1;
84 bool changed :1; 84 bool changed :1;
85}; 85};
86 86
87Addressee::Addressee() 87Addressee::Addressee()
88{ 88{
89 mData = new AddresseeData; 89 mData = new AddresseeData;
90 mData->empty = true; 90 mData->empty = true;
91 mData->changed = false; 91 mData->changed = false;
92 mData->resource = 0; 92 mData->resource = 0;
93} 93}
94 94
95Addressee::~Addressee() 95Addressee::~Addressee()
96{ 96{
97} 97}
98 98
99Addressee::Addressee( const Addressee &a ) 99Addressee::Addressee( const Addressee &a )
100{ 100{
101 mData = a.mData; 101 mData = a.mData;
102} 102}
103 103
104Addressee &Addressee::operator=( const Addressee &a ) 104Addressee &Addressee::operator=( const Addressee &a )
105{ 105{
106 mData = a.mData; 106 mData = a.mData;
107 return (*this); 107 return (*this);
108} 108}
109 109
110Addressee Addressee::copy() 110Addressee Addressee::copy()
111{ 111{
112 Addressee a; 112 Addressee a;
113 *(a.mData) = *mData; 113 *(a.mData) = *mData;
114 return a; 114 return a;
115} 115}
116 116
117void Addressee::detach() 117void Addressee::detach()
118{ 118{
119 if ( mData.count() == 1 ) return; 119 if ( mData.count() == 1 ) return;
120 *this = copy(); 120 *this = copy();
121} 121}
122 122
123bool Addressee::operator==( const Addressee &a ) const 123bool Addressee::operator==( const Addressee &a ) const
124{ 124{
125 if ( uid() != a.uid() ) return false; 125 if ( uid() != a.uid() ) return false;
126 if ( mData->name != a.mData->name ) return false; 126 if ( mData->name != a.mData->name ) return false;
127 if ( mData->formattedName != a.mData->formattedName ) return false; 127 if ( mData->formattedName != a.mData->formattedName ) return false;
128 if ( mData->familyName != a.mData->familyName ) return false; 128 if ( mData->familyName != a.mData->familyName ) return false;
129 if ( mData->givenName != a.mData->givenName ) return false; 129 if ( mData->givenName != a.mData->givenName ) return false;
130 if ( mData->additionalName != a.mData->additionalName ) return false; 130 if ( mData->additionalName != a.mData->additionalName ) return false;
131 if ( mData->prefix != a.mData->prefix ) return false; 131 if ( mData->prefix != a.mData->prefix ) return false;
132 if ( mData->suffix != a.mData->suffix ) return false; 132 if ( mData->suffix != a.mData->suffix ) return false;
133 if ( mData->nickName != a.mData->nickName ) return false; 133 if ( mData->nickName != a.mData->nickName ) return false;
134 if ( mData->birthday != a.mData->birthday ) return false; 134 if ( mData->birthday != a.mData->birthday ) return false;
135 if ( mData->mailer != a.mData->mailer ) return false; 135 if ( mData->mailer != a.mData->mailer ) return false;
136 if ( mData->timeZone != a.mData->timeZone ) return false; 136 if ( mData->timeZone != a.mData->timeZone ) return false;
137 if ( mData->geo != a.mData->geo ) return false; 137 if ( mData->geo != a.mData->geo ) return false;
138 if ( mData->title != a.mData->title ) return false; 138 if ( mData->title != a.mData->title ) return false;
139 if ( mData->role != a.mData->role ) return false; 139 if ( mData->role != a.mData->role ) return false;
140 if ( mData->organization != a.mData->organization ) return false; 140 if ( mData->organization != a.mData->organization ) return false;
141 if ( mData->note != a.mData->note ) return false; 141 if ( mData->note != a.mData->note ) return false;
142 if ( mData->productId != a.mData->productId ) return false; 142 if ( mData->productId != a.mData->productId ) return false;
143 if ( mData->revision != a.mData->revision ) return false; 143 if ( mData->revision != a.mData->revision ) return false;
144 if ( mData->sortString != a.mData->sortString ) return false; 144 if ( mData->sortString != a.mData->sortString ) return false;
145 if ( mData->secrecy != a.mData->secrecy ) return false; 145 if ( mData->secrecy != a.mData->secrecy ) return false;
146 if ( mData->logo != a.mData->logo ) return false; 146 if ( mData->logo != a.mData->logo ) return false;
147 if ( mData->photo != a.mData->photo ) return false; 147 if ( mData->photo != a.mData->photo ) return false;
148 if ( mData->sound != a.mData->sound ) return false; 148 if ( mData->sound != a.mData->sound ) return false;
149 if ( mData->agent != a.mData->agent ) return false; 149 if ( mData->agent != a.mData->agent ) return false;
150 if ( ( mData->url.isValid() || a.mData->url.isValid() ) && 150 if ( ( mData->url.isValid() || a.mData->url.isValid() ) &&
151 ( mData->url != a.mData->url ) ) return false; 151 ( mData->url != a.mData->url ) ) return false;
152 if ( mData->phoneNumbers != a.mData->phoneNumbers ) return false; 152 if ( mData->phoneNumbers != a.mData->phoneNumbers ) return false;
153 if ( mData->addresses != a.mData->addresses ) return false; 153 if ( mData->addresses != a.mData->addresses ) return false;
154 if ( mData->keys != a.mData->keys ) return false; 154 if ( mData->keys != a.mData->keys ) return false;
155 if ( mData->emails != a.mData->emails ) return false; 155 if ( mData->emails != a.mData->emails ) return false;
156 if ( mData->categories != a.mData->categories ) return false; 156 if ( mData->categories != a.mData->categories ) return false;
157 if ( mData->custom != a.mData->custom ) return false; 157 if ( mData->custom != a.mData->custom ) return false;
158 158
159 return true; 159 return true;
160} 160}
161 161
162bool Addressee::operator!=( const Addressee &a ) const 162bool Addressee::operator!=( const Addressee &a ) const
163{ 163{
164 return !( a == *this ); 164 return !( a == *this );
165} 165}
166 166
167bool Addressee::isEmpty() const 167bool Addressee::isEmpty() const
168{ 168{
169 return mData->empty; 169 return mData->empty;
170} 170}
171 171
172void Addressee::setUid( const QString &id ) 172void Addressee::setUid( const QString &id )
173{ 173{
174 if ( id == mData->uid ) return; 174 if ( id == mData->uid ) return;
175 detach(); 175 detach();
176 mData->empty = false; 176 mData->empty = false;
177 mData->uid = id; 177 mData->uid = id;
178} 178}
179 179
180QString Addressee::uid() const 180QString Addressee::uid() const
181{ 181{
182 if ( mData->uid.isEmpty() ) 182 if ( mData->uid.isEmpty() )
183 mData->uid = KApplication::randomString( 10 ); 183 mData->uid = KApplication::randomString( 10 );
184 184
185 return mData->uid; 185 return mData->uid;
186} 186}
187 187
188QString Addressee::uidLabel() 188QString Addressee::uidLabel()
189{ 189{
190 return i18n("Unique Identifier"); 190 return i18n("Unique Identifier");
191} 191}
192 192
193void Addressee::setName( const QString &name ) 193void Addressee::setName( const QString &name )
194{ 194{
195 if ( name == mData->name ) return; 195 if ( name == mData->name ) return;
196 detach(); 196 detach();
197 mData->empty = false; 197 mData->empty = false;
198 mData->name = name; 198 mData->name = name;
199} 199}
200 200
201QString Addressee::name() const 201QString Addressee::name() const
202{ 202{
203 return mData->name; 203 return mData->name;
204} 204}
205 205
206QString Addressee::nameLabel() 206QString Addressee::nameLabel()
207{ 207{
208 return i18n("Name"); 208 return i18n("Name");
209} 209}
210 210
211 211
212void Addressee::setFormattedName( const QString &formattedName ) 212void Addressee::setFormattedName( const QString &formattedName )
213{ 213{
214 if ( formattedName == mData->formattedName ) return; 214 if ( formattedName == mData->formattedName ) return;
215 detach(); 215 detach();
216 mData->empty = false; 216 mData->empty = false;
217 mData->formattedName = formattedName; 217 mData->formattedName = formattedName;
218} 218}
219 219
220QString Addressee::formattedName() const 220QString Addressee::formattedName() const
221{ 221{
222 return mData->formattedName; 222 return mData->formattedName;
223} 223}
224 224
225QString Addressee::formattedNameLabel() 225QString Addressee::formattedNameLabel()
226{ 226{
227 return i18n("Formatted Name"); 227 return i18n("Formatted Name");
228} 228}
229 229
230 230
231void Addressee::setFamilyName( const QString &familyName ) 231void Addressee::setFamilyName( const QString &familyName )
232{ 232{
233 if ( familyName == mData->familyName ) return; 233 if ( familyName == mData->familyName ) return;
234 detach(); 234 detach();
235 mData->empty = false; 235 mData->empty = false;
236 mData->familyName = familyName; 236 mData->familyName = familyName;
237} 237}
238 238
239QString Addressee::familyName() const 239QString Addressee::familyName() const
240{ 240{
241 return mData->familyName; 241 return mData->familyName;
242} 242}
243 243
244QString Addressee::familyNameLabel() 244QString Addressee::familyNameLabel()
245{ 245{
246 return i18n("Family Name"); 246 return i18n("Family Name");
247} 247}
248 248
249 249
250void Addressee::setGivenName( const QString &givenName ) 250void Addressee::setGivenName( const QString &givenName )
251{ 251{
252 if ( givenName == mData->givenName ) return; 252 if ( givenName == mData->givenName ) return;
253 detach(); 253 detach();
254 mData->empty = false; 254 mData->empty = false;
255 mData->givenName = givenName; 255 mData->givenName = givenName;
256} 256}
257 257
258QString Addressee::givenName() const 258QString Addressee::givenName() const
259{ 259{
260 return mData->givenName; 260 return mData->givenName;
261} 261}
262 262
263QString Addressee::givenNameLabel() 263QString Addressee::givenNameLabel()
264{ 264{
265 return i18n("Given Name"); 265 return i18n("Given Name");
266} 266}
267 267
268 268
269void Addressee::setAdditionalName( const QString &additionalName ) 269void Addressee::setAdditionalName( const QString &additionalName )
270{ 270{
271 if ( additionalName == mData->additionalName ) return; 271 if ( additionalName == mData->additionalName ) return;
272 detach(); 272 detach();
273 mData->empty = false; 273 mData->empty = false;
274 mData->additionalName = additionalName; 274 mData->additionalName = additionalName;
275} 275}
276 276
277QString Addressee::additionalName() const 277QString Addressee::additionalName() const
278{ 278{
279 return mData->additionalName; 279 return mData->additionalName;
280} 280}
281 281
282QString Addressee::additionalNameLabel() 282QString Addressee::additionalNameLabel()
283{ 283{
284 return i18n("Additional Names"); 284 return i18n("Additional Names");
285} 285}
286 286
287 287
288void Addressee::setPrefix( const QString &prefix ) 288void Addressee::setPrefix( const QString &prefix )
289{ 289{
290 if ( prefix == mData->prefix ) return; 290 if ( prefix == mData->prefix ) return;
291 detach(); 291 detach();
292 mData->empty = false; 292 mData->empty = false;
293 mData->prefix = prefix; 293 mData->prefix = prefix;
294} 294}
295 295
296QString Addressee::prefix() const 296QString Addressee::prefix() const
297{ 297{
298 return mData->prefix; 298 return mData->prefix;
299} 299}
300 300
301QString Addressee::prefixLabel() 301QString Addressee::prefixLabel()
302{ 302{
303 return i18n("Honorific Prefixes"); 303 return i18n("Honorific Prefixes");
304} 304}
305 305
306 306
307void Addressee::setSuffix( const QString &suffix ) 307void Addressee::setSuffix( const QString &suffix )
308{ 308{
309 if ( suffix == mData->suffix ) return; 309 if ( suffix == mData->suffix ) return;
310 detach(); 310 detach();
311 mData->empty = false; 311 mData->empty = false;
312 mData->suffix = suffix; 312 mData->suffix = suffix;
313} 313}
314 314
315QString Addressee::suffix() const 315QString Addressee::suffix() const
316{ 316{
317 return mData->suffix; 317 return mData->suffix;
318} 318}
319 319
320QString Addressee::suffixLabel() 320QString Addressee::suffixLabel()
321{ 321{
322 return i18n("Honorific Suffixes"); 322 return i18n("Honorific Suffixes");
323} 323}
324 324
325 325
326void Addressee::setNickName( const QString &nickName ) 326void Addressee::setNickName( const QString &nickName )
327{ 327{
328 if ( nickName == mData->nickName ) return; 328 if ( nickName == mData->nickName ) return;
329 detach(); 329 detach();
330 mData->empty = false; 330 mData->empty = false;
331 mData->nickName = nickName; 331 mData->nickName = nickName;
332} 332}
333 333
334QString Addressee::nickName() const 334QString Addressee::nickName() const
335{ 335{
336 return mData->nickName; 336 return mData->nickName;
337} 337}
338 338
339QString Addressee::nickNameLabel() 339QString Addressee::nickNameLabel()
340{ 340{
341 return i18n("Nick Name"); 341 return i18n("Nick Name");
342} 342}
343 343
344 344
345void Addressee::setBirthday( const QDateTime &birthday ) 345void Addressee::setBirthday( const QDateTime &birthday )
346{ 346{
347 if ( birthday == mData->birthday ) return; 347 if ( birthday == mData->birthday ) return;
348 detach(); 348 detach();
349 mData->empty = false; 349 mData->empty = false;
350 mData->birthday = birthday; 350 mData->birthday = birthday;
351} 351}
352 352
353QDateTime Addressee::birthday() const 353QDateTime Addressee::birthday() const
354{ 354{
355 return mData->birthday; 355 return mData->birthday;
356} 356}
357 357
358QString Addressee::birthdayLabel() 358QString Addressee::birthdayLabel()
359{ 359{
360 return i18n("Birthday"); 360 return i18n("Birthday");
361} 361}
362 362
363 363
364QString Addressee::homeAddressStreetLabel() 364QString Addressee::homeAddressStreetLabel()
365{ 365{
366 return i18n("Home Address Street"); 366 return i18n("Home Address Street");
367} 367}
368 368
369 369
370QString Addressee::homeAddressLocalityLabel() 370QString Addressee::homeAddressLocalityLabel()
371{ 371{
372 return i18n("Home Address Locality"); 372 return i18n("Home Address Locality");
373} 373}
374 374
375 375
376QString Addressee::homeAddressRegionLabel() 376QString Addressee::homeAddressRegionLabel()
377{ 377{
378 return i18n("Home Address Region"); 378 return i18n("Home Address Region");
379} 379}
380 380
381 381
382QString Addressee::homeAddressPostalCodeLabel() 382QString Addressee::homeAddressPostalCodeLabel()
383{ 383{
384 return i18n("Home Address Postal Code"); 384 return i18n("Home Address Postal Code");
385} 385}
386 386
387 387
388QString Addressee::homeAddressCountryLabel() 388QString Addressee::homeAddressCountryLabel()
389{ 389{
390 return i18n("Home Address Country"); 390 return i18n("Home Address Country");
391} 391}
392 392
393 393
394QString Addressee::homeAddressLabelLabel() 394QString Addressee::homeAddressLabelLabel()
395{ 395{
396 return i18n("Home Address Label"); 396 return i18n("Home Address Label");
397} 397}
398 398
399 399
400QString Addressee::businessAddressStreetLabel() 400QString Addressee::businessAddressStreetLabel()
401{ 401{
402 return i18n("Business Address Street"); 402 return i18n("Business Address Street");
403} 403}
404 404
405 405
406QString Addressee::businessAddressLocalityLabel() 406QString Addressee::businessAddressLocalityLabel()
407{ 407{
408 return i18n("Business Address Locality"); 408 return i18n("Business Address Locality");
409} 409}
410 410
411 411
412QString Addressee::businessAddressRegionLabel() 412QString Addressee::businessAddressRegionLabel()
413{ 413{
414 return i18n("Business Address Region"); 414 return i18n("Business Address Region");
415} 415}
416 416
417 417
418QString Addressee::businessAddressPostalCodeLabel() 418QString Addressee::businessAddressPostalCodeLabel()
419{ 419{
420 return i18n("Business Address Postal Code"); 420 return i18n("Business Address Postal Code");
421} 421}
422 422
423 423
424QString Addressee::businessAddressCountryLabel() 424QString Addressee::businessAddressCountryLabel()
425{ 425{
426 return i18n("Business Address Country"); 426 return i18n("Business Address Country");
427} 427}
428 428
429 429
430QString Addressee::businessAddressLabelLabel() 430QString Addressee::businessAddressLabelLabel()
431{ 431{
432 return i18n("Business Address Label"); 432 return i18n("Business Address Label");
433} 433}
434 434
435 435
436QString Addressee::homePhoneLabel() 436QString Addressee::homePhoneLabel()
437{ 437{
438 return i18n("Home Phone"); 438 return i18n("Home Phone");
439} 439}
440 440
441 441
442QString Addressee::businessPhoneLabel() 442QString Addressee::businessPhoneLabel()
443{ 443{
444 return i18n("Business Phone"); 444 return i18n("Business Phone");
445} 445}
446 446
447 447
448QString Addressee::mobilePhoneLabel() 448QString Addressee::mobilePhoneLabel()
449{ 449{
450 return i18n("Mobile Phone"); 450 return i18n("Mobile Phone");
451} 451}
452 452
453 453
454QString Addressee::homeFaxLabel() 454QString Addressee::homeFaxLabel()
455{ 455{
456 return i18n("Home Fax"); 456 return i18n("Home Fax");
457} 457}
458 458
459 459
460QString Addressee::businessFaxLabel() 460QString Addressee::businessFaxLabel()
461{ 461{
462 return i18n("Business Fax"); 462 return i18n("Business Fax");
463} 463}
464 464
465 465
466QString Addressee::carPhoneLabel() 466QString Addressee::carPhoneLabel()
467{ 467{
468 return i18n("Car Phone"); 468 return i18n("Car Phone");
469} 469}
470 470
471 471
472QString Addressee::isdnLabel() 472QString Addressee::isdnLabel()
473{ 473{
474 return i18n("ISDN"); 474 return i18n("ISDN");
475} 475}
476 476
477 477
478QString Addressee::pagerLabel() 478QString Addressee::pagerLabel()
479{ 479{
480 return i18n("Pager"); 480 return i18n("Pager");
481} 481}
482 482
483 483
484QString Addressee::emailLabel() 484QString Addressee::emailLabel()
485{ 485{
486 return i18n("Email Address"); 486 return i18n("Email Address");
487} 487}
488 488
489 489
490void Addressee::setMailer( const QString &mailer ) 490void Addressee::setMailer( const QString &mailer )
491{ 491{
492 if ( mailer == mData->mailer ) return; 492 if ( mailer == mData->mailer ) return;
493 detach(); 493 detach();
494 mData->empty = false; 494 mData->empty = false;
495 mData->mailer = mailer; 495 mData->mailer = mailer;
496} 496}
497 497
498QString Addressee::mailer() const 498QString Addressee::mailer() const
499{ 499{
500 return mData->mailer; 500 return mData->mailer;
501} 501}
502 502
503QString Addressee::mailerLabel() 503QString Addressee::mailerLabel()
504{ 504{
505 return i18n("Mail Client"); 505 return i18n("Mail Client");
506} 506}
507 507
508 508
509void Addressee::setTimeZone( const TimeZone &timeZone ) 509void Addressee::setTimeZone( const TimeZone &timeZone )
510{ 510{
511 if ( timeZone == mData->timeZone ) return; 511 if ( timeZone == mData->timeZone ) return;
512 detach(); 512 detach();
513 mData->empty = false; 513 mData->empty = false;
514 mData->timeZone = timeZone; 514 mData->timeZone = timeZone;
515} 515}
516 516
517TimeZone Addressee::timeZone() const 517TimeZone Addressee::timeZone() const
518{ 518{
519 return mData->timeZone; 519 return mData->timeZone;
520} 520}
521 521
522QString Addressee::timeZoneLabel() 522QString Addressee::timeZoneLabel()
523{ 523{
524 return i18n("Time Zone"); 524 return i18n("Time Zone");
525} 525}
526 526
527 527
528void Addressee::setGeo( const Geo &geo ) 528void Addressee::setGeo( const Geo &geo )
529{ 529{
530 if ( geo == mData->geo ) return; 530 if ( geo == mData->geo ) return;
531 detach(); 531 detach();
532 mData->empty = false; 532 mData->empty = false;
533 mData->geo = geo; 533 mData->geo = geo;
534} 534}
535 535
536Geo Addressee::geo() const 536Geo Addressee::geo() const
537{ 537{
538 return mData->geo; 538 return mData->geo;
539} 539}
540 540
541QString Addressee::geoLabel() 541QString Addressee::geoLabel()
542{ 542{
543 return i18n("Geographic Position"); 543 return i18n("Geographic Position");
544} 544}
545 545
546 546
547void Addressee::setTitle( const QString &title ) 547void Addressee::setTitle( const QString &title )
548{ 548{
549 if ( title == mData->title ) return; 549 if ( title == mData->title ) return;
550 detach(); 550 detach();
551 mData->empty = false; 551 mData->empty = false;
552 mData->title = title; 552 mData->title = title;
553} 553}
554 554
555QString Addressee::title() const 555QString Addressee::title() const
556{ 556{
557 return mData->title; 557 return mData->title;
558} 558}
559 559
560QString Addressee::titleLabel() 560QString Addressee::titleLabel()
561{ 561{
562 return i18n("Title"); 562 return i18n("Title");
563} 563}
564 564
565 565
566void Addressee::setRole( const QString &role ) 566void Addressee::setRole( const QString &role )
567{ 567{
568 if ( role == mData->role ) return; 568 if ( role == mData->role ) return;
569 detach(); 569 detach();
570 mData->empty = false; 570 mData->empty = false;
571 mData->role = role; 571 mData->role = role;
572} 572}
573 573
574QString Addressee::role() const 574QString Addressee::role() const
575{ 575{
576 return mData->role; 576 return mData->role;
577} 577}
578 578
579QString Addressee::roleLabel() 579QString Addressee::roleLabel()
580{ 580{
581 return i18n("Role"); 581 return i18n("Role");
582} 582}
583 583
584 584
585void Addressee::setOrganization( const QString &organization ) 585void Addressee::setOrganization( const QString &organization )
586{ 586{
587 if ( organization == mData->organization ) return; 587 if ( organization == mData->organization ) return;
588 detach(); 588 detach();
589 mData->empty = false; 589 mData->empty = false;
590 mData->organization = organization; 590 mData->organization = organization;
591} 591}
592 592
593QString Addressee::organization() const 593QString Addressee::organization() const
594{ 594{
595 return mData->organization; 595 return mData->organization;
596} 596}
597 597
598QString Addressee::organizationLabel() 598QString Addressee::organizationLabel()
599{ 599{
600 return i18n("Organization"); 600 return i18n("Organization");
601} 601}
602 602
603 603
604void Addressee::setNote( const QString &note ) 604void Addressee::setNote( const QString &note )
605{ 605{
606 if ( note == mData->note ) return; 606 if ( note == mData->note ) return;
607 detach(); 607 detach();
608 mData->empty = false; 608 mData->empty = false;
609 mData->note = note; 609 mData->note = note;
610} 610}
611 611
612QString Addressee::note() const 612QString Addressee::note() const
613{ 613{
614 return mData->note; 614 return mData->note;
615} 615}
616 616
617QString Addressee::noteLabel() 617QString Addressee::noteLabel()
618{ 618{
619 return i18n("Note"); 619 return i18n("Note");
620} 620}
621 621
622 622
623void Addressee::setProductId( const QString &productId ) 623void Addressee::setProductId( const QString &productId )
624{ 624{
625 if ( productId == mData->productId ) return; 625 if ( productId == mData->productId ) return;
626 detach(); 626 detach();
627 mData->empty = false; 627 mData->empty = false;
628 mData->productId = productId; 628 mData->productId = productId;
629} 629}
630 630
631QString Addressee::productId() const 631QString Addressee::productId() const
632{ 632{
633 return mData->productId; 633 return mData->productId;
634} 634}
635 635
636QString Addressee::productIdLabel() 636QString Addressee::productIdLabel()
637{ 637{
638 return i18n("Product Identifier"); 638 return i18n("Product Identifier");
639} 639}
640 640
641 641
642void Addressee::setRevision( const QDateTime &revision ) 642void Addressee::setRevision( const QDateTime &revision )
643{ 643{
644 if ( revision == mData->revision ) return; 644 if ( revision == mData->revision ) return;
645 detach(); 645 detach();
646 mData->empty = false; 646 mData->empty = false;
647 mData->revision = revision; 647 mData->revision = revision;
648} 648}
649 649
650QDateTime Addressee::revision() const 650QDateTime Addressee::revision() const
651{ 651{
652 return mData->revision; 652 return mData->revision;
653} 653}
654 654
655QString Addressee::revisionLabel() 655QString Addressee::revisionLabel()
656{ 656{
657 return i18n("Revision Date"); 657 return i18n("Revision Date");
658} 658}
659 659
660 660
661void Addressee::setSortString( const QString &sortString ) 661void Addressee::setSortString( const QString &sortString )
662{ 662{
663 if ( sortString == mData->sortString ) return; 663 if ( sortString == mData->sortString ) return;
664 detach(); 664 detach();
665 mData->empty = false; 665 mData->empty = false;
666 mData->sortString = sortString; 666 mData->sortString = sortString;
667} 667}
668 668
669QString Addressee::sortString() const 669QString Addressee::sortString() const
670{ 670{
671 return mData->sortString; 671 return mData->sortString;
672} 672}
673 673
674QString Addressee::sortStringLabel() 674QString Addressee::sortStringLabel()
675{ 675{
676 return i18n("Sort String"); 676 return i18n("Sort String");
677} 677}
678 678
679 679
680void Addressee::setUrl( const KURL &url ) 680void Addressee::setUrl( const KURL &url )
681{ 681{
682 if ( url == mData->url ) return; 682 if ( url == mData->url ) return;
683 detach(); 683 detach();
684 mData->empty = false; 684 mData->empty = false;
685 mData->url = url; 685 mData->url = url;
686} 686}
687 687
688KURL Addressee::url() const 688KURL Addressee::url() const
689{ 689{
690 return mData->url; 690 return mData->url;
691} 691}
692 692
693QString Addressee::urlLabel() 693QString Addressee::urlLabel()
694{ 694{
695 return i18n("URL"); 695 return i18n("URL");
696} 696}
697 697
698 698
699void Addressee::setSecrecy( const Secrecy &secrecy ) 699void Addressee::setSecrecy( const Secrecy &secrecy )
700{ 700{
701 if ( secrecy == mData->secrecy ) return; 701 if ( secrecy == mData->secrecy ) return;
702 detach(); 702 detach();
703 mData->empty = false; 703 mData->empty = false;
704 mData->secrecy = secrecy; 704 mData->secrecy = secrecy;
705} 705}
706 706
707Secrecy Addressee::secrecy() const 707Secrecy Addressee::secrecy() const
708{ 708{
709 return mData->secrecy; 709 return mData->secrecy;
710} 710}
711 711
712QString Addressee::secrecyLabel() 712QString Addressee::secrecyLabel()
713{ 713{
714 return i18n("Security Class"); 714 return i18n("Security Class");
715} 715}
716 716
717 717
718void Addressee::setLogo( const Picture &logo ) 718void Addressee::setLogo( const Picture &logo )
719{ 719{
720 if ( logo == mData->logo ) return; 720 if ( logo == mData->logo ) return;
721 detach(); 721 detach();
722 mData->empty = false; 722 mData->empty = false;
723 mData->logo = logo; 723 mData->logo = logo;
724} 724}
725 725
726Picture Addressee::logo() const 726Picture Addressee::logo() const
727{ 727{
728 return mData->logo; 728 return mData->logo;
729} 729}
730 730
731QString Addressee::logoLabel() 731QString Addressee::logoLabel()
732{ 732{
733 return i18n("Logo"); 733 return i18n("Logo");
734} 734}
735 735
736 736
737void Addressee::setPhoto( const Picture &photo ) 737void Addressee::setPhoto( const Picture &photo )
738{ 738{
739 if ( photo == mData->photo ) return; 739 if ( photo == mData->photo ) return;
740 detach(); 740 detach();
741 mData->empty = false; 741 mData->empty = false;
742 mData->photo = photo; 742 mData->photo = photo;
743} 743}
744 744
745Picture Addressee::photo() const 745Picture Addressee::photo() const
746{ 746{
747 return mData->photo; 747 return mData->photo;
748} 748}
749 749
750QString Addressee::photoLabel() 750QString Addressee::photoLabel()
751{ 751{
752 return i18n("Photo"); 752 return i18n("Photo");
753} 753}
754 754
755 755
756void Addressee::setSound( const Sound &sound ) 756void Addressee::setSound( const Sound &sound )
757{ 757{
758 if ( sound == mData->sound ) return; 758 if ( sound == mData->sound ) return;
759 detach(); 759 detach();
760 mData->empty = false; 760 mData->empty = false;
761 mData->sound = sound; 761 mData->sound = sound;
762} 762}
763 763
764Sound Addressee::sound() const 764Sound Addressee::sound() const
765{ 765{
766 return mData->sound; 766 return mData->sound;
767} 767}
768 768
769QString Addressee::soundLabel() 769QString Addressee::soundLabel()
770{ 770{
771 return i18n("Sound"); 771 return i18n("Sound");
772} 772}
773 773
774 774
775void Addressee::setAgent( const Agent &agent ) 775void Addressee::setAgent( const Agent &agent )
776{ 776{
777 if ( agent == mData->agent ) return; 777 if ( agent == mData->agent ) return;
778 detach(); 778 detach();
779 mData->empty = false; 779 mData->empty = false;
780 mData->agent = agent; 780 mData->agent = agent;
781} 781}
782 782
783Agent Addressee::agent() const 783Agent Addressee::agent() const
784{ 784{
785 return mData->agent; 785 return mData->agent;
786} 786}
787 787
788QString Addressee::agentLabel() 788QString Addressee::agentLabel()
789{ 789{
790 return i18n("Agent"); 790 return i18n("Agent");
791} 791}
792 792
793 793
794 794
795void Addressee::setNameFromString( const QString &str ) 795void Addressee::setNameFromString( const QString &str )
796{ 796{
797 setFormattedName( str ); 797 setFormattedName( str );
798 setName( str ); 798 setName( str );
799 799
800 QStringList titles; 800 QStringList titles;
801 titles += i18n( "Dr." ); 801 titles += i18n( "Dr." );
802 titles += i18n( "Miss" ); 802 titles += i18n( "Miss" );
803 titles += i18n( "Mr." ); 803 titles += i18n( "Mr." );
804 titles += i18n( "Mrs." ); 804 titles += i18n( "Mrs." );
805 titles += i18n( "Ms." ); 805 titles += i18n( "Ms." );
806 titles += i18n( "Prof." ); 806 titles += i18n( "Prof." );
807 807
808 QStringList suffixes; 808 QStringList suffixes;
809 suffixes += i18n( "I" ); 809 suffixes += i18n( "I" );
810 suffixes += i18n( "II" ); 810 suffixes += i18n( "II" );
811 suffixes += i18n( "III" ); 811 suffixes += i18n( "III" );
812 suffixes += i18n( "Jr." ); 812 suffixes += i18n( "Jr." );
813 suffixes += i18n( "Sr." ); 813 suffixes += i18n( "Sr." );
814 814
815 QStringList prefixes; 815 QStringList prefixes;
816 prefixes += "van"; 816 prefixes += "van";
817 prefixes += "von"; 817 prefixes += "von";
818 prefixes += "de"; 818 prefixes += "de";
819 819
820//US KConfig config( "kabcrc" ); 820//US KConfig config( "kabcrc" );
821 KConfig config( locateLocal( "config", "kabcrc") ); 821 KConfig config( locateLocal( "config", "kabcrc") );
822 config.setGroup( "General" ); 822 config.setGroup( "General" );
823 titles += config.readListEntry( "Prefixes" ); 823 titles += config.readListEntry( "Prefixes" );
824 titles.remove( "" ); 824 titles.remove( "" );
825 prefixes += config.readListEntry( "Inclusions" ); 825 prefixes += config.readListEntry( "Inclusions" );
826 prefixes.remove( "" ); 826 prefixes.remove( "" );
827 suffixes += config.readListEntry( "Suffixes" ); 827 suffixes += config.readListEntry( "Suffixes" );
828 suffixes.remove( "" ); 828 suffixes.remove( "" );
829 829
830 // clear all name parts 830 // clear all name parts
831 setPrefix( "" ); 831 setPrefix( "" );
832 setGivenName( "" ); 832 setGivenName( "" );
833 setAdditionalName( "" ); 833 setAdditionalName( "" );
834 setFamilyName( "" ); 834 setFamilyName( "" );
835 setSuffix( "" ); 835 setSuffix( "" );
836 836
837 if ( str.isEmpty() ) 837 if ( str.isEmpty() )
838 return; 838 return;
839 839
840 int i = str.find(','); 840 int i = str.find(',');
841 if( i < 0 ) { 841 if( i < 0 ) {
842 QStringList parts = QStringList::split( " ", str ); 842 QStringList parts = QStringList::split( " ", str );
843 int leftOffset = 0; 843 int leftOffset = 0;
844 int rightOffset = parts.count() - 1; 844 int rightOffset = parts.count() - 1;
845 845
846 QString suffix; 846 QString suffix;
847 while ( rightOffset >= 0 ) { 847 while ( rightOffset >= 0 ) {
848 if ( suffixes.contains( parts[ rightOffset ] ) ) { 848 if ( suffixes.contains( parts[ rightOffset ] ) ) {
849 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " ")); 849 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " "));
850 rightOffset--; 850 rightOffset--;
851 } else 851 } else
852 break; 852 break;
853 } 853 }
854 setSuffix( suffix ); 854 setSuffix( suffix );
855 855
856 if ( rightOffset < 0 ) 856 if ( rightOffset < 0 )
857 return; 857 return;
858 858
859 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) { 859 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) {
860 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] ); 860 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] );
861 rightOffset--; 861 rightOffset--;
862 } else 862 } else
863 setFamilyName( parts[ rightOffset ] ); 863 setFamilyName( parts[ rightOffset ] );
864 864
865 QString prefix; 865 QString prefix;
866 while ( leftOffset < rightOffset ) { 866 while ( leftOffset < rightOffset ) {
867 if ( titles.contains( parts[ leftOffset ] ) ) { 867 if ( titles.contains( parts[ leftOffset ] ) ) {
868 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 868 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] );
869 leftOffset++; 869 leftOffset++;
870 } else 870 } else
871 break; 871 break;
872 } 872 }
873 setPrefix( prefix ); 873 setPrefix( prefix );
874 874
875 if ( leftOffset < rightOffset ) { 875 if ( leftOffset < rightOffset ) {
876 setGivenName( parts[ leftOffset ] ); 876 setGivenName( parts[ leftOffset ] );
877 leftOffset++; 877 leftOffset++;
878 } 878 }
879 879
880 QString additionalName; 880 QString additionalName;
881 while ( leftOffset < rightOffset ) { 881 while ( leftOffset < rightOffset ) {
882 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 882 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] );
883 leftOffset++; 883 leftOffset++;
884 } 884 }
885 setAdditionalName( additionalName ); 885 setAdditionalName( additionalName );
886 } else { 886 } else {
887 QString part1 = str.left( i ); 887 QString part1 = str.left( i );
888 QString part2 = str.mid( i + 1 ); 888 QString part2 = str.mid( i + 1 );
889 889
890 QStringList parts = QStringList::split( " ", part1 ); 890 QStringList parts = QStringList::split( " ", part1 );
891 int leftOffset = 0; 891 int leftOffset = 0;
892 int rightOffset = parts.count() - 1; 892 int rightOffset = parts.count() - 1;
893 893
894 QString suffix; 894 QString suffix;
895 while ( rightOffset >= 0 ) { 895 while ( rightOffset >= 0 ) {
896 if ( suffixes.contains( parts[ rightOffset ] ) ) { 896 if ( suffixes.contains( parts[ rightOffset ] ) ) {
897 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " ")); 897 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " "));
898 rightOffset--; 898 rightOffset--;
899 } else 899 } else
900 break; 900 break;
901 } 901 }
902 setSuffix( suffix ); 902 setSuffix( suffix );
903 903
904 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) { 904 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) {
905 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] ); 905 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] );
906 rightOffset--; 906 rightOffset--;
907 } else 907 } else
908 setFamilyName( parts[ rightOffset ] ); 908 setFamilyName( parts[ rightOffset ] );
909 909
910 QString prefix; 910 QString prefix;
911 while ( leftOffset < rightOffset ) { 911 while ( leftOffset < rightOffset ) {
912 if ( titles.contains( parts[ leftOffset ] ) ) { 912 if ( titles.contains( parts[ leftOffset ] ) ) {
913 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 913 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] );
914 leftOffset++; 914 leftOffset++;
915 } else 915 } else
916 break; 916 break;
917 } 917 }
918 918
919 parts = QStringList::split( " ", part2 ); 919 parts = QStringList::split( " ", part2 );
920 920
921 leftOffset = 0; 921 leftOffset = 0;
922 rightOffset = parts.count(); 922 rightOffset = parts.count();
923 923
924 while ( leftOffset < rightOffset ) { 924 while ( leftOffset < rightOffset ) {
925 if ( titles.contains( parts[ leftOffset ] ) ) { 925 if ( titles.contains( parts[ leftOffset ] ) ) {
926 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 926 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] );
927 leftOffset++; 927 leftOffset++;
928 } else 928 } else
929 break; 929 break;
930 } 930 }
931 setPrefix( prefix ); 931 setPrefix( prefix );
932 932
933 if ( leftOffset < rightOffset ) { 933 if ( leftOffset < rightOffset ) {
934 setGivenName( parts[ leftOffset ] ); 934 setGivenName( parts[ leftOffset ] );
935 leftOffset++; 935 leftOffset++;
936 } 936 }
937 937
938 QString additionalName; 938 QString additionalName;
939 while ( leftOffset < rightOffset ) { 939 while ( leftOffset < rightOffset ) {
940 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 940 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] );
941 leftOffset++; 941 leftOffset++;
942 } 942 }
943 setAdditionalName( additionalName ); 943 setAdditionalName( additionalName );
944 } 944 }
945} 945}
946 946
947QString Addressee::realName() const 947QString Addressee::realName() const
948{ 948{
949 if ( !formattedName().isEmpty() ) 949 if ( !formattedName().isEmpty() )
950 return formattedName(); 950 return formattedName();
951 951
952 QString n = assembledName(); 952 QString n = assembledName();
953 953
954 if ( n.isEmpty() ) 954 if ( n.isEmpty() )
955 n = name(); 955 n = name();
956 956
957 return n; 957 return n;
958} 958}
959 959
960QString Addressee::assembledName() const 960QString Addressee::assembledName() const
961{ 961{
962 QString name = prefix() + " " + givenName() + " " + additionalName() + " " + 962 QString name = prefix() + " " + givenName() + " " + additionalName() + " " +
963 familyName() + " " + suffix(); 963 familyName() + " " + suffix();
964 964
965 return name.simplifyWhiteSpace(); 965 return name.simplifyWhiteSpace();
966} 966}
967 967
968QString Addressee::fullEmail( const QString &email ) const 968QString Addressee::fullEmail( const QString &email ) const
969{ 969{
970 QString e; 970 QString e;
971 if ( email.isNull() ) { 971 if ( email.isNull() ) {
972 e = preferredEmail(); 972 e = preferredEmail();
973 } else { 973 } else {
974 e = email; 974 e = email;
975 } 975 }
976 if ( e.isEmpty() ) return QString::null; 976 if ( e.isEmpty() ) return QString::null;
977 977
978 QString text; 978 QString text;
979 if ( realName().isEmpty() ) 979 if ( realName().isEmpty() )
980 text = e; 980 text = e;
981 else 981 else
982 text = assembledName() + " <" + e + ">"; 982 text = assembledName() + " <" + e + ">";
983 983
984 return text; 984 return text;
985} 985}
986 986
987void Addressee::insertEmail( const QString &email, bool preferred ) 987void Addressee::insertEmail( const QString &email, bool preferred )
988{ 988{
989 detach(); 989 detach();
990 990
991 QStringList::Iterator it = mData->emails.find( email ); 991 QStringList::Iterator it = mData->emails.find( email );
992 992
993 if ( it != mData->emails.end() ) { 993 if ( it != mData->emails.end() ) {
994 if ( !preferred || it == mData->emails.begin() ) return; 994 if ( !preferred || it == mData->emails.begin() ) return;
995 mData->emails.remove( it ); 995 mData->emails.remove( it );
996 mData->emails.prepend( email ); 996 mData->emails.prepend( email );
997 } else { 997 } else {
998 if ( preferred ) { 998 if ( preferred ) {
999 mData->emails.prepend( email ); 999 mData->emails.prepend( email );
1000 } else { 1000 } else {
1001 mData->emails.append( email ); 1001 mData->emails.append( email );
1002 } 1002 }
1003 } 1003 }
1004} 1004}
1005 1005
1006void Addressee::removeEmail( const QString &email ) 1006void Addressee::removeEmail( const QString &email )
1007{ 1007{
1008 detach(); 1008 detach();
1009 1009
1010 QStringList::Iterator it = mData->emails.find( email ); 1010 QStringList::Iterator it = mData->emails.find( email );
1011 if ( it == mData->emails.end() ) return; 1011 if ( it == mData->emails.end() ) return;
1012 1012
1013 mData->emails.remove( it ); 1013 mData->emails.remove( it );
1014} 1014}
1015 1015
1016QString Addressee::preferredEmail() const 1016QString Addressee::preferredEmail() const
1017{ 1017{
1018 if ( mData->emails.count() == 0 ) return QString::null; 1018 if ( mData->emails.count() == 0 ) return QString::null;
1019 else return mData->emails.first(); 1019 else return mData->emails.first();
1020} 1020}
1021 1021
1022QStringList Addressee::emails() const 1022QStringList Addressee::emails() const
1023{ 1023{
1024 return mData->emails; 1024 return mData->emails;
1025} 1025}
1026void Addressee::setEmails( const QStringList& emails ) { 1026void Addressee::setEmails( const QStringList& emails ) {
1027 detach(); 1027 detach();
1028 mData->emails = emails; 1028 mData->emails = emails;
1029} 1029}
1030void Addressee::insertPhoneNumber( const PhoneNumber &phoneNumber ) 1030void Addressee::insertPhoneNumber( const PhoneNumber &phoneNumber )
1031{ 1031{
1032 detach(); 1032 detach();
1033 mData->empty = false; 1033 mData->empty = false;
1034 1034
1035 PhoneNumber::List::Iterator it; 1035 PhoneNumber::List::Iterator it;
1036 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1036 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1037 if ( (*it).id() == phoneNumber.id() ) { 1037 if ( (*it).id() == phoneNumber.id() ) {
1038 *it = phoneNumber; 1038 *it = phoneNumber;
1039 return; 1039 return;
1040 } 1040 }
1041 } 1041 }
1042 mData->phoneNumbers.append( phoneNumber ); 1042 mData->phoneNumbers.append( phoneNumber );
1043} 1043}
1044 1044
1045void Addressee::removePhoneNumber( const PhoneNumber &phoneNumber ) 1045void Addressee::removePhoneNumber( const PhoneNumber &phoneNumber )
1046{ 1046{
1047 detach(); 1047 detach();
1048 1048
1049 PhoneNumber::List::Iterator it; 1049 PhoneNumber::List::Iterator it;
1050 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1050 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1051 if ( (*it).id() == phoneNumber.id() ) { 1051 if ( (*it).id() == phoneNumber.id() ) {
1052 mData->phoneNumbers.remove( it ); 1052 mData->phoneNumbers.remove( it );
1053 return; 1053 return;
1054 } 1054 }
1055 } 1055 }
1056} 1056}
1057 1057
1058PhoneNumber Addressee::phoneNumber( int type ) const 1058PhoneNumber Addressee::phoneNumber( int type ) const
1059{ 1059{
1060 PhoneNumber phoneNumber( "", type ); 1060 PhoneNumber phoneNumber( "", type );
1061 PhoneNumber::List::ConstIterator it; 1061 PhoneNumber::List::ConstIterator it;
1062 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1062 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1063 if ( matchBinaryPattern( (*it).type(), type ) ) { 1063 if ( matchBinaryPattern( (*it).type(), type ) ) {
1064 if ( (*it).type() & PhoneNumber::Pref ) 1064 if ( (*it).type() & PhoneNumber::Pref )
1065 return (*it); 1065 return (*it);
1066 else if ( phoneNumber.number().isEmpty() ) 1066 else if ( phoneNumber.number().isEmpty() )
1067 phoneNumber = (*it); 1067 phoneNumber = (*it);
1068 } 1068 }
1069 } 1069 }
1070 1070
1071 return phoneNumber; 1071 return phoneNumber;
1072} 1072}
1073 1073
1074PhoneNumber::List Addressee::phoneNumbers() const 1074PhoneNumber::List Addressee::phoneNumbers() const
1075{ 1075{
1076 return mData->phoneNumbers; 1076 return mData->phoneNumbers;
1077} 1077}
1078 1078
1079PhoneNumber::List Addressee::phoneNumbers( int type ) const 1079PhoneNumber::List Addressee::phoneNumbers( int type ) const
1080{ 1080{
1081 PhoneNumber::List list; 1081 PhoneNumber::List list;
1082 1082
1083 PhoneNumber::List::ConstIterator it; 1083 PhoneNumber::List::ConstIterator it;
1084 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1084 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1085 if ( matchBinaryPattern( (*it).type(), type ) ) { 1085 if ( matchBinaryPattern( (*it).type(), type ) ) {
1086 list.append( *it ); 1086 list.append( *it );
1087 } 1087 }
1088 } 1088 }
1089 return list; 1089 return list;
1090} 1090}
1091 1091
1092PhoneNumber Addressee::findPhoneNumber( const QString &id ) const 1092PhoneNumber Addressee::findPhoneNumber( const QString &id ) const
1093{ 1093{
1094 PhoneNumber::List::ConstIterator it; 1094 PhoneNumber::List::ConstIterator it;
1095 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1095 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1096 if ( (*it).id() == id ) { 1096 if ( (*it).id() == id ) {
1097 return *it; 1097 return *it;
1098 } 1098 }
1099 } 1099 }
1100 return PhoneNumber(); 1100 return PhoneNumber();
1101} 1101}
1102 1102
1103void Addressee::insertKey( const Key &key ) 1103void Addressee::insertKey( const Key &key )
1104{ 1104{
1105 detach(); 1105 detach();
1106 mData->empty = false; 1106 mData->empty = false;
1107 1107
1108 Key::List::Iterator it; 1108 Key::List::Iterator it;
1109 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1109 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1110 if ( (*it).id() == key.id() ) { 1110 if ( (*it).id() == key.id() ) {
1111 *it = key; 1111 *it = key;
1112 return; 1112 return;
1113 } 1113 }
1114 } 1114 }
1115 mData->keys.append( key ); 1115 mData->keys.append( key );
1116} 1116}
1117 1117
1118void Addressee::removeKey( const Key &key ) 1118void Addressee::removeKey( const Key &key )
1119{ 1119{
1120 detach(); 1120 detach();
1121 1121
1122 Key::List::Iterator it; 1122 Key::List::Iterator it;
1123 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1123 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1124 if ( (*it).id() == key.id() ) { 1124 if ( (*it).id() == key.id() ) {
1125 mData->keys.remove( key ); 1125 mData->keys.remove( key );
1126 return; 1126 return;
1127 } 1127 }
1128 } 1128 }
1129} 1129}
1130 1130
1131Key Addressee::key( int type, QString customTypeString ) const 1131Key Addressee::key( int type, QString customTypeString ) const
1132{ 1132{
1133 Key::List::ConstIterator it; 1133 Key::List::ConstIterator it;
1134 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1134 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1135 if ( (*it).type() == type ) { 1135 if ( (*it).type() == type ) {
1136 if ( type == Key::Custom ) { 1136 if ( type == Key::Custom ) {
1137 if ( customTypeString.isEmpty() ) { 1137 if ( customTypeString.isEmpty() ) {
1138 return *it; 1138 return *it;
1139 } else { 1139 } else {
1140 if ( (*it).customTypeString() == customTypeString ) 1140 if ( (*it).customTypeString() == customTypeString )
1141 return (*it); 1141 return (*it);
1142 } 1142 }
1143 } else { 1143 } else {
1144 return *it; 1144 return *it;
1145 } 1145 }
1146 } 1146 }
1147 } 1147 }
1148 return Key( QString(), type ); 1148 return Key( QString(), type );
1149} 1149}
1150void Addressee::setKeys( const Key::List& list ) { 1150void Addressee::setKeys( const Key::List& list ) {
1151 detach(); 1151 detach();
1152 mData->keys = list; 1152 mData->keys = list;
1153} 1153}
1154 1154
1155Key::List Addressee::keys() const 1155Key::List Addressee::keys() const
1156{ 1156{
1157 return mData->keys; 1157 return mData->keys;
1158} 1158}
1159 1159
1160Key::List Addressee::keys( int type, QString customTypeString ) const 1160Key::List Addressee::keys( int type, QString customTypeString ) const
1161{ 1161{
1162 Key::List list; 1162 Key::List list;
1163 1163
1164 Key::List::ConstIterator it; 1164 Key::List::ConstIterator it;
1165 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1165 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1166 if ( (*it).type() == type ) { 1166 if ( (*it).type() == type ) {
1167 if ( type == Key::Custom ) { 1167 if ( type == Key::Custom ) {
1168 if ( customTypeString.isEmpty() ) { 1168 if ( customTypeString.isEmpty() ) {
1169 list.append(*it); 1169 list.append(*it);
1170 } else { 1170 } else {
1171 if ( (*it).customTypeString() == customTypeString ) 1171 if ( (*it).customTypeString() == customTypeString )
1172 list.append(*it); 1172 list.append(*it);
1173 } 1173 }
1174 } else { 1174 } else {
1175 list.append(*it); 1175 list.append(*it);
1176 } 1176 }
1177 } 1177 }
1178 } 1178 }
1179 return list; 1179 return list;
1180} 1180}
1181 1181
1182Key Addressee::findKey( const QString &id ) const 1182Key Addressee::findKey( const QString &id ) const
1183{ 1183{
1184 Key::List::ConstIterator it; 1184 Key::List::ConstIterator it;
1185 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1185 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1186 if ( (*it).id() == id ) { 1186 if ( (*it).id() == id ) {
1187 return *it; 1187 return *it;
1188 } 1188 }
1189 } 1189 }
1190 return Key(); 1190 return Key();
1191} 1191}
1192 1192
1193QString Addressee::asString() const 1193QString Addressee::asString() const
1194{ 1194{
1195 return "Smith, agent Smith..."; 1195 return "Smith, agent Smith...";
1196} 1196}
1197 1197
1198void Addressee::dump() const 1198void Addressee::dump() const
1199{ 1199{
1200 return; 1200 return;
1201 kdDebug(5700) << "Addressee {" << endl; 1201 kdDebug(5700) << "Addressee {" << endl;
1202 1202
1203 kdDebug(5700) << " Uid: '" << uid() << "'" << endl; 1203 kdDebug(5700) << " Uid: '" << uid() << "'" << endl;
1204 1204
1205 kdDebug(5700) << " Name: '" << name() << "'" << endl; 1205 kdDebug(5700) << " Name: '" << name() << "'" << endl;
1206 kdDebug(5700) << " FormattedName: '" << formattedName() << "'" << endl; 1206 kdDebug(5700) << " FormattedName: '" << formattedName() << "'" << endl;
1207 kdDebug(5700) << " FamilyName: '" << familyName() << "'" << endl; 1207 kdDebug(5700) << " FamilyName: '" << familyName() << "'" << endl;
1208 kdDebug(5700) << " GivenName: '" << givenName() << "'" << endl; 1208 kdDebug(5700) << " GivenName: '" << givenName() << "'" << endl;
1209 kdDebug(5700) << " AdditionalName: '" << additionalName() << "'" << endl; 1209 kdDebug(5700) << " AdditionalName: '" << additionalName() << "'" << endl;
1210 kdDebug(5700) << " Prefix: '" << prefix() << "'" << endl; 1210 kdDebug(5700) << " Prefix: '" << prefix() << "'" << endl;
1211 kdDebug(5700) << " Suffix: '" << suffix() << "'" << endl; 1211 kdDebug(5700) << " Suffix: '" << suffix() << "'" << endl;
1212 kdDebug(5700) << " NickName: '" << nickName() << "'" << endl; 1212 kdDebug(5700) << " NickName: '" << nickName() << "'" << endl;
1213 kdDebug(5700) << " Birthday: '" << birthday().toString() << "'" << endl; 1213 kdDebug(5700) << " Birthday: '" << birthday().toString() << "'" << endl;
1214 kdDebug(5700) << " Mailer: '" << mailer() << "'" << endl; 1214 kdDebug(5700) << " Mailer: '" << mailer() << "'" << endl;
1215 kdDebug(5700) << " TimeZone: '" << timeZone().asString() << "'" << endl; 1215 kdDebug(5700) << " TimeZone: '" << timeZone().asString() << "'" << endl;
1216 kdDebug(5700) << " Geo: '" << geo().asString() << "'" << endl; 1216 kdDebug(5700) << " Geo: '" << geo().asString() << "'" << endl;
1217 kdDebug(5700) << " Title: '" << title() << "'" << endl; 1217 kdDebug(5700) << " Title: '" << title() << "'" << endl;
1218 kdDebug(5700) << " Role: '" << role() << "'" << endl; 1218 kdDebug(5700) << " Role: '" << role() << "'" << endl;
1219 kdDebug(5700) << " Organization: '" << organization() << "'" << endl; 1219 kdDebug(5700) << " Organization: '" << organization() << "'" << endl;
1220 kdDebug(5700) << " Note: '" << note() << "'" << endl; 1220 kdDebug(5700) << " Note: '" << note() << "'" << endl;
1221 kdDebug(5700) << " ProductId: '" << productId() << "'" << endl; 1221 kdDebug(5700) << " ProductId: '" << productId() << "'" << endl;
1222 kdDebug(5700) << " Revision: '" << revision().toString() << "'" << endl; 1222 kdDebug(5700) << " Revision: '" << revision().toString() << "'" << endl;
1223 kdDebug(5700) << " SortString: '" << sortString() << "'" << endl; 1223 kdDebug(5700) << " SortString: '" << sortString() << "'" << endl;
1224 kdDebug(5700) << " Url: '" << url().url() << "'" << endl; 1224 kdDebug(5700) << " Url: '" << url().url() << "'" << endl;
1225 kdDebug(5700) << " Secrecy: '" << secrecy().asString() << "'" << endl; 1225 kdDebug(5700) << " Secrecy: '" << secrecy().asString() << "'" << endl;
1226 kdDebug(5700) << " Logo: '" << logo().asString() << "'" << endl; 1226 kdDebug(5700) << " Logo: '" << logo().asString() << "'" << endl;
1227 kdDebug(5700) << " Photo: '" << photo().asString() << "'" << endl; 1227 kdDebug(5700) << " Photo: '" << photo().asString() << "'" << endl;
1228 kdDebug(5700) << " Sound: '" << sound().asString() << "'" << endl; 1228 kdDebug(5700) << " Sound: '" << sound().asString() << "'" << endl;
1229 kdDebug(5700) << " Agent: '" << agent().asString() << "'" << endl; 1229 kdDebug(5700) << " Agent: '" << agent().asString() << "'" << endl;
1230 1230
1231 kdDebug(5700) << " Emails {" << endl; 1231 kdDebug(5700) << " Emails {" << endl;
1232 QStringList e = emails(); 1232 QStringList e = emails();
1233 QStringList::ConstIterator it; 1233 QStringList::ConstIterator it;
1234 for( it = e.begin(); it != e.end(); ++it ) { 1234 for( it = e.begin(); it != e.end(); ++it ) {
1235 kdDebug(5700) << " " << (*it) << endl; 1235 kdDebug(5700) << " " << (*it) << endl;
1236 } 1236 }
1237 kdDebug(5700) << " }" << endl; 1237 kdDebug(5700) << " }" << endl;
1238 1238
1239 kdDebug(5700) << " PhoneNumbers {" << endl; 1239 kdDebug(5700) << " PhoneNumbers {" << endl;
1240 PhoneNumber::List p = phoneNumbers(); 1240 PhoneNumber::List p = phoneNumbers();
1241 PhoneNumber::List::ConstIterator it2; 1241 PhoneNumber::List::ConstIterator it2;
1242 for( it2 = p.begin(); it2 != p.end(); ++it2 ) { 1242 for( it2 = p.begin(); it2 != p.end(); ++it2 ) {
1243 kdDebug(5700) << " Type: " << int((*it2).type()) << " Number: " << (*it2).number() << endl; 1243 kdDebug(5700) << " Type: " << int((*it2).type()) << " Number: " << (*it2).number() << endl;
1244 } 1244 }
1245 kdDebug(5700) << " }" << endl; 1245 kdDebug(5700) << " }" << endl;
1246 1246
1247 Address::List a = addresses(); 1247 Address::List a = addresses();
1248 Address::List::ConstIterator it3; 1248 Address::List::ConstIterator it3;
1249 for( it3 = a.begin(); it3 != a.end(); ++it3 ) { 1249 for( it3 = a.begin(); it3 != a.end(); ++it3 ) {
1250 (*it3).dump(); 1250 (*it3).dump();
1251 } 1251 }
1252 1252
1253 kdDebug(5700) << " Keys {" << endl; 1253 kdDebug(5700) << " Keys {" << endl;
1254 Key::List k = keys(); 1254 Key::List k = keys();
1255 Key::List::ConstIterator it4; 1255 Key::List::ConstIterator it4;
1256 for( it4 = k.begin(); it4 != k.end(); ++it4 ) { 1256 for( it4 = k.begin(); it4 != k.end(); ++it4 ) {
1257 kdDebug(5700) << " Type: " << int((*it4).type()) << 1257 kdDebug(5700) << " Type: " << int((*it4).type()) <<
1258 " Key: " << (*it4).textData() << 1258 " Key: " << (*it4).textData() <<
1259 " CustomString: " << (*it4).customTypeString() << endl; 1259 " CustomString: " << (*it4).customTypeString() << endl;
1260 } 1260 }
1261 kdDebug(5700) << " }" << endl; 1261 kdDebug(5700) << " }" << endl;
1262 1262
1263 kdDebug(5700) << "}" << endl; 1263 kdDebug(5700) << "}" << endl;
1264} 1264}
1265 1265
1266 1266
1267void Addressee::insertAddress( const Address &address ) 1267void Addressee::insertAddress( const Address &address )
1268{ 1268{
1269 detach(); 1269 detach();
1270 mData->empty = false; 1270 mData->empty = false;
1271 1271
1272 Address::List::Iterator it; 1272 Address::List::Iterator it;
1273 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1273 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1274 if ( (*it).id() == address.id() ) { 1274 if ( (*it).id() == address.id() ) {
1275 *it = address; 1275 *it = address;
1276 return; 1276 return;
1277 } 1277 }
1278 } 1278 }
1279 mData->addresses.append( address ); 1279 mData->addresses.append( address );
1280} 1280}
1281 1281
1282void Addressee::removeAddress( const Address &address ) 1282void Addressee::removeAddress( const Address &address )
1283{ 1283{
1284 detach(); 1284 detach();
1285 1285
1286 Address::List::Iterator it; 1286 Address::List::Iterator it;
1287 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1287 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1288 if ( (*it).id() == address.id() ) { 1288 if ( (*it).id() == address.id() ) {
1289 mData->addresses.remove( it ); 1289 mData->addresses.remove( it );
1290 return; 1290 return;
1291 } 1291 }
1292 } 1292 }
1293} 1293}
1294 1294
1295Address Addressee::address( int type ) const 1295Address Addressee::address( int type ) const
1296{ 1296{
1297 Address address( type ); 1297 Address address( type );
1298 Address::List::ConstIterator it; 1298 Address::List::ConstIterator it;
1299 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1299 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1300 if ( matchBinaryPattern( (*it).type(), type ) ) { 1300 if ( matchBinaryPattern( (*it).type(), type ) ) {
1301 if ( (*it).type() & Address::Pref ) 1301 if ( (*it).type() & Address::Pref )
1302 return (*it); 1302 return (*it);
1303 else if ( address.isEmpty() ) 1303 else if ( address.isEmpty() )
1304 address = (*it); 1304 address = (*it);
1305 } 1305 }
1306 } 1306 }
1307 1307
1308 return address; 1308 return address;
1309} 1309}
1310 1310
1311Address::List Addressee::addresses() const 1311Address::List Addressee::addresses() const
1312{ 1312{
1313 return mData->addresses; 1313 return mData->addresses;
1314} 1314}
1315 1315
1316Address::List Addressee::addresses( int type ) const 1316Address::List Addressee::addresses( int type ) const
1317{ 1317{
1318 Address::List list; 1318 Address::List list;
1319 1319
1320 Address::List::ConstIterator it; 1320 Address::List::ConstIterator it;
1321 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1321 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1322 if ( matchBinaryPattern( (*it).type(), type ) ) { 1322 if ( matchBinaryPattern( (*it).type(), type ) ) {
1323 list.append( *it ); 1323 list.append( *it );
1324 } 1324 }
1325 } 1325 }
1326 1326
1327 return list; 1327 return list;
1328} 1328}
1329 1329
1330Address Addressee::findAddress( const QString &id ) const 1330Address Addressee::findAddress( const QString &id ) const
1331{ 1331{
1332 Address::List::ConstIterator it; 1332 Address::List::ConstIterator it;
1333 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1333 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1334 if ( (*it).id() == id ) { 1334 if ( (*it).id() == id ) {
1335 return *it; 1335 return *it;
1336 } 1336 }
1337 } 1337 }
1338 return Address(); 1338 return Address();
1339} 1339}
1340 1340
1341void Addressee::insertCategory( const QString &c ) 1341void Addressee::insertCategory( const QString &c )
1342{ 1342{
1343 detach(); 1343 detach();
1344 mData->empty = false; 1344 mData->empty = false;
1345 1345
1346 if ( mData->categories.contains( c ) ) return; 1346 if ( mData->categories.contains( c ) ) return;
1347 1347
1348 mData->categories.append( c ); 1348 mData->categories.append( c );
1349} 1349}
1350 1350
1351void Addressee::removeCategory( const QString &c ) 1351void Addressee::removeCategory( const QString &c )
1352{ 1352{
1353 detach(); 1353 detach();
1354 1354
1355 QStringList::Iterator it = mData->categories.find( c ); 1355 QStringList::Iterator it = mData->categories.find( c );
1356 if ( it == mData->categories.end() ) return; 1356 if ( it == mData->categories.end() ) return;
1357 1357
1358 mData->categories.remove( it ); 1358 mData->categories.remove( it );
1359} 1359}
1360 1360
1361bool Addressee::hasCategory( const QString &c ) const 1361bool Addressee::hasCategory( const QString &c ) const
1362{ 1362{
1363 return ( mData->categories.contains( c ) ); 1363 return ( mData->categories.contains( c ) );
1364} 1364}
1365 1365
1366void Addressee::setCategories( const QStringList &c ) 1366void Addressee::setCategories( const QStringList &c )
1367{ 1367{
1368 detach(); 1368 detach();
1369 mData->empty = false; 1369 mData->empty = false;
1370 1370
1371 mData->categories = c; 1371 mData->categories = c;
1372} 1372}
1373 1373
1374QStringList Addressee::categories() const 1374QStringList Addressee::categories() const
1375{ 1375{
1376 return mData->categories; 1376 return mData->categories;
1377} 1377}
1378 1378
1379void Addressee::insertCustom( const QString &app, const QString &name, 1379void Addressee::insertCustom( const QString &app, const QString &name,
1380 const QString &value ) 1380 const QString &value )
1381{ 1381{
1382 if ( value.isNull() || name.isEmpty() || app.isEmpty() ) return; 1382 if ( value.isNull() || name.isEmpty() || app.isEmpty() ) return;
1383 1383
1384 detach(); 1384 detach();
1385 mData->empty = false; 1385 mData->empty = false;
1386 1386
1387 QString qualifiedName = app + "-" + name + ":"; 1387 QString qualifiedName = app + "-" + name + ":";
1388 1388
1389 QStringList::Iterator it; 1389 QStringList::Iterator it;
1390 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) { 1390 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
1391 if ( (*it).startsWith( qualifiedName ) ) { 1391 if ( (*it).startsWith( qualifiedName ) ) {
1392 (*it) = qualifiedName + value; 1392 (*it) = qualifiedName + value;
1393 return; 1393 return;
1394 } 1394 }
1395 } 1395 }
1396 1396
1397 mData->custom.append( qualifiedName + value ); 1397 mData->custom.append( qualifiedName + value );
1398} 1398}
1399 1399
1400void Addressee::removeCustom( const QString &app, const QString &name) 1400void Addressee::removeCustom( const QString &app, const QString &name)
1401{ 1401{
1402 detach(); 1402 detach();
1403 1403
1404 QString qualifiedName = app + "-" + name + ":"; 1404 QString qualifiedName = app + "-" + name + ":";
1405 1405
1406 QStringList::Iterator it; 1406 QStringList::Iterator it;
1407 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) { 1407 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
1408 if ( (*it).startsWith( qualifiedName ) ) { 1408 if ( (*it).startsWith( qualifiedName ) ) {
1409 mData->custom.remove( it ); 1409 mData->custom.remove( it );
1410 return; 1410 return;
1411 } 1411 }
1412 } 1412 }
1413} 1413}
1414 1414
1415QString Addressee::custom( const QString &app, const QString &name ) const 1415QString Addressee::custom( const QString &app, const QString &name ) const
1416{ 1416{
1417 QString qualifiedName = app + "-" + name + ":"; 1417 QString qualifiedName = app + "-" + name + ":";
1418 QString value; 1418 QString value;
1419 1419
1420 QStringList::ConstIterator it; 1420 QStringList::ConstIterator it;
1421 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) { 1421 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
1422 if ( (*it).startsWith( qualifiedName ) ) { 1422 if ( (*it).startsWith( qualifiedName ) ) {
1423 value = (*it).mid( (*it).find( ":" ) + 1 ); 1423 value = (*it).mid( (*it).find( ":" ) + 1 );
1424 break; 1424 break;
1425 } 1425 }
1426 } 1426 }
1427 1427
1428 return value; 1428 return value;
1429} 1429}
1430 1430
1431void Addressee::setCustoms( const QStringList &l ) 1431void Addressee::setCustoms( const QStringList &l )
1432{ 1432{
1433 detach(); 1433 detach();
1434 mData->empty = false; 1434 mData->empty = false;
1435 1435
1436 mData->custom = l; 1436 mData->custom = l;
1437} 1437}
1438 1438
1439QStringList Addressee::customs() const 1439QStringList Addressee::customs() const
1440{ 1440{
1441 return mData->custom; 1441 return mData->custom;
1442} 1442}
1443 1443
1444void Addressee::parseEmailAddress( const QString &rawEmail, QString &fullName, 1444void Addressee::parseEmailAddress( const QString &rawEmail, QString &fullName,
1445 QString &email) 1445 QString &email)
1446{ 1446{
1447 int startPos, endPos, len; 1447 int startPos, endPos, len;
1448 QString partA, partB, result; 1448 QString partA, partB, result;
1449 char endCh = '>'; 1449 char endCh = '>';
1450 1450
1451 startPos = rawEmail.find('<'); 1451 startPos = rawEmail.find('<');
1452 if (startPos < 0) 1452 if (startPos < 0)
1453 { 1453 {
1454 startPos = rawEmail.find('('); 1454 startPos = rawEmail.find('(');
1455 endCh = ')'; 1455 endCh = ')';
1456 } 1456 }
1457 if (startPos < 0) 1457 if (startPos < 0)
1458 { 1458 {
1459 // We couldn't find any separators, so we assume the whole string 1459 // We couldn't find any separators, so we assume the whole string
1460 // is the email address 1460 // is the email address
1461 email = rawEmail; 1461 email = rawEmail;
1462 fullName = ""; 1462 fullName = "";
1463 } 1463 }
1464 else 1464 else
1465 { 1465 {
1466 // We have a start position, try to find an end 1466 // We have a start position, try to find an end
1467 endPos = rawEmail.find(endCh, startPos+1); 1467 endPos = rawEmail.find(endCh, startPos+1);
1468 1468
1469 if (endPos < 0) 1469 if (endPos < 0)
1470 { 1470 {
1471 // We couldn't find the end of the email address. We can only 1471 // We couldn't find the end of the email address. We can only
1472 // assume the entire string is the email address. 1472 // assume the entire string is the email address.
1473 email = rawEmail; 1473 email = rawEmail;
1474 fullName = ""; 1474 fullName = "";
1475 } 1475 }
1476 else 1476 else
1477 { 1477 {
1478 // We have a start and end to the email address 1478 // We have a start and end to the email address
1479 1479
1480 // Grab the name part 1480 // Grab the name part
1481 fullName = rawEmail.left(startPos).stripWhiteSpace(); 1481 fullName = rawEmail.left(startPos).stripWhiteSpace();
1482 1482
1483 // grab the email part 1483 // grab the email part
1484 email = rawEmail.mid(startPos+1, endPos-startPos-1).stripWhiteSpace(); 1484 email = rawEmail.mid(startPos+1, endPos-startPos-1).stripWhiteSpace();
1485 1485
1486 // Check that we do not have any extra characters on the end of the 1486 // Check that we do not have any extra characters on the end of the
1487 // strings 1487 // strings
1488 len = fullName.length(); 1488 len = fullName.length();
1489 if (fullName[0]=='"' && fullName[len-1]=='"') 1489 if (fullName[0]=='"' && fullName[len-1]=='"')
1490 fullName = fullName.mid(1, len-2); 1490 fullName = fullName.mid(1, len-2);
1491 else if (fullName[0]=='<' && fullName[len-1]=='>') 1491 else if (fullName[0]=='<' && fullName[len-1]=='>')
1492 fullName = fullName.mid(1, len-2); 1492 fullName = fullName.mid(1, len-2);
1493 else if (fullName[0]=='(' && fullName[len-1]==')') 1493 else if (fullName[0]=='(' && fullName[len-1]==')')
1494 fullName = fullName.mid(1, len-2); 1494 fullName = fullName.mid(1, len-2);
1495 } 1495 }
1496 } 1496 }
1497} 1497}
1498 1498
1499void Addressee::setResource( Resource *resource ) 1499void Addressee::setResource( Resource *resource )
1500{ 1500{
1501 detach(); 1501 detach();
1502 mData->resource = resource; 1502 mData->resource = resource;
1503} 1503}
1504 1504
1505Resource *Addressee::resource() const 1505Resource *Addressee::resource() const
1506{ 1506{
1507 return mData->resource; 1507 return mData->resource;
1508} 1508}
1509 1509
1510//US
1511QString Addressee::resourceLabel()
1512{
1513 return i18n("Resource");
1514}
1515
1510void Addressee::setChanged( bool value ) 1516void Addressee::setChanged( bool value )
1511{ 1517{
1512 detach(); 1518 detach();
1513 mData->changed = value; 1519 mData->changed = value;
1514} 1520}
1515 1521
1516bool Addressee::changed() const 1522bool Addressee::changed() const
1517{ 1523{
1518 return mData->changed; 1524 return mData->changed;
1519} 1525}
1520 1526
1521QDataStream &KABC::operator<<( QDataStream &s, const Addressee &a ) 1527QDataStream &KABC::operator<<( QDataStream &s, const Addressee &a )
1522{ 1528{
1523 if (!a.mData) return s; 1529 if (!a.mData) return s;
1524 1530
1525 s << a.uid(); 1531 s << a.uid();
1526 1532
1527 s << a.mData->name; 1533 s << a.mData->name;
1528 s << a.mData->formattedName; 1534 s << a.mData->formattedName;
1529 s << a.mData->familyName; 1535 s << a.mData->familyName;
1530 s << a.mData->givenName; 1536 s << a.mData->givenName;
1531 s << a.mData->additionalName; 1537 s << a.mData->additionalName;
1532 s << a.mData->prefix; 1538 s << a.mData->prefix;
1533 s << a.mData->suffix; 1539 s << a.mData->suffix;
1534 s << a.mData->nickName; 1540 s << a.mData->nickName;
1535 s << a.mData->birthday; 1541 s << a.mData->birthday;
1536 s << a.mData->mailer; 1542 s << a.mData->mailer;
1537 s << a.mData->timeZone; 1543 s << a.mData->timeZone;
1538 s << a.mData->geo; 1544 s << a.mData->geo;
1539 s << a.mData->title; 1545 s << a.mData->title;
1540 s << a.mData->role; 1546 s << a.mData->role;
1541 s << a.mData->organization; 1547 s << a.mData->organization;
1542 s << a.mData->note; 1548 s << a.mData->note;
1543 s << a.mData->productId; 1549 s << a.mData->productId;
1544 s << a.mData->revision; 1550 s << a.mData->revision;
1545 s << a.mData->sortString; 1551 s << a.mData->sortString;
1546 s << a.mData->url; 1552 s << a.mData->url;
1547 s << a.mData->secrecy; 1553 s << a.mData->secrecy;
1548 s << a.mData->logo; 1554 s << a.mData->logo;
1549 s << a.mData->photo; 1555 s << a.mData->photo;
1550 s << a.mData->sound; 1556 s << a.mData->sound;
1551 s << a.mData->agent; 1557 s << a.mData->agent;
1552 s << a.mData->phoneNumbers; 1558 s << a.mData->phoneNumbers;
1553 s << a.mData->addresses; 1559 s << a.mData->addresses;
1554 s << a.mData->emails; 1560 s << a.mData->emails;
1555 s << a.mData->categories; 1561 s << a.mData->categories;
1556 s << a.mData->custom; 1562 s << a.mData->custom;
1557 s << a.mData->keys; 1563 s << a.mData->keys;
1558 return s; 1564 return s;
1559} 1565}
1560 1566
1561QDataStream &KABC::operator>>( QDataStream &s, Addressee &a ) 1567QDataStream &KABC::operator>>( QDataStream &s, Addressee &a )
1562{ 1568{
1563 if (!a.mData) return s; 1569 if (!a.mData) return s;
1564 1570
1565 s >> a.mData->uid; 1571 s >> a.mData->uid;
1566 1572
1567 s >> a.mData->name; 1573 s >> a.mData->name;
1568 s >> a.mData->formattedName; 1574 s >> a.mData->formattedName;
1569 s >> a.mData->familyName; 1575 s >> a.mData->familyName;
1570 s >> a.mData->givenName; 1576 s >> a.mData->givenName;
1571 s >> a.mData->additionalName; 1577 s >> a.mData->additionalName;
1572 s >> a.mData->prefix; 1578 s >> a.mData->prefix;
1573 s >> a.mData->suffix; 1579 s >> a.mData->suffix;
1574 s >> a.mData->nickName; 1580 s >> a.mData->nickName;
1575 s >> a.mData->birthday; 1581 s >> a.mData->birthday;
1576 s >> a.mData->mailer; 1582 s >> a.mData->mailer;
1577 s >> a.mData->timeZone; 1583 s >> a.mData->timeZone;
1578 s >> a.mData->geo; 1584 s >> a.mData->geo;
1579 s >> a.mData->title; 1585 s >> a.mData->title;
1580 s >> a.mData->role; 1586 s >> a.mData->role;
1581 s >> a.mData->organization; 1587 s >> a.mData->organization;
1582 s >> a.mData->note; 1588 s >> a.mData->note;
1583 s >> a.mData->productId; 1589 s >> a.mData->productId;
1584 s >> a.mData->revision; 1590 s >> a.mData->revision;
1585 s >> a.mData->sortString; 1591 s >> a.mData->sortString;
1586 s >> a.mData->url; 1592 s >> a.mData->url;
1587 s >> a.mData->secrecy; 1593 s >> a.mData->secrecy;
1588 s >> a.mData->logo; 1594 s >> a.mData->logo;
1589 s >> a.mData->photo; 1595 s >> a.mData->photo;
1590 s >> a.mData->sound; 1596 s >> a.mData->sound;
1591 s >> a.mData->agent; 1597 s >> a.mData->agent;
1592 s >> a.mData->phoneNumbers; 1598 s >> a.mData->phoneNumbers;
1593 s >> a.mData->addresses; 1599 s >> a.mData->addresses;
1594 s >> a.mData->emails; 1600 s >> a.mData->emails;
1595 s >> a.mData->categories; 1601 s >> a.mData->categories;
1596 s >> a.mData->custom; 1602 s >> a.mData->custom;
1597 s >> a.mData->keys; 1603 s >> a.mData->keys;
1598 1604
1599 a.mData->empty = false; 1605 a.mData->empty = false;
1600 1606
1601 return s; 1607 return s;
1602} 1608}
1603 1609
1604bool matchBinaryPattern( int value, int pattern ) 1610bool matchBinaryPattern( int value, int pattern )
1605{ 1611{
1606 /** 1612 /**
1607 We want to match all telephonnumbers/addresses which have the bits in the 1613 We want to match all telephonnumbers/addresses which have the bits in the
1608 pattern set. More are allowed. 1614 pattern set. More are allowed.
1609 if pattern == 0 we have a special handling, then we want only those with 1615 if pattern == 0 we have a special handling, then we want only those with
1610 exactly no bit set. 1616 exactly no bit set.
1611 */ 1617 */
1612 if ( pattern == 0 ) 1618 if ( pattern == 0 )
1613 return ( value == 0 ); 1619 return ( value == 0 );
1614 else 1620 else
1615 return ( pattern == ( pattern & value ) ); 1621 return ( pattern == ( pattern & value ) );
1616} 1622}