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