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 Wed Sep 29 09:42:00 2004 by doxygen 1.3.8 written by Dimitri van Heesch, © 1997-2003