summaryrefslogtreecommitdiffabout
path: root/kabc/addressee.cpp
Unidiff
Diffstat (limited to 'kabc/addressee.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--kabc/addressee.cpp74
1 files changed, 68 insertions, 6 deletions
diff --git a/kabc/addressee.cpp b/kabc/addressee.cpp
index 7e1e414..661bdf6 100644
--- a/kabc/addressee.cpp
+++ b/kabc/addressee.cpp
@@ -77,2090 +77,2152 @@ struct Addressee::AddresseeData : public KShared
77 Sound sound; 77 Sound sound;
78 Agent agent; 78 Agent agent;
79 QString mExternalId; 79 QString mExternalId;
80 PhoneNumber::List phoneNumbers; 80 PhoneNumber::List phoneNumbers;
81 Address::List addresses; 81 Address::List addresses;
82 Key::List keys; 82 Key::List keys;
83 QStringList emails; 83 QStringList emails;
84 QStringList categories; 84 QStringList categories;
85 QStringList custom; 85 QStringList custom;
86 int mTempSyncStat; 86 int mTempSyncStat;
87 Resource *resource; 87 Resource *resource;
88 88
89 bool empty :1; 89 bool empty :1;
90 bool changed :1; 90 bool changed :1;
91 bool tagged :1; 91 bool tagged :1;
92}; 92};
93 93
94Addressee::Addressee() 94Addressee::Addressee()
95{ 95{
96 mData = new AddresseeData; 96 mData = new AddresseeData;
97 mData->empty = true; 97 mData->empty = true;
98 mData->changed = false; 98 mData->changed = false;
99 mData->resource = 0; 99 mData->resource = 0;
100 mData->mExternalId = ":"; 100 mData->mExternalId = ":";
101 mData->revision = QDateTime ( QDate( 2003,1,1)); 101 mData->revision = QDateTime ( QDate( 2003,1,1));
102 mData->mTempSyncStat = SYNC_TEMPSTATE_INITIAL; 102 mData->mTempSyncStat = SYNC_TEMPSTATE_INITIAL;
103} 103}
104 104
105Addressee::~Addressee() 105Addressee::~Addressee()
106{ 106{
107} 107}
108 108
109Addressee::Addressee( const Addressee &a ) 109Addressee::Addressee( const Addressee &a )
110{ 110{
111 mData = a.mData; 111 mData = a.mData;
112} 112}
113 113
114Addressee &Addressee::operator=( const Addressee &a ) 114Addressee &Addressee::operator=( const Addressee &a )
115{ 115{
116 mData = a.mData; 116 mData = a.mData;
117 return (*this); 117 return (*this);
118} 118}
119 119
120Addressee Addressee::copy() 120Addressee Addressee::copy()
121{ 121{
122 Addressee a; 122 Addressee a;
123 *(a.mData) = *mData; 123 *(a.mData) = *mData;
124 return a; 124 return a;
125} 125}
126 126
127void Addressee::detach() 127void Addressee::detach()
128{ 128{
129 if ( mData.count() == 1 ) return; 129 if ( mData.count() == 1 ) return;
130 *this = copy(); 130 *this = copy();
131} 131}
132 132
133bool Addressee::operator==( const Addressee &a ) const 133bool Addressee::operator==( const Addressee &a ) const
134{ 134{
135 if ( uid() != a.uid() ) return false; 135 if ( uid() != a.uid() ) return false;
136 if ( mData->name != a.mData->name ) return false; 136 if ( mData->name != a.mData->name ) return false;
137 if ( mData->formattedName != a.mData->formattedName ) return false; 137 if ( mData->formattedName != a.mData->formattedName ) return false;
138 if ( mData->familyName != a.mData->familyName ) return false; 138 if ( mData->familyName != a.mData->familyName ) return false;
139 if ( mData->givenName != a.mData->givenName ) return false; 139 if ( mData->givenName != a.mData->givenName ) return false;
140 if ( mData->additionalName != a.mData->additionalName ) return false; 140 if ( mData->additionalName != a.mData->additionalName ) return false;
141 if ( mData->prefix != a.mData->prefix ) return false; 141 if ( mData->prefix != a.mData->prefix ) return false;
142 if ( mData->suffix != a.mData->suffix ) return false; 142 if ( mData->suffix != a.mData->suffix ) return false;
143 if ( mData->nickName != a.mData->nickName ) return false; 143 if ( mData->nickName != a.mData->nickName ) return false;
144 if ( mData->birthday != a.mData->birthday ) return false; 144 if ( mData->birthday != a.mData->birthday ) return false;
145 if ( mData->mailer != a.mData->mailer ) return false; 145 if ( mData->mailer != a.mData->mailer ) return false;
146 if ( mData->timeZone != a.mData->timeZone ) return false; 146 if ( mData->timeZone != a.mData->timeZone ) return false;
147 if ( mData->geo != a.mData->geo ) return false; 147 if ( mData->geo != a.mData->geo ) return false;
148 if ( mData->title != a.mData->title ) return false; 148 if ( mData->title != a.mData->title ) return false;
149 if ( mData->role != a.mData->role ) return false; 149 if ( mData->role != a.mData->role ) return false;
150 if ( mData->organization != a.mData->organization ) return false; 150 if ( mData->organization != a.mData->organization ) return false;
151 if ( mData->note != a.mData->note ) return false; 151 if ( mData->note != a.mData->note ) return false;
152 if ( mData->productId != a.mData->productId ) return false; 152 if ( mData->productId != a.mData->productId ) return false;
153 //if ( mData->revision != a.mData->revision ) return false; 153 //if ( mData->revision != a.mData->revision ) return false;
154 if ( mData->sortString != a.mData->sortString ) return false; 154 if ( mData->sortString != a.mData->sortString ) return false;
155 if ( mData->secrecy != a.mData->secrecy ) return false; 155 if ( mData->secrecy != a.mData->secrecy ) return false;
156 if ( mData->logo != a.mData->logo ) return false; 156 if ( mData->logo != a.mData->logo ) return false;
157 if ( mData->photo != a.mData->photo ) return false; 157 if ( mData->photo != a.mData->photo ) return false;
158 if ( mData->sound != a.mData->sound ) return false; 158 if ( mData->sound != a.mData->sound ) return false;
159 if ( mData->agent != a.mData->agent ) return false; 159 if ( mData->agent != a.mData->agent ) return false;
160 if ( ( mData->url.isValid() || a.mData->url.isValid() ) && 160 if ( ( mData->url.isValid() || a.mData->url.isValid() ) &&
161 ( mData->url != a.mData->url ) ) return false; 161 ( mData->url != a.mData->url ) ) return false;
162 if ( mData->phoneNumbers != a.mData->phoneNumbers ) return false; 162 if ( mData->phoneNumbers != a.mData->phoneNumbers ) return false;
163 if ( mData->addresses != a.mData->addresses ) return false; 163 if ( mData->addresses != a.mData->addresses ) return false;
164 if ( mData->keys != a.mData->keys ) return false; 164 if ( mData->keys != a.mData->keys ) return false;
165 if ( mData->emails != a.mData->emails ) return false; 165 if ( mData->emails != a.mData->emails ) return false;
166 if ( mData->categories != a.mData->categories ) return false; 166 if ( mData->categories != a.mData->categories ) return false;
167 if ( mData->custom != a.mData->custom ) return false; 167 if ( mData->custom != a.mData->custom ) return false;
168 168
169 return true; 169 return true;
170} 170}
171 171
172bool Addressee::operator!=( const Addressee &a ) const 172bool Addressee::operator!=( const Addressee &a ) const
173{ 173{
174 return !( a == *this ); 174 return !( a == *this );
175} 175}
176 176
177bool Addressee::isEmpty() const 177bool Addressee::isEmpty() const
178{ 178{
179 return mData->empty; 179 return mData->empty;
180} 180}
181ulong Addressee::getCsum4List( const QStringList & attList) 181ulong Addressee::getCsum4List( const QStringList & attList)
182{ 182{
183 int max = attList.count(); 183 int max = attList.count();
184 ulong cSum = 0; 184 ulong cSum = 0;
185 int j,k,i; 185 int j,k,i;
186 int add; 186 int add;
187 for ( i = 0; i < max ; ++i ) { 187 for ( i = 0; i < max ; ++i ) {
188 QString s = attList[i]; 188 QString s = attList[i];
189 if ( ! s.isEmpty() ){ 189 if ( ! s.isEmpty() ){
190 j = s.length(); 190 j = s.length();
191 for ( k = 0; k < j; ++k ) { 191 for ( k = 0; k < j; ++k ) {
192 int mul = k +1; 192 int mul = k +1;
193 add = s[k].unicode (); 193 add = s[k].unicode ();
194 if ( k < 16 ) 194 if ( k < 16 )
195 mul = mul * mul; 195 mul = mul * mul;
196 int ii = i+1; 196 int ii = i+1;
197 add = add * mul *ii*ii*ii; 197 add = add * mul *ii*ii*ii;
198 cSum += add; 198 cSum += add;
199 //qDebug("csum: %d %d %d", i,k,cSum); 199 //qDebug("csum: %d %d %d", i,k,cSum);
200 } 200 }
201 } 201 }
202 202
203 } 203 }
204 //QString dump = attList.join(","); 204 //QString dump = attList.join(",");
205 //qDebug("csum: %d %s", cSum,dump.latin1()); 205 //qDebug("csum: %d %s", cSum,dump.latin1());
206 206
207 return cSum; 207 return cSum;
208 208
209} 209}
210void Addressee::computeCsum(const QString &dev) 210void Addressee::computeCsum(const QString &dev)
211{ 211{
212 QStringList l; 212 QStringList l;
213 //if ( !mData->name.isEmpty() ) l.append(mData->name); 213 //if ( !mData->name.isEmpty() ) l.append(mData->name);
214 //if ( !mData->formattedName.isEmpty() ) l.append(mData->formattedName ); 214 //if ( !mData->formattedName.isEmpty() ) l.append(mData->formattedName );
215 if ( !mData->familyName.isEmpty() ) l.append( mData->familyName ); 215 if ( !mData->familyName.isEmpty() ) l.append( mData->familyName );
216 if ( !mData->givenName.isEmpty() ) l.append(mData->givenName ); 216 if ( !mData->givenName.isEmpty() ) l.append(mData->givenName );
217 if ( !mData->additionalName.isEmpty() ) l.append( mData->additionalName ); 217 if ( !mData->additionalName.isEmpty() ) l.append( mData->additionalName );
218 if ( !mData->prefix.isEmpty() ) l.append( mData->prefix ); 218 if ( !mData->prefix.isEmpty() ) l.append( mData->prefix );
219 if ( !mData->suffix.isEmpty() ) l.append( mData->suffix ); 219 if ( !mData->suffix.isEmpty() ) l.append( mData->suffix );
220 if ( !mData->nickName.isEmpty() ) l.append( mData->nickName ); 220 if ( !mData->nickName.isEmpty() ) l.append( mData->nickName );
221 if ( mData->birthday.isValid() ) l.append( mData->birthday.toString() ); 221 if ( mData->birthday.isValid() ) l.append( mData->birthday.toString() );
222 if ( !mData->mailer.isEmpty() ) l.append( mData->mailer ); 222 if ( !mData->mailer.isEmpty() ) l.append( mData->mailer );
223 if ( mData->timeZone.isValid() ) l.append( mData->timeZone.asString() ); 223 if ( mData->timeZone.isValid() ) l.append( mData->timeZone.asString() );
224 if ( mData->geo.isValid() ) l.append( mData->geo.asString() ); 224 if ( mData->geo.isValid() ) l.append( mData->geo.asString() );
225 if ( !mData->title .isEmpty() ) l.append( mData->title ); 225 if ( !mData->title .isEmpty() ) l.append( mData->title );
226 if ( !mData->role.isEmpty() ) l.append( mData->role ); 226 if ( !mData->role.isEmpty() ) l.append( mData->role );
227 if ( !mData->organization.isEmpty() ) l.append( mData->organization ); 227 if ( !mData->organization.isEmpty() ) l.append( mData->organization );
228 if ( !mData->note.isEmpty() ) l.append( mData->note ); 228 if ( !mData->note.isEmpty() ) l.append( mData->note );
229 if ( !mData->productId.isEmpty() ) l.append(mData->productId ); 229 if ( !mData->productId.isEmpty() ) l.append(mData->productId );
230 if ( !mData->sortString.isEmpty() ) l.append( mData->sortString ); 230 if ( !mData->sortString.isEmpty() ) l.append( mData->sortString );
231 if ( mData->secrecy.isValid() ) l.append( mData->secrecy.asString()); 231 if ( mData->secrecy.isValid() ) l.append( mData->secrecy.asString());
232 if ( !mData->logo.undefined() ) { 232 if ( !mData->logo.undefined() ) {
233 if ( !mData->logo.isIntern() ) 233 if ( !mData->logo.isIntern() )
234 l.append( mData->logo.url() ); 234 l.append( mData->logo.url() );
235 else 235 else
236 l.append( QString::number(mData->logo.data().width()* mData->logo.data().height())); 236 l.append( QString::number(mData->logo.data().width()* mData->logo.data().height()));
237 } else { 237 } else {
238 l.append( "nologo"); 238 l.append( "nologo");
239 } 239 }
240 if ( !mData->photo.undefined() ) { 240 if ( !mData->photo.undefined() ) {
241 if ( !mData->photo.isIntern() ) 241 if ( !mData->photo.isIntern() )
242 l.append( mData->photo.url() ); 242 l.append( mData->photo.url() );
243 else 243 else
244 l.append( QString::number(mData->photo.data().width()* mData->photo.data().height())); 244 l.append( QString::number(mData->photo.data().width()* mData->photo.data().height()));
245 } else { 245 } else {
246 l.append( "nophoto"); 246 l.append( "nophoto");
247 } 247 }
248#if 0 248#if 0
249 if ( !mData->sound.undefined() ) { 249 if ( !mData->sound.undefined() ) {
250 if ( !mData->sound.isIntern() ) 250 if ( !mData->sound.isIntern() )
251 l.append( mData->sound.url() ); 251 l.append( mData->sound.url() );
252 else 252 else
253 l.append( QString(mData->sound.data().with()* mData->sound.data().height())); 253 l.append( QString(mData->sound.data().with()* mData->sound.data().height()));
254 } else { 254 } else {
255 l.append( "nosound"); 255 l.append( "nosound");
256 } 256 }
257#endif 257#endif
258 //if ( !mData->agent.isEmpty() ) l.append( ); 258 //if ( !mData->agent.isEmpty() ) l.append( );
259 if ( mData->url.isValid() ) 259 if ( mData->url.isValid() )
260 if ( ! mData->url.path().isEmpty()) l.append( mData->url.path() ); 260 if ( ! mData->url.path().isEmpty()) l.append( mData->url.path() );
261 KABC::PhoneNumber::List phoneNumbers; 261 KABC::PhoneNumber::List phoneNumbers;
262 KABC::PhoneNumber::List::Iterator phoneIter; 262 KABC::PhoneNumber::List::Iterator phoneIter;
263 263
264 QStringList t; 264 QStringList t;
265 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); 265 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
266 ++phoneIter ) 266 ++phoneIter )
267 t.append( ( *phoneIter ).number()+QString::number( ( *phoneIter ).type() ) ); 267 t.append( ( *phoneIter ).number()+QString::number( ( *phoneIter ).type() ) );
268 t.sort(); 268 t.sort();
269 uint iii; 269 uint iii;
270 for ( iii = 0; iii < t.count(); ++iii) 270 for ( iii = 0; iii < t.count(); ++iii)
271 l.append( t[iii] ); 271 l.append( t[iii] );
272 t = mData->emails; 272 t = mData->emails;
273 t.sort(); 273 t.sort();
274 for ( iii = 0; iii < t.count(); ++iii) 274 for ( iii = 0; iii < t.count(); ++iii)
275 l.append( t[iii] ); 275 l.append( t[iii] );
276 t = mData->categories; 276 t = mData->categories;
277 t.sort(); 277 t.sort();
278 for ( iii = 0; iii < t.count(); ++iii) 278 for ( iii = 0; iii < t.count(); ++iii)
279 l.append( t[iii] ); 279 l.append( t[iii] );
280 t = mData->custom; 280 t = mData->custom;
281 t.sort(); 281 t.sort();
282 for ( iii = 0; iii < t.count(); ++iii) 282 for ( iii = 0; iii < t.count(); ++iii)
283 if ( t[iii].left( 25 ) != "KADDRESSBOOK-X-ExternalID" ) { 283 if ( t[iii].left( 25 ) != "KADDRESSBOOK-X-ExternalID" ) {
284 int find = t[iii].find (':')+1; 284 int find = t[iii].find (':')+1;
285 //qDebug("lennnn %d %d ", find, t[iii].length()); 285 //qDebug("lennnn %d %d ", find, t[iii].length());
286 if ( find < t[iii].length()) 286 if ( find < t[iii].length())
287 l.append( t[iii] ); 287 l.append( t[iii] );
288 288
289 } 289 }
290 KABC::Address::List::Iterator addressIter; 290 KABC::Address::List::Iterator addressIter;
291 for ( addressIter = mData->addresses.begin(); addressIter != mData->addresses.end(); 291 for ( addressIter = mData->addresses.begin(); addressIter != mData->addresses.end();
292 ++addressIter ) { 292 ++addressIter ) {
293 t = (*addressIter).asList(); 293 t = (*addressIter).asList();
294 t.sort(); 294 t.sort();
295 for ( iii = 0; iii < t.count(); ++iii) 295 for ( iii = 0; iii < t.count(); ++iii)
296 l.append( t[iii] ); 296 l.append( t[iii] );
297 } 297 }
298 uint cs = getCsum4List(l); 298 uint cs = getCsum4List(l);
299 299
300#if 0 300#if 0
301 for ( iii = 0; iii < l.count(); ++iii) 301 for ( iii = 0; iii < l.count(); ++iii)
302 qDebug("%d***%s***",iii,l[iii].latin1()); 302 qDebug("%d***%s***",iii,l[iii].latin1());
303 qDebug("CSUM computed %d %s %s", cs,QString::number (cs ).latin1(), uid().latin1() ); 303 qDebug("CSUM computed %d %s %s", cs,QString::number (cs ).latin1(), uid().latin1() );
304#endif 304#endif
305 305
306 306
307 setCsum( dev, QString::number (cs )); 307 setCsum( dev, QString::number (cs ));
308} 308}
309bool Addressee::matchAddress( QRegExp* re ) const 309bool Addressee::matchAddress( QRegExp* re ) const
310{ 310{
311 KABC::Address::List::Iterator addressIter; 311 KABC::Address::List::Iterator addressIter;
312 for ( addressIter = mData->addresses.begin(); addressIter != mData->addresses.end(); 312 for ( addressIter = mData->addresses.begin(); addressIter != mData->addresses.end();
313 ++addressIter ) { 313 ++addressIter ) {
314 if ( (*addressIter).matchAddress( re ) ) 314 if ( (*addressIter).matchAddress( re ) )
315 return true; 315 return true;
316 } 316 }
317 return false; 317 return false;
318} 318}
319bool Addressee::matchPhoneNumber( QRegExp* re ) const 319bool Addressee::matchPhoneNumber( QRegExp* re ) const
320{ 320{
321 KABC::PhoneNumber::List::Iterator phoneIter; 321 KABC::PhoneNumber::List::Iterator phoneIter;
322 322
323 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); ++phoneIter ) { 323 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); ++phoneIter ) {
324#if QT_VERSION >= 0x030000 324#if QT_VERSION >= 0x030000
325 if (re->search( (*phoneIter).number() ) == 0) 325 if (re->search( (*phoneIter).number() ) == 0)
326#else 326#else
327 if (re->match( (*phoneIter).number() ) == 0) 327 if (re->match( (*phoneIter).number() ) == 0)
328#endif 328#endif
329 return true; 329 return true;
330 330
331 } 331 }
332 return false; 332 return false;
333 333
334} 334}
335void Addressee::mergeContact( const Addressee& ad , bool isSubSet) // = false) 335void Addressee::mergeContact( const Addressee& ad , bool isSubSet) // = false)
336{ 336{
337 // merge all standard non-outlook fields. 337 // merge all standard non-outlook fields.
338 //if isSubSet (e.g. mobile phone sync) merge all fields 338 //if isSubSet (e.g. mobile phone sync) merge all fields
339 339
340 detach(); 340 detach();
341 if ( isSubSet ) { 341 if ( isSubSet ) {
342 if ( mData->name.isEmpty() ) mData->name = ad.mData->name; 342 if ( mData->name.isEmpty() ) mData->name = ad.mData->name;
343 if ( mData->formattedName.isEmpty() ) mData->formattedName = ad.mData->formattedName; 343 if ( mData->formattedName.isEmpty() ) mData->formattedName = ad.mData->formattedName;
344 if ( mData->familyName.isEmpty() ) mData->familyName = ad.mData->familyName; 344 if ( mData->familyName.isEmpty() ) mData->familyName = ad.mData->familyName;
345 if ( mData->givenName.isEmpty() ) mData->givenName = ad.mData->givenName ; 345 if ( mData->givenName.isEmpty() ) mData->givenName = ad.mData->givenName ;
346 if ( mData->additionalName ) mData->additionalName = ad.mData->additionalName; 346 if ( mData->additionalName ) mData->additionalName = ad.mData->additionalName;
347 if ( mData->prefix.isEmpty() ) mData->prefix = ad.mData->prefix; 347 if ( mData->prefix.isEmpty() ) mData->prefix = ad.mData->prefix;
348 if ( mData->suffix.isEmpty() ) mData->suffix = ad.mData->suffix; 348 if ( mData->suffix.isEmpty() ) mData->suffix = ad.mData->suffix;
349 if ( mData->title .isEmpty() ) mData->title = ad.mData->title ; 349 if ( mData->title .isEmpty() ) mData->title = ad.mData->title ;
350 if ( mData->role.isEmpty() ) mData->role = ad.mData->role ; 350 if ( mData->role.isEmpty() ) mData->role = ad.mData->role ;
351 if ( mData->nickName.isEmpty() ) mData->nickName = ad.mData->nickName; 351 if ( mData->nickName.isEmpty() ) mData->nickName = ad.mData->nickName;
352 if ( mData->organization.isEmpty() ) mData->organization = ad.mData->organization ; 352 if ( mData->organization.isEmpty() ) mData->organization = ad.mData->organization ;
353 if ( mData->note.isEmpty() ) mData->note = ad.mData->note ; 353 if ( mData->note.isEmpty() ) mData->note = ad.mData->note ;
354 if ( !mData->secrecy.isValid() ) mData->secrecy = ad.mData->secrecy; 354 if ( !mData->secrecy.isValid() ) mData->secrecy = ad.mData->secrecy;
355 if ( ( !mData->url.isValid() && ad.mData->url.isValid() ) ) mData->url = ad.mData->url ; 355 if ( ( !mData->url.isValid() && ad.mData->url.isValid() ) ) mData->url = ad.mData->url ;
356 if ( !mData->birthday.isValid() ) 356 if ( !mData->birthday.isValid() )
357 if ( ad.mData->birthday.isValid()) 357 if ( ad.mData->birthday.isValid())
358 mData->birthday = ad.mData->birthday; 358 mData->birthday = ad.mData->birthday;
359 359
360 } 360 }
361 if ( mData->mailer.isEmpty() ) mData->mailer = ad.mData->mailer; 361 if ( mData->mailer.isEmpty() ) mData->mailer = ad.mData->mailer;
362 if ( !mData->timeZone.isValid() ) mData->timeZone = ad.mData->timeZone; 362 if ( !mData->timeZone.isValid() ) mData->timeZone = ad.mData->timeZone;
363 if ( !mData->geo.isValid() ) mData->geo = ad.mData->geo; 363 if ( !mData->geo.isValid() ) mData->geo = ad.mData->geo;
364 if ( mData->productId.isEmpty() ) mData->productId = ad.mData->productId; 364 if ( mData->productId.isEmpty() ) mData->productId = ad.mData->productId;
365 if ( mData->sortString.isEmpty() ) mData->sortString = ad.mData->sortString; 365 if ( mData->sortString.isEmpty() ) mData->sortString = ad.mData->sortString;
366 QStringList t; 366 QStringList t;
367 QStringList tAD; 367 QStringList tAD;
368 uint iii; 368 uint iii;
369 369
370 // ********** phone numbers 370 // ********** phone numbers
371 if ( isSubSet ) { 371 if ( isSubSet ) {
372 PhoneNumber::List phoneAD = ad.phoneNumbers(); 372 PhoneNumber::List phoneAD = ad.phoneNumbers();
373 PhoneNumber::List::Iterator phoneItAD; 373 PhoneNumber::List::Iterator phoneItAD;
374 for ( phoneItAD = phoneAD.begin(); phoneItAD != phoneAD.end(); ++phoneItAD ) { 374 for ( phoneItAD = phoneAD.begin(); phoneItAD != phoneAD.end(); ++phoneItAD ) {
375 bool found = false; 375 bool found = false;
376 PhoneNumber::List::Iterator it; 376 PhoneNumber::List::Iterator it;
377 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 377 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
378 if ( ( *phoneItAD ).contains( (*it) ) ) { 378 if ( ( *phoneItAD ).contains( (*it) ) ) {
379 found = true; 379 found = true;
380 (*it).setType( ( *phoneItAD ).type() ); 380 (*it).setType( ( *phoneItAD ).type() );
381 (*it).setNumber( ( *phoneItAD ).number() ); 381 (*it).setNumber( ( *phoneItAD ).number() );
382 break; 382 break;
383 } 383 }
384 } 384 }
385 // if ( isSubSet && ! found ) 385 // if ( isSubSet && ! found )
386 if ( ! found ) // LR try this one... 386 if ( ! found ) // LR try this one...
387 mData->phoneNumbers.append( *phoneItAD ); 387 mData->phoneNumbers.append( *phoneItAD );
388 } 388 }
389 } else { 389 } else {
390 PhoneNumber::List phoneAD = ad.phoneNumbers(); 390 PhoneNumber::List phoneAD = ad.phoneNumbers();
391 PhoneNumber::List::Iterator phoneItAD; 391 PhoneNumber::List::Iterator phoneItAD;
392 for ( phoneItAD = phoneAD.begin(); phoneItAD != phoneAD.end(); ++phoneItAD ) { 392 for ( phoneItAD = phoneAD.begin(); phoneItAD != phoneAD.end(); ++phoneItAD ) {
393 bool found = false; 393 bool found = false;
394 PhoneNumber::List::Iterator it; 394 PhoneNumber::List::Iterator it;
395 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 395 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
396 if ( ( *phoneItAD ).contains( (*it) ) ) { 396 if ( ( *phoneItAD ).contains( (*it) ) ) {
397 found = true; 397 found = true;
398 (*it).setType( ( *phoneItAD ).type() ); 398 (*it).setType( ( *phoneItAD ).type() );
399 (*it).setNumber( ( *phoneItAD ).number() ); 399 (*it).setNumber( ( *phoneItAD ).number() );
400 break; 400 break;
401 } 401 }
402 } 402 }
403 if ( ! found ) { // append numbers which do not have work or home type 403 if ( ! found ) { // append numbers which do not have work or home type
404 if ( ! ( ( *phoneItAD ).type() & (PhoneNumber::Work | PhoneNumber::Home) ) ) 404 if ( ! ( ( *phoneItAD ).type() & (PhoneNumber::Work | PhoneNumber::Home) ) )
405 mData->phoneNumbers.append( *phoneItAD ); 405 mData->phoneNumbers.append( *phoneItAD );
406 } 406 }
407 } 407 }
408 } 408 }
409 if ( isSubSet ) { 409 if ( isSubSet ) {
410 // ************* emails; 410 // ************* emails;
411 t = mData->emails; 411 t = mData->emails;
412 tAD = ad.mData->emails; 412 tAD = ad.mData->emails;
413 for ( iii = 0; iii < tAD.count(); ++iii) 413 for ( iii = 0; iii < tAD.count(); ++iii)
414 if ( !t.contains(tAD[iii] ) ) 414 if ( !t.contains(tAD[iii] ) )
415 mData->emails.append( tAD[iii] ); 415 mData->emails.append( tAD[iii] );
416 } 416 }
417 417
418 // ************* categories; 418 // ************* categories;
419 if ( isSubSet ) { 419 if ( isSubSet ) {
420 t = mData->categories; 420 t = mData->categories;
421 tAD = ad.mData->categories; 421 tAD = ad.mData->categories;
422 for ( iii = 0; iii < tAD.count(); ++iii) 422 for ( iii = 0; iii < tAD.count(); ++iii)
423 if ( !t.contains(tAD[iii] ) ) 423 if ( !t.contains(tAD[iii] ) )
424 mData->categories.append( tAD[iii] ); 424 mData->categories.append( tAD[iii] );
425 } 425 }
426 QStringList::ConstIterator it; 426 QStringList::ConstIterator it;
427 for( it = ad.mData->custom.begin(); it != ad.mData->custom.end(); ++it ) { 427 for( it = ad.mData->custom.begin(); it != ad.mData->custom.end(); ++it ) {
428 QString qualifiedName = (*it).left( (*it).find( ":" )); 428 QString qualifiedName = (*it).left( (*it).find( ":" ));
429 bool found = false; 429 bool found = false;
430 QStringList::ConstIterator itL; 430 QStringList::ConstIterator itL;
431 for( itL = mData->custom.begin(); itL != mData->custom.end(); ++itL ) { 431 for( itL = mData->custom.begin(); itL != mData->custom.end(); ++itL ) {
432 if ( (*itL).startsWith( qualifiedName ) ) { 432 if ( (*itL).startsWith( qualifiedName ) ) {
433 found = true; 433 found = true;
434 break; 434 break;
435 } 435 }
436 } 436 }
437 if ( ! found ) { 437 if ( ! found ) {
438 mData->custom.append( *it ); 438 mData->custom.append( *it );
439 } 439 }
440 } 440 }
441 if ( mData->logo.undefined() && !ad.mData->logo.undefined() ) mData->logo = ad.mData->logo; 441 if ( mData->logo.undefined() && !ad.mData->logo.undefined() ) mData->logo = ad.mData->logo;
442 if ( mData->photo.undefined() && !ad.mData->photo.undefined() ) mData->photo = ad.mData->photo; 442 if ( mData->photo.undefined() && !ad.mData->photo.undefined() ) mData->photo = ad.mData->photo;
443 if ( !mData->sound.isIntern() ) { 443 if ( !mData->sound.isIntern() ) {
444 if ( mData->sound.url().isEmpty() ) { 444 if ( mData->sound.url().isEmpty() ) {
445 mData->sound = ad.mData->sound; 445 mData->sound = ad.mData->sound;
446 } 446 }
447 } 447 }
448 if ( !mData->agent.isIntern() ) { 448 if ( !mData->agent.isIntern() ) {
449 if ( mData->agent.url().isEmpty() ) { 449 if ( mData->agent.url().isEmpty() ) {
450 mData->agent = ad.mData->agent; 450 mData->agent = ad.mData->agent;
451 } 451 }
452 } 452 }
453 { 453 {
454 Key::List::Iterator itA; 454 Key::List::Iterator itA;
455 for( itA = ad.mData->keys.begin(); itA != ad.mData->keys.end(); ++itA ) { 455 for( itA = ad.mData->keys.begin(); itA != ad.mData->keys.end(); ++itA ) {
456 bool found = false; 456 bool found = false;
457 Key::List::Iterator it; 457 Key::List::Iterator it;
458 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 458 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
459 if ( (*it) == (*itA)) { 459 if ( (*it) == (*itA)) {
460 found = true; 460 found = true;
461 break; 461 break;
462 462
463 } 463 }
464 } 464 }
465 if ( ! found ) { 465 if ( ! found ) {
466 mData->keys.append( *itA ); 466 mData->keys.append( *itA );
467 } 467 }
468 } 468 }
469 } 469 }
470 if ( isSubSet ) { 470 if ( isSubSet ) {
471 KABC::Address::List::Iterator addressIterA; 471 KABC::Address::List::Iterator addressIterA;
472 for ( addressIterA = ad.mData->addresses.begin(); addressIterA != ad.mData->addresses.end(); ++addressIterA ) { 472 for ( addressIterA = ad.mData->addresses.begin(); addressIterA != ad.mData->addresses.end(); ++addressIterA ) {
473 bool found = false; 473 bool found = false;
474 KABC::Address::List::Iterator addressIter; 474 KABC::Address::List::Iterator addressIter;
475 for ( addressIter = mData->addresses.begin(); addressIter != mData->addresses.end(); 475 for ( addressIter = mData->addresses.begin(); addressIter != mData->addresses.end();
476 ++addressIter ) { 476 ++addressIter ) {
477 if ( (*addressIter) == (*addressIterA)) { 477 if ( (*addressIter) == (*addressIterA)) {
478 found = true; 478 found = true;
479 (*addressIter).setType( (*addressIterA).type() ); 479 (*addressIter).setType( (*addressIterA).type() );
480 break; 480 break;
481 } 481 }
482 482
483 } 483 }
484 if ( isSubSet && ! found ) { 484 if ( isSubSet && ! found ) {
485 mData->addresses.append( *addressIterA ); 485 mData->addresses.append( *addressIterA );
486 } 486 }
487 } 487 }
488 } 488 }
489 //qDebug("merge contact %s ", ad.uid().latin1()); 489 //qDebug("merge contact %s ", ad.uid().latin1());
490 setUid( ad.uid() ); 490 setUid( ad.uid() );
491 setRevision( ad.revision() ); 491 setRevision( ad.revision() );
492} 492}
493 493
494bool Addressee::removeVoice() 494bool Addressee::removeVoice()
495{ 495{
496 PhoneNumber::List phoneN = phoneNumbers(); 496 PhoneNumber::List phoneN = phoneNumbers();
497 PhoneNumber::List::Iterator phoneIt; 497 PhoneNumber::List::Iterator phoneIt;
498 bool found = false; 498 bool found = false;
499 for ( phoneIt = phoneN.begin(); phoneIt != phoneN.end(); ++phoneIt ) { 499 for ( phoneIt = phoneN.begin(); phoneIt != phoneN.end(); ++phoneIt ) {
500 if ( (*phoneIt).type() & PhoneNumber::Voice) { // voice found 500 if ( (*phoneIt).type() & PhoneNumber::Voice) { // voice found
501 if ((*phoneIt).type() - PhoneNumber::Voice ) { 501 if ((*phoneIt).type() - PhoneNumber::Voice ) {
502 (*phoneIt).setType((*phoneIt).type() - PhoneNumber::Voice ); 502 (*phoneIt).setType((*phoneIt).type() - PhoneNumber::Voice );
503 insertPhoneNumber( (*phoneIt) ); 503 insertPhoneNumber( (*phoneIt) );
504 found = true; 504 found = true;
505 } 505 }
506 } 506 }
507 507
508 } 508 }
509 return found; 509 return found;
510} 510}
511 511
512bool Addressee::containsAdr(const Addressee& ad ) 512bool Addressee::containsAdr(const Addressee& ad )
513{ 513{
514 if ( ! ad.mData->familyName.isEmpty() ) if ( mData->familyName != ad.mData->familyName) return false; 514 if ( ! ad.mData->familyName.isEmpty() ) if ( mData->familyName != ad.mData->familyName) return false;
515 if ( ! ad.mData->givenName.isEmpty() )if ( mData->givenName != ad.mData->givenName ) return false; 515 if ( ! ad.mData->givenName.isEmpty() )if ( mData->givenName != ad.mData->givenName ) return false;
516 if ( ad.mData->url.isValid() ) if (mData->url != ad.mData->url) return false ; 516 if ( ad.mData->url.isValid() ) if (mData->url != ad.mData->url) return false ;
517 if ( ! ad.mData->role.isEmpty() ) if (mData->role != ad.mData->role) return false ; 517 if ( ! ad.mData->role.isEmpty() ) if (mData->role != ad.mData->role) return false ;
518 if ( ! ad.mData->organization.isEmpty() ) if (mData->organization != ad.mData->organization) return false ; 518 if ( ! ad.mData->organization.isEmpty() ) if (mData->organization != ad.mData->organization) return false ;
519 if ( ! ad.mData->note.isEmpty() ) if (mData->note != ad.mData->note) return false ; 519 if ( ! ad.mData->note.isEmpty() ) if (mData->note != ad.mData->note) return false ;
520 if ( ! ad.mData->title .isEmpty() ) if (mData->title != ad.mData->title ) return false ; 520 if ( ! ad.mData->title .isEmpty() ) if (mData->title != ad.mData->title ) return false ;
521 521
522 // compare phone numbers 522 // compare phone numbers
523 PhoneNumber::List phoneN = ad.phoneNumbers(); 523 PhoneNumber::List phoneN = ad.phoneNumbers();
524 PhoneNumber::List::Iterator phoneIt; 524 PhoneNumber::List::Iterator phoneIt;
525 bool found = false; 525 bool found = false;
526 for ( phoneIt = phoneN.begin(); phoneIt != phoneN.end(); ++phoneIt ) { 526 for ( phoneIt = phoneN.begin(); phoneIt != phoneN.end(); ++phoneIt ) {
527 bool found = false; 527 bool found = false;
528 PhoneNumber::List phoneL = ad.phoneNumbers(); 528 PhoneNumber::List phoneL = ad.phoneNumbers();
529 PhoneNumber::List::Iterator phoneItL; 529 PhoneNumber::List::Iterator phoneItL;
530 for ( phoneItL = phoneL.begin(); phoneItL != phoneL.end(); ++phoneItL ) { 530 for ( phoneItL = phoneL.begin(); phoneItL != phoneL.end(); ++phoneItL ) {
531 if ( ( *phoneItL ).number() == ( *phoneIt ).number() ) { 531 if ( ( *phoneItL ).number() == ( *phoneIt ).number() ) {
532 found = true; 532 found = true;
533 break; 533 break;
534 } 534 }
535 } 535 }
536 if ( ! found ) 536 if ( ! found )
537 return false; 537 return false;
538 } 538 }
539 return true; 539 return true;
540 540
541} 541}
542void Addressee::simplifyAddresses() 542void Addressee::simplifyAddresses()
543{ 543{
544 544
545 545
546 Address::List list; 546 Address::List list;
547 Address::List::Iterator it; 547 Address::List::Iterator it;
548 Address::List::Iterator it2; 548 Address::List::Iterator it2;
549 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 549 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
550 it2 = it; 550 it2 = it;
551 ++it2; 551 ++it2;
552 for( ; it2 != mData->addresses.end(); ++it2 ) { 552 for( ; it2 != mData->addresses.end(); ++it2 ) {
553 if ( (*it) == (*it2) ) { 553 if ( (*it) == (*it2) ) {
554 list.append( *it ); 554 list.append( *it );
555 break; 555 break;
556 } 556 }
557 } 557 }
558 } 558 }
559 for( it = list.begin(); it != list.end(); ++it ) { 559 for( it = list.begin(); it != list.end(); ++it ) {
560 removeAddress( (*it) ); 560 removeAddress( (*it) );
561 } 561 }
562 562
563 list.clear(); 563 list.clear();
564 int max = 2; 564 int max = 2;
565 if ( mData->url.isValid() ) 565 if ( mData->url.isValid() )
566 max = 1; 566 max = 1;
567 if ( mData->addresses.count() <= max ) return ; 567 if ( mData->addresses.count() <= max ) return ;
568 int count = 0; 568 int count = 0;
569 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 569 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
570 if ( count >= max ) 570 if ( count >= max )
571 list.append( *it ); 571 list.append( *it );
572 ++count; 572 ++count;
573 } 573 }
574 for( it = list.begin(); it != list.end(); ++it ) { 574 for( it = list.begin(); it != list.end(); ++it ) {
575 removeAddress( (*it) ); 575 removeAddress( (*it) );
576 } 576 }
577} 577}
578 578
579// removes all emails but the first 579// removes all emails but the first
580// needed by phone sync 580// needed by phone sync
581void Addressee::simplifyEmails() 581void Addressee::simplifyEmails()
582{ 582{
583 if ( mData->emails.count() == 0 ) return ; 583 if ( mData->emails.count() == 0 ) return ;
584 QString email = mData->emails.first(); 584 QString email = mData->emails.first();
585 detach(); 585 detach();
586 mData->emails.clear(); 586 mData->emails.clear();
587 mData->emails.append( email ); 587 mData->emails.append( email );
588} 588}
589void Addressee::makePhoneNumbersOLcompatible()
590{
591 KABC::PhoneNumber::List::Iterator phoneIter;
592 KABC::PhoneNumber::List::Iterator phoneIter2;
593 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
594 ++phoneIter ) {
595 ( *phoneIter ).makeCompat();
596 }
597 int hasHome = hasPhoneNumberType( PhoneNumber::Home | PhoneNumber::Pref );
598 int hasHome2 = hasPhoneNumberType( PhoneNumber::Home );
599 int hasWork = hasPhoneNumberType( PhoneNumber::Work | PhoneNumber::Pref );
600 int hasWork2 = hasPhoneNumberType( PhoneNumber::Work );
601 int hasCell = hasPhoneNumberType( PhoneNumber::Cell );
602 int hasCell2 = hasPhoneNumberType( PhoneNumber::Car );
603 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
604 ++phoneIter ) {
605 if ( (*phoneIter).type() == PhoneNumber::Home && ! hasHome ) {
606 (*phoneIter).setType( PhoneNumber::Home | PhoneNumber::Pref );
607 ++hasHome;
608 if ( hasHome2 ) --hasHome2;
609 } else if ( ( (*phoneIter).type() == PhoneNumber::Home | PhoneNumber::Pref) && hasHome>1 && !hasHome2 ) {
610 (*phoneIter).setType( PhoneNumber::Home );
611 --hasHome;
612 ++hasHome2;
613 } else if ( (*phoneIter).type() == PhoneNumber::Work && ! hasWork ) {
614 (*phoneIter).setType( PhoneNumber::Work | PhoneNumber::Pref );
615 ++hasWork;
616 if ( hasWork2 ) --hasWork2;
617 } else if ( ( (*phoneIter).type() == PhoneNumber::Work | PhoneNumber::Pref) && hasWork > 1 && ! hasWork2 ) {
618 (*phoneIter).setType( PhoneNumber::Work );
619 --hasWork;
620 ++hasWork2;
621 } else if ( (*phoneIter).type() == PhoneNumber::Cell && hasCell > 1 && !hasCell2) {
622 (*phoneIter).setType( PhoneNumber::Car );
623 ++hasCell2;
624 --hasCell;
625 } else if ( (*phoneIter).type() == PhoneNumber::Car && hasCell2 > 1 && !hasCell) {
626 (*phoneIter).setType( PhoneNumber::Cell );
627 ++hasCell;
628 --hasCell2;
629 } else{
630 phoneIter2 = phoneIter;
631 ++phoneIter2;
632 for ( ; phoneIter2 != mData->phoneNumbers.end();
633 ++phoneIter2 ) {
634 if ( (*phoneIter2).type() == (*phoneIter).type() ) {
635 (*phoneIter2).setType( PhoneNumber::Voice );
589 636
637 }
638 }
639 }
640 }
641}
590void Addressee::simplifyPhoneNumbers() 642void Addressee::simplifyPhoneNumbers()
591{ 643{
592 int max = 4; 644 int max = 4;
593 int inList = mData->phoneNumbers.count(); 645 int inList = mData->phoneNumbers.count();
594 KABC::PhoneNumber::List removeNumbers; 646 KABC::PhoneNumber::List removeNumbers;
595 KABC::PhoneNumber::List::Iterator phoneIter; 647 KABC::PhoneNumber::List::Iterator phoneIter;
596 if ( inList > max ) { 648 if ( inList > max ) {
597 // delete non-preferred numbers 649 // delete non-preferred numbers
598 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); 650 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
599 ++phoneIter ) { 651 ++phoneIter ) {
600 if ( inList > max ) { 652 if ( inList > max ) {
601 if ( ! (( *phoneIter ).type() & PhoneNumber::Pref )) { 653 if ( ! (( *phoneIter ).type() & PhoneNumber::Pref )) {
602 removeNumbers.append( ( *phoneIter ) ); 654 removeNumbers.append( ( *phoneIter ) );
603 --inList; 655 --inList;
604 } 656 }
605 } else 657 } else
606 break; 658 break;
607 } 659 }
608 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end(); 660 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end();
609 ++phoneIter ) { 661 ++phoneIter ) {
610 removePhoneNumber(( *phoneIter )); 662 removePhoneNumber(( *phoneIter ));
611 } 663 }
612 // delete preferred numbers 664 // delete preferred numbers
613 if ( inList > max ) { 665 if ( inList > max ) {
614 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); 666 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
615 ++phoneIter ) { 667 ++phoneIter ) {
616 if ( inList > max ) { 668 if ( inList > max ) {
617 removeNumbers.append( ( *phoneIter ) ); 669 removeNumbers.append( ( *phoneIter ) );
618 --inList; 670 --inList;
619 } else 671 } else
620 break; 672 break;
621 } 673 }
622 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end(); 674 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end();
623 ++phoneIter ) { 675 ++phoneIter ) {
624 removePhoneNumber(( *phoneIter )); 676 removePhoneNumber(( *phoneIter ));
625 } 677 }
626 } 678 }
627 } 679 }
628 // remove non-numeric characters 680 // remove non-numeric characters
629 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); 681 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
630 ++phoneIter ) { 682 ++phoneIter ) {
631 if ( ! ( *phoneIter ).simplifyNumber() ) 683 if ( ! ( *phoneIter ).simplifyNumber() )
632 removeNumbers.append( ( *phoneIter ) ); 684 removeNumbers.append( ( *phoneIter ) );
633 } 685 }
634 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end(); 686 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end();
635 ++phoneIter ) { 687 ++phoneIter ) {
636 removePhoneNumber(( *phoneIter )); 688 removePhoneNumber(( *phoneIter ));
637 } 689 }
638} 690}
639void Addressee::simplifyPhoneNumberTypes() 691void Addressee::simplifyPhoneNumberTypes()
640{ 692{
641 KABC::PhoneNumber::List::Iterator phoneIter; 693 KABC::PhoneNumber::List::Iterator phoneIter;
642 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); 694 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
643 ++phoneIter ) 695 ++phoneIter )
644 ( *phoneIter ).simplifyType(); 696 ( *phoneIter ).simplifyType();
645} 697}
646void Addressee::removeID(const QString &prof) 698void Addressee::removeID(const QString &prof)
647{ 699{
648 detach(); 700 detach();
649 if ( prof.isEmpty() ) 701 if ( prof.isEmpty() )
650 mData->mExternalId = ":"; 702 mData->mExternalId = ":";
651 else 703 else
652 mData->mExternalId = KIdManager::removeId ( mData->mExternalId, prof); 704 mData->mExternalId = KIdManager::removeId ( mData->mExternalId, prof);
653 705
654} 706}
655void Addressee::setID( const QString & prof , const QString & id ) 707void Addressee::setID( const QString & prof , const QString & id )
656{ 708{
657 detach(); 709 detach();
658 mData->mExternalId = KIdManager::setId ( mData->mExternalId, prof, id ); 710 mData->mExternalId = KIdManager::setId ( mData->mExternalId, prof, id );
659 //qDebug("setID2 %s %s %s",mData->mExternalId.latin1(), prof.latin1(), id.latin1() ); 711 //qDebug("setID2 %s %s %s",mData->mExternalId.latin1(), prof.latin1(), id.latin1() );
660} 712}
661void Addressee::setTempSyncStat( int id ) 713void Addressee::setTempSyncStat( int id )
662{ 714{
663 if ( mData->mTempSyncStat == id ) return; 715 if ( mData->mTempSyncStat == id ) return;
664 detach(); 716 detach();
665 mData->mTempSyncStat = id; 717 mData->mTempSyncStat = id;
666} 718}
667int Addressee::tempSyncStat() const 719int Addressee::tempSyncStat() const
668{ 720{
669 return mData->mTempSyncStat; 721 return mData->mTempSyncStat;
670} 722}
671 723
672const QString Addressee::getID( const QString & prof) const 724const QString Addressee::getID( const QString & prof) const
673{ 725{
674 return KIdManager::getId ( mData->mExternalId, prof ); 726 return KIdManager::getId ( mData->mExternalId, prof );
675} 727}
676 728
677void Addressee::setCsum( const QString & prof , const QString & id ) 729void Addressee::setCsum( const QString & prof , const QString & id )
678{ 730{
679 detach(); 731 detach();
680 //qDebug("setcsum1 %s %s %s",mData->mExternalId.latin1(), prof.latin1(), id.latin1() ); 732 //qDebug("setcsum1 %s %s %s",mData->mExternalId.latin1(), prof.latin1(), id.latin1() );
681 mData->mExternalId = KIdManager::setCsum ( mData->mExternalId, prof, id ); 733 mData->mExternalId = KIdManager::setCsum ( mData->mExternalId, prof, id );
682 //qDebug("setcsum2 %s ",mData->mExternalId.latin1() ); 734 //qDebug("setcsum2 %s ",mData->mExternalId.latin1() );
683} 735}
684 736
685const QString Addressee::getCsum( const QString & prof) const 737const QString Addressee::getCsum( const QString & prof) const
686{ 738{
687 return KIdManager::getCsum ( mData->mExternalId, prof ); 739 return KIdManager::getCsum ( mData->mExternalId, prof );
688} 740}
689 741
690void Addressee::setIDStr( const QString & s ) 742void Addressee::setIDStr( const QString & s )
691{ 743{
692 detach(); 744 detach();
693 mData->mExternalId = s; 745 mData->mExternalId = s;
694} 746}
695 747
696const QString Addressee::IDStr() const 748const QString Addressee::IDStr() const
697{ 749{
698 return mData->mExternalId; 750 return mData->mExternalId;
699} 751}
700 752
701void Addressee::setExternalUID( const QString &id ) 753void Addressee::setExternalUID( const QString &id )
702{ 754{
703 if ( id == mData->externalUID ) return; 755 if ( id == mData->externalUID ) return;
704 detach(); 756 detach();
705 mData->empty = false; 757 mData->empty = false;
706 mData->externalUID = id; 758 mData->externalUID = id;
707} 759}
708 760
709const QString Addressee::externalUID() const 761const QString Addressee::externalUID() const
710{ 762{
711 return mData->externalUID; 763 return mData->externalUID;
712} 764}
713void Addressee::setOriginalExternalUID( const QString &id ) 765void Addressee::setOriginalExternalUID( const QString &id )
714{ 766{
715 if ( id == mData->originalExternalUID ) return; 767 if ( id == mData->originalExternalUID ) return;
716 detach(); 768 detach();
717 mData->empty = false; 769 mData->empty = false;
718 //qDebug("*******Set orig uid %s ", id.latin1()); 770 //qDebug("*******Set orig uid %s ", id.latin1());
719 mData->originalExternalUID = id; 771 mData->originalExternalUID = id;
720} 772}
721 773
722QString Addressee::originalExternalUID() const 774QString Addressee::originalExternalUID() const
723{ 775{
724 return mData->originalExternalUID; 776 return mData->originalExternalUID;
725} 777}
726 778
727void Addressee::setUid( const QString &id ) 779void Addressee::setUid( const QString &id )
728{ 780{
729 if ( id == mData->uid ) return; 781 if ( id == mData->uid ) return;
730 detach(); 782 detach();
731 //qDebug("****setuid %s ", id.latin1()); 783 //qDebug("****setuid %s ", id.latin1());
732 mData->empty = false; 784 mData->empty = false;
733 mData->uid = id; 785 mData->uid = id;
734} 786}
735 787
736const QString Addressee::uid() const 788const QString Addressee::uid() const
737{ 789{
738 if ( mData->uid.isEmpty() ) 790 if ( mData->uid.isEmpty() )
739 mData->uid = KApplication::randomString( 10 ); 791 mData->uid = KApplication::randomString( 10 );
740 792
741 return mData->uid; 793 return mData->uid;
742} 794}
743 795
744QString Addressee::uidLabel() 796QString Addressee::uidLabel()
745{ 797{
746 return i18n("Unique Identifier"); 798 return i18n("Unique Identifier");
747} 799}
748 800
749void Addressee::setName( const QString &name ) 801void Addressee::setName( const QString &name )
750{ 802{
751 if ( name == mData->name ) return; 803 if ( name == mData->name ) return;
752 detach(); 804 detach();
753 mData->empty = false; 805 mData->empty = false;
754 mData->name = name; 806 mData->name = name;
755} 807}
756 808
757QString Addressee::name() const 809QString Addressee::name() const
758{ 810{
759 return mData->name; 811 return mData->name;
760} 812}
761 813
762QString Addressee::nameLabel() 814QString Addressee::nameLabel()
763{ 815{
764 return i18n("Name"); 816 return i18n("Name");
765} 817}
766 818
767 819
768void Addressee::setFormattedName( const QString &formattedName ) 820void Addressee::setFormattedName( const QString &formattedName )
769{ 821{
770 if ( formattedName == mData->formattedName ) return; 822 if ( formattedName == mData->formattedName ) return;
771 detach(); 823 detach();
772 mData->empty = false; 824 mData->empty = false;
773 mData->formattedName = formattedName; 825 mData->formattedName = formattedName;
774} 826}
775 827
776QString Addressee::formattedName() const 828QString Addressee::formattedName() const
777{ 829{
778 return mData->formattedName; 830 return mData->formattedName;
779} 831}
780 832
781QString Addressee::formattedNameLabel() 833QString Addressee::formattedNameLabel()
782{ 834{
783 return i18n("Formatted Name"); 835 return i18n("Formatted Name");
784} 836}
785 837
786 838
787void Addressee::setFamilyName( const QString &familyName ) 839void Addressee::setFamilyName( const QString &familyName )
788{ 840{
789 if ( familyName == mData->familyName ) return; 841 if ( familyName == mData->familyName ) return;
790 detach(); 842 detach();
791 mData->empty = false; 843 mData->empty = false;
792 mData->familyName = familyName; 844 mData->familyName = familyName;
793} 845}
794 846
795QString Addressee::familyName() const 847QString Addressee::familyName() const
796{ 848{
797 return mData->familyName; 849 return mData->familyName;
798} 850}
799 851
800QString Addressee::familyNameLabel() 852QString Addressee::familyNameLabel()
801{ 853{
802 return i18n("Family Name"); 854 return i18n("Family Name");
803} 855}
804 856
805 857
806void Addressee::setGivenName( const QString &givenName ) 858void Addressee::setGivenName( const QString &givenName )
807{ 859{
808 if ( givenName == mData->givenName ) return; 860 if ( givenName == mData->givenName ) return;
809 detach(); 861 detach();
810 mData->empty = false; 862 mData->empty = false;
811 mData->givenName = givenName; 863 mData->givenName = givenName;
812} 864}
813 865
814QString Addressee::givenName() const 866QString Addressee::givenName() const
815{ 867{
816 return mData->givenName; 868 return mData->givenName;
817} 869}
818 870
819QString Addressee::givenNameLabel() 871QString Addressee::givenNameLabel()
820{ 872{
821 return i18n("Given Name"); 873 return i18n("Given Name");
822} 874}
823 875
824 876
825void Addressee::setAdditionalName( const QString &additionalName ) 877void Addressee::setAdditionalName( const QString &additionalName )
826{ 878{
827 if ( additionalName == mData->additionalName ) return; 879 if ( additionalName == mData->additionalName ) return;
828 detach(); 880 detach();
829 mData->empty = false; 881 mData->empty = false;
830 mData->additionalName = additionalName; 882 mData->additionalName = additionalName;
831} 883}
832 884
833QString Addressee::additionalName() const 885QString Addressee::additionalName() const
834{ 886{
835 return mData->additionalName; 887 return mData->additionalName;
836} 888}
837 889
838QString Addressee::additionalNameLabel() 890QString Addressee::additionalNameLabel()
839{ 891{
840 return i18n("Additional Names"); 892 return i18n("Additional Names");
841} 893}
842 894
843 895
844void Addressee::setPrefix( const QString &prefix ) 896void Addressee::setPrefix( const QString &prefix )
845{ 897{
846 if ( prefix == mData->prefix ) return; 898 if ( prefix == mData->prefix ) return;
847 detach(); 899 detach();
848 mData->empty = false; 900 mData->empty = false;
849 mData->prefix = prefix; 901 mData->prefix = prefix;
850} 902}
851 903
852QString Addressee::prefix() const 904QString Addressee::prefix() const
853{ 905{
854 return mData->prefix; 906 return mData->prefix;
855} 907}
856 908
857QString Addressee::prefixLabel() 909QString Addressee::prefixLabel()
858{ 910{
859 return i18n("Honorific Prefixes"); 911 return i18n("Honorific Prefixes");
860} 912}
861 913
862 914
863void Addressee::setSuffix( const QString &suffix ) 915void Addressee::setSuffix( const QString &suffix )
864{ 916{
865 if ( suffix == mData->suffix ) return; 917 if ( suffix == mData->suffix ) return;
866 detach(); 918 detach();
867 mData->empty = false; 919 mData->empty = false;
868 mData->suffix = suffix; 920 mData->suffix = suffix;
869} 921}
870 922
871QString Addressee::suffix() const 923QString Addressee::suffix() const
872{ 924{
873 return mData->suffix; 925 return mData->suffix;
874} 926}
875 927
876QString Addressee::suffixLabel() 928QString Addressee::suffixLabel()
877{ 929{
878 return i18n("Honorific Suffixes"); 930 return i18n("Honorific Suffixes");
879} 931}
880 932
881 933
882void Addressee::setNickName( const QString &nickName ) 934void Addressee::setNickName( const QString &nickName )
883{ 935{
884 if ( nickName == mData->nickName ) return; 936 if ( nickName == mData->nickName ) return;
885 detach(); 937 detach();
886 mData->empty = false; 938 mData->empty = false;
887 mData->nickName = nickName; 939 mData->nickName = nickName;
888} 940}
889 941
890QString Addressee::nickName() const 942QString Addressee::nickName() const
891{ 943{
892 return mData->nickName; 944 return mData->nickName;
893} 945}
894 946
895QString Addressee::nickNameLabel() 947QString Addressee::nickNameLabel()
896{ 948{
897 return i18n("Nick Name"); 949 return i18n("Nick Name");
898} 950}
899 951
900 952
901void Addressee::setBirthday( const QDateTime &birthday ) 953void Addressee::setBirthday( const QDateTime &birthday )
902{ 954{
903 if ( birthday == mData->birthday ) return; 955 if ( birthday == mData->birthday ) return;
904 detach(); 956 detach();
905 mData->empty = false; 957 mData->empty = false;
906 mData->birthday = birthday; 958 mData->birthday = birthday;
907} 959}
908 960
909QDateTime Addressee::birthday() const 961QDateTime Addressee::birthday() const
910{ 962{
911 return mData->birthday; 963 return mData->birthday;
912} 964}
913 965
914QString Addressee::birthdayLabel() 966QString Addressee::birthdayLabel()
915{ 967{
916 return i18n("Birthday"); 968 return i18n("Birthday");
917} 969}
918 970
919 971
920QString Addressee::homeAddressStreetLabel() 972QString Addressee::homeAddressStreetLabel()
921{ 973{
922 return i18n("Home Address Street"); 974 return i18n("Home Address Street");
923} 975}
924 976
925 977
926QString Addressee::homeAddressLocalityLabel() 978QString Addressee::homeAddressLocalityLabel()
927{ 979{
928 return i18n("Home Address Locality"); 980 return i18n("Home Address Locality");
929} 981}
930 982
931 983
932QString Addressee::homeAddressRegionLabel() 984QString Addressee::homeAddressRegionLabel()
933{ 985{
934 return i18n("Home Address Region"); 986 return i18n("Home Address Region");
935} 987}
936 988
937 989
938QString Addressee::homeAddressPostalCodeLabel() 990QString Addressee::homeAddressPostalCodeLabel()
939{ 991{
940 return i18n("Home Address Postal Code"); 992 return i18n("Home Address Postal Code");
941} 993}
942 994
943 995
944QString Addressee::homeAddressCountryLabel() 996QString Addressee::homeAddressCountryLabel()
945{ 997{
946 return i18n("Home Address Country"); 998 return i18n("Home Address Country");
947} 999}
948 1000
949 1001
950QString Addressee::homeAddressLabelLabel() 1002QString Addressee::homeAddressLabelLabel()
951{ 1003{
952 return i18n("Home Address Label"); 1004 return i18n("Home Address Label");
953} 1005}
954 1006
955 1007
956QString Addressee::businessAddressStreetLabel() 1008QString Addressee::businessAddressStreetLabel()
957{ 1009{
958 return i18n("Business Address Street"); 1010 return i18n("Business Address Street");
959} 1011}
960 1012
961 1013
962QString Addressee::businessAddressLocalityLabel() 1014QString Addressee::businessAddressLocalityLabel()
963{ 1015{
964 return i18n("Business Address Locality"); 1016 return i18n("Business Address Locality");
965} 1017}
966 1018
967 1019
968QString Addressee::businessAddressRegionLabel() 1020QString Addressee::businessAddressRegionLabel()
969{ 1021{
970 return i18n("Business Address Region"); 1022 return i18n("Business Address Region");
971} 1023}
972 1024
973 1025
974QString Addressee::businessAddressPostalCodeLabel() 1026QString Addressee::businessAddressPostalCodeLabel()
975{ 1027{
976 return i18n("Business Address Postal Code"); 1028 return i18n("Business Address Postal Code");
977} 1029}
978 1030
979 1031
980QString Addressee::businessAddressCountryLabel() 1032QString Addressee::businessAddressCountryLabel()
981{ 1033{
982 return i18n("Business Address Country"); 1034 return i18n("Business Address Country");
983} 1035}
984 1036
985 1037
986QString Addressee::businessAddressLabelLabel() 1038QString Addressee::businessAddressLabelLabel()
987{ 1039{
988 return i18n("Business Address Label"); 1040 return i18n("Business Address Label");
989} 1041}
990 1042
991 1043
992QString Addressee::homePhoneLabel() 1044QString Addressee::homePhoneLabel()
993{ 1045{
994 return i18n("Home Phone"); 1046 return i18n("Home Phone");
995} 1047}
996 1048
997 1049
998QString Addressee::businessPhoneLabel() 1050QString Addressee::businessPhoneLabel()
999{ 1051{
1000 return i18n("Business Phone"); 1052 return i18n("Work Phone");
1001} 1053}
1002 1054
1003 1055
1004QString Addressee::mobilePhoneLabel() 1056QString Addressee::mobilePhoneLabel()
1005{ 1057{
1006 return i18n("Mobile Phone"); 1058 return i18n("Mobile Phone");
1007} 1059}
1008QString Addressee::mobileWorkPhoneLabel() 1060QString Addressee::mobileWorkPhoneLabel()
1009{ 1061{
1010 return i18n("Mobile (work)"); 1062 return i18n("Mobile2 (work)");
1011} 1063}
1012QString Addressee::mobileHomePhoneLabel() 1064QString Addressee::mobileHomePhoneLabel()
1013{ 1065{
1014 return i18n("Mobile (home)"); 1066 return i18n("Mobile");
1015} 1067}
1016 1068
1017 1069
1018QString Addressee::homeFaxLabel() 1070QString Addressee::homeFaxLabel()
1019{ 1071{
1020 return i18n("Home Fax"); 1072 return i18n("Fax (Home)");
1021} 1073}
1022 1074
1023 1075
1024QString Addressee::businessFaxLabel() 1076QString Addressee::businessFaxLabel()
1025{ 1077{
1026 return i18n("Business Fax"); 1078 return i18n("Fax (Work)");
1027} 1079}
1028 1080
1029 1081
1030QString Addressee::carPhoneLabel() 1082QString Addressee::carPhoneLabel()
1031{ 1083{
1032 return i18n("Car Phone"); 1084 return i18n("Mobile2 (work)");
1033} 1085}
1034 1086
1035 1087
1036QString Addressee::isdnLabel() 1088QString Addressee::isdnLabel()
1037{ 1089{
1038 return i18n("ISDN"); 1090 return i18n("ISDN");
1039} 1091}
1040 1092
1041 1093
1042QString Addressee::pagerLabel() 1094QString Addressee::pagerLabel()
1043{ 1095{
1044 return i18n("Pager"); 1096 return i18n("Pager");
1045} 1097}
1046 1098
1047QString Addressee::sipLabel() 1099QString Addressee::sipLabel()
1048{ 1100{
1049 return i18n("SIP"); 1101 return i18n("SIP");
1050} 1102}
1051 1103
1052QString Addressee::emailLabel() 1104QString Addressee::emailLabel()
1053{ 1105{
1054 return i18n("Email Address"); 1106 return i18n("Email Address");
1055} 1107}
1056 1108
1057 1109
1058void Addressee::setMailer( const QString &mailer ) 1110void Addressee::setMailer( const QString &mailer )
1059{ 1111{
1060 if ( mailer == mData->mailer ) return; 1112 if ( mailer == mData->mailer ) return;
1061 detach(); 1113 detach();
1062 mData->empty = false; 1114 mData->empty = false;
1063 mData->mailer = mailer; 1115 mData->mailer = mailer;
1064} 1116}
1065 1117
1066QString Addressee::mailer() const 1118QString Addressee::mailer() const
1067{ 1119{
1068 return mData->mailer; 1120 return mData->mailer;
1069} 1121}
1070 1122
1071QString Addressee::mailerLabel() 1123QString Addressee::mailerLabel()
1072{ 1124{
1073 return i18n("Mail Client"); 1125 return i18n("Mail Client");
1074} 1126}
1075 1127
1076 1128
1077void Addressee::setTimeZone( const TimeZone &timeZone ) 1129void Addressee::setTimeZone( const TimeZone &timeZone )
1078{ 1130{
1079 if ( timeZone == mData->timeZone ) return; 1131 if ( timeZone == mData->timeZone ) return;
1080 detach(); 1132 detach();
1081 mData->empty = false; 1133 mData->empty = false;
1082 mData->timeZone = timeZone; 1134 mData->timeZone = timeZone;
1083} 1135}
1084 1136
1085TimeZone Addressee::timeZone() const 1137TimeZone Addressee::timeZone() const
1086{ 1138{
1087 return mData->timeZone; 1139 return mData->timeZone;
1088} 1140}
1089 1141
1090QString Addressee::timeZoneLabel() 1142QString Addressee::timeZoneLabel()
1091{ 1143{
1092 return i18n("Time Zone"); 1144 return i18n("Time Zone");
1093} 1145}
1094 1146
1095 1147
1096void Addressee::setGeo( const Geo &geo ) 1148void Addressee::setGeo( const Geo &geo )
1097{ 1149{
1098 if ( geo == mData->geo ) return; 1150 if ( geo == mData->geo ) return;
1099 detach(); 1151 detach();
1100 mData->empty = false; 1152 mData->empty = false;
1101 mData->geo = geo; 1153 mData->geo = geo;
1102} 1154}
1103 1155
1104Geo Addressee::geo() const 1156Geo Addressee::geo() const
1105{ 1157{
1106 return mData->geo; 1158 return mData->geo;
1107} 1159}
1108 1160
1109QString Addressee::geoLabel() 1161QString Addressee::geoLabel()
1110{ 1162{
1111 return i18n("Geographic Position"); 1163 return i18n("Geographic Position");
1112} 1164}
1113 1165
1114 1166
1115void Addressee::setTitle( const QString &title ) 1167void Addressee::setTitle( const QString &title )
1116{ 1168{
1117 if ( title == mData->title ) return; 1169 if ( title == mData->title ) return;
1118 detach(); 1170 detach();
1119 mData->empty = false; 1171 mData->empty = false;
1120 mData->title = title; 1172 mData->title = title;
1121} 1173}
1122 1174
1123QString Addressee::title() const 1175QString Addressee::title() const
1124{ 1176{
1125 return mData->title; 1177 return mData->title;
1126} 1178}
1127 1179
1128QString Addressee::titleLabel() 1180QString Addressee::titleLabel()
1129{ 1181{
1130 return i18n("Title"); 1182 return i18n("Title");
1131} 1183}
1132 1184
1133 1185
1134void Addressee::setRole( const QString &role ) 1186void Addressee::setRole( const QString &role )
1135{ 1187{
1136 if ( role == mData->role ) return; 1188 if ( role == mData->role ) return;
1137 detach(); 1189 detach();
1138 mData->empty = false; 1190 mData->empty = false;
1139 mData->role = role; 1191 mData->role = role;
1140} 1192}
1141 1193
1142QString Addressee::role() const 1194QString Addressee::role() const
1143{ 1195{
1144 return mData->role; 1196 return mData->role;
1145} 1197}
1146 1198
1147QString Addressee::roleLabel() 1199QString Addressee::roleLabel()
1148{ 1200{
1149 return i18n("Role"); 1201 return i18n("Role");
1150} 1202}
1151 1203
1152 1204
1153void Addressee::setOrganization( const QString &organization ) 1205void Addressee::setOrganization( const QString &organization )
1154{ 1206{
1155 if ( organization == mData->organization ) return; 1207 if ( organization == mData->organization ) return;
1156 detach(); 1208 detach();
1157 mData->empty = false; 1209 mData->empty = false;
1158 mData->organization = organization; 1210 mData->organization = organization;
1159} 1211}
1160 1212
1161QString Addressee::organization() const 1213QString Addressee::organization() const
1162{ 1214{
1163 return mData->organization; 1215 return mData->organization;
1164} 1216}
1165 1217
1166QString Addressee::organizationLabel() 1218QString Addressee::organizationLabel()
1167{ 1219{
1168 return i18n("Organization"); 1220 return i18n("Organization");
1169} 1221}
1170 1222
1171 1223
1172void Addressee::setNote( const QString &note ) 1224void Addressee::setNote( const QString &note )
1173{ 1225{
1174 if ( note == mData->note ) return; 1226 if ( note == mData->note ) return;
1175 detach(); 1227 detach();
1176 mData->empty = false; 1228 mData->empty = false;
1177 mData->note = note; 1229 mData->note = note;
1178} 1230}
1179 1231
1180QString Addressee::note() const 1232QString Addressee::note() const
1181{ 1233{
1182 return mData->note; 1234 return mData->note;
1183} 1235}
1184 1236
1185QString Addressee::noteLabel() 1237QString Addressee::noteLabel()
1186{ 1238{
1187 return i18n("Note"); 1239 return i18n("Note");
1188} 1240}
1189 1241
1190 1242
1191void Addressee::setProductId( const QString &productId ) 1243void Addressee::setProductId( const QString &productId )
1192{ 1244{
1193 if ( productId == mData->productId ) return; 1245 if ( productId == mData->productId ) return;
1194 detach(); 1246 detach();
1195 mData->empty = false; 1247 mData->empty = false;
1196 mData->productId = productId; 1248 mData->productId = productId;
1197} 1249}
1198 1250
1199QString Addressee::productId() const 1251QString Addressee::productId() const
1200{ 1252{
1201 return mData->productId; 1253 return mData->productId;
1202} 1254}
1203 1255
1204QString Addressee::productIdLabel() 1256QString Addressee::productIdLabel()
1205{ 1257{
1206 return i18n("Product Identifier"); 1258 return i18n("Product Identifier");
1207} 1259}
1208 1260
1209 1261
1210void Addressee::setRevision( const QDateTime &revision ) 1262void Addressee::setRevision( const QDateTime &revision )
1211{ 1263{
1212 if ( revision == mData->revision ) return; 1264 if ( revision == mData->revision ) return;
1213 detach(); 1265 detach();
1214 mData->empty = false; 1266 mData->empty = false;
1215 mData->revision = QDateTime( revision.date(), 1267 mData->revision = QDateTime( revision.date(),
1216 QTime (revision.time().hour(), 1268 QTime (revision.time().hour(),
1217 revision.time().minute(), 1269 revision.time().minute(),
1218 revision.time().second())); 1270 revision.time().second()));
1219} 1271}
1220 1272
1221QDateTime Addressee::revision() const 1273QDateTime Addressee::revision() const
1222{ 1274{
1223 return mData->revision; 1275 return mData->revision;
1224} 1276}
1225 1277
1226QString Addressee::revisionLabel() 1278QString Addressee::revisionLabel()
1227{ 1279{
1228 return i18n("Revision Date"); 1280 return i18n("Revision Date");
1229} 1281}
1230 1282
1231 1283
1232void Addressee::setSortString( const QString &sortString ) 1284void Addressee::setSortString( const QString &sortString )
1233{ 1285{
1234 if ( sortString == mData->sortString ) return; 1286 if ( sortString == mData->sortString ) return;
1235 detach(); 1287 detach();
1236 mData->empty = false; 1288 mData->empty = false;
1237 mData->sortString = sortString; 1289 mData->sortString = sortString;
1238} 1290}
1239 1291
1240QString Addressee::sortString() const 1292QString Addressee::sortString() const
1241{ 1293{
1242 return mData->sortString; 1294 return mData->sortString;
1243} 1295}
1244 1296
1245QString Addressee::sortStringLabel() 1297QString Addressee::sortStringLabel()
1246{ 1298{
1247 return i18n("Sort String"); 1299 return i18n("Sort String");
1248} 1300}
1249 1301
1250 1302
1251void Addressee::setUrl( const KURL &url ) 1303void Addressee::setUrl( const KURL &url )
1252{ 1304{
1253 if ( url == mData->url ) return; 1305 if ( url == mData->url ) return;
1254 detach(); 1306 detach();
1255 mData->empty = false; 1307 mData->empty = false;
1256 mData->url = url; 1308 mData->url = url;
1257} 1309}
1258 1310
1259KURL Addressee::url() const 1311KURL Addressee::url() const
1260{ 1312{
1261 return mData->url; 1313 return mData->url;
1262} 1314}
1263 1315
1264QString Addressee::urlLabel() 1316QString Addressee::urlLabel()
1265{ 1317{
1266 return i18n("URL"); 1318 return i18n("URL");
1267} 1319}
1268 1320
1269 1321
1270void Addressee::setSecrecy( const Secrecy &secrecy ) 1322void Addressee::setSecrecy( const Secrecy &secrecy )
1271{ 1323{
1272 if ( secrecy == mData->secrecy ) return; 1324 if ( secrecy == mData->secrecy ) return;
1273 detach(); 1325 detach();
1274 mData->empty = false; 1326 mData->empty = false;
1275 mData->secrecy = secrecy; 1327 mData->secrecy = secrecy;
1276} 1328}
1277 1329
1278Secrecy Addressee::secrecy() const 1330Secrecy Addressee::secrecy() const
1279{ 1331{
1280 return mData->secrecy; 1332 return mData->secrecy;
1281} 1333}
1282 1334
1283QString Addressee::secrecyLabel() 1335QString Addressee::secrecyLabel()
1284{ 1336{
1285 return i18n("Security Class"); 1337 return i18n("Security Class");
1286} 1338}
1287 1339
1288 1340
1289void Addressee::setLogo( const Picture &logo ) 1341void Addressee::setLogo( const Picture &logo )
1290{ 1342{
1291 if ( logo == mData->logo ) return; 1343 if ( logo == mData->logo ) return;
1292 detach(); 1344 detach();
1293 mData->empty = false; 1345 mData->empty = false;
1294 mData->logo = logo; 1346 mData->logo = logo;
1295} 1347}
1296 1348
1297Picture Addressee::logo() const 1349Picture Addressee::logo() const
1298{ 1350{
1299 return mData->logo; 1351 return mData->logo;
1300} 1352}
1301 1353
1302QString Addressee::logoLabel() 1354QString Addressee::logoLabel()
1303{ 1355{
1304 return i18n("Logo"); 1356 return i18n("Logo");
1305} 1357}
1306 1358
1307 1359
1308void Addressee::setPhoto( const Picture &photo ) 1360void Addressee::setPhoto( const Picture &photo )
1309{ 1361{
1310 if ( photo == mData->photo ) return; 1362 if ( photo == mData->photo ) return;
1311 detach(); 1363 detach();
1312 mData->empty = false; 1364 mData->empty = false;
1313 mData->photo = photo; 1365 mData->photo = photo;
1314} 1366}
1315 1367
1316Picture Addressee::photo() const 1368Picture Addressee::photo() const
1317{ 1369{
1318 return mData->photo; 1370 return mData->photo;
1319} 1371}
1320 1372
1321QString Addressee::photoLabel() 1373QString Addressee::photoLabel()
1322{ 1374{
1323 return i18n("Photo"); 1375 return i18n("Photo");
1324} 1376}
1325 1377
1326 1378
1327void Addressee::setSound( const Sound &sound ) 1379void Addressee::setSound( const Sound &sound )
1328{ 1380{
1329 if ( sound == mData->sound ) return; 1381 if ( sound == mData->sound ) return;
1330 detach(); 1382 detach();
1331 mData->empty = false; 1383 mData->empty = false;
1332 mData->sound = sound; 1384 mData->sound = sound;
1333} 1385}
1334 1386
1335Sound Addressee::sound() const 1387Sound Addressee::sound() const
1336{ 1388{
1337 return mData->sound; 1389 return mData->sound;
1338} 1390}
1339 1391
1340QString Addressee::soundLabel() 1392QString Addressee::soundLabel()
1341{ 1393{
1342 return i18n("Sound"); 1394 return i18n("Sound");
1343} 1395}
1344 1396
1345 1397
1346void Addressee::setAgent( const Agent &agent ) 1398void Addressee::setAgent( const Agent &agent )
1347{ 1399{
1348 if ( agent == mData->agent ) return; 1400 if ( agent == mData->agent ) return;
1349 detach(); 1401 detach();
1350 mData->empty = false; 1402 mData->empty = false;
1351 mData->agent = agent; 1403 mData->agent = agent;
1352} 1404}
1353 1405
1354Agent Addressee::agent() const 1406Agent Addressee::agent() const
1355{ 1407{
1356 return mData->agent; 1408 return mData->agent;
1357} 1409}
1358 1410
1359QString Addressee::agentLabel() 1411QString Addressee::agentLabel()
1360{ 1412{
1361 return i18n("Agent"); 1413 return i18n("Agent");
1362} 1414}
1363 1415
1364 1416
1365 1417
1366void Addressee::setNameFromString( const QString &str ) 1418void Addressee::setNameFromString( const QString &str )
1367{ 1419{
1368 setFormattedName( str ); 1420 setFormattedName( str );
1369 setName( str ); 1421 setName( str );
1370 1422
1371 static bool first = true; 1423 static bool first = true;
1372 static QStringList titles; 1424 static QStringList titles;
1373 static QStringList suffixes; 1425 static QStringList suffixes;
1374 static QStringList prefixes; 1426 static QStringList prefixes;
1375 1427
1376 if ( first ) { 1428 if ( first ) {
1377 first = false; 1429 first = false;
1378 titles += i18n( "Dr." ); 1430 titles += i18n( "Dr." );
1379 titles += i18n( "Miss" ); 1431 titles += i18n( "Miss" );
1380 titles += i18n( "Mr." ); 1432 titles += i18n( "Mr." );
1381 titles += i18n( "Mrs." ); 1433 titles += i18n( "Mrs." );
1382 titles += i18n( "Ms." ); 1434 titles += i18n( "Ms." );
1383 titles += i18n( "Prof." ); 1435 titles += i18n( "Prof." );
1384 1436
1385 suffixes += i18n( "I" ); 1437 suffixes += i18n( "I" );
1386 suffixes += i18n( "II" ); 1438 suffixes += i18n( "II" );
1387 suffixes += i18n( "III" ); 1439 suffixes += i18n( "III" );
1388 suffixes += i18n( "Jr." ); 1440 suffixes += i18n( "Jr." );
1389 suffixes += i18n( "Sr." ); 1441 suffixes += i18n( "Sr." );
1390 1442
1391 prefixes += "van"; 1443 prefixes += "van";
1392 prefixes += "von"; 1444 prefixes += "von";
1393 prefixes += "de"; 1445 prefixes += "de";
1394 1446
1395 KConfig config( locateLocal( "config", "kabcrc") ); 1447 KConfig config( locateLocal( "config", "kabcrc") );
1396 config.setGroup( "General" ); 1448 config.setGroup( "General" );
1397 titles += config.readListEntry( "Prefixes" ); 1449 titles += config.readListEntry( "Prefixes" );
1398 titles.remove( "" ); 1450 titles.remove( "" );
1399 prefixes += config.readListEntry( "Inclusions" ); 1451 prefixes += config.readListEntry( "Inclusions" );
1400 prefixes.remove( "" ); 1452 prefixes.remove( "" );
1401 suffixes += config.readListEntry( "Suffixes" ); 1453 suffixes += config.readListEntry( "Suffixes" );
1402 suffixes.remove( "" ); 1454 suffixes.remove( "" );
1403 } 1455 }
1404 1456
1405 // clear all name parts 1457 // clear all name parts
1406 setPrefix( "" ); 1458 setPrefix( "" );
1407 setGivenName( "" ); 1459 setGivenName( "" );
1408 setAdditionalName( "" ); 1460 setAdditionalName( "" );
1409 setFamilyName( "" ); 1461 setFamilyName( "" );
1410 setSuffix( "" ); 1462 setSuffix( "" );
1411 1463
1412 if ( str.isEmpty() ) 1464 if ( str.isEmpty() )
1413 return; 1465 return;
1414 1466
1415 int i = str.find(','); 1467 int i = str.find(',');
1416 if( i < 0 ) { 1468 if( i < 0 ) {
1417 QStringList parts = QStringList::split( " ", str ); 1469 QStringList parts = QStringList::split( " ", str );
1418 int leftOffset = 0; 1470 int leftOffset = 0;
1419 int rightOffset = parts.count() - 1; 1471 int rightOffset = parts.count() - 1;
1420 1472
1421 QString suffix; 1473 QString suffix;
1422 while ( rightOffset >= 0 ) { 1474 while ( rightOffset >= 0 ) {
1423 if ( suffixes.contains( parts[ rightOffset ] ) ) { 1475 if ( suffixes.contains( parts[ rightOffset ] ) ) {
1424 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " ")); 1476 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " "));
1425 rightOffset--; 1477 rightOffset--;
1426 } else 1478 } else
1427 break; 1479 break;
1428 } 1480 }
1429 setSuffix( suffix ); 1481 setSuffix( suffix );
1430 1482
1431 if ( rightOffset < 0 ) 1483 if ( rightOffset < 0 )
1432 return; 1484 return;
1433 1485
1434 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) { 1486 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) {
1435 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] ); 1487 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] );
1436 rightOffset--; 1488 rightOffset--;
1437 } else 1489 } else
1438 setFamilyName( parts[ rightOffset ] ); 1490 setFamilyName( parts[ rightOffset ] );
1439 1491
1440 QString prefix; 1492 QString prefix;
1441 while ( leftOffset < rightOffset ) { 1493 while ( leftOffset < rightOffset ) {
1442 if ( titles.contains( parts[ leftOffset ] ) ) { 1494 if ( titles.contains( parts[ leftOffset ] ) ) {
1443 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1495 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1444 leftOffset++; 1496 leftOffset++;
1445 } else 1497 } else
1446 break; 1498 break;
1447 } 1499 }
1448 setPrefix( prefix ); 1500 setPrefix( prefix );
1449 1501
1450 if ( leftOffset < rightOffset ) { 1502 if ( leftOffset < rightOffset ) {
1451 setGivenName( parts[ leftOffset ] ); 1503 setGivenName( parts[ leftOffset ] );
1452 leftOffset++; 1504 leftOffset++;
1453 } 1505 }
1454 1506
1455 QString additionalName; 1507 QString additionalName;
1456 while ( leftOffset < rightOffset ) { 1508 while ( leftOffset < rightOffset ) {
1457 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1509 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1458 leftOffset++; 1510 leftOffset++;
1459 } 1511 }
1460 setAdditionalName( additionalName ); 1512 setAdditionalName( additionalName );
1461 } else { 1513 } else {
1462 QString part1 = str.left( i ); 1514 QString part1 = str.left( i );
1463 QString part2 = str.mid( i + 1 ); 1515 QString part2 = str.mid( i + 1 );
1464 1516
1465 QStringList parts = QStringList::split( " ", part1 ); 1517 QStringList parts = QStringList::split( " ", part1 );
1466 int leftOffset = 0; 1518 int leftOffset = 0;
1467 int rightOffset = parts.count() - 1; 1519 int rightOffset = parts.count() - 1;
1468 1520
1469 QString suffix; 1521 QString suffix;
1470 while ( rightOffset >= 0 ) { 1522 while ( rightOffset >= 0 ) {
1471 if ( suffixes.contains( parts[ rightOffset ] ) ) { 1523 if ( suffixes.contains( parts[ rightOffset ] ) ) {
1472 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " ")); 1524 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " "));
1473 rightOffset--; 1525 rightOffset--;
1474 } else 1526 } else
1475 break; 1527 break;
1476 } 1528 }
1477 setSuffix( suffix ); 1529 setSuffix( suffix );
1478 1530
1479 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) { 1531 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) {
1480 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] ); 1532 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] );
1481 rightOffset--; 1533 rightOffset--;
1482 } else 1534 } else
1483 setFamilyName( parts[ rightOffset ] ); 1535 setFamilyName( parts[ rightOffset ] );
1484 1536
1485 QString prefix; 1537 QString prefix;
1486 while ( leftOffset < rightOffset ) { 1538 while ( leftOffset < rightOffset ) {
1487 if ( titles.contains( parts[ leftOffset ] ) ) { 1539 if ( titles.contains( parts[ leftOffset ] ) ) {
1488 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1540 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1489 leftOffset++; 1541 leftOffset++;
1490 } else 1542 } else
1491 break; 1543 break;
1492 } 1544 }
1493 1545
1494 parts = QStringList::split( " ", part2 ); 1546 parts = QStringList::split( " ", part2 );
1495 1547
1496 leftOffset = 0; 1548 leftOffset = 0;
1497 rightOffset = parts.count(); 1549 rightOffset = parts.count();
1498 1550
1499 while ( leftOffset < rightOffset ) { 1551 while ( leftOffset < rightOffset ) {
1500 if ( titles.contains( parts[ leftOffset ] ) ) { 1552 if ( titles.contains( parts[ leftOffset ] ) ) {
1501 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1553 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1502 leftOffset++; 1554 leftOffset++;
1503 } else 1555 } else
1504 break; 1556 break;
1505 } 1557 }
1506 setPrefix( prefix ); 1558 setPrefix( prefix );
1507 1559
1508 if ( leftOffset < rightOffset ) { 1560 if ( leftOffset < rightOffset ) {
1509 setGivenName( parts[ leftOffset ] ); 1561 setGivenName( parts[ leftOffset ] );
1510 leftOffset++; 1562 leftOffset++;
1511 } 1563 }
1512 1564
1513 QString additionalName; 1565 QString additionalName;
1514 while ( leftOffset < rightOffset ) { 1566 while ( leftOffset < rightOffset ) {
1515 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1567 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1516 leftOffset++; 1568 leftOffset++;
1517 } 1569 }
1518 setAdditionalName( additionalName ); 1570 setAdditionalName( additionalName );
1519 } 1571 }
1520} 1572}
1521 1573
1522QString Addressee::realName() const 1574QString Addressee::realName() const
1523{ 1575{
1524 if ( !formattedName().isEmpty() ) 1576 if ( !formattedName().isEmpty() )
1525 return formattedName(); 1577 return formattedName();
1526 1578
1527 QString n = assembledName(); 1579 QString n = assembledName();
1528 1580
1529 if ( n.isEmpty() ) 1581 if ( n.isEmpty() )
1530 n = name(); 1582 n = name();
1531 if ( n.isEmpty() ) 1583 if ( n.isEmpty() )
1532 n = organization(); 1584 n = organization();
1533 return n; 1585 return n;
1534} 1586}
1535 1587
1536QString Addressee::assembledName() const 1588QString Addressee::assembledName() const
1537{ 1589{
1538 QString name = prefix() + " " + givenName() + " " + additionalName() + " " + 1590 QString name = prefix() + " " + givenName() + " " + additionalName() + " " +
1539 familyName() + " " + suffix(); 1591 familyName() + " " + suffix();
1540 1592
1541 return name.simplifyWhiteSpace(); 1593 return name.simplifyWhiteSpace();
1542} 1594}
1543 1595
1544QString Addressee::fullEmail( const QString &email ) const 1596QString Addressee::fullEmail( const QString &email ) const
1545{ 1597{
1546 QString e; 1598 QString e;
1547 if ( email.isNull() ) { 1599 if ( email.isNull() ) {
1548 e = preferredEmail(); 1600 e = preferredEmail();
1549 } else { 1601 } else {
1550 e = email; 1602 e = email;
1551 } 1603 }
1552 if ( e.isEmpty() ) return QString::null; 1604 if ( e.isEmpty() ) return QString::null;
1553 1605
1554 QString text; 1606 QString text;
1555 if ( realName().isEmpty() ) 1607 if ( realName().isEmpty() )
1556 text = e; 1608 text = e;
1557 else 1609 else
1558 text = assembledName() + " <" + e + ">"; 1610 text = assembledName() + " <" + e + ">";
1559 1611
1560 return text; 1612 return text;
1561} 1613}
1562 1614
1563void Addressee::insertEmail( const QString &email, bool preferred ) 1615void Addressee::insertEmail( const QString &email, bool preferred )
1564{ 1616{
1565 detach(); 1617 detach();
1566 1618
1567 QStringList::Iterator it = mData->emails.find( email ); 1619 QStringList::Iterator it = mData->emails.find( email );
1568 1620
1569 if ( it != mData->emails.end() ) { 1621 if ( it != mData->emails.end() ) {
1570 if ( !preferred || it == mData->emails.begin() ) return; 1622 if ( !preferred || it == mData->emails.begin() ) return;
1571 mData->emails.remove( it ); 1623 mData->emails.remove( it );
1572 mData->emails.prepend( email ); 1624 mData->emails.prepend( email );
1573 } else { 1625 } else {
1574 if ( preferred ) { 1626 if ( preferred ) {
1575 mData->emails.prepend( email ); 1627 mData->emails.prepend( email );
1576 } else { 1628 } else {
1577 mData->emails.append( email ); 1629 mData->emails.append( email );
1578 } 1630 }
1579 } 1631 }
1580} 1632}
1581 1633
1582void Addressee::removeEmail( const QString &email ) 1634void Addressee::removeEmail( const QString &email )
1583{ 1635{
1584 detach(); 1636 detach();
1585 1637
1586 QStringList::Iterator it = mData->emails.find( email ); 1638 QStringList::Iterator it = mData->emails.find( email );
1587 if ( it == mData->emails.end() ) return; 1639 if ( it == mData->emails.end() ) return;
1588 1640
1589 mData->emails.remove( it ); 1641 mData->emails.remove( it );
1590} 1642}
1591 1643
1592QString Addressee::preferredEmail() const 1644QString Addressee::preferredEmail() const
1593{ 1645{
1594 if ( mData->emails.count() == 0 ) return QString::null; 1646 if ( mData->emails.count() == 0 ) return QString::null;
1595 else return mData->emails.first(); 1647 else return mData->emails.first();
1596} 1648}
1597 1649
1598QStringList Addressee::emails() const 1650QStringList Addressee::emails() const
1599{ 1651{
1600 return mData->emails; 1652 return mData->emails;
1601} 1653}
1602void Addressee::setEmails( const QStringList& emails ) { 1654void Addressee::setEmails( const QStringList& emails ) {
1603 detach(); 1655 detach();
1604 mData->emails = emails; 1656 mData->emails = emails;
1605} 1657}
1606void Addressee::insertPhoneNumber( const PhoneNumber &phoneNumber ) 1658void Addressee::insertPhoneNumber( const PhoneNumber &phoneNumber )
1607{ 1659{
1608 detach(); 1660 detach();
1609 mData->empty = false; 1661 mData->empty = false;
1610 1662
1611 PhoneNumber::List::Iterator it; 1663 PhoneNumber::List::Iterator it;
1612 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1664 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1613 if ( (*it).id() == phoneNumber.id() ) { 1665 if ( (*it).id() == phoneNumber.id() ) {
1614 *it = phoneNumber; 1666 *it = phoneNumber;
1615 return; 1667 return;
1616 } 1668 }
1617 } 1669 }
1618 mData->phoneNumbers.append( phoneNumber ); 1670 mData->phoneNumbers.append( phoneNumber );
1619} 1671}
1620 1672
1621void Addressee::removePhoneNumber( const PhoneNumber &phoneNumber ) 1673void Addressee::removePhoneNumber( const PhoneNumber &phoneNumber )
1622{ 1674{
1623 detach(); 1675 detach();
1624 1676
1625 PhoneNumber::List::Iterator it; 1677 PhoneNumber::List::Iterator it;
1626 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1678 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1627 if ( (*it).id() == phoneNumber.id() ) { 1679 if ( (*it).id() == phoneNumber.id() ) {
1628 mData->phoneNumbers.remove( it ); 1680 mData->phoneNumbers.remove( it );
1629 return; 1681 return;
1630 } 1682 }
1631 } 1683 }
1632} 1684}
1633 1685
1634PhoneNumber Addressee::phoneNumber( int type ) const 1686PhoneNumber Addressee::phoneNumber( int type ) const
1635{ 1687{
1636 PhoneNumber phoneNumber( "", type ); 1688 PhoneNumber phoneNumber( "", type );
1637 PhoneNumber::List::ConstIterator it; 1689 PhoneNumber::List::ConstIterator it;
1638 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1690 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1639 if ( matchBinaryPatternP( (*it).type(), type ) ) { 1691 if ( matchBinaryPatternP( (*it).type(), type ) ) {
1640 if ( (*it).type() & PhoneNumber::Pref ) 1692 if ( (*it).type() & PhoneNumber::Pref )
1641 return (*it); 1693 return (*it);
1642 else if ( phoneNumber.number().isEmpty() ) 1694 else if ( phoneNumber.number().isEmpty() )
1643 phoneNumber = (*it); 1695 phoneNumber = (*it);
1644 } 1696 }
1645 } 1697 }
1646 1698
1647 return phoneNumber; 1699 return phoneNumber;
1648} 1700}
1649 1701
1650PhoneNumber::List Addressee::phoneNumbers() const 1702PhoneNumber::List Addressee::phoneNumbers() const
1651{ 1703{
1652 return mData->phoneNumbers; 1704 return mData->phoneNumbers;
1653} 1705}
1654 1706
1707int Addressee::hasPhoneNumberType( int type )
1708{
1709 int retval = 0;
1710 PhoneNumber::List::ConstIterator it;
1711 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1712 if ( (*it).type() == type )
1713 ++retval;
1714 }
1715 return retval;
1716}
1655PhoneNumber::List Addressee::phoneNumbers( int type ) const 1717PhoneNumber::List Addressee::phoneNumbers( int type ) const
1656{ 1718{
1657 PhoneNumber::List list; 1719 PhoneNumber::List list;
1658 1720
1659 PhoneNumber::List::ConstIterator it; 1721 PhoneNumber::List::ConstIterator it;
1660 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1722 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1661 if ( matchBinaryPattern( (*it).type(), type ) ) { 1723 if ( matchBinaryPattern( (*it).type(), type ) ) {
1662 list.append( *it ); 1724 list.append( *it );
1663 } 1725 }
1664 } 1726 }
1665 return list; 1727 return list;
1666} 1728}
1667 1729
1668PhoneNumber Addressee::findPhoneNumber( const QString &id ) const 1730PhoneNumber Addressee::findPhoneNumber( const QString &id ) const
1669{ 1731{
1670 PhoneNumber::List::ConstIterator it; 1732 PhoneNumber::List::ConstIterator it;
1671 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1733 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1672 if ( (*it).id() == id ) { 1734 if ( (*it).id() == id ) {
1673 return *it; 1735 return *it;
1674 } 1736 }
1675 } 1737 }
1676 return PhoneNumber(); 1738 return PhoneNumber();
1677} 1739}
1678 1740
1679void Addressee::insertKey( const Key &key ) 1741void Addressee::insertKey( const Key &key )
1680{ 1742{
1681 detach(); 1743 detach();
1682 mData->empty = false; 1744 mData->empty = false;
1683 1745
1684 Key::List::Iterator it; 1746 Key::List::Iterator it;
1685 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1747 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1686 if ( (*it).id() == key.id() ) { 1748 if ( (*it).id() == key.id() ) {
1687 *it = key; 1749 *it = key;
1688 return; 1750 return;
1689 } 1751 }
1690 } 1752 }
1691 mData->keys.append( key ); 1753 mData->keys.append( key );
1692} 1754}
1693 1755
1694void Addressee::removeKey( const Key &key ) 1756void Addressee::removeKey( const Key &key )
1695{ 1757{
1696 detach(); 1758 detach();
1697 1759
1698 Key::List::Iterator it; 1760 Key::List::Iterator it;
1699 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1761 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1700 if ( (*it).id() == key.id() ) { 1762 if ( (*it).id() == key.id() ) {
1701 mData->keys.remove( key ); 1763 mData->keys.remove( key );
1702 return; 1764 return;
1703 } 1765 }
1704 } 1766 }
1705} 1767}
1706 1768
1707Key Addressee::key( int type, QString customTypeString ) const 1769Key Addressee::key( int type, QString customTypeString ) const
1708{ 1770{
1709 Key::List::ConstIterator it; 1771 Key::List::ConstIterator it;
1710 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1772 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1711 if ( (*it).type() == type ) { 1773 if ( (*it).type() == type ) {
1712 if ( type == Key::Custom ) { 1774 if ( type == Key::Custom ) {
1713 if ( customTypeString.isEmpty() ) { 1775 if ( customTypeString.isEmpty() ) {
1714 return *it; 1776 return *it;
1715 } else { 1777 } else {
1716 if ( (*it).customTypeString() == customTypeString ) 1778 if ( (*it).customTypeString() == customTypeString )
1717 return (*it); 1779 return (*it);
1718 } 1780 }
1719 } else { 1781 } else {
1720 return *it; 1782 return *it;
1721 } 1783 }
1722 } 1784 }
1723 } 1785 }
1724 return Key( QString(), type ); 1786 return Key( QString(), type );
1725} 1787}
1726void Addressee::setKeys( const Key::List& list ) { 1788void Addressee::setKeys( const Key::List& list ) {
1727 detach(); 1789 detach();
1728 mData->keys = list; 1790 mData->keys = list;
1729} 1791}
1730 1792
1731Key::List Addressee::keys() const 1793Key::List Addressee::keys() const
1732{ 1794{
1733 return mData->keys; 1795 return mData->keys;
1734} 1796}
1735 1797
1736Key::List Addressee::keys( int type, QString customTypeString ) const 1798Key::List Addressee::keys( int type, QString customTypeString ) const
1737{ 1799{
1738 Key::List list; 1800 Key::List list;
1739 1801
1740 Key::List::ConstIterator it; 1802 Key::List::ConstIterator it;
1741 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1803 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1742 if ( (*it).type() == type ) { 1804 if ( (*it).type() == type ) {
1743 if ( type == Key::Custom ) { 1805 if ( type == Key::Custom ) {
1744 if ( customTypeString.isEmpty() ) { 1806 if ( customTypeString.isEmpty() ) {
1745 list.append(*it); 1807 list.append(*it);
1746 } else { 1808 } else {
1747 if ( (*it).customTypeString() == customTypeString ) 1809 if ( (*it).customTypeString() == customTypeString )
1748 list.append(*it); 1810 list.append(*it);
1749 } 1811 }
1750 } else { 1812 } else {
1751 list.append(*it); 1813 list.append(*it);
1752 } 1814 }
1753 } 1815 }
1754 } 1816 }
1755 return list; 1817 return list;
1756} 1818}
1757 1819
1758Key Addressee::findKey( const QString &id ) const 1820Key Addressee::findKey( const QString &id ) const
1759{ 1821{
1760 Key::List::ConstIterator it; 1822 Key::List::ConstIterator it;
1761 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1823 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1762 if ( (*it).id() == id ) { 1824 if ( (*it).id() == id ) {
1763 return *it; 1825 return *it;
1764 } 1826 }
1765 } 1827 }
1766 return Key(); 1828 return Key();
1767} 1829}
1768 1830
1769QString Addressee::asString() const 1831QString Addressee::asString() const
1770{ 1832{
1771 return "Smith, agent Smith..."; 1833 return "Smith, agent Smith...";
1772} 1834}
1773 1835
1774void Addressee::dump() const 1836void Addressee::dump() const
1775{ 1837{
1776 return; 1838 return;
1777#if 0 1839#if 0
1778 kdDebug(5700) << "Addressee {" << endl; 1840 kdDebug(5700) << "Addressee {" << endl;
1779 1841
1780 kdDebug(5700) << " Uid: '" << uid() << "'" << endl; 1842 kdDebug(5700) << " Uid: '" << uid() << "'" << endl;
1781 1843
1782 kdDebug(5700) << " Name: '" << name() << "'" << endl; 1844 kdDebug(5700) << " Name: '" << name() << "'" << endl;
1783 kdDebug(5700) << " FormattedName: '" << formattedName() << "'" << endl; 1845 kdDebug(5700) << " FormattedName: '" << formattedName() << "'" << endl;
1784 kdDebug(5700) << " FamilyName: '" << familyName() << "'" << endl; 1846 kdDebug(5700) << " FamilyName: '" << familyName() << "'" << endl;
1785 kdDebug(5700) << " GivenName: '" << givenName() << "'" << endl; 1847 kdDebug(5700) << " GivenName: '" << givenName() << "'" << endl;
1786 kdDebug(5700) << " AdditionalName: '" << additionalName() << "'" << endl; 1848 kdDebug(5700) << " AdditionalName: '" << additionalName() << "'" << endl;
1787 kdDebug(5700) << " Prefix: '" << prefix() << "'" << endl; 1849 kdDebug(5700) << " Prefix: '" << prefix() << "'" << endl;
1788 kdDebug(5700) << " Suffix: '" << suffix() << "'" << endl; 1850 kdDebug(5700) << " Suffix: '" << suffix() << "'" << endl;
1789 kdDebug(5700) << " NickName: '" << nickName() << "'" << endl; 1851 kdDebug(5700) << " NickName: '" << nickName() << "'" << endl;
1790 kdDebug(5700) << " Birthday: '" << birthday().toString() << "'" << endl; 1852 kdDebug(5700) << " Birthday: '" << birthday().toString() << "'" << endl;
1791 kdDebug(5700) << " Mailer: '" << mailer() << "'" << endl; 1853 kdDebug(5700) << " Mailer: '" << mailer() << "'" << endl;
1792 kdDebug(5700) << " TimeZone: '" << timeZone().asString() << "'" << endl; 1854 kdDebug(5700) << " TimeZone: '" << timeZone().asString() << "'" << endl;
1793 kdDebug(5700) << " Geo: '" << geo().asString() << "'" << endl; 1855 kdDebug(5700) << " Geo: '" << geo().asString() << "'" << endl;
1794 kdDebug(5700) << " Title: '" << title() << "'" << endl; 1856 kdDebug(5700) << " Title: '" << title() << "'" << endl;
1795 kdDebug(5700) << " Role: '" << role() << "'" << endl; 1857 kdDebug(5700) << " Role: '" << role() << "'" << endl;
1796 kdDebug(5700) << " Organization: '" << organization() << "'" << endl; 1858 kdDebug(5700) << " Organization: '" << organization() << "'" << endl;
1797 kdDebug(5700) << " Note: '" << note() << "'" << endl; 1859 kdDebug(5700) << " Note: '" << note() << "'" << endl;
1798 kdDebug(5700) << " ProductId: '" << productId() << "'" << endl; 1860 kdDebug(5700) << " ProductId: '" << productId() << "'" << endl;
1799 kdDebug(5700) << " Revision: '" << revision().toString() << "'" << endl; 1861 kdDebug(5700) << " Revision: '" << revision().toString() << "'" << endl;
1800 kdDebug(5700) << " SortString: '" << sortString() << "'" << endl; 1862 kdDebug(5700) << " SortString: '" << sortString() << "'" << endl;
1801 kdDebug(5700) << " Url: '" << url().url() << "'" << endl; 1863 kdDebug(5700) << " Url: '" << url().url() << "'" << endl;
1802 kdDebug(5700) << " Secrecy: '" << secrecy().asString() << "'" << endl; 1864 kdDebug(5700) << " Secrecy: '" << secrecy().asString() << "'" << endl;
1803 kdDebug(5700) << " Logo: '" << logo().asString() << "'" << endl; 1865 kdDebug(5700) << " Logo: '" << logo().asString() << "'" << endl;
1804 kdDebug(5700) << " Photo: '" << photo().asString() << "'" << endl; 1866 kdDebug(5700) << " Photo: '" << photo().asString() << "'" << endl;
1805 kdDebug(5700) << " Sound: '" << sound().asString() << "'" << endl; 1867 kdDebug(5700) << " Sound: '" << sound().asString() << "'" << endl;
1806 kdDebug(5700) << " Agent: '" << agent().asString() << "'" << endl; 1868 kdDebug(5700) << " Agent: '" << agent().asString() << "'" << endl;
1807 1869
1808 kdDebug(5700) << " Emails {" << endl; 1870 kdDebug(5700) << " Emails {" << endl;
1809 QStringList e = emails(); 1871 QStringList e = emails();
1810 QStringList::ConstIterator it; 1872 QStringList::ConstIterator it;
1811 for( it = e.begin(); it != e.end(); ++it ) { 1873 for( it = e.begin(); it != e.end(); ++it ) {
1812 kdDebug(5700) << " " << (*it) << endl; 1874 kdDebug(5700) << " " << (*it) << endl;
1813 } 1875 }
1814 kdDebug(5700) << " }" << endl; 1876 kdDebug(5700) << " }" << endl;
1815 1877
1816 kdDebug(5700) << " PhoneNumbers {" << endl; 1878 kdDebug(5700) << " PhoneNumbers {" << endl;
1817 PhoneNumber::List p = phoneNumbers(); 1879 PhoneNumber::List p = phoneNumbers();
1818 PhoneNumber::List::ConstIterator it2; 1880 PhoneNumber::List::ConstIterator it2;
1819 for( it2 = p.begin(); it2 != p.end(); ++it2 ) { 1881 for( it2 = p.begin(); it2 != p.end(); ++it2 ) {
1820 kdDebug(5700) << " Type: " << int((*it2).type()) << " Number: " << (*it2).number() << endl; 1882 kdDebug(5700) << " Type: " << int((*it2).type()) << " Number: " << (*it2).number() << endl;
1821 } 1883 }
1822 kdDebug(5700) << " }" << endl; 1884 kdDebug(5700) << " }" << endl;
1823 1885
1824 Address::List a = addresses(); 1886 Address::List a = addresses();
1825 Address::List::ConstIterator it3; 1887 Address::List::ConstIterator it3;
1826 for( it3 = a.begin(); it3 != a.end(); ++it3 ) { 1888 for( it3 = a.begin(); it3 != a.end(); ++it3 ) {
1827 (*it3).dump(); 1889 (*it3).dump();
1828 } 1890 }
1829 1891
1830 kdDebug(5700) << " Keys {" << endl; 1892 kdDebug(5700) << " Keys {" << endl;
1831 Key::List k = keys(); 1893 Key::List k = keys();
1832 Key::List::ConstIterator it4; 1894 Key::List::ConstIterator it4;
1833 for( it4 = k.begin(); it4 != k.end(); ++it4 ) { 1895 for( it4 = k.begin(); it4 != k.end(); ++it4 ) {
1834 kdDebug(5700) << " Type: " << int((*it4).type()) << 1896 kdDebug(5700) << " Type: " << int((*it4).type()) <<
1835 " Key: " << (*it4).textData() << 1897 " Key: " << (*it4).textData() <<
1836 " CustomString: " << (*it4).customTypeString() << endl; 1898 " CustomString: " << (*it4).customTypeString() << endl;
1837 } 1899 }
1838 kdDebug(5700) << " }" << endl; 1900 kdDebug(5700) << " }" << endl;
1839 1901
1840 kdDebug(5700) << "}" << endl; 1902 kdDebug(5700) << "}" << endl;
1841#endif 1903#endif
1842} 1904}
1843 1905
1844 1906
1845void Addressee::insertAddress( const Address &address ) 1907void Addressee::insertAddress( const Address &address )
1846{ 1908{
1847 detach(); 1909 detach();
1848 mData->empty = false; 1910 mData->empty = false;
1849 1911
1850 Address::List::Iterator it; 1912 Address::List::Iterator it;
1851 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1913 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1852 if ( (*it).id() == address.id() ) { 1914 if ( (*it).id() == address.id() ) {
1853 *it = address; 1915 *it = address;
1854 return; 1916 return;
1855 } 1917 }
1856 } 1918 }
1857 mData->addresses.append( address ); 1919 mData->addresses.append( address );
1858} 1920}
1859 1921
1860void Addressee::removeAddress( const Address &address ) 1922void Addressee::removeAddress( const Address &address )
1861{ 1923{
1862 detach(); 1924 detach();
1863 1925
1864 Address::List::Iterator it; 1926 Address::List::Iterator it;
1865 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1927 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1866 if ( (*it).id() == address.id() ) { 1928 if ( (*it).id() == address.id() ) {
1867 mData->addresses.remove( it ); 1929 mData->addresses.remove( it );
1868 return; 1930 return;
1869 } 1931 }
1870 } 1932 }
1871} 1933}
1872 1934
1873Address Addressee::address( int type ) const 1935Address Addressee::address( int type ) const
1874{ 1936{
1875 Address address( type ); 1937 Address address( type );
1876 Address::List::ConstIterator it; 1938 Address::List::ConstIterator it;
1877 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1939 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1878 if ( matchBinaryPatternA( (*it).type(), type ) ) { 1940 if ( matchBinaryPatternA( (*it).type(), type ) ) {
1879 if ( (*it).type() & Address::Pref ) 1941 if ( (*it).type() & Address::Pref )
1880 return (*it); 1942 return (*it);
1881 else if ( address.isEmpty() ) 1943 else if ( address.isEmpty() )
1882 address = (*it); 1944 address = (*it);
1883 } 1945 }
1884 } 1946 }
1885 1947
1886 return address; 1948 return address;
1887} 1949}
1888 1950
1889Address::List Addressee::addresses() const 1951Address::List Addressee::addresses() const
1890{ 1952{
1891 return mData->addresses; 1953 return mData->addresses;
1892} 1954}
1893 1955
1894Address::List Addressee::addresses( int type ) const 1956Address::List Addressee::addresses( int type ) const
1895{ 1957{
1896 Address::List list; 1958 Address::List list;
1897 1959
1898 Address::List::ConstIterator it; 1960 Address::List::ConstIterator it;
1899 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1961 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1900 if ( matchBinaryPattern( (*it).type(), type ) ) { 1962 if ( matchBinaryPattern( (*it).type(), type ) ) {
1901 list.append( *it ); 1963 list.append( *it );
1902 } 1964 }
1903 } 1965 }
1904 1966
1905 return list; 1967 return list;
1906} 1968}
1907 1969
1908Address Addressee::findAddress( const QString &id ) const 1970Address Addressee::findAddress( const QString &id ) const
1909{ 1971{
1910 Address::List::ConstIterator it; 1972 Address::List::ConstIterator it;
1911 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1973 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1912 if ( (*it).id() == id ) { 1974 if ( (*it).id() == id ) {
1913 return *it; 1975 return *it;
1914 } 1976 }
1915 } 1977 }
1916 return Address(); 1978 return Address();
1917} 1979}
1918 1980
1919void Addressee::insertCategory( const QString &c ) 1981void Addressee::insertCategory( const QString &c )
1920{ 1982{
1921 detach(); 1983 detach();
1922 mData->empty = false; 1984 mData->empty = false;
1923 1985
1924 if ( mData->categories.contains( c ) ) return; 1986 if ( mData->categories.contains( c ) ) return;
1925 1987
1926 mData->categories.append( c ); 1988 mData->categories.append( c );
1927} 1989}
1928 1990
1929void Addressee::removeCategory( const QString &c ) 1991void Addressee::removeCategory( const QString &c )
1930{ 1992{
1931 detach(); 1993 detach();
1932 1994
1933 QStringList::Iterator it = mData->categories.find( c ); 1995 QStringList::Iterator it = mData->categories.find( c );
1934 if ( it == mData->categories.end() ) return; 1996 if ( it == mData->categories.end() ) return;
1935 1997
1936 mData->categories.remove( it ); 1998 mData->categories.remove( it );
1937} 1999}
1938 2000
1939bool Addressee::hasCategory( const QString &c ) const 2001bool Addressee::hasCategory( const QString &c ) const
1940{ 2002{
1941 return ( mData->categories.contains( c ) ); 2003 return ( mData->categories.contains( c ) );
1942} 2004}
1943 2005
1944void Addressee::setCategories( const QStringList &c ) 2006void Addressee::setCategories( const QStringList &c )
1945{ 2007{
1946 detach(); 2008 detach();
1947 mData->empty = false; 2009 mData->empty = false;
1948 2010
1949 mData->categories = c; 2011 mData->categories = c;
1950} 2012}
1951 2013
1952QStringList Addressee::categories() const 2014QStringList Addressee::categories() const
1953{ 2015{
1954 return mData->categories; 2016 return mData->categories;
1955} 2017}
1956 2018
1957void Addressee::insertCustom( const QString &app, const QString &name, 2019void Addressee::insertCustom( const QString &app, const QString &name,
1958 const QString &value ) 2020 const QString &value )
1959{ 2021{
1960 if ( value.isNull() || name.isEmpty() || app.isEmpty() ) return; 2022 if ( value.isNull() || name.isEmpty() || app.isEmpty() ) return;
1961 2023
1962 detach(); 2024 detach();
1963 mData->empty = false; 2025 mData->empty = false;
1964 2026
1965 QString qualifiedName = app + "-" + name + ":"; 2027 QString qualifiedName = app + "-" + name + ":";
1966 2028
1967 QStringList::Iterator it; 2029 QStringList::Iterator it;
1968 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) { 2030 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
1969 if ( (*it).startsWith( qualifiedName ) ) { 2031 if ( (*it).startsWith( qualifiedName ) ) {
1970 (*it) = qualifiedName + value; 2032 (*it) = qualifiedName + value;
1971 return; 2033 return;
1972 } 2034 }
1973 } 2035 }
1974 mData->custom.append( qualifiedName + value ); 2036 mData->custom.append( qualifiedName + value );
1975} 2037}
1976 2038
1977void Addressee::removeCustom( const QString &app, const QString &name) 2039void Addressee::removeCustom( const QString &app, const QString &name)
1978{ 2040{
1979 detach(); 2041 detach();
1980 2042
1981 QString qualifiedName = app + "-" + name + ":"; 2043 QString qualifiedName = app + "-" + name + ":";
1982 2044
1983 QStringList::Iterator it; 2045 QStringList::Iterator it;
1984 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) { 2046 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
1985 if ( (*it).startsWith( qualifiedName ) ) { 2047 if ( (*it).startsWith( qualifiedName ) ) {
1986 mData->custom.remove( it ); 2048 mData->custom.remove( it );
1987 return; 2049 return;
1988 } 2050 }
1989 } 2051 }
1990} 2052}
1991 2053
1992QString Addressee::custom( const QString &app, const QString &name ) const 2054QString Addressee::custom( const QString &app, const QString &name ) const
1993{ 2055{
1994 QString qualifiedName = app + "-" + name + ":"; 2056 QString qualifiedName = app + "-" + name + ":";
1995 QString value; 2057 QString value;
1996 2058
1997 QStringList::ConstIterator it; 2059 QStringList::ConstIterator it;
1998 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) { 2060 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
1999 if ( (*it).startsWith( qualifiedName ) ) { 2061 if ( (*it).startsWith( qualifiedName ) ) {
2000 value = (*it).mid( (*it).find( ":" ) + 1 ); 2062 value = (*it).mid( (*it).find( ":" ) + 1 );
2001 break; 2063 break;
2002 } 2064 }
2003 } 2065 }
2004 2066
2005 return value; 2067 return value;
2006} 2068}
2007 2069
2008void Addressee::setCustoms( const QStringList &l ) 2070void Addressee::setCustoms( const QStringList &l )
2009{ 2071{
2010 detach(); 2072 detach();
2011 mData->empty = false; 2073 mData->empty = false;
2012 2074
2013 mData->custom = l; 2075 mData->custom = l;
2014} 2076}
2015 2077
2016QStringList Addressee::customs() const 2078QStringList Addressee::customs() const
2017{ 2079{
2018 return mData->custom; 2080 return mData->custom;
2019} 2081}
2020 2082
2021void Addressee::parseEmailAddress( const QString &rawEmail, QString &fullName, 2083void Addressee::parseEmailAddress( const QString &rawEmail, QString &fullName,
2022 QString &email) 2084 QString &email)
2023{ 2085{
2024 int startPos, endPos, len; 2086 int startPos, endPos, len;
2025 QString partA, partB, result; 2087 QString partA, partB, result;
2026 char endCh = '>'; 2088 char endCh = '>';
2027 2089
2028 startPos = rawEmail.find('<'); 2090 startPos = rawEmail.find('<');
2029 if (startPos < 0) 2091 if (startPos < 0)
2030 { 2092 {
2031 startPos = rawEmail.find('('); 2093 startPos = rawEmail.find('(');
2032 endCh = ')'; 2094 endCh = ')';
2033 } 2095 }
2034 if (startPos < 0) 2096 if (startPos < 0)
2035 { 2097 {
2036 // We couldn't find any separators, so we assume the whole string 2098 // We couldn't find any separators, so we assume the whole string
2037 // is the email address 2099 // is the email address
2038 email = rawEmail; 2100 email = rawEmail;
2039 fullName = ""; 2101 fullName = "";
2040 } 2102 }
2041 else 2103 else
2042 { 2104 {
2043 // We have a start position, try to find an end 2105 // We have a start position, try to find an end
2044 endPos = rawEmail.find(endCh, startPos+1); 2106 endPos = rawEmail.find(endCh, startPos+1);
2045 2107
2046 if (endPos < 0) 2108 if (endPos < 0)
2047 { 2109 {
2048 // We couldn't find the end of the email address. We can only 2110 // We couldn't find the end of the email address. We can only
2049 // assume the entire string is the email address. 2111 // assume the entire string is the email address.
2050 email = rawEmail; 2112 email = rawEmail;
2051 fullName = ""; 2113 fullName = "";
2052 } 2114 }
2053 else 2115 else
2054 { 2116 {
2055 // We have a start and end to the email address 2117 // We have a start and end to the email address
2056 2118
2057 // Grab the name part 2119 // Grab the name part
2058 fullName = rawEmail.left(startPos).stripWhiteSpace(); 2120 fullName = rawEmail.left(startPos).stripWhiteSpace();
2059 2121
2060 // grab the email part 2122 // grab the email part
2061 email = rawEmail.mid(startPos+1, endPos-startPos-1).stripWhiteSpace(); 2123 email = rawEmail.mid(startPos+1, endPos-startPos-1).stripWhiteSpace();
2062 2124
2063 // Check that we do not have any extra characters on the end of the 2125 // Check that we do not have any extra characters on the end of the
2064 // strings 2126 // strings
2065 len = fullName.length(); 2127 len = fullName.length();
2066 if (fullName[0]=='"' && fullName[len-1]=='"') 2128 if (fullName[0]=='"' && fullName[len-1]=='"')
2067 fullName = fullName.mid(1, len-2); 2129 fullName = fullName.mid(1, len-2);
2068 else if (fullName[0]=='<' && fullName[len-1]=='>') 2130 else if (fullName[0]=='<' && fullName[len-1]=='>')
2069 fullName = fullName.mid(1, len-2); 2131 fullName = fullName.mid(1, len-2);
2070 else if (fullName[0]=='(' && fullName[len-1]==')') 2132 else if (fullName[0]=='(' && fullName[len-1]==')')
2071 fullName = fullName.mid(1, len-2); 2133 fullName = fullName.mid(1, len-2);
2072 } 2134 }
2073 } 2135 }
2074} 2136}
2075 2137
2076void Addressee::setResource( Resource *resource ) 2138void Addressee::setResource( Resource *resource )
2077{ 2139{
2078 detach(); 2140 detach();
2079 mData->resource = resource; 2141 mData->resource = resource;
2080} 2142}
2081 2143
2082Resource *Addressee::resource() const 2144Resource *Addressee::resource() const
2083{ 2145{
2084 return mData->resource; 2146 return mData->resource;
2085} 2147}
2086 2148
2087//US 2149//US
2088QString Addressee::resourceLabel() 2150QString Addressee::resourceLabel()
2089{ 2151{
2090 return i18n("Resource"); 2152 return i18n("Resource");
2091} 2153}
2092QString Addressee::categoryLabel() 2154QString Addressee::categoryLabel()
2093{ 2155{
2094 return i18n("Category"); 2156 return i18n("Category");
2095} 2157}
2096 2158
2097void Addressee::setChanged( bool value ) 2159void Addressee::setChanged( bool value )
2098{ 2160{
2099 detach(); 2161 detach();
2100 mData->changed = value; 2162 mData->changed = value;
2101} 2163}
2102 2164
2103bool Addressee::changed() const 2165bool Addressee::changed() const
2104{ 2166{
2105 return mData->changed; 2167 return mData->changed;
2106} 2168}
2107 2169
2108void Addressee::setTagged( bool value ) 2170void Addressee::setTagged( bool value )
2109{ 2171{
2110 detach(); 2172 detach();
2111 mData->tagged = value; 2173 mData->tagged = value;
2112} 2174}
2113 2175
2114bool Addressee::tagged() const 2176bool Addressee::tagged() const
2115{ 2177{
2116 return mData->tagged; 2178 return mData->tagged;
2117} 2179}
2118 2180
2119QDataStream &KABC::operator<<( QDataStream &s, const Addressee &a ) 2181QDataStream &KABC::operator<<( QDataStream &s, const Addressee &a )
2120{ 2182{
2121 if (!a.mData) return s; 2183 if (!a.mData) return s;
2122 2184
2123 s << a.uid(); 2185 s << a.uid();
2124 2186
2125 s << a.mData->name; 2187 s << a.mData->name;
2126 s << a.mData->formattedName; 2188 s << a.mData->formattedName;
2127 s << a.mData->familyName; 2189 s << a.mData->familyName;
2128 s << a.mData->givenName; 2190 s << a.mData->givenName;
2129 s << a.mData->additionalName; 2191 s << a.mData->additionalName;
2130 s << a.mData->prefix; 2192 s << a.mData->prefix;
2131 s << a.mData->suffix; 2193 s << a.mData->suffix;
2132 s << a.mData->nickName; 2194 s << a.mData->nickName;
2133 s << a.mData->birthday; 2195 s << a.mData->birthday;
2134 s << a.mData->mailer; 2196 s << a.mData->mailer;
2135 s << a.mData->timeZone; 2197 s << a.mData->timeZone;
2136 s << a.mData->geo; 2198 s << a.mData->geo;
2137 s << a.mData->title; 2199 s << a.mData->title;
2138 s << a.mData->role; 2200 s << a.mData->role;
2139 s << a.mData->organization; 2201 s << a.mData->organization;
2140 s << a.mData->note; 2202 s << a.mData->note;
2141 s << a.mData->productId; 2203 s << a.mData->productId;
2142 s << a.mData->revision; 2204 s << a.mData->revision;
2143 s << a.mData->sortString; 2205 s << a.mData->sortString;
2144 s << a.mData->url; 2206 s << a.mData->url;
2145 s << a.mData->secrecy; 2207 s << a.mData->secrecy;
2146 s << a.mData->logo; 2208 s << a.mData->logo;
2147 s << a.mData->photo; 2209 s << a.mData->photo;
2148 s << a.mData->sound; 2210 s << a.mData->sound;
2149 s << a.mData->agent; 2211 s << a.mData->agent;
2150 s << a.mData->phoneNumbers; 2212 s << a.mData->phoneNumbers;
2151 s << a.mData->addresses; 2213 s << a.mData->addresses;
2152 s << a.mData->emails; 2214 s << a.mData->emails;
2153 s << a.mData->categories; 2215 s << a.mData->categories;
2154 s << a.mData->custom; 2216 s << a.mData->custom;
2155 s << a.mData->keys; 2217 s << a.mData->keys;
2156 return s; 2218 return s;
2157} 2219}
2158 2220
2159QDataStream &KABC::operator>>( QDataStream &s, Addressee &a ) 2221QDataStream &KABC::operator>>( QDataStream &s, Addressee &a )
2160{ 2222{
2161 if (!a.mData) return s; 2223 if (!a.mData) return s;
2162 2224
2163 s >> a.mData->uid; 2225 s >> a.mData->uid;
2164 2226
2165 s >> a.mData->name; 2227 s >> a.mData->name;
2166 s >> a.mData->formattedName; 2228 s >> a.mData->formattedName;