--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/email/imum/Mtms/Src/SmtpCreateNewOp.cpp Wed Sep 01 12:31:54 2010 +0100
@@ -0,0 +1,330 @@
+/*
+* Copyright (c) 2006 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:
+* SMTP Create New Email operation
+*
+*/
+
+#include <eikenv.h>
+#include <miuthdr.h>
+#include <smtpset.h>
+#include <MTMStore.h>
+#include <muiumsvuiserviceutilitiesinternal.h>
+#include <MsvPrgReporter.h>
+#include <SendUiConsts.h>
+#include "ImumMtmLogging.h"
+#include "SmtpCreateNewOp.h"
+#include "SmtpTimerOp.h"
+#include "EmailPreCreation.h"
+#include "MsvConnectionValidation.h"
+#include "MsvEmailConnectionProgressProvider.h"
+#include "EmailUtils.H"
+
+
+const TInt KNewMsgOpPriority = CActive::EPriorityStandard;
+const TInt KIntervalAfterEditorLaunch = 100000; // 0.1 seconds
+
+// ----------------------------------------------------------------------------
+// NewL
+// ----------------------------------------------------------------------------
+CSmtpCreateNewOp* CSmtpCreateNewOp::NewL(
+ CImumInternalApi& aMailboxApi,
+ TRequestStatus& aObserverRequestStatus,
+ const TEditorParameters& aParams,
+ const TDesC& aAppName,
+ const TDesC8& aEditorProgress)
+ {
+ IMUM_STATIC_CONTEXT( CSmtpCreateNewOp::NewL, 0, mtm, KImumMtmLog );
+ IMUM_IN();
+
+ CSmtpCreateNewOp* op = new(ELeave) CSmtpCreateNewOp(
+ aMailboxApi, aObserverRequestStatus, aParams, aAppName);
+ CleanupStack::PushL(op);
+ op->ConstructL(aEditorProgress);
+ CleanupStack::Pop();
+ IMUM_OUT();
+ return op;
+ }
+
+// ----------------------------------------------------------------------------
+// ~CSmtpCreateNewOp
+// ----------------------------------------------------------------------------
+CSmtpCreateNewOp::~CSmtpCreateNewOp()
+ {
+ IMUM_CONTEXT( CSmtpCreateNewOp::~CSmtpCreateNewOp, 0, KImumMtmLog );
+ IMUM_IN();
+
+ delete iEditorProgress;
+ IMUM_OUT();
+ }
+
+// ----------------------------------------------------------------------------
+// RunL
+// ----------------------------------------------------------------------------
+void CSmtpCreateNewOp::RunL()
+ {
+ IMUM_CONTEXT( CSmtpCreateNewOp::RunL, 0, KImumMtmLog );
+ IMUM_IN();
+
+ DoRunL();
+
+ IMUM_OUT();
+ }
+
+// ----------------------------------------------------------------------------
+// RunL
+// ----------------------------------------------------------------------------
+TInt CSmtpCreateNewOp::RunError(TInt aError)
+ {
+ IMUM_CONTEXT( CSmtpCreateNewOp::RunError, 0, KImumMtmLog );
+ IMUM_IN();
+
+ IMUM1( 0, "RunL leaved with error code %d", aError );
+
+ if( iState == EStateLaunch || iState == EStateDeleteAll || iState == EStateCreateNew )
+ {
+ iProgress().iError = aError;
+ iProgress().iType = TMsvLocalOperationProgress::ELocalNew;
+ iProgress().iTotalNumberOfEntries = 1;
+ iProgress().iNumberFailed = 1;
+ }
+ iMtm = KUidMsvLocalServiceMtm;
+ CompleteObserver();
+
+ IMUM_OUT();
+
+ return KErrNone;
+ }
+
+// ----------------------------------------------------------------------------
+// DoRunL
+// ----------------------------------------------------------------------------
+void CSmtpCreateNewOp::DoRunL()
+ {
+ IMUM_CONTEXT( CSmtpCreateNewOp::DoRunL, 0, KImumMtmLog );
+ IMUM_IN();
+
+ TInt err = KErrNone;
+ TPckgBuf<TMsvId> idbuf;
+ if(iStatus.Int() != KErrNone)
+ {
+ err = iStatus.Int();
+ }
+ else if(iOperation)
+ {
+ const TDesC8& prog = iOperation->ProgressL();
+ if(prog.Length())
+ {
+ if(iState == EStateCreate || iState == EStateCreateNew)
+ {
+ idbuf.Copy(prog.Left(sizeof(TMsvId)));
+ if(idbuf() == KMsvNullIndexEntryId)
+ {
+ err = KErrGeneral;
+ }
+ }
+ else
+ {
+ const TUid uid(iOperation->Mtm());
+ if(uid == KUidMsvLocalServiceMtm)
+ {
+ err = McliUtils::GetLocalProgressL(*iOperation).iError;
+ }
+ else
+ {
+ TBuf<CBaseMtmUi::EProgressStringMaxLen> retString;
+ TInt totalEntryCount = 0;
+ TInt entriesDone = 0;
+ TInt currentEntrySize = 0;
+ TInt currentBytesTrans = 0;
+ err = iMtmStore->ClaimMtmUiL(uid).GetProgress(
+ prog,
+ retString,
+ totalEntryCount,
+ entriesDone,
+ currentEntrySize,
+ currentBytesTrans);
+ iMtmStore->ReleaseMtmUi(uid);
+ }
+ }
+ }
+ }
+ if(iOperation)
+ {
+ delete iOperation;
+ iOperation = NULL;
+ }
+ User::LeaveIfError(err); // Caught in RunL()
+
+ switch(iState)
+ {
+ case EStateIdle:
+ case EStateCreateNew:
+ LaunchEditorL();
+ break;
+ case EStateDeleteAll:
+ CreateMessageL( ETrue );
+ break;
+ case EStateLaunch:
+ case EStateWait:
+ CreateMessageL();
+ break;
+ case EStateCreate:
+ CompleteObserver();
+ break;
+ default:
+ break;
+ }
+ iMtm = (iOperation) ? (iOperation->Mtm()) : (KUidMsvLocalServiceMtm);
+ IMUM_OUT();
+ }
+
+// ----------------------------------------------------------------------------
+// CSmtpCreateNewOp
+// ----------------------------------------------------------------------------
+CSmtpCreateNewOp::CSmtpCreateNewOp(
+ CImumInternalApi& aMailboxApi,
+ TRequestStatus& aObserverRequestStatus,
+ const TEditorParameters& aParams,
+ const TDesC& aAppName)
+ :
+ CSmtpPreCreationOpBase(
+ aMailboxApi.MsvSession(), KNewMsgOpPriority, aObserverRequestStatus ),
+ iParams(aParams),
+ iAppName(aAppName)
+ {
+ IMUM_CONTEXT( CSmtpCreateNewOp::CSmtpCreateNewOp, 0, KImumMtmLog );
+ IMUM_IN();
+ IMUM_OUT();
+
+ }
+
+// ----------------------------------------------------------------------------
+// ConstructL
+// ----------------------------------------------------------------------------
+void CSmtpCreateNewOp::ConstructL(const TDesC8& aEditorProgress)
+ {
+ IMUM_CONTEXT( CSmtpCreateNewOp::ConstructL, 0, KImumMtmLog );
+ IMUM_IN();
+
+ CSmtpPreCreationOpBase::ConstructL();
+ iEditorProgress = aEditorProgress.AllocL();
+ if(iParams.iFlags & EMsgCreateMessageToService)
+ {
+ // Context sensitive service.
+ iService = iParams.iId;
+ }
+ else
+ {
+ iService = MsvUiServiceUtilitiesInternal::DefaultServiceForMTML(
+ iMsvSession, KUidMsgTypeSMTP, ETrue);
+ }
+ iStatus = KRequestPending;
+ SetActive();
+ CompleteThis();
+ iState = EStateIdle;
+ IMUM_OUT();
+ }
+
+// ----------------------------------------------------------------------------
+// LaunchEditorL
+// ----------------------------------------------------------------------------
+void CSmtpCreateNewOp::LaunchEditorL()
+ {
+ IMUM_CONTEXT( CSmtpCreateNewOp::LaunchEditorL, 0, KImumMtmLog );
+ IMUM_IN();
+
+ TMsvId id = iPreCreate->FindPreCreatedEmailL(iService, KMsvNullIndexEntryId);
+ if(id != KMsvNullIndexEntryId)
+ {
+ // Adjust editor parameters for editing existing message.
+ iParams.iFlags &= ~(EMsgCreateNewMessage | EMsgCreateMessageToService);
+ iParams.iFlags |= EMsgEditNewMessage;
+ iParams.iId = id;
+ }
+ iStatus = KRequestPending;
+ iOperation = NULL;
+
+ TRAPD( error, iOperation = MsgEditorLauncher::LaunchEditorApplicationL(
+ iMsvSession,
+ TUid::Uid( KSenduiMtmSmtpUidValue ),
+ iStatus,
+ iParams,
+ iAppName,
+ *iEditorProgress) );
+
+ if ( error == KErrNotFound && iState == EStateIdle )
+ {
+ // try to recover from the situation where precreated mail is corrupted.
+ iOperation = iPreCreate->DeleteAllPreCreatedEmailsL( iService, iStatus );
+ iState = EStateDeleteAll;
+ }
+ else
+ {
+ if ( error != KErrNone )
+ {
+ User::Leave( KErrCancel );
+ }
+ iState = EStateLaunch;
+ }
+
+ SetActive();
+ IMUM_OUT();
+ }
+
+// ----------------------------------------------------------------------------
+// WaitL
+// ----------------------------------------------------------------------------
+void CSmtpCreateNewOp::WaitL()
+ {
+ IMUM_CONTEXT( CSmtpCreateNewOp::WaitL, 0, KImumMtmLog );
+ IMUM_IN();
+
+ iStatus = KRequestPending;
+ CSmtpTimerOp* op = new(ELeave) CSmtpTimerOp(
+ iMailboxApi->MsvSession(), CActive::EPriorityIdle, iStatus);
+ CleanupStack::PushL(op);
+ op->ConstructL();
+ op->After(TTimeIntervalMicroSeconds32(KIntervalAfterEditorLaunch));
+ CleanupStack::Pop(op);
+ iOperation = op;
+ SetActive();
+ iState = EStateWait;
+ IMUM_OUT();
+ }
+
+// ----------------------------------------------------------------------------
+// CreateMessageL
+// ----------------------------------------------------------------------------
+void CSmtpCreateNewOp::CreateMessageL( TBool aLaunchEditorAfterCreate /*= EFalse*/ )
+ {
+ IMUM_CONTEXT( CSmtpCreateNewOp::CreateMessageL, 0, KImumMtmLog );
+ IMUM_IN();
+
+ // Only create if there isn't a message there already.
+ iStatus = KRequestPending;
+ if(iPreCreate->FindPreCreatedEmailL(iService, iParams.iId) == KMsvNullIndexEntryId)
+ {
+ iOperation = iPreCreate->PreCreateBlankEmailL(iService, iStatus);
+ }
+ else
+ {
+ CompleteThis();
+ }
+ SetActive();
+ iState = aLaunchEditorAfterCreate ? EStateCreateNew: EStateCreate;
+ IMUM_OUT();
+ }
+
+// End of File