diff -r 000000000000 -r 72b543305e3a email/mail/EditorSrc/cmsgmaillaunchop.cpp --- /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 // resource identifiers +#include +#include +#include + +// ============================ 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 (*(iBodyText->GlobalParaFormatLayer())), + const_cast (*(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