ipsservices/ipssosplugin/src/ipsplgimap4connectop.cpp
changeset 20 ecc8def7944a
parent 18 578830873419
child 23 2dc6caa42ec3
--- a/ipsservices/ipssosplugin/src/ipsplgimap4connectop.cpp	Fri Apr 16 14:51:52 2010 +0300
+++ b/ipsservices/ipssosplugin/src/ipsplgimap4connectop.cpp	Mon May 03 12:23:15 2010 +0300
@@ -16,7 +16,6 @@
 *
 */
 
-
 #include "emailtrace.h"
 #include "ipsplgheaders.h"
 
@@ -26,29 +25,24 @@
 const TInt KIpsSetDataFullBodyOnly          = -3;
 // </qmail>
 
-_LIT( KIpsPlgIpsConnPanic, "IpsConn" ); 
-
 // ----------------------------------------------------------------------------
-// CIpsPlgImap4ConnectOp::NewL()
+// CIpsPlgImap4ConnOp::NewL()
 // ----------------------------------------------------------------------------
-// 
+// <qmail> priority parameter has been removed
 CIpsPlgImap4ConnectOp* CIpsPlgImap4ConnectOp::NewL(
     CMsvSession& aMsvSession,
-	TInt aPriority,
     TRequestStatus& aObserverRequestStatus,
     TMsvId aService,
     CIpsPlgTimerOperation& aActivityTimer,
     TFSMailMsgId aFSMailBoxId,
-    MFSMailRequestObserver& aFSOperationObserver,
+    MFSMailRequestObserver* aFSOperationObserver,
     TInt aFSRequestId,
     CIpsPlgEventHandler* aEventHandler,
-    TBool aDoPlainConnect,
-    TBool aSignallingAllowed )
+    TBool aDoPlainConnect )
     {
     FUNC_LOG;
     CIpsPlgImap4ConnectOp* self = new (ELeave) CIpsPlgImap4ConnectOp(
         aMsvSession, 
-        aPriority, 
         aObserverRequestStatus,
         aService, 
         aActivityTimer,
@@ -56,7 +50,6 @@
         aFSOperationObserver,
         aFSRequestId,
         aDoPlainConnect,
-        aSignallingAllowed,
         aEventHandler );
         
     CleanupStack::PushL( self );
@@ -68,29 +61,27 @@
 // ----------------------------------------------------------------------------
 // CIpsPlgImap4ConnectOp::CIpsPlgImap4ConnectOp()
 // ----------------------------------------------------------------------------
-// 
+// <qmail> priority parameter has been removed
 CIpsPlgImap4ConnectOp::CIpsPlgImap4ConnectOp(
     CMsvSession& aMsvSession,
-	TInt aPriority,
     TRequestStatus& aObserverRequestStatus,
     TMsvId aService,
     CIpsPlgTimerOperation& aActivityTimer,
     TFSMailMsgId aFSMailBoxId,
-    MFSMailRequestObserver& aFSOperationObserver,
+    MFSMailRequestObserver* aFSOperationObserver,
     TInt aFSRequestId,
     TBool aDoPlainConnect,
-    TBool aSignallingAllowed,
     CIpsPlgEventHandler* aEventHandler)
     :
     CIpsPlgOnlineOperation(
 	    aMsvSession,
-	    aPriority,
 	    aObserverRequestStatus,
 	    aActivityTimer,
 	    aFSMailBoxId,
 	    aFSOperationObserver,
-	    aFSRequestId,
-    	aSignallingAllowed ),
+	    aFSRequestId ),
+    iState( EStateIdle ),
+    iSelection( NULL ),
     iDoPlainConnect( aDoPlainConnect ),
     iEventHandler( aEventHandler ),
     iIsSyncStartedSignaled( EFalse )
@@ -108,7 +99,7 @@
     FUNC_LOG;
     Cancel();
     delete iSelection;
-    iState = EStateIdle;
+    // <qmail> setting state in destructor makes no sense
     }
 
 // ----------------------------------------------------------------------------
@@ -130,9 +121,19 @@
         User::Panic( KIpsPlgIpsConnPanic, KErrNotSupported );
         }
     
-	iState = EStateStartConnect;
+    // <qmail> moved here from StartL which was removed
+    if ( Connected() && iDoPlainConnect )
+        {
+        // trivial case: connect requested, but already connected
+        // (sync is done automatically on background)
+        iState = EStateIdle;
+        }
+    else
+        {
+        iState = EStateStartConnect;
+        }
     iStatus = KRequestPending;    
-    SetActive();
+    // <qmail> SetActive(); moved inside CompleteThis();
     CompleteThis();
     }
 
@@ -147,9 +148,9 @@
         {
         return GetErrorProgressL( iError );
         }
-    else if(iOperation)
+    else if( iSubOperation )
         {
-        return iOperation->ProgressL();
+        return iSubOperation->ProgressL();
         }
         
     TImap4CompoundProgress& prog = iProgressBuf();
@@ -181,9 +182,7 @@
     result.iError = KErrNone;
     switch( iState )
         {
-        case EStateQueryingDetails:
-            result.iProgressStatus = TFSProgress::EFSStatus_Authenticating;
-            break;
+        // <qmail> case EStateQueryingDetails removed
         case EStateStartConnect:
             result.iProgressStatus = TFSProgress::EFSStatus_Started;
             break;
@@ -206,8 +205,8 @@
 // ----------------------------------------------------------------------------
 // CIpsPlgImap4ConnectOp::IpsOpType()
 // ----------------------------------------------------------------------------
-// 
-TInt CIpsPlgImap4ConnectOp::IpsOpType() const
+// <qmail> return type
+TIpsOpType CIpsPlgImap4ConnectOp::IpsOpType() const
     {
     FUNC_LOG;
     return EIpsOpTypeImap4SyncOp;
@@ -221,9 +220,9 @@
 void CIpsPlgImap4ConnectOp::DoCancel()
     {
     FUNC_LOG;
-    if( iOperation )
+    if( iSubOperation )
         {
-        iOperation->Cancel();
+        iSubOperation->Cancel();
         }
     SignalSyncCompleted( KErrCancel );
     CompleteObserver( KErrCancel );
@@ -236,48 +235,34 @@
 void CIpsPlgImap4ConnectOp::DoRunL()
     {
     FUNC_LOG;
-    TInt err = KErrNone;
-    __ASSERT_DEBUG( !(iOperation && iOperation->IsActive()), 
-            User::Panic( KIpsPlgPanicCategory, KErrGeneral ) );
-    if ( iOperation )
+    TInt err( KErrNone );
+    __ASSERT_DEBUG( !(iSubOperation && iSubOperation->IsActive()),
+        User::Panic( KIpsPlgPanicCategory, KErrGeneral ) );
+    if ( iSubOperation )
         {
-        err = iOperation->iStatus.Int();
-        delete iOperation;
-        iOperation = NULL;
+        err = iSubOperation->iStatus.Int();
+        delete iSubOperation;
+        iSubOperation = NULL;
         }
     
     switch( iState )
         {
-        case EStateQueryingDetails:
-            
-            if ( KErrNone != err )
-                {
-                // user might be cancelled query
-                // or it IS EMPTY
-                iError = err;
-                iState = EStateIdle;
-                }
-            else
-                {
-                // Retry connect.
-                DoConnectOpL();
-                }
+        // <qmail> removing case EStateQueryingDetails
+        case EStateStartConnect:
+            // <qmail> remove StartL() func and replace it directly with DoConnectOpL
+            DoConnectOpL();
             break;
-        case EStateStartConnect:
-        	StartL();
-        	break;
         case EStateConnectAndSync:
             // Connection completed
                 
-            if( err == KErrImapBadLogon )
+            // <qmail> all errors should fail the op
+            if( err )
                 {
-                // Login details are wrong.
-                QueryUserPwdL();
-                iState = EStateQueryingDetails;
-                
-                err = KErrNone;
+                iState = EStateIdle;
+                // <qmail> SetActive(); moved inside CompleteThis();
+                CompleteThis();
                 }
-            else if ( err == KErrNone )
+            else
                 {
                 // no errors in connection
                 if( !iDoPlainConnect )
@@ -288,29 +273,28 @@
                     {
                     // Get on with others using this class for connection only
                     iState = EStateIdle;
-                    SetActive();
+                    // <qmail> SetActive(); moved inside CompleteThis();
                     CompleteThis();
                     }
                 }
             break;
         case EStatePopulateAllCompleted:
-            CIpsPlgSyncStateHandler::SaveSuccessfulSyncTimeL(
-                    iMsvSession, iService );
+            CIpsPlgSyncStateHandler::SaveSuccessfulSyncTimeL( iMsvSession, iService );
             // break command is intentially left out
         case EStateCompleted:
             if ( err == KErrNone )
                 {
                 iState = EStateIdle;
-                SetActive();
+                // <qmail> SetActive(); moved inside CompleteThis();
                 CompleteThis();
                 }
             break;
         case EStateIdle:
         default:
-            if ( iOperation )
+            if ( iSubOperation )
                 {
-                delete iOperation;
-                iOperation = NULL;
+                delete iSubOperation;
+                iSubOperation = NULL;
                 }
             CompleteObserver();
             break;
@@ -324,15 +308,7 @@
         }
     }
 
-// ----------------------------------------------------------------------------
-// CIpsPlgImap4ConnectOp::HandleImapConnectionEvent()
-// ----------------------------------------------------------------------------
-// 
-void CIpsPlgImap4ConnectOp::HandleImapConnectionEvent(
-    TImapConnectionEvent /*aConnectionEvent*/ )
-    {
-    //not used at the moment
-    }
+// <qmail> CIpsPlgImap4ConnectOp::HandleImapConnectionEvent() removed
 
 // ----------------------------------------------------------------------------
 // CIpsPlgImap4ConnectOp::RequestResponseL()
@@ -355,44 +331,36 @@
 
     iSelection->ResizeL(0);
     iSelection->AppendL(iService);
-    
+
+    // <qmail>
+    iStatus = KRequestPending;
     if ( iDoPlainConnect && !Connected() )
         {
         TBuf8<1> parameter;
-        iStatus = KRequestPending;
         // connect and synchronise starts background sync or idle
-        iOperation = iBaseMtm->InvokeAsyncFunctionL(
-                KIMAP4MTMConnect, *iSelection, parameter, iStatus);
-        // also set sync started
-        SignalSyncStarted();
-        iState = EStateConnectAndSync;
-        SetActive();
+        iSubOperation = iBaseMtm->InvokeAsyncFunctionL(
+            KIMAP4MTMConnect, *iSelection, parameter, iStatus);
         }
     else if ( Connected() )
         {
         // in this point cant use "connect and do something" commands,
         // use regular sync, when new mails is populated elsewhere.
         TBuf8<1> parameter;
-        iStatus = KRequestPending;
-        iOperation = iBaseMtm->InvokeAsyncFunctionL(
-                KIMAP4MTMFullSync, *iSelection, parameter, iStatus);
-        // also set sync started
-        SignalSyncStarted();
-        iState = EStateConnectAndSync;
-        SetActive();
+        iSubOperation = iBaseMtm->InvokeAsyncFunctionL(
+            KIMAP4MTMFullSync, *iSelection, parameter, iStatus);
         }
     else
         {
-        TPckg<MMsvImapConnectionObserver*> parameter(this);
-        // connect and synchronise starts background sync or idle
-        iStatus = KRequestPending;
-        iOperation = iBaseMtm->InvokeAsyncFunctionL(
-                KIMAP4MTMConnectAndSyncCompleteAfterFullSync, 
-                *iSelection, parameter, iStatus);
-        SignalSyncStarted();
-        iState = EStateConnectAndSync;
-        SetActive();
+        // the used command requires an observer to be given even though we're not using it
+        TPckg<MMsvImapConnectionObserver*> parameter( NULL );
+        iSubOperation = iBaseMtm->InvokeAsyncFunctionL(
+            KIMAP4MTMConnectAndSyncCompleteAfterFullSync, 
+            *iSelection, parameter, iStatus );
         }
+    SignalSyncStarted();
+    iState = EStateConnectAndSync;
+    SetActive();
+    // </qmail>
 	}
 
 // ----------------------------------------------------------------------------
@@ -403,116 +371,53 @@
     FUNC_LOG;
     
     // construct partial fetch info according to imap settings
-    CImImap4Settings* settings = new ( ELeave ) CImImap4Settings();
-    CleanupStack::PushL( settings );
-    CEmailAccounts* accounts = CEmailAccounts::NewLC();
-    TImapAccount imapAcc;
-    accounts->GetImapAccountL(iService, imapAcc );
-    accounts->LoadImapSettingsL( imapAcc, *settings );
+    // <qmail> new function to wrap settings loading
+    CImImap4Settings* settings = GetImapSettingsLC();
     TImImap4GetPartialMailInfo info;
     ConstructImapPartialFetchInfo( info, *settings );
     TPckgBuf<TImImap4GetPartialMailInfo> package(info);
-    CleanupStack::PopAndDestroy( 2, settings );
+    CleanupStack::PopAndDestroy( settings );
+    settings = NULL;
     
+    // do populate operation unless only headers should be fetched
     if ( info.iTotalSizeLimit != KIpsSetDataHeadersOnly )
         {
-        SignalSyncStarted();
-        CMsvEntry* cEntry = iMsvSession.GetEntryL( iService );
-        CleanupStack::PushL( cEntry );
-        CMsvEntrySelection* childrenSelection = cEntry->ChildrenL();
-        CleanupStack::PushL( childrenSelection );
-        if ( childrenSelection->Count() )
-            {
-            // only inbox is set, do we have to populate other folders also
-            TMsvId id = (*childrenSelection)[0];
-            CMsvEntry* cEntry2 = iMsvSession.GetEntryL( id );
-            CleanupStack::PushL( cEntry2 );
-            delete iSelection;
-            iSelection = NULL;
-            iSelection = cEntry2->ChildrenWithTypeL( KUidMsvMessageEntry );
-            CleanupStack::PopAndDestroy( cEntry2 );
-            
-            }
-        CleanupStack::PopAndDestroy( childrenSelection );
-    
+        // Update iSelection (which will be given to populate op)
+        // <qmail> new function to wrap iSelection populating
+        CreateInboxMessagesSelectionL();
+        
         iStatus = KRequestPending;
-        CIpsPlgTimerOperation* dummy = NULL;
         iBaseMtm->SwitchCurrentEntryL( iService );
-        iOperation = CIpsPlgImap4PopulateOp::NewL(
-                iMsvSession,
-                this->iStatus,
-                CActive::EPriorityLow,
-                iService,
-                *dummy,
-                info,
-                *iSelection,
-                iFSMailboxId,
-                *this,
-                0,
-                iEventHandler );
+        // <qmail> priority parameter has been removed
+        iSubOperation = CIpsPlgImap4PopulateOp::NewL(
+            iMsvSession,
+            iStatus,
+            iService,
+            // <qmail> passing in activity timer; only place where NULL "reference" was used
+            // <qmail> -> can get rid of checking existence of a reference memeber...
+            iActivityTimer,
+            info,
+            *iSelection,
+            iFSMailboxId,
+            NULL, // no observer for suboperation
+            0, // requestId can be 0
+            iEventHandler );
         
         SetActive();
-        CleanupStack::PopAndDestroy( cEntry );
+        // <qmail> SignalSyncStarted signal moved to happen later in case something goes wrong
+        SignalSyncStarted();
         }
     else
         {
-        SetActive();
+        // <qmail> SetActive(); moved inside CompleteThis();
         CompleteThis();
         }
     iState = EStatePopulateAllCompleted;
     }
 
-// ----------------------------------------------------------------------------
-// CIpsPlgImap4ConnectOp::StartL()
-// ----------------------------------------------------------------------------    
-// 
-void CIpsPlgImap4ConnectOp::StartL()
-    {
-    FUNC_LOG;
-    if ( Connected() && iDoPlainConnect )
-        {
-        // sync is done background, no explicit supported
-        iState = EStateIdle;
-        SetActive();
-        CompleteThis();
-        }
-    else 
-        {
-        DoConnectOpL();
-        }
-    }    
-
-// ----------------------------------------------------------------------------
-// CIpsPlgImap4ConnectOp::QueryUserPwdL()
-// ----------------------------------------------------------------------------
-// 
-void CIpsPlgImap4ConnectOp::QueryUserPwdL()
-    {
-    iEventHandler->QueryUsrPassL( iService, this );
-    }
-
-    
-// ----------------------------------------------------------------------------
-// CIpsPlgImap4ConnectOp::GetOperationErrorCodeL()
-// ----------------------------------------------------------------------------    
-//     
-/*TInt CIpsPlgImap4ConnectOp::GetOperationErrorCodeL( )
-    {
-    if ( !iOperation )
-        {
-        return KErrNotFound;
-        }
-    if ( !iOperation->IsActive() && iOperation->iStatus.Int() != KErrNone )
-        {
-        return iOperation->iStatus.Int();
-        }
-     
-    TPckgBuf<TImap4CompoundProgress> paramPack;
-    paramPack.Copy( iOperation->ProgressL() );
-    const TImap4CompoundProgress& comProgg = paramPack();
-
-    return comProgg.iGenericProgress.iErrorCode;
-    }*/
+// <qmail> remove CIpsPlgImap4ConnectOp::StartL()
+// <qmail> remove CIpsPlgImap4ConnectOp::QueryUserPwdL()
+// <qmail> remove CIpsPlgImap4ConnectOp::GetOperationErrorCodeL()
 
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------       
@@ -524,8 +429,7 @@
         // mark that sync is signaled to prevent 
         // sending necessary event
         iIsSyncStartedSignaled = ETrue;
-        iEventHandler->SetNewPropertyEvent( 
-                iService, KIpsSosEmailSyncStarted, KErrNone );
+        iEventHandler->SetNewPropertyEvent( iService, KIpsSosEmailSyncStarted, KErrNone );
         }
     }
 
@@ -534,36 +438,22 @@
 void CIpsPlgImap4ConnectOp::SignalSyncCompleted( TInt aError )
     {
     FUNC_LOG;
-    if ( iEventHandler && aError == KErrImapBadLogon )
+    // <qmail> don't test for aError code; all situations should complete op
+    if ( iEventHandler )
         {
-        iEventHandler->SetNewPropertyEvent( 
-                iService, KIpsSosEmailSyncCompleted, aError );
+        iEventHandler->SetNewPropertyEvent( iService, KIpsSosEmailSyncCompleted, aError );
         iIsSyncStartedSignaled = EFalse;
         }
     }
 
-
-// ----------------------------------------------------------------------------
-// ----------------------------------------------------------------------------
-void CIpsPlgImap4ConnectOp::CredientialsSetL( TInt aEvent )
-    {
-    FUNC_LOG;
-    if ( aEvent == EIPSSosCredientialsCancelled )
-        {
-        CompleteObserver( KErrCancel );
-        }
-    //password has been set, continue with operation
-    
-    SetActive();
-    CompleteThis();
-    }
+// <qmail> Removing CIpsPlgImap4ConnectOp::CredientialsSetL 
 
 // <qmail>
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 void CIpsPlgImap4ConnectOp::ConstructImapPartialFetchInfo( 
-        TImImap4GetPartialMailInfo& aInfo, CImImap4Settings& aImap4Settings )
-
+    TImImap4GetPartialMailInfo& aInfo, 
+    const CImImap4Settings& aImap4Settings )
     {
     FUNC_LOG;
     TInt sizeLimit = aImap4Settings.BodyTextSizeLimit();
@@ -593,7 +483,6 @@
     else
         {
         aInfo.iTotalSizeLimit = sizeLimit*1024; 
-        // set zero when it not documentated does total size overrides these 
         aInfo.iAttachmentSizeLimit = 0;
         aInfo.iMaxEmailSize = sizeLimit*1024;
         aInfo.iBodyTextSizeLimit = sizeLimit*1024;
@@ -601,6 +490,47 @@
         aInfo.iGetMailBodyParts = EGetImap4EmailBodyAlternativeText;
         }
     }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+CImImap4Settings* CIpsPlgImap4ConnectOp::GetImapSettingsLC()
+    {
+    FUNC_LOG;
+    CImImap4Settings* settings = new ( ELeave ) CImImap4Settings();
+    CleanupStack::PushL( settings );
+    CEmailAccounts* accounts = CEmailAccounts::NewLC();
+    TImapAccount imapAcc;
+    accounts->GetImapAccountL(iService, imapAcc );
+    accounts->LoadImapSettingsL( imapAcc, *settings );
+    CleanupStack::PopAndDestroy( accounts );
+    return settings;
+    }
+
+// ----------------------------------------------------------------------------
+// ----------------------------------------------------------------------------
+void CIpsPlgImap4ConnectOp::CreateInboxMessagesSelectionL()
+    {
+    FUNC_LOG;
+    // get children of service entry 
+    CMsvEntry* cEntry = iMsvSession.GetEntryL( iService );
+    CleanupStack::PushL( cEntry );
+    CMsvEntrySelection* childrenSelection = cEntry->ChildrenL();
+    CleanupStack::PopAndDestroy( cEntry );
+    cEntry = NULL;
+    CleanupStack::PushL( childrenSelection );
+
+    if ( childrenSelection->Count() )
+        {
+        TMsvId id = (*childrenSelection)[0]; // index 0 == inbox
+        cEntry = iMsvSession.GetEntryL( id ); // reusing cEntry pointer for Inbox entry
+        CleanupStack::PushL( cEntry );
+        delete iSelection;
+        iSelection = NULL;
+        // get message-type children of inbox
+        iSelection = cEntry->ChildrenWithTypeL( KUidMsvMessageEntry );
+        CleanupStack::PopAndDestroy( cEntry );
+        }
+    CleanupStack::PopAndDestroy( childrenSelection );
+    }
+
 // </qmail>
-// End of File
-