-rw-r--r-- | kabc/addressee.cpp | 62 |
1 files changed, 33 insertions, 29 deletions
diff --git a/kabc/addressee.cpp b/kabc/addressee.cpp index 6b282e2..4cdd5e5 100644 --- a/kabc/addressee.cpp +++ b/kabc/addressee.cpp @@ -36,1565 +36,1569 @@ $Id$ #include <kstandarddirs.h> //US #include "resource.h" #include "addressee.h" using namespace KABC; static bool matchBinaryPattern( int value, int pattern ); struct Addressee::AddresseeData : public KShared { QString uid; QString name; QString formattedName; QString familyName; QString givenName; QString additionalName; QString prefix; QString suffix; QString nickName; QDateTime birthday; QString mailer; TimeZone timeZone; Geo geo; QString title; QString role; QString organization; QString note; QString productId; QDateTime revision; QString sortString; KURL url; Secrecy secrecy; Picture logo; Picture photo; Sound sound; Agent agent; PhoneNumber::List phoneNumbers; Address::List addresses; Key::List keys; QStringList emails; QStringList categories; QStringList custom; Resource *resource; bool empty :1; bool changed :1; }; Addressee::Addressee() { mData = new AddresseeData; mData->empty = true; mData->changed = false; mData->resource = 0; } Addressee::~Addressee() { } Addressee::Addressee( const Addressee &a ) { mData = a.mData; } Addressee &Addressee::operator=( const Addressee &a ) { mData = a.mData; return (*this); } Addressee Addressee::copy() { Addressee a; *(a.mData) = *mData; return a; } void Addressee::detach() { if ( mData.count() == 1 ) return; *this = copy(); } bool Addressee::operator==( const Addressee &a ) const { if ( uid() != a.uid() ) return false; if ( mData->name != a.mData->name ) return false; if ( mData->formattedName != a.mData->formattedName ) return false; if ( mData->familyName != a.mData->familyName ) return false; if ( mData->givenName != a.mData->givenName ) return false; if ( mData->additionalName != a.mData->additionalName ) return false; if ( mData->prefix != a.mData->prefix ) return false; if ( mData->suffix != a.mData->suffix ) return false; if ( mData->nickName != a.mData->nickName ) return false; if ( mData->birthday != a.mData->birthday ) return false; if ( mData->mailer != a.mData->mailer ) return false; if ( mData->timeZone != a.mData->timeZone ) return false; if ( mData->geo != a.mData->geo ) return false; if ( mData->title != a.mData->title ) return false; if ( mData->role != a.mData->role ) return false; if ( mData->organization != a.mData->organization ) return false; if ( mData->note != a.mData->note ) return false; if ( mData->productId != a.mData->productId ) return false; if ( mData->revision != a.mData->revision ) return false; if ( mData->sortString != a.mData->sortString ) return false; if ( mData->secrecy != a.mData->secrecy ) return false; if ( mData->logo != a.mData->logo ) return false; if ( mData->photo != a.mData->photo ) return false; if ( mData->sound != a.mData->sound ) return false; if ( mData->agent != a.mData->agent ) return false; if ( ( mData->url.isValid() || a.mData->url.isValid() ) && ( mData->url != a.mData->url ) ) return false; if ( mData->phoneNumbers != a.mData->phoneNumbers ) return false; if ( mData->addresses != a.mData->addresses ) return false; if ( mData->keys != a.mData->keys ) return false; if ( mData->emails != a.mData->emails ) return false; if ( mData->categories != a.mData->categories ) return false; if ( mData->custom != a.mData->custom ) return false; return true; } bool Addressee::operator!=( const Addressee &a ) const { return !( a == *this ); } bool Addressee::isEmpty() const { return mData->empty; } void Addressee::setUid( const QString &id ) { if ( id == mData->uid ) return; detach(); mData->empty = false; mData->uid = id; } QString Addressee::uid() const { if ( mData->uid.isEmpty() ) mData->uid = KApplication::randomString( 10 ); return mData->uid; } QString Addressee::uidLabel() { return i18n("Unique Identifier"); } void Addressee::setName( const QString &name ) { if ( name == mData->name ) return; detach(); mData->empty = false; mData->name = name; } QString Addressee::name() const { return mData->name; } QString Addressee::nameLabel() { return i18n("Name"); } void Addressee::setFormattedName( const QString &formattedName ) { if ( formattedName == mData->formattedName ) return; detach(); mData->empty = false; mData->formattedName = formattedName; } QString Addressee::formattedName() const { return mData->formattedName; } QString Addressee::formattedNameLabel() { return i18n("Formatted Name"); } void Addressee::setFamilyName( const QString &familyName ) { if ( familyName == mData->familyName ) return; detach(); mData->empty = false; mData->familyName = familyName; } QString Addressee::familyName() const { return mData->familyName; } QString Addressee::familyNameLabel() { return i18n("Family Name"); } void Addressee::setGivenName( const QString &givenName ) { if ( givenName == mData->givenName ) return; detach(); mData->empty = false; mData->givenName = givenName; } QString Addressee::givenName() const { return mData->givenName; } QString Addressee::givenNameLabel() { return i18n("Given Name"); } void Addressee::setAdditionalName( const QString &additionalName ) { if ( additionalName == mData->additionalName ) return; detach(); mData->empty = false; mData->additionalName = additionalName; } QString Addressee::additionalName() const { return mData->additionalName; } QString Addressee::additionalNameLabel() { return i18n("Additional Names"); } void Addressee::setPrefix( const QString &prefix ) { if ( prefix == mData->prefix ) return; detach(); mData->empty = false; mData->prefix = prefix; } QString Addressee::prefix() const { return mData->prefix; } QString Addressee::prefixLabel() { return i18n("Honorific Prefixes"); } void Addressee::setSuffix( const QString &suffix ) { if ( suffix == mData->suffix ) return; detach(); mData->empty = false; mData->suffix = suffix; } QString Addressee::suffix() const { return mData->suffix; } QString Addressee::suffixLabel() { return i18n("Honorific Suffixes"); } void Addressee::setNickName( const QString &nickName ) { if ( nickName == mData->nickName ) return; detach(); mData->empty = false; mData->nickName = nickName; } QString Addressee::nickName() const { return mData->nickName; } QString Addressee::nickNameLabel() { return i18n("Nick Name"); } void Addressee::setBirthday( const QDateTime &birthday ) { if ( birthday == mData->birthday ) return; detach(); mData->empty = false; mData->birthday = birthday; } QDateTime Addressee::birthday() const { return mData->birthday; } QString Addressee::birthdayLabel() { return i18n("Birthday"); } QString Addressee::homeAddressStreetLabel() { return i18n("Home Address Street"); } QString Addressee::homeAddressLocalityLabel() { return i18n("Home Address Locality"); } QString Addressee::homeAddressRegionLabel() { return i18n("Home Address Region"); } QString Addressee::homeAddressPostalCodeLabel() { return i18n("Home Address Postal Code"); } QString Addressee::homeAddressCountryLabel() { return i18n("Home Address Country"); } QString Addressee::homeAddressLabelLabel() { return i18n("Home Address Label"); } QString Addressee::businessAddressStreetLabel() { return i18n("Business Address Street"); } QString Addressee::businessAddressLocalityLabel() { return i18n("Business Address Locality"); } QString Addressee::businessAddressRegionLabel() { return i18n("Business Address Region"); } QString Addressee::businessAddressPostalCodeLabel() { return i18n("Business Address Postal Code"); } QString Addressee::businessAddressCountryLabel() { return i18n("Business Address Country"); } QString Addressee::businessAddressLabelLabel() { return i18n("Business Address Label"); } QString Addressee::homePhoneLabel() { return i18n("Home Phone"); } QString Addressee::businessPhoneLabel() { return i18n("Business Phone"); } QString Addressee::mobilePhoneLabel() { return i18n("Mobile Phone"); } QString Addressee::homeFaxLabel() { return i18n("Home Fax"); } QString Addressee::businessFaxLabel() { return i18n("Business Fax"); } QString Addressee::carPhoneLabel() { return i18n("Car Phone"); } QString Addressee::isdnLabel() { return i18n("ISDN"); } QString Addressee::pagerLabel() { return i18n("Pager"); } QString Addressee::sipLabel() { return i18n("SIP"); } QString Addressee::emailLabel() { return i18n("Email Address"); } void Addressee::setMailer( const QString &mailer ) { if ( mailer == mData->mailer ) return; detach(); mData->empty = false; mData->mailer = mailer; } QString Addressee::mailer() const { return mData->mailer; } QString Addressee::mailerLabel() { return i18n("Mail Client"); } void Addressee::setTimeZone( const TimeZone &timeZone ) { if ( timeZone == mData->timeZone ) return; detach(); mData->empty = false; mData->timeZone = timeZone; } TimeZone Addressee::timeZone() const { return mData->timeZone; } QString Addressee::timeZoneLabel() { return i18n("Time Zone"); } void Addressee::setGeo( const Geo &geo ) { if ( geo == mData->geo ) return; detach(); mData->empty = false; mData->geo = geo; } Geo Addressee::geo() const { return mData->geo; } QString Addressee::geoLabel() { return i18n("Geographic Position"); } void Addressee::setTitle( const QString &title ) { if ( title == mData->title ) return; detach(); mData->empty = false; mData->title = title; } QString Addressee::title() const { return mData->title; } QString Addressee::titleLabel() { return i18n("Title"); } void Addressee::setRole( const QString &role ) { if ( role == mData->role ) return; detach(); mData->empty = false; mData->role = role; } QString Addressee::role() const { return mData->role; } QString Addressee::roleLabel() { return i18n("Role"); } void Addressee::setOrganization( const QString &organization ) { if ( organization == mData->organization ) return; detach(); mData->empty = false; mData->organization = organization; } QString Addressee::organization() const { return mData->organization; } QString Addressee::organizationLabel() { return i18n("Organization"); } void Addressee::setNote( const QString ¬e ) { if ( note == mData->note ) return; detach(); mData->empty = false; mData->note = note; } QString Addressee::note() const { return mData->note; } QString Addressee::noteLabel() { return i18n("Note"); } void Addressee::setProductId( const QString &productId ) { if ( productId == mData->productId ) return; detach(); mData->empty = false; mData->productId = productId; } QString Addressee::productId() const { return mData->productId; } QString Addressee::productIdLabel() { return i18n("Product Identifier"); } void Addressee::setRevision( const QDateTime &revision ) { if ( revision == mData->revision ) return; detach(); mData->empty = false; mData->revision = revision; } QDateTime Addressee::revision() const { return mData->revision; } QString Addressee::revisionLabel() { return i18n("Revision Date"); } void Addressee::setSortString( const QString &sortString ) { if ( sortString == mData->sortString ) return; detach(); mData->empty = false; mData->sortString = sortString; } QString Addressee::sortString() const { return mData->sortString; } QString Addressee::sortStringLabel() { return i18n("Sort String"); } void Addressee::setUrl( const KURL &url ) { if ( url == mData->url ) return; detach(); mData->empty = false; mData->url = url; } KURL Addressee::url() const { return mData->url; } QString Addressee::urlLabel() { return i18n("URL"); } void Addressee::setSecrecy( const Secrecy &secrecy ) { if ( secrecy == mData->secrecy ) return; detach(); mData->empty = false; mData->secrecy = secrecy; } Secrecy Addressee::secrecy() const { return mData->secrecy; } QString Addressee::secrecyLabel() { return i18n("Security Class"); } void Addressee::setLogo( const Picture &logo ) { if ( logo == mData->logo ) return; detach(); mData->empty = false; mData->logo = logo; } Picture Addressee::logo() const { return mData->logo; } QString Addressee::logoLabel() { return i18n("Logo"); } void Addressee::setPhoto( const Picture &photo ) { if ( photo == mData->photo ) return; detach(); mData->empty = false; mData->photo = photo; } Picture Addressee::photo() const { return mData->photo; } QString Addressee::photoLabel() { return i18n("Photo"); } void Addressee::setSound( const Sound &sound ) { if ( sound == mData->sound ) return; detach(); mData->empty = false; mData->sound = sound; } Sound Addressee::sound() const { return mData->sound; } QString Addressee::soundLabel() { return i18n("Sound"); } void Addressee::setAgent( const Agent &agent ) { if ( agent == mData->agent ) return; detach(); mData->empty = false; mData->agent = agent; } Agent Addressee::agent() const { return mData->agent; } QString Addressee::agentLabel() { return i18n("Agent"); } void Addressee::setNameFromString( const QString &str ) { setFormattedName( str ); setName( str ); - QStringList titles; - titles += i18n( "Dr." ); - titles += i18n( "Miss" ); - titles += i18n( "Mr." ); - titles += i18n( "Mrs." ); - titles += i18n( "Ms." ); - titles += i18n( "Prof." ); - - QStringList suffixes; - suffixes += i18n( "I" ); - suffixes += i18n( "II" ); - suffixes += i18n( "III" ); - suffixes += i18n( "Jr." ); - suffixes += i18n( "Sr." ); - - QStringList prefixes; - prefixes += "van"; - prefixes += "von"; - prefixes += "de"; - -//US KConfig config( "kabcrc" ); - KConfig config( locateLocal( "config", "kabcrc") ); - config.setGroup( "General" ); - titles += config.readListEntry( "Prefixes" ); - titles.remove( "" ); - prefixes += config.readListEntry( "Inclusions" ); - prefixes.remove( "" ); - suffixes += config.readListEntry( "Suffixes" ); - suffixes.remove( "" ); + static bool first = true; + static QStringList titles; + static QStringList suffixes; + static QStringList prefixes; + + if ( first ) { + first = false; + titles += i18n( "Dr." ); + titles += i18n( "Miss" ); + titles += i18n( "Mr." ); + titles += i18n( "Mrs." ); + titles += i18n( "Ms." ); + titles += i18n( "Prof." ); + + suffixes += i18n( "I" ); + suffixes += i18n( "II" ); + suffixes += i18n( "III" ); + suffixes += i18n( "Jr." ); + suffixes += i18n( "Sr." ); + + prefixes += "van"; + prefixes += "von"; + prefixes += "de"; + + KConfig config( locateLocal( "config", "kabcrc") ); + config.setGroup( "General" ); + titles += config.readListEntry( "Prefixes" ); + titles.remove( "" ); + prefixes += config.readListEntry( "Inclusions" ); + prefixes.remove( "" ); + suffixes += config.readListEntry( "Suffixes" ); + suffixes.remove( "" ); + } // clear all name parts setPrefix( "" ); setGivenName( "" ); setAdditionalName( "" ); setFamilyName( "" ); setSuffix( "" ); if ( str.isEmpty() ) return; int i = str.find(','); if( i < 0 ) { QStringList parts = QStringList::split( " ", str ); int leftOffset = 0; int rightOffset = parts.count() - 1; QString suffix; while ( rightOffset >= 0 ) { if ( suffixes.contains( parts[ rightOffset ] ) ) { suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " ")); rightOffset--; } else break; } setSuffix( suffix ); if ( rightOffset < 0 ) return; if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) { setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] ); rightOffset--; } else setFamilyName( parts[ rightOffset ] ); QString prefix; while ( leftOffset < rightOffset ) { if ( titles.contains( parts[ leftOffset ] ) ) { prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] ); leftOffset++; } else break; } setPrefix( prefix ); if ( leftOffset < rightOffset ) { setGivenName( parts[ leftOffset ] ); leftOffset++; } QString additionalName; while ( leftOffset < rightOffset ) { additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] ); leftOffset++; } setAdditionalName( additionalName ); } else { QString part1 = str.left( i ); QString part2 = str.mid( i + 1 ); QStringList parts = QStringList::split( " ", part1 ); int leftOffset = 0; int rightOffset = parts.count() - 1; QString suffix; while ( rightOffset >= 0 ) { if ( suffixes.contains( parts[ rightOffset ] ) ) { suffix.prepend(parts[ rightOffset ] + (suffix.isEmpty() ? "" : " ")); rightOffset--; } else break; } setSuffix( suffix ); if ( rightOffset - 1 >= 0 && prefixes.contains( parts[ rightOffset - 1 ].lower() ) ) { setFamilyName( parts[ rightOffset - 1 ] + " " + parts[ rightOffset ] ); rightOffset--; } else setFamilyName( parts[ rightOffset ] ); QString prefix; while ( leftOffset < rightOffset ) { if ( titles.contains( parts[ leftOffset ] ) ) { prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] ); leftOffset++; } else break; } parts = QStringList::split( " ", part2 ); leftOffset = 0; rightOffset = parts.count(); while ( leftOffset < rightOffset ) { if ( titles.contains( parts[ leftOffset ] ) ) { prefix.append( ( prefix.isEmpty() ? "" : " ") + parts[ leftOffset ] ); leftOffset++; } else break; } setPrefix( prefix ); if ( leftOffset < rightOffset ) { setGivenName( parts[ leftOffset ] ); leftOffset++; } QString additionalName; while ( leftOffset < rightOffset ) { additionalName.append( ( additionalName.isEmpty() ? "" : " ") + parts[ leftOffset ] ); leftOffset++; } setAdditionalName( additionalName ); } } QString Addressee::realName() const { if ( !formattedName().isEmpty() ) return formattedName(); QString n = assembledName(); if ( n.isEmpty() ) n = name(); return n; } QString Addressee::assembledName() const { QString name = prefix() + " " + givenName() + " " + additionalName() + " " + familyName() + " " + suffix(); return name.simplifyWhiteSpace(); } QString Addressee::fullEmail( const QString &email ) const { QString e; if ( email.isNull() ) { e = preferredEmail(); } else { e = email; } if ( e.isEmpty() ) return QString::null; QString text; if ( realName().isEmpty() ) text = e; else text = assembledName() + " <" + e + ">"; return text; } void Addressee::insertEmail( const QString &email, bool preferred ) { detach(); QStringList::Iterator it = mData->emails.find( email ); if ( it != mData->emails.end() ) { if ( !preferred || it == mData->emails.begin() ) return; mData->emails.remove( it ); mData->emails.prepend( email ); } else { if ( preferred ) { mData->emails.prepend( email ); } else { mData->emails.append( email ); } } } void Addressee::removeEmail( const QString &email ) { detach(); QStringList::Iterator it = mData->emails.find( email ); if ( it == mData->emails.end() ) return; mData->emails.remove( it ); } QString Addressee::preferredEmail() const { if ( mData->emails.count() == 0 ) return QString::null; else return mData->emails.first(); } QStringList Addressee::emails() const { return mData->emails; } void Addressee::setEmails( const QStringList& emails ) { detach(); mData->emails = emails; } void Addressee::insertPhoneNumber( const PhoneNumber &phoneNumber ) { detach(); mData->empty = false; PhoneNumber::List::Iterator it; for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { if ( (*it).id() == phoneNumber.id() ) { *it = phoneNumber; return; } } mData->phoneNumbers.append( phoneNumber ); } void Addressee::removePhoneNumber( const PhoneNumber &phoneNumber ) { detach(); PhoneNumber::List::Iterator it; for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { if ( (*it).id() == phoneNumber.id() ) { mData->phoneNumbers.remove( it ); return; } } } PhoneNumber Addressee::phoneNumber( int type ) const { PhoneNumber phoneNumber( "", type ); PhoneNumber::List::ConstIterator it; for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { if ( matchBinaryPattern( (*it).type(), type ) ) { if ( (*it).type() & PhoneNumber::Pref ) return (*it); else if ( phoneNumber.number().isEmpty() ) phoneNumber = (*it); } } return phoneNumber; } PhoneNumber::List Addressee::phoneNumbers() const { return mData->phoneNumbers; } PhoneNumber::List Addressee::phoneNumbers( int type ) const { PhoneNumber::List list; PhoneNumber::List::ConstIterator it; for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { if ( matchBinaryPattern( (*it).type(), type ) ) { list.append( *it ); } } return list; } PhoneNumber Addressee::findPhoneNumber( const QString &id ) const { PhoneNumber::List::ConstIterator it; for( it = mData->phoneNumbers.begin(); it != mData->phoneNumbers.end(); ++it ) { if ( (*it).id() == id ) { return *it; } } return PhoneNumber(); } void Addressee::insertKey( const Key &key ) { detach(); mData->empty = false; Key::List::Iterator it; for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { if ( (*it).id() == key.id() ) { *it = key; return; } } mData->keys.append( key ); } void Addressee::removeKey( const Key &key ) { detach(); Key::List::Iterator it; for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { if ( (*it).id() == key.id() ) { mData->keys.remove( key ); return; } } } Key Addressee::key( int type, QString customTypeString ) const { Key::List::ConstIterator it; for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { if ( (*it).type() == type ) { if ( type == Key::Custom ) { if ( customTypeString.isEmpty() ) { return *it; } else { if ( (*it).customTypeString() == customTypeString ) return (*it); } } else { return *it; } } } return Key( QString(), type ); } void Addressee::setKeys( const Key::List& list ) { detach(); mData->keys = list; } Key::List Addressee::keys() const { return mData->keys; } Key::List Addressee::keys( int type, QString customTypeString ) const { Key::List list; Key::List::ConstIterator it; for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { if ( (*it).type() == type ) { if ( type == Key::Custom ) { if ( customTypeString.isEmpty() ) { list.append(*it); } else { if ( (*it).customTypeString() == customTypeString ) list.append(*it); } } else { list.append(*it); } } } return list; } Key Addressee::findKey( const QString &id ) const { Key::List::ConstIterator it; for( it = mData->keys.begin(); it != mData->keys.end(); ++it ) { if ( (*it).id() == id ) { return *it; } } return Key(); } QString Addressee::asString() const { return "Smith, agent Smith..."; } void Addressee::dump() const { return; kdDebug(5700) << "Addressee {" << endl; kdDebug(5700) << " Uid: '" << uid() << "'" << endl; kdDebug(5700) << " Name: '" << name() << "'" << endl; kdDebug(5700) << " FormattedName: '" << formattedName() << "'" << endl; kdDebug(5700) << " FamilyName: '" << familyName() << "'" << endl; kdDebug(5700) << " GivenName: '" << givenName() << "'" << endl; kdDebug(5700) << " AdditionalName: '" << additionalName() << "'" << endl; kdDebug(5700) << " Prefix: '" << prefix() << "'" << endl; kdDebug(5700) << " Suffix: '" << suffix() << "'" << endl; kdDebug(5700) << " NickName: '" << nickName() << "'" << endl; kdDebug(5700) << " Birthday: '" << birthday().toString() << "'" << endl; kdDebug(5700) << " Mailer: '" << mailer() << "'" << endl; kdDebug(5700) << " TimeZone: '" << timeZone().asString() << "'" << endl; kdDebug(5700) << " Geo: '" << geo().asString() << "'" << endl; kdDebug(5700) << " Title: '" << title() << "'" << endl; kdDebug(5700) << " Role: '" << role() << "'" << endl; kdDebug(5700) << " Organization: '" << organization() << "'" << endl; kdDebug(5700) << " Note: '" << note() << "'" << endl; kdDebug(5700) << " ProductId: '" << productId() << "'" << endl; kdDebug(5700) << " Revision: '" << revision().toString() << "'" << endl; kdDebug(5700) << " SortString: '" << sortString() << "'" << endl; kdDebug(5700) << " Url: '" << url().url() << "'" << endl; kdDebug(5700) << " Secrecy: '" << secrecy().asString() << "'" << endl; kdDebug(5700) << " Logo: '" << logo().asString() << "'" << endl; kdDebug(5700) << " Photo: '" << photo().asString() << "'" << endl; kdDebug(5700) << " Sound: '" << sound().asString() << "'" << endl; kdDebug(5700) << " Agent: '" << agent().asString() << "'" << endl; kdDebug(5700) << " Emails {" << endl; QStringList e = emails(); QStringList::ConstIterator it; for( it = e.begin(); it != e.end(); ++it ) { kdDebug(5700) << " " << (*it) << endl; } kdDebug(5700) << " }" << endl; kdDebug(5700) << " PhoneNumbers {" << endl; PhoneNumber::List p = phoneNumbers(); PhoneNumber::List::ConstIterator it2; for( it2 = p.begin(); it2 != p.end(); ++it2 ) { kdDebug(5700) << " Type: " << int((*it2).type()) << " Number: " << (*it2).number() << endl; } kdDebug(5700) << " }" << endl; Address::List a = addresses(); Address::List::ConstIterator it3; for( it3 = a.begin(); it3 != a.end(); ++it3 ) { (*it3).dump(); } kdDebug(5700) << " Keys {" << endl; Key::List k = keys(); Key::List::ConstIterator it4; for( it4 = k.begin(); it4 != k.end(); ++it4 ) { kdDebug(5700) << " Type: " << int((*it4).type()) << " Key: " << (*it4).textData() << " CustomString: " << (*it4).customTypeString() << endl; } kdDebug(5700) << " }" << endl; kdDebug(5700) << "}" << endl; } void Addressee::insertAddress( const Address &address ) { detach(); mData->empty = false; Address::List::Iterator it; for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { if ( (*it).id() == address.id() ) { *it = address; return; } } mData->addresses.append( address ); } void Addressee::removeAddress( const Address &address ) { detach(); Address::List::Iterator it; for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { if ( (*it).id() == address.id() ) { mData->addresses.remove( it ); return; } } } Address Addressee::address( int type ) const { Address address( type ); Address::List::ConstIterator it; for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { if ( matchBinaryPattern( (*it).type(), type ) ) { if ( (*it).type() & Address::Pref ) return (*it); else if ( address.isEmpty() ) address = (*it); } } return address; } Address::List Addressee::addresses() const { return mData->addresses; } Address::List Addressee::addresses( int type ) const { Address::List list; Address::List::ConstIterator it; for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { if ( matchBinaryPattern( (*it).type(), type ) ) { list.append( *it ); } } return list; } Address Addressee::findAddress( const QString &id ) const { Address::List::ConstIterator it; for( it = mData->addresses.begin(); it != mData->addresses.end(); ++it ) { if ( (*it).id() == id ) { return *it; } } return Address(); } void Addressee::insertCategory( const QString &c ) { detach(); mData->empty = false; if ( mData->categories.contains( c ) ) return; mData->categories.append( c ); } void Addressee::removeCategory( const QString &c ) { detach(); QStringList::Iterator it = mData->categories.find( c ); if ( it == mData->categories.end() ) return; mData->categories.remove( it ); } bool Addressee::hasCategory( const QString &c ) const { return ( mData->categories.contains( c ) ); } void Addressee::setCategories( const QStringList &c ) { detach(); mData->empty = false; mData->categories = c; } QStringList Addressee::categories() const { return mData->categories; } void Addressee::insertCustom( const QString &app, const QString &name, const QString &value ) { if ( value.isNull() || name.isEmpty() || app.isEmpty() ) return; detach(); mData->empty = false; QString qualifiedName = app + "-" + name + ":"; QStringList::Iterator it; for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) { if ( (*it).startsWith( qualifiedName ) ) { (*it) = qualifiedName + value; return; } } mData->custom.append( qualifiedName + value ); } void Addressee::removeCustom( const QString &app, const QString &name) { detach(); QString qualifiedName = app + "-" + name + ":"; QStringList::Iterator it; for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) { if ( (*it).startsWith( qualifiedName ) ) { mData->custom.remove( it ); return; } } } QString Addressee::custom( const QString &app, const QString &name ) const { QString qualifiedName = app + "-" + name + ":"; QString value; QStringList::ConstIterator it; for( it = mData->custom.begin(); it != mData->custom.end(); ++it ) { if ( (*it).startsWith( qualifiedName ) ) { value = (*it).mid( (*it).find( ":" ) + 1 ); break; } } return value; } void Addressee::setCustoms( const QStringList &l ) { detach(); mData->empty = false; mData->custom = l; } QStringList Addressee::customs() const { return mData->custom; } void Addressee::parseEmailAddress( const QString &rawEmail, QString &fullName, QString &email) { int startPos, endPos, len; QString partA, partB, result; char endCh = '>'; startPos = rawEmail.find('<'); if (startPos < 0) { startPos = rawEmail.find('('); endCh = ')'; } if (startPos < 0) { // We couldn't find any separators, so we assume the whole string // is the email address email = rawEmail; fullName = ""; } else { // We have a start position, try to find an end endPos = rawEmail.find(endCh, startPos+1); if (endPos < 0) { // We couldn't find the end of the email address. We can only // assume the entire string is the email address. email = rawEmail; fullName = ""; } else { // We have a start and end to the email address // Grab the name part fullName = rawEmail.left(startPos).stripWhiteSpace(); // grab the email part email = rawEmail.mid(startPos+1, endPos-startPos-1).stripWhiteSpace(); // Check that we do not have any extra characters on the end of the // strings len = fullName.length(); if (fullName[0]=='"' && fullName[len-1]=='"') fullName = fullName.mid(1, len-2); else if (fullName[0]=='<' && fullName[len-1]=='>') fullName = fullName.mid(1, len-2); else if (fullName[0]=='(' && fullName[len-1]==')') fullName = fullName.mid(1, len-2); } } } void Addressee::setResource( Resource *resource ) { detach(); mData->resource = resource; } Resource *Addressee::resource() const { return mData->resource; } //US QString Addressee::resourceLabel() { return i18n("Resource"); } void Addressee::setChanged( bool value ) { detach(); mData->changed = value; } bool Addressee::changed() const { return mData->changed; } QDataStream &KABC::operator<<( QDataStream &s, const Addressee &a ) { if (!a.mData) return s; s << a.uid(); s << a.mData->name; s << a.mData->formattedName; s << a.mData->familyName; s << a.mData->givenName; s << a.mData->additionalName; s << a.mData->prefix; s << a.mData->suffix; s << a.mData->nickName; s << a.mData->birthday; s << a.mData->mailer; s << a.mData->timeZone; s << a.mData->geo; s << a.mData->title; s << a.mData->role; s << a.mData->organization; s << a.mData->note; s << a.mData->productId; s << a.mData->revision; s << a.mData->sortString; s << a.mData->url; s << a.mData->secrecy; s << a.mData->logo; s << a.mData->photo; s << a.mData->sound; s << a.mData->agent; s << a.mData->phoneNumbers; s << a.mData->addresses; s << a.mData->emails; s << a.mData->categories; s << a.mData->custom; s << a.mData->keys; return s; } QDataStream &KABC::operator>>( QDataStream &s, Addressee &a ) { if (!a.mData) return s; s >> a.mData->uid; s >> a.mData->name; s >> a.mData->formattedName; s >> a.mData->familyName; s >> a.mData->givenName; s >> a.mData->additionalName; s >> a.mData->prefix; s >> a.mData->suffix; s >> a.mData->nickName; s >> a.mData->birthday; s >> a.mData->mailer; s >> a.mData->timeZone; s >> a.mData->geo; s >> a.mData->title; s >> a.mData->role; s >> a.mData->organization; s >> a.mData->note; s >> a.mData->productId; s >> a.mData->revision; s >> a.mData->sortString; s >> a.mData->url; s >> a.mData->secrecy; s >> a.mData->logo; s >> a.mData->photo; s >> a.mData->sound; |