emailuis/emailui/sendasmtm/fsmtms/client/src/cfsclientmtm.cpp
changeset 0 8466d47a6819
child 8 e1b6206813b4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailuis/emailui/sendasmtm/fsmtms/client/src/cfsclientmtm.cpp	Thu Dec 17 08:39:21 2009 +0200
@@ -0,0 +1,940 @@
+/*
+* Copyright (c) 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:  Implementation of the class CFsMtmClient.
+*
+*/
+
+
+// INCLUDE FILES
+#include "emailtrace.h"
+#include <txtrich.h>
+#include <msvids.h>
+
+#ifndef FF_CMAIL_INTEGRATION
+#include <mtmuidsdef.hrh>
+#endif // FF_CMAIL_INTEGRATION
+
+#include <mtmdef.h>
+#include <msvuids.h>
+#include <bautils.h>
+#include <featmgr.h>
+
+
+#include <centralrepository.h>
+#include "FreestyleEmailCenRepKeys.h"
+#include <MeetingRequestIds.hrh>
+#include "cfssendashelper.h"
+#include "fsmtmsconstants.h"
+#include "cfsclientmtm.h"
+
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::NewL
+// Factory function. This will be called by messaging frame work while
+// creating client side MTM. The ordinal of this function is assigned to
+// entry_point in fsmtms.rss file. The ordinal can be found in
+// FsClientMtmU.DEF
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CFsMtmClient* CFsMtmClient::NewL(
+    CRegisteredMtmDll& aRegisteredMtmDll, CMsvSession& aMsvSession)
+    {
+    FUNC_LOG;
+
+    CFsMtmClient* self = new (ELeave) CFsMtmClient( aRegisteredMtmDll,
+        aMsvSession );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self ); //SCANNER
+
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::CFsMtmClient
+// ---------------------------------------------------------------------------
+//
+CFsMtmClient::CFsMtmClient( CRegisteredMtmDll& aRegisteredMtmDll,
+    CMsvSession& aMsvSession ):CBaseMtm( aRegisteredMtmDll, aMsvSession )
+    {
+    FUNC_LOG;
+    }
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CFsMtmClient::ConstructL()
+    {
+    FUNC_LOG;
+
+    SwitchCurrentEntryL( KMsvRootIndexEntryId );
+    iSendAsHelper = CFsSendAsHelper::NewL();
+
+    // Check configuration status of "email attached in email" from cenrep
+    // and set flag according to that.
+    CRepository* repository = NULL;
+    TRAPD( ret, repository = CRepository::NewL( KFreestyleEmailCenRep ) );
+    if ( ret == KErrNone )
+    	{
+        CleanupStack::PushL( repository );
+    	TInt rval = KErrNone;
+    	TInt hidefeature = 0;
+        rval = repository->Get( KEmailHideFS205UIFeature, hidefeature );
+        if( rval == KErrNone && hidefeature == EFalse )
+        	{
+        	iEmailAttachedInEmail = ETrue;
+        	iActiveSchedulerWait = CMsvOperationActiveSchedulerWait::NewLC();
+			CleanupStack::Pop(); // iActiveSchedulerWait
+        	}
+        CleanupStack::PopAndDestroy( repository );
+    	}
+    }
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::~CFsMtmClient
+// ---------------------------------------------------------------------------
+//
+CFsMtmClient::~CFsMtmClient()
+    {
+    FUNC_LOG;
+
+    delete iAccountEntry;
+    delete iSendAsHelper;
+
+    if ( iEmailAttachedInEmail )
+    	{
+	    delete iActiveSchedulerWait;
+    	}
+    }
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::AddAddresseeL
+// ---------------------------------------------------------------------------
+//
+void CFsMtmClient::AddAddresseeL( const TDesC& aRealAddress )
+    {
+    FUNC_LOG;
+
+    TRAPD( err, iSendAsHelper->AddRecipientL( aRealAddress, KNullDesC,
+        EMsvRecipientTo ) );
+    if( err != KErrNone )
+        {
+        }
+
+    }
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::AddAddresseeL
+// ---------------------------------------------------------------------------
+//
+void CFsMtmClient::AddAddresseeL( const TDesC& aRealAddress,
+    const TDesC& aAlias )
+    {
+    FUNC_LOG;
+
+    TRAPD( err, iSendAsHelper->AddRecipientL( aRealAddress, aAlias,
+        EMsvRecipientTo ) );
+    if( err != KErrNone )
+        {
+        }
+
+    }
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::AddAddresseeL
+// ---------------------------------------------------------------------------
+//
+void CFsMtmClient::AddAddresseeL( TMsvRecipientType aType,
+    const TDesC& aRealAddress )
+    {
+    FUNC_LOG;
+
+    TRAPD( err, iSendAsHelper->AddRecipientL( aRealAddress, KNullDesC, aType ) );
+    if( err != KErrNone )
+        {
+        }
+
+    }
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::AddAddresseeL
+// ---------------------------------------------------------------------------
+//
+void CFsMtmClient::AddAddresseeL( TMsvRecipientType aType,
+    const TDesC& aRealAddress, const TDesC& aAlias )
+    {
+    FUNC_LOG;
+
+    TRAPD( err, iSendAsHelper->AddRecipientL( aRealAddress, aAlias, aType ) );
+    if( err != KErrNone )
+        {
+        }
+
+    }
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::RemoveAddressee
+// ---------------------------------------------------------------------------
+//
+void CFsMtmClient::RemoveAddressee(TInt /*aIndex*/)
+    {
+    FUNC_LOG;
+
+    }
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::CFsMtmClient
+// Store entry data. If it is a service entry, store the current settings.
+// Otherwise it has to be a message.
+// ---------------------------------------------------------------------------
+//
+void CFsMtmClient::SaveMessageL()
+    {
+    FUNC_LOG;
+    
+    HBufC* buf = HBufC::NewL( Body().DocumentLength() );
+    CleanupStack::PushL( buf );
+    TPtr ptr = buf->Des(); 
+    Body().Extract( ptr, 0 );
+    // INFO : By default the body will have x2029, so checking for > 1
+    if ( ptr.Length() > 0 )
+        {
+        iSendAsHelper->SetBodyL( ptr );
+        }
+    CleanupStack::PopAndDestroy(buf);    
+
+    // Save the message
+    iAccountId = iMsvEntry->Entry().iServiceId;
+    delete iAccountEntry;
+    iAccountEntry = NULL;
+    iAccountEntry = CMsvEntry::NewL( Session(), iAccountId,
+        TMsvSelectionOrdering( KMsvNoGrouping, EMsvSortByNone,
+        ETrue ));
+
+    TUint pluginId = iAccountEntry->Entry().MtmData1();
+    TUint id = iAccountEntry->Entry().MtmData2();
+    iSendAsHelper->StoreDataL(pluginId, id);
+    }
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::LoadMessageL
+// Restore entry data Operation inverse to StoreL
+// ---------------------------------------------------------------------------
+//
+void CFsMtmClient::LoadMessageL()
+    {
+    FUNC_LOG;
+
+    }
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::ReplyL
+// Not supported
+// ---------------------------------------------------------------------------
+//
+CMsvOperation* CFsMtmClient::ReplyL (TMsvId /*aReplyEntryId*/,
+    TMsvPartList /*aPartlist*/, TRequestStatus& /*aCompletionStatus*/ )
+    {
+    FUNC_LOG;
+
+    User::Leave( KErrNotSupported );
+
+    return NULL; //To statisfy the compiler
+    }
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::ReplyL
+// Not supported
+// ---------------------------------------------------------------------------
+//
+CMsvOperation* CFsMtmClient::ForwardL( TMsvId /*aReplyEntryId*/,
+    TMsvPartList /*aPartlist*/, TRequestStatus& /*aCompletionStatus*/ )
+    {
+    FUNC_LOG;
+
+    User::Leave( KErrNotSupported );
+
+    return NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::ValidateMessage
+// Not supported
+// Message validation
+// The only thing about the message that can be invalid
+// is the iDescription, which should be an acceptable file name. So, length isn't
+// allowed to be zero, and backslashes are not allowed in iDescription.
+// ---------------------------------------------------------------------------
+//
+TMsvPartList CFsMtmClient::ValidateMessage( TUint /*aPartlist*/ )
+    {
+    FUNC_LOG;
+
+    return 0; //SCANNER
+    }
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::Find
+// Not supported
+// ---------------------------------------------------------------------------
+//
+TMsvPartList CFsMtmClient::Find( const TDesC& /*aTextToFind*/,
+    TMsvPartList /*aPartlist*/ )
+    {
+    FUNC_LOG;
+
+    return 0;
+    }
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::QueryCapability
+// ---------------------------------------------------------------------------
+//
+TInt CFsMtmClient::QueryCapability( TUid aCapability, TInt& aResponse )
+    {
+    FUNC_LOG;
+
+    TInt error = KErrNone;
+    switch ( aCapability.iUid )
+        {
+        case KUidMtmQueryMaxBodySizeValue:
+        case KUidMtmQueryMaxTotalMsgSizeValue:
+            aResponse = KMaxTInt;
+            break;
+
+        case KUidMtmQuerySupportedBodyValue:
+            aResponse = KMtm7BitBody + KMtm8BitBody + KMtm16BitBody +
+                KMtmBinaryBody;
+            break;
+
+        case KUidMtmQuerySupportAttachmentsValue:
+        case KUidMtmQueryCanSendMsgValue:
+            aResponse = ETrue;
+            break;
+        // Required to make MTM support the MR
+        case KMtmUiSupportMeetingRequest:
+            aResponse = ETrue;
+            break;
+        default:
+            error = KErrNotSupported;
+        }
+    return error;
+    }
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::SetSubjectL
+// Sets the message context's subject text
+// ---------------------------------------------------------------------------
+//
+void CFsMtmClient::SetSubjectL(const TDesC& aSubject)
+    {
+    FUNC_LOG;
+    TRAPD( err, iSendAsHelper->SetSubjectL( aSubject) );
+    if ( err != KErrNone )
+        {
+        }
+}
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::AddAttachmentL
+// ---------------------------------------------------------------------------
+//
+void  CFsMtmClient::AddAttachmentL(const TDesC& aFilePath,
+    const TDesC8& aMimeType, TUint aCharset, TRequestStatus& aStatus)
+    {
+    FUNC_LOG;
+
+    TRAPD( err,
+    {
+        iSendAsHelper->AddAttachmentL(aFilePath, aMimeType, aCharset );
+    });
+
+    if ( err != KErrNone )
+        {
+        }
+    //Complete ourselves immediately.
+    TRequestStatus* status = &aStatus;
+    User::RequestComplete( status, KErrNone );
+
+    }
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::AddAttachmentL
+// ---------------------------------------------------------------------------
+//
+void CFsMtmClient::AddAttachmentL(RFile& aFile, const TDesC8& aMimeType,
+    TUint aCharset, TRequestStatus& aStatus)
+    {
+    FUNC_LOG;
+    iSendAsHelper->AddAttachmentL(aFile, aMimeType, aCharset );
+
+    //Complete ourselves immediately.
+    TRequestStatus* status = &aStatus;
+    User::RequestComplete( status, KErrNone );
+
+    }
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::AddLinkedAttachmentL
+// ---------------------------------------------------------------------------
+//
+void CFsMtmClient::AddLinkedAttachmentL(const TDesC& aFilePath,
+    const TDesC8& aMimeType, TUint aCharset, TRequestStatus& aStatus )
+    {
+    FUNC_LOG;
+    iSendAsHelper->AddAttachmentL(aFilePath, aMimeType, aCharset );
+    //Complete ourselves immediately.
+    TRequestStatus* status = &aStatus;
+    User::RequestComplete( status, KErrNone );
+    }
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::AddEntryAsAttachmentL
+// ---------------------------------------------------------------------------
+//
+void CFsMtmClient::AddEntryAsAttachmentL(TMsvId /*aAttachmentId*/,
+    TRequestStatus& /*aStatus*/)
+    {
+    FUNC_LOG;
+
+    User::Leave( KErrNotSupported );
+
+    }
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::CreateAttachmentL
+// ---------------------------------------------------------------------------
+//
+void CFsMtmClient::CreateAttachmentL( const TDesC& /*aFileName*/,
+        RFile& /*aAttachmentFile*/, const TDesC8& /*aMimeType*/,
+        TUint /*aCharset*/, TRequestStatus& /*aStatus*/)
+    {
+    FUNC_LOG;
+    }
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::InvokeSyncFunctionL
+// Call MTM-specific operation synchronously
+// ---------------------------------------------------------------------------
+//
+void CFsMtmClient::InvokeSyncFunctionL( TInt aFunctionId,
+    const CMsvEntrySelection& aSelection, TDes8& aParameter )
+    {
+    FUNC_LOG;
+    if ( aFunctionId == KMTMMailAddressRequestFunctionId &&
+        ( &aSelection )->Count() > 0 ) //SCANNER
+        {
+        CMsvEntry* root = CMsvEntry::NewL( Session(), KMsvRootIndexEntryId,
+            TMsvSelectionOrdering( KMsvNoGrouping, EMsvSortByNone, ETrue ) );
+        CleanupStack::PushL( root );
+        root->SetEntryL( ( &aSelection )->At( 0 ) );
+        // aParameter =
+        aParameter.Copy( root->Entry().iDescription );
+        CleanupStack::PopAndDestroy( root );
+        }
+
+    else if ( iEmailAttachedInEmail &&
+    		( aFunctionId == KEasEmailMTMAddEmailAttachment ||
+    		  aFunctionId == KEasEmailMTMDeleteEntry ) )
+        {
+   		TInt error = KErrNone;
+		CMsvOperation* operation = InvokeAsyncFunctionL( aFunctionId, aSelection, aParameter, iActiveSchedulerWait->iStatus );
+		if ( operation )
+    		{
+			iActiveSchedulerWait->Start();
+			// for now, the iStatus.Int contains the new entry ID in mtm
+			iMTMAttachmentId = iActiveSchedulerWait->iStatus.Int();
+			if ( iMTMAttachmentId <= 0 )
+                {
+                error = iActiveSchedulerWait->iStatus.Int();
+                }
+			else
+                {
+                error = KErrNone;
+                }
+
+			delete operation;
+		    }
+		else
+		    {
+			error = KErrNotSupported;
+		    }
+
+		User::LeaveIfError( error );
+    	}
+    else
+        {
+        User::Leave( KErrNotSupported );
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::InvokeAsyncFunctionL
+// Call MTM-specific operation asynchronously
+// ---------------------------------------------------------------------------
+//
+CMsvOperation* CFsMtmClient::InvokeAsyncFunctionL(
+    TInt aFunctionId,
+    const CMsvEntrySelection &aSelection,
+    TDes8 &aParameter,
+    TRequestStatus &aCompletionStatus)
+    {
+    FUNC_LOG;
+
+	if ( iEmailAttachedInEmail )
+		{
+	    CMsvOperation* operation = 0;
+	    if ( aFunctionId == KMTMStandardFunctionsSendMessage )
+		    {
+		    operation = CMsvCompletedOperation::NewL( Session(), Type(), KNullDesC8, iAccountId, aCompletionStatus );
+	        }
+	    else if ( ( aFunctionId >= 0 ) && ( aFunctionId < KEasEmailMTMLastCommand ) )
+	        {
+			operation = Session().TransferCommandL( aSelection, aFunctionId, aParameter, aCompletionStatus );
+			}
+		return operation;
+		}
+	else
+		{
+	    User::Leave( KErrNotSupported );
+		}
+
+	return NULL;
+    }
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::ContextEntrySwitched
+// Called by the base class functions SwitchCurrentEntryL() and
+// SetCurrentEntryL() when the context is changed to another entry.
+// Implementation should clear iAddresseeList & any MTM specific cache.
+// ---------------------------------------------------------------------------
+//
+void CFsMtmClient::ContextEntrySwitched()
+    {
+    FUNC_LOG;
+    }
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::RemoveRedundantAccountsL
+// This function is called by FS Email server every time an instance of
+// mailserver is started. This function removes redundant mail boxes.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CFsMtmClient::RemoveRedundantAccountsL(RArray<TFSMailMsgId>& aMailBoxIds)
+	{
+    FUNC_LOG;
+
+	// Get S60 mailboxes
+	CMsvEntry* root = CMsvEntry::NewL( Session(), KMsvRootIndexEntryId,
+	       TMsvSelectionOrdering( KMsvNoGrouping, EMsvSortByNone, ETrue ) );
+	CleanupStack::PushL( root );
+
+	// Go through MsvEntries and delete account if corresponding
+	// FS account doesn't exist.
+
+	CMsvEntrySelection* childSelection = root->ChildrenWithMtmL(
+	       KUidMsgValTypeFsMtmVal );
+	CleanupStack::PushL( childSelection );
+	for ( TInt i = 0; i < childSelection->Count(); i++ )
+	    {
+	    TBool accountExistsInFS = EFalse;
+	    root->SetEntryL( childSelection->At( i ) );
+	    TUint pluginId = root->Entry().MtmData1();
+	    TUint mailboxId = root->Entry().MtmData2();
+
+	    // Go through FS mailboxes and check if box is in there
+	    for(TInt j = 0; j < aMailBoxIds.Count(); j++ )
+	    	{
+	    	TUint FSid = aMailBoxIds[j].Id();
+	    	if( FSid == mailboxId )
+	    		{
+	    		accountExistsInFS = ETrue;
+	    	    break;
+	    	    }
+	    }
+
+	    // Remove if not found
+	    if( !accountExistsInFS )
+	    	{
+	    	TFSMailMsgId accountId(pluginId, mailboxId);
+	    	User::LeaveIfError( DeleteAccountL( KNullDesC, accountId ) );
+	        }
+	    }
+
+	CleanupStack::PopAndDestroy( childSelection );
+	CleanupStack::PopAndDestroy( root );
+
+	return KErrNone;
+
+	}
+// ---------------------------------------------------------------------------
+// CFsMtmClient::CreateAccountL
+// This functions will be called by FS Email server every time a FS account is
+// is created. For every FS account one MTM account will be created.
+// ---------------------------------------------------------------------------
+//
+TInt CFsMtmClient::CreateAccountL(const TDesC& aAccountName,
+	const TDesC& aOwnAddress, TFSMailMsgId aMsgId)
+    {
+    FUNC_LOG;
+
+    HBufC* accountName = aAccountName.AllocL();
+    // +accountName
+    CleanupStack::PushL( accountName );
+    HBufC* ownAddress = aOwnAddress.AllocL();
+    // +ownAddress
+    CleanupStack::PushL( ownAddress );
+
+    // First phase - create Freestyle account
+    CMsvEntry* root = CMsvEntry::NewL( Session(), KMsvRootIndexEntryId,
+           TMsvSelectionOrdering( KMsvNoGrouping, EMsvSortByNone, ETrue ) );
+    // +root
+    CleanupStack::PushL( root );
+
+    // Check if account Already exists with this name
+    TBool accountExitsAlready = EFalse;
+    TMsvEntry newAccount;
+    CMsvEntrySelection* childSelection = root->ChildrenWithMtmL(
+           KUidMsgValTypeFsMtmVal );
+    // childSelection
+    CleanupStack::PushL( childSelection );
+    for ( TInt i = 0; i < childSelection->Count(); i++ )
+        {
+        root->SetEntryL( childSelection->At( i ) );
+        TUint pluginId = root->Entry().MtmData1();
+        TUint mailboxId = root->Entry().MtmData2();
+        // Plugin id and Mailbox id are used instead of account name check
+        // because names does not match in case of branded mailbox
+        if ( pluginId == aMsgId.PluginId().iUid && mailboxId == aMsgId.Id() )
+            {
+            // newAccount = root->Entry();
+            iAccountId = root->Entry().Id();
+            accountExitsAlready = ETrue;
+            break;
+            }
+        }
+    if ( !accountExitsAlready )
+        {
+        root->SetEntryL( KMsvRootIndexEntryId );
+        newAccount.iMtm = KUidMsgValTypeFsMtmVal;
+        newAccount.iType = KUidMsvServiceEntry;
+        newAccount.iServiceId = KMsvNullIndexEntryId;
+        newAccount.iDate.HomeTime();
+        newAccount.iDetails.Set( *accountName );
+        newAccount.iDescription.Set( *ownAddress );
+
+        TUid pluginId = aMsgId.PluginId();
+        TUint id = aMsgId.Id();
+        // Store the plugin id and mailbox id.
+        newAccount.iMtmData1 = pluginId.iUid;
+        newAccount.iMtmData2 = id;
+
+        FeatureManager::InitializeLibL();
+        if (FeatureManager::FeatureSupported(KFeatureIdEmailMceIntegration))
+        	{
+            newAccount.SetVisible( ETrue );
+        	}
+        else
+        	{
+        	newAccount.SetVisible( EFalse );
+        	}
+        FeatureManager::UnInitializeLib();
+
+        root->CreateL( newAccount );
+        iAccountId = newAccount.Id();
+        root->SetEntryL( iAccountId );
+
+        this->ChangeDefaultServiceL( iAccountId );
+        }
+    //  accountName, ownAddress, root, childSelection
+    CleanupStack::PopAndDestroy( childSelection ); //SCANNER
+    CleanupStack::PopAndDestroy( root );
+    CleanupStack::PopAndDestroy( ownAddress );
+    CleanupStack::PopAndDestroy( accountName );
+
+    delete iAccountEntry;
+    iAccountEntry = NULL;
+    iAccountEntry = CMsvEntry::NewL( Session(), iAccountId,
+        TMsvSelectionOrdering( KMsvNoGrouping, EMsvSortByNone, ETrue ) );
+    SwitchCurrentEntryL( iAccountId );
+    return KErrNone;
+}
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::DeleteAccountL
+// This functions will be called by FS Email server every time a FS account is
+// deleted. For every FS account one MTM account will be existing.
+// Remove unused parameter aAccountName
+// ---------------------------------------------------------------------------
+//
+
+TInt CFsMtmClient::DeleteAccountL(const TDesC& aAccountName,
+    TFSMailMsgId aMsgId)
+    {
+    FUNC_LOG;
+    iAccountId = NULL;
+    // Set iAccountId and iAccountEntry with proper values
+    SetTMsvIdsL( aAccountName, aMsgId );
+    // Its done in this way because, else there will be panic MSGS:294 while doing
+    // iMsvEntry->DeleteL operation.
+    iMsvEntry->SetEntryL( KMsvRootIndexEntryId );
+    if( iAccountId )
+        {
+        delete iAccountEntry;
+        iAccountEntry = NULL;
+        iMsvEntry->DeleteL( iAccountId );
+        }
+
+    // Reset the AccountId to Null so that future calls to the
+    // SetTMsvIdsL will create the account.
+    iAccountId = NULL;
+
+    return KErrNone;
+}
+
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::RenameAccountL
+// This functions will be called by FS Email server every time a FS account is
+// renamed. For every FS account one MTM account will be existing. The
+// existing is deleted and another account is created with different name.
+// ---------------------------------------------------------------------------
+//
+TInt CFsMtmClient::RenameAccountL( const TDesC& aAccountNewName,
+		const TDesC& aOwnAddress, TFSMailMsgId aMsgId)
+    {
+    FUNC_LOG;
+    CMsvEntry* root = CMsvEntry::NewL( Session(), KMsvRootIndexEntryId,
+        TMsvSelectionOrdering( KMsvNoGrouping, EMsvSortByNone, ETrue ) );
+
+    CleanupStack::PushL( root );
+
+    // Get Freestyle services.
+    CMsvEntrySelection* childSelection = root->ChildrenWithMtmL(
+            KUidMsgValTypeFsMtmVal );
+    CleanupStack::PushL( childSelection );
+
+    // Find Freestyle Service.
+    for( TInt i = 0; i < childSelection->Count(); i++ )
+        {
+        root->SetEntryL( childSelection->At( i ) );
+        if ( root->Entry().iMtmData1 == aMsgId.PluginId().iUid &&
+            root->Entry().iMtmData2 == aMsgId.Id())
+            {
+            TMsvEntry& tEntry = CONST_CAST( TMsvEntry&, root->Entry() );
+            if ( aAccountNewName != KNullDesC && tEntry.iDetails != aAccountNewName )
+           		{
+           	    // Operation is mailbox name change.
+           		// We end up here when TFSEventMailboxRenamed  event is received by server.
+                tEntry.iDetails.Set( *aAccountNewName.AllocL() );
+            	}
+            if ( aOwnAddress != KNullDesC && tEntry.iDescription != aOwnAddress )
+            	{
+            	// Operation is owner email address change.
+            	// We end up here when TFSEventMailboxSettingsChanged event is received by server.
+            	tEntry.iDescription.Set( *aOwnAddress.AllocL() );
+            	}
+            root->ChangeL( tEntry );
+            break;
+            }
+        }
+    CleanupStack::PopAndDestroy( childSelection );//SCANNER
+    CleanupStack::PopAndDestroy( root );
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::SetTMsvIdsL
+// Set the iAccountId and iAccountEntry to the entry that need to be deleted.
+// ---------------------------------------------------------------------------
+//
+void CFsMtmClient::SetTMsvIdsL(const TDesC& /*aAccountName*/,
+    TFSMailMsgId aMsgId)
+    {
+    FUNC_LOG;
+
+    CMsvEntry* root = CMsvEntry::NewL( Session(), KMsvRootIndexEntryId,
+        TMsvSelectionOrdering( KMsvNoGrouping, EMsvSortByNone, ETrue ) );
+
+    CleanupStack::PushL( root );
+
+    // Check if account Already exist
+    TMsvEntry newAccount;
+
+    // Get Freestyle services.
+    CMsvEntrySelection* childSelection = root->ChildrenWithMtmL(
+            KUidMsgValTypeFsMtmVal );
+    CleanupStack::PushL( childSelection );
+
+    // Find Freestyle Service.
+    for( TInt i = 0; i < childSelection->Count(); i++ )
+        {
+        root->SetEntryL( childSelection->At( i ) );
+
+        if ( root->Entry().iMtmData1 == aMsgId.PluginId().iUid &&
+                root->Entry().iMtmData2 == aMsgId.Id() )
+            {
+            // newAccount = root->Entry();
+            iAccountId = root->Entry().Id();
+            delete iAccountEntry;//SCANNER
+            iAccountEntry = NULL;
+            iAccountEntry = CMsvEntry::NewL( Session(), iAccountId,
+                TMsvSelectionOrdering( KMsvNoGrouping, EMsvSortByNone,
+                ETrue ));
+            break;
+            }
+        }
+
+    CleanupStack::PopAndDestroy( childSelection ); //SCANNER
+    CleanupStack::PopAndDestroy( root );
+}
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::AddEmailAsAttachmentL
+//
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CFsMtmClient::AddEmailAsAttachmentL( const TUint& aPluginId, const TDesC& aAttachmentPath,TMsvId& aNewAttachEntryId )
+    {
+    FUNC_LOG;
+
+	if ( iEmailAttachedInEmail )
+		{
+		TMsvId accountId;
+
+		// Get S60 mailboxes
+		CMsvEntry* root = CMsvEntry::NewL( Session(), KMsvRootIndexEntryId,
+		       TMsvSelectionOrdering( KMsvNoGrouping, EMsvSortByNone, ETrue ) );
+		CleanupStack::PushL( root );
+
+		// Go through MsvEntries
+		// FS account doesn't exist.
+		CMsvEntrySelection* childSelection = root->ChildrenWithMtmL(
+		       KUidMsgValTypeFsMtmVal );
+		CleanupStack::PushL( childSelection );
+		for ( TInt i = 0; i < childSelection->Count(); i++ )
+		    {
+
+		    root->SetEntryL( childSelection->At( i ) );
+		    TUint pluginId = root->Entry().MtmData1();
+
+		     //find mailbox id matching the pluginid
+		    if(pluginId==aPluginId)
+		        {
+		        //mailboxId = root->Entry().MtmData2();
+	 	        accountId =root->Entry().Id();
+	 	        break;
+		        }
+		    }
+
+		CleanupStack::PopAndDestroy( childSelection );
+		CleanupStack::PopAndDestroy( root );
+
+		//if KUidMsgValTypeFsMtmVal not found we leave
+	    if( accountId == 0 )
+	        {
+	        User::Leave( KErrNotFound );
+	        }
+
+		CMsvEntrySelection* selection = new ( ELeave ) CMsvEntrySelection();
+		CleanupStack::PushL( selection );
+		selection->AppendL( accountId );
+		selection->AppendL( accountId );
+
+		//Call command
+		TBuf8<256> tmp;
+		tmp.Copy( aAttachmentPath );
+
+		InvokeSyncFunctionL( KEasEmailMTMAddEmailAttachment, *selection, tmp ) ;
+
+		aNewAttachEntryId = iMTMAttachmentId;
+
+		CleanupStack::PopAndDestroy( selection ); // selection
+		}
+	else
+		{
+		User::Leave( KErrNotSupported );
+		}
+
+	return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CFsMtmClient::DeleteEmailAsAttachmentL
+//
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CFsMtmClient::DeleteEmailAsAttachmentL( const TMsvId aNewAttachEntryId   )
+    {
+    FUNC_LOG;
+
+	if ( iEmailAttachedInEmail )
+		{
+		TMsvId accountId;
+
+		// Get S60 mailboxes
+		CMsvEntry* root = CMsvEntry::NewL( Session(), KMsvRootIndexEntryId,
+		       TMsvSelectionOrdering( KMsvNoGrouping, EMsvSortByNone, ETrue ) );
+		CleanupStack::PushL( root );
+
+		// Go through MsvEntries
+		// FS account doesn't exist.
+		CMsvEntrySelection* childSelection = root->ChildrenWithMtmL(
+		       KUidMsgValTypeFsMtmVal );
+		CleanupStack::PushL( childSelection );
+		for ( TInt i = 0; i < childSelection->Count(); i++ )
+		    {
+		    root->SetEntryL( childSelection->At( i ) );
+		    TUint pluginId = root->Entry().MtmData1();
+
+		    // find mailbox id matching the pluginid
+		    if ( pluginId == 0x2000B020 )
+		     	{
+		    	//mailboxId = root->Entry().MtmData2();
+	 	    	accountId = root->Entry().Id();
+	 	      	break;
+		    	}
+		    }
+
+		CleanupStack::PopAndDestroy( childSelection );
+		CleanupStack::PopAndDestroy( root );
+
+		//if KUidMsgValTypeFsMtmVal not found we leave
+	    if ( accountId == 0 )
+	    	{
+	    	User::Leave( KErrNotFound );
+	    	}
+
+		CMsvEntrySelection* selection = new ( ELeave ) CMsvEntrySelection();
+		CleanupStack::PushL( selection );
+		selection->AppendL( accountId );
+		selection->AppendL( aNewAttachEntryId );
+
+		TPckgBuf<TBool> buf( ETrue );
+
+		// call command
+		InvokeSyncFunctionL( KEasEmailMTMDeleteEntry, *selection, buf );
+
+		CleanupStack::PopAndDestroy( selection );
+		}
+	else
+		{
+		User::Leave( KErrNotSupported );
+		}
+
+    return KErrNone;
+    }
+
+// End of file