26 #include "invitationhandler.h"
27 #include "invitationhandler_p.h"
28 #include "invitationhandlerhelper_p.h"
29 #include "calendarsettings.h"
30 #include "publishdialog.h"
32 #include "mailclient_p.h"
34 #include <kcalcore/icalformat.h>
35 #include <kcalcore/incidence.h>
36 #include <kcalcore/schedulemessage.h>
37 #include <kcalcore/attendee.h>
38 #include <kcalutils/stringify.h>
41 #include <kpimidentities/identitymanager.h>
42 #include <mailtransport/transportmanager.h>
44 #include <KMessageBox>
47 using namespace Akonadi;
49 GroupwareUiDelegate::~GroupwareUiDelegate()
54 InvitationHandler::InvitationHandler( QObject *parent )
56 , d( new Private( this ) )
60 InvitationHandler::~InvitationHandler()
65 void InvitationHandler::processiTIPMessage(
const QString &receiver,
67 const QString &action )
69 Q_ASSERT( d->m_currentOperation == OperationNone );
70 if ( d->m_currentOperation != OperationNone ) {
71 kError() <<
"There can't be an operation in progress!" << d->m_currentOperation;
75 d->m_currentOperation = OperationProcessiTIPMessage;
77 if ( !d->m_calendar->isLoaded() ) {
78 d->m_queuedInvitation.receiver = receiver;
79 d->m_queuedInvitation.iCal = iCal;
80 d->m_queuedInvitation.action = action;
84 if ( d->m_calendarLoadError ) {
85 emit iTipMessageProcessed( ResultError, i18n(
"Error loading calendar." ) );
89 KCalCore::ICalFormat format;
90 KCalCore::ScheduleMessage::Ptr message = format.parseScheduleMessage( d->m_calendar, iCal );
93 const QString errorMessage = format.exception() ? i18n(
"Error message: %1", KCalUtils::Stringify::errorMessage( *format.exception() ) )
94 : i18n(
"Unknown error while parsing iCal invitation" );
96 kError() <<
"Error parsing" << errorMessage;
97 KMessageBox::detailedError( 0,
98 i18n(
"Error while processing an invitation or update." ),
100 emit iTipMessageProcessed( ResultError, errorMessage );
104 d->m_method =
static_cast<KCalCore::iTIPMethod
>( message->method() );
105 d->m_incidence.clear();
107 KCalCore::ScheduleMessage::Status status = message->status();
108 KCalCore::Incidence::Ptr incidence = message->event().dynamicCast<KCalCore::Incidence>();
110 emit iTipMessageProcessed( ResultError, QLatin1String(
"Invalid incidence" ) );
114 if ( action.startsWith( QLatin1String(
"accepted" ) ) ||
115 action.startsWith( QLatin1String(
"tentative" ) ) ||
116 action.startsWith( QLatin1String(
"delegated" ) ) ||
117 action.startsWith( QLatin1String(
"counter" ) ) ) {
120 const KCalCore::Attendee::List attendees = incidence->attendees();
121 foreach ( KCalCore::Attendee::Ptr attendee, attendees ) {
122 if ( attendee->email() == receiver ) {
123 if ( action.startsWith( QLatin1String(
"accepted" ) ) ) {
124 attendee->setStatus( KCalCore::Attendee::Accepted );
125 }
else if ( action.startsWith( QLatin1String(
"tentative" ) ) ) {
126 attendee->setStatus( KCalCore::Attendee::Tentative );
127 }
else if ( CalendarSettings::self()->outlookCompatCounterProposals() &&
128 action.startsWith( QLatin1String(
"counter" ) ) ) {
129 attendee->setStatus( KCalCore::Attendee::Tentative );
130 }
else if ( action.startsWith( QLatin1String(
"delegated" ) ) ) {
131 attendee->setStatus( KCalCore::Attendee::Delegated );
136 if ( CalendarSettings::self()->outlookCompatCounterProposals() ||
137 !action.startsWith( QLatin1String(
"counter" ) ) ) {
138 d->m_scheduler->acceptTransaction( incidence, d->m_calendar, d->m_method, status, receiver );
142 }
else if ( action.startsWith( QLatin1String(
"cancel" ) ) ) {
144 d->m_scheduler->acceptTransaction( incidence, d->m_calendar, KCalCore::iTIPCancel, status, receiver );
146 }
else if ( action.startsWith( QLatin1String(
"reply" ) ) ) {
147 if ( d->m_method != KCalCore::iTIPCounter ) {
148 d->m_scheduler->acceptTransaction( incidence, d->m_calendar, d->m_method, status, QString() );
150 d->m_incidence = incidence;
151 d->m_scheduler->acceptCounterProposal( incidence, d->m_calendar );
155 kError() <<
"Unknown incoming action" << action;
156 emit iTipMessageProcessed( ResultError, i18n(
"Invalid action: %1", action ) );
159 if ( d->m_uiDelegate && action.startsWith( QLatin1String(
"counter" ) ) ) {
162 item.
setPayload( KCalCore::Incidence::Ptr( incidence->clone() ) );
163 d->m_uiDelegate->requestIncidenceEditor( item );
167 void InvitationHandler::sendiTIPMessage( KCalCore::iTIPMethod method,
168 const KCalCore::Incidence::Ptr &incidence,
169 QWidget *parentWidget )
173 kError() <<
"Invalid incidence";
177 d->m_queuedInvitation.method = method;
178 d->m_queuedInvitation.incidence = incidence;
179 d->m_parentWidget = parentWidget;
181 if ( !d->m_calendar->isLoaded() ) {
186 Q_ASSERT( d->m_currentOperation == OperationNone );
187 if ( d->m_currentOperation != OperationNone ) {
188 kError() <<
"There can't be an operation in progress!" << d->m_currentOperation;
192 d->m_currentOperation = OperationSendiTIPMessage;
194 if ( incidence->attendeeCount() == 0 && method != KCalCore::iTIPPublish ) {
195 KMessageBox::information( parentWidget,
196 i18n(
"The item '%1' has no attendees. "
197 "Therefore no groupware message will be sent.",
198 incidence->summary() ),
199 i18n(
"Message Not Sent" ),
200 QLatin1String(
"ScheduleNoAttendees" ) );
204 KCalCore::Incidence *incidenceCopy = incidence->clone();
205 incidenceCopy->registerObserver( 0 );
206 incidenceCopy->clearAttendees();
208 d->m_scheduler->performTransaction( incidence, method );
211 void InvitationHandler::publishInformation(
const KCalCore::Incidence::Ptr &incidence,
212 QWidget *parentWidget )
214 Q_ASSERT( incidence );
216 kError() <<
"Invalid incidence. Aborting.";
220 Q_ASSERT( d->m_currentOperation == OperationNone );
221 if ( d->m_currentOperation != OperationNone ) {
222 kError() <<
"There can't be an operation in progress!" << d->m_currentOperation;
226 d->m_queuedInvitation.incidence = incidence;
227 d->m_parentWidget = parentWidget;
229 d->m_currentOperation = OperationPublishInformation;
231 QPointer<Akonadi::PublishDialog> publishdlg =
new Akonadi::PublishDialog();
232 if ( incidence->attendeeCount() > 0 ) {
233 KCalCore::Attendee::List attendees = incidence->attendees();
234 KCalCore::Attendee::List::ConstIterator it;
235 KCalCore::Attendee::List::ConstIterator end( attendees.constEnd() );
236 for ( it = attendees.constBegin(); it != end; ++it ) {
237 publishdlg->addAttendee( *it );
240 if ( publishdlg->exec() == QDialog::Accepted && publishdlg )
241 d->m_scheduler->publish( incidence, publishdlg->addresses() );
243 emit informationPublished( ResultSuccess, QString() );
247 void InvitationHandler::sendAsICalendar(
const KCalCore::Incidence::Ptr &incidence,
248 QWidget *parentWidget )
250 Q_ASSERT( incidence );
252 kError() <<
"Invalid incidence";
256 KPIMIdentities::IdentityManager identityManager;
258 QPointer<Akonadi::PublishDialog> publishdlg =
new Akonadi::PublishDialog;
259 if ( publishdlg->exec() == QDialog::Accepted && publishdlg ) {
260 const QString recipients = publishdlg->addresses();
261 if ( incidence->organizer()->isEmpty() ) {
262 incidence->setOrganizer( KCalCore::Person::Ptr(
263 new KCalCore::Person( Akonadi::CalendarUtils::fullName(),
264 Akonadi::CalendarUtils::email() ) ) );
267 KCalCore::ICalFormat format;
268 const QString from = Akonadi::CalendarUtils::email();
269 const bool bccMe = Akonadi::CalendarSettings::self()->bcc();
270 const QString messageText = format.createScheduleMessage( incidence, KCalCore::iTIPRequest );
271 MailClient *mailer =
new MailClient();
272 d->m_queuedInvitation.incidence = incidence;
273 connect( mailer, SIGNAL(finished(Akonadi::MailClient::Result,QString)),
274 d, SLOT(finishSendAsICalendar(Akonadi::MailScheduler::Result,QString)) );
276 mailer->mailTo( incidence, identityManager.identityForAddress( from ), from, bccMe,
277 recipients, messageText,
278 MailTransport::TransportManager::self()->defaultTransportName() );
282 void InvitationHandler::setGroupwareUiDelegate( GroupwareUiDelegate *delegate )
284 d->m_uiDelegate = delegate;
287 #include "invitationhandler.moc"