diff --git a/src/akonadi/akonadimessaging.h b/src/akonadi/akonadimessaging.h --- a/src/akonadi/akonadimessaging.h +++ b/src/akonadi/akonadimessaging.h @@ -37,6 +37,8 @@ ~Messaging(); void sendDelegationMessage(Akonadi::Item item) Q_DECL_OVERRIDE; + void sendDeleteMessageToOrganisator(Akonadi::Item item) Q_DECL_OVERRIDE; + void sendDeleteMessageToDelegatee(Akonadi::Item item) Q_DECL_OVERRIDE; private: ITIPHandler *m_itip; diff --git a/src/akonadi/akonadimessaging.cpp b/src/akonadi/akonadimessaging.cpp --- a/src/akonadi/akonadimessaging.cpp +++ b/src/akonadi/akonadimessaging.cpp @@ -53,3 +53,29 @@ m_itip->sendiTIPMessage(KCalCore::iTIPRequest, todo, window); } + +void Messaging::sendDeleteMessageToOrganisator(Akonadi::Item item) +{ + auto todo = item.payload(); + Q_ASSERT(todo); + + QWidget *window = 0; + if (!QApplication::topLevelWidgets().isEmpty()) { + window = QApplication::topLevelWidgets().first(); + } + todo->attendees().first()->setStatus(KCalCore::Attendee::Declined); + m_itip->sendiTIPMessage(KCalCore::iTIPReply, todo, window); +} + +void Messaging::sendDeleteMessageToDelegatee(Akonadi::Item item) +{ + auto todo = item.payload(); + Q_ASSERT(todo); + + QWidget *window = 0; + if (!QApplication::topLevelWidgets().isEmpty()) { + window = QApplication::topLevelWidgets().first(); + } + + m_itip->sendiTIPMessage(KCalCore::iTIPCancel, todo, window); +} \ No newline at end of file diff --git a/src/akonadi/akonadimessaginginterface.h b/src/akonadi/akonadimessaginginterface.h --- a/src/akonadi/akonadimessaginginterface.h +++ b/src/akonadi/akonadimessaginginterface.h @@ -35,6 +35,8 @@ virtual ~MessagingInterface(); virtual void sendDelegationMessage(Akonadi::Item item) = 0; + virtual void sendDeleteMessageToOrganisator(Akonadi::Item item) = 0; + virtual void sendDeleteMessageToDelegatee(Akonadi::Item item) = 0; }; } diff --git a/src/akonadi/akonadiserializer.cpp b/src/akonadi/akonadiserializer.cpp --- a/src/akonadi/akonadiserializer.cpp +++ b/src/akonadi/akonadiserializer.cpp @@ -512,6 +512,11 @@ task->setDelegate(Domain::Task::Delegate((*delegate)->name(), (*delegate)->email())); } } + + if(todo->organizer()) { + task->setProperty("organizer", todo->organizer()->fullName()); + } + if (!todo->alarms().isEmpty()) { task->setAlarms(fromKCalAlarm(todo->alarms())); } else { diff --git a/src/akonadi/akonaditaskrepository.cpp b/src/akonadi/akonaditaskrepository.cpp --- a/src/akonadi/akonaditaskrepository.cpp +++ b/src/akonadi/akonaditaskrepository.cpp @@ -219,9 +219,19 @@ KJob *TaskRepository::remove(Domain::Task::Ptr task) { + auto delegate = task->delegate(); auto item = m_serializer->createItemFromTask(task); Q_ASSERT(item.isValid()); + if (delegate.isValid()) { + KPIMIdentities::IdentityManager identityManager; + if (identityManager.thatIsMe(delegate.email())) { + m_messaging->sendDeleteMessageToOrganisator(item); + } else { + m_messaging->sendDeleteMessageToDelegatee(item); + } + } + auto compositeJob = new CompositeJob(); ItemFetchJobInterface *fetchItemJob = m_storage->fetchItem(item); compositeJob->install(fetchItemJob->kjob(), [fetchItemJob, compositeJob, this] { @@ -329,9 +339,11 @@ task->blockSignals(true); task->setDelegate(delegate); - KPIMIdentities::IdentityManager identityManager; - task->setProperty("organizer", identityManager.defaultIdentity().fullEmailAddr()); + if (task->property("organizer").toString().isEmpty()) { + KPIMIdentities::IdentityManager identityManager; + task->setProperty("organizer", identityManager.defaultIdentity().fullEmailAddr()); + } auto item = m_serializer->createItemFromTask(task); task->setDelegate(originalDelegate);