summaryrefslogtreecommitdiffabout
path: root/kabc/addressee.cpp
Unidiff
Diffstat (limited to 'kabc/addressee.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--kabc/addressee.cpp4
1 files changed, 2 insertions, 2 deletions
diff --git a/kabc/addressee.cpp b/kabc/addressee.cpp
index 661bdf6..19c78ee 100644
--- a/kabc/addressee.cpp
+++ b/kabc/addressee.cpp
@@ -1,2292 +1,2292 @@
1/*** Warning! This file has been generated by the script makeaddressee ***/ 1/*** Warning! This file has been generated by the script makeaddressee ***/
2/* 2/*
3 This file is part of libkabc. 3 This file is part of libkabc.
4 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 4 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
5 5
6 This library is free software; you can redistribute it and/or 6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public 7 modify it under the terms of the GNU Library General Public
8 License as published by the Free Software Foundation; either 8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version. 9 version 2 of the License, or (at your option) any later version.
10 10
11 This library is distributed in the hope that it will be useful, 11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Library General Public License for more details. 14 Library General Public License for more details.
15 15
16 You should have received a copy of the GNU Library General Public License 16 You should have received a copy of the GNU Library General Public License
17 along with this library; see the file COPYING.LIB. If not, write to 17 along with this library; see the file COPYING.LIB. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. 19 Boston, MA 02111-1307, USA.
20*/ 20*/
21 21
22/* 22/*
23Enhanced Version of the file for platform independent KDE tools. 23Enhanced Version of the file for platform independent KDE tools.
24Copyright (c) 2004 Ulf Schenk 24Copyright (c) 2004 Ulf Schenk
25 25
26$Id$ 26$Id$
27*/ 27*/
28 28
29#include <kconfig.h> 29#include <kconfig.h>
30 30
31#include <ksharedptr.h> 31#include <ksharedptr.h>
32#include <kdebug.h> 32#include <kdebug.h>
33#include <kapplication.h> 33#include <kapplication.h>
34#include <klocale.h> 34#include <klocale.h>
35#include <kidmanager.h> 35#include <kidmanager.h>
36//US 36//US
37#include <kstandarddirs.h> 37#include <kstandarddirs.h>
38#include <libkcal/syncdefines.h> 38#include <libkcal/syncdefines.h>
39 39
40//US #include "resource.h" 40//US #include "resource.h"
41#include "addressee.h" 41#include "addressee.h"
42 42
43using namespace KABC; 43using namespace KABC;
44 44
45static bool matchBinaryPattern( int value, int pattern ); 45static bool matchBinaryPattern( int value, int pattern );
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 Phone");
1059} 1059}
1060QString Addressee::mobileWorkPhoneLabel() 1060QString Addressee::mobileWorkPhoneLabel()
1061{ 1061{
1062 return i18n("Mobile2 (work)"); 1062 return i18n("Mobile2 (work)");
1063} 1063}
1064QString Addressee::mobileHomePhoneLabel() 1064QString Addressee::mobileHomePhoneLabel()
1065{ 1065{
1066 return i18n("Mobile"); 1066 return i18n("Mobile (Home)");
1067} 1067}
1068 1068
1069 1069
1070QString Addressee::homeFaxLabel() 1070QString Addressee::homeFaxLabel()
1071{ 1071{
1072 return i18n("Fax (Home)"); 1072 return i18n("Fax (Home)");
1073} 1073}
1074 1074
1075 1075
1076QString Addressee::businessFaxLabel() 1076QString Addressee::businessFaxLabel()
1077{ 1077{
1078 return i18n("Fax (Work)"); 1078 return i18n("Fax (Work)");
1079} 1079}
1080 1080
1081 1081
1082QString Addressee::carPhoneLabel() 1082QString Addressee::carPhoneLabel()
1083{ 1083{
1084 return i18n("Mobile2 (work)"); 1084 return i18n("Mobile2 (car)");
1085} 1085}
1086 1086
1087 1087
1088QString Addressee::isdnLabel() 1088QString Addressee::isdnLabel()
1089{ 1089{
1090 return i18n("ISDN"); 1090 return i18n("ISDN");
1091} 1091}
1092 1092
1093 1093
1094QString Addressee::pagerLabel() 1094QString Addressee::pagerLabel()
1095{ 1095{
1096 return i18n("Pager"); 1096 return i18n("Pager");
1097} 1097}
1098 1098
1099QString Addressee::sipLabel() 1099QString Addressee::sipLabel()
1100{ 1100{
1101 return i18n("SIP"); 1101 return i18n("SIP");
1102} 1102}
1103 1103
1104QString Addressee::emailLabel() 1104QString Addressee::emailLabel()
1105{ 1105{
1106 return i18n("Email Address"); 1106 return i18n("Email Address");
1107} 1107}
1108 1108
1109 1109
1110void Addressee::setMailer( const QString &mailer ) 1110void Addressee::setMailer( const QString &mailer )
1111{ 1111{
1112 if ( mailer == mData->mailer ) return; 1112 if ( mailer == mData->mailer ) return;
1113 detach(); 1113 detach();
1114 mData->empty = false; 1114 mData->empty = false;
1115 mData->mailer = mailer; 1115 mData->mailer = mailer;
1116} 1116}
1117 1117
1118QString Addressee::mailer() const 1118QString Addressee::mailer() const
1119{ 1119{
1120 return mData->mailer; 1120 return mData->mailer;
1121} 1121}
1122 1122
1123QString Addressee::mailerLabel() 1123QString Addressee::mailerLabel()
1124{ 1124{
1125 return i18n("Mail Client"); 1125 return i18n("Mail Client");
1126} 1126}
1127 1127
1128 1128
1129void Addressee::setTimeZone( const TimeZone &timeZone ) 1129void Addressee::setTimeZone( const TimeZone &timeZone )
1130{ 1130{
1131 if ( timeZone == mData->timeZone ) return; 1131 if ( timeZone == mData->timeZone ) return;
1132 detach(); 1132 detach();
1133 mData->empty = false; 1133 mData->empty = false;
1134 mData->timeZone = timeZone; 1134 mData->timeZone = timeZone;
1135} 1135}
1136 1136
1137TimeZone Addressee::timeZone() const 1137TimeZone Addressee::timeZone() const
1138{ 1138{
1139 return mData->timeZone; 1139 return mData->timeZone;
1140} 1140}
1141 1141
1142QString Addressee::timeZoneLabel() 1142QString Addressee::timeZoneLabel()
1143{ 1143{
1144 return i18n("Time Zone"); 1144 return i18n("Time Zone");
1145} 1145}
1146 1146
1147 1147
1148void Addressee::setGeo( const Geo &geo ) 1148void Addressee::setGeo( const Geo &geo )
1149{ 1149{
1150 if ( geo == mData->geo ) return; 1150 if ( geo == mData->geo ) return;
1151 detach(); 1151 detach();
1152 mData->empty = false; 1152 mData->empty = false;
1153 mData->geo = geo; 1153 mData->geo = geo;
1154} 1154}
1155 1155
1156Geo Addressee::geo() const 1156Geo Addressee::geo() const
1157{ 1157{
1158 return mData->geo; 1158 return mData->geo;
1159} 1159}
1160 1160
1161QString Addressee::geoLabel() 1161QString Addressee::geoLabel()
1162{ 1162{
1163 return i18n("Geographic Position"); 1163 return i18n("Geographic Position");
1164} 1164}
1165 1165
1166 1166
1167void Addressee::setTitle( const QString &title ) 1167void Addressee::setTitle( const QString &title )
1168{ 1168{
1169 if ( title == mData->title ) return; 1169 if ( title == mData->title ) return;
1170 detach(); 1170 detach();
1171 mData->empty = false; 1171 mData->empty = false;
1172 mData->title = title; 1172 mData->title = title;
1173} 1173}
1174 1174
1175QString Addressee::title() const 1175QString Addressee::title() const
1176{ 1176{
1177 return mData->title; 1177 return mData->title;
1178} 1178}
1179 1179
1180QString Addressee::titleLabel() 1180QString Addressee::titleLabel()
1181{ 1181{
1182 return i18n("Title"); 1182 return i18n("Title");
1183} 1183}
1184 1184
1185 1185
1186void Addressee::setRole( const QString &role ) 1186void Addressee::setRole( const QString &role )
1187{ 1187{
1188 if ( role == mData->role ) return; 1188 if ( role == mData->role ) return;
1189 detach(); 1189 detach();
1190 mData->empty = false; 1190 mData->empty = false;
1191 mData->role = role; 1191 mData->role = role;
1192} 1192}
1193 1193
1194QString Addressee::role() const 1194QString Addressee::role() const
1195{ 1195{
1196 return mData->role; 1196 return mData->role;
1197} 1197}
1198 1198
1199QString Addressee::roleLabel() 1199QString Addressee::roleLabel()
1200{ 1200{
1201 return i18n("Role"); 1201 return i18n("Role");
1202} 1202}
1203 1203
1204 1204
1205void Addressee::setOrganization( const QString &organization ) 1205void Addressee::setOrganization( const QString &organization )
1206{ 1206{
1207 if ( organization == mData->organization ) return; 1207 if ( organization == mData->organization ) return;
1208 detach(); 1208 detach();
1209 mData->empty = false; 1209 mData->empty = false;
1210 mData->organization = organization; 1210 mData->organization = organization;
1211} 1211}
1212 1212
1213QString Addressee::organization() const 1213QString Addressee::organization() const
1214{ 1214{
1215 return mData->organization; 1215 return mData->organization;
1216} 1216}
1217 1217
1218QString Addressee::organizationLabel() 1218QString Addressee::organizationLabel()
1219{ 1219{
1220 return i18n("Organization"); 1220 return i18n("Organization");
1221} 1221}
1222 1222
1223 1223
1224void Addressee::setNote( const QString &note ) 1224void Addressee::setNote( const QString &note )
1225{ 1225{
1226 if ( note == mData->note ) return; 1226 if ( note == mData->note ) return;
1227 detach(); 1227 detach();
1228 mData->empty = false; 1228 mData->empty = false;
1229 mData->note = note; 1229 mData->note = note;
1230} 1230}
1231 1231
1232QString Addressee::note() const 1232QString Addressee::note() const
1233{ 1233{
1234 return mData->note; 1234 return mData->note;
1235} 1235}
1236 1236
1237QString Addressee::noteLabel() 1237QString Addressee::noteLabel()
1238{ 1238{
1239 return i18n("Note"); 1239 return i18n("Note");
1240} 1240}
1241 1241
1242 1242
1243void Addressee::setProductId( const QString &productId ) 1243void Addressee::setProductId( const QString &productId )
1244{ 1244{
1245 if ( productId == mData->productId ) return; 1245 if ( productId == mData->productId ) return;
1246 detach(); 1246 detach();
1247 mData->empty = false; 1247 mData->empty = false;
1248 mData->productId = productId; 1248 mData->productId = productId;
1249} 1249}
1250 1250
1251QString Addressee::productId() const 1251QString Addressee::productId() const
1252{ 1252{
1253 return mData->productId; 1253 return mData->productId;
1254} 1254}
1255 1255
1256QString Addressee::productIdLabel() 1256QString Addressee::productIdLabel()
1257{ 1257{
1258 return i18n("Product Identifier"); 1258 return i18n("Product Identifier");
1259} 1259}
1260 1260
1261 1261
1262void Addressee::setRevision( const QDateTime &revision ) 1262void Addressee::setRevision( const QDateTime &revision )
1263{ 1263{
1264 if ( revision == mData->revision ) return; 1264 if ( revision == mData->revision ) return;
1265 detach(); 1265 detach();
1266 mData->empty = false; 1266 mData->empty = false;
1267 mData->revision = QDateTime( revision.date(), 1267 mData->revision = QDateTime( revision.date(),
1268 QTime (revision.time().hour(), 1268 QTime (revision.time().hour(),
1269 revision.time().minute(), 1269 revision.time().minute(),
1270 revision.time().second())); 1270 revision.time().second()));
1271} 1271}
1272 1272
1273QDateTime Addressee::revision() const 1273QDateTime Addressee::revision() const
1274{ 1274{
1275 return mData->revision; 1275 return mData->revision;
1276} 1276}
1277 1277
1278QString Addressee::revisionLabel() 1278QString Addressee::revisionLabel()
1279{ 1279{
1280 return i18n("Revision Date"); 1280 return i18n("Revision Date");
1281} 1281}
1282 1282
1283 1283
1284void Addressee::setSortString( const QString &sortString ) 1284void Addressee::setSortString( const QString &sortString )
1285{ 1285{
1286 if ( sortString == mData->sortString ) return; 1286 if ( sortString == mData->sortString ) return;
1287 detach(); 1287 detach();
1288 mData->empty = false; 1288 mData->empty = false;
1289 mData->sortString = sortString; 1289 mData->sortString = sortString;
1290} 1290}
1291 1291
1292QString Addressee::sortString() const 1292QString Addressee::sortString() const
1293{ 1293{
1294 return mData->sortString; 1294 return mData->sortString;
1295} 1295}
1296 1296
1297QString Addressee::sortStringLabel() 1297QString Addressee::sortStringLabel()
1298{ 1298{
1299 return i18n("Sort String"); 1299 return i18n("Sort String");
1300} 1300}
1301 1301
1302 1302
1303void Addressee::setUrl( const KURL &url ) 1303void Addressee::setUrl( const KURL &url )
1304{ 1304{
1305 if ( url == mData->url ) return; 1305 if ( url == mData->url ) return;
1306 detach(); 1306 detach();
1307 mData->empty = false; 1307 mData->empty = false;
1308 mData->url = url; 1308 mData->url = url;
1309} 1309}
1310 1310
1311KURL Addressee::url() const 1311KURL Addressee::url() const
1312{ 1312{
1313 return mData->url; 1313 return mData->url;
1314} 1314}
1315 1315
1316QString Addressee::urlLabel() 1316QString Addressee::urlLabel()
1317{ 1317{
1318 return i18n("URL"); 1318 return i18n("URL");
1319} 1319}
1320 1320
1321 1321
1322void Addressee::setSecrecy( const Secrecy &secrecy ) 1322void Addressee::setSecrecy( const Secrecy &secrecy )
1323{ 1323{
1324 if ( secrecy == mData->secrecy ) return; 1324 if ( secrecy == mData->secrecy ) return;
1325 detach(); 1325 detach();
1326 mData->empty = false; 1326 mData->empty = false;
1327 mData->secrecy = secrecy; 1327 mData->secrecy = secrecy;
1328} 1328}
1329 1329
1330Secrecy Addressee::secrecy() const 1330Secrecy Addressee::secrecy() const
1331{ 1331{
1332 return mData->secrecy; 1332 return mData->secrecy;
1333} 1333}
1334 1334
1335QString Addressee::secrecyLabel() 1335QString Addressee::secrecyLabel()
1336{ 1336{
1337 return i18n("Security Class"); 1337 return i18n("Security Class");
1338} 1338}
1339 1339
1340 1340
1341void Addressee::setLogo( const Picture &logo ) 1341void Addressee::setLogo( const Picture &logo )
1342{ 1342{
1343 if ( logo == mData->logo ) return; 1343 if ( logo == mData->logo ) return;
1344 detach(); 1344 detach();
1345 mData->empty = false; 1345 mData->empty = false;
1346 mData->logo = logo; 1346 mData->logo = logo;
1347} 1347}
1348 1348
1349Picture Addressee::logo() const 1349Picture Addressee::logo() const
1350{ 1350{
1351 return mData->logo; 1351 return mData->logo;
1352} 1352}
1353 1353
1354QString Addressee::logoLabel() 1354QString Addressee::logoLabel()
1355{ 1355{
1356 return i18n("Logo"); 1356 return i18n("Logo");
1357} 1357}
1358 1358
1359 1359
1360void Addressee::setPhoto( const Picture &photo ) 1360void Addressee::setPhoto( const Picture &photo )
1361{ 1361{
1362 if ( photo == mData->photo ) return; 1362 if ( photo == mData->photo ) return;
1363 detach(); 1363 detach();
1364 mData->empty = false; 1364 mData->empty = false;
1365 mData->photo = photo; 1365 mData->photo = photo;
1366} 1366}
1367 1367
1368Picture Addressee::photo() const 1368Picture Addressee::photo() const
1369{ 1369{
1370 return mData->photo; 1370 return mData->photo;
1371} 1371}
1372 1372
1373QString Addressee::photoLabel() 1373QString Addressee::photoLabel()
1374{ 1374{
1375 return i18n("Photo"); 1375 return i18n("Photo");
1376} 1376}
1377 1377
1378 1378
1379void Addressee::setSound( const Sound &sound ) 1379void Addressee::setSound( const Sound &sound )
1380{ 1380{
1381 if ( sound == mData->sound ) return; 1381 if ( sound == mData->sound ) return;
1382 detach(); 1382 detach();
1383 mData->empty = false; 1383 mData->empty = false;
1384 mData->sound = sound; 1384 mData->sound = sound;
1385} 1385}
1386 1386
1387Sound Addressee::sound() const 1387Sound Addressee::sound() const
1388{ 1388{
1389 return mData->sound; 1389 return mData->sound;
1390} 1390}
1391 1391
1392QString Addressee::soundLabel() 1392QString Addressee::soundLabel()
1393{ 1393{
1394 return i18n("Sound"); 1394 return i18n("Sound");
1395} 1395}
1396 1396
1397 1397
1398void Addressee::setAgent( const Agent &agent ) 1398void Addressee::setAgent( const Agent &agent )
1399{ 1399{
1400 if ( agent == mData->agent ) return; 1400 if ( agent == mData->agent ) return;
1401 detach(); 1401 detach();
1402 mData->empty = false; 1402 mData->empty = false;
1403 mData->agent = agent; 1403 mData->agent = agent;
1404} 1404}
1405 1405
1406Agent Addressee::agent() const 1406Agent Addressee::agent() const
1407{ 1407{
1408 return mData->agent; 1408 return mData->agent;
1409} 1409}
1410 1410
1411QString Addressee::agentLabel() 1411QString Addressee::agentLabel()
1412{ 1412{
1413 return i18n("Agent"); 1413 return i18n("Agent");
1414} 1414}
1415 1415
1416 1416
1417 1417
1418void Addressee::setNameFromString( const QString &str ) 1418void Addressee::setNameFromString( const QString &str )
1419{ 1419{
1420 setFormattedName( str ); 1420 setFormattedName( str );
1421 setName( str ); 1421 setName( str );
1422 1422
1423 static bool first = true; 1423 static bool first = true;
1424 static QStringList titles; 1424 static QStringList titles;
1425 static QStringList suffixes; 1425 static QStringList suffixes;
1426 static QStringList prefixes; 1426 static QStringList prefixes;
1427 1427
1428 if ( first ) { 1428 if ( first ) {
1429 first = false; 1429 first = false;
1430 titles += i18n( "Dr." ); 1430 titles += i18n( "Dr." );
1431 titles += i18n( "Miss" ); 1431 titles += i18n( "Miss" );
1432 titles += i18n( "Mr." ); 1432 titles += i18n( "Mr." );
1433 titles += i18n( "Mrs." ); 1433 titles += i18n( "Mrs." );
1434 titles += i18n( "Ms." ); 1434 titles += i18n( "Ms." );
1435 titles += i18n( "Prof." ); 1435 titles += i18n( "Prof." );
1436 1436
1437 suffixes += i18n( "I" ); 1437 suffixes += i18n( "I" );
1438 suffixes += i18n( "II" ); 1438 suffixes += i18n( "II" );
1439 suffixes += i18n( "III" ); 1439 suffixes += i18n( "III" );
1440 suffixes += i18n( "Jr." ); 1440 suffixes += i18n( "Jr." );
1441 suffixes += i18n( "Sr." ); 1441 suffixes += i18n( "Sr." );
1442 1442
1443 prefixes += "van"; 1443 prefixes += "van";
1444 prefixes += "von"; 1444 prefixes += "von";
1445 prefixes += "de"; 1445 prefixes += "de";
1446 1446
1447 KConfig config( locateLocal( "config", "kabcrc") ); 1447 KConfig config( locateLocal( "config", "kabcrc") );
1448 config.setGroup( "General" ); 1448 config.setGroup( "General" );
1449 titles += config.readListEntry( "Prefixes" ); 1449 titles += config.readListEntry( "Prefixes" );
1450 titles.remove( "" ); 1450 titles.remove( "" );
1451 prefixes += config.readListEntry( "Inclusions" ); 1451 prefixes += config.readListEntry( "Inclusions" );
1452 prefixes.remove( "" ); 1452 prefixes.remove( "" );
1453 suffixes += config.readListEntry( "Suffixes" ); 1453 suffixes += config.readListEntry( "Suffixes" );
1454 suffixes.remove( "" ); 1454 suffixes.remove( "" );
1455 } 1455 }
1456 1456
1457 // clear all name parts 1457 // clear all name parts
1458 setPrefix( "" ); 1458 setPrefix( "" );
1459 setGivenName( "" ); 1459 setGivenName( "" );
1460 setAdditionalName( "" ); 1460 setAdditionalName( "" );
1461 setFamilyName( "" ); 1461 setFamilyName( "" );
1462 setSuffix( "" ); 1462 setSuffix( "" );
1463 1463
1464 if ( str.isEmpty() ) 1464 if ( str.isEmpty() )
1465 return; 1465 return;
1466 1466
1467 int i = str.find(','); 1467 int i = str.find(',');
1468 if( i < 0 ) { 1468 if( i < 0 ) {
1469 QStringList parts = QStringList::split( " ", str ); 1469 QStringList parts = QStringList::split( " ", str );
1470 int leftOffset = 0; 1470 int leftOffset = 0;
1471 int rightOffset = parts.count() - 1; 1471 int rightOffset = parts.count() - 1;
1472 1472
1473 QString suffix; 1473 QString suffix;
1474 while ( rightOffset >= 0 ) { 1474 while ( rightOffset >= 0 ) {
1475 if ( suffixes.contains( parts[ rightOffset ] ) ) { 1475 if ( suffixes.contains( parts[ rightOffset ] ) ) {
1476 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " ")); 1476 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " "));
1477 rightOffset--; 1477 rightOffset--;
1478 } else 1478 } else
1479 break; 1479 break;
1480 } 1480 }
1481 setSuffix( suffix ); 1481 setSuffix( suffix );
1482 1482
1483 if ( rightOffset < 0 ) 1483 if ( rightOffset < 0 )
1484 return; 1484 return;
1485 1485
1486 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) { 1486 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) {
1487 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] ); 1487 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] );
1488 rightOffset--; 1488 rightOffset--;
1489 } else 1489 } else
1490 setFamilyName( parts[ rightOffset ] ); 1490 setFamilyName( parts[ rightOffset ] );
1491 1491
1492 QString prefix; 1492 QString prefix;
1493 while ( leftOffset < rightOffset ) { 1493 while ( leftOffset < rightOffset ) {
1494 if ( titles.contains( parts[ leftOffset ] ) ) { 1494 if ( titles.contains( parts[ leftOffset ] ) ) {
1495 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1495 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1496 leftOffset++; 1496 leftOffset++;
1497 } else 1497 } else
1498 break; 1498 break;
1499 } 1499 }
1500 setPrefix( prefix ); 1500 setPrefix( prefix );
1501 1501
1502 if ( leftOffset < rightOffset ) { 1502 if ( leftOffset < rightOffset ) {
1503 setGivenName( parts[ leftOffset ] ); 1503 setGivenName( parts[ leftOffset ] );
1504 leftOffset++; 1504 leftOffset++;
1505 } 1505 }
1506 1506
1507 QString additionalName; 1507 QString additionalName;
1508 while ( leftOffset < rightOffset ) { 1508 while ( leftOffset < rightOffset ) {
1509 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1509 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1510 leftOffset++; 1510 leftOffset++;
1511 } 1511 }
1512 setAdditionalName( additionalName ); 1512 setAdditionalName( additionalName );
1513 } else { 1513 } else {
1514 QString part1 = str.left( i ); 1514 QString part1 = str.left( i );
1515 QString part2 = str.mid( i + 1 ); 1515 QString part2 = str.mid( i + 1 );
1516 1516
1517 QStringList parts = QStringList::split( " ", part1 ); 1517 QStringList parts = QStringList::split( " ", part1 );
1518 int leftOffset = 0; 1518 int leftOffset = 0;
1519 int rightOffset = parts.count() - 1; 1519 int rightOffset = parts.count() - 1;
1520 1520
1521 QString suffix; 1521 QString suffix;
1522 while ( rightOffset >= 0 ) { 1522 while ( rightOffset >= 0 ) {
1523 if ( suffixes.contains( parts[ rightOffset ] ) ) { 1523 if ( suffixes.contains( parts[ rightOffset ] ) ) {
1524 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " ")); 1524 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " "));
1525 rightOffset--; 1525 rightOffset--;
1526 } else 1526 } else
1527 break; 1527 break;
1528 } 1528 }
1529 setSuffix( suffix ); 1529 setSuffix( suffix );
1530 1530
1531 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) { 1531 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) {
1532 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] ); 1532 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] );
1533 rightOffset--; 1533 rightOffset--;
1534 } else 1534 } else
1535 setFamilyName( parts[ rightOffset ] ); 1535 setFamilyName( parts[ rightOffset ] );
1536 1536
1537 QString prefix; 1537 QString prefix;
1538 while ( leftOffset < rightOffset ) { 1538 while ( leftOffset < rightOffset ) {
1539 if ( titles.contains( parts[ leftOffset ] ) ) { 1539 if ( titles.contains( parts[ leftOffset ] ) ) {
1540 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1540 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1541 leftOffset++; 1541 leftOffset++;
1542 } else 1542 } else
1543 break; 1543 break;
1544 } 1544 }
1545 1545
1546 parts = QStringList::split( " ", part2 ); 1546 parts = QStringList::split( " ", part2 );
1547 1547
1548 leftOffset = 0; 1548 leftOffset = 0;
1549 rightOffset = parts.count(); 1549 rightOffset = parts.count();
1550 1550
1551 while ( leftOffset < rightOffset ) { 1551 while ( leftOffset < rightOffset ) {
1552 if ( titles.contains( parts[ leftOffset ] ) ) { 1552 if ( titles.contains( parts[ leftOffset ] ) ) {
1553 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1553 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1554 leftOffset++; 1554 leftOffset++;
1555 } else 1555 } else
1556 break; 1556 break;
1557 } 1557 }
1558 setPrefix( prefix ); 1558 setPrefix( prefix );
1559 1559
1560 if ( leftOffset < rightOffset ) { 1560 if ( leftOffset < rightOffset ) {
1561 setGivenName( parts[ leftOffset ] ); 1561 setGivenName( parts[ leftOffset ] );
1562 leftOffset++; 1562 leftOffset++;
1563 } 1563 }
1564 1564
1565 QString additionalName; 1565 QString additionalName;
1566 while ( leftOffset < rightOffset ) { 1566 while ( leftOffset < rightOffset ) {
1567 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1567 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1568 leftOffset++; 1568 leftOffset++;
1569 } 1569 }
1570 setAdditionalName( additionalName ); 1570 setAdditionalName( additionalName );
1571 } 1571 }
1572} 1572}
1573 1573
1574QString Addressee::realName() const 1574QString Addressee::realName() const
1575{ 1575{
1576 if ( !formattedName().isEmpty() ) 1576 if ( !formattedName().isEmpty() )
1577 return formattedName(); 1577 return formattedName();
1578 1578
1579 QString n = assembledName(); 1579 QString n = assembledName();
1580 1580
1581 if ( n.isEmpty() ) 1581 if ( n.isEmpty() )
1582 n = name(); 1582 n = name();
1583 if ( n.isEmpty() ) 1583 if ( n.isEmpty() )
1584 n = organization(); 1584 n = organization();
1585 return n; 1585 return n;
1586} 1586}
1587 1587
1588QString Addressee::assembledName() const 1588QString Addressee::assembledName() const
1589{ 1589{
1590 QString name = prefix() + " " + givenName() + " " + additionalName() + " " + 1590 QString name = prefix() + " " + givenName() + " " + additionalName() + " " +
1591 familyName() + " " + suffix(); 1591 familyName() + " " + suffix();
1592 1592
1593 return name.simplifyWhiteSpace(); 1593 return name.simplifyWhiteSpace();
1594} 1594}
1595 1595
1596QString Addressee::fullEmail( const QString &email ) const 1596QString Addressee::fullEmail( const QString &email ) const
1597{ 1597{
1598 QString e; 1598 QString e;
1599 if ( email.isNull() ) { 1599 if ( email.isNull() ) {
1600 e = preferredEmail(); 1600 e = preferredEmail();
1601 } else { 1601 } else {
1602 e = email; 1602 e = email;
1603 } 1603 }
1604 if ( e.isEmpty() ) return QString::null; 1604 if ( e.isEmpty() ) return QString::null;
1605 1605
1606 QString text; 1606 QString text;
1607 if ( realName().isEmpty() ) 1607 if ( realName().isEmpty() )
1608 text = e; 1608 text = e;
1609 else 1609 else
1610 text = assembledName() + " <" + e + ">"; 1610 text = assembledName() + " <" + e + ">";
1611 1611
1612 return text; 1612 return text;
1613} 1613}
1614 1614
1615void Addressee::insertEmail( const QString &email, bool preferred ) 1615void Addressee::insertEmail( const QString &email, bool preferred )
1616{ 1616{
1617 detach(); 1617 detach();
1618 1618
1619 QStringList::Iterator it = mData->emails.find( email ); 1619 QStringList::Iterator it = mData->emails.find( email );
1620 1620
1621 if ( it != mData->emails.end() ) { 1621 if ( it != mData->emails.end() ) {
1622 if ( !preferred || it == mData->emails.begin() ) return; 1622 if ( !preferred || it == mData->emails.begin() ) return;
1623 mData->emails.remove( it ); 1623 mData->emails.remove( it );
1624 mData->emails.prepend( email ); 1624 mData->emails.prepend( email );
1625 } else { 1625 } else {
1626 if ( preferred ) { 1626 if ( preferred ) {
1627 mData->emails.prepend( email ); 1627 mData->emails.prepend( email );
1628 } else { 1628 } else {
1629 mData->emails.append( email ); 1629 mData->emails.append( email );
1630 } 1630 }
1631 } 1631 }
1632} 1632}
1633 1633
1634void Addressee::removeEmail( const QString &email ) 1634void Addressee::removeEmail( const QString &email )
1635{ 1635{
1636 detach(); 1636 detach();
1637 1637
1638 QStringList::Iterator it = mData->emails.find( email ); 1638 QStringList::Iterator it = mData->emails.find( email );
1639 if ( it == mData->emails.end() ) return; 1639 if ( it == mData->emails.end() ) return;
1640 1640
1641 mData->emails.remove( it ); 1641 mData->emails.remove( it );
1642} 1642}
1643 1643
1644QString Addressee::preferredEmail() const 1644QString Addressee::preferredEmail() const
1645{ 1645{
1646 if ( mData->emails.count() == 0 ) return QString::null; 1646 if ( mData->emails.count() == 0 ) return QString::null;
1647 else return mData->emails.first(); 1647 else return mData->emails.first();
1648} 1648}
1649 1649
1650QStringList Addressee::emails() const 1650QStringList Addressee::emails() const
1651{ 1651{
1652 return mData->emails; 1652 return mData->emails;
1653} 1653}
1654void Addressee::setEmails( const QStringList& emails ) { 1654void Addressee::setEmails( const QStringList& emails ) {
1655 detach(); 1655 detach();
1656 mData->emails = emails; 1656 mData->emails = emails;
1657} 1657}
1658void Addressee::insertPhoneNumber( const PhoneNumber &phoneNumber ) 1658void Addressee::insertPhoneNumber( const PhoneNumber &phoneNumber )
1659{ 1659{
1660 detach(); 1660 detach();
1661 mData->empty = false; 1661 mData->empty = false;
1662 1662
1663 PhoneNumber::List::Iterator it; 1663 PhoneNumber::List::Iterator it;
1664 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1664 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1665 if ( (*it).id() == phoneNumber.id() ) { 1665 if ( (*it).id() == phoneNumber.id() ) {
1666 *it = phoneNumber; 1666 *it = phoneNumber;
1667 return; 1667 return;
1668 } 1668 }
1669 } 1669 }
1670 mData->phoneNumbers.append( phoneNumber ); 1670 mData->phoneNumbers.append( phoneNumber );
1671} 1671}
1672 1672
1673void Addressee::removePhoneNumber( const PhoneNumber &phoneNumber ) 1673void Addressee::removePhoneNumber( const PhoneNumber &phoneNumber )
1674{ 1674{
1675 detach(); 1675 detach();
1676 1676
1677 PhoneNumber::List::Iterator it; 1677 PhoneNumber::List::Iterator it;
1678 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1678 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1679 if ( (*it).id() == phoneNumber.id() ) { 1679 if ( (*it).id() == phoneNumber.id() ) {
1680 mData->phoneNumbers.remove( it ); 1680 mData->phoneNumbers.remove( it );
1681 return; 1681 return;
1682 } 1682 }
1683 } 1683 }
1684} 1684}
1685 1685
1686PhoneNumber Addressee::phoneNumber( int type ) const 1686PhoneNumber Addressee::phoneNumber( int type ) const
1687{ 1687{
1688 PhoneNumber phoneNumber( "", type ); 1688 PhoneNumber phoneNumber( "", type );
1689 PhoneNumber::List::ConstIterator it; 1689 PhoneNumber::List::ConstIterator it;
1690 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1690 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1691 if ( matchBinaryPatternP( (*it).type(), type ) ) { 1691 if ( matchBinaryPatternP( (*it).type(), type ) ) {
1692 if ( (*it).type() & PhoneNumber::Pref ) 1692 if ( (*it).type() & PhoneNumber::Pref )
1693 return (*it); 1693 return (*it);
1694 else if ( phoneNumber.number().isEmpty() ) 1694 else if ( phoneNumber.number().isEmpty() )
1695 phoneNumber = (*it); 1695 phoneNumber = (*it);
1696 } 1696 }
1697 } 1697 }
1698 1698
1699 return phoneNumber; 1699 return phoneNumber;
1700} 1700}
1701 1701
1702PhoneNumber::List Addressee::phoneNumbers() const 1702PhoneNumber::List Addressee::phoneNumbers() const
1703{ 1703{
1704 return mData->phoneNumbers; 1704 return mData->phoneNumbers;
1705} 1705}
1706 1706
1707int Addressee::hasPhoneNumberType( int type ) 1707int Addressee::hasPhoneNumberType( int type )
1708{ 1708{
1709 int retval = 0; 1709 int retval = 0;
1710 PhoneNumber::List::ConstIterator it; 1710 PhoneNumber::List::ConstIterator it;
1711 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1711 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1712 if ( (*it).type() == type ) 1712 if ( (*it).type() == type )
1713 ++retval; 1713 ++retval;
1714 } 1714 }
1715 return retval; 1715 return retval;
1716} 1716}
1717PhoneNumber::List Addressee::phoneNumbers( int type ) const 1717PhoneNumber::List Addressee::phoneNumbers( int type ) const
1718{ 1718{
1719 PhoneNumber::List list; 1719 PhoneNumber::List list;
1720 1720
1721 PhoneNumber::List::ConstIterator it; 1721 PhoneNumber::List::ConstIterator it;
1722 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1722 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1723 if ( matchBinaryPattern( (*it).type(), type ) ) { 1723 if ( matchBinaryPattern( (*it).type(), type ) ) {
1724 list.append( *it ); 1724 list.append( *it );
1725 } 1725 }
1726 } 1726 }
1727 return list; 1727 return list;
1728} 1728}
1729 1729
1730PhoneNumber Addressee::findPhoneNumber( const QString &id ) const 1730PhoneNumber Addressee::findPhoneNumber( const QString &id ) const
1731{ 1731{
1732 PhoneNumber::List::ConstIterator it; 1732 PhoneNumber::List::ConstIterator it;
1733 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 1733 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
1734 if ( (*it).id() == id ) { 1734 if ( (*it).id() == id ) {
1735 return *it; 1735 return *it;
1736 } 1736 }
1737 } 1737 }
1738 return PhoneNumber(); 1738 return PhoneNumber();
1739} 1739}
1740 1740
1741void Addressee::insertKey( const Key &key ) 1741void Addressee::insertKey( const Key &key )
1742{ 1742{
1743 detach(); 1743 detach();
1744 mData->empty = false; 1744 mData->empty = false;
1745 1745
1746 Key::List::Iterator it; 1746 Key::List::Iterator it;
1747 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1747 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1748 if ( (*it).id() == key.id() ) { 1748 if ( (*it).id() == key.id() ) {
1749 *it = key; 1749 *it = key;
1750 return; 1750 return;
1751 } 1751 }
1752 } 1752 }
1753 mData->keys.append( key ); 1753 mData->keys.append( key );
1754} 1754}
1755 1755
1756void Addressee::removeKey( const Key &key ) 1756void Addressee::removeKey( const Key &key )
1757{ 1757{
1758 detach(); 1758 detach();
1759 1759
1760 Key::List::Iterator it; 1760 Key::List::Iterator it;
1761 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1761 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1762 if ( (*it).id() == key.id() ) { 1762 if ( (*it).id() == key.id() ) {
1763 mData->keys.remove( key ); 1763 mData->keys.remove( key );
1764 return; 1764 return;
1765 } 1765 }
1766 } 1766 }
1767} 1767}
1768 1768
1769Key Addressee::key( int type, QString customTypeString ) const 1769Key Addressee::key( int type, QString customTypeString ) const
1770{ 1770{
1771 Key::List::ConstIterator it; 1771 Key::List::ConstIterator it;
1772 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1772 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1773 if ( (*it).type() == type ) { 1773 if ( (*it).type() == type ) {
1774 if ( type == Key::Custom ) { 1774 if ( type == Key::Custom ) {
1775 if ( customTypeString.isEmpty() ) { 1775 if ( customTypeString.isEmpty() ) {
1776 return *it; 1776 return *it;
1777 } else { 1777 } else {
1778 if ( (*it).customTypeString() == customTypeString ) 1778 if ( (*it).customTypeString() == customTypeString )
1779 return (*it); 1779 return (*it);
1780 } 1780 }
1781 } else { 1781 } else {
1782 return *it; 1782 return *it;
1783 } 1783 }
1784 } 1784 }
1785 } 1785 }
1786 return Key( QString(), type ); 1786 return Key( QString(), type );
1787} 1787}
1788void Addressee::setKeys( const Key::List& list ) { 1788void Addressee::setKeys( const Key::List& list ) {
1789 detach(); 1789 detach();
1790 mData->keys = list; 1790 mData->keys = list;
1791} 1791}
1792 1792
1793Key::List Addressee::keys() const 1793Key::List Addressee::keys() const
1794{ 1794{
1795 return mData->keys; 1795 return mData->keys;
1796} 1796}
1797 1797
1798Key::List Addressee::keys( int type, QString customTypeString ) const 1798Key::List Addressee::keys( int type, QString customTypeString ) const
1799{ 1799{
1800 Key::List list; 1800 Key::List list;
1801 1801
1802 Key::List::ConstIterator it; 1802 Key::List::ConstIterator it;
1803 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1803 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1804 if ( (*it).type() == type ) { 1804 if ( (*it).type() == type ) {
1805 if ( type == Key::Custom ) { 1805 if ( type == Key::Custom ) {
1806 if ( customTypeString.isEmpty() ) { 1806 if ( customTypeString.isEmpty() ) {
1807 list.append(*it); 1807 list.append(*it);
1808 } else { 1808 } else {
1809 if ( (*it).customTypeString() == customTypeString ) 1809 if ( (*it).customTypeString() == customTypeString )
1810 list.append(*it); 1810 list.append(*it);
1811 } 1811 }
1812 } else { 1812 } else {
1813 list.append(*it); 1813 list.append(*it);
1814 } 1814 }
1815 } 1815 }
1816 } 1816 }
1817 return list; 1817 return list;
1818} 1818}
1819 1819
1820Key Addressee::findKey( const QString &id ) const 1820Key Addressee::findKey( const QString &id ) const
1821{ 1821{
1822 Key::List::ConstIterator it; 1822 Key::List::ConstIterator it;
1823 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { 1823 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
1824 if ( (*it).id() == id ) { 1824 if ( (*it).id() == id ) {
1825 return *it; 1825 return *it;
1826 } 1826 }
1827 } 1827 }
1828 return Key(); 1828 return Key();
1829} 1829}
1830 1830
1831QString Addressee::asString() const 1831QString Addressee::asString() const
1832{ 1832{
1833 return "Smith, agent Smith..."; 1833 return "Smith, agent Smith...";
1834} 1834}
1835 1835
1836void Addressee::dump() const 1836void Addressee::dump() const
1837{ 1837{
1838 return; 1838 return;
1839#if 0 1839#if 0
1840 kdDebug(5700) << "Addressee {" << endl; 1840 kdDebug(5700) << "Addressee {" << endl;
1841 1841
1842 kdDebug(5700) << " Uid: '" << uid() << "'" << endl; 1842 kdDebug(5700) << " Uid: '" << uid() << "'" << endl;
1843 1843
1844 kdDebug(5700) << " Name: '" << name() << "'" << endl; 1844 kdDebug(5700) << " Name: '" << name() << "'" << endl;
1845 kdDebug(5700) << " FormattedName: '" << formattedName() << "'" << endl; 1845 kdDebug(5700) << " FormattedName: '" << formattedName() << "'" << endl;
1846 kdDebug(5700) << " FamilyName: '" << familyName() << "'" << endl; 1846 kdDebug(5700) << " FamilyName: '" << familyName() << "'" << endl;
1847 kdDebug(5700) << " GivenName: '" << givenName() << "'" << endl; 1847 kdDebug(5700) << " GivenName: '" << givenName() << "'" << endl;
1848 kdDebug(5700) << " AdditionalName: '" << additionalName() << "'" << endl; 1848 kdDebug(5700) << " AdditionalName: '" << additionalName() << "'" << endl;
1849 kdDebug(5700) << " Prefix: '" << prefix() << "'" << endl; 1849 kdDebug(5700) << " Prefix: '" << prefix() << "'" << endl;
1850 kdDebug(5700) << " Suffix: '" << suffix() << "'" << endl; 1850 kdDebug(5700) << " Suffix: '" << suffix() << "'" << endl;
1851 kdDebug(5700) << " NickName: '" << nickName() << "'" << endl; 1851 kdDebug(5700) << " NickName: '" << nickName() << "'" << endl;
1852 kdDebug(5700) << " Birthday: '" << birthday().toString() << "'" << endl; 1852 kdDebug(5700) << " Birthday: '" << birthday().toString() << "'" << endl;
1853 kdDebug(5700) << " Mailer: '" << mailer() << "'" << endl; 1853 kdDebug(5700) << " Mailer: '" << mailer() << "'" << endl;
1854 kdDebug(5700) << " TimeZone: '" << timeZone().asString() << "'" << endl; 1854 kdDebug(5700) << " TimeZone: '" << timeZone().asString() << "'" << endl;
1855 kdDebug(5700) << " Geo: '" << geo().asString() << "'" << endl; 1855 kdDebug(5700) << " Geo: '" << geo().asString() << "'" << endl;
1856 kdDebug(5700) << " Title: '" << title() << "'" << endl; 1856 kdDebug(5700) << " Title: '" << title() << "'" << endl;
1857 kdDebug(5700) << " Role: '" << role() << "'" << endl; 1857 kdDebug(5700) << " Role: '" << role() << "'" << endl;
1858 kdDebug(5700) << " Organization: '" << organization() << "'" << endl; 1858 kdDebug(5700) << " Organization: '" << organization() << "'" << endl;
1859 kdDebug(5700) << " Note: '" << note() << "'" << endl; 1859 kdDebug(5700) << " Note: '" << note() << "'" << endl;
1860 kdDebug(5700) << " ProductId: '" << productId() << "'" << endl; 1860 kdDebug(5700) << " ProductId: '" << productId() << "'" << endl;
1861 kdDebug(5700) << " Revision: '" << revision().toString() << "'" << endl; 1861 kdDebug(5700) << " Revision: '" << revision().toString() << "'" << endl;
1862 kdDebug(5700) << " SortString: '" << sortString() << "'" << endl; 1862 kdDebug(5700) << " SortString: '" << sortString() << "'" << endl;
1863 kdDebug(5700) << " Url: '" << url().url() << "'" << endl; 1863 kdDebug(5700) << " Url: '" << url().url() << "'" << endl;
1864 kdDebug(5700) << " Secrecy: '" << secrecy().asString() << "'" << endl; 1864 kdDebug(5700) << " Secrecy: '" << secrecy().asString() << "'" << endl;
1865 kdDebug(5700) << " Logo: '" << logo().asString() << "'" << endl; 1865 kdDebug(5700) << " Logo: '" << logo().asString() << "'" << endl;
1866 kdDebug(5700) << " Photo: '" << photo().asString() << "'" << endl; 1866 kdDebug(5700) << " Photo: '" << photo().asString() << "'" << endl;
1867 kdDebug(5700) << " Sound: '" << sound().asString() << "'" << endl; 1867 kdDebug(5700) << " Sound: '" << sound().asString() << "'" << endl;
1868 kdDebug(5700) << " Agent: '" << agent().asString() << "'" << endl; 1868 kdDebug(5700) << " Agent: '" << agent().asString() << "'" << endl;
1869 1869
1870 kdDebug(5700) << " Emails {" << endl; 1870 kdDebug(5700) << " Emails {" << endl;
1871 QStringList e = emails(); 1871 QStringList e = emails();
1872 QStringList::ConstIterator it; 1872 QStringList::ConstIterator it;
1873 for( it = e.begin(); it != e.end(); ++it ) { 1873 for( it = e.begin(); it != e.end(); ++it ) {
1874 kdDebug(5700) << " " << (*it) << endl; 1874 kdDebug(5700) << " " << (*it) << endl;
1875 } 1875 }
1876 kdDebug(5700) << " }" << endl; 1876 kdDebug(5700) << " }" << endl;
1877 1877
1878 kdDebug(5700) << " PhoneNumbers {" << endl; 1878 kdDebug(5700) << " PhoneNumbers {" << endl;
1879 PhoneNumber::List p = phoneNumbers(); 1879 PhoneNumber::List p = phoneNumbers();
1880 PhoneNumber::List::ConstIterator it2; 1880 PhoneNumber::List::ConstIterator it2;
1881 for( it2 = p.begin(); it2 != p.end(); ++it2 ) { 1881 for( it2 = p.begin(); it2 != p.end(); ++it2 ) {
1882 kdDebug(5700) << " Type: " << int((*it2).type()) << " Number: " << (*it2).number() << endl; 1882 kdDebug(5700) << " Type: " << int((*it2).type()) << " Number: " << (*it2).number() << endl;
1883 } 1883 }
1884 kdDebug(5700) << " }" << endl; 1884 kdDebug(5700) << " }" << endl;
1885 1885
1886 Address::List a = addresses(); 1886 Address::List a = addresses();
1887 Address::List::ConstIterator it3; 1887 Address::List::ConstIterator it3;
1888 for( it3 = a.begin(); it3 != a.end(); ++it3 ) { 1888 for( it3 = a.begin(); it3 != a.end(); ++it3 ) {
1889 (*it3).dump(); 1889 (*it3).dump();
1890 } 1890 }
1891 1891
1892 kdDebug(5700) << " Keys {" << endl; 1892 kdDebug(5700) << " Keys {" << endl;
1893 Key::List k = keys(); 1893 Key::List k = keys();
1894 Key::List::ConstIterator it4; 1894 Key::List::ConstIterator it4;
1895 for( it4 = k.begin(); it4 != k.end(); ++it4 ) { 1895 for( it4 = k.begin(); it4 != k.end(); ++it4 ) {
1896 kdDebug(5700) << " Type: " << int((*it4).type()) << 1896 kdDebug(5700) << " Type: " << int((*it4).type()) <<
1897 " Key: " << (*it4).textData() << 1897 " Key: " << (*it4).textData() <<
1898 " CustomString: " << (*it4).customTypeString() << endl; 1898 " CustomString: " << (*it4).customTypeString() << endl;
1899 } 1899 }
1900 kdDebug(5700) << " }" << endl; 1900 kdDebug(5700) << " }" << endl;
1901 1901
1902 kdDebug(5700) << "}" << endl; 1902 kdDebug(5700) << "}" << endl;
1903#endif 1903#endif
1904} 1904}
1905 1905
1906 1906
1907void Addressee::insertAddress( const Address &address ) 1907void Addressee::insertAddress( const Address &address )
1908{ 1908{
1909 detach(); 1909 detach();
1910 mData->empty = false; 1910 mData->empty = false;
1911 1911
1912 Address::List::Iterator it; 1912 Address::List::Iterator it;
1913 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1913 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1914 if ( (*it).id() == address.id() ) { 1914 if ( (*it).id() == address.id() ) {
1915 *it = address; 1915 *it = address;
1916 return; 1916 return;
1917 } 1917 }
1918 } 1918 }
1919 mData->addresses.append( address ); 1919 mData->addresses.append( address );
1920} 1920}
1921 1921
1922void Addressee::removeAddress( const Address &address ) 1922void Addressee::removeAddress( const Address &address )
1923{ 1923{
1924 detach(); 1924 detach();
1925 1925
1926 Address::List::Iterator it; 1926 Address::List::Iterator it;
1927 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1927 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1928 if ( (*it).id() == address.id() ) { 1928 if ( (*it).id() == address.id() ) {
1929 mData->addresses.remove( it ); 1929 mData->addresses.remove( it );
1930 return; 1930 return;
1931 } 1931 }
1932 } 1932 }
1933} 1933}
1934 1934
1935Address Addressee::address( int type ) const 1935Address Addressee::address( int type ) const
1936{ 1936{
1937 Address address( type ); 1937 Address address( type );
1938 Address::List::ConstIterator it; 1938 Address::List::ConstIterator it;
1939 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1939 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1940 if ( matchBinaryPatternA( (*it).type(), type ) ) { 1940 if ( matchBinaryPatternA( (*it).type(), type ) ) {
1941 if ( (*it).type() & Address::Pref ) 1941 if ( (*it).type() & Address::Pref )
1942 return (*it); 1942 return (*it);
1943 else if ( address.isEmpty() ) 1943 else if ( address.isEmpty() )
1944 address = (*it); 1944 address = (*it);
1945 } 1945 }
1946 } 1946 }
1947 1947
1948 return address; 1948 return address;
1949} 1949}
1950 1950
1951Address::List Addressee::addresses() const 1951Address::List Addressee::addresses() const
1952{ 1952{
1953 return mData->addresses; 1953 return mData->addresses;
1954} 1954}
1955 1955
1956Address::List Addressee::addresses( int type ) const 1956Address::List Addressee::addresses( int type ) const
1957{ 1957{
1958 Address::List list; 1958 Address::List list;
1959 1959
1960 Address::List::ConstIterator it; 1960 Address::List::ConstIterator it;
1961 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1961 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1962 if ( matchBinaryPattern( (*it).type(), type ) ) { 1962 if ( matchBinaryPattern( (*it).type(), type ) ) {
1963 list.append( *it ); 1963 list.append( *it );
1964 } 1964 }
1965 } 1965 }
1966 1966
1967 return list; 1967 return list;
1968} 1968}
1969 1969
1970Address Addressee::findAddress( const QString &id ) const 1970Address Addressee::findAddress( const QString &id ) const
1971{ 1971{
1972 Address::List::ConstIterator it; 1972 Address::List::ConstIterator it;
1973 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 1973 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
1974 if ( (*it).id() == id ) { 1974 if ( (*it).id() == id ) {
1975 return *it; 1975 return *it;
1976 } 1976 }
1977 } 1977 }
1978 return Address(); 1978 return Address();
1979} 1979}
1980 1980
1981void Addressee::insertCategory( const QString &c ) 1981void Addressee::insertCategory( const QString &c )
1982{ 1982{
1983 detach(); 1983 detach();
1984 mData->empty = false; 1984 mData->empty = false;
1985 1985
1986 if ( mData->categories.contains( c ) ) return; 1986 if ( mData->categories.contains( c ) ) return;
1987 1987
1988 mData->categories.append( c ); 1988 mData->categories.append( c );
1989} 1989}
1990 1990
1991void Addressee::removeCategory( const QString &c ) 1991void Addressee::removeCategory( const QString &c )
1992{ 1992{
1993 detach(); 1993 detach();
1994 1994
1995 QStringList::Iterator it = mData->categories.find( c ); 1995 QStringList::Iterator it = mData->categories.find( c );
1996 if ( it == mData->categories.end() ) return; 1996 if ( it == mData->categories.end() ) return;
1997 1997
1998 mData->categories.remove( it ); 1998 mData->categories.remove( it );
1999} 1999}
2000 2000
2001bool Addressee::hasCategory( const QString &c ) const 2001bool Addressee::hasCategory( const QString &c ) const
2002{ 2002{
2003 return ( mData->categories.contains( c ) ); 2003 return ( mData->categories.contains( c ) );
2004} 2004}
2005 2005
2006void Addressee::setCategories( const QStringList &c ) 2006void Addressee::setCategories( const QStringList &c )
2007{ 2007{
2008 detach(); 2008 detach();
2009 mData->empty = false; 2009 mData->empty = false;
2010 2010
2011 mData->categories = c; 2011 mData->categories = c;
2012} 2012}
2013 2013
2014QStringList Addressee::categories() const 2014QStringList Addressee::categories() const
2015{ 2015{
2016 return mData->categories; 2016 return mData->categories;
2017} 2017}
2018 2018
2019void Addressee::insertCustom( const QString &app, const QString &name, 2019void Addressee::insertCustom( const QString &app, const QString &name,
2020 const QString &value ) 2020 const QString &value )
2021{ 2021{
2022 if ( value.isNull() || name.isEmpty() || app.isEmpty() ) return; 2022 if ( value.isNull() || name.isEmpty() || app.isEmpty() ) return;
2023 2023
2024 detach(); 2024 detach();
2025 mData->empty = false; 2025 mData->empty = false;
2026 2026
2027 QString qualifiedName = app + "-" + name + ":"; 2027 QString qualifiedName = app + "-" + name + ":";
2028 2028
2029 QStringList::Iterator it; 2029 QStringList::Iterator it;
2030 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) { 2030 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
2031 if ( (*it).startsWith( qualifiedName ) ) { 2031 if ( (*it).startsWith( qualifiedName ) ) {
2032 (*it) = qualifiedName + value; 2032 (*it) = qualifiedName + value;
2033 return; 2033 return;
2034 } 2034 }
2035 } 2035 }
2036 mData->custom.append( qualifiedName + value ); 2036 mData->custom.append( qualifiedName + value );
2037} 2037}
2038 2038
2039void Addressee::removeCustom( const QString &app, const QString &name) 2039void Addressee::removeCustom( const QString &app, const QString &name)
2040{ 2040{
2041 detach(); 2041 detach();
2042 2042
2043 QString qualifiedName = app + "-" + name + ":"; 2043 QString qualifiedName = app + "-" + name + ":";
2044 2044
2045 QStringList::Iterator it; 2045 QStringList::Iterator it;
2046 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) { 2046 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
2047 if ( (*it).startsWith( qualifiedName ) ) { 2047 if ( (*it).startsWith( qualifiedName ) ) {
2048 mData->custom.remove( it ); 2048 mData->custom.remove( it );
2049 return; 2049 return;
2050 } 2050 }
2051 } 2051 }
2052} 2052}
2053 2053
2054QString Addressee::custom( const QString &app, const QString &name ) const 2054QString Addressee::custom( const QString &app, const QString &name ) const
2055{ 2055{
2056 QString qualifiedName = app + "-" + name + ":"; 2056 QString qualifiedName = app + "-" + name + ":";
2057 QString value; 2057 QString value;
2058 2058
2059 QStringList::ConstIterator it; 2059 QStringList::ConstIterator it;
2060 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) { 2060 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
2061 if ( (*it).startsWith( qualifiedName ) ) { 2061 if ( (*it).startsWith( qualifiedName ) ) {
2062 value = (*it).mid( (*it).find( ":" ) + 1 ); 2062 value = (*it).mid( (*it).find( ":" ) + 1 );
2063 break; 2063 break;
2064 } 2064 }
2065 } 2065 }
2066 2066
2067 return value; 2067 return value;
2068} 2068}
2069 2069
2070void Addressee::setCustoms( const QStringList &l ) 2070void Addressee::setCustoms( const QStringList &l )
2071{ 2071{
2072 detach(); 2072 detach();
2073 mData->empty = false; 2073 mData->empty = false;
2074 2074
2075 mData->custom = l; 2075 mData->custom = l;
2076} 2076}
2077 2077
2078QStringList Addressee::customs() const 2078QStringList Addressee::customs() const
2079{ 2079{
2080 return mData->custom; 2080 return mData->custom;
2081} 2081}
2082 2082
2083void Addressee::parseEmailAddress( const QString &rawEmail, QString &fullName, 2083void Addressee::parseEmailAddress( const QString &rawEmail, QString &fullName,
2084 QString &email) 2084 QString &email)
2085{ 2085{
2086 int startPos, endPos, len; 2086 int startPos, endPos, len;
2087 QString partA, partB, result; 2087 QString partA, partB, result;
2088 char endCh = '>'; 2088 char endCh = '>';
2089 2089
2090 startPos = rawEmail.find('<'); 2090 startPos = rawEmail.find('<');
2091 if (startPos < 0) 2091 if (startPos < 0)
2092 { 2092 {
2093 startPos = rawEmail.find('('); 2093 startPos = rawEmail.find('(');
2094 endCh = ')'; 2094 endCh = ')';
2095 } 2095 }
2096 if (startPos < 0) 2096 if (startPos < 0)
2097 { 2097 {
2098 // We couldn't find any separators, so we assume the whole string 2098 // We couldn't find any separators, so we assume the whole string
2099 // is the email address 2099 // is the email address
2100 email = rawEmail; 2100 email = rawEmail;
2101 fullName = ""; 2101 fullName = "";
2102 } 2102 }
2103 else 2103 else
2104 { 2104 {
2105 // We have a start position, try to find an end 2105 // We have a start position, try to find an end
2106 endPos = rawEmail.find(endCh, startPos+1); 2106 endPos = rawEmail.find(endCh, startPos+1);
2107 2107
2108 if (endPos < 0) 2108 if (endPos < 0)
2109 { 2109 {
2110 // We couldn't find the end of the email address. We can only 2110 // We couldn't find the end of the email address. We can only
2111 // assume the entire string is the email address. 2111 // assume the entire string is the email address.
2112 email = rawEmail; 2112 email = rawEmail;
2113 fullName = ""; 2113 fullName = "";
2114 } 2114 }
2115 else 2115 else
2116 { 2116 {
2117 // We have a start and end to the email address 2117 // We have a start and end to the email address
2118 2118
2119 // Grab the name part 2119 // Grab the name part
2120 fullName = rawEmail.left(startPos).stripWhiteSpace(); 2120 fullName = rawEmail.left(startPos).stripWhiteSpace();
2121 2121
2122 // grab the email part 2122 // grab the email part
2123 email = rawEmail.mid(startPos+1, endPos-startPos-1).stripWhiteSpace(); 2123 email = rawEmail.mid(startPos+1, endPos-startPos-1).stripWhiteSpace();
2124 2124
2125 // Check that we do not have any extra characters on the end of the 2125 // Check that we do not have any extra characters on the end of the
2126 // strings 2126 // strings
2127 len = fullName.length(); 2127 len = fullName.length();
2128 if (fullName[0]=='"' && fullName[len-1]=='"') 2128 if (fullName[0]=='"' && fullName[len-1]=='"')
2129 fullName = fullName.mid(1, len-2); 2129 fullName = fullName.mid(1, len-2);
2130 else if (fullName[0]=='<' && fullName[len-1]=='>') 2130 else if (fullName[0]=='<' && fullName[len-1]=='>')
2131 fullName = fullName.mid(1, len-2); 2131 fullName = fullName.mid(1, len-2);
2132 else if (fullName[0]=='(' && fullName[len-1]==')') 2132 else if (fullName[0]=='(' && fullName[len-1]==')')
2133 fullName = fullName.mid(1, len-2); 2133 fullName = fullName.mid(1, len-2);
2134 } 2134 }
2135 } 2135 }
2136} 2136}
2137 2137
2138void Addressee::setResource( Resource *resource ) 2138void Addressee::setResource( Resource *resource )
2139{ 2139{
2140 detach(); 2140 detach();
2141 mData->resource = resource; 2141 mData->resource = resource;
2142} 2142}
2143 2143
2144Resource *Addressee::resource() const 2144Resource *Addressee::resource() const
2145{ 2145{
2146 return mData->resource; 2146 return mData->resource;
2147} 2147}
2148 2148
2149//US 2149//US
2150QString Addressee::resourceLabel() 2150QString Addressee::resourceLabel()
2151{ 2151{
2152 return i18n("Resource"); 2152 return i18n("Resource");
2153} 2153}
2154QString Addressee::categoryLabel() 2154QString Addressee::categoryLabel()
2155{ 2155{
2156 return i18n("Category"); 2156 return i18n("Category");
2157} 2157}
2158 2158
2159void Addressee::setChanged( bool value ) 2159void Addressee::setChanged( bool value )
2160{ 2160{
2161 detach(); 2161 detach();
2162 mData->changed = value; 2162 mData->changed = value;
2163} 2163}
2164 2164
2165bool Addressee::changed() const 2165bool Addressee::changed() const
2166{ 2166{
2167 return mData->changed; 2167 return mData->changed;
2168} 2168}
2169 2169
2170void Addressee::setTagged( bool value ) 2170void Addressee::setTagged( bool value )
2171{ 2171{
2172 detach(); 2172 detach();
2173 mData->tagged = value; 2173 mData->tagged = value;
2174} 2174}
2175 2175
2176bool Addressee::tagged() const 2176bool Addressee::tagged() const
2177{ 2177{
2178 return mData->tagged; 2178 return mData->tagged;
2179} 2179}
2180 2180
2181QDataStream &KABC::operator<<( QDataStream &s, const Addressee &a ) 2181QDataStream &KABC::operator<<( QDataStream &s, const Addressee &a )
2182{ 2182{
2183 if (!a.mData) return s; 2183 if (!a.mData) return s;
2184 2184
2185 s << a.uid(); 2185 s << a.uid();
2186 2186
2187 s << a.mData->name; 2187 s << a.mData->name;
2188 s << a.mData->formattedName; 2188 s << a.mData->formattedName;
2189 s << a.mData->familyName; 2189 s << a.mData->familyName;
2190 s << a.mData->givenName; 2190 s << a.mData->givenName;
2191 s << a.mData->additionalName; 2191 s << a.mData->additionalName;
2192 s << a.mData->prefix; 2192 s << a.mData->prefix;
2193 s << a.mData->suffix; 2193 s << a.mData->suffix;
2194 s << a.mData->nickName; 2194 s << a.mData->nickName;
2195 s << a.mData->birthday; 2195 s << a.mData->birthday;
2196 s << a.mData->mailer; 2196 s << a.mData->mailer;
2197 s << a.mData->timeZone; 2197 s << a.mData->timeZone;
2198 s << a.mData->geo; 2198 s << a.mData->geo;
2199 s << a.mData->title; 2199 s << a.mData->title;
2200 s << a.mData->role; 2200 s << a.mData->role;
2201 s << a.mData->organization; 2201 s << a.mData->organization;
2202 s << a.mData->note; 2202 s << a.mData->note;
2203 s << a.mData->productId; 2203 s << a.mData->productId;
2204 s << a.mData->revision; 2204 s << a.mData->revision;
2205 s << a.mData->sortString; 2205 s << a.mData->sortString;
2206 s << a.mData->url; 2206 s << a.mData->url;
2207 s << a.mData->secrecy; 2207 s << a.mData->secrecy;
2208 s << a.mData->logo; 2208 s << a.mData->logo;
2209 s << a.mData->photo; 2209 s << a.mData->photo;
2210 s << a.mData->sound; 2210 s << a.mData->sound;
2211 s << a.mData->agent; 2211 s << a.mData->agent;
2212 s << a.mData->phoneNumbers; 2212 s << a.mData->phoneNumbers;
2213 s << a.mData->addresses; 2213 s << a.mData->addresses;
2214 s << a.mData->emails; 2214 s << a.mData->emails;
2215 s << a.mData->categories; 2215 s << a.mData->categories;
2216 s << a.mData->custom; 2216 s << a.mData->custom;
2217 s << a.mData->keys; 2217 s << a.mData->keys;
2218 return s; 2218 return s;
2219} 2219}
2220 2220
2221QDataStream &KABC::operator>>( QDataStream &s, Addressee &a ) 2221QDataStream &KABC::operator>>( QDataStream &s, Addressee &a )
2222{ 2222{
2223 if (!a.mData) return s; 2223 if (!a.mData) return s;
2224 2224
2225 s >> a.mData->uid; 2225 s >> a.mData->uid;
2226 2226
2227 s >> a.mData->name; 2227 s >> a.mData->name;
2228 s >> a.mData->formattedName; 2228 s >> a.mData->formattedName;
2229 s >> a.mData->familyName; 2229 s >> a.mData->familyName;
2230 s >> a.mData->givenName; 2230 s >> a.mData->givenName;
2231 s >> a.mData->additionalName; 2231 s >> a.mData->additionalName;
2232 s >> a.mData->prefix; 2232 s >> a.mData->prefix;
2233 s >> a.mData->suffix; 2233 s >> a.mData->suffix;
2234 s >> a.mData->nickName; 2234 s >> a.mData->nickName;
2235 s >> a.mData->birthday; 2235 s >> a.mData->birthday;
2236 s >> a.mData->mailer; 2236 s >> a.mData->mailer;
2237 s >> a.mData->timeZone; 2237 s >> a.mData->timeZone;
2238 s >> a.mData->geo; 2238 s >> a.mData->geo;
2239 s >> a.mData->title; 2239 s >> a.mData->title;
2240 s >> a.mData->role; 2240 s >> a.mData->role;
2241 s >> a.mData->organization; 2241 s >> a.mData->organization;
2242 s >> a.mData->note; 2242 s >> a.mData->note;
2243 s >> a.mData->productId; 2243 s >> a.mData->productId;
2244 s >> a.mData->revision; 2244 s >> a.mData->revision;
2245 s >> a.mData->sortString; 2245 s >> a.mData->sortString;
2246 s >> a.mData->url; 2246 s >> a.mData->url;
2247 s >> a.mData->secrecy; 2247 s >> a.mData->secrecy;
2248 s >> a.mData->logo; 2248 s >> a.mData->logo;
2249 s >> a.mData->photo; 2249 s >> a.mData->photo;
2250 s >> a.mData->sound; 2250 s >> a.mData->sound;
2251 s >> a.mData->agent; 2251 s >> a.mData->agent;
2252 s >> a.mData->phoneNumbers; 2252 s >> a.mData->phoneNumbers;
2253 s >> a.mData->addresses; 2253 s >> a.mData->addresses;
2254 s >> a.mData->emails; 2254 s >> a.mData->emails;
2255 s >> a.mData->categories; 2255 s >> a.mData->categories;
2256 s >> a.mData->custom; 2256 s >> a.mData->custom;
2257 s >> a.mData->keys; 2257 s >> a.mData->keys;
2258 2258
2259 a.mData->empty = false; 2259 a.mData->empty = false;
2260 2260
2261 return s; 2261 return s;
2262} 2262}
2263bool matchBinaryPattern( int value, int pattern ) 2263bool matchBinaryPattern( int value, int pattern )
2264{ 2264{
2265 /** 2265 /**
2266 We want to match all telephonnumbers/addresses which have the bits in the 2266 We want to match all telephonnumbers/addresses which have the bits in the
2267 pattern set. More are allowed. 2267 pattern set. More are allowed.
2268 if pattern == 0 we have a special handling, then we want only those with 2268 if pattern == 0 we have a special handling, then we want only those with
2269 exactly no bit set. 2269 exactly no bit set.
2270 */ 2270 */
2271 if ( pattern == 0 ) 2271 if ( pattern == 0 )
2272 return ( value == 0 ); 2272 return ( value == 0 );
2273 else 2273 else
2274 return ( pattern == ( pattern & value ) ); 2274 return ( pattern == ( pattern & value ) );
2275} 2275}
2276 2276
2277bool matchBinaryPatternP( int value, int pattern ) 2277bool matchBinaryPatternP( int value, int pattern )
2278{ 2278{
2279 2279
2280 if ( pattern == 0 ) 2280 if ( pattern == 0 )
2281 return ( value == 0 ); 2281 return ( value == 0 );
2282 else 2282 else
2283 return ( (pattern |PhoneNumber::Pref ) == ( value |PhoneNumber::Pref ) ); 2283 return ( (pattern |PhoneNumber::Pref ) == ( value |PhoneNumber::Pref ) );
2284} 2284}
2285bool matchBinaryPatternA( int value, int pattern ) 2285bool matchBinaryPatternA( int value, int pattern )
2286{ 2286{
2287 2287
2288 if ( pattern == 0 ) 2288 if ( pattern == 0 )
2289 return ( value == 0 ); 2289 return ( value == 0 );
2290 else 2290 else
2291 return ( (pattern | Address::Pref) == ( value | Address::Pref ) ); 2291 return ( (pattern | Address::Pref) == ( value | Address::Pref ) );
2292} 2292}