addressee.src.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include <qregexp.h>
00023
00024 #include <ksharedptr.h>
00025 #include <kdebug.h>
00026 #include <kapplication.h>
00027 #include <klocale.h>
00028
00029 #include "addresseehelper.h"
00030 #include "field.h"
00031 #include "resource.h"
00032
00033 #include "addressee.h"
00034
00035 using namespace KABC;
00036
00037 static bool matchBinaryPattern( int value, int pattern );
00038
00039 template <class L>
00040 static bool listEquals( const QValueList<L>&, const QValueList<L>& );
00041
00042 KABC::Field *Addressee::mSortField = 0;
00043
00044 struct Addressee::AddresseeData : public KShared
00045 {
00046 QString uid;
00047 --VARIABLES--
00048
00049 PhoneNumber::List phoneNumbers;
00050 Address::List addresses;
00051 Key::List keys;
00052 QStringList emails;
00053 QStringList categories;
00054 QStringList custom;
00055
00056 Resource *resource;
00057
00058 bool empty :1;
00059 bool changed :1;
00060 };
00061
00062 Addressee::AddresseeData* Addressee::shared_null = 0;
00063
00064 Addressee::AddresseeData* Addressee::makeSharedNull()
00065 {
00066 Addressee::shared_null = new AddresseeData;
00067 shared_null->_KShared_ref();
00068 shared_null->empty = true;
00069 shared_null->changed = false;
00070 shared_null->resource = 0;
00071 return shared_null;
00072 }
00073
00074 Addressee::Addressee()
00075 {
00076 mData = shared_null ? shared_null : makeSharedNull();
00077 }
00078
00079 Addressee::~Addressee()
00080 {
00081 }
00082
00083 Addressee::Addressee( const Addressee &a )
00084 {
00085 mData = a.mData;
00086 }
00087
00088 Addressee &Addressee::operator=( const Addressee &a )
00089 {
00090 mData = a.mData;
00091 return (*this);
00092 }
00093
00094 void Addressee::detach()
00095 {
00096 if ( mData.data() == shared_null ) {
00097 mData = new AddresseeData;
00098 mData->empty = true;
00099 mData->changed = false;
00100 mData->resource = 0;
00101 mData->uid = KApplication::randomString( 10 );
00102 return;
00103 } else if ( mData.count() == 1 ) return;
00104
00105 AddresseeData data = *mData;
00106 mData = new AddresseeData( data );
00107 }
00108
00109 bool Addressee::operator==( const Addressee &a ) const
00110 {
00111 if ( uid() != a.uid() ) {
00112 kdDebug(5700) << "uid differs" << endl;
00113 return false;
00114 }
00115 --EQUALSTEST--
00116 if ( ( mData->url.isValid() || a.mData->url.isValid() ) &&
00117 ( mData->url != a.mData->url ) ) {
00118 kdDebug(5700) << "url differs" << endl;
00119 return false;
00120 }
00121 if ( !listEquals( mData->phoneNumbers, a.mData->phoneNumbers ) ) {
00122 kdDebug(5700) << "phoneNumbers differs" << endl;
00123 return false;
00124 }
00125 if ( !listEquals( mData->addresses, a.mData->addresses ) ) {
00126 kdDebug(5700) << "addresses differs" << endl;
00127 return false;
00128 }
00129 if ( !listEquals( mData->keys, a.mData->keys ) ) {
00130 kdDebug(5700) << "keys differs" << endl;
00131 return false;
00132 }
00133 if ( !listEquals( mData->emails, a.mData->emails ) ) {
00134 kdDebug(5700) << "emails differs" << endl;
00135 return false;
00136 }
00137 if ( !listEquals( mData->categories, a.mData->categories ) ) {
00138 kdDebug(5700) << "categories differs" << endl;
00139 return false;
00140 }
00141 if ( !listEquals( mData->custom, a.mData->custom ) ) {
00142 kdDebug(5700) << "custom differs" << endl;
00143 return false;
00144 }
00145
00146 return true;
00147 }
00148
00149 bool Addressee::operator!=( const Addressee &a ) const
00150 {
00151 return !( a == *this );
00152 }
00153
00154 bool Addressee::isEmpty() const
00155 {
00156 return mData->empty;
00157 }
00158
00159 void Addressee::setUid( const QString &id )
00160 {
00161 if ( id == mData->uid ) return;
00162 detach();
00163 mData->empty = false;
00164 mData->uid = id;
00165 }
00166
00167 QString Addressee::uid() const
00168 {
00169 return mData->uid;
00170 }
00171
00172 QString Addressee::uidLabel()
00173 {
00174 return i18n("Unique Identifier");
00175 }
00176
00177 --DEFINITIONS--
00178
00179 void Addressee::setNameFromString( const QString &str )
00180 {
00181 setFormattedName( str );
00182 setName( str );
00183
00184
00185 setPrefix( QString::null );
00186 setGivenName( QString::null );
00187 setAdditionalName( QString::null );
00188 setFamilyName( QString::null );
00189 setSuffix( QString::null );
00190
00191 if ( str.isEmpty() )
00192 return;
00193
00194 QString spaceStr = " ";
00195 QString emptyStr = "";
00196 AddresseeHelper *helper = AddresseeHelper::self();
00197
00198 int i = str.find( ',' );
00199 if( i < 0 ) {
00200 QStringList parts = QStringList::split( spaceStr, str );
00201 int leftOffset = 0;
00202 int rightOffset = parts.count() - 1;
00203
00204 QString suffix;
00205 while ( rightOffset >= 0 ) {
00206 if ( helper->containsSuffix( parts[ rightOffset ] ) ) {
00207 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? emptyStr : spaceStr));
00208 rightOffset--;
00209 } else
00210 break;
00211 }
00212 setSuffix( suffix );
00213
00214 if ( rightOffset < 0 )
00215 return;
00216
00217 if ( rightOffset - 1 >= 0 && helper->containsPrefix( parts[ rightOffset - 1 ].lower() ) ) {
00218 setFamilyName( parts[ rightOffset - 1 ] + spaceStr + parts[ rightOffset ] );
00219 rightOffset--;
00220 } else {
00221 if ( helper->tradeAsFamilyName() )
00222 setFamilyName( parts[ rightOffset ] );
00223 else
00224 setGivenName( parts[ rightOffset ] );
00225 }
00226
00227 QString prefix;
00228 while ( leftOffset < rightOffset ) {
00229 if ( helper->containsTitle( parts[ leftOffset ] ) ) {
00230 prefix.append( ( prefix.isEmpty() ? emptyStr : spaceStr) + parts[ leftOffset ] );
00231 leftOffset++;
00232 } else
00233 break;
00234 }
00235 setPrefix( prefix );
00236
00237 if ( leftOffset < rightOffset ) {
00238 setGivenName( parts[ leftOffset ] );
00239 leftOffset++;
00240 }
00241
00242 QString additionalName;
00243 while ( leftOffset < rightOffset ) {
00244 additionalName.append( ( additionalName.isEmpty() ? emptyStr : spaceStr) + parts[ leftOffset ] );
00245 leftOffset++;
00246 }
00247 setAdditionalName( additionalName );
00248 } else {
00249 QString part1 = str.left( i );
00250 QString part2 = str.mid( i + 1 );
00251
00252 QStringList parts = QStringList::split( spaceStr, part1 );
00253 int leftOffset = 0;
00254 int rightOffset = parts.count() - 1;
00255
00256 if ( parts.count() > 0 ) {
00257
00258 QString suffix;
00259 while ( rightOffset >= 0 ) {
00260 if ( helper->containsSuffix( parts[ rightOffset ] ) ) {
00261 suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? emptyStr : spaceStr));
00262 rightOffset--;
00263 } else
00264 break;
00265 }
00266 setSuffix( suffix );
00267
00268 if ( rightOffset - 1 >= 0 && helper->containsPrefix( parts[ rightOffset - 1 ].lower() ) ) {
00269 setFamilyName( parts[ rightOffset - 1 ] + spaceStr + parts[ rightOffset ] );
00270 rightOffset--;
00271 } else
00272 setFamilyName( parts[ rightOffset ] );
00273
00274 QString prefix;
00275 while ( leftOffset < rightOffset ) {
00276 if ( helper->containsTitle( parts[ leftOffset ] ) ) {
00277 prefix.append( ( prefix.isEmpty() ? emptyStr : spaceStr) + parts[ leftOffset ] );
00278 leftOffset++;
00279 } else
00280 break;
00281 }
00282 } else {
00283 setPrefix( "" );
00284 setFamilyName( "" );
00285 setSuffix( "" );
00286 }
00287
00288 parts = QStringList::split( spaceStr, part2 );
00289
00290 leftOffset = 0;
00291 rightOffset = parts.count();
00292
00293 if ( parts.count() > 0 ) {
00294
00295 QString prefix;
00296 while ( leftOffset < rightOffset ) {
00297 if ( helper->containsTitle( parts[ leftOffset ] ) ) {
00298 prefix.append( ( prefix.isEmpty() ? emptyStr : spaceStr) + parts[ leftOffset ] );
00299 leftOffset++;
00300 } else
00301 break;
00302 }
00303 setPrefix( prefix );
00304
00305 if ( leftOffset < rightOffset ) {
00306 setGivenName( parts[ leftOffset ] );
00307 leftOffset++;
00308 }
00309
00310 QString additionalName;
00311 while ( leftOffset < rightOffset ) {
00312 additionalName.append( ( additionalName.isEmpty() ? emptyStr : spaceStr) + parts[ leftOffset ] );
00313 leftOffset++;
00314 }
00315 setAdditionalName( additionalName );
00316 } else {
00317 setGivenName( "" );
00318 setAdditionalName( "" );
00319 }
00320 }
00321 }
00322
00323 QString Addressee::realName() const
00324 {
00325 QString n( formattedName() );
00326 if ( !n.isEmpty() )
00327 return n;
00328
00329 n = assembledName();
00330 if ( !n.isEmpty() )
00331 return n;
00332
00333 n = name();
00334 if ( !n.isEmpty() )
00335 return n;
00336
00337 return organization();
00338 }
00339
00340 QString Addressee::assembledName() const
00341 {
00342 QString name = prefix() + " " + givenName() + " " + additionalName() + " " +
00343 familyName() + " " + suffix();
00344
00345 return name.simplifyWhiteSpace();
00346 }
00347
00348 QString Addressee::fullEmail( const QString &email ) const
00349 {
00350 QString e;
00351 if ( email.isNull() ) {
00352 e = preferredEmail();
00353 } else {
00354 e = email;
00355 }
00356 if ( e.isEmpty() ) return QString::null;
00357
00358 QString text;
00359 if ( realName().isEmpty() )
00360 text = e;
00361 else {
00362 QRegExp needQuotes( "[^ 0-9A-Za-z\\x0080-\\xFFFF]" );
00363 if ( realName().find( needQuotes ) != -1 )
00364 text = "\"" + realName() + "\" <" + e + ">";
00365 else
00366 text = realName() + " <" + e + ">";
00367 }
00368
00369 return text;
00370 }
00371
00372 void Addressee::insertEmail( const QString &email, bool preferred )
00373 {
00374 if ( email.simplifyWhiteSpace().isEmpty() )
00375 return;
00376
00377 detach();
00378
00379 QStringList::Iterator it = mData->emails.find( email );
00380
00381 if ( it != mData->emails.end() ) {
00382 if ( !preferred || it == mData->emails.begin() ) return;
00383 mData->emails.remove( it );
00384 mData->emails.prepend( email );
00385 } else {
00386 if ( preferred ) {
00387 mData->emails.prepend( email );
00388 } else {
00389 mData->emails.append( email );
00390 }
00391 }
00392 }
00393
00394 void Addressee::removeEmail( const QString &email )
00395 {
00396 detach();
00397
00398 QStringList::Iterator it = mData->emails.find( email );
00399 if ( it == mData->emails.end() ) return;
00400
00401 mData->emails.remove( it );
00402 }
00403
00404 QString Addressee::preferredEmail() const
00405 {
00406 if ( mData->emails.count() == 0 ) return QString::null;
00407 else return mData->emails.first();
00408 }
00409
00410 QStringList Addressee::emails() const
00411 {
00412 return mData->emails;
00413 }
00414 void Addressee::setEmails( const QStringList& emails ) {
00415 detach();
00416
00417 mData->emails = emails;
00418 }
00419 void Addressee::insertPhoneNumber( const PhoneNumber &phoneNumber )
00420 {
00421 detach();
00422 mData->empty = false;
00423
00424 PhoneNumber::List::Iterator it;
00425 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
00426 if ( (*it).id() == phoneNumber.id() ) {
00427 *it = phoneNumber;
00428 return;
00429 }
00430 }
00431 if ( !phoneNumber.number().simplifyWhiteSpace().isEmpty() )
00432 mData->phoneNumbers.append( phoneNumber );
00433 }
00434
00435 void Addressee::removePhoneNumber( const PhoneNumber &phoneNumber )
00436 {
00437 detach();
00438
00439 PhoneNumber::List::Iterator it;
00440 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
00441 if ( (*it).id() == phoneNumber.id() ) {
00442 mData->phoneNumbers.remove( it );
00443 return;
00444 }
00445 }
00446 }
00447
00448 PhoneNumber Addressee::phoneNumber( int type ) const
00449 {
00450 PhoneNumber phoneNumber( "", type );
00451 PhoneNumber::List::ConstIterator it;
00452 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
00453 if ( matchBinaryPattern( (*it).type(), type ) ) {
00454 if ( (*it).type() & PhoneNumber::Pref )
00455 return (*it);
00456 else if ( phoneNumber.number().isEmpty() )
00457 phoneNumber = (*it);
00458 }
00459 }
00460
00461 return phoneNumber;
00462 }
00463
00464 PhoneNumber::List Addressee::phoneNumbers() const
00465 {
00466 return mData->phoneNumbers;
00467 }
00468
00469 PhoneNumber::List Addressee::phoneNumbers( int type ) const
00470 {
00471 PhoneNumber::List list;
00472
00473 PhoneNumber::List::ConstIterator it;
00474 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
00475 if ( matchBinaryPattern( (*it).type(), type ) ) {
00476 list.append( *it );
00477 }
00478 }
00479 return list;
00480 }
00481
00482 PhoneNumber Addressee::findPhoneNumber( const QString &id ) const
00483 {
00484 PhoneNumber::List::ConstIterator it;
00485 for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) {
00486 if ( (*it).id() == id ) {
00487 return *it;
00488 }
00489 }
00490 return PhoneNumber();
00491 }
00492
00493 void Addressee::insertKey( const Key &key )
00494 {
00495 detach();
00496 mData->empty = false;
00497
00498 Key::List::Iterator it;
00499 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
00500 if ( (*it).id() == key.id() ) {
00501 *it = key;
00502 return;
00503 }
00504 }
00505 mData->keys.append( key );
00506 }
00507
00508 void Addressee::removeKey( const Key &key )
00509 {
00510 detach();
00511
00512 Key::List::Iterator it;
00513 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
00514 if ( (*it).id() == key.id() ) {
00515 mData->keys.remove( key );
00516 return;
00517 }
00518 }
00519 }
00520
00521 Key Addressee::key( int type, QString customTypeString ) const
00522 {
00523 Key::List::ConstIterator it;
00524 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
00525 if ( (*it).type() == type ) {
00526 if ( type == Key::Custom ) {
00527 if ( customTypeString.isEmpty() ) {
00528 return *it;
00529 } else {
00530 if ( (*it).customTypeString() == customTypeString )
00531 return (*it);
00532 }
00533 } else {
00534 return *it;
00535 }
00536 }
00537 }
00538 return Key( QString(), type );
00539 }
00540
00541 void Addressee::setKeys( const Key::List& list )
00542 {
00543 detach();
00544 mData->keys = list;
00545 }
00546
00547 Key::List Addressee::keys() const
00548 {
00549 return mData->keys;
00550 }
00551
00552 Key::List Addressee::keys( int type, QString customTypeString ) const
00553 {
00554 Key::List list;
00555
00556 Key::List::ConstIterator it;
00557 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
00558 if ( (*it).type() == type ) {
00559 if ( type == Key::Custom ) {
00560 if ( customTypeString.isEmpty() ) {
00561 list.append( *it );
00562 } else {
00563 if ( (*it).customTypeString() == customTypeString )
00564 list.append( *it );
00565 }
00566 } else {
00567 list.append( *it );
00568 }
00569 }
00570 }
00571 return list;
00572 }
00573
00574 Key Addressee::findKey( const QString &id ) const
00575 {
00576 Key::List::ConstIterator it;
00577 for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) {
00578 if ( (*it).id() == id ) {
00579 return *it;
00580 }
00581 }
00582 return Key();
00583 }
00584
00585 QString Addressee::asString() const
00586 {
00587 return "Smith, agent Smith...";
00588 }
00589
00590 void Addressee::dump() const
00591 {
00592 kdDebug(5700) << "Addressee {" << endl;
00593
00594 kdDebug(5700) << " Uid: '" << uid() << "'" << endl;
00595
00596 --DEBUG--
00597
00598 kdDebug(5700) << " Emails {" << endl;
00599 QStringList e = emails();
00600 QStringList::ConstIterator it;
00601 for( it = e.begin(); it != e.end(); ++it ) {
00602 kdDebug(5700) << " " << (*it) << endl;
00603 }
00604 kdDebug(5700) << " }" << endl;
00605
00606 kdDebug(5700) << " PhoneNumbers {" << endl;
00607 PhoneNumber::List p = phoneNumbers();
00608 PhoneNumber::List::ConstIterator it2;
00609 for( it2 = p.begin(); it2 != p.end(); ++it2 ) {
00610 kdDebug(5700) << " Type: " << int((*it2).type()) << " Number: " << (*it2).number() << endl;
00611 }
00612 kdDebug(5700) << " }" << endl;
00613
00614 Address::List a = addresses();
00615 Address::List::ConstIterator it3;
00616 for( it3 = a.begin(); it3 != a.end(); ++it3 ) {
00617 (*it3).dump();
00618 }
00619
00620 kdDebug(5700) << " Keys {" << endl;
00621 Key::List k = keys();
00622 Key::List::ConstIterator it4;
00623 for( it4 = k.begin(); it4 != k.end(); ++it4 ) {
00624 kdDebug(5700) << " Type: " << int((*it4).type()) <<
00625 " Key: " << (*it4).textData() <<
00626 " CustomString: " << (*it4).customTypeString() << endl;
00627 }
00628 kdDebug(5700) << " }" << endl;
00629
00630 kdDebug(5700) << "}" << endl;
00631 }
00632
00633
00634 void Addressee::insertAddress( const Address &address )
00635 {
00636 if ( address.isEmpty() )
00637 return;
00638
00639 detach();
00640 mData->empty = false;
00641
00642 Address::List::Iterator it;
00643 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
00644 if ( (*it).id() == address.id() ) {
00645 *it = address;
00646 return;
00647 }
00648 }
00649
00650 mData->addresses.append( address );
00651 }
00652
00653 void Addressee::removeAddress( const Address &address )
00654 {
00655 detach();
00656
00657 Address::List::Iterator it;
00658 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
00659 if ( (*it).id() == address.id() ) {
00660 mData->addresses.remove( it );
00661 return;
00662 }
00663 }
00664 }
00665
00666 Address Addressee::address( int type ) const
00667 {
00668 Address address( type );
00669 Address::List::ConstIterator it;
00670 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
00671 if ( matchBinaryPattern( (*it).type(), type ) ) {
00672 if ( (*it).type() & Address::Pref )
00673 return (*it);
00674 else if ( address.isEmpty() )
00675 address = (*it);
00676 }
00677 }
00678
00679 return address;
00680 }
00681
00682 Address::List Addressee::addresses() const
00683 {
00684 return mData->addresses;
00685 }
00686
00687 Address::List Addressee::addresses( int type ) const
00688 {
00689 Address::List list;
00690
00691 Address::List::ConstIterator it;
00692 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
00693 if ( matchBinaryPattern( (*it).type(), type ) ) {
00694 list.append( *it );
00695 }
00696 }
00697
00698 return list;
00699 }
00700
00701 Address Addressee::findAddress( const QString &id ) const
00702 {
00703 Address::List::ConstIterator it;
00704 for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) {
00705 if ( (*it).id() == id ) {
00706 return *it;
00707 }
00708 }
00709 return Address();
00710 }
00711
00712 void Addressee::insertCategory( const QString &c )
00713 {
00714 detach();
00715 mData->empty = false;
00716
00717 if ( mData->categories.findIndex( c ) != -1 ) return;
00718
00719 mData->categories.append( c );
00720 }
00721
00722 void Addressee::removeCategory( const QString &c )
00723 {
00724 detach();
00725
00726 QStringList::Iterator it = mData->categories.find( c );
00727 if ( it == mData->categories.end() ) return;
00728
00729 mData->categories.remove( it );
00730 }
00731
00732 bool Addressee::hasCategory( const QString &c ) const
00733 {
00734 return ( mData->categories.findIndex( c ) != -1 );
00735 }
00736
00737 void Addressee::setCategories( const QStringList &c )
00738 {
00739 detach();
00740 mData->empty = false;
00741
00742 mData->categories = c;
00743 }
00744
00745 QStringList Addressee::categories() const
00746 {
00747 return mData->categories;
00748 }
00749
00750 void Addressee::insertCustom( const QString &app, const QString &name,
00751 const QString &value )
00752 {
00753 if ( value.isEmpty() || name.isEmpty() || app.isEmpty() ) return;
00754
00755 detach();
00756 mData->empty = false;
00757
00758 QString qualifiedName = app + "-" + name + ":";
00759
00760 QStringList::Iterator it;
00761 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
00762 if ( (*it).startsWith( qualifiedName ) ) {
00763 (*it) = qualifiedName + value;
00764 return;
00765 }
00766 }
00767
00768 mData->custom.append( qualifiedName + value );
00769 }
00770
00771 void Addressee::removeCustom( const QString &app, const QString &name)
00772 {
00773 detach();
00774
00775 QString qualifiedName = app + "-" + name + ":";
00776
00777 QStringList::Iterator it;
00778 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
00779 if ( (*it).startsWith( qualifiedName ) ) {
00780 mData->custom.remove( it );
00781 return;
00782 }
00783 }
00784 }
00785
00786 QString Addressee::custom( const QString &app, const QString &name ) const
00787 {
00788 QString qualifiedName = app + "-" + name + ":";
00789 QString value;
00790
00791 QStringList::ConstIterator it;
00792 for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) {
00793 if ( (*it).startsWith( qualifiedName ) ) {
00794 value = (*it).mid( (*it).find( ":" ) + 1 );
00795 break;
00796 }
00797 }
00798
00799 return value;
00800 }
00801
00802 void Addressee::setCustoms( const QStringList &l )
00803 {
00804 detach();
00805 mData->empty = false;
00806
00807 mData->custom = l;
00808 }
00809
00810 QStringList Addressee::customs() const
00811 {
00812 return mData->custom;
00813 }
00814
00815 void Addressee::parseEmailAddress( const QString &rawEmail, QString &fullName,
00816 QString &email)
00817 {
00818 int startPos, endPos, len;
00819 QString partA, partB, result;
00820 char endCh = '>';
00821
00822 startPos = rawEmail.find( '<' );
00823 if ( startPos < 0 ) {
00824 startPos = rawEmail.find( '(' );
00825 endCh = ')';
00826 }
00827
00828 if ( startPos < 0 ) {
00829
00830
00831 email = rawEmail;
00832 fullName = "";
00833 } else {
00834
00835 endPos = rawEmail.find( endCh, startPos + 1 );
00836
00837 if ( endPos < 0 ) {
00838
00839
00840 email = rawEmail;
00841 fullName = "";
00842 } else {
00843
00844
00845
00846 QString left = rawEmail.left( startPos ).stripWhiteSpace();
00847
00848 QString right = rawEmail.mid( startPos + 1, endPos - startPos - 1 )
00849 .stripWhiteSpace();
00850
00851
00852 if ( endCh == '>' ) {
00853 fullName = left;
00854 email = right;
00855 } else {
00856 fullName = right;
00857 email = left;
00858 }
00859
00860
00861
00862 len = fullName.length();
00863 if ( fullName[ 0 ] == '"' && fullName[ len - 1 ] == '"' )
00864 fullName = fullName.mid( 1, len - 2 );
00865 else if ( fullName[ 0 ] == '(' && fullName[ len - 1 ] == ')' )
00866 fullName = fullName.mid( 1, len - 2 );
00867
00868 len = email.length();
00869 if ( email[ 0 ] == '<' && email[ len - 1 ] == '>' )
00870 email = email.mid( 1, len - 2 );
00871 }
00872 }
00873 }
00874
00875 void Addressee::setResource( Resource *resource )
00876 {
00877 detach();
00878 mData->resource = resource;
00879 }
00880
00881 Resource *Addressee::resource() const
00882 {
00883 return mData->resource;
00884 }
00885
00886 void Addressee::setChanged( bool value )
00887 {
00888 detach();
00889 mData->changed = value;
00890 }
00891
00892 bool Addressee::changed() const
00893 {
00894 return mData->changed;
00895 }
00896
00897 void Addressee::setSortKey( KABC::Field *field )
00898 {
00899 mSortField = field;
00900 }
00901
00902 bool Addressee::operator< ( const Addressee &addr )
00903 {
00904 if ( !mSortField )
00905 return false;
00906 else
00907 return ( QString::localeAwareCompare( mSortField->value( *this ).lower(),
00908 mSortField->value( addr ).lower() ) < 0 );
00909 }
00910
00911 QDataStream &KABC::operator<<( QDataStream &s, const Addressee &a )
00912 {
00913 if (!a.mData) return s;
00914
00915 s << a.uid();
00916
00917 --STREAMOUT--
00918 s << a.mData->phoneNumbers;
00919 s << a.mData->addresses;
00920 s << a.mData->emails;
00921 s << a.mData->categories;
00922 s << a.mData->custom;
00923 s << a.mData->keys;
00924 return s;
00925 }
00926
00927 QDataStream &KABC::operator>>( QDataStream &s, Addressee &a )
00928 {
00929 if (!a.mData) return s;
00930
00931 s >> a.mData->uid;
00932
00933 --STREAMIN--
00934 s >> a.mData->phoneNumbers;
00935 s >> a.mData->addresses;
00936 s >> a.mData->emails;
00937 s >> a.mData->categories;
00938 s >> a.mData->custom;
00939 s >> a.mData->keys;
00940
00941 a.mData->empty = false;
00942
00943 return s;
00944 }
00945
00946 bool matchBinaryPattern( int value, int pattern )
00947 {
00954 if ( pattern == 0 )
00955 return ( value == 0 );
00956 else
00957 return ( pattern == ( pattern & value ) );
00958 }
00959
00960 template <class L>
00961 bool listEquals( const QValueList<L> &list, const QValueList<L> &pattern )
00962 {
00963 if ( list.count() != pattern.count() )
00964 return false;
00965
00966 for ( uint i = 0; i < list.count(); ++i )
00967 if ( pattern.find( list[ i ] ) == pattern.end() )
00968 return false;
00969
00970 return true;
00971 }
This file is part of the documentation for kabc Library Version 3.3.0.