cellular/SSSettings/src/RSSSettings.cpp
changeset 0 ff3b6d0fd310
child 19 7d48bed6ce0c
--- /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    <bldvariant.hrh> // for feature definitions
+#include    <e32base.h>
+#include    <rmmcustomapi.h>
+#include    <mmtsy_names.h>
+#include    <PSVariables.h>
+#include    <startupdomainpskeys.h>
+#include    <centralrepository.h>       // Central repository
+#include    <SSSettingsPrivateCRKeys.h>  // Settings Central Repository keys.
+#include    <telservicesinternalcrkeys.h>
+#include    <telservicesvariant.hrh>
+
+#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<KSSSettingsTSYNameMaxLength> 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 <RSSSettings*> ( 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 <TSSSettingsSetting >( 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 <TSSSettingsSetting> ( 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