satengine/SatServer/Engine/src/CSatBIPUtils.cpp
changeset 0 ff3b6d0fd310
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/satengine/SatServer/Engine/src/CSatBIPUtils.cpp	Tue Feb 02 01:11:09 2010 +0200
@@ -0,0 +1,937 @@
+/*
+* 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;
+    }
+