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