--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/convergedcallengine/serviceselector/src/cssservicehandlervoip.cpp Tue Feb 02 01:11:09 2010 +0200
@@ -0,0 +1,496 @@
+/*
+* Copyright (c) 2008 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: This module contains the implementation of
+* : CSsServiceHandlerVoip class
+*
+*/
+
+
+// INCLUDE FILES
+#include "cssservicehandlervoip.h"
+#include "cssconnectionhandler.h"
+#include "cssuiutilities.h"
+#include "cssserviceutilities.h"
+#include "csssettingshandler.h"
+#include "cssbshandler.h"
+#include "csslogger.h"
+#include <serviceselector.rsg>
+#include <spdefinitions.h>
+#include <spsettingsvoiputils.h>
+#include <data_caging_path_literals.hrh>
+#include <eikenv.h>
+
+
+// CONSTANTS
+// Selection list array granularity
+const TInt KSsArrayGranularity = 2;
+// CS service id
+const TInt KGSMServiceId = 1;
+// List item array size
+const TInt KSsLbxItemsArraySize = 3;
+// Format of the selection list query.
+_LIT( KQueryItemFormat, "%d\t%S" );
+// Branding id
+const TInt KSsBrandingIdLength = 512;
+// Integer length
+const TInt KSsIntegerLength = 10;
+
+
+// ================= MEMBER FUNCTIONS =======================================
+
+// -----------------------------------------------------------------------------
+// CSsServiceHandlerVoip::CSsServiceHandlerVoip
+// C++ constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CSsServiceHandlerVoip::CSsServiceHandlerVoip
+ (
+ // None.
+ )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CSsServiceHandlerVoip::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CSsServiceHandlerVoip::ConstructL()
+ {
+ iConnectionHandler = CSsConnectionHandler::NewL();
+ iVoipUtils = CSPSettingsVoIPUtils::NewL();
+ }
+
+// -----------------------------------------------------------------------------
+// CSsServiceHandlerVoip::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CSsServiceHandlerVoip* CSsServiceHandlerVoip::NewL
+ (
+ // None.
+ )
+ {
+ CSsServiceHandlerVoip* self = new ( ELeave ) CSsServiceHandlerVoip();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// Destructor
+CSsServiceHandlerVoip::~CSsServiceHandlerVoip
+ (
+ // None.
+ )
+ {
+ delete iVoipUtils;
+ delete iConnectionHandler;
+ delete iUiUtils;
+ delete iSettings;
+ delete iBsHandler;
+ }
+
+// -----------------------------------------------------------------------------
+// CSsServiceHandlerVoip::ExecuteServiceSelectionL
+// Gets the calling service by current call type and service id.
+// -----------------------------------------------------------------------------
+//
+void CSsServiceHandlerVoip::ExecuteServiceSelectionL
+ (
+ CConvergedServiceSelector::TSsResult& aResult,
+ CConvergedServiceSelector::TSsCallType /*aCallType*/,
+ TUint aServiceId,
+ TBool aSendKey,
+ const TDesC& aString
+ )
+ {
+ CSSLOGSTRING("CSSelector::ExecuteVoip");
+
+ if ( 0 != aServiceId && KGSMServiceId != aServiceId )
+ {
+ // Service id is known, just set correct calltype
+ // and registration status.
+ GetServiceByServiceId( aResult, aServiceId, aSendKey, aString );
+ }
+ else
+ {
+ // Service id is not known or CS service
+ // so we have to choce from available voip services.
+ GetCallingServiceL( aResult );
+ }
+
+ }
+
+// -----------------------------------------------------------------------------
+// CSsServiceHandlerVoip::GetServiceByServiceId
+// Gets calling service by known service id.
+// -----------------------------------------------------------------------------
+//
+void CSsServiceHandlerVoip::GetServiceByServiceId
+ (
+ CConvergedServiceSelector::TSsResult& aResult,
+ TUint aServiceId,
+ TBool aSendKey,
+ const TDesC& aString
+ ) const
+ {
+ if ( aSendKey && ChangeTypeAsCsVoice( aServiceId, aString ) )
+ {
+ // Set (CS)voice call parameters
+ // CallType, Service id and GSM service is always "enabled"
+ SsServiceUtilities::SetServiceResult(
+ aResult,
+ CConvergedServiceSelector::ESsVoiceCall,
+ KGSMServiceId,
+ ETrue );
+ }
+ else
+ {
+ // Get current registration status for the service.
+ // This may be unnecessary at the moment because we don't show
+ // "Register now?" note anymore and currently clients don't use the
+ // registration status for anything.
+ TBool registered( iConnectionHandler->IsVoipServiceRegistered(
+ aServiceId ) );
+
+ // Set results
+ SsServiceUtilities::SetServiceResult(
+ aResult,
+ CConvergedServiceSelector::ESsVoipCall,
+ aServiceId,
+ registered );
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSsServiceHandlerVoip::GetCallingServiceL
+// Gets calling service without service id.
+// -----------------------------------------------------------------------------
+//
+void CSsServiceHandlerVoip::GetCallingServiceL
+ (
+ CConvergedServiceSelector::TSsResult& aResult
+ )
+ {
+ TInt error( KErrNone );
+ TBool registered( EFalse );
+ RArray<TUint> services;
+ CleanupClosePushL( services );
+
+ // First try to find registered services to be used if not any available
+ // then try to find unregistered services.
+ error = SettingsHandlerL().GetRegisteredServices(
+ *iConnectionHandler, services );
+
+ if ( KErrNone != error )
+ {
+ error = SettingsHandlerL().GetAllServices( services );
+ }
+ else
+ {
+ registered = ETrue;
+ }
+
+ CSSLOGSTRING2("CSSelector::Service error:%d", error);
+ if ( KErrNone != error )
+ {
+ CSSLOGSTRING("CSSelector::Services not available");
+ if ( KErrNoMemory == error )
+ {
+ User::Leave( error );
+ }
+ // No voip services available/configured.
+ // Launch information note and leave.
+ UiUtilitiesL().ShowInformationNoteL( R_NO_SERVICE_AVAILABLE );
+ User::Leave( KErrNotFound );
+ }
+
+
+ // Select service. Show list query
+ // if more than one services available.
+ SelectServiceL( aResult,
+ services,
+ registered );
+
+ CleanupStack::PopAndDestroy( &services );
+ }
+
+// -----------------------------------------------------------------------------
+// CSsServiceHandlerVoip::SelectServiceL
+// Makes service selection.
+// -----------------------------------------------------------------------------
+//
+void CSsServiceHandlerVoip::SelectServiceL
+ (
+ CConvergedServiceSelector::TSsResult& aResult,
+ RArray<TUint>& aServices,
+ TBool aRegistered
+ )
+ {
+ CSSLOGSTRING2("CSSelector::Service count:%d",aServices.Count());
+ if ( 0 == aServices.Count() )
+ {
+ // Empty array, leave
+ User::Leave( KErrNotFound );
+ }
+
+ TUint serviceId( 0 );
+ if ( 1 < aServices.Count() )
+ {
+ // Because more than one service available we have to
+ // make selection list for the user.
+ TInt index( KErrNotFound );
+
+ CDesCArrayFlat* lbxItems =
+ new (ELeave) CDesCArrayFlat( KSsLbxItemsArraySize );
+ CleanupStack::PushL( lbxItems );
+ CArrayPtr<CGulIcon>* icons =
+ new (ELeave) CAknIconArray( KSsLbxItemsArraySize );
+ CleanupStack::PushL( icons );
+
+ GetListBoxItemsAndIconsL( aServices,
+ lbxItems,
+ icons );
+
+ // List query takes ownership for icon array
+ CleanupStack::Pop( icons );
+
+ // Select service by list query
+ TBool ret = UiUtilitiesL().ShowListQueryL(
+ index, R_PHONE_VOIP_CALL_TYPE_QUERY, lbxItems, icons );
+
+ CSSLOGSTRING2("CSSelector::Service list ret:%d", ret);
+ CSSLOGSTRING2("CSSelector::Service list index:%d", index);
+
+
+ // Make sure that the index is on the correct range and user has
+ // not canceled the list query.
+ if ( !ret || ( index < 0 || index >= aServices.Count() ) )
+ {
+ // User cancels the query -> leave
+ User::Leave( KErrCancel );
+ }
+
+ CleanupStack::PopAndDestroy( lbxItems );
+
+ // Use the selected service.
+ serviceId = aServices[index];
+ }
+ else
+ {
+ // One service available, use it.
+ serviceId = aServices[0];
+ }
+
+
+ // Set results
+ SsServiceUtilities::SetServiceResult(
+ aResult,
+ CConvergedServiceSelector::ESsVoipCall,
+ serviceId,
+ aRegistered );
+ }
+
+// -----------------------------------------------------------------------------
+// CSsServiceHandlerVoip::UiUtilitiesL
+// Returns uiutilities reference.
+// -----------------------------------------------------------------------------
+//
+CSsUiUtilities& CSsServiceHandlerVoip::UiUtilitiesL()
+ {
+ if ( !iUiUtils )
+ {
+ // Create uiutils for ui dialogs.
+ // UiUtils is created only for the real need.
+ iUiUtils = CSsUiUtilities::NewL();
+ }
+
+ return *iUiUtils;
+ }
+
+// -----------------------------------------------------------------------------
+// CSsServiceHandlerVoip::SettingsHandlerL
+// Returns settings handler reference.
+// -----------------------------------------------------------------------------
+//
+CSsSettingsHandler& CSsServiceHandlerVoip::SettingsHandlerL()
+ {
+ if ( !iSettings )
+ {
+ // Create settings handler
+ iSettings = CSsSettingsHandler::NewL();
+ }
+
+ return *iSettings;
+ }
+
+// -----------------------------------------------------------------------------
+// CSsServiceHandlerVoip::BrandingHandlerL
+// Returns settings handler reference.
+// -----------------------------------------------------------------------------
+//
+CSsBsHandler& CSsServiceHandlerVoip::BrandingHandlerL()
+ {
+ if ( !iBsHandler )
+ {
+ // Create settings handler
+ iBsHandler = CSsBsHandler::NewL();
+ }
+
+ return *iBsHandler;
+ }
+
+// -----------------------------------------------------------------------------
+// CSsServiceHandlerVoip::ChangeTypeAsCsVoice
+// Checks should voip call type be changed as cs voice.
+// -----------------------------------------------------------------------------
+//
+TBool CSsServiceHandlerVoip::ChangeTypeAsCsVoice
+ (
+ TUint aServiceId,
+ const TDesC& aString
+ ) const
+ {
+ TBool csCall( EFalse );
+ TUint prefService( 0 );
+
+ if ( SsServiceUtilities::IsValidCsNumber( aString ) &&
+ iVoipUtils->IsPreferredTelephonyVoIP() &&
+ KErrNone == iVoipUtils->GetPreferredService( prefService ) )
+ {
+ csCall = prefService == aServiceId &&
+ !iConnectionHandler->IsVoipServiceRegistered( aServiceId );
+
+ }
+
+ return csCall;
+ }
+
+// -----------------------------------------------------------------------------
+// CSsServiceHandlerVoip::AddBrandIconL
+//
+// -----------------------------------------------------------------------------
+//
+void CSsServiceHandlerVoip::AddBrandIconL
+ (
+ CArrayPtr<CGulIcon>* aIcons,
+ TUint aServiceId,
+ TInt& aIconId
+ )
+ {
+ CFbsBitmap* brandedBitmap = NULL;
+ CFbsBitmap* brandedBitmapMask = NULL;
+
+ // Get branded bitmap
+ TRAPD( err, GetBrandIconL( aServiceId,
+ brandedBitmap,
+ brandedBitmapMask ) );
+
+ if ( KErrNone == err )
+ {
+ // The count of list icons(before adding branding icon to the list)
+ // must be the branded icon list id
+ aIconId = aIcons->Count();
+ // Create new icon and add it to the icon list
+ CGulIcon* icon = CGulIcon::NewL( brandedBitmap, brandedBitmapMask );
+ CleanupStack::PushL( icon );
+ aIcons->AppendL( icon );
+ CleanupStack::Pop( icon );
+ }
+ else
+ {
+ // Use default icon for this service
+ aIconId = 0;
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// CSsServiceHandlerVoip::GetListBoxItemsAndIconsL
+//
+// -----------------------------------------------------------------------------
+//
+void CSsServiceHandlerVoip::GetListBoxItemsAndIconsL
+ (
+ RArray<TUint>& aServices,
+ CDesCArrayFlat* aLbxItems,
+ CArrayPtr<CGulIcon>* aIcons
+ )
+ {
+ CDesCArray* names = new(ELeave) CDesCArrayFlat( KSsArrayGranularity );
+ CleanupStack::PushL( names );
+
+ // Load default listbox icon
+ UiUtilitiesL().LoadDefaultIconL( *aIcons );
+
+ // Get service names by service id array
+ SettingsHandlerL().GetServiceNamesL( aServices, *names );
+
+ for ( TInt i=0; i< aServices.Count() &&
+ names->MdcaCount() == aServices.Count(); i++ )
+ {
+ RBuf16 buf;
+ CleanupClosePushL( buf );
+ TInt iconId( KErrNotFound );
+
+ // Add brand icon. Default is used if brand icon not found
+ AddBrandIconL( aIcons, aServices[ i ], iconId );
+
+ HBufC* name = HBufC::NewLC( names->MdcaPoint(i).Length() );
+ name->Des().Copy( names->MdcaPoint(i) );
+
+ buf.CreateL( names->MdcaPoint(i).Length() +
+ KQueryItemFormat().Length() +
+ KSsIntegerLength );
+
+ // Create final list box item data.
+ buf.Format( KQueryItemFormat, iconId, name );
+
+ //Append text to the item array.
+ aLbxItems->AppendL( buf );
+
+ CleanupStack::PopAndDestroy( name );
+ CleanupStack::PopAndDestroy( &buf );
+ }
+
+ CleanupStack::PopAndDestroy( names );
+ }
+
+// -----------------------------------------------------------------------------
+// CSsServiceHandlerVoip::GetBrandIconL
+//
+// -----------------------------------------------------------------------------
+//
+void CSsServiceHandlerVoip::GetBrandIconL
+ (
+ TUint aServiceId,
+ CFbsBitmap*& aBrandedBitmap,
+ CFbsBitmap*& aBrandedBitmapMask
+ )
+ {
+ TBuf8<KSsBrandingIdLength> brandId( KNullDesC8 );
+
+ SettingsHandlerL().BrandIdL( aServiceId, brandId );
+
+ // Get branded bitmap
+ BrandingHandlerL().GetBrandedIconL( brandId,
+ aBrandedBitmap,
+ aBrandedBitmapMask );
+ }
+
+
+// ================= OTHER EXPORTED FUNCTIONS ===============================
+
+// End of File