kabc Library API Documentation

addressee.cpp

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