diff -r 000000000000 -r 8c5d936e5675 gssettingsuis/Gs/GSNetworkPlugin/Src/GSNetworkPluginModel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gssettingsuis/Gs/GSNetworkPlugin/Src/GSNetworkPluginModel.cpp Thu Dec 17 08:52:52 2009 +0200 @@ -0,0 +1,667 @@ +/* +* Copyright (c) 2006 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: +* Model/Engine for Network Settings Plugin +* +*/ + + +// INCLUDE FILES +#include "GSNetworkPluginModel.h" +#include "GSNetworkPlugin.h" +#include "GsNetworkPlugin.hrh" +#include "GsLogger.h" //for logging traces +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include //PubSub +#include +#include "SettingsPrivateCRKeys.h" +#include +#include +#include //ongoing call check +#include "GSNetworkDebugHelper.h" +#include //for resource IDs + +//CONSTANTS +// default value for autolock period +// default value for Sat operations + + +_LIT( KGSNameOfClass, "CGSNetworkPluginModel" ); + +// Warning disabled as this constant is used inside __ASSERT_DEBUG +#pragma diag_suppress 177 +_LIT( KGSNetworkPluginModelAssertName, "CGSNetworkPluginModel::CheckState" ); + + +// ================= MEMBER FUNCTIONS ======================= + +// ---------------------------------------------------------------------------- +// CGSNetworkPluginModel::NewL +// +// Symbian OS two-phased constructor, overloaded version +// ---------------------------------------------------------------------------- +// +CGSNetworkPluginModel* CGSNetworkPluginModel::NewL( + CGSNetworkPluginContainer* aContainer, + CGSNetworkPlugin* aPlugin ) + { + CGSNetworkPluginModel* self = new( ELeave ) CGSNetworkPluginModel( + aContainer, + aPlugin ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// ---------------------------------------------------------------------------- +// CGSNetworkPluginModel::CGSNetworkPluginModel +// +// C++ default constructor can NOT contain any code, that +// might leave. +// ---------------------------------------------------------------------------- +// +CGSNetworkPluginModel::CGSNetworkPluginModel( + CGSNetworkPluginContainer* aContainer, + CGSNetworkPlugin* aPlugin ) + : iNetworkMode( KGSNetworkModeCapsNotUpdated ), + iContainer( aContainer ), + iPlugin( aPlugin ) + { + } + + +// ---------------------------------------------------------------------------- +// CGSNetworkPluginModel::ConstructL +// +// EPOC default constructor can leave. +// ---------------------------------------------------------------------------- +// +void CGSNetworkPluginModel::ConstructL() + { + ConstructBaseItemsL(); + } + +// ---------------------------------------------------------------------------- +// CGSNetworkPluginModel::ConstructBaseItemsL +// +// Constructing base items +// ---------------------------------------------------------------------------- +// +void CGSNetworkPluginModel::ConstructBaseItemsL() + { + FeatureManager::InitializeLibL(); + InitializeCentralRepositoryL(); + SetCSPActiveL( ETrue ); + iSettingsContainer = CPsetContainer::NewL(); + User::LeaveIfError( iGSVariationRepository->Get( + KSettingsVariationFlags, iLocalVariationValues ) ); +#ifndef __WINS__ + //This is currently not supported by emulator + CreatePhoneSettingsEngineL(); +#endif //__WINS__ + } + + +// ---------------------------------------------------------------------------- +// CGSNetworkPluginModel::~CGSNetworkPluginModel +// +// Destructor +// ---------------------------------------------------------------------------- +// +CGSNetworkPluginModel::~CGSNetworkPluginModel() + { + UninitializeCentralRepository(); + + if ( GetCSPStatus() ) + { + TRAP_IGNORE( SetCSPActiveL( EFalse ) ); + } + + if ( iPhoneSettingsEngine ) + { + delete iPhoneSettingsEngine; + } + + if( iSettingsContainer ) + { + delete iSettingsContainer; + } + + FeatureManager::UnInitializeLib(); + + if ( iContainer ) + { + iContainer = NULL; + } + } + +// ---------------------------------------------------------------------------- +// CGSNetworkPluginModel::InitializeCentralRepositoryL +// +// Creating and setting keys for the Central Repository +// ---------------------------------------------------------------------------- +// +void CGSNetworkPluginModel::InitializeCentralRepositoryL() + { + iNetworkRepository = CRepository::NewL( KCRUidNetworkSettings ); + iGSVariationRepository = CRepository::NewL( KCRUidSettingsVariation ); + } + +// ---------------------------------------------------------------------------- +// CGSNetworkPluginModel::UninitializeCentralRepositoryL +// +// Removes Central Repository objects +// ---------------------------------------------------------------------------- +// +void CGSNetworkPluginModel::UninitializeCentralRepository() + { + if ( iNetworkRepository ) + { + delete iNetworkRepository; + iNetworkRepository = NULL; + } + if ( iGSVariationRepository ) + { + delete iGSVariationRepository; + iGSVariationRepository = NULL; + } + } + +// ---------------------------------------------------------------------------- +// CGSNetworkPluginModel::GetCSPStatus +// +// Get Customer Service Profile status +// ---------------------------------------------------------------------------- +// +TBool CGSNetworkPluginModel::GetCSPStatus() + { + if ( iCSP ) + { + return ETrue; + } + else + { + return EFalse; + } + } + +// ---------------------------------------------------------------------------- +// CGSNetworkPluginModel::SetCSPActiveL +// +// Set Customer Service Profile active +// ---------------------------------------------------------------------------- +// +void CGSNetworkPluginModel::SetCSPActiveL( TBool aValue ) + { + if ( aValue ) + { + iCSP = CPsetCustomerServiceProfile::NewL(); + User::LeaveIfError( iCSP->OpenCSProfileL() ); + } + else + { + delete iCSP; + iCSP = NULL; + } + } + +// ---------------------------------------------------------------------------- +// CGSNetworkPluginModel::IsNetworkModeVisible +// +// Get network mode status value from shared data. +// ---------------------------------------------------------------------------- +// +TBool CGSNetworkPluginModel::IsNetworkModeVisible() + { + TBool nwModeAvailable = EFalse; + TInt value; + + iNetworkRepository->Get( KSettingsNetworkMode, value ); + + switch ( value ) + { + case 1: + nwModeAvailable = ETrue; + break; + case 0: + nwModeAvailable = EFalse; + break; + default: + break; + } + + return nwModeAvailable; + + } + +// ---------------------------------------------------------------------------- +// CGSNetworkPluginModel::IsSettingSupported +// +// Check if a given setting is supported +// ---------------------------------------------------------------------------- +// +TBool CGSNetworkPluginModel::IsSettingSupported( TInt aSettingNumber ) + { + __ASSERT_ALWAYS( iCSP != NULL, User::Panic( KGSNameOfClass, + EGSTelPluinModelPanicNullPtr ) ); + TBool settingSupported = EFalse; + TInt retVal = KErrNone; + switch ( aSettingNumber ) + { + case EGSCSPCallForward: + retVal = iCSP->IsCFSupported( settingSupported ); + break; + case EGSCSPCallBarring: + retVal = iCSP->IsCBSupported( settingSupported ); + break; + case EGSCSPCallWaiting: + retVal = iCSP->IsCWSupported( settingSupported ); + break; + case EGSCSPAlternateLine: + retVal = iCSP->IsALSSupported( settingSupported ); + break; + case EGSCSPManualNetworkSelection: + retVal = iCSP->IsNetworkSelectionSupported( settingSupported ); + break; + default: + break; + } + + if ( retVal != KErrNone ) + { + //if a CSP error occurs, by default service is available + settingSupported = ETrue; + } + + return settingSupported; + } + +// ---------------------------------------------------------------------------- +// CGSNetworkPluginModel::GetMCNSettingValue +// Gets MCN setting value +// +// ---------------------------------------------------------------------------- +// +TBool CGSNetworkPluginModel::GetMCNSettingValue( TInt& aId ) + { + TInt ret = KErrNone; + ret = iNetworkRepository->Get( KSettingsMcnDisplay, aId ); + return ret; + } + +// ---------------------------------------------------------------------------- +// CGSNetworkPluginModel::SetMCNSettingValue +// Sets MCN setting value +// +// ---------------------------------------------------------------------------- +// +TBool CGSNetworkPluginModel::SetMCNSettingValue( TInt& aId ) + { + TInt ret = KErrNone; + ret = iNetworkRepository->Set( KSettingsMcnDisplay, aId ); + return ret; + } + +// ---------------------------------------------------------------------------- +// CGSNetworkPluginModel::GetSupportedNetworksL +// +// Get supported network mode list +// ---------------------------------------------------------------------------- +// +TInt CGSNetworkPluginModel::GetSupportedNetworksL() + { + TInt supportedNetworks = KGSSettingOff; + User::LeaveIfError( iNetworkRepository-> + Get( KSettingsNetworkModeList, supportedNetworks ) ); + + return supportedNetworks; + } + +// --------------------------------------------------------- +// CGSNetworkPluginModel::GraphicalNetworkListSupportedL +// +// Check if graphical network list is supported. +// --------------------------------------------------------- +// +TBool CGSNetworkPluginModel::GraphicalNetworkListSupportedL() + { + TBool supported = EFalse; + + if ( iLocalVariationValues & EGSConfig2G3GNetworkIcon ) + { + supported = ETrue; + } + + return supported; + } + +// --------------------------------------------------------- +// CGSTelPluginModel::AutomaticNetworkSearchSupportedL +// +// Check if automatic to automatic network search is supported. +// --------------------------------------------------------- +// +TBool CGSNetworkPluginModel::AutomaticNetworkSearchSupportedL() + { + TBool supported = EFalse; + + if ( iLocalVariationValues & EGSConfigNoAutoToAutoNetworkSearch ) + { + supported = ETrue; + } + return supported; + } + + +// --------------------------------------------------------------------------- +// +// Sets network mode to member variable. +// +// --------------------------------------------------------------------------- +// +void CGSNetworkPluginModel::CreatePhoneSettingsEngineL() + { + __GSLOGSTRING("[GS]--> CGSNetworkPluginModel::CreatePhoneSettingsEngineL"); + //initialize the phone settings object for network mode + if ( !iPhoneSettingsEngine ) + { + iPhoneSettingsEngine = iSettingsContainer->CreateNetworkModeObjectL( *this ); + } + iPhoneSettingsEngine->SetNetworkModeObserver( *this ); + // get the current net mode asynchronously + StartAsynGetCurrentNetworkModeSelectionL(); + + __GSLOGSTRING("[GS] <--CGSNetworkPluginModel::CreatePhoneSettingsEngineL"); + } + + +// --------------------------------------------------------------------------- +// CGSNetworkPluginModel::HandleNetworkSystemModeEventsL +// +// Handles Network system mode list fetching from CustomAPI. +// Handles Network system mode setting to CustomAPI. +// Handles current network system mode fetching from CustomAPI. +// +// --------------------------------------------------------------------------- +// +void CGSNetworkPluginModel::HandleNetworkSystemModeEventsL( + const MPsetNetworkModeObserver::TServiceRequest aRequest, + const TUint32 aNetworkModeCaps ) + { +#ifdef _DEBUG + TBuf requestBuf; + GSNetworkDebugHelper::NetworkModeRequestToDes( aRequest, requestBuf ); + __GSLOGSTRING1( "[CGSNetworkPluginModel::HandleNetworkSystemModeEventsL] %S ", + &requestBuf ); +#endif // _DEBUG + + PrintState(); + + switch ( aRequest ) + { + case MPsetNetworkModeObserver::EServiceRequestGetCurrentNetworkMode: + { + TBool networkModeChanged = EFalse; + if( iNetworkMode != aNetworkModeCaps ) + { + networkModeChanged = ETrue; + iNetworkMode = aNetworkModeCaps; + } + if( networkModeChanged ) + { + if ( iContainer ) + { + iContainer->UpdateListBoxL( EGSNetworkModeItemId, 0 ); + } + // Will update nw setting page in case it is open. + if ( iPlugin ) + { + iPlugin->UpdateNetworkSettingPageL(); + } + } + } + break; + case MPsetNetworkModeObserver::EServiceRequestSetSelectedNetworkMode: + { + + /** + * Setting network mode succeeded: update actual mode: + */ + iNetworkMode = iRequestedNetworkMode; + + /** + * iNetworkMode should not be updated in case of error. + * ->update only in this success case. + * + * Problem: Currently unclear if aNetworkModeCaps contains + * valid cata in this EServiceRequestSetSelectedNetworkMode case. + * So, cannot update iNetworkMode from aNetworkModeCaps here. + * Instead use iRequestedNetworkMode manually. + */ + + if( iContainer ) + { + iContainer->HandleNetworkModeChangeL(); + } + break; + } + default: + break; + } + PrintState(); + } + + +// --------------------------------------------------------------------------- +// CGSNetworkPluginModel::HandleNetworkErrorL +// +// From MPsetNetworkModeObserver. This is called if +// EServiceRequestSetSelectedNetworkMode fails. No need to handle other cases. +// --------------------------------------------------------------------------- +// +void CGSNetworkPluginModel::HandleNetworkErrorL( + const MPsetNetworkModeObserver::TServiceRequest aRequest, + const TInt aError ) + { +#ifdef _DEBUG + TBuf requestBuf; + GSNetworkDebugHelper::NetworkModeRequestToDes( aRequest, requestBuf ); + __GSLOGSTRING2( "[CGSNetworkPluginModel::HandleNetworkErrorL] %S error:%d", + &requestBuf, aError ); +#endif // _DEBUG + + /** + * Handles failing when setting network mode. + * Requested mode is stored into a member and actual network mode is updated only + * when success is reported in HandleNetworkSystemModeEventsL/ + * EServiceRequestSetSelectedNetworkMode. + */ + switch( aRequest ) + { + case MPsetNetworkModeObserver::EServiceRequestGetCurrentNetworkMode: + break; + case MPsetNetworkModeObserver::EServiceRequestSetSelectedNetworkMode: + // Hould display error note, iNetworkMode value is still correct as + // it is not updated in case request failed. + if ( iPlugin ) + { + iPlugin->ShowNoteL( R_NO_NETWORK_ACCESS, KGSErrorNote ); + } + break; + default: + break; + } + } + +// --------------------------------------------------------------------------- +// CGSNetworkPluginModel::GetNetworkSelectionMode +// +// Gets network selection mode (automatic/manual) +// --------------------------------------------------------------------------- +// +MPsetNetworkSelect::TSelectMode CGSNetworkPluginModel::GetNetworkSelectionMode() + { + MPsetNetworkSelect::TSelectMode mode = + MPsetNetworkSelect::ENetSelectModeAutomatic; +#ifndef __WINS__ + iPhoneSettingsEngine->GetNetworkSelectMode( mode ); +#endif //__WINS__ + + return mode; + } + +// --------------------------------------------------------------------------- +// CGSNetworkPluginModel::StartAsynGetCurrentNetworkModeSelectionL +// +// --------------------------------------------------------------------------- +// +void CGSNetworkPluginModel::StartAsynGetCurrentNetworkModeSelectionL() + { + if ( iPhoneSettingsEngine ) + { + iPhoneSettingsEngine->GetCurrentNetworkModeSelectionL(); + } + } + +// --------------------------------------------------------------------------- +// CGSNetworkPluginModel::GetNetworkMode +// +// --------------------------------------------------------------------------- +// +TUint32 CGSNetworkPluginModel::GetNetworkMode() + { + /* + * This does not actually ask for the mode from phone engine as + * iPhoneSettingsEngine->GetCurrentNetworkModeSelectionL(); + * Has allready been called in constructor and afterwards we will receive + * notifications if mode changes. + */ + return iNetworkMode; + } + + +void CGSNetworkPluginModel::SetNetworkModeL( TUint32 aNetworkMode ) + { + __GSLOGSTRING1( "[GS]--> [CGSNetworkPluginModel::SetNetworkModeL]:%d", aNetworkMode ); + + // Store requested mode but iNetworkMode should not updated unless request + // succeeds. + iRequestedNetworkMode = aNetworkMode; + if( iPhoneSettingsEngine ) + { + // Cancel the ongoing operation, otherwise, the set network mode operation will + // leave with error code: KErrInUse. + if ( iPhoneSettingsEngine->IsActive() ) + { + iPhoneSettingsEngine->Cancel(); + } + iPhoneSettingsEngine->SetNetworkModeSelectionL( aNetworkMode ); + } + + __GSLOGSTRING1( "[GS]<-- [CGSNetworkPluginModel::SetNetworkModeL]:%d", aNetworkMode ); + } + + +// --------------------------------------------------------------------------- +// CGSNetworkPluginModel::PrintState +// +// --------------------------------------------------------------------------- +void CGSNetworkPluginModel::PrintState() + { +#ifdef _DEBUG + TBuf networkModeCaps; + GSNetworkDebugHelper::NwCapsToDes( iNetworkMode, networkModeCaps ); + __GSLOGSTRING1( "[CGSNetworkPluginModel::PrintState] iNetworkMode: %S ", + &networkModeCaps ); +#endif // _DEBUG + } + +// --------------------------------------------------------------------------- +// CGSNetworkPluginModel::CheckState +// For debugging +// --------------------------------------------------------------------------- +void CGSNetworkPluginModel::CheckState( TGSNetworkModeItems aMode ) + { +#ifdef _DEBUG + TBuf networkModeCaps; + GSNetworkDebugHelper::NwCapsToDes( iNetworkMode, networkModeCaps ); + TBuf networkMode; + GSNetworkDebugHelper::NwToDes( aMode, networkMode ); + + __GSLOGSTRING2( "[CGSNetworkPluginModel::CheckState] %S <-> %S", + &networkModeCaps, &networkMode ); + + switch ( iNetworkMode ) + { + case RMmCustomAPI::KCapsNetworkModeDual: + __ASSERT_DEBUG( + aMode == EGSNetworkModeDualmode, + User::Panic( KGSNetworkPluginModelAssertName, KErrArgument ) ); + break; + case RMmCustomAPI::KCapsNetworkModeUmts: + __ASSERT_DEBUG( + aMode == EGSNetworkModeUMTS, + User::Panic( KGSNetworkPluginModelAssertName, KErrArgument ) ); + break; + case RMmCustomAPI::KCapsNetworkModeGsm: + __ASSERT_DEBUG( + aMode == EGSNetworkModeGSM, + User::Panic( KGSNetworkPluginModelAssertName, KErrArgument ) ); + break; + case KGSNetworkModeCapsNotUpdated: + // Not updated yet so cannot check state. + break; + default: + __ASSERT_DEBUG( + EFalse, + User::Panic( KGSNetworkPluginModelAssertName, KErrArgument ) ); + break; + } + +#endif // _DEBUG + } + + + +TBool CGSNetworkPluginModel::IsCallActive() + { + TBool callActive = EFalse; + +#ifndef __WINS__ +//This is currently not supported by emulator + + if ( iPhoneSettingsEngine->IsCallActive() != CPsetSAObserver::EPSetNoCallsActive ) + { + callActive = ETrue; + } + +#endif //__WINS__ + + return callActive; + } + + + +// End of File