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