summaryrefslogtreecommitdiffabout
path: root/kabc
authorzautrix <zautrix>2004-10-13 12:38:18 (UTC)
committer zautrix <zautrix>2004-10-13 12:38:18 (UTC)
commitefdd0735bda81dcd82dfb6d6dc0d0c143f249336 (patch) (unidiff)
tree8d67e4b51fbc3e8c48e1656c78054cfe6d2ead66 /kabc
parentf22ee1ec902fe2fc610786f39049fb84542b8726 (diff)
downloadkdepimpi-efdd0735bda81dcd82dfb6d6dc0d0c143f249336.zip
kdepimpi-efdd0735bda81dcd82dfb6d6dc0d0c143f249336.tar.gz
kdepimpi-efdd0735bda81dcd82dfb6d6dc0d0c143f249336.tar.bz2
mege contact fixes
Diffstat (limited to 'kabc') (more/less context) (ignore whitespace changes)
-rw-r--r--kabc/addressee.cpp75
-rw-r--r--kabc/phonenumber.cpp32
-rw-r--r--kabc/phonenumber.h1
3 files changed, 62 insertions, 46 deletions
diff --git a/kabc/addressee.cpp b/kabc/addressee.cpp
index cb10160..2aca559 100644
--- a/kabc/addressee.cpp
+++ b/kabc/addressee.cpp
@@ -1,1426 +1,1419 @@
1/*** Warning! This file has been generated by the script makeaddressee ***/ 1/*** Warning! This file has been generated by the script makeaddressee ***/
2/* 2/*
3 This file is part of libkabc. 3 This file is part of libkabc.
4 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 4 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
5 5
6 This library is free software; you can redistribute it and/or 6 This library is free software; you can redistribute it and/or
7 modify it under the terms of the GNU Library General Public 7 modify it under the terms of the GNU Library General Public
8 License as published by the Free Software Foundation; either 8 License as published by the Free Software Foundation; either
9 version 2 of the License, or (at your option) any later version. 9 version 2 of the License, or (at your option) any later version.
10 10
11 This library is distributed in the hope that it will be useful, 11 This library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Library General Public License for more details. 14 Library General Public License for more details.
15 15
16 You should have received a copy of the GNU Library General Public License 16 You should have received a copy of the GNU Library General Public License
17 along with this library; see the file COPYING.LIB. If not, write to 17 along with this library; see the file COPYING.LIB. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. 19 Boston, MA 02111-1307, USA.
20*/ 20*/
21 21
22/* 22/*
23Enhanced Version of the file for platform independent KDE tools. 23Enhanced Version of the file for platform independent KDE tools.
24Copyright (c) 2004 Ulf Schenk 24Copyright (c) 2004 Ulf Schenk
25 25
26$Id$ 26$Id$
27*/ 27*/
28 28
29#include <kconfig.h> 29#include <kconfig.h>
30 30
31#include <ksharedptr.h> 31#include <ksharedptr.h>
32#include <kdebug.h> 32#include <kdebug.h>
33#include <kapplication.h> 33#include <kapplication.h>
34#include <klocale.h> 34#include <klocale.h>
35#include <kidmanager.h> 35#include <kidmanager.h>
36//US 36//US
37#include <kstandarddirs.h> 37#include <kstandarddirs.h>
38#include <libkcal/syncdefines.h> 38#include <libkcal/syncdefines.h>
39 39
40//US #include "resource.h" 40//US #include "resource.h"
41#include "addressee.h" 41#include "addressee.h"
42 42
43using namespace KABC; 43using namespace KABC;
44 44
45static bool matchBinaryPattern( int value, int pattern ); 45static bool matchBinaryPattern( int value, int pattern );
46static bool matchBinaryPatternA( int value, int pattern ); 46static bool matchBinaryPatternA( int value, int pattern );
47static bool matchBinaryPatternP( int value, int pattern ); 47static bool matchBinaryPatternP( int value, int pattern );
48 48
49struct Addressee::AddresseeData : public KShared 49struct Addressee::AddresseeData : public KShared
50{ 50{
51 QString uid; 51 QString uid;
52 QString name; 52 QString name;
53 QString formattedName; 53 QString formattedName;
54 QString familyName; 54 QString familyName;
55 QString givenName; 55 QString givenName;
56 QString additionalName; 56 QString additionalName;
57 QString prefix; 57 QString prefix;
58 QString suffix; 58 QString suffix;
59 QString nickName; 59 QString nickName;
60 QDateTime birthday; 60 QDateTime birthday;
61 QString mailer; 61 QString mailer;
62 TimeZone timeZone; 62 TimeZone timeZone;
63 Geo geo; 63 Geo geo;
64 QString title; 64 QString title;
65 QString role; 65 QString role;
66 QString organization; 66 QString organization;
67 QString note; 67 QString note;
68 QString productId; 68 QString productId;
69 QDateTime revision; 69 QDateTime revision;
70 QString sortString; 70 QString sortString;
71 QString externalUID; 71 QString externalUID;
72 QString originalExternalUID; 72 QString originalExternalUID;
73 KURL url; 73 KURL url;
74 Secrecy secrecy; 74 Secrecy secrecy;
75 Picture logo; 75 Picture logo;
76 Picture photo; 76 Picture photo;
77 Sound sound; 77 Sound sound;
78 Agent agent; 78 Agent agent;
79 QString mExternalId; 79 QString mExternalId;
80 PhoneNumber::List phoneNumbers; 80 PhoneNumber::List phoneNumbers;
81 Address::List addresses; 81 Address::List addresses;
82 Key::List keys; 82 Key::List keys;
83 QStringList emails; 83 QStringList emails;
84 QStringList categories; 84 QStringList categories;
85 QStringList custom; 85 QStringList custom;
86 int mTempSyncStat; 86 int mTempSyncStat;
87 Resource *resource; 87 Resource *resource;
88 88
89 bool empty :1; 89 bool empty :1;
90 bool changed :1; 90 bool changed :1;
91 bool tagged :1; 91 bool tagged :1;
92}; 92};
93 93
94Addressee::Addressee() 94Addressee::Addressee()
95{ 95{
96 mData = new AddresseeData; 96 mData = new AddresseeData;
97 mData->empty = true; 97 mData->empty = true;
98 mData->changed = false; 98 mData->changed = false;
99 mData->resource = 0; 99 mData->resource = 0;
100 mData->mExternalId = ":"; 100 mData->mExternalId = ":";
101 mData->revision = QDateTime ( QDate( 2003,1,1)); 101 mData->revision = QDateTime ( QDate( 2003,1,1));
102 mData->mTempSyncStat = SYNC_TEMPSTATE_INITIAL; 102 mData->mTempSyncStat = SYNC_TEMPSTATE_INITIAL;
103} 103}
104 104
105Addressee::~Addressee() 105Addressee::~Addressee()
106{ 106{
107} 107}
108 108
109Addressee::Addressee( const Addressee &a ) 109Addressee::Addressee( const Addressee &a )
110{ 110{
111 mData = a.mData; 111 mData = a.mData;
112} 112}
113 113
114Addressee &Addressee::operator=( const Addressee &a ) 114Addressee &Addressee::operator=( const Addressee &a )
115{ 115{
116 mData = a.mData; 116 mData = a.mData;
117 return (*this); 117 return (*this);
118} 118}
119 119
120Addressee Addressee::copy() 120Addressee Addressee::copy()
121{ 121{
122 Addressee a; 122 Addressee a;
123 *(a.mData) = *mData; 123 *(a.mData) = *mData;
124 return a; 124 return a;
125} 125}
126 126
127void Addressee::detach() 127void Addressee::detach()
128{ 128{
129 if ( mData.count() == 1 ) return; 129 if ( mData.count() == 1 ) return;
130 *this = copy(); 130 *this = copy();
131} 131}
132 132
133bool Addressee::operator==( const Addressee &a ) const 133bool Addressee::operator==( const Addressee &a ) const
134{ 134{
135 if ( uid() != a.uid() ) return false; 135 if ( uid() != a.uid() ) return false;
136 if ( mData->name != a.mData->name ) return false; 136 if ( mData->name != a.mData->name ) return false;
137 if ( mData->formattedName != a.mData->formattedName ) return false; 137 if ( mData->formattedName != a.mData->formattedName ) return false;
138 if ( mData->familyName != a.mData->familyName ) return false; 138 if ( mData->familyName != a.mData->familyName ) return false;
139 if ( mData->givenName != a.mData->givenName ) return false; 139 if ( mData->givenName != a.mData->givenName ) return false;
140 if ( mData->additionalName != a.mData->additionalName ) return false; 140 if ( mData->additionalName != a.mData->additionalName ) return false;
141 if ( mData->prefix != a.mData->prefix ) return false; 141 if ( mData->prefix != a.mData->prefix ) return false;
142 if ( mData->suffix != a.mData->suffix ) return false; 142 if ( mData->suffix != a.mData->suffix ) return false;
143 if ( mData->nickName != a.mData->nickName ) return false; 143 if ( mData->nickName != a.mData->nickName ) return false;
144 if ( mData->birthday != a.mData->birthday ) return false; 144 if ( mData->birthday != a.mData->birthday ) return false;
145 if ( mData->mailer != a.mData->mailer ) return false; 145 if ( mData->mailer != a.mData->mailer ) return false;
146 if ( mData->timeZone != a.mData->timeZone ) return false; 146 if ( mData->timeZone != a.mData->timeZone ) return false;
147 if ( mData->geo != a.mData->geo ) return false; 147 if ( mData->geo != a.mData->geo ) return false;
148 if ( mData->title != a.mData->title ) return false; 148 if ( mData->title != a.mData->title ) return false;
149 if ( mData->role != a.mData->role ) return false; 149 if ( mData->role != a.mData->role ) return false;
150 if ( mData->organization != a.mData->organization ) return false; 150 if ( mData->organization != a.mData->organization ) return false;
151 if ( mData->note != a.mData->note ) return false; 151 if ( mData->note != a.mData->note ) return false;
152 if ( mData->productId != a.mData->productId ) return false; 152 if ( mData->productId != a.mData->productId ) return false;
153 //if ( mData->revision != a.mData->revision ) return false; 153 //if ( mData->revision != a.mData->revision ) return false;
154 if ( mData->sortString != a.mData->sortString ) return false; 154 if ( mData->sortString != a.mData->sortString ) return false;
155 if ( mData->secrecy != a.mData->secrecy ) return false; 155 if ( mData->secrecy != a.mData->secrecy ) return false;
156 if ( mData->logo != a.mData->logo ) return false; 156 if ( mData->logo != a.mData->logo ) return false;
157 if ( mData->photo != a.mData->photo ) return false; 157 if ( mData->photo != a.mData->photo ) return false;
158 if ( mData->sound != a.mData->sound ) return false; 158 if ( mData->sound != a.mData->sound ) return false;
159 if ( mData->agent != a.mData->agent ) return false; 159 if ( mData->agent != a.mData->agent ) return false;
160 if ( ( mData->url.isValid() || a.mData->url.isValid() ) && 160 if ( ( mData->url.isValid() || a.mData->url.isValid() ) &&
161 ( mData->url != a.mData->url ) ) return false; 161 ( mData->url != a.mData->url ) ) return false;
162 if ( mData->phoneNumbers != a.mData->phoneNumbers ) return false; 162 if ( mData->phoneNumbers != a.mData->phoneNumbers ) return false;
163 if ( mData->addresses != a.mData->addresses ) return false; 163 if ( mData->addresses != a.mData->addresses ) return false;
164 if ( mData->keys != a.mData->keys ) return false; 164 if ( mData->keys != a.mData->keys ) return false;
165 if ( mData->emails != a.mData->emails ) return false; 165 if ( mData->emails != a.mData->emails ) return false;
166 if ( mData->categories != a.mData->categories ) return false; 166 if ( mData->categories != a.mData->categories ) return false;
167 if ( mData->custom != a.mData->custom ) return false; 167 if ( mData->custom != a.mData->custom ) return false;
168 168
169 return true; 169 return true;
170} 170}
171 171
172bool Addressee::operator!=( const Addressee &a ) const 172bool Addressee::operator!=( const Addressee &a ) const
173{ 173{
174 return !( a == *this ); 174 return !( a == *this );
175} 175}
176 176
177bool Addressee::isEmpty() const 177bool Addressee::isEmpty() const
178{ 178{
179 return mData->empty; 179 return mData->empty;
180} 180}
181ulong Addressee::getCsum4List( const QStringList & attList) 181ulong Addressee::getCsum4List( const QStringList & attList)
182{ 182{
183 int max = attList.count(); 183 int max = attList.count();
184 ulong cSum = 0; 184 ulong cSum = 0;
185 int j,k,i; 185 int j,k,i;
186 int add; 186 int add;
187 for ( i = 0; i < max ; ++i ) { 187 for ( i = 0; i < max ; ++i ) {
188 QString s = attList[i]; 188 QString s = attList[i];
189 if ( ! s.isEmpty() ){ 189 if ( ! s.isEmpty() ){
190 j = s.length(); 190 j = s.length();
191 for ( k = 0; k < j; ++k ) { 191 for ( k = 0; k < j; ++k ) {
192 int mul = k +1; 192 int mul = k +1;
193 add = s[k].unicode (); 193 add = s[k].unicode ();
194 if ( k < 16 ) 194 if ( k < 16 )
195 mul = mul * mul; 195 mul = mul * mul;
196 int ii = i+1; 196 int ii = i+1;
197 add = add * mul *ii*ii*ii; 197 add = add * mul *ii*ii*ii;
198 cSum += add; 198 cSum += add;
199 } 199 }
200 } 200 }
201 201
202 } 202 }
203 //QString dump = attList.join(","); 203 //QString dump = attList.join(",");
204 //qDebug("csum: %d %s", cSum,dump.latin1()); 204 //qDebug("csum: %d %s", cSum,dump.latin1());
205 205
206 return cSum; 206 return cSum;
207 207
208} 208}
209void Addressee::computeCsum(const QString &dev) 209void Addressee::computeCsum(const QString &dev)
210{ 210{
211 QStringList l; 211 QStringList l;
212 if ( !mData->name.isEmpty() ) l.append(mData->name); 212 if ( !mData->name.isEmpty() ) l.append(mData->name);
213 if ( !mData->formattedName.isEmpty() ) l.append(mData->formattedName ); 213 if ( !mData->formattedName.isEmpty() ) l.append(mData->formattedName );
214 if ( !mData->familyName.isEmpty() ) l.append( mData->familyName ); 214 if ( !mData->familyName.isEmpty() ) l.append( mData->familyName );
215 if ( !mData->givenName.isEmpty() ) l.append(mData->givenName ); 215 if ( !mData->givenName.isEmpty() ) l.append(mData->givenName );
216 if ( !mData->additionalName ) l.append( mData->additionalName ); 216 if ( !mData->additionalName ) l.append( mData->additionalName );
217 if ( !mData->prefix.isEmpty() ) l.append( mData->prefix ); 217 if ( !mData->prefix.isEmpty() ) l.append( mData->prefix );
218 if ( !mData->suffix.isEmpty() ) l.append( mData->suffix ); 218 if ( !mData->suffix.isEmpty() ) l.append( mData->suffix );
219 if ( !mData->nickName.isEmpty() ) l.append( mData->nickName ); 219 if ( !mData->nickName.isEmpty() ) l.append( mData->nickName );
220 if ( mData->birthday.isValid() ) l.append( mData->birthday.toString() ); 220 if ( mData->birthday.isValid() ) l.append( mData->birthday.toString() );
221 if ( !mData->mailer.isEmpty() ) l.append( mData->mailer ); 221 if ( !mData->mailer.isEmpty() ) l.append( mData->mailer );
222 if ( mData->timeZone.isValid() ) l.append( mData->timeZone.asString() ); 222 if ( mData->timeZone.isValid() ) l.append( mData->timeZone.asString() );
223 if ( mData->geo.isValid() ) l.append( mData->geo.asString() ); 223 if ( mData->geo.isValid() ) l.append( mData->geo.asString() );
224 if ( !mData->title .isEmpty() ) l.append( mData->title ); 224 if ( !mData->title .isEmpty() ) l.append( mData->title );
225 if ( !mData->role.isEmpty() ) l.append( mData->role ); 225 if ( !mData->role.isEmpty() ) l.append( mData->role );
226 if ( !mData->organization.isEmpty() ) l.append( mData->organization ); 226 if ( !mData->organization.isEmpty() ) l.append( mData->organization );
227 if ( !mData->note.isEmpty() ) l.append( mData->note ); 227 if ( !mData->note.isEmpty() ) l.append( mData->note );
228 if ( !mData->productId.isEmpty() ) l.append(mData->productId ); 228 if ( !mData->productId.isEmpty() ) l.append(mData->productId );
229 if ( !mData->sortString.isEmpty() ) l.append( mData->sortString ); 229 if ( !mData->sortString.isEmpty() ) l.append( mData->sortString );
230 if ( mData->secrecy.isValid() ) l.append( mData->secrecy.asString()); 230 if ( mData->secrecy.isValid() ) l.append( mData->secrecy.asString());
231 // if ( !mData->logo.isEmpty() ) l.append( ); 231 // if ( !mData->logo.isEmpty() ) l.append( );
232 //if ( !mData->photo.isEmpty() ) l.append( ); 232 //if ( !mData->photo.isEmpty() ) l.append( );
233 //if ( !mData->sound.isEmpty() ) l.append( ); 233 //if ( !mData->sound.isEmpty() ) l.append( );
234 //if ( !mData->agent.isEmpty() ) l.append( ); 234 //if ( !mData->agent.isEmpty() ) l.append( );
235 if ( mData->url.isValid() ) 235 if ( mData->url.isValid() )
236 if ( ! mData->url.path().isEmpty()) l.append( mData->url.path() ); 236 if ( ! mData->url.path().isEmpty()) l.append( mData->url.path() );
237 KABC::PhoneNumber::List phoneNumbers; 237 KABC::PhoneNumber::List phoneNumbers;
238 KABC::PhoneNumber::List::Iterator phoneIter; 238 KABC::PhoneNumber::List::Iterator phoneIter;
239 239
240 QStringList t; 240 QStringList t;
241 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); 241 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
242 ++phoneIter ) 242 ++phoneIter )
243 t.append( ( *phoneIter ).number()+QString::number( ( *phoneIter ).type() ) ); 243 t.append( ( *phoneIter ).number()+QString::number( ( *phoneIter ).type() ) );
244 t.sort(); 244 t.sort();
245 uint iii; 245 uint iii;
246 for ( iii = 0; iii < t.count(); ++iii) 246 for ( iii = 0; iii < t.count(); ++iii)
247 l.append( t[iii] ); 247 l.append( t[iii] );
248 t = mData->emails; 248 t = mData->emails;
249 t.sort(); 249 t.sort();
250 for ( iii = 0; iii < t.count(); ++iii) 250 for ( iii = 0; iii < t.count(); ++iii)
251 l.append( t[iii] ); 251 l.append( t[iii] );
252 t = mData->categories; 252 t = mData->categories;
253 t.sort(); 253 t.sort();
254 for ( iii = 0; iii < t.count(); ++iii) 254 for ( iii = 0; iii < t.count(); ++iii)
255 l.append( t[iii] ); 255 l.append( t[iii] );
256 t = mData->custom; 256 t = mData->custom;
257 t.sort(); 257 t.sort();
258 for ( iii = 0; iii < t.count(); ++iii) 258 for ( iii = 0; iii < t.count(); ++iii)
259 l.append( t[iii] ); 259 l.append( t[iii] );
260 KABC::Address::List::Iterator addressIter; 260 KABC::Address::List::Iterator addressIter;
261 for ( addressIter = mData->addresses.begin(); addressIter != mData->addresses.end(); 261 for ( addressIter = mData->addresses.begin(); addressIter != mData->addresses.end();
262 ++addressIter ) { 262 ++addressIter ) {
263 t = (*addressIter).asList(); 263 t = (*addressIter).asList();
264 t.sort(); 264 t.sort();
265 for ( iii = 0; iii < t.count(); ++iii) 265 for ( iii = 0; iii < t.count(); ++iii)
266 l.append( t[iii] ); 266 l.append( t[iii] );
267 } 267 }
268 uint cs = getCsum4List(l); 268 uint cs = getCsum4List(l);
269 // qDebug("CSUM computed %d %s %s", cs,QString::number (cs ).latin1(), uid().latin1() ); 269 // qDebug("CSUM computed %d %s %s", cs,QString::number (cs ).latin1(), uid().latin1() );
270 setCsum( dev, QString::number (cs )); 270 setCsum( dev, QString::number (cs ));
271} 271}
272 272
273void Addressee::mergeContact( const Addressee& ad , bool isSubSet) // = false) 273void Addressee::mergeContact( const Addressee& ad , bool isSubSet) // = false)
274{ 274{
275 275
276 detach(); 276 detach();
277 if ( mData->name.isEmpty() ) mData->name = ad.mData->name; 277 if ( mData->name.isEmpty() ) mData->name = ad.mData->name;
278 if ( mData->formattedName.isEmpty() ) mData->formattedName = ad.mData->formattedName; 278 if ( mData->formattedName.isEmpty() ) mData->formattedName = ad.mData->formattedName;
279 if ( mData->familyName.isEmpty() ) mData->familyName = ad.mData->familyName; 279 if ( mData->familyName.isEmpty() ) mData->familyName = ad.mData->familyName;
280 if ( mData->givenName.isEmpty() ) mData->givenName = ad.mData->givenName ; 280 if ( mData->givenName.isEmpty() ) mData->givenName = ad.mData->givenName ;
281 if ( mData->additionalName ) mData->additionalName = ad.mData->additionalName; 281 if ( mData->additionalName ) mData->additionalName = ad.mData->additionalName;
282 if ( mData->prefix.isEmpty() ) mData->prefix = ad.mData->prefix; 282 if ( mData->prefix.isEmpty() ) mData->prefix = ad.mData->prefix;
283 if ( mData->suffix.isEmpty() ) mData->suffix = ad.mData->suffix; 283 if ( mData->suffix.isEmpty() ) mData->suffix = ad.mData->suffix;
284 if ( mData->nickName.isEmpty() ) mData->nickName = ad.mData->nickName; 284 if ( mData->nickName.isEmpty() ) mData->nickName = ad.mData->nickName;
285 if ( !mData->birthday.isValid() ) 285 if ( !mData->birthday.isValid() )
286 if ( ad.mData->birthday.isValid()) 286 if ( ad.mData->birthday.isValid())
287 mData->birthday = ad.mData->birthday; 287 mData->birthday = ad.mData->birthday;
288 if ( mData->mailer.isEmpty() ) mData->mailer = ad.mData->mailer; 288 if ( mData->mailer.isEmpty() ) mData->mailer = ad.mData->mailer;
289 if ( !mData->timeZone.isValid() ) mData->timeZone = ad.mData->timeZone; 289 if ( !mData->timeZone.isValid() ) mData->timeZone = ad.mData->timeZone;
290 if ( !mData->geo.isValid() ) mData->geo = ad.mData->geo; 290 if ( !mData->geo.isValid() ) mData->geo = ad.mData->geo;
291 if ( mData->title .isEmpty() ) mData->title = ad.mData->title ; 291 if ( mData->title .isEmpty() ) mData->title = ad.mData->title ;
292 if ( mData->role.isEmpty() ) mData->role = ad.mData->role ; 292 if ( mData->role.isEmpty() ) mData->role = ad.mData->role ;
293 if ( mData->organization.isEmpty() ) mData->organization = ad.mData->organization ; 293 if ( mData->organization.isEmpty() ) mData->organization = ad.mData->organization ;
294 if ( mData->note.isEmpty() ) mData->note = ad.mData->note ; 294 if ( mData->note.isEmpty() ) mData->note = ad.mData->note ;
295 if ( mData->productId.isEmpty() ) mData->productId = ad.mData->productId; 295 if ( mData->productId.isEmpty() ) mData->productId = ad.mData->productId;
296 if ( mData->sortString.isEmpty() ) mData->sortString = ad.mData->sortString; 296 if ( mData->sortString.isEmpty() ) mData->sortString = ad.mData->sortString;
297 if ( !mData->secrecy.isValid() ) mData->secrecy = ad.mData->secrecy; 297 if ( !mData->secrecy.isValid() ) mData->secrecy = ad.mData->secrecy;
298 if ( ( !mData->url.isValid() && ad.mData->url.isValid() ) ) mData->url = ad.mData->url ; 298 if ( ( !mData->url.isValid() && ad.mData->url.isValid() ) ) mData->url = ad.mData->url ;
299 QStringList t; 299 QStringList t;
300 QStringList tAD; 300 QStringList tAD;
301 uint iii; 301 uint iii;
302 if ( isSubSet ) { 302 if ( isSubSet ) {
303 // ********** phone numbers 303 // ********** phone numbers
304 PhoneNumber::List phoneAD = ad.phoneNumbers(); 304 PhoneNumber::List phoneAD = ad.phoneNumbers();
305 PhoneNumber::List::Iterator phoneItAD; 305 PhoneNumber::List::Iterator phoneItAD;
306 for ( phoneItAD = phoneAD.begin(); phoneItAD != phoneAD.end(); ++phoneItAD ) { 306 for ( phoneItAD = phoneAD.begin(); phoneItAD != phoneAD.end(); ++phoneItAD ) {
307 bool found = false; 307 bool found = false;
308 PhoneNumber::List::Iterator it; 308 PhoneNumber::List::Iterator it;
309 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { 309 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
310 if ( (*it) == ( *phoneItAD ) ) { 310 if ( ( *phoneItAD ).contains( (*it) ) ) {
311 found = true; 311 found = true;
312 (*it).setType( ( *phoneItAD ).type() );
312 break; 313 break;
313 } 314 }
314 } 315 }
315 if ( ! found ) 316 if ( ! found )
316 mData->phoneNumbers.append( *phoneItAD ); 317 mData->phoneNumbers.append( *phoneItAD );
317 } 318 }
318 // ************* emails; 319 // ************* emails;
319 t = mData->emails; 320 t = mData->emails;
320 tAD = ad.mData->emails; 321 tAD = ad.mData->emails;
321 for ( iii = 0; iii < tAD.count(); ++iii) 322 for ( iii = 0; iii < tAD.count(); ++iii)
322 if ( !t.contains(tAD[iii] ) ) 323 if ( !t.contains(tAD[iii] ) )
323 mData->emails.append( tAD[iii] ); 324 mData->emails.append( tAD[iii] );
324 // ************* categories; 325 // ************* categories;
325 t = mData->categories; 326 t = mData->categories;
326 tAD = ad.mData->categories; 327 tAD = ad.mData->categories;
327 for ( iii = 0; iii < tAD.count(); ++iii) 328 for ( iii = 0; iii < tAD.count(); ++iii)
328 if ( !t.contains(tAD[iii] ) ) 329 if ( !t.contains(tAD[iii] ) )
329 mData->categories.append( tAD[iii] ); 330 mData->categories.append( tAD[iii] );
330 331
331 332
332 } 333 }
333 334
334 QStringList::ConstIterator it; 335 QStringList::ConstIterator it;
335 for( it = ad.mData->custom.begin(); it != ad.mData->custom.end(); ++it ) { 336 for( it = ad.mData->custom.begin(); it != ad.mData->custom.end(); ++it ) {
336 QString qualifiedName = (*it).left( (*it).find( ":" )); 337 QString qualifiedName = (*it).left( (*it).find( ":" ));
337 bool found = false; 338 bool found = false;
338 QStringList::ConstIterator itL; 339 QStringList::ConstIterator itL;
339 for( itL = mData->custom.begin(); itL != mData->custom.end(); ++itL ) { 340 for( itL = mData->custom.begin(); itL != mData->custom.end(); ++itL ) {
340 if ( (*itL).startsWith( qualifiedName ) ) { 341 if ( (*itL).startsWith( qualifiedName ) ) {
341 found = true; 342 found = true;
342 break; 343 break;
343 } 344 }
344 } 345 }
345 if ( ! found ) { 346 if ( ! found ) {
346 mData->custom.append( *it ); 347 mData->custom.append( *it );
347 } 348 }
348 } 349 }
349 if ( mData->logo.undefined() && !ad.mData->logo.undefined() ) mData->logo = ad.mData->logo; 350 if ( mData->logo.undefined() && !ad.mData->logo.undefined() ) mData->logo = ad.mData->logo;
350 if ( mData->photo.undefined() && !ad.mData->photo.undefined() ) mData->photo = ad.mData->photo; 351 if ( mData->photo.undefined() && !ad.mData->photo.undefined() ) mData->photo = ad.mData->photo;
351 if ( !mData->sound.isIntern() ) { 352 if ( !mData->sound.isIntern() ) {
352 if ( mData->sound.url().isEmpty() ) { 353 if ( mData->sound.url().isEmpty() ) {
353 mData->sound = ad.mData->sound; 354 mData->sound = ad.mData->sound;
354 } 355 }
355 } 356 }
356 if ( !mData->agent.isIntern() ) { 357 if ( !mData->agent.isIntern() ) {
357 if ( mData->agent.url().isEmpty() ) { 358 if ( mData->agent.url().isEmpty() ) {
358 mData->agent = ad.mData->agent; 359 mData->agent = ad.mData->agent;
359 } 360 }
360 } 361 }
361 362 {
362#if 0 363 Key::List::Iterator itA;
363 364 for( itA = ad.mData->keys.begin(); itA != ad.mData->keys.end(); ++itA ) {
364 if ( mData->url.isValid() ) 365 bool found = false;
365 if ( ! mData->url.path().isEmpty()) l.append( mData->url.path() ); 366 Key::List::Iterator it;
366 KABC::PhoneNumber::List phoneNumbers; 367 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
367 KABC::PhoneNumber::List::Iterator phoneIter; 368 if ( (*it) == (*itA)) {
368 369 found = true;
369 QStringList t; 370 break;
370 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); 371
371 ++phoneIter ) 372 }
372 t.append( ( *phoneIter ).number()+QString::number( ( *phoneIter ).type() ) ); 373 }
373 t.sort(); 374 if ( ! found ) {
374 uint iii; 375 mData->keys.append( *itA );
375 for ( iii = 0; iii < t.count(); ++iii) 376 }
376 l.append( t[iii] ); 377 }
377 t = mData->emails;
378 t.sort();
379 for ( iii = 0; iii < t.count(); ++iii)
380 l.append( t[iii] );
381 t = mData->categories;
382 t.sort();
383 for ( iii = 0; iii < t.count(); ++iii)
384 l.append( t[iii] );
385 t = mData->custom;
386 t.sort();
387 for ( iii = 0; iii < t.count(); ++iii)
388 l.append( t[iii] );
389 KABC::Address::List::Iterator addressIter;
390 for ( addressIter = mData->addresses.begin(); addressIter != mData->addresses.end();
391 ++addressIter ) {
392 t = (*addressIter).asList();
393 t.sort();
394 for ( iii = 0; iii < t.count(); ++iii)
395 l.append( t[iii] );
396 } 378 }
379 KABC::Address::List::Iterator addressIterA;
380 for ( addressIterA = ad.mData->addresses.begin(); addressIterA != ad.mData->addresses.end(); ++addressIterA ) {
381 bool found = false;
382 KABC::Address::List::Iterator addressIter;
383 for ( addressIter = mData->addresses.begin(); addressIter != mData->addresses.end();
384 ++addressIter ) {
385 if ( (*addressIter) == (*addressIterA)) {
386 found = true;
387 (*addressIter).setType( (*addressIterA).type() );
388 break;
389 }
397 390
398#endif 391 }
399 392 if ( ! found ) {
400 // pending: 393 mData->addresses.append( *addressIterA );
401 // merging addresses 394 }
402 // merging keys 395 }
403 //qDebug("merge contact %s ", ad.uid().latin1()); 396 //qDebug("merge contact %s ", ad.uid().latin1());
404 setUid( ad.uid() ); 397 setUid( ad.uid() );
405 setRevision( ad.revision() ); 398 setRevision( ad.revision() );
406} 399}
407 400
408bool Addressee::removeVoice() 401bool Addressee::removeVoice()
409{ 402{
410 PhoneNumber::List phoneN = phoneNumbers(); 403 PhoneNumber::List phoneN = phoneNumbers();
411 PhoneNumber::List::Iterator phoneIt; 404 PhoneNumber::List::Iterator phoneIt;
412 bool found = false; 405 bool found = false;
413 for ( phoneIt = phoneN.begin(); phoneIt != phoneN.end(); ++phoneIt ) { 406 for ( phoneIt = phoneN.begin(); phoneIt != phoneN.end(); ++phoneIt ) {
414 if ( (*phoneIt).type() & PhoneNumber::Voice) { // voice found 407 if ( (*phoneIt).type() & PhoneNumber::Voice) { // voice found
415 if ((*phoneIt).type() - PhoneNumber::Voice ) { 408 if ((*phoneIt).type() - PhoneNumber::Voice ) {
416 (*phoneIt).setType((*phoneIt).type() - PhoneNumber::Voice ); 409 (*phoneIt).setType((*phoneIt).type() - PhoneNumber::Voice );
417 insertPhoneNumber( (*phoneIt) ); 410 insertPhoneNumber( (*phoneIt) );
418 found = true; 411 found = true;
419 } 412 }
420 } 413 }
421 414
422 } 415 }
423 return found; 416 return found;
424} 417}
425 418
426bool Addressee::containsAdr(const Addressee& ad ) 419bool Addressee::containsAdr(const Addressee& ad )
427{ 420{
428 if ( ! ad.mData->familyName.isEmpty() ) if ( mData->familyName != ad.mData->familyName) return false; 421 if ( ! ad.mData->familyName.isEmpty() ) if ( mData->familyName != ad.mData->familyName) return false;
429 if ( ! ad.mData->givenName.isEmpty() )if ( mData->givenName != ad.mData->givenName ) return false; 422 if ( ! ad.mData->givenName.isEmpty() )if ( mData->givenName != ad.mData->givenName ) return false;
430 if ( ad.mData->url.isValid() ) if (mData->url != ad.mData->url) return false ; 423 if ( ad.mData->url.isValid() ) if (mData->url != ad.mData->url) return false ;
431 if ( ! ad.mData->role.isEmpty() ) if (mData->role != ad.mData->role) return false ; 424 if ( ! ad.mData->role.isEmpty() ) if (mData->role != ad.mData->role) return false ;
432 if ( ! ad.mData->organization.isEmpty() ) if (mData->organization != ad.mData->organization) return false ; 425 if ( ! ad.mData->organization.isEmpty() ) if (mData->organization != ad.mData->organization) return false ;
433 if ( ! ad.mData->note.isEmpty() ) if (mData->note != ad.mData->note) return false ; 426 if ( ! ad.mData->note.isEmpty() ) if (mData->note != ad.mData->note) return false ;
434 if ( ! ad.mData->title .isEmpty() ) if (mData->title != ad.mData->title ) return false ; 427 if ( ! ad.mData->title .isEmpty() ) if (mData->title != ad.mData->title ) return false ;
435 428
436 // compare phone numbers 429 // compare phone numbers
437 PhoneNumber::List phoneN = ad.phoneNumbers(); 430 PhoneNumber::List phoneN = ad.phoneNumbers();
438 PhoneNumber::List::Iterator phoneIt; 431 PhoneNumber::List::Iterator phoneIt;
439 bool found = false; 432 bool found = false;
440 for ( phoneIt = phoneN.begin(); phoneIt != phoneN.end(); ++phoneIt ) { 433 for ( phoneIt = phoneN.begin(); phoneIt != phoneN.end(); ++phoneIt ) {
441 bool found = false; 434 bool found = false;
442 PhoneNumber::List phoneL = ad.phoneNumbers(); 435 PhoneNumber::List phoneL = ad.phoneNumbers();
443 PhoneNumber::List::Iterator phoneItL; 436 PhoneNumber::List::Iterator phoneItL;
444 for ( phoneItL = phoneL.begin(); phoneItL != phoneL.end(); ++phoneItL ) { 437 for ( phoneItL = phoneL.begin(); phoneItL != phoneL.end(); ++phoneItL ) {
445 if ( ( *phoneItL ).number() == ( *phoneIt ).number() ) { 438 if ( ( *phoneItL ).number() == ( *phoneIt ).number() ) {
446 found = true; 439 found = true;
447 break; 440 break;
448 } 441 }
449 } 442 }
450 if ( ! found ) 443 if ( ! found )
451 return false; 444 return false;
452 } 445 }
453 return true; 446 return true;
454 447
455} 448}
456void Addressee::simplifyAddresses() 449void Addressee::simplifyAddresses()
457{ 450{
458 int max = 2; 451 int max = 2;
459 if ( mData->url.isValid() ) 452 if ( mData->url.isValid() )
460 max = 1; 453 max = 1;
461 if ( mData->addresses.count() <= max ) return ; 454 if ( mData->addresses.count() <= max ) return ;
462 int count = 0; 455 int count = 0;
463 Address::List list; 456 Address::List list;
464 Address::List::Iterator it; 457 Address::List::Iterator it;
465 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { 458 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
466 if ( count >= max ) 459 if ( count >= max )
467 list.append( *it ); 460 list.append( *it );
468 ++count; 461 ++count;
469 } 462 }
470 for( it = list.begin(); it != list.end(); ++it ) { 463 for( it = list.begin(); it != list.end(); ++it ) {
471 removeAddress( (*it) ); 464 removeAddress( (*it) );
472 } 465 }
473} 466}
474 467
475// removes all emails but the first 468// removes all emails but the first
476// needed by phone sync 469// needed by phone sync
477void Addressee::simplifyEmails() 470void Addressee::simplifyEmails()
478{ 471{
479 if ( mData->emails.count() == 0 ) return ; 472 if ( mData->emails.count() == 0 ) return ;
480 QString email = mData->emails.first(); 473 QString email = mData->emails.first();
481 detach(); 474 detach();
482 mData->emails.clear(); 475 mData->emails.clear();
483 mData->emails.append( email ); 476 mData->emails.append( email );
484} 477}
485 478
486void Addressee::simplifyPhoneNumbers() 479void Addressee::simplifyPhoneNumbers()
487{ 480{
488 KABC::PhoneNumber::List removeNumbers; 481 KABC::PhoneNumber::List removeNumbers;
489 KABC::PhoneNumber::List::Iterator phoneIter; 482 KABC::PhoneNumber::List::Iterator phoneIter;
490 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); 483 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
491 ++phoneIter ) { 484 ++phoneIter ) {
492 if ( ! ( *phoneIter ).simplifyNumber() ) 485 if ( ! ( *phoneIter ).simplifyNumber() )
493 removeNumbers.append( ( *phoneIter ) ); 486 removeNumbers.append( ( *phoneIter ) );
494 } 487 }
495 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end(); 488 for ( phoneIter = removeNumbers.begin(); phoneIter != removeNumbers.end();
496 ++phoneIter ) { 489 ++phoneIter ) {
497 removePhoneNumber(( *phoneIter )); 490 removePhoneNumber(( *phoneIter ));
498 } 491 }
499} 492}
500void Addressee::simplifyPhoneNumberTypes() 493void Addressee::simplifyPhoneNumberTypes()
501{ 494{
502 KABC::PhoneNumber::List::Iterator phoneIter; 495 KABC::PhoneNumber::List::Iterator phoneIter;
503 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end(); 496 for ( phoneIter = mData->phoneNumbers.begin(); phoneIter != mData->phoneNumbers.end();
504 ++phoneIter ) 497 ++phoneIter )
505 ( *phoneIter ).simplifyType(); 498 ( *phoneIter ).simplifyType();
506} 499}
507void Addressee::removeID(const QString &prof) 500void Addressee::removeID(const QString &prof)
508{ 501{
509 detach(); 502 detach();
510 mData->mExternalId = KIdManager::removeId ( mData->mExternalId, prof); 503 mData->mExternalId = KIdManager::removeId ( mData->mExternalId, prof);
511 504
512} 505}
513void Addressee::setID( const QString & prof , const QString & id ) 506void Addressee::setID( const QString & prof , const QString & id )
514{ 507{
515 detach(); 508 detach();
516 mData->mExternalId = KIdManager::setId ( mData->mExternalId, prof, id ); 509 mData->mExternalId = KIdManager::setId ( mData->mExternalId, prof, id );
517 //qDebug("setID2 %s %s %s",mData->mExternalId.latin1(), prof.latin1(), id.latin1() ); 510 //qDebug("setID2 %s %s %s",mData->mExternalId.latin1(), prof.latin1(), id.latin1() );
518} 511}
519void Addressee::setTempSyncStat( int id ) 512void Addressee::setTempSyncStat( int id )
520{ 513{
521 if ( mData->mTempSyncStat == id ) return; 514 if ( mData->mTempSyncStat == id ) return;
522 detach(); 515 detach();
523 mData->mTempSyncStat = id; 516 mData->mTempSyncStat = id;
524} 517}
525int Addressee::tempSyncStat() const 518int Addressee::tempSyncStat() const
526{ 519{
527 return mData->mTempSyncStat; 520 return mData->mTempSyncStat;
528} 521}
529 522
530QString Addressee::getID( const QString & prof) 523QString Addressee::getID( const QString & prof)
531{ 524{
532 return KIdManager::getId ( mData->mExternalId, prof ); 525 return KIdManager::getId ( mData->mExternalId, prof );
533} 526}
534 527
535void Addressee::setCsum( const QString & prof , const QString & id ) 528void Addressee::setCsum( const QString & prof , const QString & id )
536{ 529{
537 detach(); 530 detach();
538 //qDebug("setcsum1 %s %s %s",mData->mExternalId.latin1(), prof.latin1(), id.latin1() ); 531 //qDebug("setcsum1 %s %s %s",mData->mExternalId.latin1(), prof.latin1(), id.latin1() );
539 mData->mExternalId = KIdManager::setCsum ( mData->mExternalId, prof, id ); 532 mData->mExternalId = KIdManager::setCsum ( mData->mExternalId, prof, id );
540 //qDebug("setcsum2 %s ",mData->mExternalId.latin1() ); 533 //qDebug("setcsum2 %s ",mData->mExternalId.latin1() );
541} 534}
542 535
543QString Addressee::getCsum( const QString & prof) 536QString Addressee::getCsum( const QString & prof)
544{ 537{
545 return KIdManager::getCsum ( mData->mExternalId, prof ); 538 return KIdManager::getCsum ( mData->mExternalId, prof );
546} 539}
547 540
548void Addressee::setIDStr( const QString & s ) 541void Addressee::setIDStr( const QString & s )
549{ 542{
550 detach(); 543 detach();
551 mData->mExternalId = s; 544 mData->mExternalId = s;
552} 545}
553 546
554QString Addressee::IDStr() const 547QString Addressee::IDStr() const
555{ 548{
556 return mData->mExternalId; 549 return mData->mExternalId;
557} 550}
558 551
559void Addressee::setExternalUID( const QString &id ) 552void Addressee::setExternalUID( const QString &id )
560{ 553{
561 if ( id == mData->externalUID ) return; 554 if ( id == mData->externalUID ) return;
562 detach(); 555 detach();
563 mData->empty = false; 556 mData->empty = false;
564 mData->externalUID = id; 557 mData->externalUID = id;
565} 558}
566 559
567QString Addressee::externalUID() const 560QString Addressee::externalUID() const
568{ 561{
569 return mData->externalUID; 562 return mData->externalUID;
570} 563}
571void Addressee::setOriginalExternalUID( const QString &id ) 564void Addressee::setOriginalExternalUID( const QString &id )
572{ 565{
573 if ( id == mData->originalExternalUID ) return; 566 if ( id == mData->originalExternalUID ) return;
574 detach(); 567 detach();
575 mData->empty = false; 568 mData->empty = false;
576 //qDebug("*******Set orig uid %s ", id.latin1()); 569 //qDebug("*******Set orig uid %s ", id.latin1());
577 mData->originalExternalUID = id; 570 mData->originalExternalUID = id;
578} 571}
579 572
580QString Addressee::originalExternalUID() const 573QString Addressee::originalExternalUID() const
581{ 574{
582 return mData->originalExternalUID; 575 return mData->originalExternalUID;
583} 576}
584 577
585void Addressee::setUid( const QString &id ) 578void Addressee::setUid( const QString &id )
586{ 579{
587 if ( id == mData->uid ) return; 580 if ( id == mData->uid ) return;
588 detach(); 581 detach();
589 //qDebug("****setuid %s ", id.latin1()); 582 //qDebug("****setuid %s ", id.latin1());
590 mData->empty = false; 583 mData->empty = false;
591 mData->uid = id; 584 mData->uid = id;
592} 585}
593 586
594QString Addressee::uid() const 587QString Addressee::uid() const
595{ 588{
596 if ( mData->uid.isEmpty() ) 589 if ( mData->uid.isEmpty() )
597 mData->uid = KApplication::randomString( 10 ); 590 mData->uid = KApplication::randomString( 10 );
598 591
599 return mData->uid; 592 return mData->uid;
600} 593}
601 594
602QString Addressee::uidLabel() 595QString Addressee::uidLabel()
603{ 596{
604 return i18n("Unique Identifier"); 597 return i18n("Unique Identifier");
605} 598}
606 599
607void Addressee::setName( const QString &name ) 600void Addressee::setName( const QString &name )
608{ 601{
609 if ( name == mData->name ) return; 602 if ( name == mData->name ) return;
610 detach(); 603 detach();
611 mData->empty = false; 604 mData->empty = false;
612 mData->name = name; 605 mData->name = name;
613} 606}
614 607
615QString Addressee::name() const 608QString Addressee::name() const
616{ 609{
617 return mData->name; 610 return mData->name;
618} 611}
619 612
620QString Addressee::nameLabel() 613QString Addressee::nameLabel()
621{ 614{
622 return i18n("Name"); 615 return i18n("Name");
623} 616}
624 617
625 618
626void Addressee::setFormattedName( const QString &formattedName ) 619void Addressee::setFormattedName( const QString &formattedName )
627{ 620{
628 if ( formattedName == mData->formattedName ) return; 621 if ( formattedName == mData->formattedName ) return;
629 detach(); 622 detach();
630 mData->empty = false; 623 mData->empty = false;
631 mData->formattedName = formattedName; 624 mData->formattedName = formattedName;
632} 625}
633 626
634QString Addressee::formattedName() const 627QString Addressee::formattedName() const
635{ 628{
636 return mData->formattedName; 629 return mData->formattedName;
637} 630}
638 631
639QString Addressee::formattedNameLabel() 632QString Addressee::formattedNameLabel()
640{ 633{
641 return i18n("Formatted Name"); 634 return i18n("Formatted Name");
642} 635}
643 636
644 637
645void Addressee::setFamilyName( const QString &familyName ) 638void Addressee::setFamilyName( const QString &familyName )
646{ 639{
647 if ( familyName == mData->familyName ) return; 640 if ( familyName == mData->familyName ) return;
648 detach(); 641 detach();
649 mData->empty = false; 642 mData->empty = false;
650 mData->familyName = familyName; 643 mData->familyName = familyName;
651} 644}
652 645
653QString Addressee::familyName() const 646QString Addressee::familyName() const
654{ 647{
655 return mData->familyName; 648 return mData->familyName;
656} 649}
657 650
658QString Addressee::familyNameLabel() 651QString Addressee::familyNameLabel()
659{ 652{
660 return i18n("Family Name"); 653 return i18n("Family Name");
661} 654}
662 655
663 656
664void Addressee::setGivenName( const QString &givenName ) 657void Addressee::setGivenName( const QString &givenName )
665{ 658{
666 if ( givenName == mData->givenName ) return; 659 if ( givenName == mData->givenName ) return;
667 detach(); 660 detach();
668 mData->empty = false; 661 mData->empty = false;
669 mData->givenName = givenName; 662 mData->givenName = givenName;
670} 663}
671 664
672QString Addressee::givenName() const 665QString Addressee::givenName() const
673{ 666{
674 return mData->givenName; 667 return mData->givenName;
675} 668}
676 669
677QString Addressee::givenNameLabel() 670QString Addressee::givenNameLabel()
678{ 671{
679 return i18n("Given Name"); 672 return i18n("Given Name");
680} 673}
681 674
682 675
683void Addressee::setAdditionalName( const QString &additionalName ) 676void Addressee::setAdditionalName( const QString &additionalName )
684{ 677{
685 if ( additionalName == mData->additionalName ) return; 678 if ( additionalName == mData->additionalName ) return;
686 detach(); 679 detach();
687 mData->empty = false; 680 mData->empty = false;
688 mData->additionalName = additionalName; 681 mData->additionalName = additionalName;
689} 682}
690 683
691QString Addressee::additionalName() const 684QString Addressee::additionalName() const
692{ 685{
693 return mData->additionalName; 686 return mData->additionalName;
694} 687}
695 688
696QString Addressee::additionalNameLabel() 689QString Addressee::additionalNameLabel()
697{ 690{
698 return i18n("Additional Names"); 691 return i18n("Additional Names");
699} 692}
700 693
701 694
702void Addressee::setPrefix( const QString &prefix ) 695void Addressee::setPrefix( const QString &prefix )
703{ 696{
704 if ( prefix == mData->prefix ) return; 697 if ( prefix == mData->prefix ) return;
705 detach(); 698 detach();
706 mData->empty = false; 699 mData->empty = false;
707 mData->prefix = prefix; 700 mData->prefix = prefix;
708} 701}
709 702
710QString Addressee::prefix() const 703QString Addressee::prefix() const
711{ 704{
712 return mData->prefix; 705 return mData->prefix;
713} 706}
714 707
715QString Addressee::prefixLabel() 708QString Addressee::prefixLabel()
716{ 709{
717 return i18n("Honorific Prefixes"); 710 return i18n("Honorific Prefixes");
718} 711}
719 712
720 713
721void Addressee::setSuffix( const QString &suffix ) 714void Addressee::setSuffix( const QString &suffix )
722{ 715{
723 if ( suffix == mData->suffix ) return; 716 if ( suffix == mData->suffix ) return;
724 detach(); 717 detach();
725 mData->empty = false; 718 mData->empty = false;
726 mData->suffix = suffix; 719 mData->suffix = suffix;
727} 720}
728 721
729QString Addressee::suffix() const 722QString Addressee::suffix() const
730{ 723{
731 return mData->suffix; 724 return mData->suffix;
732} 725}
733 726
734QString Addressee::suffixLabel() 727QString Addressee::suffixLabel()
735{ 728{
736 return i18n("Honorific Suffixes"); 729 return i18n("Honorific Suffixes");
737} 730}
738 731
739 732
740void Addressee::setNickName( const QString &nickName ) 733void Addressee::setNickName( const QString &nickName )
741{ 734{
742 if ( nickName == mData->nickName ) return; 735 if ( nickName == mData->nickName ) return;
743 detach(); 736 detach();
744 mData->empty = false; 737 mData->empty = false;
745 mData->nickName = nickName; 738 mData->nickName = nickName;
746} 739}
747 740
748QString Addressee::nickName() const 741QString Addressee::nickName() const
749{ 742{
750 return mData->nickName; 743 return mData->nickName;
751} 744}
752 745
753QString Addressee::nickNameLabel() 746QString Addressee::nickNameLabel()
754{ 747{
755 return i18n("Nick Name"); 748 return i18n("Nick Name");
756} 749}
757 750
758 751
759void Addressee::setBirthday( const QDateTime &birthday ) 752void Addressee::setBirthday( const QDateTime &birthday )
760{ 753{
761 if ( birthday == mData->birthday ) return; 754 if ( birthday == mData->birthday ) return;
762 detach(); 755 detach();
763 mData->empty = false; 756 mData->empty = false;
764 mData->birthday = birthday; 757 mData->birthday = birthday;
765} 758}
766 759
767QDateTime Addressee::birthday() const 760QDateTime Addressee::birthday() const
768{ 761{
769 return mData->birthday; 762 return mData->birthday;
770} 763}
771 764
772QString Addressee::birthdayLabel() 765QString Addressee::birthdayLabel()
773{ 766{
774 return i18n("Birthday"); 767 return i18n("Birthday");
775} 768}
776 769
777 770
778QString Addressee::homeAddressStreetLabel() 771QString Addressee::homeAddressStreetLabel()
779{ 772{
780 return i18n("Home Address Street"); 773 return i18n("Home Address Street");
781} 774}
782 775
783 776
784QString Addressee::homeAddressLocalityLabel() 777QString Addressee::homeAddressLocalityLabel()
785{ 778{
786 return i18n("Home Address Locality"); 779 return i18n("Home Address Locality");
787} 780}
788 781
789 782
790QString Addressee::homeAddressRegionLabel() 783QString Addressee::homeAddressRegionLabel()
791{ 784{
792 return i18n("Home Address Region"); 785 return i18n("Home Address Region");
793} 786}
794 787
795 788
796QString Addressee::homeAddressPostalCodeLabel() 789QString Addressee::homeAddressPostalCodeLabel()
797{ 790{
798 return i18n("Home Address Postal Code"); 791 return i18n("Home Address Postal Code");
799} 792}
800 793
801 794
802QString Addressee::homeAddressCountryLabel() 795QString Addressee::homeAddressCountryLabel()
803{ 796{
804 return i18n("Home Address Country"); 797 return i18n("Home Address Country");
805} 798}
806 799
807 800
808QString Addressee::homeAddressLabelLabel() 801QString Addressee::homeAddressLabelLabel()
809{ 802{
810 return i18n("Home Address Label"); 803 return i18n("Home Address Label");
811} 804}
812 805
813 806
814QString Addressee::businessAddressStreetLabel() 807QString Addressee::businessAddressStreetLabel()
815{ 808{
816 return i18n("Business Address Street"); 809 return i18n("Business Address Street");
817} 810}
818 811
819 812
820QString Addressee::businessAddressLocalityLabel() 813QString Addressee::businessAddressLocalityLabel()
821{ 814{
822 return i18n("Business Address Locality"); 815 return i18n("Business Address Locality");
823} 816}
824 817
825 818
826QString Addressee::businessAddressRegionLabel() 819QString Addressee::businessAddressRegionLabel()
827{ 820{
828 return i18n("Business Address Region"); 821 return i18n("Business Address Region");
829} 822}
830 823
831 824
832QString Addressee::businessAddressPostalCodeLabel() 825QString Addressee::businessAddressPostalCodeLabel()
833{ 826{
834 return i18n("Business Address Postal Code"); 827 return i18n("Business Address Postal Code");
835} 828}
836 829
837 830
838QString Addressee::businessAddressCountryLabel() 831QString Addressee::businessAddressCountryLabel()
839{ 832{
840 return i18n("Business Address Country"); 833 return i18n("Business Address Country");
841} 834}
842 835
843 836
844QString Addressee::businessAddressLabelLabel() 837QString Addressee::businessAddressLabelLabel()
845{ 838{
846 return i18n("Business Address Label"); 839 return i18n("Business Address Label");
847} 840}
848 841
849 842
850QString Addressee::homePhoneLabel() 843QString Addressee::homePhoneLabel()
851{ 844{
852 return i18n("Home Phone"); 845 return i18n("Home Phone");
853} 846}
854 847
855 848
856QString Addressee::businessPhoneLabel() 849QString Addressee::businessPhoneLabel()
857{ 850{
858 return i18n("Business Phone"); 851 return i18n("Business Phone");
859} 852}
860 853
861 854
862QString Addressee::mobilePhoneLabel() 855QString Addressee::mobilePhoneLabel()
863{ 856{
864 return i18n("Mobile Phone"); 857 return i18n("Mobile Phone");
865} 858}
866 859
867 860
868QString Addressee::homeFaxLabel() 861QString Addressee::homeFaxLabel()
869{ 862{
870 return i18n("Home Fax"); 863 return i18n("Home Fax");
871} 864}
872 865
873 866
874QString Addressee::businessFaxLabel() 867QString Addressee::businessFaxLabel()
875{ 868{
876 return i18n("Business Fax"); 869 return i18n("Business Fax");
877} 870}
878 871
879 872
880QString Addressee::carPhoneLabel() 873QString Addressee::carPhoneLabel()
881{ 874{
882 return i18n("Car Phone"); 875 return i18n("Car Phone");
883} 876}
884 877
885 878
886QString Addressee::isdnLabel() 879QString Addressee::isdnLabel()
887{ 880{
888 return i18n("ISDN"); 881 return i18n("ISDN");
889} 882}
890 883
891 884
892QString Addressee::pagerLabel() 885QString Addressee::pagerLabel()
893{ 886{
894 return i18n("Pager"); 887 return i18n("Pager");
895} 888}
896 889
897QString Addressee::sipLabel() 890QString Addressee::sipLabel()
898{ 891{
899 return i18n("SIP"); 892 return i18n("SIP");
900} 893}
901 894
902QString Addressee::emailLabel() 895QString Addressee::emailLabel()
903{ 896{
904 return i18n("Email Address"); 897 return i18n("Email Address");
905} 898}
906 899
907 900
908void Addressee::setMailer( const QString &mailer ) 901void Addressee::setMailer( const QString &mailer )
909{ 902{
910 if ( mailer == mData->mailer ) return; 903 if ( mailer == mData->mailer ) return;
911 detach(); 904 detach();
912 mData->empty = false; 905 mData->empty = false;
913 mData->mailer = mailer; 906 mData->mailer = mailer;
914} 907}
915 908
916QString Addressee::mailer() const 909QString Addressee::mailer() const
917{ 910{
918 return mData->mailer; 911 return mData->mailer;
919} 912}
920 913
921QString Addressee::mailerLabel() 914QString Addressee::mailerLabel()
922{ 915{
923 return i18n("Mail Client"); 916 return i18n("Mail Client");
924} 917}
925 918
926 919
927void Addressee::setTimeZone( const TimeZone &timeZone ) 920void Addressee::setTimeZone( const TimeZone &timeZone )
928{ 921{
929 if ( timeZone == mData->timeZone ) return; 922 if ( timeZone == mData->timeZone ) return;
930 detach(); 923 detach();
931 mData->empty = false; 924 mData->empty = false;
932 mData->timeZone = timeZone; 925 mData->timeZone = timeZone;
933} 926}
934 927
935TimeZone Addressee::timeZone() const 928TimeZone Addressee::timeZone() const
936{ 929{
937 return mData->timeZone; 930 return mData->timeZone;
938} 931}
939 932
940QString Addressee::timeZoneLabel() 933QString Addressee::timeZoneLabel()
941{ 934{
942 return i18n("Time Zone"); 935 return i18n("Time Zone");
943} 936}
944 937
945 938
946void Addressee::setGeo( const Geo &geo ) 939void Addressee::setGeo( const Geo &geo )
947{ 940{
948 if ( geo == mData->geo ) return; 941 if ( geo == mData->geo ) return;
949 detach(); 942 detach();
950 mData->empty = false; 943 mData->empty = false;
951 mData->geo = geo; 944 mData->geo = geo;
952} 945}
953 946
954Geo Addressee::geo() const 947Geo Addressee::geo() const
955{ 948{
956 return mData->geo; 949 return mData->geo;
957} 950}
958 951
959QString Addressee::geoLabel() 952QString Addressee::geoLabel()
960{ 953{
961 return i18n("Geographic Position"); 954 return i18n("Geographic Position");
962} 955}
963 956
964 957
965void Addressee::setTitle( const QString &title ) 958void Addressee::setTitle( const QString &title )
966{ 959{
967 if ( title == mData->title ) return; 960 if ( title == mData->title ) return;
968 detach(); 961 detach();
969 mData->empty = false; 962 mData->empty = false;
970 mData->title = title; 963 mData->title = title;
971} 964}
972 965
973QString Addressee::title() const 966QString Addressee::title() const
974{ 967{
975 return mData->title; 968 return mData->title;
976} 969}
977 970
978QString Addressee::titleLabel() 971QString Addressee::titleLabel()
979{ 972{
980 return i18n("Title"); 973 return i18n("Title");
981} 974}
982 975
983 976
984void Addressee::setRole( const QString &role ) 977void Addressee::setRole( const QString &role )
985{ 978{
986 if ( role == mData->role ) return; 979 if ( role == mData->role ) return;
987 detach(); 980 detach();
988 mData->empty = false; 981 mData->empty = false;
989 mData->role = role; 982 mData->role = role;
990} 983}
991 984
992QString Addressee::role() const 985QString Addressee::role() const
993{ 986{
994 return mData->role; 987 return mData->role;
995} 988}
996 989
997QString Addressee::roleLabel() 990QString Addressee::roleLabel()
998{ 991{
999 return i18n("Role"); 992 return i18n("Role");
1000} 993}
1001 994
1002 995
1003void Addressee::setOrganization( const QString &organization ) 996void Addressee::setOrganization( const QString &organization )
1004{ 997{
1005 if ( organization == mData->organization ) return; 998 if ( organization == mData->organization ) return;
1006 detach(); 999 detach();
1007 mData->empty = false; 1000 mData->empty = false;
1008 mData->organization = organization; 1001 mData->organization = organization;
1009} 1002}
1010 1003
1011QString Addressee::organization() const 1004QString Addressee::organization() const
1012{ 1005{
1013 return mData->organization; 1006 return mData->organization;
1014} 1007}
1015 1008
1016QString Addressee::organizationLabel() 1009QString Addressee::organizationLabel()
1017{ 1010{
1018 return i18n("Organization"); 1011 return i18n("Organization");
1019} 1012}
1020 1013
1021 1014
1022void Addressee::setNote( const QString &note ) 1015void Addressee::setNote( const QString &note )
1023{ 1016{
1024 if ( note == mData->note ) return; 1017 if ( note == mData->note ) return;
1025 detach(); 1018 detach();
1026 mData->empty = false; 1019 mData->empty = false;
1027 mData->note = note; 1020 mData->note = note;
1028} 1021}
1029 1022
1030QString Addressee::note() const 1023QString Addressee::note() const
1031{ 1024{
1032 return mData->note; 1025 return mData->note;
1033} 1026}
1034 1027
1035QString Addressee::noteLabel() 1028QString Addressee::noteLabel()
1036{ 1029{
1037 return i18n("Note"); 1030 return i18n("Note");
1038} 1031}
1039 1032
1040 1033
1041void Addressee::setProductId( const QString &productId ) 1034void Addressee::setProductId( const QString &productId )
1042{ 1035{
1043 if ( productId == mData->productId ) return; 1036 if ( productId == mData->productId ) return;
1044 detach(); 1037 detach();
1045 mData->empty = false; 1038 mData->empty = false;
1046 mData->productId = productId; 1039 mData->productId = productId;
1047} 1040}
1048 1041
1049QString Addressee::productId() const 1042QString Addressee::productId() const
1050{ 1043{
1051 return mData->productId; 1044 return mData->productId;
1052} 1045}
1053 1046
1054QString Addressee::productIdLabel() 1047QString Addressee::productIdLabel()
1055{ 1048{
1056 return i18n("Product Identifier"); 1049 return i18n("Product Identifier");
1057} 1050}
1058 1051
1059 1052
1060void Addressee::setRevision( const QDateTime &revision ) 1053void Addressee::setRevision( const QDateTime &revision )
1061{ 1054{
1062 if ( revision == mData->revision ) return; 1055 if ( revision == mData->revision ) return;
1063 detach(); 1056 detach();
1064 mData->empty = false; 1057 mData->empty = false;
1065 mData->revision = revision; 1058 mData->revision = revision;
1066} 1059}
1067 1060
1068QDateTime Addressee::revision() const 1061QDateTime Addressee::revision() const
1069{ 1062{
1070 return mData->revision; 1063 return mData->revision;
1071} 1064}
1072 1065
1073QString Addressee::revisionLabel() 1066QString Addressee::revisionLabel()
1074{ 1067{
1075 return i18n("Revision Date"); 1068 return i18n("Revision Date");
1076} 1069}
1077 1070
1078 1071
1079void Addressee::setSortString( const QString &sortString ) 1072void Addressee::setSortString( const QString &sortString )
1080{ 1073{
1081 if ( sortString == mData->sortString ) return; 1074 if ( sortString == mData->sortString ) return;
1082 detach(); 1075 detach();
1083 mData->empty = false; 1076 mData->empty = false;
1084 mData->sortString = sortString; 1077 mData->sortString = sortString;
1085} 1078}
1086 1079
1087QString Addressee::sortString() const 1080QString Addressee::sortString() const
1088{ 1081{
1089 return mData->sortString; 1082 return mData->sortString;
1090} 1083}
1091 1084
1092QString Addressee::sortStringLabel() 1085QString Addressee::sortStringLabel()
1093{ 1086{
1094 return i18n("Sort String"); 1087 return i18n("Sort String");
1095} 1088}
1096 1089
1097 1090
1098void Addressee::setUrl( const KURL &url ) 1091void Addressee::setUrl( const KURL &url )
1099{ 1092{
1100 if ( url == mData->url ) return; 1093 if ( url == mData->url ) return;
1101 detach(); 1094 detach();
1102 mData->empty = false; 1095 mData->empty = false;
1103 mData->url = url; 1096 mData->url = url;
1104} 1097}
1105 1098
1106KURL Addressee::url() const 1099KURL Addressee::url() const
1107{ 1100{
1108 return mData->url; 1101 return mData->url;
1109} 1102}
1110 1103
1111QString Addressee::urlLabel() 1104QString Addressee::urlLabel()
1112{ 1105{
1113 return i18n("URL"); 1106 return i18n("URL");
1114} 1107}
1115 1108
1116 1109
1117void Addressee::setSecrecy( const Secrecy &secrecy ) 1110void Addressee::setSecrecy( const Secrecy &secrecy )
1118{ 1111{
1119 if ( secrecy == mData->secrecy ) return; 1112 if ( secrecy == mData->secrecy ) return;
1120 detach(); 1113 detach();
1121 mData->empty = false; 1114 mData->empty = false;
1122 mData->secrecy = secrecy; 1115 mData->secrecy = secrecy;
1123} 1116}
1124 1117
1125Secrecy Addressee::secrecy() const 1118Secrecy Addressee::secrecy() const
1126{ 1119{
1127 return mData->secrecy; 1120 return mData->secrecy;
1128} 1121}
1129 1122
1130QString Addressee::secrecyLabel() 1123QString Addressee::secrecyLabel()
1131{ 1124{
1132 return i18n("Security Class"); 1125 return i18n("Security Class");
1133} 1126}
1134 1127
1135 1128
1136void Addressee::setLogo( const Picture &logo ) 1129void Addressee::setLogo( const Picture &logo )
1137{ 1130{
1138 if ( logo == mData->logo ) return; 1131 if ( logo == mData->logo ) return;
1139 detach(); 1132 detach();
1140 mData->empty = false; 1133 mData->empty = false;
1141 mData->logo = logo; 1134 mData->logo = logo;
1142} 1135}
1143 1136
1144Picture Addressee::logo() const 1137Picture Addressee::logo() const
1145{ 1138{
1146 return mData->logo; 1139 return mData->logo;
1147} 1140}
1148 1141
1149QString Addressee::logoLabel() 1142QString Addressee::logoLabel()
1150{ 1143{
1151 return i18n("Logo"); 1144 return i18n("Logo");
1152} 1145}
1153 1146
1154 1147
1155void Addressee::setPhoto( const Picture &photo ) 1148void Addressee::setPhoto( const Picture &photo )
1156{ 1149{
1157 if ( photo == mData->photo ) return; 1150 if ( photo == mData->photo ) return;
1158 detach(); 1151 detach();
1159 mData->empty = false; 1152 mData->empty = false;
1160 mData->photo = photo; 1153 mData->photo = photo;
1161} 1154}
1162 1155
1163Picture Addressee::photo() const 1156Picture Addressee::photo() const
1164{ 1157{
1165 return mData->photo; 1158 return mData->photo;
1166} 1159}
1167 1160
1168QString Addressee::photoLabel() 1161QString Addressee::photoLabel()
1169{ 1162{
1170 return i18n("Photo"); 1163 return i18n("Photo");
1171} 1164}
1172 1165
1173 1166
1174void Addressee::setSound( const Sound &sound ) 1167void Addressee::setSound( const Sound &sound )
1175{ 1168{
1176 if ( sound == mData->sound ) return; 1169 if ( sound == mData->sound ) return;
1177 detach(); 1170 detach();
1178 mData->empty = false; 1171 mData->empty = false;
1179 mData->sound = sound; 1172 mData->sound = sound;
1180} 1173}
1181 1174
1182Sound Addressee::sound() const 1175Sound Addressee::sound() const
1183{ 1176{
1184 return mData->sound; 1177 return mData->sound;
1185} 1178}
1186 1179
1187QString Addressee::soundLabel() 1180QString Addressee::soundLabel()
1188{ 1181{
1189 return i18n("Sound"); 1182 return i18n("Sound");
1190} 1183}
1191 1184
1192 1185
1193void Addressee::setAgent( const Agent &agent ) 1186void Addressee::setAgent( const Agent &agent )
1194{ 1187{
1195 if ( agent == mData->agent ) return; 1188 if ( agent == mData->agent ) return;
1196 detach(); 1189 detach();
1197 mData->empty = false; 1190 mData->empty = false;
1198 mData->agent = agent; 1191 mData->agent = agent;
1199} 1192}
1200 1193
1201Agent Addressee::agent() const 1194Agent Addressee::agent() const
1202{ 1195{
1203 return mData->agent; 1196 return mData->agent;
1204} 1197}
1205 1198
1206QString Addressee::agentLabel() 1199QString Addressee::agentLabel()
1207{ 1200{
1208 return i18n("Agent"); 1201 return i18n("Agent");
1209} 1202}
1210 1203
1211 1204
1212 1205
1213void Addressee::setNameFromString( const QString &str ) 1206void Addressee::setNameFromString( const QString &str )
1214{ 1207{
1215 setFormattedName( str ); 1208 setFormattedName( str );
1216 setName( str ); 1209 setName( str );
1217 1210
1218 static bool first = true; 1211 static bool first = true;
1219 static QStringList titles; 1212 static QStringList titles;
1220 static QStringList suffixes; 1213 static QStringList suffixes;
1221 static QStringList prefixes; 1214 static QStringList prefixes;
1222 1215
1223 if ( first ) { 1216 if ( first ) {
1224 first = false; 1217 first = false;
1225 titles += i18n( "Dr." ); 1218 titles += i18n( "Dr." );
1226 titles += i18n( "Miss" ); 1219 titles += i18n( "Miss" );
1227 titles += i18n( "Mr." ); 1220 titles += i18n( "Mr." );
1228 titles += i18n( "Mrs." ); 1221 titles += i18n( "Mrs." );
1229 titles += i18n( "Ms." ); 1222 titles += i18n( "Ms." );
1230 titles += i18n( "Prof." ); 1223 titles += i18n( "Prof." );
1231 1224
1232 suffixes += i18n( "I" ); 1225 suffixes += i18n( "I" );
1233 suffixes += i18n( "II" ); 1226 suffixes += i18n( "II" );
1234 suffixes += i18n( "III" ); 1227 suffixes += i18n( "III" );
1235 suffixes += i18n( "Jr." ); 1228 suffixes += i18n( "Jr." );
1236 suffixes += i18n( "Sr." ); 1229 suffixes += i18n( "Sr." );
1237 1230
1238 prefixes += "van"; 1231 prefixes += "van";
1239 prefixes += "von"; 1232 prefixes += "von";
1240 prefixes += "de"; 1233 prefixes += "de";
1241 1234
1242 KConfig config( locateLocal( "config", "kabcrc") ); 1235 KConfig config( locateLocal( "config", "kabcrc") );
1243 config.setGroup( "General" ); 1236 config.setGroup( "General" );
1244 titles += config.readListEntry( "Prefixes" ); 1237 titles += config.readListEntry( "Prefixes" );
1245 titles.remove( "" ); 1238 titles.remove( "" );
1246 prefixes += config.readListEntry( "Inclusions" ); 1239 prefixes += config.readListEntry( "Inclusions" );
1247 prefixes.remove( "" ); 1240 prefixes.remove( "" );
1248 suffixes += config.readListEntry( "Suffixes" ); 1241 suffixes += config.readListEntry( "Suffixes" );
1249 suffixes.remove( "" ); 1242 suffixes.remove( "" );
1250 } 1243 }
1251 1244
1252 // clear all name parts 1245 // clear all name parts
1253 setPrefix( "" ); 1246 setPrefix( "" );
1254 setGivenName( "" ); 1247 setGivenName( "" );
1255 setAdditionalName( "" ); 1248 setAdditionalName( "" );
1256 setFamilyName( "" ); 1249 setFamilyName( "" );
1257 setSuffix( "" ); 1250 setSuffix( "" );
1258 1251
1259 if ( str.isEmpty() ) 1252 if ( str.isEmpty() )
1260 return; 1253 return;
1261 1254
1262 int i = str.find(','); 1255 int i = str.find(',');
1263 if( i < 0 ) { 1256 if( i < 0 ) {
1264 QStringList parts = QStringList::split( " ", str ); 1257 QStringList parts = QStringList::split( " ", str );
1265 int leftOffset = 0; 1258 int leftOffset = 0;
1266 int rightOffset = parts.count() - 1; 1259 int rightOffset = parts.count() - 1;
1267 1260
1268 QString suffix; 1261 QString suffix;
1269 while ( rightOffset >= 0 ) { 1262 while ( rightOffset >= 0 ) {
1270 if ( suffixes.contains( parts[ rightOffset ] ) ) { 1263 if ( suffixes.contains( parts[ rightOffset ] ) ) {
1271 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " ")); 1264 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " "));
1272 rightOffset--; 1265 rightOffset--;
1273 } else 1266 } else
1274 break; 1267 break;
1275 } 1268 }
1276 setSuffix( suffix ); 1269 setSuffix( suffix );
1277 1270
1278 if ( rightOffset < 0 ) 1271 if ( rightOffset < 0 )
1279 return; 1272 return;
1280 1273
1281 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) { 1274 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) {
1282 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] ); 1275 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] );
1283 rightOffset--; 1276 rightOffset--;
1284 } else 1277 } else
1285 setFamilyName( parts[ rightOffset ] ); 1278 setFamilyName( parts[ rightOffset ] );
1286 1279
1287 QString prefix; 1280 QString prefix;
1288 while ( leftOffset < rightOffset ) { 1281 while ( leftOffset < rightOffset ) {
1289 if ( titles.contains( parts[ leftOffset ] ) ) { 1282 if ( titles.contains( parts[ leftOffset ] ) ) {
1290 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1283 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1291 leftOffset++; 1284 leftOffset++;
1292 } else 1285 } else
1293 break; 1286 break;
1294 } 1287 }
1295 setPrefix( prefix ); 1288 setPrefix( prefix );
1296 1289
1297 if ( leftOffset < rightOffset ) { 1290 if ( leftOffset < rightOffset ) {
1298 setGivenName( parts[ leftOffset ] ); 1291 setGivenName( parts[ leftOffset ] );
1299 leftOffset++; 1292 leftOffset++;
1300 } 1293 }
1301 1294
1302 QString additionalName; 1295 QString additionalName;
1303 while ( leftOffset < rightOffset ) { 1296 while ( leftOffset < rightOffset ) {
1304 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1297 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1305 leftOffset++; 1298 leftOffset++;
1306 } 1299 }
1307 setAdditionalName( additionalName ); 1300 setAdditionalName( additionalName );
1308 } else { 1301 } else {
1309 QString part1 = str.left( i ); 1302 QString part1 = str.left( i );
1310 QString part2 = str.mid( i + 1 ); 1303 QString part2 = str.mid( i + 1 );
1311 1304
1312 QStringList parts = QStringList::split( " ", part1 ); 1305 QStringList parts = QStringList::split( " ", part1 );
1313 int leftOffset = 0; 1306 int leftOffset = 0;
1314 int rightOffset = parts.count() - 1; 1307 int rightOffset = parts.count() - 1;
1315 1308
1316 QString suffix; 1309 QString suffix;
1317 while ( rightOffset >= 0 ) { 1310 while ( rightOffset >= 0 ) {
1318 if ( suffixes.contains( parts[ rightOffset ] ) ) { 1311 if ( suffixes.contains( parts[ rightOffset ] ) ) {
1319 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " ")); 1312 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " "));
1320 rightOffset--; 1313 rightOffset--;
1321 } else 1314 } else
1322 break; 1315 break;
1323 } 1316 }
1324 setSuffix( suffix ); 1317 setSuffix( suffix );
1325 1318
1326 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) { 1319 if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) {
1327 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] ); 1320 setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] );
1328 rightOffset--; 1321 rightOffset--;
1329 } else 1322 } else
1330 setFamilyName( parts[ rightOffset ] ); 1323 setFamilyName( parts[ rightOffset ] );
1331 1324
1332 QString prefix; 1325 QString prefix;
1333 while ( leftOffset < rightOffset ) { 1326 while ( leftOffset < rightOffset ) {
1334 if ( titles.contains( parts[ leftOffset ] ) ) { 1327 if ( titles.contains( parts[ leftOffset ] ) ) {
1335 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1328 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1336 leftOffset++; 1329 leftOffset++;
1337 } else 1330 } else
1338 break; 1331 break;
1339 } 1332 }
1340 1333
1341 parts = QStringList::split( " ", part2 ); 1334 parts = QStringList::split( " ", part2 );
1342 1335
1343 leftOffset = 0; 1336 leftOffset = 0;
1344 rightOffset = parts.count(); 1337 rightOffset = parts.count();
1345 1338
1346 while ( leftOffset < rightOffset ) { 1339 while ( leftOffset < rightOffset ) {
1347 if ( titles.contains( parts[ leftOffset ] ) ) { 1340 if ( titles.contains( parts[ leftOffset ] ) ) {
1348 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1341 prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1349 leftOffset++; 1342 leftOffset++;
1350 } else 1343 } else
1351 break; 1344 break;
1352 } 1345 }
1353 setPrefix( prefix ); 1346 setPrefix( prefix );
1354 1347
1355 if ( leftOffset < rightOffset ) { 1348 if ( leftOffset < rightOffset ) {
1356 setGivenName( parts[ leftOffset ] ); 1349 setGivenName( parts[ leftOffset ] );
1357 leftOffset++; 1350 leftOffset++;
1358 } 1351 }
1359 1352
1360 QString additionalName; 1353 QString additionalName;
1361 while ( leftOffset < rightOffset ) { 1354 while ( leftOffset < rightOffset ) {
1362 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] ); 1355 additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] );
1363 leftOffset++; 1356 leftOffset++;
1364 } 1357 }
1365 setAdditionalName( additionalName ); 1358 setAdditionalName( additionalName );
1366 } 1359 }
1367} 1360}
1368 1361
1369QString Addressee::realName() const 1362QString Addressee::realName() const
1370{ 1363{
1371 if ( !formattedName().isEmpty() ) 1364 if ( !formattedName().isEmpty() )
1372 return formattedName(); 1365 return formattedName();
1373 1366
1374 QString n = assembledName(); 1367 QString n = assembledName();
1375 1368
1376 if ( n.isEmpty() ) 1369 if ( n.isEmpty() )
1377 n = name(); 1370 n = name();
1378 1371
1379 return n; 1372 return n;
1380} 1373}
1381 1374
1382QString Addressee::assembledName() const 1375QString Addressee::assembledName() const
1383{ 1376{
1384 QString name = prefix() + " " + givenName() + " " + additionalName() + " " + 1377 QString name = prefix() + " " + givenName() + " " + additionalName() + " " +
1385 familyName() + " " + suffix(); 1378 familyName() + " " + suffix();
1386 1379
1387 return name.simplifyWhiteSpace(); 1380 return name.simplifyWhiteSpace();
1388} 1381}
1389 1382
1390QString Addressee::fullEmail( const QString &email ) const 1383QString Addressee::fullEmail( const QString &email ) const
1391{ 1384{
1392 QString e; 1385 QString e;
1393 if ( email.isNull() ) { 1386 if ( email.isNull() ) {
1394 e = preferredEmail(); 1387 e = preferredEmail();
1395 } else { 1388 } else {
1396 e = email; 1389 e = email;
1397 } 1390 }
1398 if ( e.isEmpty() ) return QString::null; 1391 if ( e.isEmpty() ) return QString::null;
1399 1392
1400 QString text; 1393 QString text;
1401 if ( realName().isEmpty() ) 1394 if ( realName().isEmpty() )
1402 text = e; 1395 text = e;
1403 else 1396 else
1404 text = assembledName() + " <" + e + ">"; 1397 text = assembledName() + " <" + e + ">";
1405 1398
1406 return text; 1399 return text;
1407} 1400}
1408 1401
1409void Addressee::insertEmail( const QString &email, bool preferred ) 1402void Addressee::insertEmail( const QString &email, bool preferred )
1410{ 1403{
1411 detach(); 1404 detach();
1412 1405
1413 QStringList::Iterator it = mData->emails.find( email ); 1406 QStringList::Iterator it = mData->emails.find( email );
1414 1407
1415 if ( it != mData->emails.end() ) { 1408 if ( it != mData->emails.end() ) {
1416 if ( !preferred || it == mData->emails.begin() ) return; 1409 if ( !preferred || it == mData->emails.begin() ) return;
1417 mData->emails.remove( it ); 1410 mData->emails.remove( it );
1418 mData->emails.prepend( email ); 1411 mData->emails.prepend( email );
1419 } else { 1412 } else {
1420 if ( preferred ) { 1413 if ( preferred ) {
1421 mData->emails.prepend( email ); 1414 mData->emails.prepend( email );
1422 } else { 1415 } else {
1423 mData->emails.append( email ); 1416 mData->emails.append( email );
1424 } 1417 }
1425 } 1418 }
1426} 1419}
diff --git a/kabc/phonenumber.cpp b/kabc/phonenumber.cpp
index d7e3925..3d82553 100644
--- a/kabc/phonenumber.cpp
+++ b/kabc/phonenumber.cpp
@@ -1,223 +1,245 @@
1/* 1/*
2 This file is part of libkabc. 2 This file is part of libkabc.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21/* 21/*
22Enhanced Version of the file for platform independent KDE tools. 22Enhanced Version of the file for platform independent KDE tools.
23Copyright (c) 2004 Ulf Schenk 23Copyright (c) 2004 Ulf Schenk
24 24
25$Id$ 25$Id$
26*/ 26*/
27 27
28#include <kapplication.h> 28#include <kapplication.h>
29#include <klocale.h> 29#include <klocale.h>
30 30
31#include "phonenumber.h" 31#include "phonenumber.h"
32 32
33using namespace KABC; 33using namespace KABC;
34 34
35PhoneNumber::PhoneNumber() : 35PhoneNumber::PhoneNumber() :
36 mType( Home ) 36 mType( Home )
37{ 37{
38 init(); 38 init();
39} 39}
40 40
41PhoneNumber::PhoneNumber( const QString &number, int type ) : 41PhoneNumber::PhoneNumber( const QString &number, int type ) :
42 mType( type ), mNumber( number ) 42 mType( type ), mNumber( number )
43{ 43{
44 init(); 44 init();
45} 45}
46 46
47PhoneNumber::~PhoneNumber() 47PhoneNumber::~PhoneNumber()
48{ 48{
49} 49}
50 50
51void PhoneNumber::init() 51void PhoneNumber::init()
52{ 52{
53 mId = KApplication::randomString( 8 ); 53 mId = KApplication::randomString( 8 );
54} 54}
55 55
56bool PhoneNumber::operator==( const PhoneNumber &p ) const 56bool PhoneNumber::operator==( const PhoneNumber &p ) const
57{ 57{
58 if ( mNumber != p.mNumber ) return false; 58 if ( mNumber != p.mNumber ) return false;
59 if ( mType != p.mType ) return false; 59 if ( mType != p.mType ) return false;
60 60
61 return true; 61 return true;
62} 62}
63 63
64bool PhoneNumber::operator!=( const PhoneNumber &p ) const 64bool PhoneNumber::operator!=( const PhoneNumber &p ) const
65{ 65{
66 return !( p == *this ); 66 return !( p == *this );
67} 67}
68 68
69bool PhoneNumber::simplifyNumber() 69bool PhoneNumber::simplifyNumber()
70{ 70{
71 QString Number; 71 QString Number;
72 int i; 72 int i;
73 Number = mNumber.stripWhiteSpace (); 73 Number = mNumber.stripWhiteSpace ();
74 mNumber = ""; 74 mNumber = "";
75 for ( i = 0; i < Number.length(); ++i) { 75 for ( i = 0; i < Number.length(); ++i) {
76 if ( Number.at(i).isDigit() || Number.at(i) == '+'|| Number.at(i) == '*'|| Number.at(i) == '#' ) 76 if ( Number.at(i).isDigit() || Number.at(i) == '+'|| Number.at(i) == '*'|| Number.at(i) == '#' )
77 mNumber += Number.at(i); 77 mNumber += Number.at(i);
78 } 78 }
79 return ( mNumber.length() > 0 ); 79 return ( mNumber.length() > 0 );
80} 80}
81// make cellphone compatible 81// make cellphone compatible
82void PhoneNumber::simplifyType() 82void PhoneNumber::simplifyType()
83{ 83{
84 if ( mType & Fax ) mType = Fax; 84 if ( mType & Fax ) mType = Fax;
85 else if ( mType & Cell ) mType = Cell; 85 else if ( mType & Cell ) mType = Cell;
86 else if ( mType & Work ) mType = Work ; 86 else if ( mType & Work ) mType = Work ;
87 else if ( mType & Home ) mType = Home; 87 else if ( mType & Home ) mType = Home;
88 else mType = Pref; 88 else mType = Pref;
89} 89}
90bool PhoneNumber::contains( const PhoneNumber &p )
91{
92 QString Number;
93 QString Num;
94 uint i;
95 Number = mNumber.stripWhiteSpace ();
96 Num = "";
97 for ( i = 0; i < Number.length(); ++i) {
98 if ( Number.at(i).isDigit() || Number.at(i) == '+'|| Number.at(i) == '*'|| Number.at(i) == '#' )
99 Num += Number.at(i);
100 }
101 QString NumberR;
102 QString NumR;
103 NumberR = p.mNumber.stripWhiteSpace ();
104 NumR = "";
105 for ( i = 0; i < NumberR.length(); ++i) {
106 if ( NumberR.at(i).isDigit() || NumberR.at(i) == '+'|| NumberR.at(i) == '*'|| NumberR.at(i) == '#' )
107 NumR += NumberR.at(i);
108 }
109 return (Num == NumR);
110}
111
90void PhoneNumber::setId( const QString &id ) 112void PhoneNumber::setId( const QString &id )
91{ 113{
92 mId = id; 114 mId = id;
93} 115}
94 116
95QString PhoneNumber::id() const 117QString PhoneNumber::id() const
96{ 118{
97 return mId; 119 return mId;
98} 120}
99 121
100void PhoneNumber::setNumber( const QString &number ) 122void PhoneNumber::setNumber( const QString &number )
101{ 123{
102 mNumber = number; 124 mNumber = number;
103} 125}
104 126
105QString PhoneNumber::number() const 127QString PhoneNumber::number() const
106{ 128{
107 return mNumber; 129 return mNumber;
108} 130}
109 131
110void PhoneNumber::setType( int type ) 132void PhoneNumber::setType( int type )
111{ 133{
112 mType = type; 134 mType = type;
113} 135}
114 136
115int PhoneNumber::type() const 137int PhoneNumber::type() const
116{ 138{
117 return mType; 139 return mType;
118} 140}
119 141
120QString PhoneNumber::typeLabel() const 142QString PhoneNumber::typeLabel() const
121{ 143{
122 QString label; 144 QString label;
123 bool first = true; 145 bool first = true;
124 146
125 TypeList list = typeList(); 147 TypeList list = typeList();
126 148
127 TypeList::Iterator it; 149 TypeList::Iterator it;
128 for ( it = list.begin(); it != list.end(); ++it ) { 150 for ( it = list.begin(); it != list.end(); ++it ) {
129 if ( ( type() & (*it) ) && ( (*it) != Pref ) ) { 151 if ( ( type() & (*it) ) && ( (*it) != Pref ) ) {
130 label.append( ( first ? "" : "/" ) + typeLabel( *it ) ); 152 label.append( ( first ? "" : "/" ) + typeLabel( *it ) );
131 if ( first ) 153 if ( first )
132 first = false; 154 first = false;
133 } 155 }
134 } 156 }
135 157
136 return label; 158 return label;
137} 159}
138 160
139QString PhoneNumber::label() const 161QString PhoneNumber::label() const
140{ 162{
141 return typeLabel( type() ); 163 return typeLabel( type() );
142} 164}
143 165
144PhoneNumber::TypeList PhoneNumber::typeList() 166PhoneNumber::TypeList PhoneNumber::typeList()
145{ 167{
146 TypeList list; 168 TypeList list;
147 169
148 list << Home << Work << Msg << Pref << Voice << Fax << Cell << Video 170 list << Home << Work << Msg << Pref << Voice << Fax << Cell << Video
149 << Bbs << Modem << Car << Isdn << Pcs << Pager << Sip; 171 << Bbs << Modem << Car << Isdn << Pcs << Pager << Sip;
150 172
151 return list; 173 return list;
152} 174}
153 175
154QString PhoneNumber::label( int type ) 176QString PhoneNumber::label( int type )
155{ 177{
156 return typeLabel( type ); 178 return typeLabel( type );
157} 179}
158 180
159QString PhoneNumber::typeLabel( int type ) 181QString PhoneNumber::typeLabel( int type )
160{ 182{
161 QString typeString; 183 QString typeString;
162 184
163 if ((type & Home) == Home) 185 if ((type & Home) == Home)
164 typeString += i18n("Home"); 186 typeString += i18n("Home");
165 else if ((type & Work) == Work) 187 else if ((type & Work) == Work)
166 typeString += i18n("Work"); 188 typeString += i18n("Work");
167 189
168 if (!typeString.isEmpty()) 190 if (!typeString.isEmpty())
169 typeString += " "; 191 typeString += " ";
170 192
171 if ((type & Cell) == Cell) 193 if ((type & Cell) == Cell)
172 typeString += i18n("Mobile"); 194 typeString += i18n("Mobile");
173 else if ((type & Fax) == Fax) 195 else if ((type & Fax) == Fax)
174 typeString += i18n("Fax"); 196 typeString += i18n("Fax");
175 else if ((type & Msg) == Msg) 197 else if ((type & Msg) == Msg)
176 typeString += i18n("Messenger"); 198 typeString += i18n("Messenger");
177 else if ((type & Voice) == Voice) { 199 else if ((type & Voice) == Voice) {
178// add nothing in case of the Voice flag 200// add nothing in case of the Voice flag
179// typeString += i18n("Voice"); 201// typeString += i18n("Voice");
180 } 202 }
181 else if ((type & Video) == Video) 203 else if ((type & Video) == Video)
182 typeString += i18n("Video"); 204 typeString += i18n("Video");
183 else if ((type & Bbs) == Bbs) 205 else if ((type & Bbs) == Bbs)
184 typeString += i18n("Mailbox"); 206 typeString += i18n("Mailbox");
185 else if ((type & Modem) == Modem) 207 else if ((type & Modem) == Modem)
186 typeString += i18n("Modem"); 208 typeString += i18n("Modem");
187 else if ((type & Car) == Car) 209 else if ((type & Car) == Car)
188 typeString += i18n("Car"); 210 typeString += i18n("Car");
189 else if ((type & Isdn) == Isdn) 211 else if ((type & Isdn) == Isdn)
190 typeString += i18n("ISDN"); 212 typeString += i18n("ISDN");
191 else if ((type & Pcs) == Pcs) 213 else if ((type & Pcs) == Pcs)
192 typeString += i18n("PCS"); 214 typeString += i18n("PCS");
193 else if ((type & Pager) == Pager) 215 else if ((type & Pager) == Pager)
194 typeString += i18n("Pager"); 216 typeString += i18n("Pager");
195 else if ((type & Sip) == Sip) 217 else if ((type & Sip) == Sip)
196 typeString += i18n("SIP"); 218 typeString += i18n("SIP");
197 219
198 // add the prefered flag 220 // add the prefered flag
199 if (!typeString.isEmpty()) 221 if (!typeString.isEmpty())
200 typeString += " "; 222 typeString += " ";
201 /* 223 /*
202 if ((type & Pref) == Pref) 224 if ((type & Pref) == Pref)
203 typeString += i18n("(p)"); 225 typeString += i18n("(p)");
204 */ 226 */
205 //if we still have no match, return "other" 227 //if we still have no match, return "other"
206 if (typeString.isEmpty()) 228 if (typeString.isEmpty())
207 return i18n("Other"); 229 return i18n("Other");
208 230
209 231
210 return typeString; 232 return typeString;
211} 233}
212 234
213QDataStream &KABC::operator<<( QDataStream &s, const PhoneNumber &phone ) 235QDataStream &KABC::operator<<( QDataStream &s, const PhoneNumber &phone )
214{ 236{
215 return s << phone.mId << phone.mType << phone.mNumber; 237 return s << phone.mId << phone.mType << phone.mNumber;
216} 238}
217 239
218QDataStream &KABC::operator>>( QDataStream &s, PhoneNumber &phone ) 240QDataStream &KABC::operator>>( QDataStream &s, PhoneNumber &phone )
219{ 241{
220 s >> phone.mId >> phone.mType >> phone.mNumber; 242 s >> phone.mId >> phone.mType >> phone.mNumber;
221 243
222 return s; 244 return s;
223} 245}
diff --git a/kabc/phonenumber.h b/kabc/phonenumber.h
index 410a52f..2d4d3e0 100644
--- a/kabc/phonenumber.h
+++ b/kabc/phonenumber.h
@@ -1,168 +1,169 @@
1/* 1/*
2 This file is part of libkabc. 2 This file is part of libkabc.
3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> 3 Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
4 4
5 This library is free software; you can redistribute it and/or 5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public 6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either 7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version. 8 version 2 of the License, or (at your option) any later version.
9 9
10 This library is distributed in the hope that it will be useful, 10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details. 13 Library General Public License for more details.
14 14
15 You should have received a copy of the GNU Library General Public License 15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to 16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. 18 Boston, MA 02111-1307, USA.
19*/ 19*/
20 20
21/* 21/*
22Enhanced Version of the file for platform independent KDE tools. 22Enhanced Version of the file for platform independent KDE tools.
23Copyright (c) 2004 Ulf Schenk 23Copyright (c) 2004 Ulf Schenk
24 24
25$Id$ 25$Id$
26*/ 26*/
27 27
28#ifndef KABC_PHONENUMBER_H 28#ifndef KABC_PHONENUMBER_H
29#define KABC_PHONENUMBER_H 29#define KABC_PHONENUMBER_H
30 30
31#include <qvaluelist.h> 31#include <qvaluelist.h>
32#include <qstring.h> 32#include <qstring.h>
33 33
34namespace KABC { 34namespace KABC {
35 35
36/** 36/**
37 @short Phonenumber information. 37 @short Phonenumber information.
38 38
39 This class provides phone number information. A phone number is classified by 39 This class provides phone number information. A phone number is classified by
40 a type. The following types are available, it's possible to use multiple types 40 a type. The following types are available, it's possible to use multiple types
41 @ref Types for a number by combining them through a logical or. 41 @ref Types for a number by combining them through a logical or.
42*/ 42*/
43class PhoneNumber 43class PhoneNumber
44{ 44{
45 friend QDataStream &operator<<( QDataStream &, const PhoneNumber & ); 45 friend QDataStream &operator<<( QDataStream &, const PhoneNumber & );
46 friend QDataStream &operator>>( QDataStream &, PhoneNumber & ); 46 friend QDataStream &operator>>( QDataStream &, PhoneNumber & );
47 47
48 public: 48 public:
49 typedef QValueList<PhoneNumber> List; 49 typedef QValueList<PhoneNumber> List;
50 typedef QValueList<int> TypeList; 50 typedef QValueList<int> TypeList;
51 51
52 /** 52 /**
53 @li @p Home - Home number 53 @li @p Home - Home number
54 @li @p Work - Office number 54 @li @p Work - Office number
55 @li @p Msg - Messaging 55 @li @p Msg - Messaging
56 @li @p Pref - Preferred number 56 @li @p Pref - Preferred number
57 @li @p Voice - Voice 57 @li @p Voice - Voice
58 @li @p Fax - Fax machine 58 @li @p Fax - Fax machine
59 @li @p Cell - Cell phone 59 @li @p Cell - Cell phone
60 @li @p Video - Video phone 60 @li @p Video - Video phone
61 @li @p Bbs - Mailbox 61 @li @p Bbs - Mailbox
62 @li @p Modem - Modem 62 @li @p Modem - Modem
63 @li @p Car - Car phone 63 @li @p Car - Car phone
64 @li @p Isdn - ISDN connection 64 @li @p Isdn - ISDN connection
65 @li @p Pcs - Personal Communication Service 65 @li @p Pcs - Personal Communication Service
66 @li @p Pager - Pager 66 @li @p Pager - Pager
67 @li @p SIP - VoIP 67 @li @p SIP - VoIP
68 */ 68 */
69 enum Types { Home = 1, Work = 2, Msg = 4, Pref = 8, Voice = 16, Fax = 32, 69 enum Types { Home = 1, Work = 2, Msg = 4, Pref = 8, Voice = 16, Fax = 32,
70 Cell = 64, Video = 128, Bbs = 256, Modem = 512, Car = 1024, 70 Cell = 64, Video = 128, Bbs = 256, Modem = 512, Car = 1024,
71 Isdn = 2048, Pcs = 4096, Pager = 8192, Sip = 16384 }; 71 Isdn = 2048, Pcs = 4096, Pager = 8192, Sip = 16384 };
72 72
73 /** 73 /**
74 Create an empty phone number object. 74 Create an empty phone number object.
75 */ 75 */
76 PhoneNumber(); 76 PhoneNumber();
77 77
78 /** 78 /**
79 Create a phonenumber object. 79 Create a phonenumber object.
80 80
81 @param number Number 81 @param number Number
82 @param type Type as defined in enum. Multiple types can be 82 @param type Type as defined in enum. Multiple types can be
83 specified by combining them by a logical or. 83 specified by combining them by a logical or.
84 */ 84 */
85 PhoneNumber( const QString &number, int type = Home ); 85 PhoneNumber( const QString &number, int type = Home );
86 86
87 /** 87 /**
88 Destructor. 88 Destructor.
89 */ 89 */
90 ~PhoneNumber(); 90 ~PhoneNumber();
91 91
92 bool operator==( const PhoneNumber & ) const; 92 bool operator==( const PhoneNumber & ) const;
93 bool operator!=( const PhoneNumber & ) const; 93 bool operator!=( const PhoneNumber & ) const;
94 94
95 bool contains( const PhoneNumber &p );
95 /** 96 /**
96 Sets the unique identifier. 97 Sets the unique identifier.
97 */ 98 */
98 void setId( const QString &id ); 99 void setId( const QString &id );
99 100
100 /** 101 /**
101 Returns the unique identifier. 102 Returns the unique identifier.
102 */ 103 */
103 QString id() const; 104 QString id() const;
104 105
105 /** 106 /**
106 Sets the number. 107 Sets the number.
107 */ 108 */
108 void setNumber( const QString & ); 109 void setNumber( const QString & );
109 110
110 /** 111 /**
111 Returns the number. 112 Returns the number.
112 */ 113 */
113 QString number() const; 114 QString number() const;
114 115
115 /** 116 /**
116 Sets the type. Multiple types can be specified by combining them by 117 Sets the type. Multiple types can be specified by combining them by
117 a logical or. 118 a logical or.
118 */ 119 */
119 void setType( int ); 120 void setType( int );
120 121
121 /** 122 /**
122 Returns the type. Can be a multiple types combined by a logical or. 123 Returns the type. Can be a multiple types combined by a logical or.
123 */ 124 */
124 int type() const; 125 int type() const;
125 126
126 /** 127 /**
127 Returns a translated string of all types the address has. 128 Returns a translated string of all types the address has.
128 */ 129 */
129 QString typeLabel() const; 130 QString typeLabel() const;
130 131
131 /** 132 /**
132 Returns the translated label for phone number depending on its type. 133 Returns the translated label for phone number depending on its type.
133 */ 134 */
134 QString label() const; 135 QString label() const;
135 136
136 /** 137 /**
137 Returns a list of all available types 138 Returns a list of all available types
138 */ 139 */
139 static TypeList typeList(); 140 static TypeList typeList();
140 141
141 /** 142 /**
142 Returns the translated label for phone number type. 143 Returns the translated label for phone number type.
143 */ 144 */
144 static QString typeLabel( int type ); 145 static QString typeLabel( int type );
145 146
146 /** 147 /**
147 Returns the translated label for phone number type. 148 Returns the translated label for phone number type.
148 @obsolete 149 @obsolete
149 */ 150 */
150 static QString label( int type ); 151 static QString label( int type );
151 bool simplifyNumber(); 152 bool simplifyNumber();
152 void simplifyType(); 153 void simplifyType();
153 154
154 private: 155 private:
155 void init(); 156 void init();
156 157
157 QString mId; 158 QString mId;
158 159
159 int mType; 160 int mType;
160 QString mNumber; 161 QString mNumber;
161}; 162};
162 163
163QDataStream &operator<<( QDataStream &, const PhoneNumber & ); 164QDataStream &operator<<( QDataStream &, const PhoneNumber & );
164QDataStream &operator>>( QDataStream &, PhoneNumber & ); 165QDataStream &operator>>( QDataStream &, PhoneNumber & );
165 166
166} 167}
167 168
168#endif 169#endif