[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [kdepimlibs/calendaring] akonadi/calendar: Make the remaining stuff async.
From: Sergio Martins <iamsergio () gmail ! com>
Date: 2012-07-30 22:58:47
Message-ID: 20120730225847.23F3AA60A6 () git ! kde ! org
[Download RAW message or body]
Git commit 6d23a91bc6629faa5cfa2b74e00401726792e9a2 by Sergio Martins.
Committed on 31/07/2012 at 00:57.
Pushed by smartins into branch 'calendaring'.
Make the remaining stuff async.
InvitationHandler uses MailScheduler which is async and was
doing error handling ( or not doing any ) when the MailScheduler
call returned, instead of waiting for the underlying thread/job
to finish.
This code base already suffered a lot: kde3->kde4 port, akonadi
port and now forcing it to be async, so it's a bit of a mess,
therefore I won't export this class, will only be used by
IncidenceChanger.
M +62 -37 akonadi/calendar/invitationhandler_p.cpp
M +15 -11 akonadi/calendar/invitationhandler_p.h
M +2 -2 akonadi/calendar/mailscheduler_p.cpp
http://commits.kde.org/kdepimlibs/6d23a91bc6629faa5cfa2b74e00401726792e9a2
diff --git a/akonadi/calendar/invitationhandler_p.cpp \
b/akonadi/calendar/invitationhandler_p.cpp index 9d2da44..b76cd6c 100644
--- a/akonadi/calendar/invitationhandler_p.cpp
+++ b/akonadi/calendar/invitationhandler_p.cpp
@@ -22,7 +22,6 @@
*/
#include "invitationhandler_p.h"
-#include "mailscheduler_p.h"
#include "fetchjobcalendar.h"
#include <KCalCore/Calendar>
@@ -52,6 +51,12 @@ struct Invitation {
QString receiver;
};
+enum Status {
+ StatusNone,
+ StatusAcceptingCounterProposal,
+ StatusSendingInvitation
+};
+
class InvitationHandler::Private
{
public:
@@ -88,6 +93,8 @@ public:
bool mOutlookCompatCounterProposals;
KPIMIdentities::IdentityManager *m_identityManager;
MailScheduler *m_scheduler;
+ Status m_status;
+ KCalCore::Incidence::Ptr m_incidence;
};
}
@@ -127,10 +134,9 @@ InvitationHandler::Private::Private( const FetchJobCalendar::Ptr \
&calendar, QWid , mOutlookCompatCounterProposals( false )
, m_identityManager( new IdentityManager( /*ro=*/ true, parent ) )
, m_scheduler( new MailScheduler( calendar, parent ) )
+ , m_status( StatusNone )
{
m_scheduler->setBccMe( false );
- connect( m_scheduler, \
SIGNAL(transactionFinished(Akonadi::MailClient::Result,QString)),
- SLOT(onSchedulerFinished(Akonadi::MailClient::Result,QString)) );
}
QStringList InvitationHandler::Private::allEmails() const
@@ -229,15 +235,9 @@ InvitationHandler::Private::sentInvitation( int \
messageBoxReturnCode, }
// Send the mail
- m_scheduler->performTransaction( _incidence, method ); // TODO catch signal
-
- const QString question( i18n( "Sending group scheduling email failed." ) );
- messageBoxReturnCode = askUserIfNeeded( question, true, KGuiItem( i18n( "Abort \
Update" ) ) );
- if ( messageBoxReturnCode == KMessageBox::Yes ) {
- return InvitationHandler::ResultFailAbortUpdate;
- } else {
- return InvitationHandler::ResultFailKeepUpdate;
- }
+ m_status = StatusSendingInvitation;
+ m_scheduler->performTransaction( _incidence, method );
+ return InvitationHandler::ResultSuccess;
} else if ( messageBoxReturnCode == KMessageBox::No ) {
return InvitationHandler::ResultCanceled;
@@ -276,15 +276,8 @@ bool InvitationHandler::Private::weNeedToSendMailFor( const \
KCalCore::Incidence: InvitationHandler::InvitationHandler( const \
FetchJobCalendar::Ptr &calendar, QWidget *widget ) : d ( new \
InvitationHandler::Private( calendar, widget ) ) {
- // TODO connect to the loading signal
- connect( calendar.data(), SIGNAL(addFinished(bool,QString)),
- SLOT(calendarJobFinished(bool,QString)), Qt::QueuedConnection );
-
- connect( calendar.data(), SIGNAL(deleteFinished(bool,QString)),
- SLOT(calendarJobFinished(bool,QString)), Qt::QueuedConnection );
-
- connect( calendar.data(), SIGNAL(changeFinished(bool,QString)),
- SLOT(calendarJobFinished(bool,QString)), Qt::QueuedConnection );
+ connect( d->m_scheduler, \
SIGNAL(transactionFinished(Akonadi::MailScheduler::Result,QString)), + \
SLOT(onSchedulerFinished(Akonadi::MailScheduler::Result,QString)) ); }
InvitationHandler::~InvitationHandler()
@@ -312,7 +305,7 @@ void InvitationHandler::handleInvitation( const QString \
&receiver, KMessageBox::detailedError( d->mParent,
i18n( "Error while processing an invitation or \
update." ), errorMessage );
- emit finished( /*success=*/false, errorMessage );
+ emit finished( ResultError, errorMessage );
return;
}
@@ -320,7 +313,7 @@ void InvitationHandler::handleInvitation( const QString \
&receiver, KCalCore::ScheduleMessage::Status status = message->status();
KCalCore::Incidence::Ptr incidence = \
message->event().dynamicCast<KCalCore::Incidence>(); if ( !incidence ) {
- emit finished( /*success=*/false, QLatin1String( "Invalid incidence" ) );
+ emit finished( ResultError, QLatin1String( "Invalid incidence" ) );
return;
}
@@ -358,15 +351,14 @@ void InvitationHandler::handleInvitation( const QString \
&receiver, if ( method != KCalCore::iTIPCounter ) {
d->m_scheduler->acceptTransaction( incidence, method, status, QString() );
} else {
+ d->m_status = StatusAcceptingCounterProposal;
+ d->m_incidence = incidence; // so we can access it in the slot
d->m_scheduler->acceptCounterProposal( incidence );
- // send update to all attendees
- sendIncidenceModifiedMessage( KCalCore::iTIPRequest,
- KCalCore::Incidence::Ptr( incidence->clone() ), \
false ); }
return; // signal emitted in onSchedulerFinished().
} else {
kError() << "Unknown incoming action" << action;
- emit finished( /*success=*/false, i18n( "Invalid action: %1", action ) );
+ emit finished( ResultError, i18n( "Invalid action: %1", action ) );
}
if ( action.startsWith( QLatin1String( "counter" ) ) ) {
@@ -460,7 +452,6 @@ InvitationHandler::sendIncidenceModifiedMessage( \
KCalCore::iTIPMethod method,
const int messageBoxReturnCode = d->askUserIfNeeded( question, false, \
KGuiItem( i18n( "Send Update" ) ) );
return d->sentInvitation( messageBoxReturnCode, incidence, method );
-
} else {
return ResultNoSendingNeeded;
}
@@ -572,6 +563,9 @@ InvitationHandler::SendResult
InvitationHandler::sendCounterProposal( const KCalCore::Incidence::Ptr &oldEvent,
const KCalCore::Incidence::Ptr &newEvent ) \
const {
+ Q_ASSERT( oldEvent );
+ Q_ASSERT( newEvent );
+
if ( !oldEvent || !newEvent || *oldEvent == *newEvent )
return InvitationHandler::ResultNoSendingNeeded;
@@ -581,18 +575,12 @@ InvitationHandler::sendCounterProposal( const \
KCalCore::Incidence::Ptr &oldEvent tmp->setDescription( newEvent->description() );
tmp->addComment( proposalComment( newEvent ) );
- // TODO: Shouldn't we ask here?
return d->sentInvitation( KMessageBox::Yes, tmp, KCalCore::iTIPReply );
} else {
return d->sentInvitation( KMessageBox::Yes, newEvent, KCalCore::iTIPCounter );
}
}
-void InvitationHandler::calendarJobFinished( bool success, const QString \
&errorString )
-{
- emit finished( success, errorString );
-}
-
void InvitationHandler::setOutlookCompatibleCounterProposals( bool enable )
{
d->mOutlookCompatCounterProposals = enable;
@@ -603,10 +591,47 @@ void InvitationHandler::setBccMe( bool enable )
d->m_scheduler->setBccMe( enable );
}
-void InvitationHandler::onSchedulerFinished( MailClient::Result result, const \
QString &errorMsg ) +void InvitationHandler::onSchedulerFinished( \
MailScheduler::Result result, const QString &errorMsg ) {
- const bool success = result == MailClient::ResultSuccess;
- emit finished( success, i18n( "Mail scheduler error: %1", errorMsg ) );
+ const bool success = result == MailScheduler::ResultSuccess;
+
+ if ( d->m_status == StatusAcceptingCounterProposal ) {
+ if ( success ) {
+ d->m_status = StatusNone;
+ // send update to all attendees
+ Q_ASSERT( d->m_incidence );
+ SendResult sendResult = sendIncidenceModifiedMessage( KCalCore::iTIPRequest,
+ \
KCalCore::Incidence::Ptr( d->m_incidence->clone() ), + \
false ); + d->m_incidence.clear();
+ if ( sendResult == ResultNoSendingNeeded ||
+ sendResult == InvitationHandler::ResultCanceled ) {
+ emit finished( sendResult, QString() );
+ } else {
+ // MailScheduler is working hard and this slot will be called again
+ return;
+ }
+ } else {
+ //fall through
+ }
+ } else if ( d->m_status == StatusSendingInvitation ) {
+ d->m_status = StatusNone;
+ if ( !success ) {
+ const QString question( i18n( "Sending group scheduling email failed." ) );
+ const int code = d->askUserIfNeeded( question, true, KGuiItem( i18n( "Abort \
Update" ) ) ); + if ( code == KMessageBox::Yes ) {
+ emit finished( ResultFailAbortUpdate, QString() );
+ } else {
+ emit finished( ResultFailKeepUpdate, QString() );
+ }
+ return;
+ } else {
+ //fall through
+ }
+ }
+
+ emit finished( success ? ResultSuccess : ResultError,
+ success ? QString() : i18n( "Error: %1", errorMsg ) );
}
#include "invitationhandler_p.moc"
diff --git a/akonadi/calendar/invitationhandler_p.h \
b/akonadi/calendar/invitationhandler_p.h index f634373..b18edf4 100644
--- a/akonadi/calendar/invitationhandler_p.h
+++ b/akonadi/calendar/invitationhandler_p.h
@@ -25,7 +25,7 @@
#define AKONADI_CALENDAR_INVITATIONHANDLER_H
#include "fetchjobcalendar.h"
-
+#include "mailscheduler_p.h"
#include "etmcalendar.h"
#include <KCalCore/Incidence>
@@ -82,6 +82,7 @@ class InvitationHandler : public QObject
ResultFailAbortUpdate, /**< Sending failed, the changes to the incidence must \
be undone. */
ResultNoSendingNeeded, /**< In some cases it is not needed to send an \
invitation (e.g. when we are the only attendee) */
+ ResultError, /**< An unexpected error occured */
ResultSuccess /**< The invitation was sent to all attendees. */
};
@@ -118,8 +119,8 @@ class InvitationHandler : public QObject
Kontact/PIM) are the organizer.
@param incidence The new incidence.
*/
- SendResult sendIncidenceCreatedMessage( KCalCore::iTIPMethod method,
- const KCalCore::Incidence::Ptr \
&incidence ); + InvitationHandler::SendResult sendIncidenceCreatedMessage( \
KCalCore::iTIPMethod method, + \
const KCalCore::Incidence::Ptr &incidence );
/**
@@ -139,24 +140,24 @@ class InvitationHandler : public QObject
@param incidence The modified incidence.
@param attendeeSatusChanged ????
*/
- SendResult sendIncidenceModifiedMessage( KCalCore::iTIPMethod method,
- const KCalCore::Incidence::Ptr \
&incidence,
- bool attendeeStatusChanged );
+ InvitationHandler::SendResult sendIncidenceModifiedMessage( KCalCore::iTIPMethod \
method, + const \
KCalCore::Incidence::Ptr &incidence, + \
bool attendeeStatusChanged );
/**
Handles sending of ivitations for deleted incidences.
@param incidence The deleted incidence.
*/
- SendResult sendIncidenceDeletedMessage( KCalCore::iTIPMethod method,
- const KCalCore::Incidence::Ptr \
&incidence ); + InvitationHandler::SendResult sendIncidenceDeletedMessage( \
KCalCore::iTIPMethod method, + \
const KCalCore::Incidence::Ptr &incidence );
/**
Send counter proposal message.
@param oldEvent The original event provided in the invitations.
@param newEvent The new event as edited by the user.
*/
- SendResult sendCounterProposal( const KCalCore::Incidence::Ptr &oldIncidence,
- const KCalCore::Incidence::Ptr &newIncidence ) \
const; + InvitationHandler::SendResult sendCounterProposal( const \
KCalCore::Incidence::Ptr &oldIncidence, + \
const KCalCore::Incidence::Ptr &newIncidence ) const;
void setOutlookCompatibleCounterProposals( bool enable );
@@ -172,7 +173,10 @@ class InvitationHandler : public QObject
*/
void editorRequested( const KCalCore::Incidence::Ptr &incidence );
- void finished( bool success, const QString &errorMessage );
+ void finished( Akonadi::InvitationHandler::SendResult result, const QString \
&errorMessage ); +
+ private Q_SLOTS:
+ void onSchedulerFinished( Akonadi::MailScheduler::Result result, const QString \
&errorMsg );
private:
class Private;
diff --git a/akonadi/calendar/mailscheduler_p.cpp \
b/akonadi/calendar/mailscheduler_p.cpp index 3f9a657..810a0ff 100644
--- a/akonadi/calendar/mailscheduler_p.cpp
+++ b/akonadi/calendar/mailscheduler_p.cpp
@@ -195,8 +195,8 @@ void MailScheduler::onMailerFinished( Akonadi::MailClient::Result \
result, if ( result == MailClient::ResultSuccess ) {
emit transactionFinished( ResultSuccess, QString() );
} else {
- const QString message = i18n( "Error sending e-mail: ") + errorMsg;
- emit transactionFinished( ResultGenericError, message );
+ const QString message = i18n( "Error sending e-mail: ") + errorMsg;
+ emit transactionFinished( ResultGenericError, message );
}
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic