Index: akonadi/calendar/scheduler_p.cpp =================================================================== --- akonadi/calendar/scheduler_p.cpp +++ akonadi/calendar/scheduler_p.cpp @@ -275,7 +275,7 @@ incidence->setSchedulingID(schedulingUid, existingUid) ; if (incidence->hasRecurrenceId()) { - Incidence::Ptr existingInstance = calendar->incidence(incidence->instanceIdentifier()); + Incidence::Ptr existingInstance = calendar->incidence(existingUid, incidence->recurrenceId()); if (!existingInstance) { // The organizer created an exception, lets create it in our calendar, we don't have it yet const bool success = calendar->addIncidence(incidence); @@ -312,8 +312,8 @@ } } - // Move the uid to be the schedulingID and make a unique UID - incidence->setSchedulingID(schedulingUid, CalFormat::createUniqueId()); + // Move the uid to be the schedulingID for make it compatiple with old implemenation + incidence->setSchedulingID(schedulingUid); // notify the user in case this is an update and we didn't find the to-be-updated incidence if (d->mShowDialogs && existingIncidences.isEmpty() && incidence->revision() > 0) { KMessageBox::information( Index: akonadi/calendar/tests/itip_data/invited_us_daily_recid01 =================================================================== --- /dev/null +++ akonadi/calendar/tests/itip_data/invited_us_daily_recid01 @@ -0,0 +1,21 @@ +BEGIN:VCALENDAR +PRODID:Zimbra-Calendar-Provider +VERSION:2.0 +METHOD:REQUEST +BEGIN:VEVENT +UID:uosj936i6arrtl9c2i5r2mfuvg +SUMMARY:exception +ATTENDEE;RSVP=TRUE;PARTSTAT=ACCEPTED;ROLE=REQ-PARTICIPANT; + X-UID=140218344167648:mailto:their-email@dev.nul +ATTENDEE;RSVP=TRUE:mailto:unittests@dev.nul +ORGANIZER;mailto:their-email@dev.nul +DTSTART:20131024T000000Z +DTEND:20131024T010000Z +STATUS:CONFIRMED +CLASS:PUBLIC +TRANSP:OPAQUE +RECURRENCE-ID:20131023T090000Z +DTSTAMP:20131026T004419Z +DESCRIPTION:some explanation +END:VEVENT +END:VCALENDAR \ No newline at end of file Index: akonadi/calendar/tests/itiphandlertest.cpp =================================================================== --- akonadi/calendar/tests/itiphandlertest.cpp +++ akonadi/calendar/tests/itiphandlertest.cpp @@ -372,7 +372,7 @@ KCalCore::Incidence::Ptr incidence = items.first().payload(); QVERIFY(incidence); QCOMPARE(incidence->schedulingID(), incidenceUid); - QVERIFY(incidence->schedulingID() != incidence->uid()); + QCOMPARE(incidence->schedulingID(), incidence->uid()); KCalCore::Attendee::Ptr me = ourAttendee(incidence); QVERIFY(me); @@ -457,6 +457,14 @@ invitation_filenames << QLatin1String("invited_us_daily") << QLatin1String("invited_us_daily_update_recid01"); QTest::newRow("accept recid update") << invitation_filenames << expected_filename << actions; //---------------------------------------------------------------------------------------------- + // We accept a recurrening event, get an exception accept that too and get an update for the exception afterwards + expected_filename = QLatin1String("expected_data/update3"); + invitation_filenames.clear(); + invitation_filenames << QLatin1String("invited_us_daily") << QLatin1String("invited_us_daily_recid01") << QLatin1String("invited_us_daily_update_recid01"); + actions.clear(); + actions << QLatin1String("accepted") << QLatin1String("accepted") << QLatin1String("accepted"); + QTest::newRow("accept recid update update") << invitation_filenames << expected_filename << actions; + //---------------------------------------------------------------------------------------------- // We accept a recurring event, then we accept a CANCEL with recuring-id. // The result is that a exception with status CANCELLED should be created, and our main incidence // should not be touched