summaryrefslogtreecommitdiffabout
path: root/kabc/addressee.cpp
Unidiff
Diffstat (limited to 'kabc/addressee.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--kabc/addressee.cpp4
1 files changed, 4 insertions, 0 deletions
diff --git a/kabc/addressee.cpp b/kabc/addressee.cpp
index 789a694..0d8e8e8 100644
--- a/kabc/addressee.cpp
+++ b/kabc/addressee.cpp
@@ -74,2048 +74,2052 @@ struct Addressee::AddresseeData : public KShared
74 Secrecy secrecy; 74 Secrecy secrecy;
75 Picture logo; 75 Picture logo;
76 Picture photo; 76 Picture photo;
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() 589void Addressee::makePhoneNumbersOLcompatible()
590{ 590{
591 KABC::PhoneNumber::List::Iterator phoneIter; 591 KABC::PhoneNumber::List::Iterator phoneIter;
592 KABC::PhoneNumber::List::Iterator phoneIter2; 592 KABC::PhoneNumber::List::Iterator phoneIter2;
593 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); 593 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
594 ++phoneIter ) { 594 ++phoneIter ) {
595 ( *phoneIter ).makeCompat(); 595 ( *phoneIter ).makeCompat();
596 } 596 }
597 int hasHome = hasPhoneNumberType( PhoneNumber::Home | PhoneNumber::Pref ); 597 int hasHome = hasPhoneNumberType( PhoneNumber::Home | PhoneNumber::Pref );
598 int hasHome2 = hasPhoneNumberType( PhoneNumber::Home ); 598 int hasHome2 = hasPhoneNumberType( PhoneNumber::Home );
599 int hasWork = hasPhoneNumberType( PhoneNumber::Work | PhoneNumber::Pref ); 599 int hasWork = hasPhoneNumberType( PhoneNumber::Work | PhoneNumber::Pref );
600 int hasWork2 = hasPhoneNumberType( PhoneNumber::Work ); 600 int hasWork2 = hasPhoneNumberType( PhoneNumber::Work );
601 int hasCell = hasPhoneNumberType( PhoneNumber::Cell ); 601 int hasCell = hasPhoneNumberType( PhoneNumber::Cell );
602 int hasCell2 = hasPhoneNumberType( PhoneNumber::Car ); 602 int hasCell2 = hasPhoneNumberType( PhoneNumber::Car );
603 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); 603 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
604 ++phoneIter ) { 604 ++phoneIter ) {
605 if ( (*phoneIter).type() == PhoneNumber::Home && ! hasHome ) { 605 if ( (*phoneIter).type() == PhoneNumber::Home && ! hasHome ) {
606 (*phoneIter).setType( PhoneNumber::Home | PhoneNumber::Pref ); 606 (*phoneIter).setType( PhoneNumber::Home | PhoneNumber::Pref );
607 ++hasHome; 607 ++hasHome;
608 if ( hasHome2 ) --hasHome2; 608 if ( hasHome2 ) --hasHome2;
609 } else if ( ( (*phoneIter).type() == PhoneNumber::Home | PhoneNumber::Pref) && hasHome>1 && !hasHome2 ) { 609 } else if ( ( (*phoneIter).type() == PhoneNumber::Home | PhoneNumber::Pref) && hasHome>1 && !hasHome2 ) {
610 (*phoneIter).setType( PhoneNumber::Home ); 610 (*phoneIter).setType( PhoneNumber::Home );
611 --hasHome; 611 --hasHome;
612 ++hasHome2; 612 ++hasHome2;
613 } else if ( (*phoneIter).type() == PhoneNumber::Work && ! hasWork ) { 613 } else if ( (*phoneIter).type() == PhoneNumber::Work && ! hasWork ) {
614 (*phoneIter).setType( PhoneNumber::Work | PhoneNumber::Pref ); 614 (*phoneIter).setType( PhoneNumber::Work | PhoneNumber::Pref );
615 ++hasWork; 615 ++hasWork;
616 if ( hasWork2 ) --hasWork2; 616 if ( hasWork2 ) --hasWork2;
617 } else if ( ( (*phoneIter).type() == PhoneNumber::Work | PhoneNumber::Pref) && hasWork > 1 && ! hasWork2 ) { 617 } else if ( ( (*phoneIter).type() == PhoneNumber::Work | PhoneNumber::Pref) && hasWork > 1 && ! hasWork2 ) {
618 (*phoneIter).setType( PhoneNumber::Work ); 618 (*phoneIter).setType( PhoneNumber::Work );
619 --hasWork; 619 --hasWork;
620 ++hasWork2; 620 ++hasWork2;
621 } else if ( (*phoneIter).type() == PhoneNumber::Cell && hasCell > 1 && !hasCell2) { 621 } else if ( (*phoneIter).type() == PhoneNumber::Cell && hasCell > 1 && !hasCell2) {
622 (*phoneIter).setType( PhoneNumber::Car ); 622 (*phoneIter).setType( PhoneNumber::Car );
623 ++hasCell2; 623 ++hasCell2;
624 --hasCell; 624 --hasCell;
625 } else if ( (*phoneIter).type() == PhoneNumber::Car && hasCell2 > 1 && !hasCell) { 625 } else if ( (*phoneIter).type() == PhoneNumber::Car && hasCell2 > 1 && !hasCell) {
626 (*phoneIter).setType( PhoneNumber::Cell ); 626 (*phoneIter).setType( PhoneNumber::Cell );
627 ++hasCell; 627 ++hasCell;
628 --hasCell2; 628 --hasCell2;
629 } else{ 629 } else{
630 phoneIter2 = phoneIter; 630 phoneIter2 = phoneIter;
631 ++phoneIter2; 631 ++phoneIter2;
632 for ( ; phoneIter2 != mData->phoneNumbers.end(); 632 for ( ; phoneIter2 != mData->phoneNumbers.end();
633 ++phoneIter2 ) { 633 ++phoneIter2 ) {
634 if ( (*phoneIter2).type() == (*phoneIter).type() ) { 634 if ( (*phoneIter2).type() == (*phoneIter).type() ) {
635 (*phoneIter2).setType( PhoneNumber::Voice ); 635 (*phoneIter2).setType( PhoneNumber::Voice );
636 636
637 } 637 }
638 } 638 }
639 } 639 }
640 } 640 }
641} 641}
642void Addressee::simplifyPhoneNumbers() 642void Addressee::simplifyPhoneNumbers()
643{ 643{
644 int max = 4; 644 int max = 4;
645 int inList = mData->phoneNumbers.count(); 645 int inList = mData->phoneNumbers.count();
646 KABC::PhoneNumber::List removeNumbers; 646 KABC::PhoneNumber::List removeNumbers;
647 KABC::PhoneNumber::List::Iterator phoneIter; 647 KABC::PhoneNumber::List::Iterator phoneIter;
648 if ( inList > max ) { 648 if ( inList > max ) {
649 // delete non-preferred numbers 649 // delete non-preferred numbers
650 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); 650 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
651 ++phoneIter ) { 651 ++phoneIter ) {
652 if ( inList > max ) { 652 if ( inList > max ) {
653 if ( ! (( *phoneIter ).type() & PhoneNumber::Pref )) { 653 if ( ! (( *phoneIter ).type() & PhoneNumber::Pref )) {
654 removeNumbers.append( ( *phoneIter ) ); 654 removeNumbers.append( ( *phoneIter ) );
655 --inList; 655 --inList;
656 } 656 }
657 } else 657 } else
658 break; 658 break;
659 } 659 }
660 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end(); 660 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end();
661 ++phoneIter ) { 661 ++phoneIter ) {
662 removePhoneNumber(( *phoneIter )); 662 removePhoneNumber(( *phoneIter ));
663 } 663 }
664 // delete preferred numbers 664 // delete preferred numbers
665 if ( inList > max ) { 665 if ( inList > max ) {
666 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); 666 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
667 ++phoneIter ) { 667 ++phoneIter ) {
668 if ( inList > max ) { 668 if ( inList > max ) {
669 removeNumbers.append( ( *phoneIter ) ); 669 removeNumbers.append( ( *phoneIter ) );
670 --inList; 670 --inList;
671 } else 671 } else
672 break; 672 break;
673 } 673 }
674 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end(); 674 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end();
675 ++phoneIter ) { 675 ++phoneIter ) {
676 removePhoneNumber(( *phoneIter )); 676 removePhoneNumber(( *phoneIter ));
677 } 677 }
678 } 678 }
679 } 679 }
680 // remove non-numeric characters 680 // remove non-numeric characters
681 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); 681 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
682 ++phoneIter ) { 682 ++phoneIter ) {
683 if ( ! ( *phoneIter ).simplifyNumber() ) 683 if ( ! ( *phoneIter ).simplifyNumber() )
684 removeNumbers.append( ( *phoneIter ) ); 684 removeNumbers.append( ( *phoneIter ) );
685 } 685 }
686 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end(); 686 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end();
687 ++phoneIter ) { 687 ++phoneIter ) {
688 removePhoneNumber(( *phoneIter )); 688 removePhoneNumber(( *phoneIter ));
689 } 689 }
690} 690}
691void Addressee::simplifyPhoneNumberTypes() 691void Addressee::simplifyPhoneNumberTypes()
692{ 692{
693 KABC::PhoneNumber::List::Iterator phoneIter; 693 KABC::PhoneNumber::List::Iterator phoneIter;
694 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); 694 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
695 ++phoneIter ) 695 ++phoneIter )
696 ( *phoneIter ).simplifyType(); 696 ( *phoneIter ).simplifyType();
697} 697}
698void Addressee::removeID(const QString &prof) 698void Addressee::removeID(const QString &prof)
699{ 699{
700 detach(); 700 detach();
701 if ( prof.isEmpty() ) 701 if ( prof.isEmpty() )
702 mData->mExternalId = ":"; 702 mData->mExternalId = ":";
703 else 703 else
704 mData->mExternalId = KIdManager::removeId ( mData->mExternalId, prof); 704 mData->mExternalId = KIdManager::removeId ( mData->mExternalId, prof);
705 705
706} 706}
707void Addressee::setID( const QString & prof , const QString & id ) 707void Addressee::setID( const QString & prof , const QString & id )
708{ 708{
709 detach(); 709 detach();
710 mData->mExternalId = KIdManager::setId ( mData->mExternalId, prof, id ); 710 mData->mExternalId = KIdManager::setId ( mData->mExternalId, prof, id );
711 //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() );
712} 712}
713void Addressee::setTempSyncStat( int id ) 713void Addressee::setTempSyncStat( int id )
714{ 714{
715 if ( mData->mTempSyncStat == id ) return; 715 if ( mData->mTempSyncStat == id ) return;
716 detach(); 716 detach();
717 mData->mTempSyncStat = id; 717 mData->mTempSyncStat = id;
718} 718}
719int Addressee::tempSyncStat() const 719int Addressee::tempSyncStat() const
720{ 720{
721 return mData->mTempSyncStat; 721 return mData->mTempSyncStat;
722} 722}
723 723
724const QString Addressee::getID( const QString & prof) const 724const QString Addressee::getID( const QString & prof) const
725{ 725{
726 return KIdManager::getId ( mData->mExternalId, prof ); 726 return KIdManager::getId ( mData->mExternalId, prof );
727} 727}
728 728
729void Addressee::setCsum( const QString & prof , const QString & id ) 729void Addressee::setCsum( const QString & prof , const QString & id )
730{ 730{
731 detach(); 731 detach();
732 //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() );
733 mData->mExternalId = KIdManager::setCsum ( mData->mExternalId, prof, id ); 733 mData->mExternalId = KIdManager::setCsum ( mData->mExternalId, prof, id );
734 //qDebug("setcsum2 %s ",mData->mExternalId.latin1() ); 734 //qDebug("setcsum2 %s ",mData->mExternalId.latin1() );
735} 735}
736 736
737const QString Addressee::getCsum( const QString & prof) const 737const QString Addressee::getCsum( const QString & prof) const
738{ 738{
739 return KIdManager::getCsum ( mData->mExternalId, prof ); 739 return KIdManager::getCsum ( mData->mExternalId, prof );
740} 740}
741 741
742void Addressee::setIDStr( const QString & s ) 742void Addressee::setIDStr( const QString & s )
743{ 743{
744 detach(); 744 detach();
745 mData->mExternalId = s; 745 mData->mExternalId = s;
746} 746}
747 747
748const QString Addressee::IDStr() const 748const QString Addressee::IDStr() const
749{ 749{
750 return mData->mExternalId; 750 return mData->mExternalId;
751} 751}
752 752
753void Addressee::setExternalUID( const QString &id ) 753void Addressee::setExternalUID( const QString &id )
754{ 754{
755 if ( id == mData->externalUID ) return; 755 if ( id == mData->externalUID ) return;
756 detach(); 756 detach();
757 mData->empty = false; 757 mData->empty = false;
758 mData->externalUID = id; 758 mData->externalUID = id;
759} 759}
760 760
761const QString Addressee::externalUID() const 761const QString Addressee::externalUID() const
762{ 762{
763 return mData->externalUID; 763 return mData->externalUID;
764} 764}
765void Addressee::setOriginalExternalUID( const QString &id ) 765void Addressee::setOriginalExternalUID( const QString &id )
766{ 766{
767 if ( id == mData->originalExternalUID ) return; 767 if ( id == mData->originalExternalUID ) return;
768 detach(); 768 detach();
769 mData->empty = false; 769 mData->empty = false;
770 //qDebug("*******Set orig uid %s ", id.latin1()); 770 //qDebug("*******Set orig uid %s ", id.latin1());
771 mData->originalExternalUID = id; 771 mData->originalExternalUID = id;
772} 772}
773 773
774QString Addressee::originalExternalUID() const 774QString Addressee::originalExternalUID() const
775{ 775{
776 return mData->originalExternalUID; 776 return mData->originalExternalUID;
777} 777}
778 778
779void Addressee::setUid( const QString &id ) 779void Addressee::setUid( const QString &id )
780{ 780{
781 if ( id == mData->uid ) return; 781 if ( id == mData->uid ) return;
782 detach(); 782 detach();
783 //qDebug("****setuid %s ", id.latin1()); 783 //qDebug("****setuid %s ", id.latin1());
784 mData->empty = false; 784 mData->empty = false;
785 mData->uid = id; 785 mData->uid = id;
786} 786}
787 787
788const QString Addressee::uid() const 788const QString Addressee::uid() const
789{ 789{
790 if ( mData->uid.isEmpty() ) 790 if ( mData->uid.isEmpty() )
791 mData->uid = KApplication::randomString( 10 ); 791 mData->uid = KApplication::randomString( 10 );
792 792
793 return mData->uid; 793 return mData->uid;
794} 794}
795 795
796QString Addressee::uidLabel() 796QString Addressee::uidLabel()
797{ 797{
798 return i18n("Unique Identifier"); 798 return i18n("Unique Identifier");
799} 799}
800 800
801void Addressee::setName( const QString &name ) 801void Addressee::setName( const QString &name )
802{ 802{
803 if ( name == mData->name ) return; 803 if ( name == mData->name ) return;
804 detach(); 804 detach();
805 mData->empty = false; 805 mData->empty = false;
806 mData->name = name; 806 mData->name = name;
807} 807}
808 808
809QString Addressee::name() const 809QString Addressee::name() const
810{ 810{
811 return mData->name; 811 return mData->name;
812} 812}
813 813
814QString Addressee::nameLabel() 814QString Addressee::nameLabel()
815{ 815{
816 return i18n("Name"); 816 return i18n("Name");
817} 817}
818 818
819 819
820void Addressee::setFormattedName( const QString &formattedName ) 820void Addressee::setFormattedName( const QString &formattedName )
821{ 821{
822 if ( formattedName == mData->formattedName ) return; 822 if ( formattedName == mData->formattedName ) return;
823 detach(); 823 detach();
824 mData->empty = false; 824 mData->empty = false;
825 mData->formattedName = formattedName; 825 mData->formattedName = formattedName;
826} 826}
827 827
828QString Addressee::formattedName() const 828QString Addressee::formattedName() const
829{ 829{
830 return mData->formattedName; 830 return mData->formattedName;
831} 831}
832 832
833QString Addressee::formattedNameLabel() 833QString Addressee::formattedNameLabel()
834{ 834{
835 return i18n("Formatted Name"); 835 return i18n("Formatted Name");
836} 836}
837 837
838 838
839void Addressee::setFamilyName( const QString &familyName ) 839void Addressee::setFamilyName( const QString &familyName )
840{ 840{
841 if ( familyName == mData->familyName ) return; 841 if ( familyName == mData->familyName ) return;
842 detach(); 842 detach();
843 mData->empty = false; 843 mData->empty = false;
844 mData->familyName = familyName; 844 mData->familyName = familyName;
845} 845}
846 846
847QString Addressee::familyName() const 847QString Addressee::familyName() const
848{ 848{
849 return mData->familyName; 849 return mData->familyName;
850} 850}
851 851
852QString Addressee::familyNameLabel() 852QString Addressee::familyNameLabel()
853{ 853{
854 return i18n("Family Name"); 854 return i18n("Family Name");
855} 855}
856 856
857 857
858void Addressee::setGivenName( const QString &givenName ) 858void Addressee::setGivenName( const QString &givenName )
859{ 859{
860 if ( givenName == mData->givenName ) return; 860 if ( givenName == mData->givenName ) return;
861 detach(); 861 detach();
862 mData->empty = false; 862 mData->empty = false;
863 mData->givenName = givenName; 863 mData->givenName = givenName;
864} 864}
865 865
866QString Addressee::givenName() const 866QString Addressee::givenName() const
867{ 867{
868 return mData->givenName; 868 return mData->givenName;
869} 869}
870 870
871QString Addressee::givenNameLabel() 871QString Addressee::givenNameLabel()
872{ 872{
873 return i18n("Given Name"); 873 return i18n("Given Name");
874} 874}
875 875
876 876
877void Addressee::setAdditionalName( const QString &additionalName ) 877void Addressee::setAdditionalName( const QString &additionalName )
878{ 878{
879 if ( additionalName == mData->additionalName ) return; 879 if ( additionalName == mData->additionalName ) return;
880 detach(); 880 detach();
881 mData->empty = false; 881 mData->empty = false;
882 mData->additionalName = additionalName; 882 mData->additionalName = additionalName;
883} 883}
884 884
885QString Addressee::additionalName() const 885QString Addressee::additionalName() const
886{ 886{
887 return mData->additionalName; 887 return mData->additionalName;
888} 888}
889 889
890QString Addressee::additionalNameLabel() 890QString Addressee::additionalNameLabel()
891{ 891{
892 return i18n("Additional Names"); 892 return i18n("Additional Names");
893} 893}
894 894
895 895
896void Addressee::setPrefix( const QString &prefix ) 896void Addressee::setPrefix( const QString &prefix )
897{ 897{
898 if ( prefix == mData->prefix ) return; 898 if ( prefix == mData->prefix ) return;
899 detach(); 899 detach();
900 mData->empty = false; 900 mData->empty = false;
901 mData->prefix = prefix; 901 mData->prefix = prefix;
902} 902}
903 903
904QString Addressee::prefix() const 904QString Addressee::prefix() const
905{ 905{
906 return mData->prefix; 906 return mData->prefix;
907} 907}
908 908
909QString Addressee::prefixLabel() 909QString Addressee::prefixLabel()
910{ 910{
911 return i18n("Honorific Prefixes"); 911 return i18n("Honorific Prefixes");
912} 912}
913 913
914 914
915void Addressee::setSuffix( const QString &suffix ) 915void Addressee::setSuffix( const QString &suffix )
916{ 916{
917 if ( suffix == mData->suffix ) return; 917 if ( suffix == mData->suffix ) return;
918 detach(); 918 detach();
919 mData->empty = false; 919 mData->empty = false;
920 mData->suffix = suffix; 920 mData->suffix = suffix;
921} 921}
922 922
923QString Addressee::suffix() const 923QString Addressee::suffix() const
924{ 924{
925 return mData->suffix; 925 return mData->suffix;
926} 926}
927 927
928QString Addressee::suffixLabel() 928QString Addressee::suffixLabel()
929{ 929{
930 return i18n("Honorific Suffixes"); 930 return i18n("Honorific Suffixes");
931} 931}
932 932
933 933
934void Addressee::setNickName( const QString &nickName ) 934void Addressee::setNickName( const QString &nickName )
935{ 935{
936 if ( nickName == mData->nickName ) return; 936 if ( nickName == mData->nickName ) return;
937 detach(); 937 detach();
938 mData->empty = false; 938 mData->empty = false;
939 mData->nickName = nickName; 939 mData->nickName = nickName;
940} 940}
941 941
942QString Addressee::nickName() const 942QString Addressee::nickName() const
943{ 943{
944 return mData->nickName; 944 return mData->nickName;
945} 945}
946 946
947QString Addressee::nickNameLabel() 947QString Addressee::nickNameLabel()
948{ 948{
949 return i18n("Nick Name"); 949 return i18n("Nick Name");
950} 950}
951 951
952 952
953void Addressee::setBirthday( const QDateTime &birthday ) 953void Addressee::setBirthday( const QDateTime &birthday )
954{ 954{
955 if ( birthday == mData->birthday ) return; 955 if ( birthday == mData->birthday ) return;
956 detach(); 956 detach();
957 mData->empty = false; 957 mData->empty = false;
958 mData->birthday = birthday; 958 mData->birthday = birthday;
959} 959}
960 960
961QDateTime Addressee::birthday() const 961QDateTime Addressee::birthday() const
962{ 962{
963 return mData->birthday; 963 return mData->birthday;
964} 964}
965 965
966QString Addressee::birthdayLabel() 966QString Addressee::birthdayLabel()
967{ 967{
968 return i18n("Birthday"); 968 return i18n("Birthday");
969} 969}
970 970
971 971
972QString Addressee::homeAddressStreetLabel() 972QString Addressee::homeAddressStreetLabel()
973{ 973{
974 return i18n("Home Address Street"); 974 return i18n("Home Address Street");
975} 975}
976 976
977 977
978QString Addressee::homeAddressLocalityLabel() 978QString Addressee::homeAddressLocalityLabel()
979{ 979{
980 return i18n("Home Address Locality"); 980 return i18n("Home Address Locality");
981} 981}
982 982
983 983
984QString Addressee::homeAddressRegionLabel() 984QString Addressee::homeAddressRegionLabel()
985{ 985{
986 return i18n("Home Address Region"); 986 return i18n("Home Address Region");
987} 987}
988 988
989 989
990QString Addressee::homeAddressPostalCodeLabel() 990QString Addressee::homeAddressPostalCodeLabel()
991{ 991{
992 return i18n("Home Address Postal Code"); 992 return i18n("Home Address Postal Code");
993} 993}
994 994
995 995
996QString Addressee::homeAddressCountryLabel() 996QString Addressee::homeAddressCountryLabel()
997{ 997{
998 return i18n("Home Address Country"); 998 return i18n("Home Address Country");
999} 999}
1000 1000
1001 1001
1002QString Addressee::homeAddressLabelLabel() 1002QString Addressee::homeAddressLabelLabel()
1003{ 1003{
1004 return i18n("Home Address Label"); 1004 return i18n("Home Address Label");
1005} 1005}
1006 1006
1007 1007
1008QString Addressee::businessAddressStreetLabel() 1008QString Addressee::businessAddressStreetLabel()
1009{ 1009{
1010 return i18n("Business Address Street"); 1010 return i18n("Business Address Street");
1011} 1011}
1012 1012
1013 1013
1014QString Addressee::businessAddressLocalityLabel() 1014QString Addressee::businessAddressLocalityLabel()
1015{ 1015{
1016 return i18n("Business Address Locality"); 1016 return i18n("Business Address Locality");
1017} 1017}
1018 1018
1019 1019
1020QString Addressee::businessAddressRegionLabel() 1020QString Addressee::businessAddressRegionLabel()
1021{ 1021{
1022 return i18n("Business Address Region"); 1022 return i18n("Business Address Region");
1023} 1023}
1024 1024
1025 1025
1026QString Addressee::businessAddressPostalCodeLabel() 1026QString Addressee::businessAddressPostalCodeLabel()
1027{ 1027{
1028 return i18n("Business Address Postal Code"); 1028 return i18n("Business Address Postal Code");
1029} 1029}
1030 1030
1031 1031
1032QString Addressee::businessAddressCountryLabel() 1032QString Addressee::businessAddressCountryLabel()
1033{ 1033{
1034 return i18n("Business Address Country"); 1034 return i18n("Business Address Country");
1035} 1035}
1036 1036
1037 1037
1038QString Addressee::businessAddressLabelLabel() 1038QString Addressee::businessAddressLabelLabel()
1039{ 1039{
1040 return i18n("Business Address Label"); 1040 return i18n("Business Address Label");
1041} 1041}
1042 1042
1043 1043
1044QString Addressee::homePhoneLabel() 1044QString Addressee::homePhoneLabel()
1045{ 1045{
1046 return i18n("Home Phone"); 1046 return i18n("Home Phone");
1047} 1047}
1048 1048
1049 1049
1050QString Addressee::businessPhoneLabel() 1050QString Addressee::businessPhoneLabel()
1051{ 1051{
1052 return i18n("Work Phone"); 1052 return i18n("Work Phone");
1053} 1053}
1054 1054
1055 1055
1056QString Addressee::mobilePhoneLabel() 1056QString Addressee::mobilePhoneLabel()
1057{ 1057{
1058 return i18n("Mobile Phone"); 1058 return i18n("Mobile Phone");
1059} 1059}
1060QString Addressee::mobileWorkPhoneLabel() 1060QString Addressee::mobileWorkPhoneLabel()
1061{ 1061{
1062 return i18n("Mobile2 (Work)"); 1062 return i18n("Mobile2 (Work)");
1063} 1063}
1064QString Addressee::mobileHomePhoneLabel() 1064QString Addressee::mobileHomePhoneLabel()
1065{ 1065{
1066 return i18n("Mobile (Home)"); 1066 return i18n("Mobile (Home)");
1067} 1067}
1068 1068
1069 1069
1070QString Addressee::homeFaxLabel() 1070QString Addressee::homeFaxLabel()
1071{ 1071{
1072 return i18n("Fax (Home)"); 1072 return i18n("Fax (Home)");
1073} 1073}
1074 1074
1075 1075
1076QString Addressee::businessFaxLabel() 1076QString Addressee::businessFaxLabel()
1077{ 1077{
1078 return i18n("Fax (Work)"); 1078 return i18n("Fax (Work)");
1079} 1079}
1080 1080
1081 1081
1082QString Addressee::carPhoneLabel() 1082QString Addressee::carPhoneLabel()
1083{ 1083{
1084 return i18n("Mobile2 (Car)"); 1084 return i18n("Mobile2 (Car)");
1085} 1085}
1086 1086
1087 1087
1088QString Addressee::isdnLabel() 1088QString Addressee::isdnLabel()
1089{ 1089{
1090 return i18n("ISDN"); 1090 return i18n("ISDN");
1091} 1091}
1092 1092
1093 1093
1094QString Addressee::pagerLabel() 1094QString Addressee::pagerLabel()
1095{ 1095{
1096 return i18n("Pager"); 1096 return i18n("Pager");
1097} 1097}
1098QString Addressee::otherPhoneLabel()
1099{
1100 return i18n("Other Phone");
1101}
1098 1102
1099QString Addressee::sipLabel() 1103QString Addressee::sipLabel()
1100{ 1104{
1101 return i18n("SIP"); 1105 return i18n("SIP");
1102} 1106}
1103 1107
1104QString Addressee::emailLabel() 1108QString Addressee::emailLabel()
1105{ 1109{
1106 return i18n("Email Address"); 1110 return i18n("Email Address");
1107} 1111}
1108 1112
1109 1113
1110void Addressee::setMailer( const QString &mailer ) 1114void Addressee::setMailer( const QString &mailer )
1111{ 1115{
1112 if ( mailer == mData->mailer ) return; 1116 if ( mailer == mData->mailer ) return;
1113 detach(); 1117 detach();
1114 mData->empty = false; 1118 mData->empty = false;
1115 mData->mailer = mailer; 1119 mData->mailer = mailer;
1116} 1120}
1117 1121
1118QString Addressee::mailer() const 1122QString Addressee::mailer() const
1119{ 1123{
1120 return mData->mailer; 1124 return mData->mailer;
1121} 1125}
1122 1126
1123QString Addressee::mailerLabel() 1127QString Addressee::mailerLabel()
1124{ 1128{
1125 return i18n("Mail Client"); 1129 return i18n("Mail Client");
1126} 1130}
1127 1131
1128 1132
1129void Addressee::setTimeZone( const TimeZone &timeZone ) 1133void Addressee::setTimeZone( const TimeZone &timeZone )
1130{ 1134{
1131 if ( timeZone == mData->timeZone ) return; 1135 if ( timeZone == mData->timeZone ) return;
1132 detach(); 1136 detach();
1133 mData->empty = false; 1137 mData->empty = false;
1134 mData->timeZone = timeZone; 1138 mData->timeZone = timeZone;
1135} 1139}
1136 1140
1137TimeZone Addressee::timeZone() const 1141TimeZone Addressee::timeZone() const
1138{ 1142{
1139 return mData->timeZone; 1143 return mData->timeZone;
1140} 1144}
1141 1145
1142QString Addressee::timeZoneLabel() 1146QString Addressee::timeZoneLabel()
1143{ 1147{
1144 return i18n("Time Zone"); 1148 return i18n("Time Zone");
1145} 1149}
1146 1150
1147 1151
1148void Addressee::setGeo( const Geo &geo ) 1152void Addressee::setGeo( const Geo &geo )
1149{ 1153{
1150 if ( geo == mData->geo ) return; 1154 if ( geo == mData->geo ) return;
1151 detach(); 1155 detach();
1152 mData->empty = false; 1156 mData->empty = false;
1153 mData->geo = geo; 1157 mData->geo = geo;
1154} 1158}
1155 1159
1156Geo Addressee::geo() const 1160Geo Addressee::geo() const
1157{ 1161{
1158 return mData->geo; 1162 return mData->geo;
1159} 1163}
1160 1164
1161QString Addressee::geoLabel() 1165QString Addressee::geoLabel()
1162{ 1166{
1163 return i18n("Geographic Position"); 1167 return i18n("Geographic Position");
1164} 1168}
1165 1169
1166 1170
1167void Addressee::setTitle( const QString &title ) 1171void Addressee::setTitle( const QString &title )
1168{ 1172{
1169 if ( title == mData->title ) return; 1173 if ( title == mData->title ) return;
1170 detach(); 1174 detach();
1171 mData->empty = false; 1175 mData->empty = false;
1172 mData->title = title; 1176 mData->title = title;
1173} 1177}
1174 1178
1175QString Addressee::title() const 1179QString Addressee::title() const
1176{ 1180{
1177 return mData->title; 1181 return mData->title;
1178} 1182}
1179 1183
1180QString Addressee::titleLabel() 1184QString Addressee::titleLabel()
1181{ 1185{
1182 return i18n("Title"); 1186 return i18n("Title");
1183} 1187}
1184 1188
1185 1189
1186void Addressee::setRole( const QString &role ) 1190void Addressee::setRole( const QString &role )
1187{ 1191{
1188 if ( role == mData->role ) return; 1192 if ( role == mData->role ) return;
1189 detach(); 1193 detach();
1190 mData->empty = false; 1194 mData->empty = false;
1191 mData->role = role; 1195 mData->role = role;
1192} 1196}
1193 1197
1194QString Addressee::role() const 1198QString Addressee::role() const
1195{ 1199{
1196 return mData->role; 1200 return mData->role;
1197} 1201}
1198 1202
1199QString Addressee::roleLabel() 1203QString Addressee::roleLabel()
1200{ 1204{
1201 return i18n("Role"); 1205 return i18n("Role");
1202} 1206}
1203 1207
1204 1208
1205void Addressee::setOrganization( const QString &organization ) 1209void Addressee::setOrganization( const QString &organization )
1206{ 1210{
1207 if ( organization == mData->organization ) return; 1211 if ( organization == mData->organization ) return;
1208 detach(); 1212 detach();
1209 mData->empty = false; 1213 mData->empty = false;
1210 mData->organization = organization; 1214 mData->organization = organization;
1211} 1215}
1212 1216
1213QString Addressee::organization() const 1217QString Addressee::organization() const
1214{ 1218{
1215 return mData->organization; 1219 return mData->organization;
1216} 1220}
1217 1221
1218QString Addressee::organizationLabel() 1222QString Addressee::organizationLabel()
1219{ 1223{
1220 return i18n("Organization"); 1224 return i18n("Organization");
1221} 1225}
1222 1226
1223 1227
1224void Addressee::setNote( const QString &note ) 1228void Addressee::setNote( const QString &note )
1225{ 1229{
1226 if ( note == mData->note ) return; 1230 if ( note == mData->note ) return;
1227 detach(); 1231 detach();
1228 mData->empty = false; 1232 mData->empty = false;
1229 mData->note = note; 1233 mData->note = note;
1230} 1234}
1231 1235
1232QString Addressee::note() const 1236QString Addressee::note() const
1233{ 1237{
1234 return mData->note; 1238 return mData->note;
1235} 1239}
1236 1240
1237QString Addressee::noteLabel() 1241QString Addressee::noteLabel()
1238{ 1242{
1239 return i18n("Note"); 1243 return i18n("Note");
1240} 1244}
1241 1245
1242 1246
1243void Addressee::setProductId( const QString &productId ) 1247void Addressee::setProductId( const QString &productId )
1244{ 1248{
1245 if ( productId == mData->productId ) return; 1249 if ( productId == mData->productId ) return;
1246 detach(); 1250 detach();
1247 mData->empty = false; 1251 mData->empty = false;
1248 mData->productId = productId; 1252 mData->productId = productId;
1249} 1253}
1250 1254
1251QString Addressee::productId() const 1255QString Addressee::productId() const
1252{ 1256{
1253 return mData->productId; 1257 return mData->productId;
1254} 1258}
1255 1259
1256QString Addressee::productIdLabel() 1260QString Addressee::productIdLabel()
1257{ 1261{
1258 return i18n("Product Identifier"); 1262 return i18n("Product Identifier");
1259} 1263}
1260 1264
1261 1265
1262void Addressee::setRevision( const QDateTime &revision ) 1266void Addressee::setRevision( const QDateTime &revision )
1263{ 1267{
1264 if ( revision == mData->revision ) return; 1268 if ( revision == mData->revision ) return;
1265 detach(); 1269 detach();
1266 mData->empty = false; 1270 mData->empty = false;
1267 mData->revision = QDateTime( revision.date(), 1271 mData->revision = QDateTime( revision.date(),
1268 QTime (revision.time().hour(), 1272 QTime (revision.time().hour(),
1269 revision.time().minute(), 1273 revision.time().minute(),
1270 revision.time().second())); 1274 revision.time().second()));
1271} 1275}
1272 1276
1273QDateTime Addressee::revision() const 1277QDateTime Addressee::revision() const
1274{ 1278{
1275 return mData->revision; 1279 return mData->revision;
1276} 1280}
1277 1281
1278QString Addressee::revisionLabel() 1282QString Addressee::revisionLabel()
1279{ 1283{
1280 return i18n("Revision Date"); 1284 return i18n("Revision Date");
1281} 1285}
1282 1286
1283 1287
1284void Addressee::setSortString( const QString &sortString ) 1288void Addressee::setSortString( const QString &sortString )
1285{ 1289{
1286 if ( sortString == mData->sortString ) return; 1290 if ( sortString == mData->sortString ) return;
1287 detach(); 1291 detach();
1288 mData->empty = false; 1292 mData->empty = false;
1289 mData->sortString = sortString; 1293 mData->sortString = sortString;
1290} 1294}
1291 1295
1292QString Addressee::sortString() const 1296QString Addressee::sortString() const
1293{ 1297{
1294 return mData->sortString; 1298 return mData->sortString;
1295} 1299}
1296 1300
1297QString Addressee::sortStringLabel() 1301QString Addressee::sortStringLabel()
1298{ 1302{
1299 return i18n("Sort String"); 1303 return i18n("Sort String");
1300} 1304}
1301 1305
1302 1306
1303void Addressee::setUrl( const KURL &url ) 1307void Addressee::setUrl( const KURL &url )
1304{ 1308{
1305 if ( url == mData->url ) return; 1309 if ( url == mData->url ) return;
1306 detach(); 1310 detach();
1307 mData->empty = false; 1311 mData->empty = false;
1308 mData->url = url; 1312 mData->url = url;
1309} 1313}
1310 1314
1311KURL Addressee::url() const 1315KURL Addressee::url() const
1312{ 1316{
1313 return mData->url; 1317 return mData->url;
1314} 1318}
1315 1319
1316QString Addressee::urlLabel() 1320QString Addressee::urlLabel()
1317{ 1321{
1318 return i18n("URL"); 1322 return i18n("URL");
1319} 1323}
1320 1324
1321 1325
1322void Addressee::setSecrecy( const Secrecy &secrecy ) 1326void Addressee::setSecrecy( const Secrecy &secrecy )
1323{ 1327{
1324 if ( secrecy == mData->secrecy ) return; 1328 if ( secrecy == mData->secrecy ) return;
1325 detach(); 1329 detach();
1326 mData->empty = false; 1330 mData->empty = false;
1327 mData->secrecy = secrecy; 1331 mData->secrecy = secrecy;
1328} 1332}
1329 1333
1330Secrecy Addressee::secrecy() const 1334Secrecy Addressee::secrecy() const
1331{ 1335{
1332 return mData->secrecy; 1336 return mData->secrecy;
1333} 1337}
1334 1338
1335QString Addressee::secrecyLabel() 1339QString Addressee::secrecyLabel()
1336{ 1340{
1337 return i18n("Security Class"); 1341 return i18n("Security Class");
1338} 1342}
1339 1343
1340 1344
1341void Addressee::setLogo( const Picture &logo ) 1345void Addressee::setLogo( const Picture &logo )
1342{ 1346{
1343 if ( logo == mData->logo ) return; 1347 if ( logo == mData->logo ) return;
1344 detach(); 1348 detach();
1345 mData->empty = false; 1349 mData->empty = false;
1346 mData->logo = logo; 1350 mData->logo = logo;
1347} 1351}
1348 1352
1349Picture Addressee::logo() const 1353Picture Addressee::logo() const
1350{ 1354{
1351 return mData->logo; 1355 return mData->logo;
1352} 1356}
1353 1357
1354QString Addressee::logoLabel() 1358QString Addressee::logoLabel()
1355{ 1359{
1356 return i18n("Logo"); 1360 return i18n("Logo");
1357} 1361}
1358 1362
1359 1363
1360void Addressee::setPhoto( const Picture &photo ) 1364void Addressee::setPhoto( const Picture &photo )
1361{ 1365{
1362 if ( photo == mData->photo ) return; 1366 if ( photo == mData->photo ) return;
1363 detach(); 1367 detach();
1364 mData->empty = false; 1368 mData->empty = false;
1365 mData->photo = photo; 1369 mData->photo = photo;
1366} 1370}
1367 1371
1368Picture Addressee::photo() const 1372Picture Addressee::photo() const
1369{ 1373{
1370 return mData->photo; 1374 return mData->photo;
1371} 1375}
1372 1376
1373QString Addressee::photoLabel() 1377QString Addressee::photoLabel()
1374{ 1378{
1375 return i18n("Photo"); 1379 return i18n("Photo");
1376} 1380}
1377 1381
1378 1382
1379void Addressee::setSound( const Sound &sound ) 1383void Addressee::setSound( const Sound &sound )
1380{ 1384{
1381 if ( sound == mData->sound ) return; 1385 if ( sound == mData->sound ) return;
1382 detach(); 1386 detach();
1383 mData->empty = false; 1387 mData->empty = false;
1384 mData->sound = sound; 1388 mData->sound = sound;
1385} 1389}
1386 1390
1387Sound Addressee::sound() const 1391Sound Addressee::sound() const
1388{ 1392{
1389 return mData->sound; 1393 return mData->sound;
1390} 1394}
1391 1395
1392QString Addressee::soundLabel() 1396QString Addressee::soundLabel()
1393{ 1397{
1394 return i18n("Sound"); 1398 return i18n("Sound");
1395} 1399}
1396 1400
1397 1401
1398void Addressee::setAgent( const Agent &agent ) 1402void Addressee::setAgent( const Agent &agent )
1399{ 1403{
1400 if ( agent == mData->agent ) return; 1404 if ( agent == mData->agent ) return;
1401 detach(); 1405 detach();
1402 mData->empty = false; 1406 mData->empty = false;
1403 mData->agent = agent; 1407 mData->agent = agent;
1404} 1408}
1405 1409
1406Agent Addressee::agent() const 1410Agent Addressee::agent() const
1407{ 1411{
1408 return mData->agent; 1412 return mData->agent;
1409} 1413}
1410 1414
1411QString Addressee::agentLabel() 1415QString Addressee::agentLabel()
1412{ 1416{
1413 return i18n("Agent"); 1417 return i18n("Agent");
1414} 1418}
1415 1419
1416 1420
1417 1421
1418void Addressee::setNameFromString( const QString &str ) 1422void Addressee::setNameFromString( const QString &str )
1419{ 1423{
1420 setFormattedName( str ); 1424 setFormattedName( str );
1421 setName( str ); 1425 setName( str );
1422 1426
1423 static bool first = true; 1427 static bool first = true;
1424 static QStringList titles; 1428 static QStringList titles;
1425 static QStringList suffixes; 1429 static QStringList suffixes;
1426 static QStringList prefixes; 1430 static QStringList prefixes;
1427 1431
1428 if ( first ) { 1432 if ( first ) {
1429 first = false; 1433 first = false;
1430 titles += i18n( "Dr." ); 1434 titles += i18n( "Dr." );
1431 titles += i18n( "Miss" ); 1435 titles += i18n( "Miss" );
1432 titles += i18n( "Mr." ); 1436 titles += i18n( "Mr." );
1433 titles += i18n( "Mrs." ); 1437 titles += i18n( "Mrs." );
1434 titles += i18n( "Ms." ); 1438 titles += i18n( "Ms." );
1435 titles += i18n( "Prof." ); 1439 titles += i18n( "Prof." );
1436 1440
1437 suffixes += i18n( "I" ); 1441 suffixes += i18n( "I" );
1438 suffixes += i18n( "II" ); 1442 suffixes += i18n( "II" );
1439 suffixes += i18n( "III" ); 1443 suffixes += i18n( "III" );
1440 suffixes += i18n( "Jr." ); 1444 suffixes += i18n( "Jr." );
1441 suffixes += i18n( "Sr." ); 1445 suffixes += i18n( "Sr." );
1442 1446
1443 prefixes += "van"; 1447 prefixes += "van";
1444 prefixes += "von"; 1448 prefixes += "von";
1445 prefixes += "de"; 1449 prefixes += "de";
1446 1450
1447 KConfig config( locateLocal( "config", "kabcrc") ); 1451 KConfig config( locateLocal( "config", "kabcrc") );
1448 config.setGroup( "General" ); 1452 config.setGroup( "General" );
1449 titles += config.readListEntry( "Prefixes" ); 1453 titles += config.readListEntry( "Prefixes" );
1450 titles.remove( "" ); 1454 titles.remove( "" );
1451 prefixes += config.readListEntry( "Inclusions" ); 1455 prefixes += config.readListEntry( "Inclusions" );
1452 prefixes.remove( "" ); 1456 prefixes.remove( "" );
1453 suffixes += config.readListEntry( "Suffixes" ); 1457 suffixes += config.readListEntry( "Suffixes" );
1454 suffixes.remove( "" ); 1458 suffixes.remove( "" );
1455 } 1459 }
1456 1460
1457 // clear all name parts 1461 // clear all name parts
1458 setPrefix( "" ); 1462 setPrefix( "" );
1459 setGivenName( "" ); 1463 setGivenName( "" );
1460 setAdditionalName( "" ); 1464 setAdditionalName( "" );
1461 setFamilyName( "" ); 1465 setFamilyName( "" );
1462 setSuffix( "" ); 1466 setSuffix( "" );
1463 1467
1464 if ( str.isEmpty() ) 1468 if ( str.isEmpty() )
1465 return; 1469 return;
1466 1470
1467 int i = str.find(','); 1471 int i = str.find(',');
1468 if( i < 0 ) { 1472 if( i < 0 ) {
1469 QStringList parts = QStringList::split( " ", str ); 1473 QStringList parts = QStringList::split( " ", str );
1470 int leftOffset = 0; 1474 int leftOffset = 0;
1471 int rightOffset = parts.count() - 1; 1475 int rightOffset = parts.count() - 1;
1472 1476
1473 QString suffix; 1477 QString suffix;
1474 while ( rightOffset >= 0 ) { 1478 while ( rightOffset >= 0 ) {
1475 if ( suffixes.contains( parts[ rightOffset ] ) ) { 1479 if ( suffixes.contains( parts[ rightOffset ] ) ) {
1476 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " ")); 1480 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " "));
1477 rightOffset--; 1481 rightOffset--;
1478 } else 1482 } else
1479 break; 1483 break;
1480 } 1484 }
1481 setSuffix( suffix ); 1485 setSuffix( suffix );
1482 1486
1483 if ( rightOffset < 0 ) 1487 if ( rightOffset < 0 )
1484 return; 1488 return;
1485 1489
1486 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) { 1490 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) {
1487 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] ); 1491 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] );
1488 rightOffset--; 1492 rightOffset--;
1489 } else 1493 } else
1490 setFamilyName( parts[ rightOffset ] ); 1494 setFamilyName( parts[ rightOffset ] );
1491 1495
1492 QString prefix; 1496 QString prefix;
1493 while ( leftOffset < rightOffset ) { 1497 while ( leftOffset < rightOffset ) {
1494 if ( titles.contains( parts[ leftOffset ] ) ) { 1498 if ( titles.contains( parts[ leftOffset ] ) ) {
1495 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1499 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1496 leftOffset++; 1500 leftOffset++;
1497 } else 1501 } else
1498 break; 1502 break;
1499 } 1503 }
1500 setPrefix( prefix ); 1504 setPrefix( prefix );
1501 1505
1502 if ( leftOffset < rightOffset ) { 1506 if ( leftOffset < rightOffset ) {
1503 setGivenName( parts[ leftOffset ] ); 1507 setGivenName( parts[ leftOffset ] );
1504 leftOffset++; 1508 leftOffset++;
1505 } 1509 }
1506 1510
1507 QString additionalName; 1511 QString additionalName;
1508 while ( leftOffset < rightOffset ) { 1512 while ( leftOffset < rightOffset ) {
1509 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1513 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1510 leftOffset++; 1514 leftOffset++;
1511 } 1515 }
1512 setAdditionalName( additionalName ); 1516 setAdditionalName( additionalName );
1513 } else { 1517 } else {
1514 QString part1 = str.left( i ); 1518 QString part1 = str.left( i );
1515 QString part2 = str.mid( i + 1 ); 1519 QString part2 = str.mid( i + 1 );
1516 1520
1517 QStringList parts = QStringList::split( " ", part1 ); 1521 QStringList parts = QStringList::split( " ", part1 );
1518 int leftOffset = 0; 1522 int leftOffset = 0;
1519 int rightOffset = parts.count() - 1; 1523 int rightOffset = parts.count() - 1;
1520 1524
1521 QString suffix; 1525 QString suffix;
1522 while ( rightOffset >= 0 ) { 1526 while ( rightOffset >= 0 ) {
1523 if ( suffixes.contains( parts[ rightOffset ] ) ) { 1527 if ( suffixes.contains( parts[ rightOffset ] ) ) {
1524 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " ")); 1528 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " "));
1525 rightOffset--; 1529 rightOffset--;
1526 } else 1530 } else
1527 break; 1531 break;
1528 } 1532 }
1529 setSuffix( suffix ); 1533 setSuffix( suffix );
1530 1534
1531 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) { 1535 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) {
1532 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] ); 1536 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] );
1533 rightOffset--; 1537 rightOffset--;
1534 } else 1538 } else
1535 setFamilyName( parts[ rightOffset ] ); 1539 setFamilyName( parts[ rightOffset ] );
1536 1540
1537 QString prefix; 1541 QString prefix;
1538 while ( leftOffset < rightOffset ) { 1542 while ( leftOffset < rightOffset ) {
1539 if ( titles.contains( parts[ leftOffset ] ) ) { 1543 if ( titles.contains( parts[ leftOffset ] ) ) {
1540 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1544 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1541 leftOffset++; 1545 leftOffset++;
1542 } else 1546 } else
1543 break; 1547 break;
1544 } 1548 }
1545 1549
1546 parts = QStringList::split( " ", part2 ); 1550 parts = QStringList::split( " ", part2 );
1547 1551
1548 leftOffset = 0; 1552 leftOffset = 0;
1549 rightOffset = parts.count(); 1553 rightOffset = parts.count();
1550 1554
1551 while ( leftOffset < rightOffset ) { 1555 while ( leftOffset < rightOffset ) {
1552 if ( titles.contains( parts[ leftOffset ] ) ) { 1556 if ( titles.contains( parts[ leftOffset ] ) ) {
1553 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1557 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1554 leftOffset++; 1558 leftOffset++;
1555 } else 1559 } else
1556 break; 1560 break;
1557 } 1561 }
1558 setPrefix( prefix ); 1562 setPrefix( prefix );
1559 1563
1560 if ( leftOffset < rightOffset ) { 1564 if ( leftOffset < rightOffset ) {
1561 setGivenName( parts[ leftOffset ] ); 1565 setGivenName( parts[ leftOffset ] );
1562 leftOffset++; 1566 leftOffset++;
1563 } 1567 }
1564 1568
1565 QString additionalName; 1569 QString additionalName;
1566 while ( leftOffset < rightOffset ) { 1570 while ( leftOffset < rightOffset ) {
1567 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1571 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1568 leftOffset++; 1572 leftOffset++;
1569 } 1573 }
1570 setAdditionalName( additionalName ); 1574 setAdditionalName( additionalName );
1571 } 1575 }
1572} 1576}
1573 1577
1574QString Addressee::realName() const 1578QString Addressee::realName() const
1575{ 1579{
1576 if ( !formattedName().isEmpty() ) 1580 if ( !formattedName().isEmpty() )
1577 return formattedName(); 1581 return formattedName();
1578 1582
1579 QString n = assembledName(); 1583 QString n = assembledName();
1580 1584
1581 if ( n.isEmpty() ) 1585 if ( n.isEmpty() )
1582 n = name(); 1586 n = name();
1583 if ( n.isEmpty() ) 1587 if ( n.isEmpty() )
1584 n = organization(); 1588 n = organization();
1585 return n; 1589 return n;
1586} 1590}
1587 1591
1588QString Addressee::assembledName() const 1592QString Addressee::assembledName() const
1589{ 1593{
1590 QString name = prefix() + " " + givenName() + " " + additionalName() + " " + 1594 QString name = prefix() + " " + givenName() + " " + additionalName() + " " +
1591 familyName() + " " + suffix(); 1595 familyName() + " " + suffix();
1592 1596
1593 return name.simplifyWhiteSpace(); 1597 return name.simplifyWhiteSpace();
1594} 1598}
1595 1599
1596QString Addressee::fullEmail( const QString &email ) const 1600QString Addressee::fullEmail( const QString &email ) const
1597{ 1601{
1598 QString e; 1602 QString e;
1599 if ( email.isNull() ) { 1603 if ( email.isNull() ) {
1600 e = preferredEmail(); 1604 e = preferredEmail();
1601 } else { 1605 } else {
1602 e = email; 1606 e = email;
1603 } 1607 }
1604 if ( e.isEmpty() ) return QString::null; 1608 if ( e.isEmpty() ) return QString::null;
1605 1609
1606 QString text; 1610 QString text;
1607 if ( realName().isEmpty() ) 1611 if ( realName().isEmpty() )
1608 text = e; 1612 text = e;
1609 else 1613 else
1610 text = assembledName() + " <" + e + ">"; 1614 text = assembledName() + " <" + e + ">";
1611 1615
1612 return text; 1616 return text;
1613} 1617}
1614 1618
1615void Addressee::insertEmail( const QString &email, bool preferred ) 1619void Addressee::insertEmail( const QString &email, bool preferred )
1616{ 1620{
1617 detach(); 1621 detach();
1618 1622
1619 QStringList::Iterator it = mData->emails.find( email ); 1623 QStringList::Iterator it = mData->emails.find( email );
1620 1624
1621 if ( it != mData->emails.end() ) { 1625 if ( it != mData->emails.end() ) {
1622 if ( !preferred || it == mData->emails.begin() ) return; 1626 if ( !preferred || it == mData->emails.begin() ) return;
1623 mData->emails.remove( it ); 1627 mData->emails.remove( it );
1624 mData->emails.prepend( email ); 1628 mData->emails.prepend( email );
1625 } else { 1629 } else {
1626 if ( preferred ) { 1630 if ( preferred ) {
1627 mData->emails.prepend( email ); 1631 mData->emails.prepend( email );
1628 } else { 1632 } else {
1629 mData->emails.append( email ); 1633 mData->emails.append( email );
1630 } 1634 }
1631 } 1635 }
1632} 1636}
1633 1637
1634void Addressee::removeEmail( const QString &email ) 1638void Addressee::removeEmail( const QString &email )
1635{ 1639{
1636 detach(); 1640 detach();
1637 1641
1638 QStringList::Iterator it = mData->emails.find( email ); 1642 QStringList::Iterator it = mData->emails.find( email );
1639 if ( it == mData->emails.end() ) return; 1643 if ( it == mData->emails.end() ) return;
1640 1644
1641 mData->emails.remove( it ); 1645 mData->emails.remove( it );
1642} 1646}
1643 1647
1644QString Addressee::preferredEmail() const 1648QString Addressee::preferredEmail() const
1645{ 1649{
1646 if ( mData->emails.count() == 0 ) return QString::null; 1650 if ( mData->emails.count() == 0 ) return QString::null;
1647 else return mData->emails.first(); 1651 else return mData->emails.first();
1648} 1652}
1649 1653
1650QStringList Addressee::emails() const 1654QStringList Addressee::emails() const
1651{ 1655{
1652 return mData->emails; 1656 return mData->emails;
1653} 1657}
1654void Addressee::setEmails( const QStringList& emails ) { 1658void Addressee::setEmails( const QStringList& emails ) {
1655 detach(); 1659 detach();
1656 mData->emails = emails; 1660 mData->emails = emails;
1657} 1661}
1658void Addressee::insertPhoneNumber( const PhoneNumber &phoneNumber ) 1662void Addressee::insertPhoneNumber( const PhoneNumber &phoneNumber )
1659{ 1663{
1660 detach(); 1664 detach();
1661 mData->empty = false; 1665 mData->empty = false;
1662 1666
1663 PhoneNumber::List::Iterator it; 1667 PhoneNumber::List::Iterator it;
1664 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1668 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1665 if ( (*it).id() == phoneNumber.id() ) { 1669 if ( (*it).id() == phoneNumber.id() ) {
1666 *it = phoneNumber; 1670 *it = phoneNumber;
1667 return; 1671 return;
1668 } 1672 }
1669 } 1673 }
1670 mData->phoneNumbers.append( phoneNumber ); 1674 mData->phoneNumbers.append( phoneNumber );
1671} 1675}
1672 1676
1673void Addressee::removePhoneNumber( const PhoneNumber &phoneNumber ) 1677void Addressee::removePhoneNumber( const PhoneNumber &phoneNumber )
1674{ 1678{
1675 detach(); 1679 detach();
1676 1680
1677 PhoneNumber::List::Iterator it; 1681 PhoneNumber::List::Iterator it;
1678 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1682 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1679 if ( (*it).id() == phoneNumber.id() ) { 1683 if ( (*it).id() == phoneNumber.id() ) {
1680 mData->phoneNumbers.remove( it ); 1684 mData->phoneNumbers.remove( it );
1681 return; 1685 return;
1682 } 1686 }
1683 } 1687 }
1684} 1688}
1685 1689
1686PhoneNumber Addressee::phoneNumber( int type ) const 1690PhoneNumber Addressee::phoneNumber( int type ) const
1687{ 1691{
1688 PhoneNumber phoneNumber( "", type ); 1692 PhoneNumber phoneNumber( "", type );
1689 PhoneNumber::List::ConstIterator it; 1693 PhoneNumber::List::ConstIterator it;
1690 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1694 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1691 if ( matchBinaryPatternP( (*it).type(), type ) ) { 1695 if ( matchBinaryPatternP( (*it).type(), type ) ) {
1692 if ( (*it).type() & PhoneNumber::Pref ) 1696 if ( (*it).type() & PhoneNumber::Pref )
1693 return (*it); 1697 return (*it);
1694 else if ( phoneNumber.number().isEmpty() ) 1698 else if ( phoneNumber.number().isEmpty() )
1695 phoneNumber = (*it); 1699 phoneNumber = (*it);
1696 } 1700 }
1697 } 1701 }
1698 1702
1699 return phoneNumber; 1703 return phoneNumber;
1700} 1704}
1701 1705
1702PhoneNumber::List Addressee::phoneNumbers() const 1706PhoneNumber::List Addressee::phoneNumbers() const
1703{ 1707{
1704 return mData->phoneNumbers; 1708 return mData->phoneNumbers;
1705} 1709}
1706 1710
1707int Addressee::hasPhoneNumberType( int type ) 1711int Addressee::hasPhoneNumberType( int type )
1708{ 1712{
1709 int retval = 0; 1713 int retval = 0;
1710 PhoneNumber::List::ConstIterator it; 1714 PhoneNumber::List::ConstIterator it;
1711 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1715 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1712 if ( (*it).type() == type ) 1716 if ( (*it).type() == type )
1713 ++retval; 1717 ++retval;
1714 } 1718 }
1715 return retval; 1719 return retval;
1716} 1720}
1717PhoneNumber::List Addressee::phoneNumbers( int type ) const 1721PhoneNumber::List Addressee::phoneNumbers( int type ) const
1718{ 1722{
1719 PhoneNumber::List list; 1723 PhoneNumber::List list;
1720 1724
1721 PhoneNumber::List::ConstIterator it; 1725 PhoneNumber::List::ConstIterator it;
1722 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1726 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1723 if ( matchBinaryPattern( (*it).type(), type ) ) { 1727 if ( matchBinaryPattern( (*it).type(), type ) ) {
1724 list.append( *it ); 1728 list.append( *it );
1725 } 1729 }
1726 } 1730 }
1727 return list; 1731 return list;
1728} 1732}
1729 1733
1730PhoneNumber Addressee::findPhoneNumber( const QString &id ) const 1734PhoneNumber Addressee::findPhoneNumber( const QString &id ) const
1731{ 1735{
1732 PhoneNumber::List::ConstIterator it; 1736 PhoneNumber::List::ConstIterator it;
1733 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1737 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1734 if ( (*it).id() == id ) { 1738 if ( (*it).id() == id ) {
1735 return *it; 1739 return *it;
1736 } 1740 }
1737 } 1741 }
1738 return PhoneNumber(); 1742 return PhoneNumber();
1739} 1743}
1740 1744
1741void Addressee::insertKey( const Key &key ) 1745void Addressee::insertKey( const Key &key )
1742{ 1746{
1743 detach(); 1747 detach();
1744 mData->empty = false; 1748 mData->empty = false;
1745 1749
1746 Key::List::Iterator it; 1750 Key::List::Iterator it;
1747 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1751 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1748 if ( (*it).id() == key.id() ) { 1752 if ( (*it).id() == key.id() ) {
1749 *it = key; 1753 *it = key;
1750 return; 1754 return;
1751 } 1755 }
1752 } 1756 }
1753 mData->keys.append( key ); 1757 mData->keys.append( key );
1754} 1758}
1755 1759
1756void Addressee::removeKey( const Key &key ) 1760void Addressee::removeKey( const Key &key )
1757{ 1761{
1758 detach(); 1762 detach();
1759 1763
1760 Key::List::Iterator it; 1764 Key::List::Iterator it;
1761 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1765 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1762 if ( (*it).id() == key.id() ) { 1766 if ( (*it).id() == key.id() ) {
1763 mData->keys.remove( key ); 1767 mData->keys.remove( key );
1764 return; 1768 return;
1765 } 1769 }
1766 } 1770 }
1767} 1771}
1768 1772
1769Key Addressee::key( int type, QString customTypeString ) const 1773Key Addressee::key( int type, QString customTypeString ) const
1770{ 1774{
1771 Key::List::ConstIterator it; 1775 Key::List::ConstIterator it;
1772 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1776 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1773 if ( (*it).type() == type ) { 1777 if ( (*it).type() == type ) {
1774 if ( type == Key::Custom ) { 1778 if ( type == Key::Custom ) {
1775 if ( customTypeString.isEmpty() ) { 1779 if ( customTypeString.isEmpty() ) {
1776 return *it; 1780 return *it;
1777 } else { 1781 } else {
1778 if ( (*it).customTypeString() == customTypeString ) 1782 if ( (*it).customTypeString() == customTypeString )
1779 return (*it); 1783 return (*it);
1780 } 1784 }
1781 } else { 1785 } else {
1782 return *it; 1786 return *it;
1783 } 1787 }
1784 } 1788 }
1785 } 1789 }
1786 return Key( QString(), type ); 1790 return Key( QString(), type );
1787} 1791}
1788void Addressee::setKeys( const Key::List& list ) { 1792void Addressee::setKeys( const Key::List& list ) {
1789 detach(); 1793 detach();
1790 mData->keys = list; 1794 mData->keys = list;
1791} 1795}
1792 1796
1793Key::List Addressee::keys() const 1797Key::List Addressee::keys() const
1794{ 1798{
1795 return mData->keys; 1799 return mData->keys;
1796} 1800}
1797 1801
1798Key::List Addressee::keys( int type, QString customTypeString ) const 1802Key::List Addressee::keys( int type, QString customTypeString ) const
1799{ 1803{
1800 Key::List list; 1804 Key::List list;
1801 1805
1802 Key::List::ConstIterator it; 1806 Key::List::ConstIterator it;
1803 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1807 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1804 if ( (*it).type() == type ) { 1808 if ( (*it).type() == type ) {
1805 if ( type == Key::Custom ) { 1809 if ( type == Key::Custom ) {
1806 if ( customTypeString.isEmpty() ) { 1810 if ( customTypeString.isEmpty() ) {
1807 list.append(*it); 1811 list.append(*it);
1808 } else { 1812 } else {
1809 if ( (*it).customTypeString() == customTypeString ) 1813 if ( (*it).customTypeString() == customTypeString )
1810 list.append(*it); 1814 list.append(*it);
1811 } 1815 }
1812 } else { 1816 } else {
1813 list.append(*it); 1817 list.append(*it);
1814 } 1818 }
1815 } 1819 }
1816 } 1820 }
1817 return list; 1821 return list;
1818} 1822}
1819 1823
1820Key Addressee::findKey( const QString &id ) const 1824Key Addressee::findKey( const QString &id ) const
1821{ 1825{
1822 Key::List::ConstIterator it; 1826 Key::List::ConstIterator it;
1823 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1827 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1824 if ( (*it).id() == id ) { 1828 if ( (*it).id() == id ) {
1825 return *it; 1829 return *it;
1826 } 1830 }
1827 } 1831 }
1828 return Key(); 1832 return Key();
1829} 1833}
1830 1834
1831QString Addressee::asString() const 1835QString Addressee::asString() const
1832{ 1836{
1833 return "Smith, agent Smith..."; 1837 return "Smith, agent Smith...";
1834} 1838}
1835 1839
1836void Addressee::dump() const 1840void Addressee::dump() const
1837{ 1841{
1838 return; 1842 return;
1839#if 0 1843#if 0
1840 kdDebug(5700) << "Addressee {" << endl; 1844 kdDebug(5700) << "Addressee {" << endl;
1841 1845
1842 kdDebug(5700) << " Uid: '" << uid() << "'" << endl; 1846 kdDebug(5700) << " Uid: '" << uid() << "'" << endl;
1843 1847
1844 kdDebug(5700) << " Name: '" << name() << "'" << endl; 1848 kdDebug(5700) << " Name: '" << name() << "'" << endl;
1845 kdDebug(5700) << " FormattedName: '" << formattedName() << "'" << endl; 1849 kdDebug(5700) << " FormattedName: '" << formattedName() << "'" << endl;
1846 kdDebug(5700) << " FamilyName: '" << familyName() << "'" << endl; 1850 kdDebug(5700) << " FamilyName: '" << familyName() << "'" << endl;
1847 kdDebug(5700) << " GivenName: '" << givenName() << "'" << endl; 1851 kdDebug(5700) << " GivenName: '" << givenName() << "'" << endl;
1848 kdDebug(5700) << " AdditionalName: '" << additionalName() << "'" << endl; 1852 kdDebug(5700) << " AdditionalName: '" << additionalName() << "'" << endl;
1849 kdDebug(5700) << " Prefix: '" << prefix() << "'" << endl; 1853 kdDebug(5700) << " Prefix: '" << prefix() << "'" << endl;
1850 kdDebug(5700) << " Suffix: '" << suffix() << "'" << endl; 1854 kdDebug(5700) << " Suffix: '" << suffix() << "'" << endl;
1851 kdDebug(5700) << " NickName: '" << nickName() << "'" << endl; 1855 kdDebug(5700) << " NickName: '" << nickName() << "'" << endl;
1852 kdDebug(5700) << " Birthday: '" << birthday().toString() << "'" << endl; 1856 kdDebug(5700) << " Birthday: '" << birthday().toString() << "'" << endl;
1853 kdDebug(5700) << " Mailer: '" << mailer() << "'" << endl; 1857 kdDebug(5700) << " Mailer: '" << mailer() << "'" << endl;
1854 kdDebug(5700) << " TimeZone: '" << timeZone().asString() << "'" << endl; 1858 kdDebug(5700) << " TimeZone: '" << timeZone().asString() << "'" << endl;
1855 kdDebug(5700) << " Geo: '" << geo().asString() << "'" << endl; 1859 kdDebug(5700) << " Geo: '" << geo().asString() << "'" << endl;
1856 kdDebug(5700) << " Title: '" << title() << "'" << endl; 1860 kdDebug(5700) << " Title: '" << title() << "'" << endl;
1857 kdDebug(5700) << " Role: '" << role() << "'" << endl; 1861 kdDebug(5700) << " Role: '" << role() << "'" << endl;
1858 kdDebug(5700) << " Organization: '" << organization() << "'" << endl; 1862 kdDebug(5700) << " Organization: '" << organization() << "'" << endl;
1859 kdDebug(5700) << " Note: '" << note() << "'" << endl; 1863 kdDebug(5700) << " Note: '" << note() << "'" << endl;
1860 kdDebug(5700) << " ProductId: '" << productId() << "'" << endl; 1864 kdDebug(5700) << " ProductId: '" << productId() << "'" << endl;
1861 kdDebug(5700) << " Revision: '" << revision().toString() << "'" << endl; 1865 kdDebug(5700) << " Revision: '" << revision().toString() << "'" << endl;
1862 kdDebug(5700) << " SortString: '" << sortString() << "'" << endl; 1866 kdDebug(5700) << " SortString: '" << sortString() << "'" << endl;
1863 kdDebug(5700) << " Url: '" << url().url() << "'" << endl; 1867 kdDebug(5700) << " Url: '" << url().url() << "'" << endl;
1864 kdDebug(5700) << " Secrecy: '" << secrecy().asString() << "'" << endl; 1868 kdDebug(5700) << " Secrecy: '" << secrecy().asString() << "'" << endl;
1865 kdDebug(5700) << " Logo: '" << logo().asString() << "'" << endl; 1869 kdDebug(5700) << " Logo: '" << logo().asString() << "'" << endl;
1866 kdDebug(5700) << " Photo: '" << photo().asString() << "'" << endl; 1870 kdDebug(5700) << " Photo: '" << photo().asString() << "'" << endl;
1867 kdDebug(5700) << " Sound: '" << sound().asString() << "'" << endl; 1871 kdDebug(5700) << " Sound: '" << sound().asString() << "'" << endl;
1868 kdDebug(5700) << " Agent: '" << agent().asString() << "'" << endl; 1872 kdDebug(5700) << " Agent: '" << agent().asString() << "'" << endl;
1869 1873
1870 kdDebug(5700) << " Emails {" << endl; 1874 kdDebug(5700) << " Emails {" << endl;
1871 QStringList e = emails(); 1875 QStringList e = emails();
1872 QStringList::ConstIterator it; 1876 QStringList::ConstIterator it;
1873 for( it = e.begin(); it != e.end(); ++it ) { 1877 for( it = e.begin(); it != e.end(); ++it ) {
1874 kdDebug(5700) << " " << (*it) << endl; 1878 kdDebug(5700) << " " << (*it) << endl;
1875 } 1879 }
1876 kdDebug(5700) << " }" << endl; 1880 kdDebug(5700) << " }" << endl;
1877 1881
1878 kdDebug(5700) << " PhoneNumbers {" << endl; 1882 kdDebug(5700) << " PhoneNumbers {" << endl;
1879 PhoneNumber::List p = phoneNumbers(); 1883 PhoneNumber::List p = phoneNumbers();
1880 PhoneNumber::List::ConstIterator it2; 1884 PhoneNumber::List::ConstIterator it2;
1881 for( it2 = p.begin(); it2 != p.end(); ++it2 ) { 1885 for( it2 = p.begin(); it2 != p.end(); ++it2 ) {
1882 kdDebug(5700) << " Type: " << int((*it2).type()) << " Number: " << (*it2).number() << endl; 1886 kdDebug(5700) << " Type: " << int((*it2).type()) << " Number: " << (*it2).number() << endl;
1883 } 1887 }
1884 kdDebug(5700) << " }" << endl; 1888 kdDebug(5700) << " }" << endl;
1885 1889
1886 Address::List a = addresses(); 1890 Address::List a = addresses();
1887 Address::List::ConstIterator it3; 1891 Address::List::ConstIterator it3;
1888 for( it3 = a.begin(); it3 != a.end(); ++it3 ) { 1892 for( it3 = a.begin(); it3 != a.end(); ++it3 ) {
1889 (*it3).dump(); 1893 (*it3).dump();
1890 } 1894 }
1891 1895
1892 kdDebug(5700) << " Keys {" << endl; 1896 kdDebug(5700) << " Keys {" << endl;
1893 Key::List k = keys(); 1897 Key::List k = keys();
1894 Key::List::ConstIterator it4; 1898 Key::List::ConstIterator it4;
1895 for( it4 = k.begin(); it4 != k.end(); ++it4 ) { 1899 for( it4 = k.begin(); it4 != k.end(); ++it4 ) {
1896 kdDebug(5700) << " Type: " << int((*it4).type()) << 1900 kdDebug(5700) << " Type: " << int((*it4).type()) <<
1897 " Key: " << (*it4).textData() << 1901 " Key: " << (*it4).textData() <<
1898 " CustomString: " << (*it4).customTypeString() << endl; 1902 " CustomString: " << (*it4).customTypeString() << endl;
1899 } 1903 }
1900 kdDebug(5700) << " }" << endl; 1904 kdDebug(5700) << " }" << endl;
1901 1905
1902 kdDebug(5700) << "}" << endl; 1906 kdDebug(5700) << "}" << endl;
1903#endif 1907#endif
1904} 1908}
1905 1909
1906 1910
1907void Addressee::insertAddress( const Address &address ) 1911void Addressee::insertAddress( const Address &address )
1908{ 1912{
1909 detach(); 1913 detach();
1910 mData->empty = false; 1914 mData->empty = false;
1911 1915
1912 Address::List::Iterator it; 1916 Address::List::Iterator it;
1913 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1917 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1914 if ( (*it).id() == address.id() ) { 1918 if ( (*it).id() == address.id() ) {
1915 *it = address; 1919 *it = address;
1916 return; 1920 return;
1917 } 1921 }
1918 } 1922 }
1919 mData->addresses.append( address ); 1923 mData->addresses.append( address );
1920} 1924}
1921 1925
1922void Addressee::removeAddress( const Address &address ) 1926void Addressee::removeAddress( const Address &address )
1923{ 1927{
1924 detach(); 1928 detach();
1925 1929
1926 Address::List::Iterator it; 1930 Address::List::Iterator it;
1927 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1931 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1928 if ( (*it).id() == address.id() ) { 1932 if ( (*it).id() == address.id() ) {
1929 mData->addresses.remove( it ); 1933 mData->addresses.remove( it );
1930 return; 1934 return;
1931 } 1935 }
1932 } 1936 }
1933} 1937}
1934 1938
1935Address Addressee::address( int type ) const 1939Address Addressee::address( int type ) const
1936{ 1940{
1937 Address address( type ); 1941 Address address( type );
1938 Address::List::ConstIterator it; 1942 Address::List::ConstIterator it;
1939 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1943 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1940 if ( matchBinaryPatternA( (*it).type(), type ) ) { 1944 if ( matchBinaryPatternA( (*it).type(), type ) ) {
1941 if ( (*it).type() & Address::Pref ) 1945 if ( (*it).type() & Address::Pref )
1942 return (*it); 1946 return (*it);
1943 else if ( address.isEmpty() ) 1947 else if ( address.isEmpty() )
1944 address = (*it); 1948 address = (*it);
1945 } 1949 }
1946 } 1950 }
1947 1951
1948 return address; 1952 return address;
1949} 1953}
1950 1954
1951Address::List Addressee::addresses() const 1955Address::List Addressee::addresses() const
1952{ 1956{
1953 return mData->addresses; 1957 return mData->addresses;
1954} 1958}
1955 1959
1956Address::List Addressee::addresses( int type ) const 1960Address::List Addressee::addresses( int type ) const
1957{ 1961{
1958 Address::List list; 1962 Address::List list;
1959 1963
1960 Address::List::ConstIterator it; 1964 Address::List::ConstIterator it;
1961 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1965 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1962 if ( matchBinaryPattern( (*it).type(), type ) ) { 1966 if ( matchBinaryPattern( (*it).type(), type ) ) {
1963 list.append( *it ); 1967 list.append( *it );
1964 } 1968 }
1965 } 1969 }
1966 1970
1967 return list; 1971 return list;
1968} 1972}
1969 1973
1970Address Addressee::findAddress( const QString &id ) const 1974Address Addressee::findAddress( const QString &id ) const
1971{ 1975{
1972 Address::List::ConstIterator it; 1976 Address::List::ConstIterator it;
1973 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1977 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1974 if ( (*it).id() == id ) { 1978 if ( (*it).id() == id ) {
1975 return *it; 1979 return *it;
1976 } 1980 }
1977 } 1981 }
1978 return Address(); 1982 return Address();
1979} 1983}
1980 1984
1981void Addressee::insertCategory( const QString &c ) 1985void Addressee::insertCategory( const QString &c )
1982{ 1986{
1983 detach(); 1987 detach();
1984 mData->empty = false; 1988 mData->empty = false;
1985 1989
1986 if ( mData->categories.contains( c ) ) return; 1990 if ( mData->categories.contains( c ) ) return;
1987 1991
1988 mData->categories.append( c ); 1992 mData->categories.append( c );
1989} 1993}
1990 1994
1991void Addressee::removeCategory( const QString &c ) 1995void Addressee::removeCategory( const QString &c )
1992{ 1996{
1993 detach(); 1997 detach();
1994 1998
1995 QStringList::Iterator it = mData->categories.find( c ); 1999 QStringList::Iterator it = mData->categories.find( c );
1996 if ( it == mData->categories.end() ) return; 2000 if ( it == mData->categories.end() ) return;
1997 2001
1998 mData->categories.remove( it ); 2002 mData->categories.remove( it );
1999} 2003}
2000 2004
2001bool Addressee::hasCategory( const QString &c ) const 2005bool Addressee::hasCategory( const QString &c ) const
2002{ 2006{
2003 return ( mData->categories.contains( c ) ); 2007 return ( mData->categories.contains( c ) );
2004} 2008}
2005 2009
2006void Addressee::setCategories( const QStringList &c ) 2010void Addressee::setCategories( const QStringList &c )
2007{ 2011{
2008 detach(); 2012 detach();
2009 mData->empty = false; 2013 mData->empty = false;
2010 2014
2011 mData->categories = c; 2015 mData->categories = c;
2012} 2016}
2013 2017
2014QStringList Addressee::categories() const 2018QStringList Addressee::categories() const
2015{ 2019{
2016 return mData->categories; 2020 return mData->categories;
2017} 2021}
2018 2022
2019void Addressee::insertCustom( const QString &app, const QString &name, 2023void Addressee::insertCustom( const QString &app, const QString &name,
2020 const QString &value ) 2024 const QString &value )
2021{ 2025{
2022 if ( value.isNull() || name.isEmpty() || app.isEmpty() ) return; 2026 if ( value.isNull() || name.isEmpty() || app.isEmpty() ) return;
2023 2027
2024 detach(); 2028 detach();
2025 mData->empty = false; 2029 mData->empty = false;
2026 2030
2027 QString qualifiedName = app + "-" + name + ":"; 2031 QString qualifiedName = app + "-" + name + ":";
2028 2032
2029 QStringList::Iterator it; 2033 QStringList::Iterator it;
2030 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) { 2034 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
2031 if ( (*it).startsWith( qualifiedName ) ) { 2035 if ( (*it).startsWith( qualifiedName ) ) {
2032 (*it) = qualifiedName + value; 2036 (*it) = qualifiedName + value;
2033 return; 2037 return;
2034 } 2038 }
2035 } 2039 }
2036 mData->custom.append( qualifiedName + value ); 2040 mData->custom.append( qualifiedName + value );
2037} 2041}
2038 2042
2039void Addressee::removeCustom( const QString &app, const QString &name) 2043void Addressee::removeCustom( const QString &app, const QString &name)
2040{ 2044{
2041 detach(); 2045 detach();
2042 2046
2043 QString qualifiedName = app + "-" + name + ":"; 2047 QString qualifiedName = app + "-" + name + ":";
2044 2048
2045 QStringList::Iterator it; 2049 QStringList::Iterator it;
2046 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) { 2050 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
2047 if ( (*it).startsWith( qualifiedName ) ) { 2051 if ( (*it).startsWith( qualifiedName ) ) {
2048 mData->custom.remove( it ); 2052 mData->custom.remove( it );
2049 return; 2053 return;
2050 } 2054 }
2051 } 2055 }
2052} 2056}
2053 2057
2054QString Addressee::custom( const QString &app, const QString &name ) const 2058QString Addressee::custom( const QString &app, const QString &name ) const
2055{ 2059{
2056 QString qualifiedName = app + "-" + name + ":"; 2060 QString qualifiedName = app + "-" + name + ":";
2057 QString value; 2061 QString value;
2058 2062
2059 QStringList::ConstIterator it; 2063 QStringList::ConstIterator it;
2060 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) { 2064 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
2061 if ( (*it).startsWith( qualifiedName ) ) { 2065 if ( (*it).startsWith( qualifiedName ) ) {
2062 value = (*it).mid( (*it).find( ":" ) + 1 ); 2066 value = (*it).mid( (*it).find( ":" ) + 1 );
2063 break; 2067 break;
2064 } 2068 }
2065 } 2069 }
2066 2070
2067 return value; 2071 return value;
2068} 2072}
2069 2073
2070void Addressee::setCustoms( const QStringList &l ) 2074void Addressee::setCustoms( const QStringList &l )
2071{ 2075{
2072 detach(); 2076 detach();
2073 mData->empty = false; 2077 mData->empty = false;
2074 2078
2075 mData->custom = l; 2079 mData->custom = l;
2076} 2080}
2077 2081
2078QStringList Addressee::customs() const 2082QStringList Addressee::customs() const
2079{ 2083{
2080 return mData->custom; 2084 return mData->custom;
2081} 2085}
2082 2086
2083void Addressee::parseEmailAddress( const QString &rawEmail, QString &fullName, 2087void Addressee::parseEmailAddress( const QString &rawEmail, QString &fullName,
2084 QString &email) 2088 QString &email)
2085{ 2089{
2086 int startPos, endPos, len; 2090 int startPos, endPos, len;
2087 QString partA, partB, result; 2091 QString partA, partB, result;
2088 char endCh = '>'; 2092 char endCh = '>';
2089 2093
2090 startPos = rawEmail.find('<'); 2094 startPos = rawEmail.find('<');
2091 if (startPos < 0) 2095 if (startPos < 0)
2092 { 2096 {
2093 startPos = rawEmail.find('('); 2097 startPos = rawEmail.find('(');
2094 endCh = ')'; 2098 endCh = ')';
2095 } 2099 }
2096 if (startPos < 0) 2100 if (startPos < 0)
2097 { 2101 {
2098 // We couldn't find any separators, so we assume the whole string 2102 // We couldn't find any separators, so we assume the whole string
2099 // is the email address 2103 // is the email address
2100 email = rawEmail; 2104 email = rawEmail;
2101 fullName = ""; 2105 fullName = "";
2102 } 2106 }
2103 else 2107 else
2104 { 2108 {
2105 // We have a start position, try to find an end 2109 // We have a start position, try to find an end
2106 endPos = rawEmail.find(endCh, startPos+1); 2110 endPos = rawEmail.find(endCh, startPos+1);
2107 2111
2108 if (endPos < 0) 2112 if (endPos < 0)
2109 { 2113 {
2110 // We couldn't find the end of the email address. We can only 2114 // We couldn't find the end of the email address. We can only
2111 // assume the entire string is the email address. 2115 // assume the entire string is the email address.
2112 email = rawEmail; 2116 email = rawEmail;
2113 fullName = ""; 2117 fullName = "";
2114 } 2118 }
2115 else 2119 else
2116 { 2120 {
2117 // We have a start and end to the email address 2121 // We have a start and end to the email address
2118 2122
2119 // Grab the name part 2123 // Grab the name part
2120 fullName = rawEmail.left(startPos).stripWhiteSpace(); 2124 fullName = rawEmail.left(startPos).stripWhiteSpace();
2121 2125