satengine/SatServer/Commands/LaunchBrowserCmd/src/CLaunchBrowserHandler.cpp
changeset 0 ff3b6d0fd310
child 6 1b9ee3c7442d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/satengine/SatServer/Commands/LaunchBrowserCmd/src/CLaunchBrowserHandler.cpp	Tue Feb 02 01:11:09 2010 +0200
@@ -0,0 +1,1965 @@
+/*
+* Copyright (c) 2002-2009 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:  Handles LaunchBrowser command
+*
+*/
+
+
+#include    <MSatShellController.h>
+#include    <cmmanager.h>
+#include    <cmconnectionmethod.h>
+#include    <cmconnectionmethoddef.h>
+#include    <cmpluginpacketdatadef.h>
+#include    <cmdestination.h>
+
+#include    "MSatApi.h"
+#include    "MSatUtils.h"
+#include    "MSatUiSession.h"
+#include    "SatSOpcodes.h"
+#include    "MSatSUiClientHandler.h"
+#include    "CLaunchBrowserHandler.h"
+#include    "SatLog.h"
+#include    "MSatSystemState.h"
+
+// The pause constant for checking if BrowserApp has exited.
+// This value may be adjusted to ensure the time sequence
+const TInt KSatSShortLoopTimeout = 800000; //0.8 sec
+
+// How many times the browser status is checked, when waiting for
+// browser shutdown. Total time
+// used to check the exiting of browser app is
+// KSatSWaitCount * KSatSShortLoopTimeout.
+const TInt KSatSWaitCount = 10;
+
+// Invalid PDP type
+const TInt KSatInvalidPdpType = -1;
+
+#ifdef _DEBUG
+// Class name for error information.
+//lint -e752 Accessed in __ASSERT_DEBUG, but lint will not notice it.
+_LIT( KLaunchBrowserHandlerName, "CLaunchBrowserHandler" );
+#endif
+
+const TInt KSatMaxIPv4AddressLength( 15 );
+const TInt KSatMaxIPv6AddressLength( 39 );
+const TInt KSatMinIPv4AddressLength( 7 );
+const TInt KSatMinIPv6AddressLength( 7 );
+const TInt KSatMaxIPv4SegmentCounter( 3 );
+const TInt KSatMaxIPv4SegmentLength( 3 );
+const TInt KSatIPv4Broadcast( 255 );
+const TInt KSatIPv4Network( 0 );
+const TInt KSatMaxIPv6SegmentCounter( 7 );
+const TInt KSatMaxIPv6SegmentLength( 4 );
+const TUint32 KSatLaunchBrowserProxyPortNumber( 80 );
+const TUint32 KSatMaxProxyPortNumber( 9999 );
+const TUint32 KSatMinProxyPortNumber( 0 );
+// Granularity for getting connection methods from CM session
+const TUint32 KSatCMGranularity( 5 );
+
+_LIT( KSatAccessPointName, "SAT Launch Browser" );
+_LIT( KSatGprsAccessPointName, "internet" );
+_LIT( KSatIPv4Delimiter, "." );
+_LIT( KSatIPv6Delimiter, ":" );
+
+// ======== MEMBER FUNCTIONS ========
+// -----------------------------------------------------------------------------
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CLaunchBrowserHandler* CLaunchBrowserHandler::NewL( MSatUtils* aUtils )
+    {
+    LOG( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::NewL calling" )
+
+    CLaunchBrowserHandler* self = new( ELeave ) CLaunchBrowserHandler;
+
+    CleanupStack::PushL( self );
+    self->BaseConstructL( aUtils );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    LOG( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::NewL exiting" )
+    return self;
+    }
+
+
+// -----------------------------------------------------------------------------
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CLaunchBrowserHandler::~CLaunchBrowserHandler()
+    {
+    LOG( SIMPLE,
+        "LAUNCHBROWSER: CLaunchBrowserHandler::~CSatSLaunchBrowserHandler \
+        calling" )
+
+    if ( iAfterWait.IsStarted() )
+        {
+        iAfterWait.AsyncStop();
+        }
+
+    if ( iAfterTimer )
+        {
+        iAfterTimer->Cancel();
+        delete iAfterTimer;
+        iAfterTimer = NULL;
+        }
+
+    iWsSession.Close();
+
+    Cancel();
+
+    LOG( SIMPLE,
+        "LAUNCHBROWSER: CLaunchBrowserHandler::~CSatSLaunchBrowserHandler \
+        exiting" )
+    }
+
+// -----------------------------------------------------------------------------
+// From class MSatCommand.
+// Response from the client.
+// -----------------------------------------------------------------------------
+//
+void CLaunchBrowserHandler::ClientResponse()
+    {
+    LOG( SIMPLE,
+        "LAUNCHBROWSER: CLaunchBrowserHandler::ClientResponse calling" )
+
+    // TPCmdResult
+    iLaunchBrowserRsp.iGeneralResult = RSat::KLaunchBrowserError;
+
+    // TAdditionalInfoType
+    iLaunchBrowserRsp.iInfoType = RSat::KNoAdditionalInfo;
+    iLaunchBrowserRsp.iAdditionalInfo.Zero();
+    iLaunchBrowserRsp.SetPCmdNumber( iLaunchBrowserData.PCmdNumber() );
+
+    // Perform the action that we just queried the user for.
+    if ( iQueryRsp.iAccepted )
+        {
+        // Launch the Browser.
+        TRAPD( err, LaunchBrowserL() );
+        if ( KErrNone != err )
+            {
+            iLaunchBrowserRsp.iGeneralResult = RSat::KMeUnableToProcessCmd;
+            LOG2( SIMPLE, "LAUNCHBROWSER: \
+                CLaunchBrowserHandler::ClientResponse error: %i", err )
+            }
+        else
+            {
+            LOG( SIMPLE,
+                "LAUNCHBROWSER: CLBH::CR ESetUpMenuRequested registered" )
+            TRAP_IGNORE( iUtils->RegisterL(
+                this, MSatUtils::ESetUpMenuRequested ) )
+            }
+        }
+    else // User denied this action
+        {
+        iLaunchBrowserRsp.iGeneralResult = RSat::KPCmdNotAcceptedByUser;
+        LOG( SIMPLE, "LAUNCHBROWSER: \
+            CLaunchBrowserHandler::ClientResponse not accepted" )
+        if ( iQueryRsp.iSessionTerminatedByUser )
+            {
+            LOG( SIMPLE, "LAUNCHBROWSER: \
+                 CLaunchBrowserHandler::ClientResponse close ui session" )
+            // Next SimSession end will close the ui session
+            iUtils->NotifyEvent( MSatUtils::ESessionTerminatedByUser );
+            }
+        }
+        
+    // If command had icon data and was done succesfully, report that icon
+    // was not shown
+    // To be removed when icons are allowed in this command
+    if ( ( RSat::KSuccess == iLaunchBrowserRsp.iGeneralResult ) &&
+        iIconCommand )
+        {
+        LOG( SIMPLE, "LAUNCHBROWSER: \
+                 CLaunchBrowserHandler::ClientResponse icon not display" )
+        iLaunchBrowserRsp.iGeneralResult =
+            RSat::KSuccessRequestedIconNotDisplayed;
+        }
+
+    TerminalRsp( RSat::ELaunchBrowser, iLaunchBrowserRspPckg );
+
+    LOG( SIMPLE,
+        "LAUNCHBROWSER: CLaunchBrowserHandler::ClientResponse exiting" )
+    }
+
+// -----------------------------------------------------------------------------
+// From class CSatCommandHandler.
+// Event notification
+// -----------------------------------------------------------------------------
+//
+void CLaunchBrowserHandler::Event( TInt aEvent )
+    {
+    LOG( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::Event calling" )
+
+    switch ( aEvent )
+        {
+        // SetUpMenu is listening by SAT Client.
+        case MSatUtils::ESetUpMenuRequested:
+            {
+            LOG( NORMAL,
+                "LAUNCHBROWSER::Event ESetUpMenuRequested catched and unreg" )
+            iUtils->UnregisterEvent( this, MSatUtils::ESetUpMenuRequested );
+            // Browser is brought to the top after short period of time.
+            iUtils->SatUiHandler().ShellController().
+                BringBrowserToForegroundAfterPeriod();
+            break;
+            }
+
+        default:
+            {
+            LOG2( NORMAL, "LAUNCHBROWSER:   Unexpected event: %i", aEvent )
+            CSatCommandHandler::Event( aEvent );
+            }
+        }
+
+    LOG( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::Event exiting" )
+    }
+
+// -----------------------------------------------------------------------------
+// From class CActive.
+// Cancels the sat request.
+// -----------------------------------------------------------------------------
+//
+void CLaunchBrowserHandler::DoCancel()
+    {
+    LOG( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::DoCancel calling" )
+
+    iUtils->USatAPI().NotifyLaunchBrowserCancel();
+
+    LOG( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::DoCancel exiting" )
+    }
+
+// -----------------------------------------------------------------------------
+// From class CSatCommandHandler.
+// Requests the command notification.
+// -----------------------------------------------------------------------------
+//
+void CLaunchBrowserHandler::IssueUSATRequest( TRequestStatus& aStatus )
+    {
+    LOG( SIMPLE,
+        "LAUNCHBROWSER: CLaunchBrowserHandler::IssueUSATRequest calling" )
+
+    // Clear the IPC package.
+    new (&iLaunchBrowserData) RSat::TLaunchBrowserV2();
+    iQueryRsp.iAccepted = EFalse; // default
+
+    iUtils->USatAPI().NotifyLaunchBrowser( aStatus, iLaunchBrowserPckg );
+
+    LOG( SIMPLE,
+        "LAUNCHBROWSER: CLaunchBrowserHandler::IssueUSATRequest exiting" )
+    }
+
+// -----------------------------------------------------------------------------
+// From class CSatCommandHandler.
+// Precheck before executing the command.
+// -----------------------------------------------------------------------------
+//
+TBool CLaunchBrowserHandler::CommandAllowed()
+    {
+    LOG( SIMPLE,
+        "LAUNCHBROWSER: CLaunchBrowserHandler::CommandAllowed calling" )
+
+    iLaunchBrowserRsp.iGeneralResult = RSat::KLaunchBrowserError;
+    iLaunchBrowserRsp.iInfoType = RSat::KNoAdditionalInfo;
+    iLaunchBrowserRsp.iAdditionalInfo.Zero();
+
+    RMobilePhone::TMobilePhoneRegistrationStatus registrationStatus(
+        iUtils->SystemState().GetNetworkRegistrationStatus() );
+
+    TBool commandAllowed( ETrue );
+
+    if ( RSat::EBrowserIdNotSpecified == iLaunchBrowserData.iBrowserId )
+        {
+        // When get unknown browser id, such as RFU value, return
+        // terminal response of command not understood.
+        iLaunchBrowserRsp.iGeneralResult = RSat::KCmdDataNotUnderstood;
+        commandAllowed = EFalse;
+        LOG( SIMPLE, "LAUNCHBROWSER: \
+            CLaunchBrowserHandler::CommandAllowed unknown browser id" )
+        }
+    else if ( ( RSat::EAlphaIdProvided !=
+        iLaunchBrowserData.iAlphaId.iStatus ) &&
+        ( RSat::ESelfExplanatory ==
+            iLaunchBrowserData.iIconId.iQualifier ||
+          RSat::ENotSelfExplanatory ==
+            iLaunchBrowserData.iIconId.iQualifier ) )
+        {
+        iLaunchBrowserRsp.iGeneralResult = RSat::KCmdDataNotUnderstood;
+        commandAllowed = EFalse;
+        LOG( SIMPLE, "LAUNCHBROWSER: \
+            CLaunchBrowserHandler::CommandAllowed icon without alpha id" )
+        }
+    else if (
+        ( RMobilePhone::ERegisteredOnHomeNetwork != registrationStatus ) &&
+        ( RMobilePhone::ERegisteredRoaming != registrationStatus ) )
+        {
+        iLaunchBrowserRsp.iGeneralResult = RSat::KMeUnableToProcessCmd;
+        iLaunchBrowserRsp.iInfoType = RSat::KMeProblem;
+        iLaunchBrowserRsp.iAdditionalInfo.SetLength( 1 );
+        iLaunchBrowserRsp.iAdditionalInfo[0] = RSat::KNoService;
+        commandAllowed = EFalse;
+        LOG( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::CommandAllowed\
+             MS is out of service (Net. Reg. status wrong)" )
+        }
+    else if ( RSat::EBrowserSelectionNotSet == iLaunchBrowserData.iBrowserSel )
+        {
+        iLaunchBrowserRsp.iGeneralResult = RSat::KCmdTypeNotUnderstood;
+        commandAllowed = EFalse;
+        LOG( SIMPLE, "LAUNCHBROWSER: \
+            CLaunchBrowserHandler::CommandAllowed selection not set" )
+        }
+    else if ( RSat::ELaunchBrowserIfNotAlreadyLaunched ==
+        iLaunchBrowserData.iBrowserSel )
+        {
+        if ( BrowserExists() )
+            {
+            iLaunchBrowserRsp.iInfoType = RSat::KMeProblem;
+            iLaunchBrowserRsp.iAdditionalInfo.Append( 
+                RSat::KBrowserUnavailable );
+            commandAllowed = EFalse;
+            LOG( SIMPLE, "LAUNCHBROWSER: \
+                CLaunchBrowserHandler::CommandAllowed not launched" )
+            }
+        }
+    else
+        {
+        LOG( SIMPLE,
+            "LAUNCHBROWSER: CLaunchBrowserHandler::CommandAllowed ok" )
+        }
+
+    if ( !commandAllowed )
+        {
+        LOG( SIMPLE,
+            "CLaunchBrowserHandler::CommandAllowed commandAllowed false" )
+        iLaunchBrowserRsp.SetPCmdNumber( iLaunchBrowserData.PCmdNumber() );
+        TerminalRsp( RSat::ELaunchBrowser, iLaunchBrowserRspPckg );
+        }
+    // Set icon command flag whether icon data was received and set qualifier
+    // to no icon id
+    // To be removed when icons are allowed in this command
+    else if ( ( RSat::ESelfExplanatory ==
+        iLaunchBrowserData.iIconId.iQualifier ) ||
+        ( RSat::ENotSelfExplanatory ==
+        iLaunchBrowserData.iIconId.iQualifier ) )
+        {
+         LOG( SIMPLE,
+            "CLaunchBrowserHandler::CommandAllowed commandAllowed ENoIconId" )
+        iIconCommand = ETrue;
+        iLaunchBrowserData.iIconId.iQualifier = RSat::ENoIconId;
+        }
+    else
+        {
+        iIconCommand = EFalse;
+        }
+
+    LOG2( SIMPLE,
+        "LAUNCHBROWSER: CLaunchBrowserHandler::CommandAllowed exiting, \
+         commandAllowed: %d", commandAllowed )
+    return commandAllowed;
+    }
+
+// -----------------------------------------------------------------------------
+// From class CSatCommandHandler.
+// Answers for need of UI session.
+// -----------------------------------------------------------------------------
+//
+TBool CLaunchBrowserHandler::NeedUiSession()
+    {
+    LOG( SIMPLE,
+        "LAUNCHBROWSER: CLaunchBrowserHandler::NeedUiSession calling" )
+
+    const RSat::TAlphaId alphaId( iLaunchBrowserData.iAlphaId );
+
+    iNeedUiSession = ETrue;
+
+    if ( ( ( alphaId.iStatus == RSat::EAlphaIdProvided &&
+        alphaId.iAlphaId.Length() == 0 ) ||
+        alphaId.iStatus == RSat::EAlphaIdNull ) &&
+        ( !iUtils->SystemState().IsConfirmSatOperationsOn() ) )
+        {
+        iNeedUiSession = EFalse;
+        LOG( NORMAL,
+            "LAUNCHBROWSER: CLaunchBrowserHandler::NeedUiSession no  \
+            Ui session needed" )
+        }
+
+    if ( iUtils->CoverUiSupported() && iNeedUiSession )
+        {
+        LOG( NORMAL,
+            "LAUNCHBROWSER: CLaunchBrowserHandler::NeedUiSession Ui session \
+            needed" )
+        TSatCommandData medEventData;
+        medEventData.iPCmdNumber = RSat::ELaunchBrowser;
+        medEventData.iAlphaId = iLaunchBrowserData.iAlphaId;
+
+        if ( iUtils->SystemState().IsConfirmSatOperationsOn() )
+            {
+            LOG( NORMAL,
+            "LAUNCHBROWSER: CLaunchBrowserHandler::NeedUiSession \
+             KSatLongDuration" )
+            medEventData.iDuration.iNumOfUnits = KSatLongDuration;
+            }
+        else
+            {
+            medEventData.iDuration.iNumOfUnits = KSatDefaultDuration;
+            }
+
+        medEventData.iDuration.iTimeUnit = RSat::ESeconds;
+        medEventData.iIconID = iLaunchBrowserData.iIconId;
+        TSatCommandPckg tPckg( medEventData );
+        iUtils->RaiseSatEvent( tPckg );
+        }
+
+    LOG2( SIMPLE,
+        "LAUNCHBROWSER: CLaunchBrowserHandler::NeedUiSession exiting, \
+         iNeedUiSession: %d", iNeedUiSession )
+    return iNeedUiSession;
+    }
+
+// -----------------------------------------------------------------------------
+// From class CSatCommandHandler.
+// Called when USAT API notifies that command.
+// -----------------------------------------------------------------------------
+//
+void CLaunchBrowserHandler::HandleCommand()
+    {
+    LOG( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::HandleCommand calling" )
+
+    // Register service request handler for LaunchBrowser command,
+    // If there is already service request for query, registering
+    // updates command handler, so client responses comes to this
+    // command handler
+    TRAPD( err, iUtils->RegisterServiceRequestL(
+        ESatSProactiveQuery,
+        ESatSProactiveQueryResponse,
+        this ) );
+
+    if ( KErrNone != err )
+        {
+        iLaunchBrowserRsp.iGeneralResult = RSat::KMeUnableToProcessCmd;
+        iLaunchBrowserRsp.iInfoType = RSat::KMeProblem;
+        iLaunchBrowserRsp.iAdditionalInfo.SetLength( 1 );
+        iLaunchBrowserRsp.iAdditionalInfo[0] = RSat::KNoSpecificMeProblem;
+        iLaunchBrowserRsp.SetPCmdNumber( iLaunchBrowserData.PCmdNumber() );
+        TerminalRsp( RSat::ELaunchBrowser, iLaunchBrowserRspPckg );
+
+        LOG2( SIMPLE,
+        "LAUNCHBROWSER: CLaunchBrowserHandler::HandleCommand error: %i", err )
+        }
+    else if ( iNeedUiSession )
+        {
+        iQueryData.iCommand = ESatSLaunchBrowserQuery;
+        iQueryData.iQueryText = iLaunchBrowserData.iAlphaId.iAlphaId;
+        iQueryData.iIconId.iIdentifier =
+            iLaunchBrowserData.iIconId.iIdentifier;
+        LOG2( SIMPLE, "CLaunchBrowserHandler::HandleCommand \
+              iLaunchBrowserData.iIconId.iQualifier: %i", 
+              iLaunchBrowserData.iIconId.iQualifier )
+        switch ( iLaunchBrowserData.iIconId.iQualifier )
+            {
+            case RSat::ESelfExplanatory:
+                {
+                // Icon qualifier is self explanatory (to display instead
+                // of the alpha id or text string).
+                iQueryData.iIconId.iIconQualifier = ESatSelfExplanatory;
+                break;
+                }
+
+            case RSat::ENotSelfExplanatory:
+                {
+                // Icon qualifier is not self explanatory.
+                iQueryData.iIconId.iIconQualifier = ESatNotSelfExplanatory;
+                break;
+                }
+
+            default:
+                {
+                // Icon qualifier not present
+                iQueryData.iIconId.iIconQualifier = ESatENoIconId;
+                break;
+                }
+            }
+
+        if ( RSat::EAlphaIdNotPresent == iLaunchBrowserData.iAlphaId.iStatus )
+            {
+            LOG( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::HandleCommand \
+                 EAlphaIdNotPresent" )
+            iQueryData.iAlphaIdStatus = ESatAlphaIdNotProvided;
+            }
+        else if ( RSat::EAlphaIdProvided ==
+            iLaunchBrowserData.iAlphaId.iStatus )
+            {
+            LOG( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::HandleCommand \
+                 EAlphaIdProvided" )
+            iQueryData.iAlphaIdStatus = ESatAlphaIdNotNull;
+            }
+        else
+            {
+            iQueryData.iAlphaIdStatus = ESatAlphaIdNull;
+            }
+
+        iQueryData.iSimApplicationName = iUtils->SatAppName();
+
+        // Ask the user permission to launch browser. Reply will come
+        // to ClientResponse() method.
+        iUtils->SatUiHandler().UiSession()->SendCommand(
+            &iQueryPckg,
+            &iQueryRspPckg,
+            ESatSProactiveQuery );
+        }
+    else // transparent launch
+        {
+        // Launch the Browser.
+        TRAP( err, LaunchBrowserL() );
+
+        if ( KErrNone != err )
+            {
+            iLaunchBrowserRsp.iGeneralResult = RSat::KMeUnableToProcessCmd;
+            LOG2( SIMPLE, "LAUNCHBROWSER: \
+                CLaunchBrowserHandler::HandleCommand error: %i", err )
+            }
+        else
+            {
+            LOG( SIMPLE,
+                "LAUNCHBROWSER: CLBH::CR ESetUpMenuRequested registered" )
+            TRAP_IGNORE( iUtils->RegisterL(
+                this, MSatUtils::ESetUpMenuRequested ) )
+            }
+
+        TerminalRsp( RSat::ELaunchBrowser, iLaunchBrowserRspPckg );
+        }
+
+    LOG( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::HandleCommand exiting" )
+    }
+
+// -----------------------------------------------------------------------------
+// From class CSatCommandHandler.
+// Indicates the failure of launching ui client.
+// -----------------------------------------------------------------------------
+//
+void CLaunchBrowserHandler::UiLaunchFailed()
+    {
+    LOG( SIMPLE,
+        "LAUNCHBROWSER: CLaunchBrowserHandler::UiLaunchFailed calling" )
+
+    iLaunchBrowserRsp.iGeneralResult = RSat::KMeUnableToProcessCmd;
+    iLaunchBrowserRsp.iInfoType = RSat::KMeProblem;
+    iLaunchBrowserRsp.iAdditionalInfo.SetLength( 1 );
+    iLaunchBrowserRsp.iAdditionalInfo[0] = RSat::KNoSpecificMeProblem;
+    iLaunchBrowserRsp.SetPCmdNumber( iLaunchBrowserData.PCmdNumber() );
+    TerminalRsp( RSat::ELaunchBrowser, iLaunchBrowserRspPckg );
+
+    LOG( SIMPLE,
+        "LAUNCHBROWSER: CLaunchBrowserHandler::UiLaunchFailed exiting" )
+    }
+    
+// -----------------------------------------------------------------------------
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+//lint -e{1403, 1769} Can not be initialized, harmless.
+CLaunchBrowserHandler::CLaunchBrowserHandler() :
+    CSatCommandHandler(),
+    iLaunchBrowserData(),
+    iLaunchBrowserPckg( iLaunchBrowserData ),
+    iLaunchBrowserRsp(),
+    iLaunchBrowserRspPckg( iLaunchBrowserRsp ),
+    iQueryData(),
+    iQueryPckg( iQueryData ),
+    iQueryRsp(),
+    iQueryRspPckg( iQueryRsp ),
+    iUidWmlBrowser( TUid::Uid( KWmlcHandler ) ),
+    iAfterTimer( NULL ),
+    // To be removed when icons are allowed in this command
+    iIconCommand( EFalse )
+    {
+    LOG( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::CLaunchBrowserHandler \
+        calling - exiting" )
+    }
+
+// -----------------------------------------------------------------------------
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CLaunchBrowserHandler::ConstructL()
+    {
+    LOG( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::ConstructL calling" )
+
+    // Open the Window server session.
+    User::LeaveIfError( iWsSession.Connect() );
+
+    LOG( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::ConstructL exiting" )
+    }
+
+
+// -----------------------------------------------------------------------------
+// Checks if Browser application is launched.
+// -----------------------------------------------------------------------------
+//
+TBool CLaunchBrowserHandler::BrowserExists()
+    {
+    LOG( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::BrowserExists calling" )
+    TBool browserExists( EFalse );
+
+    TApaTaskList taskList( iWsSession );
+    TApaTask task = taskList.FindApp( iUidWmlBrowser );
+    browserExists = task.Exists();
+
+    LOG( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::BrowserExists exiting" )
+    return browserExists;
+    }
+
+// -----------------------------------------------------------------------------
+// The Launch Browser handler.
+// -----------------------------------------------------------------------------
+//
+void CLaunchBrowserHandler::LaunchBrowserL()
+    {
+    LOG( SIMPLE,
+        "LAUNCHBROWSER: CLaunchBrowserHandler::LaunchBrowserL calling" )
+
+    // Check the URL length.
+    const TInt urlLen( iLaunchBrowserData.iUrl.Length() );
+
+    // ID of the accesspoint in the communications database.
+    TUid accesspointID( TUid::Uid( KErrNotFound ) );
+
+    // If apId is given by SIM card, then we use that, otherwise,
+    // get default apId from default connection method.
+    TUint32 apId( 0 );
+    // GCF is supported since S60 5.0
+    apId = GetAccessPointByGatewayAddressL();
+    if ( apId )
+        {
+        LOG2( SIMPLE, 
+              "LAUNCHBROWSER: CLaunchBrowserHandler::LaunchBrowserL, \
+              Get gcf AP id = %d", apId )
+        accesspointID.iUid = static_cast<TInt32>( apId );
+        }    
+    
+    // Get default AP if GCF ap not found
+    if ( KErrNotFound == accesspointID.iUid )
+        {
+        LOG( SIMPLE, 
+             "LAUNCHBROWSER: CLaunchBrowserHandler::LaunchBrowserL, \
+             no gcf AP id" )
+        apId = GetAccessPointByDefaultL();
+        if ( apId )
+            {
+            LOG2( SIMPLE, 
+                  "LAUNCHBROWSER: CLaunchBrowserHandler::LaunchBrowserL, \
+                  default AP id = %d", apId )            
+            accesspointID.iUid = static_cast<TInt32>( apId );
+            }
+        }
+    
+    LOG2( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::LaunchBrowserL, \
+          accesspointID.iUid=%d", accesspointID.iUid )
+    
+    HBufC* param = NULL;
+    // If the URL is given by SIM, then we use that
+    if ( urlLen )
+        {
+        // Url is given by SIM, and we use that.
+        param = HBufC::NewLC( urlLen );
+        param->Des().Copy( iLaunchBrowserData.iUrl );
+        LOG3( SIMPLE, 
+              "LAUNCHBROWSER: CLaunchBrowserHandler::LaunchBrowserL,\
+              url is given by SIM, url=%s, length=%d", 
+              param, param->Des().Length() )
+        }  
+    // If no url from SIM, get default URL by selected access point.
+    else if ( !param && accesspointID.iUid > 0 )
+        {
+        param = GetDefaultUrlByAccessPointLC( 
+                static_cast<TUint32>( accesspointID.iUid) );
+        LOG3( SIMPLE, 
+              "LAUNCHBROWSER: CLaunchBrowserHandler::LaunchBrowserL,\
+              url is given by IAP, url=%s, length=%d",
+              param, param->Des().Length() )
+        }
+    else
+        {
+        param = KNullDesC().AllocLC();
+        LOG( SIMPLE, 
+             "LAUNCHBROWSER: CLaunchBrowserHandler::LaunchBrowserL no url" )
+        }
+    
+    switch ( iLaunchBrowserData.iBrowserSel )
+        {
+        case RSat::ECloseExistingLaunchNewBrowserSession:
+            {
+            LOG( NORMAL, "LAUNCHBROWSER: CLaunchBrowserHandler:: \
+                 LaunchBrowserL, ECloseExistingLaunchNewBrowserSession" )
+            CloseBrowser();  // Close Browser Session if it exists.
+            LaunchWithUrlL( param->Des(), accesspointID );
+            break;
+            }
+
+        case RSat::ELaunchBrowserIfNotAlreadyLaunched:
+            {
+            LOG( NORMAL, "LAUNCHBROWSER: CLaunchBrowserHandler:: \
+                 LaunchBrowserL, ELaunchBrowserIfNotAlreadyLaunched" )
+            if ( BrowserExists() )
+                {
+                LOG( SIMPLE,"CLaunchBrowserHandler::LaunchBrowserL \
+                     BrowserExists" )
+                // Browser exists, error response returned.
+                iLaunchBrowserRsp.iGeneralResult = RSat::KLaunchBrowserError;
+                iLaunchBrowserRsp.iInfoType = RSat::KMeProblem;
+                iLaunchBrowserRsp.iAdditionalInfo.Append( 
+                    RSat::KBrowserUnavailable );
+                }
+            else
+                {
+                LaunchWithUrlL( param->Des(), accesspointID );
+                }
+            break;
+            }
+
+        case RSat::EUseExistingBrowser:
+            {
+            // SAT Shell Controller looks if browser already exists.
+            LOG( NORMAL, "LAUNCHBROWSER: CLaunchBrowserHandler:: \
+                 LaunchBrowserL,EUseExistingBrowser" )
+            LaunchWithUrlL( param->Des(), accesspointID );
+            break;
+            }
+
+        case RSat::EBrowserSelectionNotSet:
+        default:
+            __ASSERT_DEBUG( EFalse,
+                Panic( KLaunchBrowserHandlerName, KErrBadName ) );
+            break;
+        }
+
+    CleanupStack::PopAndDestroy( param );
+
+    LOG( SIMPLE,
+        "LAUNCHBROWSER: CLaunchBrowserHandler::LaunchBrowserL exiting" )
+    }
+
+// --------------------------------------------------------------------------
+// Closes the Browser application if it is active and waits until
+// closing is complete.
+// --------------------------------------------------------------------------
+//
+void CLaunchBrowserHandler::CloseBrowser()
+    {
+    LOG( SIMPLE, 
+         "LAUNCHBROWSER: CLaunchBrowserHandler::CloseBrowser calling" )
+    TApaTaskList taskList( iWsSession );
+    TApaTask task = taskList.FindApp( iUidWmlBrowser );
+
+    if ( task.Exists() )
+        {
+        task.SendSystemEvent( EApaSystemEventShutdown );
+
+        TBool browserExists( ETrue );
+        TInt waitCount( 0 );
+        LOG2( SIMPLE, 
+              "CLaunchBrowserHandler::CloseBrowser browserExists: %d",
+              browserExists )
+        // Make sure that closing is completed.
+        while ( browserExists )
+            {
+            After( KSatSShortLoopTimeout );
+            ++waitCount;
+
+            TApaTask newTask = taskList.FindApp( iUidWmlBrowser );
+            browserExists = newTask.Exists();
+
+            if ( KSatSWaitCount <= waitCount )
+                {
+                newTask.KillTask();
+                browserExists = EFalse;
+                LOG( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler:: \
+                    CloseBrowser force kill task" )
+                }
+            }
+        }
+
+    LOG( SIMPLE, 
+         "LAUNCHBROWSER: CLaunchBrowserHandler::CloseBrowser exiting" )
+    }
+
+// --------------------------------------------------------------------------
+// Launches The Browser with URL.
+// --------------------------------------------------------------------------
+//
+void CLaunchBrowserHandler::LaunchWithUrlL( const TDesC& aParam,
+    const TUid& aAccessPointUid )
+    {
+    LOG( SIMPLE,
+        "LAUNCHBROWSER: CLaunchBrowserHandler::LaunchWithUrlL calling" )
+    LOG3( SIMPLE,
+         "LAUNCHBROWSER: CLaunchBrowserHandler::LaunchWithUrlL\
+          url=%s, IAP=%d", &aParam, aAccessPointUid.iUid )        
+
+    // Browser launching called.
+    TInt err = iUtils->SatUiHandler().ShellController().LaunchBrowserL(
+        aParam, aAccessPointUid );
+
+    if ( KErrNone == err )
+        {
+        if ( !iQueryRsp.iRequestedIconDisplayed &&
+            ( ( RSat::ESelfExplanatory ==
+            iLaunchBrowserData.iIconId.iQualifier ) ||
+            ( RSat::ENotSelfExplanatory ==
+            iLaunchBrowserData.iIconId.iQualifier ) ) )
+            {
+            iLaunchBrowserRsp.iGeneralResult =
+                RSat::KSuccessRequestedIconNotDisplayed;
+            LOG( SIMPLE,
+                "LAUNCHBROWSER: CLaunchBrowserHandler::LaunchWithUrlL \
+                no icon shown" )
+            }
+        else
+            {
+            iLaunchBrowserRsp.iGeneralResult = RSat::KSuccess;
+            LOG( SIMPLE,
+                "LAUNCHBROWSER: CLaunchBrowserHandler::LaunchWithUrlL \
+                command ok" )
+            }
+        }
+    else
+        {
+        iLaunchBrowserRsp.iGeneralResult  = RSat::KLaunchBrowserError;
+        iLaunchBrowserRsp.iInfoType       = RSat::KMeProblem;
+        iLaunchBrowserRsp.iAdditionalInfo.Append( 
+                RSat::KBrowserUnavailable );
+        LOG2( SIMPLE, 
+        "LAUNCHBROWSER: CLaunchBrowserHandler::LaunchWithUrlL error: %i", 
+        err )
+        }
+
+    LOG( SIMPLE,
+        "LAUNCHBROWSER: CLaunchBrowserHandler::LaunchWithUrlL exiting" )
+    }
+
+// --------------------------------------------------------------------------
+// Starts timer. Function returns as the given time has elapsed or
+// timer is cancelled.
+// --------------------------------------------------------------------------
+void CLaunchBrowserHandler::After(
+    const TTimeIntervalMicroSeconds32& aDelay,
+    const TTimeIntervalMicroSeconds32& aInterval )
+    {
+    LOG( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::After calling" )
+
+    if ( !iAfterWait.IsStarted() )
+        {
+        TRAPD( err, iAfterTimer = CPeriodic::NewL( EPriorityStandard ) )
+        LOG2( SIMPLE, 
+        "LAUNCHBROWSER: CLaunchBrowserHandler::After err: %i", err )
+        if ( ( KErrNone == err ) && iAfterTimer )
+            {
+            iAfterTimer->Start(
+                aDelay, aInterval, TCallBack( DelayCallBack, this ) );
+            iAfterWait.Start();
+
+            delete iAfterTimer;
+            iAfterTimer = NULL;
+            }
+        }
+
+    LOG( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::After exiting" )
+    }
+
+// --------------------------------------------------------------------------
+// Timer call back function
+// --------------------------------------------------------------------------
+TInt CLaunchBrowserHandler::DelayCallBack( TAny* aPtr )
+    {
+    LOG( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::DelayCallBack \
+    calling" )
+    CLaunchBrowserHandler* ptrThis =
+        static_cast<CLaunchBrowserHandler*>( aPtr );
+
+    if ( ptrThis && ( ptrThis->iAfterWait.IsStarted() ) )
+        {
+        LOG( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::DelayCallBack \
+             stop iAfterWait" )
+        ptrThis->iAfterWait.AsyncStop();
+        }
+    LOG( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::DelayCallBack \
+    exiting" )
+    return ( EFalse );
+    }
+
+// --------------------------------------------------------------------------
+// Create a new access point using the Access Point Engine.
+// --------------------------------------------------------------------------
+//
+TUint32 CLaunchBrowserHandler::CreateAccessPointL( 
+        const TDesC16& aApName,
+        const TDesC16& aProxyServerAddr,
+        const TUint32 aProxyPortNumber,
+        const RPacketContext::TProtocolType& aIPvType )
+    {
+    LOG( SIMPLE, 
+         "LAUNCHBROWSER: CLaunchBrowserHandler::CreateAccessPointL calling" )
+
+    // Connection method interface.
+    RCmConnectionMethod cm;
+    // Connection method manager interface.
+    RCmManager cmManager;
+    // Used to exit connection methods go through loop
+    TBool exitConnectionMethodsLoop( EFalse );
+    
+    cmManager.OpenLC();
+
+    // Find if the access point with the same name is already exist.
+    // If such access point exists, delete it and then create a new one.
+     
+    // Get the Connection Methods does not belogns to any destination
+    RArray<TUint32> array = RArray<TUint32>( KSatCMGranularity );
+    CleanupClosePushL( array );
+
+    cmManager.ConnectionMethodL( array );
+
+    // Go through the Connection Method list to find if there is matched one
+     
+    for( TInt i = 0; 
+         ( i < array.Count() ) && !exitConnectionMethodsLoop; ++i)
+        {
+        cm = cmManager.ConnectionMethodL( array[i] );
+        CleanupClosePushL( cm );
+        
+        // query the access point name
+        HBufC * pa = NULL;
+        pa = cm.GetStringAttributeL( CMManager::ECmName );
+        CleanupStack::PushL(pa);
+        
+        if ( *pa == aApName )
+            {
+            // Find the matched connection method
+            LOG( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::\
+                 CreateAccessPointL, find the existing ap" )
+            cm.DeleteL();
+            exitConnectionMethodsLoop = ETrue;
+            }
+        CleanupStack::PopAndDestroy( pa );
+        CleanupStack::PopAndDestroy( &cm ); 
+        } 
+    CleanupStack::PopAndDestroy( &array );
+
+    // Create a connection method without destination.
+    cm = cmManager.CreateConnectionMethodL( KUidPacketDataBearerType );
+    CleanupClosePushL( cm );
+    
+    // Fulfill connection method params with default setting from OCC.
+    // We use trap to continue following operations even if leaving from 
+    // FulfillConnnectionMethodL.
+    TRAPD( errCode, FulfillConnnectionMethodL( cmManager, cm ) );
+    LOG3( SIMPLE, "SATENGINE: CLaunchBrowserHandler::CreateAccessPointL \
+          errCode=%d ad line %d", errCode, __LINE__ )
+    // Set attributes of the connection method.
+    cm.SetStringAttributeL( CMManager::ECmName, aApName );
+    cm.SetIntAttributeL( CMManager::EPacketDataPDPType, aIPvType );
+    cm.SetStringAttributeL( CMManager::ECmWapIPGatewayAddress, 
+                            TPtrC( aProxyServerAddr ) );
+    cm.SetStringAttributeL( CMManager::ECmProxyServerName, 
+                            TPtrC( aProxyServerAddr ) );
+    cm.SetIntAttributeL( CMManager::ECmProxyPortNumber, aProxyPortNumber );
+        
+    // Update the access point ID for use later.
+    cm.UpdateL();
+
+    TUint32 apId = cm.GetIntAttributeL( CMManager::ECmIapId );
+    LOG2( SIMPLE, 
+          "LAUNCHBROWSER: CLaunchBrowserHandler::CreateAccessPointL apId=%d",
+          apId )
+
+    CleanupStack::PopAndDestroy( &cm );
+    CleanupStack::PopAndDestroy( &cmManager );
+    
+    LOG( SIMPLE, 
+         "LAUNCHBROWSER: CLaunchBrowserHandler::CreateAccessPointL exiting" )
+    
+    return apId;
+    }
+
+// --------------------------------------------------------------------------
+// Get a AP from the Connection Method Manager.
+// --------------------------------------------------------------------------
+TUint32 CLaunchBrowserHandler::GetAccessPointByGatewayAddressL()
+    {
+    LOG( SIMPLE, "LAUNCHBROWSER: \
+        CLaunchBrowserHandler::GetAccessPointByGatewayAddressL calling" )
+    // Access Point ID.
+    TUint32 apId( 0 ); 
+    // Unknown IP address type.
+    TInt ipvType( 0 );
+    // Get the gateway address.
+    TPtrC gatewayAddrPtr( iLaunchBrowserData.iText );
+    // Get the bearer list.
+    TPtrC8 bearerListPtr( iLaunchBrowserData.iBearerList ); 
+
+    // Proxy address.
+    HBufC* proxyAddress = NULL;
+    // Proxy port number.
+    TUint32 proxyPortNumber( 0 );
+    HBufC* pa = NULL;
+    TUint32 pn( 0 );
+
+    // Used to exit the connection method go through loop
+    TBool exitConnectionMethodsLoop( EFalse );
+    
+    // SAT access point name.
+    TPtrC satAPN( KNullDesC );
+    
+    // Use SAT application name as SAT APN.
+    satAPN.Set( iUtils->SatAppName() );
+    // Use default SAT APN if SAT application name is not available.
+    if ( satAPN == KNullDesC )
+        {
+        LOG( SIMPLE, 
+             "CLaunchBrowserHandler::GetAccessPointByGatewayAddressL\
+             satAPN == KNullDesC" )
+        satAPN.Set( KSatAccessPointName );
+        }
+        
+    // Get the proxy address and port number
+    proxyAddress = HBufC::NewLC( gatewayAddrPtr.Length() );
+    TPtr proxyAddrPtr( proxyAddress->Des() );
+    SeparatePortNumberFromAddress( gatewayAddrPtr, proxyAddrPtr, 
+        proxyPortNumber );
+    proxyAddrPtr.TrimAll();
+    
+    // Check the launch browser package for gateway setting.
+    ipvType = ValidateGatewayAddress( proxyAddrPtr );
+    
+    if ( RPacketContext::EPdpTypeIPv4 == ipvType || \
+         RPacketContext::EPdpTypeIPv6 == ipvType )
+        {
+        LOG2( SIMPLE, 
+              "CLaunchBrowserHandler::GetAccessPointByGatewayAddressL \
+              gatewayAddrPtr.Length(): %d", gatewayAddrPtr.Length() )
+        // Check the launch browser package for bearer setting if the gateway
+        // address is valid.
+        LOG2( SIMPLE, 
+              "LAUNCHBROWSER: CLaunchBrowserHandler:: \
+              GetAccessPointByGatewayAddressL, IPvType is %d",
+              ipvType)
+        if ( gatewayAddrPtr.Length() )
+            {
+            // The bearer is GPRS.
+            if ( bearerListPtr != KNullDesC8 && bearerListPtr.Length() > 0 
+                    && RSat::KGprsBearer == bearerListPtr[0] )
+                {
+                
+                // Go through the candidate connection methods to find 
+                // the one matched the gateway address. If a matched one 
+                // is found,using it as the access point for SIM service, 
+                // else a new one is created.      
+                RCmManager cmManager;
+                cmManager.OpenLC();
+
+                // Get the Connection Methods does not belongs to 
+                // any destination
+                RArray<TUint32> array = RArray<TUint32>( 
+                                        KSatCMGranularity );
+                CleanupClosePushL( array );
+
+                cmManager.ConnectionMethodL( array );
+
+                // Go through the Connection Method list to find 
+                // if there is matched one
+                 
+                for( TInt i = 0; 
+                     ( i < array.Count() ) && !exitConnectionMethodsLoop; 
+                     ++i )
+                    {
+                    RCmConnectionMethod cm = cmManager.ConnectionMethodL(
+                                                          array[i] );
+                    CleanupClosePushL( cm );
+                    
+                    // query the Gateway proxy address 
+                    // of the Connection Method
+                    pa = cm.GetStringAttributeL( 
+                         CMManager::ECmWapIPGatewayAddress );
+                    CleanupStack::PushL(pa);
+                    
+                    // query the Gateway proxy port number of the Connection 
+                    // Method
+                    pn = cm.GetIntAttributeL( 
+                            CMManager::ECmProxyPortNumber );
+                    
+                    if (( pn == proxyPortNumber ) && 
+                        ( *pa == *proxyAddress ))
+                        {
+                        // Find the matched connection method
+                        apId = cm.GetIntAttributeL( CMManager::ECmIapId );
+                        LOG2( SIMPLE, 
+                              "LAUNCHBROWSER: CLaunchBrowserHandler::\
+                              GetAccessPointByGatewayAddressL, apId=%d",
+                              apId )
+                        exitConnectionMethodsLoop = ETrue;
+                        }
+                        
+                    CleanupStack::PopAndDestroy( pa );
+                    CleanupStack::PopAndDestroy( &cm );
+                    }
+            
+                CleanupStack::PopAndDestroy( &array );
+                CleanupStack::PopAndDestroy( &cmManager );
+                
+                LOG2( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler:: \
+                      GetAccessPointByGatewayAddressL apId=%d", apId )
+                           
+                if ( !apId )
+                    {
+                    // Create a new AP if there is not a matched one.
+                    apId = CreateAccessPointL( 
+                            satAPN,
+                            proxyAddrPtr,
+                            proxyPortNumber,
+                            static_cast<RPacketContext::TProtocolType>(
+                                                              ipvType ) );
+                    }
+                }
+            }
+        }
+    CleanupStack::PopAndDestroy( proxyAddress );
+    
+    LOG2( SIMPLE, 
+          "LAUNCHBROWSER: CLaunchBrowserHandler::\
+          GetAccessPointByGatewayAddressL exiting, apId=%d", apId )
+    
+    // return the AP.
+    return apId;
+    }
+
+// --------------------------------------------------------------------------
+// Get an Access Point by default.
+// --------------------------------------------------------------------------
+TUint32 CLaunchBrowserHandler::GetAccessPointByDefaultL()
+    {
+    LOG( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::\
+         GetAccessPointByDefaultL calling" )
+         
+    TUint32 apId ( KErrNone );
+    RCmManager cmManager;
+    cmManager.OpenLC();
+    RCmConnectionMethod cm;
+    CleanupClosePushL( cm );
+    
+    // Get a default connection method
+    TInt ret( KErrNotFound );
+    GetDefConnMethodL( cmManager, cm, ret );
+    if ( !ret )
+        {
+        LOG( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::\
+             GetAccessPointByDefaultL default connection found" )        
+        apId = cm.GetIntAttributeL( CMManager::ECmIapId );
+        }
+    
+    CleanupStack::PopAndDestroy( &cm );
+    CleanupStack::PopAndDestroy( &cmManager );
+    
+    LOG2( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::\
+          GetAccessPointByDefaultL exiting, apId=%d", apId )
+    
+    return apId;
+    }
+
+// --------------------------------------------------------------------------
+// Get default URL by access point
+// --------------------------------------------------------------------------
+HBufC* CLaunchBrowserHandler::GetDefaultUrlByAccessPointLC( TUint32 aApId )
+    {
+    LOG2( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::\
+         GetDefaultUrlByAccessPointLC calling, aApId=%d", aApId )
+    
+    HBufC* url = NULL;
+    if ( aApId > 0 )
+        {
+        // Create CMManager session
+        RCmManager cmManager;
+        cmManager.OpenLC();
+        
+        // get the connection method by apId
+        RCmConnectionMethod cm = cmManager.ConnectionMethodL( aApId );
+        CleanupClosePushL( cm );
+        
+        // Get the default URL from default accesspoint
+        // If the access point doesn't include the default URL,
+        // the empty string is returned.
+        url = cm.GetStringAttributeL( CMManager::ECmStartPage );
+        
+        CleanupStack::PopAndDestroy( &cm );
+        CleanupStack::PopAndDestroy( &cmManager );
+
+        CleanupStack::PushL( url );  
+        }
+    
+    if ( !url )
+        {
+        url = KNullDesC().AllocLC();
+        }
+    
+    LOG2( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::\
+          GetDefaultUrlByAccessPointLC exiting, url=%s", url )
+    return url;
+    }
+
+// --------------------------------------------------------------------------
+// Convert a descriptor into a integer.
+// --------------------------------------------------------------------------
+TInt CLaunchBrowserHandler::ConvertDesToInt( const TDesC16& aDes )
+    {
+    LOG2( SIMPLE, "LAUNCHBROWSER: \
+          CLaunchBrowserHandler::ConvertDesToInt calling,length of aDes:%d",
+          aDes.Length() )
+
+    TLex converter;
+    TInt intValue( KErrNotFound );
+    TBool digital( ETrue );
+
+    if ( aDes != KNullDesC && aDes.Length() > 0 )
+        {
+        // The literal value of every element in the descriptor 
+        // should be numerical.
+        for ( TInt i = 0; i < aDes.Length() && digital; i++ )
+            {
+            TChar ch( aDes[i] );
+            
+            if ( !ch.IsDigit() )
+                {
+                LOG( SIMPLE, "LAUNCHBROWSER: \
+                CLaunchBrowserHandler::ConvertDesToInt not digit" )
+                digital = EFalse;
+                }
+            }
+            
+        if ( digital )
+            {
+            LOG( SIMPLE, "LAUNCHBROWSER: \
+            CLaunchBrowserHandler::ConvertDesToInt digit" )
+            // Converting.
+            converter.Assign( aDes );
+            converter.Val( intValue );
+            }
+        }
+
+    LOG2( SIMPLE, "LAUNCHBROWSER: \
+          CLaunchBrowserHandler::ConvertDesToInt exiting,intValue:%d", 
+          intValue )
+
+    return intValue;
+    }
+
+// --------------------------------------------------------------------------
+// Check the validity of a descriptor in hex.
+// --------------------------------------------------------------------------
+TBool CLaunchBrowserHandler::ValidateHexadecimal( const TDesC16& aHex )
+    {
+    LOG( SIMPLE, "LAUNCHBROWSER: \
+        CLaunchBrowserHandler::ValidateHexadecimal calling" )
+
+    // The hexadecimal descriptor can be null.
+    TInt length( aHex.Length() );
+    TBool retVal( ETrue );
+    LOG2( SIMPLE, "LAUNCHBROWSER: \
+        CLaunchBrowserHandler::ValidateHexadecimal length:%d", length )
+
+    // Validate characters one by one.
+    for ( TInt i = 0; i < length && retVal; i++ )
+        {
+        TChar ch( aHex[i] );
+        
+        if ( !ch.IsHexDigit() )
+            {
+            LOG2( SIMPLE, "LAUNCHBROWSER: \
+            CLaunchBrowserHandler::ValidateHexadecimal hex digit,i: %d",
+            i )
+            retVal = EFalse;
+            }
+        }
+
+    LOG2( SIMPLE, "LAUNCHBROWSER: \
+          CLaunchBrowserHandler::ValidateHexadecimal exiting, retVal:%d",
+          retVal )
+        
+    return retVal;
+    }
+
+// --------------------------------------------------------------------------
+// Check the validity of a IPv4 address. For example, 210.13.246.172.
+// --------------------------------------------------------------------------
+TBool CLaunchBrowserHandler::ValidateIPv4Address( 
+        const TDesC16& aAddress )
+    {
+    LOG2( SIMPLE, "LAUNCHBROWSER: \
+    CLaunchBrowserHandler::ValidateIPv4Address calling,aAddress: %s",
+    &aAddress )
+
+    // Separate the address to be three segments using dot and validate
+    // each segment.
+    TPtrC segPtr( aAddress );
+    TBuf<KSatMaxIPv4SegmentLength> segment;
+    TInt posInDes( KErrNone );
+    TInt posInPtr( KErrNone );
+    TInt segCounter( KErrNone );
+    TBool first( ETrue );
+    TBool retVal( ETrue );
+    // Segment value in integer.
+    TInt intValue( KErrNone );
+        
+    // Convert each segment into integer.
+    while ( KErrNotFound != ( posInPtr = segPtr.Find( KSatIPv4Delimiter ) )
+            && retVal )
+        {
+        
+        if ( KSatMaxIPv4SegmentLength >= posInPtr && 0 < posInPtr )
+            {
+            LOG( SIMPLE, "LAUNCHBROWSER: \
+            CLaunchBrowserHandler::ValidateIPv4Address posInPtr valid" )
+            segCounter++;
+            posInDes += posInPtr;
+            segment = segPtr.Mid( 0, posInPtr );
+            
+            // The first integer should be > 0 and < 255, others should be 
+            // >=0 and < 255.
+            intValue = ConvertDesToInt( segment );
+            LOG2( SIMPLE, "LAUNCHBROWSER: \
+            CLaunchBrowserHandler::ValidateIPv4Address first:%d",first )
+            if ( first )
+                {
+                first = EFalse;
+                
+                if ( !( KSatIPv4Network < intValue && 
+                        KSatIPv4Broadcast > intValue ) )
+                    {
+                    LOG( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::\
+                         ValidateIPv4Address intValue valid" )
+                    retVal = EFalse;
+                    }
+                }
+            else
+                {
+                
+                if ( !( KSatIPv4Network <= intValue && 
+                        KSatIPv4Broadcast > intValue ) )
+                    {
+                    LOG( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::\
+                         ValidateIPv4Address intValue range" )
+                    retVal = EFalse;
+                    }
+                }
+            // Skip dot.
+            posInDes++;
+            segPtr.Set( aAddress.Mid( posInDes, 
+                aAddress.Length() - posInDes ) );
+            }
+        else
+            {
+            retVal = EFalse;
+            }
+        }
+    
+    // IPv4 address is consist of 4 segment
+    if ( KSatMaxIPv4SegmentCounter == segCounter && retVal )
+        {
+        LOG( SIMPLE, "LAUNCHBROWSER: \
+        CLaunchBrowserHandler::ValidateIPv4Address valid address" )
+        // Validate the last segment.
+        segment = segPtr;
+        
+        if ( KSatMaxIPv4SegmentLength < segment.Length() )
+            {
+            LOG( SIMPLE, "LAUNCHBROWSER: \
+            CLaunchBrowserHandler::ValidateIPv4Address address invalid" )
+            retVal = EFalse;
+            }
+            
+        intValue = ConvertDesToInt( segment );
+        
+        if ( !( KSatIPv4Network < intValue && 
+                KSatIPv4Broadcast > intValue ) )
+            {
+            LOG( SIMPLE, "LAUNCHBROWSER: \
+            CLaunchBrowserHandler::ValidateIPv4Address intValue range" )
+            retVal = EFalse;
+            }
+        }
+    else
+        {
+        retVal = EFalse;
+        }
+        
+    LOG2( SIMPLE, "LAUNCHBROWSER: \
+        CLaunchBrowserHandler::ValidateIPv4Address exiting,retVal:%d",
+        retVal )
+
+    return retVal;
+    }
+
+// --------------------------------------------------------------------------
+// Check the validity of a IPv6 address. For example,
+// 3ffe:ffff:101::230:6eff:fe04:d9ff.
+// --------------------------------------------------------------------------
+TBool CLaunchBrowserHandler::ValidateIPv6Address( 
+        const TDesC16& aAddress )
+    {
+    LOG2( SIMPLE, "LAUNCHBROWSER: \
+    CLaunchBrowserHandler::ValidateIPv6Address calling,aAddress: %s",
+    &aAddress )
+
+    // Separate the address to be eight segments using colon and validate
+    // each segment.
+    TPtrC segPtr( aAddress );
+    TBuf<KSatMaxIPv6SegmentLength> segment;
+    TInt posInDes( KErrNone );
+    TInt posInPtr( KErrNone );
+    TInt segCounter( KErrNone );
+    TBool first( ETrue );
+    TBool retVal( ETrue );
+    
+    while ( KErrNotFound != ( posInPtr = segPtr.Find( KSatIPv6Delimiter ) )
+            && retVal )
+        {
+        
+        if ( KSatMaxIPv6SegmentLength >= posInPtr && 0 <= posInPtr )
+            {
+            LOG( SIMPLE, "LAUNCHBROWSER: \
+            CLaunchBrowserHandler::ValidateIPv6Address posInPtr valid" )
+            segCounter++;
+            posInDes += posInPtr;
+            segment = segPtr.Mid( 0, posInPtr );
+            LOG2( SIMPLE, "LAUNCHBROWSER: \
+            CLaunchBrowserHandler::ValidateIPv6Address first:%d",first )
+            if ( first )
+                {
+                first = EFalse;
+                
+                if ( 0 >= segment.Length() )
+                    {
+                    retVal = EFalse;
+                    }
+                }
+                
+            if ( KSatMaxIPv6SegmentLength < segment.Length() )
+                {
+                LOG( SIMPLE, "LAUNCHBROWSER: \
+                CLaunchBrowserHandler::ValidateIPv6Address address invalid" )
+                retVal = EFalse;
+                }
+                
+            if ( !ValidateHexadecimal( segment ) )
+                {
+                LOG( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::\
+                ValidateIPv6Address address invalid hex" )
+                retVal = EFalse;
+                }
+            
+            // Skip colon.
+            posInDes++; 
+            segPtr.Set( aAddress.Mid( posInDes, 
+                aAddress.Length() - posInDes ) );
+            }
+        else 
+            {
+            retVal = EFalse;
+            }
+        }
+
+    // IPv6 address is consist of 8 segment
+    if ( KSatMaxIPv6SegmentCounter == segCounter && retVal )
+        {
+        LOG( SIMPLE, "LAUNCHBROWSER: \
+        CLaunchBrowserHandler::ValidateIPv6Address valid address" )
+        // Validate the last segment.
+        segment = segPtr;
+        
+        if ( KSatMaxIPv6SegmentLength < segment.Length() )
+            {
+            LOG( SIMPLE, "LAUNCHBROWSER: \
+            CLaunchBrowserHandler::ValidateIPv6Address address invalid" )
+            retVal = EFalse;
+            }
+            
+        if ( !ValidateHexadecimal( segment ) )
+            {
+            LOG( SIMPLE, "LAUNCHBROWSER: CLaunchBrowserHandler::\
+            ValidateIPv6Address address invalid hex" )
+            retVal = EFalse;
+            }
+        }
+    else
+        {
+        retVal = EFalse;
+        }
+    
+    LOG2( SIMPLE, "LAUNCHBROWSER: \
+          CLaunchBrowserHandler::ValidateIPv6Address exiting,retVal:%d", 
+          retVal )
+
+    return retVal;
+    }
+    
+// --------------------------------------------------------------------------
+// Check the validity of a gateway IP address. Either it is IPv4 or IPv6. 
+// For example, 210.13.246.172 or 3ffe:ffff:101::230:6eff:fe04:d9ff.
+// --------------------------------------------------------------------------
+TInt CLaunchBrowserHandler::ValidateGatewayAddress( 
+        const TDesC16& aAddress )
+    {
+    LOG2( SIMPLE, "LAUNCHBROWSER: \
+          CLaunchBrowserHandler::ValidateGatewayAddress calling,length of \
+          aAddress: %d", aAddress.Length() )
+    
+    LOG2( SIMPLE, "LAUNCHBROWSER: \
+    CLaunchBrowserHandler::ValidateGatewayAddress aAddress: %s", &aAddress )
+    TInt ipvType( KSatInvalidPdpType );
+    TInt length( aAddress.Length() );
+    
+    if ( &aAddress && length )
+        {
+        // The maximum length of a IP address is less than 39.
+        if ( KSatMaxIPv4AddressLength >= length && 
+                KSatMinIPv4AddressLength <= length )
+            {
+            LOG( SIMPLE, "LAUNCHBROWSER: \
+            CLaunchBrowserHandler::ValidateGatewayAddress IPV4 address" )
+            // aAddress is a IPv4 address.
+            if ( ValidateIPv4Address( aAddress ) )
+                {
+                LOG( SIMPLE, "LAUNCHBROWSER: \
+                CLaunchBrowserHandler::ValidateGatewayAddress valid IPV4 \
+                address" )
+                ipvType = RPacketContext::EPdpTypeIPv4;
+                }
+            }
+        else if ( KSatMaxIPv6AddressLength >= length && 
+                    KSatMinIPv6AddressLength <= length )
+            {
+            LOG( SIMPLE, "LAUNCHBROWSER: \
+            CLaunchBrowserHandler::ValidateGatewayAddress IPV6 address" )
+            // aAddress is a IPv6 address.
+            if ( ValidateIPv6Address( aAddress ) )
+                {
+                LOG( SIMPLE, "LAUNCHBROWSER: \
+                CLaunchBrowserHandler::ValidateGatewayAddress valid IPV6 \
+                address" )
+                ipvType = RPacketContext::EPdpTypeIPv6;
+                }
+            }
+        }
+    
+    LOG2( SIMPLE, "LAUNCHBROWSER: \
+        CLaunchBrowserHandler::ValidateGatewayAddress exiting,ipvType:%d",
+        ipvType )
+
+    // Returned IP address.
+    return ipvType;
+    }
+
+// --------------------------------------------------------------------------
+// Separate the port number from a address if it is existing. For example,
+// 210.13.246.172:8080.
+// --------------------------------------------------------------------------
+void CLaunchBrowserHandler::SeparatePortNumberFromAddress( 
+    const TDesC16& aAddress, 
+    TDes16& aPureAddr,
+    TUint32& aPortNumber )
+    {
+    LOG2( SIMPLE, "LAUNCHBROWSER: \
+    CLaunchBrowserHandler::SeparatePortNumberFromAddress calling,\
+    aAddress: %s", &aAddress )
+
+    // The following three variables are used to locate the port number.
+    TBool isSeparator( EFalse );
+    TBool portNumberBegin( EFalse );
+    TBool portNumberEnd( EFalse );
+    TBool pureAddrEnd( EFalse );
+    // Count delimiters in the address.
+    TInt delimiterCounter( 0 );
+    // Count symbols in a segment of the address.
+    TInt symbolCounter( 0 );
+    // Currsent position of the address descriptor.
+    TInt curPos( 0 );
+    TInt posOffset( 0 );
+    // The position of the last valid character.
+    TInt rightBound( 0 );
+    // Digital port number.
+    TUint32 portNumber( KSatLaunchBrowserProxyPortNumber );
+    // The descriptor pointer for the address.
+    TPtrC addrPtr;
+    // The length of the address.
+    TInt addrLen( 0 );
+    
+    // The address is a valid descriptor.
+    if ( NULL != &aAddress &&
+            KSatMinIPv4AddressLength <= aAddress.Length() )
+        {
+        addrPtr.Set( aAddress );
+        addrLen = aAddress.Length();
+        curPos = addrPtr.Find( KSatIPv4Delimiter );
+        
+        LOG2( SIMPLE, "CLaunchBrowserHandler::\
+        SeparatePortNumberFromAddress curPos: %i", curPos )
+        if ( KErrNotFound != curPos )
+            {
+            // Skip three delimiters in the IPv4 address.
+            delimiterCounter++;
+     
+            while ( KSatMaxIPv4SegmentCounter > delimiterCounter
+                        && curPos < addrLen )
+                {
+                curPos++;
+                posOffset = addrPtr.Right( addrLen - curPos ).Find( 
+                                KSatIPv4Delimiter );
+                LOG2( SIMPLE, "CLaunchBrowserHandler::\
+                SeparatePortNumberFromAddress posOffset: %i", posOffset )
+                if ( KErrNotFound != posOffset )
+                    {
+                    delimiterCounter++;
+                    curPos += posOffset;
+                    }
+                else
+                    {
+                    delimiterCounter = KSatMaxIPv4SegmentCounter;
+                    }
+                }
+
+            // Locate the separator between the pure address and 
+            // the port number.
+            curPos++;
+     
+            while ( curPos < addrLen 
+                &&  KSatMaxIPv4SegmentLength > symbolCounter 
+                && !isSeparator )
+                {
+                TChar ch( addrPtr[curPos] );
+     
+                if ( ch.IsAlphaDigit() )
+                    {
+                    LOG( SIMPLE, "CLaunchBrowserHandler::\
+                    SeparatePortNumberFromAddress AlphaDigit" )
+                    symbolCounter++;
+                    }
+                else
+                    {
+                    isSeparator = ETrue;
+                    }
+
+                curPos++;
+                }
+            }
+        else
+            {
+            curPos = addrPtr.Find( KSatIPv6Delimiter );
+            LOG2( SIMPLE, "CLaunchBrowserHandler::\
+            SeparatePortNumberFromAddress curPos: %i", curPos )
+            if ( KErrNotFound != curPos )
+                {
+                // Skip seven delimiters in the IPv6 address.
+                delimiterCounter++;
+     
+                while ( KSatMaxIPv6SegmentCounter > delimiterCounter
+                            && curPos < addrLen )
+                    {
+                    curPos++;
+                    posOffset = addrPtr.Right( addrLen - curPos ).Find( 
+                                    KSatIPv6Delimiter );
+                    LOG2( SIMPLE, "CLaunchBrowserHandler::\
+                    SeparatePortNumberFromAddress posOffset: %i", posOffset )
+                    if ( KErrNotFound != posOffset )
+                        {
+                        delimiterCounter++;
+                        curPos += posOffset;
+                        }
+                    }
+
+                // Locate the separator between the pure address and 
+                // the port number.
+                curPos++;
+     
+                while ( curPos < addrLen && 
+                            KSatMaxIPv6SegmentLength > symbolCounter && 
+                            !isSeparator )
+                    {
+                    TChar ch( addrPtr[curPos] );
+     
+                    if ( ch.IsAlphaDigit() )
+                        {
+                        LOG( SIMPLE, "CLaunchBrowserHandler::\
+                        SeparatePortNumberFromAddress AlphaDigit" )
+                        symbolCounter++;
+                        }
+                    else
+                        {
+                        isSeparator = ETrue;
+                        }
+
+                    curPos++;
+                    }
+                }
+            }
+
+        // Extract the pure address.
+        while ( curPos < addrLen && KSatMinIPv4AddressLength < curPos 
+                && !pureAddrEnd )
+            {
+            TChar ch( addrPtr[curPos] );
+            
+            if ( !ch.IsAlphaDigit() )
+                {
+                LOG( SIMPLE, "CLaunchBrowserHandler::\
+                SeparatePortNumberFromAddress not AlphaDigit" )
+                curPos--;
+                }
+            else
+                {
+                pureAddrEnd = ETrue;
+                }
+            }
+
+        if ( curPos <= addrLen )
+            {
+            aPureAddr.Copy( addrPtr.Left( curPos + 1 ) );
+            }
+
+        // Extract the port number.
+        // Locate the beginning of the port number.
+        curPos++;
+    
+        while ( curPos < addrLen && !portNumberBegin)
+            {
+            TChar ch( addrPtr[curPos] );
+
+            if ( ch.IsDigit() )
+                {
+                LOG( SIMPLE, "CLaunchBrowserHandler::\
+                SeparatePortNumberFromAddress Digit" )
+                portNumberBegin = ETrue;
+                }
+            else
+                {
+                curPos++;
+                }
+            }
+        
+        // Locate the end of the port number.    
+        rightBound = addrLen;
+        rightBound--;
+
+        while ( rightBound > curPos && !portNumberEnd )
+            {
+            TChar ch( addrPtr[rightBound] );
+
+            if ( ch.IsDigit() )
+                {
+                LOG( SIMPLE, "CLaunchBrowserHandler::\
+                SeparatePortNumberFromAddress Digit" )
+                portNumberEnd = ETrue;
+                }
+            else 
+                {
+                rightBound--;
+                }
+            }
+        
+        // Convert the port number and validate it.
+        // Set the port number to default port number
+        aPortNumber = portNumber; 
+        if ( curPos < rightBound && rightBound < addrLen )
+            {
+            portNumber = ConvertDesToInt( 
+                addrPtr.Mid( curPos, rightBound - curPos + 1 ) );
+
+            if ( KSatMaxProxyPortNumber > portNumber &&
+                    KSatMinProxyPortNumber < portNumber )
+                {
+                LOG( SIMPLE, "CLaunchBrowserHandler::\
+                SeparatePortNumberFromAddress valid portNumber" )
+                aPortNumber = portNumber;
+                }
+            }
+        }
+        
+    LOG( SIMPLE, 
+    "LAUNCHBROWSER: CLaunchBrowserHandler::SeparatePortNumberFromAddress \
+    exiting" )
+    }
+
+// --------------------------------------------------------------------------
+// Fulfill connecion method params with default params.
+// --------------------------------------------------------------------------
+void CLaunchBrowserHandler::FulfillConnnectionMethodL( 
+    RCmManager& aCmManager,
+    RCmConnectionMethod& aCm )
+    {
+    LOG( SIMPLE, "SATENGINE: CLaunchBrowserHandler::\
+        FulfillConnnectionMethodL calling" )
+    
+    // The following 3 lines are used to preset the default parameters
+    // to avoid doing nothing for them if leaving.
+    aCm.SetStringAttributeL( CMManager::EPacketDataAPName, 
+        KSatGprsAccessPointName );
+    aCm.SetBoolAttributeL( CMManager::ECmIFPromptForAuth, EFalse );
+    aCm.SetBoolAttributeL( CMManager::ECmDisablePlainTextAuth, EFalse );
+        
+    // Get default access point ID.
+    RCmConnectionMethod defCm;
+    CleanupClosePushL( defCm );
+    
+    TInt ret ( KErrNotFound );
+    GetDefConnMethodL( aCmManager, defCm, ret );
+    
+    if ( !ret )
+        {
+        // Default AP found! Copy parameters from
+        // default AP to new created AP.
+        
+        // Copy AP name.
+        HBufC* strValue = defCm.GetStringAttributeL( 
+            CMManager::EPacketDataAPName );
+        LOG2( SIMPLE, "SATENGINE: CLaunchBrowserHandler::\
+            FulfillConnnectionMethodL AP Name is %s", strValue )
+        CleanupStack::PushL( strValue );
+        aCm.SetStringAttributeL( CMManager::EPacketDataAPName, *strValue );
+        CleanupStack::PopAndDestroy( strValue );
+        
+        // Copy authentic name
+        strValue = defCm.GetStringAttributeL( CMManager::ECmIFAuthName );
+        LOG2( SIMPLE, "SATENGINE: CLaunchBrowserHandler::\
+            FulfillConnnectionMethodL Auch name is %s", strValue )
+        CleanupStack::PushL( strValue );
+        aCm.SetStringAttributeL( CMManager::ECmIFAuthName, *strValue );
+        CleanupStack::PopAndDestroy( strValue );
+        
+        // Copy authentic pass
+        strValue = defCm.GetStringAttributeL( CMManager::ECmIFAuthPass );
+        LOG2( SIMPLE, "SATENGINE: CLaunchBrowserHandler::\
+            FulfillConnnectionMethodL Auch pass is %s", strValue )
+        CleanupStack::PushL( strValue );
+        aCm.SetStringAttributeL( CMManager::ECmIFAuthPass, *strValue );
+        CleanupStack::PopAndDestroy( strValue );
+        
+        // Copy default URL
+        strValue = defCm.GetStringAttributeL( CMManager::ECmStartPage );
+        LOG2( SIMPLE, "SATENGINE: CLaunchBrowserHandler::\
+            FulfillConnnectionMethodL Start page pass is %s", strValue )
+        CleanupStack::PushL( strValue );
+        aCm.SetStringAttributeL( CMManager::ECmStartPage, *strValue );
+        CleanupStack::PopAndDestroy( strValue );
+        
+        // Copy status if prompt for auth
+        TBool bValue = defCm.GetBoolAttributeL( 
+                CMManager::ECmIFPromptForAuth );
+        aCm.SetBoolAttributeL( CMManager::ECmIFPromptForAuth, bValue );
+        
+        // Copy security status.
+        bValue = defCm.GetBoolAttributeL( 
+                CMManager::ECmDisablePlainTextAuth );
+        aCm.SetBoolAttributeL( CMManager::ECmIFPromptForAuth, bValue );
+        }
+        
+    CleanupStack::PopAndDestroy( &defCm );
+    
+    LOG( SIMPLE, "SATENGINE: CLaunchBrowserHandler::\
+        FulfillConnnectionMethodL exiting" )
+    }
+
+// --------------------------------------------------------------------------
+// Check the validity of offered bearer type
+// --------------------------------------------------------------------------
+void CLaunchBrowserHandler::ValidateBearerTypeL( RCmConnectionMethod& aCm, 
+                                                 TInt& aIsValid )
+    {
+    LOG( SIMPLE, "SATENGINE: CLaunchBrowserHandler::\
+         ValidateBearerTypeL calling" )
+        
+    TUint32 bearerType = aCm.GetIntAttributeL( 
+        CMManager::ECmBearerType );
+    LOG2( SIMPLE, "SATENGINE: CLaunchBrowserHandler::\
+        ValidateBearerTypeL bearerType=0x%x", bearerType )
+    
+    if ( KUidPacketDataBearerType == bearerType )
+        {
+        LOG( SIMPLE, "SATENGINE: CLaunchBrowserHandler::\
+            ValidateBearerTypeL bearer type is GPRS" )
+        aIsValid = KErrNone;
+        }
+    
+    LOG2( SIMPLE, "SATENGINE: CLaunchBrowserHandler::\
+          ValidateBearerTypeL exiting, aIsValid=%d", aIsValid )
+    }
+
+// --------------------------------------------------------------------------
+// Get default connection method
+// --------------------------------------------------------------------------
+void CLaunchBrowserHandler::GetDefConnMethodL( RCmManager& aCmManager,
+                                               RCmConnectionMethod& aDefCm,
+                                               TInt& aIsValid )
+    {
+    LOG( SIMPLE, "SATENGINE: CLaunchBrowserHandler::\
+         GetDefConnMethodL calling" )   
+         
+    // Go through the default connection methods to find 
+    // the one valid connection method.   
+    TCmDefConnValue defConn;
+    aCmManager.ReadDefConnL( defConn );
+    
+    LOG3( SIMPLE, "SATENGINE: CLaunchBrowserHandler::\
+      GetDefConnMethodL DefConn type=%d, id=%d", 
+      defConn.iType, defConn.iId )
+    
+    // Mark aIsFound as KErrNone if there is one valid 
+    // connection method, otherwise KErrNotFound.
+    aIsValid = KErrNotFound;
+    
+    // Default setting is a connection method
+    if ( ECmDefConnConnectionMethod == defConn.iType )
+        {
+        LOG( SIMPLE, "SATENGINE: CLaunchBrowserHandler::\
+             GetDefConnMethodL ECmDefConnConnectionMethod" )
+        aDefCm = aCmManager.ConnectionMethodL( defConn.iId );
+        // Check bearer type, leave if not GPRS
+        ValidateBearerTypeL( aDefCm, aIsValid );
+        }
+
+    // Default setting is a destination
+    else if ( ECmDefConnDestination == defConn.iType )
+        {
+        LOG( SIMPLE, "SATENGINE: CLaunchBrowserHandler::\
+            GetDefConnMethodL ECmDefConnDestination" )
+        RCmDestination defDes = aCmManager.DestinationL( defConn.iId );
+        
+        TInt desCount = defDes.ConnectionMethodCount();
+        
+        LOG2( SIMPLE, "SATENGINE: CLaunchBrowserHandler::\
+            GetDefConnMethodL ECmDefConnDestination count=%d",
+            desCount )
+        
+        for ( TInt i = 0; 
+              desCount > 0 && aIsValid != KErrNone && i < desCount; i++ )
+            {
+            // Go through all the connection methods, 
+            // until find a valid one.
+            aDefCm = defDes.ConnectionMethodL( i );
+            ValidateBearerTypeL( aDefCm, aIsValid );
+            }
+        }
+    else
+        {
+        aIsValid = KErrNotFound;
+        }
+    LOG( SIMPLE, "SATENGINE: CLaunchBrowserHandler::GetDefConnMethodL exit" )
+    }
+// End Of File