--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/email/mail/EditorSrc/cmsgmailsendop.cpp Thu Dec 17 08:44:11 2009 +0200
@@ -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 <StringLoader.h>
+#include <mtmuibas.h>
+#include <cemailaccounts.h>
+#include <Muiumsginfo.hrh>
+#include <aknnotewrappers.h>
+#include <MtmExtendedCapabilities.hrh>
+#include <MsgEditorAppUi.rsg> // resource identifiers
+#include <MsgMailEditor.rsg>
+#include <MuiuMsvUiServiceUtilities.h> // MUIU MTM utils
+#include <ImumInHealthServices.h>
+#include <ImumInMailboxServices.h>
+#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<KMaximumAddressLength> 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