kabc Library API Documentation

addressee.cpp

00001 /*** Warning! This file has been generated by the script makeaddressee ***/
00002 /*
00003     This file is part of libkabc.
00004     Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
00005     Copyright (c) 2003 Carsten Pfeiffer <pfeiffer@kde.org>
00006     Copyright (c) 2005 Ingo Kloecker <kloecker@kde.org>
00007 
00008     This library is free software; you can redistribute it and/or
00009     modify it under the terms of the GNU Library General Public
00010     License as published by the Free Software Foundation; either
00011     version 2 of the License, or (at your option) any later version.
00012 
00013     This library is distributed in the hope that it will be useful,
00014     but WITHOUT ANY WARRANTY; without even the implied warranty of
00015     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00016     Library General Public License for more details.
00017 
00018     You should have received a copy of the GNU Library General Public License
00019     along with this library; see the file COPYING.LIB.  If not, write to
00020     the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00021     Boston, MA 02111-1307, USA.
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(); //just in case (we should add KSD)
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 &note )
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   // clear all name parts
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   // This is a simplified version of KPIM::splitAddress().
01577 
01578   fullName = "";
01579   email = "";
01580   if ( rawEmail.isEmpty() )
01581     return; // KPIM::AddressEmpty;
01582 
01583   // The code works on 8-bit strings, so convert the input to UTF-8.
01584   QCString address = rawEmail.utf8();
01585 
01586   QCString displayName;
01587   QCString addrSpec;
01588   QCString comment;
01589 
01590   // The following is a primitive parser for a mailbox-list (cf. RFC 2822).
01591   // The purpose is to extract a displayable string from the mailboxes.
01592   // Comments in the addr-spec are not handled. No error checking is done.
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 '\\' : // quoted character
01620                  displayName += *p;
01621                  ++p; // skip the '\'
01622                  if ( *p )
01623                    displayName += *p;
01624                  else
01625                    //return KPIM::UnexpectedEnd;
01626                    goto ABORT_PARSING;
01627                  break;
01628       case ',' : if ( !inQuotedString ) {
01629                    //if ( allowMultipleAddresses )
01630                    //  stop = true;
01631                    //else
01632                    //  return KPIM::UnexpectedComma;
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 += ' '; // separate the text of several comments
01651                  }
01652                  else
01653                    comment += *p;
01654                  break;
01655       case '\\' : // quoted character
01656                  comment += *p;
01657                  ++p; // skip the '\'
01658                  if ( *p )
01659                    comment += *p;
01660                  else
01661                    //return KPIM::UnexpectedEnd;
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 '\\' : // quoted character
01680                  addrSpec += *p;
01681                  ++p; // skip the '\'
01682                  if ( *p )
01683                    addrSpec += *p;
01684                  else
01685                    //return KPIM::UnexpectedEnd;
01686                    goto ABORT_PARSING;
01687                  break;
01688       default :  addrSpec += *p;
01689       }
01690       break;
01691     }
01692     } // switch ( context )
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   // check for errors
01704   if ( inQuotedString )
01705     return; // KPIM::UnbalancedQuote;
01706   if ( context == InComment )
01707     return; // KPIM::UnbalancedParens;
01708   if ( context == InAngleAddress )
01709     return; // KPIM::UnclosedAngleAddr;
01710 
01711   if ( addrSpec.isEmpty() ) {
01712     if ( displayName.isEmpty() )
01713       return; // KPIM::NoAddressSpec;
01714     else {
01715       //addrSpec = displayName;
01716       //displayName.truncate( 0 );
01717       // Address of the form "foo@bar" or "foo@bar (Name)".
01718       email = fullName;
01719       fullName = QString::fromUtf8( comment );
01720     }
01721   }
01722 
01723   // Check that we do not have any extra characters on the end of the
01724   // strings
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 }
KDE Logo
This file is part of the documentation for kabc Library Version 3.4.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Tue Aug 2 12:25:59 2005 by doxygen 1.3.9.1 written by Dimitri van Heesch, © 1997-2003