--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mobilemessaging/mmsui/notmtmsrc/MMBoxDialog.cpp Thu Dec 17 08:44:11 2009 +0200
@@ -0,0 +1,1974 @@
+/*
+* 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: Implementation of the CMMBoxDialog class
+*
+*/
+
+
+
+// INCLUDES
+#include <eikmenup.h>
+#include <aknViewAppUi.h> // iAvkonViewAppUi
+#include <AknWaitDialog.h> // CAknWaitDialog
+#include <eikprogi.h> // CEikProgressInfo
+#include <AknQueryDialog.h> // CAknQueryDialog
+#include <aknlists.h>
+#include <StringLoader.h> // StringLoader
+#include <akntitle.h> // CAknTitlePane
+#include <AknIconArray.h> // CAknIconArray
+// message includes
+#include <msvapi.h> // for CMsvSession
+#include <msvstd.h> // SelectionOrder
+#include <akninputblock.h> // CAknInputBlock
+#include <MuiuMsvProgressReporterOperation.h> // MsvProgressReporterOperation
+#include <MuiuMsgEmbeddedEditorWatchingOperation.h> // CMsgEmbeddedEditorWatchingOperation
+#include <data_caging_path_literals.hrh>
+#include <muiumsvuiserviceutilitiesinternal.h>
+
+#include <MuiuOperationWait.h> // CMuiuOperationWait
+#include <csxhelp/mce.hlp.hrh>
+#include <hlplch.h> // For HlpLauncher
+#include <bldvariant.hrh>
+#include <featmgr.h> // FeatureManager
+#include <muiu.mbg> // bitmaps
+#include <msvids.h> // for KMsvInboxIndexEntryId
+#include <mtclreg.h>
+#include <AknsUtils.h> // For skinned stuff
+#include <eikmenub.h> // For CEikMenuBar
+#include <aknnotewrappers.h> // CAknInformationNote
+#include <mmsnotificationclient.h> // For Notification Client MTM
+#include <aknnavi.h> // For navipane
+#include <aknnavide.h> // CAknNavigationDecorator
+#include <akntabgrp.h> // CAknTabGroup
+#include <aknenv.h> // CAknEnv
+
+#include <NotUi.rsg>
+#include "NotUi.hrh" // for EMsgControlIdMMBoxListBox
+#include "MMBoxDialog.h"
+#include "NotMtmUi.h"
+#include "NotMtmUiData.h"
+#include "MmsMtmConst.h"
+
+// LOCAL CONSTANTS AND MACROS
+const TInt KMMBoxBitmapArrayGranularity = 4;
+const TInt KMMBoxMaxStatusInfoLength = 256;
+const TInt KDateSize = 30;
+const TInt KMMBoxDialogFetchOperationsGranularity = 1;
+const TInt KLocalKilo = 1024;
+const TUid KUidMsvMessageListSortOrder={0x10005359};
+
+_LIT( KMMBoxMarkReplacement, "1");
+#define IS_PHONE_OFF_LINEL() MsvUiServiceUtilitiesInternal::IsPhoneOfflineL()
+//#if defined ( _DEBUG )
+// Enables notifications view testing without mmbox (to some extent).
+// Uses Inbox as notifications folder instead of mmbox folder.
+//#define MMS_NOTIFICATIONS_TESTING_WO_MMBOX 1
+//#endif
+
+
+//
+//
+// CMMBoxDialog
+//
+//
+
+// ----------------------------------------------------
+// CMMBoxDialog::CMMBoxDialog
+// ----------------------------------------------------
+CMMBoxDialog::CMMBoxDialog( CNotMtmUi& aUi,
+ CNotMtmUiData& aUiData,
+ CMsvSession& aSession,
+ TInt& aExitCode ):
+ iUi( aUi ),
+ iUiData( aUiData ),
+ iClientMtm( NULL ),
+ iSession( aSession ),
+ iNaviDecorator( NULL ),
+ iMMBoxFolderId( KMsvGlobalInBoxIndexEntryId ),
+ iFetchOperations( KMMBoxDialogFetchOperationsGranularity ),
+ iDeleteSelection( NULL ),
+ iExitCode( aExitCode ),
+ iFlags( 0 ),
+ iOriginalOrder ( KMsvNoGrouping, EMsvSortByDateReverse, EFalse )
+ {
+ iExitCode = KErrNone;
+ iMarkReplacementText.Copy( KMMBoxMarkReplacement );
+ }
+
+// ----------------------------------------------------
+// CMMBoxDialog::~CMMBoxDialog
+// ----------------------------------------------------
+CMMBoxDialog::~CMMBoxDialog()
+ {
+ LOGTEXT(_L8("MMBoxDialog: Destructor "));
+ iSession.RemoveObserver( *this );
+ delete iClientMtm;
+ delete iMtmReg;
+ // do not delete iNavipane - it's just a pointer
+ delete iOldTitleText;
+ delete iDeleteOperation;
+ delete iOpenOperation;
+ for ( TInt cc=iFetchOperations.Count()-1; cc>=0; cc-- )
+ {
+ delete iFetchOperations[cc];
+ iFetchOperations.Delete(cc);
+ }
+ iFetchOperations.ResetAndDestroy();
+ delete iDeleteSelection;
+ delete iUpdateOperation;
+ delete iWaitDialog;
+ delete iMessages;
+ }
+
+// ----------------------------------------------------
+// CMMBoxDialog::NewL
+// ----------------------------------------------------
+CMMBoxDialog* CMMBoxDialog::NewL( CNotMtmUi& aUi,
+ CNotMtmUiData& aUiData,
+ CMsvSession& aSession,
+ TInt& aExitCode )
+ {
+ CMMBoxDialog* self= new(ELeave) CMMBoxDialog( aUi,
+ aUiData, aSession, aExitCode );
+ CleanupStack::PushL(self);
+ self->ConstructL( );
+ CleanupStack::Pop( );
+ return self;
+ }
+
+// ----------------------------------------------------
+// CMMBoxDialog::ConstructL
+// ----------------------------------------------------
+void CMMBoxDialog::ConstructL( )
+ {
+ LOGTEXT(_L8("MMBoxDialog: Construct start"));
+ CAknDialog::ConstructL( R_NOT_MMBOX_MENUBAR );
+ LOGTEXT(_L8("MMBoxDialog: Construct 2"));
+ iMessages = CMMBoxArray::NewL( iSession, iUiData );
+ LOGTEXT(_L8("MMBoxDialog: Construct 3"));
+ iSession.AddObserverL( *this );
+
+ // Prepare FeatureManager, read values to members and uninitialize FeatureManager
+ FeatureManager::InitializeLibL( );
+ if( FeatureManager::FeatureSupported( KFeatureIdHelp ) )
+ {
+ iFlags |= EHelpSupported;
+ }
+ FeatureManager::UnInitializeLib( );
+
+ CEikStatusPane *sp = iEikonEnv->AppUiFactory( )->StatusPane( );
+
+ if ( sp )
+ {
+ iNaviPane = static_cast<CAknNavigationControlContainer*>
+ ( sp->ControlL( TUid::Uid( EEikStatusPaneUidNavi ) ) );
+ }
+ LOGTEXT(_L8("MMBoxDialog: Constructor end "));
+ }
+
+// ----------------------------------------------------
+// CMMBoxDialog::PreLayoutDynInitL
+// ----------------------------------------------------
+void CMMBoxDialog::PreLayoutDynInitL( )
+ {
+ LOGTEXT(_L8("MMBoxDialog: PreLayoutDynInitL start"));
+ CEikColumnListBox* listBox = ListBox( );
+ listBox->SetListBoxObserver( this );
+
+ // Create scroll bar
+ LOGTEXT(_L8("MMBoxDialog: PreLayoutDynInitL 2"));
+ listBox->CreateScrollBarFrameL( );
+ LOGTEXT(_L8("MMBoxDialog: PreLayoutDynInitL 3"));
+ CAknAppUiBase* appUi = static_cast<CAknAppUiBase*>( iEikonEnv->EikAppUi() );
+ if (AknLayoutUtils::DefaultScrollBarType(appUi) == CEikScrollBarFrame::EDoubleSpan)
+ {
+ // For EDoubleSpan type scrollbar
+ listBox->ScrollBarFrame( )->CreateDoubleSpanScrollBarsL(EFalse, EFalse); // non-window owning scrollbar
+ listBox->ScrollBarFrame( )->SetTypeOfVScrollBar(CEikScrollBarFrame::EDoubleSpan);
+ }
+ else
+ {
+ listBox->ScrollBarFrame( )->SetTypeOfVScrollBar(CEikScrollBarFrame::EArrowHead);
+ }
+ listBox->ScrollBarFrame( )->SetScrollBarVisibilityL(
+ CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto );
+
+ // Set data
+ listBox->Model( )->SetItemTextArray( iMessages );
+ listBox->Model( )->SetOwnershipType( ELbmDoesNotOwnItemArray );
+
+ LOGTEXT(_L8("MMBoxDialog: PreLayoutDynInitL 4"));
+ HBufC* emptyText = StringLoader::LoadLC(
+ R_NOT_MMBOX_EMPTY_STRING,
+ iCoeEnv );
+ listBox->View( )->SetListEmptyTextL( *emptyText );
+ CleanupStack::PopAndDestroy( emptyText );
+
+ LOGTEXT(_L8("MMBoxDialog: PreLayoutDynInitL 5"));
+ StoreTitleTextAndNavipaneAndSetNewL( );
+ LOGTEXT(_L8("MMBoxDialog: PreLayoutDynInitL 6"));
+
+ iMtmReg = CClientMtmRegistry::NewL( iSession );
+ LOGTEXT(_L8("MMBoxDialog: PreLayoutDynInitL 7"));
+ iClientMtm = (CMmsNotificationClientMtm*)iMtmReg->NewMtmL( KUidMsgMMSNotification );
+ LOGTEXT(_L8("MMBoxDialog: PreLayoutDynInitL 8"));
+
+#ifndef MMS_NOTIFICATIONS_TESTING_WO_MMBOX
+ iMMBoxFolderId = iClientMtm->GetMmboxFolderL( );
+#else
+ LOGTEXT(_L8("MMBoxDialog: MMS_NOTIFICATIONS_TESTING_WO_MMBOX on"));
+#endif
+ LOGTEXT(_L8("MMBoxDialog: PreLayoutDynInitL 9"));
+
+ CArrayPtrFlat<CGulIcon>* icons
+ = new( ELeave ) CAknIconArray(
+ KMMBoxBitmapArrayGranularity );
+
+ CleanupStack::PushL( icons );
+
+ // create icon array
+ TFileName fileName;
+ fileName.Copy( KAvkonBitmapFile );
+ LOGTEXT(_L8("MMBoxDialog: PreLayoutDynInitL Append bitmaps"));
+ // this must be first because of SetItemMarkReplacement index.
+ AppendSkinnedIconL( fileName, EMbmAvkonQgn_prop_checkbox_on, icons );
+ AppendSkinnedIconL( fileName, EMbmAvkonQgn_prop_checkbox_off, icons );
+
+ // priority icons
+ AppendSkinnedIconL( fileName, EMbmAvkonQgn_indi_mce_priority_high, icons );
+ AppendSkinnedIconL( fileName, EMbmAvkonQgn_indi_mce_priority_low, icons );
+ LOGTEXT(_L8("MMBoxDialog: PreLayoutDynInitL Append bitmaps end"));
+
+ iNaviPane = static_cast<CAknNavigationControlContainer*>
+ ( iEikonEnv->AppUiFactory()->StatusPane()->ControlL(
+ TUid::Uid(EEikStatusPaneUidNavi) ) );
+ iNaviPane->PushDefaultL();
+
+ REINTERPRET_CAST( CAknDoubleGraphicStyleListBox*, listBox)->
+ ItemDrawer( )->FormattedCellData()->SetIconArrayL( icons );
+ listBox->ItemDrawer( )->SetItemMarkReplacement( iMarkReplacementText );
+ CleanupStack::Pop( icons ); // icons
+
+ LOGTEXT(_L8("MMBoxDialog: PreLayoutDynInitL 10"));
+ UpdateMMBoxArrayL( );
+ LOGTEXT(_L8("MMBoxDialog: PreLayoutDynInitL 11"));
+ UpdateNavipaneL( );
+ LOGTEXT(_L8("MMBoxDialog: PreLayoutDynInitL end"));
+ }
+
+// ----------------------------------------------------
+// CMMBoxDialog::PostLayoutDynInitL
+// ----------------------------------------------------
+void CMMBoxDialog::PostLayoutDynInitL()
+ {
+ LOGTEXT(_L8("MMBoxDialog: PostLayoutDynInitL start"));
+
+ if ( IS_PHONE_OFF_LINEL() )
+ { // We are in offline at the moment -> just return
+ return;
+ }
+
+ if( !iUi.CheckSettingsL( ) )
+ { // AP is not valid -> just return
+ return;
+ }
+
+ TMmboxInfo info;
+
+ TInt err=0;
+ TInt ret=0;
+ TRAP( err, ret = iClientMtm->MmboxInfoL( info ) );
+
+#ifdef MMS_NOTIFICATIONS_TESTING_WO_MMBOX
+ ret = 1;
+ info.error = 0;
+ info.date.HomeTime();
+#endif
+
+ if( err )
+ {
+ LOGTEXT(_L8("MMBoxDialog: PostLayoutDynInitL info leave"));
+ return;
+ }
+ else if( ret )
+ {
+ LOGTEXT(_L8("MMBoxDialog: PostLayoutDynInitL info found"));
+ TInt startUpdate;
+ if( info.error )
+ {
+ LOGTEXT(_L8("MMBoxDialog: PostLayoutDynInitL info update was not success"));
+ HBufC* buf; // a buffer for strings
+ buf =
+ StringLoader::LoadL( R_NOT_MMBOX_LAST_UPDATE_ERROR, iCoeEnv );
+ CleanupStack::PushL( buf );
+
+ startUpdate = ShowConfirmationQueryL( *buf );
+
+ CleanupStack::PopAndDestroy( buf );
+ }
+ else
+ {
+ LOGTEXT(_L8("MMBoxDialog: PostLayoutDynInitL info update was success last"));
+
+ TTime date( info.date );
+
+ // Date is GMT so add offset + dst
+ TLocale locale;
+ date += locale.UniversalTimeOffset();
+ if (locale.QueryHomeHasDaylightSavingOn())
+ {
+ TTimeIntervalHours daylightSaving(1);
+ date += daylightSaving;
+ }
+
+ HBufC* buf; // a buffer for strings
+ HBufC* dateFormat = StringLoader::LoadLC( R_QTN_DATE_SHORT, iCoeEnv );
+ TBuf<KDateSize> dateString;
+ date.FormatL( dateString, *dateFormat );
+ CleanupStack::PopAndDestroy(); //dateFormat
+
+ dateFormat = StringLoader::LoadLC( R_QTN_TIME_USUAL, iCoeEnv );
+ TBuf<KDateSize> timeString;
+ date.FormatL( timeString, *dateFormat );
+ CleanupStack::PopAndDestroy(); //dateFormat
+
+ CDesC16ArrayFlat* array = new(ELeave) CDesC16ArrayFlat( 2 );
+ CleanupStack::PushL( array );
+ array->AppendL( timeString );
+ array->AppendL( dateString );
+ buf =
+ StringLoader::LoadL( R_NOT_MMBOX_TIMED_QUERY, *array, iCoeEnv );
+ CleanupStack::PopAndDestroy( array );
+ CleanupStack::PushL( buf );
+
+ startUpdate = ShowConfirmationQueryL( *buf );
+
+ CleanupStack::PopAndDestroy( buf );
+ }
+ if( !startUpdate )
+ { // User did not accept the "Update?" query
+ return;
+ }
+ }
+ else
+ {
+ if( !ShowConfirmationQueryL( R_NOT_MMBOX_TIMELESS_QUERY ) )
+ {
+ return;
+ }
+ }
+
+ // If we end up here, user confirmed the update
+ LOGTEXT(_L8("MMBoxDialog: PostLayoutDynInitL 2"));
+ UpdateListL( );
+ LOGTEXT(_L8("MMBoxDialog: PostLayoutDynInitL end"));
+
+ return;
+ }
+
+// ----------------------------------------------------
+// CMMBoxDialog::AppendSkinnedIconL
+// ----------------------------------------------------
+void CMMBoxDialog::AppendSkinnedIconL(
+ TFileName& aFileName,
+ TInt aIconIndex,
+ CArrayPtrFlat<CGulIcon>* aIcons)
+ {
+ LOGTEXT(_L8("MMBoxDialog: AppendSkinnedIconL start"));
+ TAknsItemID skinId;
+ switch ( aIconIndex )
+ {
+ case EMbmAvkonQgn_prop_checkbox_off:
+ {
+ skinId.Set( KAknsIIDQgnPropCheckboxOff );
+ break;
+ }
+ case EMbmAvkonQgn_prop_checkbox_on:
+ {
+ skinId.Set( KAknsIIDQgnPropCheckboxOn );
+ break;
+ }
+ case EMbmAvkonQgn_indi_mce_priority_high:
+ {
+ skinId.Set( KAknsIIDQgnIndiMcePriorityHigh );
+ break;
+ }
+ case EMbmAvkonQgn_indi_mce_priority_low:
+ {
+ skinId.Set( KAknsIIDQgnIndiMcePriorityLow );
+ break;
+ }
+ default:
+ {
+ User::Leave( KErrNotFound );
+ break;
+ }
+ }
+
+ CFbsBitmap* bitmap = NULL;
+ CFbsBitmap* mask = NULL;
+
+ LOGTEXT(_L8("MMBoxDialog: AppendSkinnedIconL 2"));
+ AknsUtils::CreateIconL(
+ AknsUtils::SkinInstance(),
+ skinId,
+ bitmap,
+ mask,
+ aFileName,
+ aIconIndex,
+ aIconIndex + 1 ); //mask
+ LOGTEXT(_L8("MMBoxDialog: AppendSkinnedIconL 3"));
+
+ CleanupStack::PushL( bitmap );
+ CleanupStack::PushL( mask );
+
+ CGulIcon* icon = NULL;
+ icon = CGulIcon::NewL( bitmap, mask );
+ CleanupStack::Pop( mask );
+ CleanupStack::Pop( bitmap );
+ CleanupStack::PushL( icon );
+ aIcons->AppendL( icon );
+ CleanupStack::Pop( icon ); // icon
+ LOGTEXT(_L8("MMBoxDialog: AppendSkinnedIconL end"));
+ }
+
+// ----------------------------------------------------
+// CMMBoxDialog::OkToExitL
+// ----------------------------------------------------
+TBool CMMBoxDialog::OkToExitL(TInt aButtonId)
+ {
+ LOGTEXT(_L8("MMBoxDialog: OkToExitL start"));
+ CAknInputBlock::NewLC( ); // Absorb keys
+ TBool okToExit = CAknDialog::OkToExitL( aButtonId );
+
+ if ( okToExit )
+ {
+ LOGTEXT(_L8("MMBoxDialog: OkToExitL RestoreTitleText.."));
+ TRAP_IGNORE( RestoreTitleTextAndNavipaneL() );
+ }
+
+ CleanupStack::PopAndDestroy(); // CAknInputBlock
+
+ if( iExitCode == EEikCmdExit )
+ {
+ LOGTEXT(_L8("MMBoxDialog: OkToExitL RunAppShutter"));
+ CAknEnv::RunAppShutter();
+ }
+
+ LOGTEXT(_L8("MMBoxDialog: OkToExitL end"));
+ return okToExit;
+ }
+
+// ----------------------------------------------------
+// CMMBoxDialog::ProcessCommandL
+// ----------------------------------------------------
+void CMMBoxDialog::ProcessCommandL( TInt aCommandId )
+ {
+ LOGTEXT(_L8("MMBoxDialog: ProcessCommand start"));
+ CAknDialog::ProcessCommandL( aCommandId ) ;
+
+ switch ( aCommandId )
+ {
+ case EMMBoxOpen:
+ LOGTEXT(_L8("MMBoxDialog: ProcessCommand OpenNotification start"));
+ OpenNotificationL( );
+ break;
+ case EMMBoxRetrieveSelected:
+ LOGTEXT(_L8("MMBoxDialog: ProcessCommand RetrieveL start"));
+ FetchL( );
+ break;
+ case EMMBoxRetrieveAll:
+ LOGTEXT(_L8("MMBoxDialog: ProcessCommand RetrieveAll start"));
+ FetchL( ETrue );
+ break;
+ case EMMBoxDeleteSelected:
+ LOGTEXT(_L8("MMBoxDialog: ProcessCommand Delete start"));
+ DeleteL( );
+ break;
+ case EMMBoxDeleteAll:
+ LOGTEXT(_L8("MMBoxDialog: ProcessCommand DeleteAll start"));
+ DeleteL( ETrue );
+ break;
+ case EMMBoxUpdateList:
+ LOGTEXT(_L8("MMBoxDialog: ProcessCommand UpdateList start"));
+ UpdateListL( );
+ break;
+ case EMMBoxViewStatus:
+ LOGTEXT(_L8("MMBoxDialog: ProcessCommand ViewStatus start"));
+ ShowStatusL( );
+ break;
+ case EMMBoxSortMessagesByDate:
+ LOGTEXT(_L8("MMBoxDialog: ProcessCommand SortByDate start"));
+ SortMessagesByL( EMMBoxSortByDate );
+ break;
+ case EMMBoxSortMessagesBySender:
+ LOGTEXT(_L8("MMBoxDialog: ProcessCommand SortBySender start"));
+ SortMessagesByL( EMMBoxSortByName );
+ break;
+ case EMMBoxSortMessagesBySubject:
+ LOGTEXT(_L8("MMBoxDialog: ProcessCommand SortBySubject start"));
+ SortMessagesByL( EMMBoxSortBySubject );
+ break;
+ case EAknCmdHelp:
+ LOGTEXT(_L8("MMBoxDialog: ProcessCommand Help start"));
+ LaunchHelpL();
+ break;
+ case EAknCmdExit:
+ {
+ LOGTEXT(_L8("MMBoxDialog: ProcessCommand Exit start"));
+ iExitCode = EEikCmdExit;
+ TryExitL( EAknCmdExit );
+ }
+ break;
+
+ default :
+ LOGTEXT(_L8("MMBoxDialog: ProcessCommand default break"));
+ break;
+ }
+ }
+
+// ----------------------------------------------------
+// CMMBoxDialog::DynInitMenuPaneL
+// ----------------------------------------------------
+void CMMBoxDialog::DynInitMenuPaneL(
+ TInt aResourceId, CEikMenuPane* aMenuPane )
+ {
+ LOGTEXT(_L8("MMBoxDialog: ProcessCommand DynInitMenuPaneL start"));
+ if ( aResourceId == R_NOT_MMBOX_MENUPANE )
+ {
+ LOGTEXT(_L8("MMBoxDialog: ProcessCommand DynInitMenuPaneL menupane"));
+ if( !( iFlags & EHelpSupported ) )
+ {
+ aMenuPane->SetItemDimmed( EAknCmdHelp, ETrue );
+ }
+
+ TMmboxInfo info;
+ TInt ret = 0;
+ TRAPD( err, ret = iClientMtm->MmboxInfoL( info ) );
+
+#ifdef MMS_NOTIFICATIONS_TESTING_WO_MMBOX
+ ret = 1;
+#endif
+
+ if( err || !ret )
+ {// No info available
+ aMenuPane->SetItemDimmed( EMMBoxViewStatus, ETrue );
+ }
+
+ if ( ListBox()->Model()->NumberOfItems() == 0 )
+ {
+ aMenuPane->SetItemDimmed( EMMBoxOpen, ETrue );
+ aMenuPane->SetItemDimmed( EMMBoxRetrieveMenu, ETrue );
+ aMenuPane->SetItemDimmed( EMMBoxDeleteMenu, ETrue );
+ }
+ else
+ {
+ TMsvEntry entry =
+ iMessages->Entry( ListBox( )->CurrentItemIndex( ) );
+
+ if( ListBox()->Model()->NumberOfItems() == 1 )
+ { // Operation support is only checked if there's only one entry
+ // Otherwise we let the user try to start the functions..
+ if( iUiData.OperationSupportedL( KMtmUiFunctionFetchMMS, entry ) )
+ {
+ aMenuPane->SetItemDimmed( EMMBoxRetrieveMenu, ETrue );
+ }
+ if( iUiData.OperationSupportedL( KMtmUiFunctionDeleteMessage, entry ) )
+ {
+ aMenuPane->SetItemDimmed( EMMBoxDeleteMenu, ETrue );
+ }
+ }
+
+ if( iUiData.OperationSupportedL( KMtmUiFunctionOpenMessage, entry ) )
+ {
+ aMenuPane->SetItemDimmed( EMMBoxOpen, ETrue );
+ }
+ }
+ LOGTEXT(_L8("MMBoxDialog: ProcessCommand DynInitMenuPaneL end"));
+ }
+ }
+
+// ----------------------------------------------------
+// CMMBoxDialog::OfferKeyEventL
+// ----------------------------------------------------
+TKeyResponse CMMBoxDialog::OfferKeyEventL(
+ const TKeyEvent& aKeyEvent,
+ TEventCode aType )
+ {
+ LOGTEXT(_L8("MMBoxDialog: ProcessCommand OfferKeyEvent"));
+ CEikColumnListBox* listBox = ListBox();
+ if ( listBox && aType == EEventKey && ( iUpdateOperation || iDeleteOperation ) )
+ { // When an operation is going on, we do not need keypresses
+ LOGTEXT(_L8("MMBoxDialog: ProcessCommand OfferKeyEvent operation in progress"));
+ return EKeyWasNotConsumed;
+ }
+ if ( listBox && aType == EEventKey && aKeyEvent.iCode == EKeyBackspace &&
+ listBox->Model()->NumberOfItems() > 0 )
+ { // C-key
+ LOGTEXT(_L8("MMBoxDialog: ProcessCommand OfferKeyEvent Delete"));
+ DeleteL( );
+ return EKeyWasConsumed;
+ }
+ else if ( listBox && aType == EEventKey && aKeyEvent.iCode == EKeyOK )
+ { // Selection Key here!!!
+ LOGTEXT(_L8("MMBoxDialog: ProcessCommand OfferKeyEvent Selection key"));
+ listBox->View()->ToggleItemL( listBox->CurrentItemIndex() );
+ return EKeyWasConsumed;
+ }
+ else if( aType == EEventKey && aKeyEvent.iCode == EKeyEscape )
+ {
+ if( !OkToExitL( -1 ) )
+ {
+ return EKeyWasConsumed;
+ }
+ }
+
+ return CAknDialog::OfferKeyEventL( aKeyEvent, aType );
+ }
+
+// ----------------------------------------------------
+// CMMBoxDialog::HandleListBoxEventL
+// ----------------------------------------------------
+void CMMBoxDialog::HandleListBoxEventL(
+ CEikListBox* /*aListBox*/,
+ TListBoxEvent /*aEventType*/ )
+ {
+ }
+
+// ----------------------------------------------------
+// CMMBoxDialog::UpdateMMBoxArrayL
+// ----------------------------------------------------
+void CMMBoxDialog::UpdateMMBoxArrayL()
+ {
+ LOGTEXT(_L8("MMBoxDialog: UpdateMMBoxArray start"));
+
+ iMessages->RefreshArrayL( iMMBoxFolderId );
+
+ // TInt newIndex =
+ ListBox()->ScrollToMakeItemVisible( ListBox()->CurrentItemIndex( ) );
+ ListBox()->DrawNow( );
+
+ SetMSKL();
+
+ LOGTEXT(_L8("MMBoxDialog: UpdateMMBoxArray end"));
+ }
+
+// ----------------------------------------------------
+// CMMBoxDialog::ListBox
+// ----------------------------------------------------
+CEikColumnListBox* CMMBoxDialog::ListBox() const
+ {
+ return((CEikColumnListBox*)Control(EMsgControlIdMMBoxListBox));
+ }
+
+// ----------------------------------------------------
+// CMMBoxDialog::StoreTitleTextAndNavipaneAndSetNewL
+// ----------------------------------------------------
+void CMMBoxDialog::StoreTitleTextAndNavipaneAndSetNewL()
+ {
+ LOGTEXT(_L8("MMBoxDialog: StoreTitleTextAndNavipane.. start"));
+ CEikStatusPane* sp = iEikonEnv->AppUiFactory( )->StatusPane( );
+ // Fetch pointer to the default title pane control
+ CAknTitlePane* title=(CAknTitlePane *)sp->ControlL(
+ TUid::Uid(EEikStatusPaneUidTitle));
+
+ delete iOldTitleText;
+ iOldTitleText = NULL;
+ iOldTitleText = HBufC::NewL( title->Text()->Length() + 1 );
+ TPtr tempText = iOldTitleText->Des();
+ tempText.Copy( (*title->Text()) );
+
+ HBufC* newTitle = StringLoader::LoadLC(
+ R_NOT_MMBOX_TITLE_TEXT,
+ iCoeEnv );
+ title->SetTextL( *newTitle );
+ CleanupStack::PopAndDestroy( newTitle );
+
+ iNaviOld = iNaviPane->Top( );
+
+ CMsvEntry* entry=iSession.GetEntryL(KMsvRootIndexEntryId);
+ CleanupStack::PushL( entry );
+ if ( entry->HasStoreL() )
+ {
+ CMsvStore* store = entry->ReadStoreL();
+ CleanupStack::PushL( store );
+ if ( store->IsPresentL( KUidMsvMessageListSortOrder ) )
+ { // Read it first
+ RMsvReadStream readStream;
+ readStream.OpenLC( *store, KUidMsvMessageListSortOrder );
+ iOriginalOrder.InternalizeL( readStream );
+ CleanupStack::PopAndDestroy( ); // readStream
+ // Then remove it
+/* CMsvStore* store2 = entry->EditStoreL();
+ CleanupStack::PushL( store2 );
+ store->Remove(KUidMsvMessageListSortOrder);
+ store->CommitL();
+ CleanupStack::PopAndDestroy( store2 ); // store2
+ */
+ }
+ CleanupStack::PopAndDestroy( store ); // store
+ }
+ CleanupStack::PopAndDestroy( entry );
+ LOGTEXT(_L8("MMBoxDialog: StoreTitleTextAndNavipane.. end"));
+ }
+
+// ----------------------------------------------------
+// CMMBoxDialog::RestoreTitleTextL
+// ----------------------------------------------------
+void CMMBoxDialog::RestoreTitleTextAndNavipaneL()
+ {
+ LOGTEXT(_L8("MMBoxDialog: RestoreTitleTextAndNavipane.. start"));
+ CEikStatusPane* sp = iEikonEnv->AppUiFactory( )->StatusPane( );
+ // Fetch pointer to the default title pane control
+ CAknTitlePane* title=(CAknTitlePane *)sp->ControlL(
+ TUid::Uid(EEikStatusPaneUidTitle));
+
+ title->SetTextL( iOldTitleText->Des() );
+ delete iOldTitleText;
+ iOldTitleText = NULL;
+
+ iNaviPane->Pop( iNaviDecorator );
+ delete iNaviDecorator;
+ iNaviDecorator = NULL;
+
+ if( iNaviOld )
+ {
+ iNaviPane->PushL( *iNaviOld );
+ }
+ iNaviOld = NULL;
+
+ if( iFlags & ESortTypeChanged )
+ {
+ // Remove the one set by MMBoxList
+ CMsvEntry* entry=iSession.GetEntryL( KMsvRootIndexEntryId );
+ CleanupStack::PushL( entry );
+ CMsvStore* store = entry->EditStoreL();
+ CleanupStack::PushL( store );
+ store->Remove(KUidMsvMessageListSortOrder);
+ store->CommitL();
+ CleanupStack::PopAndDestroy( 2 ); // store, entry
+
+ // If the original sory type was not the default one -> write it..
+ TMsvSelectionOrdering def( KMsvNoGrouping, EMsvSortByDateReverse, EFalse );
+ if( !(iOriginalOrder == def) )
+ {
+ CMsvEntry* entry=iSession.GetEntryL( KMsvRootIndexEntryId );
+ CleanupStack::PushL( entry );
+ CMsvStore* store = entry->EditStoreL();
+ CleanupStack::PushL( store );
+ RMsvWriteStream writeStream;
+ writeStream.AssignLC( *store, KUidMsvMessageListSortOrder );
+ iOriginalOrder.ExternalizeL( writeStream );
+ writeStream.CommitL();
+ store->CommitL();
+ CleanupStack::PopAndDestroy( 3 ); // store, writestream, entry
+ }
+ }
+ LOGTEXT(_L8("MMBoxDialog: RestoreTitleTextAndNavipane.. end"));
+ }
+
+// ----------------------------------------------------
+// CMMBoxDialog::OpCompleted
+// ----------------------------------------------------
+void CMMBoxDialog::OpCompleted(
+ CMsvSingleOpWatcher& aOpWatcher,
+ TInt aCompletionCode )
+ {
+ LOGTEXT(_L8("MMBoxDialog: OpCompleted start"));
+ TBool tryToExit = EFalse;
+ CMsvOperation* op=&aOpWatcher.Operation();
+ TRAP_IGNORE( tryToExit = DoOperationCompletedL(op, aCompletionCode ));
+ if ( tryToExit )
+ {
+ LOGTEXT(_L8("MMBoxDialog: OpCompleted tryToExit"));
+ return;
+ }
+
+ if ( iDeleteOperation && iDeleteOperation->Operation().Id()==op->Id() )
+ {
+ LOGTEXT(_L8("MMBoxDialog: OpCompleted DeleteOperation"));
+ TInt error = op->iStatus.Int( );
+ // Check the entries one by one
+ TInt failedOnes = 0;
+ TInt totalOnes = 0;
+ if( iDeleteSelection )
+ { // This means user did not answer "No" to "Delete message" question
+ for( TInt loop = 0; loop < iDeleteSelection->Count( ); loop++ )
+ {
+ TMsvEntry entry;
+ TMsvId service = -1;
+ totalOnes++;
+ if ( iSession.GetEntry(iDeleteSelection->At(loop), service, entry ) != KErrNotFound )
+ {
+ LOGTEXT(_L8("MMBoxDialog: OpCompleted DeleteOp Entry found after delete"));
+ failedOnes++;
+ }
+ }
+ }
+ if( error || failedOnes )
+ {
+ LOGTEXT2(_L16("MMBoxDialog: OpCompleted DeleteOperation Error: %d"), error);
+ if( failedOnes == 1)
+ {
+ LOGTEXT(_L8("MMBoxDialog: OpCompleted DeleteOp 1 failed"));
+ TRAP_IGNORE( ShowConfirmationQueryL( R_NOT_MMBOX_INFO_DELETE_FAILED, ETrue ) );
+ }
+ else
+ {
+ LOGTEXT(_L8("MMBoxDialog: OpCompleted DeleteOp many failed"));
+ TRAP_IGNORE ( ShowConfirmationQueryL( failedOnes,
+ totalOnes,
+ R_NOT_MMBOX_INFO_DELETE_FAILED_MANY ) );
+ }
+ }
+ delete iDeleteSelection;
+ iDeleteSelection = NULL;
+ delete iDeleteOperation;
+ iDeleteOperation = NULL;
+ }
+
+ else if ( iOpenOperation && iOpenOperation->Operation().Id()==op->Id() )
+ {
+ if( !( iFlags & EDoNotDeleteOpen ) )
+ {
+ LOGTEXT(_L8("MMBoxDialog: OpCompleted OpenOperation"));
+ delete iOpenOperation;
+ iOpenOperation = NULL;
+ }
+ iFlags &= ~EDoNotDeleteOpen; // Reset this anyway
+ }
+
+ else if ( iUpdateOperation && iUpdateOperation->Operation().Id()==op->Id() )
+ {
+ LOGTEXT(_L8("MMBoxDialog: OpCompleted UpdateOperation"));
+
+ if( iWaitDialog ) // Remove the wait note from the screen
+ {
+ delete iWaitDialog;
+ iWaitDialog=NULL;
+ }
+
+ TInt error = op->iStatus.Int( );
+
+ delete iUpdateOperation;
+ iUpdateOperation = NULL;
+
+ if( error )
+ {
+ LOGTEXT2(_L16("MMBoxDialog: OpCompleted DeleteOperation Error: %d"), error);
+ TRAP_IGNORE( ShowInformationNoteL( R_NOT_MMBOX_INFO_UNABLE_UPDATE, EFalse ) );
+ }
+ else
+ {
+ LOGTEXT(_L8("MMBoxDialog: OpCompleted UpdateOperation Success"));
+ TMmboxInfo info;
+ TBool infoExists=EFalse;
+ TRAPD( err, infoExists=iClientMtm->MmboxInfoL( info ) );
+
+#ifdef MMS_NOTIFICATIONS_TESTING_WO_MMBOX
+ infoExists = 1;
+ info.mmboxQuotaInBytes = 100500;
+ info.mmboxTotalInBytes = 98000;
+#endif
+
+ if( infoExists && !err )
+ {
+ if( info.mmboxTotalInBytes == 0 )
+ {
+ TRAP_IGNORE( ShowInformationNoteL( R_NOT_MMBOX_INFO_NO_MSGS, EFalse ) );
+ }
+ else
+ {
+ if( info.mmboxQuotaInBytes > 0 )
+ { // Make sure there will be no "division by zero"
+ TReal res = (TReal)info.mmboxTotalInBytes/(TReal)info.mmboxQuotaInBytes;
+ if( res > 0.8 )
+ {
+ TRAP_IGNORE( ShowConfirmationQueryL( R_NOT_MMBOX_QUERY_80_USED, ETrue ) );
+ }
+ }
+ }
+ }
+ LOGTEXT(_L8("MMBoxDialog: OpCompleted UpdateOperation 2"));
+ TRAP_IGNORE( UpdateNavipaneL( ));
+ // We just need to trap this, we can ignore the error code
+ }
+ }
+ else
+ { // Let's save the fetch operations last as there can be many..
+ for ( TInt cc=iFetchOperations.Count()-1; cc>=0; cc-- )
+ {
+ if ( iFetchOperations[cc]->Operation( ).Id( ) == op->Id( ) )
+ {
+ LOGTEXT(_L8("MMBoxDialog: OpCompleted FetchOperation"));
+ delete iFetchOperations[cc];
+ iFetchOperations.Delete(cc);
+ }
+ }
+ }
+ LOGTEXT(_L8("MMBoxDialog: OpCompleted End"));
+ ListBox()->DrawDeferred();
+ }
+
+// ----------------------------------------------------
+// CMMBoxDialog::DoOperationCompletedL
+// ----------------------------------------------------
+TBool CMMBoxDialog::DoOperationCompletedL(
+ CMsvOperation* aOperation,
+ TInt aCompletionCode )
+ {
+
+ if ( !aOperation )
+ {
+ return EFalse;
+ }
+
+ if( iOpenOperation && iOpenOperation->Operation( ).Id( ) == aOperation->Id( ) )
+ {
+ iFlags &= ~EDoNotDeleteOpen;
+ LOGTEXT(_L8("MMBoxDialog: DoOpCompleted Open"));
+ if ( aCompletionCode == CMsgEmbeddedEditorWatchingOperation::EMsgExitNext ||
+ aCompletionCode == CMsgEmbeddedEditorWatchingOperation::EMsgExitPrevious )
+ {
+ LOGTEXT(_L8("MMBoxDialog: DoOpCompleted Next/Prev Message"));
+ HandleOpenNextPreviousL( aCompletionCode == CMsgEmbeddedEditorWatchingOperation::EMsgExitNext );
+ iFlags |= EDoNotDeleteOpen;
+ }
+ else if ( aCompletionCode == EEikCmdExit )
+ {
+ LOGTEXT(_L8("MMBoxDialog: DoOpCompleted Exit"));
+ delete iOpenOperation;
+ iOpenOperation = NULL;
+ iExitCode = EEikCmdExit;
+ return ETrue;
+ }
+ }
+ else if( iUpdateOperation && iUpdateOperation->Operation( ).Id( ) == aOperation->Id( ) )
+ {
+ LOGTEXT(_L8("MMBoxDialog: DoOpCompleted Update"));
+ UpdateMMBoxArrayL();
+ }
+ else if ( iDeleteOperation && iDeleteOperation->Operation( ).Id( ) == aOperation->Id( ) )
+ {
+ LOGTEXT(_L8("MMBoxDialog: DoOpCompleted Delete"));
+ UpdateMMBoxArrayL();
+ }
+ else
+ {
+ // Nothing special to be done (for example for fetch operations)
+ }
+ return EFalse;
+ }
+
+// ----------------------------------------------------
+// CMMBoxDialog::LaunchHelpL
+// launch help using context
+//
+// ----------------------------------------------------
+void CMMBoxDialog::LaunchHelpL()
+ {
+ if ( iFlags & EHelpSupported )
+ {
+ LOGTEXT(_L8("MMBoxDialog: LaunchHelpL"));
+ CCoeAppUi* appUi = ControlEnv()->AppUi();
+ if ( appUi )
+ {
+ HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(), appUi->AppHelpContextL() );
+ }
+ LOGTEXT(_L8("MMBoxDialog: LaunchHelpL End"));
+ }
+ }
+
+// ----------------------------------------------------
+// CMMBoxDialog::GetHelpContext
+// returns helpcontext as aContext
+//
+// ----------------------------------------------------
+void CMMBoxDialog::GetHelpContext
+ ( TCoeHelpContext& aContext ) const
+ {
+ const TUid KUidMce ={0x100058C5};
+ aContext.iMajor = KUidMce;
+ aContext.iContext = KMCE_HLP_MMS_NOTIFICATIONS;
+ }
+
+// ----------------------------------------------------
+// CMMBoxDialog::
+// ----------------------------------------------------
+TInt CMMBoxDialog::DecodeProgress (
+ const TDesC8& /*aProgress*/,
+ TBuf<CBaseMtmUi::EProgressStringMaxLen>& /*aReturnString*/,
+ TInt& /*aTotalEntryCount*/,
+ TInt& /*aEntriesDone*/,
+ TInt& /*aCurrentEntrySize*/,
+ TInt& /*aCurrentBytesTrans*/, TBool /*aInternal*/ )
+ {
+ // At the moment there are no operations who would need this function.
+ // Only delete operation uses ProgressDecoder, but that progress is
+ // asked from NotMtmUi object.
+ return KErrNone;
+ }
+
+// ----------------------------------------------------
+// CMMBoxDialog::
+// ----------------------------------------------------
+void CMMBoxDialog::SortMessagesByL( TMMBoxSortType aType )
+ {
+ // Lets memorize the id of the current focused one
+ LOGTEXT(_L8("MMBoxDialog: SortMessageByL start"));
+ TMsvId focused = KErrNotFound;
+
+ if( iMessages->MdcaCount() > 0 )
+ {
+ focused= iMessages->EntryId( ListBox( )->CurrentItemIndex( ) );
+ }
+
+ // Lets set the sorting type
+ TMsvSelectionOrdering newType = iMessages->SetSortType( aType );
+
+ // Lets find the focused one again
+ TInt index = 0;
+ TInt newFocused = KErrNotFound;
+ while( index < iMessages->MdcaCount( ) )
+ {
+ if( iMessages->EntryId( index ) == focused )
+ {
+ newFocused = index;
+ break;
+ }
+ index++;
+ }
+
+ //Let's set the new focused item and draw the listbox
+ LOGTEXT(_L8("MMBoxDialog: SortMessageByL 2"));
+ if( newFocused != KErrNotFound )
+ {
+ LOGTEXT(_L8("MMBoxDialog: SortMessageByL 3"));
+ ListBox( )->SetCurrentItemIndexAndDraw( newFocused );
+ }
+
+ iFlags |= ESortTypeChanged;
+
+ LOGTEXT(_L8("MMBoxDialog: SortMessageByL 4"));
+ CMsvEntry* entry=iSession.GetEntryL( KMsvRootIndexEntryId );
+ CleanupStack::PushL( entry );
+ CMsvStore* store = entry->EditStoreL();
+ LOGTEXT(_L8("MMBoxDialog: SortMessageByL 5"));
+ CleanupStack::PushL( store );
+ store->Remove(KUidMsvMessageListSortOrder);
+ store->CommitL();
+ CleanupStack::PopAndDestroy( 1 ); // store
+
+ LOGTEXT(_L8("MMBoxDialog: SortMessageByL 6"));
+ CMsvStore* store2 = entry->EditStoreL();
+ CleanupStack::PushL( store2 );
+ LOGTEXT(_L8("MMBoxDialog: SortMessageByL 7"));
+ RMsvWriteStream writeStream;
+ writeStream.AssignLC( *store2, KUidMsvMessageListSortOrder );
+ LOGTEXT(_L8("MMBoxDialog: SortMessageByL 8"));
+ newType.ExternalizeL( writeStream );
+ writeStream.CommitL();
+ store2->CommitL();
+ CleanupStack::PopAndDestroy( 3 ); // store, writestream, entry
+
+ LOGTEXT(_L8("MMBoxDialog: SortMessagesByL End"));
+ }
+
+// ----------------------------------------------------
+// CMMBoxDialog::
+// ----------------------------------------------------
+void CMMBoxDialog::OpenNotificationL( )
+ {
+ LOGTEXT(_L8("MMBoxDialog: OpenNotificationL start"));
+
+ CMsvOperation* op=NULL;
+ CAknInputBlock::NewLC( );
+
+ CMsvSingleOpWatcher* singleOpWatcher=CMsvSingleOpWatcher::NewL( *this );
+ CleanupStack::PushL(singleOpWatcher);
+
+ TMsvEntry entry =
+ iMessages->Entry( ListBox( )->CurrentItemIndex( ) );
+
+ if ( entry.iType != KUidMsvMessageEntry )
+ { // No message -> wrong kind of entry
+ CleanupStack::PopAndDestroy( 2 ); // singleOpWatcher, CAknInputBlock
+ return;
+ }
+ else
+ {
+ iOpenOperation = singleOpWatcher;
+ }
+
+ iUi.BaseMtm().SwitchCurrentEntryL( entry.Id( ) );
+ iUi.SetPreferences( iUi.Preferences() | EMtmUiFlagEditorPreferEmbedded );
+
+ LOGTEXT(_L8("MMBoxDialog: OpenNotificationL 2"));
+ op = iUi.OpenL(singleOpWatcher->iStatus );
+ LOGTEXT(_L8("MMBoxDialog: OpenNotificationL 3"));
+
+ CleanupStack::Pop( singleOpWatcher );
+
+ singleOpWatcher->SetOperation(op);
+
+ CleanupStack::PopAndDestroy( ); // CAknInputBlock::NewLC( );
+ LOGTEXT(_L8("MMBoxDialog: OpenL End"));
+ }
+
+// ----------------------------------------------------
+// CMMBoxDialog::
+// ----------------------------------------------------
+void CMMBoxDialog::FetchL( TBool aAll/*=EFalse*/ )
+ {
+ if ( IS_PHONE_OFF_LINEL() )
+ { // We are in offline at the moment -> Infonote
+ ShowInformationNoteL( R_NOTMTM_OFFLINE_NOT_POSSIBLE, EFalse );
+ return;
+ }
+
+ CMsvEntrySelection* sel = SelectionL( aAll );
+ CleanupStack::PushL( sel );
+
+ // Lets see which ones are already deleted from server.
+ TInt all = 0; // includes all notifications in the selection
+ TInt bad = 0; // includes notifications that are not stored in mmbox
+ for( TInt i = 0; i<sel->Count( ); i++ )
+ {
+ TMsvEntry entry;
+ TMsvId service=-1;
+ iSession.GetEntry( sel->At( i ), service, entry );
+ if( ( ( entry.iMtmData1 & KMmsMessageTypeMask ) == KMmsMessageMNotificationInd ) &&
+ ( entry.iMtmData2 & KMmsStoredInMMBox ) )
+ {
+ all++;
+ }
+ else
+ {
+ if( ( entry.iMtmData1 & KMmsMessageTypeMask ) == KMmsMessageMNotificationInd )
+ {
+ bad++;
+ all++;
+ }
+ }
+ }
+
+ if( bad == 1 )
+ {
+ // One already deleted
+ ShowInformationNoteL( R_NOT_MMBOX_INFO_FETCH_FAILED_ONE, EFalse );
+ if( all == bad )
+ { // Just one notification -> leave from the function
+ CleanupStack::PopAndDestroy( sel );
+ return;
+ }
+ }
+ else if (bad > 0)
+ {
+ if( all == bad )
+ { // All notifications were bad
+ ShowInformationNoteL( R_NOT_MMBOX_INFO_FETCH_FAILED_ANY, EFalse );
+ LOGTEXT(_L8("MMBoxDialog: FetchL All bad - just return"));
+ CleanupStack::PopAndDestroy( sel );
+ return;
+ }
+ else
+ { // Some were bad, so one can continue fetching
+ ShowInformationNoteL( R_NOT_MMBOX_INFO_FETCH_FAILED_SOME, EFalse );
+ LOGTEXT(_L8("MMBoxDialog: FetchL Some bad - warn"));
+ }
+ }
+ else // bad == 0
+ {
+ if( all == 0 )
+ { // No notifications at all -> no note and just leave
+ LOGTEXT(_L8("MMBoxDialog: FetchL Selection empty - just return"));
+ CleanupStack::PopAndDestroy( sel );
+ return;
+ }
+ // else just continue as there were no bad notifications
+ }
+
+ TMsvId origId = iClientMtm->Entry().Entry().Id();
+
+ if( sel->Count( ) == 1 )
+ {
+ iClientMtm->SwitchCurrentEntryL( sel->At( 0 ) );
+ iClientMtm->LoadMessageL( );
+ TTime currentTime;
+ currentTime.HomeTime( );
+ TTime expiryTime = iClientMtm->ExpiryDate( );
+ iClientMtm->SwitchCurrentEntryL( origId );
+ iClientMtm->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
+ CleanupStack::PopAndDestroy( sel );
+ return;
+ } // else we continue
+ }
+ }
+
+ CMsvSingleOpWatcher* singleOpWatcher=CMsvSingleOpWatcher::NewL(*this);
+ CleanupStack::PushL(singleOpWatcher);
+
+ TBuf8<1> buf;
+
+ CMsvOperation* op = NULL;
+
+ LOGTEXT(_L8("MMBoxDialog: FetchL 2"));
+ TRAPD( err,
+ op= iUi.InvokeAsyncFunctionL(
+ KMtmUiFunctionFetchMMS,
+ *sel,
+ singleOpWatcher->iStatus,
+ buf) );
+ LOGTEXT(_L8("MMBoxDialog: FetchL 3"));
+
+ if( op == NULL || err )
+ {
+ LOGTEXT(_L8("MMBoxDialog: FetchL NULL op or left"));
+ CleanupStack::PopAndDestroy( singleOpWatcher );
+ CleanupStack::PopAndDestroy( sel );
+ return;
+ }
+
+ CleanupStack::Pop( singleOpWatcher );
+
+ singleOpWatcher->SetOperation( op );
+ iFetchOperations.AppendL( singleOpWatcher );
+
+ CleanupStack::PopAndDestroy( sel );
+
+ LOGTEXT(_L8("MMBoxDialog: FetchL End"));
+ return;
+ }
+
+// ----------------------------------------------------
+// CMMBoxDialog::DeleteL
+// ----------------------------------------------------
+void CMMBoxDialog::DeleteL( TBool aAll/*=EFalse*/ )
+ {
+ LOGTEXT(_L8("MMBoxDialog: DeleteL start"));
+
+ if ( IS_PHONE_OFF_LINEL() )
+ { // We are in offline at the moment -> Infonote
+ ShowInformationNoteL( R_NOTMTM_OFFLINE_NOT_POSSIBLE, EFalse );
+ return;
+ }
+
+ CAknInputBlock::NewLC( );
+
+ if( iDeleteSelection )
+ {
+ // We should never end up in here because delete op has a wait note but just in case
+ delete iDeleteSelection;
+ iDeleteSelection = NULL;
+ }
+
+ iDeleteSelection = SelectionL( aAll );
+ LOGTEXT(_L8("MMBoxDialog: DeleteL 2"));
+
+ CMsvSingleOpWatcher* singleOpWatcher=CMsvSingleOpWatcher::NewL(*this);
+ CleanupStack::PushL(singleOpWatcher);
+
+ TBuf8<1> buf;
+
+ LOGTEXT(_L8("MMBoxDialog: DeleteL 3"));
+ CMsvOperation* op= iUi.InvokeAsyncFunctionL(
+ KMtmUiFunctionDeleteMessage,
+ *iDeleteSelection,
+ singleOpWatcher->iStatus,
+ buf);
+
+ LOGTEXT(_L8("MMBoxDialog: DeleteL 4"));
+ if( op == NULL )
+ {
+ // Lets just make a completed operation so
+ // the progress dialog is not shown
+ LOGTEXT(_L8("MMBoxDialog: Delete NULL op"));
+ delete iDeleteSelection;
+ iDeleteSelection = NULL;
+ TPckgC < TMsvId > progress = 0;
+ op = CMsvCompletedOperation::NewL( iSession,
+ KUidMsgMMSNotification,
+ progress,
+ KMsvLocalServiceIndexEntryId, singleOpWatcher->iStatus );
+ }
+ LOGTEXT(_L8("MMBoxDialog: DeleteL 5"));
+
+ CleanupStack::Pop( singleOpWatcher );
+
+ singleOpWatcher->SetOperation( op );
+ iDeleteOperation = singleOpWatcher;
+
+ CleanupStack::PopAndDestroy( ); // CAknInputBlock
+
+ LOGTEXT(_L8("MMBoxDialog: DeleteL End"));
+ return;
+ }
+
+// ----------------------------------------------------
+// CMMBoxDialog::SelectionL
+// ----------------------------------------------------
+CMsvEntrySelection* CMMBoxDialog::SelectionL( TBool aAll/*=EFalse*/ )
+ {
+ LOGTEXT(_L8("MMBoxDialog: Selection Start"));
+ CMsvEntrySelection* sel = new ( ELeave ) CMsvEntrySelection;
+ CleanupStack::PushL( sel );
+
+ if( aAll )
+ {
+ LOGTEXT(_L8("MMBoxDialog: Selection: Use all"));
+ TInt index = 0;
+ while( index < iMessages->MdcaCount( ) )
+ {
+ LOGTEXT(_L8("MMBoxDialog: Selection: Use all: append"));
+ sel->AppendL( iMessages->EntryId( index ) );
+ index++;
+ }
+ }
+ else
+ {
+ const CListBoxView::CSelectionIndexArray* indexes =
+ ListBox( )->SelectionIndexes( );
+ TInt index = 0;
+
+ if( indexes->Count( ) < 1 )
+ { // Lets use the current one as there are no selected ones
+ LOGTEXT(_L8("MMBoxDialog: Selection: No selected so just use current"));
+ sel->AppendL( iMessages->EntryId( ListBox( )->CurrentItemIndex( ) ) );
+ }
+ else
+ {
+ LOGTEXT(_L8("MMBoxDialog: Selection: Selected items"));
+ while( index < indexes->Count( ) )
+ {
+ LOGTEXT(_L8("MMBoxDialog: Selection: Selected items added one"));
+ TInt lbIndex = indexes->At(index);
+ sel->AppendL( iMessages->EntryId( lbIndex ) );
+ index++;
+ }
+ }
+ }
+
+ LOGTEXT(_L8("MMBoxDialog: Selection Done"));
+ CleanupStack::Pop( sel );
+ LOGTEXT(_L8("MMBoxDialog: Selection End"));
+ return sel;
+ }
+
+// ----------------------------------------------------
+// CMMBoxDialog::
+// ----------------------------------------------------
+void CMMBoxDialog::ShowStatusL( )
+ {
+ LOGTEXT(_L8("MMBoxDialog: ShowStatus Start"));
+ HBufC* status; // holds the text
+ HBufC* buf; // a buffer for strings
+
+ TMmboxInfo info;
+ TInt ret = 0;
+ TRAPD( err, ret=iClientMtm->MmboxInfoL( info ) )
+
+#ifdef MMS_NOTIFICATIONS_TESTING_WO_MMBOX
+ ret = 1;
+ info.date.HomeTime();
+#endif
+
+ if( err || !ret )
+ {
+ return; // No quota data available -> just return;
+ }
+ TTime messageDate = info.date;
+
+ // messageDate is GMT so add time offset
+ TLocale locale;
+ messageDate += locale.UniversalTimeOffset();
+ if (locale.QueryHomeHasDaylightSavingOn())
+ {
+ TTimeIntervalHours daylightSaving(1);
+ messageDate += daylightSaving;
+ }
+
+ TInt usedQuota = info.mmboxTotalInBytes/KLocalKilo;
+ if ( info.mmboxTotalInBytes % KLocalKilo )
+ {
+ usedQuota++;
+ }
+ TInt fullQuota = info.mmboxQuotaInBytes/KLocalKilo;
+ if ( info.mmboxQuotaInBytes % KLocalKilo )
+ {
+ fullQuota++;
+ }
+
+ CEikFormattedCellListBox* listBox = new ( ELeave ) CAknDoublePopupMenuStyleListBox;
+ CleanupStack::PushL( listBox );
+
+ CAknPopupList* popupList;
+ popupList = CAknPopupList::NewL(listBox, R_AVKON_SOFTKEYS_OK_EMPTY__OK,
+ AknPopupLayouts::EMenuDoubleWindow);
+ CleanupStack::PushL( popupList );
+
+ LOGTEXT(_L8("MMBoxDialog: ShowStatus 2"));
+ TInt flags = CEikListBox::EDisableHighlight;
+ listBox->ConstructL( popupList, flags );
+ listBox->CreateScrollBarFrameL( ETrue );
+ listBox->ScrollBarFrame()->SetScrollBarVisibilityL( CEikScrollBarFrame::EOff,
+ CEikScrollBarFrame::EAuto );
+ // Lets add the heading
+
+ status = StringLoader::LoadLC( R_NOT_MMBOX_STATUS_TITLE );
+ popupList->SetTitleL( *status );
+ CleanupStack::PopAndDestroy( status ); // status
+ status = NULL;
+
+ MDesCArray* itemList = listBox->Model()->ItemTextArray();
+ CDesCArray* itemArray = ( CDesCArray* ) itemList;
+
+ // Lets add the first label "Updated"
+
+ LOGTEXT(_L8("MMBoxDialog: ShowStatus 3"));
+ status = HBufC::NewLC( KMMBoxMaxStatusInfoLength );
+ buf = StringLoader::LoadLC( R_NOT_MMBOX_UPDATE_LABEL ); // first line - bold text
+ status->Des().Append( *buf );
+ status->Des().Append( TChar( '\t' ) );
+
+ // Lets add the update time
+
+ LOGTEXT(_L8("MMBoxDialog: ShowStatus 4"));
+ HBufC* dateFormat = StringLoader::LoadLC( R_QTN_DATE_USUAL_WITH_ZERO, iCoeEnv );
+ TBuf<KDateSize> dateString;
+ messageDate.FormatL( dateString, *dateFormat );
+ CleanupStack::PopAndDestroy(); //dateFormat
+
+ dateFormat = StringLoader::LoadLC( R_QTN_TIME_USUAL_WITH_ZERO, iCoeEnv );
+ TBuf<KDateSize> timeString;
+ messageDate.FormatL( timeString, *dateFormat );
+ CleanupStack::PopAndDestroy(); //dateFormat
+
+ LOGTEXT(_L8("MMBoxDialog: ShowStatus 5"));
+ CDesC16ArrayFlat* array = new(ELeave) CDesC16ArrayFlat( 2 );
+ CleanupStack::PushL( array );
+ array->AppendL( timeString );
+ array->AppendL( dateString );
+ buf =
+ StringLoader::LoadL( R_NOT_MMBOX_INFO_TIME, *array, iCoeEnv );
+ status->Des().Append( *buf );
+ CleanupStack::PopAndDestroy( array );
+ CleanupStack::PushL( buf );
+
+ itemArray->AppendL( *status );
+ CleanupStack::PopAndDestroy(3); // buf, buf, status
+ buf = NULL;
+ status = NULL;
+
+ // Lets add the 2nd label "Storage in use"
+
+ LOGTEXT(_L8("MMBoxDialog: ShowStatus 6"));
+ status = HBufC::NewLC( KMMBoxMaxStatusInfoLength );
+ buf = StringLoader::LoadLC( R_NOT_MMBOX_STORAGE_LABEL ); // first line - bold text
+ status->Des().Append( *buf );
+ status->Des().Append( TChar( '\t' ) );
+
+ // Lets add the "X %" stuff
+
+ TInt percentage = 100;
+
+ if( fullQuota > 0 )
+ {
+ percentage = TInt((((TReal)usedQuota/(TReal)fullQuota)+TReal(0.005))*100);
+ }
+
+ buf = StringLoader::LoadLC( R_NOT_MMBOX_STORAGE_DATA, percentage, iCoeEnv );
+
+ status->Des().Append( *buf );
+ itemArray->AppendL( *status );
+
+ CleanupStack::PopAndDestroy( 3 ); // buf, buf, status
+ buf = NULL;
+ status = NULL;
+
+ // Lets add the 3rd label "Quota used"
+
+ status = HBufC::NewLC( KMMBoxMaxStatusInfoLength );
+ buf = StringLoader::LoadLC( R_NOT_MMBOX_QUOTA_LABEL ); // first line - bold text
+ status->Des().Append( *buf );
+ status->Des().Append( TChar( '\t' ) );
+
+ // Lets add the " 5 / 5" stuff
+
+ LOGTEXT(_L8("MMBoxDialog: ShowStatus 7"));
+ CArrayFixFlat<TInt>* array3 = new(ELeave) CArrayFixFlat<TInt>( 2 );
+ CleanupStack::PushL( array3 );
+ array3->AppendL( usedQuota );
+ array3->AppendL( fullQuota );
+ buf =
+ StringLoader::LoadL( R_NOT_MMBOX_QUOTA_DATA, *array3, iCoeEnv );
+ CleanupStack::PopAndDestroy( array3 ); //array3
+ CleanupStack::PushL( buf );
+
+ status->Des().Append( *buf );
+ itemArray->AppendL( *status );
+
+ CleanupStack::PopAndDestroy( 3 ); // buf, buf, status
+ buf = NULL;
+ status = NULL;
+
+ CleanupStack::Pop( popupList ); // popupList
+
+ // Show Dialog
+ LOGTEXT(_L8("MMBoxDialog: ShowStatus 8"));
+ popupList->ExecuteLD( );
+ // cleanup
+ CleanupStack::PopAndDestroy( listBox ); //listBox
+ listBox = NULL;
+ LOGTEXT(_L8("MMBoxDialog: ShowStatus End"));
+ }
+
+// ----------------------------------------------------
+// CMMBoxDialog::UpdateListL
+// ----------------------------------------------------
+void CMMBoxDialog::UpdateListL( )
+ {
+ LOGTEXT(_L8("MMBoxDialog: UpdateListL start"));
+ if ( IS_PHONE_OFF_LINEL() )
+ { // We are in offline at the moment -> Infonote
+ ShowInformationNoteL( R_NOTMTM_OFFLINE_NOT_POSSIBLE, EFalse );
+ return;
+ }
+ LOGTEXT(_L8("MMBoxDialog: UpdateListL 2"));
+
+ if( !iUi.CheckSettingsL( ) )
+ { // AP is not valid so just return ->
+ return;
+ }
+ LOGTEXT(_L8("MMBoxDialog: UpdateListL 3"));
+
+ CMsvSingleOpWatcher* singleOpWatcher=CMsvSingleOpWatcher::NewL(*this);
+ CleanupStack::PushL(singleOpWatcher);
+
+ CMsvOperation* updateOp = iClientMtm->UpdateMmBoxListL(
+ singleOpWatcher->iStatus );
+
+ if( updateOp == NULL )
+ {
+ // Unable to update the list -> show error
+ LOGTEXT(_L8("MMBoxDialog: UpdateList NULL op"));
+ CleanupStack::PopAndDestroy( singleOpWatcher );
+ ShowInformationNoteL( R_NOT_MMBOX_INFO_UNABLE_UPDATE, EFalse );
+ return;
+ }
+
+ CleanupStack::Pop( singleOpWatcher );
+ iUpdateOperation = singleOpWatcher;
+ iUpdateOperation->SetOperation( updateOp );
+
+ ShowWaitNoteL( R_NOT_MMBOX_WAIT_UPDATING_NOTIF, ETrue );
+
+ LOGTEXT(_L8("MMBoxDialog: UpdateList End"));
+ return;
+ }
+
+// ---------------------------------------------------------
+// CMMBoxDialog::ShowInformationNoteL
+// ---------------------------------------------------------
+//
+void CMMBoxDialog::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
+ }
+
+// ---------------------------------------------------------
+// CMMBoxDialog::ShowConfirmationQueryL
+// ---------------------------------------------------------
+//
+TInt CMMBoxDialog::ShowConfirmationQueryL( TInt aResourceId, TBool aOnlyOK/*=EFalse*/ ) const
+ {
+ HBufC* prompt = StringLoader::LoadLC( aResourceId, iCoeEnv );
+ TInt retVal = ShowConfirmationQueryL( *prompt, aOnlyOK );
+ CleanupStack::PopAndDestroy( prompt );
+ return retVal;
+ }
+
+// ---------------------------------------------------------
+// CMMBoxDialog::ShowConfirmationQueryL
+// ---------------------------------------------------------
+//
+TInt CMMBoxDialog::ShowConfirmationQueryL( const TDesC& aText, TBool aOnlyOK/*=EFalse*/ ) const
+ {
+ TInt dialogType=aOnlyOK?R_NOTUI_CONFIRMABLE_QUERY:R_NOTUI_CONFIRMATION_QUERY;
+ CAknQueryDialog* dlg = CAknQueryDialog::NewL();
+ TInt retVal = dlg->ExecuteLD( dialogType, aText );
+ return retVal;
+ }
+
+// ---------------------------------------------------------
+// CMMBoxDialog::HandleSessionEventL
+// ---------------------------------------------------------
+//
+void CMMBoxDialog::HandleSessionEventL(TMsvSessionEvent aEvent,
+ TAny* /*aArg1*/, TAny* aArg2, TAny* /*aArg3*/)
+ {
+ LOGTEXT(_L8("MMBoxDialog: HandleSessionEvent Start"));
+ switch( aEvent )
+ {
+ case EMsvEntriesCreated:
+ case EMsvEntriesDeleted:
+ case EMsvEntriesChanged:
+ {
+ TMsvId parentId = KMsvNullIndexEntryId;
+ if ( aArg2 != NULL )
+ {
+ parentId = *(TMsvId*)aArg2;
+ }
+ if( parentId == iMMBoxFolderId )
+ { // in MMBoxFolder
+ ListBox( )->ClearSelection( );
+ if( !iOpenOperation && !iUpdateOperation && !iDeleteOperation )
+ { // Lets close the menubar because something has been changed..
+ LOGTEXT(_L8("MMBoxDialog: HandleSessionEvent Close menubar"));
+ iMenuBar->StopDisplayingMenuBar( );
+ LOGTEXT(_L8("MMBoxDialog: HandleSessionEvent Close menubar END"));
+ }
+ if ( aEvent == EMsvEntriesCreated )
+ {
+ LOGTEXT(_L8("MMBoxDialog: HandleSessionEvent Handle Item Addition"));
+ ListBox()->HandleItemAdditionL();
+ ListBox()->ScrollToMakeItemVisible( ListBox()->CurrentItemIndex( ) );
+ ListBox()->DrawNow();
+ LOGTEXT(_L8("MMBoxDialog: HandleSessionEvent Handle Item Addition End"));
+ }
+ else if ( aEvent == EMsvEntriesDeleted )
+ {
+ LOGTEXT(_L8("MMBoxDialog: HandleSessionEvent Handle Item Removal"));
+ // Store the current selected item
+ TInt index = ListBox()->CurrentItemIndex();
+ // Refresh is needed to get the entry updated after the sessionevent
+ iMessages->RefreshArrayL( iMMBoxFolderId );
+ // Let's tell the listbox an item was removed
+ LOGTEXT(_L8("MMBoxDialog: HandleSessionEvent Handle Item Removal 2"));
+ ListBox()->HandleItemRemovalL();
+ // If current entry is out of boundaries, move the position
+ TInt count = iMessages->MdcaCount( );
+ if( index >= count || index < 0 )
+ {
+ LOGTEXT(_L8("MMBoxDialog: HandleSessionEvent Handle Item Removal Change the index"));
+ index = count - 1;
+ }
+ if( count > 0 )
+ { // Lets make sure when don't highlight in an empty listbox
+ LOGTEXT(_L8("MMBoxDialog: HandleSessionEvent Handle Item Removal Entries left"));
+ ListBox()->SetCurrentItemIndex( index );
+ LOGTEXT(_L8("MMBoxDialog: HandleSessionEvent Handle Item Removal Entries Update SB"));
+ ListBox()->UpdateScrollBarsL( );
+ }
+ else
+ {
+ SetMSKL();
+ }
+ LOGTEXT(_L8("MMBoxDialog: HandleSessionEvent Handle Item Removal DrawNow"));
+ DrawNow();
+ ListBox()->DrawNow();
+ LOGTEXT(_L8("MMBoxDialog: HandleSessionEvent Handle Item Removal End"));
+ }
+ else
+ {
+ LOGTEXT(_L8("MMBoxDialog: HandleSessionEvent Handle Entry Change"));
+ // Refresh is needed to get the entry updated after the sessionevent
+ iMessages->RefreshArrayL( iMMBoxFolderId );
+ ListBox()->DrawNow();
+ LOGTEXT(_L8("MMBoxDialog: HandleSessionEvent Handle Entry Change END"));
+ }
+ }
+ break;
+ }
+
+ case EMsvCloseSession:
+ {
+ iSession.RemoveObserver( *this );
+ break;
+ }
+
+ default:
+ {
+ break;
+ }
+ }
+ LOGTEXT(_L8("MMBoxDialog: HandleSessionEvent End"));
+ }
+
+// ---------------------------------------------------------
+// CMMBoxDialog::UpdateNavipaneL
+// ---------------------------------------------------------
+//
+void CMMBoxDialog::UpdateNavipaneL( )
+ {
+ LOGTEXT(_L8("MMBoxDialog: UpdateNavipaneL start"));
+ HBufC* buf; // a buffer for strings
+
+ TMmboxInfo info;
+ TInt ret = 0;
+ TRAPD( err, ret=iClientMtm->MmboxInfoL( info ) );
+
+#ifdef MMS_NOTIFICATIONS_TESTING_WO_MMBOX
+ ret = 1;
+ info.date.HomeTime();
+ User::After( 1000000 );
+#endif
+
+ if( !err && ret )
+ {
+ TTime updateDate = info.date;
+
+ TLocale locale;
+ updateDate += locale.UniversalTimeOffset();
+ if (locale.QueryHomeHasDaylightSavingOn())
+ {
+ TTimeIntervalHours daylightSaving(1);
+ updateDate += daylightSaving;
+ }
+
+ TTime currentDate;
+ currentDate.HomeTime( );
+
+ TDateTime update = updateDate.DateTime( );
+ TDateTime current = currentDate.DateTime( );
+ if( update.Day( ) == current.Day( ) &&
+ update.Month( ) == current.Month( ) &&
+ update.Year( ) == current.Year( ) )
+ { // It's the same day
+
+ HBufC* dateFormat = StringLoader::LoadLC( R_QTN_TIME_USUAL, iCoeEnv );
+ TBuf<KDateSize> timeString;
+ updateDate.FormatL( timeString, *dateFormat );
+ CleanupStack::PopAndDestroy(); //dateFormat
+
+ CDesC16ArrayFlat* array = new(ELeave) CDesC16ArrayFlat( 1 );
+ CleanupStack::PushL( array );
+ array->AppendL( timeString );
+ buf =
+ StringLoader::LoadL( R_NOT_MMBOX_NAVI_TIME, *array, iCoeEnv );
+ CleanupStack::PopAndDestroy( array );
+ CleanupStack::PushL( buf );
+
+ }
+ else
+ { // It's not the same day
+ HBufC* dateFormat = StringLoader::LoadLC( R_QTN_DATE_SHORT, iCoeEnv );
+ TBuf<KDateSize> dateString;
+ updateDate.FormatL( dateString, *dateFormat );
+ CleanupStack::PopAndDestroy(); //dateFormat
+
+ CDesC16ArrayFlat* array = new(ELeave) CDesC16ArrayFlat( 1 );
+ CleanupStack::PushL( array );
+ array->AppendL( dateString );
+ buf =
+ StringLoader::LoadL( R_NOT_MMBOX_NAVI_DATE, *array, iCoeEnv );
+ CleanupStack::PopAndDestroy( array );
+ CleanupStack::PushL( buf );
+ }
+ }
+ else
+ {
+ buf = HBufC::NewL(0);
+ CleanupStack::PushL( buf );
+ }
+
+ delete iNaviDecorator;
+ iNaviDecorator = NULL;
+
+ iNaviDecorator = iNaviPane->CreateTabGroupL();
+ CAknTabGroup* tabGroup = static_cast<CAknTabGroup*>
+ ( iNaviDecorator->DecoratedControl() );
+
+ tabGroup->AddTabL( 0, *buf );
+
+ tabGroup->SetActiveTabById( 0 );
+ tabGroup->SetTabFixedWidthL( KTabWidthWithOneTab );
+
+ CleanupStack::PopAndDestroy( buf ); // buf, buf, status
+
+ iNaviPane->PushL( *iNaviDecorator ); // Make it visible
+ LOGTEXT(_L8("MMBoxDialog: UpdateNavipaneL End"));
+ }
+
+// ----------------------------------------------------
+// CMMBoxDialog::HandleOpenNextPreviousL
+// ----------------------------------------------------
+void CMMBoxDialog::HandleOpenNextPreviousL( TBool aOpenNext )
+ {
+ LOGTEXT(_L8("MMBoxDialog: Open Next/Prev Start"));
+ TInt newIndex = ListBox( )->CurrentItemIndex( );
+
+ if( iOpenOperation )
+ {
+ delete iOpenOperation;
+ iOpenOperation = NULL;
+ }
+
+ newIndex += aOpenNext?1:-1;
+
+ if( newIndex < 0 || newIndex >= iMessages->MdcaCount( ) )
+ { // Index out of array -> lets just ignore this..
+ return;
+ }
+
+ ListBox()->SetCurrentItemIndex( newIndex );
+ ListBox()->DrawDeferred();
+
+ TMsvEntry entry = iMessages->Entry( newIndex );
+
+ if( iUiData.OperationSupportedL( KMtmUiFunctionOpenMessage, entry ) )
+ {
+ return;
+ }
+
+ OpenNotificationL( );
+ }
+
+// ---------------------------------------------------------
+// ShowWaitNoteLC
+// ---------------------------------------------------------
+
+void CMMBoxDialog::ShowWaitNoteLC(
+ TInt aNoteTxtResourceId,
+ TBool aVisibilityDelayOff )
+ {
+ ConstructWaitNoteLC( aVisibilityDelayOff );
+ HBufC* text = StringLoader::LoadLC( aNoteTxtResourceId, iCoeEnv );
+ iWaitDialog->SetTextL( *text );
+ CleanupStack::PopAndDestroy( ); // text
+ iWaitDialog->RunLD( );
+ }
+
+// ---------------------------------------------------------
+// ConstructWaitNoteLC
+// ---------------------------------------------------------
+
+void CMMBoxDialog::ConstructWaitNoteLC(
+ TBool aVisibilityDelayOff )
+ {
+ delete iWaitDialog;
+ iWaitDialog = NULL;
+ iWaitDialog = new (ELeave) CAknWaitDialog(
+ reinterpret_cast<CEikDialog**>( &iWaitDialog ),
+ aVisibilityDelayOff );
+ CleanupStack::PushL( TCleanupItem( CleanupWaitDialog, (TAny**)&iWaitDialog ) );
+ iWaitDialog->PrepareLC( R_NOTUI_WAIT_NOTE );
+ }
+
+// ----------------------------------------------------
+// CMMBoxDialog::CleanupWaitDialog
+// ----------------------------------------------------
+void CMMBoxDialog::CleanupWaitDialog(TAny* aAny)
+ {
+ CAknWaitDialog** dialog = (CAknWaitDialog**) aAny;
+ if ( dialog && *dialog )
+ {
+ delete *dialog;
+ *dialog = NULL;
+ }
+ }
+
+// ---------------------------------------------------------
+// ShowWaitNoteL
+// ---------------------------------------------------------
+
+void CMMBoxDialog::ShowWaitNoteL(
+ TInt aNoteTxtResourceId,
+ TBool aVisibilityDelayOff )
+ {
+ HBufC* text = StringLoader::LoadLC( aNoteTxtResourceId, iCoeEnv );
+ delete iWaitDialog;
+ iWaitDialog = NULL;
+ iWaitDialog = new (ELeave) CAknWaitDialog(
+ reinterpret_cast<CEikDialog**>( &iWaitDialog ),
+ aVisibilityDelayOff );
+ iWaitDialog->SetTextL( *text );
+ CleanupStack::PopAndDestroy( ); // text
+ iWaitDialog->PrepareLC( R_NOTUI_WAIT_NOTE );
+ iWaitDialog->RunLD( );
+ }
+
+// ---------------------------------------------------------
+// SetMSKL
+// ---------------------------------------------------------
+void CMMBoxDialog::SetMSKL()
+ {
+ const TInt KMskPosition = 3;
+ CEikColumnListBox* listBox = ListBox();
+ if ( listBox->Model()->NumberOfItems() > 0 )
+ {
+ TInt resourceId;
+ if ( listBox->View()->ItemIsSelected( listBox->CurrentItemIndex() ) )
+ {
+ resourceId = R_NOT_MMBOX_MSK_BUTTON_UNMARK;
+ }
+ else
+ {
+ resourceId = R_NOT_MMBOX_MSK_BUTTON_MARK;
+ }
+
+ CEikButtonGroupContainer &cba = ButtonGroupContainer();
+ cba.SetCommandL( KMskPosition, resourceId );
+ cba.DrawDeferred();
+ }
+ else
+ {
+ CEikButtonGroupContainer &cba = ButtonGroupContainer();
+ cba.SetCommandL( KMskPosition, R_NOT_MMBOX_MSK_BUTTON_EMPTY );
+ cba.DrawDeferred();
+ }
+ }
+
+// ---------------------------------------------------------
+// ShowConfirmationQueryL
+// ---------------------------------------------------------
+TInt CMMBoxDialog::ShowConfirmationQueryL( TInt aCount,
+ TInt aTotalOnes,
+ TInt aResource )
+ {
+ CArrayFixFlat<TInt>* arr = new(ELeave) CArrayFixFlat<TInt>( 2 );
+ CleanupStack::PushL( arr );
+ arr->AppendL( aCount );
+ arr->AppendL( aTotalOnes );
+ HBufC* buf =
+ StringLoader::LoadL( aResource, *arr, iCoeEnv );
+ CleanupStack::PopAndDestroy( arr );
+ CleanupStack::PushL( buf );
+
+ TInt ret = ShowConfirmationQueryL( *buf, ETrue );
+
+ CleanupStack::PopAndDestroy( buf );
+ return ret;
+ }
+// End of File