--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/commsconfig/cscengine/src/cscengservicehandler.cpp Mon Jan 18 20:12:36 2010 +0200
@@ -0,0 +1,615 @@
+/*
+* Copyright (c) 2007-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: For CSC needed Service Provider Settings handling
+*
+*/
+
+
+#include <spentry.h>
+#include <spproperty.h>
+#include <spsettings.h>
+#include <spnotifychange.h>
+#include <spsettingsvoiputils.h>
+#include <centralrepository.h>
+#include <settingsinternalcrkeys.h>
+
+#include "cscenglogger.h"
+#include "cscengservicehandler.h"
+#include "mcscengserviceobserver.h"
+
+const TInt KDummyServiceCount = 1;// only remove cs service, VoIP service is not returned
+const TInt KArrayInitSize = 2;
+
+// SCP-plugin uid for Sip VoIP
+const TInt32 KSipVoIPSubServicePlugId = 0x1027545A;
+// Preferred Telephony value is PS call
+const TInt KRCSEInternetCallPreferred = 1;
+// Preferred Telephony value is CS call
+const TInt KRCSECSCallPreferred = 0;
+
+// ======== MEMBER FUNCTIONS ========
+
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+CCSCEngServiceHandler::CCSCEngServiceHandler()
+ {
+ }
+
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+void CCSCEngServiceHandler::ConstructL( MCSCEngServiceObserver* aObserver )
+ {
+ CSCENGDEBUG( "CCSCEngServiceHandler::ConstructL - begin" );
+
+ iObserver = aObserver;
+ iServiceSettings = CSPSettings::NewL();
+ iNotifier = CSPNotifyChange::NewL( *this );
+ iSettingsVoIPUtils = CSPSettingsVoIPUtils::NewL();
+
+ RArray<TUint> serviceIds;
+ iNotifier->NotifyChangeL( serviceIds );
+
+ CSCENGDEBUG( "CCSCEngServiceHandler::ConstructL - end" );
+ }
+
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+EXPORT_C CCSCEngServiceHandler* CCSCEngServiceHandler::NewL(
+ MCSCEngServiceObserver* aObserver )
+ {
+ CCSCEngServiceHandler* self = new (ELeave) CCSCEngServiceHandler;
+ CleanupStack::PushL( self );
+ self->ConstructL( aObserver );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+
+// ---------------------------------------------------------------------------
+// ---------------------------------------------------------------------------
+//
+CCSCEngServiceHandler::~CCSCEngServiceHandler()
+ {
+ CSCENGDEBUG(
+ "CCSCEngServiceHandler::~CCSCEngCenrepHandler - begin" );
+
+ iServiceName.Close();
+ delete iSettingsVoIPUtils;
+ delete iServiceSettings;
+ delete iNotifier;
+
+ CSCENGDEBUG(
+ "CCSCEngServiceHandler::~CCSCEngCenrepHandler - end" );
+ }
+
+
+// ---------------------------------------------------------------------------
+// For getting all service ids
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCSCEngServiceHandler::GetAllServiceIdsL(
+ RArray<TUint>& aServiceIds )
+ {
+ CSCENGDEBUG( "CCSCEngServiceHandler::GetAllServiceIds - begin" );
+
+ iServiceSettings->FindServiceIdsL( aServiceIds );
+
+ // Remove 'dummy service's' from service ids list.
+ if ( KDummyServiceCount <= aServiceIds.Count() )
+ {
+ for ( TUint i = 0; i < KDummyServiceCount; i++ )
+ {
+ aServiceIds.Remove( 0 );
+ }
+ }
+
+ CSCENGDEBUG( "CCSCEngServiceHandler::GetAllServiceIds - end" );
+ }
+
+
+// ---------------------------------------------------------------------------
+// For getting service provider settings count
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CCSCEngServiceHandler::ServiceIdCountL()
+ {
+ CSCENGDEBUG2(
+ "CCSCEngServiceHandler::ServiceIdCount COUNT=%d",
+ iServiceSettings->SettingsCountL() );
+
+ return iServiceSettings->SettingsCountL();
+ }
+
+
+// ---------------------------------------------------------------------------
+// For deleting service
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCSCEngServiceHandler::DeleteServiceL( TUint aServiceId )
+ {
+ CSCENGDEBUG( "CCSCEngServiceHandler::DeleteServiceL - begin" );
+
+ User::LeaveIfError( iServiceSettings->DeleteEntryL( aServiceId ) );
+
+ CSCENGDEBUG( "CCSCEngServiceHandler::DeleteServiceL - end" );
+ }
+
+
+// ---------------------------------------------------------------------------
+// For getting service name
+// ---------------------------------------------------------------------------
+//
+EXPORT_C const TDesC16& CCSCEngServiceHandler::ServiceNameL(
+ TUint aServiceId )
+ {
+ CSCENGDEBUG( "CCSCEngServiceHandler::ServiceNameL - begin" );
+
+ iServiceName.Zero();
+ RArray<TUint> serviceIds;
+ CleanupClosePushL( serviceIds );
+
+ GetAllServiceIdsL( serviceIds );
+
+ CDesCArray* serviceNames =
+ new ( ELeave ) CDesCArrayFlat( KArrayInitSize );
+ CleanupStack::PushL( serviceNames );
+
+ iServiceSettings->FindServiceNamesL( serviceIds, *serviceNames );
+
+ TBool serviceFound( EFalse );
+ for ( TInt i( 0 ) ; i < serviceIds.Count() && !serviceFound ; i++ )
+ {
+ if ( aServiceId == serviceIds[ i ] )
+ {
+ serviceFound = ETrue;
+ iServiceName.Close();
+ iServiceName.CreateL( serviceNames->MdcaPoint( i ) );
+ }
+ }
+
+ if ( !serviceFound )
+ {
+ User::Leave( KErrNotFound ); // leave if service not found
+ }
+
+ CleanupStack::PopAndDestroy( serviceNames );
+ CleanupStack::PopAndDestroy( &serviceIds );
+
+ CSCENGDEBUG( "CCSCEngServiceHandler::ServiceNameL - end" );
+
+ return iServiceName;
+ }
+
+// ---------------------------------------------------------------------------
+// For getting brand id
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCSCEngServiceHandler::BrandIdL(
+ TUint aServiceId, TDes16& aBrandId )
+ {
+ CSCENGDEBUG( "CCSCEngServiceHandler::BrandIdL - begin" );
+
+ CSPProperty* property = CSPProperty::NewLC();
+
+ User::LeaveIfError( iServiceSettings->FindPropertyL(
+ aServiceId, EPropertyBrandId, *property ) );
+
+ User::LeaveIfError( property->GetValue( aBrandId ) );
+
+ CleanupStack::PopAndDestroy( property );
+
+ CSCENGDEBUG2( "CCSCEngServiceHandler::BrandIdL BRANDID=%S", &aBrandId );
+
+ CSCENGDEBUG( "CCSCEngServiceHandler::BrandIdL - end" );
+ }
+
+// ---------------------------------------------------------------------------
+// For getting snap id
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CCSCEngServiceHandler::SnapIdL( TUint aServiceId )
+ {
+ CSCENGDEBUG( "CCSCEngServiceHandler::SnapIdL - begin" );
+
+ CSPProperty* property = CSPProperty::NewLC();
+ TInt snapId( 0 );
+
+ User::LeaveIfError( iServiceSettings->FindPropertyL(
+ aServiceId, ESubPropertyVoIPPreferredSNAPId, *property ) );
+
+ User::LeaveIfError( property->GetValue( snapId ) );
+
+ CleanupStack::PopAndDestroy( property );
+
+ CSCENGDEBUG( "CCSCEngServiceHandler::SnapIdL - end" );
+
+ return snapId;
+ }
+
+// ---------------------------------------------------------------------------
+// For getting service setup plug-in id
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt32 CCSCEngServiceHandler::ServiceSetupPluginIdL(
+ TUint aServiceId )
+ {
+ CSCENGDEBUG( "CCSCEngServiceHandler::ServiceSetupPluginId - begin" );
+
+ CSPProperty* property = CSPProperty::NewLC();
+
+ User::LeaveIfError( iServiceSettings->FindPropertyL(
+ aServiceId, EPropertyServiceSetupPluginId, *property ) );
+
+ TInt serviceSetupPluginId( 0 );
+ User::LeaveIfError( property->GetValue( serviceSetupPluginId ) );
+
+ CleanupStack::PopAndDestroy( property );
+
+ CSCENGDEBUG( "CCSCEngServiceHandler::ServiceSetupPluginId - end" );
+
+ return serviceSetupPluginId;
+ }
+
+
+// ---------------------------------------------------------------------------
+// For getting service´s phonebook tab view id
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CCSCEngServiceHandler::ServiceTabViewIdL( TUint aServiceId )
+ {
+ CSPProperty* property = CSPProperty::NewLC();
+
+ User::LeaveIfError( iServiceSettings->FindPropertyL(
+ aServiceId, EPropertyContactViewId, *property ) );
+
+ TInt tabViewId( 0);
+ User::LeaveIfError( property->GetValue( tabViewId ) );
+
+ CleanupStack::PopAndDestroy( property );
+
+ CSCENGDEBUG2( "CCSCEngServiceHandler::ServiceTabViewIdL: %d", tabViewId );
+
+ return tabViewId;
+ }
+
+// ---------------------------------------------------------------------------
+// For getting service´s IM settings id.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CCSCEngServiceHandler::ImSettingsIdL( TUint aServiceId )
+ {
+ CSCENGDEBUG( "CCSCEngServiceHandler::ImSettingsIdL - begin" );
+
+ CSPProperty* property = CSPProperty::NewLC();
+
+ User::LeaveIfError( iServiceSettings->FindPropertyL(
+ aServiceId, ESubPropertyIMSettingsId, *property ) );
+
+ TInt settingsId( 0 );
+ User::LeaveIfError( property->GetValue( settingsId ) );
+
+ CleanupStack::PopAndDestroy( property );
+
+ CSCENGDEBUG( "CCSCEngServiceHandler::ImSettingsIdL - end" );
+
+ return settingsId;
+ }
+
+// ---------------------------------------------------------------------------
+// For setting service´s IM settings id.
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCSCEngServiceHandler::SetImSettingsIdL(
+ TUint aServiceId, TInt aSettingsId )
+ {
+ CSCENGDEBUG( "CCSCEngServiceHandler::SetImSettingsIdL - begin" );
+
+ CSPProperty* property = CSPProperty::NewLC();
+
+ User::LeaveIfError(
+ property->SetName( ESubPropertyIMSettingsId ) );
+ User::LeaveIfError( property->SetValue( aSettingsId ) );
+
+ iServiceSettings->AddOrUpdatePropertyL( aServiceId, *property );
+
+ CleanupStack::PopAndDestroy( property );
+
+ CSCENGDEBUG( "CCSCEngServiceHandler::SetImSettingsIdL - end" );
+ }
+
+// ---------------------------------------------------------------------------
+// For getting service´s presence request preference setting
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TOnOff CCSCEngServiceHandler::PresenceReqPrefL( TUint aServiceId )
+ {
+ CSCENGDEBUG( "CCSCEngServiceHandler::PresenceReqPrefL" );
+
+ CSPProperty* property = CSPProperty::NewLC();
+
+ User::LeaveIfError( iServiceSettings->FindPropertyL(
+ aServiceId, ESubPropertyPresenceRequestPreference , *property ) );
+
+ TOnOff onOff = EOn;
+ User::LeaveIfError( property->GetValue( onOff ) );
+
+ CleanupStack::PopAndDestroy( property );
+
+ return onOff;
+ }
+
+
+// ---------------------------------------------------------------------------
+// For setting service´s presence request preference setting
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCSCEngServiceHandler::SetPresenceReqPrefL(
+ TUint aServiceId, TOnOff aOnOff )
+ {
+ CSCENGDEBUG2(
+ "CCSCEngServiceHandler::SetPresenceReqPrefL: aOnOff=%d", aOnOff );
+
+ CSPProperty* property = CSPProperty::NewLC();
+ User::LeaveIfError(
+ property->SetName( ESubPropertyPresenceRequestPreference ) );
+ User::LeaveIfError( property->SetValue( aOnOff ) );
+
+ iServiceSettings->AddOrUpdatePropertyL( aServiceId, *property );
+ CleanupStack::PopAndDestroy( property );
+ }
+
+
+// ---------------------------------------------------------------------------
+// For getting service´s handover notification tone preference setting
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TOnOff CCSCEngServiceHandler::HandoverNotifTonePrefL(
+ TUint aServiceId )
+ {
+ CSCENGDEBUG( "CCSCEngServiceHandler::HandoverNotifTonePrefL" );
+
+ CSPProperty* property = CSPProperty::NewLC();
+
+ User::LeaveIfError( iServiceSettings->FindPropertyL(
+ aServiceId, ESubPropertyVccHoNotificationToneMode , *property ) );
+
+ RBuf value( 0 );
+ CleanupClosePushL( value );
+ value.CreateL( 1 );
+ User::LeaveIfError( property->GetValue( value ) );
+
+ // convert rbuf to int
+ TInt intValue;
+ TLex temp( value );
+ User::LeaveIfError( temp.Val( intValue ) );
+
+ CleanupStack::PopAndDestroy( &value );
+ CleanupStack::PopAndDestroy( property );
+
+ TOnOff onOff = EOONotSet;
+
+ switch ( intValue )
+ {
+ case 0:
+ {
+ onOff = EOff;
+ }
+ break;
+ case 1:
+ {
+ onOff = EOn;
+ }
+ break;
+ default:
+ {
+ onOff = EOONotSet;
+ }
+ break;
+ }
+
+ CSCENGDEBUG2( "CCSCEngServiceHandler::HandoverNotifTonePrefL: %d", onOff );
+
+ return onOff;
+ }
+
+
+// ---------------------------------------------------------------------------
+// For setting service´s handover notification tone preference setting
+// ---------------------------------------------------------------------------
+//
+EXPORT_C void CCSCEngServiceHandler::SetHandoverNotifTonePrefL(
+ TUint aServiceId, TOnOff aOnOff )
+ {
+ CSPProperty* property = CSPProperty::NewLC();
+ User::LeaveIfError(
+ property->SetName( ESubPropertyVccHoNotificationToneMode ) );
+
+ RBuf value;
+ CleanupClosePushL( value );
+ value.CreateL( 1 );
+ value.AppendNum( aOnOff );
+ User::LeaveIfError( property->SetValue( value ) );
+
+ iServiceSettings->AddOrUpdatePropertyL( aServiceId, *property );
+
+ CleanupStack::PopAndDestroy( &value );
+ CleanupStack::PopAndDestroy( property );
+ }
+
+
+// ---------------------------------------------------------------------------
+// For finding out if service supports VCC
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CCSCEngServiceHandler::IsVccSupportedL( TUint aServiceId )
+ {
+ TBool supported( EFalse );
+
+ TInt vccServiceId( KErrNone );
+ TInt error( KErrNone );
+
+ // Array of service provider IDs
+ // is defined as: typedef RArray<TServiceId> RIdArray
+ // in spdefinitions.h
+ RIdArray serviceIdArray;
+ CleanupClosePushL( serviceIdArray );
+
+ // This should leave if error occurs
+ error = iServiceSettings->FindServiceIdsL( serviceIdArray );
+ User::LeaveIfError( error );
+
+ TInt serviceId( KErrNone );
+ TBool foundEntry( EFalse );
+
+ for ( TInt i( 0 ); i < serviceIdArray.Count() && !foundEntry; i++ )
+ {
+ CSPProperty* property = CSPProperty::NewLC();
+ error = iServiceSettings->FindPropertyL(
+ serviceIdArray[i], ESubPropertyVccVDI, *property );
+
+ if( error == KErrNone )
+ {
+ vccServiceId = serviceIdArray[i];
+ foundEntry = ETrue;
+ }
+ CleanupStack::PopAndDestroy( property );
+ }
+
+ CleanupStack::PopAndDestroy( &serviceIdArray );
+
+ if ( vccServiceId )
+ {
+ CSPProperty* property2 = CSPProperty::NewLC();
+
+ iServiceSettings->FindPropertyL(
+ vccServiceId,
+ ESubPropertyVccDtVoipServiceId,
+ *property2 );
+
+ TInt error = property2->GetValue( serviceId );
+ User::LeaveIfError( error );
+ CleanupStack::PopAndDestroy( property2 );
+ }
+
+ if ( serviceId == aServiceId )
+ {
+ supported = ETrue;
+ }
+
+ CSCENGDEBUG2( "CCSCEngServiceHandler::IsVccSupportedL: %d", supported );
+
+ return supported;
+ }
+
+
+// ---------------------------------------------------------------------------
+// For finding out if service supports SIP/VoIP
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CCSCEngServiceHandler::IsSipVoIPL( TUint aServiceId )
+ {
+ TBool sipVoIP( EFalse );
+ TInt uid( 0 );
+
+ CSPProperty* property = CSPProperty::NewLC();
+
+ User::LeaveIfError( iServiceSettings->FindPropertyL(
+ aServiceId, EPropertyVoIPSubServicePluginId , *property ) );
+
+ User::LeaveIfError( property->GetValue( uid ) );
+
+ if ( KSipVoIPSubServicePlugId == uid )
+ {
+ sipVoIP = ETrue;
+ }
+
+ CSCENGDEBUG2( "CCSCEngServiceHandler::IsSipVoIP: %d", sipVoIP );
+
+ CleanupStack::PopAndDestroy( property );
+
+ return sipVoIP;
+ }
+
+// ---------------------------------------------------------------------------
+// For finding out if service is the preferred service
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CCSCEngServiceHandler::IsPreferredService( TUint aServiceId )
+ const
+ {
+ TUint service( 0 );
+ TInt ret = iSettingsVoIPUtils->GetPreferredService( service );
+
+ return ( KErrNone == ret && service == aServiceId );
+ }
+
+// ---------------------------------------------------------------------------
+// For finding out if voip is preferred telephony value
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TBool CCSCEngServiceHandler::IsPreferredTelephonyVoip() const
+ {
+ return iSettingsVoIPUtils->IsPreferredTelephonyVoIP();
+ }
+
+// ---------------------------------------------------------------------------
+// Sets the preferred telephony value
+// ---------------------------------------------------------------------------
+//
+EXPORT_C TInt CCSCEngServiceHandler::SetVoipAsPrefTelephony(
+ TBool aValue,
+ TUint aServiceId ) const
+ {
+ TRAPD( err, SetVoipAsPrefTelephonyL( aValue, aServiceId ) );
+ return err;
+ }
+
+// ---------------------------------------------------------------------------
+// Sets the preferred telephony value
+// ---------------------------------------------------------------------------
+//
+void CCSCEngServiceHandler::SetVoipAsPrefTelephonyL(
+ TBool aValue,
+ TUint aServiceId ) const
+ {
+ TInt value( aValue ? KRCSEInternetCallPreferred : KRCSECSCallPreferred );
+ TInt serviceId( aServiceId );
+
+ CRepository* repository = CRepository::NewLC( KCRUidRichCallSettings );
+
+ User::LeaveIfError( repository->Set( KRCSEPreferredTelephony, value ) );
+ User::LeaveIfError( repository->Set( KRCSPSPreferredService, serviceId ) );
+ CleanupStack::PopAndDestroy( repository );
+ }
+
+// ---------------------------------------------------------------------------
+// From class MSPNotifyChangeObserver
+// Notifies change in service table
+// ---------------------------------------------------------------------------
+//
+void CCSCEngServiceHandler::HandleNotifyChange( TUint /*aServiceId*/ )
+ {
+ CSCENGDEBUG( "CCSCEngServiceHandler::HandleNotifyChange - begin" );
+
+ iObserver->NotifyServiceChange();
+
+ CSCENGDEBUG( "CCSCEngServiceHandler::HandleNotifyChange - end" );
+ }
+