mobilemessaging/mmsui/notmtmsrc/NotMtmUi.cpp
changeset 0 72b543305e3a
child 2 0bf1d54f37d9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mobilemessaging/mmsui/notmtmsrc/NotMtmUi.cpp	Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,1598 @@
+/*
+* Copyright (c) 2004 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:  
+*       Provides Notification MTM UI methods.
+*
+*/
+
+
+
+// INCLUDE FILES
+
+//Features
+#include <featmgr.h>    
+#include <bldvariant.hrh>
+#include <MuiuMsvProgressReporterOperation.h> // CMsvProgressReporterOperation
+#include <mtudreg.h>                 // MTM UI data registry
+#include <mtudcbas.h>                // MTM UI data base
+
+#include "NotMtmUi.h"
+
+#include <apgcli.h>
+#include <msvuids.h>
+#include <mtmuidef.hrh>
+
+#include <e32keys.h>
+#include <coemain.h>
+#include <eikenv.h>
+#include <eikdef.h>
+#include <eikmfne.h>
+#include <eikedwin.h>
+#include <eikcapc.h>
+#include <gulicon.h>
+#include <ErrorUI.h> //CErrorUI
+
+#include <aknnotewrappers.h>                // CAknInformationNote
+#include <aknPopup.h>
+#include <aknlists.h>
+#include <aknconsts.h>
+#include <akncontext.h>
+#include <akntabgrp.h>
+#include <AknQueryDialog.h>
+#include <StringLoader.h>               // link against CommonEngine.lib
+#include <Muiumsginfo.h>
+#include <MuiuMsvUiServiceUtilities.h>
+#include <muiumsvuiserviceutilitiesinternal.h>
+
+#include <akninputblock.h>              // CAknInputBlock
+#include <MtmExtendedCapabilities.hrh>
+#include <messagingvariant.hrh>
+
+#include <centralrepository.h>    // link against centralrepository.lib
+#include <messaginginternalcrkeys.h> // for Central Repository keys
+#include <CoreApplicationUIsSDKCRKeys.h>
+
+#include <ApUtils.h> //CApUtils, CCommsDatabase, EDatabaseTypeIAP
+
+#include <NotUi.rsg>
+#include <mmserrors.h>
+
+#include "NotMtmUiPanic.h"
+#include <mmsconst.h>
+#include <mmscmds.h>    // EMmsDeleteSchedule
+
+#include <mmsmsventry.h>
+#include <mmsnotificationclient.h>
+#include <mmsgenutils.h>
+#include <mmssettings.h> // MMS Engine settings
+
+#include "MmsMtmConst.h"
+#include "MMBoxDialog.h"
+#include "NotMtmUiData.h"
+
+// CONSTANTS
+
+_LIT( KAddressSeparator,", " );
+_LIT( KCharLeftAddressIterator, "<" );
+_LIT( KCharRightAddressIterator, ">" );
+_LIT( KMmsCharCommaAndSpace, ", " );
+_LIT( KMmsCharSpace, " " );
+
+const TInt KMessageSize = 20;
+const TInt KZero = 0; //constant for memory check
+const TInt KMmsAdditionalCharsStringLength = 7;
+const TUint KMmsLRMarker = 0x200E;
+const TUid KUidUniEditor = {0x102072D8};
+
+#define IS_PHONE_OFF_LINEL() MsvUiServiceUtilitiesInternal::IsPhoneOfflineL()
+
+// MACROS
+#define iMmsClient  ( static_cast<CMmsNotificationClientMtm&>( iBaseMtm ) )
+
+// LOCAL CONSTANTS AND MACROS
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// ==================== LOCAL FUNCTIONS ====================
+
+// ---------------------------------------------------------
+// NewNotMtmUiL
+// Factory function
+// ---------------------------------------------------------
+//
+EXPORT_C CBaseMtmUi* NewNotMtmUiL( CBaseMtm& aMtm, CRegisteredMtmDll& aRegisteredDll )
+    {
+    return CNotMtmUi::NewL( aMtm, aRegisteredDll );
+    }
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------
+// CNotMtmUi::CNotMtmUi
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// ---------------------------------------------------------
+//
+CNotMtmUi::CNotMtmUi( CBaseMtm& aBaseMtm, CRegisteredMtmDll& aRegisteredMtmDll )
+    :   CBaseMtmUi( aBaseMtm, aRegisteredMtmDll )
+    {
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::ConstructL
+// Symbian OS default constructor can leave.
+// ---------------------------------------------------------
+//
+void CNotMtmUi::ConstructL()
+    {
+    LOGTEXT(_L8("NotMtmUi: Construct start"));
+    CBaseMtmUi::ConstructL();
+    iSettingsHandler = CMmsSettingsHandler::NewL( iMmsClient );
+    
+    TInt featureBitmask = 0;
+    
+    CRepository* repository = CRepository::NewL( KCRUidMuiuVariation );
+    repository->Get( KMuiuMmsFeatures, featureBitmask );
+    delete repository;
+    repository = NULL;
+    
+    if ( featureBitmask & KMmsFeatureIdDeleteOptions )
+        {
+        iNotUiFlags |= EDeleteOptionsSupported;
+        }
+    featureBitmask = 0;
+    
+    FeatureManager::InitializeLibL();
+    if ( FeatureManager::FeatureSupported( KFeatureIdOfflineMode ) )
+        {
+        iNotUiFlags |= EOffline;
+        }
+    FeatureManager::UnInitializeLib();
+    LOGTEXT(_L8("NotMtmUi: Construct end"));
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::NewL
+// Two-phased constructor.
+// ---------------------------------------------------------
+// 
+CNotMtmUi* CNotMtmUi::NewL( CBaseMtm& aBaseMtm, CRegisteredMtmDll& aRegisteredMtmDll )
+    {
+    LOGTEXT( _L8( "NotMtmUi::NewL" ) );
+    CNotMtmUi* self = new ( ELeave ) CNotMtmUi( aBaseMtm, aRegisteredMtmDll );
+    
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+    
+// ---------------------------------------------------------
+// CNotMtmUi::~CNotMtmUi
+// Destructor
+// ---------------------------------------------------------
+//
+CNotMtmUi::~CNotMtmUi()
+    {
+    delete iSettingsHandler;
+    delete iWaitDialog;
+    }
+
+
+// ---------------------------------------------------------
+// CNotMtmUi::QueryCapability
+// Capability check for UI mtm specific functionality. These should
+// be minimal, as the default capability checking places are UI data MTM
+// (UI) and client MTM (engine).
+// ---------------------------------------------------------
+TInt CNotMtmUi::QueryCapability( TUid aCapability, TInt& aResponse )
+    {
+    switch ( aCapability.iUid )
+        {
+        case KUidMsvMtmUiQueryMessagingInitialisation: // flow through
+        case KUidMsvMtmQueryFactorySettings:
+        case KUidMsvMtmQuerySupportValidateService:
+
+            aResponse = ETrue;
+            return KErrNone;
+        default:
+            // Actually this routes to client MTM capability check.
+            return CBaseMtmUi::QueryCapability( aCapability, aResponse );
+        }
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::CreateL
+// Not supported.
+// ---------------------------------------------------------
+//
+CMsvOperation* CNotMtmUi::CreateL( const TMsvEntry& /*aEntry*/, 
+                                  CMsvEntry& /*aParent*/, 
+                                  TRequestStatus& /*aStatus*/ )
+    {
+    User::Leave( KErrNotSupported );
+    return NULL;
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::CheckSettingsL() const
+// Check MMS service settings
+// ---------------------------------------------------------
+//
+EXPORT_C TBool CNotMtmUi::CheckSettingsL( CMmsSettingsDialog::TMmsExitCode& aExitCode ) const
+    {
+    // First reload the settings
+    iSettingsHandler->RefreshSettingsL( );
+    return iSettingsHandler->CheckSettingsL( aExitCode );
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::DeleteServiceL
+// ---------------------------------------------------------
+//
+CMsvOperation* CNotMtmUi::DeleteServiceL( const TMsvEntry& /*aService*/, 
+                                         TRequestStatus& /*aStatus*/ )
+    {
+    User::Leave( KErrNotSupported );
+    return NULL;
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::DeleteFromL
+// ---------------------------------------------------------
+//
+CMsvOperation* CNotMtmUi::DeleteFromL( const CMsvEntrySelection& /*aSelection*/, 
+                                      TRequestStatus& /*aStatus*/ )
+    {
+    User::Leave( KErrNotSupported );
+    return NULL;
+    }
+
+// ---------------------------------------------------------
+// CMmsMtmUi::CopyToL
+// Copy local outbox entry to remote server = called when sending the entry from MCE outbox
+// ---------------------------------------------------------
+//
+CMsvOperation* CNotMtmUi::CopyToL( const CMsvEntrySelection& aSelection, 
+                                  TRequestStatus& aStatus )
+    {
+    return CopyMoveToL( aSelection, aStatus, ETrue );
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::MoveToL
+// Move local outbox entry to remote server.
+// ---------------------------------------------------------
+//
+CMsvOperation* CNotMtmUi::MoveToL( const CMsvEntrySelection& aSelection, 
+                                  TRequestStatus& aStatus )
+    {
+    return CopyMoveToL( aSelection, aStatus, EFalse );
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::CopyMoveToL
+// Performs either CopyToL or MoveToL operation.
+// ---------------------------------------------------------
+//
+CMsvOperation* CNotMtmUi::CopyMoveToL( const CMsvEntrySelection& aSelection, 
+                                      TRequestStatus& aStatus, TBool aCopyOnly )
+    {
+    __ASSERT_DEBUG( iBaseMtm.Entry().Entry().iMtm==Type(), Panic( EMmsWrongMtm ) );
+    __ASSERT_DEBUG( iBaseMtm.Entry().Entry().iType==KUidMsvServiceEntry, Panic( EMmsNotAService ) );
+
+    // --- Carry out the operation ---
+    TMsvEntry mmsService ( BaseMtm().Entry().Entry() );
+    //    Get CMsvEntry of parent of messages to be sent
+    CMsvEntry* parentEntry = Session().GetEntryL( aSelection[0] );    
+
+    CleanupStack::PushL( parentEntry );
+    parentEntry->SetEntryL( parentEntry->Entry().Parent() );
+    
+    // Do the copy/move
+    CMsvOperation* op = aCopyOnly ?
+        parentEntry->CopyL( aSelection, mmsService.Id(), aStatus ) :
+        parentEntry->MoveL( aSelection, mmsService.Id(), aStatus );
+    
+    CleanupStack::PopAndDestroy();    //parentEntry
+    return op;
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::CopyFromL
+// Could be used in fetching messages manually, but client MTM API has simple FetchL()
+// ---------------------------------------------------------
+//
+CMsvOperation* CNotMtmUi::CopyFromL(const CMsvEntrySelection& /*aSelection*/, 
+                                    TMsvId /*aTargetId*/, 
+                                    TRequestStatus& /*aStatus*/)
+    {
+    User::Leave( KErrNotSupported );
+    return NULL;
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::MoveFromL
+// Could be used in fetching messages manually, but client MTM API has simple FetchL()
+// ---------------------------------------------------------
+//
+CMsvOperation* CNotMtmUi::MoveFromL(const CMsvEntrySelection& /*aSelection*/, 
+                                    TMsvId /*aTargetId*/, 
+                                    TRequestStatus& /*aStatus*/)
+    {
+    User::Leave( KErrNotSupported );
+    return NULL;
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::OpenL
+// Handles request to open existing message server entry (message/service)
+// ---------------------------------------------------------
+//
+CMsvOperation* CNotMtmUi::OpenL( TRequestStatus& aStatus )
+    {
+    LOGTEXT(_L8("NotMtmUi: OpenL start"));
+    __ASSERT_DEBUG( iBaseMtm.Entry().Entry().iMtm==Type(), Panic( EMmsWrongMtm ) );
+
+    const TMsvEntry& entry = BaseMtm().Entry().Entry();
+    if ( entry.ReadOnly() )
+        {
+        return ViewL( aStatus );
+        }
+    else
+        {
+        return EditL( aStatus );
+        }
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::OpenL
+// Opens the first entry in a selection
+// ---------------------------------------------------------
+//
+CMsvOperation* CNotMtmUi::OpenL( TRequestStatus& aStatus, 
+                                const CMsvEntrySelection& aSelection )
+    {
+    LOGTEXT(_L8("NotMtmUi: OpenL start"));
+    __ASSERT_DEBUG( iBaseMtm.Entry().Entry().iMtm==Type(), Panic( EMmsWrongMtm ) );
+
+    BaseMtm().SwitchCurrentEntryL( aSelection[0] );
+    return OpenL( aStatus );
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::CloseL
+// ---------------------------------------------------------
+//
+CMsvOperation* CNotMtmUi::CloseL( TRequestStatus& /*aStatus*/ )
+    {
+    User::Leave( KErrNotSupported );
+    return NULL;
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::CloseL
+// ---------------------------------------------------------
+//
+CMsvOperation* CNotMtmUi::CloseL( TRequestStatus& /*aStatus*/, 
+                                 const CMsvEntrySelection& /*aSelection*/ )
+    {
+    User::Leave( KErrNotSupported );
+    return NULL;
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::EditL
+// Opens a message (editor) or service (settings dialog) for editing.
+// ---------------------------------------------------------
+//
+CMsvOperation* CNotMtmUi::EditL( TRequestStatus& aStatus )
+    {
+    LOGTEXT(_L8("NotMtmUi::EditL start"));
+    __ASSERT_DEBUG( iBaseMtm.Entry().Entry().iMtm==Type(), Panic( EMmsWrongMtm ) );
+
+    CMsvOperation* msvoperation = NULL;
+
+    switch ( iBaseMtm.Entry().Entry().iType.iUid )
+        {
+        case KUidMsvMessageEntryValue:
+            {
+            CMmsSettingsDialog::TMmsExitCode exitCode = 
+                CMmsSettingsDialog::EMmsExternalInterrupt;
+
+            if( MsvUiServiceUtilities::DiskSpaceBelowCriticalLevelL(
+                Session(),
+                KZero ) )
+                {
+                User::Leave( KErrDiskFull );
+                }
+
+            if ( !CheckSettingsL( exitCode ) ) 
+                {
+                TInt32 ap = iSettingsHandler->MmsSettings()->AccessPoint( 0 );
+                //settings saved with valid access point
+                if( !( exitCode==CMmsSettingsDialog::EMmsBack && ApExistsL( ap ) ) )
+                    {
+                    return CompleteSettingsOperationL( aStatus, exitCode );
+                    }
+                }
+ 
+            if ( iBaseMtm.Entry().Entry().Connected() )
+                {
+                User::Leave( KErrLocked ); 
+                }
+            LOGTEXT( _L8( "NotMtmUi::EditL launching editor" ) );
+            msvoperation = LaunchEditorApplicationL( aStatus, iBaseMtm.Entry().Session() );
+            }
+            break;
+
+        case KUidMsvServiceEntryValue:
+            LOGTEXT( _L8( "NotMtmUi::EditL - launching settings" ) );
+            msvoperation = OpenServiceSettingsDialogL( aStatus );
+            break;
+
+        case KUidMsvAttachmentEntryValue:   // flow through
+        case KUidMsvFolderEntryValue:       // flow through
+        default:
+            User::Leave( KErrNotSupported );
+            break;
+        }
+
+    return msvoperation;
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::EditL
+// ---------------------------------------------------------
+//
+CMsvOperation* CNotMtmUi::EditL( TRequestStatus& aStatus, 
+                                const CMsvEntrySelection& aSelection )
+    {
+    BaseMtm().SwitchCurrentEntryL( aSelection[0] );
+    return EditL( aStatus );
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::ViewL
+// Opens the message for reading in Viewer.
+// ---------------------------------------------------------
+//
+CMsvOperation* CNotMtmUi::ViewL( TRequestStatus& aStatus )
+    {
+    LOGTEXT( _L8( "NotMtmUi::ViewL" ) );
+    __ASSERT_DEBUG( iBaseMtm.Entry().Entry().iMtm == Type(), Panic( EMmsWrongMtm ) );
+
+    CMsvOperation* msvoperation = NULL;
+
+    switch ( iBaseMtm.Entry().Entry().iType.iUid )
+        {
+        case KUidMsvMessageEntryValue:
+            // It's a multimedia message
+            if ( iBaseMtm.Entry().Entry().Connected() )
+                {
+                User::Leave( KErrLocked );
+                }
+            // Open Viewer
+            LOGTEXT( _L8( "NotMtmUi::ViewL - launching Viewer" ) );
+            msvoperation = LaunchEditorApplicationL( aStatus, iBaseMtm.Entry().Session(), EReadOnly );
+            break;
+        case KUidMsvServiceEntryValue:
+        case KUidMsvAttachmentEntryValue:
+        case KUidMsvFolderEntryValue:
+        default:
+            User::Leave( KErrNotSupported );
+            break;
+        }
+    return msvoperation; 
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::ViewL
+// ---------------------------------------------------------
+//
+CMsvOperation* CNotMtmUi::ViewL( TRequestStatus& aStatus, 
+                                const CMsvEntrySelection& aSelection )
+    {
+    __ASSERT_DEBUG( iBaseMtm.Entry().Entry().iMtm == Type(), Panic( EMmsWrongMtm ) );
+    BaseMtm().SwitchCurrentEntryL( aSelection[0] );
+    return ViewL( aStatus );
+    }
+
+// -----------------------------------------------------------------------------
+// CNotMtmUi::LaunchEditorApplicationL()
+// Does the actual opening.
+// -----------------------------------------------------------------------------
+//
+CMsvOperation* CNotMtmUi::LaunchEditorApplicationL( TRequestStatus& aStatus, 
+                                                   CMsvSession& aSession, 
+                                                   TEditorType aEditorType )
+    {
+    LOGTEXT(_L8("NotMtmUi: LaunchEditorApplicationL start"));
+    TEditorParameters temp;    
+
+    if ( iBaseMtm.HasContext() )
+        {
+        temp.iId=iBaseMtm.Entry().EntryId();
+        }
+
+    TMsvEntry tempEntry = iBaseMtm.Entry( ).Entry();
+
+    CMtmUiDataRegistry* mtmUiDataReg = CMtmUiDataRegistry::NewL( Session( ) );
+    CleanupStack::PushL( mtmUiDataReg );
+
+    CBaseMtmUiData* uiData=mtmUiDataReg->NewMtmUiDataLayerL( this->Type( ) ) ;
+    CleanupStack::PushL( uiData );
+
+    TBool supported = ETrue;
+
+    if( uiData->OperationSupportedL( KMtmUiFunctionOpenMessage, tempEntry ) )
+        {   // Returns value other than zero if operation is not supported
+        supported = EFalse;
+        }
+
+    CleanupStack::PopAndDestroy( 2, mtmUiDataReg );
+
+    if( !supported )
+        {
+        User::Leave( KErrNotSupported );
+        }
+
+    switch( aEditorType )
+        {
+        case EReadOnly:
+            temp.iFlags|=EMsgReadOnly;
+            break;                             
+        case ECreateNewMessage:
+            temp.iFlags|=EMsgCreateNewMessage ;
+            temp.iId=KMsvDraftEntryIdValue;
+            break;
+        case EEditExisting: //flow through
+        default:
+            break;
+        };
+
+    temp.iFlags &= ~( EMtmUiFlagEditorPreferEmbedded|EMtmUiFlagEditorNoWaitForExit );
+
+    temp.iFlags |= ( Preferences() & EMtmUiFlagEditorPreferEmbedded?EMsgLaunchEditorEmbedded:0 );
+
+    TPckgC<TEditorParameters> paramPack( temp );
+    
+    LOGTEXT( _L8( "Just before calling MsgEditorLauncher" ) );
+    return MsgEditorLauncher::LaunchEditorApplicationL( aSession, Type(), aStatus, temp, KNullDesC(), paramPack );
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::ForwardL
+// ---------------------------------------------------------
+//
+CMsvOperation* CNotMtmUi::ForwardL( TMsvId aDestination, 
+                                   TMsvPartList aPartList, 
+                                   TRequestStatus& aCompletionStatus )
+    {
+    LOGTEXT(_L8("NotMtmUi: ForwardL start"));
+    TEditorParameters editorParams;
+    editorParams.iFlags &= ~( EMtmUiFlagEditorPreferEmbedded | EMtmUiFlagEditorNoWaitForExit );
+
+    editorParams.iFlags |= ( ( Preferences() & EMtmUiFlagEditorPreferEmbedded ) ? EMsgLaunchEditorEmbedded : 0 );
+    editorParams.iDestinationFolderId = aDestination; 
+    editorParams.iPartList = aPartList;
+
+    editorParams.iFlags |= EMsgForwardMessage;
+    editorParams.iId=BaseMtm().Entry().EntryId();
+
+    //we need to check access points here
+    CMmsSettingsDialog::TMmsExitCode exitCode = CMmsSettingsDialog::EMmsExternalInterrupt;
+    if ( !CheckSettingsL( exitCode ) )
+        {
+        TInt32 ap = iSettingsHandler->MmsSettings()->AccessPoint( 0 );
+        if( exitCode == CMmsSettingsDialog::EMmsBack && ApExistsL( ap ) )
+            {
+            LOGTEXT( _L8( "NotMtmUi::ForwardL launching editor" ) );
+            return MsgEditorLauncher::LaunchEditorApplicationL( Session(), 
+                Type(), 
+                aCompletionStatus, 
+                editorParams, 
+                KNullDesC() );
+            }
+        else//user selects exit and settings not saved
+            {
+            return CompleteSettingsOperationL( aCompletionStatus, exitCode );
+            }
+        }//if
+
+    LOGTEXT( _L8( "NotMtmUi::ForwardL launching editor" ) );
+    return MsgEditorLauncher::LaunchEditorApplicationL( Session(), 
+        Type(), 
+        aCompletionStatus, 
+        editorParams, 
+        KNullDesC() );
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::ReplyL
+// ---------------------------------------------------------
+//
+CMsvOperation* CNotMtmUi::ReplyL( TMsvId aDestination, 
+                                 TMsvPartList aPartList, 
+                                 TRequestStatus& aCompletionStatus )
+    {
+    LOGTEXT(_L8("NotMtmUi: Reply start"));
+    TEditorParameters editorParams;
+    editorParams.iFlags |= EMsgReplyToMessageSender;
+    editorParams.iId = BaseMtm().Entry().EntryId();
+    editorParams.iDestinationFolderId = aDestination; 
+    editorParams.iPartList = aPartList;
+    editorParams.iSpecialAppId = KUidUniEditor;
+    editorParams.iFlags &= ~( EMtmUiFlagEditorPreferEmbedded | EMtmUiFlagEditorNoWaitForExit );
+
+    editorParams.iFlags |= ( ( Preferences() & EMtmUiFlagEditorPreferEmbedded ) ? EMsgLaunchEditorEmbedded : 0 );
+
+    //we need to check access points here
+    CMmsSettingsDialog::TMmsExitCode exitCode = CMmsSettingsDialog::EMmsExternalInterrupt;
+    if ( !CheckSettingsL( exitCode ) )
+        {
+        TInt32 ap = iSettingsHandler->MmsSettings()->AccessPoint( 0 );
+        if( exitCode == CMmsSettingsDialog::EMmsBack && ApExistsL( ap ) ) 
+            {
+            LOGTEXT( _L8( "NotMtmUi::ReplyL launching editor" ) );
+            return MsgEditorLauncher::LaunchEditorApplicationL( Session(), 
+                Type(), 
+                aCompletionStatus, 
+                editorParams, 
+                KNullDesC() );
+            }
+        else//user selects exit and settings not saved
+            {
+            return CompleteSettingsOperationL( aCompletionStatus, exitCode );
+            }
+        }
+    
+    //Setting the entry always to read as done for sms  
+    if ( BaseMtm().Entry().Entry().Unread() )
+        {
+        CMsvEntry* cEntry;
+        cEntry = &(BaseMtm().Entry());
+        TMsvEntry entry = cEntry->Entry();
+        entry.SetUnread( EFalse );
+        cEntry->ChangeL( entry );  	
+        }
+      
+    LOGTEXT( _L8( "NotMtmUi::ReplyL launching editor" ) );
+    return MsgEditorLauncher::LaunchEditorApplicationL( Session(), 
+        Type(), 
+        aCompletionStatus, 
+        editorParams, 
+        KNullDesC() );
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::CancelL
+// Suspends sending of the selected messages (if possible)
+// ---------------------------------------------------------
+//
+CMsvOperation* CNotMtmUi::CancelL( TRequestStatus& aStatus, 
+                                  const CMsvEntrySelection& aSelection )
+    {
+    TInt count = aSelection.Count();
+    __ASSERT_DEBUG( count, Panic( EMmsWrongParameters ) );
+
+    CMsvEntry* entry = Session().GetEntryL( aSelection[0] );
+    CleanupStack::PushL( entry );
+
+    while ( count-- )
+        {
+        entry->SetEntryL( aSelection[count] );
+        TMsvEntry tempEntry = entry->Entry();
+        tempEntry.SetSendingState( KMsvSendStateSuspended );
+
+        tempEntry.iDate.UniversalTime();
+
+        entry->ChangeL( tempEntry );
+        }
+
+    CleanupStack::PopAndDestroy(); // entry
+    
+    TBuf8<1> dummyParams;
+    dummyParams.Zero();
+    return CBaseMtmUi::InvokeAsyncFunctionL( EMmsDeleteSchedule, aSelection, aStatus, dummyParams );
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::InvokeSyncFunctionL
+// ---------------------------------------------------------
+//
+void CNotMtmUi::InvokeSyncFunctionL( TInt aFunctionId, 
+                                    const CMsvEntrySelection& aSelection, 
+                                    TDes8& aParameter )
+    {
+    LOGTEXT(_L8("NotMtmUi: InvokeSyncFuntionL start"));
+    switch ( aFunctionId )
+        {
+    case KMtmUiMessagingInitialisation:
+        LOGTEXT(_L8("NotMtmUi: InvokeSyncFuntionL MsgIni"));
+        CreateDefaultSettingsL();
+        break;
+    case KMtmUiFunctionRestoreFactorySettings:
+        LOGTEXT(_L8("NotMtmUi: InvokeSyncFuntionL FactorySetts"));
+        HandleFactorySettingsL( aParameter );
+        break;
+    case KMtmUiFunctionValidateService:
+        {
+        LOGTEXT(_L8("NotMtmUi: InvokeSyncFuntionL ValidateService"));
+        iSettingsHandler->RefreshSettingsL( );
+        TInt error = iSettingsHandler->MmsSettings()->ValidateSettings();
+        // return the result via aParameter as a TInt packaged into a TDes8
+        TPckgBuf<TInt> resultPackage( error );
+        aParameter.Copy( resultPackage );
+        }
+        break;
+    default:
+        CBaseMtmUi::InvokeSyncFunctionL( aFunctionId, aSelection, aParameter );
+        break;
+        }
+    LOGTEXT(_L8("NotMtmUi: InvokeSyncFunctionL end"));
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::InvokeAsyncFunctionL
+// ---------------------------------------------------------
+//
+CMsvOperation* CNotMtmUi::InvokeAsyncFunctionL( TInt aFunctionId, 
+                                               const CMsvEntrySelection& aSelection, 
+                                               TRequestStatus& aCompletionStatus, 
+                                               TDes8& aParameter )
+    {
+    LOGTEXT(_L8("NotMtmUi: InvokeAsyncFuntionL start"));
+    CMsvOperation* msvoperation = NULL;
+    switch ( aFunctionId )
+        {
+        case KMtmUiFunctionMessageInfo:
+            LOGTEXT(_L8("NotMtmUi: InvokeAsyncFuntionL MsgInfo"));
+            msvoperation = OpenMessageInfoL( aCompletionStatus, aParameter );
+            break;
+        case KMtmUiFunctionMMBox:
+            LOGTEXT(_L8("NotMtmUi: InvokeAsyncFuntionL MMBox"));
+            msvoperation = OpenMMBoxDialogL( aCompletionStatus );
+            break;
+        case KMtmUiFunctionFetchMMS:
+            LOGTEXT(_L8("NotMtmUi: InvokeAsyncFuntionL Fetch"));
+            if(     iNotUiFlags & EOffline
+                &&  IS_PHONE_OFF_LINEL() )
+                {   // We are in offline at the moment -> Infonote
+                ShowInformationNoteL( R_NOTMTM_OFFLINE_NOT_POSSIBLE, EFalse );
+                break;
+                }
+            msvoperation = StartFetchingL( aSelection, aCompletionStatus ); 
+            break;
+        case KMtmUiFunctionDeleteMessage:
+            LOGTEXT(_L8("NotMtmUi: InvokeAsyncFuntionL Delete"));
+            msvoperation = StartDeletingL( aSelection, aCompletionStatus );
+            break;
+        default:
+            break;
+        }
+    LOGTEXT(_L8("NotMtmUi: InvokeAsyncFuntionL end"));
+    return msvoperation;
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::DisplayProgressSummary
+// ---------------------------------------------------------
+//
+TInt CNotMtmUi::DisplayProgressSummary( const TDesC8& /* aProgress */ ) const
+    {
+    // This does nothing, because MsgErrorWatcher shows all MMS error messages.
+    // Furthermore currently MMS engine does not return any sensible progress to report.
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::GetResourceFileName
+// ---------------------------------------------------------
+//
+void CNotMtmUi::GetResourceFileName( TFileName& aFileName ) const
+    {
+    aFileName = KNotMtmResourceFile;
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::CreateDefaultSettingsL
+// ---------------------------------------------------------
+//
+void CNotMtmUi::CreateDefaultSettingsL()
+    {
+    // done in engine by FactorySettings
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::HandleFactorySettingsL
+// Reset Factory Settings support
+// ---------------------------------------------------------
+EXPORT_C void CNotMtmUi::HandleFactorySettingsL( TDes8& aLevel )
+    {
+    iSettingsHandler->HandleFactorySettingsL( aLevel );
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::DeleteFromQuery()
+// Queries from the user where the notifications
+// or messages are being deleted from
+// ---------------------------------------------------------
+TInt CNotMtmUi::DeleteFromQueryL( TInt& result )
+    {
+    LOGTEXT(_L8("NotMtmUi: DeleteFromQuery start"));
+    TInt index = 0;
+    CAknListQueryDialog* dlg = new (ELeave) CAknListQueryDialog( &index );
+    dlg->PrepareLC( R_NOTUI_DELETE_FROM_QUERY );
+
+    // Populate list query array
+    CDesCArrayFlat *array = new(ELeave) CDesCArrayFlat(3);
+    CleanupStack::PushL(array);
+    HBufC* buf = StringLoader::LoadLC( R_NOTMTM_DELETE_QUERY_BOTHLOCALANDREMOTE );
+    array->AppendL( *buf );
+    CleanupStack::PopAndDestroy(); //buf
+    buf = StringLoader::LoadLC( R_NOTMTM_DELETE_QUERY_LOCALONLY );
+    array->AppendL( *buf );
+    CleanupStack::PopAndDestroy(); //buf
+    buf = StringLoader::LoadLC( R_NOTMTM_DELETE_QUERY_REMOTEONLY );
+    array->AppendL( *buf );
+    CleanupStack::PopAndDestroy(); //buf
+    dlg->SetItemTextArray( array );
+    CleanupStack::Pop(); //array
+
+    TInt queryOk = dlg->RunLD();
+    if( queryOk )
+            {
+            /* list query approved, index is usable to see what list item was selected */
+            switch( index )
+                {
+                case 0:
+                    result = EMmsDeleteBoth;
+                    break;
+                case 1:
+                    result = EMmsDeleteNotificationOnly;
+                    break;
+                case 2:
+                default:
+                    result = EMmsDeleteMMBoxOnly;
+                    break;
+                };
+            }
+    else
+            {
+            /* list query cancelled, index is unusable */
+            }
+    LOGTEXT(_L8("NotMtmUi: DeleteFromQueryL end"));
+    return queryOk;
+    }
+
+// ---------------------------------------------------------
+// CMsvOperation* CNotMtmUi::OpenServiceSettingsDialogL(TRequestStatus& aCompletionStatus)
+// Handles MMS service settings
+// ---------------------------------------------------------
+//
+EXPORT_C CMsvOperation* CNotMtmUi::OpenServiceSettingsDialogL( TRequestStatus& aCompletionStatus )
+    {
+    return iSettingsHandler->OpenServiceSettingsDialogL( aCompletionStatus );
+    }
+
+// ---------------------------------------------------------
+// CheckSettingsL
+// ---------------------------------------------------------
+//
+TBool CNotMtmUi::CheckSettingsL( )
+    {
+    CMmsSettingsDialog::TMmsExitCode exitCode = CMmsSettingsDialog::EMmsExternalInterrupt;
+    if ( !CheckSettingsL( exitCode ) )
+        {
+        TInt32 ap = iSettingsHandler->MmsSettings()->AccessPoint( 0 );
+        if( !( exitCode==CMmsSettingsDialog::EMmsBack && ApExistsL( ap ) ) )
+            {
+            return EFalse;
+            }
+        }
+    return ETrue;        
+    }
+
+// ---------------------------------------------------------
+// CMsvOperation* CNotMtmUi::CompleteSettingsOperationL(
+//    TRequestStatus& aCompletionStatus, const CMmsSettingsDialog::TMmsExitCode& aExitCode)
+// Creates completed operation after settings dialog closing with appropriate parameters.
+// ---------------------------------------------------------
+//
+EXPORT_C CMsvOperation* CNotMtmUi::CompleteSettingsOperationL(
+    TRequestStatus& aCompletionStatus,
+    const CMmsSettingsDialog::TMmsExitCode& aExitCode /* = CMmsSettingsDialog::EMmsExternalInterrupt */ )
+    {
+    return iSettingsHandler->CompleteSettingsOperationL( 
+                                aCompletionStatus,
+                                aExitCode );
+    }
+
+// ---------------------------------------------------------
+// TInt CNotMtmUi::LaunchSettingsDialogL(
+//      CMmsSettingsDialog::TMmsExitCode& aExitCode )
+// Opens either MMS Service Settings or MMS Sending Settings dialog.
+// ---------------------------------------------------------
+//
+EXPORT_C void CNotMtmUi::LaunchSettingsDialogL(
+    CMmsSettingsDialog::TMmsExitCode& aExitCode ) const
+    {
+    iSettingsHandler->LaunchSettingsDialogL( aExitCode );
+    }
+    
+
+// ---------------------------------------------------------
+// CNotMtmUi::OpenMessageInfoL(TRequestStatus& aCompletionStatus, TDes8& aParameter)
+// Opens the Message Info popup.
+// ---------------------------------------------------------
+//
+CMsvOperation* CNotMtmUi::OpenMessageInfoL( TRequestStatus& aCompletionStatus, 
+                                           TDes8& /*aParameter*/ )
+    {
+    LOGTEXT( _L8( "NotMtmUi OpenMessageInfo start" ) );
+    TInt popCount( 0 );
+
+    // The items for Info are read from the message entry.
+    // Note: Most of the stuff is in TMsvEntry, but not all -> MMS entry used all the way.
+    TMmsMsvEntry entry = static_cast<TMmsMsvEntry>( BaseMtm().Entry().Entry() );
+    __ASSERT_DEBUG( entry.iType==KUidMsvMessageEntry, Panic( EMmsNotAMessage ) );
+    __ASSERT_DEBUG( entry.iMtm==Type(), Panic( EMmsWrongMtm ) );
+
+    iMmsClient.LoadMessageL();
+
+    TMsgInfoMessageInfoData infoData;
+
+    // From - show only for received messages
+    if ( entry.IsMobileTerminated() )
+        {
+        HBufC* senderNumber = iMmsClient.Sender().AllocLC();
+        popCount++;
+        // Additional space for chars: '<' '>' ',' + 2 x KMmsLRMarker
+        HBufC* fromText = HBufC::NewLC( entry.iDetails.Length() + senderNumber->Length() + KMmsAdditionalCharsStringLength );
+        popCount++;
+        
+        // Do we have alias?
+        if ( senderNumber->Compare( entry.iDetails ) )
+            { // yes
+            TPtr fromTextPtr = fromText->Des();
+            fromTextPtr.Append( entry.iDetails );
+            fromTextPtr.Append( KMmsCharSpace );
+            fromTextPtr.Append( KMmsLRMarker );
+            fromTextPtr.Append( KCharLeftAddressIterator );
+            fromTextPtr.Append( TMmsGenUtils::PureAddress( senderNumber->Des( ) ) );
+            fromTextPtr.Append( KCharRightAddressIterator );
+            fromTextPtr.Append( KMmsLRMarker );
+            infoData.iFrom.Set( *fromText );
+            }
+        else
+            { // no
+            infoData.iFrom.Set( *senderNumber );
+            }
+        }
+    
+    // Subject
+    infoData.iSubject.Set( iMmsClient.SubjectL() );
+
+    // Supply UTC date-time  to message info
+    infoData.iDateTime = entry.iDate;
+    
+    // Type of message -taken directly from resources as this must be a multimedia message
+    HBufC* msgType = StringLoader::LoadLC( R_NOT_TYPE_TEXT, iCoeEnv );
+    popCount++;
+    infoData.iType.Set( msgType->Des() );
+      
+    // Priority of message
+    HBufC* priority = NULL;
+    switch ( iMmsClient.MessagePriority() )
+    	{
+        case EMmsPriorityHigh:
+        	{
+            priority  = StringLoader::LoadLC( R_MMS_MESSAGE_PRIORITY_HIGH, iCoeEnv );
+            popCount++;
+            infoData.iPriority.Set( *priority);
+            break;
+        	}
+    	case EMmsPriorityLow:
+    		{
+	        priority  = StringLoader::LoadLC( R_MMS_MESSAGE_PRIORITY_LOW, iCoeEnv );
+	        popCount++;
+            infoData.iPriority.Set( *priority);
+    		break;
+    		}
+        case EMmsPriorityNormal:
+        	{
+            priority  = StringLoader::LoadLC( R_MMS_MESSAGE_PRIORITY_NORMAL, iCoeEnv );
+            popCount++;
+            infoData.iPriority.Set( *priority);
+            break;
+            }
+        default: // Do not show the priority if it's not set
+            break;
+        }
+
+    // Size of message.
+    TInt size = iMmsClient.MessageTransferSize( );
+    TInt maxSize = static_cast<TInt>(
+        iSettingsHandler->MmsSettings()->MaximumReceiveSize() );
+
+    if( maxSize > 0 )
+        {
+        if( size > maxSize )
+            {
+            size = maxSize;
+            }
+        }
+
+    // Finally make the UI string
+    TBuf<KMessageSize> sizeString;
+    MessageSizeToStringL( sizeString, size );
+    infoData.iSize.Set( sizeString );
+
+    // To
+    const CMsvRecipientList& recipients = iMmsClient.AddresseeList();
+    TInt count = recipients.Count(); 
+    TPtrC separatorPtr( KAddressSeparator );
+
+    // Calculate size needed
+    TInt index;
+    TInt toSize = 0; 
+
+    for ( index = 0; index < count; index++ )
+        {
+        toSize += recipients[index].Length();
+        if ( index < ( count - 1 ) )
+            { // not the last address, add separator space
+            toSize += separatorPtr.Length();
+            }
+        }
+
+    if ( toSize )
+        {
+        // Form the to-string
+        HBufC* toList = TurnRecipientsArrayIntoStringLC( recipients );
+        popCount++;
+        infoData.iTo.Set( *toList );
+        }
+
+    CMsgInfoMessageInfoDialog* infoDialog = CMsgInfoMessageInfoDialog::NewL();
+
+    if ( entry.IsMobileTerminated() )
+        {
+        infoDialog->ExecuteLD( infoData, CMsgInfoMessageInfoDialog::EMmsViewer );
+        }
+    else
+        {
+        infoDialog->ExecuteLD( infoData, CMsgInfoMessageInfoDialog::EMmsEditor );
+        }
+
+    CleanupStack::PopAndDestroy( popCount );
+    return CMsvCompletedOperation::NewL( Session(), 
+        KUidMsvLocalServiceMtm, 
+        KNullDesC8, 
+        KMsvLocalServiceIndexEntryId, 
+        aCompletionStatus );
+    }
+
+
+// ---------------------------------------------------------
+// CNotMtmUi::OpenMMBoxDialogL
+// Opens the MMBox Dialog
+// ---------------------------------------------------------
+//
+CMsvOperation* CNotMtmUi::OpenMMBoxDialogL( TRequestStatus& aCompletionStatus )
+    {
+    LOGTEXT( _L8( "NotMtmUi OpenMMBoxDialog start" ) );
+
+    TInt exitCode;
+
+    CMtmUiDataRegistry* mtmUiDataReg = CMtmUiDataRegistry::NewL( Session( ) );
+    CleanupStack::PushL( mtmUiDataReg );
+
+    CBaseMtmUiData* mtmUiData = mtmUiDataReg->NewMtmUiDataLayerL( this->Type( ) );
+    CleanupStack::PushL( mtmUiData );
+    CNotMtmUiData* uiData = static_cast<CNotMtmUiData*> ( mtmUiData );
+
+    CMMBoxDialog* dialog = CMMBoxDialog::NewL( *this, *uiData, Session(), exitCode );
+
+    dialog->ExecuteLD( R_NOT_MMBOX_DIALOG );
+
+    CleanupStack::PopAndDestroy( mtmUiData );
+    CleanupStack::PopAndDestroy( mtmUiDataReg );
+
+    return CMsvCompletedOperation::NewL( Session(), 
+        KUidMsvLocalServiceMtm, 
+        KNullDesC8, 
+        KMsvLocalServiceIndexEntryId, 
+        aCompletionStatus );
+    }
+
+
+
+// ---------------------------------------------------------
+// CNotMtmUi::StartFetchingL
+// ---------------------------------------------------------
+//
+CMsvOperation* CNotMtmUi::StartFetchingL(
+            const CMsvEntrySelection& aSelection,
+            TRequestStatus& aCompletionStatus )
+    {
+    LOGTEXT( _L8( "NotMtmUi StartFetchingL start" ) );
+    // Lets check the expiration if only one notification
+    if( aSelection.Count( ) == 1 )
+        {
+        TMsvEntry entry;
+        TMsvId service=-1;
+        Session().GetEntry( aSelection.At( 0 ), service, entry );
+	    if( entry.Parent( ) == KMsvGlobalInBoxIndexEntryId )
+            { // We are in Inbox
+            TMsvId origId = iMmsClient.Entry().Entry().Id();
+            iMmsClient.SwitchCurrentEntryL( aSelection.At( 0 ) );
+            iMmsClient.LoadMessageL( );
+            TTime currentTime;
+            currentTime.HomeTime( );
+            TTime expiryTime = iMmsClient.ExpiryDate( );
+            iMmsClient.SwitchCurrentEntryL( origId );
+            iMmsClient.LoadMessageL( );
+            TLocale locale;
+            expiryTime += locale.UniversalTimeOffset();
+            if (locale.QueryHomeHasDaylightSavingOn())          
+                {
+                TTimeIntervalHours daylightSaving(1);          
+                expiryTime += daylightSaving;
+                }
+
+            if( currentTime > expiryTime )
+                {   // Message is expired
+                TBool res = EFalse;
+                TRAPD( err, res=ShowConfirmationQueryL( R_NOT_MMBOX_QUEST_MSG_EXPIRED ) );
+                if ( err || !res )
+                    {   // User did not want to fetch expired message or the function leaved
+                    CMmsSettingsDialog::TMmsExitCode exitCode = CMmsSettingsDialog::EMmsBack;
+                    return CompleteSettingsOperationL( aCompletionStatus, exitCode );
+                    } // else we continue
+                }
+            }
+        }
+
+    //we need to check access points here
+    CMmsSettingsDialog::TMmsExitCode exitCode = CMmsSettingsDialog::EMmsExternalInterrupt;
+    if ( !CheckSettingsL( exitCode ) )
+        {
+        TInt32 ap = iSettingsHandler->MmsSettings()->AccessPoint( 0 );
+        //settings saved
+        if( exitCode==CMmsSettingsDialog::EMmsBack && ApExistsL( ap ) )
+            {
+            CMsvOperation* op = NULL;
+            CAknInputBlock* abs = CAknInputBlock::NewLC( );
+            TRAP_IGNORE( op = iMmsClient.FetchMessagesL( aSelection, aCompletionStatus) );
+            CleanupStack::PopAndDestroy( abs ); 
+            return op;
+            }
+        else//user selects exit and settings not saved
+            {
+            return CompleteSettingsOperationL( aCompletionStatus, exitCode );
+            }
+        }
+    else
+        {
+        // OK - settings ok and fetch could be done
+        CAknInputBlock* abs = CAknInputBlock::NewLC( );
+        CMsvOperation* op = NULL;
+        TRAP_IGNORE( op = iMmsClient.FetchMessagesL( aSelection, aCompletionStatus) );
+        CleanupStack::PopAndDestroy( abs ); 
+        return op;
+        }
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::StartDeletingL
+// ---------------------------------------------------------
+//
+CMsvOperation* CNotMtmUi::StartDeletingL(
+            const CMsvEntrySelection& aSelection,
+            TRequestStatus& aCompletionStatus )
+    {
+    LOGTEXT( _L8( "NotMtmUi StartDeletingL start" ) );
+
+    CMsvOperation* msvoperation = NULL;
+
+    if( aSelection.Count( ) == 0 )
+        { // Nothing to delete
+        return msvoperation;
+        }
+
+    if( aSelection.Count( ) > 1 )
+        {
+        iFlags |= EDeletingMany;
+        }
+    else
+        {
+        iFlags &= ~EDeletingMany;
+        }
+
+    iFlags &= ~EDeletingFromMMBox;
+
+    TInt deleteMode(-1);
+
+    CMsvEntry* cEntry = Session().GetEntryL( aSelection[0] );
+    CleanupStack::PushL( cEntry );
+
+    TMsvEntry entry = cEntry->Entry( );
+
+    CleanupStack::PopAndDestroy();    //cEntry
+
+    if( entry.Parent( ) == KMsvGlobalInBoxIndexEntryId 
+      ||  entry.Parent( ) == iMmsClient.GetMmboxFolderL( ) )
+        {
+        if(     iNotUiFlags & EOffline
+            &&  IS_PHONE_OFF_LINEL() )
+            {   // We are in offline at the moment -> Infonote
+            ShowInformationNoteL( R_NOTMTM_OFFLINE_NOT_POSSIBLE, EFalse );
+            return msvoperation;
+            }
+        }
+
+    if(     ( entry.Parent( ) == KMsvGlobalInBoxIndexEntryId )
+        &&  ( iNotUiFlags & EDeleteOptionsSupported ) 
+        && DeleteQueryReallyNeededL( aSelection ) )
+        { // Query is really needed (we r in Inbox, DeleteOptions supported
+          // and the msg has not been deleted from server yet
+        if( !( DeleteFromQueryL( deleteMode ) ) )
+            {   // Answered Cancel
+            return msvoperation; // Return NULL operation
+            }
+        if( deleteMode != EMmsDeleteNotificationOnly )
+            {
+            iFlags |= EDeletingFromMMBox;
+            }
+        }
+    else // Either we have no options or we are deleting FR(s)
+        {
+        if( entry.Parent( ) == iMmsClient.GetMmboxFolderL( ) )
+            {
+            iFlags |= EDeletingFromMMBox;
+            deleteMode = EMmsDeleteBoth;
+            }
+        else
+            {
+            deleteMode = EMmsDeleteNotificationOnly;
+            }
+        CAknQueryDialog* dlg = CAknQueryDialog::NewL();
+        HBufC* prompt;
+        if( iFlags & EDeletingMany )
+            {
+            prompt = StringLoader::LoadLC( R_NOTMTM_QUEST_DELETE_MESSAGES, aSelection.Count(), iCoeEnv );
+            }
+        else
+            {
+            prompt = StringLoader::LoadLC( R_NOTMTM_QUEST_DELETE_MESSAGE, iCoeEnv );
+            }
+        // Lets prompt the question
+        TInt retVal = dlg->ExecuteLD( R_NOTUI_CONFIRMATION_QUERY, *prompt );
+        CleanupStack::PopAndDestroy( prompt );
+
+        if( !retVal )
+            { // Answered NO
+            return msvoperation; // Return NULL operation
+            }
+        }
+    if( deleteMode == -1 )
+        {   // For some reason deleteMode was not set
+        return msvoperation; // Return NULL operation
+        }
+	if( iFlags & EDeletingFromMMBox )
+		{
+		CMmsSettingsDialog::TMmsExitCode exitCode = CMmsSettingsDialog::EMmsExternalInterrupt;
+		if ( !CheckSettingsL( exitCode ) )
+			{
+			TInt32 ap = iSettingsHandler->MmsSettings()->AccessPoint( 0 );
+			// just return NULL if the settings are not all right
+			if( !ApExistsL( ap ) )
+				{
+				return msvoperation;
+				}
+			}
+		}
+    // Now we can start the deleting process
+    if(     entry.Parent( ) == KMsvGlobalInBoxIndexEntryId 
+        ||  entry.Parent( ) == iMmsClient.GetMmboxFolderL( ) )
+        {   // We are now in Inbox
+
+        CMsvProgressReporterOperation* reporter = 
+            CMsvProgressReporterOperation::NewL(
+                Session(),
+                aCompletionStatus,
+                EMbmAvkonQgn_note_erased );
+
+        CleanupStack::PushL(reporter);
+
+        CMsvOperation* deleteop = iMmsClient.UnscheduledDeleteNotificationL(
+                            aSelection,
+                            (TMmsDeleteOperationType)deleteMode,
+                            reporter->RequestStatus() );
+        reporter->SetProgressDecoder( *this );
+        reporter->SetOperationL( deleteop ); // Takes immediate ownership
+        CleanupStack::Pop(); //reporter
+        msvoperation = reporter;
+        }
+    else 
+        { // We are in Outbox/Sent folder -> Synchronously Delete FR
+        TInt waitNoteId = 0;
+        waitNoteId = aSelection.Count( ) == 1?
+            R_NOTMTM_WAIT_DELETING:R_NOTMTM_WAIT_DELETING_MANY;
+        ShowWaitNoteLC( waitNoteId, ETrue); // Show deleting note
+
+        iMmsClient.DeleteForwardEntryL( aSelection );
+
+        if( iWaitDialog )
+            {
+            CleanupStack::PopAndDestroy( ); // iWaitDialog
+            iWaitDialog=NULL;
+            }          
+
+        return msvoperation; // Return NULL operation as DeleteForwardEntryL is actually synchronous
+        }
+
+    return msvoperation;
+    }
+
+
+// ---------------------------------------------------------
+// CNotMtmUi::TurnRecipientsArrayIntoStringLC
+//
+// ---------------------------------------------------------
+HBufC* CNotMtmUi::TurnRecipientsArrayIntoStringLC( const CMsvRecipientList& aRecip ) const
+    {
+    //calc length of string needed
+    TInt stringLength = 0;
+    TInt index;
+    TInt count = aRecip.Count();
+    for( index = 0; index < count; index++ )
+        {
+        stringLength += TMmsGenUtils::Alias( aRecip[index] ).Length();
+        stringLength += TMmsGenUtils::PureAddress( aRecip[index] ).Length();
+        // Additional space for chars: '<' '>' ',' + 2 x KMmsLRMarker
+        stringLength += KMmsAdditionalCharsStringLength;
+        }
+    //construct string
+    HBufC* toList = HBufC::NewLC( stringLength );
+    for( index=0; index < count; index++ )
+        {
+        TPtrC name = TMmsGenUtils::Alias( aRecip[index] );
+        TPtrC number = TMmsGenUtils::PureAddress( aRecip[index] );
+        TPtr toListPtr = toList->Des();
+        if( name.Length())
+            {
+            toListPtr.Append( name );
+            toListPtr.Append( KMmsCharSpace );
+            toListPtr.Append( KMmsLRMarker );
+            toListPtr.Append( KCharLeftAddressIterator );
+            toListPtr.Append( number );
+            toListPtr.Append( KCharRightAddressIterator );
+            toListPtr.Append( KMmsLRMarker );
+            }
+        else
+            {
+            toListPtr.Append( number );
+            }
+        
+        if ( index < ( count - 1 ) )
+            {
+            toListPtr.Append( KMmsCharCommaAndSpace );
+            }
+        }
+
+    return toList;
+    }       
+
+
+
+// ---------------------------------------------------------
+// CNotMtmUi::MessageSizeToStringL(TDes& aTarget, TInt aFileSize)
+// Converts message size in bytes to a kilobyte string. Rounds the bytes up to the
+// next full kilo. I.e:
+// 0 -> 0KB
+// 1 -> 1KB
+// 1024 -> 1KB
+// 1025 -> 2KB
+// ---------------------------------------------------------
+//
+void CNotMtmUi::MessageSizeToStringL( TDes& aTarget, TInt aFileSize ) const
+    {
+    TInt fileSize = aFileSize / KKiloByte;
+    if ( aFileSize % KKiloByte )
+        {
+        fileSize++;
+        }
+
+    HBufC* buf = StringLoader::LoadLC( R_NOT_MESSAGE_SIZE_KB, fileSize, iEikonEnv );
+    TPtr ptr = buf->Des();
+    ptr.Trim(); // remove possible white space from beginning
+    aTarget.Append( ptr );
+
+    CleanupStack::PopAndDestroy(); // buf
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::ShowConfirmationQueryL
+// ---------------------------------------------------------
+//
+TInt CNotMtmUi::ShowConfirmationQueryL( TInt aResourceId ) const
+    {
+    CAknQueryDialog* dlg = CAknQueryDialog::NewL();
+    HBufC* prompt = StringLoader::LoadLC( aResourceId, iCoeEnv );
+    TInt retVal = dlg->ExecuteLD( R_NOTUI_CONFIRMATION_QUERY, *prompt );
+    CleanupStack::PopAndDestroy( prompt );
+    return retVal;
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::ApExistsL
+// Checks the existence of given access point
+// according to id.
+// ---------------------------------------------------------
+//
+EXPORT_C TBool CNotMtmUi::ApExistsL( TInt32 aAp )
+    {
+    return iSettingsHandler->ApExistsL( aAp );
+    }
+
+// ---------------------------------------------------------
+// ConstructWaitNoteLC
+// ---------------------------------------------------------
+
+void CNotMtmUi::ConstructWaitNoteLC(
+    TBool aVisibilityDelayOff )
+    {
+    delete iWaitDialog;
+    iWaitDialog = NULL;
+    iWaitDialog = new (ELeave) CAknWaitDialog( 
+        reinterpret_cast<CEikDialog**>( &iWaitDialog ), 
+        aVisibilityDelayOff );
+    CleanupStack::PushL( TCleanupItem( CleanupWaitDialog, (TAny**)&iWaitDialog ) ); 
+    iWaitDialog->PrepareLC( DELETING_WAIT_NOTE );
+    }
+
+// ---------------------------------------------------------
+// ShowWaitNoteLC
+// ---------------------------------------------------------
+
+void CNotMtmUi::ShowWaitNoteLC(
+    TInt aNoteTxtResourceId, 
+    TBool aVisibilityDelayOff )
+    {
+    ConstructWaitNoteLC( aVisibilityDelayOff );
+    HBufC* text = StringLoader::LoadLC( aNoteTxtResourceId, iCoeEnv );
+    iWaitDialog->SetTextL( *text );
+    CleanupStack::PopAndDestroy( ); // text
+    iWaitDialog->RunLD( );
+    }
+    
+// ---------------------------------------------------------
+// CleanupWaitDialog
+// ---------------------------------------------------------
+//
+void CNotMtmUi::CleanupWaitDialog( TAny* aAny ) 
+    { 
+    CAknWaitDialog** dialog = (CAknWaitDialog**) aAny; 
+    if ( dialog && *dialog )
+        { 
+        delete *dialog;
+        } 
+    *dialog = NULL;
+    dialog = NULL;
+    } 
+
+//--------------------------------
+// DecodeProgress
+//--------------------------------
+TInt CNotMtmUi::DecodeProgress(
+    const TDesC8& /*aProgress*/, 
+    TBuf<CBaseMtmUi::EProgressStringMaxLen>& aReturnString, 
+    TInt& aTotalEntryCount, 
+    TInt& aEntriesDone,
+    TInt& aCurrentEntrySize, 
+    TInt& aCurrentBytesTrans, 
+    TBool /*aInternal*/ )
+    {
+    aCurrentEntrySize = 0;
+    aCurrentBytesTrans = 0;   
+    aEntriesDone = 0;
+    aTotalEntryCount = 0;
+
+    if( iFlags & EDeletingFromMMBox )
+        {
+        StringLoader::Load( aReturnString,
+                            R_NOTMTM_WAIT_DELETING_REMOTE,
+                            iCoeEnv );
+        }
+    else if( iFlags & EDeletingMany )
+        {
+        StringLoader::Load( aReturnString,
+                            R_NOTMTM_WAIT_DELETING_MANY,
+                            iCoeEnv );
+        }
+    else
+        {
+        StringLoader::Load( aReturnString,
+                            R_NOTMTM_WAIT_DELETING,
+                            iCoeEnv );
+        }
+    return KErrNone;
+    }
+
+//--------------------------------
+// DeleteQueryRequiredByMtm
+//--------------------------------
+EXPORT_C TBool CNotMtmUi::DeleteQueryRequiredByMtm()
+    {
+    TBool result(EFalse);
+    if( iNotUiFlags & EDeleteOptionsSupported )
+        {
+        return ETrue;
+        }
+    return result;
+    }
+
+//--------------------------------
+// DeleteQueryReallyNeeded
+//--------------------------------
+TBool CNotMtmUi::DeleteQueryReallyNeededL( const CMsvEntrySelection& aSelection )
+    {
+    TBool result( ETrue );
+    if( aSelection.Count( ) == 1 )
+        {
+        CMsvEntry* cEntry = Session().GetEntryL( aSelection[0] );
+        CleanupStack::PushL( cEntry );
+
+        TMsvEntry entry = cEntry->Entry( );
+
+        CleanupStack::PopAndDestroy();    //cEntry
+
+        // Delete from server is not needed if it's been deleted
+        if(     ( entry.iMtmData2 & KMmsOperationFetch ) // Fetch+Forward=DELETE!
+            &&  ( entry.iMtmData2 & KMmsOperationForward )  // 
+            &&  ( entry.iMtmData2 & KMmsOperationFinished )  // Finished
+            && !( entry.iMtmData2 & KMmsOperationResult ) ) // Succesfully
+            {   // Returns false if only one entry available
+            // and it has been deleted from server already
+            result = EFalse;
+            }
+        }
+    return result;
+    }
+
+// ---------------------------------------------------------
+// CNotMtmUi::ShowInformationNoteL
+// ---------------------------------------------------------
+//
+void CNotMtmUi::ShowInformationNoteL( TInt aResourceID, TBool aWaiting )
+    {
+    HBufC* string = NULL;
+    string = StringLoader::LoadLC( aResourceID, iCoeEnv );
+
+    CAknInformationNote* note = new ( ELeave )
+        CAknInformationNote( aWaiting );
+    note->ExecuteLD( *string );
+
+    CleanupStack::PopAndDestroy(); //string
+    }
+
+//  End of File