26 #include <tqdatastream.h>
27 #include <tqdatetime.h>
30 #include <tqptrlist.h>
33 #include <tdelocale.h>
35 #include <kstandarddirs.h>
38 #include "exceptions.h"
39 #include "incidence.h"
45 #include "resourcecached.h"
49 static bool m_editoropen =
false;
51 ResourceCached::ResourceCached(
const TDEConfig* config )
53 mReloadPolicy( ReloadNever ), mReloadInterval( 10 ),
54 mReloadTimer( 0,
"mReloadTimer" ), mReloaded( false ),
55 mSavePolicy( SaveNever ), mSaveInterval( 10 ),
56 mSaveTimer( 0,
"mSaveTimer" ), mIdMapper(
"kcal/uidmaps/" )
58 connect( &mReloadTimer, TQT_SIGNAL( timeout() ), TQT_SLOT( slotReload() ) );
59 connect( &mSaveTimer, TQT_SIGNAL( timeout() ), TQT_SLOT( slotSave() ) );
62 ResourceCached::~ResourceCached()
80 mReloadInterval = minutes;
85 return mReloadInterval;
102 mSaveInterval = minutes;
107 return mSaveInterval;
110 void ResourceCached::readConfig(
const TDEConfig *config )
112 mReloadPolicy = config->readNumEntry(
"ReloadPolicy", ReloadNever );
113 mReloadInterval = config->readNumEntry(
"ReloadInterval", 10 );
115 mSaveInterval = config->readNumEntry(
"SaveInterval", 10 );
116 mSavePolicy = config->readNumEntry(
"SavePolicy", SaveNever );
118 mLastLoad = config->readDateTimeEntry(
"LastLoad" );
119 mLastSave = config->readDateTimeEntry(
"LastSave" );
125 void ResourceCached::setupSaveTimer()
127 if ( mSavePolicy == SaveInterval ) {
128 kdDebug(5800) <<
"ResourceCached::setSavePolicy(): start save timer (interval "
129 << mSaveInterval <<
" minutes)." << endl;
130 mSaveTimer.start( mSaveInterval * 60 * 1000 );
136 void ResourceCached::setupReloadTimer()
138 if ( mReloadPolicy == ReloadInterval ) {
139 kdDebug(5800) <<
"ResourceCached::setSavePolicy(): start reload timer "
140 "(interval " << mReloadInterval <<
" minutes)" << endl;
141 mReloadTimer.start( mReloadInterval * 60 * 1000 );
147 void ResourceCached::writeConfig( TDEConfig *config )
149 config->writeEntry(
"ReloadPolicy", mReloadPolicy );
150 config->writeEntry(
"ReloadInterval", mReloadInterval );
152 config->writeEntry(
"SavePolicy", mSavePolicy );
153 config->writeEntry(
"SaveInterval", mSaveInterval );
155 config->writeEntry(
"LastLoad", mLastLoad );
156 config->writeEntry(
"LastSave", mLastSave );
166 Q_UNUSED( subresource );
173 kdDebug(5800) <<
"ResourceCached::deleteEvent" << endl;
181 return mCalendar.
event( uid );
196 return mCalendar.
rawEvents( start, end, inclusive );
206 return mCalendar.
rawEvents( sortField, sortDirection );
211 return mCalendar.
addTodo( todo );
216 Q_UNUSED( subresource );
217 return mCalendar.
addTodo( todo );
233 return mCalendar.
rawTodos( sortField, sortDirection );
238 return mCalendar.
todo( uid );
253 Q_UNUSED( subresource );
259 return mCalendar.
journal( uid );
264 return mCalendar.
rawJournals( sortField, sortDirection );
281 return mCalendar.
alarms( from, to );
290 TQString ResourceCached::timeZoneId()
const
295 void ResourceCached::clearChanges()
297 mAddedIncidences.clear();
298 mChangedIncidences.clear();
299 mDeletedIncidences.clear();
304 setIdMapperIdentifier();
307 if ( TDEStandardDirs::exists(
cacheFile() ) ) {
311 Incidence::List::Iterator it;
312 for ( it = incidences.begin(); it != incidences.end(); ++it ) {
313 (*it)->setReadOnly(
true );
321 kdDebug(5800) <<
"ResourceCached::saveCache(): " <<
cacheFile() << endl;
323 setIdMapperIdentifier();
329 void ResourceCached::setIdMapperIdentifier()
331 mIdMapper.setIdentifier( type() +
"_" + identifier() );
354 void ResourceCached::cleanUpEventCache(
const Event::List &eventList )
358 if ( TDEStandardDirs::exists(
cacheFile() ) )
364 Event::List::ConstIterator cacheIt, it;
365 for ( cacheIt = list.begin(); cacheIt != list.end(); ++cacheIt ) {
367 for ( it = eventList.begin(); it != eventList.end(); ++it ) {
368 if ( (*it)->uid() == (*cacheIt)->uid() )
373 mIdMapper.removeRemoteId( mIdMapper.remoteId( (*cacheIt)->uid() ) );
374 Event *
event = mCalendar.
event( (*cacheIt)->uid() );
383 void ResourceCached::cleanUpTodoCache(
const Todo::List &todoList )
387 if ( TDEStandardDirs::exists(
cacheFile() ) )
393 Todo::List::ConstIterator cacheIt, it;
394 for ( cacheIt = list.begin(); cacheIt != list.end(); ++cacheIt ) {
397 for ( it = todoList.begin(); it != todoList.end(); ++it ) {
398 if ( (*it)->uid() == (*cacheIt)->uid() )
403 mIdMapper.removeRemoteId( mIdMapper.remoteId( (*cacheIt)->uid() ) );
404 Todo *todo = mCalendar.
todo( (*cacheIt)->uid() );
420 return locateLocal(
"cache",
"kcal/tderesources/" + identifier() );
425 return locateLocal(
"cache",
"kcal/changescache/" + identifier() +
"_" + type );
428 void ResourceCached::saveChangesCache(
const TQMap<Incidence*, bool> &map,
const TQString &type )
433 TQMap<Incidence *,bool>::ConstIterator it;
434 for ( it = map.begin(); it != map.end(); ++it ) {
436 calendar.addIncidence( it.key()->clone() );
449 void ResourceCached::saveChangesCache()
451 saveChangesCache( mAddedIncidences,
"added" );
452 saveChangesCache( mDeletedIncidences,
"deleted" );
453 saveChangesCache( mChangedIncidences,
"changed" );
456 void ResourceCached::loadChangesCache( TQMap<Incidence*, bool> &map,
const TQString &type )
466 Incidence::List::ConstIterator it;
467 for ( it = list.begin(); it != list.end(); ++it )
468 map.insert( (*it)->clone(), true );
473 void ResourceCached::loadChangesCache()
475 loadChangesCache( mAddedIncidences,
"added" );
476 loadChangesCache( mDeletedIncidences,
"deleted" );
477 loadChangesCache( mChangedIncidences,
"changed" );
483 kdDebug(5800) <<
"ResourceCached::calendarIncidenceAdded(): "
487 TQMap<Incidence *,bool>::ConstIterator it;
488 it = mAddedIncidences.find( i );
489 if ( it == mAddedIncidences.end() ) {
490 mAddedIncidences.insert( i,
true );
493 checkForAutomaticSave();
499 kdDebug(5800) <<
"ResourceCached::calendarIncidenceChanged(): "
503 TQMap<Incidence *,bool>::ConstIterator it;
504 it = mChangedIncidences.find( i );
506 if ( it == mChangedIncidences.end() ) {
507 mChangedIncidences.insert( i,
true );
510 checkForAutomaticSave();
516 kdDebug(5800) <<
"ResourceCached::calendarIncidenceDeleted(): "
524 IncidenceListIterator it;
532 TQMap<Incidence *,bool>::ConstIterator it;
533 it = mDeletedIncidences.find( i );
534 if ( it == mDeletedIncidences.end() ) {
535 mDeletedIncidences.insert( i,
true );
538 checkForAutomaticSave();
544 TQMap<Incidence *,bool>::ConstIterator it;
545 for( it = mAddedIncidences.begin(); it != mAddedIncidences.end(); ++it ) {
546 added.append( it.key() );
554 TQMap<Incidence *,bool>::ConstIterator it;
555 for( it = mChangedIncidences.begin(); it != mChangedIncidences.end(); ++it ) {
556 changed.append( it.key() );
564 TQMap<Incidence *,bool>::ConstIterator it;
565 for( it = mDeletedIncidences.begin(); it != mDeletedIncidences.end(); ++it ) {
566 deleted.append( it.key() );
574 TQMap<Incidence *,bool>::ConstIterator it;
575 for( it = mAddedIncidences.begin(); it != mAddedIncidences.end(); ++it ) {
576 changes.append( it.key() );
578 for( it = mChangedIncidences.begin(); it != mChangedIncidences.end(); ++it ) {
579 changes.append( it.key() );
581 for( it = mDeletedIncidences.begin(); it != mDeletedIncidences.end(); ++it ) {
582 changes.append( it.key() );
587 bool ResourceCached::hasChanges()
const
589 return !( mAddedIncidences.isEmpty() && mChangedIncidences.isEmpty() &&
590 mDeletedIncidences.isEmpty() );
593 void ResourceCached::clearChange(
Incidence *incidence )
595 clearChange( incidence->
uid() );
598 void ResourceCached::clearChange(
const TQString &uid )
600 TQMap<Incidence*, bool>::Iterator it;
602 for ( it = mAddedIncidences.begin(); it != mAddedIncidences.end(); ++it )
603 if ( it.key()->uid() == uid ) {
604 mAddedIncidences.remove( it );
608 for ( it = mChangedIncidences.begin(); it != mChangedIncidences.end(); ++it )
609 if ( it.key()->uid() == uid ) {
610 mChangedIncidences.remove( it );
614 for ( it = mDeletedIncidences.begin(); it != mDeletedIncidences.end(); ++it )
615 if ( it.key()->uid() == uid ) {
616 mDeletedIncidences.remove( it );
621 void ResourceCached::enableChangeNotification()
626 void ResourceCached::disableChangeNotification()
631 bool ResourceCached::editorWindowOpen()
636 void ResourceCached::setEditorWindowOpen(
bool open)
641 void ResourceCached::slotReload()
643 if ( !isActive() )
return;
646 if (editorWindowOpen() ==
true)
return;
648 kdDebug(5800) <<
"ResourceCached::slotReload()" << endl;
653 void ResourceCached::slotSave()
655 if ( !isActive() )
return;
657 kdDebug(5800) <<
"ResourceCached::slotSave()" << endl;
662 void ResourceCached::checkForAutomaticSave()
664 if ( mSavePolicy == SaveAlways ) {
665 kdDebug(5800) <<
"ResourceCached::checkForAutomaticSave(): save now" << endl;
666 mSaveTimer.start( 1 * 1000,
true );
667 }
else if ( mSavePolicy == SaveDelayed ) {
668 kdDebug(5800) <<
"ResourceCached::checkForAutomaticSave(): save delayed"
670 mSaveTimer.start( 15 * 1000,
true );
676 if ( mReloadPolicy == ReloadNever )
return false;
677 if ( mReloadPolicy == ReloadOnStartup )
return !mReloaded;
683 if ( mSavePolicy == SaveNever )
return false;
689 if ( mLastLoad.isValid() ) {
691 txt += i18n(
"Last loaded: %1")
692 .arg( TDEGlobal::locale()->formatDateTime( mLastLoad ) );
694 if ( mLastSave.isValid() ) {
696 txt += i18n(
"Last saved: %1")
697 .arg( TDEGlobal::locale()->formatDateTime( mLastSave ) );
708 kdDebug(5800) <<
"Opening resource " << resourceName() << endl;
714 mCalendar.setOwner( owner );
719 return mCalendar.getOwner();
722 #include "resourcecached.moc"