[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