summaryrefslogtreecommitdiffabout
path: root/kabc/addressee.cpp
Unidiff
Diffstat (limited to 'kabc/addressee.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--kabc/addressee.cpp14
1 files changed, 2 insertions, 12 deletions
diff --git a/kabc/addressee.cpp b/kabc/addressee.cpp
index 0d8e8e8..2f4a9af 100644
--- a/kabc/addressee.cpp
+++ b/kabc/addressee.cpp
@@ -34,2078 +34,2068 @@ $Id$
34#include <klocale.h> 34#include <klocale.h>
35#include <kidmanager.h> 35#include <kidmanager.h>
36//US 36//US
37#include <kstandarddirs.h> 37#include <kstandarddirs.h>
38#include <libkcal/syncdefines.h> 38#include <libkcal/syncdefines.h>
39 39
40//US #include "resource.h" 40//US #include "resource.h"
41#include "addressee.h" 41#include "addressee.h"
42 42
43using namespace KABC; 43using namespace KABC;
44 44
45static bool matchBinaryPattern( int value, int pattern ); 45static bool matchBinaryPattern( int value, int pattern );
46static bool matchBinaryPatternA( int value, int pattern ); 46static bool matchBinaryPatternA( int value, int pattern );
47static bool matchBinaryPatternP( int value, int pattern ); 47static bool matchBinaryPatternP( int value, int pattern );
48 48
49struct Addressee::AddresseeData : public KShared 49struct Addressee::AddresseeData : public KShared
50{ 50{
51 QString uid; 51 QString uid;
52 QString name; 52 QString name;
53 QString formattedName; 53 QString formattedName;
54 QString familyName; 54 QString familyName;
55 QString givenName; 55 QString givenName;
56 QString additionalName; 56 QString additionalName;
57 QString prefix; 57 QString prefix;
58 QString suffix; 58 QString suffix;
59 QString nickName; 59 QString nickName;
60 QDateTime birthday; 60 QDateTime birthday;
61 QString mailer; 61 QString mailer;
62 TimeZone timeZone; 62 TimeZone timeZone;
63 Geo geo; 63 Geo geo;
64 QString title; 64 QString title;
65 QString role; 65 QString role;
66 QString organization; 66 QString organization;
67 QString note; 67 QString note;
68 QString productId; 68 QString productId;
69 QDateTime revision; 69 QDateTime revision;
70 QString sortString; 70 QString sortString;
71 QString externalUID; 71 QString externalUID;
72 QString originalExternalUID; 72 QString originalExternalUID;
73 KURL url; 73 KURL url;
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");
1059} 1059}
1060QString Addressee::mobileWorkPhoneLabel() 1060QString Addressee::mobileWorkPhoneLabel()
1061{ 1061{
1062 return i18n("Mobile2 (Work)"); 1062 return i18n("Mobile2");
1063}
1064QString Addressee::mobileHomePhoneLabel()
1065{
1066 return i18n("Mobile (Home)");
1067} 1063}
1068 1064
1069 1065
1070QString Addressee::homeFaxLabel() 1066QString Addressee::homeFaxLabel()
1071{ 1067{
1072 return i18n("Fax (Home)"); 1068 return i18n("Fax (Home)");
1073} 1069}
1074 1070
1075 1071
1076QString Addressee::businessFaxLabel() 1072QString Addressee::businessFaxLabel()
1077{ 1073{
1078 return i18n("Fax (Work)"); 1074 return i18n("Fax (Work)");
1079} 1075}
1080 1076
1081 1077
1082QString Addressee::carPhoneLabel()
1083{
1084 return i18n("Mobile2 (Car)");
1085}
1086
1087
1088QString Addressee::isdnLabel() 1078QString Addressee::isdnLabel()
1089{ 1079{
1090 return i18n("ISDN"); 1080 return i18n("ISDN");
1091} 1081}
1092 1082
1093 1083
1094QString Addressee::pagerLabel() 1084QString Addressee::pagerLabel()
1095{ 1085{
1096 return i18n("Pager"); 1086 return i18n("Pager");
1097} 1087}
1098QString Addressee::otherPhoneLabel() 1088QString Addressee::otherPhoneLabel()
1099{ 1089{
1100 return i18n("Other Phone"); 1090 return i18n("Other Phone");
1101} 1091}
1102 1092
1103QString Addressee::sipLabel() 1093QString Addressee::sipLabel()
1104{ 1094{
1105 return i18n("SIP"); 1095 return i18n("SIP");
1106} 1096}
1107 1097
1108QString Addressee::emailLabel() 1098QString Addressee::emailLabel()
1109{ 1099{
1110 return i18n("Email Address"); 1100 return i18n("Email Address");
1111} 1101}
1112 1102
1113 1103
1114void Addressee::setMailer( const QString &mailer ) 1104void Addressee::setMailer( const QString &mailer )
1115{ 1105{
1116 if ( mailer == mData->mailer ) return; 1106 if ( mailer == mData->mailer ) return;
1117 detach(); 1107 detach();
1118 mData->empty = false; 1108 mData->empty = false;
1119 mData->mailer = mailer; 1109 mData->mailer = mailer;
1120} 1110}
1121 1111
1122QString Addressee::mailer() const 1112QString Addressee::mailer() const
1123{ 1113{
1124 return mData->mailer; 1114 return mData->mailer;
1125} 1115}
1126 1116
1127QString Addressee::mailerLabel() 1117QString Addressee::mailerLabel()
1128{ 1118{
1129 return i18n("Mail Client"); 1119 return i18n("Mail Client");
1130} 1120}
1131 1121
1132 1122
1133void Addressee::setTimeZone( const TimeZone &timeZone ) 1123void Addressee::setTimeZone( const TimeZone &timeZone )
1134{ 1124{
1135 if ( timeZone == mData->timeZone ) return; 1125 if ( timeZone == mData->timeZone ) return;
1136 detach(); 1126 detach();
1137 mData->empty = false; 1127 mData->empty = false;
1138 mData->timeZone = timeZone; 1128 mData->timeZone = timeZone;
1139} 1129}
1140 1130
1141TimeZone Addressee::timeZone() const 1131TimeZone Addressee::timeZone() const
1142{ 1132{
1143 return mData->timeZone; 1133 return mData->timeZone;
1144} 1134}
1145 1135
1146QString Addressee::timeZoneLabel() 1136QString Addressee::timeZoneLabel()
1147{ 1137{
1148 return i18n("Time Zone"); 1138 return i18n("Time Zone");
1149} 1139}
1150 1140
1151 1141
1152void Addressee::setGeo( const Geo &geo ) 1142void Addressee::setGeo( const Geo &geo )
1153{ 1143{
1154 if ( geo == mData->geo ) return; 1144 if ( geo == mData->geo ) return;
1155 detach(); 1145 detach();
1156 mData->empty = false; 1146 mData->empty = false;
1157 mData->geo = geo; 1147 mData->geo = geo;
1158} 1148}
1159 1149
1160Geo Addressee::geo() const 1150Geo Addressee::geo() const
1161{ 1151{
1162 return mData->geo; 1152 return mData->geo;
1163} 1153}
1164 1154
1165QString Addressee::geoLabel() 1155QString Addressee::geoLabel()
1166{ 1156{
1167 return i18n("Geographic Position"); 1157 return i18n("Geographic Position");
1168} 1158}
1169 1159
1170 1160
1171void Addressee::setTitle( const QString &title ) 1161void Addressee::setTitle( const QString &title )
1172{ 1162{
1173 if ( title == mData->title ) return; 1163 if ( title == mData->title ) return;
1174 detach(); 1164 detach();
1175 mData->empty = false; 1165 mData->empty = false;
1176 mData->title = title; 1166 mData->title = title;
1177} 1167}
1178 1168
1179QString Addressee::title() const 1169QString Addressee::title() const
1180{ 1170{
1181 return mData->title; 1171 return mData->title;
1182} 1172}
1183 1173
1184QString Addressee::titleLabel() 1174QString Addressee::titleLabel()
1185{ 1175{
1186 return i18n("Title"); 1176 return i18n("Title");
1187} 1177}
1188 1178
1189 1179
1190void Addressee::setRole( const QString &role ) 1180void Addressee::setRole( const QString &role )
1191{ 1181{
1192 if ( role == mData->role ) return; 1182 if ( role == mData->role ) return;
1193 detach(); 1183 detach();
1194 mData->empty = false; 1184 mData->empty = false;
1195 mData->role = role; 1185 mData->role = role;
1196} 1186}
1197 1187
1198QString Addressee::role() const 1188QString Addressee::role() const
1199{ 1189{
1200 return mData->role; 1190 return mData->role;
1201} 1191}
1202 1192
1203QString Addressee::roleLabel() 1193QString Addressee::roleLabel()
1204{ 1194{
1205 return i18n("Role"); 1195 return i18n("Role");
1206} 1196}
1207 1197
1208 1198
1209void Addressee::setOrganization( const QString &organization ) 1199void Addressee::setOrganization( const QString &organization )
1210{ 1200{
1211 if ( organization == mData->organization ) return; 1201 if ( organization == mData->organization ) return;
1212 detach(); 1202 detach();
1213 mData->empty = false; 1203 mData->empty = false;
1214 mData->organization = organization; 1204 mData->organization = organization;
1215} 1205}
1216 1206
1217QString Addressee::organization() const 1207QString Addressee::organization() const
1218{ 1208{
1219 return mData->organization; 1209 return mData->organization;
1220} 1210}
1221 1211
1222QString Addressee::organizationLabel() 1212QString Addressee::organizationLabel()
1223{ 1213{
1224 return i18n("Organization"); 1214 return i18n("Organization");
1225} 1215}
1226 1216
1227 1217
1228void Addressee::setNote( const QString &note ) 1218void Addressee::setNote( const QString &note )
1229{ 1219{
1230 if ( note == mData->note ) return; 1220 if ( note == mData->note ) return;
1231 detach(); 1221 detach();
1232 mData->empty = false; 1222 mData->empty = false;
1233 mData->note = note; 1223 mData->note = note;
1234} 1224}
1235 1225
1236QString Addressee::note() const 1226QString Addressee::note() const
1237{ 1227{
1238 return mData->note; 1228 return mData->note;
1239} 1229}
1240 1230
1241QString Addressee::noteLabel() 1231QString Addressee::noteLabel()
1242{ 1232{
1243 return i18n("Note"); 1233 return i18n("Note");
1244} 1234}
1245 1235
1246 1236
1247void Addressee::setProductId( const QString &productId ) 1237void Addressee::setProductId( const QString &productId )
1248{ 1238{
1249 if ( productId == mData->productId ) return; 1239 if ( productId == mData->productId ) return;
1250 detach(); 1240 detach();
1251 mData->empty = false; 1241 mData->empty = false;
1252 mData->productId = productId; 1242 mData->productId = productId;
1253} 1243}
1254 1244
1255QString Addressee::productId() const 1245QString Addressee::productId() const
1256{ 1246{
1257 return mData->productId; 1247 return mData->productId;
1258} 1248}
1259 1249
1260QString Addressee::productIdLabel() 1250QString Addressee::productIdLabel()
1261{ 1251{
1262 return i18n("Product Identifier"); 1252 return i18n("Product Identifier");
1263} 1253}
1264 1254
1265 1255
1266void Addressee::setRevision( const QDateTime &revision ) 1256void Addressee::setRevision( const QDateTime &revision )
1267{ 1257{
1268 if ( revision == mData->revision ) return; 1258 if ( revision == mData->revision ) return;
1269 detach(); 1259 detach();
1270 mData->empty = false; 1260 mData->empty = false;
1271 mData->revision = QDateTime( revision.date(), 1261 mData->revision = QDateTime( revision.date(),
1272 QTime (revision.time().hour(), 1262 QTime (revision.time().hour(),
1273 revision.time().minute(), 1263 revision.time().minute(),
1274 revision.time().second())); 1264 revision.time().second()));
1275} 1265}
1276 1266
1277QDateTime Addressee::revision() const 1267QDateTime Addressee::revision() const
1278{ 1268{
1279 return mData->revision; 1269 return mData->revision;
1280} 1270}
1281 1271
1282QString Addressee::revisionLabel() 1272QString Addressee::revisionLabel()
1283{ 1273{
1284 return i18n("Revision Date"); 1274 return i18n("Revision Date");
1285} 1275}
1286 1276
1287 1277
1288void Addressee::setSortString( const QString &sortString ) 1278void Addressee::setSortString( const QString &sortString )
1289{ 1279{
1290 if ( sortString == mData->sortString ) return; 1280 if ( sortString == mData->sortString ) return;
1291 detach(); 1281 detach();
1292 mData->empty = false; 1282 mData->empty = false;
1293 mData->sortString = sortString; 1283 mData->sortString = sortString;
1294} 1284}
1295 1285
1296QString Addressee::sortString() const 1286QString Addressee::sortString() const
1297{ 1287{
1298 return mData->sortString; 1288 return mData->sortString;
1299} 1289}
1300 1290
1301QString Addressee::sortStringLabel() 1291QString Addressee::sortStringLabel()
1302{ 1292{
1303 return i18n("Sort String"); 1293 return i18n("Sort String");
1304} 1294}
1305 1295
1306 1296
1307void Addressee::setUrl( const KURL &url ) 1297void Addressee::setUrl( const KURL &url )
1308{ 1298{
1309 if ( url == mData->url ) return; 1299 if ( url == mData->url ) return;
1310 detach(); 1300 detach();
1311 mData->empty = false; 1301 mData->empty = false;
1312 mData->url = url; 1302 mData->url = url;
1313} 1303}
1314 1304
1315KURL Addressee::url() const 1305KURL Addressee::url() const
1316{ 1306{
1317 return mData->url; 1307 return mData->url;
1318} 1308}
1319 1309
1320QString Addressee::urlLabel() 1310QString Addressee::urlLabel()
1321{ 1311{
1322 return i18n("URL"); 1312 return i18n("URL");
1323} 1313}
1324 1314
1325 1315
1326void Addressee::setSecrecy( const Secrecy &secrecy ) 1316void Addressee::setSecrecy( const Secrecy &secrecy )
1327{ 1317{
1328 if ( secrecy == mData->secrecy ) return; 1318 if ( secrecy == mData->secrecy ) return;
1329 detach(); 1319 detach();
1330 mData->empty = false; 1320 mData->empty = false;
1331 mData->secrecy = secrecy; 1321 mData->secrecy = secrecy;
1332} 1322}
1333 1323
1334Secrecy Addressee::secrecy() const 1324Secrecy Addressee::secrecy() const
1335{ 1325{
1336 return mData->secrecy; 1326 return mData->secrecy;
1337} 1327}
1338 1328
1339QString Addressee::secrecyLabel() 1329QString Addressee::secrecyLabel()
1340{ 1330{
1341 return i18n("Security Class"); 1331 return i18n("Security Class");
1342} 1332}
1343 1333
1344 1334
1345void Addressee::setLogo( const Picture &logo ) 1335void Addressee::setLogo( const Picture &logo )
1346{ 1336{
1347 if ( logo == mData->logo ) return; 1337 if ( logo == mData->logo ) return;
1348 detach(); 1338 detach();
1349 mData->empty = false; 1339 mData->empty = false;
1350 mData->logo = logo; 1340 mData->logo = logo;
1351} 1341}
1352 1342
1353Picture Addressee::logo() const 1343Picture Addressee::logo() const
1354{ 1344{
1355 return mData->logo; 1345 return mData->logo;
1356} 1346}
1357 1347
1358QString Addressee::logoLabel() 1348QString Addressee::logoLabel()
1359{ 1349{
1360 return i18n("Logo"); 1350 return i18n("Logo");
1361} 1351}
1362 1352
1363 1353
1364void Addressee::setPhoto( const Picture &photo ) 1354void Addressee::setPhoto( const Picture &photo )
1365{ 1355{
1366 if ( photo == mData->photo ) return; 1356 if ( photo == mData->photo ) return;
1367 detach(); 1357 detach();
1368 mData->empty = false; 1358 mData->empty = false;
1369 mData->photo = photo; 1359 mData->photo = photo;
1370} 1360}
1371 1361
1372Picture Addressee::photo() const 1362Picture Addressee::photo() const
1373{ 1363{
1374 return mData->photo; 1364 return mData->photo;
1375} 1365}
1376 1366
1377QString Addressee::photoLabel() 1367QString Addressee::photoLabel()
1378{ 1368{
1379 return i18n("Photo"); 1369 return i18n("Photo");
1380} 1370}
1381 1371
1382 1372
1383void Addressee::setSound( const Sound &sound ) 1373void Addressee::setSound( const Sound &sound )
1384{ 1374{
1385 if ( sound == mData->sound ) return; 1375 if ( sound == mData->sound ) return;
1386 detach(); 1376 detach();
1387 mData->empty = false; 1377 mData->empty = false;
1388 mData->sound = sound; 1378 mData->sound = sound;
1389} 1379}
1390 1380
1391Sound Addressee::sound() const 1381Sound Addressee::sound() const
1392{ 1382{
1393 return mData->sound; 1383 return mData->sound;
1394} 1384}
1395 1385
1396QString Addressee::soundLabel() 1386QString Addressee::soundLabel()
1397{ 1387{
1398 return i18n("Sound"); 1388 return i18n("Sound");
1399} 1389}
1400 1390
1401 1391
1402void Addressee::setAgent( const Agent &agent ) 1392void Addressee::setAgent( const Agent &agent )
1403{ 1393{
1404 if ( agent == mData->agent ) return; 1394 if ( agent == mData->agent ) return;
1405 detach(); 1395 detach();
1406 mData->empty = false; 1396 mData->empty = false;
1407 mData->agent = agent; 1397 mData->agent = agent;
1408} 1398}
1409 1399
1410Agent Addressee::agent() const 1400Agent Addressee::agent() const
1411{ 1401{
1412 return mData->agent; 1402 return mData->agent;
1413} 1403}
1414 1404
1415QString Addressee::agentLabel() 1405QString Addressee::agentLabel()
1416{ 1406{
1417 return i18n("Agent"); 1407 return i18n("Agent");
1418} 1408}
1419 1409
1420 1410
1421 1411
1422void Addressee::setNameFromString( const QString &str ) 1412void Addressee::setNameFromString( const QString &str )
1423{ 1413{
1424 setFormattedName( str ); 1414 setFormattedName( str );
1425 setName( str ); 1415 setName( str );
1426 1416
1427 static bool first = true; 1417 static bool first = true;
1428 static QStringList titles; 1418 static QStringList titles;
1429 static QStringList suffixes; 1419 static QStringList suffixes;
1430 static QStringList prefixes; 1420 static QStringList prefixes;
1431 1421
1432 if ( first ) { 1422 if ( first ) {
1433 first = false; 1423 first = false;
1434 titles += i18n( "Dr." ); 1424 titles += i18n( "Dr." );
1435 titles += i18n( "Miss" ); 1425 titles += i18n( "Miss" );
1436 titles += i18n( "Mr." ); 1426 titles += i18n( "Mr." );
1437 titles += i18n( "Mrs." ); 1427 titles += i18n( "Mrs." );
1438 titles += i18n( "Ms." ); 1428 titles += i18n( "Ms." );
1439 titles += i18n( "Prof." ); 1429 titles += i18n( "Prof." );
1440 1430
1441 suffixes += i18n( "I" ); 1431 suffixes += i18n( "I" );
1442 suffixes += i18n( "II" ); 1432 suffixes += i18n( "II" );
1443 suffixes += i18n( "III" ); 1433 suffixes += i18n( "III" );
1444 suffixes += i18n( "Jr." ); 1434 suffixes += i18n( "Jr." );
1445 suffixes += i18n( "Sr." ); 1435 suffixes += i18n( "Sr." );
1446 1436
1447 prefixes += "van"; 1437 prefixes += "van";
1448 prefixes += "von"; 1438 prefixes += "von";
1449 prefixes += "de"; 1439 prefixes += "de";
1450 1440
1451 KConfig config( locateLocal( "config", "kabcrc") ); 1441 KConfig config( locateLocal( "config", "kabcrc") );
1452 config.setGroup( "General" ); 1442 config.setGroup( "General" );
1453 titles += config.readListEntry( "Prefixes" ); 1443 titles += config.readListEntry( "Prefixes" );
1454 titles.remove( "" ); 1444 titles.remove( "" );
1455 prefixes += config.readListEntry( "Inclusions" ); 1445 prefixes += config.readListEntry( "Inclusions" );
1456 prefixes.remove( "" ); 1446 prefixes.remove( "" );
1457 suffixes += config.readListEntry( "Suffixes" ); 1447 suffixes += config.readListEntry( "Suffixes" );
1458 suffixes.remove( "" ); 1448 suffixes.remove( "" );
1459 } 1449 }
1460 1450
1461 // clear all name parts 1451 // clear all name parts
1462 setPrefix( "" ); 1452 setPrefix( "" );
1463 setGivenName( "" ); 1453 setGivenName( "" );
1464 setAdditionalName( "" ); 1454 setAdditionalName( "" );
1465 setFamilyName( "" ); 1455 setFamilyName( "" );
1466 setSuffix( "" ); 1456 setSuffix( "" );
1467 1457
1468 if ( str.isEmpty() ) 1458 if ( str.isEmpty() )
1469 return; 1459 return;
1470 1460
1471 int i = str.find(','); 1461 int i = str.find(',');
1472 if( i < 0 ) { 1462 if( i < 0 ) {
1473 QStringList parts = QStringList::split( " ", str ); 1463 QStringList parts = QStringList::split( " ", str );
1474 int leftOffset = 0; 1464 int leftOffset = 0;
1475 int rightOffset = parts.count() - 1; 1465 int rightOffset = parts.count() - 1;
1476 1466
1477 QString suffix; 1467 QString suffix;
1478 while ( rightOffset >= 0 ) { 1468 while ( rightOffset >= 0 ) {
1479 if ( suffixes.contains( parts[ rightOffset ] ) ) { 1469 if ( suffixes.contains( parts[ rightOffset ] ) ) {
1480 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " ")); 1470 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " "));
1481 rightOffset--; 1471 rightOffset--;
1482 } else 1472 } else
1483 break; 1473 break;
1484 } 1474 }
1485 setSuffix( suffix ); 1475 setSuffix( suffix );
1486 1476
1487 if ( rightOffset < 0 ) 1477 if ( rightOffset < 0 )
1488 return; 1478 return;
1489 1479
1490 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) { 1480 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) {
1491 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] ); 1481 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] );
1492 rightOffset--; 1482 rightOffset--;
1493 } else 1483 } else
1494 setFamilyName( parts[ rightOffset ] ); 1484 setFamilyName( parts[ rightOffset ] );
1495 1485
1496 QString prefix; 1486 QString prefix;
1497 while ( leftOffset < rightOffset ) { 1487 while ( leftOffset < rightOffset ) {
1498 if ( titles.contains( parts[ leftOffset ] ) ) { 1488 if ( titles.contains( parts[ leftOffset ] ) ) {
1499 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1489 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1500 leftOffset++; 1490 leftOffset++;
1501 } else 1491 } else
1502 break; 1492 break;
1503 } 1493 }
1504 setPrefix( prefix ); 1494 setPrefix( prefix );
1505 1495
1506 if ( leftOffset < rightOffset ) { 1496 if ( leftOffset < rightOffset ) {
1507 setGivenName( parts[ leftOffset ] ); 1497 setGivenName( parts[ leftOffset ] );
1508 leftOffset++; 1498 leftOffset++;
1509 } 1499 }
1510 1500
1511 QString additionalName; 1501 QString additionalName;
1512 while ( leftOffset < rightOffset ) { 1502 while ( leftOffset < rightOffset ) {
1513 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1503 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1514 leftOffset++; 1504 leftOffset++;
1515 } 1505 }
1516 setAdditionalName( additionalName ); 1506 setAdditionalName( additionalName );
1517 } else { 1507 } else {
1518 QString part1 = str.left( i ); 1508 QString part1 = str.left( i );
1519 QString part2 = str.mid( i + 1 ); 1509 QString part2 = str.mid( i + 1 );
1520 1510
1521 QStringList parts = QStringList::split( " ", part1 ); 1511 QStringList parts = QStringList::split( " ", part1 );
1522 int leftOffset = 0; 1512 int leftOffset = 0;
1523 int rightOffset = parts.count() - 1; 1513 int rightOffset = parts.count() - 1;
1524 1514
1525 QString suffix; 1515 QString suffix;
1526 while ( rightOffset >= 0 ) { 1516 while ( rightOffset >= 0 ) {
1527 if ( suffixes.contains( parts[ rightOffset ] ) ) { 1517 if ( suffixes.contains( parts[ rightOffset ] ) ) {
1528 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " ")); 1518 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " "));
1529 rightOffset--; 1519 rightOffset--;
1530 } else 1520 } else
1531 break; 1521 break;
1532 } 1522 }
1533 setSuffix( suffix ); 1523 setSuffix( suffix );
1534 1524
1535 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) { 1525 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) {
1536 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] ); 1526 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] );
1537 rightOffset--; 1527 rightOffset--;
1538 } else 1528 } else
1539 setFamilyName( parts[ rightOffset ] ); 1529 setFamilyName( parts[ rightOffset ] );
1540 1530
1541 QString prefix; 1531 QString prefix;
1542 while ( leftOffset < rightOffset ) { 1532 while ( leftOffset < rightOffset ) {
1543 if ( titles.contains( parts[ leftOffset ] ) ) { 1533 if ( titles.contains( parts[ leftOffset ] ) ) {
1544 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1534 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1545 leftOffset++; 1535 leftOffset++;
1546 } else 1536 } else
1547 break; 1537 break;
1548 } 1538 }
1549 1539
1550 parts = QStringList::split( " ", part2 ); 1540 parts = QStringList::split( " ", part2 );
1551 1541
1552 leftOffset = 0; 1542 leftOffset = 0;
1553 rightOffset = parts.count(); 1543 rightOffset = parts.count();
1554 1544
1555 while ( leftOffset < rightOffset ) { 1545 while ( leftOffset < rightOffset ) {
1556 if ( titles.contains( parts[ leftOffset ] ) ) { 1546 if ( titles.contains( parts[ leftOffset ] ) ) {
1557 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1547 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1558 leftOffset++; 1548 leftOffset++;
1559 } else 1549 } else
1560 break; 1550 break;
1561 } 1551 }
1562 setPrefix( prefix ); 1552 setPrefix( prefix );
1563 1553
1564 if ( leftOffset < rightOffset ) { 1554 if ( leftOffset < rightOffset ) {
1565 setGivenName( parts[ leftOffset ] ); 1555 setGivenName( parts[ leftOffset ] );
1566 leftOffset++; 1556 leftOffset++;
1567 } 1557 }
1568 1558
1569 QString additionalName; 1559 QString additionalName;
1570 while ( leftOffset < rightOffset ) { 1560 while ( leftOffset < rightOffset ) {
1571 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1561 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1572 leftOffset++; 1562 leftOffset++;
1573 } 1563 }
1574 setAdditionalName( additionalName ); 1564 setAdditionalName( additionalName );
1575 } 1565 }
1576} 1566}
1577 1567
1578QString Addressee::realName() const 1568QString Addressee::realName() const
1579{ 1569{
1580 if ( !formattedName().isEmpty() ) 1570 if ( !formattedName().isEmpty() )
1581 return formattedName(); 1571 return formattedName();
1582 1572
1583 QString n = assembledName(); 1573 QString n = assembledName();
1584 1574
1585 if ( n.isEmpty() ) 1575 if ( n.isEmpty() )
1586 n = name(); 1576 n = name();
1587 if ( n.isEmpty() ) 1577 if ( n.isEmpty() )
1588 n = organization(); 1578 n = organization();
1589 return n; 1579 return n;
1590} 1580}
1591 1581
1592QString Addressee::assembledName() const 1582QString Addressee::assembledName() const
1593{ 1583{
1594 QString name = prefix() + " " + givenName() + " " + additionalName() + " " + 1584 QString name = prefix() + " " + givenName() + " " + additionalName() + " " +
1595 familyName() + " " + suffix(); 1585 familyName() + " " + suffix();
1596 1586
1597 return name.simplifyWhiteSpace(); 1587 return name.simplifyWhiteSpace();
1598} 1588}
1599 1589
1600QString Addressee::fullEmail( const QString &email ) const 1590QString Addressee::fullEmail( const QString &email ) const
1601{ 1591{
1602 QString e; 1592 QString e;
1603 if ( email.isNull() ) { 1593 if ( email.isNull() ) {
1604 e = preferredEmail(); 1594 e = preferredEmail();
1605 } else { 1595 } else {
1606 e = email; 1596 e = email;
1607 } 1597 }
1608 if ( e.isEmpty() ) return QString::null; 1598 if ( e.isEmpty() ) return QString::null;
1609 1599
1610 QString text; 1600 QString text;
1611 if ( realName().isEmpty() ) 1601 if ( realName().isEmpty() )
1612 text = e; 1602 text = e;
1613 else 1603 else
1614 text = assembledName() + " <" + e + ">"; 1604 text = assembledName() + " <" + e + ">";
1615 1605
1616 return text; 1606 return text;
1617} 1607}
1618 1608
1619void Addressee::insertEmail( const QString &email, bool preferred ) 1609void Addressee::insertEmail( const QString &email, bool preferred )
1620{ 1610{
1621 detach(); 1611 detach();
1622 1612
1623 QStringList::Iterator it = mData->emails.find( email ); 1613 QStringList::Iterator it = mData->emails.find( email );
1624 1614
1625 if ( it != mData->emails.end() ) { 1615 if ( it != mData->emails.end() ) {
1626 if ( !preferred || it == mData->emails.begin() ) return; 1616 if ( !preferred || it == mData->emails.begin() ) return;
1627 mData->emails.remove( it ); 1617 mData->emails.remove( it );
1628 mData->emails.prepend( email ); 1618 mData->emails.prepend( email );
1629 } else { 1619 } else {
1630 if ( preferred ) { 1620 if ( preferred ) {
1631 mData->emails.prepend( email ); 1621 mData->emails.prepend( email );
1632 } else { 1622 } else {
1633 mData->emails.append( email ); 1623 mData->emails.append( email );
1634 } 1624 }
1635 } 1625 }
1636} 1626}
1637 1627
1638void Addressee::removeEmail( const QString &email ) 1628void Addressee::removeEmail( const QString &email )
1639{ 1629{
1640 detach(); 1630 detach();
1641 1631
1642 QStringList::Iterator it = mData->emails.find( email ); 1632 QStringList::Iterator it = mData->emails.find( email );
1643 if ( it == mData->emails.end() ) return; 1633 if ( it == mData->emails.end() ) return;
1644 1634
1645 mData->emails.remove( it ); 1635 mData->emails.remove( it );
1646} 1636}
1647 1637
1648QString Addressee::preferredEmail() const 1638QString Addressee::preferredEmail() const
1649{ 1639{
1650 if ( mData->emails.count() == 0 ) return QString::null; 1640 if ( mData->emails.count() == 0 ) return QString::null;
1651 else return mData->emails.first(); 1641 else return mData->emails.first();
1652} 1642}
1653 1643
1654QStringList Addressee::emails() const 1644QStringList Addressee::emails() const
1655{ 1645{
1656 return mData->emails; 1646 return mData->emails;
1657} 1647}
1658void Addressee::setEmails( const QStringList& emails ) { 1648void Addressee::setEmails( const QStringList& emails ) {
1659 detach(); 1649 detach();
1660 mData->emails = emails; 1650 mData->emails = emails;
1661} 1651}
1662void Addressee::insertPhoneNumber( const PhoneNumber &phoneNumber ) 1652void Addressee::insertPhoneNumber( const PhoneNumber &phoneNumber )
1663{ 1653{
1664 detach(); 1654 detach();
1665 mData->empty = false; 1655 mData->empty = false;
1666 1656
1667 PhoneNumber::List::Iterator it; 1657 PhoneNumber::List::Iterator it;
1668 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1658 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1669 if ( (*it).id() == phoneNumber.id() ) { 1659 if ( (*it).id() == phoneNumber.id() ) {
1670 *it = phoneNumber; 1660 *it = phoneNumber;
1671 return; 1661 return;
1672 } 1662 }
1673 } 1663 }
1674 mData->phoneNumbers.append( phoneNumber ); 1664 mData->phoneNumbers.append( phoneNumber );
1675} 1665}
1676 1666
1677void Addressee::removePhoneNumber( const PhoneNumber &phoneNumber ) 1667void Addressee::removePhoneNumber( const PhoneNumber &phoneNumber )
1678{ 1668{
1679 detach(); 1669 detach();
1680 1670
1681 PhoneNumber::List::Iterator it; 1671 PhoneNumber::List::Iterator it;
1682 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1672 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1683 if ( (*it).id() == phoneNumber.id() ) { 1673 if ( (*it).id() == phoneNumber.id() ) {
1684 mData->phoneNumbers.remove( it ); 1674 mData->phoneNumbers.remove( it );
1685 return; 1675 return;
1686 } 1676 }
1687 } 1677 }
1688} 1678}
1689 1679
1690PhoneNumber Addressee::phoneNumber( int type ) const 1680PhoneNumber Addressee::phoneNumber( int type ) const
1691{ 1681{
1692 PhoneNumber phoneNumber( "", type ); 1682 PhoneNumber phoneNumber( "", type );
1693 PhoneNumber::List::ConstIterator it; 1683 PhoneNumber::List::ConstIterator it;
1694 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1684 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1695 if ( matchBinaryPatternP( (*it).type(), type ) ) { 1685 if ( matchBinaryPatternP( (*it).type(), type ) ) {
1696 if ( (*it).type() & PhoneNumber::Pref ) 1686 if ( (*it).type() & PhoneNumber::Pref )
1697 return (*it); 1687 return (*it);
1698 else if ( phoneNumber.number().isEmpty() ) 1688 else if ( phoneNumber.number().isEmpty() )
1699 phoneNumber = (*it); 1689 phoneNumber = (*it);
1700 } 1690 }
1701 } 1691 }
1702 1692
1703 return phoneNumber; 1693 return phoneNumber;
1704} 1694}
1705 1695
1706PhoneNumber::List Addressee::phoneNumbers() const 1696PhoneNumber::List Addressee::phoneNumbers() const
1707{ 1697{
1708 return mData->phoneNumbers; 1698 return mData->phoneNumbers;
1709} 1699}
1710 1700
1711int Addressee::hasPhoneNumberType( int type ) 1701int Addressee::hasPhoneNumberType( int type )
1712{ 1702{
1713 int retval = 0; 1703 int retval = 0;
1714 PhoneNumber::List::ConstIterator it; 1704 PhoneNumber::List::ConstIterator it;
1715 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1705 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1716 if ( (*it).type() == type ) 1706 if ( (*it).type() == type )
1717 ++retval; 1707 ++retval;
1718 } 1708 }
1719 return retval; 1709 return retval;
1720} 1710}
1721PhoneNumber::List Addressee::phoneNumbers( int type ) const 1711PhoneNumber::List Addressee::phoneNumbers( int type ) const
1722{ 1712{
1723 PhoneNumber::List list; 1713 PhoneNumber::List list;
1724 1714
1725 PhoneNumber::List::ConstIterator it; 1715 PhoneNumber::List::ConstIterator it;
1726 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1716 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1727 if ( matchBinaryPattern( (*it).type(), type ) ) { 1717 if ( matchBinaryPattern( (*it).type(), type ) ) {
1728 list.append( *it ); 1718 list.append( *it );
1729 } 1719 }
1730 } 1720 }
1731 return list; 1721 return list;
1732} 1722}
1733 1723
1734PhoneNumber Addressee::findPhoneNumber( const QString &id ) const 1724PhoneNumber Addressee::findPhoneNumber( const QString &id ) const
1735{ 1725{
1736 PhoneNumber::List::ConstIterator it; 1726 PhoneNumber::List::ConstIterator it;
1737 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1727 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1738 if ( (*it).id() == id ) { 1728 if ( (*it).id() == id ) {
1739 return *it; 1729 return *it;
1740 } 1730 }
1741 } 1731 }
1742 return PhoneNumber(); 1732 return PhoneNumber();
1743} 1733}
1744 1734
1745void Addressee::insertKey( const Key &key ) 1735void Addressee::insertKey( const Key &key )
1746{ 1736{
1747 detach(); 1737 detach();
1748 mData->empty = false; 1738 mData->empty = false;
1749 1739
1750 Key::List::Iterator it; 1740 Key::List::Iterator it;
1751 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1741 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1752 if ( (*it).id() == key.id() ) { 1742 if ( (*it).id() == key.id() ) {
1753 *it = key; 1743 *it = key;
1754 return; 1744 return;
1755 } 1745 }
1756 } 1746 }
1757 mData->keys.append( key ); 1747 mData->keys.append( key );
1758} 1748}
1759 1749
1760void Addressee::removeKey( const Key &key ) 1750void Addressee::removeKey( const Key &key )
1761{ 1751{
1762 detach(); 1752 detach();
1763 1753
1764 Key::List::Iterator it; 1754 Key::List::Iterator it;
1765 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1755 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1766 if ( (*it).id() == key.id() ) { 1756 if ( (*it).id() == key.id() ) {
1767 mData->keys.remove( key ); 1757 mData->keys.remove( key );
1768 return; 1758 return;
1769 } 1759 }
1770 } 1760 }
1771} 1761}
1772 1762
1773Key Addressee::key( int type, QString customTypeString ) const 1763Key Addressee::key( int type, QString customTypeString ) const
1774{ 1764{
1775 Key::List::ConstIterator it; 1765 Key::List::ConstIterator it;
1776 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1766 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1777 if ( (*it).type() == type ) { 1767 if ( (*it).type() == type ) {
1778 if ( type == Key::Custom ) { 1768 if ( type == Key::Custom ) {
1779 if ( customTypeString.isEmpty() ) { 1769 if ( customTypeString.isEmpty() ) {
1780 return *it; 1770 return *it;
1781 } else { 1771 } else {
1782 if ( (*it).customTypeString() == customTypeString ) 1772 if ( (*it).customTypeString() == customTypeString )
1783 return (*it); 1773 return (*it);
1784 } 1774 }
1785 } else { 1775 } else {
1786 return *it; 1776 return *it;
1787 } 1777 }
1788 } 1778 }
1789 } 1779 }
1790 return Key( QString(), type ); 1780 return Key( QString(), type );
1791} 1781}
1792void Addressee::setKeys( const Key::List& list ) { 1782void Addressee::setKeys( const Key::List& list ) {
1793 detach(); 1783 detach();
1794 mData->keys = list; 1784 mData->keys = list;
1795} 1785}
1796 1786
1797Key::List Addressee::keys() const 1787Key::List Addressee::keys() const
1798{ 1788{
1799 return mData->keys; 1789 return mData->keys;
1800} 1790}
1801 1791
1802Key::List Addressee::keys( int type, QString customTypeString ) const 1792Key::List Addressee::keys( int type, QString customTypeString ) const
1803{ 1793{
1804 Key::List list; 1794 Key::List list;
1805 1795
1806 Key::List::ConstIterator it; 1796 Key::List::ConstIterator it;
1807 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1797 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1808 if ( (*it).type() == type ) { 1798 if ( (*it).type() == type ) {
1809 if ( type == Key::Custom ) { 1799 if ( type == Key::Custom ) {
1810 if ( customTypeString.isEmpty() ) { 1800 if ( customTypeString.isEmpty() ) {
1811 list.append(*it); 1801 list.append(*it);
1812 } else { 1802 } else {
1813 if ( (*it).customTypeString() == customTypeString ) 1803 if ( (*it).customTypeString() == customTypeString )
1814 list.append(*it); 1804 list.append(*it);
1815 } 1805 }
1816 } else { 1806 } else {
1817 list.append(*it); 1807 list.append(*it);
1818 } 1808 }
1819 } 1809 }
1820 } 1810 }
1821 return list; 1811 return list;
1822} 1812}
1823 1813
1824Key Addressee::findKey( const QString &id ) const 1814Key Addressee::findKey( const QString &id ) const
1825{ 1815{
1826 Key::List::ConstIterator it; 1816 Key::List::ConstIterator it;
1827 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1817 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1828 if ( (*it).id() == id ) { 1818 if ( (*it).id() == id ) {
1829 return *it; 1819 return *it;
1830 } 1820 }
1831 } 1821 }
1832 return Key(); 1822 return Key();
1833} 1823}
1834 1824
1835QString Addressee::asString() const 1825QString Addressee::asString() const
1836{ 1826{
1837 return "Smith, agent Smith..."; 1827 return "Smith, agent Smith...";
1838} 1828}
1839 1829
1840void Addressee::dump() const 1830void Addressee::dump() const
1841{ 1831{
1842 return; 1832 return;
1843#if 0 1833#if 0
1844 kdDebug(5700) << "Addressee {" << endl; 1834 kdDebug(5700) << "Addressee {" << endl;
1845 1835
1846 kdDebug(5700) << " Uid: '" << uid() << "'" << endl; 1836 kdDebug(5700) << " Uid: '" << uid() << "'" << endl;
1847 1837
1848 kdDebug(5700) << " Name: '" << name() << "'" << endl; 1838 kdDebug(5700) << " Name: '" << name() << "'" << endl;
1849 kdDebug(5700) << " FormattedName: '" << formattedName() << "'" << endl; 1839 kdDebug(5700) << " FormattedName: '" << formattedName() << "'" << endl;
1850 kdDebug(5700) << " FamilyName: '" << familyName() << "'" << endl; 1840 kdDebug(5700) << " FamilyName: '" << familyName() << "'" << endl;
1851 kdDebug(5700) << " GivenName: '" << givenName() << "'" << endl; 1841 kdDebug(5700) << " GivenName: '" << givenName() << "'" << endl;
1852 kdDebug(5700) << " AdditionalName: '" << additionalName() << "'" << endl; 1842 kdDebug(5700) << " AdditionalName: '" << additionalName() << "'" << endl;
1853 kdDebug(5700) << " Prefix: '" << prefix() << "'" << endl; 1843 kdDebug(5700) << " Prefix: '" << prefix() << "'" << endl;
1854 kdDebug(5700) << " Suffix: '" << suffix() << "'" << endl; 1844 kdDebug(5700) << " Suffix: '" << suffix() << "'" << endl;
1855 kdDebug(5700) << " NickName: '" << nickName() << "'" << endl; 1845 kdDebug(5700) << " NickName: '" << nickName() << "'" << endl;
1856 kdDebug(5700) << " Birthday: '" << birthday().toString() << "'" << endl; 1846 kdDebug(5700) << " Birthday: '" << birthday().toString() << "'" << endl;
1857 kdDebug(5700) << " Mailer: '" << mailer() << "'" << endl; 1847 kdDebug(5700) << " Mailer: '" << mailer() << "'" << endl;
1858 kdDebug(5700) << " TimeZone: '" << timeZone().asString() << "'" << endl; 1848 kdDebug(5700) << " TimeZone: '" << timeZone().asString() << "'" << endl;
1859 kdDebug(5700) << " Geo: '" << geo().asString() << "'" << endl; 1849 kdDebug(5700) << " Geo: '" << geo().asString() << "'" << endl;
1860 kdDebug(5700) << " Title: '" << title() << "'" << endl; 1850 kdDebug(5700) << " Title: '" << title() << "'" << endl;
1861 kdDebug(5700) << " Role: '" << role() << "'" << endl; 1851 kdDebug(5700) << " Role: '" << role() << "'" << endl;
1862 kdDebug(5700) << " Organization: '" << organization() << "'" << endl; 1852 kdDebug(5700) << " Organization: '" << organization() << "'" << endl;
1863 kdDebug(5700) << " Note: '" << note() << "'" << endl; 1853 kdDebug(5700) << " Note: '" << note() << "'" << endl;
1864 kdDebug(5700) << " ProductId: '" << productId() << "'" << endl; 1854 kdDebug(5700) << " ProductId: '" << productId() << "'" << endl;
1865 kdDebug(5700) << " Revision: '" << revision().toString() << "'" << endl; 1855 kdDebug(5700) << " Revision: '" << revision().toString() << "'" << endl;
1866 kdDebug(5700) << " SortString: '" << sortString() << "'" << endl; 1856 kdDebug(5700) << " SortString: '" << sortString() << "'" << endl;
1867 kdDebug(5700) << " Url: '" << url().url() << "'" << endl; 1857 kdDebug(5700) << " Url: '" << url().url() << "'" << endl;
1868 kdDebug(5700) << " Secrecy: '" << secrecy().asString() << "'" << endl; 1858 kdDebug(5700) << " Secrecy: '" << secrecy().asString() << "'" << endl;
1869 kdDebug(5700) << " Logo: '" << logo().asString() << "'" << endl; 1859 kdDebug(5700) << " Logo: '" << logo().asString() << "'" << endl;
1870 kdDebug(5700) << " Photo: '" << photo().asString() << "'" << endl; 1860 kdDebug(5700) << " Photo: '" << photo().asString() << "'" << endl;
1871 kdDebug(5700) << " Sound: '" << sound().asString() << "'" << endl; 1861 kdDebug(5700) << " Sound: '" << sound().asString() << "'" << endl;
1872 kdDebug(5700) << " Agent: '" << agent().asString() << "'" << endl; 1862 kdDebug(5700) << " Agent: '" << agent().asString() << "'" << endl;
1873 1863
1874 kdDebug(5700) << " Emails {" << endl; 1864 kdDebug(5700) << " Emails {" << endl;
1875 QStringList e = emails(); 1865 QStringList e = emails();
1876 QStringList::ConstIterator it; 1866 QStringList::ConstIterator it;
1877 for( it = e.begin(); it != e.end(); ++it ) { 1867 for( it = e.begin(); it != e.end(); ++it ) {
1878 kdDebug(5700) << " " << (*it) << endl; 1868 kdDebug(5700) << " " << (*it) << endl;
1879 } 1869 }
1880 kdDebug(5700) << " }" << endl; 1870 kdDebug(5700) << " }" << endl;
1881 1871
1882 kdDebug(5700) << " PhoneNumbers {" << endl; 1872 kdDebug(5700) << " PhoneNumbers {" << endl;
1883 PhoneNumber::List p = phoneNumbers(); 1873 PhoneNumber::List p = phoneNumbers();
1884 PhoneNumber::List::ConstIterator it2; 1874 PhoneNumber::List::ConstIterator it2;
1885 for( it2 = p.begin(); it2 != p.end(); ++it2 ) { 1875 for( it2 = p.begin(); it2 != p.end(); ++it2 ) {
1886 kdDebug(5700) << " Type: " << int((*it2).type()) << " Number: " << (*it2).number() << endl; 1876 kdDebug(5700) << " Type: " << int((*it2).type()) << " Number: " << (*it2).number() << endl;
1887 } 1877 }
1888 kdDebug(5700) << " }" << endl; 1878 kdDebug(5700) << " }" << endl;
1889 1879
1890 Address::List a = addresses(); 1880 Address::List a = addresses();
1891 Address::List::ConstIterator it3; 1881 Address::List::ConstIterator it3;
1892 for( it3 = a.begin(); it3 != a.end(); ++it3 ) { 1882 for( it3 = a.begin(); it3 != a.end(); ++it3 ) {
1893 (*it3).dump(); 1883 (*it3).dump();
1894 } 1884 }
1895 1885
1896 kdDebug(5700) << " Keys {" << endl; 1886 kdDebug(5700) << " Keys {" << endl;
1897 Key::List k = keys(); 1887 Key::List k = keys();
1898 Key::List::ConstIterator it4; 1888 Key::List::ConstIterator it4;
1899 for( it4 = k.begin(); it4 != k.end(); ++it4 ) { 1889 for( it4 = k.begin(); it4 != k.end(); ++it4 ) {
1900 kdDebug(5700) << " Type: " << int((*it4).type()) << 1890 kdDebug(5700) << " Type: " << int((*it4).type()) <<
1901 " Key: " << (*it4).textData() << 1891 " Key: " << (*it4).textData() <<
1902 " CustomString: " << (*it4).customTypeString() << endl; 1892 " CustomString: " << (*it4).customTypeString() << endl;
1903 } 1893 }
1904 kdDebug(5700) << " }" << endl; 1894 kdDebug(5700) << " }" << endl;
1905 1895
1906 kdDebug(5700) << "}" << endl; 1896 kdDebug(5700) << "}" << endl;
1907#endif 1897#endif
1908} 1898}
1909 1899
1910 1900
1911void Addressee::insertAddress( const Address &address ) 1901void Addressee::insertAddress( const Address &address )
1912{ 1902{
1913 detach(); 1903 detach();
1914 mData->empty = false; 1904 mData->empty = false;
1915 1905
1916 Address::List::Iterator it; 1906 Address::List::Iterator it;
1917 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1907 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1918 if ( (*it).id() == address.id() ) { 1908 if ( (*it).id() == address.id() ) {
1919 *it = address; 1909 *it = address;
1920 return; 1910 return;
1921 } 1911 }
1922 } 1912 }
1923 mData->addresses.append( address ); 1913 mData->addresses.append( address );
1924} 1914}
1925 1915
1926void Addressee::removeAddress( const Address &address ) 1916void Addressee::removeAddress( const Address &address )
1927{ 1917{
1928 detach(); 1918 detach();
1929 1919
1930 Address::List::Iterator it; 1920 Address::List::Iterator it;
1931 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1921 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1932 if ( (*it).id() == address.id() ) { 1922 if ( (*it).id() == address.id() ) {
1933 mData->addresses.remove( it ); 1923 mData->addresses.remove( it );
1934 return; 1924 return;
1935 } 1925 }
1936 } 1926 }
1937} 1927}
1938 1928
1939Address Addressee::address( int type ) const 1929Address Addressee::address( int type ) const
1940{ 1930{
1941 Address address( type ); 1931 Address address( type );
1942 Address::List::ConstIterator it; 1932 Address::List::ConstIterator it;
1943 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1933 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1944 if ( matchBinaryPatternA( (*it).type(), type ) ) { 1934 if ( matchBinaryPatternA( (*it).type(), type ) ) {
1945 if ( (*it).type() & Address::Pref ) 1935 if ( (*it).type() & Address::Pref )
1946 return (*it); 1936 return (*it);
1947 else if ( address.isEmpty() ) 1937 else if ( address.isEmpty() )
1948 address = (*it); 1938 address = (*it);
1949 } 1939 }
1950 } 1940 }
1951 1941
1952 return address; 1942 return address;
1953} 1943}
1954 1944
1955Address::List Addressee::addresses() const 1945Address::List Addressee::addresses() const
1956{ 1946{
1957 return mData->addresses; 1947 return mData->addresses;
1958} 1948}
1959 1949
1960Address::List Addressee::addresses( int type ) const 1950Address::List Addressee::addresses( int type ) const
1961{ 1951{
1962 Address::List list; 1952 Address::List list;
1963 1953
1964 Address::List::ConstIterator it; 1954 Address::List::ConstIterator it;
1965 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1955 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1966 if ( matchBinaryPattern( (*it).type(), type ) ) { 1956 if ( matchBinaryPattern( (*it).type(), type ) ) {
1967 list.append( *it ); 1957 list.append( *it );
1968 } 1958 }
1969 } 1959 }
1970 1960
1971 return list; 1961 return list;
1972} 1962}
1973 1963
1974Address Addressee::findAddress( const QString &id ) const 1964Address Addressee::findAddress( const QString &id ) const
1975{ 1965{
1976 Address::List::ConstIterator it; 1966 Address::List::ConstIterator it;
1977 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1967 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1978 if ( (*it).id() == id ) { 1968 if ( (*it).id() == id ) {
1979 return *it; 1969 return *it;
1980 } 1970 }
1981 } 1971 }
1982 return Address(); 1972 return Address();
1983} 1973}
1984 1974
1985void Addressee::insertCategory( const QString &c ) 1975void Addressee::insertCategory( const QString &c )
1986{ 1976{
1987 detach(); 1977 detach();
1988 mData->empty = false; 1978 mData->empty = false;
1989 1979
1990 if ( mData->categories.contains( c ) ) return; 1980 if ( mData->categories.contains( c ) ) return;
1991 1981
1992 mData->categories.append( c ); 1982 mData->categories.append( c );
1993} 1983}
1994 1984
1995void Addressee::removeCategory( const QString &c ) 1985void Addressee::removeCategory( const QString &c )
1996{ 1986{
1997 detach(); 1987 detach();
1998 1988
1999 QStringList::Iterator it = mData->categories.find( c ); 1989 QStringList::Iterator it = mData->categories.find( c );
2000 if ( it == mData->categories.end() ) return; 1990 if ( it == mData->categories.end() ) return;
2001 1991
2002 mData->categories.remove( it ); 1992 mData->categories.remove( it );
2003} 1993}
2004 1994
2005bool Addressee::hasCategory( const QString &c ) const 1995bool Addressee::hasCategory( const QString &c ) const
2006{ 1996{
2007 return ( mData->categories.contains( c ) ); 1997 return ( mData->categories.contains( c ) );
2008} 1998}
2009 1999
2010void Addressee::setCategories( const QStringList &c ) 2000void Addressee::setCategories( const QStringList &c )
2011{ 2001{
2012 detach(); 2002 detach();
2013 mData->empty = false; 2003 mData->empty = false;
2014 2004
2015 mData->categories = c; 2005 mData->categories = c;
2016} 2006}
2017 2007
2018QStringList Addressee::categories() const 2008QStringList Addressee::categories() const
2019{ 2009{
2020 return mData->categories; 2010 return mData->categories;
2021} 2011}
2022 2012
2023void Addressee::insertCustom( const QString &app, const QString &name, 2013void Addressee::insertCustom( const QString &app, const QString &name,
2024 const QString &value ) 2014 const QString &value )
2025{ 2015{
2026 if ( value.isNull() || name.isEmpty() || app.isEmpty() ) return; 2016 if ( value.isNull() || name.isEmpty() || app.isEmpty() ) return;
2027 2017
2028 detach(); 2018 detach();
2029 mData->empty = false; 2019 mData->empty = false;
2030 2020
2031 QString qualifiedName = app + "-" + name + ":"; 2021 QString qualifiedName = app + "-" + name + ":";
2032 2022
2033 QStringList::Iterator it; 2023 QStringList::Iterator it;
2034 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) { 2024 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
2035 if ( (*it).startsWith( qualifiedName ) ) { 2025 if ( (*it).startsWith( qualifiedName ) ) {
2036 (*it) = qualifiedName + value; 2026 (*it) = qualifiedName + value;
2037 return; 2027 return;
2038 } 2028 }
2039 } 2029 }
2040 mData->custom.append( qualifiedName + value ); 2030 mData->custom.append( qualifiedName + value );
2041} 2031}
2042 2032
2043void Addressee::removeCustom( const QString &app, const QString &name) 2033void Addressee::removeCustom( const QString &app, const QString &name)
2044{ 2034{
2045 detach(); 2035 detach();
2046 2036
2047 QString qualifiedName = app + "-" + name + ":"; 2037 QString qualifiedName = app + "-" + name + ":";
2048 2038
2049 QStringList::Iterator it; 2039 QStringList::Iterator it;
2050 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) { 2040 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
2051 if ( (*it).startsWith( qualifiedName ) ) { 2041 if ( (*it).startsWith( qualifiedName ) ) {
2052 mData->custom.remove( it ); 2042 mData->custom.remove( it );
2053 return; 2043 return;
2054 } 2044 }
2055 } 2045 }
2056} 2046}
2057 2047
2058QString Addressee::custom( const QString &app, const QString &name ) const 2048QString Addressee::custom( const QString &app, const QString &name ) const
2059{ 2049{
2060 QString qualifiedName = app + "-" + name + ":"; 2050 QString qualifiedName = app + "-" + name + ":";
2061 QString value; 2051 QString value;
2062 2052
2063 QStringList::ConstIterator it; 2053 QStringList::ConstIterator it;
2064 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) { 2054 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
2065 if ( (*it).startsWith( qualifiedName ) ) { 2055 if ( (*it).startsWith( qualifiedName ) ) {
2066 value = (*it).mid( (*it).find( ":" ) + 1 ); 2056 value = (*it).mid( (*it).find( ":" ) + 1 );
2067 break; 2057 break;
2068 } 2058 }
2069 } 2059 }
2070 2060
2071 return value; 2061 return value;
2072} 2062}
2073 2063
2074void Addressee::setCustoms( const QStringList &l ) 2064void Addressee::setCustoms( const QStringList &l )
2075{ 2065{
2076 detach(); 2066 detach();
2077 mData->empty = false; 2067 mData->empty = false;
2078 2068
2079 mData->custom = l; 2069 mData->custom = l;
2080} 2070}
2081 2071
2082QStringList Addressee::customs() const 2072QStringList Addressee::customs() const
2083{ 2073{
2084 return mData->custom; 2074 return mData->custom;
2085} 2075}
2086 2076
2087void Addressee::parseEmailAddress( const QString &rawEmail, QString &fullName, 2077void Addressee::parseEmailAddress( const QString &rawEmail, QString &fullName,
2088 QString &email) 2078 QString &email)
2089{ 2079{
2090 int startPos, endPos, len; 2080 int startPos, endPos, len;
2091 QString partA, partB, result; 2081 QString partA, partB, result;
2092 char endCh = '>'; 2082 char endCh = '>';
2093 2083
2094 startPos = rawEmail.find('<'); 2084 startPos = rawEmail.find('<');
2095 if (startPos < 0) 2085 if (startPos < 0)
2096 { 2086 {
2097 startPos = rawEmail.find('('); 2087 startPos = rawEmail.find('(');
2098 endCh = ')'; 2088 endCh = ')';
2099 } 2089 }
2100 if (startPos < 0) 2090 if (startPos < 0)
2101 { 2091 {
2102 // We couldn't find any separators, so we assume the whole string 2092 // We couldn't find any separators, so we assume the whole string
2103 // is the email address 2093 // is the email address
2104 email = rawEmail; 2094 email = rawEmail;
2105 fullName = ""; 2095 fullName = "";
2106 } 2096 }
2107 else 2097 else
2108 { 2098 {
2109 // We have a start position, try to find an end 2099 // We have a start position, try to find an end
2110 endPos = rawEmail.find(endCh, startPos+1); 2100 endPos = rawEmail.find(endCh, startPos+1);
2111 2101