You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdesdk/kbugbuster/kresources/kcalresource.cpp

317 lines
7.3 KiB

/*
This file is part of KBugBuster.
Copyright (c) 2003 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 <typeinfo>
#include <stdlib.h>
#include <tqdatetime.h>
#include <tqstring.h>
#include <tqptrlist.h>
#include <kdebug.h>
#include <kurl.h>
#include <kio/job.h>
#include <klocale.h>
#include <kstandarddirs.h>
#include <libkcal/vcaldrag.h>
#include <libkcal/vcalformat.h>
#include <libkcal/icalformat.h>
#include <libkcal/exceptions.h>
#include <libkcal/incidence.h>
#include <libkcal/event.h>
#include <libkcal/todo.h>
#include <libkcal/journal.h>
#include <libkcal/filestorage.h>
#include <kabc/locknull.h>
#include <kresources/configwidget.h>
#include "bugsystem.h"
#include "bugserver.h"
#include "kcalresourceconfig.h"
#include "resourceprefs.h"
#include "kcalresource.h"
KCalResource::KCalResource( const KConfig* config )
: ResourceCached( config ), mLock( 0 )
{
mPrefs = new KBB::ResourcePrefs;
KConfigSkeletonItem::List items = mPrefs->items();
KConfigSkeletonItem::List::Iterator it;
for( it = items.begin(); it != items.end(); ++it ) {
(*it)->setGroup( identifier() );
}
if ( config ) {
readConfig( config );
}
init();
}
KCalResource::~KCalResource()
{
close();
if ( mDownloadJob ) mDownloadJob->kill();
if ( mUploadJob ) mUploadJob->kill();
delete mLock;
}
void KCalResource::init()
{
mDownloadJob = 0;
mUploadJob = 0;
setType( "remote" );
mOpen = false;
mLock = new KABC::LockNull( true );
KConfig config( "kbugbusterrc" );
BugSystem::self()->readConfig( &config );
}
KBB::ResourcePrefs *KCalResource::prefs()
{
return mPrefs;
}
void KCalResource::readConfig( const KConfig * )
{
mPrefs->readConfig();
}
void KCalResource::writeConfig( KConfig *config )
{
kdDebug() << "KCalResource::writeConfig()" << endl;
ResourceCalendar::writeConfig( config );
mPrefs->writeConfig();
}
TQString KCalResource::cacheFile()
{
TQString file = locateLocal( "cache", "kcal/kresources/" + identifier() );
kdDebug() << "KCalResource::cacheFile(): " << file << endl;
return file;
}
bool KCalResource::doOpen()
{
kdDebug(5800) << "KCalResource::doOpen()" << endl;
mOpen = true;
return true;
}
bool KCalResource::doLoad()
{
kdDebug() << "KCalResource::doLoad()" << endl;
if ( !mOpen ) return true;
if ( mDownloadJob ) {
kdWarning() << "KCalResource::doLoad(): download still in progress."
<< endl;
return false;
}
if ( mUploadJob ) {
kdWarning() << "KCalResource::doLoad(): upload still in progress."
<< endl;
return false;
}
mCalendar.close();
mCalendar.load( cacheFile() );
BugSystem *kbb = BugSystem::self();
kdDebug() << "KNOWN SERVERS:" << endl;
TQValueList<BugServer *> servers = kbb->serverList();
TQValueList<BugServer *>::ConstIterator it;
for( it = servers.begin(); it != servers.end(); ++it ) {
kdDebug() << " " << (*it)->identifier() << endl;
}
kbb->setCurrentServer( mPrefs->server() );
if ( !kbb->server() ) {
kdError() << "Server not found." << endl;
return false;
} else {
kdDebug() << "CURRENT SERVER: " << kbb->server()->identifier() << endl;
}
kbb->retrievePackageList();
Package package = kbb->package( mPrefs->product() );
connect( kbb, TQT_SIGNAL( bugListAvailable( const Package &, const TQString &,
const Bug::List & ) ),
TQT_SLOT( slotBugListAvailable( const Package &, const TQString &,
const Bug::List & ) ) );
kbb->retrieveBugList( package, mPrefs->component() );
return true;
}
void KCalResource::slotBugListAvailable( const Package &, const TQString &,
const Bug::List &bugs )
{
kdDebug() << "KCalResource::slotBugListAvailable()" << endl;
if ( bugs.isEmpty() ) return;
TQString masterUid = "kbb_" + BugSystem::self()->server()->identifier();
KCal::Todo *masterTodo = mCalendar.todo( masterUid );
if ( !masterTodo ) {
masterTodo = new KCal::Todo;
masterTodo->setUid( masterUid );
masterTodo->setSummary( resourceName() );
mCalendar.addTodo( masterTodo );
}
Bug::List::ConstIterator it;
for( it = bugs.begin(); it != bugs.end(); ++it ) {
Bug bug = *it;
kdDebug() << " Bug " << bug.number() << ": " << bug.title() << endl;
TQString uid = "KBugBuster_" + bug.number();
KCal::Todo *newTodo = 0;
KCal::Todo *todo = mCalendar.todo( uid );
if ( !todo ) {
newTodo = new KCal::Todo;
newTodo->setUid( uid );
TQString uri = "http://bugs.kde.org/show_bug.cgi?id=%1";
newTodo->addAttachment( new KCal::Attachment( uri.tqarg( bug.number() ) ) );
todo = newTodo;
}
todo->setSummary( bug.number() + ": " + bug.title() );
todo->setRelatedTo( masterTodo );
if ( newTodo ) mCalendar.addTodo( newTodo );
}
emit resourceChanged( this );
}
void KCalResource::slotLoadJobResult( KIO::Job *job )
{
if ( job->error() ) {
job->showErrorDialog( 0 );
} else {
kdDebug() << "KCalResource::slotLoadJobResult() success" << endl;
mCalendar.close();
mCalendar.load( cacheFile() );
emit resourceChanged( this );
}
mDownloadJob = 0;
emit resourceLoaded( this );
}
bool KCalResource::doSave()
{
kdDebug() << "KCalResource::doSave()" << endl;
if ( !mOpen ) return true;
if ( readOnly() ) {
emit resourceSaved( this );
return true;
}
if ( mDownloadJob ) {
kdWarning() << "KCalResource::save(): download still in progress."
<< endl;
return false;
}
if ( mUploadJob ) {
kdWarning() << "KCalResource::save(): upload still in progress."
<< endl;
return false;
}
mCalendar.save( cacheFile() );
mUploadJob = KIO::file_copy( KURL( cacheFile() ), mUploadUrl, -1, true );
connect( mUploadJob, TQT_SIGNAL( result( KIO::Job * ) ),
TQT_SLOT( slotSaveJobResult( KIO::Job * ) ) );
return true;
}
bool KCalResource::isSaving()
{
return mUploadJob;
}
void KCalResource::slotSaveJobResult( KIO::Job *job )
{
if ( job->error() ) {
job->showErrorDialog( 0 );
} else {
kdDebug() << "KCalResource::slotSaveJobResult() success" << endl;
}
mUploadJob = 0;
emit resourceSaved( this );
}
void KCalResource::doClose()
{
if ( !mOpen ) return;
mCalendar.close();
mOpen = false;
}
KABC::Lock *KCalResource::lock()
{
return mLock;
}
void KCalResource::dump() const
{
ResourceCalendar::dump();
kdDebug(5800) << " DownloadUrl: " << mDownloadUrl.url() << endl;
kdDebug(5800) << " UploadUrl: " << mUploadUrl.url() << endl;
kdDebug(5800) << " ReloadPolicy: " << mReloadPolicy << endl;
}
#include "kcalresource.moc"