diff options
author | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
---|---|---|
committer | toma <toma@283d02a7-25f6-0310-bc7c-ecb5cbfe19da> | 2009-11-25 17:56:58 +0000 |
commit | 460c52653ab0dcca6f19a4f492ed2c5e4e963ab0 (patch) | |
tree | 67208f7c145782a7e90b123b982ca78d88cc2c87 /kresources/exchange | |
download | tdepim-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/exchange')
-rw-r--r-- | kresources/exchange/Makefile.am | 23 | ||||
-rw-r--r-- | kresources/exchange/dateset.cpp | 280 | ||||
-rw-r--r-- | kresources/exchange/dateset.h | 87 | ||||
-rw-r--r-- | kresources/exchange/exchange.desktop | 54 | ||||
-rw-r--r-- | kresources/exchange/exchange_deprecated.desktop | 49 | ||||
-rw-r--r-- | kresources/exchange/resourceexchange.cpp | 605 | ||||
-rw-r--r-- | kresources/exchange/resourceexchange.h | 248 | ||||
-rw-r--r-- | kresources/exchange/resourceexchangeconfig.cpp | 153 | ||||
-rw-r--r-- | kresources/exchange/resourceexchangeconfig.h | 66 |
9 files changed, 1565 insertions, 0 deletions
diff --git a/kresources/exchange/Makefile.am b/kresources/exchange/Makefile.am new file mode 100644 index 000000000..556e3df69 --- /dev/null +++ b/kresources/exchange/Makefile.am @@ -0,0 +1,23 @@ +METASOURCES = AUTO + +INCLUDES = -I$(top_srcdir)/korganizer/interfaces \ + -I$(top_srcdir)/interfaces \ + -I$(top_srcdir) \ + -I$(top_srcdir)/libkpimexchange/core -I$(top_builddir)/libkpimexchange/core \ + -I$(top_srcdir)/libical/src/libical -I$(top_srcdir)/libical/src/libicalss \ + -I$(top_builddir)/libical/src/libical -I$(top_builddir)/libical/src/libicalss \ + $(all_includes) + +kde_module_LTLIBRARIES = resourcecalendarexchange.la + +resourcecalendarexchange_la_SOURCES = resourceexchange.cpp resourceexchangeconfig.cpp dateset.cpp +resourcecalendarexchange_la_LDFLAGS= $(all_libraries) -module $(KDE_PLUGIN) +resourcecalendarexchange_la_LIBADD= -lkresources \ + $(top_builddir)/libkcal/libkcal.la \ + $(top_builddir)/libkpimexchange/libkpimexchange.la + +servicedir = $(kde_servicesdir)/kresources/kcal +service_DATA= exchange.desktop + +messages: rc.cpp + $(XGETTEXT) *.cpp -o $(podir)/kres_exchange.pot diff --git a/kresources/exchange/dateset.cpp b/kresources/exchange/dateset.cpp new file mode 100644 index 000000000..f79810960 --- /dev/null +++ b/kresources/exchange/dateset.cpp @@ -0,0 +1,280 @@ +/* + This file is part of libkpimexchange. + Copyright (c) 2002 Jan-Pascal van Best <[email protected]> + + 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. +*/ + +// $Id$ + +#include <qptrlist.h> +#include <qdatetime.h> +#include <qpair.h> + +#include <kdebug.h> + +#include "dateset.h" + +DateSet::DateSet() +{ + kdDebug() << "Creating DateSet" << endl; + // mOldestDate = + mDates = new RangeList(); + mDates->setAutoDelete( true ); +} + +DateSet::~DateSet() +{ + kdDebug() << "Deleting DateSet" << endl; + delete mDates; +} + +void DateSet::add( QDate const& date ) +{ + if (mDates->isEmpty()) { + mDates->insert( 0, new QPair<QDate,QDate>( date, date ) ); + return; + } + int i = find( date ); + mDates->insert( i, new QPair<QDate,QDate>( date, date ) ); + tryMerge( i ); + tryMerge( i-1 ); +} + +void DateSet::add( QDate const& from, QDate const& to ) +{ + if (mDates->isEmpty()) { + mDates->insert( 0, new QPair<QDate,QDate>( from, to ) ); + return; + } + uint i = find( from ); + kdDebug() << "Adding range at position " << i << endl; + mDates->insert( i, new QPair<QDate,QDate>( from, to ) ); + + do { + } while ( tryMerge( i ) ); + do { + } while ( tryMerge( i-1 ) ); +/* + QPair<QDate,QDate>* item = mDates->at( i ); + + if (to >= item->first) + return; + + if (to.daysTo( item->first ) == 1 ) + item->first = from; + else + mDates->insert( i, new QPair<QDate,QDate>( from, to ) ); +*/ +} + +void DateSet::remove( QDate const& date ) +{ + if (mDates->isEmpty()) { + return; + } + + uint i = find( date ); + if ( i == mDates->count() ) + return; + + QPair<QDate,QDate>* item = mDates->at( i ); + if ( date < item->first ) + return; + if ( date == item->first ) { + if ( date == item->second ) { + mDates->remove( i ); + } else { + item->first = item->first.addDays( 1 ); + } + return; + } + + if ( date == item->second ) { + item->second = item->second.addDays( -1 ); + } else { + mDates->insert( i, new QPair<QDate,QDate>(item->first, date.addDays( -1 ) ) ); + item->first = date.addDays( 1 ); + } +} + +void DateSet::remove( QDate const& from, QDate const& to ) +{ + if (mDates->isEmpty()) { + return; + } + + uint i = find( from ); + if ( i == mDates->count() ) + return; + + while( i < mDates->count() ) { + QPair<QDate,QDate>* item = mDates->at( i ); + // Check if we're done: next item is later dan removal period + if ( to < item->first ) + break; + + // Check if entire item should be removed + if ( from <= item->first && to >= item->second ) { + mDates->remove( i ); + // Don't skip the next range + continue; + } + + // Check if we should take a slice out of the middle of the item + if ( from > item->first && to < item->second ) { + mDates->insert( i, new QPair<QDate,QDate>( item->first, from.addDays( -1 ) ) ); + item->first = to.addDays( 1 ); + break; // We're done + } + + // Now check if we should take off the beginning of the item + if ( from <= item->first ) { + item->first = to.addDays( 1 ); + // Finished + break; + } + + // Only one possibility left: we should take off the end + // of the current range + item->second = from.addDays( -1 ); + i++; + } +} + +bool DateSet::contains( QDate const& date ) +{ + if (mDates->isEmpty()) { + return false; + } + + uint i = find( date ); +// kdDebug() << "contains looking for " << date.toString() << " at range " << i << endl; + if ( i == mDates->count() ) + return false; + + QPair<QDate,QDate>* item = mDates->at( i ); + // kdDebug() << "contains looking at range " << item->first.toString() << " -- " << item->second.toString() << endl; + return ( item->first <= date ); +} + +// returns true if and only if the whole range is in the set +bool DateSet::contains( QDate const& from, QDate const& to ) +{ + if (mDates->isEmpty()) { + return false; + } + + uint i = find( from ); + if ( i == mDates->count() ) + return false; + + QPair<QDate,QDate>* item = mDates->at( i ); + + return ( from >= item->first && to <= item->second ); +} + +// Finds the index in mDates of the range containing date, if it +// exists. Else, return the index of the range following the date. +// If mDates is empty, return 0. +// If date is later than the last item in mDates, return mDates->count() + +int DateSet::find( QDate const& date ) +{ + if ( mDates->isEmpty() ) + return 0; + + int start = 0; + int end = mDates->count(); + while ( start < end ) { + int i = start + (end-start) / 2; + // kdDebug() << start << ", " << i << ", " << end << endl; + QPair<QDate,QDate> *item = mDates->at( i ); + if ( item->first <= date && date <= item->second ) + return i; + if ( date > item->second ) { + start = i+1; + } else { // this means date < item->first + end = i; + } + } + + // kdDebug() << "Found for date " << date.toString() << " range " << end << endl; + return end; +/* + // Now either start==end or start+1 == end + if ( mDates->at( end )->second < date ) + return end+1; + else if (mDates->at( start )->first > date ) + return start; + else + return end; +*/ +} + +void DateSet::print() +{ + for( uint i=0; i<mDates->count(); i++ ) + { + QDate start = mDates->at( i )->first; + QDate end = mDates->at( i )->second; + if (start == end) + kdDebug() << start.toString() << endl; + else + kdDebug() << "(" << start.toString() << " , " << end.toString() << ")" << endl; + } +} + +// Try and merge range i with range i+1 +// NOT TRUE preconditions: range i starts before range i+1, but MAY end later! +// preconditions: range i starts before or in range i+1 +bool DateSet::tryMerge( int i ) +{ + if ( i < 0 || i+1 >= (int)(mDates->count()) ) + return false; + + QPair<QDate,QDate>* item1 = mDates->at( i ); + QPair<QDate,QDate>* item2 = mDates->at( i+1 ); + + // First case: item1 starts before or on the same date as item2 + if ( item1->first <= item2->first ) { + // Check for overlap + if ( item1->second >= item2->first || + item1->second.daysTo( item2->first ) == 1 ) { + kdDebug() << "Merging items " << i << " and " << (i+1) << endl; + if (item1->second < item2->second) item1->second = item2->second; + mDates->remove( i+1 ); + return true; + } + return false; + } + + // Second case: item1 starts later than item2 (but at the latest on + // the last day of item2, see preconditions!) + + // Check for overlap + if ( item1->second >= item2->first || + item1->second.daysTo( item2->first ) == 1 ) { + kdDebug() << "Merging items " << i << " and " << (i+1) << endl; + if (item1->second < item2->second) item1->second = item2->second; + item1->first = item2->first; + mDates->remove( i+1 ); + return true; + } + return false; +} + + diff --git a/kresources/exchange/dateset.h b/kresources/exchange/dateset.h new file mode 100644 index 000000000..5041f0d58 --- /dev/null +++ b/kresources/exchange/dateset.h @@ -0,0 +1,87 @@ +/* + This file is part of libkpimexchange. + Copyright (c) 2002 Jan-Pascal van Best <[email protected]> + + 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. +*/ + +// $Id$ + +#ifndef _DATESET_H +#define _DATESET_H + +#include <qdatetime.h> +#include <qpair.h> +#include <qptrlist.h> + +/* +class DateRange { + public: + DateRange() { } + DateRange( QDate const& from, QDate const& to ) + : mFrom( from ), mTo( to ) { } + bool operator< ( const DateRange& r ) { return mFrom < r.from(); } + bool contains( QDate const& d ) { return ( mFrom <= d && d <= mTo ); } + bool contains( QDate const& from, QDate const& to ) { return ( mFrom <= from && to <= mTo ); } + + QDate from() { return mFrom; } + QDate to() { return mTo; } + + private: + QDate mFrom; + QDate mTo; +} +*/ + +class RangeList : public QPtrList< QPair<QDate, QDate> > { + protected: + virtual int compareItems(QPtrCollection::Item item1, QPtrCollection::Item item2) { + QPair<QDate,QDate> *i1 = static_cast<QPair<QDate,QDate> *> (item1); + QPair<QDate,QDate> *i2 = static_cast<QPair<QDate,QDate> *> (item2); + if ( *i1 < *i2 ) return -1; + if ( *i2 < *i1 ) return 1; + return 0; + } +}; + +class DateSet { + public: + DateSet(); + ~DateSet(); + + void add( QDate const& date ); + void add( QDate const& from, QDate const& to ); + + void remove( QDate const& date ); + void remove( QDate const& from, QDate const& to ); + + bool contains( QDate const& date ); + // returns true if and only if the whole range is in the set + bool contains( QDate const& from, QDate const& to ); + + int find( QDate const &date ); + void print(); + + protected: + private: + bool tryMerge( int i ); + RangeList *mDates; + + QDate mOldestDate; + QDate mNewestDate; +}; + +#endif diff --git a/kresources/exchange/exchange.desktop b/kresources/exchange/exchange.desktop new file mode 100644 index 000000000..9342e3baa --- /dev/null +++ b/kresources/exchange/exchange.desktop @@ -0,0 +1,54 @@ +[Desktop Entry] +Type=Service +X-KDE-Library=resourcecalendarexchange +X-KDE-ResourceFamily=calendar +X-KDE-ResourceType=exchange +ServiceTypes=KResources/Plugin +Name=Exchange 2000 Server +Name[af]=Exchange 2000 Bediener +Name[be]=Сэрвэр Exchange 2000 +Name[bg]=Сървър Exchange 2000 +Name[br]=Servijer Exchange 2000 +Name[ca]=Servidor Exchange 2000 +Name[cs]=Exchange 2000 server +Name[da]=Exchange 2000 server +Name[el]=Εξυπηρετητής Exchange2000 +Name[es]=Servidor Exchange 2000 +Name[et]=Exchange 2000 server +Name[eu]=Exchange 2000 zerbitzaria +Name[fa]=کارساز Exchange ۲۰۰۰ +Name[fi]=Exchange 2000 -palvelin +Name[fr]=Serveur Exchange2000 +Name[fy]=Exchange2000-tsjinner +Name[ga]=Freastalaí Exchange 2000 +Name[gl]=Servidor Exchange 2000 +Name[hu]=Exchange 2000-kiszolgáló +Name[is]=Exchange 2000 þjónn +Name[it]=Server Exchange 2000 +Name[ja]=Exchange 2000 サーバ +Name[ka]=სერვერი Exchange 2000 +Name[kk]=MS Exchange 2000 сервері +Name[km]=ម៉ាស៊ីនបម្រើ Exchange ២០០០ +Name[lt]=Exchange 2000 serveris +Name[mk]=Exchange 2000-сервер +Name[ms]=Pelayan Exchange 2000 +Name[nb]=Exchange 2000-tjener +Name[nds]=Exchange2000-Server +Name[ne]=एक्सचेन्ज 2000 सर्भर +Name[nl]=Exchange2000-server +Name[nn]=Exchange 2000-tenar +Name[pl]=Serwer Exchange 2000 +Name[pt]=Servidor Exchange 2000 +Name[pt_BR]=Servidor Exchange2000 +Name[ru]=Сервер Microsoft Exchange 2000 +Name[sk]=Exchange 2000 server +Name[sl]=Strežnik Exchange 2000 +Name[sr]=Exchange 2000 сервер +Name[sr@Latn]=Exchange 2000 server +Name[sv]=Exchange 2000-server +Name[ta]=பரிமாற்ற 2000 சேவகன் +Name[tr]=Exchange 2000 Sunucusu +Name[uk]=Сервер Exchange 2000 +Name[zh_CN]=Exchange 2000 服务器 +Name[zh_TW]=Exchange 2000 伺服器 + diff --git a/kresources/exchange/exchange_deprecated.desktop b/kresources/exchange/exchange_deprecated.desktop new file mode 100644 index 000000000..70ffbc63f --- /dev/null +++ b/kresources/exchange/exchange_deprecated.desktop @@ -0,0 +1,49 @@ +[Desktop Entry] +Hidden=true +Name=Exchange 2000 Server (deprecated) +Name[af]=Exchange 2000 Bediener (nie verder ondersteun) +Name[bg]=Сървър Exchange 2000 (остаряло) +Name[ca]=Servidor Exchange 2000 (desaconsellat) +Name[cs]=Exchange 2000 server (zastaralé) +Name[da]=Exchange 2000 server (forældet) +Name[de]=Exchange 2000 Server (veraltet) +Name[el]=Εξυπηρετητής Exchange2000 (ξεπερασμένος) +Name[es]=Servidor Exchange 2000 (obsoleto) +Name[et]=Exchange 2000 server (iganenud) +Name[eu]=Exchange 2000 zerbitzaria (zaharkituta) +Name[fa]=کارسازExchange ۲۰۰۰ (محکوم) +Name[fi]=Exchange 2000 -palvelin (vanhentunut) +Name[fr]=Serveur Exchange2000 (désuet) +Name[fy]=Exchange 2000-tsjinner (ôfrieden) +Name[ga]=Freastalaí Exchange 2000 (as dáta) +Name[gl]=Servidor Exchange 2000 (desaprobado) +Name[hu]=Exchange 2000-kiszolgáló (elavult) +Name[is]=Exchange 2000 þjónn (úrelt) +Name[it]=Server Exchange 2000 (deprecato) +Name[ja]=Exchange 2000 サーバ (廃止予定) +Name[ka]=სერვერი Exchange 2000 (მოძველებული) +Name[kk]=MS Exchange 2000 сервері (ескірген) +Name[km]=ម៉ាស៊ីនបម្រើ Exchange ២០០០ (មិនសូវល្អ) +Name[lt]=Exchange 2000 serveris (deprecated) +Name[mk]=Exchange 2000-сервер (застарено) +Name[ms]=Pelayan Exchange 2000 (tidak disetujui) +Name[nb]=Exchange 2000-tjener (frarådet) +Name[nds]=Exchange2000-Server (utlopen Ünnerstütten) +Name[ne]=एक्सचेन्ज २००० सर्भर (अनुचित ठानिएको) +Name[nl]=Exchange 2000-server (afgeraden) +Name[nn]=Exchange 2000-tenar (frårådd) +Name[pl]=Serwer Exchange 2000 (przestarzałe) +Name[pt]=Servidor Exchange 2000 (depreciado) +Name[pt_BR]=Servidor Exchange2000 (versão de compatibilidade) +Name[ru]=Сервер Microsoft Exchange 2000 (устаревший) +Name[sk]=Exchange 2000 server (deprecated) +Name[sl]=Strežnik Exchange 2000 (opuščeno) +Name[sr]=Exchange 2000 сервер (неодобраван) +Name[sr@Latn]=Exchange 2000 server (neodobravan) +Name[sv]=Exchange 2000-server (avråds från) +Name[ta]=பரிமாற்ற 2000 சேவகன் (மாறுபாடானது) +Name[tr]=Exchange 2000 Sunucusu +Name[uk]=Сервер Exchange 2000 (застаріле) +Name[zh_CN]=Exchange 2000 服务器(不推荐使用) +Name[zh_TW]=Exchange 2000 伺服器(已廢除) + diff --git a/kresources/exchange/resourceexchange.cpp b/kresources/exchange/resourceexchange.cpp new file mode 100644 index 000000000..355244922 --- /dev/null +++ b/kresources/exchange/resourceexchange.cpp @@ -0,0 +1,605 @@ +/* + This file is part of libkpimexchange. + Copyright (c) 2002 Jan-Pascal van Best <[email protected]> + + 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 <stdlib.h> + +#include <qdatetime.h> +#include <qstring.h> +#include <qptrlist.h> +#include <qwidgetlist.h> +#include <qwidget.h> + +#include <kdebug.h> +#include <kapplication.h> +#include <kstringhandler.h> +#include <kglobal.h> +#include <klocale.h> + +#include <libkcal/calendarlocal.h> +#include <libkcal/calendar.h> +#include <libkcal/journal.h> + +#include <kresources/configwidget.h> + +#include <kabc/locknull.h> + +#include "dateset.h" +#include "exchangeaccount.h" +#include "exchangeclient.h" +#include "exchangemonitor.h" + +#include "resourceexchange.h" +#include "resourceexchangeconfig.h" + + +using namespace KCal; +using namespace KPIM; + +typedef KRES::PluginFactory<ResourceExchange,ResourceExchangeConfig> ExchangeFactory; + +// FIXME: Use K_EXPORT_COMPONENT_FACTORY( resourcecalendarexchange, ExchangeFactory ); here +// Problem: How to insert the catalogue! +extern "C" +{ + void* init_resourcecalendarexchange() + { + KGlobal::locale()->insertCatalogue( "kres_exchange" ); + return new ExchangeFactory; + } +} + +class ResourceExchange::EventInfo { +public: + KCal::Event* event; + KURL url; + long updateWatch; +}; + +ResourceExchange::ResourceExchange( const KConfig *config ) + : ResourceCalendar( config ), mClient(0), mMonitor(0), mCache(0), mDates(0), + mEventDates(0), mCacheDates(0) +{ + mLock = new KABC::LockNull( true ); + + mTimeZoneId = QString::fromLatin1( "UTC" ); + + kdDebug() << "Creating ResourceExchange" << endl; + if (config ) { + mAccount = new ExchangeAccount( + config->readEntry( "ExchangeHost" ), + config->readEntry( "ExchangePort" ), + config->readEntry( "ExchangeAccount" ), + KStringHandler::obscure( config->readEntry( "ExchangePassword" ) ), + config->readEntry( "ExchangeMailbox" ) ); + mCachedSeconds = config->readNumEntry( "ExchangeCacheTimeout", 600 ); + mAutoMailbox = config->readBoolEntry( "ExchangeAutoMailbox", true ); + } else { + mAccount = new ExchangeAccount( "", "", "", "" ); + mCachedSeconds = 600; + } +} + +ResourceExchange::~ResourceExchange() +{ + kdDebug() << "Destructing ResourceExchange" << endl; + + close(); + + delete mAccount; mAccount = 0; +} + +void ResourceExchange::writeConfig( KConfig* config ) +{ + ResourceCalendar::writeConfig( config ); + config->writeEntry( "ExchangeHost", mAccount->host() ); + config->writeEntry( "ExchangePort", mAccount->port() ); + config->writeEntry( "ExchangeAccount", mAccount->account() ); + config->writeEntry( "ExchangeMailbox", mAccount->mailbox() ); + config->writeEntry( "ExchangePassword", KStringHandler::obscure( mAccount->password() ) ); + config->writeEntry( "ExchangeCacheTimeout", mCachedSeconds ); + config->writeEntry( "ExchangeAutoMailbox", mAutoMailbox ); +} + +bool ResourceExchange::doOpen() +{ + kdDebug() << "ResourceExchange::doOpen()" << endl; + + mClient = new ExchangeClient( mAccount, mTimeZoneId ); + connect( mClient, SIGNAL( downloadFinished( int, const QString & ) ), + SLOT( slotDownloadFinished( int, const QString & ) ) ); + connect( mClient, SIGNAL( event( KCal::Event *, const KURL & ) ), + SLOT( downloadedEvent( KCal::Event *, const KURL & ) ) ); + +#if 0 + kdDebug() << "Creating monitor" << endl; + QHostAddress ip; + ip.setAddress( mAccount->host() ); + mMonitor = new ExchangeMonitor( mAccount, ExchangeMonitor::CallBack, ip ); + connect( mMonitor, SIGNAL(notify( const QValueList<long>& , const QValueList<KURL>& )), this, SLOT(slotMonitorNotify( const QValueList<long>& , const QValueList<KURL>& )) ); + connect( mMonitor, SIGNAL(error(int , const QString&)), this, SLOT(slotMonitorError(int , const QString&)) ); + + mMonitor->addWatch( mAccount->calendarURL(), ExchangeMonitor::UpdateNewMember, 1 ); +#endif + + QWidgetList* widgets = QApplication::topLevelWidgets(); + if ( !widgets->isEmpty() ) + mClient->setWindow( widgets->first() ); + delete widgets; + + mDates = new DateSet(); + + mEventDates = new QMap<Event,QDateTime>(); + mCacheDates = new QMap<QDate, QDateTime>(); + + mCache = new CalendarLocal( mTimeZoneId ); + // mOldestDate = 0L; + // mNewestDate = 0L; + + // FIXME: check if server exists, account is OK, etc. + return true; +} + +void ResourceExchange::doClose() +{ + kdDebug() << "ResourceExchange::doClose()" << endl; + + // delete mNewestDate; + // delete mOldestDate; + delete mDates; mDates = 0; +// delete mMonitor; mMonitor = 0; + delete mClient; mClient = 0; + delete mEventDates; mEventDates = 0; + delete mCacheDates; mCacheDates = 0; + if (mCache) { + mCache->close(); + delete mCache; mCache = 0; + } +// setModified( false ); +} + +bool ResourceExchange::doLoad() +{ + return true; +} + +bool ResourceExchange::doSave() +{ + kdDebug() << "ResourceExchange::save() " << mChangedIncidences.count() + << endl; + + Incidence::List::Iterator it = mChangedIncidences.begin(); + while( it != mChangedIncidences.end() ) { + if ( (*it)->type() == "Event" ) { + if ( uploadEvent( static_cast<Event *>( *it ) ) ) { + it = mChangedIncidences.remove( it ); + } else { + kdError() << "ResourceExchange::save(): upload failed." << endl; + ++it; + } + } else { + kdError() << "ResourceExchange::save() type not handled: " + << (*it)->type() << endl; + ++it; + } + } + return true; +} + +KABC::Lock *ResourceExchange::lock() +{ + return mLock; +} + +void ResourceExchange::slotMonitorNotify( const QValueList<long>& IDs, const QValueList<KURL>& urls ) +{ + kdDebug() << "ResourceExchange::slotMonitorNotify()" << endl; + + QString result; + KPIM::ExchangeMonitor::IDList::ConstIterator it; + for ( it = IDs.begin(); it != IDs.end(); ++it ) { + if ( it == IDs.begin() ) + result += QString::number( (*it) ); + else + result += "," + QString::number( (*it) ); + } + kdDebug() << "Got signals for " << result << endl; + QValueList<KURL>::ConstIterator it2; + for ( it2 = urls.begin(); it2 != urls.end(); ++it2 ) { + kdDebug() << "URL: " << (*it2).prettyURL() << endl; + } + + /* Now find out what happened: + * One or more of the following: + * 1. Event added in period that we think we have cached + * 2. Event deleted that we have in cache + * 3. Event modified that we have in cache + * 4. Something else happened that isn't relevant to us + * Update cache, then notify whoever's watching us + * We may be able to find (1) and (3) by looking at the + * DAV:getlastmodified property + * (2) is trickier: we might have to resort to checking + * all uids in the cache + * Or: put monitors on every event in the cache, so that + * we know when one gets deleted or modified + * Only look for new events using the global monitor + */ +} + +void ResourceExchange::slotMonitorError( int errorCode, const QString& moreInfo ) +{ + kdError() << "Ignoring error from Exchange monitor, code=" << errorCode << "; more info: " << moreInfo << endl; +} + + +bool ResourceExchange::addEvent(Event *anEvent) +{ + if( !mCache ) return false; + kdDebug() << "ResourceExchange::addEvent" << endl; + + // FIXME: first check of upload finished successfully, only then + // add to cache + mCache->addEvent( anEvent ); + + uploadEvent( anEvent ); +// insertEvent(anEvent); + + anEvent->registerObserver( this ); +// setModified( true ); + + return true; +} + +bool ResourceExchange::uploadEvent( Event *event ) +{ + mClient->uploadSynchronous( event ); + return true; +} + +bool ResourceExchange::deleteEvent(Event *event) +{ + if ( !mCache ) return false; + kdDebug(5800) << "ResourceExchange::deleteEvent" << endl; + + mClient->removeSynchronous( event ); + + // This also frees the event + return mCache->deleteEvent( event ); + +// setModified( true ); +} + +void ResourceExchange::changeIncidence( Incidence *incidence ) +{ + kdDebug() << "ResourceExchange::changeIncidence(): " + << incidence->summary() << endl; + + if ( mChangedIncidences.find( incidence ) == mChangedIncidences.end() ) { + mChangedIncidences.append( incidence ); + } +} + +Event *ResourceExchange::event( const QString &uid ) +{ + kdDebug(5800) << "ResourceExchange::event(): " << uid << endl; + + // FIXME: Look in exchange server for uid! + Event *event = 0; + if ( mCache ) + event = mCache->event( uid ); + return event; +} + +void ResourceExchange::subscribeEvents( const QDate &start, const QDate &end ) +{ + kdDebug(5800) << "ResourceExchange::subscribeEvents()" << endl; + // FIXME: possible race condition if several subscribe events are run close + // to each other + mClient->download( start, end, false ); +} + +void ResourceExchange::downloadedEvent( KCal::Event *event, const KURL &url ) +{ + kdDebug() << "Downloaded event: " << event->summary() << " from url " + << url.prettyURL() << endl; + // FIXME: add watches to the monitor for these events + // KURL url = + // mMonitor->addWatch( url, KPIM::ExchangeMonitor::Update, 0 ); +// emit eventsAdded( events ); +} + +void ResourceExchange::slotDownloadFinished( int result, + const QString &moreinfo ) +{ + kdDebug() << "ResourceExchange::downloadFinished" << endl; + + if ( result != KPIM::ExchangeClient::ResultOK ) { + // Do something useful with the error report + kdError() << "ResourceExchange::slotDownloadFinished(): error " << result + << ": " << moreinfo << endl; + } +} + +void ResourceExchange::unsubscribeEvents( const QDate &/*start*/, const QDate &/*end*/ ) +{ + kdDebug() << "ResourceExchange::unsubscribeEvents()" << endl; +} + +bool ResourceExchange::addTodo(Todo */*todo*/) +{ + // This resource doesn't handle todos yet! + return false; +/* if( !mCache) + return false; + mCache->addTodo( todo ); + + todo->registerObserver( this ); + +// setModified( true ); + + return true;*/ +} + +bool ResourceExchange::deleteTodo(Todo */*todo*/) +{ + // We don't handle todos yet +// if( !mCache ) + return false; +// mCache->deleteTodo( todo ); + +// setModified( true ); +} + +Todo::List ResourceExchange::rawTodos( TodoSortField /*sortField*/, SortDirection /*sortDirection*/ ) +{ + // We don't handle todos yet + return Todo::List(); +/* Todo::List list; + if ( mCache ) + list = mCache->rawTodos( sortField, sortDirection ); + return list;*/ +} + +Todo *ResourceExchange::todo( const QString &/*uid*/ ) +{ + // We don't handle todos yet + return 0; +/* if ( !mCache ) + return 0; + else + return mCache->todo( uid );*/ +} + +Todo::List ResourceExchange::rawTodosForDate( const QDate &/*date*/ ) +{ + Todo::List list; + // We don't handle todos yet +/* if ( mCache ) + list = mCache->rawTodosForDate( date );*/ + return list; +} + +Alarm::List ResourceExchange::alarmsTo( const QDateTime &to ) +{ + Alarm::List list; + if ( mCache ) + list = mCache->alarmsTo( to ); + return list; +} + +/* Invoked by korgac when checking alarms. Always updates the cache. */ +Alarm::List ResourceExchange::alarms( const QDateTime &from, const QDateTime &to ) +{ + kdDebug(5800) << "ResourceExchange::alarms(" << from.toString() << " - " << to.toString() << ")\n"; + Alarm::List list; + + QDate start = from.date(); + QDate end = to.date(); + + if ( mCache ) { + + /* Clear the cache */ + Event::List oldEvents = mCache->rawEvents( start, end, false ); + + Event::List::ConstIterator it; + for( it = oldEvents.begin(); it != oldEvents.end(); ++it ) { + mCache->deleteEvent( *it ); + } + + /* Fetch events */ + mClient->downloadSynchronous( mCache, start, end, false ); + + list = mCache->alarms( from, to ); + } + return list; +} + +/****************************** PROTECTED METHODS ****************************/ + +// after changes are made to an event, this should be called. +void ResourceExchange::incidenceUpdated( IncidenceBase *incidence ) +{ + Event* event = dynamic_cast<Event *>( incidence ); + if ( event ) { + kdDebug() << "Event updated, resubmit to server..." << endl; + uploadEvent( event ); + } +// setModified( true ); +} + +// this function will take a VEvent and insert it into the event +// dictionary for the ResourceExchange. If there is no list of events for that +// particular location in the dictionary, a new one will be created. +/* +void ResourceExchange::insertEvent(const Event *anEvent) +{ + kdDebug() << "ResourceExchange::insertEvent" << endl; + +} +*/ +// taking a QDate, this function will look for an eventlist in the dict +// with that date attached - +Event::List ResourceExchange::rawEventsForDate( const QDate &qd, + EventSortField sortField, + SortDirection sortDirection ) +{ + if (!mCache) return Event::List(); + // If the events for this date are not in the cache, or if they are old, + // get them again + QDateTime now = QDateTime::currentDateTime(); + // kdDebug() << "Now is " << now.toString() << endl; + // kdDebug() << "mDates: " << mDates << endl; + QDate start = QDate( qd.year(), qd.month(), 1 ); // First day of month + if ( mDates && ( !mDates->contains( start ) || + (*mCacheDates)[start].secsTo( now ) > mCachedSeconds ) ) { + QDate end = start.addMonths( 1 ).addDays( -1 ); // Last day of month + // Get events that occur in this period from the cache + Event::List oldEvents = mCache->rawEvents( start, end, false ); + // And remove them all + Event::List::ConstIterator it; + for( it = oldEvents.begin(); it != oldEvents.end(); ++it ) { + mCache->deleteEvent( *it ); + } + + // FIXME: This is needed for the hack below: + Event::List eventsBefore = mCache->rawEvents(); + + kdDebug() << "Reading events for month of " << start.toString() << endl; + mClient->downloadSynchronous( mCache, start, end, true ); // Show progress dialog + + // FIXME: This is a terrible hack! We need to install the observer for + // newly downloaded events.However, downloading is done by + // mClient->downloadSynchronous, where we don't have the pointer to this + // available... On the other hand, here we don't really know which events + // are really new. + Event::List eventsAfter = mCache->rawEvents(); + for ( it = eventsAfter.begin(); it != eventsAfter.end(); ++it ) { + if ( eventsBefore.find( *it ) == eventsBefore.end() ) { + // it's a new event downloaded by downloadSynchronous -> install observer + (*it)->registerObserver( this ); + } + } + + mDates->add( start ); + mCacheDates->insert( start, now ); + } + + // Events are safely in the cache now, return them from cache + Event::List events; + if ( mCache ) + events = mCache->rawEventsForDate( qd, sortField, sortDirection ); + // kdDebug() << "Found " << events.count() << " events." << endl; + return events; +} + + +Event::List ResourceExchange::rawEvents( const QDate &start, const QDate &end, + bool inclusive ) +{ + kdDebug() << "ResourceExchange::rawEvents(start,end,inclusive)" << endl; + if (!mCache) return Event::List(); + return mCache->rawEvents( start, end, inclusive ); +} + +Event::List ResourceExchange::rawEventsForDate(const QDateTime &qdt) +{ + kdDebug() << "ResourceExchange::rawEventsForDate(qdt)" << endl; + return rawEventsForDate( qdt.date() ); +} + +Event::List ResourceExchange::rawEvents( EventSortField sortField, SortDirection sortDirection ) +{ + kdDebug() << "ResourceExchange::rawEvents()" << endl; + if (!mCache) return Event::List(); + return mCache->rawEvents( sortField, sortDirection ); +} + +bool ResourceExchange::addJournal(Journal */*journal*/) +{ + // This resource doesn't handle journals yet + return false; +/* kdDebug(5800) << "Adding Journal on " << journal->dtStart().toString() << endl; + if (mCache) { + mCache->addJournal( journal ); + + journal->registerObserver( this ); + +// setModified( true ); + } + + return true;*/ +} + +bool ResourceExchange::deleteJournal(Journal */*journal*/) +{ + // Wedon't handle journals yet +// if( !mCache ) + return false; +// mCache->deleteJournal( journal ); + +// setModified( true ); +} + +Journal::List ResourceExchange::journals(const QDate &/*date*/) +{ + // We don't handle journals yet + return Journal::List(); +/* Journal::List list; + if ( mCache ) + list = mCache->journals( date ); + return list;*/ +} + +Journal *ResourceExchange::journal(const QString &/*uid*/) +{ + // We don't handle journals yet + return 0; +/* if( !mCache ) + return 0; + return mCache->journal( uid );*/ +} + +Journal::List ResourceExchange::rawJournals( JournalSortField /*sortField*/, SortDirection /*sortDirection*/ ) +{ + // We don't handle journals yet + return Journal::List(); +/* Journal::List list; + if ( mCache ) + list = mCache->rawJournals( sortField, sortDirection ); + return list;*/ +} + +Journal::List ResourceExchange::rawJournalsForDate( const QDate &/*date*/ ) +{ + // We don't handle journals yet + return Journal::List(); +/* Journal::List list; + if ( mCache ) + list = mCache->rawJournalsForDate( date ); + return list;*/ +} + +void ResourceExchange::setTimeZoneId( const QString &tzid ) +{ + mTimeZoneId = tzid; + if ( mCache ) mCache->setTimeZoneId( tzid ); + if ( mClient ) mClient->setTimeZoneId( tzid ); +} + +#include "resourceexchange.moc" diff --git a/kresources/exchange/resourceexchange.h b/kresources/exchange/resourceexchange.h new file mode 100644 index 000000000..721e36660 --- /dev/null +++ b/kresources/exchange/resourceexchange.h @@ -0,0 +1,248 @@ +/* + This file is part of libkpimexchange. + Copyright (c) 2002 Jan-Pascal van Best <[email protected]> + + 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. +*/ +#ifndef KPIM_EXCHANGECALENDAR_H +#define KPIM_EXCHANGECALENDAR_H + +#include <qmap.h> +#include <qdict.h> +#include <qintdict.h> + +#include <libkcal/calendar.h> +#include <libkcal/calendarlocal.h> +#include <libkcal/resourcecalendar.h> + +#include "exchangemonitor.h" + +class DateSet; + +namespace KPIM { +class ExchangeAccount; +class ExchangeClient; +} + +namespace KCal { +class Event; +class CalFormat; + +/** + This class provides a calendar stored on a Microsoft Exchange 2000 server +*/ +// FIXME: Use ResourceCached +class ResourceExchange : public ResourceCalendar, public IncidenceBase::Observer +{ + Q_OBJECT + + public: + ResourceExchange( const KConfig * ); + virtual ~ResourceExchange(); + + virtual void writeConfig( KConfig* config ); + + KABC::Lock *lock(); + + /** constructs a new calendar, with variables initialized to sane values. */ +// ExchangeCalendar( KPIM::ExchangeAccount* account ); + /** constructs a new calendar, with variables initialized to sane values. */ +// ExchangeCalendar( KPIM::ExchangeAccount* account, const QString &timeZoneId ); +// virtual ~ExchangeCalendar(); + + /** + Semantics not yet defined. Should the Exchange calendar be wiped clean? + Should the disk calendar be copied to the Exchange calendar? + At the moment, does nothing. + @return true, if successful, false on error. + @param fileName the name of the calendar on disk. + */ +// bool load( const QString &fileName ); + /** + Writes out the calendar to disk in the specified \a format. + ExchangeCalendar takes ownership of the CalFormat object. + @return true, if successful, false on error. + @param fileName the name of the file + */ +// bool save( const QString &fileName, CalFormat *format = 0 ); + + /** clears out the current calendar, freeing all used memory etc. etc. */ +// void close(); + + /** Add Event to calendar. */ + bool addEvent(Event *anEvent); + /** deletes an event from this calendar. */ + bool deleteEvent(Event *); + + // Isn't called anymore. + void changeIncidence( Incidence * ); + + /** + Retrieves an event on the basis of the unique string ID. + */ + Event *event(const QString &UniqueStr); + /** + Return filtered list of all events in calendar. + */ +// Event::List events(); + /** + Return unfiltered list of all events in calendar. + Use with care, since this causes a LOT of network activity + */ + Event::List rawEvents(); + + virtual void subscribeEvents( const QDate& start, const QDate& end ); + + /** + Stop receiving event signals for the given period (inclusive). After this call, + the calendar resource will no longer send eventsAdded, eventsModified or + eventsDeleted signals for events falling completely in this period. The resource + MAY delete the Events objects. The application MUST NOT dereference pointers + to the relevant Events after this call. + */ + virtual void unsubscribeEvents( const QDate& start, const QDate& end ); + + /** + Add a todo to the todolist. + */ + bool addTodo( Todo *todo ); + /** + Remove a todo from the todolist. + */ + bool deleteTodo( Todo * ); + /** + Searches todolist for an event with this unique string identifier, + returns a pointer or null. + */ + Todo *todo( const QString &uid ); + /** + Return list of all todos. + */ + Todo::List rawTodos( TodoSortField sortField = TodoSortUnsorted, SortDirection sortDirection = SortDirectionAscending ); + /** + Returns list of todos due on the specified date. + */ + Todo::List rawTodosForDate( const QDate &date ); + + /** Add a Journal entry to calendar */ + virtual bool addJournal(Journal *); + /** deletes an event from this calendar. */ + virtual bool deleteJournal(Journal *); + /** Return Journals for given date */ + virtual Journal::List journals(const QDate &); + /** Return Journal with given UID */ + virtual Journal *journal(const QString &UID); + /** Return list of all Journals stored in calendar */ + Journal::List rawJournals( JournalSortField sortField = JournalSortUnsorted, SortDirection sortDirection = SortDirectionAscending ); + /** Return journals for the given date. */ + Journal::List rawJournalsForDate( const QDate & ); + + /** Return all alarms, which ocur in the given time interval. */ + Alarm::List alarms( const QDateTime &from, const QDateTime &to ); + + /** Return all alarms, which ocur before given date. */ + Alarm::List alarmsTo( const QDateTime &to ); + + friend class ResourceExchangeConfig; + + protected: + /** + Prepare the calendar for use. Load the calendar from disk, + open connections to the calendaring server, whatever. + Must be called before other methods can be called. + */ + virtual bool doOpen(); + + /** clears out the current calendar, freeing all used memory etc. etc. */ + virtual void doClose(); + + virtual bool doLoad(); + virtual bool doSave(); + + public: + /** + Builds and then returns a list of all events that match for the + date specified. useful for dayView, etc. etc. + */ + Event::List rawEventsForDate( + const QDate &date, + EventSortField sortField=EventSortUnsorted, + SortDirection sortDirection=SortDirectionAscending ); + + /** + Get unfiltered events for date \a qdt. + */ + Event::List rawEventsForDate( const QDateTime &qdt ); + /** + Get unfiltered events in a range of dates. If inclusive is set to true, + only events are returned, which are completely included in the range. + */ + Event::List rawEvents( const QDate &start, const QDate &end, + bool inclusive = false ); + /** + Get unfiltered events in sorted order. + */ + Event::List rawEvents( EventSortField sortField = EventSortUnsorted, SortDirection sortDirection = SortDirectionAscending ); + + protected: + /** Notification function of IncidenceBase::Observer. */ + void incidenceUpdated( IncidenceBase *i ); + + /** inserts an event into its "proper place" in the calendar. */ +// void insertEvent(const Event *anEvent); + + /** Append alarms of incidence in interval to list of alarms. */ +// void appendAlarms( Alarm::List &alarms, Incidence *incidence, +// const QDateTime &from, const QDateTime &to ); + + /** Append alarms of recurring events in interval to list of alarms. */ +// void appendRecurringAlarms( Alarm::List &alarms, Incidence *incidence, +// const QDateTime &from, const QDateTime &to ); + + bool uploadEvent( Event *event ); + + void setTimeZoneId( const QString &tzid ); + + protected slots: + void slotMonitorNotify( const QValueList<long>& IDs, const QValueList<KURL>& urls); + void slotMonitorError( int errorCode, const QString& moreInfo ); + void slotDownloadFinished( int result, const QString& moreinfo ); + void downloadedEvent( KCal::Event*, const KURL& ); + + private: + class EventInfo; + KPIM::ExchangeAccount* mAccount; + KPIM::ExchangeClient* mClient; + KPIM::ExchangeMonitor* mMonitor; + CalendarLocal* mCache; + QDict<EventInfo> mEventDict; // maps UIDS to EventInfo records + QIntDict<EventInfo> mWatchDict; // maps Watch IDs to EventInfo records + DateSet* mDates; + QMap<Event, QDateTime>* mEventDates; + QMap<QDate, QDateTime>* mCacheDates; + int mCachedSeconds; + bool mAutoMailbox; + QString mTimeZoneId; + + KABC::Lock *mLock; + + // FIXME: Remove variable, use ResourceCached::changedIncidences() instead. + Incidence::List mChangedIncidences; +}; + +} + +#endif diff --git a/kresources/exchange/resourceexchangeconfig.cpp b/kresources/exchange/resourceexchangeconfig.cpp new file mode 100644 index 000000000..e2277fa05 --- /dev/null +++ b/kresources/exchange/resourceexchangeconfig.cpp @@ -0,0 +1,153 @@ +/* + This file is part of libkpimexchange. + Copyright (c) 2002 Tobias Koenig <[email protected]> + Copyright (c) 2002 Jan-Pascal van Best <[email protected]> + + 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 <qlabel.h> +#include <qlayout.h> + +#include <klocale.h> +#include <kdebug.h> +#include <kstandarddirs.h> +#include <kmessagebox.h> + +#include "exchangeaccount.h" +#include "resourceexchangeconfig.h" +#include "resourceexchange.h" + +using namespace KCal; + +ResourceExchangeConfig::ResourceExchangeConfig( QWidget* parent, const char* name ) + : KRES::ConfigWidget( parent, name ) +{ + resize( 245, 115 ); + QGridLayout *mainLayout = new QGridLayout( this, 8, 3 ); + + QLabel *label = new QLabel( i18n( "Host:" ), this ); + mHostEdit = new KLineEdit( this ); + mainLayout->addWidget( label, 1, 0 ); + mainLayout->addWidget( mHostEdit, 1, 1 ); + + label = new QLabel( i18n( "Port:" ), this ); + mPortEdit = new KLineEdit( this ); + mainLayout->addWidget( label, 2, 0 ); + mainLayout->addWidget( mPortEdit, 2, 1 ); + + label = new QLabel( i18n( "Account:" ), this ); + mAccountEdit = new KLineEdit( this ); + mainLayout->addWidget( label, 3, 0 ); + mainLayout->addWidget( mAccountEdit, 3, 1 ); + + label = new QLabel( i18n( "Password:" ), this ); + mPasswordEdit = new KLineEdit( this ); + mPasswordEdit->setEchoMode( QLineEdit::Password ); + mainLayout->addWidget( label, 4, 0 ); + mainLayout->addWidget( mPasswordEdit, 4, 1 ); + + mAutoMailbox = new QCheckBox( i18n( "Determine mailbox &automatically" ), this ); + mainLayout->addMultiCellWidget( mAutoMailbox, 5, 5, 0, 1 ); + connect( mAutoMailbox, SIGNAL(toggled(bool)), this, SLOT(slotToggleAuto(bool)) ); + + mMailboxEdit = new KLineEdit( this ); + mainLayout->addWidget( new QLabel( i18n( "Mailbox URL:" ), this ), 6, 0 ); + mainLayout->addWidget( mMailboxEdit, 6, 1 ); + + mTryFindMailbox = new QPushButton( i18n( "&Find" ), this ); + mainLayout->addWidget( mTryFindMailbox, 6, 2 ); + connect( mTryFindMailbox, SIGNAL(clicked()), this, SLOT(slotFindClicked()) ); + + label = new QLabel( i18n( "Cache timeout:" ), this ); + mCacheEdit = new KIntNumInput( this ); + connect(mCacheEdit, SIGNAL(valueChanged( int )), SLOT(slotCacheEditChanged( int ))); + mCacheEdit->setMinValue( 0 ); + mainLayout->addWidget( label, 7, 0 ); + mainLayout->addWidget( mCacheEdit, 7, 1 ); +} + +void ResourceExchangeConfig::loadSettings( KRES::Resource *resource ) +{ + ResourceExchange* res = dynamic_cast<ResourceExchange*>( resource ); + if (res) { + mHostEdit->setText( res->mAccount->host() ); + mPortEdit->setText( res->mAccount->port() ); + mAccountEdit->setText( res->mAccount->account() ); + mPasswordEdit->setText( res->mAccount->password() ); + mAutoMailbox->setChecked( res->mAutoMailbox ); + mMailboxEdit->setText( res->mAccount->mailbox() ); + mCacheEdit->setValue( res->mCachedSeconds ); + } else + kdDebug(5700) << "ERROR: ResourceExchangeConfig::loadSettings(): no ResourceExchange, cast failed" << endl; +} + +void ResourceExchangeConfig::saveSettings( KRES::Resource *resource ) +{ + kdDebug() << "Saving settings to resource " << resource->resourceName() << endl; + ResourceExchange* res = dynamic_cast<ResourceExchange*>( resource ); + if (res) { + if ( mAutoMailbox->isChecked() ) { + mMailboxEdit->setText( QString::null ); + slotFindClicked(); + if ( mMailboxEdit->text().isNull() ) { + kdWarning() << "Could not find Exchange mailbox URL, incomplete settings!" << endl; + } + } + res->mAutoMailbox = mAutoMailbox->isChecked(); + + res->mAccount->setHost(mHostEdit->text()); + res->mAccount->setPort(mPortEdit->text()); + res->mAccount->setAccount(mAccountEdit->text()); + res->mAccount->setPassword(mPasswordEdit->text()); + res->mAccount->setMailbox( mMailboxEdit->text() ); + res->mCachedSeconds = mCacheEdit->value(); + } else + kdDebug(5700) << "ERROR: ResourceExchangeConfig::saveSettings(): no ResourceExchange, cast failed" << endl; +} + +void ResourceExchangeConfig::slotToggleAuto( bool on ) +{ + mMailboxEdit->setEnabled( ! on ); +// mTryFindMailbox->setEnabled( ! on ); +} + +void ResourceExchangeConfig::slotUserChanged( const QString& /*text*/ ) +{ +// if ( mMailboxEqualsUser->isChecked() ) { +// mMailboxEdit->setText( "webdav://" + mHostEdit->text() + "/exchange/" + text ); +// } +} + +void ResourceExchangeConfig::slotFindClicked() +{ + QString mailbox = KPIM::ExchangeAccount::tryFindMailbox( + mHostEdit->text(), mPortEdit->text(), + mAccountEdit->text(), mPasswordEdit->text() ); + + if ( mailbox.isNull() ) { + KMessageBox::sorry( this, i18n( "Could not determine mailbox URL, please check your account settings." ) ); + } else { + mMailboxEdit->setText( mailbox ); + } +} + +void ResourceExchangeConfig::slotCacheEditChanged( int value ) +{ + mCacheEdit->setSuffix( i18n(" second", " seconds", value) ); +} + +#include "resourceexchangeconfig.moc" diff --git a/kresources/exchange/resourceexchangeconfig.h b/kresources/exchange/resourceexchangeconfig.h new file mode 100644 index 000000000..59adf02bc --- /dev/null +++ b/kresources/exchange/resourceexchangeconfig.h @@ -0,0 +1,66 @@ +/* + This file is part of libkpimexchange. + Copyright (c) 2002 Tobias Koenig <[email protected]> + Copyright (c) 2002 Jan-Pascal van Best <[email protected]> + + 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. +*/ + +#ifndef KDEPIM_RESOURCECALENDAREXCHANGECONFIG_H +#define KDEPIM_RESOURCECALENDAREXCHANGECONFIG_H + +#include <qcheckbox.h> + +#include <kcombobox.h> +#include <kurlrequester.h> +#include <klineedit.h> +#include <knuminput.h> + +#include <kresources/resource.h> +#include <kresources/configwidget.h> + +namespace KCal { + +class ResourceExchangeConfig : public KRES::ConfigWidget +{ + Q_OBJECT + +public: + ResourceExchangeConfig( QWidget* parent = 0, const char* name = 0 ); + +public slots: + virtual void loadSettings( KRES::Resource *resource); + virtual void saveSettings( KRES::Resource *resource ); + +protected slots: + void slotToggleAuto( bool on ); + void slotUserChanged( const QString& text ); + void slotFindClicked(); + void slotCacheEditChanged( int value ); + +private: + KLineEdit* mHostEdit; + KLineEdit* mPortEdit; + KLineEdit* mAccountEdit; + KLineEdit* mPasswordEdit; + QCheckBox *mAutoMailbox; + KLineEdit* mMailboxEdit; + QPushButton* mTryFindMailbox; + KIntNumInput* mCacheEdit; +}; + +} +#endif |