summaryrefslogtreecommitdiffstats
path: root/kresources/groupwise/kcal_resourcegroupwise.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kresources/groupwise/kcal_resourcegroupwise.cpp')
-rw-r--r--kresources/groupwise/kcal_resourcegroupwise.cpp340
1 files changed, 340 insertions, 0 deletions
diff --git a/kresources/groupwise/kcal_resourcegroupwise.cpp b/kresources/groupwise/kcal_resourcegroupwise.cpp
new file mode 100644
index 000000000..1467116d1
--- /dev/null
+++ b/kresources/groupwise/kcal_resourcegroupwise.cpp
@@ -0,0 +1,340 @@
+/*
+ This file is part of kdepim.
+
+ Copyright (c) 2004 Cornelius Schumacher <schumacher@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 "kcal_resourcegroupwise.h"
+
+#include "kcal_groupwiseprefsbase.h"
+#include "kcal_resourcegroupwiseconfig.h"
+
+#include "soap/groupwiseserver.h"
+
+#include <libkcal/icalformat.h>
+#include <libkcal/calendarlocal.h>
+#include <libkcal/confirmsavedialog.h>
+
+#include <qapplication.h>
+#include <qdatetime.h>
+#include <qptrlist.h>
+#include <qstringlist.h>
+#include <qtimer.h>
+
+#include <kabc/locknull.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kresources/configwidget.h>
+#include <kstandarddirs.h>
+#include <kstringhandler.h>
+#include <kurl.h>
+#include <libkdepim/kpimprefs.h>
+
+using namespace KCal;
+
+ResourceGroupwise::ResourceGroupwise()
+ : ResourceCached( 0 ), mLock( true )
+{
+ init();
+
+ mPrefs->addGroupPrefix( identifier() );
+}
+
+ResourceGroupwise::ResourceGroupwise( const KConfig *config )
+ : ResourceCached( config ), mLock( true )
+{
+ init();
+
+ mPrefs->addGroupPrefix( identifier() );
+
+ if ( config ) readConfig( config );
+}
+
+ResourceGroupwise::~ResourceGroupwise()
+{
+ disableChangeNotification();
+
+ delete mPrefs;
+ mPrefs = 0;
+}
+
+void ResourceGroupwise::init()
+{
+ mDownloadJob = 0;
+ mProgress = 0;
+
+ mIsShowingError = false;
+
+ mPrefs = new GroupwisePrefsBase();
+
+ setType( "groupwise" );
+
+ enableChangeNotification();
+}
+
+GroupwisePrefsBase *ResourceGroupwise::prefs()
+{
+ return mPrefs;
+}
+
+void ResourceGroupwise::readConfig( const KConfig *config )
+{
+ kdDebug() << "KCal::ResourceGroupwise::readConfig()" << endl;
+
+ mPrefs->readConfig();
+
+ ResourceCached::readConfig( config );
+}
+
+void ResourceGroupwise::writeConfig( KConfig *config )
+{
+ kdDebug() << "KCal::ResourceGroupwise::writeConfig()" << endl;
+
+ ResourceCalendar::writeConfig( config );
+
+ mPrefs->writeConfig();
+
+ ResourceCached::writeConfig( config );
+}
+
+bool ResourceGroupwise::doOpen()
+{
+ return true;
+}
+
+void ResourceGroupwise::doClose()
+{
+ ResourceCached::doClose();
+}
+
+bool ResourceGroupwise::doLoad()
+{
+ kdDebug() << "ResourceGroupwise::load()" << endl;
+
+ if ( mIsShowingError ) {
+ kdDebug() << "Still showing error" << endl;
+ return true;
+ }
+
+ if ( mDownloadJob ) {
+ kdDebug() << "Download still in progress" << endl;
+ return true;
+ }
+
+ mCalendar.close();
+
+ disableChangeNotification();
+ loadCache();
+ enableChangeNotification();
+
+ emit resourceChanged( this );
+
+ clearChanges();
+
+ KURL url( prefs()->url() );
+ if ( url.protocol() == "http" ) url.setProtocol( "groupwise" );
+ else url.setProtocol( "groupwises" );
+ url.setPath( "/calendar/" );
+ url.setUser( prefs()->user() );
+ url.setPass( prefs()->password() );
+
+ kdDebug() << "Download URL: " << url << endl;
+
+ mJobData = QString::null;
+
+ mDownloadJob = KIO::get( url, false, false );
+ connect( mDownloadJob, SIGNAL( result( KIO::Job * ) ),
+ SLOT( slotJobResult( KIO::Job * ) ) );
+ connect( mDownloadJob, SIGNAL( data( KIO::Job *, const QByteArray & ) ),
+ SLOT( slotJobData( KIO::Job *, const QByteArray & ) ) );
+
+ mProgress = KPIM::ProgressManager::instance()->createProgressItem(
+ KPIM::ProgressManager::getUniqueID(), i18n("Downloading calendar") );
+ connect( mProgress,
+ SIGNAL( progressItemCanceled( KPIM::ProgressItem * ) ),
+ SLOT( cancelLoad() ) );
+
+ return true;
+}
+
+void ResourceGroupwise::slotJobResult( KIO::Job *job )
+{
+ kdDebug() << "ResourceGroupwise::slotJobResult(): " << endl;
+
+ if ( job->error() ) {
+ mIsShowingError = true;
+ loadError( job->errorString() );
+ mIsShowingError = false;
+ } else {
+ disableChangeNotification();
+
+ clearCache();
+
+ // FIXME: This does not take into account the time zone!
+ CalendarLocal calendar( QString::fromLatin1("UTC") );
+ ICalFormat ical;
+ if ( !ical.fromString( &calendar, mJobData ) ) {
+ loadError( i18n("Error parsing calendar data.") );
+ } else {
+ Incidence::List incidences = calendar.incidences();
+ Incidence::List::ConstIterator it;
+ for( it = incidences.begin(); it != incidences.end(); ++it ) {
+// kdDebug() << "INCIDENCE: " << (*it)->summary() << endl;
+ Incidence *i = (*it)->clone();
+ QString remote = (*it)->customProperty( "GWRESOURCE", "UID" );
+ QString local = idMapper().localId( remote );
+ if ( local.isEmpty() ) {
+ idMapper().setRemoteId( i->uid(), remote );
+ } else {
+ i->setUid( local );
+ }
+ addIncidence( i );
+ }
+ }
+ saveCache();
+ enableChangeNotification();
+
+ clearChanges();
+
+ emit resourceChanged( this );
+ emit resourceLoaded( this );
+ }
+
+ mDownloadJob = 0;
+ if ( mProgress ) mProgress->setComplete();
+ mProgress = 0;
+}
+
+void ResourceGroupwise::slotJobData( KIO::Job *, const QByteArray &data )
+{
+// kdDebug() << "ResourceGroupwise::slotJobData()" << endl;
+
+ mJobData.append( data.data() );
+}
+
+bool ResourceGroupwise::doSave()
+{
+ kdDebug() << "KCal::ResourceGroupwise::doSave()" << endl;
+
+ saveCache();
+
+ if ( !hasChanges() ) {
+ kdDebug() << "No changes" << endl;
+ return true;
+ }
+
+ if ( !confirmSave() ) return false;
+
+ GroupwiseServer server( mPrefs->url(), mPrefs->user(), mPrefs->password(),
+ 0 );
+
+ if ( !server.login() ) {
+ kdError() << "Unable to login to server" << endl;
+ emit resourceSaveError( this, i18n( "Unable to login to server: " ) + server.errorText() );
+ return false;
+ }
+
+ Incidence::List::ConstIterator it;
+
+ Incidence::List added = addedIncidences();
+ for( it = added.begin(); it != added.end(); ++it ) {
+ if ( server.addIncidence( *it, this ) ) {
+ clearChange( *it );
+ saveCache();
+ }
+ }
+ Incidence::List changed = changedIncidences();
+ for( it = changed.begin(); it != changed.end(); ++it ) {
+ if ( server.changeIncidence( *it ) ) clearChange( *it );
+ }
+ Incidence::List deleted = deletedIncidences();
+ for( it = deleted.begin(); it != deleted.end(); ++it ) {
+ if ( server.deleteIncidence( *it ) ) clearChange( *it );
+ }
+
+ server.logout();
+
+ return true;
+}
+
+// FIXME: Put this into ResourceCached
+bool ResourceGroupwise::confirmSave()
+{
+ if ( !hasChanges() ) return true;
+
+ ConfirmSaveDialog dlg( resourceName(), 0 );
+
+ dlg.addIncidences( addedIncidences(), i18n("Added") );
+ dlg.addIncidences( changedIncidences(), i18n("Changed") );
+ dlg.addIncidences( deletedIncidences(), i18n("Deleted") );
+
+ int result = dlg.exec();
+ return result == QDialog::Accepted;
+}
+
+KABC::Lock *ResourceGroupwise::lock()
+{
+ return &mLock;
+}
+
+void ResourceGroupwise::cancelLoad()
+{
+ if ( mDownloadJob ) mDownloadJob->kill();
+ mDownloadJob = 0;
+ if ( mProgress ) mProgress->setComplete();
+ mProgress = 0;
+}
+
+bool ResourceGroupwise::userSettings( ngwt__Settings *&settings )
+{
+ kdDebug() << "ResourceGroupwise::userSettings()" << endl;
+
+ GroupwiseServer server( prefs()->url(),
+ prefs()->user(),
+ prefs()->password(), this );
+
+ server.login();
+ // get these out again, once we discover their format.
+ bool success = server.readUserSettings( settings );
+ server.logout();
+ return success;
+}
+
+bool ResourceGroupwise::modifyUserSettings( QMap<QString, QString> & settings )
+{
+ kdDebug() << "ResourceGroupwise::modifyUserSettings()" << endl;
+
+ if ( settings.isEmpty() )
+ {
+ kdDebug() << "ResourceGroupwise::modifyUserSettings(): no changed settings" << endl;
+ return false;
+ }
+
+
+ GroupwiseServer server( prefs()->url(),
+ prefs()->user(),
+ prefs()->password(), this );
+
+ server.login();
+ // get these out again, once we discover their format.
+ bool success = server.modifyUserSettings( settings );
+ server.logout();
+ return success;
+}
+
+#include "kcal_resourcegroupwise.moc"