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