diff -r ebe688cedc25 -r 7fdbb852d323 mobilemessaging/smum/simdialogplugins/defaultsimdlg/src/smssimdialog.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mobilemessaging/smum/simdialogplugins/defaultsimdlg/src/smssimdialog.cpp Wed Sep 01 12:31:54 2010 +0100 @@ -0,0 +1,1175 @@ +/* + * Copyright (c) 2009 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: sms sim dlg implementation + * + */ + + + +// INCLUDES +#include +#include // iAvkonViewAppUi +#include // CAknWaitDialog +#include // CEikProgressInfo +#include // CAknQueryDialog +#include +#include // StringLoader +#include // bitmaps +#include // CAknTitlePane +#include // CAknIconArray +#include // For HlpLauncher +#include +#include // FeatureManager +#include +// message includes +#include // for CMsvSession +#include // CAknInputBlock +#include // CMsgFolderSelectionDialog +#include // CMuiuOperationWait +#include // bitmaps +#include // for async sms commands +#include // for TSmsProgress + +#include // for resource ids +#include +#include // KAvkonBitmapFile +#include +#include // AknIconUtils::AvkonIconFileName() +#include +#include +#include //for displayingnote +#include // for profile state +#include +#include +#include // BaflUtils +#include // RConeResourceLoader + +#include "simdeletecopyoperation.h" // for CSimDeleteCopyOperation +#include "SMSU.H" // for CSmsMtmUi +#include "smssimdialog.h" // for CSmsSimDialog +#include "SMSU.HRH" // for command ids +//For logging +#include "SmumLogging.h" + +// LOCAL CONSTANTS AND MACROS +const TInt KSimMessageBitmapArrayGranularity = 4; +const TInt KSimMessageTempArrayGranularity = 4; +const TInt KSmumSimDialogMessageBitmapIndex = 1; + +_LIT( KSimDlgResourceFile, "defaultsimdialog.rsc" ); +_LIT( KMuiuBitmapFile, "Muiu.MBM" ); +_LIT( KSmsiMarkReplacement, "1"); + +// +// +// CSimMessageArray +// +// + +// ---------------------------------------------------- +// CSimMessageArray::CSimMessageArray +// ---------------------------------------------------- +CSimMessageArray::CSimMessageArray( CMsvSession& aSession ): +iSession( aSession ) + { + } + +// ---------------------------------------------------- +// CSimMessageArray::NewL +// ---------------------------------------------------- +CSimMessageArray* CSimMessageArray::NewL( CMsvSession& aSession ) + { + SMUMLOGGER_ENTERFN(" CSimMessageArray::NewL"); + CSimMessageArray* self = new (ELeave) CSimMessageArray(aSession); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + SMUMLOGGER_LEAVEFN(" CSimMessageArray::NewL"); + return self; + } + +// ---------------------------------------------------- +// CSimMessageArray::ConstructL +// ---------------------------------------------------- +void CSimMessageArray::ConstructL() + { + SMUMLOGGER_ENTERFN(" CSimMessageArray::ConstructL"); + TMsvSelectionOrdering ordering = TMsvSelectionOrdering( + KMsvNoGrouping, + EMsvSortByDescription, + ETrue ); + + iSmsServiceEntry = CMsvEntry::NewL( + iSession, + KMsvRootIndexEntryId, + ordering ); + + iListBoxText = HBufC::NewL( KSmumMaxDisplayTextLength ); + SMUMLOGGER_LEAVEFN(" CSimMessageArray::ConstructL"); + } + + +// ---------------------------------------------------- +// CSimMessageArray::~CSimMessageArray +// ---------------------------------------------------- +CSimMessageArray::~CSimMessageArray() + { + SMUMLOGGER_ENTERFN(" CSimMessageArray::~CSimMessageArray"); + delete iSmsServiceEntry; + delete iListBoxText; + SMUMLOGGER_LEAVEFN(" CSimMessageArray::~CSimMessageArray"); + } + +// ---------------------------------------------------- +// CSimMessageArray::MdcaCount +// ---------------------------------------------------- +TInt CSimMessageArray::MdcaCount() const +{ +SMUMLOGGER_ENTERFN(" CSimMessageArray::MdcaCount"); +if ( iSmsServiceEntry->EntryId() == KMsvRootIndexEntryId ) + { + SMUMLOGGER_LEAVEFN(" CSimMessageArray::MdcaCount - 0"); + return 0; + } +else + { + SMUMLOGGER_LEAVEFN(" CSimMessageArray::MdcaCount - COUNT"); + return iSmsServiceEntry->Count(); + } +} + +// ---------------------------------------------------- +// CSimMessageArray::MdcaPoint +// ---------------------------------------------------- +TPtrC CSimMessageArray::MdcaPoint(TInt aIndex) const +{ +SMUMLOGGER_ENTERFN(" CSimMessageArray::MdcaCount(INDEX)"); +// prepare +TPtr tempText = iListBoxText->Des(); +tempText.Zero(); +const TMsvEntry* child = NULL; +child = &(*iSmsServiceEntry)[ aIndex ]; + +// construct listbox-string +// bitmap +tempText.AppendNum( KSmumSimDialogMessageBitmapIndex ); +tempText.Append( KColumnListSeparator ); +// sender-information +if ( child->iDetails.Length() > KSmumMaxVisibleChars ) + { + tempText.Append( child->iDetails.Left( KSmumMaxVisibleChars-1 ) ); + tempText.Append( CEditableText::EEllipsis ); + } +else + { + tempText.Append( child->iDetails ); + } + +// msg "subject" +tempText.Append( KColumnListSeparator ); +if ( child->iDescription.Length() > KSmumMaxVisibleChars ) + { + tempText.Append( child->iDescription.Left( KSmumMaxVisibleChars-1 ) ); + tempText.Append( CEditableText::EEllipsis ); + } +else + { + tempText.Append( child->iDescription ); + } + +SMUMLOGGER_LEAVEFN(" CSimMessageArray::MdcaCount(INDEX)"); +return tempText; +} + + +// ---------------------------------------------------- +// CSimMessageArray::EntryId +// ---------------------------------------------------- +TMsvId CSimMessageArray::EntryId( TInt aIndex ) const +{ +return (*iSmsServiceEntry)[ aIndex ].Id(); +} + +// ---------------------------------------------------- +// CSimMessageArray::RefreshArrayL +// ---------------------------------------------------- +void CSimMessageArray::RefreshArrayL( TMsvId aFolderId ) + { + iSmsServiceEntry->SetEntryL( KMsvDeletedEntryFolderEntryId ); + iSmsServiceEntry->SetEntryL( aFolderId ); + } + + + +// +// +// CSmsSimDialog +// +// + +// ---------------------------------------------------- +// CSmsSimDialog::CSmsSimDialog +// ---------------------------------------------------- +CSmsSimDialog::CSmsSimDialog(CSmsMtmUi& aSmsMtmUi, CMsvSession& aSession, TInt& aExitCode): +iSmsMtmUi(aSmsMtmUi), +iSession(aSession), +iExitCode( aExitCode ), +iDialogDismissed( EFalse ), +iHelpFeatureSupported( EFalse ), +iMsgCountBeforeOperation( 0 ), +iResourceFileOffset(0), +iContextCommand(EFalse) + { + SMUMLOGGER_ENTERFN(" CSmsSimDialog::CSmsSimDialog"); + iExitCode = KErrNone; + iMarkReplacementText.Copy( KSmsiMarkReplacement ); + SMUMLOGGER_LEAVEFN(" CSmsSimDialog::CSmsSimDialog"); + } + +// ---------------------------------------------------- +// CSmsSimDialog::~CSmsSimDialog +// ---------------------------------------------------- +CSmsSimDialog::~CSmsSimDialog() + { + SMUMLOGGER_ENTERFN(" CSmsSimDialog::~CSmsSimDialog"); + if( iResourceFileOffset ) + { + CCoeEnv::Static()->DeleteResourceFile( iResourceFileOffset ); + } + + delete iOldTitleText; + delete iEnumerationOperation; + delete iCopyOrDeleteOperation; + delete iProgressDialog; + delete iWaitDialog; + delete iMessages; + SMUMLOGGER_LEAVEFN(" CSmsSimDialog::~CSmsSimDialog"); + } + +// ---------------------------------------------------- +// CSmsSimDialog::NewL +// ---------------------------------------------------- +CSmsSimDialog* CSmsSimDialog::NewL(CSmsMtmUi& aSmsMtmUi, CMsvSession& aSession, TInt& aExitCode) + { + SMUMLOGGER_ENTERFN(" CSmsSimDialog::NewL"); + CSmsSimDialog* self= new(ELeave) CSmsSimDialog(aSmsMtmUi, aSession, aExitCode); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + SMUMLOGGER_LEAVEFN(" CSmsSimDialog::NewL"); + return self; + } + +// ---------------------------------------------------- +// CSmsSimDialog::ConstructL +// ---------------------------------------------------- +void CSmsSimDialog::ConstructL() + { + SMUMLOGGER_ENTERFN(" CSmsSimDialog::ConstructL"); + + // Resource loader + CEikonEnv* env = CEikonEnv::Static(); + TParse fp; + fp.Set( KSimDlgResourceFile, &KDC_RESOURCE_FILES_DIR , NULL ); + TFileName filename = fp.FullName(); + BaflUtils::NearestLanguageFile(env->FsSession(), filename); + iResourceFileOffset = env->AddResourceFileL(filename); + + CAknDialog::ConstructL( R_SMS_DEFAULT_SIM_DIALOG_MENUBAR ); + iMessages = CSimMessageArray::NewL( iSession ); + + // Prepare FeatureManager, read values to members and uninitialize FeatureManager + FeatureManager::InitializeLibL(); + iHelpFeatureSupported = FeatureManager::FeatureSupported( KFeatureIdHelp ); + FeatureManager::UnInitializeLib(); + SMUMLOGGER_LEAVEFN(" CSmsSimDialog::ConstructL"); + } + +// ---------------------------------------------------- +// CSmsSimDialog::PreLayoutDynInitL +// ---------------------------------------------------- +void CSmsSimDialog::PreLayoutDynInitL() + { + SMUMLOGGER_ENTERFN(" CSmsSimDialog::PreLayoutDynInitL"); + CEikColumnListBox* listBox = ListBox(); + listBox->SetListBoxObserver( this ); + + // Create scroll bar + listBox->CreateScrollBarFrameL(); + listBox->ScrollBarFrame()->SetScrollBarVisibilityL(CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto); + + // Set data + listBox->Model()->SetItemTextArray(iMessages); + listBox->Model()->SetOwnershipType(ELbmDoesNotOwnItemArray); + HBufC* noMessages = StringLoader::LoadLC( R_SMS_DEFAULT_SIM_DIALOG_EMPTY, iCoeEnv ); + listBox->View()->SetListEmptyTextL( *noMessages ); + CleanupStack::PopAndDestroy( noMessages ); + noMessages = NULL; + + StoreTitleTextAndSetNewL(); + + // create icon array + CArrayPtr< CGulIcon >* icons = + new( ELeave ) CAknIconArray( KSimMessageBitmapArrayGranularity ); + CleanupStack::PushL( icons ); + MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance(); + + TFileName fileName; + fileName.Copy( KAvkonBitmapFile ); + icons->AppendL( + AknsUtils::CreateGulIconL( skinInstance, + KAknsIIDQgnIndiMarkedAdd, + fileName, + EMbmAvkonQgn_indi_marked_add, + EMbmAvkonQgn_indi_marked_add_mask ) ); + // Parse the filename + TParse tp; + tp.Set( KMuiuBitmapFile, &KDC_APP_BITMAP_DIR, NULL ); + fileName.Copy( tp.FullName() ); + icons->AppendL( + AknsUtils::CreateGulIconL( skinInstance, + KAknsIIDQgnPropMceSmsRead, + fileName, + EMbmMuiuQgn_prop_mce_sms_read, + EMbmMuiuQgn_prop_mce_sms_read_mask ) ); + // Set the icon array. takes ownership + reinterpret_cast + (listBox)->ItemDrawer()->FormattedCellData()->SetIconArrayL( icons ); + CleanupStack::Pop(); // icons + // Start the enumeration + EnumerateSimMessagesL(); + iMenuBar->SetContextMenuTitleResourceId( R_SMS_DEFAULT_SIM_DIALOG_CONTEXTMENUBAR ); + SMUMLOGGER_LEAVEFN(" CSmsSimDialog::PreLayoutDynInitL"); + } + +// ---------------------------------------------------- +// CSmsSimDialog::OkToExitL +// ---------------------------------------------------- +TBool CSmsSimDialog::OkToExitL(TInt aButtonId) + { + SMUMLOGGER_ENTERFN(" CSmsSimDialog::OkToExitL"); + CAknInputBlock::NewLC(); // Absorb keys + TInt returnValue = 0; + + switch(aButtonId) + { + case EAknSoftkeyEmpty: + { + returnValue = EFalse; + } + break; + case EAknSoftkeyOptions: + { + iMenuBar->SetMenuType(CEikMenuBar::EMenuOptions); + iMenuBar->TryDisplayMenuBarL(); + returnValue = EFalse; + } + break; + case EAknSoftkeyContextOptions: + { + iContextCommand = ETrue; + // Middle softkey was pressed. Display context menu. + iMenuBar->SetMenuType(CEikMenuBar::EMenuContext); + iMenuBar->TryDisplayContextMenuBarL(); + returnValue = EFalse; + } + break; + default: + { + TBool okToExit = CAknDialog::OkToExitL( aButtonId ); + if ( okToExit ) + { + TRAP_IGNORE( DeleteSimFolderL() ); + if ( aButtonId != EEikBidCancel ) + { + TRAP_IGNORE( RestoreTitleTextL() ); + } + } + returnValue = okToExit; + } + break; + + } + + CleanupStack::PopAndDestroy(); // CAknInputBlock + SMUMLOGGER_LEAVEFN(" CSmsSimDialog::OkToExitL"); + return returnValue; + } + +// ---------------------------------------------------- +// CSmsSimDialog::ProcessCommandL +// ---------------------------------------------------- +void CSmsSimDialog::ProcessCommandL( TInt aCommandId ) + { + SMUMLOGGER_ENTERFN(" CSmsSimDialog::ProcessCommandL"); + CAknDialog::ProcessCommandL( aCommandId ) ; + CEikColumnListBox* listBox = ListBox(); + CRepository* repository = CRepository::NewLC( KCRUidProfileEngine ); + TInt defaultType( EProfileGeneralId ); + User::LeaveIfError( repository->Get( KProEngActiveProfile, defaultType ) ); + CleanupStack::PopAndDestroy( repository ); + + switch ( aCommandId ) + { + case ESmsMtmUiCommandIdCopy: + //General system error pops up when deleting a SIM message in offline mode + if ( defaultType == EProfileOffLineId ) + { + // Show note and exit + HBufC* noteString = StringLoader::LoadLC( R_QTN_OFFLINE_NOT_POSSIBLE, iCoeEnv ); + CAknInformationNote* note = new ( ELeave ) CAknInformationNote( ETrue ); + note->ExecuteLD( *noteString ); + CleanupStack::PopAndDestroy(); // noteString + TryExitL( EAknSoftkeyBack ); + } + else + { + HandleCopyFromSimToLocalFolderL(); + } + break; + case ESmsMtmUiCommandIdDelete: + //General system error pops up when deleting a SIM message in offline mode + if ( defaultType == EProfileOffLineId ) + { + // Show note and exit + HBufC* noteString = StringLoader::LoadLC( R_QTN_OFFLINE_NOT_POSSIBLE, iCoeEnv ); + CAknInformationNote* note = new ( ELeave ) CAknInformationNote( ETrue ); + note->ExecuteLD( *noteString ); + CleanupStack::PopAndDestroy(); // noteString + TryExitL( EAknSoftkeyBack ); + } + else + { + HandleDeleteFromSimL(); + } + break; + case ESmsMtmUiCommandIdEditMark: + { +#ifdef _DEBUG + RDebug::Print(_L("CSmsSimDialog::ProcessCommandL: mark item %d"), + listBox->CurrentItemIndex() ); +#endif + listBox->View()->SelectItemL( listBox->CurrentItemIndex() ); + break; + } + case ESmsMtmUiCommandIdEditUnmark: + { +#ifdef _DEBUG + RDebug::Print(_L("CSmsSimDialog::ProcessCommandL: unmark item %d"), + listBox->CurrentItemIndex() ); +#endif + listBox->View()->DeselectItem( listBox->CurrentItemIndex() ); + break; + } + case ESmsMtmUiCommandIdEditUnmarkAll: + { +#ifdef _DEBUG + RDebug::Print(_L("CSmsSimDialog::ProcessCommandL: unmark all") ); +#endif + + listBox->View()->ClearSelection(); + break; + } + case ESmsMtmUiCommandIdEditMarkAll: + { +#ifdef _DEBUG + RDebug::Print(_L("CSmsSimDialog::ProcessCommandL: mark all") ); +#endif + + CArrayFixFlat* indexArray = new( ELeave ) CArrayFixFlat( + KSimMessageTempArrayGranularity ); + CleanupStack::PushL( indexArray ); + const TInt count = listBox->Model()->NumberOfItems(); + for ( TInt loop = 0; loop < count; loop++ ) + { + indexArray->AppendL( loop ); + } + listBox->View()->SetSelectionIndexesL( indexArray ); + CleanupStack::PopAndDestroy(); // indexArray + break; + } + case EAknCmdHelp: + { + LaunchHelpL(); + } + break; + case ESmsSettingsChoiceMenuExit: + { + iExitCode = EEikCmdExit; + TryExitL( EAknCmdExit ); + } + break; + + default : + break; + } + SMUMLOGGER_LEAVEFN(" CSmsSimDialog::ProcessCommandL"); + } +// ---------------------------------------------------- +// CSmsSimDialog::DynInitMenuPaneL +// ---------------------------------------------------- +void CSmsSimDialog::DynInitMenuPaneL( + TInt aResourceId, CEikMenuPane* aMenuPane ) + { + SMUMLOGGER_ENTERFN(" CSmsSimDialog::DynInitMenuPaneL - 2"); + if ( aResourceId == R_SMS_DEFAULT_SIM_DIALOG_MENUPANE ) + { + if ( ListBox()->Model()->NumberOfItems() == 0 ) + { + aMenuPane->DeleteMenuItem( ESmsMtmUiCommandIdEdit ); + } + + aMenuPane->SetItemDimmed( EAknCmdHelp, !iHelpFeatureSupported ); + } + else if ( aResourceId == R_MCE_DEFAULT_SIM_DIALOG_EDIT_CASCADE ) + { + DynInitEditMenuL( aMenuPane ); + } + SMUMLOGGER_LEAVEFN(" CSmsSimDialog::DynInitMenuPaneL - 2"); + } + +// ---------------------------------------------------- +// CSmsSimDialog::OfferKeyEventL +// ---------------------------------------------------- +TKeyResponse CSmsSimDialog::OfferKeyEventL( + const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + SMUMLOGGER_ENTERFN(" CSmsSimDialog::OfferKeyEventL"); + CEikColumnListBox* listBox = ListBox(); + if ( listBox && aType == EEventKey && aKeyEvent.iCode == EKeyBackspace && + listBox->Model()->NumberOfItems() > 0 ) + { + HandleDeleteFromSimL(); + return EKeyWasConsumed; + } + if ( aType == EEventKey && aKeyEvent.iCode == EKeyOK ) + { + if ( ListBox()->Model()->NumberOfItems() ) + { + iMenuBar->SetMenuType(CEikMenuBar::EMenuContext); + iMenuBar->TryDisplayContextMenuBarL(); + } + return EKeyWasConsumed; + } + if( aType == EEventKeyUp ) + { + UpdateMskL( ); + } + + // Exit if waitnote is cancelled & dismissed + if ( iDialogDismissed && iEnumerationOperation ) + { + TryExitL( EAknSoftkeyBack ); + iDialogDismissed = EFalse; + return EKeyWasConsumed; + } + + return CAknDialog::OfferKeyEventL( aKeyEvent, aType ); + } + + +// ---------------------------------------------------- +// CSmsSimDialog::DynInitEditMenuL +// ---------------------------------------------------- +void CSmsSimDialog::DynInitEditMenuL( CEikMenuPane* aMenuPane ) + { + SMUMLOGGER_ENTERFN(" CSmsSimDialog::DynInitEditMenuL(MEUPANE)"); + CEikColumnListBox* listBox = ListBox(); + + // check what state item under "cursor" is + const CListBoxView::CSelectionIndexArray* items = + listBox->SelectionIndexes(); + TKeyArrayFix key(0, ECmpTInt); + TInt count = items->Count(); + if ( 0 == count ) + { + //if no selection, disable unmarkall + aMenuPane->SetItemDimmed( ESmsMtmUiCommandIdEditUnmarkAll, ETrue ); + } + if ( count == listBox->Model()->NumberOfItems() ) + { + //if all selected, disable markall + aMenuPane->SetItemDimmed( ESmsMtmUiCommandIdEditMarkAll, ETrue ); + } + if(iContextCommand) + { + aMenuPane->SetItemDimmed( ESmsMtmUiCommandIdEditMark, EFalse ); + aMenuPane->SetItemDimmed( ESmsMtmUiCommandIdEditUnmark, EFalse ); + iContextCommand = EFalse; + } + else + { + aMenuPane->SetItemDimmed( ESmsMtmUiCommandIdEditMark, ETrue ); + aMenuPane->SetItemDimmed( ESmsMtmUiCommandIdEditUnmark, ETrue ); + } + TInt pos; + if ( !items->Find(listBox->CurrentItemIndex(), key, pos)) + { + aMenuPane->DeleteMenuItem( ESmsMtmUiCommandIdEditMark ); + } + else + { + aMenuPane->DeleteMenuItem( ESmsMtmUiCommandIdEditUnmark ); + } + SMUMLOGGER_LEAVEFN(" CSmsSimDialog::DynInitEditMenuL(MEUPANE)"); + } + +// ---------------------------------------------------- +// CSmsSimDialog::HandleListBoxEventL +// ---------------------------------------------------- +void CSmsSimDialog::HandleListBoxEventL( + CEikListBox* /*aListBox*/, + TListBoxEvent aEventType ) + { + SMUMLOGGER_ENTERFN(" CSmsSimDialog::HandleListBoxEventL"); + switch(aEventType) + { + case EEventEnterKeyPressed: + case EEventItemSingleClicked: + iContextCommand = ETrue; + TryExitL( EAknSoftkeyContextOptions ); + break; + default: + break; + } + SMUMLOGGER_LEAVEFN(" CSmsSimDialog::HandleListBoxEventL"); + } + +// ---------------------------------------------------- +// CSmsSimDialog::DeleteSimFolderL +// ---------------------------------------------------- +void CSmsSimDialog::DeleteSimFolderL() + { + if ( iSimFolderId != KMsvNullIndexEntryId ) + { + SMUMLOGGER_ENTERFN(" CSmsSimDialog::DeleteSimFolderL"); + CMsvEntry* entry = iSession.GetEntryL(iSimFolderId); + CleanupStack::PushL(entry); + TMsvSelectionOrdering ordering = entry->SortType(); + ordering.SetShowInvisibleEntries( ETrue ); + entry->SetSortTypeL( ordering ); + entry->SetEntryL( entry->OwningService() ); // now entry points to SMS service + CAknInputBlock::NewLC(); + CMuiuOperationWait* waiter = + CMuiuOperationWait::NewLC(); + CMsvOperation* deleteOperation = + entry->DeleteL(iSimFolderId, waiter->iStatus); + waiter->Start(); + delete deleteOperation; + CleanupStack::PopAndDestroy(3, entry); // entry, waiter, CAknInputBlock + iSimFolderId = KMsvNullIndexEntryId; + } + SMUMLOGGER_LEAVEFN(" CSmsSimDialog::DeleteSimFolderL"); + } + + + +// ---------------------------------------------------- +// CSmsSimDialog::HandleCopyFromSimToLocalFolderL +// ---------------------------------------------------- +void CSmsSimDialog::HandleCopyFromSimToLocalFolderL() + { + SMUMLOGGER_ENTERFN(" CSmsSimDialog::HandleCopyFromSimToLocalFolderL"); + + TMsvId destinationId = 0; + HBufC* title = StringLoader::LoadLC(R_SMS_DEFAULT_SIM_DIALOG_COPY_MESSAGES, iCoeEnv); + if ( !CMsgFolderSelectionDialog::SelectFolderL( destinationId, *title ) ) + { + CleanupStack::PopAndDestroy( title ); + return; + } + + CleanupStack::PopAndDestroy( title ); + + LaunchNoteAndOperationL( destinationId ); + SMUMLOGGER_LEAVEFN(" CSmsSimDialog::HandleCopyFromSimToLocalFolderL"); + } + +// ---------------------------------------------------- +// CSmsSimDialog::CreateSelectionArrayLC +// ---------------------------------------------------- +CMsvEntrySelection* CSmsSimDialog::CreateSelectionArrayLC() + { + SMUMLOGGER_ENTERFN(" CSmsSimDialog::CreateSelectionArrayLC"); + CEikColumnListBox* listBox = ListBox(); + const TInt selectionCount = listBox->View()->SelectionIndexes()->Count(); + + CMsvEntrySelection* selection = new (ELeave) CMsvEntrySelection(); + CleanupStack::PushL( selection ); + if ( selectionCount ) + { + // selected items + const CListBoxView::CSelectionIndexArray* items = + listBox->SelectionIndexes(); + const TInt count = items->Count(); + for ( TInt loop = 0; loop < count; loop++ ) + { + selection->AppendL( iMessages->EntryId( items->At( loop ) ) ); + } + } + else + { + // item under cursor + const TInt index = ListBox()->CurrentItemIndex(); + selection->AppendL( iMessages->EntryId(index) ); + } +#ifdef _DEBUG + const TInt count2 = selection->Count(); + RDebug::Print(_L("CSmsSimDialog::CreateSelectionArrayLC: items %d"), + count2 ); + for ( TInt loop2 = 0; loop2 < count2; loop2++ ) + { + RDebug::Print(_L("item %d id %d"), + loop2, selection->At( loop2 ) ); + } +#endif + SMUMLOGGER_LEAVEFN(" CSmsSimDialog::CreateSelectionArrayLC"); + return selection; + } + +// ---------------------------------------------------- +// CSmsSimDialog::HandleDeleteFromSimL +// ---------------------------------------------------- +void CSmsSimDialog::HandleDeleteFromSimL() + { + SMUMLOGGER_ENTERFN(" CSmsSimDialog::HandleDeleteFromSimL"); + HBufC* messageText = NULL; + const TInt messageCount = ListBox()->View()->SelectionIndexes()->Count(); + if ( messageCount == 1 || messageCount == 0 ) + { + messageText = StringLoader::LoadL( + R_DEFAULT_SIM_MESSAGE_DELETE_CONFIRMATION_ONE_MESSAGE, iCoeEnv); + } + else + { + messageText = StringLoader::LoadL( + R_DEFAULT_SIM_MESSAGE_DELETE_CONFIRMATION_MANY_MESSAGES, + messageCount, + iCoeEnv); + } + CleanupStack::PushL( messageText ); + CAknQueryDialog* confDialog = CAknQueryDialog::NewL( ); + if ( !confDialog->ExecuteLD( R_DEFAULT_SIM_MESSAGE_DELETE_CONFIRMATION, *messageText ) ) + { + CleanupStack::PopAndDestroy( messageText ); + SMUMLOGGER_LEAVEFN(" CSmsSimDialog::HandleDeleteFromSimL - 1"); + return; + } + CleanupStack::PopAndDestroy( messageText ); + + LaunchNoteAndOperationL(); + SMUMLOGGER_LEAVEFN(" CSmsSimDialog::HandleDeleteFromSimL - 2"); + } + +// ---------------------------------------------------- +// CSmsSimDialog::UpdateSimMessagesArrayL +// ---------------------------------------------------- +void CSmsSimDialog::UpdateSimMessagesArrayL() + { + SMUMLOGGER_ENTERFN(" CSmsSimDialog::UpdateSimMessagesArrayL"); + const TInt index = ListBox()->CurrentItemIndex(); + iMessages->RefreshArrayL( iSimFolderId ); + + ListBox()->View()->ClearSelection(); + const TInt count = iMessages->MdcaCount(); + if ( iMsgCountBeforeOperation < count ) + { // msg count increased + ListBox()->HandleItemAdditionL(); + } + else if ( iMsgCountBeforeOperation > count ) + { // msg count decreased + if ( index == KErrNotFound && count ) + { + ListBox()->SetCurrentItemIndex( count - 1 ); + } + ListBox()->HandleItemRemovalL(); + } + + // update msg count + iMsgCountBeforeOperation = iMessages->MdcaCount(); + UpdateMskL(); + SMUMLOGGER_LEAVEFN(" CSmsSimDialog::UpdateSimMessagesArrayL"); + } + +// ---------------------------------------------------- +// CSmsSimDialog::ListBox +// ---------------------------------------------------- +CEikColumnListBox* CSmsSimDialog::ListBox() const +{ +return((CEikColumnListBox*)Control(EMsgControlIdSimMessageListBox)); +} + +// ---------------------------------------------------- +// CSmsSimDialog::EnumerateSimMessagesL +// ---------------------------------------------------- +void CSmsSimDialog::EnumerateSimMessagesL() + { + SMUMLOGGER_ENTERFN(" CSmsSimDialog::EnumerateSimMessagesL"); + delete iWaitDialog; + iWaitDialog = NULL; + iWaitDialog = new (ELeave) CAknWaitDialog( + (REINTERPRET_CAST(CEikDialog**, &iWaitDialog)), + ETrue + ); + CleanupStack::PushL(TCleanupItem(CleanupWaitDialog, + (TAny**)&iWaitDialog)); + iWaitDialog->SetCallback( this ); + iWaitDialog->ExecuteLD( R_DEFAULT_SIM_DIALOG_WAIT_NOTE ); + + // Find the service entry + CMsvEntry* serviceEntry = iSession.GetEntryL(KMsvRootIndexEntryId); + CleanupStack::PushL(serviceEntry); + TMsvId serviceId; + TSmsUtilities::ServiceIdL(*serviceEntry, serviceId, KUidMsgTypeSMS); + + // Enumerate sim messages + CMsvEntrySelection* selection = new (ELeave) CMsvEntrySelection(); + CleanupStack::PushL(selection); + selection->AppendL(serviceId); + + CMsvSingleOpWatcher* singleOpWatcher=CMsvSingleOpWatcher::NewL( *this ); + CleanupStack::PushL(singleOpWatcher); + TBuf8<1> foo (KNullDesC8); + CAknInputBlock::NewLC(); // no need to store the pointer returned, It's on the Cleanup Stack + CMsvOperation* operation = iSmsMtmUi.BaseMtm().InvokeAsyncFunctionL( + ESmsMtmCommandEnumeratePhoneStores, + *selection, + foo, + singleOpWatcher->iStatus); + singleOpWatcher->SetOperation( operation ); + iEnumerationOperation = singleOpWatcher; + CleanupStack::PopAndDestroy(); // CAknInputBlock + CleanupStack::Pop( singleOpWatcher ); + CleanupStack::PopAndDestroy( 2, serviceEntry ); // serviceEntry, selection + CleanupStack::Pop(); // TCleanupItem - everything ok so don't delete iWaitDialog + SMUMLOGGER_LEAVEFN(" CSmsSimDialog::EnumerateSimMessagesL"); + } + + +// ---------------------------------------------------- +// CSmsSimDialog::StoreTitleTextAndSetNewL +// ---------------------------------------------------- +void CSmsSimDialog::StoreTitleTextAndSetNewL() + { + SMUMLOGGER_ENTERFN(" CSmsSimDialog::StoreTitleTextAndSetNewL"); + CEikStatusPane* sp = ((CAknAppUi*)CEikonEnv::Static()->EikAppUi()) + ->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_SMS_DEFAULT_SIM_DIALOG_TITLE_TEXT, + iCoeEnv ); + title->SetTextL( *newTitle ); + CleanupStack::PopAndDestroy( newTitle ); + SMUMLOGGER_LEAVEFN(" CSmsSimDialog::StoreTitleTextAndSetNewL"); + } + +// ---------------------------------------------------- +// CSmsSimDialog::RestoreTitleTextL +// ---------------------------------------------------- +void CSmsSimDialog::RestoreTitleTextL() + { + SMUMLOGGER_ENTERFN(" CSmsSimDialog::RestoreTitleTextL"); + CEikStatusPane* sp = ((CAknAppUi*)CEikonEnv::Static()->EikAppUi()) + ->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; + SMUMLOGGER_LEAVEFN(" CSmsSimDialog::RestoreTitleTextL"); + } + +// ---------------------------------------------------- +// CSmsSimDialog::OpCompleted +// ---------------------------------------------------- +void CSmsSimDialog::OpCompleted( + CMsvSingleOpWatcher& aOpWatcher, + TInt aCompletionCode ) + { + SMUMLOGGER_ENTERFN(" CSmsSimDialog::OpCompleted"); + TBool tryToExit = EFalse; + CMsvOperation* op=&aOpWatcher.Operation(); + TRAP_IGNORE( tryToExit = DoOperationCompletedL(op, aCompletionCode ) ); + if ( tryToExit ) + { + return; + } + + if ( iEnumerationOperation->Operation().Id()==op->Id() ) + { +#ifdef _DEBUG + RDebug::Print(_L("CSmsSimDialog::OpCompleted, completed enumerate operation") ); +#endif + delete iEnumerationOperation; + iEnumerationOperation = NULL; + } + else if ( iCopyOrDeleteOperation->Operation().Id()==op->Id() ) + { +#ifdef _DEBUG + RDebug::Print(_L("CSmsSimDialog::OpCompleted, completed copy/delete operation") ); +#endif + delete iCopyOrDeleteOperation; + iCopyOrDeleteOperation = NULL; + delete iProgressDialog; + iProgressDialog = NULL; + } + + if ( !iEnumerationOperation && !iCopyOrDeleteOperation ) + { + delete iWaitDialog; + iWaitDialog = NULL; + delete iProgressDialog; + iProgressDialog = NULL; + } + ListBox()->DrawDeferred(); + SMUMLOGGER_LEAVEFN(" CSmsSimDialog::OpCompleted"); + } + +// ---------------------------------------------------- +// CSmsSimDialog::DoOperationCompletedL +// ---------------------------------------------------- +TBool CSmsSimDialog::DoOperationCompletedL( + CMsvOperation* aOperation, + TInt /*aCompletionCode*/ ) + { + SMUMLOGGER_ENTERFN(" CSmsSimDialog::DoOperationCompletedL"); + if ( !aOperation ) + { + SMUMLOGGER_LEAVEFN(" CSmsSimDialog::DoOperationCompletedL - FALSE -0"); + return EFalse; + } + + TSmsProgressBuf progressBuf; + progressBuf.Copy(aOperation->ProgressL()); + TSmsProgress progress = progressBuf(); + iSmsMtmUi.DisplayProgressSummary(progressBuf); + if ( iEnumerationOperation ) + { +#ifdef _DEBUG + RDebug::Print(_L("CSmsSimDialog::DoOperationCompletedL, enumeration completed %d"), progress.iError ); +#endif + if ( !progress.iError) + { + iSimFolderId = progress.iEnumerateFolder; + UpdateSimMessagesArrayL(); + } + else + { + delete iWaitDialog; + iWaitDialog = NULL; + TryExitL( EAknSoftkeyBack ); + SMUMLOGGER_LEAVEFN(" CSmsSimDialog::DoOperationCompletedL - TRUE"); + return ETrue; + } + } + + if ( iCopyOrDeleteOperation ) + { +#ifdef _DEBUG + RDebug::Print(_L("CSmsSimDialog::DoOperationCompletedL, delete/copy completed %d"), progress.iError ); +#endif + EnumerateSimMessagesL(); + } + SMUMLOGGER_LEAVEFN(" CSmsSimDialog::DoOperationCompletedL - FALSE"); + return EFalse; + } + +// ---------------------------------------------------- +// CSmsSimDialog::CleanupWaitDialog +// ---------------------------------------------------- +void CSmsSimDialog::CleanupWaitDialog(TAny* aAny) + { + SMUMLOGGER_ENTERFN(" CSmsSimDialog::CleanupWaitDialog"); + CEikDialog** dialog = (CEikDialog**) aAny; + if (dialog && *dialog) + { + delete *dialog; + *dialog = NULL; + } + SMUMLOGGER_LEAVEFN(" CSmsSimDialog::CleanupWaitDialog"); + } + +// ---------------------------------------------------- +// CSmsSimDialog::DialogDismissedL +// ---------------------------------------------------- +void CSmsSimDialog::DialogDismissedL( TInt /*aButtonId*/ ) + { + SMUMLOGGER_ENTERFN(" CSmsSimDialog::DialogDismissedL"); + if ( iEnumerationOperation ) + { +#ifdef _DEBUG + RDebug::Print(_L("CSmsSimDialog::DialogDismissedL, cancelling enumerate operation") ); +#endif + iDialogDismissed = ETrue; + } + else if ( iCopyOrDeleteOperation ) + { +#ifdef _DEBUG + RDebug::Print(_L("CSmsSimDialog::DialogDismissedL, cancelling copy or delete operation") ); +#endif + CSimDeleteCopyOperation* oper = STATIC_CAST(CSimDeleteCopyOperation*, &iCopyOrDeleteOperation->Operation()); + oper->CancelAfterCurrentCompleted(); + } +#ifdef _DEBUG + RDebug::Print(_L("CSmsSimDialog::DialogDismissedL, finish") ); +#endif + SMUMLOGGER_LEAVEFN(" CSmsSimDialog::DialogDismissedL"); + } + +// ---------------------------------------------------- +// CSmumMainSettingsDialog::LaunchHelpL +// launch help using context +// +// ---------------------------------------------------- +void CSmsSimDialog::LaunchHelpL() + { + SMUMLOGGER_ENTERFN(" CSmsSimDialog::LaunchHelpL"); + if ( iHelpFeatureSupported ) + { + CCoeAppUi* editorAppUi = STATIC_CAST(CCoeAppUi*, ControlEnv()->AppUi()); + CArrayFix* helpContext = editorAppUi->AppHelpContextL(); + HlpLauncher::LaunchHelpApplicationL( iEikonEnv->WsSession(), helpContext ); + } + SMUMLOGGER_LEAVEFN(" CSmsSimDialog::LaunchHelpL"); + } + + +// ---------------------------------------------------- +// CSmumMainSettingsDialog::GetHelpContext +// returns helpcontext as aContext +// +// ---------------------------------------------------- +void CSmsSimDialog::GetHelpContext +(TCoeHelpContext& aContext) const +{ +const TUid KUidMce ={0x100058C5}; +aContext.iMajor = KUidMce; +aContext.iContext = KMCE_HLP_SIM; +} + +// ---------------------------------------------------- +// CSmsSimDialog::LaunchNoteAndOperationL +// ---------------------------------------------------- +void CSmsSimDialog::LaunchNoteAndOperationL( TMsvId aDestinationId ) + { + SMUMLOGGER_ENTERFN(" CSmsSimDialog::LaunchNoteAndOperationL"); + // store msg count before operation + iMsgCountBeforeOperation = iMessages->MdcaCount(); + + delete iProgressDialog; + iProgressDialog = NULL; + iProgressDialog = new (ELeave) CAknProgressDialog( + (REINTERPRET_CAST(CEikDialog**, &iProgressDialog)), + ETrue + ); + CleanupStack::PushL(TCleanupItem(CleanupWaitDialog, + (TAny**)&iProgressDialog)); + iProgressDialog->SetCallback( this ); + CEikImage* icon = NULL; + icon = new (ELeave) CEikImage; + CleanupStack::PushL(icon); + TFileName fileName = AknIconUtils::AvkonIconFileName(); //avkon.mbm file name and path + + //select which icon to show + const TInt bitmapIndex = aDestinationId ? + EMbmAvkonQgn_note_copy : EMbmAvkonQgn_note_erased; + const TInt maskIndex = aDestinationId ? + EMbmAvkonQgn_note_copy_mask : EMbmAvkonQgn_note_erased_mask; + + const TAknsItemID id = aDestinationId ? + KAknsIIDQgnNoteCopy : KAknsIIDQgnNoteErased; + + CFbsBitmap* targetBitmap; + CFbsBitmap* targetBitmapMask; + AknsUtils::CreateIconL( AknsUtils::SkinInstance(), id , targetBitmap, + targetBitmapMask, fileName, bitmapIndex, maskIndex ); + + //set icon + icon->SetPicture(targetBitmap, targetBitmapMask); + iProgressDialog->SetImageL(icon); + CleanupStack::Pop(); // icon + iProgressDialog->ExecuteLD( R_DEFAULT_SIM_DIALOG_PROGRESS_NOTE ); + + CMsvEntrySelection* selection = CreateSelectionArrayLC(); + CAknInputBlock::NewLC(); // no need to store the pointer returned, It's on the Cleanup Stack + CMsvSingleOpWatcher* singleOpWatcher=CMsvSingleOpWatcher::NewL( *this ); + CleanupStack::PushL(singleOpWatcher); + + CMsvOperation* operation = NULL; + if ( aDestinationId ) + { // copy operation + operation = CSimDeleteCopyOperation::NewL( + iSession, + iSmsMtmUi, + singleOpWatcher->iStatus, + selection, + aDestinationId, + *iProgressDialog, + iCoeEnv ); + } + else + { // delete operation + operation = CSimDeleteCopyOperation::NewL( + iSession, + iSmsMtmUi, + singleOpWatcher->iStatus, + selection, + *iProgressDialog, + iCoeEnv ); + } + + singleOpWatcher->SetOperation( operation ); + iCopyOrDeleteOperation = singleOpWatcher; + CleanupStack::Pop( singleOpWatcher ); + CleanupStack::PopAndDestroy( 2, selection ); // CAknInputBlock + CleanupStack::Pop( ); // CleanupWaitDialog + SMUMLOGGER_LEAVEFN(" CSmsSimDialog::LaunchNoteAndOperationL"); + } + +// ---------------------------------------------------- +// CSmsSimDialog::UpdateMskL +// ---------------------------------------------------- +void CSmsSimDialog::UpdateMskL() + { + SMUMLOGGER_ENTERFN(" CSmsSimDialog::UpdateMskL"); + TInt resId = 0; + const TInt KMskPosition = 3; + + if( ListBox()->Model()->NumberOfItems() == 0 ) + {//show empty button + resId = R_DEFAULT_SIM_MSK_BUTTON_EMPTY; + } + else + { + resId = R_DEFAULT_SIM_MSK_BUTTON_CONTEXTMENU; + } + + CEikButtonGroupContainer &cba = ButtonGroupContainer(); + cba.SetCommandL( KMskPosition, resId ); + cba.DrawDeferred(); + SMUMLOGGER_LEAVEFN(" CSmsSimDialog::UpdateMskL"); + } +// End of File