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.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed May 5 07:17:59 2004 by doxygen 1.3.6 written by Dimitri van Heesch, © 1997-2003