diff -r ebe688cedc25 -r 7fdbb852d323 email/imum/Mtms/Src/EmailPreCreation.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/email/imum/Mtms/Src/EmailPreCreation.cpp Wed Sep 01 12:31:54 2010 +0100 @@ -0,0 +1,314 @@ +/* +* 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: +* Class implementation file +* +*/ + +#include +#include +#include +#include +#include +#include // mtm uids +#include + +#include "ImumMtmLogging.h" +#include "EmailPreCreation.h" +#include "EmailUtils.H" +#include "ImumMboxSettingsUtils.h" + +const TMsvId KPreCreatedMsgFolderId = KMsvDraftEntryId; +const TInt KPreCreateMsgCreatorPriority = ( CActive::EPriorityLow + 1 ); + +// ---------------------------------------------------------------------------- +// CEmailPreCreation::NewL() +// ---------------------------------------------------------------------------- +// +CEmailPreCreation* CEmailPreCreation::NewL( CImumInternalApi& aMailboxApi ) + { + IMUM_STATIC_CONTEXT( CEmailPreCreation::NewL, 0, mtm, KImumMtmLog ); + IMUM_IN(); + + CEmailPreCreation* me = new ( ELeave ) CEmailPreCreation( aMailboxApi ); + CleanupStack::PushL(me); + me->ConstructL(); + CleanupStack::Pop(); + IMUM_OUT(); + return me; + } + +// ---------------------------------------------------------------------------- +// CEmailPreCreation::~CEmailPreCreation() +// ---------------------------------------------------------------------------- +// +CEmailPreCreation::~CEmailPreCreation() + { + IMUM_CONTEXT( CEmailPreCreation::~CEmailPreCreation, 0, KImumMtmLog ); + IMUM_IN(); + + delete iEntry; + iEntry = NULL; + IMUM_OUT(); + } + +// --------------------------------------------------------------------------- +// CEmailPreCreation::CEmailPreCreation() +// --------------------------------------------------------------------------- +// +CEmailPreCreation::CEmailPreCreation( CImumInternalApi& aMailboxApi ) + : + iMailboxApi( aMailboxApi ) + { + IMUM_CONTEXT( CEmailPreCreation::CEmailPreCreation, 0, KImumMtmLog ); + IMUM_IN(); + IMUM_OUT(); + + } + + +// ---------------------------------------------------------------------------- +// CEmailPreCreation::PreCreateBlankEmailL() +// ---------------------------------------------------------------------------- +// +CMsvOperation* CEmailPreCreation::PreCreateBlankEmailL( + TMsvId aServiceId, + TRequestStatus& aStatus ) + { + IMUM_CONTEXT( CEmailPreCreation::PreCreateBlankEmailL, 0, KImumMtmLog ); + IMUM_IN(); + + const TMsvPartList partList = + ( KMsvMessagePartBody | KMsvMessagePartAttachments ); + TMsvEmailTypeList type = KMsvEmailTypeListInvisibleMessage; + if(ServiceUsesMHTMLEncodingL(aServiceId)) + { + type |= KMsvEmailTypeListMHTMLMessage; + } + aStatus = KRequestPending; + IMUM_OUT(); + + return CImEmailOperation::CreateNewL( + aStatus, + iEntry->Session(), + KPreCreatedMsgFolderId, + aServiceId, + partList, + type, + KUidMsgTypeSMTP, + KPreCreateMsgCreatorPriority); + } + + +// ---------------------------------------------------------------------------- +// CEmailPreCreation::DeleteAllPreCreatedEmailsL() +// ---------------------------------------------------------------------------- +// +void CEmailPreCreation::DeleteAllPreCreatedEmailsL( + TMsvId aServiceId ) + { + IMUM_CONTEXT( CEmailPreCreation::DeleteAllPreCreatedEmailsL, 0, KImumMtmLog ); + IMUM_IN(); + + CMsvEntrySelection* sel = new(ELeave) CMsvEntrySelection; + CleanupStack::PushL(sel); + + if(iEntry->EntryId() != KPreCreatedMsgFolderId) + { + iEntry->SetEntryL(KPreCreatedMsgFolderId); + } + // Search children for invisible messages which match service id. + TInt child = iEntry->Count(); + while(child--) + { + const TMsvEntry& entry = (*iEntry)[child]; + if( (!entry.Visible()) && (entry.iServiceId == aServiceId) ) + { + sel->AppendL(entry.Id()); + } + } + + if(sel->Count()) + { + // Do deletion synchronously so that we can guarantee that the + // Email editor will not be launched with a message which + // we are about to delete. + TMsvLocalOperationProgress opProgress; + iEntry->DeleteL(*sel, opProgress); + } + + CleanupStack::PopAndDestroy(sel); + + DeleteEmailWithoutServiceL(); + IMUM_OUT(); + } + +// ---------------------------------------------------------------------------- +// CEmailPreCreation::DeleteAllPreCreatedEmailsL() +// ---------------------------------------------------------------------------- +// +CMsvOperation* CEmailPreCreation::DeleteAllPreCreatedEmailsL( + TMsvId aServiceId, + TRequestStatus& aStatus) + { + IMUM_CONTEXT( CEmailPreCreation::DeleteAllPreCreatedEmailsL, 0, KImumMtmLog ); + IMUM_IN(); + + // Do deletion synchronously so that we can guarantee that the + // Email editor will not be launched with a message which + // we are about to delete. + DeleteAllPreCreatedEmailsL( aServiceId ); + + CMsvOperation* op = CMsvCompletedOperation::NewL( + iEntry->Session(), KUidMsvLocalServiceMtm, KNullDesC8, + KMsvLocalServiceIndexEntryId, aStatus); + IMUM_OUT(); + return op; + } + + +// ---------------------------------------------------------------------------- +// CEmailPreCreation::FindPreCreatedEmailL() +// ---------------------------------------------------------------------------- +// +TMsvId CEmailPreCreation::FindPreCreatedEmailL( + TMsvId aServiceId, + TMsvId aExclude) + { + IMUM_CONTEXT( CEmailPreCreation::FindPreCreatedEmailL, 0, KImumMtmLog ); + IMUM_IN(); + + TMsvId ret = KMsvNullIndexEntryId; + if(iEntry->EntryId() != KPreCreatedMsgFolderId) + { + iEntry->SetEntryL(KPreCreatedMsgFolderId); + } + // Search children for invisible messages which match service id. + TInt child = iEntry->Count(); + while(child--) + { + TMsvEntry entry = (*iEntry)[child]; + if( (!entry.Visible()) && + (!entry.InPreparation()) && + (entry.iServiceId == aServiceId) && + (entry.Id() != aExclude) ) + { + ret = entry.Id(); + // set InPreparation flag + iEntry->SetEntryL( ret ); + entry.SetInPreparation( ETrue ); + iEntry->ChangeL( entry ); + break; + } + } + IMUM_OUT(); + return ret; + } + + +// ---------------------------------------------------------------------------- +// CEmailPreCreation::ConstructL() +// ---------------------------------------------------------------------------- +// +void CEmailPreCreation::ConstructL() + { + IMUM_CONTEXT( CEmailPreCreation::ConstructL, 0, KImumMtmLog ); + IMUM_IN(); + + TMsvSelectionOrdering ordering; + ordering.SetShowInvisibleEntries(ETrue); + iEntry = CMsvEntry::NewL( + iMailboxApi.MsvSession(), KPreCreatedMsgFolderId, ordering ); + IMUM_OUT(); + } + + +// ---------------------------------------------------------------------------- +// CEmailPreCreation::ServiceUsesMHTMLEncodingL() +// ---------------------------------------------------------------------------- +// +TBool CEmailPreCreation::ServiceUsesMHTMLEncodingL( TMsvId aServiceId ) + { + IMUM_CONTEXT( CEmailPreCreation::ServiceUsesMHTMLEncodingL, 0, KImumMtmLog ); + IMUM_IN(); + + CImumInSettingsData* accountsettings = + iMailboxApi.MailboxServicesL().LoadMailboxSettingsL( + aServiceId ); + CleanupStack::PushL( accountsettings ); + + TInt encoding = ImumMboxSettingsUtils::QuickGetL( + *accountsettings, + TImumInSettings::EKeyDefaultMsgCharSet ); + + CleanupStack::PopAndDestroy( accountsettings ); + accountsettings = NULL; + IMUM_OUT(); + + return ( encoding == TImumInSettings::EValueEncodingMHtmlAsMime ) || + ( encoding == TImumInSettings::EValueEncodingMHtmlAltAsMime ); + } + + +// ---------------------------------------------------------------------------- +// CEmailPreCreation::DeleteEmailWithoutServiceL() +// ---------------------------------------------------------------------------- +// +void CEmailPreCreation::DeleteEmailWithoutServiceL() + { + IMUM_CONTEXT( CEmailPreCreation::DeleteEmailWithoutServiceL, 0, KImumMtmLog ); + IMUM_IN(); + + CMsvEntrySelection* smtpServices = + MsvUiServiceUtilities::GetListOfAccountsWithMTML( + iEntry->Session(), + KSenduiMtmSmtpUid, + ETrue ); + CleanupStack::PushL( smtpServices ); + + CMsvEntrySelection* sel = new(ELeave) CMsvEntrySelection; + CleanupStack::PushL( sel ); + + if(iEntry->EntryId() != KPreCreatedMsgFolderId) + { + iEntry->SetEntryL( KPreCreatedMsgFolderId ); + } + // Search children for invisible email messages which service not found + TInt child = iEntry->Count(); + while(child--) + { + const TMsvEntry& entry = (*iEntry)[child]; + if( !entry.Visible() && + entry.iMtm == KSenduiMtmSmtpUid && + smtpServices->Find( entry.iServiceId ) == KErrNotFound ) + { + sel->AppendL(entry.Id()); + } + } + + if(sel->Count()) + { + // Do deletion synchronously so that we can guarantee that the + // Email editor will not be launched with a message which we + // are about to delete. + TMsvLocalOperationProgress opProgress; + iEntry->DeleteL(*sel, opProgress); + } + + CleanupStack::PopAndDestroy( 2, smtpServices ); // CSI: 47 # sel, smtpServices. + IMUM_OUT(); + } + +// End of File +