diff -r ebe688cedc25 -r 7fdbb852d323 email/mail/EditorSrc/cmsgmailsendop.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/mail/EditorSrc/cmsgmailsendop.cpp Wed Sep 01 12:31:54 2010 +0100 @@ -0,0 +1,377 @@ +/* +* 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 sending mail message. +* +*/ + + + +// INCLUDE FILES +#include "cmsgmailsendop.h" +#include "mmsgmailappuiopdelegate.h" +#include "MailLog.h" +#include "MailUtils.h" +#include "MsgMailPreferences.h" +#include "MsgMailEditorDocument.h" +#include +#include +#include +#include +#include +#include +#include // resource identifiers +#include +#include // MUIU MTM utils +#include +#include +#include "EmailFeatureUtils.h" + + +const TInt KMaximumAddressLength(100); + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CMsgMailSendOp::CMsgMailSendOp +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CMsgMailSendOp::CMsgMailSendOp( + CMsgMailEditorDocument& aDocument, + MMsgMailAppUiOpDelegate& aOpDelegate ) + : CMsgMailBaseOp( aDocument ), + iOpDelegate( aOpDelegate ) + { + } + +// ----------------------------------------------------------------------------- +// CMsgMailSendOp::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CMsgMailSendOp::ConstructL() + { + iFlags = MsvEmailMtmUiFeatureUtils::EmailFeaturesL( ETrue, ETrue ); + } + +// ----------------------------------------------------------------------------- +// CMsgMailSendOp::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CMsgMailSendOp* CMsgMailSendOp::NewL( + CMsgMailEditorDocument& aDocument, + MMsgMailAppUiOpDelegate& aOpDelegate ) + { + CMsgMailSendOp* self = new( ELeave ) CMsgMailSendOp( aDocument, + aOpDelegate ); + CleanupStack::PushL( self ); + self->ConstructL(); + + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// CMsgMailSendOp::~CMsgMailSendOp +// ----------------------------------------------------------------------------- +// +CMsgMailSendOp::~CMsgMailSendOp() + { + Cancel(); + delete iFlags; + } + +// ----------------------------------------------------------------------------- +// CMsgMailSendOp::HandleStateActionL +// ----------------------------------------------------------------------------- +// +void CMsgMailSendOp::HandleStateActionL() + { + switch ( iState ) + { + case EPrepare: + { + PrepareL(); + break; + } + case ESaveMessage: + { + SaveMessageL(); + break; + } + case ESendMessage: + { + SendMessageL(); + break; + } + case EFinalize: + { + Finalize(); + break; + } + default: + { + // should never come here + ASSERT( EFalse ); + break; + } + } + } + +// ----------------------------------------------------------------------------- +// CMsgMailSendOp::SetNextState +// ----------------------------------------------------------------------------- +// +void CMsgMailSendOp::SetNextState() + { + switch ( iState ) + { + case EIdleState: + { + iState = EPrepare; + break; + } + case EPrepare: + { + iState = ESaveMessage; + break; + } + case ESaveMessage: + { + iState = ESendMessage; + break; + } + case ESendMessage: + { + iState = EFinalize; + break; + } + case EFinalize: // fall through + default: + { + iState = EIdleState; + break; + } + } + } + +// ----------------------------------------------------------------------------- +// CMsgMailSendOp::HandleOperationCancel +// ----------------------------------------------------------------------------- +// +void CMsgMailSendOp::HandleOperationCancel() + { + // nothing to cancel + } + +// ----------------------------------------------------------------------------- +// CMsgMailSendOp::PrepareL +// ----------------------------------------------------------------------------- +// +void CMsgMailSendOp::PrepareL() + { + CMsgMailPreferences& prefs = iDocument.SendOptions(); + TMsvId sendingBox = SendingBoxL( prefs ); + SetSchedulingOptionsL( prefs, sendingBox ); + CompleteStateAction(); + } + +// ----------------------------------------------------------------------------- +// CMsgMailSendOp::SaveMessageL +// ----------------------------------------------------------------------------- +// +void CMsgMailSendOp::SaveMessageL() + { + // we can't handle saving by ourself so call the delegator + iOpDelegate.DelegateSaveMsgL(); + CompleteStateAction(); + } + +// ----------------------------------------------------------------------------- +// CMsgMailSendOp::SendMessageL +// ----------------------------------------------------------------------------- +// +void CMsgMailSendOp::SendMessageL() + { + // We need to do offline check before sendind so that correct note can + // be displayed + if ( MailUtils::OfflineProfileActiveL() && !iFlags->GF( EMailFeatureProtocolWlan )) + { + iDocument.SendOptions().SetMessageScheduling( + CMsgMailPreferences::EMsgMailSchedulingNextConn ); + } + + // start wait note showing at this point + StartWaitNoteL( WaitNoteTextResourceId(), ETrue, R_WAIT_SEND_NOTE ); + SendNativeMailL(); + CompleteStateAction(); + } + +// ----------------------------------------------------------------------------- +// CMsgMailSendOp::Finalize +// ----------------------------------------------------------------------------- +// +void CMsgMailSendOp::Finalize() + { + StopWaitNote(); + CompleteStateAction(); + } + +// ----------------------------------------------------------------------------- +// CMsgMailSendOp::SendingBoxL +// ----------------------------------------------------------------------------- +// +TMsvId CMsgMailSendOp::SendingBoxL( CMsgMailPreferences& aPrefs ) const + { + // Check that box exists + TMsvId sendingBox = aPrefs.ServiceId(); + CMsvEntrySelection* sendingAccounts = + MsvUiServiceUtilities::GetListOfAccountsWithMTML( + iDocument.Session(), + iDocument.CurrentEntry().Entry().iMtm, + ETrue ); + TInt retValue = sendingAccounts->Find( sendingBox ); + delete sendingAccounts; + + if ( retValue == KErrNotFound ) + { // no mailboxes defined + HBufC* string = StringLoader::LoadLC( R_MAIL_MAILBOX_MISSING, + CEikonEnv::Static() ); // CSI: 27 # Must be used because of iEikEnv + // is not accessible. + CAknInformationNote* note = + new( ELeave ) CAknInformationNote( ETrue ); + note->ExecuteLD( *string ); + CleanupStack::PopAndDestroy( string ); // string + // unacceptable situation -> leave + User::Leave( KErrNotFound ); + } + + // check own address + else if ( !CheckOwnAddressL() ) + { + // consider this case as cancelled send operation + User::Leave( KErrCancel ); + } + return sendingBox; + } + +// ----------------------------------------------------------------------------- +// CMsgMailSendOp::SetSchedulingOptionsL +// ----------------------------------------------------------------------------- +// +void CMsgMailSendOp::SetSchedulingOptionsL( + CMsgMailPreferences& aPrefs, + TMsvId aSendingBox ) const + { + // Overwrite send options if not wlan and offline mode + CImumInternalApi* api = CreateEmailApiLC( &iDocument.Session() ); + if ( !api->MailboxUtilitiesL().HasWlanConnectionL( aSendingBox ) && + MailUtils::OfflineProfileActiveL()) + { + aPrefs.SetMessageScheduling( + CMsgMailPreferences::EMsgMailSchedulingNextConn); + } + else if(iDocument.IsOnlineL()) + { + aPrefs.SetMessageScheduling( + CMsgMailPreferences::EMsgMailSchedulingNow); + } + + CleanupStack::PopAndDestroy( api ); + api = NULL; + } + +// ----------------------------------------------------------------------------- +// CMsgMailSendOp::WaitNoteTextResourceId +// ----------------------------------------------------------------------------- +// +TInt CMsgMailSendOp::WaitNoteTextResourceId() const + { + //Select correct text for the wait note. + TInt textResID = R_TEXT_SENDING_MAIL; + if ( iDocument.SendOptions().MessageScheduling() + == CMsgMailPreferences::EMsgMailSchedulingNextConn ) + { + textResID = R_TEXT_SENDING_MAIL_NEXTCON; + } + + return textResID; + } + +// ----------------------------------------------------------------------------- +// CMsgMailSendOp::CheckOwnAddressL +// ----------------------------------------------------------------------------- +// +TBool CMsgMailSendOp::CheckOwnAddressL() const + { + TBool result( ETrue ); + + CEmailAccounts* smtpAccount = CEmailAccounts::NewLC(); + CImSmtpSettings* smtpSet=new( ELeave ) CImSmtpSettings(); + CleanupStack::PushL( smtpSet ); + const TMsvId smtpSetId = iDocument.CurrentEntry().Entry().iServiceId; + + TSmtpAccount accountParams; + smtpAccount->GetSmtpAccountL( smtpSetId, accountParams ); + smtpAccount->LoadSmtpSettingsL( accountParams, *smtpSet ); + + if ( !smtpSet->EmailAddress().Length() ) + { + TBuf text; + CAknTextQueryDialog* dlg = new( ELeave ) CAknTextQueryDialog( text ); + if ( dlg->ExecuteLD( R_MAIL_ADDRESS_QUERY ) ) + { + smtpSet->SetEmailAddressL( text ); + smtpAccount->SaveSmtpSettingsL( accountParams, *smtpSet ); + } + else + { + result = EFalse; + } + } + + CleanupStack::PopAndDestroy( 2, smtpAccount ); // CSI: 47,12 # smtpSet, smtpAccount + return result; + } + +// ----------------------------------------------------------------------------- +// CMsgMailSendOp::SendNativeMailL +// ----------------------------------------------------------------------------- +// +void CMsgMailSendOp::SendNativeMailL() + { + // get entry + const TMsvEmailEntry& msvEntry = iDocument.Entry(); + TMsvId messageId( msvEntry.Id() ); + if ( msvEntry.Parent() != KMsvGlobalOutBoxIndexEntryId ) + { + // MsgEditor can handle moving to outbox so ask delegator's help + messageId = iOpDelegate.DelegateMoveMsgToOutboxL(); + } + + // check, if message sending type is EMsgMailSchedulingNow + if ( iDocument.SendOptions().MessageScheduling() == + CMsgMailPreferences::EMsgMailSchedulingNow ) + { + // send immediately + iDocument.SetEntryL( messageId ); + // SendImmediatelyL() is also asynchronous by nature + iDocument.SendImmediatelyL( messageId ); + } + + } + +// End Of File