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