00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
#include <qregexp.h>
00023
00024
#include <ksharedptr.h>
00025
#include <kdebug.h>
00026
#include <kapplication.h>
00027
#include <klocale.h>
00028
00029
#include "addresseehelper.h"
00030
#include "field.h"
00031
#include "resource.h"
00032
00033
#include "addressee.h"
00034
00035
using namespace KABC;
00036
00037
static bool matchBinaryPattern(
int value,
int pattern );
00038
00039
template <
class L>
00040
static bool listEquals(
const QValueList<L>&,
const QValueList<L>& );
00041
00042 KABC::Field *Addressee::mSortField = 0;
00043
00044
struct Addressee::AddresseeData :
public KShared
00045 {
00046
QString uid;
00047 --VARIABLES--
00048
00049 PhoneNumber::List phoneNumbers;
00050
Address::List addresses;
00051 Key::List keys;
00052
QStringList emails;
00053
QStringList categories;
00054
QStringList custom;
00055
00056 Resource *resource;
00057
00058
bool empty :1;
00059
bool changed :1;
00060 };
00061
00062 Addressee::AddresseeData* Addressee::shared_null = 0;
00063
00064 Addressee::AddresseeData* Addressee::makeSharedNull()
00065 {
00066 Addressee::shared_null =
new AddresseeData;
00067 shared_null->_KShared_ref();
00068 shared_null->empty =
true;
00069 shared_null->changed =
false;
00070 shared_null->resource = 0;
00071
return shared_null;
00072 }
00073
00074
Addressee::Addressee()
00075 {
00076 mData = shared_null ? shared_null : makeSharedNull();
00077 }
00078
00079 Addressee::~Addressee()
00080 {
00081 }
00082
00083
Addressee::Addressee(
const Addressee &a )
00084 {
00085 mData = a.
mData;
00086 }
00087
00088
Addressee &Addressee::operator=(
const Addressee &a )
00089 {
00090 mData = a.
mData;
00091
return (*this);
00092 }
00093
00094
void Addressee::detach()
00095 {
00096
if ( mData.
data() == shared_null ) {
00097 mData =
new AddresseeData;
00098 mData->empty =
true;
00099 mData->changed =
false;
00100 mData->resource = 0;
00101 mData->uid =
KApplication::randomString( 10 );
00102
return;
00103 }
else if ( mData.
count() == 1 )
return;
00104
00105 AddresseeData data = *mData;
00106 mData =
new AddresseeData( data );
00107 }
00108
00109
bool Addressee::operator==(
const Addressee &a )
const
00110
{
00111
if (
uid() != a.
uid() ) {
00112
kdDebug(5700) <<
"uid differs" <<
endl;
00113
return false;
00114 }
00115 --EQUALSTEST--
00116
if ( ( mData->url.isValid() || a.
mData->url.isValid() ) &&
00117 ( mData->url != a.
mData->url ) ) {
00118
kdDebug(5700) <<
"url differs" <<
endl;
00119
return false;
00120 }
00121
if ( !listEquals( mData->phoneNumbers, a.
mData->phoneNumbers ) ) {
00122
kdDebug(5700) <<
"phoneNumbers differs" <<
endl;
00123
return false;
00124 }
00125
if ( !listEquals( mData->addresses, a.
mData->addresses ) ) {
00126
kdDebug(5700) <<
"addresses differs" <<
endl;
00127
return false;
00128 }
00129
if ( !listEquals( mData->keys, a.
mData->keys ) ) {
00130
kdDebug(5700) <<
"keys differs" <<
endl;
00131
return false;
00132 }
00133
if ( !listEquals( mData->emails, a.
mData->emails ) ) {
00134
kdDebug(5700) <<
"emails differs" <<
endl;
00135
return false;
00136 }
00137
if ( !listEquals( mData->categories, a.
mData->categories ) ) {
00138
kdDebug(5700) <<
"categories differs" <<
endl;
00139
return false;
00140 }
00141
if ( !listEquals( mData->custom, a.
mData->custom ) ) {
00142
kdDebug(5700) <<
"custom differs" <<
endl;
00143
return false;
00144 }
00145
00146
return true;
00147 }
00148
00149
bool Addressee::operator!=(
const Addressee &a )
const
00150
{
00151
return !( a == *
this );
00152 }
00153
00154
bool Addressee::isEmpty()
const
00155
{
00156
return mData->empty;
00157 }
00158
00159
void Addressee::setUid(
const QString &
id )
00160 {
00161
if (
id == mData->uid )
return;
00162 detach();
00163 mData->empty =
false;
00164 mData->uid =
id;
00165 }
00166
00167
QString Addressee::uid()
const
00168
{
00169
return mData->uid;
00170 }
00171
00172
QString Addressee::uidLabel()
00173 {
00174
return i18n(
"Unique Identifier");
00175 }
00176
00177 --DEFINITIONS--
00178
00179
void Addressee::setNameFromString(
const QString &str )
00180 {
00181
setFormattedName( str );
00182
setName( str );
00183
00184
00185
setPrefix( QString::null );
00186
setGivenName( QString::null );
00187
setAdditionalName( QString::null );
00188
setFamilyName( QString::null );
00189
setSuffix( QString::null );
00190
00191
if ( str.isEmpty() )
00192
return;
00193
00194
QString spaceStr =
" ";
00195
QString emptyStr =
"";
00196 AddresseeHelper *helper = AddresseeHelper::self();
00197
00198
int i = str.find(
',' );
00199
if( i < 0 ) {
00200
QStringList parts = QStringList::split( spaceStr, str );
00201
int leftOffset = 0;
00202
int rightOffset = parts.count() - 1;
00203
00204
QString suffix;
00205
while ( rightOffset >= 0 ) {
00206
if ( helper->containsSuffix( parts[ rightOffset ] ) ) {
00207 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? emptyStr : spaceStr));
00208 rightOffset--;
00209 }
else
00210
break;
00211 }
00212
setSuffix( suffix );
00213
00214
if ( rightOffset < 0 )
00215
return;
00216
00217
if ( rightOffset - 1 >= 0 && helper->containsPrefix( parts[ rightOffset - 1 ].lower() ) ) {
00218
setFamilyName( parts[ rightOffset - 1 ] + spaceStr + parts[ rightOffset ] );
00219 rightOffset--;
00220 }
else {
00221
if ( helper->tradeAsFamilyName() )
00222
setFamilyName( parts[ rightOffset ] );
00223
else
00224
setGivenName( parts[ rightOffset ] );
00225 }
00226
00227
QString prefix;
00228
while ( leftOffset < rightOffset ) {
00229
if ( helper->containsTitle( parts[ leftOffset ] ) ) {
00230 prefix.append( ( prefix.isEmpty() ? emptyStr : spaceStr) + parts[ leftOffset ] );
00231 leftOffset++;
00232 }
else
00233
break;
00234 }
00235
setPrefix( prefix );
00236
00237
if ( leftOffset < rightOffset ) {
00238
setGivenName( parts[ leftOffset ] );
00239 leftOffset++;
00240 }
00241
00242
QString additionalName;
00243
while ( leftOffset < rightOffset ) {
00244 additionalName.append( ( additionalName.isEmpty() ? emptyStr : spaceStr) + parts[ leftOffset ] );
00245 leftOffset++;
00246 }
00247
setAdditionalName( additionalName );
00248 }
else {
00249
QString part1 = str.left( i );
00250
QString part2 = str.mid( i + 1 );
00251
00252
QStringList parts = QStringList::split( spaceStr, part1 );
00253
int leftOffset = 0;
00254
int rightOffset = parts.count() - 1;
00255
00256
if ( parts.count() > 0 ) {
00257
00258
QString suffix;
00259
while ( rightOffset >= 0 ) {
00260
if ( helper->containsSuffix( parts[ rightOffset ] ) ) {
00261 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? emptyStr : spaceStr));
00262 rightOffset--;
00263 }
else
00264
break;
00265 }
00266
setSuffix( suffix );
00267
00268
if ( rightOffset - 1 >= 0 && helper->containsPrefix( parts[ rightOffset - 1 ].lower() ) ) {
00269
setFamilyName( parts[ rightOffset - 1 ] + spaceStr + parts[ rightOffset ] );
00270 rightOffset--;
00271 }
else
00272
setFamilyName( parts[ rightOffset ] );
00273
00274
QString prefix;
00275
while ( leftOffset < rightOffset ) {
00276
if ( helper->containsTitle( parts[ leftOffset ] ) ) {
00277 prefix.append( ( prefix.isEmpty() ? emptyStr : spaceStr) + parts[ leftOffset ] );
00278 leftOffset++;
00279 }
else
00280
break;
00281 }
00282 }
else {
00283
setPrefix(
"" );
00284
setFamilyName(
"" );
00285
setSuffix(
"" );
00286 }
00287
00288 parts = QStringList::split( spaceStr, part2 );
00289
00290 leftOffset = 0;
00291 rightOffset = parts.count();
00292
00293
if ( parts.count() > 0 ) {
00294
00295
QString prefix;
00296
while ( leftOffset < rightOffset ) {
00297
if ( helper->containsTitle( parts[ leftOffset ] ) ) {
00298 prefix.append( ( prefix.isEmpty() ? emptyStr : spaceStr) + parts[ leftOffset ] );
00299 leftOffset++;
00300 }
else
00301
break;
00302 }
00303
setPrefix( prefix );
00304
00305
if ( leftOffset < rightOffset ) {
00306
setGivenName( parts[ leftOffset ] );
00307 leftOffset++;
00308 }
00309
00310
QString additionalName;
00311
while ( leftOffset < rightOffset ) {
00312 additionalName.append( ( additionalName.isEmpty() ? emptyStr : spaceStr) + parts[ leftOffset ] );
00313 leftOffset++;
00314 }
00315
setAdditionalName( additionalName );
00316 }
else {
00317
setGivenName(
"" );
00318
setAdditionalName(
"" );
00319 }
00320 }
00321 }
00322
00323
QString Addressee::realName()
const
00324
{
00325
QString n(
formattedName() );
00326
if ( !n.isEmpty() )
00327
return n;
00328
00329 n =
assembledName();
00330
if ( !n.isEmpty() )
00331
return n;
00332
00333 n =
name();
00334
if ( !n.isEmpty() )
00335
return n;
00336
00337
return organization();
00338 }
00339
00340
QString Addressee::assembledName()
const
00341
{
00342
QString name =
prefix() +
" " +
givenName() +
" " +
additionalName() +
" " +
00343
familyName() +
" " +
suffix();
00344
00345
return name.simplifyWhiteSpace();
00346 }
00347
00348
QString Addressee::fullEmail(
const QString &email )
const
00349
{
00350
QString e;
00351
if ( email.isNull() ) {
00352 e =
preferredEmail();
00353 }
else {
00354 e = email;
00355 }
00356
if ( e.isEmpty() )
return QString::null;
00357
00358
QString text;
00359
if (
realName().isEmpty() )
00360 text = e;
00361
else {
00362
QRegExp needQuotes(
"[^ 0-9A-Za-z\\x0080-\\xFFFF]" );
00363
if (
realName().find( needQuotes ) != -1 )
00364 text =
"\"" +
realName() +
"\" <" + e +
">";
00365
else
00366 text =
realName() +
" <" + e +
">";
00367 }
00368
00369
return text;
00370 }
00371
00372
void Addressee::insertEmail(
const QString &email,
bool preferred )
00373 {
00374
if ( email.simplifyWhiteSpace().isEmpty() )
00375
return;
00376
00377 detach();
00378
00379 QStringList::Iterator it = mData->emails.find( email );
00380
00381
if ( it != mData->emails.end() ) {
00382
if ( !preferred || it == mData->emails.begin() )
return;
00383 mData->emails.remove( it );
00384 mData->emails.prepend( email );
00385 }
else {
00386
if ( preferred ) {
00387 mData->emails.prepend( email );
00388 }
else {
00389 mData->emails.append( email );
00390 }
00391 }
00392 }
00393
00394
void Addressee::removeEmail(
const QString &email )
00395 {
00396 detach();
00397
00398 QStringList::Iterator it = mData->emails.find( email );
00399
if ( it == mData->emails.end() )
return;
00400
00401 mData->emails.remove( it );
00402 }
00403
00404
QString Addressee::preferredEmail()
const
00405
{
00406
if ( mData->emails.
count() == 0 )
return QString::null;
00407
else return mData->emails.first();
00408 }
00409
00410
QStringList Addressee::emails()
const
00411
{
00412
return mData->emails;
00413 }
00414
void Addressee::setEmails(
const QStringList& emails ) {
00415 detach();
00416
00417 mData->emails = emails;
00418 }
00419
void Addressee::insertPhoneNumber(
const PhoneNumber &phoneNumber )
00420 {
00421 detach();
00422 mData->empty =
false;
00423
00424 PhoneNumber::List::Iterator it;
00425
for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
00426
if ( (*it).id() == phoneNumber.
id() ) {
00427 *it = phoneNumber;
00428
return;
00429 }
00430 }
00431
if ( !phoneNumber.
number().simplifyWhiteSpace().isEmpty() )
00432 mData->phoneNumbers.append( phoneNumber );
00433 }
00434
00435
void Addressee::removePhoneNumber(
const PhoneNumber &phoneNumber )
00436 {
00437 detach();
00438
00439 PhoneNumber::List::Iterator it;
00440
for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
00441
if ( (*it).id() == phoneNumber.
id() ) {
00442 mData->phoneNumbers.remove( it );
00443
return;
00444 }
00445 }
00446 }
00447
00448
PhoneNumber Addressee::phoneNumber(
int type )
const
00449
{
00450
PhoneNumber phoneNumber(
"", type );
00451 PhoneNumber::List::ConstIterator it;
00452
for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
00453
if ( matchBinaryPattern( (*it).type(), type ) ) {
00454
if ( (*it).type() & PhoneNumber::Pref )
00455
return (*it);
00456
else if (
phoneNumber.
number().isEmpty() )
00457
phoneNumber = (*it);
00458 }
00459 }
00460
00461
return phoneNumber;
00462 }
00463
00464 PhoneNumber::List
Addressee::phoneNumbers()
const
00465
{
00466
return mData->phoneNumbers;
00467 }
00468
00469 PhoneNumber::List
Addressee::phoneNumbers(
int type )
const
00470
{
00471 PhoneNumber::List list;
00472
00473 PhoneNumber::List::ConstIterator it;
00474
for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
00475
if ( matchBinaryPattern( (*it).type(), type ) ) {
00476 list.append( *it );
00477 }
00478 }
00479
return list;
00480 }
00481
00482
PhoneNumber Addressee::findPhoneNumber(
const QString &
id )
const
00483
{
00484 PhoneNumber::List::ConstIterator it;
00485
for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
00486
if ( (*it).id() ==
id ) {
00487
return *it;
00488 }
00489 }
00490
return PhoneNumber();
00491 }
00492
00493
void Addressee::insertKey(
const Key &key )
00494 {
00495 detach();
00496 mData->empty =
false;
00497
00498 Key::List::Iterator it;
00499
for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
00500
if ( (*it).id() ==
key.id() ) {
00501 *it =
key;
00502
return;
00503 }
00504 }
00505 mData->keys.append( key );
00506 }
00507
00508
void Addressee::removeKey(
const Key &key )
00509 {
00510 detach();
00511
00512 Key::List::Iterator it;
00513
for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
00514
if ( (*it).id() ==
key.id() ) {
00515 mData->keys.remove( key );
00516
return;
00517 }
00518 }
00519 }
00520
00521
Key Addressee::key(
int type,
QString customTypeString )
const
00522
{
00523 Key::List::ConstIterator it;
00524
for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
00525
if ( (*it).type() == type ) {
00526
if ( type == Key::Custom ) {
00527
if ( customTypeString.isEmpty() ) {
00528
return *it;
00529 }
else {
00530
if ( (*it).customTypeString() == customTypeString )
00531
return (*it);
00532 }
00533 }
else {
00534
return *it;
00535 }
00536 }
00537 }
00538
return Key(
QString(), type );
00539 }
00540
00541
void Addressee::setKeys(
const Key::List& list )
00542 {
00543 detach();
00544 mData->keys = list;
00545 }
00546
00547 Key::List
Addressee::keys()
const
00548
{
00549
return mData->keys;
00550 }
00551
00552 Key::List
Addressee::keys(
int type,
QString customTypeString )
const
00553
{
00554 Key::List list;
00555
00556 Key::List::ConstIterator it;
00557
for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
00558
if ( (*it).type() == type ) {
00559
if ( type == Key::Custom ) {
00560
if ( customTypeString.isEmpty() ) {
00561 list.append( *it );
00562 }
else {
00563
if ( (*it).customTypeString() == customTypeString )
00564 list.append( *it );
00565 }
00566 }
else {
00567 list.append( *it );
00568 }
00569 }
00570 }
00571
return list;
00572 }
00573
00574
Key Addressee::findKey(
const QString &
id )
const
00575
{
00576 Key::List::ConstIterator it;
00577
for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
00578
if ( (*it).id() ==
id ) {
00579
return *it;
00580 }
00581 }
00582
return Key();
00583 }
00584
00585
QString Addressee::asString()
const
00586
{
00587
return "Smith, agent Smith...";
00588 }
00589
00590
void Addressee::dump()
const
00591
{
00592
kdDebug(5700) <<
"Addressee {" <<
endl;
00593
00594
kdDebug(5700) <<
" Uid: '" <<
uid() <<
"'" <<
endl;
00595
00596 --DEBUG--
00597
00598
kdDebug(5700) <<
" Emails {" <<
endl;
00599
QStringList e =
emails();
00600 QStringList::ConstIterator it;
00601
for( it = e.begin(); it != e.end(); ++it ) {
00602
kdDebug(5700) <<
" " << (*it) <<
endl;
00603 }
00604
kdDebug(5700) <<
" }" <<
endl;
00605
00606
kdDebug(5700) <<
" PhoneNumbers {" <<
endl;
00607 PhoneNumber::List p =
phoneNumbers();
00608 PhoneNumber::List::ConstIterator it2;
00609
for( it2 = p.begin(); it2 != p.end(); ++it2 ) {
00610
kdDebug(5700) <<
" Type: " << int((*it2).type()) <<
" Number: " << (*it2).number() <<
endl;
00611 }
00612
kdDebug(5700) <<
" }" <<
endl;
00613
00614
Address::List a =
addresses();
00615 Address::List::ConstIterator it3;
00616
for( it3 = a.begin(); it3 != a.end(); ++it3 ) {
00617 (*it3).dump();
00618 }
00619
00620
kdDebug(5700) <<
" Keys {" <<
endl;
00621 Key::List k =
keys();
00622 Key::List::ConstIterator it4;
00623
for( it4 = k.begin(); it4 != k.end(); ++it4 ) {
00624
kdDebug(5700) <<
" Type: " << int((*it4).type()) <<
00625
" Key: " << (*it4).textData() <<
00626
" CustomString: " << (*it4).customTypeString() <<
endl;
00627 }
00628
kdDebug(5700) <<
" }" <<
endl;
00629
00630
kdDebug(5700) <<
"}" <<
endl;
00631 }
00632
00633
00634
void Addressee::insertAddress(
const Address &address )
00635 {
00636
if ( address.
isEmpty() )
00637
return;
00638
00639 detach();
00640 mData->empty =
false;
00641
00642 Address::List::Iterator it;
00643
for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
00644
if ( (*it).id() == address.
id() ) {
00645 *it = address;
00646
return;
00647 }
00648 }
00649
00650 mData->addresses.append( address );
00651 }
00652
00653
void Addressee::removeAddress(
const Address &address )
00654 {
00655 detach();
00656
00657 Address::List::Iterator it;
00658
for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
00659
if ( (*it).id() == address.
id() ) {
00660 mData->addresses.remove( it );
00661
return;
00662 }
00663 }
00664 }
00665
00666
Address Addressee::address(
int type )
const
00667
{
00668
Address address( type );
00669 Address::List::ConstIterator it;
00670
for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
00671
if ( matchBinaryPattern( (*it).type(), type ) ) {
00672
if ( (*it).type() & Address::Pref )
00673
return (*it);
00674
else if (
address.
isEmpty() )
00675
address = (*it);
00676 }
00677 }
00678
00679
return address;
00680 }
00681
00682
Address::List Addressee::addresses()
const
00683
{
00684
return mData->addresses;
00685 }
00686
00687
Address::List Addressee::addresses(
int type )
const
00688
{
00689
Address::List list;
00690
00691 Address::List::ConstIterator it;
00692
for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
00693
if ( matchBinaryPattern( (*it).type(), type ) ) {
00694 list.append( *it );
00695 }
00696 }
00697
00698
return list;
00699 }
00700
00701
Address Addressee::findAddress(
const QString &
id )
const
00702
{
00703 Address::List::ConstIterator it;
00704
for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
00705
if ( (*it).id() ==
id ) {
00706
return *it;
00707 }
00708 }
00709
return Address();
00710 }
00711
00712
void Addressee::insertCategory(
const QString &c )
00713 {
00714 detach();
00715 mData->empty =
false;
00716
00717
if ( mData->categories.findIndex( c ) != -1 )
return;
00718
00719 mData->categories.append( c );
00720 }
00721
00722
void Addressee::removeCategory(
const QString &c )
00723 {
00724 detach();
00725
00726 QStringList::Iterator it = mData->categories.find( c );
00727
if ( it == mData->categories.end() )
return;
00728
00729 mData->categories.remove( it );
00730 }
00731
00732
bool Addressee::hasCategory(
const QString &c )
const
00733
{
00734
return ( mData->categories.findIndex( c ) != -1 );
00735 }
00736
00737
void Addressee::setCategories(
const QStringList &c )
00738 {
00739 detach();
00740 mData->empty =
false;
00741
00742 mData->categories = c;
00743 }
00744
00745
QStringList Addressee::categories()
const
00746
{
00747
return mData->categories;
00748 }
00749
00750
void Addressee::insertCustom(
const QString &app,
const QString &name,
00751
const QString &value )
00752 {
00753
if ( value.isEmpty() ||
name.isEmpty() || app.isEmpty() )
return;
00754
00755 detach();
00756 mData->empty =
false;
00757
00758
QString qualifiedName = app +
"-" +
name +
":";
00759
00760 QStringList::Iterator it;
00761
for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
00762
if ( (*it).startsWith( qualifiedName ) ) {
00763 (*it) = qualifiedName + value;
00764
return;
00765 }
00766 }
00767
00768 mData->custom.append( qualifiedName + value );
00769 }
00770
00771
void Addressee::removeCustom(
const QString &app,
const QString &name)
00772 {
00773 detach();
00774
00775
QString qualifiedName = app +
"-" +
name +
":";
00776
00777 QStringList::Iterator it;
00778
for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
00779
if ( (*it).startsWith( qualifiedName ) ) {
00780 mData->custom.remove( it );
00781
return;
00782 }
00783 }
00784 }
00785
00786
QString Addressee::custom(
const QString &app,
const QString &name )
const
00787
{
00788
QString qualifiedName = app +
"-" +
name +
":";
00789
QString value;
00790
00791 QStringList::ConstIterator it;
00792
for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
00793
if ( (*it).startsWith( qualifiedName ) ) {
00794 value = (*it).mid( (*it).find(
":" ) + 1 );
00795
break;
00796 }
00797 }
00798
00799
return value;
00800 }
00801
00802
void Addressee::setCustoms(
const QStringList &l )
00803 {
00804 detach();
00805 mData->empty =
false;
00806
00807 mData->custom = l;
00808 }
00809
00810
QStringList Addressee::customs()
const
00811
{
00812
return mData->custom;
00813 }
00814
00815
void Addressee::parseEmailAddress(
const QString &rawEmail,
QString &fullName,
00816
QString &email)
00817 {
00818
int startPos, endPos, len;
00819
QString partA, partB, result;
00820
char endCh =
'>';
00821
00822 startPos = rawEmail.find(
'<' );
00823
if ( startPos < 0 ) {
00824 startPos = rawEmail.find(
'(' );
00825 endCh =
')';
00826 }
00827
00828
if ( startPos < 0 ) {
00829
00830
00831 email = rawEmail;
00832 fullName =
"";
00833 }
else {
00834
00835 endPos = rawEmail.find( endCh, startPos + 1 );
00836
00837
if ( endPos < 0 ) {
00838
00839
00840 email = rawEmail;
00841 fullName =
"";
00842 }
else {
00843
00844
00845
00846
QString left = rawEmail.left( startPos ).stripWhiteSpace();
00847
00848
QString right = rawEmail.mid( startPos + 1, endPos - startPos - 1 )
00849 .stripWhiteSpace();
00850
00851
00852
if ( endCh ==
'>' ) {
00853 fullName = left;
00854 email = right;
00855 }
else {
00856 fullName = right;
00857 email = left;
00858 }
00859
00860
00861
00862 len = fullName.length();
00863
if ( fullName[ 0 ] ==
'"' && fullName[ len - 1 ] ==
'"' )
00864 fullName = fullName.mid( 1, len - 2 );
00865
else if ( fullName[ 0 ] ==
'(' && fullName[ len - 1 ] ==
')' )
00866 fullName = fullName.mid( 1, len - 2 );
00867
00868 len = email.length();
00869
if ( email[ 0 ] ==
'<' && email[ len - 1 ] ==
'>' )
00870 email = email.mid( 1, len - 2 );
00871 }
00872 }
00873 }
00874
00875
void Addressee::setResource( Resource *resource )
00876 {
00877 detach();
00878 mData->resource = resource;
00879 }
00880
00881 Resource *
Addressee::resource()
const
00882
{
00883
return mData->resource;
00884 }
00885
00886
void Addressee::setChanged(
bool value )
00887 {
00888 detach();
00889 mData->changed = value;
00890 }
00891
00892
bool Addressee::changed()
const
00893
{
00894
return mData->changed;
00895 }
00896
00897
void Addressee::setSortKey( KABC::Field *field )
00898 {
00899 mSortField = field;
00900 }
00901
00902
bool Addressee::operator< (
const Addressee &addr )
00903 {
00904
if ( !mSortField )
00905
return false;
00906
else
00907
return ( QString::localeAwareCompare( mSortField->value( *this ).lower(),
00908 mSortField->value( addr ).lower() ) < 0 );
00909 }
00910
00911
QDataStream &KABC::operator<<(
QDataStream &s,
const Addressee &a )
00912 {
00913
if (!a.
mData)
return s;
00914
00915 s << a.
uid();
00916
00917 --STREAMOUT--
00918 s << a.
mData->phoneNumbers;
00919 s << a.
mData->addresses;
00920 s << a.
mData->emails;
00921 s << a.
mData->categories;
00922 s << a.
mData->custom;
00923 s << a.
mData->keys;
00924
return s;
00925 }
00926
00927
QDataStream &KABC::operator>>(
QDataStream &s,
Addressee &a )
00928 {
00929
if (!a.
mData)
return s;
00930
00931 s >> a.
mData->uid;
00932
00933 --STREAMIN--
00934 s >> a.
mData->phoneNumbers;
00935 s >> a.
mData->addresses;
00936 s >> a.
mData->emails;
00937 s >> a.
mData->categories;
00938 s >> a.
mData->custom;
00939 s >> a.
mData->keys;
00940
00941 a.
mData->empty =
false;
00942
00943
return s;
00944 }
00945
00946
bool matchBinaryPattern(
int value,
int pattern )
00947 {
00954
if ( pattern == 0 )
00955
return ( value == 0 );
00956
else
00957
return ( pattern == ( pattern & value ) );
00958 }
00959
00960
template <
class L>
00961
bool listEquals(
const QValueList<L> &list,
const QValueList<L> &pattern )
00962 {
00963
if ( list.count() != pattern.count() )
00964
return false;
00965
00966
for ( uint i = 0; i < list.count(); ++i )
00967
if ( pattern.find( list[ i ] ) == pattern.end() )
00968
return false;
00969
00970
return true;
00971 }