|
|
|
/*
|
|
|
|
* 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 <tqdom.h>
|
|
|
|
|
|
|
|
#include <libtdepim/distributionlist.h>
|
|
|
|
#include <kstaticdeleter.h>
|
|
|
|
|
|
|
|
#include "contact.h"
|
|
|
|
|
|
|
|
using namespace Scalix;
|
|
|
|
|
|
|
|
static TQMap<TQString, TQString> *s_distListMap = 0;
|
|
|
|
static KStaticDeleter< TQMap<TQString, TQString> > sd;
|
|
|
|
|
|
|
|
static TQString custom( const TQString &name, const TDEABC::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, TDEABC::Addressee &addr )
|
|
|
|
{
|
|
|
|
addr.insertCustom( "Scalix", name, value );
|
|
|
|
}
|
|
|
|
|
|
|
|
TQString Contact::toXml( const TDEABC::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 += "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
|
|
|
|
xml += "<contact>\n";
|
|
|
|
|
|
|
|
xml += "<direct_ref>" + addr.uid() + "</direct_ref>\n";
|
|
|
|
xml += "<sensitivity>" + custom( "sensitivity", addr, "0" ) + "</sensitivity>\n";
|
|
|
|
|
|
|
|
xml += "<message_class>IPM.Contact</message_class>\n";
|
|
|
|
xml += "<is_recurring>" + custom( "is_recurring", addr, "false" ) + "</is_recurring>\n";
|
|
|
|
xml += "<reminder_set>" + custom( "reminder_set", addr, "false" ) + "</reminder_set>\n";
|
|
|
|
xml += "<send_rich_info>" + custom( "send_rich_info", addr, "false" ) + "</send_rich_info>\n";
|
|
|
|
xml += "<subject>" + addr.formattedName() + "</subject>\n";
|
|
|
|
xml += "<last_modification_time>" + addr.revision().toString( Qt::ISODate ) + "</last_modification_time>\n";
|
|
|
|
|
|
|
|
xml += "<display_name_prefix>" + addr.prefix() + "</display_name_prefix>\n";
|
|
|
|
xml += "<first_name>" + addr.givenName() + "</first_name>\n";
|
|
|
|
xml += "<middle_name>" + addr.additionalName() + "</middle_name>\n";
|
|
|
|
xml += "<last_name>" + addr.familyName() + "</last_name>\n";
|
|
|
|
xml += "<suffix>" + addr.suffix() + "</suffix>\n";
|
|
|
|
xml += "<display_name>" + addr.assembledName() + "</display_name>\n";
|
|
|
|
xml += "<file_as>" + addr.formattedName() + "</file_as>\n";
|
|
|
|
xml += "<nickname>" + addr.nickName() + "</nickname>\n";
|
|
|
|
|
|
|
|
xml += "<web_page_address>" + addr.url().url() + "</web_page_address>\n";
|
|
|
|
xml += "<company_name>" + addr.organization() + "</company_name>\n";
|
|
|
|
xml += "<job_title>" + addr.title() + "</job_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" ).arg( i + 1 ), addr );
|
|
|
|
display = custom( TQString( "email%1_display_name" ).arg( i + 1 ), addr );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
xml += TQString( "<email%1_address_type>" ).arg( i + 1 ) + type +
|
|
|
|
TQString( "</email%1_address_type>" ).arg( i + 1 ) +"\n";
|
|
|
|
xml += TQString( "<email%1_address>" ).arg( i + 1 ) + address +
|
|
|
|
TQString( "</email%1_address>" ).arg( i + 1 ) +"\n";
|
|
|
|
xml += TQString( "<email%1_address_with_comment>" ).arg( i + 1 ) + comment +
|
|
|
|
TQString( "</email%1_address_with_comment>" ).arg( i + 1 ) + "\n";
|
|
|
|
xml += TQString( "<email%1_display_name>" ).arg( i + 1 ) + display +
|
|
|
|
TQString( "</email%1_display_name>" ).arg( i + 1 ) + "\n";
|
|
|
|
}
|
|
|
|
|
|
|
|
TDEABC::PhoneNumber phone = addr.phoneNumber( TDEABC::PhoneNumber::Home );
|
|
|
|
xml += "<home_phone_number>" + phone.number() + "</home_phone_number>\n";
|
|
|
|
|
|
|
|
phone = addr.phoneNumber( TDEABC::PhoneNumber::Work );
|
|
|
|
xml += "<work_phone_number>" + phone.number() + "</work_phone_number>\n";
|
|
|
|
|
|
|
|
phone = addr.phoneNumber( TDEABC::PhoneNumber::Work | TDEABC::PhoneNumber::Fax );
|
|
|
|
xml += "<work_fax_number>" + phone.number() + "</work_fax_number>\n";
|
|
|
|
|
|
|
|
phone = addr.phoneNumber( TDEABC::PhoneNumber::Cell );
|
|
|
|
xml += "<mobile_phone_number>" + phone.number() + "</mobile_phone_number>\n";
|
|
|
|
|
|
|
|
const TDEABC::Address workAddress = addr.address( TDEABC::Address::Work );
|
|
|
|
xml += "<work_address_street>" + workAddress.street() + "</work_address_street>\n";
|
|
|
|
xml += "<work_address_zip>" + workAddress.postalCode() + "</work_address_zip>\n";
|
|
|
|
xml += "<work_address_city>" + workAddress.locality() + "</work_address_city>\n";
|
|
|
|
xml += "<work_address_state>" + workAddress.region() + "</work_address_state>\n";
|
|
|
|
xml += "<work_address_country>" + workAddress.country() + "</work_address_country>\n";
|
|
|
|
|
|
|
|
const TDEABC::Address homeAddress = addr.address( TDEABC::Address::Home );
|
|
|
|
xml += "<home_address_street>" + homeAddress.street() + "</home_address_street>\n";
|
|
|
|
xml += "<home_address_zip>" + homeAddress.postalCode() + "</home_address_zip>\n";
|
|
|
|
xml += "<home_address_city>" + homeAddress.locality() + "</home_address_city>\n";
|
|
|
|
xml += "<home_address_state>" + homeAddress.region() + "</home_address_state>\n";
|
|
|
|
xml += "<home_address_country>" + homeAddress.country() + "</home_address_country>\n";
|
|
|
|
|
|
|
|
const TDEABC::Address otherAddress = addr.address( TDEABC::Address::Dom );
|
|
|
|
xml += "<other_address_street>" + otherAddress.street() + "</other_address_street>\n";
|
|
|
|
xml += "<other_address_zip>" + otherAddress.postalCode() + "</other_address_zip>\n";
|
|
|
|
xml += "<other_address_city>" + otherAddress.locality() + "</other_address_city>\n";
|
|
|
|
xml += "<other_address_state>" + otherAddress.region() + "</other_address_state>\n";
|
|
|
|
xml += "<other_address_country>" + otherAddress.country() + "</other_address_country>\n";
|
|
|
|
|
|
|
|
if ( homeAddress.type() & TDEABC::Address::Pref )
|
|
|
|
xml += "<selected_mailing_address>1</selected_mailing_address>\n";
|
|
|
|
else if ( workAddress.type() & TDEABC::Address::Pref )
|
|
|
|
xml += "<selected_mailing_address>2</selected_mailing_address>\n";
|
|
|
|
else if ( otherAddress.type() & TDEABC::Address::Pref )
|
|
|
|
xml += "<selected_mailing_address>3</selected_mailing_address>\n";
|
|
|
|
|
|
|
|
xml += "<im_address>" + addr.custom( "KADDRESSBOOK", "X-IMAddress" ) + "</im_address>\n";
|
|
|
|
xml += "<manager>" + addr.custom( "KADDRESSBOOK", "X-ManagersName" ) + "</manager>\n";
|
|
|
|
xml += "<department>" + addr.custom( "KADDRESSBOOK", "X-Department" ) + "</department>\n";
|
|
|
|
xml += "<assistant>" + addr.custom( "KADDRESSBOOK", "X-AssistantsName" ) + "</assistant>\n";
|
|
|
|
xml += "<profession>" + addr.custom( "KADDRESSBOOK", "X-Profession" ) + "</profession>\n";
|
|
|
|
xml += "<office_location>" + addr.custom( "KADDRESSBOOK", "X-Office" ) + "</office_location>\n";
|
|
|
|
xml += "<spouse>" + addr.custom( "KADDRESSBOOK", "X-SpousesName" ) + "</spouse>\n";
|
|
|
|
|
|
|
|
xml += "<bday>" + addr.birthday().toString( Qt::ISODate ) + "</bday>\n";
|
|
|
|
xml += "<anniversary>" + addr.custom( "KADDRESSBOOK", "X-Anniversary" ) + "</anniversary>\n";
|
|
|
|
|
|
|
|
xml += "<mapi_charset>" + custom( "mapi_charset", addr, "UTF8" ) + "</mapi_charset>";
|
|
|
|
|
|
|
|
xml += "</contact>\n";
|
|
|
|
|
|
|
|
return xml;
|
|
|
|
}
|
|
|
|
|
|
|
|
TDEABC::Addressee Contact::fromXml( const TQString &xml )
|
|
|
|
{
|
|
|
|
TQDomDocument document;
|
|
|
|
|
|
|
|
TQString errorMsg;
|
|
|
|
int errorLine, errorColumn;
|
|
|
|
if ( !document.setContent( xml, true, &errorMsg, &errorLine, &errorColumn ) ) {
|
|
|
|
tqDebug( "Error parsing XML in Scalix::Contact::fromXml: %s (%d,%d)", errorMsg.latin1(), errorLine, errorColumn );
|
|
|
|
return TDEABC::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<TQString, TQString>() );
|
|
|
|
|
|
|
|
s_distListMap->insert( list.uid(), xml );
|
|
|
|
|
|
|
|
return list;
|
|
|
|
} else {
|
|
|
|
tqDebug( "Error interpreting XML in Scalix::Contact::fromXml: no 'contact' or 'distlist' tag found" );
|
|
|
|
return TDEABC::Addressee();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
TQString emails[ 3 ];
|
|
|
|
TDEABC::Address homeAddress( TDEABC::Address::Home );
|
|
|
|
TDEABC::Address workAddress( TDEABC::Address::Work );
|
|
|
|
TDEABC::Address otherAddress( TDEABC::Address::Dom );
|
|
|
|
|
|
|
|
TDEABC::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( TDEABC::PhoneNumber( element.text(), TDEABC::PhoneNumber::Home ) );
|
|
|
|
else if ( element.tagName() == "work_phone_number" )
|
|
|
|
addr.insertPhoneNumber( TDEABC::PhoneNumber( element.text(), TDEABC::PhoneNumber::Work ) );
|
|
|
|
else if ( element.tagName() == "work_fax_number" )
|
|
|
|
addr.insertPhoneNumber( TDEABC::PhoneNumber( element.text(), TDEABC::PhoneNumber::Work | TDEABC::PhoneNumber::Fax ) );
|
|
|
|
else if ( element.tagName() == "mobile_phone_number" )
|
|
|
|
addr.insertPhoneNumber( TDEABC::PhoneNumber( element.text(), TDEABC::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() | TDEABC::Address::Pref );
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
workAddress.setType( workAddress.type() | TDEABC::Address::Pref );
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
otherAddress.setType( otherAddress.type() | TDEABC::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;
|
|
|
|
}
|