diff -r 35488577e233 -r 2fa1fa551b0b cellular/SSSettings/src/RSSSettings.cpp --- a/cellular/SSSettings/src/RSSSettings.cpp Mon Aug 23 15:50:31 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1195 +0,0 @@ -/* -* 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