/* * This file is part of the scalix resource. * * Copyright (C) 2007 Trolltech ASA. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #include #include #include #include "contact.h" using namespace Scalix; static TQMap *s_distListMap = 0; static KStaticDeleter< TQMap > sd; static TQString custom( const TQString &name, const KABC::Addressee &addr, const TQString &defaultValue = TQString() ) { const TQString value = addr.custom( "Scalix", name ); if ( value.isEmpty() ) return defaultValue; else return value; } static void setCustom( const TQString &name, const TQString &value, KABC::Addressee &addr ) { addr.insertCustom( "Scalix", name, value ); } TQString Contact::toXml( const KABC::Addressee &addr ) { /** * Handle distribution lists. */ if ( KPIM::DistributionList::isDistributionList( addr ) ) { if ( s_distListMap ) return (*s_distListMap)[ addr.uid() ]; else return TQString(); } /** * Handle normal contacts. */ TQString xml; xml += "\n"; xml += "\n"; xml += "" + addr.uid() + "\n"; xml += "" + custom( "sensitivity", addr, "0" ) + "\n"; xml += "IPM.Contact\n"; xml += "" + custom( "is_recurring", addr, "false" ) + "\n"; xml += "" + custom( "reminder_set", addr, "false" ) + "\n"; xml += "" + custom( "send_rich_info", addr, "false" ) + "\n"; xml += "" + addr.formattedName() + "\n"; xml += "" + addr.revision().toString( Qt::ISODate ) + "\n"; xml += "" + addr.prefix() + "\n"; xml += "" + addr.givenName() + "\n"; xml += "" + addr.additionalName() + "\n"; xml += "" + addr.familyName() + "\n"; xml += "" + addr.suffix() + "\n"; xml += "" + addr.assembledName() + "\n"; xml += "" + addr.formattedName() + "\n"; xml += "" + addr.nickName() + "\n"; xml += "" + addr.url().url() + "\n"; xml += "" + addr.organization() + "\n"; xml += "" + addr.title() + "\n"; TQStringList emails = addr.emails(); for ( uint i = 0; i < 3; ++i ) { TQString type, address, comment, display; if ( i < emails.count() ) { type = "SMTP"; address = emails[ i ]; /** * If the contact was created by kontact use the email address as * display name and the formatted name as comment, otherwise we use * the values from the server. */ if ( custom( "comes_from_scalix", addr ) != "true" ) { comment = addr.formattedName(); display = emails[ i ]; } else { comment = custom( TQString( "email%1_address_with_comment" ).tqarg( i + 1 ), addr ); display = custom( TQString( "email%1_display_name" ).tqarg( i + 1 ), addr ); } } xml += TQString( "" ).tqarg( i + 1 ) + type + TQString( "" ).tqarg( i + 1 ) +"\n"; xml += TQString( "" ).tqarg( i + 1 ) + address + TQString( "" ).tqarg( i + 1 ) +"\n"; xml += TQString( "" ).tqarg( i + 1 ) + comment + TQString( "" ).tqarg( i + 1 ) + "\n"; xml += TQString( "" ).tqarg( i + 1 ) + display + TQString( "" ).tqarg( i + 1 ) + "\n"; } KABC::PhoneNumber phone = addr.phoneNumber( KABC::PhoneNumber::Home ); xml += "" + phone.number() + "\n"; phone = addr.phoneNumber( KABC::PhoneNumber::Work ); xml += "" + phone.number() + "\n"; phone = addr.phoneNumber( KABC::PhoneNumber::Work | KABC::PhoneNumber::Fax ); xml += "" + phone.number() + "\n"; phone = addr.phoneNumber( KABC::PhoneNumber::Cell ); xml += "" + phone.number() + "\n"; const KABC::Address workAddress = addr.address( KABC::Address::Work ); xml += "" + workAddress.street() + "\n"; xml += "" + workAddress.postalCode() + "\n"; xml += "" + workAddress.locality() + "\n"; xml += "" + workAddress.region() + "\n"; xml += "" + workAddress.country() + "\n"; const KABC::Address homeAddress = addr.address( KABC::Address::Home ); xml += "" + homeAddress.street() + "\n"; xml += "" + homeAddress.postalCode() + "\n"; xml += "" + homeAddress.locality() + "\n"; xml += "" + homeAddress.region() + "\n"; xml += "" + homeAddress.country() + "\n"; const KABC::Address otherAddress = addr.address( KABC::Address::Dom ); xml += "" + otherAddress.street() + "\n"; xml += "" + otherAddress.postalCode() + "\n"; xml += "" + otherAddress.locality() + "\n"; xml += "" + otherAddress.region() + "\n"; xml += "" + otherAddress.country() + "\n"; if ( homeAddress.type() & KABC::Address::Pref ) xml += "1\n"; else if ( workAddress.type() & KABC::Address::Pref ) xml += "2\n"; else if ( otherAddress.type() & KABC::Address::Pref ) xml += "3\n"; xml += "" + addr.custom( "KADDRESSBOOK", "X-IMAddress" ) + "\n"; xml += "" + addr.custom( "KADDRESSBOOK", "X-ManagersName" ) + "\n"; xml += "" + addr.custom( "KADDRESSBOOK", "X-Department" ) + "\n"; xml += "" + addr.custom( "KADDRESSBOOK", "X-AssistantsName" ) + "\n"; xml += "" + addr.custom( "KADDRESSBOOK", "X-Profession" ) + "\n"; xml += "" + addr.custom( "KADDRESSBOOK", "X-Office" ) + "\n"; xml += "" + addr.custom( "KADDRESSBOOK", "X-SpousesName" ) + "\n"; xml += "" + addr.birthday().toString( Qt::ISODate ) + "\n"; xml += "" + addr.custom( "KADDRESSBOOK", "X-Anniversary" ) + "\n"; xml += "" + custom( "mapi_charset", addr, "UTF8" ) + ""; xml += "\n"; return xml; } KABC::Addressee Contact::fromXml( const TQString &xml ) { TQDomDocument document; TQString errorMsg; int errorLine, errorColumn; if ( !document.setContent( xml, true, &errorMsg, &errorLine, &errorColumn ) ) { qDebug( "Error parsing XML in Scalix::Contact::fromXml: %s (%d,%d)", errorMsg.latin1(), errorLine, errorColumn ); return KABC::Addressee(); } TQDomElement contactElement = document.documentElement(); if ( contactElement.tagName() != "contact" ) { if ( contactElement.tagName() == "distlist" ) { const TQDomNodeList names = contactElement.elementsByTagName( "display_name" ); const TQString listName = ( names.count() == 1 ? names.item( 0 ).toElement().text() : "Scalix Dummy List" ); /** * As we can't provide distribution list functionality we store the entry * here and return it on save. */ KPIM::DistributionList list; list.setName( listName ); if ( !s_distListMap ) sd.setObject( s_distListMap, new TQMap() ); s_distListMap->insert( list.uid(), xml ); return list; } else { qDebug( "Error interpreting XML in Scalix::Contact::fromXml: no 'contact' or 'distlist' tag found" ); return KABC::Addressee(); } } TQString emails[ 3 ]; KABC::Address homeAddress( KABC::Address::Home ); KABC::Address workAddress( KABC::Address::Work ); KABC::Address otherAddress( KABC::Address::Dom ); KABC::Addressee addr; setCustom( "comes_from_scalix", "true", addr ); TQDomNode node = contactElement.firstChild(); while ( !node.isNull() ) { TQDomElement element = node.toElement(); if ( !element.isNull() ) { if ( element.tagName() == "direct_ref" ) addr.setUid( element.text() ); else if ( element.tagName() == "sensitivity" ) setCustom( "sensitivity", element.text(), addr ); else if ( element.tagName() == "is_recurring" ) setCustom( "is_recurring", element.text(), addr ); else if ( element.tagName() == "reminder_set" ) setCustom( "reminder_set", element.text(), addr ); else if ( element.tagName() == "send_rich_info" ) setCustom( "send_rich_info", element.text(), addr ); else if ( element.tagName() == "last_modification_time" ) addr.setRevision( TQDateTime::fromString( element.text(), Qt::ISODate ) ); // name else if ( element.tagName() == "display_name_prefix" ) addr.setPrefix( element.text() ); else if ( element.tagName() == "first_name" ) addr.setGivenName( element.text() ); else if ( element.tagName() == "middle_name" ) addr.setAdditionalName( element.text() ); else if ( element.tagName() == "last_name" ) addr.setFamilyName( element.text() ); else if ( element.tagName() == "suffix" ) addr.setSuffix( element.text() ); else if ( element.tagName() == "file_as" ) addr.setFormattedName( element.text() ); else if ( element.tagName() == "nickname" ) addr.setNickName( element.text() ); // job else if ( element.tagName() == "web_page_address" ) addr.setUrl( element.text() ); else if ( element.tagName() == "company_name" ) addr.setOrganization( element.text() ); else if ( element.tagName() == "job_title" ) addr.setTitle( element.text() ); // emails else if ( element.tagName().startsWith( "email" ) ) { if ( element.tagName() == "email1_address" ) emails[ 0 ] = element.text(); else if ( element.tagName() == "email2_address" ) emails[ 1 ] = element.text(); else if ( element.tagName() == "email3_address" ) emails[ 2 ] = element.text(); else setCustom( element.tagName(), element.text(), addr ); } // phone numbers else if ( element.tagName() == "home_phone_number" ) addr.insertPhoneNumber( KABC::PhoneNumber( element.text(), KABC::PhoneNumber::Home ) ); else if ( element.tagName() == "work_phone_number" ) addr.insertPhoneNumber( KABC::PhoneNumber( element.text(), KABC::PhoneNumber::Work ) ); else if ( element.tagName() == "work_fax_number" ) addr.insertPhoneNumber( KABC::PhoneNumber( element.text(), KABC::PhoneNumber::Work | KABC::PhoneNumber::Fax ) ); else if ( element.tagName() == "mobile_phone_number" ) addr.insertPhoneNumber( KABC::PhoneNumber( element.text(), KABC::PhoneNumber::Cell ) ); // address (work) else if ( element.tagName() == "work_address_street" ) workAddress.setStreet( element.text() ); else if ( element.tagName() == "work_address_zip" ) workAddress.setPostalCode( element.text() ); else if ( element.tagName() == "work_address_city" ) workAddress.setLocality( element.text() ); else if ( element.tagName() == "work_address_state" ) workAddress.setRegion( element.text() ); else if ( element.tagName() == "work_address_country" ) workAddress.setCountry( element.text() ); // address (home) else if ( element.tagName() == "home_address_street" ) homeAddress.setStreet( element.text() ); else if ( element.tagName() == "home_address_zip" ) homeAddress.setPostalCode( element.text() ); else if ( element.tagName() == "home_address_city" ) homeAddress.setLocality( element.text() ); else if ( element.tagName() == "home_address_state" ) homeAddress.setRegion( element.text() ); else if ( element.tagName() == "home_address_country" ) homeAddress.setCountry( element.text() ); // address (other) else if ( element.tagName() == "other_address_street" ) otherAddress.setStreet( element.text() ); else if ( element.tagName() == "other_address_zip" ) otherAddress.setPostalCode( element.text() ); else if ( element.tagName() == "other_address_city" ) otherAddress.setLocality( element.text() ); else if ( element.tagName() == "other_address_state" ) otherAddress.setRegion( element.text() ); else if ( element.tagName() == "other_address_country" ) otherAddress.setCountry( element.text() ); else if ( element.tagName() == "selected_mailing_address" ) switch ( element.text().toInt() ) { case 1: homeAddress.setType( homeAddress.type() | KABC::Address::Pref ); break; case 2: workAddress.setType( workAddress.type() | KABC::Address::Pref ); break; case 3: otherAddress.setType( otherAddress.type() | KABC::Address::Pref ); break; default: Q_ASSERT( !"Unknown selected_mailing_address enum" ); break; } // misc else if ( element.tagName() == "im_address" ) addr.insertCustom( "KADDRESSBOOK", "X-IMAddress", element.text() ); else if ( element.tagName() == "manager" ) addr.insertCustom( "KADDRESSBOOK", "X-ManagersName", element.text() ); else if ( element.tagName() == "department" ) addr.insertCustom( "KADDRESSBOOK", "X-Department", element.text() ); else if ( element.tagName() == "assistant" ) addr.insertCustom( "KADDRESSBOOK", "X-AssistantsName", element.text() ); else if ( element.tagName() == "profession" ) addr.insertCustom( "KADDRESSBOOK", "X-Profession", element.text() ); else if ( element.tagName() == "office_location" ) addr.insertCustom( "KADDRESSBOOK", "X-Office", element.text() ); else if ( element.tagName() == "spouse" ) addr.insertCustom( "KADDRESSBOOK", "X-SpousesName", element.text() ); else if ( element.tagName() == "bday" ) addr.setBirthday( TQDateTime::fromString( element.text(), Qt::ISODate ) ); else if ( element.tagName() == "anniversary" ) addr.insertCustom( "KADDRESSBOOK", "X-Anniversary", element.text() ); else setCustom( element.tagName(), element.text(), addr ); } node = node.nextSibling(); } for ( int i = 0; i < 3; ++i ) if ( !emails[ i ].isEmpty() ) addr.insertEmail( emails[ i ] ); if ( !homeAddress.isEmpty() ) addr.insertAddress( homeAddress ); if ( !workAddress.isEmpty() ) addr.insertAddress( workAddress ); if ( !otherAddress.isEmpty() ) addr.insertAddress( otherAddress ); return addr; }