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