diff -r 000000000000 -r ff3b6d0fd310 cellular/telephonysettings/src/PsetNetwork.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cellular/telephonysettings/src/PsetNetwork.cpp Tue Feb 02 01:11:09 2010 +0200 @@ -0,0 +1,710 @@ +/* +* 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: CPsetNetwork selects network and gets network information. +* +* +*/ + + +// INCLUDE FILES +#include "MPsetNetworkInfoObs.h" +#include "PsetNetwork.h" +#include "PsetSAObserver.h" +#include "PSetPanic.h" +#include "PsetConstants.h" +#include "MPsetNetworkSelect.h" +#include +#include +#include + +#include +#include "PhoneSettingsLogger.h" + +// LOCAL CONSTANTS AND MACROS +_LIT( KPSNameOfClass, "CPsetNetwork" ); + +enum TActiveObserver + { + ENetSelectObserver, + ENetModeObserver + }; + +// MEMBER FUNCTIONS +//============================================================================= +// --------------------------------------------------------------------------- +// +// 1st phase constructor. +// +// --------------------------------------------------------------------------- +// +EXPORT_C CPsetNetwork* CPsetNetwork::NewL( RMobilePhone& aPhone, + MPsetNetworkInfoObserver& aObserver ) + { + CPsetNetwork* self = new ( ELeave ) CPsetNetwork( aPhone ); + CleanupStack::PushL( self ); + self->ConstructL( aObserver ); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// +// 1st phase constructor for net mode observer. +// +// --------------------------------------------------------------------------- +// +EXPORT_C CPsetNetwork* CPsetNetwork::NewL( RMobilePhone& aPhone, + MPsetNetworkModeObserver& aModeObserver ) + { + CPsetNetwork* self = new ( ELeave ) CPsetNetwork( aPhone ); + CleanupStack::PushL( self ); + self->ConstructL( aModeObserver ); + CleanupStack::Pop( self ); + return self; + } + + +// --------------------------------------------------------------------------- +// +// Destructor. +// +// --------------------------------------------------------------------------- +// +EXPORT_C CPsetNetwork::~CPsetNetwork() + { + Cancel(); + iCustomPhone.Close(); + delete iNetworkRetrieve; + iNetworkRetrieve = NULL; + delete iSAObserver; + iSAObserver = NULL; + } + +// --------------------------------------------------------------------------- +// +// Returns available networks +// +// --------------------------------------------------------------------------- +// +EXPORT_C void CPsetNetwork::GetAvailableNetworksL() + { + __PHSLOGSTRING("[PHS]--> CPsetNetwork::GetAvailableNetworksL"); + if ( IsActive() ) + { + User::Leave( KErrInUse ); + } + + if ( iNetworkRetrieve ) + { + delete iNetworkRetrieve; + iNetworkRetrieve = NULL; + } + + // Start to request for network information. + iNetworkRetrieve = CRetrieveMobilePhoneDetectedNetworks::NewL( iPhone ); + iNetworkRetrieve->StartV2( iStatus ); + iServiceRequest = MPsetNetworkInfoObserver::EServiceRequestGetNetworkInfo; + SetActive(); + + // Show searching note. + CleanupLeavePushL(); + iObserver->HandleSearchingNetworksL( iServiceRequest ); + CleanupStack::Pop(); // CleanupCancelPushL + __PHSLOGSTRING("[PHS] <--CPsetNetwork::GetAvailableNetworksL"); + } + +// --------------------------------------------------------------------------- +// +// Returns information of the currently selected network. +// DEPRECATED. +// --------------------------------------------------------------------------- +// +EXPORT_C TInt CPsetNetwork::GetCurrentNetworkInfo + ( MPsetNetworkSelect::TCurrentNetworkInfo& /*aInfo*/ ) + { + return KErrNotSupported; + } + +// --------------------------------------------------------------------------- +// +// Retrieve current search mode (automatic or manual) +// +// --------------------------------------------------------------------------- +// +EXPORT_C TInt CPsetNetwork::GetNetworkSelectMode( TSelectMode& aMode ) + { + /***************************************************** + * Series 60 Customer / ETel + * Series 60 ETel API + *****************************************************/ + RMobilePhone::TMobilePhoneNetworkSelectionV1 setMode; + RMobilePhone::TMobilePhoneNetworkSelectionV1Pckg setModePckg( setMode ); + + __PHSLOGSTRING("[PHS]--> CPsetNetwork::GetNetworkSelectMode"); + + TInt res( iPhone.GetNetworkSelectionSetting( setModePckg ) ); + + if ( res == KErrNone ) + { + if ( setMode.iMethod == RMobilePhone::ENetworkSelectionAutomatic ) + { + aMode = ENetSelectModeAutomatic; + } + else + { + aMode = ENetSelectModeManual; + } + iTempNetInfo.iMode = aMode; + } + __PHSLOGSTRING("[PHS] <--CPsetNetwork::GetNetworkSelectMode"); + return res; + } + +// --------------------------------------------------------------------------- +// +// Starts using the indicated network. +// +// --------------------------------------------------------------------------- +// +EXPORT_C void CPsetNetwork::SelectNetworkL( const TNetworkInfo& aInfo ) + { + __PHSLOGSTRING("[PHS]--> CPsetNetwork::SelectNetworkL"); + if ( IsActive() ) + { + User::Leave( KErrInUse ); + } + + //Save previous network mode. + TBool previousModeAutomatic = EFalse; + if ( iTempNetInfo.iMode == ENetSelectModeAutomatic ) + { + previousModeAutomatic = ETrue; + } + iTempNetInfo = aInfo; + + /***************************************************** + * Series 60 Customer / ETel + * Series 60 ETel API + *****************************************************/ + if ( aInfo.iMode == ENetSelectModeManual ) + { + //Copy data to member variables and make a request. + iNwInfo.iCountry.Append( aInfo.iId.iCountryCode ); + __PHSLOGSTRING1("[PHS] CPsetNetwork::SelectNetworkL: Manual - CountryCode: %S", &aInfo.iId.iCountryCode); + + iNwInfo.iNetwork.Append( aInfo.iId.iNetworkCode ); + __PHSLOGSTRING1("[PHS] CPsetNetwork::SelectNetworkL: Manual - NetworkCode: %S", &aInfo.iId.iNetworkCode); + + iServiceRequest = MPsetNetworkInfoObserver::EServiceRequestSetNetwork; + iPhone.SelectNetwork( iStatus, ETrue, iNwInfo ); + } + else + { + iServiceRequest = + MPsetNetworkInfoObserver::EServiceRequestSetNetworkAutomatic; + //If previously automatic, and now automatic, issue request + // to search networks. + if ( previousModeAutomatic ) + { + iNwInfo.iCountry.Append( aInfo.iId.iCountryCode ); + __PHSLOGSTRING1("[PHS] CPsetNetwork::SelectNetworkL: Auto - CountryCode: %S", &aInfo.iId.iCountryCode); + + iNwInfo.iNetwork.Append( aInfo.iId.iNetworkCode ); + __PHSLOGSTRING1("[PHS] CPsetNetwork::SelectNetworkL: Auto - NetworkCode: %S", &aInfo.iId.iNetworkCode); + + iPhone.SelectNetwork( iStatus, EFalse, iNwInfo ); + } + // make new selection without Network/Country code this way device + // connects automatically home network. + else + { + iNwInfo.iCountry = KNullDesC; + iNwInfo.iNetwork = KNullDesC; + __PHSLOGSTRING("[PHS] CPsetNetwork::SelectNetworkL: Manual>Auto - CountryCode = KNullDesC"); + __PHSLOGSTRING("[PHS] CPsetNetwork::SelectNetworkL: Manual>Auto - NetworkCode = KNullDesC"); + iPhone.SelectNetwork( iStatus, EFalse, iNwInfo ); + } + } + SetActive(); + + //Show requesting note. + CleanupLeavePushL(); + if ( aInfo.iMode == ENetSelectModeManual ) + { + __PHSLOGSTRING("[PHS]--> CPsetNetwork::SelectNetworkL: Requesting Selected N/W"); + iObserver->HandleRequestingSelectedNetworkL( ETrue ); + } + else + { + __PHSLOGSTRING("[PHS]--> CPsetNetwork::SelectNetworkL: Searching N/Ws"); + iObserver->HandleSearchingNetworksL( iServiceRequest ); + } + CleanupStack::Pop(); // CleanupCancelPushL + __PHSLOGSTRING("[PHS] <--CPsetNetwork::SelectNetworkL"); + } + +// --------------------------------------------------------------------------- +// +// Running the active object +// +// --------------------------------------------------------------------------- +// +void CPsetNetwork::RunL() + { + __PHSLOGSTRING1("[PHS]--> CPsetNetwork::RunL() - iStatus = %d", iStatus.Int()); + + MPsetNetworkInfoObserver::TServiceRequest serviceRequest = iServiceRequest; + MPsetNetworkModeObserver::TServiceRequest modeRequest = iModeRequest; + + // Params have to be cleared here since the observer may initiate another asynchronous operation immediately + // after they are notified, effectively messing up the state machine which controls the logic in DoCancel() + // resulting in a possible dead lock when CActive::Cancel()'s User::WaitForRequest( iStatus ) never gets signaled. + ClearParams(); + + if ( iActiveObserver == ENetSelectObserver && iObserver ) + { + __ASSERT_ALWAYS( iObserver, Panic( KPSNameOfClass, ENetNoObserver ) ); + HideRequestNoteL(); + } + else if ( iActiveObserver == ENetModeObserver && iNetworkModeObserver ) + { + __ASSERT_ALWAYS( iNetworkModeObserver, + Panic( KPSNameOfClass, ENetNoNetworkObserver ) ); + } + + if ( iStatus != KErrNone ) + { + if ( modeRequest == + MPsetNetworkModeObserver::EServiceRequestSetSelectedNetworkMode || + modeRequest == + MPsetNetworkModeObserver::EServiceRequestGetCurrentNetworkMode ) + { + __PHSLOGSTRING("[PHS]--> CPsetNetwork::RunL: Request is modeRequest"); + //PSetNetworkModeObs + iNetworkModeObserver->HandleNetworkErrorL( modeRequest, iStatus.Int() ); + } + else + { + __PHSLOGSTRING("[PHS]--> CPsetNetwork::RunL: Request is serviceRequest"); + //PSetNetworkInfoObs + GetRegistrationStatusL(); + iObserver->HandleNetworkErrorL( serviceRequest, iStatus.Int() ); + } + } + else // Request completed successfully. + { + switch ( serviceRequest ) + { + case MPsetNetworkInfoObserver::EServiceRequestGetNetworkInfo: + { + CNetworkInfoArray* array = new ( ELeave ) + CNetworkInfoArray( KPSetNetworkInfoArrayGranularity ); + CleanupStack::PushL( array ); + + CMobilePhoneNetworkListV2* results = + iNetworkRetrieve->RetrieveListV2L(); + CleanupStack::PushL( results ); + TInt amount = results->Enumerate(); + __PHSLOGSTRING1("[PHS] CPsetNetwork::RunL: amount: %d", amount); + TInt i = 0; + /***************************************************** + * Series 60 Customer / ETel + * Series 60 ETel API + *****************************************************/ + RMobilePhone::TMobilePhoneNetworkInfoV2 nwNames; + while ( amount > i ) + { + nwNames = results->GetEntryL( i ); + iTempNetInfo.iId.iCountryCode.Copy( nwNames.iCountryCode ); + __PHSLOGSTRING1("[PHS] CPsetNetwork::RunL: CountryCode: %S", &iTempNetInfo.iId.iCountryCode); + + iTempNetInfo.iId.iNetworkCode.Copy( nwNames.iNetworkId ); + __PHSLOGSTRING1("[PHS] CPsetNetwork::RunL: NetworkCode: %S", &iTempNetInfo.iId.iNetworkCode); + + iTempNetInfo.iLongName.Copy( nwNames.iLongName ); + __PHSLOGSTRING1("[PHS] CPsetNetwork::RunL: LongName: %S", &iTempNetInfo.iLongName); + + iTempNetInfo.iShortName.Copy( nwNames.iShortName ); + __PHSLOGSTRING1("[PHS] CPsetNetwork::RunL: ShortName: %S", &iTempNetInfo.iShortName); + + if ( nwNames.iAccess == RMobilePhone::ENetworkAccessUtran ) + { + iTempNetInfo.iAccess = ENetNetworkWCDMA; + } + else + { + iTempNetInfo.iAccess = ENetNetworkGSM; + } + array->AppendL( iTempNetInfo ); + i++; + } + CleanupStack::PopAndDestroy( results ); + results = NULL; + __PHSLOGSTRING1("[PHS] CPsetNetwork::RunL: Count: %d", array->Count()); + iObserver->HandleNetworkInfoReceivedL( array, KErrNone ); + CleanupStack::PopAndDestroy( array ); + array = NULL; + break; + } + case MPsetNetworkInfoObserver::EServiceRequestSetNetwork: + { + __PHSLOGSTRING("[PHS] CPsetNetwork::RunL: EServiceRequestSetNetwork"); + GetRegistrationStatusL(); + iObserver->HandleNetworkChangedL( iTempNetInfo, + iRegStatus, KErrNone ); + break; + } + default: + break; + } + + //check if this is correct + switch ( modeRequest ) + { + case MPsetNetworkModeObserver::EServiceRequestSetSelectedNetworkMode: + __PHSLOGSTRING("[PHS] CPsetNetwork::RunL: EServiceRequestSetSelectedNetworkMode"); + iNetworkModeObserver->HandleNetworkSystemModeEventsL( + modeRequest, + iNetworkModeCaps ); + break; + case MPsetNetworkModeObserver::EServiceRequestGetCurrentNetworkMode: + __PHSLOGSTRING("[PHS] CPsetNetwork::RunL: EServiceRequestGetCurrentNetworkMode"); + iNetworkModeObserver->HandleNetworkSystemModeEventsL( + modeRequest, + iNetworkModeCaps ); + break; + default: + break; + } + } + __PHSLOGSTRING("[PHS] <--CPsetNetwork::RunL"); + } + +// --------------------------------------------------------------------------- +// +// Cancels pending request +// +// --------------------------------------------------------------------------- +// +void CPsetNetwork::DoCancel() + { + __PHSLOGSTRING("[PHS]--> CPsetNetwork::DoCancel"); + switch ( iServiceRequest ) + { + case MPsetNetworkInfoObserver::EServiceRequestGetNetworkInfo: + iNetworkRetrieve->Cancel(); + delete iNetworkRetrieve; + iNetworkRetrieve = NULL; + break; + case MPsetNetworkInfoObserver::EServiceRequestSetNetwork: + case MPsetNetworkInfoObserver::EServiceRequestSetNetworkAutomatic: + iPhone.CancelAsyncRequest( EMobilePhoneSelectNetwork ); + break; + default: + break; + } + + switch ( iModeRequest ) + { + case MPsetNetworkModeObserver::EServiceRequestSetSelectedNetworkMode: + iCustomPhone.CancelAsyncRequest( ECustomSetSystemNetworkModeIPC ); + break; + case MPsetNetworkModeObserver::EServiceRequestGetCurrentNetworkMode: + __PHSLOGSTRING("[PHS]--> CPsetNetwork::EServiceRequestGetCurrentNetworkMode"); + iCustomPhone.CancelAsyncRequest( + ECustomGetCurrentSystemNetworkModesIPC ); + __PHSLOGSTRING("[PHS]--> CPsetNetwork::EServiceRequestGetCurrentNetworkMode 2"); + break; + default: + break; + } + + ClearParams(); + __PHSLOGSTRING("[PHS] <--CPsetNetwork::DoCancel"); + } + +// --------------------------------------------------------------------------- +// +// Cancels current request +// +// --------------------------------------------------------------------------- +// +EXPORT_C void CPsetNetwork::CancelProcess() + { + if ( !IsActive() ) + { + //if not active, might mean that network list is shown, + // but call is incoming do not leave or raise error. + } + + Cancel(); + } + +// --------------------------------------------------------------------------- +// +// Sets observer (Observer starts to listen again if reset). +// +// --------------------------------------------------------------------------- +// +EXPORT_C void CPsetNetwork::SetNetSAObserver( MPsetNetworkInfoObserver& aObserver ) + { + __ASSERT_ALWAYS( iSAObserver, Panic( KPSNameOfClass, ENetNoObserver ) ); + iSAObserver->SetNetObserver( aObserver ); + } + +// --------------------------------------------------------------------------- +// +// Adds this to scheduler +// +// --------------------------------------------------------------------------- +// +void CPsetNetwork::ConstructL( MPsetNetworkInfoObserver& aObserver ) + { + iObserver = &aObserver; + iActiveObserver = ENetSelectObserver; + /***************************************************** + * Series 60 Customer / ETel + * Series 60 ETel API + *****************************************************/ + iRegStatus = RMobilePhone::ERegistrationUnknown; + User::LeaveIfError( iCustomPhone.Open( iPhone ) ); + + iSAObserver = CPsetSAObserver::NewL(); + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------------------------- +// +// Adds this to scheduler +// +// --------------------------------------------------------------------------- +// +void CPsetNetwork::ConstructL( MPsetNetworkModeObserver& aModeObserver ) + { + iNetworkModeObserver = &aModeObserver; + iActiveObserver = ENetModeObserver; + /***************************************************** + * Series 60 Customer / ETel + * Series 60 ETel API + *****************************************************/ + User::LeaveIfError( iCustomPhone.Open( iPhone ) ); + + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------------------------- +// +// C++ constructor. +// +// --------------------------------------------------------------------------- +// +CPsetNetwork::CPsetNetwork + ( RMobilePhone& aPhone ) : CActive( EPriorityStandard ), + iPhone ( aPhone ) + { + } + +// --------------------------------------------------------------------------- +// +// Gets registration status. +// +// --------------------------------------------------------------------------- +// +void CPsetNetwork::GetRegistrationStatusL() + { + TRequestStatus status; + iPhone.GetNetworkRegistrationStatus( status, iRegStatus ); + __PHSLOGSTRING1("[PHS] CPsetNetwork::GetRegistrationStatusL: iRegStatus: %d", iRegStatus); + User::WaitForRequest( status ); + User::LeaveIfError(status.Int()); + } + +// --------------------------------------------------------------------------- +// +// Requests SAObserver to check if call is active. +// +// --------------------------------------------------------------------------- +// +EXPORT_C TInt CPsetNetwork::IsCallActive() + { + return iSAObserver->IsCallActive(); + } + +// --------------------------------------------------------------------------- +// +// Requests SAObserver to check if gprs connection is active. +// +// --------------------------------------------------------------------------- +// +EXPORT_C TInt CPsetNetwork::IsGPRSConnected() + { + return iSAObserver->IsGPRSConnected(); + } + +// --------------------------------------------------------------------------- +// +// Requests ETEL to Reset back to the previously used network. +// +// --------------------------------------------------------------------------- +// +EXPORT_C TInt CPsetNetwork::ResetNetworkSearch() + { + __PHSLOGSTRING("[PHS]--> CPsetNetwork::ResetNetworkSearch"); + RMmCustomAPI customApi; + TInt error = customApi.Open( iPhone ); + if (error == KErrNone) + { + customApi.ResetNetServer(); + } + customApi.Close(); + + __PHSLOGSTRING("[PHS] <--CPsetNetwork::ResetNetworkSearch"); + //for compatibility reasons returns a value + return error; + } + +// --------------------------------------------------------------------------- +// +// Hides requesting note (either type). Cannot leave, since only deletes notes. +// +// --------------------------------------------------------------------------- +// +void CPsetNetwork::HideRequestNoteL() + { + // Hide requesting note, when interrupting a note, does not leave. + if ( iServiceRequest == + MPsetNetworkInfoObserver::EServiceRequestGetNetworkInfo ) + { + iObserver->HandleSearchingNetworksL( // Does not leave + MPsetNetworkInfoObserver::EServiceRequestNone ); + } + else //may cause unnecessary call to hide non-existing note + { + iObserver->HandleRequestingSelectedNetworkL( EFalse ); // Does not leave + } + } + +// --------------------------------------------------------------------------- +// +// Push object into cleanupstack to catch leaving. +// +// --------------------------------------------------------------------------- +// +void CPsetNetwork::CleanupLeavePushL() + { + CleanupStack::PushL( TCleanupItem( DoHandleLeave, this ) ); + } + +// --------------------------------------------------------------------------- +// +// Object has caused a leave. +// +// --------------------------------------------------------------------------- +// +void CPsetNetwork::DoHandleLeave( TAny* aAny ) + { + REINTERPRET_CAST( CPsetNetwork*, aAny )->HandleLeave(); + } + +// --------------------------------------------------------------------------- +// +// Things to do when leave occurs. +// +// --------------------------------------------------------------------------- +// +void CPsetNetwork::HandleLeave() + { + CancelProcess(); + } + +// --------------------------------------------------------------------------- +// +// Clears member variables +// +// --------------------------------------------------------------------------- +// +void CPsetNetwork::ClearParams() + { + iNwInfo.iCountry = KNullDesC; + iNwInfo.iNetwork = KNullDesC; + iServiceRequest = MPsetNetworkInfoObserver::EServiceRequestNone; + iModeRequest = MPsetNetworkModeObserver::EServiceRequestNone; + } + + +// --------------------------------------------------------------------------- +// +// Sets the network mode observer for communication. +// This method is called from CGSSettListNetView class. +// +// --------------------------------------------------------------------------- +// +EXPORT_C void CPsetNetwork::SetNetworkModeObserver( MPsetNetworkModeObserver& + aObserver ) + { + iNetworkModeObserver = &aObserver; + } + + +// --------------------------------------------------------------------------- +// +// Sets the currently selected network access mode (GSM/UMTS/DualMode). +// +// --------------------------------------------------------------------------- +// +EXPORT_C void CPsetNetwork::SetNetworkModeSelectionL( TUint32& aNetworkMode ) + { + __PHSLOGSTRING("[PHS]--> CPsetNetwork::SetNetworkModeSelectionL"); + + if ( IsActive() ) + { + User::Leave( KErrInUse ); + } + + iModeRequest = + MPsetNetworkModeObserver::EServiceRequestSetSelectedNetworkMode; + iCustomPhone.SetSystemNetworkMode( iStatus, + static_cast( aNetworkMode ) ); + SetActive(); + + __PHSLOGSTRING("[PHS] <--CPsetNetwork::SetNetworkModeSelectionL"); + } + + +// --------------------------------------------------------------------------- +// +// Gets the currently selected network access mode (GSM/UMTS/DualMode). +// +// --------------------------------------------------------------------------- +// +EXPORT_C void CPsetNetwork::GetCurrentNetworkModeSelectionL() + { + __PHSLOGSTRING("[PHS]--> CPsetNetwork::GetCurrentNetworkModeSelectionL"); + + if ( IsActive() ) + { + User::Leave( KErrInUse ); + } + + iModeRequest = + MPsetNetworkModeObserver::EServiceRequestGetCurrentNetworkMode; + iCustomPhone.GetCurrentSystemNetworkModes( iStatus, iNetworkModeCaps ); + SetActive(); + + __PHSLOGSTRING("[PHS] <--CPsetNetwork::GetCurrentNetworkModeSelectionL"); + } + + +// End of file