--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/email/mail/EditorSrc/cmsgmaillaunchop.cpp Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,318 @@
+/*
+* Copyright (c) 2002-2007 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: State machine -based operation for mail editor view launching.
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "cmsgmaillaunchop.h"
+#include "mmsgmailappuiopdelegate.h"
+#include "MsgMailEditorDocument.h"
+#include "cmsgmailrestoresuperop.h"
+#include "MailLog.h"
+#include <MsgEditorAppUi.rsg> // resource identifiers
+#include <MsgMailEditor.rsg>
+#include <MsgBodyControl.h>
+#include <eikrted.h>
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CMsgMailLaunchOp::CMsgMailLaunchOp
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CMsgMailLaunchOp::CMsgMailLaunchOp(
+ CMsgMailEditorDocument& aDocument,
+ MMsgMailAppUiOpDelegate& aOpDelegate )
+ : CMsgMailBaseOp( aDocument ),
+ iOpDelegate( aOpDelegate )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CMsgMailLaunchOp::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CMsgMailLaunchOp::ConstructL()
+ {
+
+ }
+
+// -----------------------------------------------------------------------------
+// CMsgMailLaunchOp::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CMsgMailLaunchOp* CMsgMailLaunchOp::NewL(
+ CMsgMailEditorDocument& aDocument,
+ MMsgMailAppUiOpDelegate& aOpDelegate )
+ {
+ CMsgMailLaunchOp* self = new( ELeave ) CMsgMailLaunchOp( aDocument,
+ aOpDelegate );
+ CleanupStack::PushL( self );
+ self->ConstructL();
+
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+
+// Destructor
+CMsgMailLaunchOp::~CMsgMailLaunchOp()
+ {
+ LOG( "CMsgMailLaunchOp::~CMsgMailLaunchOp" );
+ Cancel();
+ delete iRestoreSuperOp;
+ }
+
+// -----------------------------------------------------------------------------
+// CMsgMailLaunchOp::HandleStateActionL
+// -----------------------------------------------------------------------------
+//
+void CMsgMailLaunchOp::HandleStateActionL()
+ {
+ switch ( iState )
+ {
+ case EInitLaunch:
+ {
+ InitLaunchL();
+ break;
+ }
+ case ERestoreBody:
+ {
+ RestoreBodyL();
+ break;
+ }
+ case EConvertLineBreaks:
+ {
+ ConvertLineBreaksL();
+ break;
+ }
+ case ERestoreAllAttas:
+ {
+ RestoreAllAttasL();
+ break;
+ }
+ case EExecuteView:
+ {
+ ExecuteViewL();
+ break;
+ }
+ case EFinalize:
+ {
+ FinalizeL();
+ break;
+ }
+ default:
+ {
+ // should never come here
+ ASSERT( EFalse );
+ break;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CMsgMailLaunchOp::SetNextState
+// -----------------------------------------------------------------------------
+//
+void CMsgMailLaunchOp::SetNextState()
+ {
+ switch ( iState )
+ {
+ case EIdleState:
+ {
+ iState = EInitLaunch;
+ break;
+ }
+ case EInitLaunch:
+ {
+ iState = ERestoreBody;
+ break;
+ }
+ case ERestoreBody:
+ {
+ iState = EConvertLineBreaks;
+ break;
+ }
+ case EConvertLineBreaks:
+ {
+ iState = ERestoreAllAttas;
+ break;
+ }
+ case ERestoreAllAttas:
+ {
+ iState = EExecuteView;
+ break;
+ }
+ case EExecuteView:
+ {
+ iState = EFinalize;
+ break;
+ }
+ case EFinalize: // fall through
+ default:
+ {
+ iState = EIdleState;
+ break;
+ }
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CMsgMailLaunchOp::HandleOperationCancel
+// -----------------------------------------------------------------------------
+//
+void CMsgMailLaunchOp::HandleOperationCancel()
+ {
+ LOG( "CMsgMailLaunchOp::HandleOperationCancel, deleting iRestoreSuperOp" );
+ delete iRestoreSuperOp;
+ iRestoreSuperOp = NULL;
+
+ if ( iState == ERestoreBody )
+ {
+ LOG( "HandleOperationCancel, ...MessageL().Cancel()..." );
+ TRAP_IGNORE( iDocument.MessageL().Cancel() );
+ }
+ LOG( "HandleOperationCancel, ...finished" );
+ }
+
+// -----------------------------------------------------------------------------
+// CMsgMailLaunchOp::InitLaunchL
+// -----------------------------------------------------------------------------
+//
+void CMsgMailLaunchOp::InitLaunchL()
+ {
+ // start wait note showing at this point
+ StartWaitNoteL( R_WAIT_OPENING, EFalse, R_MEB_WAIT_NOTE );
+
+ CMsgBodyControl& bodyControl( iOpDelegate.DelegateInitLaunchL() );
+
+ TInt editorFlags = bodyControl.Editor().AknEdwinFlags();
+ editorFlags &= ~EAknEditorFlagEnablePictographInput;
+ bodyControl.Editor().SetAknEditorFlags( editorFlags );
+ iBodyText = &( bodyControl.TextContent() );
+
+ CompleteStateAction();
+ }
+
+// -----------------------------------------------------------------------------
+// CMsgMailLaunchOp::RestoreBodyL
+// -----------------------------------------------------------------------------
+//
+void CMsgMailLaunchOp::RestoreBodyL()
+ {
+ iDocument.MessageL().GetBodyTextL(
+ iStatus,
+ iDocument.Entry().Id(),
+ CImEmailMessage::EThisMessageOnly,
+ *iBodyText,
+ const_cast<CParaFormatLayer&> (*(iBodyText->GlobalParaFormatLayer())),
+ const_cast<CCharFormatLayer&> (*(iBodyText->GlobalCharFormatLayer())));
+ SetActive();
+ }
+
+// -----------------------------------------------------------------------------
+// CMsgMailLaunchOp::ConvertLineBreaksL
+// -----------------------------------------------------------------------------
+//
+void CMsgMailLaunchOp::ConvertLineBreaksL()
+ {
+ ASSERT( iBodyText ); // must be available in this state already
+ ConvertLineBreaksL( *iBodyText );
+ CompleteStateAction();
+ }
+
+// -----------------------------------------------------------------------------
+// CMsgMailLaunchOp::RestoreAllAttasL
+// -----------------------------------------------------------------------------
+//
+void CMsgMailLaunchOp::RestoreAllAttasL()
+ {
+ delete iRestoreSuperOp;
+ iRestoreSuperOp = NULL;
+ iRestoreSuperOp = CMsgMailRestoreSuperOp::NewL( iDocument );
+ iRestoreSuperOp->StartOp( iStatus );
+ SetActive();
+ }
+
+// -----------------------------------------------------------------------------
+// CMsgMailLaunchOp::ExecuteViewL
+// -----------------------------------------------------------------------------
+//
+void CMsgMailLaunchOp::ExecuteViewL()
+ {
+ iOpDelegate.DelegateExecuteViewL();
+ StopWaitNote();
+ CompleteStateAction();
+ }
+
+// -----------------------------------------------------------------------------
+// CMsgMailLaunchOp::FinalizeL
+// -----------------------------------------------------------------------------
+//
+void CMsgMailLaunchOp::FinalizeL()
+ {
+ iOpDelegate.DelegateFinalizeLaunchL();
+ iRestoreSuperOp->ShowNoteIfInvalidAttaL();
+ iRestoreSuperOp->ShowNoteIfDRMAttaL();
+ CompleteStateAction();
+ }
+
+// ----------------------------------------------------------------------------
+// CMsgMailLaunchOp::ConvertLineBreaksL()
+// ----------------------------------------------------------------------------
+//
+void CMsgMailLaunchOp::ConvertLineBreaksL( CRichText& aRtf ) const
+ {
+ HBufC* buf = HBufC::NewLC(aRtf.DocumentLength());
+ TPtr bufPtr = buf->Des();
+ aRtf.Extract(bufPtr);
+ TInt count(0);
+ for (TInt i(0); i < bufPtr.Length(); i++)
+ {
+ if (bufPtr[i] == CEditableText::ELineBreak)
+ {
+ count++;
+ // Replace every 10th linebreak with paragraph to
+ // make body text scrolling smoother.
+ if (count == 10) // CSI: 47 # See a comment above.
+ {
+ bufPtr[i] = CEditableText::EParagraphDelimiter;
+ count = 0;
+ }
+ }
+ // Replace 'CRLF' or 'LF' with LineBreak.
+ else if (bufPtr[i] == 0x0A) // Linefeed character (LF)
+ {
+ bufPtr[i] = CEditableText::ELineBreak;
+
+ // Check if previous char was CR
+ if ( i>0 && bufPtr[i-1] == 0x0D) // ascii (CR)
+ {
+ bufPtr.Delete( i-1, 1 ); // Delete CR
+ }
+ }
+ }
+ aRtf.DeleteL(0, aRtf.DocumentLength());
+ aRtf.InsertL(0, *buf);
+ CleanupStack::PopAndDestroy( buf ); // buf
+ }
+
+// End Of File