cellular/telephonysettings/src/PsetNetwork.cpp
changeset 0 ff3b6d0fd310
child 3 a4a774cb6ea7
--- /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 <etelmm.h>
+#include <mmretrieve.h>
+#include <rmmcustomapi.h>
+
+#include <e32svr.h>
+#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<RMmCustomAPI::TNetworkModeCaps>( 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