meetingrequest/mricalviewer/src/cesmrimapmailfetcher.cpp
changeset 0 8466d47a6819
child 8 e1b6206813b4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/meetingrequest/mricalviewer/src/cesmrimapmailfetcher.cpp	Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,307 @@
+/*
+* Copyright (c) 2007-2009 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:  Implementation for IMAP mail fetcher
+*
+*/
+
+
+#include "emailtrace.h"
+#include "cesmrimapmailfetcher.h"
+#include "esmricalviewerutils.h"
+//<cmail>
+#include "CFSMailClient.h"
+#include "CFSMailFolder.h"
+#include "CFSMailMessagePart.h"
+#include "CFSMailCommon.h"
+#include "esmricalvieweropcodes.hrh"
+//</cmail>
+
+
+// Unnamed namespace for local definitions
+namespace {
+
+// Preferred byte count definition
+const TInt KPreferredByteCount(0);
+}
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CESMRImapMailFetcherCmd::CESMRImapMailFetcherCmd
+// ---------------------------------------------------------------------------
+//
+CESMRImapMailFetcherCmd::CESMRImapMailFetcherCmd(
+        CFSMailClient& aMailClient,
+        CCalSession& aCalSession )
+:   CESMRIcalViewerAsyncCommand(
+        EESMRFetchMailContent,
+        aCalSession ),
+    iMailClient( aMailClient )
+    {
+    FUNC_LOG;
+    iResult.iOpType = OperationType();
+    iResult.iResultCode = KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRImapMailFetcherCmd::~CESMRImapMailFetcherCmd
+// ---------------------------------------------------------------------------
+//
+CESMRImapMailFetcherCmd::~CESMRImapMailFetcherCmd()
+    {
+    FUNC_LOG;
+    CancelCommand();
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRImapMailFetcherCmd::NewL
+// ---------------------------------------------------------------------------
+//
+CESMRImapMailFetcherCmd* CESMRImapMailFetcherCmd::NewL(
+        CFSMailClient& aMailClient,
+        CCalSession& aCalSession )
+    {
+    FUNC_LOG;
+
+    CESMRImapMailFetcherCmd* self =
+            new (ELeave) CESMRImapMailFetcherCmd( aMailClient, aCalSession );
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+
+
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRImapMailFetcherCmd::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CESMRImapMailFetcherCmd::ConstructL()
+    {
+    FUNC_LOG;
+    //do nothing
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRImapMailFetcherCmd::FetchMailL
+// ---------------------------------------------------------------------------
+//
+void CESMRImapMailFetcherCmd::ExecuteAsyncCommandL()
+    {
+    FUNC_LOG;
+
+    iResult.iMessage = Message();
+    iResult.iOpType = OperationType();
+    iResult.iResultCode = KErrNone;
+
+    iMailMessage = Message();
+    iResult.iMessage = iMailMessage;
+    TBool operationStarted( ETrue );
+
+    TFSPartFetchState messageLoadState( iMailMessage->FetchLoadState() );
+    if ( EFSEmailStructureUnknown == messageLoadState )
+        {
+        // Message structure needs to be fetched first
+        // After structure is fetched, then message parts can be fetched
+        // When structure fetching is completed, part fetching is triggered
+        // automatically
+        FetchMessageStructureL();
+        }
+    else
+        {
+        // Message structure is already known --> Part can be fetched
+        // Wait operation is started if part needs to fetched.
+        operationStarted = FetchMessageContentsL();
+        }
+
+    if ( !operationStarted )
+        {
+        NotifyCompletion();
+        }
+
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRImapMailFetcherCmd::CancelAsyncCommand
+// ---------------------------------------------------------------------------
+//
+void CESMRImapMailFetcherCmd::CancelAsyncCommand()
+    {
+    FUNC_LOG;
+
+    if ( EIdle != iState )
+        {
+        TRAP_IGNORE( iMailClient.CancelAllL() );
+
+        iResult.iResultCode = KErrCancel;
+        Observer()->OperationError( iResult );
+        }
+
+    }
+
+// ---------------------------------------------------------------------------
+// CESMRImapMailFetcherCmd::RequestResponseL
+// ---------------------------------------------------------------------------
+//
+void CESMRImapMailFetcherCmd::RequestResponseL(
+        TFSProgress aEvent,
+        TInt aRequestId )
+    {
+    FUNC_LOG;
+    TRAPD( err, HandleRequestResponseL(aEvent, aRequestId) );
+
+    if ( KErrNone != err )
+        {
+        // Error occured --> Cancel operations
+        iResult.iResultCode = err;
+        NotifyCompletion();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CESMRImapMailFetcherCmd::FetchMessageStructureL
+// -----------------------------------------------------------------------------
+//
+void CESMRImapMailFetcherCmd::FetchMessageStructureL()
+    {
+    FUNC_LOG;
+
+    TFSMailMsgId currentMailboxId =
+            iMailMessage->GetMailBoxId();
+
+    TFSMailMsgId currentMessageFolderId =
+            iMailMessage->GetFolderId();
+
+    CFSMailFolder* currentFolder  =
+            iMailClient.GetFolderByUidL(
+                    currentMailboxId,
+                    currentMessageFolderId );
+
+    CleanupStack::PushL( currentFolder );
+
+    iState = EFetchingStructure;
+    RArray<TFSMailMsgId> messageIds;
+    CleanupClosePushL( messageIds );
+    messageIds.Append( iMailMessage->GetMessageId() );
+    iStructureRequestId =
+            currentFolder->FetchMessagesL(
+                    messageIds,
+                    EFSMsgDataStructure,
+                    *this );
+    
+    CleanupStack::PopAndDestroy();//messageIds
+    CleanupStack::PopAndDestroy( currentFolder );
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CESMRImapMailFetcherCmd::FetchMessageContentsL
+// -----------------------------------------------------------------------------
+//
+TBool CESMRImapMailFetcherCmd::FetchMessageContentsL()
+    {
+    FUNC_LOG;
+    TBool operationStarted( EFalse );
+
+    CFSMailMessagePart* calendarPart = ESMRIcalViewerUtils::LocateCalendarPartL( *iMailMessage );
+    if ( !calendarPart )
+        {
+        // message does not contain calendar part at all
+        iResult.iResultCode = KErrNotFound;
+        return operationStarted;
+        }
+    CleanupStack::PushL( calendarPart );
+    
+    TFSPartFetchState partLoadState( calendarPart->FetchLoadState() );
+    if ( EFSFull != partLoadState )
+        {
+        // part is not fetched to device
+        iMessagePartRequestId =
+            calendarPart->FetchMessagePartL(
+                        calendarPart->GetPartId(),
+                        *this,
+                        KPreferredByteCount );
+    
+        iState = EFetchingContents;
+        operationStarted = ETrue;
+        }
+    
+    CleanupStack::PopAndDestroy( calendarPart );
+    calendarPart = NULL;
+    return operationStarted;
+    }
+
+// -----------------------------------------------------------------------------
+// CESMRImapMailFetcherCmd::FetchMessageContentsL
+// -----------------------------------------------------------------------------
+//
+void CESMRImapMailFetcherCmd::HandleRequestResponseL(
+        TFSProgress aEvent,
+        TInt /*aRequestId*/ )
+    {
+    FUNC_LOG;
+
+    TBool operationStarted( EFalse );
+
+    if ( /*aRequestId == iStructureRequestId && */
+              EFetchingStructure == iState )
+        {
+        // Fetching message structure
+        switch ( aEvent.iProgressStatus )
+            {
+            case TFSProgress::EFSStatus_RequestComplete:
+                {
+                // Starting part fetching
+                operationStarted = FetchMessageContentsL();
+                iResult.iResultCode = aEvent.iError;
+                }
+            break;
+            case TFSProgress::EFSStatus_RequestCancelled:
+                {
+                // Error occured during fetch operation
+                iResult.iResultCode = KErrCancel;
+                }
+            break;
+            default:
+                break;
+            }
+        }
+
+    if ( !operationStarted )
+        {
+        NotifyCompletion();
+        }
+
+    }
+
+// -----------------------------------------------------------------------------
+// CESMRImapMailFetcherCmd::NotifyCompletion
+// -----------------------------------------------------------------------------
+//
+void CESMRImapMailFetcherCmd::NotifyCompletion()
+    {
+    FUNC_LOG;
+    if ( KErrNone == iResult.iResultCode )
+        {
+        Observer()->OperationCompleted( iResult );
+        }
+    else
+        {
+        Observer()->OperationError( iResult );
+        }
+    }
+
+// EOF
+