email/imum/Utils/Src/EmailUtils.cpp
changeset 0 72b543305e3a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/email/imum/Utils/Src/EmailUtils.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,1158 @@
+/*
+* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*       Static functions for imum
+*
+*/
+
+
+// INCLUDE FILES
+#include <bldvariant.hrh>
+#include <miutset.h>
+#include <s32file.h>
+#include <eikenv.h>
+#include <eikrutil.h>
+#include <eikbtgpc.h>
+#include <iapprefs.h>
+#include <StringLoader.h>
+#include <aknnotewrappers.h>
+#include <AknGlobalNote.h>
+#include <sendui.h>
+#include <ErrorUI.h>                    // CErrorUI
+#include <AknQueryDialog.h>
+#include <aknnotedialog.h>
+#include <StringLoader.h>
+#include <MuiuOperationWait.h>          // CMuiuOperationWait
+#include <MuiuMsvUiServiceUtilities.h>  // MsvUiServiceUtilities
+#include <imapset.h>
+#include <pop3set.h>
+#include <smtpset.h>
+#include <MTMStore.h>                   // CMtmStore
+#include <mtmuibas.h>                   // BaseMtmUi
+#include <messaginginternalcrkeys.h>    // Messaging keys
+#include <centralrepository.h>          // CRepository
+#include <CoreApplicationUIsSDKCRKeys.h>
+#include <cemailaccounts.h>
+#include <bldvariant.hrh>
+#include <messagingvariant.hrh>
+#include <MNcnInternalNotification.h>
+#include <data_caging_path_literals.hrh>    // KDC_MTM_RESOURCE_DIR
+#include <ImumUtils.rsg>
+#include <bautils.h>
+#include <muiuemailtools.h>
+#include "ImumInMailboxUtilitiesImpl.h"
+#include "ImumInMailboxServicesImpl.h"
+
+#include "SenduiMtmUids.h"
+#include "ImumMboxManager.h"
+#include "ImumMboxData.h"
+#include "EmailFeatureUtils.h"
+#include "EmailUtils.H"
+#include "ImumUtilsLogging.h"
+#include "ImumPanic.h"
+#include <ImumUtils.rsg>
+#include "ImumMboxSettingsCtrl.h"
+#include "ImumUtilsLogging.h"
+#include "IMSSettingsNoteUi.h"
+#include "ImumInternalApiImpl.h"
+#include "ImumDaSettingsKeys.h"
+#include "ImumInSettingsData.h"             // CImumInSettingsData
+
+// EXTERNAL DATA STRUCTURES
+// EXTERNAL FUNCTION PROTOTYPES
+// CONSTANTS
+const TInt KBytesInKiloByte = 1024;
+const TInt KImumSizeBufferSize = 32;
+const TInt KImumReplaceCharacterCount = 2;
+const TInt KIMSMaxAoMailboxes = 2;
+const TInt KImumExtraStringLength = 4;
+_LIT( KImumDefaultNameFormat, "%S(%02d)" );
+_LIT(KEmailUtilsComma, ",");
+_LIT(KEmailUtilsSpace, " ");
+_LIT( KIMSDirAndResFileName,"z:ImumUtils.rsc" );
+
+// MACROS
+// LOCAL CONSTANTS AND MACROS
+// MODULE DATA STRUCTURES
+// LOCAL FUNCTION PROTOTYPES
+// FORWARD DECLARATIONS
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// ----------------------------------------------------------------------------
+// MsvEmailMtmUiUtils::CheckAvailableDiskSpaceForDownloadL
+// This is static function
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TBool MsvEmailMtmUiUtils::CheckAvailableDiskSpaceForDownloadL(
+    TInt aMsgSize,
+    CEikonEnv& aEikonEnv,
+    CMsvSession& aSession )
+//
+// Check there is enough disk space on the specified drive to fetch a message
+// of aMsgSize bytes. If not, display a message and return EFalse.
+// static
+    {
+    IMUM_STATIC_CONTEXT( MsvEmailMtmUiUtils::CheckAvailableDiskSpaceForDownloadL, 0, utils, KLogUi );
+    
+    if ( MsvUiServiceUtilities::DiskSpaceBelowCriticalLevelL(
+        aSession, aMsgSize ) )
+        {
+        CErrorUI* errorUi = CErrorUI::NewLC( aEikonEnv );
+        errorUi->ShowGlobalErrorNoteL( KErrDiskFull );
+        CleanupStack::PopAndDestroy( errorUi );
+        return EFalse;
+        }
+    return ETrue;
+    }
+
+// ----------------------------------------------------------------------------
+// MsvEmailMtmUiUtils::CheckActiveAOLimitsL()
+//
+// This function goes through all the mailboxes and checks, if there are any
+// Always Online enabled boxes around. The included mailbox id is ignored
+// during the search. If less than 2 ( <2 ) always online mailboxes are found,
+// ETrue is returned, otherwise EFalse is returned.
+// ----------------------------------------------------------------------------
+//
+TBool MsvEmailMtmUiUtils::CheckActiveAOLimitsL(
+    CImumInternalApi& aEmailApi,    
+    const TMsvId aMailboxId )
+    {
+    IMUM_STATIC_CONTEXT( MsvEmailMtmUiUtils::CheckActiveAOLimitsL, 0, utils, KLogUi );
+    
+    // Get the list of healthy mailboxes from the API
+    TInt count = 0;    
+    const MImumInHealthServices& healthApi = aEmailApi.HealthServicesL();
+    MImumInHealthServices::RMailboxIdArray mailboxes;
+    
+    // Get the list of mailboxes in array. Gather the list based on the smtpId, 
+    // since the aMailboxId is actually also the smtpId
+    if ( healthApi.GetMailboxList( mailboxes, 
+    		MImumInHealthServices::EFlagIncludeSmtp | 
+    		MImumInHealthServices::EFlagGetHealthy ) == KErrNone )
+    	{
+    	for ( TInt mbox = mailboxes.Count(); --mbox >= 0; )
+    		{           
+            if ( aMailboxId != mailboxes[mbox] )
+                {
+                // Create object for the extended mail settings
+                CImumInSettingsData* settings = 
+                    aEmailApi.MailboxServicesL().LoadMailboxSettingsL( 
+                        mailboxes[mbox] );
+                CleanupStack::PushL( settings );
+                
+                TInt aoState = 0;
+                if ( settings )
+                	{
+	                settings->GetAttr(
+	                    TImumDaSettings::EKeyAutoRetrieval, aoState );
+
+					// If always online is on, increase the count
+					if ( aoState != TImumDaSettings::EValueAutoOff )
+						{
+						count++;
+						}
+                	}
+                CleanupStack::PopAndDestroy( settings );
+                settings = NULL;                         
+                }                
+            }
+        }
+    
+    mailboxes.Reset();
+
+    return count < KIMSMaxAoMailboxes;
+    }
+
+// ----------------------------------------------------------------------------
+// MsvEmailMtmUiUtils::DoCEntryCopyMoveL
+// This is static function
+// ----------------------------------------------------------------------------
+//
+EXPORT_C CMsvOperation* MsvEmailMtmUiUtils::DoCEntryCopyMoveL(
+    CMsvEntry& aEntry, const CMsvEntrySelection& aSel, TMsvId aTargetId, 
+    TRequestStatus& aCompletionStatus, TBool aCopy)
+    {
+    IMUM_STATIC_CONTEXT( MsvEmailMtmUiUtils::DoCEntryCopyMoveL, 0, utils, KLogUi );
+    
+    CMsvOperation* op = NULL;
+    if(aCopy)
+        {
+        op = aEntry.CopyL(aSel, aTargetId, aCompletionStatus);
+        }
+    else
+        {
+        op = aEntry.MoveL(aSel, aTargetId, aCompletionStatus);
+        }
+    return op;
+    }
+
+// ----------------------------------------------------------------------------
+// MsvEmailMtmUiUtils::StripCompleteEntriesLC
+// This is static function
+// ----------------------------------------------------------------------------
+//
+EXPORT_C CMsvEntrySelection* MsvEmailMtmUiUtils::StripCompleteEntriesLC(
+    const CMsvEntry& aParent, const CMsvEntrySelection& aSelection)
+    {
+    IMUM_STATIC_CONTEXT( MsvEmailMtmUiUtils::StripCompleteEntriesLC, 0, utils, KLogUi );
+    
+    CMsvEntrySelection* entries=aSelection.CopyLC();
+    TInt cc = entries->Count();
+    TMsvEntry tEntry;
+    while(cc--)
+        {
+        tEntry = aParent.ChildDataL((*entries)[cc]);
+        TMsvEmailEntry eEntry( tEntry );
+
+        TBool complete = tEntry.Complete();
+        TBool partial = eEntry.PartialDownloaded();
+
+        if( complete && !partial )
+            {
+            entries->Delete(cc);
+            }
+        }
+    return entries;
+    }
+
+// ----------------------------------------------------------------------------
+// MsvEmailMtmUiUtils::StripDeletedEntriesLC
+// This is static function
+// ----------------------------------------------------------------------------
+//
+EXPORT_C CMsvEntrySelection* MsvEmailMtmUiUtils::StripDeletedEntriesLC(
+    const CMsvEntry& aParent, const CMsvEntrySelection& aSelection)
+    {
+    IMUM_STATIC_CONTEXT( MsvEmailMtmUiUtils::StripDeletedEntriesLC, 0, utils, KLogUi );
+     // static
+    CMsvEntrySelection* entries=aSelection.CopyLC();
+    TInt cc = entries->Count();
+    while(cc--)
+        {
+        const TMsvEmailEntry mailEntry(aParent.ChildDataL((*entries)[cc]));
+        if(EDisconnectedDeleteOperation == mailEntry.DisconnectedOperation())
+            {
+            entries->Delete(cc);
+            }
+        }
+    return entries;
+    }
+
+// ----------------------------------------------------------------------------
+// MsvEmailMtmUiUtils::SetMessageInfoDataLCCCCC
+// This is static function
+// sets fields in the message info data array using TMsvEntry and CImHeader
+// information; the TDes parameters are needed so that the strings have
+// persisted memory to live in since the info data elements are all TPtrs
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void MsvEmailMtmUiUtils::SetMessageInfoDataLCCCCC(
+    TMsgInfoMessageInfoData& aInfoData,
+    CBaseMtm& aMtm,
+    CCoeEnv& aEnv,
+    TDes& /* aDateBuf */,
+    TDes& /* aTimeBuf */,
+    TDes& aSizeBuf,
+    TDes& aPriorityBuf )
+    {
+    IMUM_STATIC_CONTEXT( MsvEmailMtmUiUtils::SetMessageInfoDataLCCCCC, 0, utils, KLogUi );
+    
+    //retrieve header
+    CMsvStore* store = aMtm.Entry().ReadStoreL();
+    CleanupStack::PushL( store );
+    CImHeader* header = CImHeader::NewLC();
+    header->RestoreL( *store );
+
+    //subject
+    HBufC* tmpSubj = header->Subject().AllocLC();
+    aInfoData.iSubject.Set( *tmpSubj );
+
+    //date and time
+    TMsvEntry tentry = aMtm.Entry().Entry();
+    aInfoData.iDateTime = tentry.iDate;
+
+    //size
+    TInt size = tentry.iSize / KBytesInKiloByte; //in bytes
+    if ( tentry.iSize % KBytesInKiloByte )
+        {
+        size++;
+        }
+    TBuf<KImumSizeBufferSize> kB;
+    StringLoader::Load( kB, R_IMAS_MESSAGE_INFO_KB, &aEnv );
+    StringLoader::Format( aSizeBuf, kB, -1, size );
+    aInfoData.iSize.Set( aSizeBuf );
+
+    //Priority
+    MsvEmailMtmUiUtils::GetPriorityString(tentry,aEnv,aPriorityBuf );             
+    aInfoData.iPriority.Set( aPriorityBuf );  
+
+    //to field
+    HBufC* toList = TurnArrayIntoCommaSeparatedStringLC(
+        header->ToRecipients() );
+    aInfoData.iTo.Set( *toList );
+
+    //cc field
+    HBufC* ccList = TurnArrayIntoCommaSeparatedStringLC(
+        header->CcRecipients() );
+    aInfoData.iCC.Set( *ccList );
+
+    //bcc field
+    HBufC* bccList = TurnArrayIntoCommaSeparatedStringLC(
+        header->BccRecipients() );
+    aInfoData.iBCC.Set( *bccList );
+
+    //from field
+    HBufC* tmpFrom = header->From().AllocLC();
+    aInfoData.iFrom.Set( *tmpFrom );
+
+    //take HBufCs out
+    CleanupStack::Pop( 5 ); // CSI: 47 # tmpFrom, bccList, ccList, toList, tmpSubj.
+    //destroy store and header. if not, message info in outbox prevents
+    //mail sending!
+    CleanupStack::PopAndDestroy( 2 ); // CSI: 47 # header, store.
+    //put HBufCs back, so no need to change function name.
+    CleanupStack::PushL( tmpSubj );
+    CleanupStack::PushL( toList );
+    CleanupStack::PushL( ccList );
+    CleanupStack::PushL( bccList );
+    CleanupStack::PushL( tmpFrom );
+    }
+
+// ----------------------------------------------------------------------------
+// MsvEmailMtmUiUtils::SetMessageInfoDataLCC
+// This is static function
+// sets fields in the message info data array using TMsvEntry and CImHeader
+// information; the TDes parameters are needed so that the strings have
+// persisted memory to live in since the info data elements are all TPtrs
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TBool MsvEmailMtmUiUtils::SetMessageInfoDataLCC(
+    TMsgInfoMessageInfoData& aInfoData,
+    CBaseMtm& aMtm,
+    CCoeEnv& aEnv,
+    TDes& /* aDateBuf */,
+    TDes& /* aTimeBuf */,
+    TDes& aSizeBuf,
+    TDes& aPriorityBuf )
+    {
+    IMUM_STATIC_CONTEXT( MsvEmailMtmUiUtils::SetMessageInfoDataLCC, 0, utils, KLogUi );
+            
+    //retrieve header
+    CMsvStore* store = NULL;
+    CImHeader* header = NULL;
+    TRAPD( storeError, store = aMtm.Entry().ReadStoreL() );
+    if ( storeError == KErrNone )
+        {
+        CleanupStack::PushL( store );
+        header = CImHeader::NewLC();
+        TRAP( storeError, header->RestoreL( *store ) );
+        // if restore leaves then we can find out lots of info from
+        // TMsvEntry's fields.
+        if ( storeError != KErrNone )
+            {
+            CleanupStack::PopAndDestroy( 2, store ); // CSI: 47 # header, store.
+            header = NULL;
+            store = NULL;
+            }
+        // if no errors, then store and header should be left to cleanup stack.
+        }
+
+    TMsvEntry tentry = aMtm.Entry().Entry();
+
+    //subject
+    if ( header )
+        {
+        aInfoData.iSubject.Set( header->Subject() );
+        }
+    else
+        {
+        aInfoData.iSubject.Set( tentry.iDescription );
+        }
+
+    //date and time
+    aInfoData.iDateTime = tentry.iDate;
+
+    //size
+    TInt size = tentry.iSize / KBytesInKiloByte; //in bytes
+    if ( tentry.iSize % KBytesInKiloByte )
+        {
+        size++;
+        }
+    TBuf<KImumSizeBufferSize> kB;
+    StringLoader::Load( kB, R_IMAS_MESSAGE_INFO_KB, &aEnv );
+    StringLoader::Format( aSizeBuf, kB, -1, size );
+    aInfoData.iSize.Set( aSizeBuf );
+
+     //Priority
+     MsvEmailMtmUiUtils::GetPriorityString(tentry,aEnv,aPriorityBuf );             
+    aInfoData.iPriority.Set( aPriorityBuf );  
+
+    if ( header )
+        {
+        //to field
+        HBufC* toList = TurnArrayIntoCommaSeparatedStringLC(
+            header->ToRecipients() );
+        aInfoData.iTo.Set( *toList );
+
+        //cc field
+        HBufC* ccList = TurnArrayIntoCommaSeparatedStringLC(
+            header->CcRecipients() );
+        aInfoData.iCC.Set( *ccList );
+
+        //from field
+        aInfoData.iFrom.Set( header->From() );
+        }
+    else
+        {
+        // to field
+        HBufC* toList = HBufC::NewLC( 0 );
+        aInfoData.iTo.Set( *toList );
+
+        // cc field
+        HBufC* ccList = HBufC::NewLC( 0 );
+        aInfoData.iCC.Set( *ccList );
+
+        // from field
+        aInfoData.iFrom.Set( tentry.iDetails );
+        }
+
+    return ( header != NULL );
+    }
+
+// ----------------------------------------------------------------------------
+// MsvEmailMtmUiUtils::TurnArrayIntoCommaSeparatedStringLC
+// This is static function
+// returns an HBufC* which contains all of the lines in aTextArray concaternated
+// together with commas separating them
+// ----------------------------------------------------------------------------
+//
+HBufC* MsvEmailMtmUiUtils::TurnArrayIntoCommaSeparatedStringLC(CDesCArray& aTextArray)
+    {
+    IMUM_STATIC_CONTEXT( MsvEmailMtmUiUtils::TurnArrayIntoCommaSeparatedStringLC, 0, utils, KLogUi );
+    
+    TInt totalLength=0;
+    //first calculate the length of string required
+    TInt index = 0;
+    for(index=0;index<aTextArray.Count();index++)
+        {
+        totalLength += aTextArray[index].Length();
+
+        //don't count comma and space for last item
+        if(index != ( aTextArray.Count() - 1 ) )
+            {
+            totalLength+=2; // CSI: 47 # comma and space.
+            }
+        }
+
+    HBufC* list = HBufC::NewLC(totalLength);
+    //now fill out the string
+    for(index=0;index<aTextArray.Count();index++)
+        {
+        list->Des().Append(aTextArray[index]);
+
+        //don't add for last item
+        if(index != ( aTextArray.Count() - 1 ) )
+            {
+            list->Des().Append(KEmailUtilsComma);
+            list->Des().Append(KEmailUtilsSpace);
+            }
+        }
+
+    return list;
+    }
+
+
+// ----------------------------------------------------------------------------
+// MsvEmailMtmUiUtils::ReplaceCharacters
+// This is static function
+// ----------------------------------------------------------------------------
+//
+void MsvEmailMtmUiUtils::ReplaceCharacters( TDes& aText )
+    {
+    IMUM_STATIC_CONTEXT( MsvEmailMtmUiUtils::ReplaceCharacters, 0, utils, KLogUi );
+    
+    TBuf<KImumReplaceCharacterCount> replaceChars;
+    replaceChars.Zero();
+    replaceChars.Append( CEditableText::EParagraphDelimiter );
+    replaceChars.Append( CEditableText::ETabCharacter );
+    AknTextUtils::ReplaceCharacters(
+        aText,
+        replaceChars,
+        CEditableText::ESpace );
+    }
+
+// ----------------------------------------------------------------------------
+// MsvEmailMtmUiUtils::StripCharacters
+// This is static function
+// ----------------------------------------------------------------------------
+//
+void MsvEmailMtmUiUtils::StripCharacters( TDes& aText )
+    {
+    IMUM_STATIC_CONTEXT( MsvEmailMtmUiUtils::StripCharacters, 0, utils, KLogUi );
+    
+    TBuf<KImumReplaceCharacterCount> stripChars;
+    stripChars.Zero();
+    stripChars.Append( CEditableText::EParagraphDelimiter );
+    stripChars.Append( CEditableText::ETabCharacter );
+    AknTextUtils::StripCharacters(
+        aText,
+        stripChars );
+    }
+
+
+// ----------------------------------------------------------------------------
+// DisconnectMailboxL
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TBool MsvEmailMtmUiUtils::DisconnectMailboxL(
+    const TMsvEntry& aService, CMsvSession& aSession )
+    {
+    IMUM_STATIC_CONTEXT( MsvEmailMtmUiUtils::DisconnectMailboxL, 0, utils, KLogUi );
+    
+    __ASSERT_DEBUG( aService.iMtm != KSenduiMtmSmtpUid,
+        User::Panic( KImumMtmUiPanic, EPanicRcvServiceMustBePOP3OrIMAP4) );
+
+    if ( CIMSSettingsNoteUi::ShowQueryL(
+        R_IMAS_SETTINGS_DIALOG_MAILSET_DISCON, R_EMAIL_CONFIRMATION_QUERY ) )
+        {
+        CMtmStore* mtmStore = CMtmStore::NewL( aSession );
+        CleanupStack::PushL(mtmStore);
+        CBaseMtmUi& relatedMtmUi = mtmStore->GetMtmUiAndSetContextLC(aService);
+        CMuiuOperationWait* wait =
+            CMuiuOperationWait::NewLC( EActivePriorityWsEvents + 10 ); // CSI: 47 # <Insert comment here>.
+        CMsvOperation* op = relatedMtmUi.CloseL(wait->iStatus);
+        wait->Start();
+        CleanupStack::PopAndDestroy( wait );
+        delete op;
+        CleanupStack::PopAndDestroy( 2, mtmStore ); // CSI: 47 # release mtmui.
+
+        return ETrue; // did disconnect succeed?
+        }
+    else
+        {
+        return EFalse;
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// MsvEmailMtmUiUtils::DoOfflineChecksL()
+// Function to check offline mode
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TBool MsvEmailMtmUiUtils::DoOfflineChecksL( TMsvId /*aService*/ )
+    {
+    IMUM_STATIC_CONTEXT( MsvEmailMtmUiUtils::DoOfflineChecksL, 0, utils, KLogUi );
+    
+    if ( !MsvEmailMtmUiFeatureUtils::LocalFeatureL(
+        KCRUidCoreApplicationUIs, KCoreAppUIsNetworkConnectionAllowed, 1 ) )
+        {
+        // offline mode has been set
+        HBufC* text = StringLoader::LoadLC(
+            R_IMUM_OFFLINE_NOT_POSSIBLE, CCoeEnv::Static()  );
+        CAknInformationNote* note = new (ELeave)
+        CAknInformationNote();
+        note->ExecuteLD( *text );
+        CleanupStack::PopAndDestroy( text ); 
+
+        return ETrue;
+        }
+
+    return EFalse;
+    }
+
+// ----------------------------------------------------------------------------
+// MsvEmailMtmUiUtils::RemoveOfflineDeleteL()
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TInt MsvEmailMtmUiUtils::RemoveOfflineDeleteL(
+    CBaseMtm& aBaseMtm,
+    TInt aFunctionId,
+    TMsvId aEntryId )
+    {
+    IMUM_STATIC_CONTEXT( MsvEmailMtmUiUtils::RemoveOfflineDeleteL, 0, utils, KLogUi );
+    
+    TBuf8<1> params;
+    params.Zero();
+
+    // Create the selection and add the id into it
+    CMsvEntrySelection* selection = new(ELeave) CMsvEntrySelection;
+    CleanupStack::PushL( selection );
+    selection->AppendL( aEntryId );
+
+    // Create waiting operation and the main operation
+    CMuiuOperationWait* wait = CMuiuOperationWait::NewLC();
+    CMsvOperation* op = aBaseMtm.InvokeAsyncFunctionL(
+        aFunctionId,
+        *selection,
+        params,
+        wait->iStatus );
+
+    // Start the waiter operation
+    wait->Start();
+
+    // Get the error from waiter
+    TInt error = wait->iStatus.Int();
+
+    // Cleanup the objects
+    delete op;
+    op = NULL;    
+    CleanupStack::PopAndDestroy( 2, selection ); // CSI: 47 # wait, selection.
+    wait = NULL;
+    selection = NULL;
+
+    return error;
+    }
+
+// ----------------------------------------------------------------------------
+// MsvEmailMtmUiUtils::AcquireDiskSpace()
+// ----------------------------------------------------------------------------
+//
+EXPORT_C TInt MsvEmailMtmUiUtils::AcquireDiskSpace(
+    RFs& aFileSession,
+    const TInt aDriveNo,
+    const TInt aSize )
+    {
+    IMUM_STATIC_CONTEXT( MsvEmailMtmUiUtils::AcquireDiskSpace, 0, utils, KLogUi );
+    
+    // Try to reserve diskspace
+    TInt error = aFileSession.ReserveDriveSpace(
+        aDriveNo, aSize );
+
+    // If reserving ok, get access
+    if ( error == KErrNone )
+        {
+        error = aFileSession.GetReserveAccess( aDriveNo );
+        }
+
+    return error;
+    }
+
+// ----------------------------------------------------------------------------
+// MsvEmailMtmUiUtils::SendAOCommandL()
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void MsvEmailMtmUiUtils::SendAOCommandL(
+    const TAlwaysOnlineServerAPICommands aCommand,
+    TMsvId aMailboxId )
+    {
+    IMUM_STATIC_CONTEXT( MsvEmailMtmUiUtils::SendAOCommandL, 0, utils, KLogUi );
+    
+    // Create connection to Always Online
+	RAlwaysOnlineClientSession aoclient;
+	CleanupClosePushL(aoclient);
+	User::LeaveIfError(aoclient.Connect());
+
+	// Prepare the parameters to be forwarded to AO-server
+	TPckg<TMsvId> param = aMailboxId;
+
+	// Send message to server and close it
+	aoclient.RelayCommandL(aCommand, param);
+	CleanupStack::PopAndDestroy();
+    }
+
+// ----------------------------------------------------------------------------
+// MsvEmailMtmUiUtils::GetAccountId()
+// ----------------------------------------------------------------------------
+//
+TUint32 MsvEmailMtmUiUtils::GetAccountId(
+    const CImumMboxData& aAccountSettings )
+    {
+    IMUM_STATIC_CONTEXT( MsvEmailMtmUiUtils::GetAccountId, 0, utils, KLogUi );
+    
+    if ( aAccountSettings.iIsImap4 )
+        {
+        return aAccountSettings.iImap4AccountId.iImapAccountId;
+        }
+    else
+        {
+        return aAccountSettings.iPop3AccountId.iPopAccountId;
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// CImumMboxSettingsCtrl::CreateCenRepConnectionL()
+// ----------------------------------------------------------------------------
+//
+void MsvEmailMtmUiUtils::CreateCenRepConnectionL(
+    CRepository*& aRepository,
+    TUid aRepositoryUid )
+    {
+    IMUM_STATIC_CONTEXT( MsvEmailMtmUiUtils::CreateCenRepConnectionL, 0, utils, KLogUi );
+    
+    // If session doesn't exist, create one
+    if ( !aRepository )
+        {
+        aRepository = CRepository::NewL( aRepositoryUid );
+        }
+    }
+// ----------------------------------------------------------------------------
+// MsvEmailMtmUiUtils::StoreSecuritySettings()
+// ----------------------------------------------------------------------------
+//
+void MsvEmailMtmUiUtils::StoreSecuritySettings(
+    CImBaseEmailSettings& aSettings,
+    const TIMASMailSecurity& aSecurity )
+    {
+    IMUM_STATIC_CONTEXT( MsvEmailMtmUiUtils::StoreSecuritySettings, 0, utils, KLogUi );
+    
+    switch( aSecurity )
+        {        
+        case EImumSecurityOn:
+            aSettings.SetSecureSockets( ETrue );
+            aSettings.SetSSLWrapper( EFalse );
+            break;
+            
+        case EImumSecurityMs:
+            aSettings.SetSecureSockets( EFalse );
+            aSettings.SetSSLWrapper( ETrue );
+            break;
+                
+        case EImumSecurityOff:
+            aSettings.SetSecureSockets( EFalse );
+            aSettings.SetSSLWrapper( EFalse );
+            break;
+
+        default:
+            break;
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// MsvEmailMtmUiUtils::StoreSecuritySettings()
+// ----------------------------------------------------------------------------
+//
+void MsvEmailMtmUiUtils::StoreSecuritySettings(
+    CImBaseEmailSettings& aSettings,
+    const TImumDaSettings::TSecurityValues& aSecurity )
+    {
+    IMUM_STATIC_CONTEXT( MsvEmailMtmUiUtils::StoreSecuritySettings, 0, utils, KLogUi );
+    
+    switch( aSecurity )
+        {
+        case TImumDaSettings::EValueSecurityTls:        
+            aSettings.SetSecureSockets( ETrue );
+            aSettings.SetSSLWrapper( EFalse );
+            break;
+    
+        case TImumDaSettings::EValueSecuritySsl:        
+            aSettings.SetSecureSockets( EFalse );
+            aSettings.SetSSLWrapper( ETrue );
+            break;
+        
+        case TImumDaSettings::EValueSecurityOff:        
+            aSettings.SetSecureSockets( EFalse );
+            aSettings.SetSSLWrapper( EFalse );
+            break;
+
+        default:
+            break;
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// MsvEmailMtmUiUtils::RestoreSecuritySettings()
+// ---------------------------------------------------------------------------
+//
+TInt MsvEmailMtmUiUtils::RestoreSecuritySettings(
+    const CImBaseEmailSettings& aSettings )
+    {
+    IMUM_STATIC_CONTEXT( MsvEmailMtmUiUtils::RestoreSecuritySettings, 0, utils, KLogUi );
+    
+    TInt security = 0;
+    
+    // Security: TLS
+    if( aSettings.SecureSockets() )
+        {
+        security = TImumDaSettings::EValueSecurityTls;
+        }
+    // Security: MS
+    else if( aSettings.SSLWrapper() )
+        {
+        security = TImumDaSettings::EValueSecuritySsl;
+        }
+    // Security Off
+    else
+        {
+        security = TImumDaSettings::EValueSecurityOff;
+        }    
+        
+    return security;                
+    }
+
+// ----------------------------------------------------------------------------
+// MsvEmailMtmUiUtils::GetDefaultSecurityPort()
+// ----------------------------------------------------------------------------
+//
+TUint32 MsvEmailMtmUiUtils::GetDefaultSecurityPort(
+    const TIMASMailSecurity aSecurity,
+    const TBool aIncoming,
+    const TBool aIsImap4 )
+    {
+    IMUM_STATIC_CONTEXT( MsvEmailMtmUiUtils::GetDefaultSecurityPort, 0, utils, KLogUi );
+    
+    TUint32 port( 0 ); // this should never be returned
+
+    switch( aSecurity )
+        {
+        case EImumSecurityOn:
+        case EImumSecurityOff:
+            {
+            if ( aIncoming )
+                {
+                port = aIsImap4 ? KIMASDefaultPortImap4 :
+                    KIMASDefaultPortPop3;
+                }
+            else
+                {
+                port = KIMASDefaultPortSmtp;
+                }
+            }
+            break;
+        case EImumSecurityMs:
+            {
+            if ( aIncoming )
+                {
+                port = aIsImap4 ? KIMASDefaultSecurityPortImap4 :
+                    KIMASDefaultSecurityPortPop3;
+                }
+            else
+                {
+                port = KIMASDefaultSecurityPortSmtp;
+                }
+            }
+            break;
+        default:
+            break;
+        }
+    return port;
+    }
+    
+// ----------------------------------------------------------------------------
+// MsvEmailMtmUiUtils::CallNewMessagesL()
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void MsvEmailMtmUiUtils::CallNewMessagesL( const TMsvId aMailboxId )
+    {
+    IMUM_STATIC_CONTEXT( MsvEmailMtmUiUtils::CallNewMessagesL, 0, utils, KLogUi );
+    
+    MNcnInternalNotification* notification = NULL;
+
+    // Create a dummy array. It is not currently used to anything.
+    CDesCArrayFlat* dummyArray = new (ELeave) CDesCArrayFlat( 1 );
+    CleanupStack::PushL( dummyArray );
+
+    // No need to tell user, that we could not connect to NCN
+    TRAP_IGNORE( notification =
+        MNcnInternalNotification::CreateMNcnInternalNotificationL() );
+
+    if ( notification )
+        {
+        // Ignore result, user is not interested about it, hopefully.
+        TInt result = notification->NewMessages(
+            EMailMessage, aMailboxId, *dummyArray );
+        }
+    else
+        {
+        }
+
+    CleanupStack::PopAndDestroy( dummyArray );
+    dummyArray = NULL;
+    delete notification;
+    notification = NULL;
+
+    }
+
+// ----------------------------------------------------------------------------
+// MsvEmailMtmUiUtils::LoadResourceFileL()
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void MsvEmailMtmUiUtils::LoadResourceFileL(
+    RConeResourceLoader& aResourceLoader )
+    {
+    IMUM_STATIC_CONTEXT( MsvEmailMtmUiUtils::LoadResourceFileL, 0, utils, KLogUi );
+    
+    RFs fs;
+    CleanupClosePushL(fs);
+    User::LeaveIfError(fs.Connect());
+    TFileName resourceFileName(KIMSDirAndResFileName);
+    BaflUtils::NearestLanguageFile(fs,resourceFileName);
+    CleanupStack::PopAndDestroy( 1 );
+    
+    TFileName fileName;
+    TParse parse;
+    parse.Set( resourceFileName, &KDC_RESOURCE_FILES_DIR, NULL );
+    fileName.Copy( parse.FullName() );
+
+    // Attempt to load the resource
+    aResourceLoader.OpenL( fileName );
+    
+    }
+
+// ----------------------------------------------------------------------------
+// MsvEmailMtmUiUtils::GetMailboxName()
+// ----------------------------------------------------------------------------
+//
+void MsvEmailMtmUiUtils::GetMailboxName(
+    TDes& aDest,
+    CMsvSession& aMsvSession,
+    TMsvId aMailboxId )
+    {
+    IMUM_STATIC_CONTEXT( MsvEmailMtmUiUtils::GetMailboxName, 0, utils, KLogUi );
+    
+    aDest.Zero();
+
+    // Get mailbox
+    TMsvEntry mailbox;
+    TMsvId serviceId;
+    TInt error = aMsvSession.GetEntry( aMailboxId, serviceId, mailbox );
+
+    if ( error == KErrNone )
+        {
+        aDest.Copy( mailbox.iDetails.Left( KIMASMaxMailboxNameLength ) );
+        }
+    }
+
+// ----------------------------------------------------------------------------
+// MsvEmailMtmUiUtils::CreateConnectingToText()
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void MsvEmailMtmUiUtils::CreateConnectingToText(
+    TDes& aDest,
+    CMsvSession& aMsvSession,
+    TMsvId aMailboxId )
+    {
+    IMUM_STATIC_CONTEXT( CBaseMtmUi::EProgressStringMaxLen, 0, utils, KLogUi );
+
+    // Get mailbox name
+    TBuf<KIMASMaxMailboxNameLength> name;
+    MsvEmailMtmUiUtils::GetMailboxName( name,
+        aMsvSession, aMailboxId );
+    
+    // Combine mailbox name with a resource string
+    TRAP_IGNORE( CIMSSettingsNoteUi::MakeStringL( aDest, R_EMAIL_CONNECTING_SERVER,name ) );
+    }
+
+// ----------------------------------------------------------------------------
+// MsvEmailMtmUiUtils::ContinueRenamingL()
+// ----------------------------------------------------------------------------
+//
+TBool MsvEmailMtmUiUtils::ContinueRenamingL( 
+    CImumInternalApi& aMailboxApi,
+    TInt& aResult,
+    TDes& aAccountName, 
+    const TMsvId aOwningMailbox,
+    const TInt aNumber,
+    const CMsvEntry& aAccount,
+    const TBool aGenerate )
+    {
+    IMUM_STATIC_CONTEXT( MsvEmailMtmUiUtils::ContinueRenamingL, 0, utils, KLogUi );
+    
+    // Max number of mailboxes is checked
+    // Allow name generating. This is for Email Wizard, which attempts
+    // to generate the mailbox name. 
+    TBool doContinue = ( aNumber <= KImumMaxMailboxes );
+    
+    // Check if the name is already used
+    if ( doContinue )
+        {
+        doContinue = IsAccountNameUsedL( 
+            aMailboxApi, aResult, aAccountName, aOwningMailbox, aAccount );
+        }         
+    
+    return doContinue && aGenerate;                   
+    }
+    
+// ----------------------------------------------------------------------------
+// MsvEmailMtmUiUtils::CheckAccountNameL()
+// ----------------------------------------------------------------------------
+//
+void MsvEmailMtmUiUtils::CheckAccountNameL( 
+    CImumInternalApi& aMailboxApi,      
+    TDes& aAccountName, 
+    const TMsvId aOwningMailbox,   
+    const TBool& aGenerate )
+    {
+    IMUM_STATIC_CONTEXT( MsvEmailMtmUiUtils::CheckAccountNameL, 0, utils, KLogUi );
+    
+    // Remove illegal characters from the name, such as tabulators and enters
+    ReplaceCharacters( aAccountName );
+    
+    // Get entrypoint of the root
+    int result = KErrNone;
+    CMsvSession& session = aMailboxApi.MsvSession();
+    CMsvEntry* root = session.GetEntryL( 
+        KMsvRootIndexEntryIdValue );
+    CleanupStack::PushL( root );
+
+    // Sort the root
+    root->SetSortTypeL( TMsvSelectionOrdering(
+        KMsvGroupByType | KMsvGroupByStandardFolders,
+        EMsvSortByDetailsReverse, ETrue ) );
+
+    // This is the first suggested name of the mailbox
+    TMuiuSettingsText originalName;
+    originalName.Copy( aAccountName );
+
+    // Find an account name
+    TInt mailbox = 0;
+    for ( TInt number = 1; ContinueRenamingL( 
+            aMailboxApi, result, aAccountName, aOwningMailbox, 
+            number, *root, aGenerate );
+         ++number )
+        {
+        // Rename and set the result
+        result = ChangeAccountNameL(
+            originalName, aAccountName, ++mailbox );
+        }
+
+    // User must be notified, when invalid name is offered
+    if ( result == KErrAlreadyExists && aGenerate )
+        {
+        result = KErrNone;
+        }
+
+    CleanupStack::PopAndDestroy( root );
+    root = NULL;
+
+    User::LeaveIfError( result ); 
+    }
+
+// ----------------------------------------------------------------------------
+// MsvEmailMtmUiUtils::IsAccountNameUsedL()
+// ----------------------------------------------------------------------------
+//
+TBool MsvEmailMtmUiUtils::IsAccountNameUsedL(
+    CImumInternalApi& aMailboxApi,
+    TInt& aResult,
+    const TDesC& aAccountName,  
+    const TMsvId aOwningMailbox,  
+    const CMsvEntry& aAccount )
+    {
+    IMUM_STATIC_CONTEXT( MsvEmailMtmUiUtils::IsAccountNameUsedL, 0, utils, KLogUi );
+
+    FeatureManager::InitializeLibL();
+
+    if(FeatureManager::FeatureSupported(KFeatureIdSelectableEmail))
+    	{
+    	// Because the unhealthy mailbox's name is not used.
+    	// So try to filter the unhealthy mailbox's name.
+    	aResult = KErrNone;
+    	}
+
+    const MImumInHealthServices& healthServices = aMailboxApi.HealthServicesL();
+
+    // Search through all the mail account entries until duplicate name
+    // is found, or all entries are searched through    
+    TInt item = aAccount.Count();
+    while ( --item >= 0 && !aResult )
+        {
+        const TMsvEntry& entry = aAccount[item];
+
+    	if(FeatureManager::FeatureSupported(KFeatureIdSelectableEmail))
+    		{
+    		// If the mailbox is unhealthy, ignore it.
+    		if ( ( !healthServices.IsMailboxHealthy( entry.Id() ) ) &&
+    				( !( ( entry.iType == KUidMsvServiceEntry) && 
+    						( entry.Id() != KMsvLocalServiceIndexEntryId ) && 
+    						( !MuiuEmailTools::IsMailMtm( entry.iMtm, ETrue ) ) ) ) )
+    			{
+    			continue;
+    			}
+    		}
+
+        // Interrupt the search if mailbox entry with same name is found
+        if ( !aAccountName.CompareC( entry.iDetails ) &&
+             aMailboxApi.MailboxUtilitiesL().IsMailbox( entry ) &&
+             entry.Id() != aOwningMailbox && 
+             entry.iRelatedId != aOwningMailbox )
+            {
+            aResult = KErrAlreadyExists;
+            }
+        else
+            {
+            aResult = KErrNone;
+            }                 
+        }
+
+    FeatureManager::UnInitializeLib();
+    
+    // If mailbox account with the same name is found, return ETrue
+    return ( aResult == KErrAlreadyExists );
+    }
+
+// ----------------------------------------------------------------------------
+// MsvEmailMtmUiUtils::ChangeAccountNameL()
+// ----------------------------------------------------------------------------
+//
+TInt MsvEmailMtmUiUtils::ChangeAccountNameL(
+    const TDesC& aOriginalAccountName,
+    TDes& aAccountName,    
+    const TInt aNumber )
+    {
+    IMUM_STATIC_CONTEXT( MsvEmailMtmUiUtils::ChangeAccountNameL, 0, utils, KLogUi );
+    
+    // Make sure the is enough room in the mailbox name for the string "(%d)"    
+    const TInt maxLength = 
+        KImasImailServiceNameLength - KImumExtraStringLength;
+
+    // Remove KISIAExtraStringLength amount of letters from the string in
+    // case the max length has been exceeded.
+    if ( aOriginalAccountName.Length() > maxLength )
+        {
+        aAccountName.Copy( aAccountName.Left( maxLength ) );
+        }
+
+    // Add the brackets with number inside to the end of the string
+    TMuiuSettingsText tempText;
+    tempText.Copy( aAccountName );
+    tempText.Format( KImumDefaultNameFormat, &aOriginalAccountName, aNumber );
+    aAccountName.Copy( tempText );
+
+    return KErrNone;
+    }    
+
+// ----------------------------------------------------------------------------
+// MsvEmailMtmUiUtils::GetPriorityString()
+// ----------------------------------------------------------------------------
+//    
+void MsvEmailMtmUiUtils::GetPriorityString(
+    const TMsvEntry& aEntry,
+    CCoeEnv& aEnv,
+    TDes& aPriorityBuf ) 
+    {
+    IMUM_STATIC_CONTEXT( MsvEmailMtmUiUtils::GetPriorityString, 0, utils, KLogUi );
+    
+    TInt emailPriority = EMsvMediumPriority;
+    emailPriority = aEntry.Priority();
+        
+    if ( emailPriority == EMsvHighPriority )
+        {
+        StringLoader::Load( aPriorityBuf, R_IMAS_MESSAGE_INFO_PRIORITY_HIGH, &aEnv );
+        }
+    else if ( emailPriority == EMsvLowPriority )
+        {                                          
+        StringLoader::Load( aPriorityBuf, R_IMAS_MESSAGE_INFO_PRIORITY_LOW, &aEnv );
+        }
+    else
+        { 
+        StringLoader::Load( aPriorityBuf, R_IMAS_MESSAGE_INFO_PRIORITY_NORMAL, &aEnv );
+        }    
+    }
+
+// End of File
+
+