39 #include <QDataStream> 49 class KCalCore::MemoryCalendar::Private
62 QString mIncidenceBeingUpdated;
68 QMap<IncidenceBase::IncidenceType, QMultiHash<QString, Incidence::Ptr> > mIncidences;
73 QHash<QString,KCalCore::Incidence::Ptr> mIncidencesByIdentifier;
79 QMap<IncidenceBase::IncidenceType, QMultiHash<QString, Incidence::Ptr> > mDeletedIncidences;
92 QMap<IncidenceBase::IncidenceType, QMultiHash<QString, IncidenceBase::Ptr> > mIncidencesForDate;
98 const KDateTime &recurrenceId = KDateTime())
const;
101 const KDateTime &recurrenceId,
129 setObserversEnabled(
false);
137 d->mIncidencesByIdentifier.clear();
138 d->mDeletedIncidences.clear();
142 setObserversEnabled(
true);
150 removeRelations(incidence);
152 const QString
uid = incidence->uid();
153 if (d->mIncidences[type].remove(uid, incidence)) {
154 d->mIncidencesByIdentifier.remove(incidence->instanceIdentifier());
156 notifyIncidenceDeleted(incidence);
157 if (deletionTracking())
158 d->mDeletedIncidences[
type].insert(uid, incidence);
162 d->mIncidencesForDate[
type].remove(dt.date().toString(), incidence);
165 if (!incidence->hasRecurrenceId()) {
166 deleteIncidenceInstances(incidence);
170 kWarning() << incidence->typeStr() <<
" not found. uid=" <<
uid;
178 QList<Incidence::Ptr> values = d->mIncidences[
type].values(incidence->uid());
179 QList<Incidence::Ptr>::const_iterator it;
180 for (it = values.constBegin(); it != values.constEnd(); ++it) {
182 if (i->hasRecurrenceId()) {
183 kDebug() <<
"deleting child" 184 <<
", type=" << int(type)
185 <<
", uid=" << i->uid()
186 <<
", start=" << i->dtStart()
198 QHashIterator<QString, Incidence::Ptr>i(mIncidences[incidenceType]);
199 while (i.hasNext()) {
202 i.value()->unRegisterObserver(q);
204 mIncidences[incidenceType].clear();
205 mIncidencesForDate[incidenceType].clear();
208 Incidence::Ptr MemoryCalendar::Private::incidence(
const QString &uid,
212 QList<Incidence::Ptr> values = mIncidences[
type].values(uid);
213 QList<Incidence::Ptr>::const_iterator it;
214 for (it = values.constBegin(); it != values.constEnd(); ++it) {
216 if (recurrenceId.isNull()) {
217 if (!i->hasRecurrenceId()) {
221 if (i->hasRecurrenceId() && i->recurrenceId() ==
recurrenceId) {
230 MemoryCalendar::Private::deletedIncidence(
const QString &uid,
231 const KDateTime &recurrenceId,
238 QList<Incidence::Ptr> values = mDeletedIncidences[
type].values(uid);
239 QList<Incidence::Ptr>::const_iterator it;
240 for (it = values.constBegin(); it != values.constEnd(); ++it) {
242 if (recurrenceId.isNull()) {
243 if (!i->hasRecurrenceId()) {
247 if (i->hasRecurrenceId() && i->recurrenceId() ==
recurrenceId) {
255 void MemoryCalendar::Private::insertIncidence(
const Incidence::Ptr &incidence)
257 const QString uid = incidence->uid();
259 if (!mIncidences[type].contains(uid, incidence)) {
260 mIncidences[
type].insert(uid, incidence);
261 mIncidencesByIdentifier.insert(incidence->instanceIdentifier(), incidence);
264 mIncidencesForDate[
type].insert(dt.date().toString(), incidence);
271 Q_ASSERT(mIncidences[type].value(uid) == incidence);
279 d->insertIncidence(incidence);
281 notifyIncidenceAdded(incidence);
283 incidence->registerObserver(
this);
285 setupRelations(incidence);
294 return addIncidence(event);
299 return deleteIncidence(event);
304 return deleteIncidenceInstances(event);
313 const KDateTime &recurrenceId)
const 325 return addIncidence(todo);
330 return deleteIncidence(todo);
335 return deleteIncidenceInstances(todo);
344 const KDateTime &recurrenceId)
const 350 const KDateTime &recurrenceId)
const 360 while (i.hasNext()) {
362 todoList.append(i.value().staticCast<
Todo>());
370 if (!deletionTracking()) {
376 while (i.hasNext()) {
378 todoList.append(i.value().staticCast<
Todo>());
390 QList<Incidence::Ptr>::const_iterator it;
391 for (it = values.constBegin(); it != values.constEnd(); ++it) {
393 if (t->hasRecurrenceId()) {
405 KDateTime::Spec ts = timeSpec();
406 const QString dateStr = date.toString();
407 QMultiHash<QString, IncidenceBase::Ptr >::const_iterator it =
409 while (it != d->mIncidencesForDate[
Incidence::TypeTodo].constEnd() && it.key() == dateStr) {
410 t = it.value().staticCast<
Todo>();
417 while (i.hasNext()) {
419 t = i.value().staticCast<
Todo>();
421 if (t->recursOn(date, ts)) {
432 const KDateTime::Spec ×pec,
433 bool inclusive)
const 438 KDateTime::Spec ts = timespec.isValid() ? timespec : timeSpec();
439 KDateTime st(start, ts);
440 KDateTime nd(end, ts);
445 while (i.hasNext()) {
447 todo = i.value().staticCast<
Todo>();
448 if (!isVisible(todo)) {
452 KDateTime rStart = todo->
hasDueDate() ? todo->dtDue() :
453 todo->hasStartDate() ? todo->dtStart() : KDateTime();
454 if (!rStart.isValid()) {
458 if (!todo->recurs()) {
459 if (nd.isValid() && nd < rStart) {
462 if (st.isValid() && rStart < st) {
466 switch (todo->recurrence()->duration()) {
471 KDateTime rEnd(todo->recurrence()->endDate(), ts);
472 if (!rEnd.isValid()) {
475 if (st.isValid() && rEnd < st) {
482 todoList.append(todo);
490 return alarms(KDateTime(QDate(1900, 1, 1)), to);
498 while (ie.hasNext()) {
500 e = ie.value().staticCast<
Event>();
502 appendRecurringAlarms(alarmList, e, from, to);
504 appendAlarms(alarmList, e, from, to);
510 while (it.hasNext()) {
512 t = it.value().staticCast<
Todo>();
514 if (!t->isCompleted()) {
515 appendAlarms(alarmList, t, from, to);
517 appendRecurringAlarms(alarmList, t, from, to);
519 appendAlarms(alarmList, t, from, to);
532 if (!d->mIncidenceBeingUpdated.isEmpty()) {
533 kWarning() <<
"Incidence::update() called twice without an updated() call in between.";
537 d->mIncidenceBeingUpdated = inc->instanceIdentifier();
542 d->mIncidencesForDate[
type].remove(dt.date().toString(), inc);
553 if (d->mIncidenceBeingUpdated.isEmpty()) {
554 kWarning() <<
"Incidence::updated() called twice without an update() call in between.";
555 }
else if (inc->instanceIdentifier() != d->mIncidenceBeingUpdated) {
557 d->mIncidencesByIdentifier.remove(d->mIncidenceBeingUpdated);
558 d->mIncidencesByIdentifier.insert(inc->instanceIdentifier(), inc);
561 d->mIncidenceBeingUpdated = QString();
563 inc->setLastModified(KDateTime::currentUtcDateTime());
571 d->mIncidencesForDate[
type].insert(dt.date().toString(), inc);
574 notifyIncidenceChanged(inc);
581 const KDateTime::Spec ×pec,
587 if (!date.isValid()) {
595 const QString dateStr = date.toString();
596 QMultiHash<QString, IncidenceBase::Ptr >::const_iterator it =
599 KDateTime::Spec ts = timespec.isValid() ? timespec : timeSpec();
600 KDateTime kdt(date, ts);
602 ev = it.value().staticCast<
Event>();
603 KDateTime end(ev->dtEnd().toTimeSpec(ev->dtStart()));
605 end.setDateOnly(
true);
607 end = end.addSecs(-1);
610 eventList.append(ev);
617 while (i.hasNext()) {
619 ev = i.value().staticCast<
Event>();
621 if (ev->isMultiDay()) {
622 int extraDays = ev->
dtStart().date().daysTo(ev->dtEnd().date());
623 for (
int i = 0; i <= extraDays; ++i) {
624 if (ev->recursOn(date.addDays(-i), ts)) {
625 eventList.append(ev);
630 if (ev->recursOn(date, ts)) {
631 eventList.append(ev);
635 if (ev->isMultiDay()) {
636 if (ev->dtStart().date() <= date && ev->dtEnd().date() >= date) {
637 eventList.append(ev);
648 const KDateTime::Spec ×pec,
649 bool inclusive)
const 652 KDateTime::Spec ts = timespec.isValid() ? timespec : timeSpec();
653 KDateTime st(start, ts);
654 KDateTime nd(end, ts);
655 KDateTime yesterStart = st.addDays(-1);
660 while (i.hasNext()) {
662 event = i.value().staticCast<
Event>();
663 KDateTime rStart =
event->
dtStart();
667 if (inclusive && rStart < st) {
671 if (!event->recurs()) {
672 KDateTime rEnd =
event->dtEnd();
676 if (inclusive && nd < rEnd) {
680 switch (event->recurrence()->duration()) {
688 KDateTime rEnd(event->recurrence()->endDate(), ts);
689 if (!rEnd.isValid()) {
695 if (inclusive && nd < rEnd) {
702 eventList.append(event);
710 return rawEventsForDate(kdt.date(), kdt.timeSpec());
718 while (i.hasNext()) {
720 eventList.append(i.value().staticCast<
Event>());
728 if (!deletionTracking()) {
734 while (i.hasNext()) {
736 eventList.append(i.value().staticCast<
Event>());
748 QList<Incidence::Ptr>::const_iterator it;
749 for (it = values.constBegin(); it != values.constEnd(); ++it) {
751 if (ev->hasRecurrenceId()) {
760 return addIncidence(journal);
765 return deleteIncidence(journal);
770 return deleteIncidenceInstances(journal);
779 const KDateTime &recurrenceId)
const 785 const KDateTime &recurrenceId)
const 795 while (i.hasNext()) {
797 journalList.append(i.value().staticCast<
Journal>());
805 if (!deletionTracking()) {
811 while (i.hasNext()) {
813 journalList.append(i.value().staticCast<
Journal>());
825 QList<Incidence::Ptr>::const_iterator it;
826 for (it = values.constBegin(); it != values.constEnd(); ++it) {
828 if (j->hasRecurrenceId()) {
840 QString dateStr = date.toString();
841 QMultiHash<QString, IncidenceBase::Ptr >::const_iterator it =
845 j = it.value().staticCast<
Journal>();
846 journalList.append(j);
854 return d->mIncidencesByIdentifier.value(identifier);
bool deleteIncidence(const Incidence::Ptr &incidence)
Removes an Incidence from the calendar.
JournalSortField
Calendar Journal sort keys.
void incidenceUpdated(const QString &uid, const KDateTime &recurrenceId)
The Observer interface.
Journal::List rawJournals(JournalSortField sortField=JournalSortUnsorted, SortDirection sortDirection=SortDirectionAscending) const
Returns a sorted, unfiltered list of all Journals for this Calendar.
Journal::List deletedJournals(JournalSortField sortField=JournalSortUnsorted, SortDirection sortDirection=SortDirectionAscending) const
Returns a sorted, unfiltered list of all deleted Journals for this Calendar.
bool deleteTodo(const Todo::Ptr &todo)
Removes a Todo from the calendar.
virtual void virtual_hook(int id, void *data)
Standard trick to add virtuals later.
QVector< Ptr > List
List of journals.
void close()
Clears out the current calendar, freeing all used memory etc.
Role for looking up an incidence in a Calendar.
void deleteAllTodos()
Removes all To-dos from the calendar.
Todo::List deletedTodos(TodoSortField sortField=TodoSortUnsorted, SortDirection sortDirection=SortDirectionAscending) const
Returns a sorted, unfiltered list of all deleted Todos for this Calendar.
QString uid() const
Returns the unique id (uid) for the incidence.
This file is part of the API for handling calendar data and defines the MemoryCalendar class...
QSharedPointer< Event > Ptr
A shared pointer to an Event object.
Event::Ptr event(const QString &uid, const KDateTime &recurrenceId=KDateTime()) const
Returns the Event associated with the given unique identifier.
MemoryCalendar(const KDateTime::Spec &timeSpec)
Constructs a calendar with a specified time zone timeZoneid.
bool deleteEvent(const Event::Ptr &event)
Removes an Event from the calendar.
Event::List rawEvents(EventSortField sortField=EventSortUnsorted, SortDirection sortDirection=SortDirectionAscending) const
Returns a sorted, unfiltered list of all Events for this Calendar.
void deleteAllJournals()
Removes all Journals from the calendar.
KDateTime::Spec timeSpec() const
Get the time specification (time zone etc.) used for creating or modifying incidences in the Calendar...
QVector< Ptr > List
List of alarms.
EventSortField
Calendar Event sort keys.
QSharedPointer< Incidence > Ptr
A shared pointer to an Incidence.
void notifyIncidenceDeleted(const Incidence::Ptr &incidence)
Let Calendar subclasses notify that they removed an Incidence.
IncidenceType
The different types of incidences, per RFC2445.
bool hasDueDate() const
Returns if the todo has a due datetime.
static Event::List sortEvents(const Event::List &eventList, EventSortField sortField, SortDirection sortDirection)
Sort a list of Events.
~MemoryCalendar()
Destroys the calendar.
Incidence::Ptr incidence(const QString &uid, const KDateTime &recurrenceId=KDateTime()) const
Returns the Incidence associated with the given unique identifier.
void incidenceUpdate(const QString &uid, const KDateTime &recurrenceId)
The IncidenceObserver interface.
Incidence::Ptr instance(const QString &identifier) const
Returns an incidence by identifier.
Journal::Ptr journal(const QString &uid, const KDateTime &recurrenceId=KDateTime()) const
Returns the Journal associated with the given unique identifier.
QVector< Ptr > List
List of events.
Alarm::List alarms() const
Returns a list of all incidence alarms.
This class provides a calendar stored in memory.
static Journal::List sortJournals(const Journal::List &journalList, JournalSortField sortField, SortDirection sortDirection)
Sort a list of Journals.
SortDirection
Calendar Incidence sort directions.
Event::List eventInstances(const Incidence::Ptr &event, EventSortField sortField=EventSortUnsorted, SortDirection sortDirection=SortDirectionAscending) const
Returns a sorted, unfiltered list of all possible instances for this recurring Event.
bool deleteEventInstances(const Event::Ptr &event)
Delete all events that are instances of recurring event event.
Journal::List rawJournalsForDate(const QDate &date) const
Returns an unfiltered list of all Journals for on the specified date.
Journal::List journalInstances(const Incidence::Ptr &journal, JournalSortField sortField=JournalSortUnsorted, SortDirection sortDirection=SortDirectionAscending) const
Todo::Ptr todo(const QString &uid, const KDateTime &recurrenceId=KDateTime()) const
Returns the Todo associated with the given unique identifier.
void deleteAllEvents()
Removes all Events from the calendar.
bool addTodo(const Todo::Ptr &todo)
Inserts a Todo into the calendar.
TodoSortField
Calendar Todo sort keys.
bool deletionTracking() const
Returns if deletion tracking is enabled.
Todo::List todoInstances(const Incidence::Ptr &todo, TodoSortField sortField=TodoSortUnsorted, SortDirection sortDirection=SortDirectionAscending) const
Returns a sorted, unfiltered list of all possible instances for this recurring Todo.
bool addJournal(const Journal::Ptr &journal)
Inserts a Journal into the calendar.
Provides a Journal in the sense of RFC2445.
QVector< Ptr > List
List of to-dos.
Todo::Ptr deletedTodo(const QString &uid, const KDateTime &recurrenceId=KDateTime()) const
Returns the deleted Todo associated with the given unique identifier.
bool addIncidence(const Incidence::Ptr &incidence)
Inserts an Incidence into the calendar.
bool deleteJournalInstances(const Journal::Ptr &journal)
Delete all journals that are instances of recurring journal journal.
KDateTime recurrenceId() const
Returns the incidence recurrenceId.
Event::Ptr deletedEvent(const QString &uid, const KDateTime &recurrenceId=KDateTime()) const
Returns the deleted Event associated with the given unique identifier.
Provides a To-do in the sense of RFC2445.
This class provides an Event in the sense of RFC2445.
Event::List rawEventsForDate(const QDate &date, const KDateTime::Spec &timeSpec=KDateTime::Spec(), EventSortField sortField=EventSortUnsorted, SortDirection sortDirection=SortDirectionAscending) const
Returns an unfiltered list of all Events which occur on the given date.
IncidenceType type() const
Alarm::List alarmsTo(const KDateTime &to) const
Return a list of Alarms that occur before the specified timestamp.
Event::List deletedEvents(EventSortField sortField=EventSortUnsorted, SortDirection sortDirection=SortDirectionAscending) const
Returns a sorted, unfiltered list of all deleted Events for this Calendar.
Represents the main calendar class.
bool deleteJournal(const Journal::Ptr &journal)
Removes a Journal from the calendar.
bool deleteIncidenceInstances(const Incidence::Ptr &incidence)
Delete all incidences that are instances of recurring incidence incidence.
bool deleteTodoInstances(const Todo::Ptr &todo)
Delete all to-dos that are instances of recurring to-do todo.
bool addEvent(const Event::Ptr &event)
Inserts an Event into the calendar.
QSharedPointer< Todo > Ptr
A shared pointer to a Todo object.
Journal::Ptr deletedJournal(const QString &uid, const KDateTime &recurrenceId=KDateTime()) const
Returns the deleted Journal associated with the given unique identifier.
static Todo::List sortTodos(const Todo::List &todoList, TodoSortField sortField, SortDirection sortDirection)
Sort a list of Todos.
QSharedPointer< Journal > Ptr
A shared pointer to a Journal object.
Todo::List rawTodos(TodoSortField sortField=TodoSortUnsorted, SortDirection sortDirection=SortDirectionAscending) const
Returns a sorted, unfiltered list of all Todos for this Calendar.
Todo::List rawTodosForDate(const QDate &date) const
Returns an unfiltered list of all Todos which due on the specified date.
virtual KDateTime dtStart() const
Returns an incidence's starting date/time as a KDateTime.
Alarm::List alarms(const KDateTime &from, const KDateTime &to) const
Returns a list of Alarms within a time range for this Calendar.