email/mail/ViewerSrc/MsgMailViewerDocument.cpp
branchRCL_3
changeset 27 7fdbb852d323
parent 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/mail/ViewerSrc/MsgMailViewerDocument.cpp	Wed Sep 01 12:31:54 2010 +0100
@@ -0,0 +1,507 @@
+/*
+* Copyright (c) 2002 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:  Implements document for application.
+*
+*/
+
+
+// INCLUDE FILES
+#include "MailLog.h"
+#include "MailUtils.h"
+#include "MsgMailViewerDocument.h"
+#include "MsgMailViewerAppUi.h"
+#include <MsgMailViewer.rsg>
+#include "MsgMailDRMHandler.h"
+#include "CMailCRHandler.h"
+#include "CMailForwardOperation.h"
+#include "MsgMailViewerRemoveAttachment.h"
+#include <CMailMessage.h>
+#include <Muiumsginfo.hrh>
+#include <MuiuMsgEditorLauncher.h>      // for TEditorParameters
+#include <miutmsg.h>
+#include <mtmuibas.h>
+#include <mmsvattachmentmanager.h>
+#include <MsgAttachmentModel.h>
+#include <MsgAttachmentInfo.h>
+#include <DocumentHandler.h>
+#include <MuiuOperationWait.h>          // CMuiuOperationWait
+#include <impicmds.h>                   // TIMAP4Cmds
+#include <sendui.h>
+#include <mtmuidef.hrh>
+
+// LOCAL CONSTANTS
+// Max param length for msg info.
+const TInt KMessageSizeMaxLength(10);
+
+// ================= MEMBER FUNCTIONS =======================
+
+// Default constructor
+CMsgMailViewerDocument::CMsgMailViewerDocument(CEikApplication& aApp)
+    : CMsgMailDocument(aApp), iCharSet(0)
+    { 
+    }
+
+// destructor
+CMsgMailViewerDocument::~CMsgMailViewerDocument()
+    {
+    delete iViewedMessage;    
+    delete iPrefs;
+    iPrefs = NULL; // Owned by a superclass
+    delete iDRMHandler;
+    delete iSendUi;
+    delete iMailCRHandler;        
+    }
+
+// Symbian OS default constructor can leave.
+void CMsgMailViewerDocument::ConstructL()
+    {
+    CMsgEditorDocument::ConstructL();
+    iMailCRHandler = CMailCRHandler::NewL( this );
+    }
+
+// ----------------------------------------------------------------------------
+// CMsgMailViewerDocument::DoInitDRMHandlerL()
+// ----------------------------------------------------------------------------
+//
+void CMsgMailViewerDocument::DoInitDRMHandlerL()
+	{
+	if (!iDRMHandler)
+		{
+        LOG("CMsgMailViewerAppUi::DoInitDRMHandlerL initializing DRM");
+		iDRMHandler = MsgMailDRMHandler::NewL();
+		}
+	}	
+// ----------------------------------------------------------------------------
+// Two-phased constructor.
+// ----------------------------------------------------------------------------
+//
+CMsgMailViewerDocument* CMsgMailViewerDocument::NewL(
+        CEikApplication& aApp)     // CMsgMailViewerApp reference
+    {
+    CMsgMailViewerDocument* self = new (ELeave) CMsgMailViewerDocument( aApp );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+
+    return self;
+    }    
+// ----------------------------------------------------------------------------
+// CMsgMailViewerDocument::CreateAppUiL()
+// constructs CMsgMailViewerAppUi
+// ----------------------------------------------------------------------------
+//
+CEikAppUi* CMsgMailViewerDocument::CreateAppUiL()
+    {
+    return new (ELeave) CMsgMailViewerAppUi;
+    }
+
+// ----------------------------------------------------------------------------
+// CMsgMailViewerDocument::NotifyChanges()
+// ----------------------------------------------------------------------------
+//
+void CMsgMailViewerDocument::NotifyChanges(TMsgAttachmentCommand aCommand, 
+    CMsgAttachmentInfo* /*aAttachmentInfo*/ )
+    {
+    switch (aCommand)
+        {
+        case EMsgAttachmentAdded:
+            // FALLTHROUGH
+        case EMsgAttachmentRemoved:
+            SetChanged(ETrue);
+            break;
+        default:
+            break;
+        }   
+    }
+// ----------------------------------------------------------------------------
+// CMsgMailViewerDocument::GetAttachmentFileL()
+// ----------------------------------------------------------------------------
+//
+RFile CMsgMailViewerDocument::GetAttachmentFileL( TMsvAttachmentId aId )
+	{
+    LOG1("CMsgMailViewerDocument::GetAttachmentFileL %08x", aId);	
+    return MailMessage().GetFileHandleL( aId );
+	}
+
+// ----------------------------------------------------------------------------
+// CMsgMailViewerDocument::EntryChangedL()
+// ----------------------------------------------------------------------------
+//
+void CMsgMailViewerDocument::EntryChangedL()
+	{
+    delete iViewedMessage;
+    iViewedMessage = NULL;
+    iViewedMessage = CMailMessage::NewL(CurrentEntry());
+    iViewedMessage->SetNew( (LaunchFlags() & EMsgUnreadMessage) );  
+    LOG2( "CMsgMailViewerDocument::EntryChangedL %08x is new:%d" , 
+    	MailMessage().MessageEntry().Id(), iViewedMessage->IsNew() );
+	}
+	
+// ----------------------------------------------------------------------------
+// CMsgMailViewerDocument::AddAttachmentL()
+// ----------------------------------------------------------------------------
+//
+void CMsgMailViewerDocument::AddAttachmentL( 
+	CMsvAttachment& aAttachmentInfo,
+	TBool aCanBeRemoved )
+	{
+    // add attachment to model
+	CMsgAttachmentModel& attmodel = AttachmentModel();
+	TDataType dataType(aAttachmentInfo.MimeType());     
+
+    if ( aAttachmentInfo.Type() != CMsvAttachment::EMsvMessageEntry ) 
+    	{	    		    
+	    RFile attachment = GetAttachmentFileL( aAttachmentInfo.Id() );
+	    CleanupClosePushL(attachment);	
+	    
+	    dataType = ResolveMimeType( attachment );	   
+	    if ( !dataType.Des().Length() && aAttachmentInfo.MimeType().Length() )
+	    	{
+	    	dataType = aAttachmentInfo.MimeType();
+	    	}
+	    
+	    CMsgAttachmentInfo* info = attmodel.AddAttachmentL(
+	        aAttachmentInfo.AttachmentName(),
+	        aAttachmentInfo.Size(),
+	        aAttachmentInfo.Id(),
+	        aAttachmentInfo.Complete(),
+	        dataType); 	    
+
+    	TMsvId serviceId;
+    	TMsvEmailEntry attachmentEntry;
+    	User::LeaveIfError(Session().GetEntry(
+        aAttachmentInfo.Id(), serviceId, attachmentEntry));
+    	info->SetAttachedThisSession( aCanBeRemoved );
+    	LOG1("CMsgMailViewerAppUi::AddAttachmentL attachment complete:%d",
+    		attachmentEntry.Complete());
+    	LOG1("CMsgMailViewerAppUi::AddAttachmentL attachment BodyComplete:%d",
+    		attachmentEntry.BodyTextComplete());
+	    
+	    DoInitDRMHandlerL();
+	    iDRMHandler->SetDRMDataTypeL( *info, attachment );
+    	CleanupStack::PopAndDestroy(); // attachment
+    	}
+    else  // EMsvMessageEntry 
+    	{
+    	// completed flag is not set correctly to message entry info
+	    CMsgAttachmentInfo* info = attmodel.AddAttachmentL(
+	        aAttachmentInfo.AttachmentName(),
+    	    aAttachmentInfo.Size(),
+        	aAttachmentInfo.Id(),
+        	ETrue /*aAttachmentInfo.Complete()*/,
+        	dataType);
+        info->SetAttachedThisSession( aCanBeRemoved );	 
+    	}  	
+	
+	}
+    	
+
+// ----------------------------------------------------------------------------
+// CMsgMailViewerDocument::CanSaveFileL()
+// ----------------------------------------------------------------------------
+//
+TBool CMsgMailViewerDocument::CanSaveFileL( TDataType aDataType )
+	{
+	// remove save if system doesn't support saving
+	CDocumentHandler* doch = CDocumentHandler::NewLC( 
+		CEikonEnv::Static()->Process() );					// CSI: 27 # Must be used because of 
+															// iEikEnv is not accessible.
+     
+    TBool canSave(EFalse);
+    TRAP_IGNORE( canSave = doch->CanSaveL( aDataType ) );
+    // if error hide save
+    CleanupStack::PopAndDestroy(); //doch	
+   	return canSave;
+	}
+	
+
+// ----------------------------------------------------------------------------
+// CMsgMailViewerDocument::DeleteMessageL()
+// ----------------------------------------------------------------------------
+//
+TBool CMsgMailViewerDocument::DeleteMessageL()
+	{
+    CMsvEntrySelection* sel = new (ELeave) CMsvEntrySelection;
+    CleanupStack::PushL(sel);
+    TMsvId msgID = MailMessage().MessageEntry().Id();
+    sel->AppendL( msgID );
+    Mtm().SwitchCurrentEntryL( MailMessage().MessageEntry().Parent() );
+    CMuiuOperationWait* wait = CMuiuOperationWait::NewLC();
+    CMsvOperation* op = MtmUi().DeleteFromL( *sel, wait->iStatus );
+    CleanupStack::PushL(op);
+    
+    //Check if delete is cancelled from IMUM menu
+    TBool cancel(op->iStatus.Int() == KErrCancel);
+   
+    //When deleting is really started we proceed
+    //as it was done complitely (= close viewer).
+    //Reason for this is that we don't
+    //know if IMUM has deleted message completely
+    //or not.
+        
+    wait->Start();
+	
+    CleanupStack::PopAndDestroy(3);			// CSI: 47 # op, wait, sel
+
+	return cancel;        	
+	}
+	
+// ----------------------------------------------------------------------------
+// CMsgMailViewerDocument::FetchAttachmentL()
+// ----------------------------------------------------------------------------
+//
+CMsvOperation* CMsgMailViewerDocument::FetchAttachmentL( 
+    CMsvEntrySelection& aSelection, TRequestStatus& aCompletionStatus )
+	{
+	TBuf8<1> param;
+	// Set context back to message if not allready set
+	SetEntryWithoutNotificationL( MailMessage().MessageEntry().Id() ); 
+	return MtmUi().InvokeAsyncFunctionL(
+		KImpiMTMFetchAttachments, aSelection, aCompletionStatus, param );
+	}
+
+// ----------------------------------------------------------------------------
+// CMsgMailViewerDocument::FetchAttachmentL()
+// ----------------------------------------------------------------------------
+//
+void CMsgMailViewerDocument::FetchAttachmentL( CMsvEntrySelection& aSelection )
+	{
+	CMsvSingleOpWatcher* watch=CMsvSingleOpWatcher::NewLC( *this );
+	CMsvOperation* op = FetchAttachmentL( aSelection, watch->iStatus );
+    // watch owns op before leave can occur
+    AddSingleOperationL(op, watch);
+    CleanupStack::Pop( watch ); // watch    
+	}
+// ----------------------------------------------------------------------------
+// CMsgMailViewerDocument::FetchAttachmentL()
+// ----------------------------------------------------------------------------
+//
+void CMsgMailViewerDocument::FetchAttachmentL( TMsvAttachmentId aAttachmentId )
+	{
+    CMsvEntrySelection* sel = new(ELeave) CMsvEntrySelection;
+	CleanupStack::PushL(sel);
+	sel->AppendL( aAttachmentId );
+	FetchAttachmentL( *sel );
+	CleanupStack::PopAndDestroy( sel );
+	}	
+
+// ----------------------------------------------------------------------------
+// CMsgMailViewerDocument::RemoveAttachmentL()
+// ----------------------------------------------------------------------------
+//		
+void CMsgMailViewerDocument::RemoveAttachmentL( 
+	TMsvAttachmentId aAttachmentId )
+	{
+    CMsvSingleOpWatcher* watch=CMsvSingleOpWatcher::NewLC( *this );
+    LOG1("CMsgMailViewerDocument::RemoveAttachmentL %08x", 
+        	aAttachmentId);       	
+    TMsvId msgID = MailMessage().MessageEntry().Id();
+    
+    CMsvOperation* op = CMsgMailViewerRemoveAttachmentOp::NewLC(
+    	Session(), watch->iStatus, aAttachmentId, msgID );
+
+    CleanupStack::Pop(); // op
+    // watch owns op before leave can occur
+    AddSingleOperationL(op, watch);
+    CleanupStack::Pop( watch ); // watch	
+	}
+	
+// ----------------------------------------------------------------------------
+// CMsgMailViewerDocument::IsOnLineL()
+// ----------------------------------------------------------------------------
+//
+TBool CMsgMailViewerDocument::IsOnLineL() const
+    {
+    const TMsvId entryId(CurrentEntry().OwningService());
+    CMsvEntry *entry = CMsvEntry::NewL(Session(),
+        entryId, TMsvSelectionOrdering());
+    const TBool result(entry->Entry().Connected());
+    delete entry;
+    return result;
+    }
+
+
+// ----------------------------------------------------------------------------
+// CMsgMailViewerDocument::RetrieveMessageL()
+// ----------------------------------------------------------------------------
+//
+void CMsgMailViewerDocument::RetrieveMessageL()
+	{
+    CMsvEntrySelection* sel= new (ELeave) CMsvEntrySelection();
+    CleanupStack::PushL( sel );
+    TMsvId messageId = Entry().Id();
+    sel->AppendL( messageId );
+
+    SetEntryL(Entry().Parent());
+
+    TBuf8<1> blankParams;
+    CMuiuOperationWait* wait = CMuiuOperationWait::NewLC();
+
+    CMsvOperation* op=MtmUi().InvokeAsyncFunctionL(
+        KMtmUiFunctionFetchSelected,
+        *sel,
+        wait->iStatus,
+        blankParams);
+
+    CleanupStack::PushL(op);
+    wait->Start();
+
+    // Set content back to message itself
+    SetEntryL(messageId);
+    
+    // ignore return value.
+    MtmUi().DisplayProgressSummary( op->FinalProgress() );
+    CleanupStack::PopAndDestroy(3);				// CSI: 47 # op, wait, sel	
+	}
+
+// ----------------------------------------------------------------------------
+// CMsgMailViewerDocument::SendUiL()
+// ----------------------------------------------------------------------------
+//
+CSendUi& CMsgMailViewerDocument::SendUiL()
+    {
+    if ( !iSendUi )
+        iSendUi = CSendUi::NewL();
+    
+    return *iSendUi;
+    }
+    
+// ----------------------------------------------------------------------------
+// CMsgMailViewerDocument::ShowMessageInfoL()
+// ----------------------------------------------------------------------------
+//
+void CMsgMailViewerDocument::ShowMessageInfoL()    
+	{
+    CMsvEntrySelection* sel = new (ELeave) CMsvEntrySelection;
+    CleanupStack::PushL(sel);
+    TMsvId id( Entry().Id() );
+    sel->AppendL(id);
+
+    TBuf8<KMessageSizeMaxLength> infoParams(KMessageInfoViewer);
+    CMsvSingleOpWatcher* watch=CMsvSingleOpWatcher::NewLC(*this);
+    CMsvOperation* op= MtmUi().InvokeAsyncFunctionL(
+        KMtmUiFunctionMessageInfo,
+        *sel,
+        watch->iStatus,
+        infoParams
+        );
+    // watch owns op before leave can occur
+    AddSingleOperationL(op, watch);
+    CleanupStack::Pop(); // watch
+    CleanupStack::PopAndDestroy(); // sel	
+	}
+	
+// ----------------------------------------------------------------------------
+// CMsgMailViewerDocument::OpenMessageEntryL()
+// ----------------------------------------------------------------------------
+//
+TBool CMsgMailViewerDocument::OpenMessageEntryL(TMsvId aEntryId )
+	{
+   	TMsvEntry entry;
+   	TMsvId service;
+   	User::LeaveIfError( Session().GetEntry(aEntryId, service, entry) );
+     
+    if (entry.iType==KUidMsvMessageEntry)
+        {
+        // dealing with attached message 
+        const TMsvId prevEntry = CurrentEntry().EntryId();
+        SetEntryL( aEntryId );
+
+        // create watcher
+        CMsvSingleOpWatcher* watch=CMsvSingleOpWatcher::NewLC(
+            *this );
+        // open attached message
+        CMsvOperation* op = MtmUi().ViewL(watch->iStatus);
+        // add to operation queue, watch owns op before leave can occur
+        AddSingleOperationL(op, watch);
+        CleanupStack::Pop(); // watch
+        // set context back to original entry
+        SetEntryL(prevEntry); 
+        return ETrue;
+        }
+    return EFalse;
+	}
+
+// ----------------------------------------------------------------------------
+// CMsgMailViewerDocument::MailMessage()
+// ----------------------------------------------------------------------------
+//
+CMailMessage& CMsgMailViewerDocument::MailMessage()
+	{
+	__ASSERT_DEBUG( iViewedMessage, User::Invariant() );
+	return *iViewedMessage;
+	}
+	
+// ----------------------------------------------------------------------------
+// CMsgMailViewerDocument::MoveRemoteEntryL()
+// ----------------------------------------------------------------------------
+//
+void CMsgMailViewerDocument::MoveRemoteEntryL( 
+	TMsvId aTo, TMsvId aService, TBool aDestinationIsRemote )
+	{
+    CMsvEntrySelection* sel = new(ELeave) CMsvEntrySelection();
+    CleanupStack::PushL(sel);
+    sel->AppendL( MailMessage().MessageEntry().Id() );
+
+    CMsvOperation* op=NULL;
+    CMuiuOperationWait* wait = CMuiuOperationWait::NewLC();
+    
+    if ( aDestinationIsRemote )
+        {
+        Mtm().SwitchCurrentEntryL( aTo );
+        op=MtmUi().CopyToL( *sel, wait->iStatus);
+        }
+    else
+        {
+        Mtm().SwitchCurrentEntryL( aService );
+        op=MtmUi().CopyFromL( *sel, aTo, wait->iStatus);
+        }
+
+    CleanupStack::PushL(op);
+    wait->Start();  // wait for completion of asynch operation
+    LOG1("CMsgMailViewerDocument::MoveRemoteEntryL iStatus:%d",
+        wait->iStatus.Int() );
+    User::LeaveIfError( wait->iStatus.Int() );    
+
+    CleanupStack::PopAndDestroy(3);			// CSI: 47 # sel, op, wait	
+	}
+	
+// ----------------------------------------------------------------------------
+// CMsgMailViewerDocument::UpdateAttachmentModelFromMessageL()
+// ----------------------------------------------------------------------------
+//
+void CMsgMailViewerDocument::UpdateAttachmentModelFromMessageL()
+    {
+    // Now message is fetched, we'll update datatype information
+    //MailMessage().LoadAttachmentsL( *this );    
+    MMsvAttachmentManager& manager = MailMessage().AttachmentManager();
+    LOG1("CMsgMailViewerDocument::UpdateAttachmentModelFromMessageL count:%d",
+        manager.AttachmentCount() );    
+    }
+
+// ----------------------------------------------------------------------------
+// CMsgMailViewerDocument::ForwardMailMessageL()
+// ----------------------------------------------------------------------------
+//
+CMailOperation* CMsgMailViewerDocument::ForwardMailMessageL( 
+    MMsvProgressReporter& aReporter,
+    TRequestStatus& aStatus, 
+    TBool aSetSuspend )
+    {
+    return CMailForwardOperation::NewL( 
+    	aReporter, *this, aStatus, aSetSuspend );
+    }
+
+
+// End of File