summaryrefslogtreecommitdiffstats
path: root/kresources/slox/kabcresourceslox.cpp
diff options
context:
space:
mode:
authortoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
committertoma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2009-11-25 17:56:58 +0000
commit460c52653ab0dcca6f19a4f492ed2c5e4e963ab0 (patch)
tree67208f7c145782a7e90b123b982ca78d88cc2c87 /kresources/slox/kabcresourceslox.cpp
downloadtdepim-460c52653ab0dcca6f19a4f492ed2c5e4e963ab0.tar.gz
tdepim-460c52653ab0dcca6f19a4f492ed2c5e4e963ab0.zip
Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features.
BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdepim@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
Diffstat (limited to 'kresources/slox/kabcresourceslox.cpp')
-rw-r--r--kresources/slox/kabcresourceslox.cpp673
1 files changed, 673 insertions, 0 deletions
diff --git a/kresources/slox/kabcresourceslox.cpp b/kresources/slox/kabcresourceslox.cpp
new file mode 100644
index 000000000..e6bf326c3
--- /dev/null
+++ b/kresources/slox/kabcresourceslox.cpp
@@ -0,0 +1,673 @@
+/*
+ This file is part of kdepim.
+
+ Copyright (c) 2004 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (c) 2005 Volker Krause <volker.krause@rwth-aachen.de>
+
+ 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 <qapplication.h>
+
+#include <kabc/picture.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kmdcodec.h>
+#include <kstandarddirs.h>
+#include <kstringhandler.h>
+#include <libkdepim/kpimprefs.h>
+#include <libkdepim/progressmanager.h>
+#include <kio/davjob.h>
+
+#include "webdavhandler.h"
+#include "sloxaccounts.h"
+#include "kabcsloxprefs.h"
+
+#include "kabcresourceslox.h"
+
+using namespace KABC;
+
+ResourceSlox::ResourceSlox( const KConfig *config )
+ : ResourceCached( config ), SloxBase( this )
+{
+ init();
+
+ mPrefs->addGroupPrefix( identifier() );
+
+ if ( config ) {
+ readConfig( config );
+ }
+}
+
+ResourceSlox::ResourceSlox( const KURL &url,
+ const QString &user, const QString &password )
+ : ResourceCached( 0 ), SloxBase( this )
+{
+ init();
+
+ mPrefs->addGroupPrefix( identifier() );
+
+ mPrefs->setUrl( url.url() );
+ mPrefs->setUser( user );
+ mPrefs->setPassword( password );
+}
+
+void ResourceSlox::init()
+{
+ mPrefs = new SloxPrefs;
+ mWebdavHandler.setResource( this );
+
+ mDownloadJob = 0;
+ mUploadJob = 0;
+ mDownloadProgress = 0;
+ mUploadProgress = 0;
+
+ // phone number mapping for SLOX
+ mPhoneNumberSloxMap[PhoneNumber::Work] << "phone" << "phone2";
+ mPhoneNumberSloxMap[PhoneNumber::Home] << "privatephone" << "privatephone2";
+ mPhoneNumberSloxMap[PhoneNumber::Cell | PhoneNumber::Work] << "mobile" << "mobile2";
+ mPhoneNumberSloxMap[PhoneNumber::Cell | PhoneNumber::Home] << "privatemobile" << "privatemobile2";
+ mPhoneNumberSloxMap[PhoneNumber::Fax | PhoneNumber::Work] << "fax" << "fax2";
+ mPhoneNumberSloxMap[PhoneNumber::Fax | PhoneNumber::Home] << "privatefax" << "privatefax2";
+
+ // phone number mapping for OX (mapping partly taken from Kolab)
+ mPhoneNumberOxMap[PhoneNumber::Work] << "phone_business" << "phone_business2";
+ mPhoneNumberOxMap[PhoneNumber::Home] << "phone_home" << "phone_home2";
+ mPhoneNumberOxMap[PhoneNumber::Cell] << "mobile1"<< "mobile2";
+ mPhoneNumberOxMap[PhoneNumber::Fax | PhoneNumber::Work] << "fax_business";
+ mPhoneNumberOxMap[PhoneNumber::Fax | PhoneNumber::Home] << "fax_home";
+ mPhoneNumberOxMap[PhoneNumber::Fax] << "fax_other";
+ mPhoneNumberOxMap[PhoneNumber::Car] << "phone_car";
+ mPhoneNumberOxMap[PhoneNumber::Isdn] << "isdn";
+ mPhoneNumberOxMap[PhoneNumber::Pager] << "pager";
+ mPhoneNumberOxMap[PhoneNumber::Pref] << "primary";
+ mPhoneNumberOxMap[PhoneNumber::Voice] << "callback";
+ mPhoneNumberOxMap[PhoneNumber::Video] << "radio";
+ mPhoneNumberOxMap[PhoneNumber::Bbs] << "tty_tdd";
+ mPhoneNumberOxMap[PhoneNumber::Modem] << "telex";
+ mPhoneNumberOxMap[PhoneNumber::Pcs] << "phone_assistant";
+ mPhoneNumberOxMap[PhoneNumber::Msg] << "phone_company";
+}
+
+ResourceSlox::~ResourceSlox()
+{
+ kdDebug() << "KABC::~ResourceSlox()" << endl;
+
+ if ( mDownloadJob ) mDownloadJob->kill();
+
+ delete mPrefs;
+
+ kdDebug() << "KABC::~ResourceSlox() done" << endl;
+}
+
+void ResourceSlox::readConfig( const KConfig * )
+{
+ mPrefs->readConfig();
+}
+
+void ResourceSlox::writeConfig( KConfig *config )
+{
+ kdDebug() << "ResourceSlox::writeConfig() " << endl;
+ kdDebug() << mPrefs->url() << endl;
+
+ Resource::writeConfig( config );
+
+ mPrefs->writeConfig();
+}
+
+Ticket *ResourceSlox::requestSaveTicket()
+{
+ if ( !addressBook() ) {
+ kdDebug(5700) << "no addressbook" << endl;
+ return 0;
+ }
+
+ return createTicket( this );
+}
+
+void ResourceSlox::releaseSaveTicket( Ticket *ticket )
+{
+ delete ticket;
+}
+
+bool ResourceSlox::doOpen()
+{
+ return true;
+}
+
+void ResourceSlox::doClose()
+{
+ cancelDownload();
+ cancelUpload();
+}
+
+bool ResourceSlox::load()
+{
+ kdDebug() << "KABC::ResourceSlox::load()" << endl;
+
+#if 0
+ return asyncLoad();
+#else
+ kdDebug() << "KABC::ResourceSlox::load() is a nop." << endl;
+ return true;
+#endif
+}
+
+bool ResourceSlox::asyncLoad()
+{
+ kdDebug() << "KABC::ResourceSlox::asyncLoad()" << endl;
+
+ if ( mDownloadJob ) {
+ kdDebug() << "KABC::ResourceSlox::asyncLoad(): Loading still in progress."
+ << endl;
+ return true;
+ }
+
+ loadCache();
+ clearChanges();
+
+ KURL url = mPrefs->url();
+ url.setPath( "/servlet/webdav.contacts/" );
+ url.setUser( mPrefs->user() );
+ url.setPass( mPrefs->password() );
+
+ QString lastsync = "0";
+ if ( mPrefs->useLastSync() ) {
+ QDateTime dt = mPrefs->lastSync();
+ if ( dt.isValid() )
+ lastsync = WebdavHandler::qDateTimeToSlox( dt.addDays( -1 ) );
+ }
+
+ QDomDocument doc;
+ QDomElement root = WebdavHandler::addDavElement( doc, doc, "propfind" );
+ QDomElement prop = WebdavHandler::addDavElement( doc, root, "prop" );
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( LastSync ), lastsync );
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( FolderId ), mPrefs->folderId() );
+ if ( type() == "ox" ) {
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( ObjectType ), "NEW_AND_MODIFIED" );
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( ObjectType ), "DELETED" );
+ } else
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( ObjectType ), "all" );
+
+ kdDebug() << "REQUEST CONTACTS: \n" << doc.toString( 2 ) << endl;
+
+ mDownloadJob = KIO::davPropFind( url, doc, "0", false );
+ connect( mDownloadJob, SIGNAL( result( KIO::Job * ) ),
+ SLOT( slotResult( KIO::Job * ) ) );
+ connect( mDownloadJob, SIGNAL( percent( KIO::Job *, unsigned long ) ),
+ SLOT( slotProgress( KIO::Job *, unsigned long ) ) );
+
+ mDownloadProgress = KPIM::ProgressManager::instance()->createProgressItem(
+ KPIM::ProgressManager::getUniqueID(), i18n("Downloading contacts") );
+ connect( mDownloadProgress,
+ SIGNAL( progressItemCanceled( KPIM::ProgressItem * ) ),
+ SLOT( cancelDownload() ) );
+
+ mPrefs->setLastSync( QDateTime::currentDateTime() );
+
+ return true;
+}
+
+void ResourceSlox::slotResult( KIO::Job *job )
+{
+ kdDebug() << "ResourceSlox::slotResult()" << endl;
+
+ if ( job->error() ) {
+ job->showErrorDialog( 0 );
+ } else {
+ kdDebug() << "ResourceSlox::slotResult() success" << endl;
+
+ QDomDocument doc = mDownloadJob->response();
+
+ mWebdavHandler.log( doc.toString( 2 ) );
+
+ QValueList<SloxItem> items = WebdavHandler::getSloxItems( this, doc );
+
+ bool changed = false;
+
+ QValueList<SloxItem>::ConstIterator it;
+ for( it = items.begin(); it != items.end(); ++it ) {
+ SloxItem item = *it;
+ QString uid = "kresources_slox_kabc_" + item.sloxId;
+ if ( item.status == SloxItem::Delete ) {
+ QMap<QString,Addressee>::Iterator it;
+ it = mAddrMap.find( uid );
+ if ( it != mAddrMap.end() ) {
+ mAddrMap.remove( it );
+ changed = true;
+ }
+ } else if ( item.status == SloxItem::Create ) {
+ Addressee a;
+ a.setUid( uid );
+
+ mWebdavHandler.clearSloxAttributeStatus();
+
+ QDomNode n;
+ for( n = item.domNode.firstChild(); !n.isNull(); n = n.nextSibling() ) {
+ QDomElement e = n.toElement();
+ mWebdavHandler.parseSloxAttribute( e );
+ parseContactAttribute( e, a );
+ }
+
+ mWebdavHandler.setSloxAttributes( a );
+
+ a.setResource( this );
+ a.setChanged( false );
+
+ mAddrMap.replace( a.uid(), a );
+
+ // TODO: Do we need to try to associate addressees with slox accounts?
+
+ changed = true;
+ }
+ }
+
+ clearChanges();
+ saveCache();
+ }
+
+ mDownloadJob = 0;
+ mDownloadProgress->setComplete();
+ mDownloadProgress = 0;
+
+ emit loadingFinished( this );
+}
+
+void ResourceSlox::slotUploadResult( KIO::Job *job )
+{
+ kdDebug() << "ResourceSlox::slotUploadResult()" << endl;
+
+ if ( job->error() ) {
+ job->showErrorDialog( 0 );
+ } else {
+ kdDebug() << "ResourceSlox::slotUploadResult() success" << endl;
+
+ QDomDocument doc = mUploadJob->response();
+ kdDebug() << k_funcinfo << "Upload result: " << endl;
+ kdDebug() << doc.toString() << endl;
+
+ QValueList<SloxItem> items = WebdavHandler::getSloxItems( this, doc );
+
+ QValueList<SloxItem>::ConstIterator it;
+ for( it = items.begin(); it != items.end(); ++it ) {
+ SloxItem item = *it;
+ if ( !item.response.contains( "200" ) ) {
+ savingError( this, item.response + "\n" + item.responseDescription );
+ continue;
+ }
+ if ( item.status == SloxItem::New ) {
+ QMap<QString,Addressee>::Iterator search_res;
+ search_res = mAddrMap.find( item.clientId );
+ if ( search_res != mAddrMap.end() ) {
+ // use the id provided by the server
+ Addressee a = *search_res;
+ mAddrMap.remove( search_res );
+ a.setUid( "kresources_slox_kabc_" + item.sloxId );
+ a.setResource( this );
+ a.setChanged( false );
+ mAddrMap.replace( a.uid(), a );
+ saveCache();
+ }
+ }
+ }
+ }
+
+ clearChange( mUploadAddressee );
+
+ mUploadJob = 0;
+ mUploadProgress->setComplete();
+ mUploadProgress = 0;
+
+ uploadContacts();
+}
+
+void ResourceSlox::parseContactAttribute( const QDomElement &e, Addressee &a )
+{
+ QString text = decodeText( e.text() );
+ if ( text.isEmpty() ) return;
+ QString tag = e.tagName();
+ int pnType = 0;
+
+ if ( tag == fieldName( Birthday ) ) {
+ QDateTime dt = WebdavHandler::sloxToQDateTime( text );
+ a.setBirthday( dt.date() );
+ } else if ( tag == fieldName( Role ) ) {
+ a.setRole( text );
+ } else if ( tag == "salutation" ) { // what's this in OX?
+ a.setPrefix( text );
+ } else if ( tag == fieldName( Title ) ) {
+ a.setTitle( text );
+ } else if ( tag == fieldName( Organization ) ) {
+ a.setOrganization( text );
+ } else if ( tag == fieldName( Department ) ) {
+ a.insertCustom( "KADDRESSBOOK", "X-Department", text );
+ } else if ( tag == fieldName( FamilyName ) ) {
+ a.setFamilyName( text );
+ } else if ( tag == fieldName( GivenName) ) {
+ a.setGivenName( text );
+ } else if ( tag == fieldName( SecondName ) ) {
+ a.setAdditionalName( text );
+ } else if ( tag == fieldName( DisplayName ) ) {
+ a.setFormattedName( text );
+ } else if ( tag == fieldName( Suffix ) ) {
+ a.setSuffix( text );
+ } else if ( tag == fieldName( PrimaryEmail ) ) {
+ a.insertEmail( text, true );
+ } else if ( (pnType = phoneNumberType( tag )) ) {
+ a.insertPhoneNumber( PhoneNumber( text, pnType ) );
+ } else if ( tag == fieldName( Comment ) ) {
+ a.setNote( text );
+ } else if ( tag == fieldName( SecondaryEmail1 ) || tag == fieldName( SecondaryEmail2 ) ||
+ tag == fieldName( SecondaryEmail3 ) ) {
+ a.insertEmail( text );
+ } else if ( tag == fieldName( Url ) ) {
+ a.setUrl( text );
+ } else if ( tag == fieldName( Image ) ) {
+ QByteArray decodedPicture;
+ KCodecs::base64Decode( text.utf8(), decodedPicture );
+ a.setPhoto( Picture( QImage( decodedPicture ) ) );
+ } else if ( tag == fieldName( NickName ) ) {
+ a.setNickName( text );
+ } else if ( tag == fieldName( InstantMsg ) ) {
+ a.insertCustom( "KADDRESSBOOK", "X-IMAddress", text );
+ } else if ( tag == fieldName( Office ) ) {
+ a.insertCustom( "KADDRESSBOOK", "X-Office", text );
+ } else if ( tag == fieldName( Profession ) ) {
+ a.insertCustom( "KADDRESSBOOK", "X-Profession", text );
+ } else if ( tag == fieldName( ManagersName ) ) {
+ a.insertCustom( "KADDRESSBOOK", "X-ManagersName", text );
+ } else if ( tag == fieldName( AssistantsName ) ) {
+ a.insertCustom( "KADDRESSBOOK", "X-AssistantsName", text );
+ } else if ( tag == fieldName( SpousesName ) ) {
+ a.insertCustom( "KADDRESSBOOK", "X-SpousesName", text );
+ } else if ( tag == fieldName( Anniversary ) ) {
+ QDateTime dt = WebdavHandler::sloxToQDateTime( text );
+ a.insertCustom( "KADDRESSBOOK", "X-Anniversary", dt.toString( Qt::ISODate ) );
+ } else if ( tag == fieldName( Categories ) ) {
+ a.setCategories( QStringList::split( QRegExp(",\\s*"), text ) );
+ } else if ( type() == "ox" ) { // FIXME: Address reading is missing for SLOX
+ // read addresses
+ Address addr;
+ if ( tag.startsWith( fieldName( BusinessPrefix ) ) ) {
+ addr = a.address( KABC::Address::Work );
+ } else if ( tag.startsWith( fieldName( OtherPrefix ) ) ) {
+ addr = a.address( 0 );
+ } else {
+ addr = a.address( KABC::Address::Home );
+ }
+ if ( tag.endsWith( fieldName( Street ) ) ) {
+ addr.setStreet( text );
+ } else if ( tag.endsWith( fieldName( PostalCode ) ) ) {
+ addr.setPostalCode( text );
+ } else if ( tag.endsWith( fieldName( City ) ) ) {
+ addr.setLocality( text );
+ } else if ( tag.endsWith( fieldName( State ) ) ) {
+ addr.setRegion( text );
+ } else if ( tag.endsWith( fieldName( Country ) ) ) {
+ addr.setCountry( text );
+ }
+ a.insertAddress( addr );
+ }
+}
+
+int ResourceSlox::phoneNumberType( const QString &fieldName ) const
+{
+ QMap<int, QStringList> pnmap;
+ if ( type() == "ox" )
+ pnmap = mPhoneNumberOxMap;
+ else
+ pnmap = mPhoneNumberSloxMap;
+ QMap<int, QStringList>::ConstIterator it;
+ for ( it = pnmap.begin(); it != pnmap.end(); ++it ) {
+ QStringList l = it.data();
+ QStringList::ConstIterator it2;
+ for ( it2 = l.begin(); it2 != l.end(); ++it2 )
+ if ( (*it2) == fieldName )
+ return it.key();
+ }
+ return 0;
+}
+
+bool ResourceSlox::save( Ticket* )
+{
+ kdDebug() << k_funcinfo << endl;
+
+ if ( readOnly() || !hasChanges() || type() != "ox" ) {
+ emit savingFinished( this );
+ return true;
+ }
+
+ if ( mDownloadJob ) {
+ kdWarning() << k_funcinfo << "download still in progress" << endl;
+ return false;
+ }
+ if ( mUploadJob ) {
+ kdWarning() << k_funcinfo << "upload still in progress" << endl;
+ return false;
+ }
+
+ saveCache();
+ uploadContacts();
+ return true;
+}
+
+bool ResourceSlox::asyncSave( Ticket* )
+{
+ return false; // readonly
+}
+
+void ResourceSlox::uploadContacts()
+{
+ QDomDocument doc;
+ QDomElement root = WebdavHandler::addDavElement( doc, doc, "propertyupdate" );
+ QDomElement set = WebdavHandler::addDavElement( doc, root, "set" );
+ QDomElement prop = WebdavHandler::addDavElement( doc, set, "prop" );
+
+ bool isDelete = false;
+
+ KABC::Addressee::List addedAddr = addedAddressees();
+ KABC::Addressee::List changedAddr = changedAddressees();
+ KABC::Addressee::List deletedAddr = deletedAddressees();
+
+ if ( !addedAddr.isEmpty() ) {
+ mUploadAddressee = addedAddr.first();
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( ClientId ), mUploadAddressee.uid() );
+ } else if ( !changedAddr.isEmpty() ) {
+ mUploadAddressee = changedAddr.first();
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( ObjectId ),
+ mUploadAddressee.uid().remove( 0, sizeof("kresources_slox_kabc_") - 1) );
+ } else if ( !deletedAddr.isEmpty() ) {
+ mUploadAddressee = deletedAddr.first();
+ isDelete = true;
+ } else {
+ kdDebug() << k_funcinfo << "Upload finished." << endl;
+ emit savingFinished( this );
+ return;
+ }
+
+ if ( !isDelete ) {
+ createAddresseeFields( doc, prop, mUploadAddressee );
+ } else {
+ QString tmp_uid = mUploadAddressee.uid().remove( 0, sizeof("kresources_slox_kabc_") - 1); // remove prefix from uid
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( ObjectId ), tmp_uid );
+ WebdavHandler::addSloxElement( this, doc, prop, "method", "DELETE" );
+ }
+
+ kdDebug() << k_funcinfo << doc.toString() << endl;
+
+ KURL url = mPrefs->url();
+ url.setPath( "/servlet/webdav.contacts/" );
+ url.setUser( mPrefs->user() );
+ url.setPass( mPrefs->password() );
+
+ mUploadJob = KIO::davPropPatch( url, doc, false );
+ connect( mUploadJob, SIGNAL( result( KIO::Job * ) ),
+ SLOT( slotUploadResult( KIO::Job * ) ) );
+ connect( mUploadJob, SIGNAL( percent( KIO::Job *, unsigned long ) ),
+ SLOT( slotProgress( KIO::Job *, unsigned long ) ) );
+
+ mUploadProgress = KPIM::ProgressManager::instance()->createProgressItem(
+ KPIM::ProgressManager::getUniqueID(), i18n("Uploading contacts") );
+ connect( mUploadProgress,
+ SIGNAL( progressItemCanceled( KPIM::ProgressItem * ) ),
+ SLOT( cancelUpload() ) );
+}
+
+void ResourceSlox::createAddresseeFields( QDomDocument &doc, QDomElement &prop,
+ const Addressee &a )
+{
+ // choose addressbook
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( FolderId ), mPrefs->folderId() );
+
+ // person
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( GivenName ), a.givenName() );
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( FamilyName ), a.familyName() );
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( Title ), a.title() );
+ if ( !a.birthday().isNull() )
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( Birthday ),
+ WebdavHandler::qDateTimeToSlox( a.birthday() ) );
+ else
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( Birthday ) );
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( Role ), a.role() );
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( Department ),
+ a.custom( "KADDRESSBOOK", "X-Department" ) );
+ if ( type() == "ox" ) { // OX only fields
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( DisplayName ), a.formattedName() );
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( SecondName ), a.additionalName() );
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( Suffix ), a.suffix() );
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( Organization ), a.organization() );
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( NickName ), a.nickName() );
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( InstantMsg ),
+ a.custom( "KADDRESSBOOK", "X-IMAddress" ) );
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( Office ),
+ a.custom( "KADDRESSBOOK", "X-Office" ) );
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( Profession ),
+ a.custom( "KADDRESSBOOK", "X-Profession" ) );
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( ManagersName ),
+ a.custom( "KADDRESSBOOK", "X-ManagersName" ) );
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( AssistantsName ),
+ a.custom( "KADDRESSBOOK", "X-AssistantsName" ) );
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( SpousesName ),
+ a.custom( "KADDRESSBOOK", "X-SpousesName" ) );
+ QString anniversary = a.custom( "KADDRESSBOOK", "X-Anniversary" );
+ if ( !anniversary.isEmpty() )
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( Anniversary ),
+ WebdavHandler::qDateTimeToSlox( QDateTime::fromString( anniversary, Qt::ISODate ).date() ) );
+ else
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( Anniversary ) );
+ }
+
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( Url ), a.url().url() );
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( Comment ), a.note() );
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( Categories ), a.categories().join( ", " ) );
+
+ // emails
+ QStringList email_list = a.emails();
+ QStringList::const_iterator emails_it = email_list.begin();
+ if ( emails_it != email_list.end() )
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( PrimaryEmail ), *(emails_it++) );
+ if ( emails_it != email_list.end() )
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( SecondaryEmail1 ), *(emails_it++) );
+ if ( emails_it != email_list.end() )
+ WebdavHandler::addSloxElement( this, doc, prop, fieldName( SecondaryEmail2 ), *(emails_it++) );
+
+ // phone numbers
+ PhoneNumber::List pnlist = a.phoneNumbers();
+ QMap<int, QStringList> pnSaveMap;
+ if ( type() == "ox" )
+ pnSaveMap = mPhoneNumberOxMap;
+ else
+ pnSaveMap = mPhoneNumberSloxMap;
+ for ( PhoneNumber::List::ConstIterator it = pnlist.begin() ; it != pnlist.end(); ++it ) {
+ if ( pnSaveMap.contains( (*it).type() ) ) {
+ QStringList l = pnSaveMap[(*it).type()];
+ QString fn = l.first();
+ l.remove( l.begin() );
+ if ( !l.isEmpty() )
+ pnSaveMap[(*it).type()] = l;
+ else
+ pnSaveMap.remove( (*it).type() );
+ WebdavHandler::addSloxElement( this, doc, prop, fn, (*it).number() );
+ } else
+ kdDebug() << k_funcinfo << "Can't save phone number " << (*it).number() << " of type " << (*it).type() << endl;
+ }
+ // send empty fields for the remaining ohone number fields
+ // it's not possible to delete phone numbers otherwise
+ for ( QMap<int, QStringList>::ConstIterator it = pnSaveMap.begin(); it != pnSaveMap.end(); ++it ) {
+ QStringList l = it.data();
+ for ( QStringList::ConstIterator it2 = l.begin(); it2 != l.end(); ++it2 )
+ WebdavHandler::addSloxElement( this, doc, prop, (*it2) );
+ }
+
+ // write addresses
+ createAddressFields( doc, prop, fieldName( HomePrefix ), a.address( KABC::Address::Home ) );
+ if ( type() == "ox" ) {
+ createAddressFields( doc, prop, fieldName( BusinessPrefix ), a.address( KABC::Address::Work ) );
+ createAddressFields( doc, prop, fieldName( OtherPrefix ), a.address( 0 ) );
+ }
+}
+
+void KABC::ResourceSlox::createAddressFields( QDomDocument &doc, QDomElement &parent,
+ const QString &prefix, const KABC::Address &addr )
+{
+ WebdavHandler::addSloxElement( this, doc, parent, prefix + fieldName( Street ), addr.street() );
+ WebdavHandler::addSloxElement( this, doc, parent, prefix + fieldName( PostalCode ), addr.postalCode() );
+ WebdavHandler::addSloxElement( this, doc, parent, prefix + fieldName( City ), addr.locality() );
+ WebdavHandler::addSloxElement( this, doc, parent, prefix + fieldName( State ), addr.region() );
+ WebdavHandler::addSloxElement( this, doc, parent, prefix + fieldName( Country ), addr.country() );
+}
+
+void ResourceSlox::slotProgress( KIO::Job *job, unsigned long percent )
+{
+ if ( mDownloadProgress && job == mDownloadJob )
+ mDownloadProgress->setProgress( percent );
+ else if ( mUploadProgress && job == mUploadJob )
+ mUploadProgress->setProgress( percent );
+}
+
+void ResourceSlox::cancelDownload()
+{
+ if ( mDownloadJob ) mDownloadJob->kill();
+ mDownloadJob = 0;
+ if ( mDownloadProgress ) mDownloadProgress->setComplete();
+ mDownloadProgress = 0;
+}
+
+void ResourceSlox::cancelUpload()
+{
+ if ( mUploadJob ) mUploadJob->kill();
+ mUploadJob = 0;
+ if ( mUploadProgress ) mUploadProgress->setComplete();
+ mUploadProgress = 0;
+}
+
+void ResourceSlox::setReadOnly( bool b )
+{
+ if ( type() == "ox" )
+ KABC::Resource::setReadOnly( b );
+ else
+ KABC::Resource::setReadOnly( true );
+}
+
+bool ResourceSlox::readOnly() const
+{
+ if ( type() == "ox" )
+ return KABC::Resource::readOnly();
+ else
+ return true;
+}
+
+#include "kabcresourceslox.moc"