emailuis/emailui/src/FreestyleEmailUiUtilities.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 07 Jan 2010 12:38:38 +0200
changeset 1 12c456ceeff2
parent 0 8466d47a6819
child 8 e1b6206813b4
permissions -rw-r--r--
Revision: 200951 Kit: 201001

/*
* 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 : General utilities for FS Email UI.
*
*/


#include "emailtrace.h"
#include <msvapi.h>
#include <msvids.h>
#include <eikenv.h>
#include <gulicon.h>
#include <SendUiConsts.h>
#include <MuiuMsvUiServiceUtilities.h>
#include <StringLoader.h>
#include <AknIconUtils.h>
#include <aknlists.h>
#include <aknPopup.h>
#include <AknGlobalConfirmationQuery.h>
#include <aknnotewrappers.h>
#include <AknWaitDialog.h>
#include <AknGlobalNote.h>
#include <commonphoneparser.h>
#include <apgcli.h> // RApaLsSession

#ifndef FF_CMAIL_INTEGRATION
#include <txtclipboard.h>
#endif // FF_CMAIL_INTEGRATION

// <cmail>
//#ifdef __SERIES60_32__
// </cmail>
#include <AiwDialDataTypes.h>
#include <AiwGenericParam.h>
#include <AiwServiceHandler.h>
#include <settingsinternalcrkeys.h>

// <cmail>
//#else
//#include <CPhCltDialer.h>
//#include <TPhCltExtPhoneDialData.h>
//#endif
// </cmail>

#include <aknPopup.h>
#include <AknCommonDialogsDynMem.h>
#include <CommonDialogs.rsg>
#include <pathinfo.h>
#include <AknIconArray.h>
#include <baclipb.h> // for clipboard copy
#include <DocumentHandler.h>
#include <bautils.h>

#include <sendui.h>			// CSendUi
#include <coreapplicationuisdomainpskeys.h> // P&S key for email notification
#include <e32property.h>					// RPoperty
#include <SendUiConsts.h>	// Constants for sendui
#include <CMessageData.h>	// CMessageData
#include <CSendingServiceInfo.h>
#include <CoreApplicationUIsSDKCRKeys.h> // offline mode keys
#include <data_caging_path_literals.hrh>


// <cmail> Removed DISABLE_DEFAULT_EMAIL
//#ifndef DISABLE_DEFAULT_EMAIL
//#include <MessagingDomainCRKeys.h>
//#include <centralrepository.h>
//#endif
//</cmail>

//<cmail>
#include "cfsccontactactionservice.h"
#include "cfsccontactactionmenu.h"
#include "cfsccontactactionmenuitem.h"
#include "mfsccontactactionmenumodel.h"
//</cmail>

#include <FreestyleEmailUi.rsg>
#include <freestyleemailui.mbg>

//<cmail>
#include "CFSMailCommon.h"
#include "CFSMailClient.h"
#include "CFSMailBox.h"
#include "CFSMailMessage.h"
#include "cesmricalviewer.h"
//</cmail>

#include "FreestyleEmailUiUtilities.h"
#include "FreestyleEmailUiConstants.h"
#include "FreestyleEmailUiLiterals.h"
#include "FreestyleEmailUiAppui.h"
#include "FSDelayedLoader.h"
#include "FSEmail.pan"

// CONSTANTS
_LIT( KFsEmailIconFileName, "FreestyleEmailUi.mif" );
_LIT( KFsEmailTempDirName, "temp\\" );
static const TUint KSecondSeparator = 1;
_LIT( KTimeFormatBefore, "%-B" );
_LIT( KTimeFormatAfter, "%+B" );
_LIT( KTimeFormatHour, "%J" );
_LIT( KTimeFormatMinutes, "%T" );
_LIT( KTimeFormatSpace, " ");

// MIME types
_LIT( KPdfMimeString, "application/pdf" );
_LIT( KRtfMimeString, "application/rtf" );
_LIT( KDocMimeString, "application/msword" );
_LIT( KDocMimeString2, "application/vnd.ms-word" );
_LIT( KPptMimeString, "application/vnd.ms-powerpoint" );
_LIT( KXlsMimeString, "application/vnd.ms-excel" );
_LIT( KImageMimeString, "image/" );
_LIT( KHtmlMimeString, "text/html" );
_LIT( KPlainTextMimeString, "text/plain" );
_LIT( KVCalMimeString, "text/x-vcalendar" );
_LIT( KMessageMimeString, "message/rfc822" );

// File name extensions
_LIT( KDocFileExtension, ".doc" );
_LIT( KRtfFileExtension, ".rtf" );
_LIT( KPptFileExtension, ".ppt" );
_LIT( KXlsFileExtension, ".xls" );
_LIT( KPdfFileExtension, ".pdf" );
_LIT( KJpgFileExtension, ".jpg" );
_LIT( KJpegFileExtension, ".jpeg" );
_LIT( KJpgeFileExtension, ".jpge" );
_LIT( KPngFileExtension, ".png" );
_LIT( KGifFileExtension, ".gif" );
_LIT( KBmpFileExtension, ".bmp" );
_LIT( KHtmlFileExtension, ".html" );
_LIT( KHtmFileExtension, ".htm" );
_LIT( KTxtFileExtension, ".txt" );
_LIT( KVCalFileExtension, ".vcs" );
_LIT( KEmailFileExtension, ".eml" );

// If the fetched body size (in bytes) is more than these limits,
// a wait note is used when opening, replying, or forwarding the message
static const TInt KLargePlainTextSizeLimit = 20000;
static const TInt KLargeHtmlTextSizeLimit = 50000;

//<cmail> id is different in cmail
const TUid KFSMailServerUid = { 0x2001F40A };
_LIT( KFSMailServerExe, "\\sys\\bin\\fsmailserver.exe" );
//</cmail>

// Define static members
CAknGlobalNote* TFsEmailUiUtility::iGlobalWaitNote = NULL;
// <cmail>
CESMRIcalViewer* TFsEmailUiUtility::iMrViewer = NULL;
TFsEmailUiUtility::CMrViewerEmptyCallback* TFsEmailUiUtility::iMrViewerCallback = NULL;
CAknWaitDialog* TFsEmailUiUtility::iOpeningWaitNote = NULL;
// </cmail>

// FUNCTION DEFINITIONS
void TFsEmailUiUtility::LaunchHelpL( const TDesC& aContext )
	{
    FUNC_LOG;
    CArrayFix< TCoeHelpContext >* cntx = new( ELeave ) CArrayFixFlat< TCoeHelpContext >( 1 );
    CleanupStack::PushL( cntx );
    cntx->AppendL( TCoeHelpContext( KFSEmailUiUid, aContext ) );
    CleanupStack::Pop( cntx );
    HlpLauncher::LaunchHelpApplicationL( CEikonEnv::Static()->WsSession(), cntx );
	}

// ---------------------------------------------------------------------------
// Two-phased constructor.
// ---------------------------------------------------------------------------
//
CFsEmailFileHandleShutter* CFsEmailFileHandleShutter::NewL(
    CDocumentHandler& aDocumentHandler )
    {
    FUNC_LOG;
    CFsEmailFileHandleShutter* self = new (ELeave) CFsEmailFileHandleShutter;
    CleanupStack::PushL( self );
    self->ConstructL( aDocumentHandler );
    CleanupStack::Pop( self );
    return self;
    }

// ---------------------------------------------------------------------------
// Destructor. File handle is closed, if it has been left open.
// ---------------------------------------------------------------------------
//
CFsEmailFileHandleShutter::~CFsEmailFileHandleShutter()
    {
    FUNC_LOG;
    if (iHandleOpen)
        {
        iFileHandle.Close();
        }
    }

// ---------------------------------------------------------------------------
// Stores the give file handle.
// ---------------------------------------------------------------------------
//
void CFsEmailFileHandleShutter::SetFile( RFile aFile )
    {
    FUNC_LOG;
    // Close previously set handle, if necessary.
    if ( iHandleOpen )
        {
        iFileHandle.Close();
        }

    iFileHandle = aFile;
    iHandleOpen = ETrue;
    }

// ---------------------------------------------------------------------------
// Handles the exit of embedded viewer application.
// ---------------------------------------------------------------------------
//
void CFsEmailFileHandleShutter::HandleServerAppExit( TInt aReason )
    {
    FUNC_LOG;
    if (iHandleOpen)
        {
        // Close open file handle.
        iFileHandle.Close();
        iHandleOpen = EFalse;
        }
    MAknServerAppExitObserver::HandleServerAppExit( aReason );

    // Clear the temp directory since the closed file might have been copied there
    TFsEmailUiUtility::EraseTempDir();
    }

CFsEmailFileHandleShutter::CFsEmailFileHandleShutter()
    : iHandleOpen(EFalse)
    {
    FUNC_LOG;
    }

void CFsEmailFileHandleShutter::ConstructL(
    CDocumentHandler& aDocumentHandler )
    {
    FUNC_LOG;
    aDocumentHandler.SetExitObserver(this);
    }

// ---------------------------------------------------------------------------
// Clean up any static variables of the class
// ---------------------------------------------------------------------------
//
void TFsEmailUiUtility::DeleteStaticData()
    {
    FUNC_LOG;
    delete iGlobalWaitNote;
    iGlobalWaitNote = NULL;

    // <cmail>
    delete iMrViewer;
    iMrViewer = NULL;

    delete iMrViewerCallback;
    iMrViewerCallback = NULL;
    // </cmail>
    }

// ---------------------------------------------------------------------------
// GetMceDefaultMailboxL
// Returrn the default mailbox. If one the FS account is set as default return
// it else return the first FS account. If no FS account then returns NULL.
// ---------------------------------------------------------------------------
//
CFSMailBox* TFsEmailUiUtility::GetMceDefaultMailboxL( CFSMailClient& aClient, CMsvSession& aMsvSession )
	{
    FUNC_LOG;
// <cmail> S60 UID update
	const TUid KUidMsgValTypeFsMtmVal = { 0x2001F406 };
// </cmail> S60 UID update
	TFSMailMsgId id;
    TBool getFirstInList = EFalse;

    CMsvEntry* root = CMsvEntry::NewL( aMsvSession, KMsvRootIndexEntryId,
	        TMsvSelectionOrdering( KMsvNoGrouping, EMsvSortByNone, ETrue ) );
    CleanupStack::PushL( root );

// <cmail> Removed DISABLE_DEFAULT_EMAIL
/*#ifndef DISABLE_DEFAULT_EMAIL
    TInt entryId;
    TInt rval;
    CRepository* repository = NULL;
    TRAPD( ret, repository = CRepository::NewL(KCRUidSelectableDefaultEmailSettings) );
    if ( ret == KErrNone )
        {
        CleanupStack::PushL( repository );
        rval = repository->Get( KSelectableDefaultMailAccount, entryId );
        if( rval == KErrNone && entryId != -1 )
        	{
	   		root->SetEntryL( entryId );
	        if ( root->Entry().iMtm == KUidMsgValTypeFsMtmVal )
	        	{
	        	// One of The FS is default e-mail account.
	        	id = TFSMailMsgId( root->Entry().iMtmData1, root->Entry().iMtmData2 );
	        	}
	        else
	        	{
	            // If FS is not default then get the first one in the list
	        	getFirstInList = ETrue;
	        	}
        	}
        else
        	{
            // If no mail box is set as default, then get the first one in the list
        	getFirstInList = ETrue;
        	}
        CleanupStack::PopAndDestroy( repository );
        }
    else
    	{
        // If Failed to create repository, then get the first one in the list
    	getFirstInList = ETrue;
    	}
#else*/
    // If the SDK doesn't have default mail box concept.
    getFirstInList = ETrue;
//#endif
// </cmail>
    if( getFirstInList )
    	{
    	// Get the list and return the first one.
    	root->SetEntryL( KMsvRootIndexEntryId );
    	CMsvEntrySelection* childSelection = root->ChildrenWithMtmL(
        	KUidMsgValTypeFsMtmVal );
        CleanupStack::PushL( childSelection );

        if ( childSelection->Count() > 0)
        	{
        	root->SetEntryL( childSelection->At( 0 ) );
        	id = TFSMailMsgId( root->Entry().iMtmData1, root->Entry().iMtmData2 );
        	}
        else
        	{
        	// No FS Mail box.
        	//id.SetNullId();
        	}
        CleanupStack::PopAndDestroy( childSelection );
    	}
    CleanupStack::PopAndDestroy( root );
    if( id.IsNullId() )
    	{
    	// If No FS Mailbox then return NULL.
    	return NULL;
    	}
    else
    	{
    	CFSMailBox* mailbox = aClient.GetMailBoxByUidL( id );
    	return mailbox;
    	}
	}

// ---------------------------------------------------------------------------
// GetMailboxForMtmIdL
// Return the mailbox based on mtm id. If there is an mtm account with aMtmId
// return the mail box of it else returns NULL
// ---------------------------------------------------------------------------
//
CFSMailBox* TFsEmailUiUtility::GetMailboxForMtmIdL( CFSMailClient& aClient,
    CMsvSession& aMsvSession, TMsvId  aMtmId )
	{
    FUNC_LOG;
// <cmail> S60 UID update
	const TUid KUidMsgValTypeFsMtmVal = { 0x2001F406 };
// </cmail> S60 UID update
	CMsvEntry* accountEntry = NULL;
	TRAPD(err, accountEntry = CMsvEntry::NewL( aMsvSession, aMtmId,
            TMsvSelectionOrdering( KMsvNoGrouping, EMsvSortByNone, ETrue )));
    if(err == KErrNotFound || err == KErrNoMemory ||
        accountEntry->Entry().iMtm != KUidMsgValTypeFsMtmVal)
        {
        // This Mtm Id is not found or the found entry is not FS entry
        return NULL;
        }
	CleanupStack::PushL( accountEntry );
    TFSMailMsgId id = TFSMailMsgId( accountEntry->Entry().MtmData1(),
        accountEntry->Entry().MtmData2() );
    CleanupStack::PopAndDestroy( accountEntry );
    CFSMailBox* mailbox = aClient.GetMailBoxByUidL( id );
    return mailbox;
	}

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::IsRemoteLookupSupported
// -----------------------------------------------------------------------------
TBool TFsEmailUiUtility::IsRemoteLookupSupported( CFSMailBox& aMailBox )
	{
    FUNC_LOG;

	TBool r = aMailBox.HasCapability( EFSMBoxCapaSupportsRCL );

	return r;
	}

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::ShowConfirmationQuery
// -----------------------------------------------------------------------------
TInt TFsEmailUiUtility::ShowConfirmationQueryL( TInt aResourceStringId,
												const TDesC& aResourceParameter )
    {
    FUNC_LOG;
    CFSEmailUiCallDialog* queryNote = new ( ELeave ) CFSEmailUiCallDialog();
    CleanupStack::PushL( queryNote );
    HBufC* resourceString = NULL;
    if ( aResourceParameter != KNullDesC )
    	{
    	resourceString = StringLoader::LoadLC( aResourceStringId,
                                               aResourceParameter );
    	}
    else
    	{
    	resourceString = StringLoader::LoadLC( aResourceStringId );
    	}
    queryNote->SetPromptL( *resourceString );
    CleanupStack::PopAndDestroy( resourceString );
    CleanupStack::Pop( queryNote );
    return queryNote->ExecuteLD( R_FSEMAIL_QUERY_DIALOG );
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::ShowConfirmationQuery
// -----------------------------------------------------------------------------
TInt TFsEmailUiUtility::ShowConfirmationQueryL( const TDesC& aPromptText )
    {
    FUNC_LOG;
    CFSEmailUiCallDialog* queryNote = new ( ELeave ) CFSEmailUiCallDialog();
    CleanupStack::PushL( queryNote );
    queryNote->SetPromptL( aPromptText );
    CleanupStack::Pop( queryNote );
    return queryNote->ExecuteLD( R_FSEMAIL_QUERY_DIALOG );
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::ShowErrorNoteL
// -----------------------------------------------------------------------------
void TFsEmailUiUtility::ShowErrorNoteL( TInt aResourceStringId, TBool aWaitingDialog )
	{
    FUNC_LOG;
	HBufC* errMessage = StringLoader::LoadLC( aResourceStringId );
	CAknErrorNote* note = new (ELeave) CAknErrorNote( aWaitingDialog );
	note->ExecuteLD( *errMessage );
	CleanupStack::PopAndDestroy( errMessage );
	}

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::ShowInfoNoteL
// -----------------------------------------------------------------------------
void TFsEmailUiUtility::ShowInfoNoteL( TInt aResourceStringId, TBool aWaitingDialog )
    {
    FUNC_LOG;
	HBufC* message = StringLoader::LoadLC( aResourceStringId );
	CAknInformationNote* note = new (ELeave) CAknInformationNote( aWaitingDialog );
	note->ExecuteLD( *message );
	CleanupStack::PopAndDestroy( message );
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::ShowGlobalErrorNoteL
// -----------------------------------------------------------------------------
void TFsEmailUiUtility::ShowGlobalErrorNoteL( TInt aResourceStringId )
    {
    FUNC_LOG;
    HBufC* noteText = StringLoader::LoadLC( aResourceStringId );
    CAknGlobalNote* globalNote = CAknGlobalNote::NewLC();
    globalNote->ShowNoteL( EAknGlobalErrorNote, *noteText );
    CleanupStack::PopAndDestroy( globalNote );
    CleanupStack::PopAndDestroy( noteText );
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::ShowGlobalInfoNoteL
// -----------------------------------------------------------------------------
void TFsEmailUiUtility::ShowGlobalInfoNoteL( TInt aResourceStringId )
    {
    FUNC_LOG;
    HBufC* noteText = StringLoader::LoadLC( aResourceStringId );
    CAknGlobalNote* globalNote = CAknGlobalNote::NewLC();
    globalNote->ShowNoteL( EAknGlobalInformationNote, *noteText );
    CleanupStack::PopAndDestroy( globalNote );
    CleanupStack::PopAndDestroy( noteText );
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::ShowWaitNoteL
// -----------------------------------------------------------------------------
void TFsEmailUiUtility::ShowWaitNoteL( CAknWaitDialog*& aDialog, TInt aTextResourceId,
        TBool aAllowCancel, TBool aVisibilityDelayOff /*= EFalse*/ )
    {
    FUNC_LOG;
    if ( !aDialog )
        {
        aDialog = new (ELeave) CAknWaitDialog(
                reinterpret_cast<CEikDialog**>(&aDialog), aVisibilityDelayOff );
        }

    if ( aAllowCancel )
        {
        aDialog->PrepareLC( R_FSE_WAIT_DIALOG );
        }
    else
        {
        aDialog->PrepareLC( R_FSE_WAIT_DIALOG_NO_CANCEL );
        }

    HBufC* noteText = StringLoader::LoadLC( aTextResourceId );
    aDialog->SetTextL( *noteText );
    CleanupStack::PopAndDestroy( noteText );

    aDialog->RunLD();
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::ShowGlobalWaitNoteLC
// -----------------------------------------------------------------------------
TInt TFsEmailUiUtility::ShowGlobalWaitNoteLC( TInt aTextResourceId )
    {
    FUNC_LOG;
    if ( !iGlobalWaitNote )
        {
        iGlobalWaitNote = CAknGlobalNote::NewL();
        iGlobalWaitNote->SetSoftkeys( R_AVKON_SOFTKEYS_EMPTY );
        }

    HBufC* noteText = StringLoader::LoadLC( aTextResourceId );
    TInt waitNoteId = iGlobalWaitNote->ShowNoteL( EAknGlobalWaitNote, *noteText );
    CleanupStack::PopAndDestroy( noteText );

    TCleanupItem closeNoteItem( CloseGlobalWaitNote,
                                reinterpret_cast<TAny*>(waitNoteId) );
    CleanupStack::PushL( closeNoteItem );

    return waitNoteId;
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::CloseGlobalWaitNote
// -----------------------------------------------------------------------------
void TFsEmailUiUtility::CloseGlobalWaitNote( TAny* aNoteId )
    {
    FUNC_LOG;
    if ( iGlobalWaitNote )
        {
        TInt noteId = reinterpret_cast<TInt>( aNoteId );
        TRAP_IGNORE( iGlobalWaitNote->CancelNoteL( noteId ) );
        }
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::ShowSelectFileDialogL
// -----------------------------------------------------------------------------
//
TBool TFsEmailUiUtility::ShowSelectFileDialogL( TDes& aFileName )
    {
    FUNC_LOG;
    return ShowFileDialogL( ECFDDialogTypeSelect, aFileName );
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::ShowSaveFolderDialogL
// -----------------------------------------------------------------------------
TBool TFsEmailUiUtility::ShowSaveFolderDialogL( TDes& aFileName )
	{
    FUNC_LOG;
    return ShowFileDialogL( ECFDDialogTypeSave, aFileName );
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::ShowSaveFolderDialogL
// -----------------------------------------------------------------------------
TBool TFsEmailUiUtility::ShowFileDialogL( TInt aType, TDes& aFileName )
	{
    FUNC_LOG;
	TInt retVal = EFalse;

	TInt allDrives =
        AknCommonDialogsDynMem::EMemoryTypePhone |
        AknCommonDialogsDynMem::EMemoryTypeInternalMassStorage |
        AknCommonDialogsDynMem::EMemoryTypeMMCExternal |
        AknCommonDialogsDynMem::EMemoryTypeRemote;

	if ( aType == ECFDDialogTypeSelect )
	    {
	    retVal = AknCommonDialogsDynMem::RunSelectDlgLD( allDrives, aFileName, 0 );
	    }
	else if ( aType == ECFDDialogTypeSave )
	    {
	    // We can't use the SaveDlg of CommonDialogs because it launches also the file name query
	    // which we do not want. Instead, we use move-to-folder dialog with the title and softkeys
	    // of the save dialog.
	    retVal = AknCommonDialogsDynMem::RunMoveDlgLD( allDrives, aFileName,
	            R_CFD_DEFAULT_SAVE_MEMORY_SELECTION, R_CFD_DEFAULT_SAVE_FILE_SELECTION );
	    }
	else
	    {
	    __ASSERT_DEBUG( EFalse, Panic(EFSEmailUiUnexpectedValue) );
	    }

	return retVal;
	}


// -----------------------------------------------------------------------------
// TFsEmailUiUtility::OkToSaveFileL
// -----------------------------------------------------------------------------
TBool TFsEmailUiUtility::OkToSaveFileL( const TDesC& aFilePath, CFSMailMessagePart& aAttachmentPart )
	{
    FUNC_LOG;
	TBool ret( ETrue );
	TDesC& name = aAttachmentPart.AttachmentNameL();
	HBufC* realFilePath = HBufC::NewLC( aFilePath.Length() + name.Length() );
	realFilePath->Des().Append( aFilePath);
	realFilePath->Des().Append( name);
	if ( BaflUtils::FileExists( CEikonEnv::Static()->FsSession(), *realFilePath ) )
		{
		if ( !TFsEmailUiUtility::ShowConfirmationQueryL( R_FREESTYLE_EMAIL_UI_OVERWRITE_QUERY, name  )	)
			{
			ret = EFalse;
			}
		}
	CleanupStack::PopAndDestroy( realFilePath );
	return ret;
	}

// -----------------------------------------------------------------------------
// <cmail>
// TFsEmailUiUtility::ShowFileSavedToFolderNoteL
// -----------------------------------------------------------------------------
void TFsEmailUiUtility::ShowFilesSavedToFolderNoteL( TInt aCount )
    {
    FUNC_LOG;
    CAknGlobalNote* globalNote = CAknGlobalNote::NewLC();
    if ( aCount == 1 )
        {
        HBufC* noteText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_ONE_ATTACHMENT_SAVED );
        globalNote->ShowNoteL( EAknGlobalInformationNote, *noteText );
        CleanupStack::PopAndDestroy( noteText );
        }
    else if ( aCount > 1 )
        {
        HBufC* noteText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_MULTIPLE_ATTACHMENT_SAVED, aCount );
        globalNote->ShowNoteL( EAknGlobalInformationNote, *noteText );
        CleanupStack::PopAndDestroy( noteText );
        }
    CleanupStack::PopAndDestroy( globalNote );
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::OpenFileL
// -----------------------------------------------------------------------------
void TFsEmailUiUtility::OpenFileL( RFile& aFileToOpen, TBool aAllowSave  )
    {
    FUNC_LOG;
    TDataType emptyDataType;
    OpenFileL( aFileToOpen, emptyDataType,aAllowSave );
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::OpenFileL
// -----------------------------------------------------------------------------
void TFsEmailUiUtility::OpenFileL( RFile& aFileToOpen, TDataType& aDataType, TBool aAllowSave )
    {
    FUNC_LOG;
    CFreestyleEmailUiAppUi* appUi = (CFreestyleEmailUiAppUi*)CCoeEnv::Static()->AppUi();

    // Set file handle shutter to close the file handle after the embedded
    // viewer application exits.
    appUi->FileHandleShutter().SetFile( aFileToOpen );

    CDocumentHandler& docHandler = appUi->DocumentHandler();
   	CAiwGenericParamList& paramList = docHandler.InParamListL();

   	// Set allow save to parameter.
   	if ( aAllowSave )
   	    {
        TAiwVariant allowSaveVariant( ETrue );
        TAiwGenericParam genericParamAllowSave( EGenericParamAllowSave,
                allowSaveVariant );
        paramList.AppendL( genericParamAllowSave );
   	    }

    TInt res = KErrNone;
    TRAPD( err, res = docHandler.OpenFileEmbeddedL( aFileToOpen, aDataType, paramList ) );

    // Try again with an empty data type if opening using the given data type fails
    if ( err != KErrNone || res != KErrNone )
        {
        TDataType emptyType;

        // Open file embedded
 	    TRAP( err, res = docHandler.OpenFileEmbeddedL( aFileToOpen, emptyType, paramList ) );

        // Show an error note if opening the file still didn't succeed
        // Ensure also that the file handle got closed.
        if ( err != KErrNone || res != KErrNone )
            {
            ShowErrorNoteL( R_FREESTYLE_EMAIL_INFO_NOTE_UNABLE_TO_OPEN, EFalse );
            appUi->FileHandleShutter().HandleServerAppExit( KErrCancel );
            }
        }
	}

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::OpenAttachmentL
// -----------------------------------------------------------------------------
void TFsEmailUiUtility::OpenAttachmentL( const TPartData& aAttachmentPart )
    {
    FUNC_LOG;
    CFreestyleEmailUiAppUi* appUi = (CFreestyleEmailUiAppUi*)CCoeEnv::Static()->AppUi();
    CFSMailMessage* mailMessage = appUi->GetMailClient()->GetMessageByUidL(
        aAttachmentPart.iMailBoxId, aAttachmentPart.iFolderId,
        aAttachmentPart.iMessageId, EFSMsgDataStructure );

    CleanupStack::PushL( mailMessage );
    CFSMailMessagePart* messagePart = mailMessage->ChildPartL(
        aAttachmentPart.iMessagePartId );
    CleanupStack::PushL( messagePart );

    OpenAttachmentL( *messagePart );

    CleanupStack::PopAndDestroy( messagePart );
    CleanupStack::PopAndDestroy( mailMessage );
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::OpenAttachmentL
// -----------------------------------------------------------------------------
void TFsEmailUiUtility::OpenAttachmentL( CFSMailMessagePart& aAttachmentPart,
        TBool aAllowSave /*= ETrue*/)
    {
    FUNC_LOG;
    const TDesC& attName = aAttachmentPart.AttachmentNameL();
    const TDesC* mimeType16 = &aAttachmentPart.GetContentType();
    TFileType fileType = GetFileType( attName, *mimeType16 );

    // Check if attachment is actually an embedded message object. In that case we try to
    // open it using mail viewer.
    TBool openedAsMessage = EFalse;
    if ( fileType == EMessageType )
        {
        CFreestyleEmailUiAppUi* appUi =
            static_cast<CFreestyleEmailUiAppUi*>( CCoeEnv::Static()->AppUi() );

        // First, try to get the message object directly from mail client using the UIDs.
        CFSMailMessage* message = NULL;
        TRAP_IGNORE( message = appUi->GetMailClient()->GetMessageByUidL(
                aAttachmentPart.GetMailBoxId(),
                aAttachmentPart.GetFolderId(),
                aAttachmentPart.GetPartId(),
                EFSMsgDataEnvelope ) );

        // If we still have no message, then try to convert the attachment file to message object (Activesync case).
        if ( !message ) 
            {
            // This takes some time so we show a wait dialog.
            if ( iOpeningWaitNote )
                {
                iOpeningWaitNote->ProcessFinishedL();
                iOpeningWaitNote = NULL;
                }
            ShowWaitNoteL( iOpeningWaitNote, R_FSE_WAIT_OPENING_TEXT, EFalse, ETrue );

            RFile attFile = aAttachmentPart.GetContentFileL();
            CleanupClosePushL( attFile );
            CFSMailBox* mailbox = appUi->GetMailClient()->GetMailBoxByUidL( aAttachmentPart.GetMailBoxId() );
            CleanupStack::PushL( mailbox );
            TRAP_IGNORE( message = mailbox->CreateMessageFromFileL( attFile ) );
            CleanupStack::PopAndDestroy( mailbox );
            CleanupStack::PopAndDestroy( &attFile );

            iOpeningWaitNote->ProcessFinishedL();
            }

        // Open message to viewer if we got it. Otherwise continue with the standard file opening logic.
        if ( message )
            {
            // Check that the embedded message has text body part or html body part. 
            // Otherwise we cannot display it viewer and needs to be handled as a normal attachment.
            
            CFSMailMessagePart* htmlPart = message->HtmlBodyPartL();
            CFSMailMessagePart* textPart = message->PlainTextBodyPartL();
            
            if ( htmlPart || textPart  )
                {
                THtmlViewerActivationData htmlData; 
                htmlData.iActivationDataType = THtmlViewerActivationData::EmbeddedEmailMessage;
                htmlData.iMailBoxId = aAttachmentPart.GetMailBoxId();
                htmlData.iFolderId = aAttachmentPart.GetFolderId();
                htmlData.iMessageId = aAttachmentPart.GetPartId();
                // ownership of message gets transfered to html viewer.
                htmlData.iEmbeddedMessage = message;
                htmlData.iEmbeddedMessageMode = ETrue;
                TPckgBuf<THtmlViewerActivationData> pckgData( htmlData );
                
                appUi->EnterFsEmailViewL( HtmlViewerId, KStartViewerWithEmbeddedMsgPtr, pckgData );
                openedAsMessage = ETrue;
                }
            else
                {
                //delete message object owned by us.
                delete message;
                }
            
            if( htmlPart )
                {
                delete htmlPart;
                }
            if( textPart )
                {
                delete textPart;
                }
            
            }
        }

    // Normal attachment file opening
    if ( !openedAsMessage )
        {
        RFile attachmentFile;

        // Get the temp file provided by plugin
        RFile pluginTempFile = aAttachmentPart.GetContentFileL();
        CleanupClosePushL( pluginTempFile );

        // Check if the temp file has diffrent file extension than the attachment name.
        TFileName tempFileName;
        pluginTempFile.Name( tempFileName );
        const TDesC& attName = aAttachmentPart.AttachmentNameL();
        if ( !DoFileExtensionsMatchL( tempFileName, attName ) )
            {
            // Make a new temporary copy of the attachment file if the temp file
            // provided by the plugin does not have a proper file extension.
            // This is needed because some applications may not
            // allow opening files with improper file extension.
            attachmentFile = CopyFileToTempDirL( pluginTempFile, attName );
            CleanupStack::PopAndDestroy( &pluginTempFile );
            }
        else
            {
            // Otherwise we may use the temp file provided by plugin directly
            attachmentFile = pluginTempFile;
            CleanupStack::Pop( &pluginTempFile );
            }
        CleanupClosePushL( attachmentFile );

        // Use given MIME type if present
        TDataType dataType;
        const TDesC* mimeType16 = &aAttachmentPart.GetContentType();
        if ( mimeType16->Length() )
            {
            // V-calendar attachments sent from MS Outlook seem to have wrong MIME type. Work around
            // this by overriding the MIME type in case the file can be identified to be VCal object
            if ( GetFileType( attName, *mimeType16 ) == EVCalType )
                {
                mimeType16 = &KVCalMimeString;
                }

            // The MIME type must be converted to 8 bit buffer. Just assume it's ASCII data
            // and forget the upper bytes.
            HBufC8* mimeType8 = HBufC8::NewLC( mimeType16->Length() );
            mimeType8->Des().Append( *mimeType16 );
            //cut extra data from MIME string
            TInt pos = mimeType8->Locate( ';' );
            if ( pos >= 0 )
                {
                mimeType8->Des().SetLength(pos);
                }
            dataType = TDataType( *mimeType8 );
            CleanupStack::PopAndDestroy( mimeType8 );
            }

        CleanupStack::Pop( &attachmentFile ); // next function takes ownershp of the handle
        OpenFileL( attachmentFile, dataType, aAllowSave );
        }
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::SetMessageFollowupFlagL
// -----------------------------------------------------------------------------
TFollowUpNewState TFsEmailUiUtility::SetMessageFollowupFlagL( CFSMailMessage& aMsg,
        TBool aShowFlagCompleted )
    {
    FUNC_LOG;
    TFollowUpNewState newFollowUpState = EFollowUpNoChanges;
    if ( TFsEmailUiUtility::RunFollowUpListDialogL( newFollowUpState, aShowFlagCompleted ) )
        {
        SetMessageFollowupStateL( aMsg, newFollowUpState );
        }
    return newFollowUpState;
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::SetssageFollowupStateL
// -----------------------------------------------------------------------------
void TFsEmailUiUtility::SetMessageFollowupStateL( CFSMailMessage& aMsg,
        TFollowUpNewState aNewFollowUpState )
    {
    FUNC_LOG;
    switch ( aNewFollowUpState )
        {
        case EFollowUp:
            {
            aMsg.SetFlag( EFSMsgFlag_FollowUp );
            aMsg.ResetFlag( EFSMsgFlag_FollowUpComplete );
            }
            break;
        case EFollowUpComplete:
            {
            aMsg.SetFlag( EFSMsgFlag_FollowUpComplete );
            aMsg.ResetFlag( EFSMsgFlag_FollowUp );
            }
            break;
        case EFollowUpClear:
            {
            aMsg.ResetFlag( EFSMsgFlag_FollowUp | EFSMsgFlag_FollowUpComplete );
            }
            break;
        }
    aMsg.SaveMessageL(); // Save flag status
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::RunFollowUpListDialogL
// -----------------------------------------------------------------------------
TBool TFsEmailUiUtility::RunFollowUpListDialogL( TFollowUpNewState& aSelectedOption,
        TBool aShowFlagCompleted )
	{
    FUNC_LOG;
	aSelectedOption = EFollowUpNoChanges;

	CDesCArrayFlat* array = new (ELeave) CDesCArrayFlat( 2 );
	CleanupStack::PushL( array );

	// Add follow up text
	_LIT( KListItemIcon0, "0\t" );

    // aShowFlagCompleted is false when we are in the editor/composer view
    TInt followUpResId =
        ( aShowFlagCompleted ? R_FREESTYLE_EMAIL_UI_FLAG_FOLLOW_UP :
                                R_NCS_FLAG_FOLLOW_UP );

    HBufC* followUp = StringLoader::LoadLC( followUpResId );

	HBufC* followUpText = HBufC::NewLC( KListItemIcon0().Length() + followUp->Length() );
    followUpText->Des().Append( KListItemIcon0 );
    followUpText->Des().Append( *followUp );
    array->AppendL( *followUpText );
	CleanupStack::PopAndDestroy( 2, followUp );

	// Add flag complete text if requested
	if ( aShowFlagCompleted )
	    {
	    _LIT( KListItemIcon1, "1\t" );
    	HBufC* completeFlag = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_FLAG_COMPLETE );
    	HBufC* completeFlagText = HBufC::NewLC( KListItemIcon1().Length() + completeFlag->Length() );
    	completeFlagText->Des().Append( KListItemIcon1 );
        completeFlagText->Des().Append( *completeFlag );
        array->AppendL( *completeFlagText );
    	CleanupStack::PopAndDestroy( 2, completeFlag );
        }

	// Add clear flag text
	_LIT( KListItemNoIcon, "\t" );

    // aShowFlagCompleted is false when we are in the editor/composer view
    TInt clearResId = ( aShowFlagCompleted ? R_FREESTYLE_EMAIL_UI_FLAG_CLEAR :
                                             R_NCS_FLAG_CLEAR );

	HBufC* clearFlag = StringLoader::LoadLC( clearResId );
	HBufC* clearFlagText = HBufC::NewLC( KListItemNoIcon().Length() + clearFlag->Length() );
	clearFlagText->Des().Append( KListItemNoIcon );
	clearFlagText->Des().Append( *clearFlag );
	array->AppendL( *clearFlagText );
	CleanupStack::PopAndDestroy( 2, clearFlag );

	TInt selectedOption;
	CAknListQueryDialog* dlg = new ( ELeave ) CAknListQueryDialog( &selectedOption );

    // aShowFlagCompleted is false when we are in the editor/composer view
	TInt dlgResId = ( aShowFlagCompleted ? R_MAIL_FLAG_QUERY_DIALOG :
	                                       R_NCS_MAIL_FLAG_QUERY_DIALOG );

	dlg->PrepareLC( dlgResId );

	//Create icon array from correct icons
    TFileName iconFileName;
    GetFullIconFileNameL( iconFileName );

    CArrayPtr<CGulIcon>* icons = new (ELeave) CAknIconArray( 2 );
	CleanupStack::PushL(icons);
    CFbsBitmap* iconBitmap;
    CFbsBitmap* iconMaskBitmap;
    TSize defaultIconSize(20,20);

// <cmail> icons changed
    // Flag icon "followup"
    AknsUtils::CreateColorIconLC(
        AknsUtils::SkinInstance(),
        KAknsIIDNone,
        KAknsIIDQsnIconColors,
        EAknsCIQsnIconColorsCG7,
        iconBitmap,
        iconMaskBitmap,
        iconFileName,
        EMbmFreestyleemailuiQgn_indi_navi_follow_up,
        EMbmFreestyleemailuiQgn_indi_navi_follow_up_mask,
        KRgbBlack );
	AknIconUtils::SetSize(iconBitmap, defaultIconSize );
    AknIconUtils::SetSize(iconMaskBitmap, defaultIconSize);
    CGulIcon* flagIcon = CGulIcon::NewL(iconBitmap, iconMaskBitmap);
    CleanupStack::Pop( 2, iconBitmap );
    CleanupStack::PushL( flagIcon );
 	icons->AppendL( flagIcon );
 	CleanupStack::Pop( flagIcon );

    // Flag icon "completed"
 	AknsUtils::CreateColorIconLC(
        AknsUtils::SkinInstance(),
        KAknsIIDNone,
        KAknsIIDQsnIconColors,
        EAknsCIQsnIconColorsCG7,
        iconBitmap,
        iconMaskBitmap,
        iconFileName,
        EMbmFreestyleemailuiQgn_indi_navi_follow_up_complete,
        EMbmFreestyleemailuiQgn_indi_navi_follow_up_complete_mask,
        KRgbBlack );
	AknIconUtils::SetSize(iconBitmap, defaultIconSize );
    AknIconUtils::SetSize(iconMaskBitmap, defaultIconSize);
    CGulIcon* flagCompleteIcon = CGulIcon::NewL(iconBitmap, iconMaskBitmap);
    CleanupStack::Pop( 2, iconBitmap );
    CleanupStack::PushL( flagCompleteIcon );
	icons->AppendL( flagCompleteIcon );
    CleanupStack::Pop( flagCompleteIcon );
// </cmail>

    // Run the dialog
    dlg->SetItemTextArray( array );
	dlg->SetIconArrayL( icons );
	CleanupStack::Pop( icons );
	dlg->SetOwnershipType( ELbmDoesNotOwnItemArray );
	TBool retVal = dlg->RunLD();
	CleanupStack::PopAndDestroy( array );

	if ( retVal )
	    {
    	// Convert the returned index to enumeration. This mapping is different depending
    	// if "flag completed" is shown or not
        aSelectedOption = static_cast<TFollowUpNewState>( selectedOption );
    	if ( !aShowFlagCompleted && aSelectedOption == EFollowUpComplete )
    	    {
    	    aSelectedOption = EFollowUpClear;
    	    }
	    }

	return retVal;
	}


// -----------------------------------------------------------------------------
// TFsEmailUiUtility::ShowCreateMessageQueryL
// -----------------------------------------------------------------------------
void TFsEmailUiUtility::ShowCreateMessageQueryL( const TDesC& aAddressData, TBool aSendingToEmail )
	{
    FUNC_LOG;
	if ( aAddressData.Length() ) // Sending needs address data in any case
		{
		CSendUi* sendUi = CSendUi::NewLC();
		TSendingCapabilities noCapabilities(0,0,0);

		CArrayFix<TUid>* showedServicesUidArray = new( ELeave ) CArrayFixFlat<TUid>(4);
		CleanupStack::PushL( showedServicesUidArray );

		CDesCArrayFlat* array = new ( ELeave ) CDesCArrayFlat( 2 );
		CleanupStack::PushL( array );

		if( !aSendingToEmail && sendUi->ValidateServiceL( KSenduiMtmSmsUid, noCapabilities ) )
			{
			HBufC* textMessage = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_VIEWER_TEXT_MESSAGE );
		    array->AppendL( *textMessage );
			CleanupStack::PopAndDestroy( textMessage );
			showedServicesUidArray->AppendL( KSenduiMtmSmsUid );
			}
		if( sendUi->ValidateServiceL( KSenduiMtmMmsUid, noCapabilities ) )
			{
			HBufC* multimediaMessage = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_VIEWER_MULTIMEDIA_MESSAGE );
		    array->AppendL( *multimediaMessage );
			CleanupStack::PopAndDestroy( multimediaMessage );
			showedServicesUidArray->AppendL( KSenduiMtmMmsUid );
			}
		if( sendUi->ValidateServiceL( KSenduiMtmAudioMessageUid, noCapabilities ) )
			{
			HBufC* voiceMessage = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_VIEWER_VOICE_MESSAGE );
		    array->AppendL( *voiceMessage );
			CleanupStack::PopAndDestroy( voiceMessage );
			showedServicesUidArray->AppendL( KSenduiMtmAudioMessageUid );
			}

		TInt selectedOption;
		CAknListQueryDialog* dlg = new ( ELeave ) CAknListQueryDialog( &selectedOption );
		dlg->PrepareLC( R_MAIL_VIEWER_CREATE_MESSAGE_DIALOG  );
		dlg->SetItemTextArray( array );
		dlg->SetOwnershipType( ELbmDoesNotOwnItemArray );
		if( dlg->RunLD() )
			{
			CMessageData* messageData = CMessageData::NewLC();
			messageData->AppendToAddressL( aAddressData );
			// safety check.
			if( showedServicesUidArray->Count() > selectedOption )
				{
				sendUi->CreateAndSendMessageL( showedServicesUidArray->At( selectedOption ),
												messageData );
				}
			CleanupStack::PopAndDestroy( messageData );
			}

		CleanupStack::PopAndDestroy( array );
		CleanupStack::PopAndDestroy( showedServicesUidArray );
		CleanupStack::PopAndDestroy( sendUi );
		}
	}

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::GetFileType
// Figures out the file type based on the MIME type and the file name extension.
// The MIME type is used first and if that doesn't help, then the file extension
// is used as backup solution.
// -----------------------------------------------------------------------------
TFileType TFsEmailUiUtility::GetFileType( const TDesC& aFileName, const TDesC& aMimeType )
    {
    FUNC_LOG;
	TFileType fileType = EUnidentifiedType;
    TPtrC ext = TParsePtrC( aFileName ).Ext();

    // here we make sure that content type does not have extra parameters
    TPtrC mimeType( aMimeType );
    TInt semiColonPos( aMimeType.Locate(';') );
    if( semiColonPos != KErrNotFound )
    	{
    	mimeType.Set( aMimeType.Left(semiColonPos) );
    	}
    
	if ( !mimeType.CompareF(KPdfMimeString) )
		{
		fileType = EPdfType;
		}
	else if ( !mimeType.CompareF(KDocMimeString) ||
	          !mimeType.CompareF(KDocMimeString2) )
		{
		fileType = EDocType;
		}
	else if ( !mimeType.CompareF(KRtfMimeString) )
		{
		fileType = ERtfType;
		}
	else if ( !mimeType.CompareF(KPptMimeString) )
		{
		fileType = EPptType;
		}
	else if ( !mimeType.CompareF(KXlsMimeString) )
		{
		fileType = EXlsType;
		}
	else if ( !mimeType.Left( KImageMimeString().Length() ).CompareF(KImageMimeString) )
		{
		fileType = EImageType;
		}
	else if ( !mimeType.CompareF(KHtmlMimeString) )
		{
		fileType = EHtmlType;
		}
	else if ( !mimeType.CompareF(KPlainTextMimeString) )
	    {
	    fileType = EPlainTextType;
	    // When v-cal attachment is sent from MS Outlook, it's received with wrong MIME type.
	    // Following is a workaround for this problem
	    if ( !ext.CompareF(KVCalFileExtension) )
	        {
	        fileType = EVCalType;
	        }
	    }
	else if ( !mimeType.CompareF(KVCalMimeString) )
	    {
	    fileType = EVCalType;
	    }
    else if ( !mimeType.CompareF(KMessageMimeString) )
        {
        fileType = EMessageType;
        }
	else
		{
		// File type couldn't be identified from the MIME type. Use the file extension.

    	if ( !ext.CompareF(KDocFileExtension) )
    		{
    		fileType = EDocType;
    		}
    	else if ( !ext.CompareF(KRtfFileExtension) )
    	    {
    	    fileType = ERtfType;
    	    }
    	else if ( !ext.CompareF(KPptFileExtension) )
    		{
    		fileType = EPptType;
    		}
    	else if ( !ext.CompareF(KXlsFileExtension) )
    		{
    		fileType = EXlsType;
    		}
    	else if ( !ext.CompareF(KPdfFileExtension) )
    		{
    		fileType = EPdfType;
    		}
    	else if ( !ext.CompareF(KHtmlFileExtension) ||
    	          !ext.CompareF(KHtmFileExtension) )
    	    {
    	    fileType = EHtmlType;
    	    }
    	else if ( !ext.CompareF(KJpgFileExtension)
    			  || !ext.CompareF(KJpgeFileExtension)
    			  || !ext.CompareF(KJpegFileExtension)
    			  || !ext.CompareF(KPngFileExtension)
    			  || !ext.CompareF(KGifFileExtension)
    			  || !ext.CompareF(KBmpFileExtension) )
    	    {
    	    fileType = EImageType;
    	    }
    	else if ( !ext.CompareF(KTxtFileExtension) )
    	    {
    	    fileType = EPlainTextType;
    	    }
    	else if ( !ext.CompareF(KVCalFileExtension) )
            {
            fileType = EVCalType;
            }
        else if ( !ext.CompareF(KEmailFileExtension) )
            {
            fileType = EMessageType;
            }
    	else
    	    {
    	    fileType = EUnidentifiedType;
    	    }
		}

    return fileType;
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::GetAttachmentIcon
// Funtion for getting correct attachment icon
// -----------------------------------------------------------------------------
CAlfTexture& TFsEmailUiUtility::GetAttachmentIcon( TFileType aAttachmentType, CFreestyleEmailUiTextureManager& aTextureManager )
    {
    FUNC_LOG;
	TFSEmailUiTextures textureId = GetAttachmentIconTextureId( aAttachmentType );
	return aTextureManager.TextureByIndex( textureId );
    }

TFSEmailUiTextures TFsEmailUiUtility::GetAttachmentIconTextureId( TFileType aAttachmentType )
    {
    FUNC_LOG;
    switch( aAttachmentType )
    	{
		case EDocType:
     		return EAttachmentsDocFile;
		case ERtfType:
			return EAttachmentsRtfFile;
        case EPptType:
			return EAttachmentsPptFile;
		case EXlsType:
			return EAttachmentsXls;
		case EPdfType:
			return EAttachmentsPdfFile;
		case EImageType:
			return EAttachmentsImageFile;
		case EHtmlType:
			return EAttachmentsHtmlFile;
		case EPlainTextType:
		case EVCalType:
		case EMessageType:
		case EUnidentifiedType:
			return EAttachmentsUnknownFile;
		default:
			ASSERT( EFalse );
    	}
    return EAttachmentsUnknownFile;
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::GetMsgIcon
// Funtion for getting correct msg icon, divides into read and unread icons
// -----------------------------------------------------------------------------
CAlfTexture& TFsEmailUiUtility::GetMsgIcon( CFSMailMessage* aMsgPtr,
									 CFreestyleEmailUiTextureManager& aTextureManager )
	{
    FUNC_LOG;
	TFSEmailUiTextures textureId = GetMsgIconTextureId( aMsgPtr );
	return aTextureManager.TextureByIndex( textureId );
	}

TFSEmailUiTextures TFsEmailUiUtility::GetMsgIconTextureId( CFSMailMessage* aMsgPtr )
	{
    FUNC_LOG;
	if ( !aMsgPtr->IsFlagSet( EFSMsgFlag_Read ) )
		{
		return GetUnreadMsgIcon( aMsgPtr );
		}
	else
		{
		return GetReadMsgIcon( aMsgPtr );
		}

	}

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::MoveMessageToDraftsL
// -----------------------------------------------------------------------------
void TFsEmailUiUtility::MoveMessageToDraftsL( CFSMailBox& aMailBox, CFSMailMessage& aMsg )
	{
    FUNC_LOG;

	// check that msg is not in drafts folder already
	TFSMailMsgId draftsFolderId = aMailBox.GetStandardFolderId( EFSDraftsFolder );
	TFSMailMsgId msgFolderId = aMsg.GetFolderId();
	if ( draftsFolderId != msgFolderId )
		{
		RArray<TFSMailMsgId> ids;
		ids.Append( aMsg.GetMessageId() );
		aMailBox.MoveMessagesL( ids, msgFolderId, draftsFolderId );
		ids.Reset();
		}

	}

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::IsMessagePartFullyFetched
// -----------------------------------------------------------------------------
TBool TFsEmailUiUtility::IsMessagePartFullyFetched( const CFSMailMessagePart& aPart )
	{
    FUNC_LOG;

	TFSPartFetchState fetchState = aPart.FetchLoadState();
	TBool isFetched = ( fetchState == EFSFull );

	return isFetched;
	}

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::IsMessageStructureKnown
// -----------------------------------------------------------------------------
TBool TFsEmailUiUtility::IsMessageStructureKnown( const CFSMailMessagePart& aPart )
	{
    FUNC_LOG;

	TFSPartFetchState fetchState = aPart.FetchLoadState();
	TBool isKnown = !( fetchState == EFSEmailStructureUnknown );//( fetchState == EFSFull || fetchState == EFSMessagePartsKnown );

	return isKnown;
	}

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::CreatePlainTextPartL
// -----------------------------------------------------------------------------
void TFsEmailUiUtility::CreatePlainTextPartL( CFSMailMessage& aMsg, CFSMailMessagePart*& aPart )
	{
    FUNC_LOG;

    aPart = aMsg.PlainTextBodyPartL();
    if ( !aPart )
    	{
        // Do message contain HTML body part
        CFSMailMessagePart* htmlPart = aMsg.HtmlBodyPartL();
        if ( htmlPart )
            {
            CleanupStack::PushL( htmlPart );
            HBufC* htmlData = HBufC::NewLC( htmlPart->FetchedContentSize() );
            TPtr pointer = htmlData->Des();
            htmlPart->GetContentToBufferL( pointer, 0 );

            HBufC* txtData = TFsEmailUiUtility::ConvertHtmlToTxtL( *htmlData );

            CleanupStack::PopAndDestroy( htmlData );

            CleanupStack::PushL( txtData );

            // create new message part for body text
            TFSMailMsgId id;
            aPart = aMsg.NewChildPartL( id, KFSMailContentTypeTextPlain );
            if ( aPart )
                {
                aPart->SetContentType( KFSMailContentTypeTextPlain );
                pointer.Set( txtData->Des() );
                aPart->SetContent( pointer );
                aPart->SaveL();
                }

            CleanupStack::PopAndDestroy( txtData );
            CleanupStack::PopAndDestroy( htmlPart );
            }
        else
            {
    		// create new message part for body text
    		TFSMailMsgId id;
    		aPart = aMsg.NewChildPartL( id, KFSMailContentTypeTextPlain );
            if ( aPart )
                {
                aPart->SetContentType( KFSMailContentTypeTextPlain );
                aPart->SaveL();
                }
            }
    	}

	}

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::IsCompleteOrCancelEvent
// -----------------------------------------------------------------------------
TBool TFsEmailUiUtility::IsCompleteOrCancelEvent( TFSProgress aEvent )
	{
    FUNC_LOG;
    return ( TFSProgress::EFSStatus_RequestComplete == aEvent.iProgressStatus ||
    	TFSProgress::EFSStatus_RequestCancelled == aEvent.iProgressStatus );
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::HasUnfetchedAttachmentsL
// -----------------------------------------------------------------------------
TBool TFsEmailUiUtility::HasUnfetchedAttachmentsL( CFSMailMessage& aMsg )
	{
    FUNC_LOG;
	RPointerArray<CFSMailMessagePart> attachments;
	aMsg.AttachmentListL( attachments );
	TBool found = EFalse;
	for ( TInt i=0; i<attachments.Count(); i++ )
		{
		if ( !IsMessagePartFullyFetched( *attachments[i] ) )
			{
			found = ETrue;
			break;
			}
		}
	attachments.ResetAndDestroy();
	return found;
	}

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::IsFollowUpSupported
// -----------------------------------------------------------------------------
TBool TFsEmailUiUtility::IsFollowUpSupported( const CFSMailBox& aMailBox )
	{
    FUNC_LOG;
	TBool supported = aMailBox.HasCapability( EFSMBoxCapaSupportsFollowUp );
	return supported;
	}

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::DateTextFromMsgLC
// -----------------------------------------------------------------------------
HBufC* TFsEmailUiUtility::DateTextFromMsgLC( const CFSMailMessage* aMessage,
	TBool aAddYearNumer )
	{
    FUNC_LOG;
	HBufC* ret = HBufC::NewLC( 20 );
	TTime eventTimeInHomeTime = aMessage->GetDate();
    TLocale currentLocaleSettings;
    eventTimeInHomeTime = eventTimeInHomeTime +
    					  (currentLocaleSettings.UniversalTimeOffset());
    eventTimeInHomeTime += currentLocaleSettings.QueryHomeHasDaylightSavingOn()
    					  ? TTimeIntervalHours(1) : TTimeIntervalHours(0);
	TDateFormat dateFormat = currentLocaleSettings.DateFormat();
	TChar secondDateSeparator = currentLocaleSettings.DateSeparator( 1 );
	TChar thirdDateSeparator = currentLocaleSettings.DateSeparator( 2 );

	if ( aAddYearNumer )
		{
		switch ( dateFormat )
			{
			case EDateAmerican: // US format (mm/dd/yyyy)
				{
				ret->Des().Format(_L("%02d%c%02d%c%4d"),
			 		eventTimeInHomeTime.DateTime().Month()+1,
			 		(TUint)secondDateSeparator,
			 		eventTimeInHomeTime.DateTime().Day()+1,
			 		(TUint)thirdDateSeparator,
			 		eventTimeInHomeTime.DateTime().Year());
				}
				break;
			case EDateJapanese: // Japanese format (yyyy/mm/dd)
				{
				ret->Des().Format( _L("%4d%c%02d%c%02d"),
			 		eventTimeInHomeTime.DateTime().Year(),
			 		(TUint)secondDateSeparator,
			 		eventTimeInHomeTime.DateTime().Month()+1,
			 		(TUint)thirdDateSeparator,
			 		eventTimeInHomeTime.DateTime().Day()+1 );
				}
				break;
			case EDateEuropean: // European format (dd/mm/yyyy)
			default:
				{
				ret->Des().Format(_L("%02d%c%02d%c%4d"),
			 		eventTimeInHomeTime.DateTime().Day()+1,
			 		(TUint)secondDateSeparator,
			 		eventTimeInHomeTime.DateTime().Month()+1,
			 		(TUint)thirdDateSeparator,
			 		eventTimeInHomeTime.DateTime().Year());
				}
				break;
			}
		}
	else
		{
		switch ( dateFormat )
			{
			case EDateAmerican: // US format (mm/dd/yyyy)
				{
				ret->Des().Format(_L("%02d%c%02d"),
			 		eventTimeInHomeTime.DateTime().Month()+1,
			 		(TUint)secondDateSeparator,
			 		eventTimeInHomeTime.DateTime().Day()+1 );
				}
				break;
			case EDateJapanese: // Japanese format (yyyy/mm/dd)
				{
				ret->Des().Format( _L("%02d%c%02d"),
			 		eventTimeInHomeTime.DateTime().Month()+1,
			 		(TUint)thirdDateSeparator,
			 		eventTimeInHomeTime.DateTime().Day()+1 );
				}
				break;
			case EDateEuropean: // European format (dd/mm/yyyy)
			default:
				{
				ret->Des().Format(_L("%02d%c%02d"),
			 		eventTimeInHomeTime.DateTime().Day()+1,
			 		(TUint)secondDateSeparator,
			 		eventTimeInHomeTime.DateTime().Month()+1 );
				}
				break;
			}
		}
   	TPtr dataPtr( ret->Des() );
   	AknTextUtils::LanguageSpecificNumberConversion( dataPtr );
	return ret;
	}

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::TimeTextFromMsgLC
// -----------------------------------------------------------------------------
HBufC* TFsEmailUiUtility::TimeTextFromMsgLC( const CFSMailMessage* aMessage )
	{
    FUNC_LOG;
    TBuf<20> timeStr;
    TBuf<20> timeStrFormat;
	TTime eventTimeInHomeTime = aMessage->GetDate();
    TLocale currentLocaleSettings;
    eventTimeInHomeTime = eventTimeInHomeTime +
    					  (currentLocaleSettings.UniversalTimeOffset());
    eventTimeInHomeTime += currentLocaleSettings.QueryHomeHasDaylightSavingOn()
    					  ? TTimeIntervalHours(1) : TTimeIntervalHours(0);
    if( currentLocaleSettings.AmPmSymbolPosition() == ELocaleBefore )
        {
        timeStrFormat.Append( KTimeFormatBefore );
        timeStrFormat.Append( KTimeFormatSpace );
        timeStrFormat.Append( KTimeFormatHour );
        timeStrFormat.Append( currentLocaleSettings.TimeSeparator( KSecondSeparator ) );
        timeStrFormat.Append( KTimeFormatMinutes );
        eventTimeInHomeTime.FormatL( timeStr, timeStrFormat );
        }
    else
        {
        timeStrFormat.Append( KTimeFormatHour );
        timeStrFormat.Append( currentLocaleSettings.TimeSeparator( KSecondSeparator ) );
        timeStrFormat.Append( KTimeFormatMinutes );
        timeStrFormat.Append( KTimeFormatSpace );
        timeStrFormat.Append( KTimeFormatAfter );
        eventTimeInHomeTime.FormatL( timeStr, timeStrFormat );
        }
    HBufC* dataStr = HBufC::NewL( 1 + timeStr.Length() );
    TPtr dataPtr( dataStr->Des() );
    dataPtr.Append( timeStr );
    CleanupStack::PushL( dataStr );
    AknTextUtils::LanguageSpecificNumberConversion( dataPtr );
    return dataStr;
	}


// -----------------------------------------------------------------------------
// TFsEmailUiUtility::ListMsgTimeTextFromMsgLC
// -----------------------------------------------------------------------------
HBufC* TFsEmailUiUtility::ListMsgTimeTextFromMsgLC( const CFSMailMessage* aMessage, TBool aDividersInUse )
	{
    FUNC_LOG;
	// If dividers are in use, returjn normal time text
    if ( aDividersInUse )
    	{
    	return TimeTextFromMsgLC( aMessage );
    	}

	// If dividers are not in use, today's emails need to use time, others need to use date.
 	TTime eventTimeInHomeTime = aMessage->GetDate();
	TTime currentTime;
	currentTime.HomeTime();
 	TLocale currentLocaleSettings;
    eventTimeInHomeTime = eventTimeInHomeTime +
    					  (currentLocaleSettings.UniversalTimeOffset());
    eventTimeInHomeTime += currentLocaleSettings.QueryHomeHasDaylightSavingOn()
    					  ? TTimeIntervalHours(1) : TTimeIntervalHours(0);
 	if ( currentTime.DayNoInYear() == eventTimeInHomeTime.DayNoInYear() &&
 		 currentTime.DateTime().Year() == eventTimeInHomeTime.DateTime().Year() )
 		{
		// Event is today, use time text from msg
		return TimeTextFromMsgLC( aMessage );
    	}
    else
    	{
    	// Event is not from today, use date text without year number
		return DateTextFromMsgLC( aMessage, EFalse );
    	}
	}


// -----------------------------------------------------------------------------
// TFsEmailUiUtility::WeekDayTextFromMsgLC
// -----------------------------------------------------------------------------
HBufC* TFsEmailUiUtility::WeekDayTextFromMsgLC( const CFSMailMessage* aMessage,
													 TBool aUseToday,
													 TBool aUseYesterday,
													 TBool& aWasToday,
													 TBool& aWasYesterday )
	{
    FUNC_LOG;
	HBufC* ret(0);
	TTime eventTimeInHomeTime = aMessage->GetDate();
	TTime currentTime;
	currentTime.HomeTime();
    TLocale currentLocaleSettings;

	// Correct current time and event time UTC offset and daylight saving time
    eventTimeInHomeTime = eventTimeInHomeTime +
    					  (currentLocaleSettings.UniversalTimeOffset());
    eventTimeInHomeTime += currentLocaleSettings.QueryHomeHasDaylightSavingOn()
    					  ? TTimeIntervalHours(1) : TTimeIntervalHours(0);

 	TBool eventTimeIsToday(EFalse);
 	TBool eventTimeIsYesterday(EFalse);
 	// Check if year and day number in year are the same, e.g. today
 	if ( currentTime.DayNoInYear() == eventTimeInHomeTime.DayNoInYear() &&
 		 currentTime.DateTime().Year() == eventTimeInHomeTime.DateTime().Year() )
 		{
		eventTimeIsToday = ETrue;
  		}
 	// Check if year and current day number minus one in year are the same, e.g. yesterday
 	else if ( currentTime.DayNoInYear()-1 == eventTimeInHomeTime.DayNoInYear() &&
 		currentTime.DateTime().Year() == eventTimeInHomeTime.DateTime().Year() )
 		{
		eventTimeIsYesterday = ETrue;
		}
	if ( aUseToday && eventTimeIsToday )
		{
		ret = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_WEEEKDAY_TODAY );
		aWasToday = ETrue;
		}
	else if ( aUseYesterday && eventTimeIsYesterday )
		{
		ret = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_WEEEKDAY_YESTERDAY );
		aWasYesterday = ETrue;
		}
	else
		{
		switch ( eventTimeInHomeTime.DayNoInWeek() )
			{
			case EMonday:
				ret = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_WEEEKDAY_MONDAY );
				break;
			case ETuesday:
				ret = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_WEEEKDAY_TUESDAY );
				break;
			case EWednesday:
				ret = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_WEEEKDAY_WEDNESDAY );
				break;
			case EThursday:
				ret = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_WEEEKDAY_THURSDAY );
				break;
			case EFriday:
				ret = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_WEEEKDAY_FRIDAY );
				break;
			case ESaturday:
				ret = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_WEEEKDAY_SATURDAY );
				break;
			case ESunday:
				ret = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_WEEEKDAY_SUNDAY );
				break;
			}
		}
	return ret;
	}


// -----------------------------------------------------------------------------
// TFsEmailUiUtility::CreateSizeDescLC
// -----------------------------------------------------------------------------
HBufC* TFsEmailUiUtility::CreateSizeDescLC( TInt aSizeInBytes,
                                            TBool aShowSizeInBytes )
    {
    FUNC_LOG;
    HBufC* sizeDesc = NULL;

    if ( aSizeInBytes >= KMega ) // Show in MB with one decimal
        {
        // The largest possible file size in 32bit architecture is 2^32 bytes = 4096 MB.
        // Thus, we need to reserve 4 characters for the megabyte part, one for decimal
        // separator, and one for decimal part.
        HBufC* numberBuf = HBufC::NewLC(4+1+1);
        TPtr numberDes = numberBuf->Des();

        TInt megaBytePart = aSizeInBytes / KMega;
        TInt remainder = aSizeInBytes % KMega;
        TInt decimalPart = (remainder*10 + KMega/2) / KMega; // The +KMega/2 is used to get normal rounding rules
        // if decimal part gets rounded up to 10, we need to increment the megabyte part
        if ( decimalPart == 10 )
            {
            megaBytePart++;
            decimalPart = 0;
            }

        TLocale locale;
        TChar decimalSeparator = locale.DecimalSeparator();

        numberDes.Num( megaBytePart );
        numberDes.Append( decimalSeparator );
        numberDes.AppendNum( decimalPart );

        if( aShowSizeInBytes )
            {
            sizeDesc = StringLoader::LoadL( R_FREESTYLE_EMAIL_UI_SIZE_IN_MB_WITH_BYTES,
                                            *numberBuf, aSizeInBytes );
            }
        else
            {
            sizeDesc = StringLoader::LoadL( R_FREESTYLE_EMAIL_UI_SIZE_IN_MB, *numberBuf );
            }
        CleanupStack::PopAndDestroy( numberBuf );
        CleanupStack::PushL( sizeDesc );
        }
    else if ( aSizeInBytes >= KKilo || aSizeInBytes == 0 ) // Show in kB without decimals
        {
        TInt sizeInKB = (aSizeInBytes + KKilo/2) / KKilo; // The +KKilo/2 is used to get normal rounding rules
        if( aShowSizeInBytes )
            {
            HBufC* numberBuf = HBufC::NewLC(8);
            TPtr numberDes = numberBuf->Des();
            numberDes.Num( sizeInKB );

            sizeDesc = StringLoader::LoadL( R_FREESTYLE_EMAIL_UI_SIZE_IN_KB_WITH_BYTES,
                                            *numberBuf, aSizeInBytes );
            CleanupStack::PopAndDestroy( numberBuf );
            CleanupStack::PushL( sizeDesc );
            }
        else
            {
            sizeDesc = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_SIZE_IN_KB, sizeInKB );
            }
        }
    else if ( aSizeInBytes > 0 ) // show "less than kilobyte"
        {
        if( aShowSizeInBytes )
            {
            sizeDesc = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_SIZE_LESS_THAN_KB_WITH_BYTES,
                                            aSizeInBytes );
            }
        else
            {
            sizeDesc = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_SIZE_LESS_THAN_KB );
            }
        }
    else // negative numbers are not supported
        {
        __ASSERT_DEBUG( EFalse, Panic(EFSEmailUiUnexpectedValue) );
        sizeDesc = KNullDesC().AllocLC();
        }

    // Do number conversion to Arabic/Eastern Arabic/Indic digits when necessary
    TPtr des = sizeDesc->Des();
    AknTextUtils::LanguageSpecificNumberConversion( des );

    return sizeDesc;
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::CompareMailSubjectsL
// -----------------------------------------------------------------------------
TInt TFsEmailUiUtility::CompareMailSubjectsL( const CFSMailMessage* aMessage1,
                                              const CFSMailMessage* aMessage2 )
	{
    FUNC_LOG;
	TInt result( 0 );

	if ( aMessage1 &&  aMessage2 )
		{
		HBufC* compareSubject1 = CreateSubjectWithoutLocalisedPrefixLC( aMessage1, ETrue );
		compareSubject1->Des().LowerCase();
		HBufC* compareSubject2 = CreateSubjectWithoutLocalisedPrefixLC( aMessage2, ETrue );
		compareSubject2->Des().LowerCase();

		result = compareSubject1->CompareC( *compareSubject2 );

		CleanupStack::PopAndDestroy( compareSubject2 );
		CleanupStack::PopAndDestroy( compareSubject1 );
		}
	// Check if one subject pointer is valid instead of other -> result is non-zero.
	else if ( aMessage1 && !aMessage2  )
	    {
	    result = 1;
	    }
	else if ( !aMessage1 && aMessage2 )
		{
		result = -1;
		}
	return result;
	}

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::CreateSubjectWithoutLocalisedPrefixLC
// -----------------------------------------------------------------------------
HBufC* TFsEmailUiUtility::CreateSubjectWithoutLocalisedPrefixLC(
        const CFSMailMessage* aMessage,
        TBool aSuppressNotAvailableText /*= EFalse*/ )
	{
    FUNC_LOG;
    TDesC* subject = &aMessage->GetSubject();
	TPtrC croppedSubject;
    if ( subject )
        {
        croppedSubject.Set( *subject );
        }

	TBool prefixFound = EFalse;

	do
	    {
	    prefixFound = EFalse;

	    // Remove leading white space before trying to find the prefix
	    while( croppedSubject.Length() &&
	           TChar(croppedSubject[0]).IsSpace() )
	        {
	        croppedSubject.Set( croppedSubject.Mid(1) );
	        }

    	// try to find ":" at the beginning
		// Locate : character on location 1,2 and 3
	    static const TInt KPrefixMinLength = 1;
	    static const TInt KPrefixMaxLength = 3;
	    static const TText KPrefixSeparator = ':';
		TInt separatorPosition = croppedSubject.Locate( KPrefixSeparator );
		if ( separatorPosition >= KPrefixMinLength &&
		     separatorPosition <= KPrefixMaxLength )
			{
			TPtrC prefixCandidate = croppedSubject.Left( separatorPosition );
			// Only fully alphabetic prefixes are cropped
			TBool isAlpha = ETrue;
			for ( TInt i = 0 ; i < prefixCandidate.Length() ; ++i )
			    {
			    if ( !TChar( prefixCandidate[i] ).IsAlpha() )
			        {
			        isAlpha = EFalse;
			        }
			    }
			if ( isAlpha )
			    {
    			croppedSubject.Set( croppedSubject.Mid( separatorPosition+1 ) );
    			prefixFound = ETrue;
			    }
			}
	    }
	while ( prefixFound );

	HBufC* ret = croppedSubject.AllocLC();

	// Filter out undesirable characters and remove extra white space
	TPtr retPtr = ret->Des();
	FilterListItemTextL( retPtr );

	// Use "(no subject available)" text if subject is emtpy and this is not forbidden by caller
	if ( !ret->Length() && !aSuppressNotAvailableText )
	    {
	    CleanupStack::PopAndDestroy( ret );
	    ret = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_VIEWER_NO_SUBJECT );
	    }

	return ret;
	}

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::CreateSubjectTextLC
// -----------------------------------------------------------------------------
HBufC* TFsEmailUiUtility::CreateSubjectTextLC( const CFSMailMessage* aMessage )
    {
    FUNC_LOG;
    HBufC* subjectText = NULL;

    if ( aMessage )
        {
        const TDesC* subject = &aMessage->GetSubject();
        if ( subject )
            {
            subjectText = subject->AllocLC();
            TPtr ptr( subjectText->Des() );
            FilterListItemTextL( ptr );
            // discard the subject text if it's empty after the filtering
            if ( !subjectText->Length() )
                {
                CleanupStack::PopAndDestroy( subjectText );
                subjectText = NULL;
                }
            }
        }

    // Use "(no subject available)" text if no other visible subject got
    if ( !subjectText )
        {
        subjectText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_VIEWER_NO_SUBJECT );
        }

    return subjectText;
    }


// -----------------------------------------------------------------------------
// TFsEmailUiUtility::CreateBodyTextLC
// -----------------------------------------------------------------------------
HBufC* TFsEmailUiUtility::CreateBodyTextLC( const CFSMailMessage* aMessage )
    {
    FUNC_LOG;
    HBufC* bodyText = NULL;

    if ( aMessage )
        {
        CFSMailMessage* msg = const_cast<CFSMailMessage*> (aMessage);
        CFSMailMessagePart* bodyPart = msg->PlainTextBodyPartL();
        if ( bodyPart )
            {
            CleanupStack::PushL( bodyPart );
            bodyText = HBufC::NewLC(bodyPart->ContentSize());
            TPtr ptr =  bodyText->Des();
            bodyPart->GetContentToBufferL(ptr, 0);

            FilterListItemTextL( ptr );
            // discard the subject text if it's empty after the filtering
            if ( !bodyText->Length() )
                {
                CleanupStack::PopAndDestroy( bodyText );
                bodyText = NULL;
                }
            CleanupStack::PopAndDestroy( bodyPart );
            }
        }

    // Use "(no subject available)" text if no other visible subject got
    if ( !bodyText )
        {
        bodyText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_VIEWER_NO_SUBJECT );
        }

    return bodyText;
    }



// ---------------------------------------------------------------------------
// TFsEmailUiUtility::FilterPreviewPaneTextL
// This function crops out tabulator and line feed characters from the given data.
// After that, it will makes sure that there are no consecutive space characters for
// preview pane text
// ---------------------------------------------------------------------------
//
void TFsEmailUiUtility::FilterListItemTextL( TDes& aText )
    {
    FUNC_LOG;
    _LIT( KCharsToReplace, "\r\n\t\x2028\x2029" );

    AknTextUtils::ReplaceCharacters( aText, KCharsToReplace, ' ' );
    aText.TrimAll();
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::MessageSizeClass
// -----------------------------------------------------------------------------
TMessageSizeClass TFsEmailUiUtility::MessageSizeClass( const CFSMailMessage& aMessage )
    {
    FUNC_LOG;
    TUint msgSize = aMessage.ContentSize();
    TMessageSizeClass sizeClass;

    if ( msgSize < ETiny )
        {
        sizeClass = ETiny;
        }
    else if ( msgSize < ESmall )
        {
        sizeClass = ESmall;
        }
    else if ( msgSize < EMedium )
        {
        sizeClass = EMedium;
        }
    else if ( msgSize < ELarge )
        {
        sizeClass = ELarge;
        }
    else if ( msgSize < EVeryLarge )
        {
        sizeClass = EVeryLarge;
        }
    else if ( msgSize < EHuge )
        {
        sizeClass = EHuge;
        }
    else
        {
        sizeClass = EColossal;
        }

    return sizeClass;
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::ConvertHtmlToTxtL
// -----------------------------------------------------------------------------
HBufC* TFsEmailUiUtility::ConvertHtmlToTxtL( const TDesC& aHtml )
    {
    FUNC_LOG;
    enum TPrevious
        {
        ENone, // Nothing special in previous character
        EHeadTag, // We are in head tag
        ETagEnd, // Previous character contained tag ending
        ESpace // Previous character contained space
        };

    _LIT( KTagStart, "<" );
    _LIT( KTagEnd, ">" );
    _LIT( KHeadStart, "head" );
    _LIT( KHeadEnd, "/head>" );

    TInt tagCount = 0; // Amount of nested tags
    TInt sizeToParse = aHtml.Length(); // How much we have to parse
    TPrevious previous = ENone; // Previous characters type.
    HBufC* txtBuffer = HBufC::NewLC( sizeToParse );

    // HTML parsing.
    TInt lineFeedCount = 0;
    TInt index = 0; // Parsing index
    for ( index = 0; index < sizeToParse; index++ )
        {
        // Get the next character
        TPtrC ptr = aHtml.Mid( index, 1 );

        // Are we in header
        if ( previous == EHeadTag )
            {
            // Is this a start of end tag
            if ( ptr.Compare( KTagStart ) == 0 &&
                    index + KHeadEnd().Length() < sizeToParse )
                {
                ptr.Set( aHtml.Mid( index + 1, KHeadEnd().Length() ) );
                if ( ptr.Compare( KHeadEnd ) == 0 )
                    {
                    previous = ETagEnd;
                    index += KHeadEnd().Length();
                    }
                }

            }
        // Is this a start of the tag
        else if ( ptr.Compare( KTagStart ) == 0 )
            {
            lineFeedCount = 0;

            if ( index + KHeadStart().Length() < sizeToParse )
                {
                ptr.Set( aHtml.Mid( index + 1, KHeadStart().Length() ) );
                if ( ptr.Compare( KHeadStart ) == 0 )
                    {
                    previous = EHeadTag;
                    index += KHeadStart().Length();
                    }
                }

            if ( previous != EHeadTag )
                {
                // Increase the number of nested tags
                tagCount++;
                previous = ENone;
                }
            }
        // Are we inside of the tag
        else if ( tagCount > 0 )
            {
            // Is this the end of the tag
            if ( ptr.Compare( KTagEnd ) == 0 )
                {
                tagCount--;
                if ( tagCount < 0 )
                    {
                    // To avoid unnecessary errors convert negative
                    // values to zero.
                    tagCount = 0;
                    }
                if ( tagCount == 0 )
                    {
                    previous = ETagEnd;
                    }
                }
            }
        // We are not inside of the tag
        else
            {
            if ( previous == ETagEnd )
                {
                // Skip multiple line feed and carriage return characters
                if ( ptr.Compare( KCarriageReturn ) != 0 &&
                     ptr.Compare( KLineFeed ) != 0 )
                    {
                    if ( lineFeedCount > 0 )
                        {
                        txtBuffer->Des().Append( KLineFeed );
                        lineFeedCount = 0;
                        }
                    txtBuffer->Des().Append( ptr );
                    previous = ENone;
                    }
                else if ( ptr.Compare( KLineFeed ) == 0 )
                    {
                    lineFeedCount++;
                    }
                }
            else
                {
                if ( previous == ESpace )
                    {
                    // Skip consecutive spaces
 //                   if ( ptr.Compare( KSpace ) != 0 )
 //                       {
                            txtBuffer->Des().Append( ptr );
 //                       }
                    }
                else
                    {
                    txtBuffer->Des().Append( ptr );
                    }
                if ( ptr.Compare( KSpace ) == 0 )
                    {
                    previous = ESpace;
                    }
                else
                    {
                    previous = ENone;
                    }
                }
            }
        }

    CleanupStack::Pop( txtBuffer );

    return txtBuffer;
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::CompareMailAddressesL
// -----------------------------------------------------------------------------
TInt TFsEmailUiUtility::CompareMailAddressesL( CFSMailAddress* aAddr1,
    CFSMailAddress* aAddr2 )
	{
    FUNC_LOG;
	TInt result( 0 );
	if ( aAddr1 && aAddr2 )
		{
		HBufC* compareName1 = CreateCompareNameForAddressLC( *aAddr1 );
        HBufC* compareName2 = CreateCompareNameForAddressLC( *aAddr2 );

        result = compareName1->CompareC( *compareName2 );

        CleanupStack::PopAndDestroy( compareName2 );
        CleanupStack::PopAndDestroy( compareName1 );
		}
		// Check if one address pointer is valid instead of other -> result is non-zero.
	else if ( ( aAddr1 && !aAddr2  ) )
	    {
	    result = 1;
	    }
	else if ( !aAddr1 && aAddr2  )
		{
		result = -1;
		}
	return result;
	}

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::CreateCompareNameForAddressLC
// -----------------------------------------------------------------------------
HBufC* TFsEmailUiUtility::CreateCompareNameForAddressLC( const CFSMailAddress& aAddress )
    {
    FUNC_LOG;
    HBufC* result = NULL;

    TDesC* displayName = &aAddress.GetDisplayName();
    TDesC* emailAddress = &aAddress.GetEmailAddress();

    if ( displayName && displayName->Length() )
        {
        result = displayName->AllocLC();
        }
    else if ( emailAddress && emailAddress->Length() )
        {
        result = emailAddress->AllocLC();
        }
    else
        {
        result = KNullDesC().AllocLC();
        }

    result->Des().LowerCase();
    return result;
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::CountRecepients
// -----------------------------------------------------------------------------
TInt TFsEmailUiUtility::CountRecepients( CFSMailMessage* aMsgPtr )
    {
    FUNC_LOG;
    return aMsgPtr->GetToRecipients().Count() + aMsgPtr->GetCCRecipients().Count();
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::CountRecipientsSmart
// Calculates recipient count from To and Cc recipient as well as tries to 
// see if the message is sent via message list.
// -----------------------------------------------------------------------------
TInt TFsEmailUiUtility::CountRecipientsSmart( CFreestyleEmailUiAppUi& aAppUi, CFSMailMessage* aMsgPtr )
    {
    FUNC_LOG;
    TInt numRecipients( CountRecepients( aMsgPtr ) );
    if ( numRecipients == 1 )
        {
        CFSMailBox* mailBox = NULL;
        
        TRAPD( error, mailBox = aAppUi.GetMailClient()->GetMailBoxByUidL( aMsgPtr->GetMailBoxId() ) );
        
        if (mailBox && !error)
            {
            //check if the malbox ownmailaddress is same as the recipients email address. If not, then assume that the
            //email is a distribution list and we need to inc num of Recipients so that "Reply ALL" option appears in UI.
            if ( aMsgPtr->GetToRecipients().Count() )
                {
                if ( mailBox->OwnMailAddress().GetEmailAddress().CompareF(aMsgPtr->GetToRecipients()[0]->GetEmailAddress()) )
                    {
                    numRecipients++;
                    }
                }
            if ( aMsgPtr->GetCCRecipients().Count() )
                {
                if ( mailBox->OwnMailAddress().GetEmailAddress().CompareF(aMsgPtr->GetCCRecipients()[0]->GetEmailAddress()) )
                    {
                    numRecipients++;
                    }
                }
            if ( aMsgPtr->GetBCCRecipients().Count() )
                {
                if ( mailBox->OwnMailAddress().GetEmailAddress().CompareF(aMsgPtr->GetBCCRecipients()[0]->GetEmailAddress()) )
                    {
                    numRecipients++;
                    }
                }
            }
        
        delete mailBox;
        }
    
    return numRecipients;
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::IsMessageBodyLargeL
// -----------------------------------------------------------------------------
TBool TFsEmailUiUtility::IsMessageBodyLargeL( CFSMailMessage* aMessage )
    {
    FUNC_LOG;
    TBool ret = EFalse;
    if ( aMessage )
        {
        CFSMailMessagePart* plainTextBodyPart = aMessage->PlainTextBodyPartL();
        CleanupStack::PushL( plainTextBodyPart );
        CFSMailMessagePart* htmlBodyPart = aMessage->HtmlBodyPartL();
        CleanupStack::PushL( htmlBodyPart );

        if ( (plainTextBodyPart && plainTextBodyPart->FetchedContentSize() > KLargePlainTextSizeLimit) ||
             (htmlBodyPart && htmlBodyPart->FetchedContentSize() > KLargeHtmlTextSizeLimit) )
            {
            ret = ETrue;
            }

        CleanupStack::PopAndDestroy( htmlBodyPart );
        CleanupStack::PopAndDestroy( plainTextBodyPart );
        }
    return ret;
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::GetUnreadMsgIconL
// -----------------------------------------------------------------------------
TFSEmailUiTextures TFsEmailUiUtility::GetUnreadMsgIcon( CFSMailMessage* aMsgPtr )
	{
    FUNC_LOG;
	TFSEmailUiTextures textureId;
	// Unread calendar invitation
	if ( aMsgPtr->IsFlagSet( EFSMsgFlag_CalendarMsg ))
		{
		if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Important ) )
			{
			if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Attachments ) )
				{
				textureId = EMessageCalInvitationAttachmentsHighPrio ;
				}
			else
				{
				textureId = EMessageCalInvitationHighPrio;
				}
			}
		else if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Low ) )
			{
			if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Attachments ) )
				{
				textureId = EMessageCalInvitationAttachmentsLowPrio;
				}
			else
				{
				textureId = EMessageCalInvitationLowPrio;
				}
			}
		else
			{
			if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Attachments ) )
				{
				textureId = EMessageCalInvitationAttachments;
				}
			else
				{
				textureId = EMessageCalInvitation;
				}
			}
        // <cmail>
		TBool cancellationMsg = EFalse;
		TRAP_IGNORE( cancellationMsg = IsMrCancellationMsgL( aMsgPtr ) );
		if ( cancellationMsg )
		    {
		    textureId = EMessageCalInvitationCancelled;
		    }
        // </cmail>
		}
	else	// Normal message icons
		{
		// Check whether msg has attachment or not
		if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Attachments )) // Has attachments
			{
			if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Important )) // High priority, has attachments
				{
				if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Answered ) )
					{
					textureId = EMessageUnreadRepliedHighPrioIconAttachment;
					}
				else if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Forwarded ) )
					{
					textureId = EMessageUnreadForwardedHighPrioIconAttachment;
					}
				else
					{
					textureId = EMessageHighPrioUnreadIconAttachment;
					}
				}
			else if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Low ) ) // Low priority, has attachments
				{
				if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Answered ) )
					{
					textureId = EMessageUnreadRepliedLowPrioIconAttachment;
					}
				else if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Forwarded ) )
					{
					textureId = EMessageUnreadForwardedLowPrioIconAttachment;
					}
				else
					{
					textureId = EMessageLowPrioUnreadIconAttachment;
					}
				}
			else // Normal priority, has attachments
				{
				if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Answered ) )
					{
					textureId = EMessageUnreadRepliedIconAttachment;
					}
				else if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Forwarded ) )
					{
					textureId = EMessageUnreadForwardedIconAttachment;
					}
				else
					{
					textureId = EMessageUnreadIconAttachment;
					}
				}
			}

		else // No attachments
			{
			if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Important )) // High priority, no attachments
				{
				if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Answered ) )
					{
					textureId = EMessageUnreadRepliedHighPrioIcon;
					}
				else if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Forwarded ) )
					{
					textureId = EMessageUnreadForwardedHighPrioIcon;
					}
				else
					{
					textureId = EMessageHighPrioUnreadIcon;
					}
				}
			else if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Low ) ) // Low priority, no attachments
				{
				if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Answered ) )
					{
					textureId = EMessageUnreadRepliedLowPrioIcon;
					}
				else if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Forwarded ) )
					{
					textureId = EMessageUnreadForwardedLowPrioIcon;
					}
				else
					{
					textureId = EMessageLowPrioUnreadIcon;
					}
				}
			else // Normal priority, no attachments
				{
				if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Answered ) )
					{
					textureId = EMessageUnreadRepliedIcon;
					}
				else if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Forwarded ) )
					{
					textureId = EMessageUnreadForwardedIcon;
					}
				else
					{
					textureId = EMessageUnreadIcon;
					}
				}
			}
		}
	return textureId;
	}


// -----------------------------------------------------------------------------
// TFsEmailUiUtility::GetReadMsgIconL
// -----------------------------------------------------------------------------
TFSEmailUiTextures TFsEmailUiUtility::GetReadMsgIcon( CFSMailMessage* aMsgPtr )
	{
    FUNC_LOG;
	TFSEmailUiTextures textureId;
	// Check for calendar invitation first
	if ( aMsgPtr->IsFlagSet( EFSMsgFlag_CalendarMsg ))
		{
		if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Important ) )
			{
			if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Attachments ) )
				{
				textureId = EMessageCalInvitationReadAttachmentsHighPrio ;
				}
			else
				{
				textureId = EMessageCalInvitationReadHighPrio;
				}
			}
		else if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Low ) )
			{
			if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Attachments ) )
				{
				textureId = EMessageCalInvitationReadAttachmentsLowPrio;
				}
			else
				{
				textureId = EMessageCalInvitationReadLowPrio;
				}
			}
		else
			{
			if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Attachments ) )
				{
				textureId = EMessageCalInvitationReadAttachments;
				}
			else
				{
				textureId = EMessageCalInvitationRead;
				}
			}
		// <cmail>
		TBool cancellationMsg = EFalse;
		TRAP_IGNORE( cancellationMsg = IsMrCancellationMsgL( aMsgPtr ) );
		if ( cancellationMsg )
		    {
            textureId = EMessageCalInvitationCancelled;
            }
        // </cmail>
		}
	else	// Normal message icons
		{
		// Check whether msg has attachment or not
		if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Attachments )) // Has attachments
			{
			if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Important )) // High priority, has attachments
				{
				if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Answered ) )
					{
					textureId = EMessageReadRepliedHighPrioIconAttachment;
					}
				else if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Forwarded ) )
					{
					textureId = EMessageReadForwardedHighPrioIconAttachment;
					}
				else
					{
					textureId = EMessageHighPrioReadIconAttachment;
					}
				}
			else if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Low ) ) // Low priority, has attachments
				{
				if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Answered ) )
					{
					textureId = EMessageReadRepliedLowPrioIconAttachment;
					}
				else if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Forwarded ) )
					{
					textureId = EMessageReadForwardedLowPrioIconAttachment;
					}
				else
					{
					textureId = EMessageLowPrioReadIconAttachment;
					}
				}
			else // Normal priority, has attachments
				{
				if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Answered ) )
					{
					textureId = EMessageReadRepliedIconAttachment;
					}
				else if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Forwarded ) )
					{
					textureId = EMessageReadForwardedIconAttachment;
					}
				else
					{
					textureId = EMessageReadIconAttachment;
					}
				}
			}
		else // No attachments
			{
			if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Important )) // High priority, no attachments
				{
				if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Answered ) )
					{
					textureId = EMessageReadRepliedHighPrioIcon;
					}
				else if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Forwarded ) )
					{
					textureId = EMessageReadForwardedHighPrioIcon;
					}
				else
					{
					textureId = EMessageHighPrioReadIcon;
					}
				}
			else if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Low ) ) // Low priority, no attachments
				{
				if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Answered ) )
					{
					textureId = EMessageReadRepliedLowPrioIcon;
					}
				else if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Forwarded ) )
					{
					textureId = EMessageReadForwardedLowPrioIcon;
					}
				else
					{
					textureId = EMessageLowPrioReadIcon;
					}
				}
			else // Normal priority, no attachments
				{
				if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Answered ) )
					{
					textureId = EMessageReadRepliedIcon;
					}
				else if ( aMsgPtr->IsFlagSet( EFSMsgFlag_Forwarded ) )
					{
					textureId = EMessageReadForwardedIcon;
					}
				else
					{
					textureId = EMessageReadIcon;
					}
				}
			}
		}
	return textureId;
	}

// <cmail>
// -----------------------------------------------------------------------------
// TFsEmailUiUtility::IsMrCancellationMsgL
// -----------------------------------------------------------------------------
TBool TFsEmailUiUtility::IsMrCancellationMsgL( CFSMailMessage* aMsgPtr )
    {
    FUNC_LOG;
    TBool isCancel = EFalse;

    if ( !iMrViewer )
        {
        if ( !iMrViewerCallback )
            {
            iMrViewerCallback = new (ELeave) CMrViewerEmptyCallback;
            }
        iMrViewer = CESMRIcalViewer::NewL( *iMrViewerCallback );
        }

    TESMRMeetingRequestMethod method = iMrViewer->ResolveMeetingRequestMethodL(*aMsgPtr);
    if ( method == EESMRMeetingRequestMethodCancellation )
        {
        isCancel = ETrue;
        }

    return isCancel;
    }
// </cmail>

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::CopyToClipboardL
// -----------------------------------------------------------------------------
void TFsEmailUiUtility::CopyToClipboardL( const TDesC &aBuf )
	{
    FUNC_LOG;
	CClipboard* cb = CClipboard::NewForWritingLC( CCoeEnv::Static()->FsSession() );

	cb->StreamDictionary().At( KClipboardUidTypePlainText );

	CPlainText* plainText = CPlainText::NewL();
	CleanupStack::PushL( plainText );

	plainText->InsertL( 0 , aBuf );

	plainText->CopyToStoreL( cb->Store(), cb->StreamDictionary(), 0, plainText->DocumentLength() );

	CleanupStack::PopAndDestroy( plainText );
	cb->CommitL();
	CleanupStack::PopAndDestroy( cb );
	}

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::ToggleEmailIconL
// -----------------------------------------------------------------------------
void TFsEmailUiUtility::ToggleEmailIconL(TBool aIconOn )
	{
    FUNC_LOG;
	if(aIconOn)
		{
		RProperty::Set( KPSUidCoreApplicationUIs, KCoreAppUIsNewEmailStatus, ECoreAppUIsNewEmail );
		}
	else
		{
		RProperty::Set( KPSUidCoreApplicationUIs, KCoreAppUIsNewEmailStatus, ECoreAppUIsNoNewEmail );
		}
	}

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::DisplayMsgsMovedNoteL
// -----------------------------------------------------------------------------
void TFsEmailUiUtility::DisplayMsgsMovedNoteL( TInt aMsgCount, const TFSMailMsgId aDestinationFolderId,
										   	   TBool /*aIsWaitingNote*/ )
	{
    FUNC_LOG;
	if ( aDestinationFolderId.Id() != 0 )
		{
		CFreestyleEmailUiAppUi* appUi = (CFreestyleEmailUiAppUi*)CCoeEnv::Static()->AppUi();
		CFSMailFolder* folder = appUi->GetMailClient()->GetFolderByUidL( appUi->GetActiveMailboxId(), aDestinationFolderId );
		if ( folder )
			{
			CleanupStack::PushL( folder );
			HBufC* folderName(0);
			TInt folderType = folder->GetFolderType();
			switch ( folderType )
				{
				case EFSInbox:
					{
					folderName = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_FOLDER_LIST_INBOX );
					}
					break;
				case EFSOutbox:
					{
					folderName = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_FOLDER_LIST_OUTBOX );
					}
					break;
				case EFSDraftsFolder:
					{
					folderName = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_FOLDER_LIST_DRAFTS );
					}
					break;
				case EFSSentFolder:
					{
					folderName = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_FOLDER_LIST_SENT );
					}
					break;
				case EFSDeleted:
					{
					folderName = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_FOLDER_LIST_DELETED );
					}
					break;
				default:
					{
					folderName = HBufC::NewLC( folder->GetFolderName().Length() );
					folderName->Des().Append( folder->GetFolderName() );
					}
					break;
				}
			if ( aMsgCount == 1)
				{
				HBufC* noteText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_MESSAGE_TO_FOLDER, *folderName  );
				// <cmail> replace global note with aknnote to allow exiting with red key
			    //CAknGlobalNote* globalNote = CAknGlobalNote::NewLC();
			    //globalNote->ShowNoteL( EAknGlobalInformationNote, *noteText );
            	CAknInformationNote* note = new (ELeave) CAknInformationNote( ETrue );
            	note->ExecuteLD( *noteText );
            	CleanupStack::PopAndDestroy( noteText );
			    //CleanupStack::PopAndDestroy( 2 );
			    // </cmail>
				}
			else if ( aMsgCount > 1 )
				{
				HBufC* noteText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_MESSAGES_TO_FOLDER, *folderName, aMsgCount );
			    // <cmail> replace global note with aknnote to allow exiting with red key
			    //CAknGlobalNote* globalNote = CAknGlobalNote::NewLC();
			    //globalNote->ShowNoteL( EAknGlobalInformationNote, *noteText );
            	CAknInformationNote* note = new (ELeave) CAknInformationNote( ETrue );
            	note->ExecuteLD( *noteText );
            	CleanupStack::PopAndDestroy( noteText );
			    // CleanupStack::PopAndDestroy( 2 );
			    // </cmail>
				}
			CleanupStack::PopAndDestroy( folderName );
			CleanupStack::PopAndDestroy( folder );
			}
		}
	}

// ---------------------------------------------------------------------------
// TFsEmailUiUtility::IsOfflineModeL
// ---------------------------------------------------------------------------
//
TBool TFsEmailUiUtility::IsOfflineModeL()
    {
    FUNC_LOG;
    TBool isOffline( EFalse );
    TInt status( ECoreAppUIsNetworkConnectionAllowed );

    CRepository* cenRep = CRepository::NewL( KCRUidCoreApplicationUIs );
    if ( cenRep )
        {
        cenRep->Get( KCoreAppUIsNetworkConnectionAllowed, status );
        }
    delete cenRep;

    if ( status == ECoreAppUIsNetworkConnectionNotAllowed )
	    {
	    isOffline = ETrue;
	    }

    return isOffline;
    }

// ---------------------------------------------------------------------------
// TFsEmailUiUtility::StripDisplayName
// Drop out unwanted characters from display name such as <> and ""
// ---------------------------------------------------------------------------
void TFsEmailUiUtility::StripDisplayName( HBufC& aDisplayName )
	{
    FUNC_LOG;
	// Drop out unwanted chars from display name
	if ( aDisplayName.Length() > 2)
		{
		// Drop out <> and "" characters.
		if ( aDisplayName.Locate('"') == 0 ) // check if  first char is quation mark
			{
			if ( aDisplayName.LocateReverse('"') == aDisplayName.Length()-1 ) // last char
				{
				// Remove first and last
				aDisplayName.Des().Delete(0,1);
				aDisplayName.Des().Delete(aDisplayName.Length()-1,1);
				}
			}
		else if ( aDisplayName.Locate('<') == 0 ) // Else check if first char is bracket
			{
			if ( aDisplayName.LocateReverse('>') == aDisplayName.Length()-1 ) // last char bracket
				{
				// Remove first and last
				aDisplayName.Des().Delete(0,1);
				aDisplayName.Des().Delete(aDisplayName.Length()-1,1);
				}
			}
		}
	}

// ---------------------------------------------------------------------------
// TFsEmailUiUtility::DisplayCreateMailboxQueryL
// @return ETrue if user answered "Yes", EFalse if user answered "No"
// ---------------------------------------------------------------------------
//
TBool TFsEmailUiUtility::DisplayCreateMailboxQueryL()
    {
    FUNC_LOG;
    // load text from resource
    HBufC* question = StringLoader::LoadLC( R_FS_EMAIL_SETTINGS_ADD_MAILBOX_TXT );

    // show dialog
    TRequestStatus status = KRequestPending;
    CAknGlobalConfirmationQuery* query = CAknGlobalConfirmationQuery::NewL();
    CleanupStack::PushL( query );
    query->ShowConfirmationQueryL( status, *question, R_AVKON_SOFTKEYS_YES_NO );
    User::WaitForRequest( status );

    CleanupStack::PopAndDestroy( 2 ); // query question

    return ( status.Int() == EAknSoftkeyYes );
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::BringFsEmailToForeground
// -----------------------------------------------------------------------------
//
void TFsEmailUiUtility::BringFsEmailToForeground()
    {
    FUNC_LOG;
    TApaTaskList taskList( CEikonEnv::Static()->WsSession() );
    TApaTask task = taskList.FindApp( KFSEmailUiUid );
    if ( task.Exists() )
        {
        task.BringToForeground();
        }
    }

// -----------------------------------------------------------------------------
// Creates a displayname of firstname and lastname components
// -----------------------------------------------------------------------------
//
HBufC* TFsEmailUiUtility::CreateDisplayNameLC( const TDesC& aFirstname,
    const TDesC& aLastname )
    {
    FUNC_LOG;
    return CreateDisplayNameLC( aFirstname, aLastname, KNullDesC );
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::CreateDisplayNameLC
// -----------------------------------------------------------------------------
//
HBufC* TFsEmailUiUtility::CreateDisplayNameLC( const TDesC& aFirstname,
    const TDesC& aLastname, const TDesC& aEmailField )
	{
    FUNC_LOG;
	HBufC* displayname = NULL;

	if ( aFirstname.Length() == 0 )
		{
		if ( aLastname.Length() == 0 )
			{
			//There's just the email address for Displayname
			displayname = aEmailField.AllocLC();
			}
		else
			{
			//Lastname = displayname
			displayname = aLastname.AllocLC();
			}
		}

	else if ( aLastname.Length() == 0 )
		{
		//Firstname = displayname
		displayname = aFirstname.AllocLC();
		}

	else
		{
		//Displayname = "firstname lastname"
		displayname = HBufC::NewLC( aFirstname.Length() +
									KSpace().Length() +
									aLastname.Length() );
		displayname->Des().Copy( aFirstname );
		displayname->Des().Append( KSpace );
		displayname->Des().Append( aLastname );
		}

	return displayname;
	}

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::GetFullIconFileNameL
// -----------------------------------------------------------------------------
void TFsEmailUiUtility::GetFullIconFileNameL( TDes& aFileName )
    {
    FUNC_LOG;
    aFileName.Zero();
    aFileName.Copy( KDC_APP_BITMAP_DIR );
    aFileName.Append( KFsEmailIconFileName );
    User::LeaveIfError( CompleteWithAppPath( aFileName ) );
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::DoFileExtensionsMatchL
// -----------------------------------------------------------------------------
TBool TFsEmailUiUtility::DoFileExtensionsMatchL( const TDesC& aFileName1,
                                                 const TDesC& aFileName2 )
    {
    FUNC_LOG;
    TParse parse1;
    TParse parse2;

    parse1.Set( aFileName1, NULL, NULL );
    parse2.Set( aFileName2, NULL, NULL );

    HBufC* ext1 = parse1.Ext().AllocLC();
    HBufC* ext2 = parse2.Ext().AllocLC();

    ext1->Des().LowerCase();
    ext2->Des().LowerCase();

    TBool match = (*ext1 == *ext2);

    CleanupStack::PopAndDestroy( ext2 );
    CleanupStack::PopAndDestroy( ext1 );

    return match;
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::CopyFileToTempDirL
// Makes a copy of given file to the temp directory of FsEmailUI.
// Caller is reponsible of closing the returned file handle.
// -----------------------------------------------------------------------------
RFile TFsEmailUiUtility::CopyFileToTempDirL( const RFile& aSourceFile,
                                             const TDesC& aTargetFileName )
    {
    FUNC_LOG;
    RFs fs( CEikonEnv::Static()->FsSession() );

    // Remove any illegal characters from the target file name
    TFileName targetFileName = aTargetFileName.Right( KMaxFileName ); // truncate just in case; make sure that any file extension remains
    _LIT( KIllegalCharacters, "*?\\<>:\"/|\r\n\t\x2028\x2029" );
    const TText KReplacementChar = '_';
    AknTextUtils::ReplaceCharacters( targetFileName, KIllegalCharacters, KReplacementChar );
    targetFileName.Trim();
    // File name can't begin nor end with dot (.) and cannot be empty
    if ( !targetFileName.Length() )
        {
        targetFileName.Append( KReplacementChar );
        }
    else
        {
        if ( targetFileName[0] == '.' )
            {
            targetFileName[0] = KReplacementChar;
            }
        if ( targetFileName[ targetFileName.Length()-1 ] == '.' )
            {
            targetFileName[ targetFileName.Length()-1 ] = KReplacementChar;
            }
        }

    // If we still couldn't create a legal name, then use the original name as fallback solution
    if ( !fs.IsValidName( targetFileName ) )
        {
        aSourceFile.Name( targetFileName );
        }

    // Construct target file full name
    TFileName targetFilePath;
    GetTempPathL( fs, targetFilePath );
    targetFilePath.Append( targetFileName );

    CFileMan* fileMan = CFileMan::NewL( fs );
    TInt err = fileMan->Copy( aSourceFile, targetFilePath );
    delete fileMan;
    // KErrInUse ignoring check is needed because copying might not succeed
    // if file already exists and handle remains open.
    if ( err != KErrNone && err != KErrInUse )
        {
        User::LeaveIfError( err );
        }

    // Open the copied file
    RFile resultFile;
    err = resultFile.Open( fs, targetFilePath, EFileRead | EFileShareReadersOnly );
    User::LeaveIfError( err );

    return resultFile;
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::EraseTempDir
// Deletes all files from our temporary directory
// -----------------------------------------------------------------------------
void TFsEmailUiUtility::EraseTempDir()
    {
    FUNC_LOG;
    RFs fs( CEikonEnv::Static()->FsSession() );

    TFileName deleteNamePattern;
    TRAPD( err, GetTempPathL( fs, deleteNamePattern ) );
    if ( !err )
        {
        deleteNamePattern.Append( '*' );
        BaflUtils::DeleteFile( fs, deleteNamePattern );
        }
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::GetTempPathL
// Get EmailUI temp directory path. Creates the directory if it does not exist.
// -----------------------------------------------------------------------------
void TFsEmailUiUtility::GetTempPathL( RFs& aFs, TDes& aPath )
    {
    FUNC_LOG;
    _LIT( KDriveCPath, "C:" );

    TInt err = aFs.PrivatePath( aPath );
    User::LeaveIfError( err );

    aPath.Insert( 0, KDriveCPath );
    aPath.Append( KFsEmailTempDirName );
    BaflUtils::EnsurePathExistsL( aFs, aPath );
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::EnsureFsMailServerIsRunning
// Checks if FSMailServer is running. If not, then launches it.
// -----------------------------------------------------------------------------
void TFsEmailUiUtility::EnsureFsMailServerIsRunning( RWsSession& aWsSession )
    {
    FUNC_LOG;
    TRAP_IGNORE( EnsureFsMailServerIsRunningL( aWsSession ) );
    }

// -----------------------------------------------------------------------------
// TFsEmailUiUtility::EnsureFsMailServerIsRunningL
// Checks if FSMailServer is running. If not, then launches it.
// -----------------------------------------------------------------------------
void TFsEmailUiUtility::EnsureFsMailServerIsRunningL( RWsSession& aWsSession )
    {
    FUNC_LOG;

    TApaTaskList taskList( aWsSession );
    TApaTask task = taskList.FindApp( KFSMailServerUid );

    if ( !task.Exists() )
        {
        // FSMailServer is not running, try to launch it

        // Get this process' file name to get the correct drive letter
        RProcess process;
        TFileName processFileName = process.FileName();
        process.Close();

        // Parse the full path to FSMailServer exe
        TParse parse;
        User::LeaveIfError( parse.Set( KFSMailServerExe, &processFileName, NULL) );

        // Store the full path
        processFileName = parse.FullName();

        CApaCommandLine* cmdLine = CApaCommandLine::NewLC();
        cmdLine->SetExecutableNameL( processFileName );
        // Launch FSMailServer in background so that it doesn't steal
        // the focus during it's construction
        cmdLine->SetCommandL( EApaCommandBackground );

        RApaLsSession ls;
        User::LeaveIfError( ls.Connect() );
        CleanupClosePushL( ls );

        TThreadId threadId;
        // Is there anything we can do in case of error?
        //       Try to launch from another drive etc.?
        TInt error = ls.StartApp( *cmdLine, threadId );

        CleanupStack::PopAndDestroy( &ls );
        CleanupStack::PopAndDestroy( cmdLine );
        }
    }



/////////////////////////////////////////////////////////////////////////////////
// ACTION MENU HANDLER
//

//Singleton* Singleton::pinstance = 0;
// Initialize static member variables
CFscContactActionMenu* CFSEmailUiActionMenu::iActionMenu = NULL;
TFileName CFSEmailUiActionMenu::iIconFilePath;
RPointerArray<CGulIcon> CFSEmailUiActionMenu::iIconArray;

CFSEmailUiActionMenu* CFSEmailUiActionMenu::NewL( CFreestyleEmailUiAppUi* aAppUi )
	{
    FUNC_LOG;
    CFSEmailUiActionMenu* self = new (ELeave) CFSEmailUiActionMenu( aAppUi );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    return self;
	}

CFSEmailUiActionMenu::CFSEmailUiActionMenu( CFreestyleEmailUiAppUi* aAppUi )
	: iAppUi( aAppUi )
	{

	}

CFSEmailUiActionMenu::~CFSEmailUiActionMenu()
	{
    FUNC_LOG;
	if( iActionMenu )
		{
		delete iActionMenu;
		}
	if ( iService )
		{
		delete iService;
		}
	iIconArray.ResetAndDestroy();
	}

void CFSEmailUiActionMenu::ConstructL()
	{
    FUNC_LOG;
    if( !iActionMenu )
        {
        iService = CFscContactActionService::NewL( iAppUi->GetVPbkManagerL() );
        iActionMenu = CFscContactActionMenu::NewL( *iService );
        }
    TFsEmailUiUtility::GetFullIconFileNameL( iIconFilePath );
	}

CFscContactActionMenu* CFSEmailUiActionMenu::GetActionMenu()
	{
	return iActionMenu;
	}

void CFSEmailUiActionMenu::RemoveAllL()
	{
    FUNC_LOG;
    if ( iIconArray.Count() == 0 )
        {
        CreateIconsL();
        }
	iActionMenu->Model().RemoveAll( ETrue );
	}

void CFSEmailUiActionMenu::AddCustomItemL( TActionMenuCustomItemId aItemId )
	{
    FUNC_LOG;
    if ( iIconArray.Count() == 0 )
        {
        CreateIconsL();
        }
	HBufC* itemText = NULL;
	CGulIcon* itemIcon = iIconArray[aItemId-1];
	switch( aItemId )
		{
		case FsEActionMenuOpen:
			{
			itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_OPEN );
			}
			break;
		case FsEActionMenuOpenCalendarEvent:
			{
			itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_OPEN );
			}
			break;
		case FsEActionMenuReply:
			{
			itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_REPLY );
			}
			break;

		case FsEActionMenuReplyAll:
			{
			itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_REPLY_ALL );
			}
			break;

		case FsEActionMenuForward:
			{
			itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_FORWARD );
			}
			break;

		case FsEActionMenuDelete:
			{
			itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_DELETE );
			}
			break;

		case FsEActionMenuAccept:
			{
			itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_ACCEPT );
			}
			break;

		case FsEActionMenuTentative:
			{
			itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_TENTATIVE );
			}
			break;

		case FsEActionMenuDecline:
			{
			itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_DECLINE );
			}
			break;

		case FsEActionMenuRemoveFormCal:
			{
			itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_REM_FROM_CAL );
			}
			break;

		case FsEActionMenuMarkRead:
			{
			itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_MARK_READ );
			}
			break;

		case FsEActionMenuMarkUnread:
			{
			itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_MARK_UNREAD );
			}
			break;

		case FsEActionMenuCall:
			{
			itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_CALL );
			}
			break;
        // <cmail> video call
        case FsEActionMenuCallVideo:
            {
            itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_CALL_VIDEO );
            }
            break;
        // </cmail>
		case FsEActionMenuCreateMessage:
			{
			itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_CREATE_MESSAGE );
			}
			break;
		case FsEActionMenuCreateEmail:
		    {
            itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_CREATE_EMAIL );
		    }
			break;
		case FsEActionMenuContactDetails:
			{
			itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_CONTACT_DETAILS );
			}
			break;

		case FsEActionMenuAddToContacts:
			{
			itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_ADD_TO_CONTACTS );
			}
			break;

		case FsEActionMenuRemoteLookup:
			{
			itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_REMOTE_LOOKUP );
			}
			break;

		case FsEActionMenuMove:
			{
			itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_MOVE );
			}
			break;

		case FsEActionMenuMoveToDrafts:
			{
			itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_MOVE_TO_DRAFTS );
			}
			break;
		case FsEActionMenuOpenInWeb:
			{
			itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_OPEN_IN_WEB );
			}
			break;
		case FsEActionMenuOpenInIntranet:
			{
			itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_OPEN_IN_INTRA );
			}
			break;
		case FsEActionMenuBookmark:
			{
			itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_BOOKMARK );
			}
			break;
		case FsEActionAttachmentOpen:
			{
			itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_OPEN );
			}
			break;
		case FsEActionAttachmentDownload:
			{
			itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_ATTACH_DOWNLOAD );
			}
			break;
		case FsEActionAttachmentCancelDownload:
			{
			itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_ATTACH_CANCEL );
			}
			break;
		case FsEActionAttachmentSave:
			{
			itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_ATTACH_SAVE );
			}
			break;
        case FsEActionAttachmentAdd:
            {
            itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_ATTACH_ADD );
            }
            break;
        case FsEActionAttachmentRemove:
            {
            itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_ATTACH_REMOVE );
            }
            break;
        case FsEActionAttachmentViewAll:
            {
            itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_ATTACH_VIEW_ALL );
            }
            break;
		case FsEActionAttachmentDownloadAll:
			{
			itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_ATTACH_DOWNLOAD_ALL );
			}
			break;

		case FsEActionAttachmentCancelAllDownloads:
			{
			itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_ATTACH_CANCEL_ALL );
			}
			break;
		case FsEActionAttachmentSaveAll:
			{
			itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_ATTACH_SAVE_ALL );
			}
			break;
		case FsEActionAttachmentRemoveAll:
            {
            itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_ATTACH_REMOVE_ALL );
            }
            break;
		case FsEActionAttachmentClearFetchedContent:
		    {
		    itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_ATTACH_CLEAR_FETCHED );
		    }
		    break;
		case FsEActionAttachmentRemoveUnfetchedAttachment:
		    {
		    itemText = StringLoader::LoadLC( R_FREESTYLE_EMAIL_UI_AM_ATTACH_REMOVE_UNFETCHED );
		    }
		    break;
		default:
		    {
		    itemText = KNullDesC().AllocLC();
		    }
			break;
		}

	TUid itemUid;
	itemUid.iUid = TInt(aItemId);

    CleanupStack::PushL( itemIcon );
	CFscContactActionMenuItem* menuItem = iActionMenu->Model().NewMenuItemL( *itemText, itemIcon, KActionMenuItemNormalPriority, EFalse, itemUid);
    CleanupStack::PushL( menuItem );
    iActionMenu->Model().AddItemL( menuItem );
    CleanupStack::Pop( menuItem );
    CleanupStack::Pop( itemIcon );
    CleanupStack::PopAndDestroy( itemText );
	}

void CFSEmailUiActionMenu::AddCustomItemsL( RFsEActionMenuIdList aItemList )
	{
    FUNC_LOG;
	for( TInt i = 0; i < aItemList.Count(); i++ )
		{
		AddCustomItemL( aItemList[i] );
		}
	}

// <cmail>
void CFSEmailUiActionMenu::Dismiss( TBool aSlide )
    {
    FUNC_LOG;
    if( iActionMenu )
        {
        iActionMenu->Dismiss( aSlide );
        }
    }
// </cmail>

TActionMenuCustomItemId CFSEmailUiActionMenu::ExecuteL(
	TFscContactActionMenuPosition aPosition,
	TInt aIndex,
	MFsActionMenuPositionGiver* aPositionGiver)
	{
    FUNC_LOG;
    if ( iIconArray.Count() == 0 )
        {
        CreateIconsL();
        }
	TFscActionMenuResult menuResult = iActionMenu->ExecuteL( aPosition, aIndex, aPositionGiver );
    if ( menuResult == EFscCustomItemSelected )
    	{
    	return ResolveSelectedCustomItemIdL();
    	}
    else if( menuResult == EFscCasItemSelectedAndExecuted )
    	{
    	return FsEActionMenuCasItemSelectedAndExecuted;
    	}
    else
    	{
    	return FsEActionMenuDismissed;
    	}
	}

TActionMenuCustomItemId CFSEmailUiActionMenu::ExecuteL(
	RFsEActionMenuIdList aItemList,
	TFscContactActionMenuPosition aPosition,
	TInt aIndex,
	MFsActionMenuPositionGiver* aPositionGiver)
	{
    FUNC_LOG;
    if ( iIconArray.Count() == 0 )
        {
        CreateIconsL();
        }
	RemoveAllL();
	AddCustomItemsL( aItemList );
	return ExecuteL( aPosition, aIndex, aPositionGiver );
	}
// </cmail>


TActionMenuCustomItemId CFSEmailUiActionMenu::ResolveSelectedCustomItemIdL()
	{
    FUNC_LOG;
    if ( iIconArray.Count() == 0 )
        {
        CreateIconsL();
        }
	TInt itemIndex = iActionMenu->FocusedItemIndex();
	TUid itemUid = iActionMenu->Model().ItemL( itemIndex ).ImplementationUid();

	return TActionMenuCustomItemId( itemUid.iUid );
	}

void CFSEmailUiActionMenu::CreateIconsL()
	{
    FUNC_LOG;
	iIconArray.ResetAndDestroy();

	// UPDATE ICONS!
// <cmail> icons changed
	// NOTE: Must be appended same order as are in TActionMenuCustomItemIds!
 	iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_indi_cmail_read, EMbmFreestyleemailuiQgn_indi_cmail_read_mask ) ); // FsEActionMenuOpen
  	iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_indi_cmail_calendar_event_read, EMbmFreestyleemailuiQgn_indi_cmail_calendar_event_read_mask ) ); // FsEActionMenuOpen
  	iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_prop_cmail_action_reply, EMbmFreestyleemailuiQgn_prop_cmail_action_reply_mask ) ); // FsEActionMenuReply
 	iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_prop_cmail_action_reply_all, EMbmFreestyleemailuiQgn_prop_cmail_action_reply_all_mask ) ); // FsEActionMenuReplyAll
 	iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_prop_cmail_action_forward, EMbmFreestyleemailuiQgn_prop_cmail_action_forward_mask ) ); // FsEActionMenuForward
 	iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_prop_cmail_action_delete, EMbmFreestyleemailuiQgn_prop_cmail_action_delete_mask ) ); // FsEActionMenuDelete
 	iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_indi_cmail_calendar_tracking_accept, EMbmFreestyleemailuiQgn_indi_cmail_calendar_tracking_accept_mask  ) ); // FsEActionMenuAccept
 	iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_indi_cmail_calendar_tracking_tentative, EMbmFreestyleemailuiQgn_indi_cmail_calendar_tracking_tentative_mask  ) ); // FsEActionMenuTentative
 	iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_indi_cmail_calendar_tracking_reject, EMbmFreestyleemailuiQgn_indi_cmail_calendar_tracking_reject_mask ) ); // FsEActionMenuDecline
 	iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_indi_cmail_calendar_delete, EMbmFreestyleemailuiQgn_indi_cmail_calendar_delete_mask ) ); // FsEActionMenuDecline
 	iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_prop_cmail_action_mark_read, EMbmFreestyleemailuiQgn_prop_cmail_action_mark_read_mask ) ); // FsEActionMenuMarkRead
 	iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_prop_cmail_action_mark_unread, EMbmFreestyleemailuiQgn_prop_cmail_action_mark_unread_mask ) ); // FsEActionMenuMarkUnread
 	iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_prop_cmail_action_call, EMbmFreestyleemailuiQgn_prop_cmail_action_call_mask ) ); // FsEActionMenuCall
    // <cmail> video call
    iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_prop_cmail_action_call_video, EMbmFreestyleemailuiQgn_prop_cmail_action_call_video_mask ) ); // FsEActionMenuCallVideo
    // </cmail>
 	iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_prop_cmail_action_create_msg, EMbmFreestyleemailuiQgn_prop_cmail_action_create_msg_mask ) ); // FsEActionMenuCreateMessage
    iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_prop_cmail_action_email,  EMbmFreestyleemailuiQgn_prop_cmail_action_email_mask) ); // FsEActionMenuCreateEmail
 	iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_prop_cmail_action_contact_detail, EMbmFreestyleemailuiQgn_prop_cmail_action_contact_detail_mask ) ); // FsEActionMenuContactDetails
 	iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_prop_cmail_action_add_to_contacts, EMbmFreestyleemailuiQgn_prop_cmail_action_add_to_contacts_mask ) ); // FsEActionMenuAddToContacts
 	iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_prop_cmail_action_remote_lookup, EMbmFreestyleemailuiQgn_prop_cmail_action_remote_lookup_mask ) ); // FsEActionMenuRemoteLookup
	iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_prop_cmail_action_move_msg, EMbmFreestyleemailuiQgn_prop_cmail_action_move_msg_mask ) ); // FsEActionMenuMove
	iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_prop_cmail_action_move_to_drafts, EMbmFreestyleemailuiQgn_prop_cmail_action_move_to_drafts_mask  ) ); // FsEActionMenuMoveToDrafts
	iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_menu_browserng, EMbmFreestyleemailuiQgn_menu_browserng_mask ) ); // FsEActionMenuOpenInWeb
	iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_menu_intranet, EMbmFreestyleemailuiQgn_menu_intranet_mask ) ); // FsEActionMenuOpenInIntranet
	iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_prop_cmail_wml_bookmark, EMbmFreestyleemailuiQgn_prop_cmail_wml_bookmark_mask ) ); // FsEActionMenuBookmark
	iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_open, EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_open_mask ) ); // FsEActionAttachmentOpen
	iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_download, EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_download_mask ) ); // FsEActionAttachmentDownload
	iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_cancel_download, EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_cancel_download_mask ) ); // FsEActionAttachmentCancelDownload
	iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_save, EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_save_mask ) ); // FsEActionAttachmentSave
    iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_list_options_add, EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_list_options_add_mask ) ); // FsEActionAttachmentAdd
    iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_list_options_delete, EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_list_options_delete_mask ) ); // FsEActionAttachmentRemove
    iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_list_options_view_all, EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_list_options_view_all_mask ) ); // FsEActionAttachmentViewAll
	iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_download_all, EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_download_all_mask ) ); // FsEActionAttachmentDownloadAll
	iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_list_options_cancel_all, EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_list_options_cancel_all_mask ) ); // FsEActionAttachmentCancelAllDownloads
	iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_save_all, EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_save_all_mask ) ); // FsEActionAttachmentSaveAll
    iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_list_options_delete_all, EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_list_options_delete_all_mask ) ); // FsEActionAttachmentRemoveAll
    iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_list_options_delete, EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_list_options_delete_mask ) ); // FsEActionAttachmentClearFetchedContent
    iIconArray.AppendL( CreateIconL( EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_list_options_delete, EMbmFreestyleemailuiQgn_prop_cmail_action_attachment_list_options_delete_mask ) ); // FsEActionAttachmentRemoveUnfetchedAttachment
// </cmail>
	}

CGulIcon* CFSEmailUiActionMenu::CreateIconL( TInt aBitmapId, TInt aMaskId )
	{
    FUNC_LOG;
	// Define default icon object
    CFbsBitmap* iconBitmap;
    CFbsBitmap* iconMaskBitmap;
    TSize defaultIconSize(30,30);

	// Create "CALL" Item
    AknIconUtils::CreateIconLC(iconBitmap, iconMaskBitmap, iIconFilePath, aBitmapId, aMaskId );
    AknIconUtils::SetSize(iconBitmap, defaultIconSize);
    AknIconUtils::SetSize(iconMaskBitmap, defaultIconSize);
    CGulIcon* icon = CGulIcon::NewL(iconBitmap, iconMaskBitmap);
    CleanupStack::Pop(2);
    return icon;
	}

/////////////////////////////////////////////////////////////////////////////////
// GENERIC TIMER
//

// -----------------------------------------------------------------------------
// CFSEmailUiGenericTimer::NewL
// NewL function. Returns timer object.
// -----------------------------------------------------------------------------
//
CFSEmailUiGenericTimer* CFSEmailUiGenericTimer::NewL(
	MFSEmailUiGenericTimerCallback* aCallback,
	const TInt aPriority )
    {
    FUNC_LOG;
    CFSEmailUiGenericTimer* self = NewLC( aCallback, aPriority );
    CleanupStack::Pop( self );
    return self;
    }

// -----------------------------------------------------------------------------
// CFSEmailUiGenericTimer::NewL
// NewL function. Returns timer object.
// -----------------------------------------------------------------------------
//
CFSEmailUiGenericTimer* CFSEmailUiGenericTimer::NewLC(
	MFSEmailUiGenericTimerCallback* aCallback,
	const TInt aPriority )
    {
    FUNC_LOG;
    CFSEmailUiGenericTimer* self = new (ELeave) CFSEmailUiGenericTimer( aCallback, aPriority );
    CleanupStack::PushL( self );
    self->ConstructL();
    return self;
    }

// -----------------------------------------------------------------------------
// CFSEmailUiGenericTimer::NewL
// NewL function. Returns timer object.
// -----------------------------------------------------------------------------
//
void CFSEmailUiGenericTimer::ConstructL()
    {
    FUNC_LOG;
    CTimer::ConstructL();
    CActiveScheduler::Add( this );
    }

// -----------------------------------------------------------------------------
// CFSEmailUiGenericTimer::~CFSEmailUiGenericTimer
// D'tor
// -----------------------------------------------------------------------------
//
CFSEmailUiGenericTimer::~CFSEmailUiGenericTimer()
    {
    FUNC_LOG;
    Cancel();
    iCallback = NULL;
    }

// -----------------------------------------------------------------------------
// CFSEmailUiGenericTimer::CFSEmailUiGenericTimer
// C'tor
// -----------------------------------------------------------------------------
//
CFSEmailUiGenericTimer::CFSEmailUiGenericTimer(
	MFSEmailUiGenericTimerCallback* aCallback,
	const TInt aPriority )
	: CTimer( aPriority ),
	iCallback( aCallback )
    {
    }

// -----------------------------------------------------------------------------
// CFSEmailUiGenericTimer::RunL
// Timer trigger function.
// -----------------------------------------------------------------------------
//
void CFSEmailUiGenericTimer::RunL()
    {
    FUNC_LOG;
    if ( iCallback )
    	{
    	iCallback->TimerEventL( this );
    	}
    }

// -----------------------------------------------------------------------------
// CFSEmailUiGenericTimer::Start
// Timer starting function.
// -----------------------------------------------------------------------------
//
void CFSEmailUiGenericTimer::Start( TInt aInterval )
    {
    FUNC_LOG;
    Cancel();
    if( aInterval < 0 )
    	{
    	aInterval = KGenericTimerDefaultInterval;
    	}
	After( TTimeIntervalMicroSeconds32( aInterval * 1000 ) );
    }

// -----------------------------------------------------------------------------
// CFSEmailUiGenericTimer::Stop
// Timer stopping function
// -----------------------------------------------------------------------------
//
void CFSEmailUiGenericTimer::Stop()
    {
    FUNC_LOG;
    Cancel();
    }

TKeyResponse CFSEmailUiCallDialog::OfferKeyEventL(const TKeyEvent &aKeyEvent, TEventCode aType)
    {
    if (aKeyEvent.iScanCode == EStdKeyYes )
        {
        TKeyEvent newEvent;
        newEvent.iScanCode = EStdKeyEnter;
        newEvent.iCode = EKeyEnter;
        return CAknQueryDialog::OfferKeyEventL(newEvent, aType);
        }
    else
        {
        return CAknQueryDialog::OfferKeyEventL(aKeyEvent, aType);
        }
    }