diff -r 000000000000 -r ff3b6d0fd310 phoneclientserver/CallUI/Src/CaUiPlugin/CaUiPlugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phoneclientserver/CallUI/Src/CaUiPlugin/CaUiPlugin.cpp Tue Feb 02 01:11:09 2010 +0200 @@ -0,0 +1,448 @@ +/* +* Copyright (c) 2004-2005 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Implementation of CallUI plugin. +* +*/ + + + +// INCLUDE FILES +#include "CaUiPlugin.h" // This class interface. +#include "CaUiEng.h" // CaUiEngine. +#include // AIW constants. +#include "CaUI.hrh" // CallUI constants. +#include // AIW Menu pane. + +#include +#include // PhoneClient types. +#include "CaUiLogger.h" // Call Ui Logger +#include +#include +#include // FeatureManager. + +// CONSTANTS + +// Empty filename for initialization. +_LIT( KCaUiNullResFile, "" ); + +// The library to be loaded. +_LIT( KCaUiLoadedLib, "CaUiEngine.dll" ); + + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CCaUiPlugin::CCaUiPlugin +// +// C++ constructor can NOT contain any code, that might leave. +// ----------------------------------------------------------------------------- +// +CCaUiPlugin::CCaUiPlugin() + { + } + +// ----------------------------------------------------------------------------- +// CCaUiPlugin::ConstructL +// +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CCaUiPlugin::ConstructL() + { + CAUILOGSTRING("CALLUI: >>>CCaUiPlugin::ConstructL() Begin"); + User::LeaveIfError( iLibrary.Load( KCaUiLoadedLib ) ); + + // Call function CreateCaUiEngFactoryL() + TInt res = iLibrary.Lookup( 1 )(); + CCaUiEngFactory* caUiEngFactory = + reinterpret_cast< CCaUiEngFactory* >( res ); + + iCaUiEngine = caUiEngFactory->CCaUiEngApiLD(); + + if( !iCaUiEngine ) + { + // Null returned, so leave. + User::Leave( KErrNotSupported ); + } + CAUILOGSTRING("CALLUI: >>>CCaUiPlugin::ConstructL() End"); + } + + +// ----------------------------------------------------------------------------- +// CCaUiPlugin::NewL +// +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CCaUiPlugin* CCaUiPlugin::NewL() + { + CCaUiPlugin* self = new( ELeave ) CCaUiPlugin; + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + } + + +// ----------------------------------------------------------------------------- +// CCaUiPlugin::~CCaUiPlugin +// +// Destructor. +// ----------------------------------------------------------------------------- +// +CCaUiPlugin::~CCaUiPlugin() + { + delete iCaUiEngine; + + iLibrary.Close(); + } + + +// ----------------------------------------------------------------------------- +// CCaUiPlugin::InitialiseL +// +// +// ----------------------------------------------------------------------------- +// +void CCaUiPlugin::InitialiseL( + MAiwNotifyCallback& /*aFrameworkCallback*/, + const RCriteriaArray& /*aInterest*/) + { + // Stub. Not used. + } + + +// ----------------------------------------------------------------------------- +// CCaUiPlugin::HandleServiceCmdL +// +// +// ----------------------------------------------------------------------------- +// +void CCaUiPlugin::HandleServiceCmdL( + const TInt& aCmdId, + const CAiwGenericParamList& aInParamList, + CAiwGenericParamList& aOutParamList, + TUint aCmdOptions, + const MAiwNotifyCallback* aCallback ) + { + CAUILOGSTRING("CALLUI: >>>CCaUiPlugin::HandleServiceCmdL() Begin"); + // Handle only call command. + if ( aCmdId == KAiwCmdCall ) + { + if ( aCmdOptions & KAiwOptCancel ) + { + CAUILOGSTRING("CALLUI: >>>CCaUiPlugin::HandleServiceCmdL() Cancel"); + return; + } + // Check if there is CallUI Dialdata parameter. + TInt index = 0; + const TAiwGenericParam* genericParam = NULL; + + genericParam = aInParamList.FindFirst( + index, + EGenericParamCallDialData, + EVariantTypeDesC8 ); + + if ( index >= 0 && genericParam ) + { + // Get the data. + TPtrC8 ptr = genericParam->Value().AsData(); + + // If this function was called through HandleMenuCmdL, + // iMenuCmdId was set, otherwise it is zero. + TCaUiCallType callType = ECaUiCallTypeUnknown; + + if ( iMenuCmdId == ECallUIVoice ) + { + callType = ECaUiCallTypeVoice; + } + else if ( iMenuCmdId == ECallUIVideo ) + { + callType = ECaUiCallTypeVideo; + } + else if ( iMenuCmdId == ECallUIInternet ) + { + callType = ECaUiCallTypeInternet; + } + + iMenuCmdId = 0; + + // Save the parameters given. + iAiwNotifyCallback = aCallback; + iInParamList = &aInParamList; + iOutParamList = &aOutParamList; + + // Perform the dial operation. + iCaUiEngine->DialL( *this, ptr, callType ); + } + } + CAUILOGSTRING("CALLUI: >>>CCaUiPlugin::HandleServiceCmdL() End"); + } + + + +// ----------------------------------------------------------------------------- +// CCaUiPlugin::InitializeMenuPaneL +// +// +// ----------------------------------------------------------------------------- +// +void CCaUiPlugin::InitializeMenuPaneL( + CAiwMenuPane& aMenuPane, + TInt aIndex, + TInt /* aCascadeId */, + const CAiwGenericParamList& aInParamList ) + { + CAUILOGSTRING("CALLUI: >>>CCaUiPlugin::InitializeMenuPaneL() Begin"); + + // By default we want all internet, voice and video call resources + TBool csVoiceMenuItemAvailable( ETrue ); + TBool csVideoMenuItemAvailable( ETrue ); + TBool voipMenuItemAvailable( ETrue ); + + // If there is PhoneNumber parameter given, then only voice call + // resource is wanted. + TInt count = aInParamList.Count(); + if ( count ) + { + TInt index = 0; + aInParamList.FindFirst( + index, + EGenericParamPhoneNumber, + EVariantTypeAny ); + + if ( index >= 0 ) + { + csVideoMenuItemAvailable = EFalse; + voipMenuItemAvailable = EFalse; + } + + if ( index == KErrNotFound ) + { + index = 0; + aInParamList.FindFirst( + index, + EGenericParamSIPAddress, + EVariantTypeAny ); + + if ( index >= 0 ) + { + // Internet number parameter was found, + csVoiceMenuItemAvailable = EFalse; + csVideoMenuItemAvailable = EFalse; + } + } + } + + if ( csVideoMenuItemAvailable && + !FeatureManager::FeatureSupported( KFeatureIdCsVideoTelephony ) ) + { + csVideoMenuItemAvailable = EFalse; + } + + // Add menu items + + TInt menuIndex = aIndex; + + if ( csVoiceMenuItemAvailable ) + { + AddAiwMenuItemL( aMenuPane, menuIndex, ECSVoice ); + menuIndex++; + } + + if ( csVideoMenuItemAvailable ) + { + AddAiwMenuItemL( aMenuPane, menuIndex, ECSVideo ); + menuIndex++; + } + + if ( voipMenuItemAvailable ) + { + RIdArray voipServiceIds; + CleanupClosePushL( voipServiceIds ); + iCaUiEngine->GetVoIPServiceIdsL( voipServiceIds ); + TInt numberOfVoipServices = voipServiceIds.Count(); + + if ( 1 == numberOfVoipServices ) + { + // Single VoIP service, use service name in menu item + AddAiwMenuItemL( aMenuPane, menuIndex, EInternetWithName, voipServiceIds[0] ); + menuIndex++; + } + else if ( numberOfVoipServices > 1 ) + { + // Regular internet call menu + AddAiwMenuItemL( aMenuPane, menuIndex, EInternet ); + menuIndex++; + } + + CleanupStack::PopAndDestroy( &voipServiceIds ); + } + + // Set submenu title + if ( csVoiceMenuItemAvailable || + csVideoMenuItemAvailable || + voipMenuItemAvailable ) + { + HBufC* menuTitle = StringLoader::LoadLC( R_CALLUI_CALL_SUBMENU_TITLE ); + aMenuPane.AddTitleItemL( *menuTitle, aIndex ); + CleanupStack::PopAndDestroy( menuTitle ); + } + + CAUILOGSTRING("CALLUI: >>>CCaUiPlugin::InitializeMenuPaneL() End"); + } + + +// ----------------------------------------------------------------------------- +// CCaUiPlugin::HandleMenuCmdL +// +// +// ----------------------------------------------------------------------------- +// +void CCaUiPlugin::HandleMenuCmdL( + TInt aMenuCmdId, + const CAiwGenericParamList& aInParamList, + CAiwGenericParamList& aOutParamList, + TUint aCmdOptions, + const MAiwNotifyCallback* aCallback ) + { + CAUILOGSTRING("CALLUI: >>>CCaUiPlugin::HandleMenuCmdL() Begin"); + // Handle only call commands. + if ( ( aMenuCmdId == ECallUIVideo ) || + ( aMenuCmdId == ECallUIVoice ) || + ( aMenuCmdId == ECallUIInternet ) ) + { + // Save the menu command. + iMenuCmdId = aMenuCmdId; + + // Menu commands are handled as service commands. + HandleServiceCmdL( + KAiwCmdCall, + aInParamList, + aOutParamList, + aCmdOptions, + aCallback ); + } + CAUILOGSTRING("CALLUI: >>>CCaUiPlugin::HandleMenuCmdL() End"); + } + + +// ----------------------------------------------------------------------------- +// CCaUiPlugin::HandleDialResultL +// +// +// ----------------------------------------------------------------------------- +// +void CCaUiPlugin::HandleDialResultL( const TInt aStatus ) + { + CAUILOGSTRING("CALLUI: >>>CCaUiPlugin::HandleDialResultL() Start"); + // If callback exists, inform client of call result. + if ( iAiwNotifyCallback ) + { + // Add the call result to the out parameter list. + TAiwVariant variant( aStatus ); + TAiwGenericParam genericParam( EGenericParamError, variant ); + iOutParamList->AppendL( genericParam); + + // R&D solution: Remove constness. + MAiwNotifyCallback* callback = + const_cast< MAiwNotifyCallback* >( iAiwNotifyCallback ); + + // Notify client. + callback->HandleNotifyL( + KAiwCmdCall, + KAiwEventStarted, + *iOutParamList, + *iInParamList ); + } + + // Callback not active anymore, make clearing. + iAiwNotifyCallback = NULL; + iInParamList = NULL; + iOutParamList = NULL; + CAUILOGSTRING("CALLUI: >>>CCaUiPlugin::HandleDialResultL() End"); + } + +// ----------------------------------------------------------------------------- +// CCaUiPlugin::AddAiwMenuItemL +// +// +// ----------------------------------------------------------------------------- +// +void CCaUiPlugin::AddAiwMenuItemL( CAiwMenuPane& aMenuPane, TInt aIndex, EMenuItemType aType, TServiceId aServiceId ) + { + CEikMenuPaneItem::SData data; + data.iCascadeId = 0; + data.iFlags = 0; + data.iExtraText = KNullDesC(); + + HBufC* menuItemText = NULL; + + switch ( aType ) + { + case ECSVoice: + { + data.iCommandId = ECallUIVoice; + menuItemText = StringLoader::LoadLC( R_CALLUI_CS_VOICE_CALL ); + data.iText.Copy( *menuItemText ); + break; + } + + case ECSVideo: + { + data.iCommandId = ECallUIVideo; + menuItemText = StringLoader::LoadLC( R_CALLUI_CS_VIDEO_CALL ); + data.iText.Copy( *menuItemText ); + break; + } + + case EInternet: + { + data.iCommandId = ECallUIInternet; + menuItemText = StringLoader::LoadLC( R_CALLUI_INTERNET_CALL ); + data.iText.Copy( *menuItemText ); + break; + } + + case EInternetWithName: + { + data.iCommandId = ECallUIInternet; + + // Get the service provider name + TBuf<100> buf; + iCaUiEngine->GetVoipServiceNameL( aServiceId, buf ); + menuItemText = StringLoader::LoadLC( R_CALLUI_XSP_CALL_WITH_SERVICE_NAME, buf ); + data.iText.Copy( *menuItemText ); + break; + } + + default: + break; + } + + if ( NULL != menuItemText ) + { + CleanupStack::PopAndDestroy( menuItemText ); + } + + aMenuPane.AddMenuItemL( + KAiwCmdCall, + data, + aIndex ); + } + +// End of file