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