tdepim/kresources/groupware/kcal_resourcegroupware.cpp

305 lines
7.2 KiB

/*
This file is part of tdepim.
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 <tqapplication.h>
#include <tqdatetime.h>
#include <tqptrlist.h>
#include <tqstringlist.h>
#include <tqtimer.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 <libtdepim/kpimprefs.h>
#include <libtdepim/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 );
} else {
setResourceName( i18n( "Groupware Server" ) );
}
}
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 = TQString();
mDownloadJob = KPIM::GroupwareJob::getCalendar( url );
connect( mDownloadJob, TQT_SIGNAL( result( KIO::Job * ) ),
TQT_SLOT( slotJobResult( KIO::Job * ) ) );
connect( mDownloadJob, TQT_SIGNAL( data( KIO::Job *, const TQByteArray & ) ),
TQT_SLOT( slotJobData( KIO::Job *, const TQByteArray & ) ) );
mProgress = KPIM::ProgressManager::instance()->createProgressItem(
KPIM::ProgressManager::getUniqueID(), i18n("Downloading calendar") );
connect( mProgress,
TQT_SIGNAL( progressItemCanceled( KPIM::ProgressItem * ) ),
TQT_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();
TQString remote = (*it)->customProperty( "GWRESOURCE", "UID" );
TQString 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 TQByteArray &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 == TQDialog::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"