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