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