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