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