diff options
Diffstat (limited to 'kresources/groupwise/soap/contactconverter.cpp')
-rw-r--r-- | kresources/groupwise/soap/contactconverter.cpp | 632 |
1 files changed, 632 insertions, 0 deletions
diff --git a/kresources/groupwise/soap/contactconverter.cpp b/kresources/groupwise/soap/contactconverter.cpp new file mode 100644 index 000000000..a971e56a1 --- /dev/null +++ b/kresources/groupwise/soap/contactconverter.cpp @@ -0,0 +1,632 @@ +/* + This file is part of kdepim. + Copyright (c) 2004 Tobias Koenig <tokoe@kde.org> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "contactconverter.h" + +#include <kdebug.h> +#include <klocale.h> + +ContactConverter::ContactConverter( struct soap* soap ) + : GWConverter( soap ) +{ +} + +ngwt__Contact* ContactConverter::convertToContact( const KABC::Addressee &addr ) +{ + if ( addr.isEmpty() ) + return 0; + + ngwt__Contact* contact = soap_new_ngwt__Contact( soap(), -1 ); + + // ngwt__Contact + contact->fullName = 0; + contact->emailList = 0; + contact->imList = 0; + contact->addressList = 0; + contact->officeInfo = 0; + contact->personalInfo = 0; + contact->referenceInfo = 0; + // ngwt__AddressBookItem + contact->uuid = 0; + contact->comment = 0; + contact->sync = 0; + contact->domain = 0; + contact->postOffice = 0; + contact->distinguishedName = 0; + contact->userid = 0; + // ngwt__ContainerItem + contact->categories = 0; + contact->created = 0; + contact->customs = 0; + // ngwt__contact + contact->id = 0; + contact->name = 0; + contact->version = 0; + contact->modified = 0; + contact->changes = 0; + + // Uid + contact->id = qStringToString( addr.custom( "GWRESOURCE", "UID" ) ); + + // Container + if ( !addr.custom( "GWRESOURCE", "CONTAINER" ).isEmpty() ) { + std::vector<ngwt__ContainerRef*>* container = soap_new_std__vectorTemplateOfPointerTongwt__ContainerRef( soap(), -1 ); + ngwt__ContainerRef* containerRef = soap_new_ngwt__ContainerRef( soap(), -1 ); + containerRef->deleted = 0; + containerRef->__item = addr.custom( "GWRESOURCE", "CONTAINER" ).utf8(); + container->push_back( containerRef ); + + contact->container = *container; + } + + // Name parts + ngwt__FullName* fullName = soap_new_ngwt__FullName( soap(), -1 ); + fullName->displayName = 0; + fullName->namePrefix = 0; + fullName->firstName = 0; + fullName->middleName = 0; + fullName->lastName = 0; + fullName->nameSuffix = 0; + + if ( !addr.formattedName().isEmpty() ) + fullName->displayName = qStringToString( addr.formattedName() ); + + if ( !addr.prefix().isEmpty() ) + fullName->namePrefix = qStringToString( addr.prefix() ); + + if ( !addr.givenName().isEmpty() ) + fullName->firstName = qStringToString( addr.givenName() ); + + if ( !addr.additionalName().isEmpty() ) + fullName->middleName = qStringToString( addr.additionalName() ); + + if ( !addr.familyName().isEmpty() ) + fullName->lastName = qStringToString( addr.familyName() ); + + if ( !addr.suffix().isEmpty() ) + fullName->nameSuffix = qStringToString( addr.suffix() ); + + contact->fullName = fullName; + + // Emails + if ( !addr.emails().isEmpty() ) { + ngwt__EmailAddressList* emailList = soap_new_ngwt__EmailAddressList( soap(), -1 ); + std::vector<std::string>* list = soap_new_std__vectorTemplateOfstd__string( soap(), -1 ); + + QStringList emails = addr.emails(); + emailList->primary = qStringToString( emails.first() ); + + QStringList::Iterator it; + for ( it = emails.begin(); it != emails.end(); ++it ) + list->push_back( std::string( (*it).utf8() ) ); + + emailList->email = *list; + contact->emailList = emailList; + } else + contact->emailList = 0; + + // Phone numbers + if ( !addr.phoneNumbers().isEmpty() ) { + ngwt__PhoneList* phoneList = soap_new_ngwt__PhoneList( soap(), -1 ); + phoneList->default_ = 0; + std::vector<class ngwt__PhoneNumber*> *list = soap_new_std__vectorTemplateOfPointerTongwt__PhoneNumber( soap(), -1 ); + + KABC::PhoneNumber::List phones = addr.phoneNumbers(); + KABC::PhoneNumber::List::Iterator it; + for ( it = phones.begin(); it != phones.end(); ++it ) { + ngwt__PhoneNumber* number = convertPhoneNumber( *it ); + if ( number ) { + list->push_back( number ); + + // if preferred number assign it + if ( (*it).type() & KABC::PhoneNumber::Pref ) + phoneList->default_ = qStringToString( (*it).number() ); + } + } + + phoneList->phone = *list; + contact->phoneList = phoneList; + } else + contact->phoneList = 0; + + // Addresses + if ( !addr.addresses().isEmpty() ) { + ngwt__PostalAddressList* addressList = soap_new_ngwt__PostalAddressList( soap(), -1 ); + std::vector<class ngwt__PostalAddress*> *list = soap_new_std__vectorTemplateOfPointerTongwt__PostalAddress( soap(), -1 ); + + KABC::Address::List addresses = addr.addresses(); + KABC::Address::List::Iterator it; + for ( it = addresses.begin(); it != addresses.end(); ++it ) { + ngwt__PostalAddress* address = convertPostalAddress( *it ); + if ( address ) + list->push_back( address ); + } + + addressList->address = *list; + contact->addressList = addressList; + } else + contact->addressList = 0; + + // IM addresses + { + contact->imList = convertImAddresses( addr ); + } + + // Office information + { + ngwt__OfficeInfo* info = soap_new_ngwt__OfficeInfo( soap(), -1 ); + + // TODO: write back organization? + + if ( !addr.custom( "KADDRESSBOOK", "X-Department" ).isEmpty() ) + info->department = qStringToString( addr.custom( "KADDRESSBOOK", "X-Department" ) ); + else + info->department = 0; + + if ( !addr.title().isEmpty() ) + info->title = qStringToString( addr.title() ); + else + info->title = 0; + + if ( !addr.url().isEmpty() ) + info->website = qStringToString( addr.url().url() ); + else + info->website = 0; + + info->organization = 0; + + contact->officeInfo = info; + } + + // Personal information + { + ngwt__PersonalInfo* info = soap_new_ngwt__PersonalInfo( soap(), -1 ); + + if ( addr.birthday().isValid() ) + info->birthday = qDateToString( addr.birthday().date() ); + else + info->birthday = 0; + + // don't write back the web site here, otherwise we'll have it twice + info->website = 0; + + contact->personalInfo = info; + } + + return contact; +} + +KABC::Addressee ContactConverter::convertFromAddressBookItem( ngwt__AddressBookItem * addrBkItem ) +{ + //kdDebug() << "ContactConverter::convertFromAddressBookItem()" << endl; + KABC::Addressee addr; + if ( !addrBkItem ) + { + kdDebug() << "Null AddressBookItem, bailing out!" << endl; + return addr; + } + // gwt:Item + addr.insertCustom( "GWRESOURCE", "UID", stringToQString( addrBkItem->id ) ); + addr.setFormattedName( stringToQString( addrBkItem->name ) ); + // gwt::AddressBookItem + addr.insertCustom( "GWRESOURCE", "UUID", stringToQString( addrBkItem->uuid ) ); + addr.setNote( stringToQString( addrBkItem->comment ) ); + + return addr; +} + +KABC::Addressee ContactConverter::convertFromResource( ngwt__Resource* resource ) +{ + //kdDebug() << "ContactConverter::convertFromResource()" << endl; + KABC::Addressee addr = convertFromAddressBookItem( resource ); + if ( !resource ) + { + kdDebug() << "Null Resource, bailing out!" << endl; + return addr; + } + if ( resource->phone ) + addr.insertPhoneNumber( KABC::PhoneNumber( stringToQString( resource->phone ), KABC::PhoneNumber::Work ) ); + if ( resource->email ) + addr.insertEmail( stringToQString( resource->email ), true ); + if ( resource->owner ) + addr.insertCustom( "KADDRESSBOOK", "X-ManagersName", stringToQString( resource->owner->__item ) ); + + addr.insertCategory( i18n( "Resource" ) ); + return addr; +} + +KABC::Addressee ContactConverter::convertFromGroup( ngwt__Group* group) +{ +// kdDebug() << "ContactConverter::convertFromGroup()" << endl; + KABC::Addressee addr = convertFromAddressBookItem( group ); + if ( !group ) + { + kdDebug() << "Null Resource, bailing out!" << endl; + return addr; + } + addr.insertCategory( i18n( "Group" ) ); + return addr; +} + +KABC::Addressee ContactConverter::convertFromContact( ngwt__Contact* contact ) +{ +// kdDebug() << "ContactConverter::convertFromContact()" << endl; + + KABC::Addressee addr = convertFromAddressBookItem( contact ); + + if ( !contact ) + { + kdDebug() << "Null Contact, bailing out!" << endl; + return addr; + } + + // Name parts + ngwt__FullName* fullName = contact->fullName; + + if ( fullName ) { + if ( fullName->displayName ) + addr.setFormattedName( stringToQString( fullName->displayName ) ); + else + addr.setFormattedName( QString::null ); + + if ( fullName->namePrefix ) + addr.setPrefix( stringToQString( fullName->namePrefix ) ); + + if ( fullName->firstName ) + addr.setGivenName( stringToQString( fullName->firstName ) ); + + if ( fullName->middleName ) + addr.setAdditionalName( stringToQString( fullName->middleName ) ); + + if ( fullName->lastName ) + addr.setFamilyName( stringToQString( fullName->lastName ) ); + + if ( fullName->nameSuffix ) + addr.setSuffix( stringToQString( fullName->nameSuffix ) ); + } + + // Emails + if ( contact->emailList ) { + QStringList emails; + + if ( contact->emailList->primary ) + emails.append( stringToQString( contact->emailList->primary ) ); + + if ( !contact->emailList->email.empty() ) { + std::vector<std::string> list = contact->emailList->email; + std::vector<std::string>::const_iterator it; + for ( it = list.begin(); it != list.end(); ++it ) { + if ( emails.find( stringToQString( *it ) ) == emails.end() ) + emails.append( stringToQString( *it ) ); + } + } + + if ( emails.count() ) + addr.setEmails( emails ); + } + + // Phone numbers + if ( contact->phoneList && !contact->phoneList->phone.empty() ) { + QString defaultNumber = stringToQString( contact->phoneList->default_ ); + + std::vector<class ngwt__PhoneNumber*> list = contact->phoneList->phone; + std::vector<class ngwt__PhoneNumber*>::const_iterator it; + for ( it = list.begin(); it != list.end(); ++it ) { + KABC::PhoneNumber phone = convertPhoneNumber( *it ); + if ( !phone.number().isEmpty() ) { + if ( phone.number() == defaultNumber ) + phone.setType( phone.type() | KABC::PhoneNumber::Pref ); + addr.insertPhoneNumber( phone ); + } + } + } + + // Addresses + if ( contact->addressList && !contact->addressList->address.empty() ) { + std::vector<class ngwt__PostalAddress*> list = contact->addressList->address; + std::vector<class ngwt__PostalAddress*>::const_iterator it; + for ( it = list.begin(); it != list.end(); ++it ) { + KABC::Address address = convertPostalAddress( *it ); + if ( !address.isEmpty() ) + addr.insertAddress( address ); + } + } + + // Office information + if ( contact->officeInfo ) { + ngwt__OfficeInfo* info = contact->officeInfo; + + if ( info->organization ) + addr.setOrganization( stringToQString( info->organization->__item ) ); + + if ( info->department ) + addr.insertCustom( "KADDRESSBOOK", "X-Department", stringToQString( info->department ) ); + + if ( info->title ) + addr.setTitle( stringToQString( info->title ) ); + + if ( info->website ) + addr.setUrl( KURL( stringToQString( info->website ) ) ); + } + + // Personal information + if ( contact->personalInfo ) { + ngwt__PersonalInfo* info = contact->personalInfo; + + if ( info->birthday ) { + QDate date = stringToQDate( info->birthday ); + if ( date.isValid() ) + addr.setBirthday( date ); + } + + if ( info->website ) // we might overwrite the office info website here... :( + addr.setUrl( KURL( stringToQString( info->website ) ) ); + } + + // IM addresses + if ( contact->imList ) { + // put all the im addresses on the same service into the same qstringlist + QMap<QString, QStringList> addressMap; + std::vector<ngwt__ImAddress*> list = contact->imList->im; + std::vector<ngwt__ImAddress*>::const_iterator it; + for ( it = list.begin(); it != list.end(); ++it ) { + QStringList addressesForService = addressMap[ stringToQString( (*it)->service ) ]; + addressesForService.append( stringToQString( (*it)->address ) ); + addressMap.insert( stringToQString( (*it)->service ), addressesForService ); + } + + // then construct a custom field from each qstringlist + QMap<QString, QStringList>::Iterator addrIt; + for ( addrIt = addressMap.begin(); addrIt != addressMap.end(); ++addrIt ) + { + QString protocol = addrIt.key(); + QStringList addresses = addrIt.data(); + //kdDebug() << "got IM addresses for '" << protocol << "' : " << addresses << endl; + // TODO: map protocol to KDE's set of known protocol names (need to know the set of services in use elsewhere) + if ( protocol == "nov" ) + protocol = "groupwise"; + addr.insertCustom( QString::fromLatin1("messaging/%1").arg( protocol ), + QString::fromLatin1( "All" ), + addresses.join( QChar( 0xE000 ) ) ); + } + } + + // addressbook delta sync info + if ( contact->sync ) + { + if ( *contact->sync == add ) + addr.insertCustom( "GWRESOURCE", "SYNC", "ADD" ); + else if ( *contact->sync == delete_ ) + addr.insertCustom( "GWRESOURCE", "SYNC", "DEL" ); + else if ( *contact->sync == update ) + addr.insertCustom( "GWRESOURCE", "SYNC", "UPD" ); + } + //kdDebug() << "Got the following addressee: " << endl; + //addr.dump(); + //kdDebug() << "Customs are: " << addr.customs() << endl; + + return addr; +} + +KABC::PhoneNumber ContactConverter::convertPhoneNumber( ngwt__PhoneNumber *phone ) const +{ + KABC::PhoneNumber phoneNumber; + + if ( !phone ) + return phoneNumber; + + phoneNumber.setNumber( stringToQString( phone->__item ) ); + if ( phone->type == Fax ) { + phoneNumber.setType( KABC::PhoneNumber::Fax ); + } else if ( phone->type == Home ) { + phoneNumber.setType( KABC::PhoneNumber::Home ); + } else if ( phone->type == Mobile ) { + phoneNumber.setType( KABC::PhoneNumber::Cell ); + } else if ( phone->type == Office ) { + phoneNumber.setType( KABC::PhoneNumber::Work ); + } else if ( phone->type == Pager ) { + phoneNumber.setType( KABC::PhoneNumber::Pager ); + } else { + // should never been reached, phone numbers have always a type set... + } + + return phoneNumber; +} + +ngwt__PhoneNumber* ContactConverter::convertPhoneNumber( const KABC::PhoneNumber &number ) const +{ + if ( number.number().isEmpty() ) + return 0; + + ngwt__PhoneNumber* phoneNumber = soap_new_ngwt__PhoneNumber( soap(), -1 ); + phoneNumber->__item = number.number().utf8(); + + if ( number.type() & KABC::PhoneNumber::Fax ) { + phoneNumber->type = Fax; + } else if ( number.type() == KABC::PhoneNumber::Home ) { + phoneNumber->type = Home; + } else if ( number.type() & KABC::PhoneNumber::Cell ) { + phoneNumber->type = Mobile; + } else if ( number.type() == KABC::PhoneNumber::Work ) { + phoneNumber->type = Office; + } else if ( number.type() & KABC::PhoneNumber::Pager ) { + phoneNumber->type = Pager; + } else { + // TODO: cache unsupported types + } + + return phoneNumber; +} + +KABC::Address ContactConverter::convertPostalAddress( ngwt__PostalAddress *addr ) const +{ + KABC::Address address; + + if ( !addr ) + return address; + + if ( addr->streetAddress ) + address.setStreet( stringToQString( addr->streetAddress ) ); + + if ( addr->location ) + address.setExtended( stringToQString( addr->location ) ); + + if ( addr->city ) // isn't city the same like location? + address.setLocality( stringToQString( addr->city ) ); + + if ( addr->state ) + address.setRegion( stringToQString( addr->state ) ); + + if ( addr->postalCode ) + address.setPostalCode( stringToQString( addr->postalCode ) ); + + if ( addr->country ) + address.setCountry( stringToQString( addr->country ) ); + + if ( addr->type == Home_ ) { + address.setType( KABC::Address::Home ); + } else if ( addr->type == Office_ ) { + address.setType( KABC::Address::Work ); + } else { + // should never been reached, addresses have always a type set... + } + + return address; +} + +ngwt__PostalAddress* ContactConverter::convertPostalAddress( const KABC::Address &address ) +{ + if ( address.isEmpty() ) + return 0; + + ngwt__PostalAddress* postalAddress = soap_new_ngwt__PostalAddress( soap(), -1 ); + + postalAddress->description = 0; + + if ( !address.street().isEmpty() ) + postalAddress->streetAddress = qStringToString( address.street() ); + else + postalAddress->streetAddress = 0; + + if ( !address.extended().isEmpty() ) + postalAddress->location = qStringToString( address.extended() ); + else + postalAddress->location = 0; + + if ( !address.locality().isEmpty() ) + postalAddress->city = qStringToString( address.locality() ); + else + postalAddress->city = 0; + + if ( !address.region().isEmpty() ) + postalAddress->state = qStringToString( address.region() ); + else + postalAddress->state = 0; + + if ( !address.postalCode().isEmpty() ) + postalAddress->postalCode = qStringToString( address.postalCode() ); + else + postalAddress->postalCode = 0; + + if ( !address.country().isEmpty() ) + postalAddress->country = qStringToString( address.country() ); + else + postalAddress->country = 0; + + if ( address.type() & KABC::Address::Home ) { + postalAddress->type = Home_; + } else if ( address.type() & KABC::Address::Work ) { + postalAddress->type = Office_; + } else { + // TODO: cache unsupported types + } + + return postalAddress; +} + +ngwt__ImAddressList* ContactConverter::convertImAddresses( const KABC::Addressee& addr ) +{ + //return 0; + /* TODO: use IM address dedicated functions in KDE 4.0. + Change semantics so that convertToContact pulls each + IM address out of the addressee and passes it to this + function, which converts one at a time. */ + kdDebug() << k_funcinfo << endl; + ngwt__ImAddressList* imList = soap_new_ngwt__ImAddressList( soap(), -1 ); + std::vector<class ngwt__ImAddress*> *list = soap_new_std__vectorTemplateOfPointerTongwt__ImAddress( soap(), -1 ); + + // for each custom + // if it contains IM addresses + // extract each one and add it to imList + + const QStringList customs = addr.customs(); + QStringList::ConstIterator it; + bool isSet = false; + for ( it = customs.begin(); it != customs.end(); ++it ) { + QString app, name, value; + splitField( *it, app, name, value ); + + if ( app.startsWith( QString::fromLatin1( "messaging/" ) ) && name == QString::fromLatin1( "All" ) ) { + // get the protocol for this field + QString protocol = app.section( '/', 1, 1 ); + if ( !protocol.isEmpty() ) { + if ( protocol == "groupwise" ) + protocol = "novell"; + QStringList addresses = QStringList::split( QChar( 0xE000 ), value ); + QStringList::iterator end = addresses.end(); + // extract each address for this protocol, and create an ngwt__ImAddress for it, and append it to list. + for ( QStringList::ConstIterator it = addresses.begin(); it != end; ++it ) { + ngwt__ImAddress* address = soap_new_ngwt__ImAddress( soap(), -1 ); + address->service = soap_new_std__string( soap(), -1 ); + address->address = soap_new_std__string( soap(), -1 ); + address->type = soap_new_std__string( soap(), -1 ); + address->service->append( protocol.utf8() ); + address->address->append( (*it).utf8() ); + address->type->append( "all" ); + kdDebug() << "adding: service: " << protocol << " address: " << *it << " type: all" << endl; + list->push_back( address ); + } + } + } + } + imList->im = *list; + if ( list->size() > 0 ) + return imList; + else + { + delete imList; + return 0; + } +} + +void ContactConverter::splitField( const QString &str, QString &app, QString &name, QString &value ) +{ + int colon = str.find( ':' ); + if ( colon != -1 ) { + QString tmp = str.left( colon ); + value = str.mid( colon + 1 ); + + int dash = tmp.find( '-' ); + if ( dash != -1 ) { + app = tmp.left( dash ); + name = tmp.mid( dash + 1 ); + } + } +} |