diff -r 000000000000 -r a4daefaec16c commsconfig/cscengine/src/cscengservicehandler.cpp --- /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 +#include +#include +#include +#include +#include +#include + +#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 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& 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 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 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" ); + } +