summaryrefslogtreecommitdiffstats
path: root/kresources/slox/sloxaccounts.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/sloxaccounts.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/sloxaccounts.cpp')
-rw-r--r--kresources/slox/sloxaccounts.cpp222
1 files changed, 222 insertions, 0 deletions
diff --git a/kresources/slox/sloxaccounts.cpp b/kresources/slox/sloxaccounts.cpp
new file mode 100644
index 000000000..35203b06f
--- /dev/null
+++ b/kresources/slox/sloxaccounts.cpp
@@ -0,0 +1,222 @@
+/*
+ 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 "sloxaccounts.h"
+#include "sloxbase.h"
+#include "webdavhandler.h"
+
+#include <libkcal/freebusyurlstore.h>
+
+#include <kstaticdeleter.h>
+#include <kdebug.h>
+#include <kstandarddirs.h>
+#include <kio/job.h>
+#include <kio/davjob.h>
+#include <kstringhandler.h>
+#include <kconfig.h>
+
+#include <qfile.h>
+#include <qdom.h>
+#include <qstring.h>
+
+SloxAccounts::SloxAccounts( SloxBase *res, const KURL &baseUrl )
+ : mBaseUrl( baseUrl ), mRes( res )
+{
+ kdDebug() << "SloxAccounts(): " << baseUrl << endl;
+
+ mDownloadJob = 0;
+
+ QString server = mBaseUrl.host();
+
+ QStringList l = QStringList::split( '.', server );
+
+ if ( l.count() < 2 ) mDomain = server;
+ else mDomain = l[ l.count() - 2 ] + "." + l[ l.count() - 1 ];
+
+ readAccounts();
+}
+
+SloxAccounts::~SloxAccounts()
+{
+ kdDebug() << "~SloxAccounts()" << endl;
+
+ if ( mDownloadJob ) mDownloadJob->kill();
+}
+
+void SloxAccounts::insertUser( const QString &id, const KABC::Addressee &a )
+{
+ kdDebug() << "SloxAccount::insertUser() " << id << endl;
+
+ mUsers.replace( id, a );
+
+ QString email = a.preferredEmail();
+
+ QString url = "http://" + mBaseUrl.host() + "/servlet/webdav.freebusy?username=";
+ url += id + "&server=" + mDomain;
+
+ KCal::FreeBusyUrlStore::self()->writeUrl( email, url );
+}
+
+KABC::Addressee SloxAccounts::lookupUser( const QString &id )
+{
+ QMap<QString, KABC::Addressee>::ConstIterator it;
+ it = mUsers.find( id );
+ if ( it == mUsers.end() ) {
+ requestAccounts();
+ return KABC::Addressee();
+ } else {
+ return *it;
+ }
+}
+
+QString SloxAccounts::lookupId( const QString &email )
+{
+ kdDebug() << "SloxAccounts::lookupId() " << email << endl;
+
+ QMap<QString, KABC::Addressee>::ConstIterator it;
+ for( it = mUsers.begin(); it != mUsers.end(); ++it ) {
+ kdDebug() << "PREF: " << (*it).preferredEmail() << endl;
+ kdDebug() << "KEY: " << it.key() << endl;
+ if ( (*it).preferredEmail() == email ) return it.key();
+ }
+ requestAccounts();
+
+ int pos = email.find( '@' );
+ if ( pos < 0 ) return email;
+ else return email.left( pos );
+}
+
+void SloxAccounts::requestAccounts()
+{
+ kdDebug() << "SloxAccounts::requestAccounts()" << endl;
+
+ if ( mDownloadJob ) {
+ kdDebug() << "SloxAccount::requestAccounts(): Download still in progress"
+ << endl;
+ return;
+ }
+
+ if ( mRes->resType() == "slox" ) {
+ KURL url = mBaseUrl;
+ url.addPath( "/servlet/webdav.groupuser" );
+ url.setQuery( "?user=*&group=*&groupres=*&res=*&details=t" );
+
+ kdDebug() << "SloxAccounts::requestAccounts() URL: " << url << endl;
+
+ mDownloadJob = KIO::file_copy( url, cacheFile(), -1, true, false, false );
+ } else if ( mRes->resType() == "ox" ) {
+ KURL url = mBaseUrl;
+ url.setPath( "/servlet/webdav.groupuser/" );
+
+ QDomDocument doc;
+ QDomElement root = WebdavHandler::addDavElement( doc, doc, "propfind" );
+ QDomElement prop = WebdavHandler::addDavElement( doc, root, "prop" );
+ WebdavHandler::addSloxElement( mRes, doc, prop, "user", "*" );
+ WebdavHandler::addSloxElement( mRes, doc, prop, "group", "*" );
+ WebdavHandler::addSloxElement( mRes, doc, prop, "resource", "*" );
+ WebdavHandler::addSloxElement( mRes, doc, prop, "resourcegroup", "*" );
+
+ kdDebug() << k_funcinfo << doc.toString( 2 ) << endl;
+
+ mDownloadJob = KIO::davPropFind( url, doc, "0", false );
+ }
+
+ connect( mDownloadJob, SIGNAL( result( KIO::Job * ) ),
+ SLOT( slotResult( KIO::Job * ) ) );
+}
+
+void SloxAccounts::slotResult( KIO::Job *job )
+{
+ kdDebug() << "SloxAccounts::slotResult()" << endl;
+
+ if ( job->error() ) {
+ job->showErrorDialog( 0 );
+ } else {
+ if ( mRes->resType() == "ox" ) {
+ QFile f( cacheFile() );
+ if ( !f.open( IO_WriteOnly ) ) {
+ kdWarning() << "Unable to open '" << cacheFile() << "'" << endl;
+ return;
+ }
+ QTextStream stream ( &f );
+ stream << static_cast<KIO::DavJob*>( mDownloadJob )->response();
+ f.close();
+ }
+ readAccounts();
+ }
+
+ mDownloadJob = 0;
+}
+
+QString SloxAccounts::cacheFile() const
+{
+ QString host = mBaseUrl.host();
+
+ QString file = locateLocal( "cache", "slox/accounts_" + host );
+
+ kdDebug() << "SloxAccounts::cacheFile(): " << file << endl;
+
+ return file;
+}
+
+void SloxAccounts::readAccounts()
+{
+ kdDebug() << "SloxAccounts::readAccounts()" << endl;
+
+ QFile f( cacheFile() );
+ if ( !f.open( IO_ReadOnly ) ) {
+ kdDebug() << "Unable to open '" << cacheFile() << "'" << endl;
+ requestAccounts();
+ return;
+ }
+
+ QDomDocument doc;
+ doc.setContent( &f );
+
+// kdDebug() << "SLOX ACCOUNTS: " << doc.toString( 2 ) << endl;
+
+ QDomElement docElement = doc.documentElement();
+
+ mUsers.clear();
+
+ QDomNodeList nodes = doc.elementsByTagName( mRes->resType() == "ox" ? "ox:user" : "user" );
+ for( uint i = 0; i < nodes.count(); ++i ) {
+ QDomElement element = nodes.item(i).toElement();
+ QString id;
+ KABC::Addressee a;
+ QDomNode n;
+ for( n = element.firstChild(); !n.isNull(); n = n.nextSibling() ) {
+ QDomElement e = n.toElement();
+ QString tag = e.tagName();
+ // remove XML namespace
+ tag = tag.right( tag.length() - ( tag.find( ':' ) + 1 ) );
+ QString value = e.text();
+ if ( tag == "uid" ) id = value;
+ else if ( tag == "mail" ) a.insertEmail( value, true );
+ else if ( tag == "forename" ) a.setGivenName( value );
+ else if ( tag == "surename" ) a.setFamilyName( value );
+ }
+// kdDebug() << "MAIL: " << a.preferredEmail() << endl;
+ insertUser( id, a );
+ }
+}
+
+#include "sloxaccounts.moc"