00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
#include <qregexp.h>
00024
00025
#include <ksharedptr.h>
00026
#include <kdebug.h>
00027
#include <kapplication.h>
00028
#include <klocale.h>
00029
00030
#include "addresseehelper.h"
00031
#include "field.h"
00032
#include "resource.h"
00033
00034
#include "addressee.h"
00035
00036
using namespace KABC;
00037
00038
static bool matchBinaryPattern(
int value,
int pattern );
00039
00040
template <
class L>
00041
static bool listEquals(
const QValueList<L>&,
const QValueList<L>& );
00042
00043 KABC::Field *Addressee::mSortField = 0;
00044
00045
struct Addressee::AddresseeData :
public KShared
00046 {
00047
QString uid;
00048
QString name;
00049
QString formattedName;
00050
QString familyName;
00051
QString givenName;
00052
QString additionalName;
00053
QString prefix;
00054
QString suffix;
00055
QString nickName;
00056
QDateTime birthday;
00057
QString mailer;
00058
TimeZone timeZone;
00059
Geo geo;
00060
QString title;
00061
QString role;
00062
QString organization;
00063
QString note;
00064
QString productId;
00065
QDateTime revision;
00066
QString sortString;
00067
KURL url;
00068 Secrecy secrecy;
00069 Picture logo;
00070 Picture photo;
00071 Sound sound;
00072
Agent agent;
00073
00074 PhoneNumber::List phoneNumbers;
00075
Address::List addresses;
00076 Key::List keys;
00077
QStringList emails;
00078
QStringList categories;
00079
QStringList custom;
00080
00081 Resource *resource;
00082
00083
bool empty :1;
00084
bool changed :1;
00085 };
00086
00087 Addressee::AddresseeData* Addressee::shared_null = 0;
00088
00089 Addressee::AddresseeData* Addressee::makeSharedNull()
00090 {
00091 Addressee::shared_null =
new AddresseeData;
00092 shared_null->_KShared_ref();
00093 shared_null->empty =
true;
00094 shared_null->changed =
false;
00095 shared_null->resource = 0;
00096
return shared_null;
00097 }
00098
00099
Addressee::Addressee()
00100 {
00101 mData = shared_null ? shared_null : makeSharedNull();
00102 }
00103
00104 Addressee::~Addressee()
00105 {
00106 }
00107
00108
Addressee::Addressee(
const Addressee &a )
00109 {
00110 mData = a.
mData;
00111 }
00112
00113
Addressee &Addressee::operator=(
const Addressee &a )
00114 {
00115 mData = a.
mData;
00116
return (*this);
00117 }
00118
00119
void Addressee::detach()
00120 {
00121
if ( mData.
data() == shared_null ) {
00122 mData =
new AddresseeData;
00123 mData->empty =
true;
00124 mData->changed =
false;
00125 mData->resource = 0;
00126 mData->uid =
KApplication::randomString( 10 );
00127
return;
00128 }
else if ( mData.
count() == 1 )
return;
00129
00130 AddresseeData data = *mData;
00131 mData =
new AddresseeData( data );
00132 }
00133
00134
bool Addressee::operator==(
const Addressee &a )
const
00135
{
00136
if (
uid() != a.
uid() ) {
00137
kdDebug(5700) <<
"uid differs" <<
endl;
00138
return false;
00139 }
00140
if ( mData->name != a.
mData->name &&
00141 !( mData->name.isEmpty() && a.
mData->name.isEmpty() ) ) {
00142
kdDebug(5700) <<
"name differs" <<
endl;
00143
return false;
00144 }
00145
if ( mData->formattedName != a.
mData->formattedName &&
00146 !( mData->formattedName.isEmpty() && a.
mData->formattedName.isEmpty() ) ) {
00147
kdDebug(5700) <<
"formattedName differs" <<
endl;
00148
return false;
00149 }
00150
if ( mData->familyName != a.
mData->familyName &&
00151 !( mData->familyName.isEmpty() && a.
mData->familyName.isEmpty() ) ) {
00152
kdDebug(5700) <<
"familyName differs" <<
endl;
00153
return false;
00154 }
00155
if ( mData->givenName != a.
mData->givenName &&
00156 !( mData->givenName.isEmpty() && a.
mData->givenName.isEmpty() ) ) {
00157
kdDebug(5700) <<
"givenName differs" <<
endl;
00158
return false;
00159 }
00160
if ( mData->additionalName != a.
mData->additionalName &&
00161 !( mData->additionalName.isEmpty() && a.
mData->additionalName.isEmpty() ) ) {
00162
kdDebug(5700) <<
"additionalName differs" <<
endl;
00163
return false;
00164 }
00165
if ( mData->prefix != a.
mData->prefix &&
00166 !( mData->prefix.isEmpty() && a.
mData->prefix.isEmpty() ) ) {
00167
kdDebug(5700) <<
"prefix differs" <<
endl;
00168
return false;
00169 }
00170
if ( mData->suffix != a.
mData->suffix &&
00171 !( mData->suffix.isEmpty() && a.
mData->suffix.isEmpty() ) ) {
00172
kdDebug(5700) <<
"suffix differs" <<
endl;
00173
return false;
00174 }
00175
if ( mData->nickName != a.
mData->nickName &&
00176 !( mData->nickName.isEmpty() && a.
mData->nickName.isEmpty() ) ) {
00177
kdDebug(5700) <<
"nickName differs" <<
endl;
00178
return false;
00179 }
00180
if ( mData->birthday != a.
mData->birthday ) {
00181
kdDebug(5700) <<
"birthday differs" <<
endl;
00182
return false;
00183 }
00184
if ( mData->mailer != a.
mData->mailer &&
00185 !( mData->mailer.isEmpty() && a.
mData->mailer.isEmpty() ) ) {
00186
kdDebug(5700) <<
"mailer differs" <<
endl;
00187
return false;
00188 }
00189
if ( mData->timeZone != a.
mData->timeZone ) {
00190
kdDebug(5700) <<
"timeZone differs" <<
endl;
00191
return false;
00192 }
00193
if ( mData->geo != a.
mData->geo ) {
00194
kdDebug(5700) <<
"geo differs" <<
endl;
00195
return false;
00196 }
00197
if ( mData->title != a.
mData->title &&
00198 !( mData->title.isEmpty() && a.
mData->title.isEmpty() ) ) {
00199
kdDebug(5700) <<
"title differs" <<
endl;
00200
return false;
00201 }
00202
if ( mData->role != a.
mData->role &&
00203 !( mData->role.isEmpty() && a.
mData->role.isEmpty() ) ) {
00204
kdDebug(5700) <<
"role differs" <<
endl;
00205
return false;
00206 }
00207
if ( mData->organization != a.
mData->organization &&
00208 !( mData->organization.isEmpty() && a.
mData->organization.isEmpty() ) ) {
00209
kdDebug(5700) <<
"organization differs" <<
endl;
00210
return false;
00211 }
00212
if ( mData->note != a.
mData->note &&
00213 !( mData->note.isEmpty() && a.
mData->note.isEmpty() ) ) {
00214
kdDebug(5700) <<
"note differs" <<
endl;
00215
return false;
00216 }
00217
if ( mData->productId != a.
mData->productId &&
00218 !( mData->productId.isEmpty() && a.
mData->productId.isEmpty() ) ) {
00219
kdDebug(5700) <<
"productId differs" <<
endl;
00220
return false;
00221 }
00222
if ( mData->sortString != a.
mData->sortString &&
00223 !( mData->sortString.isEmpty() && a.
mData->sortString.isEmpty() ) ) {
00224
kdDebug(5700) <<
"sortString differs" <<
endl;
00225
return false;
00226 }
00227
if ( mData->secrecy != a.
mData->secrecy ) {
00228
kdDebug(5700) <<
"secrecy differs" <<
endl;
00229
return false;
00230 }
00231
if ( mData->logo != a.
mData->logo ) {
00232
kdDebug(5700) <<
"logo differs" <<
endl;
00233
return false;
00234 }
00235
if ( mData->photo != a.
mData->photo ) {
00236
kdDebug(5700) <<
"photo differs" <<
endl;
00237
return false;
00238 }
00239
if ( mData->sound != a.
mData->sound ) {
00240
kdDebug(5700) <<
"sound differs" <<
endl;
00241
return false;
00242 }
00243
if ( mData->agent != a.
mData->agent ) {
00244
kdDebug(5700) <<
"agent differs" <<
endl;
00245
return false;
00246 }
00247
if ( ( mData->url.isValid() || a.
mData->url.isValid() ) &&
00248 ( mData->url != a.
mData->url ) ) {
00249
kdDebug(5700) <<
"url differs" <<
endl;
00250
return false;
00251 }
00252
if ( !listEquals( mData->phoneNumbers, a.
mData->phoneNumbers ) ) {
00253
kdDebug(5700) <<
"phoneNumbers differs" <<
endl;
00254
return false;
00255 }
00256
if ( !listEquals( mData->addresses, a.
mData->addresses ) ) {
00257
kdDebug(5700) <<
"addresses differs" <<
endl;
00258
return false;
00259 }
00260
if ( !listEquals( mData->keys, a.
mData->keys ) ) {
00261
kdDebug(5700) <<
"keys differs" <<
endl;
00262
return false;
00263 }
00264
if ( !listEquals( mData->emails, a.
mData->emails ) ) {
00265
kdDebug(5700) <<
"emails differs" <<
endl;
00266
return false;
00267 }
00268
if ( !listEquals( mData->categories, a.
mData->categories ) ) {
00269
kdDebug(5700) <<
"categories differs" <<
endl;
00270
return false;
00271 }
00272
if ( !listEquals( mData->custom, a.
mData->custom ) ) {
00273
kdDebug(5700) <<
"custom differs" <<
endl;
00274
return false;
00275 }
00276
00277
return true;
00278 }
00279
00280
bool Addressee::operator!=(
const Addressee &a )
const
00281
{
00282
return !( a == *
this );
00283 }
00284
00285
bool Addressee::isEmpty()
const
00286
{
00287
return mData->empty;
00288 }
00289
00290
void Addressee::setUid(
const QString &
id )
00291 {
00292
if (
id == mData->uid )
return;
00293 detach();
00294 mData->empty =
false;
00295 mData->uid =
id;
00296 }
00297
00298
QString Addressee::uid()
const
00299
{
00300
return mData->uid;
00301 }
00302
00303
QString Addressee::uidLabel()
00304 {
00305
return i18n(
"Unique Identifier");
00306 }
00307
00308
void Addressee::setName(
const QString &name )
00309 {
00310
if (
name == mData->name )
return;
00311 detach();
00312 mData->empty =
false;
00313 mData->name =
name;
00314 }
00315
00316
QString Addressee::name()
const
00317
{
00318
return mData->name;
00319 }
00320
00321
QString Addressee::nameLabel()
00322 {
00323
return i18n(
"Name");
00324 }
00325
00326
00327
void Addressee::setFormattedName(
const QString &formattedName )
00328 {
00329
if ( formattedName == mData->formattedName )
return;
00330 detach();
00331 mData->empty =
false;
00332 mData->formattedName = formattedName;
00333 }
00334
00335
QString Addressee::formattedName()
const
00336
{
00337
return mData->formattedName;
00338 }
00339
00340
QString Addressee::formattedNameLabel()
00341 {
00342
return i18n(
"Formatted Name");
00343 }
00344
00345
00346
void Addressee::setFamilyName(
const QString &familyName )
00347 {
00348
if ( familyName == mData->familyName )
return;
00349 detach();
00350 mData->empty =
false;
00351 mData->familyName = familyName;
00352 }
00353
00354
QString Addressee::familyName()
const
00355
{
00356
return mData->familyName;
00357 }
00358
00359
QString Addressee::familyNameLabel()
00360 {
00361
return i18n(
"Family Name");
00362 }
00363
00364
00365
void Addressee::setGivenName(
const QString &givenName )
00366 {
00367
if ( givenName == mData->givenName )
return;
00368 detach();
00369 mData->empty =
false;
00370 mData->givenName = givenName;
00371 }
00372
00373
QString Addressee::givenName()
const
00374
{
00375
return mData->givenName;
00376 }
00377
00378
QString Addressee::givenNameLabel()
00379 {
00380
return i18n(
"Given Name");
00381 }
00382
00383
00384
void Addressee::setAdditionalName(
const QString &additionalName )
00385 {
00386
if ( additionalName == mData->additionalName )
return;
00387 detach();
00388 mData->empty =
false;
00389 mData->additionalName = additionalName;
00390 }
00391
00392
QString Addressee::additionalName()
const
00393
{
00394
return mData->additionalName;
00395 }
00396
00397
QString Addressee::additionalNameLabel()
00398 {
00399
return i18n(
"Additional Names");
00400 }
00401
00402
00403
void Addressee::setPrefix(
const QString &prefix )
00404 {
00405
if ( prefix == mData->prefix )
return;
00406 detach();
00407 mData->empty =
false;
00408 mData->prefix = prefix;
00409 }
00410
00411
QString Addressee::prefix()
const
00412
{
00413
return mData->prefix;
00414 }
00415
00416
QString Addressee::prefixLabel()
00417 {
00418
return i18n(
"Honorific Prefixes");
00419 }
00420
00421
00422
void Addressee::setSuffix(
const QString &suffix )
00423 {
00424
if ( suffix == mData->suffix )
return;
00425 detach();
00426 mData->empty =
false;
00427 mData->suffix = suffix;
00428 }
00429
00430
QString Addressee::suffix()
const
00431
{
00432
return mData->suffix;
00433 }
00434
00435
QString Addressee::suffixLabel()
00436 {
00437
return i18n(
"Honorific Suffixes");
00438 }
00439
00440
00441
void Addressee::setNickName(
const QString &nickName )
00442 {
00443
if ( nickName == mData->nickName )
return;
00444 detach();
00445 mData->empty =
false;
00446 mData->nickName = nickName;
00447 }
00448
00449
QString Addressee::nickName()
const
00450
{
00451
return mData->nickName;
00452 }
00453
00454
QString Addressee::nickNameLabel()
00455 {
00456
return i18n(
"Nick Name");
00457 }
00458
00459
00460
void Addressee::setBirthday(
const QDateTime &birthday )
00461 {
00462
if ( birthday == mData->birthday )
return;
00463 detach();
00464 mData->empty =
false;
00465 mData->birthday = birthday;
00466 }
00467
00468
QDateTime Addressee::birthday()
const
00469
{
00470
return mData->birthday;
00471 }
00472
00473
QString Addressee::birthdayLabel()
00474 {
00475
return i18n(
"Birthday");
00476 }
00477
00478
00479
QString Addressee::homeAddressStreetLabel()
00480 {
00481
return i18n(
"Home Address Street");
00482 }
00483
00484
00485
QString Addressee::homeAddressLocalityLabel()
00486 {
00487
return i18n(
"Home Address City");
00488 }
00489
00490
00491
QString Addressee::homeAddressRegionLabel()
00492 {
00493
return i18n(
"Home Address State");
00494 }
00495
00496
00497
QString Addressee::homeAddressPostalCodeLabel()
00498 {
00499
return i18n(
"Home Address Zip Code");
00500 }
00501
00502
00503
QString Addressee::homeAddressCountryLabel()
00504 {
00505
return i18n(
"Home Address Country");
00506 }
00507
00508
00509
QString Addressee::homeAddressLabelLabel()
00510 {
00511
return i18n(
"Home Address Label");
00512 }
00513
00514
00515
QString Addressee::businessAddressStreetLabel()
00516 {
00517
return i18n(
"Business Address Street");
00518 }
00519
00520
00521
QString Addressee::businessAddressLocalityLabel()
00522 {
00523
return i18n(
"Business Address City");
00524 }
00525
00526
00527
QString Addressee::businessAddressRegionLabel()
00528 {
00529
return i18n(
"Business Address State");
00530 }
00531
00532
00533
QString Addressee::businessAddressPostalCodeLabel()
00534 {
00535
return i18n(
"Business Address Zip Code");
00536 }
00537
00538
00539
QString Addressee::businessAddressCountryLabel()
00540 {
00541
return i18n(
"Business Address Country");
00542 }
00543
00544
00545
QString Addressee::businessAddressLabelLabel()
00546 {
00547
return i18n(
"Business Address Label");
00548 }
00549
00550
00551
QString Addressee::homePhoneLabel()
00552 {
00553
return i18n(
"Home Phone");
00554 }
00555
00556
00557
QString Addressee::businessPhoneLabel()
00558 {
00559
return i18n(
"Business Phone");
00560 }
00561
00562
00563
QString Addressee::mobilePhoneLabel()
00564 {
00565
return i18n(
"Mobile Phone");
00566 }
00567
00568
00569
QString Addressee::homeFaxLabel()
00570 {
00571
return i18n(
"Home Fax");
00572 }
00573
00574
00575
QString Addressee::businessFaxLabel()
00576 {
00577
return i18n(
"Business Fax");
00578 }
00579
00580
00581
QString Addressee::carPhoneLabel()
00582 {
00583
return i18n(
"Car Phone");
00584 }
00585
00586
00587
QString Addressee::isdnLabel()
00588 {
00589
return i18n(
"ISDN");
00590 }
00591
00592
00593
QString Addressee::pagerLabel()
00594 {
00595
return i18n(
"Pager");
00596 }
00597
00598
00599
QString Addressee::emailLabel()
00600 {
00601
return i18n(
"Email Address");
00602 }
00603
00604
00605
void Addressee::setMailer(
const QString &mailer )
00606 {
00607
if ( mailer == mData->mailer )
return;
00608 detach();
00609 mData->empty =
false;
00610 mData->mailer = mailer;
00611 }
00612
00613
QString Addressee::mailer()
const
00614
{
00615
return mData->mailer;
00616 }
00617
00618
QString Addressee::mailerLabel()
00619 {
00620
return i18n(
"Mail Client");
00621 }
00622
00623
00624
void Addressee::setTimeZone(
const TimeZone &timeZone )
00625 {
00626
if ( timeZone == mData->timeZone )
return;
00627 detach();
00628 mData->empty =
false;
00629 mData->timeZone = timeZone;
00630 }
00631
00632
TimeZone Addressee::timeZone()
const
00633
{
00634
return mData->timeZone;
00635 }
00636
00637
QString Addressee::timeZoneLabel()
00638 {
00639
return i18n(
"Time Zone");
00640 }
00641
00642
00643
void Addressee::setGeo(
const Geo &geo )
00644 {
00645
if ( geo == mData->geo )
return;
00646 detach();
00647 mData->empty =
false;
00648 mData->geo = geo;
00649 }
00650
00651
Geo Addressee::geo()
const
00652
{
00653
return mData->geo;
00654 }
00655
00656
QString Addressee::geoLabel()
00657 {
00658
return i18n(
"Geographic Position");
00659 }
00660
00661
00662
void Addressee::setTitle(
const QString &title )
00663 {
00664
if ( title == mData->title )
return;
00665 detach();
00666 mData->empty =
false;
00667 mData->title = title;
00668 }
00669
00670
QString Addressee::title()
const
00671
{
00672
return mData->title;
00673 }
00674
00675
QString Addressee::titleLabel()
00676 {
00677
return i18n(
"Title");
00678 }
00679
00680
00681
void Addressee::setRole(
const QString &role )
00682 {
00683
if ( role == mData->role )
return;
00684 detach();
00685 mData->empty =
false;
00686 mData->role = role;
00687 }
00688
00689
QString Addressee::role()
const
00690
{
00691
return mData->role;
00692 }
00693
00694
QString Addressee::roleLabel()
00695 {
00696
return i18n(
"Role");
00697 }
00698
00699
00700
void Addressee::setOrganization(
const QString &organization )
00701 {
00702
if ( organization == mData->organization )
return;
00703 detach();
00704 mData->empty =
false;
00705 mData->organization = organization;
00706 }
00707
00708
QString Addressee::organization()
const
00709
{
00710
return mData->organization;
00711 }
00712
00713
QString Addressee::organizationLabel()
00714 {
00715
return i18n(
"Organization");
00716 }
00717
00718
00719
void Addressee::setNote(
const QString ¬e )
00720 {
00721
if ( note == mData->note )
return;
00722 detach();
00723 mData->empty =
false;
00724 mData->note = note;
00725 }
00726
00727
QString Addressee::note()
const
00728
{
00729
return mData->note;
00730 }
00731
00732
QString Addressee::noteLabel()
00733 {
00734
return i18n(
"Note");
00735 }
00736
00737
00738
void Addressee::setProductId(
const QString &productId )
00739 {
00740
if ( productId == mData->productId )
return;
00741 detach();
00742 mData->empty =
false;
00743 mData->productId = productId;
00744 }
00745
00746
QString Addressee::productId()
const
00747
{
00748
return mData->productId;
00749 }
00750
00751
QString Addressee::productIdLabel()
00752 {
00753
return i18n(
"Product Identifier");
00754 }
00755
00756
00757
void Addressee::setRevision(
const QDateTime &revision )
00758 {
00759
if ( revision == mData->revision )
return;
00760 detach();
00761 mData->empty =
false;
00762 mData->revision = revision;
00763 }
00764
00765
QDateTime Addressee::revision()
const
00766
{
00767
return mData->revision;
00768 }
00769
00770
QString Addressee::revisionLabel()
00771 {
00772
return i18n(
"Revision Date");
00773 }
00774
00775
00776
void Addressee::setSortString(
const QString &sortString )
00777 {
00778
if ( sortString == mData->sortString )
return;
00779 detach();
00780 mData->empty =
false;
00781 mData->sortString = sortString;
00782 }
00783
00784
QString Addressee::sortString()
const
00785
{
00786
return mData->sortString;
00787 }
00788
00789
QString Addressee::sortStringLabel()
00790 {
00791
return i18n(
"Sort String");
00792 }
00793
00794
00795
void Addressee::setUrl(
const KURL &url )
00796 {
00797
if ( url == mData->url )
return;
00798 detach();
00799 mData->empty =
false;
00800 mData->url = url;
00801 }
00802
00803
KURL Addressee::url()
const
00804
{
00805
return mData->url;
00806 }
00807
00808
QString Addressee::urlLabel()
00809 {
00810
return i18n(
"Homepage");
00811 }
00812
00813
00814
void Addressee::setSecrecy(
const Secrecy &secrecy )
00815 {
00816
if ( secrecy == mData->secrecy )
return;
00817 detach();
00818 mData->empty =
false;
00819 mData->secrecy = secrecy;
00820 }
00821
00822 Secrecy
Addressee::secrecy()
const
00823
{
00824
return mData->secrecy;
00825 }
00826
00827
QString Addressee::secrecyLabel()
00828 {
00829
return i18n(
"Security Class");
00830 }
00831
00832
00833
void Addressee::setLogo(
const Picture &logo )
00834 {
00835
if ( logo == mData->logo )
return;
00836 detach();
00837 mData->empty =
false;
00838 mData->logo = logo;
00839 }
00840
00841 Picture
Addressee::logo()
const
00842
{
00843
return mData->logo;
00844 }
00845
00846
QString Addressee::logoLabel()
00847 {
00848
return i18n(
"Logo");
00849 }
00850
00851
00852
void Addressee::setPhoto(
const Picture &photo )
00853 {
00854
if ( photo == mData->photo )
return;
00855 detach();
00856 mData->empty =
false;
00857 mData->photo = photo;
00858 }
00859
00860 Picture
Addressee::photo()
const
00861
{
00862
return mData->photo;
00863 }
00864
00865
QString Addressee::photoLabel()
00866 {
00867
return i18n(
"Photo");
00868 }
00869
00870
00871
void Addressee::setSound(
const Sound &sound )
00872 {
00873
if ( sound == mData->sound )
return;
00874 detach();
00875 mData->empty =
false;
00876 mData->sound = sound;
00877 }
00878
00879 Sound
Addressee::sound()
const
00880
{
00881
return mData->sound;
00882 }
00883
00884
QString Addressee::soundLabel()
00885 {
00886
return i18n(
"Sound");
00887 }
00888
00889
00890
void Addressee::setAgent(
const Agent &agent )
00891 {
00892
if ( agent == mData->agent )
return;
00893 detach();
00894 mData->empty =
false;
00895 mData->agent = agent;
00896 }
00897
00898
Agent Addressee::agent()
const
00899
{
00900
return mData->agent;
00901 }
00902
00903
QString Addressee::agentLabel()
00904 {
00905
return i18n(
"Agent");
00906 }
00907
00908
00909
00910
void Addressee::setNameFromString(
const QString &str )
00911 {
00912
setFormattedName( str );
00913
setName( str );
00914
00915
00916
setPrefix( QString::null );
00917
setGivenName( QString::null );
00918
setAdditionalName( QString::null );
00919
setFamilyName( QString::null );
00920
setSuffix( QString::null );
00921
00922
if ( str.isEmpty() )
00923
return;
00924
00925
QString spaceStr =
" ";
00926
QString emptyStr =
"";
00927 AddresseeHelper *helper = AddresseeHelper::self();
00928
00929
int i = str.find(
',' );
00930
if( i < 0 ) {
00931
QStringList parts = QStringList::split( spaceStr, str );
00932
int leftOffset = 0;
00933
int rightOffset = parts.count() - 1;
00934
00935
QString suffix;
00936
while ( rightOffset >= 0 ) {
00937
if ( helper->containsSuffix( parts[ rightOffset ] ) ) {
00938 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? emptyStr : spaceStr));
00939 rightOffset--;
00940 }
else
00941
break;
00942 }
00943
setSuffix( suffix );
00944
00945
if ( rightOffset < 0 )
00946
return;
00947
00948
if ( rightOffset - 1 >= 0 && helper->containsPrefix( parts[ rightOffset - 1 ].lower() ) ) {
00949
setFamilyName( parts[ rightOffset - 1 ] + spaceStr + parts[ rightOffset ] );
00950 rightOffset--;
00951 }
else {
00952
if ( helper->tradeAsFamilyName() )
00953
setFamilyName( parts[ rightOffset ] );
00954
else
00955
setGivenName( parts[ rightOffset ] );
00956 }
00957
00958
QString prefix;
00959
while ( leftOffset < rightOffset ) {
00960
if ( helper->containsTitle( parts[ leftOffset ] ) ) {
00961 prefix.append( ( prefix.isEmpty() ? emptyStr : spaceStr) + parts[ leftOffset ] );
00962 leftOffset++;
00963 }
else
00964
break;
00965 }
00966
setPrefix( prefix );
00967
00968
if ( leftOffset < rightOffset ) {
00969
setGivenName( parts[ leftOffset ] );
00970 leftOffset++;
00971 }
00972
00973
QString additionalName;
00974
while ( leftOffset < rightOffset ) {
00975 additionalName.append( ( additionalName.isEmpty() ? emptyStr : spaceStr) + parts[ leftOffset ] );
00976 leftOffset++;
00977 }
00978
setAdditionalName( additionalName );
00979 }
else {
00980
QString part1 = str.left( i );
00981
QString part2 = str.mid( i + 1 );
00982
00983
QStringList parts = QStringList::split( spaceStr, part1 );
00984
int leftOffset = 0;
00985
int rightOffset = parts.count() - 1;
00986
00987
if ( parts.count() > 0 ) {
00988
00989
QString suffix;
00990
while ( rightOffset >= 0 ) {
00991
if ( helper->containsSuffix( parts[ rightOffset ] ) ) {
00992 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? emptyStr : spaceStr));
00993 rightOffset--;
00994 }
else
00995
break;
00996 }
00997
setSuffix( suffix );
00998
00999
if ( rightOffset - 1 >= 0 && helper->containsPrefix( parts[ rightOffset - 1 ].lower() ) ) {
01000
setFamilyName( parts[ rightOffset - 1 ] + spaceStr + parts[ rightOffset ] );
01001 rightOffset--;
01002 }
else
01003
setFamilyName( parts[ rightOffset ] );
01004
01005
QString prefix;
01006
while ( leftOffset < rightOffset ) {
01007
if ( helper->containsTitle( parts[ leftOffset ] ) ) {
01008 prefix.append( ( prefix.isEmpty() ? emptyStr : spaceStr) + parts[ leftOffset ] );
01009 leftOffset++;
01010 }
else
01011
break;
01012 }
01013 }
else {
01014
setPrefix(
"" );
01015
setFamilyName(
"" );
01016
setSuffix(
"" );
01017 }
01018
01019 parts = QStringList::split( spaceStr, part2 );
01020
01021 leftOffset = 0;
01022 rightOffset = parts.count();
01023
01024
if ( parts.count() > 0 ) {
01025
01026
QString prefix;
01027
while ( leftOffset < rightOffset ) {
01028
if ( helper->containsTitle( parts[ leftOffset ] ) ) {
01029 prefix.append( ( prefix.isEmpty() ? emptyStr : spaceStr) + parts[ leftOffset ] );
01030 leftOffset++;
01031 }
else
01032
break;
01033 }
01034
setPrefix( prefix );
01035
01036
if ( leftOffset < rightOffset ) {
01037
setGivenName( parts[ leftOffset ] );
01038 leftOffset++;
01039 }
01040
01041
QString additionalName;
01042
while ( leftOffset < rightOffset ) {
01043 additionalName.append( ( additionalName.isEmpty() ? emptyStr : spaceStr) + parts[ leftOffset ] );
01044 leftOffset++;
01045 }
01046
setAdditionalName( additionalName );
01047 }
else {
01048
setGivenName(
"" );
01049
setAdditionalName(
"" );
01050 }
01051 }
01052 }
01053
01054
QString Addressee::realName()
const
01055
{
01056
QString n(
formattedName() );
01057
if ( !n.isEmpty() )
01058
return n;
01059
01060 n =
assembledName();
01061
if ( !n.isEmpty() )
01062
return n;
01063
01064 n =
name();
01065
if ( !n.isEmpty() )
01066
return n;
01067
01068
return organization();
01069 }
01070
01071
QString Addressee::assembledName()
const
01072
{
01073
QString name =
prefix() +
" " +
givenName() +
" " +
additionalName() +
" " +
01074
familyName() +
" " +
suffix();
01075
01076
return name.simplifyWhiteSpace();
01077 }
01078
01079
QString Addressee::fullEmail(
const QString &email )
const
01080
{
01081
QString e;
01082
if ( email.isNull() ) {
01083 e =
preferredEmail();
01084 }
else {
01085 e = email;
01086 }
01087
if ( e.isEmpty() )
return QString::null;
01088
01089
QString text;
01090
if (
realName().isEmpty() )
01091 text = e;
01092
else {
01093
QRegExp needQuotes(
"[^ 0-9A-Za-z\\x0080-\\xFFFF]" );
01094
if (
realName().find( needQuotes ) != -1 )
01095 text =
"\"" +
realName() +
"\" <" + e +
">";
01096
else
01097 text =
realName() +
" <" + e +
">";
01098 }
01099
01100
return text;
01101 }
01102
01103
void Addressee::insertEmail(
const QString &email,
bool preferred )
01104 {
01105
if ( email.simplifyWhiteSpace().isEmpty() )
01106
return;
01107
01108 detach();
01109
01110 QStringList::Iterator it = mData->emails.find( email );
01111
01112
if ( it != mData->emails.end() ) {
01113
if ( !preferred || it == mData->emails.begin() )
return;
01114 mData->emails.remove( it );
01115 mData->emails.prepend( email );
01116 }
else {
01117
if ( preferred ) {
01118 mData->emails.prepend( email );
01119 }
else {
01120 mData->emails.append( email );
01121 }
01122 }
01123 }
01124
01125
void Addressee::removeEmail(
const QString &email )
01126 {
01127 detach();
01128
01129 QStringList::Iterator it = mData->emails.find( email );
01130
if ( it == mData->emails.end() )
return;
01131
01132 mData->emails.remove( it );
01133 }
01134
01135
QString Addressee::preferredEmail()
const
01136
{
01137
if ( mData->emails.
count() == 0 )
return QString::null;
01138
else return mData->emails.first();
01139 }
01140
01141
QStringList Addressee::emails()
const
01142
{
01143
return mData->emails;
01144 }
01145
void Addressee::setEmails(
const QStringList& emails ) {
01146 detach();
01147
01148 mData->emails = emails;
01149 }
01150
void Addressee::insertPhoneNumber(
const PhoneNumber &phoneNumber )
01151 {
01152 detach();
01153 mData->empty =
false;
01154
01155 PhoneNumber::List::Iterator it;
01156
for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
01157
if ( (*it).id() == phoneNumber.
id() ) {
01158 *it = phoneNumber;
01159
return;
01160 }
01161 }
01162
if ( !phoneNumber.
number().simplifyWhiteSpace().isEmpty() )
01163 mData->phoneNumbers.append( phoneNumber );
01164 }
01165
01166
void Addressee::removePhoneNumber(
const PhoneNumber &phoneNumber )
01167 {
01168 detach();
01169
01170 PhoneNumber::List::Iterator it;
01171
for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
01172
if ( (*it).id() == phoneNumber.
id() ) {
01173 mData->phoneNumbers.remove( it );
01174
return;
01175 }
01176 }
01177 }
01178
01179
PhoneNumber Addressee::phoneNumber(
int type )
const
01180
{
01181
PhoneNumber phoneNumber(
"", type );
01182 PhoneNumber::List::ConstIterator it;
01183
for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
01184
if ( matchBinaryPattern( (*it).type(), type ) ) {
01185
if ( (*it).type() & PhoneNumber::Pref )
01186
return (*it);
01187
else if (
phoneNumber.
number().isEmpty() )
01188
phoneNumber = (*it);
01189 }
01190 }
01191
01192
return phoneNumber;
01193 }
01194
01195 PhoneNumber::List
Addressee::phoneNumbers()
const
01196
{
01197
return mData->phoneNumbers;
01198 }
01199
01200 PhoneNumber::List
Addressee::phoneNumbers(
int type )
const
01201
{
01202 PhoneNumber::List list;
01203
01204 PhoneNumber::List::ConstIterator it;
01205
for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
01206
if ( matchBinaryPattern( (*it).type(), type ) ) {
01207 list.append( *it );
01208 }
01209 }
01210
return list;
01211 }
01212
01213
PhoneNumber Addressee::findPhoneNumber(
const QString &
id )
const
01214
{
01215 PhoneNumber::List::ConstIterator it;
01216
for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
01217
if ( (*it).id() ==
id ) {
01218
return *it;
01219 }
01220 }
01221
return PhoneNumber();
01222 }
01223
01224
void Addressee::insertKey(
const Key &key )
01225 {
01226 detach();
01227 mData->empty =
false;
01228
01229 Key::List::Iterator it;
01230
for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
01231
if ( (*it).id() ==
key.id() ) {
01232 *it =
key;
01233
return;
01234 }
01235 }
01236 mData->keys.append( key );
01237 }
01238
01239
void Addressee::removeKey(
const Key &key )
01240 {
01241 detach();
01242
01243 Key::List::Iterator it;
01244
for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
01245
if ( (*it).id() ==
key.id() ) {
01246 mData->keys.remove( key );
01247
return;
01248 }
01249 }
01250 }
01251
01252
Key Addressee::key(
int type,
QString customTypeString )
const
01253
{
01254 Key::List::ConstIterator it;
01255
for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
01256
if ( (*it).type() == type ) {
01257
if ( type == Key::Custom ) {
01258
if ( customTypeString.isEmpty() ) {
01259
return *it;
01260 }
else {
01261
if ( (*it).customTypeString() == customTypeString )
01262
return (*it);
01263 }
01264 }
else {
01265
return *it;
01266 }
01267 }
01268 }
01269
return Key(
QString(), type );
01270 }
01271
01272
void Addressee::setKeys(
const Key::List& list )
01273 {
01274 detach();
01275 mData->keys = list;
01276 }
01277
01278 Key::List
Addressee::keys()
const
01279
{
01280
return mData->keys;
01281 }
01282
01283 Key::List
Addressee::keys(
int type,
QString customTypeString )
const
01284
{
01285 Key::List list;
01286
01287 Key::List::ConstIterator it;
01288
for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
01289
if ( (*it).type() == type ) {
01290
if ( type == Key::Custom ) {
01291
if ( customTypeString.isEmpty() ) {
01292 list.append( *it );
01293 }
else {
01294
if ( (*it).customTypeString() == customTypeString )
01295 list.append( *it );
01296 }
01297 }
else {
01298 list.append( *it );
01299 }
01300 }
01301 }
01302
return list;
01303 }
01304
01305
Key Addressee::findKey(
const QString &
id )
const
01306
{
01307 Key::List::ConstIterator it;
01308
for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
01309
if ( (*it).id() ==
id ) {
01310
return *it;
01311 }
01312 }
01313
return Key();
01314 }
01315
01316
QString Addressee::asString()
const
01317
{
01318
return "Smith, agent Smith...";
01319 }
01320
01321
void Addressee::dump()
const
01322
{
01323
kdDebug(5700) <<
"Addressee {" <<
endl;
01324
01325
kdDebug(5700) <<
" Uid: '" <<
uid() <<
"'" <<
endl;
01326
01327
kdDebug(5700) <<
" Name: '" <<
name() <<
"'" <<
endl;
01328
kdDebug(5700) <<
" FormattedName: '" <<
formattedName() <<
"'" <<
endl;
01329
kdDebug(5700) <<
" FamilyName: '" <<
familyName() <<
"'" <<
endl;
01330
kdDebug(5700) <<
" GivenName: '" <<
givenName() <<
"'" <<
endl;
01331
kdDebug(5700) <<
" AdditionalName: '" <<
additionalName() <<
"'" <<
endl;
01332
kdDebug(5700) <<
" Prefix: '" <<
prefix() <<
"'" <<
endl;
01333
kdDebug(5700) <<
" Suffix: '" <<
suffix() <<
"'" <<
endl;
01334
kdDebug(5700) <<
" NickName: '" <<
nickName() <<
"'" <<
endl;
01335
kdDebug(5700) <<
" Birthday: '" <<
birthday().toString() <<
"'" <<
endl;
01336
kdDebug(5700) <<
" Mailer: '" <<
mailer() <<
"'" <<
endl;
01337
kdDebug(5700) <<
" TimeZone: '" <<
timeZone().
asString() <<
"'" <<
endl;
01338
kdDebug(5700) <<
" Geo: '" <<
geo().
asString() <<
"'" <<
endl;
01339
kdDebug(5700) <<
" Title: '" <<
title() <<
"'" <<
endl;
01340
kdDebug(5700) <<
" Role: '" <<
role() <<
"'" <<
endl;
01341
kdDebug(5700) <<
" Organization: '" <<
organization() <<
"'" <<
endl;
01342
kdDebug(5700) <<
" Note: '" <<
note() <<
"'" <<
endl;
01343
kdDebug(5700) <<
" ProductId: '" <<
productId() <<
"'" <<
endl;
01344
kdDebug(5700) <<
" Revision: '" <<
revision().toString() <<
"'" <<
endl;
01345
kdDebug(5700) <<
" SortString: '" <<
sortString() <<
"'" <<
endl;
01346
kdDebug(5700) <<
" Url: '" <<
url().
url() <<
"'" <<
endl;
01347
kdDebug(5700) <<
" Secrecy: '" <<
secrecy().asString() <<
"'" <<
endl;
01348
kdDebug(5700) <<
" Logo: '" <<
logo().asString() <<
"'" <<
endl;
01349
kdDebug(5700) <<
" Photo: '" <<
photo().asString() <<
"'" <<
endl;
01350
kdDebug(5700) <<
" Sound: '" <<
sound().asString() <<
"'" <<
endl;
01351
kdDebug(5700) <<
" Agent: '" <<
agent().
asString() <<
"'" <<
endl;
01352
01353
kdDebug(5700) <<
" Emails {" <<
endl;
01354
QStringList e =
emails();
01355 QStringList::ConstIterator it;
01356
for( it = e.begin(); it != e.end(); ++it ) {
01357
kdDebug(5700) <<
" " << (*it) <<
endl;
01358 }
01359
kdDebug(5700) <<
" }" <<
endl;
01360
01361
kdDebug(5700) <<
" PhoneNumbers {" <<
endl;
01362 PhoneNumber::List p =
phoneNumbers();
01363 PhoneNumber::List::ConstIterator it2;
01364
for( it2 = p.begin(); it2 != p.end(); ++it2 ) {
01365
kdDebug(5700) <<
" Type: " << int((*it2).type()) <<
" Number: " << (*it2).number() <<
endl;
01366 }
01367
kdDebug(5700) <<
" }" <<
endl;
01368
01369
Address::List a =
addresses();
01370 Address::List::ConstIterator it3;
01371
for( it3 = a.begin(); it3 != a.end(); ++it3 ) {
01372 (*it3).dump();
01373 }
01374
01375
kdDebug(5700) <<
" Keys {" <<
endl;
01376 Key::List k =
keys();
01377 Key::List::ConstIterator it4;
01378
for( it4 = k.begin(); it4 != k.end(); ++it4 ) {
01379
kdDebug(5700) <<
" Type: " << int((*it4).type()) <<
01380
" Key: " << (*it4).textData() <<
01381
" CustomString: " << (*it4).customTypeString() <<
endl;
01382 }
01383
kdDebug(5700) <<
" }" <<
endl;
01384
01385
kdDebug(5700) <<
"}" <<
endl;
01386 }
01387
01388
01389
void Addressee::insertAddress(
const Address &address )
01390 {
01391
if ( address.
isEmpty() )
01392
return;
01393
01394 detach();
01395 mData->empty =
false;
01396
01397 Address::List::Iterator it;
01398
for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
01399
if ( (*it).id() == address.
id() ) {
01400 *it = address;
01401
return;
01402 }
01403 }
01404
01405 mData->addresses.append( address );
01406 }
01407
01408
void Addressee::removeAddress(
const Address &address )
01409 {
01410 detach();
01411
01412 Address::List::Iterator it;
01413
for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
01414
if ( (*it).id() == address.
id() ) {
01415 mData->addresses.remove( it );
01416
return;
01417 }
01418 }
01419 }
01420
01421
Address Addressee::address(
int type )
const
01422
{
01423
Address address( type );
01424 Address::List::ConstIterator it;
01425
for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
01426
if ( matchBinaryPattern( (*it).type(), type ) ) {
01427
if ( (*it).type() & Address::Pref )
01428
return (*it);
01429
else if (
address.
isEmpty() )
01430
address = (*it);
01431 }
01432 }
01433
01434
return address;
01435 }
01436
01437
Address::List Addressee::addresses()
const
01438
{
01439
return mData->addresses;
01440 }
01441
01442
Address::List Addressee::addresses(
int type )
const
01443
{
01444
Address::List list;
01445
01446 Address::List::ConstIterator it;
01447
for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
01448
if ( matchBinaryPattern( (*it).type(), type ) ) {
01449 list.append( *it );
01450 }
01451 }
01452
01453
return list;
01454 }
01455
01456
Address Addressee::findAddress(
const QString &
id )
const
01457
{
01458 Address::List::ConstIterator it;
01459
for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
01460
if ( (*it).id() ==
id ) {
01461
return *it;
01462 }
01463 }
01464
return Address();
01465 }
01466
01467
void Addressee::insertCategory(
const QString &c )
01468 {
01469 detach();
01470 mData->empty =
false;
01471
01472
if ( mData->categories.findIndex( c ) != -1 )
return;
01473
01474 mData->categories.append( c );
01475 }
01476
01477
void Addressee::removeCategory(
const QString &c )
01478 {
01479 detach();
01480
01481 QStringList::Iterator it = mData->categories.find( c );
01482
if ( it == mData->categories.end() )
return;
01483
01484 mData->categories.remove( it );
01485 }
01486
01487
bool Addressee::hasCategory(
const QString &c )
const
01488
{
01489
return ( mData->categories.findIndex( c ) != -1 );
01490 }
01491
01492
void Addressee::setCategories(
const QStringList &c )
01493 {
01494 detach();
01495 mData->empty =
false;
01496
01497 mData->categories = c;
01498 }
01499
01500
QStringList Addressee::categories()
const
01501
{
01502
return mData->categories;
01503 }
01504
01505
void Addressee::insertCustom(
const QString &app,
const QString &name,
01506
const QString &value )
01507 {
01508
if ( value.isEmpty() ||
name.isEmpty() || app.isEmpty() )
return;
01509
01510 detach();
01511 mData->empty =
false;
01512
01513
QString qualifiedName = app +
"-" +
name +
":";
01514
01515 QStringList::Iterator it;
01516
for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
01517
if ( (*it).startsWith( qualifiedName ) ) {
01518 (*it) = qualifiedName + value;
01519
return;
01520 }
01521 }
01522
01523 mData->custom.append( qualifiedName + value );
01524 }
01525
01526
void Addressee::removeCustom(
const QString &app,
const QString &name)
01527 {
01528 detach();
01529
01530
QString qualifiedName = app +
"-" +
name +
":";
01531
01532 QStringList::Iterator it;
01533
for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
01534
if ( (*it).startsWith( qualifiedName ) ) {
01535 mData->custom.remove( it );
01536
return;
01537 }
01538 }
01539 }
01540
01541
QString Addressee::custom(
const QString &app,
const QString &name )
const
01542
{
01543
QString qualifiedName = app +
"-" +
name +
":";
01544
QString value;
01545
01546 QStringList::ConstIterator it;
01547
for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
01548
if ( (*it).startsWith( qualifiedName ) ) {
01549 value = (*it).mid( (*it).find(
":" ) + 1 );
01550
break;
01551 }
01552 }
01553
01554
return value;
01555 }
01556
01557
void Addressee::setCustoms(
const QStringList &l )
01558 {
01559 detach();
01560 mData->empty =
false;
01561
01562 mData->custom = l;
01563 }
01564
01565
QStringList Addressee::customs()
const
01566
{
01567
return mData->custom;
01568 }
01569
01570
void Addressee::parseEmailAddress(
const QString &rawEmail,
QString &fullName,
01571
QString &email)
01572 {
01573
int startPos, endPos, len;
01574
QString partA, partB, result;
01575
char endCh =
'>';
01576
01577 startPos = rawEmail.find(
'<' );
01578
if ( startPos < 0 ) {
01579 startPos = rawEmail.find(
'(' );
01580 endCh =
')';
01581 }
01582
01583
if ( startPos < 0 ) {
01584
01585
01586 email = rawEmail;
01587 fullName =
"";
01588 }
else {
01589
01590 endPos = rawEmail.find( endCh, startPos + 1 );
01591
01592
if ( endPos < 0 ) {
01593
01594
01595 email = rawEmail;
01596 fullName =
"";
01597 }
else {
01598
01599
01600
01601
QString left = rawEmail.left( startPos ).stripWhiteSpace();
01602
01603
QString right = rawEmail.mid( startPos + 1, endPos - startPos - 1 )
01604 .stripWhiteSpace();
01605
01606
01607
if ( endCh ==
'>' ) {
01608 fullName = left;
01609 email = right;
01610 }
else {
01611 fullName = right;
01612 email = left;
01613 }
01614
01615
01616
01617 len = fullName.length();
01618
if ( fullName[ 0 ] ==
'"' && fullName[ len - 1 ] ==
'"' )
01619 fullName = fullName.mid( 1, len - 2 );
01620
else if ( fullName[ 0 ] ==
'(' && fullName[ len - 1 ] ==
')' )
01621 fullName = fullName.mid( 1, len - 2 );
01622
01623 len = email.length();
01624
if ( email[ 0 ] ==
'<' && email[ len - 1 ] ==
'>' )
01625 email = email.mid( 1, len - 2 );
01626 }
01627 }
01628 }
01629
01630
void Addressee::setResource( Resource *resource )
01631 {
01632 detach();
01633 mData->resource = resource;
01634 }
01635
01636 Resource *
Addressee::resource()
const
01637
{
01638
return mData->resource;
01639 }
01640
01641
void Addressee::setChanged(
bool value )
01642 {
01643 detach();
01644 mData->changed = value;
01645 }
01646
01647
bool Addressee::changed()
const
01648
{
01649
return mData->changed;
01650 }
01651
01652
void Addressee::setSortKey( KABC::Field *field )
01653 {
01654 mSortField = field;
01655 }
01656
01657
bool Addressee::operator< (
const Addressee &addr )
01658 {
01659
if ( !mSortField )
01660
return false;
01661
else
01662
return ( QString::localeAwareCompare( mSortField->value( *this ).lower(),
01663 mSortField->value( addr ).lower() ) < 0 );
01664 }
01665
01666
QDataStream &KABC::operator<<(
QDataStream &s,
const Addressee &a )
01667 {
01668
if (!a.
mData)
return s;
01669
01670 s << a.
uid();
01671
01672 s << a.
mData->name;
01673 s << a.
mData->formattedName;
01674 s << a.
mData->familyName;
01675 s << a.
mData->givenName;
01676 s << a.
mData->additionalName;
01677 s << a.
mData->prefix;
01678 s << a.
mData->suffix;
01679 s << a.
mData->nickName;
01680 s << a.
mData->birthday;
01681 s << a.
mData->mailer;
01682 s << a.
mData->timeZone;
01683 s << a.
mData->geo;
01684 s << a.
mData->title;
01685 s << a.
mData->role;
01686 s << a.
mData->organization;
01687 s << a.
mData->note;
01688 s << a.
mData->productId;
01689 s << a.
mData->revision;
01690 s << a.
mData->sortString;
01691 s << a.
mData->url;
01692 s << a.
mData->secrecy;
01693 s << a.
mData->logo;
01694 s << a.
mData->photo;
01695 s << a.
mData->sound;
01696 s << a.
mData->agent;
01697 s << a.
mData->phoneNumbers;
01698 s << a.
mData->addresses;
01699 s << a.
mData->emails;
01700 s << a.
mData->categories;
01701 s << a.
mData->custom;
01702 s << a.
mData->keys;
01703
return s;
01704 }
01705
01706
QDataStream &KABC::operator>>(
QDataStream &s,
Addressee &a )
01707 {
01708
if (!a.
mData)
return s;
01709
01710 s >> a.
mData->uid;
01711
01712 s >> a.
mData->name;
01713 s >> a.
mData->formattedName;
01714 s >> a.
mData->familyName;
01715 s >> a.
mData->givenName;
01716 s >> a.
mData->additionalName;
01717 s >> a.
mData->prefix;
01718 s >> a.
mData->suffix;
01719 s >> a.
mData->nickName;
01720 s >> a.
mData->birthday;
01721 s >> a.
mData->mailer;
01722 s >> a.
mData->timeZone;
01723 s >> a.
mData->geo;
01724 s >> a.
mData->title;
01725 s >> a.
mData->role;
01726 s >> a.
mData->organization;
01727 s >> a.
mData->note;
01728 s >> a.
mData->productId;
01729 s >> a.
mData->revision;
01730 s >> a.
mData->sortString;
01731 s >> a.
mData->url;
01732 s >> a.
mData->secrecy;
01733 s >> a.
mData->logo;
01734 s >> a.
mData->photo;
01735 s >> a.
mData->sound;
01736 s >> a.
mData->agent;
01737 s >> a.
mData->phoneNumbers;
01738 s >> a.
mData->addresses;
01739 s >> a.
mData->emails;
01740 s >> a.
mData->categories;
01741 s >> a.
mData->custom;
01742 s >> a.
mData->keys;
01743
01744 a.
mData->empty =
false;
01745
01746
return s;
01747 }
01748
01749
bool matchBinaryPattern(
int value,
int pattern )
01750 {
01757
if ( pattern == 0 )
01758
return ( value == 0 );
01759
else
01760
return ( pattern == ( pattern & value ) );
01761 }
01762
01763
template <
class L>
01764
bool listEquals(
const QValueList<L> &list,
const QValueList<L> &pattern )
01765 {
01766
if ( list.count() != pattern.count() )
01767
return false;
01768
01769
for ( uint i = 0; i < list.count(); ++i )
01770
if ( pattern.find( list[ i ] ) == pattern.end() )
01771
return false;
01772
01773
return true;
01774 }