39 using namespace KCalCore;
46 class KCalCore::MemoryCalendar::Private
50 : q( qq ), mFormat( 0 )
65 QMap<IncidenceBase::IncidenceType, QMultiHash<QString, Incidence::Ptr> > mIncidences;
71 QMap<IncidenceBase::IncidenceType, QMultiHash<QString, Incidence::Ptr> > mDeletedIncidences;
84 QMap<IncidenceBase::IncidenceType, QMultiHash<QString, IncidenceBase::Ptr> > mIncidencesForDate;
90 const KDateTime &recurrenceId = KDateTime() )
const;
93 const KDateTime &recurrenceId,
121 d->mFileName.clear();
127 d->mDeletedIncidences.clear();
141 const QString uid = incidence->uid();
142 if ( d->mIncidences[type].remove( uid, incidence ) ) {
145 d->mDeletedIncidences[type].insert( uid, incidence );
148 if ( dt.isValid() ) {
149 d->mIncidencesForDate[type].remove( dt.date().toString(),
incidence );
152 if ( !incidence->hasRecurrenceId() ) {
157 kWarning() << incidence->typeStr() <<
" not found.";
165 QList<Incidence::Ptr> values = d->mIncidences[type].values( incidence->uid() );
166 QList<Incidence::Ptr>::const_iterator it;
167 for ( it = values.constBegin(); it != values.constEnd(); ++it ) {
169 if ( i->hasRecurrenceId() ) {
170 kDebug() <<
"deleting child"
171 <<
", type=" << int( type )
172 <<
", uid=" << i->uid()
173 <<
", start=" << i->dtStart()
184 QHashIterator<QString, Incidence::Ptr>i( mIncidences[incidenceType] );
185 while ( i.hasNext() ) {
187 q->notifyIncidenceDeleted( i.value() );
190 i.value()->startUpdates();
192 mIncidences[incidenceType].clear();
193 mIncidencesForDate[incidenceType].clear();
196 Incidence::Ptr MemoryCalendar::Private::incidence(
const QString &uid,
198 const KDateTime &recurrenceId )
const
200 QList<Incidence::Ptr> values = mIncidences[type].values( uid );
201 QList<Incidence::Ptr>::const_iterator it;
202 for ( it = values.constBegin(); it != values.constEnd(); ++it ) {
204 if ( recurrenceId.isNull() ) {
205 if ( !i->hasRecurrenceId() ) {
209 if ( i->hasRecurrenceId() && i->recurrenceId() == recurrenceId ) {
218 MemoryCalendar::Private::deletedIncidence(
const QString &uid,
219 const KDateTime &recurrenceId,
222 QList<Incidence::Ptr> values = mDeletedIncidences[type].values( uid );
223 QList<Incidence::Ptr>::const_iterator it;
224 for ( it = values.constBegin(); it != values.constEnd(); ++it ) {
226 if ( recurrenceId.isNull() ) {
227 if ( !i->hasRecurrenceId() ) {
231 if ( i->hasRecurrenceId() && i->recurrenceId() == recurrenceId ) {
240 void MemoryCalendar::Private::insertIncidence(
Incidence::Ptr incidence )
242 const QString uid = incidence->uid();
244 if ( !mIncidences[type].contains( uid, incidence ) ) {
245 mIncidences[type].insert( uid, incidence );
247 if ( dt.isValid() ) {
248 mIncidencesForDate[type].insert( dt.date().toString(), incidence );
255 Q_ASSERT( mIncidences[type].value( uid ) == incidence );
265 d->insertIncidence( incidence );
267 incidence->registerObserver(
this );
297 const KDateTime &recurrenceId )
const
328 const KDateTime &recurrenceId )
const
334 const KDateTime &recurrenceId )
const
344 while ( i.hasNext() ) {
346 todoList.append( i.value().staticCast<
Todo>() );
356 while ( i.hasNext() ) {
358 todoList.append( i.value().staticCast<
Todo>() );
370 QList<Incidence::Ptr>::const_iterator it;
371 for ( it = values.constBegin(); it != values.constEnd(); ++it ) {
373 if ( t->hasRecurrenceId() ) {
386 const QString dateStr = date.toString();
387 QMultiHash<QString, IncidenceBase::Ptr >::const_iterator it =
389 while ( it != d->mIncidencesForDate[
Incidence::TypeTodo].constEnd() && it.key() == dateStr ) {
390 t = it.value().staticCast<
Todo>();
391 todoList.append( t );
397 while ( i.hasNext() ) {
399 t = i.value().staticCast<
Todo>();
401 if ( t->recursOn( date, ts ) ) {
402 todoList.append( t );
412 const KDateTime::Spec ×pec,
413 bool inclusive )
const
415 Q_UNUSED( inclusive );
418 KDateTime::Spec ts = timespec.isValid() ? timespec :
timeSpec();
419 KDateTime st( start, ts );
420 KDateTime nd( end, ts );
425 while ( i.hasNext() ) {
427 todo = i.value().staticCast<
Todo>();
432 KDateTime rStart = todo->
hasDueDate() ? todo->dtDue() :
433 todo->hasStartDate() ? todo->dtStart() : KDateTime();
434 if ( !rStart.isValid() ) {
438 if ( !todo->recurs() ) {
439 if ( nd.isValid() && nd < rStart ) {
442 if ( st.isValid() && rStart < st ) {
446 switch ( todo->recurrence()->duration() ) {
451 KDateTime rEnd( todo->recurrence()->endDate(), ts );
452 if ( !rEnd.isValid() ) {
455 if ( st.isValid() && rEnd < st ) {
462 todoList.append( todo );
470 return alarms( KDateTime( QDate( 1900, 1, 1 ) ), to );
478 while ( ie.hasNext() ) {
480 e = ie.value().staticCast<
Event>();
490 while ( it.hasNext() ) {
492 t = it.value().staticCast<
Todo>();
494 if ( !t->isCompleted() ) {
515 if ( dt.isValid() ) {
516 d->mIncidencesForDate[type].remove( dt.date().toString(), inc );
526 KDateTime nowUTC = KDateTime::currentUtcDateTime();
527 inc->setLastModified( nowUTC );
535 if ( dt.isValid() ) {
536 d->mIncidencesForDate[type].insert( dt.date().toString(), inc );
546 const KDateTime::Spec ×pec,
552 if ( !date.isValid() ) {
560 const QString dateStr = date.toString();
561 QMultiHash<QString, IncidenceBase::Ptr >::const_iterator it =
564 KDateTime::Spec ts = timespec.isValid() ? timespec :
timeSpec();
565 KDateTime kdt( date, ts );
567 ev = it.value().staticCast<
Event>();
568 KDateTime end( ev->dtEnd().toTimeSpec( ev->dtStart() ) );
569 if ( ev->allDay() ) {
570 end.setDateOnly(
true );
572 end = end.addSecs( -1 );
575 eventList.append( ev );
582 while ( i.hasNext() ) {
584 ev = i.value().staticCast<
Event>();
585 if ( ev->recurs() ) {
586 if ( ev->isMultiDay() ) {
587 int extraDays = ev->
dtStart().date().daysTo( ev->dtEnd().date() );
588 for (
int i = 0; i <= extraDays; ++i ) {
589 if ( ev->recursOn( date.addDays( -i ), ts ) ) {
590 eventList.append( ev );
595 if ( ev->recursOn( date, ts ) ) {
596 eventList.append( ev );
600 if ( ev->isMultiDay() ) {
601 if ( ev->dtStart().date() <= date && ev->dtEnd().date() >= date ) {
602 eventList.append( ev );
613 const KDateTime::Spec ×pec,
614 bool inclusive )
const
617 KDateTime::Spec ts = timespec.isValid() ? timespec :
timeSpec();
618 KDateTime st( start, ts );
619 KDateTime nd( end, ts );
620 KDateTime yesterStart = st.addDays( -1 );
625 while ( i.hasNext() ) {
627 event = i.value().staticCast<
Event>();
628 KDateTime rStart =
event->
dtStart();
632 if ( inclusive && rStart < st ) {
636 if ( !event->recurs() ) {
637 KDateTime rEnd =
event->dtEnd();
641 if ( inclusive && nd < rEnd ) {
645 switch ( event->recurrence()->duration() ) {
653 KDateTime rEnd( event->recurrence()->endDate(), ts );
654 if ( !rEnd.isValid() ) {
660 if ( inclusive && nd < rEnd ) {
667 eventList.append( event );
683 while ( i.hasNext() ) {
685 eventList.append( i.value().staticCast<
Event>() );
695 while ( i.hasNext() ) {
697 eventList.append( i.value().staticCast<
Event>() );
709 QList<Incidence::Ptr>::const_iterator it;
710 for ( it = values.constBegin(); it != values.constEnd(); ++it ) {
712 if ( ev->hasRecurrenceId() ) {
740 const KDateTime &recurrenceId )
const
746 const KDateTime &recurrenceId )
const
756 while ( i.hasNext() ) {
758 journalList.append( i.value().staticCast<
Journal>() );
768 while ( i.hasNext() ) {
770 journalList.append( i.value().staticCast<
Journal>() );
782 QList<Incidence::Ptr>::const_iterator it;
783 for ( it = values.constBegin(); it != values.constEnd(); ++it ) {
785 if ( j->hasRecurrenceId() ) {
797 QString dateStr = date.toString();
798 QMultiHash<QString, IncidenceBase::Ptr >::const_iterator it =
802 j = it.value().staticCast<
Journal>();
803 journalList.append( j );