diff -r 000000000000 -r e686773b3f54 phonebookui/Speeddial/VPbkControlSrc/speeddialprivate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phonebookui/Speeddial/VPbkControlSrc/speeddialprivate.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,3543 @@ +/* +* Copyright (c) 2002 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: A utility that provides services to both the Speeddial and +* PhoneBook applications for getting and setting speeddial +* number configuration. +* +*/ + + + + + + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "SpdiaGridVPbk.h" +#include "SpdiaGridDlgVPbk.h" +#include "SpdiaIndexDataVPbk.h" +#include "SpdiaControl.hrh" +#include "Speeddial.laf" +#include "SpdiaPanic.h" + +#include "speeddialprivate.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "SpdiaContainer.h" + +// LOCAL CONSTANTS AND MACROS +//This order is based on 'Standard field ids' (PbkFields.hrh) + +const TUint KFieldIds[] = +{ + R_VPBK_FIELD_TYPE_LANDPHONEHOME, + R_VPBK_FIELD_TYPE_MOBILEPHONEHOME, + R_VPBK_FIELD_TYPE_VIDEONUMBERHOME, + R_VPBK_FIELD_TYPE_FAXNUMBERHOME, + R_VPBK_FIELD_TYPE_VOIPHOME, + R_VPBK_FIELD_TYPE_LANDPHONEWORK, + R_VPBK_FIELD_TYPE_MOBILEPHONEWORK, + R_VPBK_FIELD_TYPE_VIDEONUMBERWORK, + R_VPBK_FIELD_TYPE_FAXNUMBERWORK, + R_VPBK_FIELD_TYPE_VOIPWORK, + R_VPBK_FIELD_TYPE_LANDPHONEGEN, + R_VPBK_FIELD_TYPE_MOBILEPHONEGEN, + R_VPBK_FIELD_TYPE_VIDEONUMBERGEN, + R_VPBK_FIELD_TYPE_FAXNUMBERGEN, + R_VPBK_FIELD_TYPE_VOIPGEN, + R_VPBK_FIELD_TYPE_POC, + R_VPBK_FIELD_TYPE_SWIS, + R_VPBK_FIELD_TYPE_PAGERNUMBER, + R_VPBK_FIELD_TYPE_ASSTPHONE, + R_VPBK_FIELD_TYPE_CARPHONE, + R_VPBK_FIELD_TYPE_IMPP +}; + + + +const TInt KCellRowCount(3); +const TInt KCellColCount(3); +const TInt KMaxIndex(8); +const TInt KVoiceMail(0); + + +const TInt KLayoutCount(5); +const TInt KNullIndexData(-1); +const TInt32 KVmbxUid(0x100058F5) ; +const TInt KOperatorNameLength(100); +const TInt KContactFormattingFlags = MPbk2ContactNameFormatter::EPreserveLeadingSpaces | MPbk2ContactNameFormatter::EReplaceNonGraphicChars; + +_LIT(KNullCell, "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t%d\t"); +_LIT(KDesTab, "\t"); +_LIT(KDesTab2, "\t\t"); + + + + +// --------------------------------------------------------- +// CSpeedDialPrivate::NewL() +// --------------------------------------------------------- +// + + + EXPORT_C CSpeedDialPrivate* CSpeedDialPrivate::NewL(CVPbkContactManager* aContactManager ) + { + CSpeedDialPrivate* self = new(ELeave) CSpeedDialPrivate(aContactManager); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); // self + return self; + } + +// --------------------------------------------------------- +// CSpdiaControl::CSpdiaControl +// +// --------------------------------------------------------- +// + + CSpeedDialPrivate::CSpeedDialPrivate(CVPbkContactManager* aContactManager): + iShadowLayout(NULL), + iBgContext(NULL), + iCurrentIndex( -1 ), + iDialSkinBmp(NULL), + iSkinIcons(NULL), + iContactManager(aContactManager), + iImageManager(NULL), + iContactLink(NULL), + iContact(NULL), + iContactLinkArray(NULL), + iSpeedDial(NULL), + iUpdateFlag(EFalse), + iSdmArray(NULL), + iWait(NULL), + iVideoMail(0), + iMail(NULL), + iFetchmail(EFalse), + iServiceHandler(NULL), + iCancelFlag(0), + iRemoveConfirmQueryDialog( NULL ) + /*iOperationComplete(EFalse),*/ + { + + } + +// --------------------------------------------------------- +// CSpeedDialPrivate::ConstructL +// +// --------------------------------------------------------- +// + void CSpeedDialPrivate::ConstructL() + { + TInt tmp = 1; + + _LIT(KMbmFileName, "Z:spdctrl.mbm"); + _LIT(KRscFileName, "Z:spdctrl.rsc" ); + + TParse* fpMbm = new(ELeave) TParse (); + fpMbm->Set (KMbmFileName, &KDC_APP_BITMAP_DIR, NULL); + iBmpPath.Copy(fpMbm ->FullName()); + delete fpMbm; + fpMbm=NULL; + + TParse* fpRsc = new(ELeave) TParse (); + fpRsc->Set (KRscFileName, &KDC_RESOURCE_FILES_DIR, NULL); + + TBuf<254> rscPath; + rscPath.Copy(fpRsc ->FullName()); + + delete fpRsc; + fpRsc=NULL; + + CRepository* repository = CRepository::NewLC(KCRUidSpeedDialLV); + repository->Get( KSpeedDialLVFlags, tmp ); + + iBooleanVarForAddingDialogVariation = ( tmp == 1); + + CleanupStack::PopAndDestroy(); // pop-destroy repository + + + TFileName fileName(rscPath); + BaflUtils::NearestLanguageFile(iCoeEnv->FsSession(), fileName); + iFileOffset = iCoeEnv->AddResourceFileL(fileName); + + iSdmCount = KCellRowCount * KCellColCount; + iGridUsed = EGridNoUse; + + iIconArray = new (ELeave)CAknIconArray(iSdmCount); + iSdmArray = new (ELeave) CArrayFixFlat(iSdmCount); + TSpdiaIndexDataVPbk spDialData; + iSdmArray->AppendL(spDialData, iSdmCount); + + iDialSkinBmp = new (ELeave)RArray(KArraySize); + iSkinIcons = new (ELeave)RArray(KArraySize); + iShadowLayout = new (ELeave) CArrayFixFlat (KLayoutCount); + for (TInt i(0); i < KLayoutCount; ++i) + { + TAknLayoutRect rect; + iShadowLayout->AppendL(rect); + } + + + iSpeedDial = CVPbkSpeedDialAttribute::NewL(); + + iAttributeManager = &(iContactManager->ContactAttributeManagerL()); + + iThumbNailFieldType = iContactManager->FieldTypes().Find( R_VPBK_FIELD_TYPE_THUMBNAILPIC ); + iImageManager = CPbk2ImageManager::NewL(*iContactManager); + iContactLinkArray = NULL; + iServiceHandler = CAiwServiceHandler::NewL(); + iServiceHandler->AttachL( R_SPEEDDIAL_EMAIL_SELECTION_INTEREST ); + iServiceHandler->AttachL( R_SPDIA_SINGLE_ASSIGN_INTEREST ); + iWait = new( ELeave )CActiveSchedulerWait(); + + + iError = KErrNone; + + MVPbkContactStoreList& storeList = iContactManager->ContactStoresL(); + for(TInt count=0;countGet( KVideoMbxSupport, iVmbxsupported ); + + + CRepository* vmbxkey2 = CRepository::NewL( KCRUidTelVideoMailbox ); + vmbxkey2->Get( KTelVideoMbxKey, iVmbxkeypos ); + delete vmbxkey2; + vmbxkey2 = NULL ; + // Initialize the bmp arrays + InitBmpArray(); +//#ifndef VIDEOMAILBOX_HIDDEN//its shown +if(iVmbxsupported) + { + iType = EVmbx; + } + +else + iType = EVmbx; + iShowAssignCalled = EFalse; + + } + + +// --------------------------------------------------------- +// CSpeedDialPrivate::InitBmpArray +// +// --------------------------------------------------------- +// +void CSpeedDialPrivate::InitBmpArray() +{ + TInt i(0); + + // Possible values for iVmbxkeypos are 1 & 2 + (iVmbxkeypos > 1) ? iVideoMail = 1 : iVideoMail = 0; + + // Initialize grid bitmaps + for (i = 0; i < 9; i++ ) + { + // EMbmSpdctrlQgn_graf_quick_one + if (0 == i) + { + + #ifdef __SCALABLE_ICONS + iDialBmp[0] = EMbmSpdctrlQgn_menu_smsvo; + iDialBmpMask[0] = EMbmSpdctrlQgn_menu_smsvo_mask; + + iDialHindiBmp[0] = EMbmSpdctrlQgn_menu_smsvo; + iDialHindiBmpMask[0] = EMbmSpdctrlQgn_menu_smsvo_mask; + #else + iDialBmp[0] = EMbmSpdctrlQgn_menu_smsvo_lst; + iDialBmp[0] = EMbmSpdctrlQgn_menu_smsvo_lst_mask; + + iDialHindiBmp[0] = EMbmSpdctrlQgn_menu_smsvo_lst; + iDialHindiBmpMask[0] = EMbmSpdctrlQgn_menu_smsvo_lst_mask; + #endif + + continue; + } + + // EMbmSpdctrlQgn_graf_quick_two + if (1 == i) + { + // If Video Mailbox is via key2, then update with corresponding icons + // in the 2nd location of the grid. + if ((0 < iVideoMail) &&(iVmbxsupported)) + { + iDialBmp[1] = EMbmSpdctrlQgn_prop_video_mb; + iDialBmpMask[1] = EMbmSpdctrlQgn_prop_video_mb_mask; + + iDialHindiBmp[1] = EMbmSpdctrlQgn_prop_video_mb; + iDialHindiBmpMask[1] = EMbmSpdctrlQgn_prop_video_mb_mask; + } + // (else) VideoMailbox is via key 0 + else + { + iDialBmp[1] = EMbmSpdctrlQgn_graf_quick_two; + iDialBmpMask[1] = EMbmSpdctrlQgn_graf_quick_two_mask; + + iDialHindiBmp[1] = EMbmSpdctrlQgn_graf_deva_quick_two; + iDialHindiBmpMask[1] = EMbmSpdctrlQgn_graf_deva_quick_two_mask; + } + + continue; + } + + iDialBmp[i] = EMbmSpdctrlQgn_menu_smsvo + (2 * i); + iDialBmpMask[i] = EMbmSpdctrlQgn_menu_smsvo + (2 * i) + 1; + + iDialHindiBmp[i] = EMbmSpdctrlQgn_graf_deva_quick_one + (2 * i); + iDialHindiBmpMask[i]= EMbmSpdctrlQgn_graf_deva_quick_one + (2 * i) + 1; + } + +} + +// --------------------------------------------------------- +// CSpeedDialPrivate::~CSpeedDialPrivate +// +// --------------------------------------------------------- +// + EXPORT_C CSpeedDialPrivate::~CSpeedDialPrivate() + { + + //delete iThumbFactory; + delete iShadowLayout; + + if (iGridUsed == EGridNoUse) + { + if (iIconArray) + { + iIconArray->ResetAndDestroy(); + delete iIconArray; + } + } + + ResetArray(); + delete iSdmArray; + + + if (iCoeEnv != NULL) + { + iCoeEnv->DeleteResourceFile(iFileOffset); + } + delete iBgContext; + + if(iDialSkinBmp != NULL) + { + iDialSkinBmp->Close(); + delete iDialSkinBmp; + } + + + if(iSkinIcons != NULL) + { + iSkinIcons->Close(); + delete iSkinIcons; + } + + TRAP_IGNORE( + { + MVPbkContactStoreList& storeList = iContactManager->ContactStoresL(); + + for(TInt count=0;countAppend(KAknsIIDQgnMenuSmsvoLst); + iDialSkinBmp->Append(KAknsIIDQgnGrafQuickTwo); + iDialSkinBmp->Append(KAknsIIDQgnGrafQuickThree); + iDialSkinBmp->Append(KAknsIIDQgnGrafQuickFour); + iDialSkinBmp->Append(KAknsIIDQgnGrafQuickFive); + iDialSkinBmp->Append(KAknsIIDQgnGrafQuickSix); + iDialSkinBmp->Append(KAknsIIDQgnGrafQuickSeven); + iDialSkinBmp->Append(KAknsIIDQgnGrafQuickEight); + iDialSkinBmp->Append(KAknsIIDQgnGrafQuickNine); + + iSkinIcons->Append(KAknsIIDQgnPropNrtypPhone); + iSkinIcons->Append(KAknsIIDQgnPropNrtypHome); + iSkinIcons->Append(KAknsIIDQgnPropNrtypWork); + iSkinIcons->Append(KAknsIIDQgnPropNrtypMobile); + iSkinIcons->Append(KAknsIIDQgnPropNrtypVideo); + iSkinIcons->Append(KAknsIIDQgnPropNrtypFax); + iSkinIcons->Append(KAknsIIDQgnPropNrtypPager); + if ( FeatureManager::FeatureSupported( KFeatureIdCommonVoip ) ) + { + iSkinIcons->Append( KAknsIIDQgnPropNrtypVoip ); + } + iSkinIcons->Append(KAknsIIDQgnPropNrtypEmail); + iSkinIcons->Append(KAknsIIDQgnPropNrtypAddress); + } + +// --------------------------------------------------------- +// CSpeedDialPrivate::ResetArray +// +// --------------------------------------------------------- +// + void CSpeedDialPrivate::ResetArray() + { + TInt index(0); + if(iSdmArray!= NULL) + { + + + for (index = 0; index < iSdmArray->Count(); index++) + { + (*iSdmArray)[index].Reset(); + (*iSdmArray)[index].SetIndex(index); + } + } + } + +// --------------------------------------------------------- +// CSpeedDialPrivate::CreateFieldIconsL +// +// --------------------------------------------------------- +// + void CSpeedDialPrivate::CreateFieldIconsL(CArrayPtrFlat* aArray) + { + TInt arraySize = sizeof KFieldIds / sizeof KFieldIds[0]; + TInt count =0; + const MVPbkFieldType* fieldType = NULL; + CGulIcon* icon = NULL; + + CVPbkFieldTypeRefsList* fieldTypeList = CVPbkFieldTypeRefsList::NewL(); + CPbk2IconFactory* pbk2IconFactory = CPbk2IconFactory::NewL(); + + + for(count =0; count < arraySize; ++count) + { + fieldType = iContactManager->FieldTypes().Find( KFieldIds[count] ); + fieldTypeList->AppendL(*fieldType); + } + + MPbk2FieldPropertyArray* aPropertyArray = Pbk2FieldPropertiesFactory::CreateLC(*fieldTypeList,&iContactManager->FsSession() ); + + for(count =0; count < aPropertyArray->Count(); ++ count) + { + icon = pbk2IconFactory->CreateIconL(aPropertyArray->At(count).IconId()); + aArray->AppendL(icon); + } + + CleanupStack::PopAndDestroy(aPropertyArray); + + delete fieldTypeList; + delete pbk2IconFactory; + + + } +// --------------------------------------------------------- +// CSpeedDialPrivate::VoiceMailL +// +// --------------------------------------------------------- +// +EXPORT_C TBool CSpeedDialPrivate::VoiceMailL(TDes& aNumber) + { + TBool result(ETrue); + + RVmbxNumber vmbx; + CleanupClosePushL(vmbx); // So that Close() is called if a leave happens. + if (vmbx.Open() == KErrNone) + { + TInt err2 = vmbx.GetVideoMbxNumber( aNumber ); + + + if( iVmbxsupported ) + { + TInt err1 = vmbx.GetVmbxNumber( aNumber ); + TInt err2 = vmbx.GetVideoMbxNumber( aNumber ); + + if ( ( err1 == KErrNotFound || err1 == KErrNotSupported ) && + ( err2 == KErrNotFound || err2 == KErrNotSupported )) + { + iType = vmbx.SelectTypeL( EVmbxDefine ); + } + else + { + iType = vmbx.SelectTypeL( EVmbxCall ); + } + + if( iType == EVmbxIP && !vmbx.IsVoIPProfilesFound() ) + { + TInt err(vmbx.GetVmbxAddressL(aNumber)); + if (err != KErrNone) + { + aNumber.Zero(); + if (err != KErrNotFound || + !vmbx.QueryAddressL(EVmbxNotDefinedQuery, aNumber)) + { + result = EFalse; + } + } + } + else if( iType == EVmbxVideo ) + { + TInt err(vmbx.GetVideoMbxNumber(aNumber)); + if (err != KErrNone) + { + aNumber.Zero(); + if (err != KErrNotFound ||!vmbx.QueryVideoMbxNumberL(EVmbxNotDefinedQuery, aNumber)) + { + result = EFalse; + } + } + } + else if(iType ==EVmbx) + { + TInt err(vmbx.GetVmbxNumber(aNumber)); + if (err != KErrNone) + { + aNumber.Zero(); + if (err != KErrNotFound || + !vmbx.QueryNumberL(EVmbxNotDefinedQuery, aNumber)) + { + result = EFalse; + } + } + } + else + { + result = EFalse; + } + } + else + { + ExVoiceMailL(aNumber); + + } + + } + CleanupStack::PopAndDestroy(); // It will call vmbx.Close() + return result; + } + +// --------------------------------------------------------- +// CSpeedDialPrivate::ExVoiceMailL +// +// --------------------------------------------------------- +// +EXPORT_C TBool CSpeedDialPrivate::ExVoiceMailL(TDes& aNumber) + { + TBool result(ETrue); + RVmbxNumber vmbx; + CleanupClosePushL(vmbx); // So that Close() is called if a leave happens. + + if (vmbx.Open() == KErrNone) + { + + + if( !vmbx.IsVoIPProfilesFound() && vmbx.SelectTypeL( EVmbxCall ) ) + { + iType = ETrue; + TInt err(vmbx.GetVmbxAddressL(aNumber)); + if (err != KErrNone) + { + if (err != KErrNotFound || + !vmbx.QueryAddressL(EVmbxNotDefinedQuery, aNumber)) + { + result = EFalse; + } + } + } + else + { + iType = EFalse; + TInt err(vmbx.GetVmbxNumber(aNumber)); + if (err != KErrNone) + { + if (err != KErrNotFound || + !vmbx.QueryNumberL(EVmbxNotDefinedQuery, aNumber)) + { + result = EFalse; + } + } + } + + } + CleanupStack::PopAndDestroy(); // It will call vmbx.Close() + return result; + } + + +// --------------------------------------------------------- +// CSpeedDialPrivate::ExVideoMailL +// +// --------------------------------------------------------- +// + + EXPORT_C TBool CSpeedDialPrivate::ExVideoMailL(TDes& aNumber) + { + //TInt iVmbxsupported(0); + + TBool result(ETrue); + + + RVmbxNumber vmbx; + CleanupClosePushL(vmbx); // So that Close() is called if a leave happens. + + if(vmbx.Open() == KErrNone) + { + + +// if(vmbx.SelectTypeL( EVmbxCall )) + { + + + iType = EVmbxVideo; + + TInt err2 = vmbx.GetVideoMbxNumber( aNumber ); + + +//#ifndef VIDEOMAILBOX_HIDDEN +//ivmbxvariation->Get( KVideoMbxSupport, vmbxsupported ); +if(iVmbxsupported) +{ + + + if (err2 == KErrNotFound) + { + + aNumber.Zero(); + if (err2 != KErrNotFound ||!vmbx.QueryVideoMbxNumberL(EVmbxNotDefinedQuery, aNumber)) + { + result = EFalse; + } + } + else + { + result = ETrue; + } +} +else + //Number is present and can be called + if(err2 != KErrNotFound) + { + result = ETrue; + } + else + { + result = EFalse; + } + + + } +} + CleanupStack::PopAndDestroy(); // It will call vmbx.Close() + return result; + } +// CSpeedDialPrivate::Index +// +// --------------------------------------------------------- +// +EXPORT_C TInt CSpeedDialPrivate::Index(TInt aDial) const + { + return (aDial - 1); + } + +// --------------------------------------------------------- +// CSpeedDialPrivate::IconArray +// An interface for accessing index data array. +// --------------------------------------------------------- +// +EXPORT_C CArrayPtr* CSpeedDialPrivate::IconArray() const + { + return iIconArray; + } + +// --------------------------------------------------------- +// CSpeedDialPrivate::Contact +// --------------------------------------------------------- +// + +EXPORT_C MVPbkStoreContact* CSpeedDialPrivate::Contact(TInt aIndex) +{ + return (*iSdmArray)[aIndex].Contact(); +} + +// --------------------------------------------------------- +// CSpeedDialPrivate::Number +// An interface for accessing index data array +// --------------------------------------------------------- +// +EXPORT_C TInt CSpeedDialPrivate::Number(TInt aIndex) const + { + return (aIndex + 1); + } + +// --------------------------------------------------------- +// CSpeedDialPrivate::PhoneNumber +// An interface for accessing index data array. +// --------------------------------------------------------- +// +EXPORT_C const TDesC& CSpeedDialPrivate::PhoneNumber(TInt aIndex) const + { + return (*iSdmArray)[aIndex].PhoneNumber(); + } + +// --------------------------------------------------------- +// CSpeedDialPrivate::ThumbIndex +// An interface for accessing index data array. +// --------------------------------------------------------- +// +EXPORT_C TInt CSpeedDialPrivate::ThumbIndex(TInt aIndex) const + { + return (*iSdmArray)[aIndex].ThumbIndex(); + } + +// --------------------------------------------------------- +// CSpeedDialPrivate::CreateGridDataL +// +// --------------------------------------------------------- +// +EXPORT_C TBool CSpeedDialPrivate::CreateGridDataL( + CAknGrid* aGrid, TBool aIndex ) + { + iGrid = aGrid; + if ( iGridUsed == EGridNoUse ) + { + iGridUsed = EGridUse; + } + + // The specified index is updated. + if ( ( aIndex >= 0 ) && ( aIndex <= KMaxIndex ) ) + { + return UpdateIndexDataL( aIndex ); + } + + CDesCArray* array = STATIC_CAST( CDesCArray*, aGrid->Model()->ItemTextArray() ); + if ( aIndex == KNullIndexData ) + { + InitIndexDataL(); + } + TInt thumbCount = SetIconArrayL( iIconArray ); + if ( thumbCount > 0 ) + { + SetOperationsL(); + } + + TKeyArrayFix key( TSpdiaIndexDataVPbk::OffsetValue( TSpdiaIndexDataVPbk::EIndex ), ECmpTInt ); + iSdmArray->Sort( key ); + + CFormattedCellListBoxData* list = aGrid->ItemDrawer()->FormattedCellData(); + if ( list->IconArray() == NULL ) + { + aGrid->ItemDrawer()->FormattedCellData()->SetIconArrayL( iIconArray ); + } + + if ( thumbCount == 0 || State() != STATE_ASSIGN ) + { + // fill number icon, avoid flicker + array->Reset(); + SetItemDataL( *array ); + if ( thumbCount == 0 ) + DrawNow(); + } + return ETrue; + + } + +// --------------------------------------------------------- +// CSpdiaContainer::SetLayout +// +// --------------------------------------------------------- +// +EXPORT_C void CSpeedDialPrivate::SetLayout(const TRect& aRect) + { + //Scalable UI. + if(AknLayoutUtils::ScalableLayoutInterfaceAvailable() ) + { + TRect mainPaneRect ; + TRect statusPaneRect; + TAknLayoutRect mainQdialRect; + TAknLayoutRect gridQdialPaneRect; + TAknLayoutRect cellQdialPaneRect; + TAknWindowLineLayout cellQdialPane; + TInt varient =0; + + if (Layout_Meta_Data::IsLandscapeOrientation()) + { + AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane,mainPaneRect); + AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EStatusPane,statusPaneRect); + mainPaneRect.iTl = statusPaneRect.iTl; + mainPaneRect.iBr.iY = mainPaneRect.iBr.iY - statusPaneRect.iTl.iY; + varient =1; + } + else + { + AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane,mainPaneRect); + AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EStatusPane,statusPaneRect); + mainPaneRect.iTl= statusPaneRect.iTl; + } + + SetRect(mainPaneRect); + + mainQdialRect.LayoutRect(mainPaneRect,AknLayoutScalable_Apps::main_qdial_pane().LayoutLine()); + gridQdialPaneRect.LayoutRect(mainQdialRect.Rect(),AknLayoutScalable_Apps::grid_qdial_pane().LayoutLine()); + cellQdialPaneRect.LayoutRect(gridQdialPaneRect.Rect(),AknLayoutScalable_Apps::cell_qdial_pane(0,0).LayoutLine()); + cellQdialPane = AknLayoutScalable_Apps::cell_qdial_pane_g4(varient).LayoutLine(); + + TInt Cnt = 0; + + for(TInt rowSize=0;rowSize < 3; rowSize++) + { + for(TInt column=0;column < 3; column++) + { + icellLayout[Cnt].LayoutRect(gridQdialPaneRect.Rect(),AknLayoutScalable_Apps::cell_qdial_pane(column,rowSize).LayoutLine()); + Cnt ++ ; + } + + } + + + (*iShadowLayout)[CSpdiaGridVPbk::EtnCIF].LayoutRect(cellQdialPaneRect.Rect(),cellQdialPane); + + (*iShadowLayout)[CSpdiaGridVPbk::EtnVGA90].LayoutRect(cellQdialPaneRect.Rect(),cellQdialPane); + + (*iShadowLayout)[CSpdiaGridVPbk::EtnVGA].LayoutRect(cellQdialPaneRect.Rect(),cellQdialPane); + + (*iShadowLayout)[CSpdiaGridVPbk::EtnCOM].LayoutRect(cellQdialPaneRect.Rect(),cellQdialPane); + + + } + else + { + TAknWindowLineLayout lScr = AknLayout::screen(); + TAknWindowLineLayout lCtrlPane = AknLayout::control_pane(TRect( TPoint(lScr.il, lScr.it), TSize(lScr.iW, lScr.iH) )); + SetRect(TRect( TPoint(lScr.il, lScr.it), TSize(lScr.iW, lScr.iH - lCtrlPane.iH) ) ); + + (*iShadowLayout)[CSpdiaGridVPbk::EtnCIF90].LayoutRect(aRect,AppLayout::Cell_pane_elements__qdial__Line_1()); + (*iShadowLayout)[CSpdiaGridVPbk::EtnCIF].LayoutRect(aRect,AppLayout::Cell_pane_elements__qdial__Line_4()); + (*iShadowLayout)[CSpdiaGridVPbk::EtnVGA90].LayoutRect(aRect,AppLayout::Cell_pane_elements__qdial__Line_7()); + (*iShadowLayout)[CSpdiaGridVPbk::EtnVGA].LayoutRect(aRect,AppLayout::Cell_pane_elements__qdial__Line_10()); + (*iShadowLayout)[CSpdiaGridVPbk::EtnCOM].LayoutRect(aRect,AppLayout::Cell_pane_elements__qdial__Line_13()); + } + } + + +// --------------------------------------------------------- +// CSpeedDialPrivate::VMBoxPosition +// +// --------------------------------------------------------- +// +EXPORT_C TInt CSpeedDialPrivate::VMBoxPosition() const + { + return KVoiceMail; + } + +// --------------------------------------------------------- +// CSpeedDialPrivate::VdoMBoxPosition +// +// --------------------------------------------------------- +// +EXPORT_C TInt CSpeedDialPrivate::VdoMBoxPosition() const + { + if ( !iVmbxsupported ) + { + // Video Mailbox feature is disabled + return KErrNone; + } + + if ( iVmbxkeypos ) + { + return iVmbxkeypos - 1; + } + + return KErrNone; + } +//CSpeedDialPrivate::SpdIconIndex +// An interface for accessing index data array. +// --------------------------------------------------------- +// +EXPORT_C TInt CSpeedDialPrivate::SpdIconIndex(TInt aIndex) const + { + return (*iSdmArray)[aIndex].IconIndex(); + } + + +// --------------------------------------------------------- +// CSpeedDialPrivate::DeleteIconArray +// Deletes the old icons. +// --------------------------------------------------------- +EXPORT_C void CSpeedDialPrivate::DeleteIconArray() + { + if(iIconArray) + { + iIconArray->ResetAndDestroy(); + delete iIconArray; + iIconArray = NULL; + } + } + +// --------------------------------------------------------- +// CSpeedDialPrivate::ReloadIconArray +// Reloads the new skin icons. +// --------------------------------------------------------- +EXPORT_C void CSpeedDialPrivate::ReloadIconArray() +{ + TRAPD(err, + { + if (iGrid) + { + if(NULL == iIconArray) + { + iIconArray = new (ELeave)CAknIconArray(iSdmCount); + } + + if ( SetIconArrayL( iIconArray ) > 0 ) + { + SetOperationsL(); + } + + iGrid->ItemDrawer()->FormattedCellData()->SetIconArrayL( iIconArray ); + } + }); + + //Just to avoid warning.. + if(err) + { + + } +} + +// --------------------------------------------------------- +// CSpeedDialPrivate::SetIconArrayL +// +// --------------------------------------------------------- +TInt CSpeedDialPrivate::SetIconArrayL(CArrayPtrFlat* aArray) + { + CFbsBitmap* bitmap,*mask; + bitmap = NULL; + mask= NULL; + MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance(); + + if ( aArray != NULL ) + { + aArray->ResetAndDestroy(); + } + else + { + return 0; + } + + TInt existThumb(0); + for (TInt index(0); index < iSdmArray->Count(); index++) + { + if(index == 0) + { + TUid uidVmbx; + uidVmbx.iUid =KVmbxUid; + AknsUtils::CreateAppIconLC( skinInstance,uidVmbx, EAknsAppIconTypeContext,bitmap ,mask); + CleanupStack::Pop(2); + } + else + { + if(User::Language() == ELangHindi) + { + AknsUtils::CreateIconL(skinInstance, (*iDialSkinBmp)[index],bitmap,mask,iBmpPath,iDialHindiBmp[index], iDialHindiBmpMask[index] ); + } + else + { + AknsUtils::CreateIconL(skinInstance, (*iDialSkinBmp)[index],bitmap,mask,iBmpPath,iDialBmp[index], iDialBmpMask[index] ); + } + } + CGulIcon* icon = CGulIcon::NewL(bitmap,mask); + CleanupStack::PushL(icon); + aArray->AppendL(icon); + + if (CreateIndexIconL(index, + (*iSdmArray)[index], existThumb > 0? EFalse: ETrue)) + { + ++existThumb; + } + CleanupStack::Pop(); // icon + } + + CreateFieldIconsL(aArray); + + return existThumb; + } + + +// --------------------------------------------------------- +// CSpeedDialPrivate::VoiceMailTypeL +// +// --------------------------------------------------------- +// +EXPORT_C TInt CSpeedDialPrivate::VoiceMailType() + { + return iType; + } + +// --------------------------------------------------------- +// CSpeedDialPrivate::GetSpdCtrlLastError() +// retuns last error +// --------------------------------------------------------- +// +EXPORT_C TInt CSpeedDialPrivate::GetSpdCtrlLastError() + { + return iError; + } + +// --------------------------------------------------------- +// CSpdiaContainer::Draw +// +// --------------------------------------------------------- +// +void CSpeedDialPrivate::Draw(const TRect& /*aRect*/) const + { + CWindowGc& gc = SystemGc(); + AknsDrawUtils::Background( + AknsUtils::SkinInstance(), + AknsDrawUtils::ControlContext(this), + this, + gc, + Rect() ); + } + +// --------------------------------------------------------- +// CSpeedDialPrivate::SizeChanged() +// +// --------------------------------------------------------- +// +void CSpeedDialPrivate::SizeChanged() +{ + iBgContext->SetRect( Rect() ); +} + +// --------------------------------------------------------- +// CSpeedDialPrivate::MopSupplyObject() +// Pass skin information if need. +// --------------------------------------------------------- +// +TTypeUid::Ptr CSpeedDialPrivate::MopSupplyObject(TTypeUid aId) +{ + if(aId.iUid == MAknsControlContext::ETypeId) + { + return MAknsControlContext::SupplyMopObject( aId, iBgContext ); + } + return CCoeControl::MopSupplyObject( aId ); +} + +// --------------------------------------------------------- +// CSpeedDialPrivate::NumberType +// An interface for accessing phone number type. +// Number types are defined in PbkFields.hrh. +// --------------------------------------------------------- +// +EXPORT_C TInt CSpeedDialPrivate::NumberType(TInt aIndex) const +{ + TInt retVal = ESpDialPbkFieldIdNone; + TInt fieldId = -1; + MVPbkStoreContactField* field = (*iSdmArray)[aIndex].Field(); + + if(field) + { + fieldId = field->BestMatchingFieldType()->FieldTypeResId(); + + switch(fieldId) + { + case R_VPBK_FIELD_TYPE_VIDEONUMBERHOME: + case R_VPBK_FIELD_TYPE_VIDEONUMBERWORK: + case R_VPBK_FIELD_TYPE_VIDEONUMBERGEN: + retVal = ESpDialPbkFieldIdPhoneNumberVideo; + break; + case R_VPBK_FIELD_TYPE_VOIPHOME: + case R_VPBK_FIELD_TYPE_VOIPWORK: + case R_VPBK_FIELD_TYPE_VOIPGEN: + case R_VPBK_FIELD_TYPE_IMPP: + retVal = ESpDialPbkFieldIdVOIP; + break; + default: + retVal = ESpDialPbkFieldIdPhoneGeneral; + } + } + return retVal; +} + +// --------------------------------------------------------- +// CSpeedDialPrivate::DrawShadow +// +// --------------------------------------------------------- +// +void CSpeedDialPrivate::DrawShadow(CWindowGc& aGc) const + { + //TSize size(cell_spdia_item_w, cell_spdia_item_h); + //Scalable UI. + TAknWindowLineLayout area; + if( AknLayoutUtils::ScalableLayoutInterfaceAvailable() ) + { + area = AknLayoutScalable_Apps::cell_qdial_pane(0,0).LayoutLine(); + } + else + { + area = AppLayout::cell_qdial_pane(0,0); + } + + TSize size(area.iW, area.iH); + aGc.SetPenColor(AKN_LAF_COLOR(SDM_TN_SHADOW_COROL)); + TInt count(iSdmArray->Count()); + //TRect rect(TPoint(spdia_main_pane_grid_l, spdia_main_pane_grid_t), size); + //Scalable UI + if( AknLayoutUtils::ScalableLayoutInterfaceAvailable() ) + { + area = AknLayoutScalable_Apps::grid_qdial_pane().LayoutLine(); + } + else + { + area = AppLayout::Speed_Dial_descendants_Line_1(); + } + TRect rect(TPoint(area.il, area.it), size); + for (TInt i(0); i < count; ++i) + { + if (ThumbIndex(i) >= 0) + { + TInt type(ThumbType(i)); + TRect rc((*iShadowLayout)[type].Rect()); + if (type == CSpdiaGridVPbk::EtnCOM) + { + TSize image(ThumbSize(i)); + image.iWidth = Min(image.iWidth, rc.Width()); + image.iHeight = Min(image.iHeight, rc.Height()); + rc = TRect(TPoint(0,0), image); + // Correct the x and y to the accurate values. + TInt x(Max(0, (size.iWidth - image.iWidth) / 2) + 3); + TInt y(Max(0, (size.iHeight - image.iHeight) / 2) - 2); + rc.Move(x, y); + } + rc.Move(rect.iTl.iX, rect.iTl.iY); + aGc.DrawRect(rc); + } + rect.Move(size.iWidth, 0); + if (((i + 1)/ KCellColCount) * KCellRowCount == i + 1) + { + rect.Move(-(KCellColCount * size.iWidth), size.iHeight); + } + } + } + +// --------------------------------------------------------- +// CSpeedDialPrivate::CheckingIfPopUpNeededL +// Internal rutine to check if pop up has to be shown +// to enable the One-Key-Dialling setting. +// --------------------------------------------------------- +// + +EXPORT_C TBool CSpeedDialPrivate::CheckingIfPopUpNeededL() + { + TBool gridEmpty( ETrue ); + TInt gridIndex( 1 ); + TInt value; + TBool result( ETrue ); + + CRepository* repository = CRepository::NewL( KCRUidTelephonySettings ); + repository->Get( KSettingsOneKeyDialling, value ); + + if ( value == 0 ) + { + while ( ( gridIndex < 9 ) && gridEmpty ) + { + if ( ( *iSdmArray )[ gridIndex ].Contact() != NULL ) + { + gridEmpty = EFalse; + } + ++gridIndex; + } + result = gridEmpty; + } + else + { + result = EFalse; + } + delete repository; + return result; + } + +// --------------------------------------------------------- +// CSpeedDialPrivate::Pbk2ImageGetComplete +// +// --------------------------------------------------------- +// +void CSpeedDialPrivate::Pbk2ImageGetComplete + (MPbk2ImageOperation& aOperation, CFbsBitmap* aBitmap) + { + TRAP_IGNORE(Pbk2ImageGetCompleteL(aOperation, aBitmap)); + } + +// --------------------------------------------------------- +// CSpeedDialPrivate::Pbk2ImageGetCompleteL +// +// --------------------------------------------------------- +// +void CSpeedDialPrivate::Pbk2ImageGetCompleteL + (MPbk2ImageOperation& aOperation, CFbsBitmap* aBitmap) + { + + //for async call + TInt index(HasImageOperation(aOperation)); + + if (index != KNullIndexData) + { + if( AknLayoutUtils::ScalableLayoutInterfaceAvailable() ) + { + CAknIcon* icon = CAknIcon::NewL(); + icon->SetBitmap(aBitmap); + + // create mask + CFbsBitmap* mask = new (ELeave) CFbsBitmap(); + + TSize size = aBitmap->SizeInPixels(); + mask->Create(size,EGray2); + + CFbsBitGc* fbsBitGc = CFbsBitGc::NewL(); + CleanupStack::PushL( fbsBitGc ); + CFbsBitmapDevice* bmpDevice = CFbsBitmapDevice::NewL( mask ); + CleanupStack::PushL( bmpDevice ); + bmpDevice->Resize( size ); + fbsBitGc->Activate( bmpDevice ); + + fbsBitGc->SetPenStyle(CGraphicsContext::ENullPen); + fbsBitGc->SetBrushStyle(CGraphicsContext::ESolidBrush); + + fbsBitGc->SetBrushColor(KRgbBlack); + fbsBitGc->DrawRect( TRect( size ) ); + + CleanupStack::PopAndDestroy( 2, fbsBitGc ); // bmpDevice and fbsBitGc + + icon->SetMask(mask); + + // this creates both scalable icon and mask + CAknIcon* scaledIcon = AknIconUtils::CreateIconL(icon); + + TSize thumbnailSize = GetThumbnailSize(); + + AknIconUtils::SetSize(scaledIcon->Bitmap(),thumbnailSize,EAspectRatioPreservedAndUnusedSpaceRemoved); + AknIconUtils::SetSize(scaledIcon->Mask(),thumbnailSize,EAspectRatioPreservedAndUnusedSpaceRemoved); + + CFbsBitmap* bmp = new (ELeave) CFbsBitmap(); + CFbsBitmap* msk = new (ELeave) CFbsBitmap(); + TInt err = msk->Duplicate( scaledIcon->Mask()->Handle() ); + TInt err1 = bmp->Duplicate( scaledIcon->Bitmap()->Handle() ); + + delete ( *iIconArray )[index]; + ( *iIconArray )[index] = NULL; + ( *iIconArray )[index] = CGulIcon::NewL( bmp, msk ); + // set the text array of grid + ( *iSdmArray )[index].SetThumbIndex( index, bmp ); + delete scaledIcon; + } + + else + { + // set the scaled bitmap to the array of icons + delete ( *iIconArray )[index]; + ( *iIconArray )[index] = NULL; + ( *iIconArray )[index] = CGulIcon::NewL( aBitmap ); + // set the text array of grid + ( *iSdmArray )[index].SetThumbIndex( index, aBitmap ); + } + + if ( ( *iSdmArray )[index].LastThumb() ) + { + CDesCArray* array = STATIC_CAST( CDesCArray*, iGrid->Model()->ItemTextArray() ); + array->Reset(); + SetItemDataL( *array ); + DrawNow(); + } + delete &aOperation; + ( *iSdmArray )[index].SetImageOperation( NULL ); + } + + iOperationComplete = ETrue; + Release(); + } + + +// --------------------------------------------------------- +// CSpeedDialPrivate::Pbk2ImageGetFailed +// +// --------------------------------------------------------- +// +void CSpeedDialPrivate::Pbk2ImageGetFailed + ( MPbk2ImageOperation& aOperation, + TInt aError ) + { + iError = aError; + TInt index( HasImageOperation( aOperation ) ); + if ( index != KNullIndexData ) + { + delete &aOperation; + ( *iSdmArray )[index].SetImageOperation( NULL ); + if ( ( *iSdmArray )[index].LastThumb() ) + { + CDesCArray* array = STATIC_CAST( CDesCArray*, iGrid->Model()->ItemTextArray() ); + array->Reset(); + TRAP_IGNORE( SetItemDataL( *array ) ); + DrawNow(); + } + } + iOperationComplete = ETrue; + Release(); + } + + +// --------------------------------------------------------- +// CSpeedDialPrivate::HasImageOperation +// +// --------------------------------------------------------- +// +TInt CSpeedDialPrivate::HasImageOperation(MPbk2ImageOperation& aOperation) +{ + TInt index = KNullIndexData; + for(TInt count =0; count < iSdmArray->Count() && index == KNullIndexData; ++count) + { + if ((*iSdmArray)[count].ImageOperation() == &aOperation) + { + index = count; + } + } + return index; +} + +// --------------------------------------------------------- +// CSpeedDialPrivate::SetDetails +// +// --------------------------------------------------------- +// +void CSpeedDialPrivate::SetDetails(TInt aIndex) +{ + MVPbkStoreContactField* field = (*iSdmArray)[aIndex].Field(); + + if(field != NULL) + { + HBufC* number = NULL; + TRAP_IGNORE( + { + TVPbkFieldStorageType dataType = field->FieldData().DataType(); + + switch( dataType ) + { + case EVPbkFieldStorageTypeText: + { + const MVPbkContactFieldTextData& data = MVPbkContactFieldTextData::Cast( field->FieldData() ); + number = data.Text().AllocLC(); + break; + } + case EVPbkFieldStorageTypeUri: + { + const MVPbkContactFieldUriData& data = MVPbkContactFieldUriData::Cast( field->FieldData() ); + number = data.Text().AllocLC(); + break; + } + } + + if (number != NULL) + { + //store the phone numbers in a array and cast those to TPhCltTelephoneNumber. + (*iSdmArray)[aIndex].SetPhoneNumber(*number); + CleanupStack::PopAndDestroy( number ); + } + + //Push + const MVPbkFieldType* fieldType = field->BestMatchingFieldType(); + TInt iconindex = FindIconIndex(fieldType->FieldTypeResId()); + (*iSdmArray)[aIndex].SetIconIndex(iconindex); + + //No need to fetch thumbnail now...will be updated while grid is + // drawn + (*iSdmArray)[aIndex].SetThumbIndex(-1,NULL); + } + ); + } + +} +// --------------------------------------------------------- +// CSpeedDialPrivate::AttributeOperationComplete +// +// --------------------------------------------------------- +// + +void CSpeedDialPrivate::AttributeOperationComplete( MVPbkContactOperationBase& aOperation) +{ + + TInt index = HasOperation(&aOperation); + + //for async call + if (index != KNullIndexData) + { + TSpdiaIndexDataVPbk::TOperation operation = (*iSdmArray)[index].Operation(); + //MVPbkStoreContactField* field = (*iSdmArray)[index].Field(); + + switch(operation) + { + case TSpdiaIndexDataVPbk::OPERATION_ASSIGN: + + TRAPD(err, + { + + HBufC* prompt = StringLoader::LoadLC(R_SPDIA_TEXT_KEY_ASSIGNED, index+1, iCoeEnv); + CAknConfirmationNote* note = new (ELeave)CAknConfirmationNote(); + note->ExecuteLD(*prompt); + + CleanupStack::PopAndDestroy(prompt); + }); + if(err == KErrNone) + { + SetDetails(index); + } + + break; + + case TSpdiaIndexDataVPbk::OPERATION_REMOVE: + (*iSdmArray)[index].Reset(); + + break; + + case TSpdiaIndexDataVPbk::OPERATION_NONE: + + //Error Handling + + break; + + + } + + iOperationComplete = ETrue; + Release(); + + } + + // CleanupStack::PopAndDestroy(); +} + +// --------------------------------------------------------- +// CSpeedDialPrivate::AttributeOperationFailed +// +// --------------------------------------------------------- +// +void CSpeedDialPrivate::AttributeOperationFailed(MVPbkContactOperationBase& aOperation, TInt aError) +{ + + TInt index(HasOperation(&aOperation)); + + if (index != KNullIndexData) + { + TSpdiaIndexDataVPbk::TOperation operation = (*iSdmArray)[index].Operation(); + + switch(operation) + { + case TSpdiaIndexDataVPbk::OPERATION_ASSIGN: + (*iSdmArray)[index].Reset(); + break; + + case TSpdiaIndexDataVPbk::OPERATION_REMOVE: + (*iSdmArray)[index].Reset(); + break; + + default: + delete &aOperation; + } + iError = aError; + iOperationComplete = ETrue; + Release(); + + } + + +} + + +// --------------------------------------------------------- +// CSpeedDialPrivate::HasOperation +// +// --------------------------------------------------------- +// +TInt CSpeedDialPrivate::HasOperation(MVPbkContactOperationBase* aContactOpertion) +{ + TInt i=0, index = KNullIndexData; + for(i=0;iCount() && index == KNullIndexData;++i) + { + if ((*iSdmArray)[i].HasOperation(aContactOpertion)) + { + index =i; + } + } + + return index; +} + + +// --------------------------------------------------------- +// CSpeedDialPrivate::EMail +// +// --------------------------------------------------------- +// +EXPORT_C HBufC* CSpeedDialPrivate::EMail( MVPbkStoreContact* aContact ) + { + + TUint fetchFlags = 0; + iMail = NULL; + iFetchmail = ETrue; + // Set service data + TAiwSingleItemSelectionDataV3 data; + + data.SetFlags(fetchFlags); + data.SetCommAddressSelectType(EAiwCommEmailEditor); + TRAP_IGNORE( + { + CAiwGenericParamList& inParamList = iServiceHandler->InParamListL(); + inParamList.AppendL(TAiwGenericParam(EGenericParamContactSelectionData, + TAiwVariant(TAiwSingleItemSelectionDataV3Pckg(data)))); + + MVPbkContactLinkArray* linkArray = NULL; + CVPbkContactLinkArray* array = CVPbkContactLinkArray::NewLC(); + MVPbkContactLink* ContactLink = aContact->CreateLinkLC(); + CleanupStack::Pop(); + array->AppendL(ContactLink); + linkArray = array; + + HBufC8* PackLink = linkArray->PackLC(); + inParamList.AppendL(TAiwGenericParam(EGenericParamContactLinkArray, + TAiwVariant(*PackLink))); + CleanupStack::PopAndDestroy();//PackLink + CleanupStack::PopAndDestroy();//linkArray + CAiwGenericParamList& outParamList = iServiceHandler->OutParamListL(); + iServiceHandler->ExecuteServiceCmdL(KAiwCmdSelect, inParamList, + outParamList, 0, this); + } + ); + iOperationComplete = EFalse; + // Wait till the contact is selected + while ( !iOperationComplete ) + { + Wait(); + } + iFetchmail = EFalse; + return iMail; + } + +// --------------------------------------------------------- +// CSpeedDialPrivate::SetSpeedDialIndexL +// +// --------------------------------------------------------- +// +void CSpeedDialPrivate::SetSpeedDialIndexL(MVPbkStoreContact* aContact) +{ + TInt count =0; + TInt index = KNullIndexData; + + // Do a linear search to find which is the speeddial index + // stored in this field. + for(count =0; countSetIndex(count+1); + + //If the index is not assigned already.. + if((*iSdmArray)[count].Contact() == NULL) + { + MVPbkStoreContactFieldCollection* fieldCollection = iAttributeManager->FindFieldsWithAttributeLC( + *(iSpeedDial), *aContact); + if(fieldCollection && (fieldCollection->FieldCount() > 0)) + { + index = count; + + MVPbkStoreContactField& field = fieldCollection->FieldAt(0); + + (*iSdmArray)[index].SetContactLink(field.CreateLinkLC()); + (*iSdmArray)[index].SetContact(aContact); + CleanupStack::Pop(); + + TVPbkFieldStorageType dataType = field.FieldData().DataType(); + HBufC* number = NULL; + switch( dataType ) + { + case EVPbkFieldStorageTypeText: + { + const MVPbkContactFieldTextData& data = MVPbkContactFieldTextData::Cast( field.FieldData() ); + number = data.Text().AllocLC(); + break; + } + case EVPbkFieldStorageTypeUri: + { + const MVPbkContactFieldUriData& data = MVPbkContactFieldUriData::Cast( field.FieldData() ); + number = data.Text().AllocLC(); + break; + } + } + + if ( number != NULL ) + { + TPhCltTelephoneNumber phonenumber(*number); + phonenumber.Trim(); + CleanupStack::PopAndDestroy( number ); + //store the phone numbers in a array and cast those to TPhCltTelephoneNumber. + if(phonenumber.Length() > 0) + { + (*iSdmArray)[index].SetPhoneNumber(phonenumber); + } + } + else + { + //Remove SpeedDial + } + } + + CleanupStack::PopAndDestroy(); // Pop and Destroy FieldCollection + + } + } + //Delete if we are not using that contact.. + if(KNullIndexData == index) + { + delete aContact; + } + +} + +// --------------------------------------------------------- +// CSpeedDialPrivate::VPbkSingleContactOperationComplete() +// +// --------------------------------------------------------- +void CSpeedDialPrivate::VPbkSingleContactOperationComplete( MVPbkContactOperationBase& aOperation, + MVPbkStoreContact* aContact) +{ + + if (iState == STATE_INITIAL) + { + TRAP_IGNORE(SetSpeedDialIndexL(aContact)); + iRetrieveComplete = ETrue; + Release(); + } + else if(iState == STATE_CONTACTCHANGE) + { + iContact = aContact; + iRetrieveComplete = ETrue; + Release(); + } + else + { + + TInt index = HasOperation(&aOperation); + + if (index != KNullIndexData) + { + TSpdiaIndexDataVPbk::TOperation operation = (*iSdmArray)[index].Operation(); + if(TSpdiaIndexDataVPbk::OPERATION_ASSIGN == operation) + { + + // Store the contact and field in corresponding index + (*iSdmArray)[index].SetContact(aContact); + (*iSdmArray)[index].SetContactLink(iContactLink); + iRetrieveComplete = ETrue; + Release(); + + } + else if(TSpdiaIndexDataVPbk::OPERATION_ASSIGN_CONTACT == operation) + { + iSpeedDial->SetIndex(index + 1); + TRAP_IGNORE( + { + MVPbkStoreContactFieldCollection* fieldCollection = iAttributeManager->FindFieldsWithAttributeLC( *( iSpeedDial ), *aContact ); + if ( fieldCollection && ( fieldCollection->FieldCount() > 0 ) ) + { + // update speeddial information + MVPbkStoreContactField& field = fieldCollection->FieldAt( 0 ); + ( *iSdmArray )[ index ].SetContactLink( field.CreateLinkLC() ); + ( *iSdmArray )[ index ].SetContact( aContact ); + CleanupStack::Pop(); + SetDetails( index ); + } + + CleanupStack::PopAndDestroy(); // Pop and Destroy FieldCollection + } + ) + iRetrieveComplete = ETrue; + Release(); + } + //delete &aOperation; + } + } +} + +// --------------------------------------------------------- +// CSpeedDialPrivate::VPbkSingleContactOperationFailed() +// +// --------------------------------------------------------- +void CSpeedDialPrivate::VPbkSingleContactOperationFailed( + MVPbkContactOperationBase& /*aOperation*/, + TInt aError) +{ + iError = aError; + iRetrieveComplete = ETrue; + Release(); + +} + +// --------------------------------------------------------- +// CSpeedDialPrivate::ShowAssignL() +// +// --------------------------------------------------------- +TBool CSpeedDialPrivate::ShowAssignL( MVPbkContactLink& aContactLink, TInt& aIndex ) +{ + TBool aReturn (EFalse); + + TRAPD(err,iGridDlg = CSpdiaGridDlgVPbk::NewL(aIndex, *this)); + + // Execute the CPbkFetchEntryDlg dialog + TInt result(ETrue); + + if(err == KErrNone) + { + TRAPD(error, result = iGridDlg->ExecuteLD(R_SPDIA_GRID_DIALOG)); + iGridDlg = NULL; + iIconArray = NULL; + // Check errors + User::LeaveIfError(error); + } + + + + TBool popUp = ETrue; + + if (iBooleanVarForAddingDialogVariation) + { + if(!CheckingIfPopUpNeededL()) + popUp = EFalse; + } + if (popUp && result && !CheckSpaceBelowCriticalLevelL()) + { + //for contact link + TUint assignFlags = 0; + ExecuteSingleEntryAssignL(aIndex-1,AiwContactAssign:: TAiwContactAttributeAssignDataV1().SetFlags(assignFlags));//amit + aReturn = ETrue; + //return aReturn; + // for contact link + + if((*iSdmArray)[aIndex-1].Contact() != NULL) + { + result = RemoveSpeedDialL(aIndex-1); + } + + //If removal was successful + if(result != EFalse) + { + iRetrieveComplete = EFalse; + if(iContactLink) + { + delete iContactLink; + iContactLink= NULL; + } + iContactLink = aContactLink.CloneLC(); + CleanupStack::Pop(); + + MVPbkContactOperationBase* operation = iContactManager->RetrieveContactL( aContactLink, (*this )); + + if(operation) + { + (*iSdmArray)[aIndex-1].SetOperation(operation,TSpdiaIndexDataVPbk::OPERATION_ASSIGN); + + while (!iRetrieveComplete) + { + Wait(); + } + //If retrieval is successful + if(iError == KErrNone) + { + AssignSpeedDialL(aIndex-1); + aReturn = ETrue; + } + else + { + delete iContactLink; + } + + } + } + + iContactLink = NULL; + } + + return aReturn; +} + +// --------------------------------------------------------- +// CSpeedDialPrivate::ShowAssignL() +// +// --------------------------------------------------------- +TBool CSpeedDialPrivate::ShowAssignL( TInt aIndex, MVPbkContactLink*& aContactLink ) + { + + // Have to display the title of SpeedDial when called + // from SpeedDial application...May be that function can be moved to + // speed dial application... + + TBool result = ETrue; + HBufC* prompt = NULL; + TBuf operatorName; + + aIndex = aIndex-1; + if (iBooleanVarForAddingDialogVariation ) + { + if(iPopupDialog) + { + if(!CheckingIfPopUpNeededL()) + result = EFalse; + } + } + + if ( !CheckSpaceBelowCriticalLevelL() ) + { + if ( iGridUsed == EGridNoUse && (*iSdmArray)[aIndex].Contact() == NULL ) + { + iQueryDialog = CAknQueryDialog::NewL(CAknQueryDialog::ENoTone); + TBool resDialog(EFalse); + TRAPD(error, + resDialog = iQueryDialog->ExecuteLD(R_SPDIA_QUERY_ASSIGN) ); + iQueryDialog = NULL; + User::LeaveIfError(error); + if (!resDialog) + { + result = EFalse; + } + } + + if ( result && (*iSdmArray)[aIndex].Contact() != NULL ) + { + //if(iGridUsed == EGridNoUse)//because grid will be used if you want to replace or change + if ( iGridUsed == EGridUse ) + { + MakeVisible( ETrue ); + result = ETrue; + MakeVisible( EFalse ); + } + } + + if(result) + { + TUint assignFlags = 0; + //assignFlags |= (AiwContactAssign::EUseProviderTitle);//|AiwContactAssign::EDoNotOpenEditor); + CAknTitlePane* title = NULL; + CEikStatusPane *sp = CEikonEnv::Static()->AppUiFactory()->StatusPane(); + title = STATIC_CAST(CAknTitlePane*, sp->ControlL( TUid::Uid(EEikStatusPaneUidTitle) ) ); + prompt = StringLoader::LoadLC(R_QTN_SPDIA_TITLE, iCoeEnv); + operatorName.Copy(*title->Text()); + title->SetTextL(*prompt); + title->MakeVisible(ETrue); + CleanupStack::PopAndDestroy(prompt); + + ExecuteSingleEntryAssignL(aIndex,AiwContactAssign:: TAiwContactAttributeAssignDataV1().SetFlags(assignFlags)); + + if ( iCancelFlag ) + { + iCancelFlag = EFalse; + return result; + } + + if ( iError == KErrNone && iContactLink != NULL ) + { + (*iSdmArray)[aIndex].Reset(); + //Retrieve Contact and assign fields to the index.. + iRetrieveComplete = EFalse; + MVPbkContactOperationBase* operation = iContactManager->RetrieveContactL( *iContactLink, (*this )); + + if(operation) + { + (*iSdmArray)[aIndex].SetOperation(operation,TSpdiaIndexDataVPbk::OPERATION_ASSIGN_CONTACT); + + while (!iRetrieveComplete) + { + Wait(); + } + if ( iError == KErrNone ) + { + result = ETrue; + } + else + { + //We are taking a copy of contact links.. + //If we can't store it, delete the link.. + delete iContactLink; + iContactLink = NULL; + result = EFalse; + } + } + } + + else if( iError == KErrInUse ) + { + ShowNoteL( R_QTN_SPDIA_CONTACT_IN_USE ); + } + + if(iContactLink != NULL) + { + aContactLink = iContactLink->CloneLC(); + CleanupStack::Pop(); + delete iContactLink; + } + else + { + aContactLink = CONST_CAST(MVPbkContactLink*, iContactLink); + } + iContactLink = NULL; + + title->SetTextL( operatorName ); + } + } + + return result; + + } + +// --------------------------------------------------------- +// CSpeedDialPrivate::ShowRemoveL +// +// --------------------------------------------------------- +// +TBool CSpeedDialPrivate::ShowRemoveL( TInt aIndex ) +{ + + TBool aReturn = EFalse; + + if ( (*iSdmArray)[aIndex].Contact()!= NULL ) + { + iState = STATE_REMOVE; + if((*iSdmArray)[aIndex].Field() != NULL) + { + iOperationComplete = EFalse; + iSpeedDial->SetIndex(aIndex+1); + (*iSdmArray)[aIndex].Contact()->LockL(*(this)); + + while(!iOperationComplete) + { + Wait(); + } + + if(iError == KErrNone) + { + + MVPbkStoreContactField* field = (*iSdmArray)[aIndex].Field(); + TPtrC label = field->FieldLabel(); + iOperationComplete = EFalse; + MVPbkContactOperationBase* operation = NULL; + operation = iAttributeManager->RemoveFieldAttributeL( + *field, *iSpeedDial, (*this)); + if(operation) + { + (*iSdmArray)[aIndex].SetOperation(operation,TSpdiaIndexDataVPbk::OPERATION_REMOVE); + + while(!iOperationComplete) + { + Wait(); + } + + } + + //If there are no errors + if(iError == KErrNone) + { + aReturn = ETrue; + } + } + else if( iError == KErrInUse ) + { + // Prompt information note when contact is in use + ShowNoteL( R_QTN_SPDIA_CONTACT_IN_USE ); + } + } + } + + return aReturn; +} + +// --------------------------------------------------------- +// CSpeedDialPrivate::ShowAssign +// Function called when assigning speed dial from phone book +// application +// --------------------------------------------------------- +// +EXPORT_C TInt CSpeedDialPrivate::ShowAssign( MVPbkContactLink& aContactLink, TInt& aIndex ) + { + iError = KErrNone; + iCurrentIndex = aIndex - 1; + + TRAPD( err, ShowAssignL( aContactLink, aIndex ) ); + + if ( err ) + { + iError = err; + } + + iCurrentIndex = -1; + return iError; + } + +// --------------------------------------------------------- +// CSpdiaContainer::ShowAssignL +// Function called when assigning speed dial from SpeedDial and Telephony +// application +// --------------------------------------------------------- +// + +EXPORT_C TInt CSpeedDialPrivate::ShowAssign( TInt aIndex, MVPbkContactLink*& aContactLink ) + { + iError = KErrNone; + if ( !iShowAssignCalled ) + { + iShowAssignCalled = ETrue; + iCurrentIndex = aIndex - 1; + + TRAPD( err, ShowAssignL( aIndex, aContactLink ) ); + + if ( err ) + { + iError = err; + } + iCurrentIndex = -1; + iShowAssignCalled = EFalse; + } + + return iError; + } + +EXPORT_C TInt CSpeedDialPrivate::ShowRemove( TInt aIndex ) + { + iError = KErrNone; + + iCurrentIndex = aIndex; + TInt reValue = ETrue; + TRAP_IGNORE( reValue = ShowRemoveL( aIndex ) ); + + iCurrentIndex = -1; + return reValue; + } + + +// -------------------------------------------------------------------------- +// CSpeedDialPrivate::StoreReady +// +// -------------------------------------------------------------------------- +// +void CSpeedDialPrivate::StoreReady(MVPbkContactStore& /*aContactStore*/) + { + iOperationComplete = ETrue; + Release(); + } + +// -------------------------------------------------------------------------- +// CSpeedDialPrivate::StoreUnavailable +// +// -------------------------------------------------------------------------- +// +void CSpeedDialPrivate::StoreUnavailable + (MVPbkContactStore& /*aContactStore*/, TInt /*aReason*/) + { + iOperationComplete = ETrue; + Release(); + + //iError = aReason; + } + +// -------------------------------------------------------------------------- +// CSpeedDialPrivate::SetState +// +// -------------------------------------------------------------------------- +// +EXPORT_C void CSpeedDialPrivate::SetState(eSpeedDialState aState) +{ + iState = aState; +} + +// -------------------------------------------------------------------------- +// CSpeedDialPrivate::State +// +// -------------------------------------------------------------------------- +// +EXPORT_C CSpeedDialPrivate::eSpeedDialState CSpeedDialPrivate::State() +{ + return iState; +} + +// -------------------------------------------------------------------------- +// CSpeedDialPrivate::GridStatus +// +// -------------------------------------------------------------------------- +// +EXPORT_C CSpeedDialPrivate::TGridUse CSpeedDialPrivate::GridStatus() +{ + return iGridUsed; +} + +// -------------------------------------------------------------------------- +// CSpeedDialPrivate::SetGridStatus +// +// -------------------------------------------------------------------------- +// +EXPORT_C void CSpeedDialPrivate::SetGridStatus(TGridUse aStatus) +{ + iGridUsed = aStatus; +} + +// -------------------------------------------------------------------------- +// CSpeedDialPrivate::HandleStoreEventL +// +// -------------------------------------------------------------------------- +// +void CSpeedDialPrivate::HandleStoreEventL( + MVPbkContactStore& aContactStore, + TVPbkContactStoreEvent aStoreEvent) + { + + MVPbkContactStore* storeInList = iContactManager->ContactStoresL().Find(aContactStore.StoreProperties().Uri()); + + if (storeInList !=NULL) + { + switch(aStoreEvent.iEventType) + { + + case TVPbkContactStoreEvent::EContactChanged: + case TVPbkContactStoreEvent::EContactDeleted: + + if ( iState == STATE_IDLE /*&& iUpdateFlag == EFalse*/ ) + { + + TInt findResult = 0; + findResult = FindInSpeedDialContacts(aStoreEvent.iContactLink); + + if(findResult != EFalse) + { + if (iGridUsed != EGridUse) + { + if ( iRemoveConfirmQueryDialog + && aStoreEvent.iEventType == TVPbkContactStoreEvent:: EContactChanged + && iCurrentIndex == findResult ) + { + delete iRemoveConfirmQueryDialog; + iRemoveConfirmQueryDialog = NULL; + } + iUpdateFlag = ETrue; + // if CSpeedDialPrivate object is constructed by dialer, the value of iGrid is NULL + if ( iGrid ) + { + CreateDataL( *iGrid ); + } + // If the view number note popped up and the customer delete the image of contact + // refresh the note dialog. + if ( iRefreshObserver && iCurrentIndex == findResult ) + { + iRefreshObserver->RefreshDialog(); + iUpdateFlag = ETrue; + } + } + } + else + { + if(CheckContactAssignedFromPhoneBookL(aStoreEvent.iContactLink)) + { + if (iGridUsed != EGridUse) + { + iUpdateFlag = ETrue; + // if CSpeedDialPrivate object is constructed by dialer, the value of iGrid is NULL + if ( iGrid ) + { + CreateDataL( *iGrid ); + } + } + } + + } + } + break; + + default: + break; + } + + } + + } + +// -------------------------------------------------------------------------- +// CSpeedDialPrivate::SetUpdateFlag +// +// -------------------------------------------------------------------------- +// +EXPORT_C void CSpeedDialPrivate::SetUpdateFlag(TBool aFlag) +{ + iUpdateFlag = aFlag; +} + +// -------------------------------------------------------------------------- +// CSpeedDialPrivate::UpdateFlag +// +// -------------------------------------------------------------------------- +// + +EXPORT_C TBool CSpeedDialPrivate::UpdateFlag() +{ + return iUpdateFlag; +} + +// -------------------------------------------------------------------------- +// CSpeedDialPrivate::FindInSpeedDialContacts +// +// -------------------------------------------------------------------------- +// + +TInt CSpeedDialPrivate::FindInSpeedDialContacts(MVPbkContactLink* aContactLink) + { + // TBool found = EFalse; + TInt found = 0; + MVPbkStoreContact* contact = NULL; + for ( TInt count = 0; count < iSdmArray->Count() && found != iCurrentIndex; ++count ) + { + contact = ( *iSdmArray )[count].Contact(); + + if ( contact != NULL && aContactLink->RefersTo( *contact ) ) + { + found = iSdmArray->Count(); + // if the changed contact is the one which is focused in Speeddial, + // then the note can be removed + if ( count == iCurrentIndex ) + { + found = iCurrentIndex; + } + } + } + return found; + } + +// -------------------------------------------------------------------------- +// CSpeedDialPrivate::CheckContactAssignedFromPhoneBookL +// +// -------------------------------------------------------------------------- +// +TBool CSpeedDialPrivate::CheckContactAssignedFromPhoneBookL(MVPbkContactLink* aContactLink) +{ + TBool aReturn = EFalse; + iRetrieveComplete = EFalse; + MVPbkContactOperationBase* operation = iContactManager->RetrieveContactL( *aContactLink, + (*this )); + //Save the old state + eSpeedDialState oldState = iState; + + iState = STATE_CONTACTCHANGE; + if(operation != NULL) + { + while(!iRetrieveComplete) + { + Wait(); + } + + delete operation; + if(iContact != NULL) + { + aReturn = iAttributeManager->HasContactAttributeL( + CVPbkSpeedDialAttribute::Uid(),*iContact); + delete iContact; + iContact = NULL; + } + } + + //Restore the old state + iState = oldState; + return aReturn; + +} + + +// -------------------------------------------------------------------------- +// CSpeedDialPrivate::ExecuteSingleEntryAssignL +// +// -------------------------------------------------------------------------- +// +void CSpeedDialPrivate::ExecuteSingleEntryAssignL(TInt aIndex, + AiwContactAssign::TAiwContactAttributeAssignDataV1 aData) + { + iState = STATE_ASSIGN; + + CAiwGenericParamList& inParamList = iServiceHandler->InParamListL(); + + const TAiwVariant speedDialVariant( aIndex + 1 ); + /* + TGenericParamId genericParam = + TGenericParamId( EGenericParamSpeedDialIndex );*/ + //For the time being..phone book ui lib is compiled with this value... + TGenericParamId genericParam = + TGenericParamId( EGenericParamSpeedDialIndex ); + + inParamList.AppendL(TAiwGenericParam( + genericParam, + speedDialVariant + ) ); + + inParamList.AppendL( TAiwGenericParam( EGenericParamContactAssignData, + TAiwVariant( AiwContactAssign::TAiwContactAttributeAssignDataV1Pckg( aData ) ) ) ); + + + iOperationComplete = EFalse; + iContactLink = NULL; + iServiceHandler->ExecuteServiceCmdL( + KAiwCmdAssign, + inParamList, + iServiceHandler->OutParamListL(), + 0, + this ); + + // Wait till the contact is selected + while ( !iOperationComplete ) + { + Wait(); + } + + // CleanupStack::PopAndDestroy(); + //iServiceHandler = NULL; + } + +// -------------------------------------------------------------------------- +// CSpeedDialPrivate::ExecuteSingleEntryFetchL +// +// -------------------------------------------------------------------------- +// +void CSpeedDialPrivate::ExecuteSingleEntryFetchL(TInt aIndex, + TAiwSingleEntrySelectionDataV2 aData, + const TDesC& aUri1) +{ + CAiwServiceHandler* serviceHandler = CAiwServiceHandler::NewL(); + + serviceHandler->AttachL(R_SPDIA_SINGLE_ENTRY_FETCH_INTEREST); + + CleanupStack::PushL(serviceHandler); + + CAiwGenericParamList& inParamList = serviceHandler->InParamListL(); + inParamList.AppendL( + TAiwGenericParam( + EGenericParamContactSelectionData, + TAiwVariant(TAiwSingleEntrySelectionDataV2Pckg(aData)))); + + CVPbkContactStoreUriArray* uriArray = CVPbkContactStoreUriArray::NewL(); + CleanupStack::PushL(uriArray); + if (aUri1.Length() > 0) + { + uriArray->AppendL(aUri1); + } + + HBufC8* packedUris = uriArray->PackLC(); + if (uriArray->Count() > 0) + { + inParamList.AppendL( + TAiwGenericParam( + EGenericParamContactStoreUriArray, + TAiwVariant(*packedUris))); + } + + iOperationComplete = EFalse; + iContactLink = NULL; + serviceHandler->ExecuteServiceCmdL( + KAiwCmdSelect, + inParamList, + serviceHandler->OutParamListL(), + 0, + this); + CleanupStack::PopAndDestroy(2); // packedUris, uriArray, service handler + + //Wait till the contact is selected + while (!iOperationComplete) + { + Wait(); + } + + CleanupStack::PopAndDestroy(serviceHandler); + + if(iContactLink && !CheckSpaceBelowCriticalLevelL()) + { + iRetrieveComplete = EFalse; + + MVPbkContactOperationBase* operation = iContactManager->RetrieveContactL( *iContactLink, (*this )); + + if(operation) + { + (*iSdmArray)[aIndex].SetOperation(operation,TSpdiaIndexDataVPbk::OPERATION_ASSIGN); + + while (!iRetrieveComplete) + { + Wait(); + } + + ShowRemove(aIndex); + if(iError == 0) + { + + } + } + + } +} + +// -------------------------------------------------------------------------- +// CSpeedDialPrivate::HandleNotifyL +// +// -------------------------------------------------------------------------- +// +TInt CSpeedDialPrivate::HandleNotifyL( + TInt aCmdId, + TInt aEventId, + CAiwGenericParamList& aEventParamList, + const CAiwGenericParamList& /*aInParamList*/) +{ + TInt result = 0; + iContactLink = NULL; + + if ((aCmdId == KAiwCmdSelect) || (aCmdId == KAiwCmdAssign)) + { + if (aEventId == KAiwEventCompleted) + { + TInt index = 0; + const TAiwGenericParam* param = + aEventParamList.FindFirst(index, EGenericParamContactLinkArray); + if ( !iFetchmail && param) + { + TPtrC8 contactLinks = param->Value().AsData(); + CVPbkContactLinkArray* links = CVPbkContactLinkArray::NewLC( + contactLinks,iContactManager->ContactStoresL()); + + if(links->Count() > 0) + { + if(iContactLink) + { + delete iContactLink; + iContactLink= NULL; + } + + iContactLink = links->At(0).CloneLC(); + CleanupStack::Pop(); + } + + CleanupStack::PopAndDestroy(links); + } + + index = 1; + const TAiwGenericParam* paramMail = + aEventParamList.FindFirst(index, EGenericParamContactFieldData); + if ( iFetchmail && paramMail ) + { + TInt length = paramMail->Value().AsDes().Length(); + iMail = HBufC::NewL(length); + iMail->Des().Append(paramMail->Value().AsDes()); + } + iOperationComplete = ETrue; + Release(); + + } + else if (aEventId == KAiwEventCanceled) + { + iError = KErrCancel; + iOperationComplete = ETrue; + Release(); + } + else if (aEventId == KAiwEventError) + { + iError = KErrInUse; + iOperationComplete = ETrue; + Release(); + } + else if(aEventId == KAiwEventQueryExit) + { + iError = KLeaveExit; + iOperationComplete = ETrue; + Release(); + result = 1; + } + } + + return result; + } + +// -------------------------------------------------------------------------- +// CSpeedDialPrivate::ContactOperationCompleted +// +// -------------------------------------------------------------------------- +// +void CSpeedDialPrivate::ContactOperationCompleted(TContactOpResult /*aResult*/) +{ + iOperationComplete = ETrue; + Release(); + +} + +// -------------------------------------------------------------------------- +// CSpeedDialPrivate::ContactOperationFailed +// +// -------------------------------------------------------------------------- +// +void CSpeedDialPrivate::ContactOperationFailed(TContactOp /*aOpCode*/, TInt aErrorCode, + TBool /*aErrorNotified*/) +{ + iError = aErrorCode; + iOperationComplete = ETrue; + Release(); +} + +// --------------------------------------------------------- +// CSpeedDialPrivate::InitIndexDataL +// The SDM control data is initialized. +// --------------------------------------------------------- +// +void CSpeedDialPrivate::InitIndexDataL() +{ + // The dialog of grid is not closed. + if (iIconArray != NULL) + { + iError = KErrNone; + ResetArray(); + //State set to identify the source of call during callback. + + //Save the old state + eSpeedDialState oldState = iState; + + iState = STATE_INITIAL; + iOperationComplete = EFalse; + + /*Delete already fetched contacts if any */ + if(iContactLinkArray != NULL) + { + delete iContactLinkArray; + iContactLinkArray = NULL; + } + //Fetch all contacts for which speed dial attribute is set. + iFetchAll = EFalse; + iSpeedDial->SetIndex(CVPbkSpeedDialAttribute::KSpeedDialIndexNotDefined); + // iSpeedDial->SetIndex(2); + MVPbkContactOperationBase* findOperation = iAttributeManager->ListContactsL(*iSpeedDial,(*this)); + + while(findOperation != NULL && !iFetchAll) + { + //Wait till every contactlink is fetched and set. + Wait(); + } + //Delete the handle + delete findOperation; + + MVPbkContactOperationBase* retrieveOperation = NULL; + for(TInt count =0; iContactLinkArray && count < iContactLinkArray->Count();++count) + { + iRetrieveComplete = EFalse; + iContactLink = &(iContactLinkArray->At(count)); + retrieveOperation = iContactManager->RetrieveContactL(iContactLinkArray->At(count),(*this )); + while(retrieveOperation != NULL && !iRetrieveComplete) + { + //Wait till the contact is fetched and its speed dial + //index is initialized. + Wait(); + } + //Delete the handle received + delete retrieveOperation; + + } + // Undo this reset + // Just for debugging... + if(iError != KErrNone) + { + iError = KErrNone; + } + //Reset the state + iState = oldState; + + } +} + +// --------------------------------------------------------- +// CSpeedDialPrivate::FindCompleteL +// . +// --------------------------------------------------------- +// +void CSpeedDialPrivate::FindCompleteL(MVPbkContactLinkArray* aResults) +{ + + iContactLinkArray = aResults; + iFetchAll = ETrue; + Release(); + + +} + +// --------------------------------------------------------- +// CSpeedDialPrivate::FindFailed +// +// --------------------------------------------------------- +// +void CSpeedDialPrivate::FindFailed(TInt aError) +{ + iError = aError; + iFetchAll = ETrue; + Release(); +} +// --------------------------------------------------------- +// CSpdiaContainer::CreateItemDescriptorL +// +// --------------------------------------------------------- +// +HBufC* CSpeedDialPrivate::CreateItemDescriptorLC(const TSpdiaIndexDataVPbk& aSdmData) + { + HBufC* des = HBufC::NewLC(KApaMaxAppCaption); + TPtr ptr(des->Des()); + + // thumb type + TInt type(CSpdiaGridVPbk::EText); + if (aSdmData.ThumbIndex() >= 0) + { + type = ConvThumbType(aSdmData.ThumbSize()); + } + + // Text + if ( type == CSpdiaGridVPbk::EText ) + { + // number type icon is missing + TBuf iconInfo; + iconInfo.Append( KDesTab ); // 1 + if ( aSdmData.IconIndex() >= 0 ) + { + iconInfo.AppendNum( aSdmData.IconIndex() ); + } + AppendTextL( aSdmData, ptr ); // 2,3,4 + ptr.Insert( 0, iconInfo ); + } + else + { + // icon + text + text + text + ptr.Append(KDesTab2); // 1, 2 + ptr.Append(KDesTab2); // 2 + } + + // thumbnail 5-14 + for (TInt i(CSpdiaGridVPbk::EtnCIF90); i <= CSpdiaGridVPbk::EtnCOM; ++i) + { + AppendThumbnail(aSdmData, ptr, (type == i? ETrue: EFalse)); + } + + // number + ptr.Append(KDesTab); // 15 + // check + ptr.Append(KDesTab); // 16 + + return des; + } + + +// --------------------------------------------------------- +// CSpeedDialPrivate::CreateDataL +// Set grid used flag and calls CreateDataL. +// --------------------------------------------------------- +// +TBool CSpeedDialPrivate::CreateDataL(const CAknGrid& aGrid) + { + TGridUse oldStatus; + + TBool result; + + oldStatus = iGridUsed; + + iGridUsed = EGridUseAndUpdate; + + result = CreateGridDataL(CONST_CAST(CAknGrid*, &aGrid), KNullIndexData); + + iGridUsed = oldStatus; + + return result; + } + + +// --------------------------------------------------------- +// CSpeedDialPrivate::AppendTextL +// output Text1\tText2\tText3\t +// --------------------------------------------------------- +// +void CSpeedDialPrivate::AppendTextL(const TSpdiaIndexDataVPbk& aSdmData, TPtr& aText) +{ + + if (aSdmData.Contact() == NULL) + { + aText.Append(KDesTab2); + aText.Append(KDesTab2); + } + else + { + // Test application name formatting logic is that take last name and + // first name and combine them using space as a separator. If either of + // them exists use company name. If there are still no name use "Unnamed" + + // Get field types from the master field type list + const MVPbkFieldType* lastNameType = + iContactManager->FieldTypes().Find( R_VPBK_FIELD_TYPE_LASTNAME ); + const MVPbkFieldType* firstNameType = + iContactManager->FieldTypes().Find( R_VPBK_FIELD_TYPE_FIRSTNAME ); + const MVPbkFieldType* companyNameType = + iContactManager->FieldTypes().Find( R_VPBK_FIELD_TYPE_COMPANYNAME ); + + CDesCArrayFlat* bufs = new( ELeave ) CDesCArrayFlat( 2 ); + CleanupStack::PushL( bufs ); + + // Non-graphical characters are replaced with space + const TText KReplaceChar = ' '; + + // Contact should have only one last name field + CVPbkBaseContactFieldTypeIterator* itr = + CVPbkBaseContactFieldTypeIterator::NewLC( *lastNameType, + aSdmData.Contact()->Fields() ); + while ( itr->HasNext() ) + { + const MVPbkBaseContactField* field = itr->Next(); + // last name field is text data + const MVPbkContactFieldTextData& data = + MVPbkContactFieldTextData::Cast( field->FieldData() ); + HBufC* lastName = data.Text().AllocLC(); + + TPtr lName(NULL, 0); + lName.Set( lastName->Des() ); + ReplaceNonGraphicCharacters( lName, KReplaceChar ); + + const TInt len = lName.Length(); + if (0 < len) + { + bufs->AppendL( lName); + } + + CleanupStack::PopAndDestroy( lastName ); + } + CleanupStack::PopAndDestroy( itr ); + + // Contact should have only one first name field + itr = CVPbkBaseContactFieldTypeIterator::NewLC( *firstNameType, + aSdmData.Contact()->Fields() ); + while ( itr->HasNext() ) + { + const MVPbkBaseContactField* field = itr->Next(); + // last name field is text data + const MVPbkContactFieldTextData& data = + MVPbkContactFieldTextData::Cast( field->FieldData() ); + + HBufC* firstName = data.Text().AllocLC(); + + TPtr fName(NULL, 0); + fName.Set( firstName->Des() ); + ReplaceNonGraphicCharacters( fName, KReplaceChar ); + + const TInt len = fName.Length(); + if (0 < len) + { + bufs->AppendL( fName); + } + + CleanupStack::PopAndDestroy( firstName ); + } + CleanupStack::PopAndDestroy( itr ); + + // No last and first name try company name + if ( bufs->Count() == 0 ) + { + // Contact should have only one company name field + itr = CVPbkBaseContactFieldTypeIterator::NewLC( *companyNameType, + aSdmData.Contact()->Fields() ); + while ( itr->HasNext() ) + { + const MVPbkBaseContactField* field = itr->Next(); + // last name field is text data + const MVPbkContactFieldTextData& data = + MVPbkContactFieldTextData::Cast( field->FieldData() ); + HBufC* companyName = data.Text().AllocLC(); + bufs->AppendL( *companyName ); + CleanupStack::PopAndDestroy( companyName ); + } + CleanupStack::PopAndDestroy( itr ); + } + + aText.Append(KDesTab); + // If still no name use phone number + if ( bufs->Count() == 0 ) + { + aText.Append(aSdmData.PhoneNumber()); + aText.Append(KDesTab); + } + else + { + for ( TInt i = 0; i < bufs->Count(); ++i ) + { + aText.Append( (*bufs)[i] ); + aText.Append(KDesTab); + } + + } + + aText.Append(KDesTab); + CleanupStack::PopAndDestroy( bufs ); + } + + AknTextUtils::DisplayTextLanguageSpecificNumberConversion (aText); +} + + +// --------------------------------------------------------- +// CSpdiaContainer::SetOperationsL +// +// --------------------------------------------------------- +// +void CSpeedDialPrivate::SetOperationsL() + { + for (TInt index(iSdmArray->Count() -1); index > 0; --index) + { + TSpdiaIndexDataVPbk& data = (*iSdmArray)[index]; + + if (data.ThumbIndex() >=0) + { + iOperationComplete = EFalse; + data.SetImageOperation( + iImageManager->GetImageAsyncL(NULL,*(data.Contact()),*iThumbNailFieldType,(*this) ) ); + while ( !iOperationComplete ) + { + Wait(); + } + } + } + } + +// --------------------------------------------------------- +// CSpdiaContainer::UpdateIndexDataL +// +// --------------------------------------------------------- +// + +TBool CSpeedDialPrivate::UpdateIndexDataL(TInt aIndex) + { + CFbsBitmap* bitmap,*mask; + bitmap = NULL; + mask= NULL; + MAknsSkinInstance* skinInstance = AknsUtils::SkinInstance(); + + + TSpdiaIndexDataVPbk& data = (*iSdmArray)[aIndex]; + delete (*iIconArray)[aIndex]; + (*iIconArray)[aIndex] = NULL; + TFileName bmpPath(iBmpPath); + + if( User::Language() == ELangHindi ) + { + AknsUtils::CreateIconL(skinInstance, (*iDialSkinBmp)[aIndex],bitmap,mask,bmpPath,iDialHindiBmp[aIndex], iDialHindiBmpMask[aIndex] ); + } + else + { + AknsUtils::CreateIconL(skinInstance, (*iDialSkinBmp)[aIndex],bitmap,mask,bmpPath,iDialBmp[aIndex], iDialBmpMask[aIndex] ); + } + (*iIconArray)[aIndex] = CGulIcon::NewL(bitmap,mask); + + + + MVPbkStoreContact* aContact = data.Contact(); + + data.ResetThumbIndex(); + if (CreateIndexIconL(aIndex, data, ETrue)) + { + + if (iImageManager) + { + data.SetImageOperation( iImageManager->GetImageAsyncL(NULL,*aContact,*iThumbNailFieldType,(*this) ) ); + } + } + else + { + ChangeIndexDataL(aIndex, data); + iGrid->DrawNow(); + } + return ETrue; + } + + +// --------------------------------------------------------- +// CSpdiaContainer::CreateIndexIconL +// +// --------------------------------------------------------- +// +TBool CSpeedDialPrivate::CreateIndexIconL(TInt aIndex, + TSpdiaIndexDataVPbk& aSdmData, TBool aSetUpdateThumb) + { + TBool existThumb(EFalse); + + if (aSdmData.Contact() != NULL) + { + TInt fieldId = -1; + + MVPbkStoreContactField* field = (*iSdmArray)[aIndex].Field(); + if(field) + { + fieldId = field->BestMatchingFieldType()->FieldTypeResId(); + } + aSdmData.SetIconIndex(FindIconIndex(fieldId)); + + // check for the functionality, why he is checking has thumbnail before adding + + if (iImageManager->HasImage(*aSdmData.Contact(),*iThumbNailFieldType)) + { + existThumb = ETrue; + if (aSetUpdateThumb) + { + aSdmData.SetLastThumb(ETrue); + } + aSdmData.SetThumbIndex(aIndex, NULL); + } + else + { + aSdmData.SetThumbIndex(-1, NULL); + } + + } + + return existThumb; + } + +// --------------------------------------------------------- +// CSpdiaContainer::ChangeIndexDataL +// +// --------------------------------------------------------- +// +void CSpeedDialPrivate::ChangeIndexDataL( + TInt aIndex, + const TSpdiaIndexDataVPbk& aSdmData ) + { + CDesCArray* array = STATIC_CAST(CDesCArray*, + iGrid->Model()->ItemTextArray()); + HBufC* des = ItemDescriptorLC(aIndex, aSdmData); + array->Delete(aIndex); + array->InsertL(aIndex, *des); + CleanupStack::PopAndDestroy(); // des + } + + +// --------------------------------------------------------- +// CSpeedDialPrivate::FindIconIndex +// +// --------------------------------------------------------- +// + +TInt CSpeedDialPrivate::FindIconIndex(TInt aId) const + { + TInt index(KNullIndexData); + for (TInt n(0); index == KNullIndexData && n < (sizeof KFieldIds/sizeof KFieldIds[0]); ++n) + { + if ((TUint)aId == KFieldIds[n] ) + { + index = n + iSdmCount; + } + } + return index; + } + + +// --------------------------------------------------------- +// CSpdiaContainer::ItemDescriptorL +// +// --------------------------------------------------------- +// +HBufC* CSpeedDialPrivate::ItemDescriptorLC(TInt aIndex, + const TSpdiaIndexDataVPbk& aSdmData) + { + HBufC* des = NULL; + if (aSdmData.Contact() != NULL) + { + des = CreateItemDescriptorLC(aSdmData); + } + else + { + des = HBufC::NewLC(KNullCell.iTypeLength); + des->Des().Format(KNullCell, aIndex); + } + return des; + } + +// --------------------------------------------------------- +// CSpdiaContainer::SetItemDataL +// +// --------------------------------------------------------- +// +void CSpeedDialPrivate::SetItemDataL(CDesCArray& aArray) + { + for (TInt loop(0); loop < iSdmCount; loop++) + { + TSpdiaIndexDataVPbk& data = (*iSdmArray)[loop]; + + aArray.AppendL(ItemDescriptorLC(loop, data)->Des()); + CleanupStack::PopAndDestroy(); // des + } + } + +TBool CSpeedDialPrivate::CheckSpaceBelowCriticalLevelL() + { + TBool retcode(EFalse); + + if (SysUtil::FFSSpaceBelowCriticalLevelL(&(iCoeEnv->FsSession()))) + { + CErrorUI* errorUi = CErrorUI::NewLC(); + errorUi->ShowGlobalErrorNoteL(KErrDiskFull); + CleanupStack::PopAndDestroy(); // errorUi + retcode = ETrue; + } + return retcode; + } + +// --------------------------------------------------------- +// CSpeedDialPrivate::GetThumbnailSize() +// Gets actual size of thumbnial to be drawn +// --------------------------------------------------------- +// +TSize CSpeedDialPrivate::GetThumbnailSize() +{ + TRect mainPaneRect ; + TRect statusPaneRect; + TInt varient =0; + + if (Layout_Meta_Data::IsLandscapeOrientation()) + { + AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane,mainPaneRect); + AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EStatusPane,statusPaneRect); + mainPaneRect.iTl = statusPaneRect.iTl; + mainPaneRect.iBr.iY = mainPaneRect.iBr.iY - statusPaneRect.iTl.iY; + varient =1; + } + else + { + AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EMainPane,mainPaneRect); + AknLayoutUtils::LayoutMetricsRect(AknLayoutUtils::EStatusPane,statusPaneRect); + mainPaneRect.iTl= statusPaneRect.iTl; + } + + TAknLayoutRect mainGridPaneRect; + TAknLayoutRect gridPaneRect; + TAknLayoutRect cellPaneRect; + TAknLayoutRect thumbPaneRect; + + mainGridPaneRect.LayoutRect(mainPaneRect,AknLayoutScalable_Apps::main_qdial_pane());//main grid pane + gridPaneRect.LayoutRect(mainGridPaneRect.Rect(),AknLayoutScalable_Apps::grid_qdial_pane());//main grid pane + cellPaneRect.LayoutRect(gridPaneRect.Rect(),AknLayoutScalable_Apps::cell_qdial_pane(0,0)); + thumbPaneRect.LayoutRect(cellPaneRect.Rect(),AknLayoutScalable_Apps::thumbnail_qdial_pane(varient)); + + return thumbPaneRect.Rect().Size(); + +} + + +// --------------------------------------------------------- +// CSpeedDialPrivate::ThumbType +// An interface for accessing index data array. +// --------------------------------------------------------- +// +TInt CSpeedDialPrivate::ThumbType(TInt aIndex) const + { + return ConvThumbType((*iSdmArray)[aIndex].ThumbSize()); + } + +// --------------------------------------------------------- +// CSpeedDialPrivate::ThumbSize +// An interface for accessing index data array. +// --------------------------------------------------------- +// +TSize CSpeedDialPrivate::ThumbSize(TInt aIndex) const + { + return (*iSdmArray)[aIndex].ThumbSize(); + } + +// --------------------------------------------------------- +// CSpdiaContainer::ConvThumbType +// Returns +// EtnVGA : 640 x 480 40 x 30 VGA +// EtnVGA90: 480 x 640 30 x 40 VGA turned +// EtnCIF : 352 x 288 44 x 36 CIF +// EtnCIF90: 288 x 352 36 x 44 CIF turned +// EtnCOM : othre +// --------------------------------------------------------- +// +TInt CSpeedDialPrivate::ConvThumbType(const TSize& aSize) const + { + // Scalable UI + TAknWindowLineLayout vga; + TAknWindowLineLayout cif; + if( AknLayoutUtils::ScalableLayoutInterfaceAvailable() ) + { + vga = AknLayoutScalable_Apps::popup_phob_thumbnail_window_g2().LayoutLine(); + cif = AknLayoutScalable_Apps::popup_phob_thumbnail_window_g1().LayoutLine();//image + + } + else + { + vga = AppLayout::Thumbnail_pop_up_window_elements_Line_1(); + cif = AppLayout::Thumbnail_pop_up_window_elements_Line_3(); + + } + TInt type(CSpdiaGridVPbk::EtnCOM); + + if (aSize.iWidth == cif.iH//SDM_TN_CIF_HEIGHT + && aSize.iHeight == cif.iW)// SDM_TN_CIF_WIDTH) + { + type = CSpdiaGridVPbk::EtnCIF90; + } + else if (aSize.iWidth == cif.iW &&//SDM_TN_CIF_WIDTH && + aSize.iHeight == cif.iH)//SDM_TN_CIF_HEIGHT) + { + type = CSpdiaGridVPbk::EtnCIF; + } + else if (aSize.iWidth == vga.iH &&//SDM_TN_VGA_HEIGHT && + aSize.iHeight == vga.iW )//SDM_TN_VGA_WIDTH) + { + type = CSpdiaGridVPbk::EtnVGA90; + } + else if (aSize.iWidth == vga.iW &&//SDM_TN_VGA_WIDTH && + aSize.iHeight == vga.iH)//SDM_TN_VGA_HEIGHT) + { + type = CSpdiaGridVPbk::EtnVGA; + } + + return type; + } + +// --------------------------------------------------------- +// CSpdiaContainer::AppendThumbnail +// output \tThumbnail\ticon +// --------------------------------------------------------- +// +void CSpeedDialPrivate::AppendThumbnail( + const TSpdiaIndexDataVPbk& aSdmData, + TPtr& aText, + TBool aFixedLocation ) + { + if (!aFixedLocation) + { + aText.Append(KDesTab2); + return; + } + + aText.Append(KDesTab); + if ( aSdmData.ThumbIndex() >= 0 && aSdmData.ThumbSize().iWidth > 0 ) + { + aText.AppendNum(aSdmData.ThumbIndex()); + } + + aText.Append(KDesTab); + if (aSdmData.IconIndex() >= 0) + { + aText.AppendNum(aSdmData.IconIndex()); + } + } + + + + + +// --------------------------------------------------------- +// CSpeedDialPrivate::AssignSpeedDial +// +// --------------------------------------------------------- +// + +TBool CSpeedDialPrivate::AssignSpeedDialL(TInt aIndex) +{ + TBool aReturn (EFalse); + + MVPbkContactOperationBase* operation = NULL; + + iSpeedDial->SetIndex(aIndex+1); + + iOperationComplete = EFalse; + (*iSdmArray)[aIndex].Contact()->LockL(*this); + + while(!iOperationComplete) + { + Wait(); + } + if(iError == KErrNone) + { + + MVPbkStoreContactField* field = (*iSdmArray)[aIndex].Field(); + iOperationComplete = EFalse; + + if( field != NULL) + { + operation = iAttributeManager->SetFieldAttributeL( *field, *iSpeedDial, ( *this ) ); + } + + if(operation != NULL) + { + (*iSdmArray)[aIndex].SetOperation(operation,TSpdiaIndexDataVPbk::OPERATION_ASSIGN); + while(!iOperationComplete) + { + Wait(); + } + + } + if(iError == KErrNone) + { + aReturn = ETrue; + } + } + + return aReturn; +} + + + +// --------------------------------------------------------- +// CSpeedDialPrivate::RemoveSpeedDial +// +// --------------------------------------------------------- +// + +TBool CSpeedDialPrivate::RemoveSpeedDialL(TInt aIndex) +{ + TBool aReturn (EFalse); + + if((*iSdmArray)[aIndex].Field() != NULL) + { + iError = KErrNone; + + iOperationComplete = EFalse; + iSpeedDial->SetIndex(aIndex+1); + (*iSdmArray)[aIndex].Contact()->LockL(*this); + + while(!iOperationComplete) + { + Wait(); + } + + if(iError == KErrNone) + { + iOperationComplete = EFalse; + MVPbkContactOperationBase* operation = iAttributeManager->RemoveFieldAttributeL( + *((*iSdmArray)[aIndex].Field()), *iSpeedDial, (*this)); + + if(operation) + { + + (*iSdmArray)[aIndex].SetOperation(operation,TSpdiaIndexDataVPbk::OPERATION_REMOVE); + + while(!iOperationComplete) + { + Wait(); + } + + } + + if(iError == KErrNone) + { + aReturn = ETrue; + } + } + } + + return aReturn; +} + +// --------------------------------------------------------- +// CSpeedDialPrivate::ContactTitleL +// +// --------------------------------------------------------- +// + +EXPORT_C HBufC* CSpeedDialPrivate::ContactTitleL( MVPbkBaseContact* aContact, TBool aUnnamed ) +{ + + + HBufC* title = NULL; + + if (aContact != NULL) + { + CPbk2SortOrderManager* sortOrderManager = CPbk2SortOrderManager::NewL( iContactManager->FieldTypes() ); + + MPbk2ContactNameFormatter* nameFormatter = Pbk2ContactNameFormatterFactory::CreateL( + iContactManager->FieldTypes(), + *sortOrderManager ); + title = nameFormatter->GetContactTitleOrNullL( aContact->Fields(), KContactFormattingFlags ); + + if (title == NULL && aUnnamed) + { + title = nameFormatter->UnnamedText().AllocL(); + } + + delete sortOrderManager; + delete nameFormatter; + } + + return title; + +} + +// --------------------------------------------------------- +// CSpeedDialPrivate::Release +// +// --------------------------------------------------------- +// +void CSpeedDialPrivate::Release( ) + { + + + if( iWait->IsStarted() ) + { + iWait->AsyncStop(); + } + } + +// --------------------------------------------------------- +// CSpeedDialPrivate::Wait +// +// --------------------------------------------------------- +// +void CSpeedDialPrivate::Wait() +{ + if( !(iWait->IsStarted()) ) + iWait->Start(); + +} + +// --------------------------------------------------------- +// CSpeedDialPrivate::Cancel +// To cancel the aiw event +// --------------------------------------------------------- +// +TBool CSpeedDialPrivate::Cancel() +{ + if(!iOperationComplete) + { + iOperationComplete = ETrue; + } + if(iQueryDialog) + { + delete iQueryDialog; + iQueryDialog = NULL; + } + if ( iServiceHandler ) + { + TRAP_IGNORE( + { + CAiwGenericParamList& inParamList = iServiceHandler->InParamListL(); + CAiwGenericParamList& outParamList = iServiceHandler->OutParamListL(); + iServiceHandler->ExecuteServiceCmdL( + KAiwCmdAssign, + inParamList, + outParamList, + KAiwOptCancel, NULL ); + } + ) + } + + Release(); + iCancelFlag = ETrue; + return ETrue; +} + +// --------------------------------------------------------- +// CSpeedDialPrivate::GetWait +// Monitor iWait +// --------------------------------------------------------- +// +EXPORT_C CActiveSchedulerWait* CSpeedDialPrivate::GetWait() + { + return iWait; + } + +// --------------------------------------------------------- +// CSpeedDialPrivate::ReplaceNonGraphicCharacters +// To replace nongraphic characters (e.g.:- newline) +// --------------------------------------------------------- +// +void CSpeedDialPrivate::ReplaceNonGraphicCharacters( TDes& aText, TText aChar ) + { + const TInt len = aText.Length(); + + const TUint KPbkZWSCharacter = 0x200B; + const TUint KPbkZWNJCharacter = 0x200C; + + // Zero Width Space character + const TChar zwsChar( KPbkZWSCharacter ); + // Zero Width Non-Joiner character + const TChar zwnjChar( KPbkZWNJCharacter ); + + for ( TInt i=0; i < len; ++i ) + { + if ( !TChar(aText[i]).IsGraph() && + ( (zwsChar != aText[i]) && (zwnjChar != aText[i]) ) ) + { + // If non-graphic char is specified in ZWSCharacter, + // it will not be replaced. Otherwise replace non-graphic + // character with aChar. + aText[i] = aChar; + } + } + + aText.Trim(); +} + +// --------------------------------------------------------- +// CSpeedDialPrivate::SetRefreshObserver +// Set refresh observer. +// --------------------------------------------------------- +// +EXPORT_C void CSpeedDialPrivate::SetRefreshObserver( MRefreshObserver* aObserver ) + { + iRefreshObserver = aObserver; + } + +// --------------------------------------------------------- +// CSpeedDialPrivate::SetCurrentGridIndex +// set the currentindex +// --------------------------------------------------------- +// +EXPORT_C void CSpeedDialPrivate::SetCurrentGridIndex( TInt aCurrentGridIndex ) + { + iCurrentIndex = aCurrentGridIndex; + } + + +// --------------------------------------------------------- +// CSpeedDialPrivate::SetGridDataAsNull +// Set iGrid and iIconArray as Null +// --------------------------------------------------------- +// +EXPORT_C void CSpeedDialPrivate::SetGridDataAsNull() + { + iGrid = NULL; + iIconArray = NULL; + } +// --------------------------------------------------------- +// CSpeedDialPrivate::SetCurrentGridIndex +// set the currentindex +// --------------------------------------------------------- +// +void CSpeedDialPrivate::ShowNoteL( TInt aResourceId ) + { + HBufC* prompt = StringLoader::LoadLC( aResourceId ); + CAknInformationNote* dlg = new ( ELeave ) CAknInformationNote( EFalse ); + dlg->ExecuteLD( *prompt ); + CleanupStack::PopAndDestroy(); // prompt + } +// End of the file +