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