ipsservices/ipssosplugin/src/ipsplgeventhandler.cpp
branchRCL_3
changeset 25 3533d4323edc
parent 24 d189ee25cf9d
--- a/ipsservices/ipssosplugin/src/ipsplgeventhandler.cpp	Tue Aug 31 15:04:17 2010 +0300
+++ b/ipsservices/ipssosplugin/src/ipsplgeventhandler.cpp	Wed Sep 01 12:28:57 2010 +0100
@@ -105,7 +105,8 @@
     iIPSSettingsObservers.ResetAndDestroy();
     iIPSSettingsObservers.Close();
     iPropertyObservers.Close();
-// <qmail> iConnOpCallbacks, iSettingsApi members removed
+    iConnOpCallbacks.Close();
+    delete iSettingsApi;
     iImapFolderIds.Close();
     }
 
@@ -118,7 +119,8 @@
     iIPSAccounts( KEventGranularity ),
     iIPSSettingsObservers( KEventGranularity ),
     iIsConnected( EFalse ),
-    iPropertyObservers( KEventGranularity )
+    iPropertyObservers( KEventGranularity ),
+    iConnOpCallbacks( KEventGranularity )
     {
     FUNC_LOG;
     }
@@ -128,11 +130,7 @@
 void CIpsPlgEventHandler::ConstructL( )
     {
     FUNC_LOG;
-// <qmail>
-    // commented out from qmail when extented settings 
-    // cen rep not exist in environment
-    //iCenRep = CRepository::NewL( KCRUidExtendedSettingsUid );
-// </qmail>
+    iCenRep = CRepository::NewL( KCRUidExtendedSettingsUid );
     iPluginId = iBasePlugin.PluginId();
     RegisterPropertyObserverL( this );
     }
@@ -143,7 +141,7 @@
     {
     FUNC_LOG;
     iSession = aSession;
-// <qmail> iSettingsApi member removed
+    iSettingsApi = CIpsSetDataApi::NewL( *iSession );
 
     // this collects all folderids to array from mailboxes that
     // have registered observers, this is need to do here because
@@ -154,7 +152,7 @@
         TMsvId mboxId = iMBoxObservers[i]->iMBoxId.Id();
         if ( mboxes.Find(mboxId) == KErrNotFound )
             {
-            mboxes.AppendL( mboxId );
+            mboxes.Append( mboxId );
             }
         }
 
@@ -206,7 +204,7 @@
 
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
-void CIpsPlgEventHandler::RegisterPropertyObserverL(
+TInt CIpsPlgEventHandler::RegisterPropertyObserverL(
         MIpsPlgPropertyObserver* aObserver )
     {
     FUNC_LOG;
@@ -221,7 +219,7 @@
                 CActive::EPriorityIdle, *this );
         }
 
-    iPropertyObservers.AppendL( aObserver );
+    return iPropertyObservers.Append( aObserver );
     }
 
 // ----------------------------------------------------------------------------
@@ -251,8 +249,7 @@
         TIpsPlgPropertyEvent aEvent )
     {
     FUNC_LOG;
-    INFO_1("pluginid == 0x%x", iPluginId);
-   //<qmail> not used: TBool doNotify = ETrue;
+    TBool doNotify = ETrue;
     switch ( aEvent.iEvent )
         {
         case KIpsSosEmailSyncStarted:
@@ -268,8 +265,8 @@
         default:
             break;
         }
-    // <qmail> removed doNotify bool below
-    for ( TInt i = 0; i < iPropertyObservers.Count(); i++ )
+
+    for ( TInt i = 0; doNotify && i < iPropertyObservers.Count(); i++ )
         {
         TRAP_IGNORE( iPropertyObservers[i]->HandlePropertyEventL(
                 aEvent.iEvent,  aEvent.iMailbox,
@@ -492,7 +489,7 @@
 
 // ---------------------------------------------------------------------------
 // ---------------------------------------------------------------------------
-inline void CIpsPlgEventHandler::FillFSMessageArrayL(
+inline void CIpsPlgEventHandler::FillFSMessageArray(
     RArray<TFSMailMsgId>& aFSArray,
     const CMsvEntrySelection* aSelection,
     TUint aMtmUid )
@@ -504,7 +501,7 @@
 
     for ( TInt i = 0; i < aSelection->Count(); i++ )
         {
-        aFSArray.AppendL( SymId2FsId(aSelection->At(i), aMtmUid) );
+        aFSArray.Append( SymId2FsId(aSelection->At(i), aMtmUid) );
         }
     }
 
@@ -661,7 +658,6 @@
         if ( type == KUidMsvMessageEntry && !isMarkedAsDeleted )
             {
             TMsvId* parent = static_cast<TMsvId*>(aArg2);
-            // NOTE: assumed that event contains only one new message
             event = TFSEventNewMail;
             TFSMailMsgId mbox;
 
@@ -694,7 +690,7 @@
             RArray<TFSMailMsgId> array(KEventGranularity);
             CleanupClosePushL( array );
 
-            FillFSMessageArrayL(
+            FillFSMessageArray(
                 array,
                 static_cast<const CMsvEntrySelection*>(aArg1),
                 tNew.iMtm.iUid );
@@ -717,7 +713,7 @@
             // set entries array pointer
             RArray<TFSMailMsgId> array(1);
             CleanupClosePushL( array );
-            array.AppendL( SymId2FsId( tNew ) );
+            array.Append( SymId2FsId( tNew ) );
             arg1 = &array;
 
             // set parent pointer
@@ -766,7 +762,7 @@
 
         RArray<TFSMailMsgId> array(KEventGranularity);
         CleanupClosePushL( array );
-        FillFSMessageArrayL(
+        FillFSMessageArray(
             array,
             static_cast<const CMsvEntrySelection*>(aArg1),
             tMoved.iMtm.iUid );
@@ -935,7 +931,7 @@
                 }
             else
                 {
-                array.AppendL( SymId2FsId(deletedId, tEntry.iMtm.iUid) );
+                array.Append( SymId2FsId(deletedId, tEntry.iMtm.iUid) );
                 arg1 = &array;
                 arg2 = &parentId;
 
@@ -992,7 +988,7 @@
 
             RArray<TFSMailMsgId> array(1);
             CleanupClosePushL( array );
-            array.AppendL( msg );
+            array.Append( msg );
             arg1 = &array;
             arg2 = &parent;
             event = TFSEventMailDeleted;
@@ -1025,17 +1021,19 @@
     TAny* arg2=NULL;
     TAny* arg3=NULL;
 
-    TInt errorCode( KErrNone ); // <qmail>
-
     TUid uId;
     TMsvEntry tChanged;
     if ( !IsEventFromIpsSourceL( aArg1, uId, tChanged ) )
         {
         return;
         }
-//<Qmail>
-    
-//</Qmail>
+    else if ( tChanged.iMtm.iUid == KSenduiMtmSmtpUidValue )
+        {
+        // do not send entry changed events from draft messages
+        // mess up draft email
+        return;
+        }
+
     TFSMailEvent event = static_cast<TFSMailEvent>( KErrNotFound );
 
     RArray<TFSMailMsgId> array(1);
@@ -1054,7 +1052,7 @@
             }
 
         // message entry
-        array.AppendL( SymId2FsId( tChanged )  );
+        array.Append( SymId2FsId( tChanged )  );
         arg1 = &array;
 
         // parent entry
@@ -1066,7 +1064,7 @@
         {
         event = TFSEventFolderChanged;
 
-        array.AppendL( SymId2FsId( tChanged ) );
+        array.Append( SymId2FsId( tChanged ) );
         arg1 = &array;
 
         TFSMailMsgId id = SymId2FsId( *(static_cast<TMsvId*>(aArg2)), tChanged.iMtm.iUid );
@@ -1078,7 +1076,7 @@
             TInt index = iImapFolderIds.Find(tChanged.Id());
             if ( eml.LocalSubscription() && index == KErrNotFound )
                 {
-                iImapFolderIds.AppendL( tChanged.Id() );
+                iImapFolderIds.Append( tChanged.Id() );
                 }
             else if ( !eml.LocalSubscription() && index != KErrNotFound )
                 {
@@ -1095,18 +1093,7 @@
             }
         else
             {
-            // <qmail> add error code
             event = TFSEventMailboxOffline;
-            const CMsvEntrySelection* selection = static_cast<CMsvEntrySelection*>( aArg1 );
-            TFSMailMsgId mailboxId( iPluginId, selection->At(0) );
-
-            if ( !(iBasePlugin.HasOperations( mailboxId )) && iBasePlugin.ActivityTimerL( mailboxId ).IsActive() )
-                {
-                // considering this disconnection event as unexpected
-                errorCode = KErrDisconnected;
-                arg1 = &errorCode;
-                }
-            // </qmail>
             }
         }
     else if( IsAccountNameChangeL( aArg1, aArg2 ) )
@@ -1209,12 +1196,7 @@
 // ---------------------------------------------------------------------------
 TUid CIpsPlgEventHandler::MtmId() const
     {
-    TUid ret = KSenduiMtmImap4Uid;
-    if ( iBasePlugin.MtmId().iUid == KIpsPlgPop3PluginUidValue )
-        {
-        ret = KSenduiMtmPop3Uid;
-        }
-    return ret;
+    return iBasePlugin.MtmId();
     }
 //</cmail>
 // ----------------------------------------------------------------------------
@@ -1342,6 +1324,7 @@
         }
 
     RPointerArray<MFSMailEventObserver> observers;
+    CleanupClosePushL( observers );  // not owning classes
     MailboxObserversL( aAccount, observers );
 
     if ( find != KErrNotFound )
@@ -1350,16 +1333,12 @@
         }
     else
         {
-// <qmail>
-        // commented out from qmail when extented settings 
-        // cen rep not exist in environment
-        /*CIpsPlgSettingsObserver* obs =
+        CIpsPlgSettingsObserver* obs =
             CIpsPlgSettingsObserver::NewL( aAccount, *iCenRep, *this );
         obs->SetKeyAndActivateL( aSettingKey, observers );
-        iIPSSettingsObservers.AppendL( obs );*/
-// </qmail>
+        iIPSSettingsObservers.AppendL( obs );
         }
-    observers.Close();
+    CleanupStack::PopAndDestroy( &observers );
     }
 
 // ----------------------------------------------------------------------------
@@ -1482,7 +1461,7 @@
         aFSParent.SetId( aParent.Id() );
         for ( TInt i = 0; i < aDeletedIds.Count(); i++ )
             {
-            aFSDeletedArray.AppendL(
+            aFSDeletedArray.Append(
                     TFSMailMsgId( iPluginId, aDeletedIds.At(i) ) );
             }
         }
@@ -1509,86 +1488,62 @@
 void CIpsPlgEventHandler::SignalStartSyncL( const TFSMailMsgId& aAccount )
     {
     FUNC_LOG;
-    // <qmail> no need to create event variable here
-    //    TFSMailEvent event = TFSEventMailboxSyncStateChanged;
-    // <qmail> renamed variable
-    TSSMailSyncState syncState( StartingSync );
+    TFSMailEvent event = TFSEventMailboxSyncStateChanged;
+    TSSMailSyncState state = StartingSync;
 
-    // <qmail> remove SaveSyncStatusL as it does nothing
-    // SaveSyncStatusL( aAccount.Id(), TInt( syncState ) );
+    SaveSyncStatusL( aAccount.Id(), TInt( state ) );
 
     SendDelayedEventL(
-        TFSEventMailboxSyncStateChanged,
+        event,
         aAccount,
-        &syncState,
+        &state,
         NULL,
         NULL );
     }
 
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
-void CIpsPlgEventHandler::SignalSyncCompletedL( const TFSMailMsgId& aAccount, TInt aError )
+void CIpsPlgEventHandler::SignalSyncCompletedL(
+    const TFSMailMsgId& aAccount,
+    TInt aError )
     {
     FUNC_LOG;
-    // <qmail> no need to create event variable here
-    //    TFSMailEvent event = TFSEventMailboxSyncStateChanged;
-    // <qmail> renamed variable, and setting value in new func
-    TSSMailSyncState syncState = ConvertCompletionCode( aError );
+    TFSMailEvent event = TFSEventMailboxSyncStateChanged;
+
+    TSSMailSyncState state = FinishedSuccessfully;
 
-    // <qmail> remove SaveSyncStatusL as it does nothing
-    //    SaveSyncStatusL( aAccount.Id(), TInt( syncState ) );
+    if ( aError == KErrCancel )
+        {
+        state = SyncCancelled;
+        }
+    else if ( aError != KErrNone && aError != KErrCancel )
+        {
+        state = SyncError;
+        }
+
+    SaveSyncStatusL( aAccount.Id(), TInt( state ) );
 
     SendDelayedEventL(
-        TFSEventMailboxSyncStateChanged,
+        event,
         aAccount,
-        &syncState,
+        &state,
         NULL,
         NULL );
     }
 
-// <qmail> new function
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
-TSSMailSyncState CIpsPlgEventHandler::ConvertCompletionCode( TInt aCompletionCode )
+void CIpsPlgEventHandler::SignalMailboxOfflineStateL(
+    const TFSMailMsgId& aAccount )
     {
     FUNC_LOG;
-    INFO_1("completioncode == %d", aCompletionCode);
-    switch ( aCompletionCode )
-        {
-        case KErrNone:
-            return FinishedSuccessfully;
-        case KErrCancel:
-            return SyncCancelled;
-        case KErrImapBadLogon:
-        case KPop3InvalidUser:
-        case KPop3InvalidLogin:
-        case KPop3InvalidApopLogin:
-            return PasswordNotVerified;
-        case -5120: // (DndTimedOut) wrong server name in settings
-        case KErrHostUnreach: // wrong port number
-            return ServerConnectionError;
-        case KErrTimedOut:
-        default:
-            return SyncError;
-        }
+    SendDelayedEventL(
+        TFSEventMailboxOffline,
+        aAccount,
+        NULL,
+        NULL,
+        NULL );
     }
-// </qmail>
-
-//<qmail> not used at all
-// ----------------------------------------------------------------------------
-// ----------------------------------------------------------------------------
-//void CIpsPlgEventHandler::SignalMailboxOfflineStateL(
-//    const TFSMailMsgId& aAccount )
-//    {
-//    FUNC_LOG;
-//    SendDelayedEventL(
-//        TFSEventMailboxOffline,
-//        aAccount,
-//        NULL,
-//        NULL,
-//        NULL );
-//    }
-// </qmail>
 
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
@@ -1597,102 +1552,139 @@
     FUNC_LOG;
     }
 
-//<qmail> not used at all
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
-//void CIpsPlgEventHandler::SaveSyncStatusL( TMsvId aMailboxId, TInt /*aState*/ )
-//    {
-//    FUNC_LOG;
-//    TMsvEntry tEntry;
-//    TMsvId service;
-//    if( !iSession )
-//        {
-//        User::Leave( KErrNotReady );
-//        }
-//    TInt err = iSession->GetEntry( aMailboxId, service, tEntry );
-//
-//    if( err == KErrNone )
-//        {
-//        }
-//    }
-// </qmail>
+void CIpsPlgEventHandler::SaveSyncStatusL( TMsvId aMailboxId, TInt aState )
+    {
+    FUNC_LOG;
+    TMsvEntry tEntry;
+    TMsvId service;
+    if( !iSession )
+        {
+        User::Leave( KErrNotReady );
+        }
+    TInt err = iSession->GetEntry( aMailboxId, service, tEntry );
+
+    if( err == KErrNone )
+        {
+        iSettingsApi->SaveSyncStatusL( tEntry, aState );
+        }
+    }
 
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 void CIpsPlgEventHandler::HandlePropertyEventL(
-    TInt aEvent,
-    TInt aMailbox,
-    TInt /*aPluginId*/,
-    TInt /*aError*/ )
+        TInt aEvent,
+        TInt aMailbox,
+        TInt aPluginId,
+        TInt /*aError*/ )
     {
     FUNC_LOG;
-//  <qmail> remove these events 
-//    RProcess process;
-//    if ( aEvent == EIPSSosPswErr && process.SecureId() == FREESTYLE_FSSERVER_SID )
-//        {
-//        TFSMailMsgId mbox = SymId2FsId( aMailbox,
-//                        iBasePlugin.MtmId().iUid );
-//        TFSMailEvent event = TFSEventException;
-//        TFsEmailNotifierSystemMessageType msg = EFsEmailNotifErrLoginUnsuccesfull;
-//        SendDelayedEventL( event, mbox, &msg, NULL , (MFSMailExceptionEventCallback*)this );
-//        }
-//    else if ( aEvent == EIPSSosCredientialsSet || aEvent == EIPSSosCredientialsCancelled )
-//        {
-//        if ( iConnOpCallback )
-//            {
-//            iConnOpCallback->CredientialsSetL( aEvent );
-//
-//            //Set to null after we have used this.
-//            //don't delete, we don't own this.
-//            iConnOpCallback=NULL;
-//            }
-//        //if password was changed, we need to send settings changed event also.
-//        if( aEvent == EIPSSosCredientialsSet )
-//            {
-//            TFSMailMsgId mbox = SymId2FsId( aMailbox,
-//                    iBasePlugin.MtmId().iUid );
-//            TFSMailEvent event = TFSEventMailboxSettingsChanged;
-//            SendDelayedEventL( event, mbox, NULL, NULL , NULL );
-//            }
-//        }
-//    else
-// </qmail>
-    if ( aEvent == EIPSSosSettingsChanged )
+    RProcess process;
+
+    // only email server should handle login notifications
+    if (( aEvent == EIPSSosPswErr || aEvent == EIPSSosSmtpPswErr ) &&
+          process.SecureId() == FREESTYLE_FSSERVER_SID &&
+          iQueryPassState == EReady &&
+          iBasePlugin.PluginId() == aPluginId )
+        {
+        TFSMailMsgId mbox = SymId2FsId( aMailbox, iBasePlugin.MtmId().iUid );
+
+        // keep information about type of mail we`re setting the password
+        iIncomingPass = ( aEvent == EIPSSosPswErr ? ETrue : EFalse );
+        iQueryPassState = ENotificationRequest;
+
+        TFSMailEvent event = TFSEventException;
+        TFsEmailNotifierSystemMessageType msg = EFsEmailNotifErrLoginUnsuccesfull;
+        SendDelayedEventL( event, mbox, &msg, NULL, (MFSMailExceptionEventCallback*)this );
+        }
+    else if ( aEvent == EIPSSosCredientialsSet || aEvent == EIPSSosCredientialsCancelled )
+        {
+        // if this handler invoked query user pass
+        if ( iQueryPassState == EBusy )
+            {
+            iQueryPassState = ERequestResponding;
+            // run callbacks
+            for ( TInt i = 0; i < iConnOpCallbacks.Count(); i++ )
+                iConnOpCallbacks[i]->CredientialsSetL( aEvent );
+
+            iConnOpCallbacks.Reset();
+            // now handler is ready for another query user pass
+            iQueryPassState = EReady;
+            }
+
+        //if password was changed, we need to send settings changed event also.
+        if( aEvent == EIPSSosCredientialsSet )
+            {
+            TFSMailMsgId mbox = SymId2FsId( aMailbox,
+                    iBasePlugin.MtmId().iUid );
+            TFSMailEvent event = TFSEventMailboxSettingsChanged;
+            SendDelayedEventL( event, mbox, NULL, NULL , NULL );
+            }
+        }
+    else if ( aEvent == EIPSSosSettingsChanged )
         {
         TFSMailMsgId mbox = SymId2FsId( aMailbox,
                 iBasePlugin.MtmId().iUid );
         TFSMailEvent event = TFSEventMailboxSettingsChanged;
         SendDelayedEventL( event, mbox, NULL, NULL , NULL );
         }
-
-// <qmail> no need for KIpsSosEmailSyncCompleted event handling here,
-// because it has just been sent in NotifyPropertyEventL()
     }
 
-// <qmail> removing unused functions
-// ----------------------------------------------------------------------------
-// ----------------------------------------------------------------------------
-//void CIpsPlgEventHandler::QueryUsrPassL( TMsvId aMbox, MIpsPlgConnectOpCallback* aCallback )
-//    {
-//    FUNC_LOG;
-//    iConnOpCallback = aCallback;//can be null, doesn't matter.
-//    SetNewPropertyEvent( aMbox, EIPSSosPswErr, 0 );
-//    }
-
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
-//void CIpsPlgEventHandler::SignalCredientialsSetL( TInt aMailboxId, TBool aCancelled )
-//    {
-//    FUNC_LOG;
-//    TInt event = EIPSSosCredientialsSet;
-//    if ( aCancelled )
-//        {
-//        event = EIPSSosCredientialsCancelled;
-//        }
-//
-//    SetNewPropertyEvent( aMailboxId, event, 0 );
-//    }
-// </qmail>
+TBool CIpsPlgEventHandler::QueryUsrPassL(
+    TMsvId aMbox,
+    MIpsPlgConnectOpCallback* aCallback/*=NULL*/,
+    TBool aIncoming/*=ETrue*/ )
+    {
+    FUNC_LOG;
+
+    ASSERT( iConnOpCallbacks.Find( aCallback ) == KErrNotFound );
+    if ( aCallback )
+        iConnOpCallbacks.Append( aCallback );
+
+    // set or re-set property event
+    SetNewPropertyEvent( aMbox, (aIncoming ? EIPSSosPswErr : EIPSSosSmtpPswErr), 0 );
+
+    // only one query at a time allowed
+    if ( iQueryPassState != EReady )
+        {
+        return EFalse;
+        }
+
+    // update state
+    iQueryPassState = EBusy;
+
+    return ETrue;
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+TBool CIpsPlgEventHandler::IncomingPass() const
+    {
+    return iIncomingPass;
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+void CIpsPlgEventHandler::SignalCredientialsSetL( TInt aMailboxId, TBool aCancelled )
+    {
+    FUNC_LOG;
+    if ( iQueryPassState == EPasswordRequest )
+        {
+        iQueryPassState = EReady;
+        iIncomingPass = ETrue;
+        }
+
+    TInt event = EIPSSosCredientialsSet;
+    if ( aCancelled )
+        {
+        event = EIPSSosCredientialsCancelled;
+        }
+
+    SetNewPropertyEvent( aMailboxId, event, 0 );
+    }
 
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
@@ -1733,27 +1725,34 @@
 
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
-void CIpsPlgEventHandler::CollectSubscribedFoldersL( TMsvId /*aMailboxId*/ )
+void CIpsPlgEventHandler::CollectSubscribedFoldersL( TMsvId aMailboxId )
     {
     FUNC_LOG;
-// <qmail> code removed as it does nothing; keeping the func as it probably will be needed
+    if ( iSession )
+        {
+        iSettingsApi->GetSubscribedImapFoldersL( aMailboxId, iImapFolderIds );
+        }
     }
 
-// <qmail> not needed
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
-//void CIpsPlgEventHandler::ExceptionEventCallbackL(
-//        TFSMailMsgId aMailboxId,
-//        TInt /*aEventType*/,
-//        TBool /*aResponse*/ )
-//    {
-//    FUNC_LOG;
-//    TFSMailEvent event = TFSEventMailboxSyncStateChanged;
-//    TSSMailSyncState state = PasswordNotVerified;
-//
-//    SendDelayedEventL( event, aMailboxId, &state, NULL , NULL );
-//    }
-// </qmail>
+void CIpsPlgEventHandler::ExceptionEventCallbackL(
+        TFSMailMsgId aMailboxId,
+        TInt aEventType,
+        TBool /*aResponse*/ )
+    {
+    FUNC_LOG;
+
+    if ( aEventType == EFsEmailNotifErrLoginUnsuccesfull &&
+         iQueryPassState == ENotificationRequest )
+        {
+        iQueryPassState = EPasswordRequest;
+        TFSMailEvent event = TFSEventMailboxSyncStateChanged;
+        TSSMailSyncState state = PasswordNotVerified;
+
+        SendDelayedEventL( event, aMailboxId, &state, NULL, NULL );
+        }
+    }
 
 // End of File