summaryrefslogtreecommitdiffstats
path: root/kresources/groupware/kcal_resourcegroupware.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kresources/groupware/kcal_resourcegroupware.cpp')
-rw-r--r--kresources/groupware/kcal_resourcegroupware.cpp300
1 files changed, 300 insertions, 0 deletions
diff --git a/kresources/groupware/kcal_resourcegroupware.cpp b/kresources/groupware/kcal_resourcegroupware.cpp
new file mode 100644
index 000000000..9adbffdd7
--- /dev/null
+++ b/kresources/groupware/kcal_resourcegroupware.cpp
@@ -0,0 +1,300 @@
+/*
+ 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_resourcegroupware.h"
+
+#include "kcal_groupwareprefsbase.h"
+#include "kcal_resourcegroupwareconfig.h"
+
+#include <libkcal/confirmsavedialog.h>
+#include <libkcal/icalformat.h>
+#include <libkcal/calendarlocal.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>
+#include <libkdepim/groupwarejob.h>
+
+using namespace KCal;
+
+ResourceGroupware::ResourceGroupware()
+ : ResourceCached( 0 ), mLock( true ),
+ mProgress( 0 )
+{
+ init();
+
+ mPrefs->addGroupPrefix( identifier() );
+}
+
+ResourceGroupware::ResourceGroupware( const KConfig *config )
+ : ResourceCached( config ), mLock( true )
+{
+ init();
+
+ mPrefs->addGroupPrefix( identifier() );
+
+ if ( config ) readConfig( config );
+}
+
+ResourceGroupware::~ResourceGroupware()
+{
+ disableChangeNotification();
+
+ delete mPrefs;
+ mPrefs = 0;
+}
+
+void ResourceGroupware::init()
+{
+ mDownloadJob = 0;
+ mProgress = 0;
+
+ mIsShowingError = false;
+
+ mPrefs = new GroupwarePrefsBase();
+
+ setType( "groupware" );
+
+ enableChangeNotification();
+}
+
+GroupwarePrefsBase *ResourceGroupware::prefs()
+{
+ return mPrefs;
+}
+
+void ResourceGroupware::readConfig( const KConfig *config )
+{
+ kdDebug() << "KCal::ResourceGroupware::readConfig()" << endl;
+
+ mPrefs->readConfig();
+
+ ResourceCached::readConfig( config );
+}
+
+void ResourceGroupware::writeConfig( KConfig *config )
+{
+ kdDebug() << "KCal::ResourceGroupware::writeConfig()" << endl;
+
+ ResourceCalendar::writeConfig( config );
+
+ mPrefs->writeConfig();
+
+ ResourceCached::writeConfig( config );
+}
+
+bool ResourceGroupware::doOpen()
+{
+ return true;
+}
+
+void ResourceGroupware::doClose()
+{
+ ResourceCached::doClose();
+}
+
+bool ResourceGroupware::doLoad()
+{
+ kdDebug() << "ResourceGroupware::load()" << endl;
+
+ if ( mIsShowingError ) {
+ kdDebug() << "Still showing error" << endl;
+ return true;
+ }
+
+ if ( mDownloadJob ) {
+ kdWarning() << "Download still in progress" << endl;
+ return false;
+ }
+
+ mCalendar.close();
+
+ disableChangeNotification();
+ loadCache();
+ enableChangeNotification();
+
+ emit resourceChanged( this );
+
+ clearChanges();
+
+ KURL url( prefs()->url() );
+ url.setUser( prefs()->user() );
+ url.setPass( prefs()->password() );
+
+ kdDebug() << "Download URL: " << url << endl;
+
+ mJobData = QString::null;
+
+ mDownloadJob = KPIM::GroupwareJob::getCalendar( url );
+ 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 ResourceGroupware::slotJobResult( KIO::Job *job )
+{
+ kdDebug() << "ResourceGroupware::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;
+ 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 ResourceGroupware::slotJobData( KIO::Job *, const QByteArray &data )
+{
+// kdDebug() << "ResourceGroupware::slotJobData()" << endl;
+
+ mJobData.append( data.data() );
+}
+
+void ResourceGroupware::loadFinished()
+{
+ saveCache();
+ enableChangeNotification();
+
+ emit resourceChanged( this );
+ emit resourceLoaded( this );
+}
+
+bool ResourceGroupware::doSave()
+{
+ kdDebug() << "KCal::ResourceGroupware::doSave()" << endl;
+
+ saveCache();
+
+ if ( !hasChanges() ) {
+ kdDebug() << "No changes" << endl;
+ return true;
+ }
+
+ if ( !confirmSave() ) return false;
+
+#if 0
+ Incidence::List::ConstIterator it;
+
+ Incidence::List added = addedIncidences();
+ for( it = added.begin(); it != added.end(); ++it ) {
+ if ( mServer->addIncidence( *it, this ) ) {
+ clearChange( *it );
+ saveCache();
+ }
+ }
+ Incidence::List changed = changedIncidences();
+ for( it = changed.begin(); it != changed.end(); ++it ) {
+ if ( mServer->changeIncidence( *it ) ) clearChange( *it );
+ }
+ Incidence::List deleted = deletedIncidences();
+ for( it = deleted.begin(); it != deleted.end(); ++it ) {
+ if ( mServer->deleteIncidence( *it ) ) clearChange( *it );
+ }
+#endif
+
+ return true;
+}
+
+// FIXME: Put this into ResourceCached
+bool ResourceGroupware::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 *ResourceGroupware::lock()
+{
+ return &mLock;
+}
+
+void ResourceGroupware::cancelLoad()
+{
+ if ( mDownloadJob ) mDownloadJob->kill();
+ mDownloadJob = 0;
+ if ( mProgress ) mProgress->setComplete();
+ mProgress = 0;
+}
+
+#include "kcal_resourcegroupware.moc"