satengine/satserver/Commands/OpenChannelCmd/src/COpenChannelHandler.cpp
changeset 33 8d5d7fcf9b59
child 51 12bc758d6a02
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/satengine/satserver/Commands/OpenChannelCmd/src/COpenChannelHandler.cpp	Wed Jul 21 18:26:52 2010 +0300
@@ -0,0 +1,1164 @@
+/*
+* Copyright (c) 2002-2010 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 OpenChannel command
+*
+*/
+
+
+#include    <etelpckt.h>
+#include    <etelmmerr.h>
+
+#include    "COpenChannelHandler.h"
+#include    "MSatApi.h"
+#include    "MSatUtils.h"
+#include    "MSatUiSession.h"
+#include    "MSatSystemState.h"
+#include    "MSatApnHandler.h"
+#include    "SatSOpcodes.h"
+#include    "MSatSUiClientHandler.h"
+#include    "SatLog.h"
+#include    "extendedconnpref.h"
+
+const TUint8 KChannelStatusLength( 2 );
+
+// ======== MEMBER FUNCTIONS ========
+
+// -----------------------------------------------------------------------------
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+COpenChannelHandler* COpenChannelHandler::NewL( MSatUtils* aUtils )
+    {
+    LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::NewL calling" )
+
+    COpenChannelHandler* self = new( ELeave ) COpenChannelHandler;
+
+    CleanupStack::PushL( self );
+    self->BaseConstructL( aUtils );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+
+    LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::NewL exiting" )
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// Destructor
+// -----------------------------------------------------------------------------
+//
+COpenChannelHandler::~COpenChannelHandler()
+    {
+    LOG( SIMPLE,
+        "OPENCHANNEL: COpenChannelHandler::~COpenChannelHandler calling" )
+
+    Cancel();
+    iDataChannel = NULL;
+
+    delete iConnectionInfo.iOverrideSet;
+
+    LOG( SIMPLE,
+        "OPENCHANNEL: COpenChannelHandler::~CCloseChannelHandler exiting" )
+    }
+
+// ---------------------------------------------------------------------------
+// From class MSatCommand.
+// Response from the client.
+// ---------------------------------------------------------------------------
+//
+void COpenChannelHandler::ClientResponse()
+    {
+    LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::ClientResponse calling" )
+
+    // Query response from client.
+    if ( !iQueryRsp.iAccepted ) // Not accepted by user
+        {
+        // Close data channel
+        CloseChannel();
+
+        if ( iQueryRsp.iSessionTerminatedByUser ) // Terminated by user
+            {
+            LOG( NORMAL, "OPENCHANNEL: COpenChannelHandler::ClientResponse \
+                Session terminated by user" )
+            // Notify sim session end command that next sim session end
+            // should close the ui session.
+            iUtils->NotifyEvent( MSatUtils::ESessionTerminatedByUser );
+
+            // Terminal response, SimSessionTerminatedByUser
+            iOpenChannelRsp.iGeneralResult = RSat::KPSessionTerminatedByUser;
+            }
+        else
+            {
+            LOG( NORMAL, "OPENCHANNEL: COpenChannelHandler::ClientResponse \
+                User not accept command" )
+
+            // Send terminal response -> User not accepted
+            iOpenChannelRsp.iGeneralResult = RSat::KPCmdNotAcceptedByUser;
+            }
+
+        iOpenChannelRsp.iInfoType = RSat::KNoAdditionalInfo;
+        iOpenChannelRsp.iAdditionalInfo.Zero();
+        iOpenChannelRsp.SetPCmdNumber( iOpenChannelData.PCmdNumber() );
+        TerminalRsp( iPCmd, iOpenChannelRspPckg );
+        }
+    else // Accepted by user
+        {
+        LOG( NORMAL,
+            "OPENCHANNEL: COpenChannelHandler::ClientResponse User accepted" )
+        // User accepted
+        const TInt linkEst( iOpenChannelData.iLinkEst );
+
+        // SetUp channel if activation is on demand
+        if ( ( RSat::EOnDemand == linkEst ) && ( KErrNone != SetUpChannel() ) )
+            {
+            // Close channel and send error if setup failed
+            CloseChannel();
+            LOG( NORMAL, "OPENCHANNEL: COpenChannelHandler::ClientResponse \
+                SetUp failed" )
+            iOpenChannelRsp.iGeneralResult = RSat::KMeUnableToProcessCmd;
+            iOpenChannelRsp.iInfoType = RSat::KNoAdditionalInfo;
+            iOpenChannelRsp.iAdditionalInfo.Zero();
+            iOpenChannelRsp.SetPCmdNumber( iOpenChannelData.PCmdNumber() );
+            TerminalRsp( iPCmd, iOpenChannelRspPckg );
+            }
+        else
+            {
+            // Send terminal response
+            SendSuccessTerminalRsp();
+            }
+
+        }
+
+    LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::ClientResponse exiting" )
+    }
+
+// -----------------------------------------------------------------------------
+// From class MSatConnectionObserver.
+// Notification from the connection.
+// -----------------------------------------------------------------------------
+//
+void COpenChannelHandler::ConnectionNotification( TInt aError )
+    {
+    LOG2( SIMPLE, "OPENCHANNEL: COpenChannelHandler::ConnectionNotification\
+         calling with code %i", aError )
+
+    // Check connection status
+    if ( KErrNone == aError )
+        {
+        // If information indication to the user is needed, show it now.
+        if ( iNeedUiSession )
+            {
+            LOG( NORMAL, "OPENCHANNEL: COpenChannelHandler::HandleCommand \
+                Sending UI Notification" )
+
+            // Send confirmation to UI and wait for client response
+            SendConfirmToUi();
+            }
+        else
+            {
+            // Send successfull terminal response
+            SendSuccessTerminalRsp();
+            }
+        }
+    else
+        {
+        // Activation failed, Close channel and send error
+        LOG( NORMAL, "OPENCHANNEL: COpenChannelHandler::ConnectionNotification \
+            Channel activation failed" )
+
+        // Close channel
+        CloseChannel();
+
+        // PDP Activation failed
+        iOpenChannelRsp.iGeneralResult = RSat::KBearerIndepProtocolError;
+        iOpenChannelRsp.iInfoType = RSat::KMeProblem;
+        iOpenChannelRsp.iAdditionalInfo.SetLength( 1 );
+        iOpenChannelRsp.iAdditionalInfo[0] = RSat::KNoSpecificBIPError;
+        iOpenChannelRsp.SetPCmdNumber( iOpenChannelData.PCmdNumber() );
+        TerminalRsp( iPCmd, iOpenChannelRspPckg );
+        }
+
+    LOG( SIMPLE,
+        "OPENCHANNEL: COpenChannelHandler::ConnectionNotification exiting" )
+    }
+
+// -----------------------------------------------------------------------------
+// From class CSatCommandHandler.
+// Event notification.
+// -----------------------------------------------------------------------------
+//
+void COpenChannelHandler::Event( TInt aEvent )
+    {
+    LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::Event calling" )
+
+    // Check event
+    if ( MSatUtils::ESatUiLaunched == aEvent )
+        {
+        LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::Event ESatUiLaunched" )
+        iUtils->UnregisterEvent( this, MSatUtils::ESatUiLaunched );
+
+        // Send confirm to UI
+        SendConfirmToUi();
+        }
+
+    LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::Event exiting" )
+    }
+
+// -----------------------------------------------------------------------------
+// From class CActive.
+// Cancels the sat request.
+// -----------------------------------------------------------------------------
+//
+void COpenChannelHandler::DoCancel()
+    {
+    LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::DoCancel calling" )
+
+    iUtils->USatAPI().NotifyOpenChannelCancel();
+
+    LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::DoCancel exiting" )
+    }
+
+// -----------------------------------------------------------------------------
+// From class CSatCommandHandler.
+// Requests the command notification.
+// -----------------------------------------------------------------------------
+//
+void COpenChannelHandler::IssueUSATRequest( TRequestStatus& aStatus )
+    {
+    LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::IssueUSATRequest calling" )
+
+    // Reset values
+    iDataChannel = NULL;
+    iSetUpWithModifications = EFalse;
+    iNeedUiSession = EFalse;
+
+    // Reset open channel data.
+    new (&iOpenChannelData) RSat::TOpenGprsChannelV4();
+    new (&iQueryData) TSatQueryV1();
+
+    iUtils->USatAPI().NotifyOpenChannel( aStatus, iOpenChannelPckg );
+    iUtils->NotifyEvent( MSatUtils::EBipCommandDoneExecuting );
+
+    LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::IssueUSATRequest exiting" )
+    }
+
+// -----------------------------------------------------------------------------
+// From class CSatCommandHandler.
+// OpenChannel command is not allowed in following situations:
+//      - Phone is not registered to homenetwork and roaming.
+//      - phone is ringing, alerting or call is on and OpenChannel command
+//        is "make call only if not busy", "make call only if not busy wiht
+//        redial" or "Call type not set".
+// -----------------------------------------------------------------------------
+//
+TBool COpenChannelHandler::CommandAllowed()
+    {
+    LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::CommandAllowed calling" )
+
+    // Define the PCmd here since this is the first place after notification
+    iPCmd = RSat::EOpenChannelGprs; // Other possible values
+                                    // RSat::EOpenChannelCs
+                                    // RSat::EOpenChannelLocal
+
+    // Check parameters here, because every terminal response must contain info
+    // about Bearer Set and BufferSize.
+    TBool result( CheckParameters() );
+
+    // Indicates channel activation type
+    const TBool activateImmediately(
+        RSat::EImmediate == iOpenChannelData.iLinkEst );
+
+    //lint -e{961} Else block not needed.
+    if ( ( RSat::EAlphaIdProvided != iOpenChannelData.iAlphaId.iStatus ) &&
+         ( RSat::ESelfExplanatory == iOpenChannelData.iIconId.iQualifier ||
+           RSat::ENotSelfExplanatory == iOpenChannelData.iIconId.iQualifier ) )
+        {
+        iOpenChannelRsp.iGeneralResult = RSat::KCmdDataNotUnderstood;
+        iOpenChannelRsp.iInfoType = RSat::KNoAdditionalInfo;
+        iOpenChannelRsp.iAdditionalInfo.Zero();
+        result = EFalse;
+        LOG( NORMAL, "OPENCHANNEL: COpenChannelHandler::CommandAllowed \
+            icon received without alpha id" )
+        }
+    // If parameters are OK, check rest.
+    else if ( result && activateImmediately )
+        {
+        // Set result to False. If checks goes OK, this is set to ETrue.
+        result = EFalse;
+
+        RMobilePhone::TMobilePhoneRegistrationStatus registrationStatus(
+            iUtils->SystemState().GetNetworkRegistrationStatus() );
+
+        // Indicates is there service on network
+        const TBool noService(
+            ( RMobilePhone::ERegisteredOnHomeNetwork != registrationStatus ) &&
+            ( RMobilePhone::ERegisteredRoaming != registrationStatus ) );
+
+        if ( RMobilePhone::ERegistrationUnknown == registrationStatus )
+            {
+            LOG( NORMAL,
+                "OPENCHANNEL: COpenChannelHandler::CommandAllowed \
+                NetworkRegStatus not available" )
+            iOpenChannelRsp.iGeneralResult = RSat::KMeUnableToProcessCmd;
+            iOpenChannelRsp.iInfoType = RSat::KMeProblem;
+            iOpenChannelRsp.iAdditionalInfo.SetLength( 1 );
+            iOpenChannelRsp.iAdditionalInfo[0] = RSat::KNoSpecificMeProblem;
+            }
+        // Check registration status
+        else if ( noService )
+            {
+            // No service
+            LOG( NORMAL,
+                "OPENCHANNEL: COpenChannelHandler::CommandAllowed No service" )
+
+            iOpenChannelRsp.iGeneralResult = RSat::KMeUnableToProcessCmd;
+            iOpenChannelRsp.iInfoType = RSat::KMeProblem;
+            iOpenChannelRsp.iAdditionalInfo.SetLength( 1 );
+            iOpenChannelRsp.iAdditionalInfo[0] = RSat::KNoService;
+            }
+        else
+            {
+            // Command allowed
+            LOG( NORMAL, "OPENCHANNEL: COpenChannelHandler::CommandAllowed \
+                Command is allowed Immediate activation" )
+            result = ETrue;
+            }
+        }
+
+    if ( !result ) // Send Terminal response, if result is not OK
+        {
+        LOG( NORMAL, "OPENCHANNEL: COpenChannelHandler::CommandAllowed \
+        result not OK" )
+        iOpenChannelRsp.SetPCmdNumber( iOpenChannelData.PCmdNumber() );
+        TerminalRsp( iPCmd, iOpenChannelRspPckg );
+        }
+    else
+        {
+        // Register to handle UI commands.
+        TRAPD( err, iUtils->RegisterServiceRequestL( ESatSProactiveQuery,
+            ESatSProactiveQueryResponse, this ) );
+
+        LOG2( NORMAL, "OPENCHANNEL: COpenChannelHandler::CommandAllowed \
+        err: %d", err )
+        // Above function leaves only when there is not enough memory to
+        // allocate new object. So this case is very rare.
+        if ( KErrNone != err )
+            {
+            LOG( NORMAL, "OPENCHANNEL: COpenChannelHandler::CommandAllowed \
+                 Error while registering service request" )
+
+            // Send general terminal response (no BIP specific)
+            iOpenChannelRsp.iGeneralResult = RSat::KMeUnableToProcessCmd;
+            iOpenChannelRsp.iInfoType = RSat::KMeProblem;
+            iOpenChannelRsp.iAdditionalInfo.SetLength( 1 );
+            iOpenChannelRsp.iAdditionalInfo[0] = RSat::KNoSpecificMeProblem;
+            iOpenChannelRsp.SetPCmdNumber( iOpenChannelData.PCmdNumber() );
+            TerminalRsp( iPCmd, iOpenChannelRspPckg );
+
+            // Cannot complete, there are some major memory problems
+            result = EFalse;
+            }
+        // 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 ==
+            iOpenChannelData.iIconId.iQualifier ) ||
+            ( RSat::ENotSelfExplanatory ==
+            iOpenChannelData.iIconId.iQualifier ) )
+            {
+            LOG( NORMAL, "OPENCHANNEL: COpenChannelHandler::CommandAllowed \
+                 ENoIconId" )
+            iIconCommand = ETrue;
+            iOpenChannelData.iIconId.iQualifier = RSat::ENoIconId;
+            }
+        else
+            {
+            LOG( NORMAL, "OPENCHANNEL: COpenChannelHandler::CommandAllowed \
+                 others" )
+            iIconCommand = EFalse;
+            }
+        }
+
+    LOG2( SIMPLE, "OPENCHANNEL: COpenChannelHandler::CommandAllowed exiting,\
+    result: %d", result )
+    return result;
+    }
+
+// -----------------------------------------------------------------------------
+// From class CSatCommandHandler.
+// Need for ui session.
+// -----------------------------------------------------------------------------
+//
+TBool COpenChannelHandler::NeedUiSession()
+    {
+    LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::NeedUiSession calling" )
+
+    // UI is NOT needed in case where AlphaID is provided and it is a NULL
+    iNeedUiSession =
+        !( RSat::EAlphaIdNull == iOpenChannelData.iAlphaId.iStatus );
+
+    LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::NeedUiSession exiting" )
+    // We do not need UI session at this point, but we will launch it by
+    // ourselves when we do.
+    return EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// From class CSatCommandHandler.
+// Called when USAT API notifies that command.
+// -----------------------------------------------------------------------------
+//
+void COpenChannelHandler::HandleCommand()
+    {
+    LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::HandleCommand calling" )
+
+    // Notify others
+    iUtils->NotifyEvent( MSatUtils::EOpenChannelExecuting );
+    iUtils->NotifyEvent( MSatUtils::EBipCommandExecuting );
+
+    TInt error( MSatBIPUtils::ESatBIPNoChannelAvail ); // By default, negative
+
+    // Create data channel
+    TRAPD( leaveErr,
+        iDataChannel = iUtils->BipUtils().CreateChannelL(
+            iBearerType, error ) );
+
+    // Check the channel creation
+    if ( ( MSatBIPUtils::ESatBIPSuccess != error ) || 
+         ( KErrNone != leaveErr ) )
+        {
+        LOG( NORMAL, "OPENCHANNEL: COpenChannelHandler::HandleCommand\
+            Channel creation failed" )
+
+        // Channel creation failed -> Send terminal response
+        iOpenChannelRsp.iGeneralResult = RSat::KBearerIndepProtocolError;
+        iOpenChannelRsp.iInfoType = RSat::KMeProblem;
+        iOpenChannelRsp.iAdditionalInfo.SetLength( 1 );
+        iOpenChannelRsp.iAdditionalInfo[0] = RSat::KNoChannelAvailable;
+        iOpenChannelRsp.SetPCmdNumber( iOpenChannelData.PCmdNumber() );
+        TerminalRsp( iPCmd, iOpenChannelRspPckg );
+
+        LOG( SIMPLE, "OPENCHANNEL: COpenChannel::HandleCommand exiting" )
+        return;
+        }
+
+    LOG( NORMAL,
+        "OPENCHANNEL: COpenChannelHandler::HandleCommand Channel creation OK" )
+
+    // Open channel or request confirmation from user
+    const TInt linkEst( iOpenChannelData.iLinkEst );
+
+    // If not confirmation to user or immediate activation, open channel
+    if ( ( !iNeedUiSession || RSat::EImmediate == linkEst )
+           && KErrNone != SetUpChannel() )
+        {
+        // Setup failed, close channel and send error
+        LOG( NORMAL,
+            "OPENCHANNEL: COpenChannelHandler::HandleCommand SetUp failed" )
+
+        // Close channel, there was an error
+        CloseChannel();
+
+        // Channel setup failed
+        iOpenChannelRsp.iGeneralResult = RSat::KBearerIndepProtocolError;
+        iOpenChannelRsp.iInfoType = RSat::KMeProblem;
+        iOpenChannelRsp.iAdditionalInfo.SetLength( 1 );
+        iOpenChannelRsp.iAdditionalInfo[0] = RSat::KNoSpecificBIPError;
+        iOpenChannelRsp.SetPCmdNumber( iOpenChannelData.PCmdNumber() );
+        TerminalRsp( iPCmd, iOpenChannelRspPckg );
+
+        LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::HandleCommand \
+            exiting" )
+        return;
+        }
+
+    // If immediate activation, activate.
+    if ( RSat::EImmediate == linkEst )
+        {
+        LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::HandleCommand \
+             immediate activation" )
+        // Check activation
+        TInt activateError = ActivateChannel();
+        if ( KErrNone != activateError )
+            {
+            // Activation failed, Close channel and send error
+            LOG2( NORMAL, "OPENCHANNEL: COpenChannelHandler::HandleCommand \
+                Channel activation failed error = %i", activateError )
+            // Close channel
+            CloseChannel();
+
+            // Check is there a call ongoing
+            const TBool callIsOngoing( iUtils->SystemState().IsCallActive() ||
+                iUtils->SystemState().IsCallIncoming() );
+
+            iOpenChannelRsp.iGeneralResult = RSat::KBearerIndepProtocolError;
+
+            // Map the error to correct response
+            if ( KErrGprsUserAuthenticationFailure == activateError )
+                {
+                LOG( DETAILED, 
+                "OPENCHANNEL: COpenChannelHandler::HandleCommand Security \
+                error" )
+                activateError = RSat::KSecurityError;
+                }
+            else if ( KErrGprsServicesNotAllowed == activateError || callIsOngoing )
+                {
+                LOG( DETAILED, 
+                "OPENCHANNEL: COpenChannelHandler::HandleCommand Busy on \
+                call or CC on GPRS" )
+                activateError = RSat::KMeBusyOnCall;
+                iOpenChannelRsp.iGeneralResult = RSat::KMeUnableToProcessCmd;
+                }
+            else if ( ( KErrMMEtelActivationBlockedByCallControlNoText ==
+                            activateError ) ||
+                      ( KErrMMEtelActivationBlockedByCallControlWithText ==
+                            activateError ) )
+                {
+                iOpenChannelRsp.iGeneralResult = RSat::KInteractionWithCCPermanentError;
+                activateError = RSat::KActionNotAllowed;
+
+                LOG( DETAILED, 
+                "OPENCHANNEL: COpenChannelHandler::HandleCommand CC on GPRS \
+                not allowed" )
+                }
+            else
+                {
+                LOG( DETAILED, 
+                "OPENCHANNEL: COpenChannelHandler::HandleCommand No specific \
+                BIP error" )
+                activateError = RSat::KNoSpecificBIPError;
+                }
+
+            // PDP Activation failed
+            iOpenChannelRsp.iInfoType = RSat::KMeProblem;
+            iOpenChannelRsp.iAdditionalInfo.SetLength( 1 );
+            iOpenChannelRsp.iAdditionalInfo[0] =
+                static_cast<TUint16>( activateError );
+            iOpenChannelRsp.SetPCmdNumber( iOpenChannelData.PCmdNumber() );
+            TerminalRsp( iPCmd, iOpenChannelRspPckg );
+            }
+        }
+    else // OnDemand. Send terminal response or confirm to UI
+        {
+        // If information indication to the user is needed, show it now.
+        if ( iNeedUiSession )
+            {
+            LOG( NORMAL, "OPENCHANNEL: COpenChannelHandler::HandleCommand \
+                Sending UI Notification" )
+            // Send confirmation to UI and wait for client response
+            SendConfirmToUi();
+            }
+        else
+            {
+            // Send successfull terminal response
+            SendSuccessTerminalRsp();
+            }
+        }
+
+    LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::HandleCommand exiting" )
+    }
+
+// -----------------------------------------------------------------------------
+// From class CSatCommandHandler.
+// Indicates the failure of launching ui client.
+// -----------------------------------------------------------------------------
+//
+void COpenChannelHandler::UiLaunchFailed()
+    {
+    LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::UiLaunchFailed calling" )
+
+    iOpenChannelRsp.iGeneralResult = RSat::KMeUnableToProcessCmd;
+    iOpenChannelRsp.iInfoType = RSat::KMeProblem;
+    iOpenChannelRsp.iAdditionalInfo.SetLength( 1 );
+    iOpenChannelRsp.iAdditionalInfo[0] = RSat::KNoSpecificMeProblem;
+    iOpenChannelRsp.SetPCmdNumber( iOpenChannelData.PCmdNumber() );
+    TerminalRsp( iPCmd, iOpenChannelRspPckg );
+
+    LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::UiLaunchFailed exiting" )
+    }
+
+// -----------------------------------------------------------------------------
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+//lint -e{1403, 1769} Can not be initialized.
+COpenChannelHandler::COpenChannelHandler() :
+    CSatCommandHandler(),
+    iOpenChannelData(),
+    iOpenChannelPckg( iOpenChannelData ),
+    iOpenChannelRsp(),
+    iOpenChannelRspPckg( iOpenChannelRsp ),
+    iQueryData(),
+    iQueryPckg( iQueryData ),
+    iQueryRsp(),
+    iQueryRspPckg( iQueryRsp ),
+    // To be removed when icons are allowed in this command
+    iIconCommand( EFalse )
+    {
+    LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::COpenChannelHandler \
+        calling - exiting" )
+    }
+
+// -----------------------------------------------------------------------------
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void COpenChannelHandler::ConstructL()
+    {
+    LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::ConstructL calling" )
+
+    iUtils->RegisterServiceRequestL( ESatSProactiveQuery,
+        ESatSProactiveQueryResponse, this );
+
+    LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::ConstructL exiting" )
+    }
+
+// -----------------------------------------------------------------------------
+// Sets new connection settings for channel to open.
+// -----------------------------------------------------------------------------
+//
+void COpenChannelHandler::SetConnectionSettingsL(
+    MSatBIPUtils::TSatBearerType aBearerType )
+    {
+    LOG2( SIMPLE,
+        "OPENCHANNEL: COpenChannelHandler::SetConnectionSettingsL calling,\
+        aBearerType: %d", aBearerType )
+
+    RPacketContext::TProtocolType pdpType = RPacketContext::EPdpTypeIPv4;
+    TUint32 defaultId( 0 );
+    switch ( aBearerType )
+        {
+        case MSatBIPUtils::ESatGPRS:
+            {
+            // Resolve override settings
+            if ( iOpenChannelData.iAccessName.Length() > 0 )
+                {
+                LOG( NORMAL, 
+                "OPENCHANNEL: COpenChannelHandler::SetConnectionSettingsL \
+                Getting APN" )
+
+                TUint32 iapId( 0 );
+                TUint32 nwId( 0 );
+                TBool apnCreated( EFalse );
+
+                pdpType = RPacketContext::EPdpTypeIPv6;
+
+                if ( RSat::EIPv4Address ==
+                    iOpenChannelData.iDestinationAddress.iType )
+                    {
+                    LOG( NORMAL, 
+                    "OPENCHANNEL: COpenChannelHandler::SetConnectionSettingsL \
+                    IPV4 Address" )
+                    pdpType = RPacketContext::EPdpTypeIPv4;
+                    }
+                iUtils->BipUtils().ApnHandler().GetApnInfoL
+                    (
+                    iOpenChannelData.iAccessName,
+                    iOpenChannelData.iUserLogin,
+                    iOpenChannelData.iUserPassword,
+                    iapId,
+                    nwId,
+                    apnCreated,
+                    pdpType, // IPv6 or IPv4
+                    iOpenChannelData.iLocalAddress.iAddress
+                    );
+
+                if ( apnCreated )
+                    {
+                    LOG( NORMAL, 
+                    "OPENCHANNEL: COpenChannelHandler::SetConnectionSettingsL \
+                    APN created by SAT" )
+                    // Store APN Id for later use
+                    iConnectionInfo.iCreatedApnId = nwId;
+                    }
+
+                SetOverrideSettingsL( iapId );
+                }
+            else
+                {
+                LOG( NORMAL, "OPENCHANNEL: SetConnectionSettingsL \
+                No APN, using defaults" )
+                // No APN, use default settings
+                TRAPD( err, defaultId = 
+                iUtils->BipUtils().ApnHandler().FindDefaultApL( pdpType ) );
+                LOG2( NORMAL, "OPENCHANNEL: SetConnectionSettingsL \
+                    No APN, using defaults err = %i", err )
+                SetOverrideSettingsL( defaultId );
+                }
+            break;
+            }
+
+        default:
+            {
+            LOG( NORMAL, "OPENCHANNEL: COpenChannelHandler::\
+                SetConnectionSettingsL exiting default" )
+            // Leave if not supported
+            User::Leave( KErrNotSupported );
+            }
+        }
+
+#ifdef SAT_USE_DUMMY_TSY
+    // No APN, use default settings
+    TRAPD( err, 
+    defaultId = iUtils->BipUtils().ApnHandler().FindDefaultApL( pdpType ) );
+    LOG2( NORMAL, "OPENCHANNEL: COpenChannelHandler::SetConnectionSettingsL \
+        No APN, using defaults err = %i", err )
+    SetOverrideSettingsL( defaultId );
+#endif // SAT_USE_DUMMY_TSY
+
+    LOG( SIMPLE,
+        "OPENCHANNEL: COpenChannelHandler::SetConnectionSettingsL exiting" )
+    }
+
+// -----------------------------------------------------------------------------
+// Sets override settings into connection information.
+// -----------------------------------------------------------------------------
+//
+void COpenChannelHandler::SetOverrideSettingsL( const TUint32 aIapId )
+    {
+    
+    LOG2( SIMPLE,
+    "OPENCHANNEL: COpenChannelHandler::SetOverrideSettingsL aIapId: %i", 
+    aIapId )
+
+    delete iConnectionInfo.iOverrideSet;
+    iConnectionInfo.iOverrideSet = NULL;
+
+    // Override connection preferences
+    TExtendedConnPref* overrideSettings = new( ELeave ) TExtendedConnPref;
+    overrideSettings->SetIapId( aIapId );
+    overrideSettings->SetNoteBehaviour( 
+            TExtendedConnPref::ENoteBehaviourConnSilent );
+    iConnectionInfo.iOverrideSet = overrideSettings;
+
+    LOG( SIMPLE,
+        "OPENCHANNEL: COpenChannelHandler::SetOverrideSettingsL exiting" )
+    }
+
+// -----------------------------------------------------------------------------
+// Sets up data channel. Does not activate context.
+// -----------------------------------------------------------------------------
+//
+TInt COpenChannelHandler::SetUpChannel()
+    {
+    LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::SetUpChannel calling" )
+
+    // get connection settings from CommDB and
+    // set connection settings to data channel
+    TRAPD( status,
+           SetConnectionSettingsL( iBearerType );
+           iDataChannel->SetupConnectionL( iConnectionInfo ); );
+
+    LOG2( SIMPLE,
+        "OPENCHANNEL: COpenChannelHandler::SetUpChannel exiting with status %i",
+        status )
+    return status;
+    }
+
+// -----------------------------------------------------------------------------
+// Activates context.
+// -----------------------------------------------------------------------------
+//
+TInt COpenChannelHandler::ActivateChannel()
+    {
+    LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::ActivateChannel calling" )
+
+    // Activate the connection
+    TRAPD( err, iDataChannel->ActivateConnectionL( this ) );
+
+    LOG2( SIMPLE, "OPENCHANNEL: COpenChannelHandler::ActivateChannel exiting\
+        with error %i:", err )
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// Creates and sends the terminal response on successful cases.
+// -----------------------------------------------------------------------------
+//
+void COpenChannelHandler::SendSuccessTerminalRsp()
+    {
+    LOG( SIMPLE,
+        "OPENCHANNEL: COpenChannelHandler::SendSuccessTerminalRsp calling" )
+
+    iDataChannel->GetNegotiatedQoSParams( iOpenChannelRsp.iBearer.iParams );
+
+    // Get the channel status
+    RSat::TChannelStatus channelStatus;
+    TRAPD( err, channelStatus = iUtils->BipUtils().GenerateChannelStatusL(
+            iDataChannel->ChannelId(), 0 ) );
+    LOG2( SIMPLE, "OPENCHANNEL: COpenChannelHandler::SendSuccessTerminalRsp \
+          error: %i", err )
+    
+    if ( KErrNone == err )
+        {
+        iOpenChannelRsp.iInfoType = RSat::KChannelStatusInfo;
+        iOpenChannelRsp.iAdditionalInfo.SetLength( KChannelStatusLength );
+
+        // Channel ID + PDP context status
+        iOpenChannelRsp.iAdditionalInfo[0] = channelStatus[0];
+
+        // Channel status
+        iOpenChannelRsp.iAdditionalInfo[1] = channelStatus[1];
+        iOpenChannelRsp.SetPCmdNumber( iOpenChannelData.PCmdNumber() );
+
+        // Define the result of this command handling
+        if ( iSetUpWithModifications )
+            {
+            LOG( NORMAL, "OPENCHANNEL: COpenChannelHandler::HandleCommand\
+                Channel setup modified" )
+            iOpenChannelRsp.iGeneralResult = RSat::KPerformedWithModifications;
+            }
+        else if ( !iQueryRsp.iRequestedIconDisplayed &&
+            ( ( RSat::ESelfExplanatory ==
+            iOpenChannelData.iIconId.iQualifier ) ||
+            ( RSat::ENotSelfExplanatory ==
+            iOpenChannelData.iIconId.iQualifier ) ) )
+            {
+            LOG( NORMAL, "OPENCHANNEL: COpenChannelHandler::HandleCommand\
+                Open channel successful, no icon displayed" )
+            iOpenChannelRsp.iGeneralResult =
+                RSat::KSuccessRequestedIconNotDisplayed;
+            }
+        else
+            {
+            LOG( NORMAL, "OPENCHANNEL: COpenChannelHandler::HandleCommand\
+                Open channel successful" )
+            iOpenChannelRsp.iGeneralResult = RSat::KSuccess;
+            }
+        }
+    else
+        {
+        LOG( NORMAL, "OPENCHANNEL: COpenChannelHandler::HandleCommand\
+            Channel not found!" )
+        iOpenChannelRsp.iGeneralResult = RSat::KMeUnableToProcessCmd;
+        iOpenChannelRsp.iInfoType = RSat::KMeProblem;
+        iOpenChannelRsp.iAdditionalInfo.SetLength( 1 );
+        iOpenChannelRsp.iAdditionalInfo[0] = RSat::KNoSpecificMeProblem;
+        }
+
+    // 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 == iOpenChannelRsp.iGeneralResult ) &&
+        iIconCommand )
+        {
+        LOG( SIMPLE, "COpenChannelHandler::SendSuccessTerminalRsp requested\
+             icon not displayed" )
+        iOpenChannelRsp.iGeneralResult =
+            RSat::KSuccessRequestedIconNotDisplayed;
+        }
+
+    // Sending terminal response
+    TerminalRsp( iPCmd, iOpenChannelRspPckg );
+
+    LOG( SIMPLE,
+        "OPENCHANNEL: COpenChannelHandler::SendSuccessTerminalRsp exiting" )
+    }
+
+// -----------------------------------------------------------------------------
+// Sends confirmation query to UI.
+// -----------------------------------------------------------------------------
+//
+void COpenChannelHandler::SendConfirmToUi()
+    {
+    LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::SendConfirmToUi calling" )
+
+    // Command Duration for Mediator Client
+    TUint8 commandDuration( KSatDurationNotSet );
+
+    // Launch UI of not launched. This function is called again when UI is
+    // launched.
+    if ( !LaunchUiSession() )
+        {
+        LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::SendConfirmToUi \
+             not launch UI" )
+        // Create IPC data to UI
+        iQueryData.iCommand = ESatOpenChannelQuery;
+        iQueryData.iQueryText = iOpenChannelData.iAlphaId.iAlphaId;
+        iQueryData.iIconId.iIdentifier = iOpenChannelData.iIconId.iIdentifier;
+        LOG2( SIMPLE, "COpenChannelHandler::SendConfirmToUi \
+             iOpenChannelData.iIconId.iQualifier:%d",
+             iOpenChannelData.iIconId.iQualifier )
+        // Check Icon
+        switch ( iOpenChannelData.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;
+                }
+            }
+        LOG2( SIMPLE, "COpenChannelHandler::SendConfirmToUi \
+             iOpenChannelData.iAlphaId.iStatus:%d",
+             iOpenChannelData.iAlphaId.iStatus )
+        // Define AlphaID status
+        switch ( iOpenChannelData.iAlphaId.iStatus )
+            {
+            case RSat::EAlphaIdNotPresent:
+                {
+                iQueryData.iAlphaIdStatus = ESatAlphaIdNotProvided;
+                commandDuration = KSatLongDuration;
+                break;
+                }
+
+            case RSat::EAlphaIdProvided:
+                {
+                iQueryData.iAlphaIdStatus = ESatAlphaIdNotNull;
+                commandDuration = KSatLongDuration;
+                break;
+                }
+
+            default:
+                {
+                iQueryData.iAlphaIdStatus = ESatAlphaIdNull;
+                commandDuration = KSatDurationNotSet;
+                break;
+                }
+            }
+
+        // Send notification to Mediator client if Cover UI is supported
+        if ( iUtils->CoverUiSupported() )
+            {
+            LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::SendConfirmToUi \
+                 CoverUiSupported" )
+            TSatCommandData medEventData;
+            medEventData.iPCmdNumber = iPCmd;
+            medEventData.iAlphaId = iOpenChannelData.iAlphaId;
+            medEventData.iDuration.iTimeUnit = RSat::ESeconds;
+            medEventData.iDuration.iNumOfUnits = commandDuration;
+            medEventData.iIconID = iOpenChannelData.iIconId;
+            TSatCommandPckg tPckg( medEventData );
+            iUtils->RaiseSatEvent( tPckg );
+            }
+        // Send notification to UI
+        MSatUiSession* session = iUtils->SatUiHandler().UiSession();
+        session->SendCommand(
+            &iQueryPckg, &iQueryRspPckg, ESatSProactiveQuery );
+        }
+
+    LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::SendConfirmToUi exiting" )
+    }
+
+// -----------------------------------------------------------------------------
+// Closes the channel in error cases.
+// -----------------------------------------------------------------------------
+//
+void COpenChannelHandler::CloseChannel()
+    {
+    LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::CloseChannel calling" )
+
+    // If data channel is not null, close it
+    if ( iDataChannel )
+        {
+        LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::CloseChannel have\
+             channel" )
+        iUtils->BipUtils().CloseChannel( iDataChannel->ChannelId() );
+        }
+
+    if ( iConnectionInfo.iCreatedApnId > 0 )
+        {
+        LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::CloseChannel delete\
+             APN" )
+        // APN created -> Remove it
+        TRAP_IGNORE( iUtils->BipUtils().ApnHandler().DeleteApnL(
+            iConnectionInfo.iCreatedApnId ) )
+        }
+
+    LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::CloseChannel exiting" )
+    }
+
+// -----------------------------------------------------------------------------
+// Checks parameters from SIM and makes modifications, if needed.
+// -----------------------------------------------------------------------------
+//
+TBool COpenChannelHandler::CheckParameters()
+    {
+    LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::CheckParameters calling" )
+    // Return variable. Indicates is the context activation possible with
+    // given / modified parameters.
+    TBool paramsOk( EFalse );
+
+    // Check buffer size
+    if ( KSatBIPMaxBufferSize < iOpenChannelData.iBufferSize ||
+         0 == iOpenChannelData.iBufferSize )
+        {
+        LOG( NORMAL, "OPENCHANNEL: COpenChannelHandler::CheckParameters \
+            Changing buffersize" )
+        // Too big requested buffer size -> set to max
+        iConnectionInfo.iBufferSize = KSatBIPMaxBufferSize;
+        // put modified buffer size to terminal response
+        iOpenChannelRsp.iBufferSize = KSatBIPMaxBufferSize;
+        // Modified parameters
+        iSetUpWithModifications = ETrue;
+        }
+    else
+        {
+        iConnectionInfo.iBufferSize = iOpenChannelData.iBufferSize;
+        iOpenChannelRsp.iBufferSize = iOpenChannelData.iBufferSize;
+        }
+
+    // Set bearer for the terminal response. This information is mandatory to
+    // each terminal response.
+    iOpenChannelRsp.iBearer = iOpenChannelData.iBearer;
+
+    // Indicates is there destination address defined
+    const TBool destinationAddressNotDefined
+        (
+        RSat::EIPv4Address != iOpenChannelData.iDestinationAddress.iType &&
+        RSat::EIPv6Address != iOpenChannelData.iDestinationAddress.iType
+        );
+
+    // Indicates is there a transport protocol defined
+    const TBool transportProtoNotDefined
+        (
+        RSat::ETcp != iOpenChannelData.iSimMeInterface.iTransportProto &&
+        RSat::EUdp != iOpenChannelData.iSimMeInterface.iTransportProto
+        );
+
+    // Indicates is there a transport port number defined
+    const TBool transportPortNumberNotDefined
+        (
+        0 == iOpenChannelData.iSimMeInterface.iPrtNumber
+        );
+
+    // Indicates is selected bearer supported
+    const TBool bearerNotSupported
+        (
+        RSat::EPCmdTypeNotSet != iOpenChannelData.iPCmdType &&
+        RSat::EGprsBearer != iOpenChannelData.iPCmdType &&
+        RSat::EAnyBearer != iOpenChannelData.iPCmdType
+        );
+
+    // Check parameters
+    paramsOk = !( destinationAddressNotDefined ||
+                  transportProtoNotDefined ||
+                  bearerNotSupported ||
+                  transportPortNumberNotDefined );
+
+    // Check is connection possible
+    if ( paramsOk )
+        {
+        LOG( NORMAL, "OPENCHANNEL: COpenChannelHandler::CheckParameters \
+        Bearer type is GPRS" )
+        // Bearer type is GPRS
+        iBearerType = MSatBIPUtils::ESatGPRS;
+        // Set bearer type for the terminal response in case it was not defined
+        iOpenChannelRsp.iBearer.iType = RSat::EGPRSBearer;
+        // Destination address
+        iConnectionInfo.iDestination = iOpenChannelData.iDestinationAddress;
+        // Local address
+        iConnectionInfo.iSource = iOpenChannelData.iLocalAddress;
+        // Bearer parameters
+        iConnectionInfo.iBearerParams = iOpenChannelData.iBearer.iParams;
+        // Set protocol info to connection data
+        iConnectionInfo.iProtocol = iOpenChannelData.iSimMeInterface;
+        }
+    else if ( transportProtoNotDefined ||
+              bearerNotSupported ||
+              transportPortNumberNotDefined )
+        {
+        // Fail
+        LOG( NORMAL, "OPENCHANNEL: COpenChannelHandler::CheckParameters \
+        Unable to connect" )
+        // If parameters are not OK, send terminal response
+        LOG( NORMAL, "OPENCHANNEL: COpenChannelHandler::CommandAllowed \
+            Not valid parameters" )
+        iOpenChannelRsp.iGeneralResult = RSat::KCmdBeyondMeCapabilities;
+        iOpenChannelRsp.iInfoType = RSat::KNoAdditionalInfo;
+        iOpenChannelRsp.iAdditionalInfo.Zero();
+        }
+    else if ( destinationAddressNotDefined )
+        {
+        // Fail
+        LOG( NORMAL, "OPENCHANNEL: COpenChannelHandler::CheckParameters \
+        Destination not set" )
+        iOpenChannelRsp.iGeneralResult = RSat::KErrorRequiredValuesMissing;
+        iOpenChannelRsp.iInfoType = RSat::KNoAdditionalInfo;
+        iOpenChannelRsp.iAdditionalInfo.Zero();
+        }
+    else
+        {
+        // Fail
+        LOG( NORMAL, "OPENCHANNEL: COpenChannelHandler::CheckParameters \
+        Unable to connect" )
+        // If parameters are not OK, send terminal response
+        LOG( NORMAL, "OPENCHANNEL: COpenChannelHandler::CheckParameters \
+            Not valid parameters" )
+        iOpenChannelRsp.iGeneralResult = RSat::KCmdBeyondMeCapabilities;
+        iOpenChannelRsp.iInfoType = RSat::KNoAdditionalInfo;
+        iOpenChannelRsp.iAdditionalInfo.Zero();
+        }
+
+    LOG2( SIMPLE, "OPENCHANNEL: COpenChannelHandler::CheckParameters exiting,\
+          paramsOk: %d", paramsOk )
+    return paramsOk;
+    }
+
+// -----------------------------------------------------------------------------
+// Launches UI if it not active.
+// -----------------------------------------------------------------------------
+//
+TBool COpenChannelHandler::LaunchUiSession()
+    {
+    LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::LaunchUiSession calling" )
+    TBool retVal( EFalse );
+
+    // If ui session is not availabe, SATUI has to be
+    // launched.
+    if ( NULL == iUtils->SatUiHandler().UiSession() )
+        {
+        TRAPD( err,
+               iUtils->RegisterL( this, MSatUtils::ESatUiLaunched );
+               // Try to launch the ui client.
+               iUtils->SatUiHandler().LaunchSatUiL();
+             ); // End of TRAPD
+
+        if ( KErrNone != err )
+            {
+            LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::LaunchUiSession \
+                 Ui launch failed" )
+            // Ui launch failed, unregister event
+            iUtils->UnregisterEvent( this, MSatUtils::ESatUiLaunched );
+            // Notify SIM that ui launch failed.
+            UiLaunchFailed();
+            }
+        else
+            {
+            LOG( SIMPLE, "OPENCHANNEL: COpenChannelHandler::LaunchUiSession \
+                 Ui launch successfully" )
+            // Return true indicating that we had to launch UI
+            retVal = ETrue;
+            }
+        }
+
+    LOG2( SIMPLE, "OPENCHANNEL: COpenChannelHandler::LaunchUiSession exiting,\
+          retVal: %d", retVal )
+    return retVal;
+    }