emailservices/emailclientapi/src/emailmessage.cpp
changeset 0 8466d47a6819
child 3 a4d6f1ea0416
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailservices/emailclientapi/src/emailmessage.cpp	Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,712 @@
+/*
+* Copyright (c) 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: This file implements class CEmailMessage.
+*
+*/
+
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <viewclipartner.h>
+#include <vwsdefpartner.h>
+#else
+#include <viewcli.h>
+#include <vwsdef.h>
+#endif // SYMBIAN_ENABLE_SPLIT_HEADERS
+
+#include "emailmessage.h"
+#include "emailaddress.h"
+#include "emailapiutils.h"
+#include "emailclientapi.hrh"
+#include "emailapiutils.h"
+#include "emailinterfacefactoryimpl.h"
+#include "emailcontent.h"
+#include "emailtextcontent.h"
+#include "emailmultipart.h"
+#include "emailattachment.h"
+#include "CFSMailPlugin.h"
+#include "FreestyleEmailUiConstants.h"
+#include "CFSMailClient.h"
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+CEmailMessage* CEmailMessage::NewL( CPluginData& aPluginData,
+                                    CFSMailMessage* aFsMessage,
+                                    const TDataOwner aOwner )
+    {
+    CEmailMessage* message = new ( ELeave ) CEmailMessage( aPluginData, aFsMessage, aOwner );
+    CleanupStack::PushL( message );
+    message->ConstructL();
+    CleanupStack::Pop();
+    return message;
+    }
+    
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+CEmailMessage::CEmailMessage( 
+        CPluginData& aPluginData,
+        CFSMailMessage *aFsMessage,
+        const TDataOwner aOwner)
+        : iPluginData( aPluginData ), iPluginMessage( aFsMessage ), iOwner( aOwner )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+void CEmailMessage::ConstructL()
+    {    
+    iPlugin = iPluginData.ClaimInstanceL();
+    if ( iPluginMessage )
+        {
+        iMessageId = TMessageId( 
+            iPluginMessage->GetMessageId().Id(),
+            iPluginMessage->GetFolderId().Id(), 
+            iPluginMessage->GetMailBoxId().Id() );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+CEmailMessage::~CEmailMessage()
+    {
+    delete iPluginMessage;    
+    delete iSender;
+    delete iReplyTo;
+    delete iTextContent;
+    delete iContent;
+    iPluginData.ReleaseInstance();
+    iAttachments.ResetAndDestroy();
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+TEmailTypeId CEmailMessage::InterfaceId() const
+    {
+    return KEmailIFUidMessage;
+    }
+    
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+void CEmailMessage::Release()
+    {
+    if ( iOwner == EClientOwns )
+        {
+        delete this;        
+        }
+    }
+    
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+const TMessageId& CEmailMessage::MessageId() const
+    {
+    return iMessageId;
+    }
+    
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+MEmailAddress* CEmailMessage::SenderAddressL() const
+    {
+    CFSMailAddress* fsAddress = iPluginMessage->GetSender();
+    if (fsAddress)
+        {
+        if (!iSender)
+            {
+            iSender = CEmailAddress::NewL( MEmailAddress::ESender, EAPIOwns );
+            }
+        iSender->SetAddressL(fsAddress->GetEmailAddress());
+        iSender->SetDisplayNameL(fsAddress->GetDisplayName());
+        }
+    else
+        {
+        // Sender address not defined. Delete client object as well
+        delete iSender;
+        iSender = NULL;
+        }
+    return iSender;
+    }
+    
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+MEmailAddress* CEmailMessage::ReplyToAddressL() const
+    {
+    const CFSMailAddress& fsAddress = iPluginMessage->GetReplyToAddress();
+    if ( &fsAddress )
+        {
+        if (!iReplyTo)
+            {
+            iReplyTo = CEmailAddress::NewL( MEmailAddress::EReplyTo, EAPIOwns );
+            }
+        iReplyTo->SetAddressL( fsAddress.GetEmailAddress() );
+        iReplyTo->SetDisplayNameL( fsAddress.GetDisplayName() );
+        }
+    else
+        {
+        delete iReplyTo;
+        iReplyTo = NULL;
+        }
+    return iReplyTo;
+    }
+    
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+void CEmailMessage::SetReplyToAddressL( const MEmailAddress& aSender )
+    {
+    CFSMailAddress *fsAddress = CFSMailAddress::NewLC();
+    if (!iReplyTo)
+        {
+        iReplyTo = CEmailAddress::NewL( MEmailAddress::EReplyTo, EAPIOwns);
+        }
+    fsAddress->SetDisplayName( aSender.DisplayName() );
+    fsAddress->SetEmailAddress( aSender.Address() );
+    iPluginMessage->SetReplyToAddress( fsAddress );
+    iReplyTo->SetAddressL( fsAddress->GetEmailAddress() );
+    iReplyTo->SetDisplayNameL( fsAddress->GetDisplayName() );
+    CleanupStack::Pop();
+    }       
+    
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+TInt CEmailMessage::GetRecipientsL( const MEmailAddress::TRole aRole,
+        REmailAddressArray& aRecipients ) const
+    {
+    if( aRole == MEmailAddress::EReplyTo ||
+        aRole == MEmailAddress::ESender    )
+        {
+        User::Leave( KErrArgument );
+        }
+    else
+        {
+        if( aRole == MEmailAddress::ETo || 
+            aRole == MEmailAddress::EUndefined )
+            {
+            RPointerArray<CFSMailAddress>& toRecipients = 
+                iPluginMessage->GetToRecipients();
+            ConvertAddressArrayL( 
+                    MEmailAddress::ETo, 
+                    toRecipients, aRecipients );
+            }
+        if( aRole == MEmailAddress::ECc || 
+            aRole == MEmailAddress::EUndefined )
+            {
+            RPointerArray<CFSMailAddress>& ccRecipients = 
+                iPluginMessage->GetCCRecipients();
+            ConvertAddressArrayL( 
+                    MEmailAddress::ECc, 
+                    ccRecipients, aRecipients );
+            }
+        if( aRole == MEmailAddress::EBcc || 
+            aRole == MEmailAddress::EUndefined )
+            {
+            RPointerArray<CFSMailAddress>& bccRecipients = 
+                iPluginMessage->GetBCCRecipients();
+            ConvertAddressArrayL( 
+                    MEmailAddress::EBcc, 
+                    bccRecipients, aRecipients );
+            }
+        }
+    return aRecipients.Count();
+    }            
+    
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+void CEmailMessage::SetRecipientsL( const MEmailAddress::TRole aRole, 
+        REmailAddressArray& aRecipients )
+    {
+    TInt count( aRecipients.Count() );
+    
+    for( TInt i=0;i<count;i++ )
+        {
+        const MEmailAddress* address = aRecipients[i];
+        CFSMailAddress* fsAddress = CFSMailAddress::NewLC();
+        fsAddress->SetEmailAddress( address->Address() );
+        fsAddress->SetDisplayName( address->DisplayName() );
+        
+        if( aRole == MEmailAddress::ETo )
+            {
+            iPluginMessage->AppendToRecipient( fsAddress );
+            }
+        else if( aRole == MEmailAddress::ECc )
+            {
+            iPluginMessage->AppendCCRecipient( fsAddress );
+            }
+        else if( aRole == MEmailAddress::EBcc )
+            {
+            iPluginMessage->AppendBCCRecipient( fsAddress );
+            }
+        else
+            {
+            User::Leave( KErrArgument );
+            }
+        CleanupStack::Pop( fsAddress );
+        }
+    }
+    
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+void CEmailMessage::RemoveRecipientL( const MEmailAddress& aRecipient )
+    {
+    TInt err( KErrNotFound );
+    RPointerArray<CFSMailAddress>* recipients = NULL;
+
+    switch (aRecipient.Role())
+        {
+        case MEmailAddress::ETo:
+            recipients = &iPluginMessage->GetToRecipients();
+            break;
+        case MEmailAddress::ECc:
+            recipients = &iPluginMessage->GetCCRecipients();
+            break;
+        case MEmailAddress::EBcc:
+            recipients = &iPluginMessage->GetBCCRecipients();
+            break;
+        default:
+            User::Leave( KErrArgument );
+            break;
+        }
+    
+    for( TInt i = 0; i < recipients->Count(); i++ )
+        {
+        if ( !aRecipient.Address().Compare( (*recipients)[i]->GetEmailAddress() ) )
+            {
+            recipients->Remove(i);
+            err = KErrNone;
+            // We could break now. But let's loop if there are several entries
+            }
+        }
+    User::LeaveIfError( err );
+    }
+    
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+TPtrC CEmailMessage::Subject() const
+    {
+    return iPluginMessage->GetSubject();
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+void  CEmailMessage::SetSubjectL( const TPtrC& aSubject)
+    {
+    iPluginMessage->SetSubject( aSubject );
+    }
+    
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+TTime CEmailMessage::Date() const
+    {
+    return iPluginMessage->GetDate();
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+TInt CEmailMessage::Flags() const
+    {
+    return iFlags;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+void CEmailMessage::SetFlag( const TUint aFlag )
+    {
+    iFlags |= aFlag;
+    TUint flag = MapFlags( aFlag );
+    iPluginMessage->SetFlag( flag );
+    }
+    
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+void CEmailMessage::ResetFlag( const TUint aFlag )
+    {
+    iFlags &= ~aFlag;
+    TUint flag = MapFlags( aFlag );
+    iPluginMessage->ResetFlag( flag );
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+MEmailMessageContent* CEmailMessage::ContentL() const
+    {
+    if (iTextContent)
+        {
+        return iTextContent;        
+        }
+    if (iContent)
+        {
+        return iContent;
+        }
+
+    RPointerArray<CFSMailMessagePart> parts;
+    CleanupResetAndDestroyPushL( parts );
+    iPluginMessage->ChildPartsL(parts);
+    TInt count( parts.Count() );
+    if( count == 0 )
+        {
+        /* No content, return NULL */
+        return NULL;
+        }
+    CFSMailMessagePart* part = parts[0];
+    const TDesC& contentType = part->GetContentType();
+    TMessageContentId msgContentId = TMessageContentId( 
+                        part->GetPartId().Id(),
+                        iMessageId.iId,
+                        iMessageId.iFolderId.iId,
+                        iMessageId.iFolderId.iMailboxId ); 
+
+    if (!contentType.Compare(KFSMailContentTypeTextPlain) || 
+        !contentType.Compare(KFSMailContentTypeTextHtml))
+        {                                
+        iTextContent = CEmailTextContent::NewL(iPluginData, msgContentId, part, EAPIOwns );        
+        }
+    else if (!contentType.Compare(KFSMailContentTypeMultipartMixed) ||
+             !contentType.Compare(KFSMailContentTypeMultipartAlternative) ||
+             !contentType.Compare(KFSMailContentTypeMultipartDigest) ||
+             !contentType.Compare(KFSMailContentTypeMultipartRelated) ||
+             !contentType.Compare(KFSMailContentTypeMultipartParallel))
+        {
+        iContent = CEmailMultipart::NewL(iPluginData, msgContentId, part, EAPIOwns);
+        }
+    if (count == 2 )
+        {
+        CFSMailMessagePart* part = parts[1];
+        const TDesC& contentType = part->GetContentType();
+        }
+    CleanupStack::Pop(); // parts
+    
+    if (iTextContent)
+        {
+        return iTextContent;        
+        }
+    return iContent;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+void CEmailMessage::SetContentL( const MEmailMessageContent*  aContent )
+    {
+    MEmailTextContent* textContent = aContent->AsTextContentOrNull();
+    if (textContent)
+        {
+        if (iTextContent)
+            {
+            delete iTextContent; // Destroy old content
+            }
+        iTextContent = dynamic_cast<CEmailTextContent*>(textContent);
+        iTextContent->SetOwner( EAPIOwns );
+        return;
+        }
+    MEmailMultipart* mPart = aContent->AsMultipartOrNull();
+    if (mPart)
+        {
+        if (iContent)
+            {
+            delete iContent;
+            }
+        iContent = dynamic_cast<CEmailMultipart*>(mPart);
+        iContent->SetOwner( EAPIOwns );
+        }    
+    }
+    
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+void CEmailMessage::SetPlainTextBodyL( const TDesC& aPlainText )
+    {
+    if (iTextContent)
+        {
+        iTextContent->SetTextL( MEmailTextContent::EPlainText, aPlainText );
+        return;
+        }
+    CFSMailMessagePart* msgTextPart = iPluginMessage->PlainTextBodyPartL();
+    
+    if( !msgTextPart )
+        {
+        msgTextPart = iPluginMessage->NewChildPartL( TFSMailMsgId(), KFSMailContentTypeTextPlain );        
+        }
+    CleanupStack::PushL( msgTextPart );
+    
+    TMessageContentId msgContentId = TMessageContentId( 
+                        msgTextPart->GetPartId().Id(),
+                        iMessageId.iId,
+                        iMessageId.iFolderId.iId,
+                        iMessageId.iFolderId.iMailboxId );
+    
+    msgTextPart->SetContentType( KFSMailContentTypeTextPlain );    
+    iTextContent = CEmailTextContent::NewL( iPluginData, msgContentId, msgTextPart, EAPIOwns );
+    if (iTextContent)
+        {
+        iTextContent->SetTextL( MEmailTextContent::EPlainText, aPlainText );
+        }
+    CleanupStack::Pop(); // msgTextPart
+    
+    return;
+    
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+MEmailAttachment* CEmailMessage::AddAttachmentL( const TDesC& aFullPath )
+    {
+    CFSMailMessagePart* part = iPluginMessage->AddNewAttachmentL(aFullPath, TFSMailMsgId());
+    CleanupStack::PushL( part );    
+    CEmailAttachment* att = CEmailAttachment::NewLC(iPluginData, iMsgContentId, part, EAPIOwns);
+    iAttachments.AppendL( att );
+    CleanupStack::Pop(2); // part, att
+    
+    return att;
+    }
+    
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+
+MEmailAttachment* CEmailMessage::AddAttachmentL( RFile& aFile )
+    {
+    TBufC8 <1> mime;
+    CFSMailMessagePart* part = iPluginMessage->AddNewAttachmentL(aFile, mime);
+    CleanupStack::PushL( part );
+    CEmailAttachment* att = CEmailAttachment::NewLC(iPluginData, iMsgContentId, part, EAPIOwns);
+    iAttachments.AppendL( att );
+
+    CleanupStack::Pop(); // part, att
+    
+    return att;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+TInt CEmailMessage::GetAttachmentsL( REmailAttachmentArray& aAttachments )
+    {
+    RPointerArray<CFSMailMessagePart> attachments;
+    CleanupResetAndDestroyPushL( attachments );
+    iPluginMessage->AttachmentListL(attachments);
+    const TInt count( attachments.Count() );
+    for (TInt i = 0; i < count; i++)
+        {
+            TMessageContentId msgContentId = TMessageContentId( 
+                            attachments[i]->GetPartId().Id(),
+                            iMessageId.iId,
+                            iMessageId.iFolderId.iId,
+                            iMessageId.iFolderId.iMailboxId ); 
+
+            CEmailAttachment* att = CEmailAttachment::NewL(iPluginData, msgContentId, attachments[i], EClientOwns);
+            
+            aAttachments.AppendL(att);
+        }
+    CleanupStack::Pop(); // attachments
+    return count;    
+    }
+    
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+void CEmailMessage::RemoveAttachmentL( const MEmailAttachment& aAttachment  )
+    {
+    iPluginMessage->RemoveChildPartL(FsMsgId( iPluginData, aAttachment.Id()));
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+const TFolderId& CEmailMessage::ParentFolderId() const
+    {
+    return iMessageId.iFolderId;
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+void CEmailMessage::SaveChangesL()
+    {
+    TFSMailMsgId mailboxId( 
+            FsMsgId( iPluginData, iMessageId.iFolderId.iMailboxId ) );
+    
+    iPlugin->StoreMessageL( mailboxId, *iPluginMessage );
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+void CEmailMessage::SendL()
+    {
+    SaveChangesL();
+    iPlugin->SendMessageL( *iPluginMessage );
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+void CEmailMessage::ConvertAddressArrayL( 
+        const MEmailAddress::TRole aRole,
+        RPointerArray<CFSMailAddress>& aSrc, 
+        REmailAddressArray& aDst ) const
+    {
+    for ( TInt i=0; i<aSrc.Count(); i++ )
+        {
+        CEmailAddress* recipient = CreateAddressLC( aRole, *aSrc[i] );
+        aDst.AppendL( recipient );
+        CleanupStack::Pop( recipient );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+CEmailAddress* CEmailMessage::CreateAddressLC( 
+        const MEmailAddress::TRole aRole, 
+        CFSMailAddress& aFsAddress ) const
+    {
+    CEmailAddress* address = CEmailAddress::NewLC( aRole, EClientOwns );
+    TDesC& temp1 = aFsAddress.GetEmailAddress();
+    if ( &temp1 )
+        {
+        address->SetAddressL( temp1 );
+        }
+    TDesC& temp2 = aFsAddress.GetDisplayName();
+    if ( &temp2 )
+        {
+        address->SetDisplayNameL( temp2 );
+        }   
+    return address;
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+TUint CEmailMessage::MapFlags( const TUint& aFlag )
+    {
+    TUint flag = 0;
+    switch( aFlag )
+        {
+        case EFlag_Read:
+            flag = EFSMsgFlag_Read;
+            break;
+        case EFlag_Read_Locally:
+            flag = EFSMsgFlag_Read_Locally;
+            break;
+        case EFlag_Low:
+            flag = EFSMsgFlag_Low;
+            break;
+        case EFlag_Important:
+            flag = EFSMsgFlag_Important;
+            break;
+        case EFlag_FollowUpComplete:
+            flag = EFSMsgFlag_FollowUpComplete;
+            break;
+        case EFlag_FollowUp:
+            flag = EFSMsgFlag_FollowUp;
+            break;
+        case EFlag_Attachments:
+            flag = EFSMsgFlag_Attachments;
+            break;
+        case EFlag_Multiple:
+            flag = EFSMsgFlag_Multiple;
+            break;
+        case EFlag_CalendarMsg:
+            flag = EFSMsgFlag_CalendarMsg;
+            break;
+        case EFlag_Answered:
+            flag = EFSMsgFlag_Answered;
+            break;
+        case EFlag_Forwarded:
+            flag = EFSMsgFlag_Forwarded;
+            break;
+        case EFlag_OnlyToMe:
+            flag = EFSMsgFlag_OnlyToMe;
+            break;
+        case EFlag_RemoteDeleted:
+            flag = EFSMsgFlag_RemoteDeleted;
+            break;
+        case EFlag_HasMsgSender:
+            flag = EFSMsgFlag_HasMsgSender;
+            break;
+        default:
+            break;
+        }
+    return flag;
+    }
+
+void CEmailMessage::ShowMessageViewerL( )
+    {   
+    THtmlViewerActivationData htmlData;
+    htmlData.iActivationDataType = THtmlViewerActivationData::EMailMessage;
+    htmlData.iMailBoxId = FsMsgId(iPluginData, iMessageId.iFolderId.iMailboxId);
+    htmlData.iFolderId = FsMsgId(iPluginData, iMessageId.iFolderId);
+    htmlData.iMessageId = FsMsgId(iPluginData, iMessageId);
+    TPckgBuf<THtmlViewerActivationData> pckgData( htmlData );
+    CVwsSessionWrapper* viewSrvSession = CVwsSessionWrapper::NewLC();
+    viewSrvSession->ActivateView(TVwsViewId(KFSEmailUiUid, HtmlViewerId), KHtmlViewerOpenNew, pckgData);
+    CleanupStack::PopAndDestroy();
+    }    
+
+/** 
+ * Launches Email application and new reply message in editor. 
+ * The method follows "fire and forget" pattern, returns immediately.
+ */
+void CEmailMessage::ReplyToMessageL( const TBool aReplyToAll )
+    {
+    TEditorLaunchParams editorLaunchData;
+    editorLaunchData.iMailboxId = FsMsgId(iPluginData, iMessageId.iFolderId.iMailboxId);
+    editorLaunchData.iFolderId = FsMsgId(iPluginData, iMessageId.iFolderId);
+    editorLaunchData.iMsgId = FsMsgId(iPluginData, iMessageId);
+    editorLaunchData.iActivatedExternally = ETrue; 
+    
+    TPckgBuf<TEditorLaunchParams> pckgData( editorLaunchData );
+    CVwsSessionWrapper* viewSrvSession = CVwsSessionWrapper::NewLC();
+    TUid command = TUid::Uid(KEditorCmdReplyAll);
+    if ( !aReplyToAll )
+        {
+        command = TUid::Uid(KEditorCmdReply);
+        }
+    viewSrvSession->ActivateView(TVwsViewId(KFSEmailUiUid, MailEditorId), command, pckgData);
+    CleanupStack::PopAndDestroy();   
+    }
+
+void CEmailMessage::ForwardMessageL()
+    {
+    TEditorLaunchParams editorLaunchData;
+    editorLaunchData.iMailboxId = FsMsgId(iPluginData, iMessageId.iFolderId.iMailboxId);
+    editorLaunchData.iFolderId = FsMsgId(iPluginData, iMessageId.iFolderId);
+    editorLaunchData.iMsgId = FsMsgId(iPluginData, iMessageId);
+    editorLaunchData.iActivatedExternally = ETrue; 
+    
+    TPckgBuf<TEditorLaunchParams> pckgData( editorLaunchData );
+    CVwsSessionWrapper* viewSrvSession = CVwsSessionWrapper::NewLC();
+    TUid command = TUid::Uid(KEditorCmdForward);
+    viewSrvSession->ActivateView(TVwsViewId(KFSEmailUiUid, MailEditorId), command, pckgData);
+    CleanupStack::PopAndDestroy();   
+    }
+// End of file.