convergedcallengine/serviceselector/src/cssservicehandlervoip.cpp
changeset 0 ff3b6d0fd310
--- /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