diff --git a/akonadi/calendar/calendarbase.cpp b/akonadi/calendar/calendarbase.cpp --- a/akonadi/calendar/calendarbase.cpp +++ b/akonadi/calendar/calendarbase.cpp @@ -229,7 +229,7 @@ << "Please fix it. Ignoring this incidence."; return; } - const QString calendar = QString::number(item.storageCollectionId()); + const QString calendar = QString::number(item.parentCollection().id()); const QString uniqueInstanceIdentifier = calendar + incidence->instanceIdentifier(); if (mItemIdByUniqueInstanceIdentifier.contains(uniqueInstanceIdentifier) && mItemIdByUniqueInstanceIdentifier[uniqueInstanceIdentifier] != item.id()) { @@ -273,6 +273,11 @@ mItemIdByUniqueInstanceIdentifier.insert(uniqueInstanceIdentifier, item.id()); mItemsByCollection.insert(item.storageCollectionId(), item); + // we need item in storageCollection, to find exceptions + if (item.parentCollection().id() != item.storageCollectionId()) { + mItemsByCollection.insert(item.parentCollection().id(), item); + } + incidence->setCustomProperty("VOLATILE", "AKONADI-ID", QString::number(item.id())); // Must be the last one due to re-entrancy const bool result = q->MultiCalendar::addIncidenceToCalendar(calendar, incidence); @@ -322,7 +327,7 @@ } Q_ASSERT(item.storageCollectionId() > 0); - const QString calendar = QString::number(item.storageCollectionId()); + const QString calendar = QString::number(item.parentCollection().id()); const QString uniqueInstanceIdentifier = calendar + tmp->instanceIdentifier(); // We want the one stored in the calendar @@ -331,11 +336,10 @@ // Null incidence means it was deleted via CalendarBase::deleteIncidence(), but then // the ETMCalendar received the monitor notification and tried to delete it again. if (incidence) { - mItemById.remove(item.id()); // kDebug() << "Deleting incidence from calendar .id=" << item.id() << "uid=" << incidence->uid(); mItemIdByUniqueInstanceIdentifier.remove(uniqueInstanceIdentifier); - mItemsByCollection.remove(item.storageCollectionId(), item); + mItemsByCollection.remove(item.parentCollection().id(), item); // Must be the last one due to re-entrancy // This will trigger the removal of all exceptions via deleteIncidence @@ -344,6 +348,13 @@ kError() << "Error removing incidence " << itemToString(item); Q_ASSERT(false); } + + // only remove ItemById entry if all incidences are deleted + // we need item in storageCollection, to find exceptions + if (mItemIdByUniqueInstanceIdentifier.key(item.id(), QString()).isEmpty()) { + mItemById.remove(item.id()); + mItemsByCollection.remove(item.storageCollectionId(), item); + } } else { kWarning() << "CalendarBase::internalRemove2: incidence is null, item.id=" << itemToString(item); } @@ -391,7 +402,7 @@ if (resultCode == IncidenceChanger::ResultCodeSuccess && !mListensForNewItems) { Q_ASSERT(item.isValid()); Q_ASSERT(item.hasPayload()); - //FIXME fetch, otherwise we don't have the storageCOllectionId + //FIXME fetch, otherwise we don't have the storageCollectionId internalInsert(item); } @@ -412,7 +423,7 @@ KCalCore::Incidence::Ptr incidence = CalendarUtils::incidence(item); Q_ASSERT(incidence); Q_ASSERT(item.storageCollectionId() > 0); - const QString calendar = QString::number(item.storageCollectionId()); + const QString calendar = QString::number(item.parentCollection().id()); // We want the one stored in the calendar KCalCore::Incidence::Ptr localIncidence = q->incidence(calendar, incidence->uid(), incidence->recurrenceId()); @@ -439,7 +450,7 @@ Incidence::Ptr oldIncidence = CalendarUtils::incidence(oldItem); Q_ASSERT(oldIncidence); - const QString calendar = QString::number(newItem.storageCollectionId()); + const QString calendar = QString::number(newItem.parentCollection().id()); const QString uniqueInstanceIdentifier = calendar + newIncidence->instanceIdentifier(); if (mItemIdByUniqueInstanceIdentifier.contains(uniqueInstanceIdentifier)) { Incidence::Ptr oldIncidence = CalendarUtils::incidence(oldItem); @@ -481,7 +492,7 @@ return; } - const QString oldCalendar = QString::number(oldItem.storageCollectionId()); + const QString oldCalendar = QString::number(oldItem.parentCollection().id()); const QString oldUniqueInstanceIdentifier = oldCalendar + oldIncidence->instanceIdentifier(); mItemIdByUniqueInstanceIdentifier.remove(oldUniqueInstanceIdentifier); const QString oldUid = oldIncidence->uid(); diff --git a/akonadi/calendar/etmcalendar.cpp b/akonadi/calendar/etmcalendar.cpp --- a/akonadi/calendar/etmcalendar.cpp +++ b/akonadi/calendar/etmcalendar.cpp @@ -432,14 +432,14 @@ Q_ASSERT(!newIncidence->uid().isEmpty()); newIncidence->setCustomProperty("VOLATILE", "AKONADI-ID", QString::number(item.id())); Q_ASSERT(item.storageCollectionId() >= 0); - IncidenceBase::Ptr existingIncidence = q->incidence(QString::number(item.storageCollectionId()), newIncidence->uid(), newIncidence->recurrenceId()); + IncidenceBase::Ptr existingIncidence = q->incidence(QString::number(item.parentCollection().id()), newIncidence->uid(), newIncidence->recurrenceId()); if (!existingIncidence && !mItemById.contains(item.id())) { // We don't know about this one because it was discarded, for example because of not having DTSTART return; } - mItemsByCollection.insert(item.storageCollectionId(), item); + mItemsByCollection.insert(item.parentCollection().id(), item); Akonadi::Item oldItem = mItemById.value(item.id()); if (existingIncidence) {