meetingrequest/mricalviewer/src/cmrattachmentinfofetcher.cpp
branchRCL_3
changeset 12 4ce476e64c59
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/meetingrequest/mricalviewer/src/cmrattachmentinfofetcher.cpp	Wed Mar 31 21:08:33 2010 +0300
@@ -0,0 +1,383 @@
+/*
+* 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 MR attachment fetcher
+*
+*/
+
+#include "emailtrace.h"
+#include "cmrattachmentinfofetcher.h"
+#include "esmricalviewerutils.h"
+
+#include "cfsmailclient.h"
+#include "cfsmailfolder.h"
+#include "cfsmailmessagepart.h"
+#include "cfsmailcommon.h"
+#include "esmricalvieweropcodes.hrh"
+
+#include <ct/rcpointerarray.h>
+#include <calentry.h>
+#include <calattachment.h>
+
+// Unnamed namespace for local definitions
+namespace { // codescanner::namespace
+
+// Maximum URI length 
+const TInt KMaxUriLength( 256 );
+
+// CMail attachment URI
+_LIT8( KCMailUri, "cmail://");
+
+// Literal for URI UID format
+_LIT8( KUriUIDFormat, "%d.%d/");
+
+/**
+ * Appends attachment information to URI.
+ * @param aUri Reference to URI
+ * @param aId Id to be added
+ */
+void AppendMailIdToUri( 
+        TDes8& aUri,
+        TFSMailMsgId aId )
+    {    
+    aUri.AppendFormat( KUriUIDFormat,
+                       aId.PluginId().iUid,
+                       aId.Id() );
+    }
+}
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentInfoFetcher::CMRAttachmentInfoFetcher
+// ---------------------------------------------------------------------------
+//
+CMRAttachmentInfoFetcher::CMRAttachmentInfoFetcher(
+        CFSMailClient& aMailClient,
+        CCalSession& aCalSession,
+        CCalEntry& aCalEntry )
+:   CESMRIcalViewerAsyncCommand(
+        EESMRFetchAttachmentInfo,
+        aCalSession ),
+    iMailClient( aMailClient ),
+    iCalEntry( aCalEntry )
+    {
+    FUNC_LOG;
+    iResult.iOpType = OperationType();
+    iResult.iResultCode = KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentInfoFetcher::~CMRAttachmentInfoFetcher
+// ---------------------------------------------------------------------------
+//
+CMRAttachmentInfoFetcher::~CMRAttachmentInfoFetcher()
+    {
+    FUNC_LOG;
+    CancelCommand();
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentInfoFetcher::NewL
+// ---------------------------------------------------------------------------
+//
+CMRAttachmentInfoFetcher* CMRAttachmentInfoFetcher::NewL(
+        CFSMailClient& aMailClient,
+        CCalSession& aCalSession,
+        CCalEntry& aCalEntry )
+    {
+    FUNC_LOG;
+
+    CMRAttachmentInfoFetcher* self =
+            new (ELeave) CMRAttachmentInfoFetcher( 
+                    aMailClient, aCalSession, aCalEntry );
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentInfoFetcher::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CMRAttachmentInfoFetcher::ConstructL()
+    {
+    FUNC_LOG;
+    //do nothing
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentInfoFetcher::FetchMailL
+// ---------------------------------------------------------------------------
+//
+void CMRAttachmentInfoFetcher::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( !iMailMessage->IsFlagSet( EFSMsgFlag_Attachments ) )
+        {
+        operationStarted = EFalse;
+        }
+    else 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 = ConstructAttachmentInformationL();
+        }
+
+    if ( !operationStarted )
+        {
+        NotifyCompletion();
+        }
+
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentInfoFetcher::CancelAsyncCommand
+// ---------------------------------------------------------------------------
+//
+void CMRAttachmentInfoFetcher::CancelAsyncCommand()
+    {
+    FUNC_LOG;
+
+    if ( EIdle != iState )
+        {
+        TRAP_IGNORE( iMailClient.CancelAllL() );
+
+        iResult.iResultCode = KErrCancel;
+        Observer()->OperationError( iResult );
+        }
+
+    }
+
+// ---------------------------------------------------------------------------
+// CMRAttachmentInfoFetcher::RequestResponseL
+// ---------------------------------------------------------------------------
+//
+void CMRAttachmentInfoFetcher::RequestResponseL(
+        TFSProgress aEvent,
+        TInt aRequestId )
+    {
+    FUNC_LOG;
+    TRAPD( err, HandleRequestResponseL(aEvent, aRequestId) );
+
+    if ( KErrNone != err )
+        {
+        // Error occured --> Cancel operations
+        iResult.iResultCode = err;
+        NotifyCompletion();
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CMRAttachmentInfoFetcher::FetchMessageStructureL
+// -----------------------------------------------------------------------------
+//
+void CMRAttachmentInfoFetcher::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 );
+    }
+
+// -----------------------------------------------------------------------------
+// CMRAttachmentInfoFetcher::ConstructAttachmentInformationL
+// -----------------------------------------------------------------------------
+//
+TBool CMRAttachmentInfoFetcher::ConstructAttachmentInformationL()
+    {
+    FUNC_LOG;
+    
+    TBool operationStarted( EFalse );
+    
+    TFSMailMsgId calpartId;
+    calpartId.SetNullId();
+    
+    CFSMailMessage* msg = Message();
+
+    // Fetch own pointer email message, because message structure is
+    // not necessarily up to date
+    CFSMailMessage* message =
+            iMailClient.GetMessageByUidL(
+                    msg->GetMailBoxId(),
+                    msg->GetFolderId(),
+                    msg->GetMessageId(),
+                    EFSMsgDataStructure );
+    CleanupStack::PushL( message );    
+    
+    CFSMailMessagePart* calendarPart = 
+            ESMRIcalViewerUtils::LocateCalendarPartL( *message );
+    
+    if ( !calendarPart && !message->IsMRInfoSet() )
+        {
+        // message does not contain calendar part at all
+        iResult.iResultCode = KErrNotFound;
+        User::Leave( KErrNotFound );
+        }    
+    
+    CleanupStack::PushL( calendarPart );
+    
+    if ( calendarPart )
+        {
+        calpartId = calendarPart->GetPartId();
+        }
+    
+    RCPointerArray<CFSMailMessagePart> attachments;
+    CleanupClosePushL( attachments );
+
+    message->AttachmentListL( attachments );
+    
+    TInt attachmentCount( attachments.Count() );
+    for( TInt i(0); i < attachmentCount; i++ )
+        {        
+        TInt contentSize( attachments[i]->ContentSize() );
+        TPtrC attachmentName( attachments[i]->AttachmentNameL() );
+
+        if ( contentSize >= 0 && attachmentName.Length() &&
+             calpartId !=  attachments[i]->GetPartId() )
+            {
+            HBufC8* uriBuf = HBufC8::NewLC( KMaxUriLength );
+            TPtr8 uri( uriBuf->Des() );
+            
+            uri.Append( KCMailUri );
+            
+            // Setting attachment URI
+            AppendMailIdToUri( uri, message->GetMailBoxId() );
+            AppendMailIdToUri( uri, message->GetFolderId() );
+            AppendMailIdToUri( uri, message->GetMessageId() );
+            AppendMailIdToUri( uri, attachments[i]->GetPartId() );
+      
+            CCalAttachment* attachment = CCalAttachment::NewUriL( uri );
+            CleanupStack::PushL( attachment );
+                        
+            // Setting attachment label
+            attachment->SetLabelL( 
+                    attachments[i]->AttachmentNameL() );
+            
+            iCalEntry.AddAttachmentL( *attachment );
+            CleanupStack::Pop( attachment );
+            CleanupStack::PopAndDestroy( uriBuf );
+            }
+        }
+    
+    CleanupStack::PopAndDestroy( &attachments );
+    CleanupStack::PopAndDestroy( calendarPart );
+    CleanupStack::PopAndDestroy( message );
+    
+    return operationStarted;
+    }
+
+// -----------------------------------------------------------------------------
+// CMRAttachmentInfoFetcher::FetchMessageContentsL
+// -----------------------------------------------------------------------------
+//
+void CMRAttachmentInfoFetcher::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 = ConstructAttachmentInformationL();
+                iResult.iResultCode = aEvent.iError;
+                }
+            break;
+            case TFSProgress::EFSStatus_RequestCancelled:
+                {
+                // Error occured during fetch operation
+                iResult.iResultCode = KErrCancel;
+                }
+            break;
+            default:
+                break;
+            }
+        }
+
+    if ( !operationStarted )
+        {
+        NotifyCompletion();
+        }
+
+    }
+
+// -----------------------------------------------------------------------------
+// CMRAttachmentInfoFetcher::NotifyCompletion
+// -----------------------------------------------------------------------------
+//
+void CMRAttachmentInfoFetcher::NotifyCompletion()
+    {
+    FUNC_LOG;
+    if ( KErrNone == iResult.iResultCode )
+        {
+        Observer()->OperationCompleted( iResult );
+        }
+    else
+        {
+        Observer()->OperationError( iResult );
+        }
+    }
+
+// EOF