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