email/imum/Mtms/Src/Imap4FetchOp.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/imum/Mtms/Src/Imap4FetchOp.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,286 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*       Populate a selection of incomplete remote messages
+*
+*/
+
+
+// INCLUDES
+#include <eikenv.h>
+#include <eikrutil.h>
+#include <imapcmds.h>
+#include <imapset.h>
+
+#include "Imap4FetchOp.h"
+#include "EmailMsgSizerOperation.h"
+#include "EmailUtils.H"
+#include "ImumDisconnectOperation.h"
+#include "IMAPPRGR.H"
+#include "ImumMtmLogging.h"
+#include "ImumPanic.h"
+#include "ImapPopulateOperation.h"
+
+// CONSTANTS
+
+// ----------------------------------------------------------------------------
+// CImap4FetchOp::NewL()
+// ----------------------------------------------------------------------------
+//
+CImap4FetchOp* CImap4FetchOp::NewL(
+    CImumInternalApi& aMailboxApi,
+    TRequestStatus& aObserverRequestStatus,
+    MMsvProgressReporter& aReporter,
+    TMsvId aService,
+    TInt aFunctionId,
+    const TImImap4GetMailInfo& aGetMailInfo,
+    const CMsvEntrySelection& aSel )
+    {
+    IMUM_STATIC_CONTEXT( CImap4FetchOp::NewL, 0, mtm, KImumMtmLog );
+    IMUM_IN();
+    
+    __ASSERT_DEBUG(aSel.Count(),
+        User::Panic(KImumMtmUiPanic,EPanicSelectionEmpty));
+    if ( aSel.Count() == 0 )
+        {
+        User::Leave( KErrNotSupported );
+        }
+    CImap4FetchOp* op = new(ELeave) CImap4FetchOp(
+        aMailboxApi, aObserverRequestStatus, aReporter,
+        aService, aFunctionId, aGetMailInfo);
+    CleanupStack::PushL(op);
+    op->ConstructL(aSel);
+    CleanupStack::Pop();
+    IMUM_OUT();
+    return op;
+    }
+
+// ----------------------------------------------------------------------------
+// CImap4FetchOp::NewL()
+// ----------------------------------------------------------------------------
+//
+CImap4FetchOp* CImap4FetchOp::NewL(
+    CImumInternalApi& aMailboxApi,
+    TRequestStatus& aObserverRequestStatus,
+    MMsvProgressReporter& aReporter,
+    TMsvId aService,
+    TInt aFunctionId,
+    const TImImap4GetPartialMailInfo& aPartialGetMailInfo,
+    const CMsvEntrySelection& aSel )
+    {
+    IMUM_STATIC_CONTEXT( CImap4FetchOp::NewL, 0, mtm, KImumMtmLog );
+    IMUM_IN();
+    
+    __ASSERT_DEBUG(aSel.Count(),
+        User::Panic(KImumMtmUiPanic,EPanicSelectionEmpty));
+    if ( aSel.Count() == 0 )
+        {
+        User::Leave( KErrNotSupported );
+        }
+    CImap4FetchOp* op = new(ELeave) CImap4FetchOp(
+        aMailboxApi, aObserverRequestStatus, aReporter,
+        aService, aFunctionId, aPartialGetMailInfo );
+    CleanupStack::PushL(op);
+    op->ConstructL(aSel);
+    CleanupStack::Pop();
+    IMUM_OUT();
+    return op;
+    }
+
+// ----------------------------------------------------------------------------
+// CImap4FetchOp::~CImap4FetchOp()()
+// ----------------------------------------------------------------------------
+//
+CImap4FetchOp::~CImap4FetchOp()
+    {
+    IMUM_CONTEXT( CImap4FetchOp::~CImap4FetchOp, 0, KImumMtmLog );
+    IMUM_IN();
+    
+    delete iSelection;
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImap4FetchOp::CImap4FetchOp()
+// ----------------------------------------------------------------------------
+//
+CImap4FetchOp::CImap4FetchOp(
+    CImumInternalApi& aMailboxApi,
+    TRequestStatus& aStatus,
+    MMsvProgressReporter& aReporter,
+    TMsvId aServiceId,
+    TInt aFunctionId,
+    const TImImap4GetMailInfo& aGetMailInfo )
+    :
+    CImap4ConnectedOp(aMailboxApi, aStatus, aReporter, aServiceId),
+    iFunctionId(aFunctionId),
+    iGetMailInfo( aGetMailInfo ),
+    iPopulate( EFalse )
+    {
+    IMUM_CONTEXT( CImap4FetchOp::CImap4FetchOp, 0, KImumMtmLog );
+    IMUM_IN();
+    IMUM_OUT();
+    
+    }
+
+// ----------------------------------------------------------------------------
+// CImap4FetchOp::CImap4FetchOp()
+// ----------------------------------------------------------------------------
+//
+CImap4FetchOp::CImap4FetchOp(
+    CImumInternalApi& aMailboxApi,
+    TRequestStatus& aStatus,
+    MMsvProgressReporter& aReporter,
+    TMsvId aServiceId,
+    TInt aFunctionId,
+    const TImImap4GetPartialMailInfo& aPartialGetMailInfo )
+    :
+    CImap4ConnectedOp( aMailboxApi, aStatus, aReporter, aServiceId ),
+    iFunctionId(aFunctionId),
+    iGetMailInfo( aPartialGetMailInfo ),
+    iPartialGetMailInfo( aPartialGetMailInfo ),
+    iPopulate( ETrue )
+    {
+    IMUM_CONTEXT( CImap4FetchOp::CImap4FetchOp, 0, KImumMtmLog );
+    IMUM_IN();
+    IMUM_OUT();
+    
+    }
+
+// ----------------------------------------------------------------------------
+// CImap4FetchOp::ConstructL()
+// ----------------------------------------------------------------------------
+//
+void CImap4FetchOp::ConstructL( const CMsvEntrySelection& aSel )
+    {
+    IMUM_CONTEXT( CImap4FetchOp::ConstructL, 0, KImumMtmLog );
+    IMUM_IN();
+    
+    iSelection = aSel.CopyL();
+    iSelection->InsertL(0, iService);
+    // For Get Mail API, first selection element must be service.
+    CImap4ConnectedOp::ConstructL( iFunctionId );
+    if ( iFunctionId != KIMAP4MTMCopyMailSelectionWhenAlreadyConnected &&
+         iFunctionId != KIMAP4MTMMoveMailSelectionWhenAlreadyConnected )
+        {
+        iDisconnect = EFalse;
+        }
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImap4FetchOp::DoConnectedOpL()
+// ----------------------------------------------------------------------------
+//
+void CImap4FetchOp::DoConnectedOpL()
+    {
+    IMUM_CONTEXT( CImap4FetchOp::DoConnectedOpL, 0, KImumMtmLog );
+    IMUM_IN();
+    
+    iStatus = KRequestPending;
+    if ( iPopulate )
+        {
+        delete iOperation;
+        iOperation = NULL;
+        DoPopulateL();
+        }
+    else
+        {
+        TPckg<TImImap4GetMailInfo> param( iGetMailInfo );
+        delete iOperation;
+        iOperation = NULL;
+        InvokeClientMtmAsyncFunctionL(
+            iFunctionId, *iSelection, iService, param);
+        }
+    SetActive();
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImap4FetchOp::ConnectedOpErrorProgressL()
+// ----------------------------------------------------------------------------
+//
+const TDesC8& CImap4FetchOp::ConnectedOpErrorProgressL(TInt aError)
+    {
+    IMUM_CONTEXT( CImap4FetchOp::ConnectedOpErrorProgressL, 0, KImumMtmLog );
+    IMUM_IN();
+    
+    TImap4CompoundProgress& prog = iProgressBuf();
+    prog.iGenericProgress.iOperation = TImap4GenericProgress::EPopulate;
+    prog.iGenericProgress.iState = TImap4GenericProgress::EFetching;
+    prog.iGenericProgress.iErrorCode = aError;
+    IMUM_OUT();
+    return iProgressBuf;
+    }
+
+// ----------------------------------------------------------------------------
+// CImap4FetchOp::DoPopulateL()
+// ----------------------------------------------------------------------------
+//
+void CImap4FetchOp::DoPopulateL()
+    {
+    IMUM_CONTEXT( CImap4FetchOp::DoPopulateL, 0, KImumMtmLog );
+    IMUM_IN();
+    
+    TPckg<TImImap4GetPartialMailInfo> param( iPartialGetMailInfo );
+
+    CMsvEntry* cEntry = iMsvSession.GetEntryL(iService);
+    CleanupStack::PushL( cEntry );
+
+    CMsvEntrySelection* selection = new(ELeave) CMsvEntrySelection;
+    CleanupStack::PushL( selection );
+    selection->AppendL( iService );
+
+    TMsvId inbox = FindInboxL( *cEntry );
+    selection->AppendL( inbox );
+
+    InvokeClientMtmAsyncFunctionL(
+        KIMAP4MTMPopulateNewMailWhenAlreadyConnected,
+        //KIMAP4MTMPopulateAllMailWhenAlreadyConnected,
+        *selection,
+        iService,
+        param);
+
+    CleanupStack::PopAndDestroy( 2, cEntry ); // CSI: 47 # selection, centry
+    IMUM_OUT();
+    }
+
+// ----------------------------------------------------------------------------
+// CImap4FetchOp::FindInboxL()
+// ----------------------------------------------------------------------------
+//
+TMsvId CImap4FetchOp::FindInboxL( CMsvEntry& aEntry )
+    {
+    IMUM_CONTEXT( CImap4FetchOp::FindInboxL, 0, KImumMtmLog );
+    IMUM_IN();
+    
+    TMsvId inboxId = KErrNotFound;
+    TMsvEntry child;
+    const TInt count = aEntry.Count();
+    _LIT( KTMceUiInboxName, "INBOX");
+    for (TInt loop = 0; loop < count && inboxId == KErrNotFound; loop++)
+        {
+        child = (aEntry)[loop];
+        if ( child.iType == KUidMsvFolderEntry  &&
+             child.iDetails.CompareF( KTMceUiInboxName ) == 0 )
+            {
+            inboxId = child.Id();
+            }
+        }
+    IMUM_OUT();
+
+    return inboxId;
+    }
+
+