diff -r 41a7f70b3818 -r 5266b1f337bd phoneuis/vmbx/src/VmContainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phoneuis/vmbx/src/VmContainer.cpp Wed Sep 01 12:30:10 2010 +0100 @@ -0,0 +1,1694 @@ +/* +* Copyright (c) 2002 - 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: Container for Voice mailbox application. +* +*/ + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include //For Application InterWorking +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include "vm.hrh" + +#include "VoiceMailboxAppPrivateCRKeys.h" +#include "voicemailboxdomaincrkeys.h" +#include "VMBLogger.h" +#include "VmContainer.h" +#include "VmApp.h" +#include "VmAppUi.h" + +// CONSTANTS + +_LIT( KVmNoIconPrefix, "0\t"); // no icon +_LIT( KVmSimIconPrefix, "1\t"); // CS icon, number is stored in sim +_LIT( KVmwCSIconPrefix, "2\t"); // CS icon, number is stored in phone memory +_LIT( KVmwVideoIconPrefix, "3\t"); // default icon to Video +_LIT( KVmwVoIPIconPrefix, "4\t"); // default icon to VoIP + +_LIT( KVmSuffix, "\t"); +//for the mbm file +_LIT( KVmMbmDrive, "Z:"); +_LIT( KVmLibMbmFile, "vm.mbm"); + +const TInt KVmClearIcon = 0x02; +const TInt KVmMailboxNumber = 0x04; +const TInt KVmMessageDetails = 0x08; +const TInt KVmPrefixLength = 3; +const TInt KVmIconArraySize = 2; +const TInt KFormattedCharLength = 3; + +// ================= MEMBER FUNCTIONS ========================================== + +// ----------------------------------------------------------------------------- +// CVmContainer::CVmContainer +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// + +CVmContainer::CVmContainer() + : iArray( 2 ), + iVmUiOpts( 0 ) + { + } + + +// ----------------------------------------------------------------------------- +// CVmContainer::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +/***************************************************** +* Series 60 Customer / ETel +* Series 60 ETel API +*****************************************************/ +void CVmContainer::ConstructL( const TRect& aRect, + CAiwServiceHandler* aServiceHandler ) + { + VMBLOGSTRING( "VMBX: CVmContainer::ConstructL: =>" ); + CreateWindowL(); + SetBlank(); + + iServiceProviderSettings = CSPSettings::NewL(); + + //Create repository and notify handlers. + iSession = CRepository::NewL( KCRUidVoiceMailbox ); + iNotifyHandler1 = CCenRepNotifyHandler::NewL( *this, *iSession, + CCenRepNotifyHandler::EIntKey, KVmMessageCounter ); + iNotifyHandler2 = CCenRepNotifyHandler::NewL( *this, *iSession, + CCenRepNotifyHandler::EIntKey, KVmSummaryInfoIsSet ); + iNotifyHandler3 = CCenRepNotifyHandler::NewL( *this, *iSession, + CCenRepNotifyHandler::EIntKey, KVideoMbxSupport ); + iNotifyHandler1->StartListeningL(); + iNotifyHandler2->StartListeningL(); + iNotifyHandler3->StartListeningL(); + + FeatureManager::InitializeLibL(); + iFeatureManagerInitialized = ETrue; + + TInt result( KErrNone ); + if ( FeatureManager::FeatureSupported( KFeatureIdProtocolCdma ) ) + { + result = iSession->Get( KVmUIOpts, iVmUiOpts ); + + if ( result != KErrNone ) + { + if ( result == KErrNotFound ) + { + iVmUiOpts = 0; + } + else + { + VMBLOGSTRING2( "VMBX: CVmContainer::ConstructL: CenRep error: %d", result ); + User::Leave( result ); + } + } + } + + result = iSession->Get( KVideoMbxSupport, iIsVideoSupported ); + if ( result != KErrNone ) + { + iIsVideoSupported = EFalse; + } + + // connect to phoneclient + iServiceHandler = aServiceHandler; + + // open vmbx number interface + User::LeaveIfError( iVmbxNumber.Open() ); + + // get the vmbx number of the active ALS line + TInt ret( iVmbxNumber.GetVmbxNumber( iNumber ) ); + + if ( ret != KErrNone && ret != KErrNotFound ) + { + User::Leave( ret ); + } + + if ( IsVideoSupported() ) + { + // get the video mailbox number of the active ALS line + ret = iVmbxNumber.GetVideoMbxNumber( iVideoNumber ); + if ( ret != KErrNone && ret != KErrNotFound ) + { + User::Leave( ret ); + } + } + + TInt pngErr( KErrNone ); + TInt pngSupported( 0 ); + CRepository* repository = CRepository::NewL( KCRUidNumberGrouping ); + pngErr = repository->Get( KNumberGrouping, pngSupported ); + delete repository; + + if ( KErrNone == pngErr && pngSupported != 0 ) + { + iNumberGrouping = CPNGNumberGrouping::NewL( KVmbxMaxNumberLength ); + } + + // construct the listbox object + iListBox = new (ELeave) CAknDoubleGraphicStyleListBox; + iListBox->SetContainerWindowL( *this ); + + if ( FeatureManager::FeatureSupported( KFeatureIdCommonVoip ) ) + { + iListBox->ConstructL( this, EAknListBoxMultiselectionList ); + } + else + { + iListBox->ConstructL( this, EAknListBoxSelectionList ); + } + + // load the two localised strings for the listbox + if ( FeatureManager::FeatureSupported( KFeatureIdProtocolCdma ) ) + { + iLine1 = StringLoader::LoadL( R_MAILBOX_NUMBER ); + } + else + { + iLine1 = iEikonEnv->AllocReadResourceL( R_CALL_VOICEMAIL ); + } + iLine2 = iEikonEnv->AllocReadResourceL( R_NUMBER_PANE_EMPTY ); + + if ( FeatureManager::FeatureSupported( KFeatureIdCsVideoTelephony ) ) + { + iVideoLine1 = iEikonEnv->AllocReadResourceL( R_CALL_VIDEOMAIL ); + iVideoLine2 = iEikonEnv->AllocReadResourceL( R_NUMBER_PANE_EMPTY ); + } + + if ( FeatureManager::FeatureSupported( KFeatureIdCommonVoip ) ) + { + iLine3 = iEikonEnv->AllocReadResourceL( R_INT_CALL_VOICEMAIL ); + iLine4 = iEikonEnv->AllocReadResourceL( R_ADDRESS_PANE_EMPTY ); + } + + FillIndArray(); + + // Set the text in the listbox + // First create space for the items + for ( TInt i = 0; i < iIndArray.Count(); i++ ) + { + iArray.AppendL( KNullDesC ); + } + + //construct the list icon array, empty icon and sim icon + ConstructIconsForListboxL(); + //set the icon array to the list box + iListBox->ItemDrawer()->FormattedCellData()->SetIconArrayL( iListIcons ); + iListBox->SetListBoxObserver( this ); + + // New voice messages + UpdateNewVoiceMessagesInListBoxL(); + + // Voice mailbox number + UpdateVmbxNumberInListBoxL(); + + // Details + UpdateLastMessageDetailsInListBoxL(); + + iListBox->Model()->SetItemTextArray( &iArray ); + iListBox->Model()->SetOwnershipType( ELbmDoesNotOwnItemArray ); + iListBox->ItemDrawer()->FormattedCellData()->EnableMarqueeL( ETrue ); + iListBox->CreateScrollBarFrameL( ETrue ); + iListBox->ScrollBarFrame()->SetScrollBarVisibilityL( + CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto ); + + TRect rect( 0, 0, 0, 0 ); + // Temporary rect is passed. Correct rect is set in SizeChanged. + iSkinContext = CAknsBasicBackgroundControlContext::NewL( + KAknsIIDQsnBgAreaMainCalc, rect, EFalse ); + + SetRect( aRect ); + ActivateL(); + DrawNow(); + + // request notify on ALS line changes + iVmbxNumber.NotifyAlsLineChangeL( this ); + + // request notify on vmbx number changes + iVmbxNumber.NotifyVmbxNumberChangeL( this, ETrue ); + + // request notify on Service changes + iVmbxNumber.NotifyServiceChange( this ); + + UpdateData( EFalse ); + iIsCallOngoing = EFalse; + + VMBLOGSTRING( "VMBX: CVmContainer::ConstructL: <=" ); + } + + +// ----------------------------------------------------------------------------- +// CVmContainer::~CVmContainer +// Destructor +// ----------------------------------------------------------------------------- +// +CVmContainer::~CVmContainer() + { + VMBLOGSTRING( "VMBX: CVmContainer::~CVmContainer: =>" ); + + delete iServiceProviderSettings; + + delete iListBox; + + iArray.Reset(); + + delete iLine1; + delete iLine2; + delete iVideoLine1; + delete iVideoLine2; + delete iLine3; + delete iLine4; + + + iVmbxNumber.NotifyServiceChangeCancel(); + + iVmbxNumber.Close(); + if ( iNotifyHandler1 ) + { + iNotifyHandler1->StopListening(); + delete iNotifyHandler1; + } + + if ( iNotifyHandler2 ) + { + iNotifyHandler2->StopListening(); + delete iNotifyHandler2; + } + + if ( iNotifyHandler3 ) + { + iNotifyHandler3->StopListening(); + delete iNotifyHandler3; + } + + delete iSession; + delete iNumberGrouping; + + iIndArray.Close(); + + if ( iFeatureManagerInitialized ) + { + FeatureManager::UnInitializeLib(); + } + + delete iSkinContext; + + VMBLOGSTRING( "VMBX: CVmContainer::~CVmContainer: <=" ); + } + +// ----------------------------------------------------------------------------- +// CVmContainer::SizeChanged +// Called by framework when the view size is changed +// ----------------------------------------------------------------------------- +// +void CVmContainer::SizeChanged() + { + if ( iSkinContext ) + { + iSkinContext->SetRect( TRect( TPoint( 0, 0 ), Rect().Size() ) ); + } + AknLayoutUtils::LayoutControl( iListBox, Rect(), + AKN_LAYOUT_WINDOW_list_gen_pane( 0 ) ); + + } + +// ----------------------------------------------------------------------------- +// CVmContainer::CountComponentControls +// Gets a count of the component controls +// ----------------------------------------------------------------------------- +// +TInt CVmContainer::CountComponentControls() const + { + if( FeatureManager::FeatureSupported( KFeatureIdCommonVoip ) ) + { + return 2; // the listbox is the only control + } + else + { + return 1; // the listbox is the only control + } + } + +// ----------------------------------------------------------------------------- +// CVmContainer::ComponentControl +// Gets an indexed component of a compound control +// ----------------------------------------------------------------------------- +// +CCoeControl* CVmContainer::ComponentControl( TInt /*aIndex*/ ) const + { + return iListBox; + } + +// ----------------------------------------------------------------------------- +// CVmContainer::AllowedToChangeTheNumber +// Check wether is possible to edit the voice mailbox number. +// ----------------------------------------------------------------------------- +// +TBool CVmContainer::AllowedToChangeTheNumber() + { + VMBLOGSTRING( "VMBX: CVmContainer::AllowedToChangeTheNumber: =>" ); + VMBLOGSTRING( "VMBX: CVmContainer::AllowedToChangeTheNumber: <=" ); + return iVmbxNumber.AllowedToChangeTheNumber(); + } + + +// ----------------------------------------------------------------------------- +// CVmContainer::OfferKeyEventL +// Handles key events +// ----------------------------------------------------------------------------- +// +TKeyResponse CVmContainer::OfferKeyEventL( const TKeyEvent& aKeyEvent, + TEventCode aType ) + { + VMBLOGSTRING( "VMBX: CVmContainer::OfferKeyEventL: =>" ); + // For CDMA: + if ( FeatureManager::FeatureSupported( KFeatureIdProtocolCdma ) ) + { + if ( aType == EEventKey ) + { + TInt currentItem = CurrentItem(); + if ( currentItem != KErrNotFound ) + { + if ( aKeyEvent.iCode == EKeyPhoneSend ) + { + if ( currentItem == EVmbxVoiceMessageAmountInd + || currentItem == EVmbxVoiceMailboxNumberInd ) + { + CallVoiceMailBoxL(); + VMBLOGSTRING( "VMBX: CVmContainer::OfferKeyEventL: Send key" ); + return EKeyWasConsumed; + } + } + + if ( aKeyEvent.iCode == EKeyOK ) + { + if ( currentItem == EVmbxVoiceMessageAmountInd ) + { + CallVoiceMailBoxL(); + VMBLOGSTRING( "VMBX: CVmContainer::OfferKeyEventL: OK key" ); + return EKeyWasConsumed; + } + else if ( currentItem == EVmbxVoiceMailboxNumberInd ) + { + if ( AllowedToChangeTheNumber() ) + { + iAvkonAppUi->HandleCommandL( EvmCmdChangeNumber ); + } + else + { + CallVoiceMailBoxL(); + } + VMBLOGSTRING( "VMBX: CVmContainer::OfferKeyEventL: OK key" ); + return EKeyWasConsumed; + } + else if ( currentItem == EVmbxIntCallVoiceMailboxNumberInd && + FeatureManager::FeatureSupported( KFeatureIdCommonVoip ) ) + { + VMBLOGSTRING( "VMBX: CVmContainer::OfferKeyEventL: OK key" ); + return EKeyWasConsumed; + } + else if ( currentItem == EVmbxDetailsOfLastMessageInd ) + { + iAvkonAppUi->HandleCommandL( EvmCmdShowLastMessageDetails ); + VMBLOGSTRING( "VMBX: CVmContainer::OfferKeyEventL: OK key" ); + return EKeyWasConsumed; + } + } + } + } + + return iListBox->OfferKeyEventL( aKeyEvent, aType ); + } + + // General variant: + if ( aType == EEventKey ) + { + TInt currentItem = CurrentItem(); + // pressing selection/SEND/enter key initiates a voice call + if ( ( aKeyEvent.iCode == EKeyOK + || aKeyEvent.iCode == EKeyPhoneSend + || aKeyEvent.iCode == EKeyEnter ) + && ( currentItem == EVmbxVoiceMessageAmountInd + || currentItem == EVmbxVoiceMailboxNumberInd ) ) + { + CallVoiceMailBoxL(); + } + else if ( ( aKeyEvent.iCode == EKeyOK + || aKeyEvent.iCode == EKeyPhoneSend + || aKeyEvent.iCode == EKeyEnter ) + && ( FeatureManager::FeatureSupported( KFeatureIdCommonVoip ) + && currentItem != EVmbxVoiceMessageAmountInd + && currentItem != EVmbxVoiceMailboxNumberInd + && currentItem != EVmbxVideoMailboxNumberInd) ) + { + CallIntVoiceMailBoxL(); + } + + else if ( IsVideoSupported() + && ( aKeyEvent.iCode == EKeyOK + || aKeyEvent.iCode == EKeyPhoneSend + || aKeyEvent.iCode == EKeyEnter ) + && currentItem == EVmbxVideoMailboxNumberInd ) + { + CallVideoMailBoxL(); + } + + if ( ( aKeyEvent.iCode == EKeyUpArrow || aKeyEvent.iCode == EKeyDownArrow ) && + ( IsVideoSupported() || + FeatureManager::FeatureSupported( KFeatureIdCommonVoip ) ) ) + { + TKeyResponse response( iListBox->OfferKeyEventL( aKeyEvent, + aType ) ); + iListBox->SetCurrentItemIndex( iListBox->CurrentItemIndex() ); + ( static_cast iAvkonAppUi ) ->DrawCbaButtonsL(); + VMBLOGSTRING2( "VMBX: CVmContainer::OfferKeyEventL: \ + response = %I", response ); + return response; + } + } + VMBLOGSTRING( "VMBX: CVmContainer::OfferKeyEventL: <=" ); + return EKeyWasConsumed; + } + +// ----------------------------------------------------------------------------- +// CVmContainer::HandleListBoxEventL +// Handles listbox clicks. +// ----------------------------------------------------------------------------- +// +void CVmContainer::HandleListBoxEventL( + CEikListBox* /*aListBox*/, + TListBoxEvent aEventType) + { + VMBLOGSTRING( "VMBX: HandleListBoxEventL: =>" ); + VMBLOGSTRING2( "VMBX: HandleListBoxEventL: aEventType=%d", aEventType ); + switch ( aEventType ) + { + case EEventItemSingleClicked: + { + // at begining,if Querying number, + // the key envent should not be response + if( ELauncherQueryingNumber != + ( static_cast iAvkonAppUi )->GetAppUiState() ) + { + TKeyEvent aKeyEvent; + aKeyEvent.iCode = EKeyOK; + VMBLOGSTRING( "VMBX: HandleListBoxEventL: OfferKeyEventL" ); + OfferKeyEventL( aKeyEvent, EEventKey ); + } + VMBLOGSTRING( "VMBX: HandleListBoxEventL: EEventItemSingleClicked" ); + break; + } + default: + VMBLOGSTRING( "VMBX: HandleListBoxEventL: default" ); + break; + } + + VMBLOGSTRING( "VMBX: HandleListBoxEventL: <=" ); + } + +// ----------------------------------------------------------------------------- +// CVmContainer::HandleResourceChange +// Notifier for changing orientation +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CVmContainer::HandleResourceChange( TInt aType ) + { + VMBLOGSTRING( "VMBX: HandleResourceChange: =>" ); + TRect mainPaneRect ; + if ( aType == KEikDynamicLayoutVariantSwitch ) + { + VMBLOGSTRING( "VMBX: HandleResourceChange: DynamicLayout" ); + iListBox->HandleResourceChange( aType ); + AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EMainPane, + mainPaneRect ); + TRAP_IGNORE( CEikonEnv::Static()->AppUiFactory()->StatusPane()-> + SwitchLayoutL( R_AVKON_STATUS_PANE_LAYOUT_USUAL ) ); + SetRect( mainPaneRect ); + DrawNow(); + } + CCoeControl::HandleResourceChange( aType ); + VMBLOGSTRING( "VMBX: HandleResourceChange: <=" ); + } + +// ----------------------------------------------------------------------------- +// CVmContainer::Draw +// Redraw the window owned by this container +// ----------------------------------------------------------------------------- +// +void CVmContainer::Draw( const TRect& aRect ) const + { + VMBLOGSTRING( "VMBX: Draw: =>" ); + CWindowGc& gc = SystemGc(); + gc.Clear( aRect ); + + // Drawing skin + if ( iSkinContext ) + { + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + AknsDrawUtils::Background( skin, iSkinContext, this, gc, aRect ); + } + VMBLOGSTRING( "VMBX: Draw: <=" ); + } +// ----------------------------------------------------------------------------- +// CVmContainer::QueryNumberL +// Queries for a new voice mailbox number. If the query +// is approved, the listbox is updated. +// ----------------------------------------------------------------------------- +// +void CVmContainer::QueryNumberL( TVmbxQueryType aQueryType ) + { + VMBLOGSTRING( "VMBX: CVmContainer::QueryNumberL: =>" ); + TBool ret( EFalse ); + TRAPD( queryErr, + ret = iVmbxNumber.QueryNumberL( aQueryType, iNumber, ETrue ) ); + + if ( KErrNone == queryErr ) + { + if ( ret ) + { + // if the query was approved, update vmbx number + UpdateVmbxNumberInListBoxL(); + (static_cast iAvkonAppUi) ->DrawCbaButtonsL(); + iListBox->DrawNow(); + VMBLOGSTRING( "VMBX: CVmContainer::QueryNumberL: \ + update vmbx number listbox" ); + } + } + else + { + VMBLOGSTRING2( "VMBX: CVmContainer::QueryNumberL: \ + queryErr = %d", queryErr ); + + if ( KErrAccessDenied == queryErr ) + { + VMBLOGSTRING( "VMBX: CVmContainer::QueryNumberL: \ + not allow to change number" ); + } + else + { + User::Leave( queryErr ); + } + } + VMBLOGSTRING( "VMBX: CVmContainer::QueryNumberL: <=" ); + } + +// ----------------------------------------------------------------------------- +// CVmContainer::UpdateNewVoiceMessagesInListBoxL +// Updates the new voice message to the listbox +// ----------------------------------------------------------------------------- +// +void CVmContainer::UpdateNewVoiceMessagesInListBoxL() + { + VMBLOGSTRING( "VMBX: CVmContainer::UpdateNewVoiceMessagesInListBoxL: =>" ); + if ( !FeatureManager::FeatureSupported( KFeatureIdProtocolCdma ) ) + { + VMBLOGSTRING( "VMBX: CVmContainer::UpdateNewVoiceMessagesInListBoxL:\ + Cdma not supported" ); + return; + } + + // First line + HBufC* firstLineText = StringLoader::LoadLC( R_VOICE_MESSAGES ); + + // Second line + HBufC* secondLineText = NULL; + TInt voiceMessageAmout = 0; + + TInt err = iSession->Get( KVmMessageCounter, voiceMessageAmout ); + if ( err != KErrNotFound ) + { + VMBLOGSTRING2( "VMBX: CVmContainer::UpdateNewVoiceMessagesInListBoxL:\ + CenRep error: %d", err ); + User::LeaveIfError( err ); + } + + if ( voiceMessageAmout == 0 ) + { + secondLineText = StringLoader::LoadLC( R_NO_NEW ); + } + else if ( voiceMessageAmout == 1 ) + { + secondLineText = StringLoader::LoadLC( R_NEW_MESSAGES ); + } + else + { + secondLineText = StringLoader::LoadLC( R_N_NEW, voiceMessageAmout ); + } + + // Create combination: + HBufC* comboText = HBufC::NewLC( firstLineText->Length() + + secondLineText->Length() + + KFormattedCharLength ); // 3 special chars + + TPtr comboPtr = comboText->Des(); + comboPtr.Append( KVmNoIconPrefix ); + comboPtr.Append( *firstLineText ); + comboPtr.Append( KVmSuffix ); + comboPtr.Append( *secondLineText ); + + TInt ind = iIndArray.Find( EVmbxVoiceMessageAmountInd ); + if ( ind != KErrNotFound ) + { + iArray.Delete( ind ); + iArray.InsertL( ind, comboPtr ); + } + + CleanupStack::PopAndDestroy( comboText ); + CleanupStack::PopAndDestroy( secondLineText ); + CleanupStack::PopAndDestroy( firstLineText ); + VMBLOGSTRING( "VMBX: CVmContainer::UpdateNewVoiceMessagesInListBoxL: <=" ); + } + +// ----------------------------------------------------------------------------- +// CVmContainer::UpdateVmbxNumberInListBoxL +// Updates the vmbx number in the listbox shown on the app screen. +// ----------------------------------------------------------------------------- +// +void CVmContainer::UpdateVmbxNumberInListBoxL() + { + VMBLOGSTRING( "VMBX: CVmContainer::UpdateVmbxNumberInListBoxL: =>" ); + if ( FeatureManager::FeatureSupported( KFeatureIdProtocolCdma ) && + !( iVmUiOpts & KVmMailboxNumber ) ) + { + VMBLOGSTRING( "VMBX: CVmContainer::UpdateNewVoiceMessagesInListBoxL: \ + Cdma supported or/and no vmbxnumber support" ); + return; + } + + // allocate buffer for icon, title, vmxb number and suffix + HBufC* buf = HBufC::NewLC( KVmNoIconPrefix().Length() + + iLine1->Length() + + KVmSuffix().Length() + + KVmbxMaxNumberLength ); + + TPtr bufPtr = buf->Des(); + + // listbox formatting + if ( iVmbxNumber.IsSimMemory() && iNumber.Length() ) + { + VMBLOGSTRING( "UpdateNewVoiceMessagesInListBoxL::Show SIM icon" ); + bufPtr.Append( KVmSimIconPrefix ); + } + else + { + VMBLOGSTRING( "UpdateNewVoiceMessagesInListBoxL::Show CS icon, number stored to phone" ); + bufPtr.Append( KVmwCSIconPrefix ); + } + + bufPtr.Append( *iLine1 ); // "Voice Mailbox"-text (localised) + bufPtr.Append( KVmSuffix ); + + if ( !iNumber.Length() ) + { + bufPtr.Append( *iLine2 ); // "No number"-text (localised) + } + else + { + // Convert the phone number to accommodate the current locale + TBuf locNumber; + + if ( iNumberGrouping ) + { + iNumberGrouping->Set( iNumber ); + locNumber.Copy( iNumberGrouping->FormattedNumber() ); + } + else + { + locNumber.Copy( iNumber ); + } + + AknTextUtils::LanguageSpecificNumberConversion( locNumber ); + + bufPtr.Append( locNumber ); + } + + TInt ind = iIndArray.Find( EVmbxVoiceMailboxNumberInd ); + if ( ind != KErrNotFound ) + { + iArray.Delete( ind ); + iArray.InsertL( ind, bufPtr ); + } + CleanupStack::PopAndDestroy( buf ); + + // ======================================================================== + // Video Mailbox specific part starts from here + // ======================================================================== + + if ( IsVideoSupported() ) + { + TInt videoline2MaxLength( iVideoLine2->Length() ); + + if ( KVmbxMaxNumberLength > videoline2MaxLength ) + { + videoline2MaxLength = KVmbxMaxNumberLength; + } + + // allocate buffer for 2 listbox lines and 3 formatter chars + HBufC* videoBuf = HBufC::NewLC( iVideoLine1->Length() + + videoline2MaxLength + + KVmNoIconPrefix().Length() + + KVmSuffix().Length() ); + + TPtr videoBufPtr = videoBuf->Des(); + + // listbox formatting + videoBufPtr.Append( KVmwVideoIconPrefix ); + videoBufPtr.Append( *iVideoLine1 ); // "Video Mailbox"-text (localised) + videoBufPtr.Append( KVmSuffix ); + + if ( !iVideoNumber.Length() ) + { + videoBufPtr.Append( *iVideoLine2 ); // "No number"-text (localised) + } + else + { + // Convert the phone number to accommodate the current locale + TBuf videoLocNumber; + + if ( iNumberGrouping ) + { + iNumberGrouping->Set( iVideoNumber ); + videoLocNumber.Copy( iNumberGrouping->FormattedNumber() ); + } + else + { + videoLocNumber.Copy( iVideoNumber ); + } + + AknTextUtils::LanguageSpecificNumberConversion( videoLocNumber ); + + videoBufPtr.Append( videoLocNumber ); + } + + TInt videoInd = iIndArray.Find( EVmbxVideoMailboxNumberInd ); + if ( videoInd != KErrNotFound ) + { + iArray.Delete( videoInd ); + iArray.InsertL( videoInd, videoBufPtr ); + } + CleanupStack::PopAndDestroy( videoBuf ); + } + + // ======================================================================== + // IP Mailbox specific part starts from here + // ======================================================================== + + if ( IsIpVoiceMailboxServices() ) + { + // Get all Service Ids + RArray profileIds; + CleanupClosePushL( profileIds ); + iVmbxNumber.GetServiceIds( profileIds ); + + TBuf vmbxAddress; + + for ( TInt i( 0 ); i < profileIds.Count(); i++ ) + { + // Get mailbox name + TVmbxServiceInfo serviceInfo; + serviceInfo.iServiceId = profileIds[ i ]; + iVmbxNumber.GetServiceInfo( serviceInfo ); + HBufC* name = HBufC::NewLC( serviceInfo.iName.Length() ); + name->Des().Copy( serviceInfo.iName ); + + HBufC* mailbox = StringLoader::LoadLC( + R_VOIP_LIST_MAILBOX_NAME, name->Des( ) ); + + HBufC* buf2 = HBufC::NewLC( mailbox->Length() + + KVmbxMaxNumberLength + + KVmNoIconPrefix().Length() + + KVmSuffix().Length() * 3 ); + TPtr bufPtr2 = buf2->Des(); + + // Brand icon here, if brand icon is not available + // use default VoIP icon + TInt iconId( KErrNotFound ); + TRAPD( error, AddBrandIconL( profileIds[ i ], iconId ) ); + + if ( KErrNone == error && KErrNotFound != iconId ) + { + bufPtr2.AppendNum( iconId ); + bufPtr2.Append( KVmSuffix ); + } + else + { + bufPtr2.Append( KVmwVoIPIconPrefix ); + } + + // Add Mailbox text + bufPtr2.Append( mailbox->Des() ); + bufPtr2.Append( KVmSuffix ); + + // Write address + vmbxAddress.Copy( serviceInfo.iAddress ); + + if ( !vmbxAddress.Length() ) + { + bufPtr2.Append( *iLine4 ); // "No number"-text (localised) + } + else + { + bufPtr2.Append( vmbxAddress ); + } + + // this corrects SIM icon to the right place + bufPtr2.Append( KVmSuffix ); + + ind = iIndArray.Find( EVmbxIntCallVoiceMailboxNumberInd ); + if ( KErrNotFound != ind ) + { + VMBLOGSTRING2( "VMBX: CVmContainer::UpdateVmbxNumberInListBoxL: %S", buf2 ); + iArray.Delete( ind + i ); + iArray.InsertL( ind + i, bufPtr2 ); + } + + CleanupStack::PopAndDestroy( buf2 ); + CleanupStack::PopAndDestroy( mailbox ); + CleanupStack::PopAndDestroy( name ); + } + CleanupStack::PopAndDestroy( &profileIds ); + } + VMBLOGSTRING( "VMBX: CVmContainer::UpdateVmbxNumberInListBoxL: <=" ); + } + +// ----------------------------------------------------------------------------- +// CVmContainer::UpdateLastMessageDetailsInListBoxL +// Updates the last message details to the listbox +// ----------------------------------------------------------------------------- +// +void CVmContainer::UpdateLastMessageDetailsInListBoxL() + { + VMBLOGSTRING( "VMBX: CVmContainer::UpdateLastMessageDetailsInListBoxL: =>" ); + if ( !FeatureManager::FeatureSupported( KFeatureIdProtocolCdma ) || + !( iVmUiOpts & KVmMessageDetails ) ) + { + VMBLOGSTRING( "VMBX: CVmContainer::UpdateNewVoiceMessagesInListBoxL: \ + Cdma supported or/and no vmbxdetails support" ); + return; + } + + // Determine the position of this item in the list (if any) + TInt ind = iIndArray.Find( EVmbxDetailsOfLastMessageInd ); + + // if the last message is not set, hide the item: + // 0 = not set + // 1 = set. + TInt messageSet = 0; + + iSession->Get( KVmSummaryInfoIsSet, messageSet ); // ignore error + + if ( messageSet == 0 ) + { + if ( ind != KErrNotFound ) + { + // remove the item from the list + iIndArray.Remove( ind ); + iArray.Delete( ind ); + } + return; + } + + HBufC* resourceText = StringLoader::LoadLC( R_DETAILS_OF_LAST ); + + // Three special chars + HBufC* detailsText = HBufC::NewLC( KVmPrefixLength + + resourceText->Length() ); + TPtr detailsPtr = detailsText->Des(); + detailsPtr.Append( KVmNoIconPrefix ); + detailsPtr.Append( *resourceText ); + detailsPtr.Append( KVmSuffix ); + detailsPtr.Append( KNullDesC ); // the second line is empty + + if ( ind == KErrNotFound ) + { + // Add the item back to the list + iIndArray.Append( EVmbxDetailsOfLastMessageInd ); + iArray.AppendL( detailsPtr ); + } + + CleanupStack::PopAndDestroy( detailsText ); + CleanupStack::PopAndDestroy( resourceText ); + VMBLOGSTRING( "VMBX: CVmContainer::\ + UpdateLastMessageDetailsInListBoxL: <=" ); + } + +// ----------------------------------------------------------------------------- +// CVmContainer::CallVoiceMailBoxL +// Calls the vmbx number using PhoneClient. +// ----------------------------------------------------------------------------- +// +/***************************************************** +* Series 60 Customer / ETel +* Series 60 ETel API +*****************************************************/ +void CVmContainer::CallVoiceMailBoxL() + { + VMBLOGSTRING( "VMBX: CVmContainer::CallVoiceMailBoxL: =>" ); + + if ( !iIsCallOngoing ) + { + AiwCallRequestL( KVmCmdAiwVoiceCall, CAiwDialData::EAIWVoice ); + } + + VMBLOGSTRING( "VMBX: CVmContainer::CallVoiceMailBoxL: <=" ); + } + + +// ----------------------------------------------------------------------------- +// CVmContainer::CallVoiceMailBoxL +// Calls the vmbx number using PhoneClient. +// ----------------------------------------------------------------------------- +// +/***************************************************** +* Series 60 Customer / ETel +* Series 60 ETel API +*****************************************************/ +void CVmContainer::CallIntVoiceMailBoxL() + { + VMBLOGSTRING( "VMBX: CVmContainer::CallVoiceMailBoxL: =>" ); + + if ( !iIsCallOngoing ) + { + AiwCallRequestL( KVmCmdAiwVoipCall, CAiwDialData::EAIWVoiP ); + } + + VMBLOGSTRING( "VMBX: CVmContainer::CallVoiceMailBoxL: <=" ); + } + + +// ----------------------------------------------------------------------------- +// CVmContainer::HandleNotifyL +// When user has completed an action to a vmbx number +// ----------------------------------------------------------------------------- +// +void CVmContainer::HandleNotifyL( TInt /*aLine*/, const TDesC& aValue ) + { + VMBLOGSTRING( "VMBX: CVmContainer::HandleNotifyL: =>" ); + iNumber.Copy( aValue ); + UpdateVmbxNumberInListBoxL(); + (static_cast iAvkonAppUi) ->DrawCbaButtonsL(); + iListBox->DrawNow(); + VMBLOGSTRING( "VMBX: CVmContainer::HandleNotifyL: <=" ); + } + +// ----------------------------------------------------------------------------- +// CVmContainer::HandleAlsChangeL +// ALS line changed +// ----------------------------------------------------------------------------- +// +void CVmContainer::HandleAlsChangeL( TVmbxAlsLine /*aLine*/ ) + { + VMBLOGSTRING( "VMBX: CVmContainer::HandleAlsChangeL: =>" ); + VMBLOGSTRING( "VMBX: CVmContainer::HandleAlsChangeL: <=" ); + } + +// ----------------------------------------------------------------------------- +// CVmContainer::UpdateVmbxNumberL +// Gets the vmbx number from SIM/SharedData and updates it in the display. +// ----------------------------------------------------------------------------- +// +void CVmContainer::UpdateVmbxNumberL() + { + VMBLOGSTRING( "VMBX: CVmContainer::UpdateVmbxNumberL: =>" ); + TInt ret ( iVmbxNumber.GetVmbxNumber( iNumber ) ); + + if ( ret == KErrNotFound ) + { + iNumber.Zero(); + } + else if ( ret != KErrNone ) + { + User::LeaveIfError( ret ); + } + + UpdateVmbxNumberInListBoxL(); + iListBox->DrawNow(); + (static_cast iAvkonAppUi) ->DrawCbaButtonsL(); + VMBLOGSTRING( "VMBX: CVmContainer::UpdateVmbxNumberL: <=" ); + } + +// ----------------------------------------------------------------------------- +// CVmContainer::HandleNotifyInt +// Integer value keys has pressed +// ----------------------------------------------------------------------------- +// +void CVmContainer::HandleNotifyInt( TUint32 aKey, TInt aValue ) + { + VMBLOGSTRING( "VMBX: CVmContainer::HandleNotifyInt: =>" ); + if ( aKey == KVmMessageCounter) + { + TRAPD( err1, UpdateNewVoiceMessagesInListBoxL() ); + if ( err1 != KErrNone ) + { + _LIT(KVmbxPanicType1,"UpdateNewVoiceMessagesInListBoxL"); + User::Panic( KVmbxPanicType1, err1 ); + } + iListBox->DrawNow(); + } + else if ( aKey == KVmSummaryInfoIsSet ) + { + TInt currentItem = CurrentItem(); + if ( currentItem == EVmbxDetailsOfLastMessageInd ) + { + TInt newInd = iIndArray.Find( EVmbxVoiceMailboxNumberInd ); + if ( newInd != KErrNotFound ) + { + iListBox->SetCurrentItemIndex( newInd ); + } + } + TRAPD( err2, UpdateLastMessageDetailsInListBoxL() ); + if ( err2 != KErrNone ) + { + _LIT(KVmbxPanicType2,"UpdateLastMessageDetailsInListBoxL"); + User::Panic( KVmbxPanicType2, err2 ); + } + TRAPD( err3, iListBox->HandleItemAdditionL() ); + if ( err3 != KErrNone ) + { + _LIT(KVmbxPanicType3,"iListBox->HandleItemAdditionL"); + User::Panic( KVmbxPanicType3, err3 ); + } + } + else if ( aKey == KVideoMbxSupport ) + { + iIsVideoSupported = aValue; + UpdateData( ETrue ); + TRAP_IGNORE( UpdateListboxL() ); + } + VMBLOGSTRING( "VMBX: CVmContainer::HandleNotifyInt: <=" ); + } + +// ----------------------------------------------------------------------------- +// CVmContainer::ResetVoicemailMessageCounterL +// Resets to zero the voicemail message counter in SD +// ----------------------------------------------------------------------------- +// +void CVmContainer::ResetVoicemailMessageCounterL() + { + VMBLOGSTRING( "VMBX: CVmContainer::ResetVoicemailMessageCounterL: =>" ); + + TInt err = iSession->Set( KVmMessageCounter, 0 ); + if ( err != KErrNotFound ) + { + VMBLOGSTRING2( "VMBX: CVmContainer::ResetVoicemailMessageCounterL: \ + CenRep error: %d", err ); + User::LeaveIfError( err ); + } + + UpdateNewVoiceMessagesInListBoxL(); + iListBox->DrawNow(); + VMBLOGSTRING( "VMBX: CVmContainer::ResetVoicemailMessageCounterL: <=" ); + } + +// ----------------------------------------------------------------------------- +// CVmContainer::IsClearIcon +// Checks if clear icon is set +// ----------------------------------------------------------------------------- +// +TBool CVmContainer::IsClearIcon() + { + VMBLOGSTRING( "VMBX: CVmContainer::IsClearIcon: =>" ); + VMBLOGSTRING( "VMBX: CVmContainer::IsClearIcon: <=" ); + return iVmUiOpts & KVmClearIcon; + } + +// ----------------------------------------------------------------------------- +// CVmContainer::FillIndArray +// Fill array with indications +// ----------------------------------------------------------------------------- +// +void CVmContainer::FillIndArray() + { + VMBLOGSTRING( "VMBX: CVmContainer::FillIndArray: =>" ); + if ( FeatureManager::FeatureSupported( KFeatureIdProtocolCdma ) ) + { + //NewVoiceMessages + iIndArray.Append( EVmbxVoiceMessageAmountInd ); + + if ( iVmUiOpts & KVmMailboxNumber ) + { + //VmbxNumber + iIndArray.Append( EVmbxVoiceMailboxNumberInd ); + } + + // Details (EVmbxDetailsOfLastMessageInd) are added dynamically in + // UpdateLastMessageDetailsInListBoxL, always to the end of the list + } + else + { + //VmbxNumber + iIndArray.Append( EVmbxVoiceMailboxNumberInd ); + } + + if ( IsVideoSupported() ) + { + iIndArray.Append( EVmbxVideoMailboxNumberInd ); + } + + if ( FeatureManager::FeatureSupported( KFeatureIdCommonVoip ) ) + { + RArray profileIds; + iVmbxNumber.GetServiceIds( profileIds ); + + for ( TInt i( 0 ); i < profileIds.Count(); i++ ) + { + VMBLOGSTRING( "VMBX: CVmContainer::FillIndArray \ + Appending Voip mailbox service" ); + iIndArray.Append( EVmbxIntCallVoiceMailboxNumberInd ); + } + + profileIds.Close(); + } + VMBLOGSTRING( "VMBX: CVmContainer::FillIndArray: <=" ); + } + +// ----------------------------------------------------------------------------- +// CVmContainer::CurrentItem +// Gets index of the current item in listbox +// ----------------------------------------------------------------------------- +// +TInt CVmContainer::CurrentItem() + { + VMBLOGSTRING( "VMBX: CVmContainer::CurrentItem: =>" ); + if ( iListBox->CurrentItemIndex() >= iIndArray.Count() ) + { + VMBLOGSTRING( "VMBX: CVmContainer::CurrentItem: \ + listbox iten not found" ); + return KErrNotFound; + } + TInt listBoxCurrentIndex = iListBox->CurrentItemIndex(); + VMBLOGSTRING2( "VMBX: CVmContainer::CurrentItem: listBoxCurrentIndex=%d", + listBoxCurrentIndex ); + TInt currentItemIndex = iIndArray[ listBoxCurrentIndex ]; + VMBLOGSTRING2( "VMBX: CVmContainer::CurrentItem: currentItemIndex=%d <=", + currentItemIndex ); + return currentItemIndex; + } + +// ----------------------------------------------------------------------------- +// CVmContainer::AskTypeL +// Ask Vmbx type. +// ----------------------------------------------------------------------------- +// +TInt CVmContainer::AskTypeL() + { + VMBLOGSTRING( "VMBX: CVmContainer::AskTypeL: =>" ); + TInt type( EVmbx ); + + if ( IsVideoSupported() ) + { + type = iVmbxNumber.SelectTypeL( EVmbxDefine ); + } + + VMBLOGSTRING( "VMBX: CVmContainer::AskTypeL: <=" ); + return type; + } + +// ----------------------------------------------------------------------------- +// CVmContainer::IsVoIPProfilesFound +// Check if VoIP profiles is found. +// ----------------------------------------------------------------------------- +// +TBool CVmContainer::IsVoIPProfilesFound() + { + VMBLOGSTRING( "VMBX: CVmContainer::IsVoIPProfilesFound" ); + + return iVmbxNumber.IsVoIPProfilesFound(); + } + +// ----------------------------------------------------------------------------- +// CVmContainer::QueryVideoNumberL +// Queries for a new video mailbox number. If the query +// is approved, the listbox is updated. +// ----------------------------------------------------------------------------- +// +void CVmContainer::QueryVideoNumberL( TVmbxQueryType aQueryType ) + { + if ( IsVideoSupported() ) + { + TBool ret( EFalse ); + TRAPD( queryErr, + ret = iVmbxNumber.QueryVideoMbxNumberL( aQueryType, iVideoNumber ) ); + + if ( KErrNone == queryErr ) + { + if ( ret ) + { + // if the query was approved, update vmbx number + UpdateVmbxNumberInListBoxL(); + (static_cast iAvkonAppUi) ->DrawCbaButtonsL(); + iListBox->DrawNow(); + } + } + else + { + VMBLOGSTRING2( "VMBX: CVmContainer::QueryVideoMbxNumberL: \ + queryErr = %d", queryErr ); + + if ( KErrAccessDenied == queryErr ) + { + VMBLOGSTRING( "VMBX: CVmContainer::QueryVideoMbxNumberL: \ + not allow to change number" ); + } + else + { + User::Leave( queryErr ); + } + } + } + } + +// ----------------------------------------------------------------------------- +// CVmContainer::FocusChanged +// Indicate the requirements for control redrawing. +// ----------------------------------------------------------------------------- +// +void CVmContainer::FocusChanged( TDrawNow /*aDrawNow*/ ) + { + VMBLOGSTRING( "VMBX: CVmContainer::FocusChanged: =>" ); + TInt ret1( KErrNone ); + TInt ret2( KErrNone ); + + // Wwhen returned from other application to vmbx. + // Not necessary to update every time when focus changed. + if ( iUpdateData ) + { + // get numbers, possible changed from Idle or General settings + ret1 = iVmbxNumber.GetVmbxNumber( iNumber ); + if ( IsVideoSupported() ) + { + ret2 = iVmbxNumber.GetVideoMbxNumber( iVideoNumber ); + } + } + if ( iListBox ) + { + if ( iUpdateData ) + { + if ( ( ret1 == KErrNone || ret1 == KErrNotFound) && + ( ret2 == KErrNone || ret2 == KErrNotFound) ) + { + TRAP_IGNORE( UpdateVmbxNumberInListBoxL() ); + TRAP_IGNORE( + ( static_cast iAvkonAppUi ) ->DrawCbaButtonsL() ); + } + UpdateData( EFalse ); + } + iListBox->SetFocus( IsFocused() ); + } + iIsCallOngoing = EFalse; + VMBLOGSTRING( "VMBX: CVmContainer::FocusChanged: <=" ); + } + +// ----------------------------------------------------------------------------- +// CVmContainer::ConstructIconsForListboxL +// Constructs the icons that are needed to indicate where the vmbx number +// is stored +// ----------------------------------------------------------------------------- +// +void CVmContainer::ConstructIconsForListboxL() + { + VMBLOGSTRING( "VMBX: CVmContainer::ConstructIconsForListboxL: =>" ); + iListIcons = new (ELeave) CAknIconArray( KVmIconArraySize ); + + CFbsBitmap* bitmap; + CFbsBitmap* mask; + + //Get the mbm file path + TFileName mbmfile( KVmMbmDrive ); + mbmfile.Append( KDC_APP_BITMAP_DIR ); + mbmfile.Append( KVmLibMbmFile ); + + MAknsSkinInstance* skin = AknsUtils::SkinInstance(); + + //empty bitmap + AknsUtils::CreateIconL( skin, KAknsIIDQgnPropEmpty, bitmap,mask, mbmfile, + EMbmVmQgn_prop_empty, EMbmVmQgn_prop_empty_mask ); + + CGulIcon* icon = CGulIcon::NewL( bitmap, mask ); + iListIcons->AppendL( icon ); + + bitmap = NULL; + mask = NULL; + + //sim icon + AknIconUtils::CreateIconL( bitmap, mask, mbmfile, + EMbmVmQgn_prop_nrtyp_sim_contact, + EMbmVmQgn_prop_nrtyp_sim_contact_mask ); + + CGulIcon* icon1 = CGulIcon::NewL( bitmap, mask ); + iListIcons->AppendL( icon1 ); + // Add default icons(CS, Video and VoIP) to the icon list + iVmbxNumber.ConstructDefaultIconsL( iListIcons ); + VMBLOGSTRING2( "VMBX: CVmContainer::ConstructIconsForListboxL: count: %d", iListIcons->Count() ); + + CTextListBoxModel* model = iListBox->Model(); + CDesCArray* items = static_cast( model->ItemTextArray() ); + items->Reset(); + + // Update listbox according new values.. + iListBox->SetCurrentItemIndex( 0 ); + iListBox->HandleItemAdditionL(); + VMBLOGSTRING( "VMBX: CVmContainer::ConstructIconsForListboxL: <=" ); + } + +// ----------------------------------------------------------------------------- +// CVmContainer::CallVideoMailBoxL +// Calls the vmbx number using PhoneClient +// ----------------------------------------------------------------------------- +// +void CVmContainer::CallVideoMailBoxL() + { + VMBLOGSTRING( "VMBX: CVmContainer::CallVideoMailBoxL: =>" ); + + if ( !iIsCallOngoing ) + { + AiwCallRequestL( KVmCmdAiwVideoCall, CAiwDialData::EAIWForcedVideo ); + } + + VMBLOGSTRING( "VMBX: CVmContainer::CallVideoMailBoxL: <=" ); + } + +// ----------------------------------------------------------------------------- +// CVmContainer::AiwCallRequestL() +// Makes a call request to AiwProvider. +// ----------------------------------------------------------------------------- +// +void CVmContainer::AiwCallRequestL( TInt aCommand, + CAiwDialData::TCallType aCallType ) + { + VMBLOGSTRING( "VMBX: CVmContainer::AiwCallRequestL: =>" ); + TBuf number; + + if ( aCallType == CAiwDialData::EAIWVoice ) + { + VMBLOGSTRING( "VMBX: CVmContainer::AiwCallRequestL: Type: VoiceCall" ); + number.Copy( iNumber ); + + if ( !iNumber.Length() ) + { + QueryNumberL( EVmbxNotDefinedQuery ); + VMBLOGSTRING( "VMBX: CVmContainer::AiwCallRequestL: \ + No VoiceCall number: <=" ); + return; + } + VMBLOGSTRING( "VMBX: CVmContainer::AiwCallRequestL: \ + VoiceCall number copied" ); + number.Copy( iNumber ); + } + + if ( aCallType == CAiwDialData::EAIWForcedVideo ) + { + if ( !iVideoNumber.Length() ) + { + QueryVideoNumberL( EVmbxNotDefinedQuery ); + VMBLOGSTRING( "VMBX: CVmContainer::AiwCallRequestL: \ + No VideoCall number: <=" ); + return; + } + VMBLOGSTRING( "VMBX: CVmContainer::AiwCallRequestL: \ + VideoCall number copied" ); + number.Copy( iVideoNumber ); + } + + TVmbxServiceInfo serviceInfo; + + if ( aCallType == CAiwDialData::EAIWVoiP) + { + VMBLOGSTRING( "VMBX: CVmContainer::AiwCallRequestL: Type: VoipCall" ); + if ( !FeatureManager::FeatureSupported( KFeatureIdCsVideoTelephony ) ) + { + // Internet call command id is the same as video call command id + // when video call is not supported. + aCommand = KVmCmdAiwVideoCall; + } + + serviceInfo.iServiceId = ServiceId(); + + TInt error( iVmbxNumber.GetServiceInfo( serviceInfo ) ); + + if ( KErrNone == error ) + { + number.Copy( serviceInfo.iAddress ); + } + + VMBLOGSTRING2( "VMBX: AiwCallRequestL: VoIP address error: %d", error ); + VMBLOGSTRING2( "VMBX: AiwCallRequestL: VoIP address: %S", &number ); + VMBLOGSTRING2( "VMBX: AiwCallRequestL: VoIP serviceId: %d", serviceInfo.iServiceId ); + } + + // Create a dial data object and push it into the cleanup stack. + CAiwDialDataExt* dialData = CAiwDialDataExt::NewLC(); + + VMBLOGSTRING( "VMBX: CVmContainer::AiwCallRequestL: \ + AIW dialData object created" ); + + // Set up dial data parameters. + dialData->SetPhoneNumberL( number ); + dialData->SetCallType( aCallType ); + dialData->SetServiceId( serviceInfo.iServiceId ); + + // Set up CAiwGenericParamList object. + CAiwGenericParamList& paramList = iServiceHandler->InParamListL(); + dialData->FillInParamListL( paramList ); + + // Execute AIW menu service command. + iIsCallOngoing = ETrue; + VMBLOGSTRING( "VMBX: CVmContainer::AiwCallRequestL: Execute AIW menu \ + service command" ); + iServiceHandler->ExecuteMenuCmdL( aCommand, + paramList, + iServiceHandler->OutParamListL(), + 0, + NULL ); + + // Dial data is no longer needed and can be deleted. + CleanupStack::PopAndDestroy( dialData ); + VMBLOGSTRING( "VMBX: CVmContainer::AiwCallRequestL: <=" ); + } + + +// ----------------------------------------------------------------------------- +// CVmContainer::Number +// Query for a voice mailbox number. +// ----------------------------------------------------------------------------- +// +const TDesC& CVmContainer::Number() const + { + return iNumber; + } + +// ----------------------------------------------------------------------------- +// CVmContainer::VideoNumber +// Query for a video mailbox number. +// ----------------------------------------------------------------------------- +// +const TDesC& CVmContainer::VideoNumber() const + { + return iVideoNumber; + } + +// ----------------------------------------------------------------------------- +// CVmContainer::UpdateData +// LisBox will be updated with data possibly changed in other application +// ----------------------------------------------------------------------------- +// +void CVmContainer::UpdateData( TBool aState ) + { + iUpdateData = aState; + } + +// ----------------------------------------------------------------------------- +// CVmContainer::ServiceId +// +// ----------------------------------------------------------------------------- +// +TUint CVmContainer::ServiceId() + { + TUint serviceId( 0 ); + TInt decrease( 0 ); + + RArray profileIds; + iVmbxNumber.GetServiceIds( profileIds ); + + // Count how many items we have to decrease + for ( TInt i( 0 ); i < iIndArray.Count(); i++ ) + { + if ( EVmbxIntCallVoiceMailboxNumberInd != iIndArray[ i ] ) + { + decrease++; + } + } + + serviceId = profileIds[ iListBox->CurrentItemIndex() - decrease ]; + profileIds.Close(); + + VMBLOGSTRING2( "VMBX: CVmContainer::ServiceId() return %d", serviceId ); + return serviceId; + } + + +// ----------------------------------------------------------------------------- +// CVmContainer::HandleServiceNotifyL +// VoIP profile has changed +// ----------------------------------------------------------------------------- +// +void CVmContainer::HandleServiceNotifyL() + { + VMBLOGSTRING( "VMBX: CVmContainer::HandleServiceNotifyL: =>" ); + + iServiceUpdated = ETrue; + + VMBLOGSTRING( "VMBX: CVmContainer::HandleServiceNotifyL: <=" ); + } + +// ----------------------------------------------------------------------------- +// CVmContainer::AddBrandIconL +// +// ----------------------------------------------------------------------------- +// +void CVmContainer::AddBrandIconL( TUint aServiceId, TInt& aIconId ) + { + // Set branding icon to context pane if available. + TBuf8 brandId( KNullDesC8 ); + + iVmbxNumber.BrandIdL( aServiceId, brandId ); + + CFbsBitmap* brandedBitmap = NULL; + CFbsBitmap* brandedBitmapMask = NULL; + + // Get branded bitmap + TRAPD( err, iVmbxNumber.GetBrandedIconL( + brandId, brandedBitmap, brandedBitmapMask ) ); + + VMBLOGSTRING2( "VMBX: CVmContainer::AddBrandIconL: error: %d", err ); + + if ( KErrNone == err ) + { + // The count of list icons(before adding branding icon to the list) + // must be the branded icon list id + aIconId = iListIcons->Count(); + // Create new icon and add it to the icon list + iListIcons->AppendL( + CGulIcon::NewL( brandedBitmap, brandedBitmapMask ) ); + } + else + { + delete brandedBitmap; + delete brandedBitmapMask; + } + } + +// ----------------------------------------------------------------------------- +// CVmContainer::UpdateListboxL +// +// ----------------------------------------------------------------------------- +// +void CVmContainer::UpdateListboxL() + { + VMBLOGSTRING( "VMBX: CVmContainer::UpdateListboxL: =>" ); + + iIndArray.Reset(); + iArray.Reset(); + + FillIndArray(); + + // Set the text in the listbox + // First create space for the items + for ( TInt i = 0; i < iIndArray.Count(); i++ ) + { + iArray.AppendL( KNullDesC ); + } + + // New voice messages + UpdateNewVoiceMessagesInListBoxL(); + + // Voice mailbox number + UpdateVmbxNumberInListBoxL(); + + // Details + UpdateLastMessageDetailsInListBoxL(); + + KErrNotFound == iListBox->CurrentItemIndex() ? + iListBox->SetCurrentItemIndex( 0 ) : + iListBox->SetCurrentItemIndex( iListBox->CurrentItemIndex() ); + + ( static_cast iAvkonAppUi )->DrawCbaButtonsL(); + + // Update listbox according new values.. + iListBox->HandleItemAdditionL(); + iListBox->DrawNow(); + + // Reset updating value + iServiceUpdated = EFalse; + + VMBLOGSTRING( "VMBX: CVmContainer::UpdateListboxL: <=" ); + } + +// ----------------------------------------------------------------------------- +// CVmContainer::IsServiceUpdated +// +// ----------------------------------------------------------------------------- +// +TBool CVmContainer::IsServiceUpdated() const + { + return iServiceUpdated; + } + +TBool CVmContainer::IsIpVoiceMailboxServices() + { + return iVmbxNumber.IsIpVoiceMailboxServices(); + } + +TBool CVmContainer::IsVideoSupported() + { + if ( iIsVideoSupported && + FeatureManager::FeatureSupported( KFeatureIdCsVideoTelephony ) ) + { + return ETrue; + } + else + { + return EFalse; + } + } + +// End of File +