satengine/SatServer/Engine/src/CSatBIPUtils.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:15:03 +0100
branchRCL_3
changeset 44 987c9837762f
parent 0 ff3b6d0fd310
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2002-2008 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:  Utility class for BIP
*
*/


#include <es_sock.h>
#include <etelqos.h>
#include "SatLog.h"
#include "CSatBIPUtils.h"
#include "CSatBIPGPRSDataChannel.h"
#include "csatbipconnectionobserver.h"
#include "MSatBIPDataChannel.h"
#include "MSatBIPChannelStatusObserver.h"
#include "MSatBIPDataAvailableObserver.h"
//lint -e766 Used inside TRAP macro, lint misfunction.
#include "EnginePanic.h"
#include "TSatChannelIDInfo.h"
#include "MSatUtils.h"
#include "CSatApnHandler.h"
#include "csatsactivewrapper.h"
#include "msatmultimodeapi.h"

const TInt KPDPContextPos( 7 );
const TInt KMaxAvailChannels( 7 );
const TInt8 KProposeQoSParametersPop( 2 );

// ======== MEMBER FUNCTIONS ========

// ---------------------------------------------------------------------------
// Two-phased constructor.
// ---------------------------------------------------------------------------
//
CSatBIPUtils* CSatBIPUtils::NewL( MSatUtils& aUtils )
    {
    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::NewL calling" )

    CSatBIPUtils* self = new ( ELeave ) CSatBIPUtils( aUtils );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );

    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::NewL exiting" )
    return self;
    }

// ---------------------------------------------------------------------------
// Destructor
// ---------------------------------------------------------------------------
//
CSatBIPUtils::~CSatBIPUtils()
    {
    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::~CSatBIPUtils calling" )

    // Close all data channels
    if ( iDataChannels )
        {
        iDataChannels->ResetAndDestroy();
        }
    delete iDataChannels;

    if ( iChannelIds )
        {
        iChannelIds->ResetAndDestroy();
        }
    delete iChannelIds;
    
    delete iChannelId;
    
    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::~CSatBIPUtils\
            Close connection and subconnection" )
    iSubConnection.Close();
    iConnection.Close();
    iSocketServer.Close();
    iPacketService.Close();
    
    delete iApnHandler;

    if ( iWrapper )
        {
        iWrapper->CancelWrapper();
        delete iWrapper;
        iWrapper = NULL;
        }

    if ( iConnObserver )
        {
        iConnObserver->Cancel();
        delete iConnObserver;
        iConnObserver = NULL;
        }

    iDataAvailableObserver = NULL;
    iChannelStatusObserver = NULL;

    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::~CSatBIPUtils exiting" )
    }

// ---------------------------------------------------------------------------
// Handles event
// ---------------------------------------------------------------------------
//
void CSatBIPUtils::Event( TInt aEvent )
    {
    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::Event calling" )

    // Check event
    if ( MSatUtils::ECommandCancelled == aEvent ||
         MSatUtils::ECancelledUsingEndKey == aEvent )
        {
        LOG( SIMPLE, "SATENGINE: CSatBIPUtils::Event check event" )
        if ( iDataChannels )
            {
            const TInt channelCount( iDataChannels->Count() );
            LOG2( SIMPLE, "SATENGINE: CSatBIPUtils::Event channelCount: %d",
                  channelCount )
            // Cancel all channels
            for ( TInt index = 0; index < channelCount; index++ )
                {
                MSatBIPDataChannel* channel = iDataChannels->At( index );
                __ASSERT_ALWAYS( channel,
                    PanicSatEngine( ESatEngineNullPointer ) );
                channel->CancelAll();
                }
            }
        }

    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::Event exiting" )
    }

// ---------------------------------------------------------------------------
// Creates new data channel
// ---------------------------------------------------------------------------
//
MSatBIPDataChannel* CSatBIPUtils::CreateChannelL(
    const TSatBearerType aBearerType, TInt& aErrCode )
    {
    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::CreateChannelL calling" )

    TInt errCode( MSatBIPUtils::ESatBIPNoChannelAvail );
    MSatBIPDataChannel* channel = NULL;

    // Get available channel ID
    TSatChannelIdInfo* channelId( AvailableChannelID() );

    // Check is the channel available
    if ( channelId )
        {
        // Create the right type of data channel
        if ( MSatBIPUtils::ESatGPRS == aBearerType )
            {
            LOG( NORMAL, 
            "SATENGINE: CSatBIPUtils::CreateChannelL ESatGPRS" )
            // New GPRS data channel
            channel = CSatBIPGPRSDataChannel::NewLC( *this, iSocketServer,
                *channelId, iConnection, iSubConnection );
            // Reserve channel ID
            channelId->ReserveChannel();
            // Add data channel to list
            iDataChannels->AppendL( channel );
            // Remove from CleanupStack
            CleanupStack::Pop( /* channel */ );
            // Return code
            errCode = MSatBIPUtils::ESatBIPSuccess;

#ifndef SAT_USE_DUMMY_TSY
            // Start connection observer
            if ( !iConnObserver )
                {
                LOG( NORMAL, " Starting connection observer" )
                iConnObserver = 
                    new ( ELeave ) CSatBIPConnectionObserver( *this );
                iConnObserver->StartObserver();
                }
#endif
            }
        else
            {
            // Others that GPRS are not yet supported
            LOG( NORMAL, 
                "SATENGINE: CSatBIPUtils::CreateChannelL Not supported" )
            errCode = MSatBIPUtils::ESatBIPNoChannelAvail;
            }
        }
    else
        {
        // Channel IDs not available
        LOG( NORMAL, 
            "SATENGINE: CSatBIPUtils::CreateChannelL Not available" )
        errCode = MSatBIPUtils::ESatBIPNoChannelAvail;
        }

    // Assign completion code
    aErrCode = errCode;

    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::CreateChannelL exiting" )
    return channel;
    }

// ---------------------------------------------------------------------------
// Closes the data channel
// ---------------------------------------------------------------------------
//
TInt CSatBIPUtils::CloseChannel( const TInt aChannelId )
    {
    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::CloseChannel calling" )

    TInt errCode( MSatBIPUtils::ESatBIPChannelIdNotValid );

    TInt index( 0 );
    TBool channelClosed( EFalse );

    // Loop the list of data channels and close the correct one.
    while ( index < iDataChannels->Count() && !channelClosed )
        {
        MSatBIPDataChannel* channel = iDataChannels->At( index );
        __ASSERT_ALWAYS( channel, PanicSatEngine( ESatEngineNullPointer ) );

        if ( channel->ChannelId() == aChannelId )
            {
            LOG( SIMPLE, "SATENGINE: CSatBIPUtils::CloseChannel \
            channel->ChannelId() == aChannelId" )
             // Makes next data channel creation possible
            iDataChannelActivated = EFalse;
            // Channel found, close it and return Success.
            channel->CloseChannel();
            // Delete data channel
            iDataChannels->Delete( index );
            delete channel;
            errCode = MSatBIPUtils::ESatBIPSuccess;
            channelClosed = ETrue;
            }
        // Goto next channel
        index++;
        }
    LOG2( SIMPLE, "SATENGINE: CSatBIPUtils::CloseChannel index: %d", index )

    // Free the space left in possible Delete call.
    iDataChannels->Compress();
    
    // Close connections if there're no active channels
    if ( !IsContextActive() )
        {
        LOG( SIMPLE, "SATENGINE: CSatBIPUtils::CloseChannel\
            Close connection and subconnection" )
        iSubConnection.Close();
        SetSubConnectionActivated( EFalse );
        iConnection.Close();
        SetConnectionActivated( EFalse );
        
        if ( iConnObserver )
            {
            iConnObserver->Cancel();
            delete iConnObserver;
            iConnObserver = NULL;
            }
        LOG( SIMPLE, "SATENGINE: CSatBIPUtils::CloseChannel\
            Close iPacketService" )
        iPacketService.Close();
        iPacketServiceActive = EFalse;
        }
    
    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::CloseChannel exiting" )
    return errCode;
    }

// ---------------------------------------------------------------------------
// Closes all data channels
// ---------------------------------------------------------------------------
//
void CSatBIPUtils::CloseAllChannels()
    {
    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::CloseAllChannels calling" )
    LOG2( SIMPLE, "SATENGINE: CSatBIPUtils::CloseAllChannels \
          channelcount: %d", iChannelIds->Count() )
    // Loop the list of data channels and close the correct one.
    for ( TInt i = 0; i < iChannelIds->Count(); i++ )
        {
        TSatChannelIdInfo* id = iChannelIds->At( i );
        // If channel is reserved -> Close it
        if ( id->IsReserved() )
            {
            LOG( SIMPLE, "SATENGINE: CSatBIPUtils::CloseAllChannels \
            id->IsReserved()" )
            CloseChannel( id->ChannelId() );
            }
        }
    
    // Close subsession to socket server
    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::CloseAllChannels\
            Close connection and subconnection" )
    iSubConnection.Close();
    SetSubConnectionActivated( EFalse );
    iConnection.Close();
    SetConnectionActivated( EFalse );
    
    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::CloseAllChannels exiting" )
    }

// ---------------------------------------------------------------------------
// Returns the correct data channel
// ---------------------------------------------------------------------------
//
MSatBIPDataChannel* CSatBIPUtils::DataChannel( const TInt aChannelId,
            TInt& aErrCode )
    {
    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::DataChannel calling" )

    // If the channel cannot be found, returns channel not valid error code
    TInt errCode( MSatBIPUtils::ESatBIPChannelIdNotValid );
    MSatBIPDataChannel* channel = NULL;
    TBool found( EFalse );
    TInt index( 0 );

    // Loop the list of data channels and return the correct one.
    while ( index < iDataChannels->Count() && !found )
        {
        channel = iDataChannels->At( index );
        __ASSERT_ALWAYS( channel, PanicSatEngine( ESatEngineNullPointer ) );
        // Compare channel ID's
        if ( channel->ChannelId() == aChannelId )
            {
            LOG( SIMPLE, "SATENGINE: CSatBIPUtils::DataChannel \
            channel->ChannelId() == aChannelId" )
            // Channel found
            found = ETrue;
            if ( channel->IsContextActive() )
                {
                LOG( SIMPLE, "SATENGINE: CSatBIPUtils::DataChannel \
                IsContextActive" )
                // Channel found and it is active
                errCode = MSatBIPUtils::ESatBIPSuccess;
                }
            else
                {
                // Channel found but it is closed
                errCode = MSatBIPUtils::ESatBIPChannelClosed;
                }
            }
        index++;
        }
    LOG2( SIMPLE, "SATENGINE: CSatBIPUtils::DataChannel \
          index: %d", index )
    // Assign completion code to param
    aErrCode = errCode;

    LOG2( SIMPLE,
        "SATENGINE: CSatBIPUtils::DataChannel exiting with return code %d",
        errCode )
    return channel;
    }

// ---------------------------------------------------------------------------
// Generates TChannelStatus object
// ---------------------------------------------------------------------------
//
RSat::TChannelStatus CSatBIPUtils::GenerateChannelStatusL(
    const TInt aChannelId, TInt aStatus )
    {
    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::GenerateChannelStatusL calling" )

    // ChannelStatus's first byte contains channel ID and pdp context status,
    // second byte contains information. values can be '00' or '05'
    RSat::TChannelStatus channelStatus;
    TInt err( MSatBIPUtils::ESatBIPNoChannelAvail );

    // Used to check the PDP context state
    MSatBIPDataChannel* dataChannel = DataChannel( aChannelId, err );

    // If channel is not active, status is still needed
    if ( ESatBIPSuccess == err || ESatBIPChannelClosed == err )
        {
        // Generate the first byte
        TUint8 channelId( 0 );   // last 3 bits.
        TUint8 pdpContext( 0 );  // first bit
        TUint8 firstByte( 0 );    // First byte

        // Channel ID. Bits 6 to 8.
        channelId = dataChannel->ChannelStatusChannelId();

        // If PDP Context is active, first bit is 1
        if ( dataChannel->IsContextActive() )
            {
            LOG( SIMPLE, "SATENGINE: CSatBIPUtils::GenerateChannelStatusL \
            dataChannel IsContextActive" )
            pdpContext = 1 << KPDPContextPos;
            }

        // We don't need data channel anymore
        dataChannel = NULL;

        // All the information for the first byte is gathered
        firstByte = static_cast<TUint8>( pdpContext ^ channelId );
        channelStatus.Append( firstByte );
        // Second byte should go straigth
        channelStatus.Append( aStatus );
        // LOG values
        LOG2( NORMAL,
            "SATENGINE: CSatBIPUtils::GenerateChannelStatusL First byte: %b",
            firstByte )
        LOG2( NORMAL,
            "SATENGINE: CSatBIPUtils::GenerateChannelStatusL Second byte: %b",
            aStatus )
        }
    else
        {
        LOG2( NORMAL, "SATENGINE: CSatBIPUtils::GenerateChannelStatusL \
            Data channel not found: %i", err )
        User::LeaveIfError( KErrNotFound );
        }

    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::GenerateChannelStatusL exiting" )
    return channelStatus;
    }

// ---------------------------------------------------------------------------
// Returns the interface reference to APN handler
// ---------------------------------------------------------------------------
//
MSatApnHandler& CSatBIPUtils::ApnHandler()
    {
    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::ApnHandler calling" )

    // Assert, Apn handler cannot be NULL
    __ASSERT_ALWAYS( iApnHandler, PanicSatEngine( ESatEngineNullPointer ) );

    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::ApnHandler exiting" )
    return *iApnHandler;
    }

// ---------------------------------------------------------------------------
// Returns the state of the PDP Context
// ---------------------------------------------------------------------------
//
TBool CSatBIPUtils::IsContextActive()
    {
    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::IsContextActive calling" )

    TBool retVal( EFalse );
    TInt index( 0 );
    
    // Loop the list of data channels and end if active channel is found
    while ( index < iDataChannels->Count() && !retVal )
        {
        MSatBIPDataChannel* channel = iDataChannels->At( index );
        __ASSERT_ALWAYS( channel, PanicSatEngine( ESatEngineNullPointer ) );
        retVal = channel->IsContextActive();
        // Goto next channel
        index++;
        }
    LOG2( SIMPLE, "SATENGINE: CSatBIPUtils::IsContextActive \
          index: %d", index )
    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::IsContextActive exiting" )
    return retVal;
    }

// ---------------------------------------------------------------------------
// Returns the array of data channels
// ---------------------------------------------------------------------------
//
CArrayPtrFlat<MSatBIPDataChannel>* CSatBIPUtils::DataChannels()
    {
    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::DataChannels calling - exiting" )
    return iDataChannels;
    }

// ---------------------------------------------------------------------------
// Request to notify when data is available
// ---------------------------------------------------------------------------
//
void CSatBIPUtils::NotifyDataAvailable(
    MSatBIPDataAvailableObserver* aObserver )
    {
    LOG( SIMPLE,
        "SATENGINE: CSatBIPUtils::NotifyDataAvailable calling - exiting" )
    iDataAvailableObserver = aObserver;
    }

// ---------------------------------------------------------------------------
// Request to notify when an error occurs in data channel
// ---------------------------------------------------------------------------
//
void CSatBIPUtils::NotifyChannelStatus(
    MSatBIPChannelStatusObserver* aObserver )
    {
    LOG( SIMPLE,
        "SATENGINE: CSatBIPUtils::NotifyChannelStatus calling - exiting" )
    iChannelStatusObserver = aObserver;
    }

// ---------------------------------------------------------------------------
// Cancels the DataAvailable request
// ---------------------------------------------------------------------------
//
void CSatBIPUtils::CancelDataAvailable()
    {
    LOG( SIMPLE,
        "SATENGINE: CSatBIPUtils::CancelDataAvailable calling - exiting" )
    iDataAvailableObserver = NULL;
    }

// ---------------------------------------------------------------------------
// Cancels the ChannelStatus request
// ---------------------------------------------------------------------------
//
void CSatBIPUtils::CancelChannelStatus()
    {
    LOG( SIMPLE,
        "SATENGINE: CSatBIPUtils::CancelChannelStatus calling - exiting" )
    iChannelStatusObserver = NULL;
    }

// ---------------------------------------------------------------------------
// DataAvailable event. Notifies observer.
// ---------------------------------------------------------------------------
//
void CSatBIPUtils::DataAvailable( const TInt aChannelId, const TInt aLength )
    {
    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::DataAvailable calling" )

    // If there is an active request for this event, notify observer.
    if ( iDataAvailableObserver )
        {
        LOG( SIMPLE, "SATENGINE: CSatBIPUtils::DataAvailable \
        iDataAvailableObserver true" )
        iDataAvailableObserver->DataAvailable( aChannelId, aLength );
        }

    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::DataAvailable exiting" )
    }

// ---------------------------------------------------------------------------
// ChannelStatus event. Notifies observer.
// ---------------------------------------------------------------------------
//
void CSatBIPUtils::ChannelStatus( const TInt aChannelId, const TInt aStatus )
    {
    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::ChannelStatus calling" )

    // If there is an active request for this event, notify observer.
    if ( iChannelStatusObserver )
        {
        LOG( SIMPLE, "SATENGINE: CSatBIPUtils::ChannelStatus \
        iChannelStatusObserver true" )
        iChannelStatusObserver->ChannelStatus( aChannelId, aStatus );
        }

    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::ChannelStatus exiting" )
    }

// ---------------------------------------------------------------------------
// C++ default constructor can NOT contain any code, that
// might leave.
// ---------------------------------------------------------------------------
//
CSatBIPUtils::CSatBIPUtils( MSatUtils& aUtils ) :
    iChannelId( NULL ),
    iUtils( aUtils )
    {
    LOG( SIMPLE,
        "SATENGINE: CSatBIPUtils::CSatBIPUtils calling-exiting" )
    }

// ---------------------------------------------------------------------------
// Two-phased constructor.
// ---------------------------------------------------------------------------
//
void CSatBIPUtils::ConstructL()
    {
    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::ConstructL calling" )

    // Create array for the data channels.
    iDataChannels =
        new ( ELeave ) CArrayPtrFlat<MSatBIPDataChannel>( KMaxAvailChannels );

    // Create array for Channel ID infos
    iChannelIds =
        new ( ELeave ) CArrayPtrFlat<TSatChannelIdInfo>( KMaxAvailChannels );

    TUint8 index = 1;
    
    iChannelId = new ( ELeave ) TSatChannelIdInfo( RSat::KChannel1, index++ );
    iChannelIds->AppendL( iChannelId );
    iChannelId = NULL;
    
    iChannelId = new ( ELeave ) TSatChannelIdInfo( RSat::KChannel2, index++ );
    iChannelIds->AppendL( iChannelId );
    iChannelId = NULL;
    
    iChannelId = new ( ELeave ) TSatChannelIdInfo( RSat::KChannel3, index++ );
    iChannelIds->AppendL( iChannelId );
    iChannelId = NULL;
    
    iChannelId = new ( ELeave ) TSatChannelIdInfo( RSat::KChannel4, index++ );
    iChannelIds->AppendL( iChannelId );
    iChannelId = NULL;
    
    iChannelId = new ( ELeave ) TSatChannelIdInfo( RSat::KChannel5, index++ );
    iChannelIds->AppendL( iChannelId );
    iChannelId = NULL;
    
    iChannelId = new ( ELeave ) TSatChannelIdInfo( RSat::KChannel6, index++ );
    iChannelIds->AppendL( iChannelId );
    iChannelId = NULL;
    
    iChannelId = new ( ELeave ) TSatChannelIdInfo( RSat::KChannel7, index++ );
    iChannelIds->AppendL( iChannelId );
    iChannelId = NULL;
    
    // Regiseter to listen events
    iUtils.RegisterL( this, MSatUtils::ECommandCancelled );
    iUtils.RegisterL( this, MSatUtils::ECancelledUsingEndKey );

    // Connect to Socket Server
    User::LeaveIfError( iSocketServer.Connect() );
    iPacketServiceActive = EFalse;
    iApnHandler = CSatApnHandler::NewL( iUtils );

    iWrapper = new ( ELeave ) CSatSActiveWrapper;
    
    SetConnectionActivated( EFalse );
    SetSubConnectionActivated( EFalse );

    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::ConstructL exiting" )
    }

// ---------------------------------------------------------------------------
// Returns next available channel ID
// ---------------------------------------------------------------------------
//
TSatChannelIdInfo* CSatBIPUtils::AvailableChannelID()
    {
    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::AvailableChannelID calling" )

    TSatChannelIdInfo* channelId = NULL;

    TInt index( 0 );
    TBool idFound( EFalse );

    // Loop channel IDs
    while ( index < iChannelIds->Count() && !idFound )
        {
        channelId = iChannelIds->At( index );
        // If channel is free, take it
        if ( !channelId->IsReserved() )
            {
            LOG( SIMPLE, "SATENGINE: CSatBIPUtils::AvailableChannelID \
            channel free" )
            idFound = ETrue;
            }
         // goto next channel
        index++;
        }
    LOG2( SIMPLE, "SATENGINE: CSatBIPUtils::AvailableChannelID \
          index: %d", index )
    if ( !idFound )
        {
        LOG( SIMPLE, "SATENGINE: CSatBIPUtils::AvailableChannelID \
        idFound false" )
        // If not found, return NULL
        channelId = NULL;
        }

    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::AvailableChannelID exiting" )
    return channelId;
    }

// ---------------------------------------------------------------------------
// Blocks synchronous requests
// ---------------------------------------------------------------------------
//
RPacketQoS::TQoSGPRSNegotiated CSatBIPUtils::ProposeQoSParametersL(
    const RPacketQoS::TQoSGPRSRequested& aQoSParams )
    {
    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::ProposeQoSParametersL calling" )

    // Number of contexts
    TInt count( ContextCount() ); // Get the number of contexts
    // QoS profile name
    TName profName;
    // Handle to the actual context
    RPacketContext packetContext;
    // QoS session
    RPacketQoS qos;
    // Context info
    RPacketService::TContextInfo info;
    // Error value for asynchronous calls
    TInt statusError( KErrNone );

    if ( count > 0 ) // At least one context found
        {
        // Get the last contexts info
        iPacketService.GetContextInfo( 
            iWrapper->RequestStatus(), count - 1, info );

        statusError = iWrapper->SetActiveAndWait(); // Wait for completion
        LOG2( SIMPLE, "     ContextInfo iActiveStatus: %i", statusError )
        LOG2( SIMPLE, "     ContextInfo CntxStatus: %i", info.iStatus )
        // Leave point
        User::LeaveIfError( statusError );
        }
    else
        {
        // Didn't find any contexts
        User::Leave( KErrNotFound );
        }

    // Get the context by name
    LOG( SIMPLE, "     Open existing context" )
    User::LeaveIfError(
        packetContext.OpenExistingContext( iPacketService, info.iName ) );

    CleanupClosePushL( packetContext );

    // Get the QoS Profile
    LOG( SIMPLE, "     Get QoS Profile name" )
    User::LeaveIfError( packetContext.GetProfileName( profName ) );

    // Get the instance of the QoS profile
    if ( profName.Length() > 0 )
        {
        LOG( SIMPLE, "     Open existing QoS profile" )
        User::LeaveIfError( qos.OpenExistingQoS( packetContext, profName ) );
        }

    CleanupClosePushL( qos );

    TPckg<RPacketQoS::TQoSGPRSRequested> qosPckg( aQoSParams );

    qos.SetProfileParameters( iWrapper->RequestStatus(), qosPckg );

    User::LeaveIfError( iWrapper->SetActiveAndWait() ); // Wait for completion

    // Get negotioted parameters
    RPacketQoS::TQoSGPRSNegotiated negParams;
    TPckg<RPacketQoS::TQoSGPRSNegotiated> negPckg( negParams );
    qos.GetProfileParameters( iWrapper->RequestStatus(), negPckg );

    User::LeaveIfError( iWrapper->SetActiveAndWait() ); // Wait for completion

    LOG2( SIMPLE, "     GetNegQoSParams Status: %i", statusError )
    LOG2( SIMPLE, "     GetNegQoSParams Reliability: %i", 
          negParams.iReliability )
    LOG2( SIMPLE, "     GetNegQoSParams Precedence: %i", 
          negParams.iPrecedence )
    LOG2( SIMPLE, "     GetNegQoSParams Delay: %i", negParams.iDelay )
    LOG2( SIMPLE, "     GetNegQoSParams Peak: %i", negParams.iPeakThroughput )
    LOG2( SIMPLE, "     GetNegQoSParams Mean: %i", negParams.iMeanThroughput )

    // Cleaning and closing: packetContext, qos
    CleanupStack::PopAndDestroy( KProposeQoSParametersPop );

    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::ProposeQoSParametersL exiting" )
    return negParams;
    }

// ---------------------------------------------------------------------------
// Opens session to GPRS Service
// ---------------------------------------------------------------------------
//
TInt CSatBIPUtils::GprsService()
    {
    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::GprsService calling" )

    TInt ret( KErrNone );
    if ( !iPacketServiceActive )
        {
        LOG( SIMPLE, "SATENGINE: CSatBIPUtils::GprsService \
        iPacketServiceActive false" )
        ret = iPacketService.Open( *( iUtils.MultiModeApi().Phone() ) );
        iPacketServiceActive = ETrue;
        }

    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::GprsService exiting" )
    return ret;
    }

// ---------------------------------------------------------------------------
// Gives reference to RPacketService
// ---------------------------------------------------------------------------
//
RPacketService& CSatBIPUtils::PacketService()
    {
    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::PacketService calling" )

    GprsService();

    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::PacketService exiting" )
    return iPacketService;
    }

// ---------------------------------------------------------------------------
// CSatBIPUtils::ConnectionStatus
// ---------------------------------------------------------------------------
//
RPacketService::TStatus CSatBIPUtils::ConnectionStatus() const
    {
    LOG( NORMAL,
        "SATENGINE: CSatBIPUtils::ConnectionStatus calling" )

#ifndef SAT_USE_DUMMY_TSY
    RPacketService::TStatus status( RPacketService::EStatusSuspended );
#else
    RPacketService::TStatus status( RPacketService::EStatusActive );
#endif

    if ( iConnObserver )
        {
        LOG( NORMAL,
        "SATENGINE: CSatBIPUtils::ConnectionStatus iConnObserver true" )
        status = iConnObserver->Status();
        }

    LOG( NORMAL,
        "SATENGINE: CSatBIPUtils::ConnectionStatus exiting" )
    return status;
    }

// ---------------------------------------------------------------------------
// CSatBIPUtils::StopUdpLink
// ---------------------------------------------------------------------------
//
void CSatBIPUtils::StopUdpLink()
    {
    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::StopUdpLink  calling" )
    if ( iDataChannels )
        {
        const TInt channelCount( iDataChannels->Count() );
        LOG2( SIMPLE, "SATENGINE: CSatBIPUtils::StopUdpLink \
          channelCount: %d", channelCount )
        // Cancel all channels
        for ( TInt index = 0; index < channelCount; index++ )
            {
            MSatBIPDataChannel* channel = iDataChannels->At( index );
            __ASSERT_ALWAYS( channel,
                PanicSatEngine( ESatEngineNullPointer ) );
            channel->StopUdpSocket();
            }
        }
    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::StopUdpLink exiting" )
    }

// ---------------------------------------------------------------------------
// Synchronous request complete
// ---------------------------------------------------------------------------
//
TInt CSatBIPUtils::ContextCount()
    {
    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::ContextCount calling" )

    // Number of contexts
    TInt count( 0 );
    TInt maxAllowed( 0 );

    // Init PacketService
    TInt error( GprsService() );

    if ( KErrNone == error )
        {
        // Enumerate contexts
        iPacketService.EnumerateContexts( 
            iWrapper->RequestStatus(), count, maxAllowed );
        error = iWrapper->SetActiveAndWait(); // Wait for completion
        LOG2( SIMPLE, "     EnumContexts Status: %i", error )
        LOG2( SIMPLE, "     EnumContexts Count: %i", count )
        LOG2( SIMPLE, "     EnumContexts MaxAllowed: %i", maxAllowed )
        // Check status
        if ( KErrNone != error )
            {
            LOG( SIMPLE, "SATENGINE: CSatBIPUtils::ContextCount \
            KErrNone != error" )
            count = 0;
            }
        }

    LOG2( SIMPLE, "SATENGINE: CSatBIPUtils::ContextCount exiting: %i", count )
    return count;
    }

// ---------------------------------------------------------------------------
// CSatBIPUtils::SetConnectionActivated()
// ---------------------------------------------------------------------------
//
void CSatBIPUtils::SetConnectionActivated( TBool aSet )
    {
    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::SetConnectionActivated calling" )
    iConnectionActivated = aSet;
    LOG( SIMPLE, "SATENGINE: CSatBIPUtils::SetConnectionActivated exiting" )
    }
    
// ---------------------------------------------------------------------------
// CSatBIPUtils::IsConnectionActivated()
// ---------------------------------------------------------------------------
//
TBool CSatBIPUtils::IsConnectionActivated()
    {
    LOG( SIMPLE, 
        "SATENGINE: CSatBIPUtils::IsConnectionActivated calling-exiting" )
    return iConnectionActivated;
    }

// ---------------------------------------------------------------------------
// CSatBIPUtils::SetSubConnectionActivated()
// ---------------------------------------------------------------------------
//
void CSatBIPUtils::SetSubConnectionActivated( TBool aSet )
    {
    LOG( SIMPLE, 
        "SATENGINE: CSatBIPUtils::SetSubConnectionActivated calling" )
    iSubConnectionActivated = aSet;
    LOG( SIMPLE, 
        "SATENGINE: CSatBIPUtils::SetSubConnectionActivated exiting" )
    }
    
// ---------------------------------------------------------------------------
// CSatBIPUtils::IsSubConnectionActivated()
// ---------------------------------------------------------------------------
//
TBool CSatBIPUtils::IsSubConnectionActivated()
    {
    LOG( SIMPLE, 
        "SATENGINE: CSatBIPUtils::IsSubConnectionActivated calling-exiting" )
    return iSubConnectionActivated;
    }