diff -r 000000000000 -r 72b543305e3a mobilemessaging/mmsui/notmtmsrc/MMBoxDialog.cpp --- /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 +#include // iAvkonViewAppUi +#include // CAknWaitDialog +#include // CEikProgressInfo +#include // CAknQueryDialog +#include +#include // StringLoader +#include // CAknTitlePane +#include // CAknIconArray +// message includes +#include // for CMsvSession +#include // SelectionOrder +#include // CAknInputBlock +#include // MsvProgressReporterOperation +#include // CMsgEmbeddedEditorWatchingOperation +#include +#include + +#include // CMuiuOperationWait +#include +#include // For HlpLauncher +#include +#include // FeatureManager +#include // bitmaps +#include // for KMsvInboxIndexEntryId +#include +#include // For skinned stuff +#include // For CEikMenuBar +#include // CAknInformationNote +#include // For Notification Client MTM +#include // For navipane +#include // CAknNavigationDecorator +#include // CAknTabGroup +#include // CAknEnv + +#include +#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 + ( 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( 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* 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 + ( 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 dateString; + date.FormatL( dateString, *dateFormat ); + CleanupStack::PopAndDestroy(); //dateFormat + + dateFormat = StringLoader::LoadLC( R_QTN_TIME_USUAL, iCoeEnv ); + TBuf 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* 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& /*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; iCount( ); 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 dateString; + messageDate.FormatL( dateString, *dateFormat ); + CleanupStack::PopAndDestroy(); //dateFormat + + dateFormat = StringLoader::LoadLC( R_QTN_TIME_USUAL_WITH_ZERO, iCoeEnv ); + TBuf 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* array3 = new(ELeave) CArrayFixFlat( 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 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 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 + ( 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( &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( &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* arr = new(ELeave) CArrayFixFlat( 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