diff -r 000000000000 -r ff3b6d0fd310 cellular/SSSettings/src/CSSSettingsNotifier.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cellular/SSSettings/src/CSSSettingsNotifier.cpp Tue Feb 02 01:11:09 2010 +0200 @@ -0,0 +1,422 @@ +/* +* 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: Notifier for changes. +* +*/ + + +// INCLUDE FILES +#include +#include +#include + +#include "CSSSettingsNotifier.h" +#include "MSSSettingsObserver.h" +#include "CSSSettingsAlsNotifier.h" +#include "SSSettingsLogger.h" + + +// DATA TYPES + +/** +* It enumerates all keys to be notified from Central Repository under +* KCRUidSupplementaryServiceSettings. +* +* ESSSettingsKeyNone - No key change to be notified. +* ESSSettingsKeyAlsLine - Als line change to be notified. +* ESSSettingsKeyClir - Clir change to be notified. +* ESSSettingsKeyCug - Cug change to be notified. +* ESSSettingsKeyAll - All keys to be notified. +*/ +enum TSSSettingsCenRepNotifyKey + { + ESSSettingsKeyNone = 0x00000000, + ESSSettingsKeyAlsLine = 0x00000001, + ESSSettingsKeyClir = 0x00000002, + ESSSettingsKeyCug = 0x00000004, + + // Keep as last. + ESSSettingsKeyAll = 0xFFFFFFFF + }; + + +// ================= MEMBER FUNCTIONS ======================= + +// ----------------------------------------------------------------------------- +// CSSSettingsNotifier::CSSSettingsNotifier +// ----------------------------------------------------------------------------- +// +CSSSettingsNotifier::CSSSettingsNotifier( RSSSettings& aSettings ) +: CActive( EPriorityStandard ), + iSettings( aSettings ), + iNotifyKeys ( ESSSettingsKeyNone ) + { + CActiveScheduler::Add( this ); + } + + +// ----------------------------------------------------------------------------- +// CSSSettingsNotifier::ConstructL +// ----------------------------------------------------------------------------- +// +void CSSSettingsNotifier::ConstructL() + { + iAls = CSSSettingsAlsNotifier::NewL( + iSettings.iData->iMobilePhone, + *iSettings.iData->iCustomPhone, + *this ); + + iRepository = CRepository::NewL( KCRUidSupplementaryServiceSettings ); + + iCenRepAlsNotifyHandler = CCenRepNotifyHandler::NewL( + *this, + *iRepository, + CCenRepNotifyHandler::EIntKey, + KSettingsAlsLine ); + + iCenRepClirNotifyHandler = CCenRepNotifyHandler::NewL( + *this, + *iRepository, + CCenRepNotifyHandler::EIntKey, + KSettingsCLIR ); + + iCenRepCugNotifyHandler = CCenRepNotifyHandler::NewL( + *this, + *iRepository, + CCenRepNotifyHandler::EIntKey, + KSettingsCUG ); + + // Start listening all the keys, the notify is handled only if there is + // notify request made. + iCenRepAlsNotifyHandler->StartListeningL(); + iCenRepClirNotifyHandler->StartListeningL(); + iCenRepCugNotifyHandler->StartListeningL(); + } + +// ----------------------------------------------------------------------------- +// CSSSettingsNotifier::~CSSSettingsNotifier +// ----------------------------------------------------------------------------- +// +CSSSettingsNotifier::~CSSSettingsNotifier() + { + Cancel(); + if( iCenRepAlsNotifyHandler ) + { + iCenRepAlsNotifyHandler->StopListening(); + } + + if( iCenRepClirNotifyHandler ) + { + iCenRepClirNotifyHandler->StopListening(); + } + + if( iCenRepCugNotifyHandler ) + { + iCenRepCugNotifyHandler->StopListening(); + } + + delete iCenRepAlsNotifyHandler; + delete iCenRepClirNotifyHandler; + delete iCenRepCugNotifyHandler; + delete iRepository; + delete iAls; + + } + +// ----------------------------------------------------------------------------- +// CSSSettingsNotifier::AddNotifier +// ----------------------------------------------------------------------------- +// +TInt CSSSettingsNotifier::AddNotifier( TSSSettingsSetting aSetting ) + { + __SSSLOGSTRING("[SSS]--> CSSSettingsNotifier::AddNotifier"); + TInt error(KErrNone); + switch ( aSetting ) + { + case ESSSettingsCug: + iNotifyKeys = ( iNotifyKeys | ESSSettingsKeyCug ); + break; + + case ESSSettingsClir: + iNotifyKeys = ( iNotifyKeys | ESSSettingsKeyClir ); + break; + + case ESSSettingsAls: + error = iAls->NotifyAlsChange(); + if ( error == KErrNone || error == KErrAlreadyExists ) + { + iNotifyKeys = ( iNotifyKeys | ESSSettingsKeyAlsLine ); + } + break; + + case ESSSettingsAlsBlocking: + // Handled via active object + if ( !IsActive() ) + { + iSettings.iData->iCustomPhone->NotifyAlsBlockedChanged( + iStatus, iAlsBlockStatus ); + SetActive(); + } + else + { + error = KErrAlreadyExists; + } + break; + + case ESSSettingsDefaultCug: + //CUG default cannot be changed + break; + + default: + error = KErrNotSupported; + } + + __SSSLOGSTRING1("[SSS] CSSSettingsNotifier::AddNotifier: error: %d", error ); + __SSSLOGSTRING("[SSS] <--CSSSettingsNotifier::AddNotifier"); + return error; + } + +// ----------------------------------------------------------------------------- +// CSSSettingsNotifier::RemoveNotifier +// ----------------------------------------------------------------------------- +// +void CSSSettingsNotifier::RemoveNotifier( TSSSettingsSetting aSetting ) + { + __SSSLOGSTRING("[SSS]--> CSSSettingsNotifier::RemoveNotifier"); + switch ( aSetting ) + { + case ESSSettingsCug: + iNotifyKeys = ( iNotifyKeys & ( ~ESSSettingsKeyCug ) ); + break; + + case ESSSettingsClir: + iNotifyKeys = ( iNotifyKeys & ( ~ESSSettingsKeyClir ) ); + break; + + case ESSSettingsAls: + if ( iAls ) + { + iAls->CancelNotify(); + } + iNotifyKeys = ( iNotifyKeys & ( ~ESSSettingsKeyAlsLine ) ); + break; + + case ESSSettingsAlsBlocking: + Cancel(); + break; + + default: + break; + } + __SSSLOGSTRING("[SSS] <--CSSSettingsNotifier::RemoveNotifier"); + } + +// ----------------------------------------------------------------------------- +// CSSSettingsNotifier::RunL +// ----------------------------------------------------------------------------- +// +void CSSSettingsNotifier::RunL() + { + __SSSLOGSTRING("[SSS]--> CSSSettingsNotifier::RunL"); + switch ( iStatus.Int() ) + { + case KErrCancel: + case KErrNotSupported: + return; + case KErrNone: + // Inform observers + switch ( iAlsBlockStatus ) + { + case RMmCustomAPI::EBlockStatusNotSupported: + iSettings.InformChange( + ESSSettingsAlsBlocking, + static_cast ( + ESSSettingsAlsBlockingNotSupported ) ); + break; + case RMmCustomAPI::EBlockStatusActive: + iSettings.InformChange( + ESSSettingsAlsBlocking, + static_cast ( ESSSettingsAlsBlockingOn ) ); + break; + case RMmCustomAPI::EBlockStatusInactive: + iSettings.InformChange( ESSSettingsAlsBlocking, + static_cast ( ESSSettingsAlsBlockingOff ) ); + break; + case RMmCustomAPI::EBlockStatusUnknown: + break; + default: + break; + } + break; + default: + break; + } + + // re-activate request. + iSettings.iData->iCustomPhone->NotifyAlsBlockedChanged( + iStatus, iAlsBlockStatus ); + SetActive(); + + __SSSLOGSTRING("[SSS] <--CSSSettingsNotifier::RunL"); + } + +// ----------------------------------------------------------------------------- +// CSSSettingsNotifier::DoCancel +// ----------------------------------------------------------------------------- +// +void CSSSettingsNotifier::DoCancel() + { + iSettings.iData->iCustomPhone->CancelAsyncRequest( + ECustomNotifyAlsBlockedChangedIPC ); + } + +// ----------------------------------------------------------------------------- +// CSSSettingsNotifier::HandleNotifyInt +// ----------------------------------------------------------------------------- +// +void CSSSettingsNotifier::HandleNotifyInt( TUint32 aId, TInt aNewValue ) + { + __SSSLOGSTRING2("[SSS] -->CSSSettingsNotifier::HandleNotifyInt aId: %d aNewValue: %d", aId, aNewValue); + // First check CUG mode + if ( aId == KSettingsCUG ) + { + // Inform change only if Cug notify request is on. + if ( iNotifyKeys & ESSSettingsKeyCug ) + { + iSettings.InformChange( + ESSSettingsCug, + aNewValue ); + } + } + + // Then CLIR + else if ( aId == KSettingsCLIR ) + { + // Inform change only if Clir notify request is on. + if ( iNotifyKeys & ESSSettingsKeyClir ) + { + iSettings.InformChange( + ESSSettingsClir, + aNewValue ); + } + } + + // ALS - not forwarded if not supported + else if ( aId == KSettingsAlsLine ) + { + // Inform change only if Als line notify request is on. + if ( iNotifyKeys & ESSSettingsKeyAlsLine ) + { + TBool ppSupported(EFalse); + TBool simSupported(EFalse); + TBool cspSupported(EFalse); + TInt cspError(KErrNone); + iAls->GetAlsSupport( ppSupported, + simSupported, + cspSupported, + cspError ); + __SSSLOGSTRING1("[SSS] ppSupported: %d", ppSupported); + __SSSLOGSTRING1("[SSS] simSupported: %d", simSupported); + __SSSLOGSTRING1("[SSS] cspSupported: %d", cspSupported); + __SSSLOGSTRING1("[SSS] cspError: %d", cspError); + if ( AlsSupport( ppSupported, cspSupported, cspError ) ) + { + __SSSLOGSTRING1("[SSS] ->InformChange aNewValue:%d", aNewValue); + iSettings.InformChange( + ESSSettingsAls, + aNewValue ); + } + else + { + __SSSLOGSTRING("[SSS] ->InformChange AlsNotSupported "); + iSettings.InformChange( + ESSSettingsAls, + ESSSettingsAlsNotSupported ); + } + } + } + // Other + else + { + __ASSERT_DEBUG( EFalse, User::Invariant() ); + } + __SSSLOGSTRING("[SSS] <--CSSSettingsNotifier::HandleNotifyInt"); + } + +// ----------------------------------------------------------------------------- +// CSSSettingsNotifier::AlsSupport +// ----------------------------------------------------------------------------- +// +TBool CSSSettingsNotifier::AlsSupport( TBool aPPSupport, TBool aCSPSupport, + TInt aCSPError ) + { + TBool send(EFalse); + // If aCSPSupport is false and CSP doesnt return error then it is not + // needed to send notification to clients. + if ( aPPSupport || ( aCSPSupport && aCSPError == KErrNone ) ) + { + send = ETrue; + } + + return send; + } + +// ----------------------------------------------------------------------------- +// CSSSettingsNotifier::HandleNotifyError +// ----------------------------------------------------------------------------- +// +void CSSSettingsNotifier::HandleNotifyError( TUint32 /*aId*/, TInt /*aError*/, + CCenRepNotifyHandler* /*aHandler*/ ) + { + // Here you could call the below, if you are sure that it do not cause + // eternal loop + // TRAPD( error, aHandler->StartListeningL() ); + } + + +// ----------------------------------------------------------------------------- +// CSSSettingsNotifier::GetAlsHandler +// ----------------------------------------------------------------------------- +// +CSSSettingsAlsNotifier* CSSSettingsNotifier::GetAlsHandler() + { + __SSSLOGSTRING("[SSS]--> CSSSettingsNotifier::GetAlsHandler"); + TBool ppSupported(EFalse); + TBool simSupported(EFalse); + TBool cspSupported(EFalse); + TInt cspError(KErrNone); + iAls->GetAlsSupport( ppSupported, simSupported, cspSupported, cspError ); + __SSSLOGSTRING1("[SSS] CSSSettingsNotifier::GetAlsHandler: ppSupported: %d", ppSupported ); + __SSSLOGSTRING1("[SSS] CSSSettingsNotifier::GetAlsHandler: simSupported: %d", simSupported ); + __SSSLOGSTRING1("[SSS] CSSSettingsNotifier::GetAlsHandler: cspSupported: %d", cspSupported ); + if ( ppSupported || simSupported || cspSupported ) + { + __SSSLOGSTRING("[SSS] <--CSSSettingsNotifier::GetAlsHandler: ALS supported"); + return iAls; // returned only if supported + } + + __SSSLOGSTRING("[SSS] <--CSSSettingsNotifier::GetAlsHandler: NULL returned"); + return NULL; + } + +// ----------------------------------------------------------------------------- +// CSSSettingsNotifier::HandleRefresh +// ----------------------------------------------------------------------------- +// +TInt CSSSettingsNotifier::HandleRefresh() + { + return iAls->HandleRefresh(); + } + +// End of File