diff -r 000000000000 -r ff3b6d0fd310 cellular/SSSettings/src/RSSSettings.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cellular/SSSettings/src/RSSSettings.cpp Tue Feb 02 01:11:09 2010 +0200 @@ -0,0 +1,1195 @@ +/* +* Copyright (c) 2002-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: Class for getting information about the Clir, Cug, Als and +* Als blocking status in the phone. +* +*/ + + + +// INCLUDE FILES +#include // for feature definitions +#include +#include +#include +#include +#include +#include // Central repository +#include // Settings Central Repository keys. +#include +#include + +#include "RSSSettings.h" +#include "MSSSettingsObserver.h" +#include "CSSSettingsNotifier.h" +#include "CSSSettingsAlsNotifier.h" +#include "SSSettingsLogger.h" + +// CONSTANTS +_LIT( KPanicCat, "SSSettings" ); +#define KSSSettingsTSYName KMmTsyModuleName +const TInt KSSSettingsTSYNameMaxLength( 80 ); +const TInt KSSSettingsLastSetting(ESSSettingsDefaultCug); +const TInt KSSSettingsMaxETelRetryCount(7); +const TInt KSSSettingsETelRetryCountTimeout(100000); + +// ================= LOCAL FUNCTIONS ======================= +TInt SSSettingsDoOpenEtelConnection( RTelServer& aEtel, RPhone& aPhone ) + { + TInt phones(0); + if ( aEtel.EnumeratePhones( phones) == KErrNone ) + { + for ( TInt p = 0 ; p < phones ; p++ ) + { + TBuf tsyName; + if ( aEtel.GetTsyName( p,tsyName ) == KErrNone ) + { + if ( tsyName.CompareF( KSSSettingsTSYName ) == 0 ) + { + RTelServer::TPhoneInfo info; + if ( aEtel.GetPhoneInfo( p,info ) == KErrNone ) + { + if ( aPhone.Open( aEtel, info.iName ) == KErrNone ) + { + return KErrNone; + } + } + } + } + } + } + return KErrGeneral; + } + + +// ================= MEMBER FUNCTIONS ======================= + +// C++ default constructor can NOT contain any code, that +// might leave. +// +EXPORT_C RSSSettings::RSSSettings() + { + iData = NULL; + } + + +// --------------------------------------------------------- +// RSSSettings::Close +// --------------------------------------------------------- +// +EXPORT_C void RSSSettings::Close() + { + __SSSLOGSTRING("[SSS]--> RSSSettings::Close"); + DeleteSettingsData(); + __SSSLOGSTRING("[SSS] <--RSSSettings::Close"); + } + +// --------------------------------------------------------- +// RSSSettings::Open#1 +// --------------------------------------------------------- +// +EXPORT_C TInt RSSSettings::Open() + { + __SSSLOGSTRING("[SSS]--> RSSSettings::Open"); + TInt ret(KErrNone); + ret = Open( NULL ); + __SSSLOGSTRING("[SSS] <--RSSSettings::Open"); + return ret; + } + +// --------------------------------------------------------- +// RSSSettings::Open#3 +// --------------------------------------------------------- +// +EXPORT_C TInt RSSSettings::Open( RTelServer* aTelServer ) + { + __SSSLOGSTRING("[SSS]--> RSSSettings::Open3"); + TRAPD( error, OpenL( aTelServer ) ); + if ( error != KErrNone ) + { + DeleteSettingsData(); + } + __SSSLOGSTRING("[SSS] <--RSSSettings::Open3"); + return error; + + } + +// --------------------------------------------------------- +// RSSSettings::OpenL +// --------------------------------------------------------- +// +void RSSSettings::OpenL( RTelServer* aTelServer ) + { + __SSSLOGSTRING("[SSS]--> RSSSettings::OpenL"); + if ( iData ) + { + DeleteSettingsData(); + } + + iData = new ( ELeave ) TSSSettingsData; + + iData->iOwnTelServer = ETrue; + iData->iTelServer = NULL; + iData->iCallBack = NULL; + iData->iCallBackSetting = KErrBadDescriptor; + iData->iCallBackValue = KErrBadDescriptor; + iData->iNotifier = NULL; + iData->iCustomPhone = NULL; + iData->iCUGDefault = NULL; + iData->iRepository = NULL; + + // Create Notifier + // ConstructL is called later when the sessions are opened. + iData->iNotifier = new ( ELeave ) CSSSettingsNotifier( *this ); + + // Crate call back for async inform + TCallBack callBack( InformCallBack, this ); + iData->iCallBack = new ( ELeave ) + CAsyncCallBack( callBack, CActive::EPriorityStandard ); + + // Check central repository connection. + iData->iRepository = CRepository::NewL( + KCRUidSupplementaryServiceSettings ); + + // Check ETel connecion + if ( aTelServer ) + { + iData->iOwnTelServer = EFalse; + iData->iTelServer = aTelServer; + // Given ETel connection must be open. + if ( iData->iTelServer->Handle() == 0 ) + { + User::Leave( KErrBadHandle ); + } + } + else + { + iData->iOwnTelServer = ETrue; + iData->iTelServer = new ( ELeave ) RTelServer(); + + // Retry ETel connection: + TInt err(KErrNone); + for ( TInt i = 0 ; i < KSSSettingsMaxETelRetryCount ; i++ ) + { + err = iData->iTelServer->Connect(); + if ( err == KErrNone ) + { + break; + } + User::After( KSSSettingsETelRetryCountTimeout ); + } + + User::LeaveIfError( err ); + } + + // Open phones + TInt error = iData->iTelServer->LoadPhoneModule( KSSSettingsTSYName ); + if (( error != KErrNone ) && ( error != KErrAlreadyExists )) + { + User::Leave( error ); + } + + User::LeaveIfError( SSSettingsDoOpenEtelConnection( + *iData->iTelServer, iData->iMobilePhone ) ); + + iData->iCustomPhone = new ( ELeave ) RMmCustomAPI; + iData->iCustomPhone->Open( iData->iMobilePhone ); + + + // Finish off the notifier construct. + iData->iNotifier->ConstructL(); + + // Create arrays: + for ( TInt i = 0 ; i <= KSSSettingsLastSetting ; i++ ) + { + RSSSettingsObserverArray newArray; + User::LeaveIfError( iData->iObservers.Append( newArray ) ); + } + + //Get default CUG + error = GetDefaultCugL( iData->iCUGDefault ); + if ( error != KErrNone ) + { + //Support legacy, if error occurs + iData->iCUGDefault = ESSSettingsCugDefault; + } + __SSSLOGSTRING("[SSS] <--RSSSettings::OpenL"); + } + +// --------------------------------------------------------- +// RSSSettings::DeleteSettingsData +// --------------------------------------------------------- +// +void RSSSettings::DeleteSettingsData() + { + __SSSLOGSTRING("[SSS]--> RSSSettings::DeleteSettingsData"); + if ( iData == NULL ) + { + return; + } + + // if some event is waiting for the observer calls.. + if (( iData->iCallBackSetting != KErrBadDescriptor || + iData->iCallBackValue != KErrBadDescriptor ) && + iData->iCallBack ) + { + iData->iCallBack->Cancel(); + InformCallBack( this ); + } + + // close array + MSSSettingsObserver* observer = FindOneObserver(); + while ( observer ) + { + CancelAll( *observer ); + observer = FindOneObserver(); + } + + iData->iObservers.Reset(); + + // delete callback + if ( iData->iCallBack ) + { + iData->iCallBack->Cancel(); + delete iData->iCallBack; + iData->iCallBack = NULL; + } + + // Delete notifier + delete iData->iNotifier; + iData->iNotifier = NULL; + + delete iData->iRepository; + iData->iRepository = NULL; + + // close phones + if ( iData->iCustomPhone ) + { + iData->iCustomPhone->Close(); + delete iData->iCustomPhone; + iData->iCustomPhone = NULL; + } + + iData->iMobilePhone.Close(); + + // close ETel session + if (( iData->iTelServer ) && ( iData->iOwnTelServer )) + { + if ( iData->iTelServer->Handle() ) + { + iData->iTelServer->Close(); + } + delete iData->iTelServer; + iData->iTelServer = NULL; + } + + // delete data object + delete iData; + iData = NULL; + __SSSLOGSTRING("[SSS] <--RSSSettings::DeleteSettingsData"); + } + +// --------------------------------------------------------- +// RSSSettings::InformCallBack +// KErrBadDescriptor is used as not defined. +// --------------------------------------------------------- +// +TInt RSSSettings::InformCallBack( TAny* aPtr ) + { + __SSSLOGSTRING("[SSS]--> RSSSettings::InformCallBack"); + RSSSettings* settings = static_cast ( aPtr ); + + if ( !settings->iData ) + { + return KErrNone; + } + + // We need to have both setting and value to make observer call. + if ( settings->iData->iCallBackSetting == KErrBadDescriptor || + settings->iData->iCallBackValue == KErrBadDescriptor ) + { + settings->iData->iCallBackSetting = KErrBadDescriptor; + settings->iData->iCallBackValue = KErrBadDescriptor; + return KErrNone; + } + + settings->InformChange( + (TSSSettingsSetting)settings->iData->iCallBackSetting , + settings->iData->iCallBackValue ); + + settings->iData->iCallBackSetting = KErrBadDescriptor; + settings->iData->iCallBackValue = KErrBadDescriptor; + + __SSSLOGSTRING("[SSS] <--RSSSettings::InformCallBack"); + return KErrNone; + } + +// --------------------------------------------------------- +// RSSSettings::InformChange +// --------------------------------------------------------- +// +void RSSSettings::InformChange( TSSSettingsSetting aSetting, TInt aNewValue ) + { + __SSSLOGSTRING("[SSS]--> RSSSettings::InformChange"); + __ASSERT_DEBUG( iData, Panic( SSSettingsPanicOpenNotDone ) ); + + RSSSettingsObserverArray& array = iData->iObservers[aSetting]; + for ( TInt i = 0 ; i < array.Count() ; i++ ) + { + array[i]->PhoneSettingChanged( aSetting, aNewValue ); + } + + __SSSLOGSTRING("[SSS] <--RSSSettings::InformChange"); + } + +// --------------------------------------------------------- +// RSSSettings::RegisterAll +// --------------------------------------------------------- +// +EXPORT_C TInt RSSSettings::RegisterAll( MSSSettingsObserver& aObserver ) + { + __SSSLOGSTRING("[SSS]--> RSSSettings::RegisterAll"); + __ASSERT_DEBUG( iData, Panic( SSSettingsPanicOpenNotDone ) ); + if ( !iData ) + { + return KErrBadHandle; + } + + TInt error(KErrNone); + for ( TInt i = 0 ; i <= KSSSettingsLastSetting ; i++ ) + { + error = Register( static_cast ( i ), aObserver ); + // KErrAlreadyExists: it's already registered. + // KErrNotSupported: ALS and ALS blocking may return this. + if (( error != KErrNone ) && + ( error != KErrAlreadyExists ) && + ( error != KErrNotSupported )) + { + CancelAll( aObserver ); + break; + } + error = KErrNone; + } + __SSSLOGSTRING("[SSS] <--RSSSettings::RegisterAll"); + return error; + } + +// --------------------------------------------------------- +// RSSSettings::Register +// --------------------------------------------------------- +// +EXPORT_C TInt RSSSettings::Register( + TSSSettingsSetting aSetting, + MSSSettingsObserver& aObserver ) + { + __SSSLOGSTRING("[SSS]--> RSSSettings::Register"); + __ASSERT_DEBUG( iData, Panic( SSSettingsPanicOpenNotDone ) ); + if ( !iData ) + { + return KErrBadHandle; + } + __ASSERT_DEBUG( aSetting <= KSSSettingsLastSetting, + Panic( SSSettingsPanicInvalidRequest ) ); + + if ( ExistsObserver( aSetting, aObserver ) ) + { + return KErrAlreadyExists; + } + + RSSSettingsObserverArray& array = iData->iObservers[aSetting]; + + // When the first observer is set, the notifier is activated. + TInt error(KErrNone); + if ( array.Count() == 0 ) + { + error = iData->iNotifier->AddNotifier( aSetting ); + // if BT Sim Access Profile(SAP) is turned on then ETEL returns KErrNotReady. + if ( error != KErrNone ) + { + __SSSLOGSTRING1("[SSS]--> RSSSettings::Register -> Error code: %d", error ); + return error; + } + } + error = array.Append( &aObserver ); + + __SSSLOGSTRING("[SSS] <--RSSSettings::Register"); + return error; + } + +// --------------------------------------------------------- +// RSSSettings::CancelAll +// --------------------------------------------------------- +// +EXPORT_C void RSSSettings::CancelAll( + MSSSettingsObserver& aObserver ) + { + __SSSLOGSTRING("[SSS]--> RSSSettings::CancelAll"); + if ( !iData ) + { + return; + } + + for ( TInt i = 0 ; i <= KSSSettingsLastSetting ; i++ ) + { + Cancel( static_cast ( i ), aObserver ); + } + __SSSLOGSTRING("[SSS] <--RSSSettings::CancelAll"); + } + +// --------------------------------------------------------- +// RSSSettings::Cancel +// --------------------------------------------------------- +// +EXPORT_C void RSSSettings::Cancel( + TSSSettingsSetting aSetting, + MSSSettingsObserver& aObserver ) + { + __SSSLOGSTRING("[SSS]--> RSSSettings::Cancel"); + if ( !iData ) + { + return; + } + __ASSERT_ALWAYS( aSetting <= KSSSettingsLastSetting, + Panic( SSSettingsPanicInvalidRequest ) ); + + RSSSettingsObserverArray& array = iData->iObservers[aSetting]; + + TInt index = array.Find( &aObserver ); + if ( index == KErrNotFound ) + { + return; + } + + array.Remove( index ); + array.Compress(); + + // When the last observer is removed the notifier is cancelled. + if ( array.Count() == 0 ) + { + iData->iNotifier->RemoveNotifier( aSetting ); + } + __SSSLOGSTRING("[SSS] <--RSSSettings::Cancel"); + } + +// --------------------------------------------------------- +// RSSSettings::Get +// --------------------------------------------------------- +// +EXPORT_C TInt RSSSettings::Get( TSSSettingsSetting aSetting, TInt& aValue ) + { + __SSSLOGSTRING("[SSS]--> RSSSettings::Get"); + __ASSERT_DEBUG( iData, Panic( SSSettingsPanicOpenNotDone ) ); + if ( !iData ) + { + return KErrBadHandle; + } + + __ASSERT_DEBUG( aSetting <= KSSSettingsLastSetting, + Panic( SSSettingsPanicInvalidRequest ) ); + + TInt error(KErrNone); + TInt value(0); + if ( error != KErrNone ) + { + return error; + } + + // If Get fails, we try to save the default data. + switch ( aSetting ) + { + case ESSSettingsCug: + error = GetCug( value ); + if (( error != KErrNone ) && ( error != KErrNotFound )) + { + break; + } + if ( error == KErrNotFound ) + { + error = iData->iRepository->Set( + KSettingsCUG, + iData->iCUGDefault ); + + if ( error != KErrNone ) + { + break; + } + value = iData->iCUGDefault; + } + //If value outside of 0-32767 and not 65535, value is not accepted. + if ( iData->iCUGDefault == ESSSettingsAltCugDefault ) + { + if ((( value < ESSSettingsCugSuppress ) || + ( value > ESSSettingsCugMax )) && + ( value != ESSSettingsAltCugDefault )) + { + error = KErrCorrupt; + break; + } + } + //If value outside of 1-32767, it is not accepted. + else + { + if (( value < ESSSettingsCugSuppress ) || + ( value > ESSSettingsCugMax )) + { + error = KErrCorrupt; + break; + } + } + aValue = value; + break; + case ESSSettingsClir: + error = iData->iRepository->Get( + KSettingsCLIR, + value ); + if ( ( error != KErrNone ) && ( error != KErrNotFound ) ) + { + break; + } + if ( error == KErrNotFound ) + { + error = iData->iRepository->Set( + KSettingsCLIR, + ESSSettingsClirNetworkDefault ); + if ( error != KErrNone ) + { + break; + } + value = ESSSettingsClirNetworkDefault; + } + + if (( value < ESSSettingsClirNetworkDefault ) || + ( value > ESSSettingsClirExplicitSuppress )) + { + error = KErrCorrupt; + break; + } + aValue = value; + break; + + case ESSSettingsAls: + { + TInt simState(0); + error = RProperty::Get( KPSUidStartup, KPSSimStatus, simState ); + + __SSSLOGSTRING2("[SSS] ESSSettingsAls: SIM State: %d Error: %d", simState, error ); + if ( error == KErrNone ) + { + error = GetALSSettingValue( value, simState ); + aValue = value; + __SSSLOGSTRING1("[SSS] RSSSettings::Get: ALS Value: %d", aValue ); + } + break; + } + case ESSSettingsAlsBlocking: + { + RMmCustomAPI::TGetAlsBlockStatus alsBlockStatus = + RMmCustomAPI::EBlockStatusUnknown; + error = iData->iCustomPhone->GetAlsBlocked( alsBlockStatus ); + + if ( error != KErrNone ) + { + aValue = ESSSettingsAlsBlockingNotSupported; + return KErrNone; + } + switch ( alsBlockStatus ) + { + case RMmCustomAPI::EBlockStatusNotSupported: + aValue = ESSSettingsAlsBlockingNotSupported; + break; + case RMmCustomAPI::EBlockStatusActive: + aValue = ESSSettingsAlsBlockingOn; + break; + case RMmCustomAPI::EBlockStatusInactive: + aValue = ESSSettingsAlsBlockingOff; + break; + case RMmCustomAPI::EBlockStatusUnknown: + error = KErrNotSupported; + break; + default: + error = KErrNotSupported; + break; + } + break; + } + case ESSSettingsDefaultCug: + aValue = iData->iCUGDefault; + break; + default: + error = KErrNotSupported; + break; + } + + __SSSLOGSTRING("[SSS] <--RSSSettings::Get"); + __SSSLOGSTRING1("[SSS] <--RSSSettings::Get Error code: %d", error ); + return error; + } + +// --------------------------------------------------------- +// RSSSettings::GetALSSettingValue +// --------------------------------------------------------- +// +TInt RSSSettings::GetALSSettingValue( TInt& aValue, const TInt aSimState ) + { + __SSSLOGSTRING1("[SSS]--> RSSSettings::GetALSSettingValue SIMSTATE: %d", aSimState ); + TInt value(0); + TBool simAlsValue(EFalse); + TBool ppAlsValue(EFalse); + TBool alsCSPSupport(EFalse); + TInt error(KErrNone); + /* aValue is set to ESSSettingsAlsNotSupported value because if SimState isnt + ESimUsable or ALS handler doesnt exist then value should always be Not Supported.*/ + aValue = ESSSettingsAlsNotSupported; + + // als is NULL when ALS is not supported by PP als, SIM als and SIM csp als bits. + CSSSettingsAlsNotifier* als = iData->iNotifier->GetAlsHandler(); + __SSSLOGSTRING1("[SSS] AlsHandler value: %d", als ); + + // Make sure that SIM state is OK otherwise parameters coming from SIM are mess. + if ( ( aSimState == ESimUsable ) && als ) + { + error = als->GetAlsValue( (TSSSettingsAlsValue&) value ); + if ( error == KErrNone ) + { + if (( value < ESSSettingsAlsNotSupported ) || + ( value > ESSSettingsAlsAlternate )) + { + error = KErrCorrupt; + return error; + } + + TInt alsCSPError(KErrNone); + als->GetAlsSupport( ppAlsValue, simAlsValue, alsCSPSupport, alsCSPError ); + if ( alsCSPError == KErrNotReady || alsCSPError == KErrServerBusy ) + { + __SSSLOGSTRING1("[SSS] ALS - CSP specific Error code: %d", alsCSPError ); + return alsCSPError; + } + + // Decides if ALS is wanted to be shown. + if ( KErrNotSupported == IsALSSupported( ppAlsValue, simAlsValue, alsCSPSupport, error ) ) + { + value = ESSSettingsAlsNotSupported; + } + aValue = value; + } + } + __SSSLOGSTRING1("[SSS]<-- RSSSettings::GetALSSettingValue Error: %d", error ); + return error; + } + +// --------------------------------------------------------------------------- +// RSSSettings::IsALSSupported +// List all cases when als is shown. If there is some special SIM that doesn't +// support ALS then add case below and give error code KErrNotSupported. +// --------------------------------------------------------------------------- +// +TInt RSSSettings::IsALSSupported( TInt aPpAlsValue, TInt aSimAlsValue, + TBool aAlsCspSupport, TInt aAlsCspError ) const + { + TInt error(KErrNotSupported); + + __SSSLOGSTRING1("[SSS] RSSSettings::IsALSSupported ppAlsValue value: %d", aPpAlsValue ); + __SSSLOGSTRING1("[SSS] RSSSettings::IsALSSupported simAlsValue value: %d", aSimAlsValue ); + __SSSLOGSTRING1("[SSS] RSSSettings::IsALSSupported alsCSPSupport value: %d", aAlsCspSupport ); + __SSSLOGSTRING1("[SSS] RSSSettings::IsALSSupported alsCSPError value: %d", aAlsCspError ); + + // When PP ALS is on and used SIM card suppports CSP ALS then alsCSPSupport returns EFALSE and alsCSPError KErrNotSupported but ALS functionality + // needs to be shown therefore KErrNone is returned. + if ( aPpAlsValue && !aSimAlsValue && aAlsCspSupport == FALSE && aAlsCspError == KErrNotSupported ) + { + error = KErrNone; + } + else if ( aPpAlsValue && aSimAlsValue && aAlsCspSupport == FALSE ) + { + error = KErrNone; + } + else if ( aPpAlsValue && aSimAlsValue && aAlsCspSupport == TRUE ) + { + error = KErrNone; + } + else if ( aPpAlsValue && !aSimAlsValue && aAlsCspSupport == FALSE ) + { + error = KErrNone; + } + else if ( aPpAlsValue && !aSimAlsValue && aAlsCspSupport == TRUE ) + { + error = KErrNone; + } + else if ( !aPpAlsValue && aSimAlsValue && aAlsCspSupport == TRUE ) + { + error = KErrNone; + } + else if ( !aPpAlsValue && aSimAlsValue && aAlsCspSupport == FALSE ) + { + error = KErrNotSupported; + } + else if ( !aPpAlsValue && !aSimAlsValue && aAlsCspSupport == TRUE ) + { + error = KErrNone; + } + + return error; + } + +// --------------------------------------------------------- +// RSSSettings::Set +// --------------------------------------------------------- +// +EXPORT_C TInt RSSSettings::Set( TSSSettingsSetting aSetting, TInt aValue ) + { + __SSSLOGSTRING("[SSS]--> RSSSettings::Set"); + __ASSERT_DEBUG( iData, Panic( SSSettingsPanicOpenNotDone ) ); + if ( !iData ) + { + return KErrBadHandle; + } + + __ASSERT_DEBUG( aSetting <= KSSSettingsLastSetting, + Panic( SSSettingsPanicInvalidRequest ) ); + + TInt error(KErrNone); + if ( error != KErrNone ) + { + return error; + } + + switch ( aSetting ) + { + case ESSSettingsCug: + { + if ( iData->iCUGDefault == ESSSettingsAltCugDefault ) + { + if ((( aValue < ESSSettingsCugSuppress ) || + ( aValue > ESSSettingsCugMax )) && + ( aValue != iData->iCUGDefault )) + { + error = KErrArgument; + break; + } + } + else + { + if (( aValue < ESSSettingsCugSuppress ) || + ( aValue > ESSSettingsCugMax )) + { + error = KErrArgument; + break; + } + } + if ( error == KErrNone ) + { + error = SetCug( aValue, iData->iCUGDefault ); + } + } + break; + case ESSSettingsClir: + if (( aValue < ESSSettingsClirNetworkDefault ) || + ( aValue > ESSSettingsClirExplicitSuppress )) + { + error = KErrArgument; + break; + } + error = iData->iRepository->Set( + KSettingsCLIR, + aValue ); + break; + case ESSSettingsAls: + { + // ESSSettingsAlsBlockingNotSupported is not allowed to write + if (( aValue < ESSSettingsAlsBlockingOff ) || + ( aValue > ESSSettingsAlsAlternate )) + { + error = KErrArgument; + break; + } + + CSSSettingsAlsNotifier* als = iData->iNotifier->GetAlsHandler(); + if ( als ) + { + error = als->SetAlsValue( (TSSSettingsAlsValue)aValue ); + } + else + { + error = KErrNotSupported; + } + break; + } + case ESSSettingsAlsBlocking: + switch ( aValue ) + { + case ESSSettingsAlsBlockingOn: + error = iData->iCustomPhone->SetAlsBlocked( + RMmCustomAPI::EActivateBlock ); + break; + case ESSSettingsAlsBlockingOff: + error = iData->iCustomPhone->SetAlsBlocked( + RMmCustomAPI::EDeactivateBlock ); + break; + default: + error = KErrArgument; + break; + } + break; + case ESSSettingsDefaultCug: + return KErrNotSupported; + default: + error = KErrArgument; + break; + } + + if ( error == KErrNone ) + { + // If old request is still waiting, force it to end. + if (( iData->iCallBackSetting != KErrBadDescriptor ) || + ( iData->iCallBackValue != KErrBadDescriptor )) + { + iData->iCallBack->Cancel(); + InformCallBack( this ); + } + + // activate call back + iData->iCallBackSetting = aSetting; + iData->iCallBackValue = aValue; + iData->iCallBack->CallBack(); + } + __SSSLOGSTRING("[SSS] <--RSSSettings::Set"); + return error; + } + +// --------------------------------------------------------- +// RSSSettings::HandleSIMChanged +// --------------------------------------------------------- +// +EXPORT_C TInt RSSSettings::HandleSIMChanged() + { + __SSSLOGSTRING("[SSS]--> RSSSettings::HandleSIMChanged"); + __ASSERT_DEBUG( iData, Panic( SSSettingsPanicOpenNotDone ) ); + if ( !iData ) + { + return KErrBadHandle; + } + TInt error = Set( ESSSettingsCug, iData->iCUGDefault ); + if ( error != KErrNone ) + { + return error; + } + else + { + // Reset also the previous Cug value. + error = ResetPreviousCugValue(); + if ( error != KErrNone ) + { + return error; + } + } + + error = Set( ESSSettingsClir, ESSSettingsClirNetworkDefault ); + if ( error != KErrNone ) + { + return error; + } + + // Set als to primary only if it's stored in Shared Data. + CSSSettingsAlsNotifier* als = iData->iNotifier->GetAlsHandler(); + if ( als ) + { + TBool simAls(EFalse); + TBool ppAls(EFalse); + TBool cspAls(EFalse); + TInt cspError(KErrNone); + als->GetAlsSupport( ppAls, simAls, cspAls, cspError ); + __SSSLOGSTRING2("[SSS] RSSSettings::HandleSIMChanged: ppAls: %d, simAls: %d", ppAls, simAls ); + if ( !simAls ) + { + error = Set( ESSSettingsAls, ESSSettingsAlsPrimary ); + } + } + __SSSLOGSTRING("[SSS] <--RSSSettings::HandleSIMChanged"); + return error; + } + +// --------------------------------------------------------- +// RSSSettings::ExistsObserver +// --------------------------------------------------------- +// +TBool RSSSettings::ExistsObserver( TSSSettingsSetting aSetting, + MSSSettingsObserver& aObserver ) + { + __SSSLOGSTRING("[SSS]--> RSSSettings::ExistsObserver"); + if ( !iData ) + { + return EFalse; + } + + __ASSERT_ALWAYS( aSetting <= KSSSettingsLastSetting, + Panic( SSSettingsPanicInvalidRequest ) ); + + TInt index = iData->iObservers[aSetting].Find( &aObserver ); + if ( index == KErrNotFound ) + { + return EFalse; + } + + __SSSLOGSTRING("[SSS] <--RSSSettings::ExistsObserver"); + return ETrue; + } + +// --------------------------------------------------------- +// RSSSettings::FindOneObserver +// --------------------------------------------------------- +// +MSSSettingsObserver* RSSSettings::FindOneObserver() const + { + __SSSLOGSTRING("[SSS]--> RSSSettings::FindOneObserver"); + if ( iData == NULL ) + { + return NULL; + } + + for ( TInt settingIndex = 0 ; + settingIndex < iData->iObservers.Count() ; + settingIndex++ ) + { + RSSSettingsObserverArray& array = iData->iObservers[settingIndex]; + if ( array.Count() ) + { + return array[0]; + } + } + + __SSSLOGSTRING("[SSS] <--RSSSettings::FindOneObserver"); + return NULL; + } + +// --------------------------------------------------------- +// RSSSettings::GetCug +// --------------------------------------------------------- +// +TInt RSSSettings::GetCug( TInt& aValue ) const + { + __SSSLOGSTRING("[SSS]--> RSSSettings::GetCug"); + TInt value(KErrNone); + TInt error(KErrNone); + error = iData->iRepository->Get( + KSettingsCUG, + value ); + + if ( error == KErrNone ) + { + aValue = value; + } + + __SSSLOGSTRING1("[SSS] RSSSettings::GetCug: value: %d", value ); + __SSSLOGSTRING("[SSS] <--RSSSettings::GetCug"); + return error; + } + +// --------------------------------------------------------- +// RSSSettings::GetDefaultCugL +// --------------------------------------------------------- +// +TInt RSSSettings::GetDefaultCugL( TInt& aValue ) const + { + __SSSLOGSTRING("[SSS]--> RSSSettings::GetDefaultCugL"); + TInt value(0); + TBool useDefault(EFalse); + TInt error(KErrNone); + CRepository* repository = CRepository::NewL( KCRUidTelSrvVariation ); + error = repository->Get( + KTelSrvVariationFlags, + value ); + delete repository; + repository = NULL; + __SSSLOGSTRING1("[SSS]--> RSSSettings::GetDefaultCugL: value: %d", value); + + if ( error == KErrNotFound ) + { + useDefault = ETrue; + } + else if ( error != KErrNone ) + { + return error; + } + + if (( useDefault ) || + !( value & KTelephonyLVFlagStandardCugIndexing )) + { + value = ESSSettingsCugDefault; + } + else + { + value = ESSSettingsAltCugDefault; + } + //Return directly (i.e. no shifting). + aValue = value; + + __SSSLOGSTRING1("[SSS]--> RSSSettings::GetDefaultCugL: value: %d", value); + __SSSLOGSTRING("[SSS] <--RSSSettings::GetDefaultCugL"); + return error; + } + +// --------------------------------------------------------- +// RSSSettings::SetCug +// Reads existing CUG value from shared data. If new CUG +// value is between 1 and 32767 (or between 0 and 32767), +// value is to shared data. +// Change also the previous cug to be the old current one. +// --------------------------------------------------------- +// +TInt RSSSettings::SetCug( const TInt aValue, const TInt aCugDefault ) const + { + __SSSLOGSTRING("[SSS]--> RSSSettings::SetCug"); + TInt value(KErrNone); + TInt error(KErrNone); + error = iData->iRepository->Get( KSettingsCUG, value ); + __SSSLOGSTRING1("[SSS]--> RSSSettings::SetCug: value: %d", value); + if ( error == KErrNone ) + { + TInt previousCug(value); + + // CUG default must be saved as shared data default, to support + // different platform versions. Do not write default Cug again to + // Central Repository, if already exists. + if ( ( aValue != aCugDefault ) || + ( ( aValue == aCugDefault ) && ( previousCug != aCugDefault ) ) ) + { + // Write the current cug value to Central Repository. + error = iData->iRepository->Set( KSettingsCUG, aValue ); + __SSSLOGSTRING1("[SSS]--> RSSSettings::SetCug: aValue: %d", aValue); + if ( error == KErrNone ) + { + if ( ( previousCug != ESSSettingsCugSuppress ) && + ( previousCug != aCugDefault ) ) + { + // Write previous cug value to Central Repository. + // Default or Suppress value can not be previousCug. + error = iData->iRepository->Set( + KSettingsPreviousCUGIndex, + previousCug ); + __SSSLOGSTRING1("[SSS]--> RSSSettings::SetCug: previousCug: %d", previousCug); + } + } + } + } + __SSSLOGSTRING("[SSS] <--RSSSettings::SetCug"); + return error; + } + +// --------------------------------------------------------- +// RSSSettings::PreviousCugValue +// --------------------------------------------------------- +// +EXPORT_C TInt RSSSettings::PreviousCugValue( TInt& aPreviousValue ) + { + __SSSLOGSTRING("[SSS]--> RSSSettings::PreviousCugValue"); + __ASSERT_DEBUG( iData, Panic( SSSettingsPanicOpenNotDone ) ); + if ( !iData ) + { + return KErrBadHandle; + } + TInt value(KErrNone); + TInt error = iData->iRepository->Get( + KSettingsPreviousCUGIndex, + value ); + + if ( error == KErrNone ) + { + aPreviousValue = value; + } + + __SSSLOGSTRING1("[SSS]--> RSSSettings::PreviousCugValue: value: %d", value); + __SSSLOGSTRING("[SSS] <--RSSSettings::PreviousCugValue"); + return error; + } + +// --------------------------------------------------------- +// RSSSettings::ResetPreviousCugValue +// Reset PreviousCugValue +// --------------------------------------------------------- +// +EXPORT_C TInt RSSSettings::ResetPreviousCugValue() + { + __SSSLOGSTRING("[SSS]--> RSSSettings::ResetPreviousCugValue"); + __ASSERT_DEBUG( iData, Panic( SSSettingsPanicOpenNotDone ) ); + if ( !iData ) + { + return KErrBadHandle; + } + + TInt value(KErrNone); + TInt error(KErrNone); + error = iData->iRepository->Get( + KSettingsPreviousCUGIndex, + value ); + __SSSLOGSTRING1("[SSS]--> RSSSettings::PreviousCugValue; before setting: value: %d", value); + if ( error == KErrNone ) + { + // Set cug to default one. + value = iData->iCUGDefault; + error = iData->iRepository->Set( + KSettingsPreviousCUGIndex, + value ); + __SSSLOGSTRING1("[SSS]--> RSSSettings::PreviousCugValue; after setting: value: %d", value); + } + __SSSLOGSTRING("[SSS] <--RSSSettings::ResetPreviousCugValue"); + return error; + } + +// --------------------------------------------------------- +// RSSSettings::HandleRefresh +// --------------------------------------------------------- +// +EXPORT_C TInt RSSSettings::HandleRefresh() + { + __ASSERT_DEBUG( iData, Panic( SSSettingsPanicOpenNotDone ) ); + if ( !iData ) + { + return KErrBadHandle; + } + + return iData->iNotifier->HandleRefresh(); + } + +// --------------------------------------------------------- +// RSSSettings::IsValueValidCugIndex +// --------------------------------------------------------- +// +EXPORT_C TBool RSSSettings::IsValueValidCugIndex( const TInt& aValue ) const + { + __ASSERT_DEBUG( iData, Panic( SSSettingsPanicOpenNotDone ) ); + if ( !iData ) + { + return KErrBadHandle; + } + + TBool validCugIndex = !(( aValue > ESSSettingsCugMax ) || + ( aValue < ESSSettingsCugMin )); + + if ( iData->iCUGDefault != ESSSettingsCugDefault ) + { + validCugIndex = validCugIndex || + aValue == ESSSettingsAltCugMin; + } + return validCugIndex; + } + +// ================= OTHER EXPORTED FUNCTIONS ============== +// Panic +GLREF_C void Panic( TSSSettingsPanic aPanic ) + { + User::Panic( KPanicCat, aPanic ); + } + +// End of File